[Xenomai-git] Philippe Gerum : drivers/gpio: fix enumeration/detection of controllers

2017-02-08 Thread git repository hosting
Module: xenomai-3
Branch: master
Commit: bb9c92b86ac166f12d5661950fe53187af3247cf
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bb9c92b86ac166f12d5661950fe53187af3247cf

Author: Philippe Gerum 
Date:   Thu Sep 29 15:22:24 2016 +0200

drivers/gpio: fix enumeration/detection of controllers

---

 kernel/drivers/gpio/Kconfig|   18 +
 kernel/drivers/gpio/gpio-bcm2835.c |   12 +++---
 kernel/drivers/gpio/gpio-core.c|   71 +++-
 kernel/drivers/gpio/gpio-core.h|   10 -
 kernel/drivers/gpio/gpio-mxc.c |   39 ++--
 5 files changed, 89 insertions(+), 61 deletions(-)

diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig
index 850127f..74c56d4 100644
--- a/kernel/drivers/gpio/Kconfig
+++ b/kernel/drivers/gpio/Kconfig
@@ -1,13 +1,17 @@
 menu "Real-time GPIO drivers"
 
 config XENO_DRIVERS_GPIO
-   tristate
+   tristate "GPIO controller"
depends on GPIOLIB
+   help
+
+   Real-time capable GPIO module.
+  
+if XENO_DRIVERS_GPIO
 
 config XENO_DRIVERS_GPIO_BCM2835
depends on MACH_BCM2708
-   select XENO_DRIVERS_GPIO
-   tristate "Support for BCM2835 GPIOs"
+   bool "Support for BCM2835 GPIOs"
help
 
Enables support for the GPIO controller available from
@@ -15,15 +19,15 @@ config XENO_DRIVERS_GPIO_BCM2835
 
 config XENO_DRIVERS_GPIO_MXC
depends on GPIO_MXC
-   select XENO_DRIVERS_GPIO
-   tristate "Support for MXC GPIOs"
+   bool "Support for MXC GPIOs"
help
 
Suitable for the GPIO controller available from
Freescale/NXP's MXC architecture.
 
 config XENO_DRIVERS_GPIO_DEBUG
-   depends on XENO_DRIVERS_GPIO
bool "Enable GPIO core debugging features"
-   
+
+endif
+
 endmenu
diff --git a/kernel/drivers/gpio/gpio-bcm2835.c 
b/kernel/drivers/gpio/gpio-bcm2835.c
index f277262..6328955 100644
--- a/kernel/drivers/gpio/gpio-bcm2835.c
+++ b/kernel/drivers/gpio/gpio-bcm2835.c
@@ -20,20 +20,18 @@
 
 #define RTDM_SUBCLASS_BCM2835  1
 
-static struct rtdm_gpio_chip bcm2835_gpio_chip;
-
 static int __init bcm2835_gpio_init(void)
 {
-   return rtdm_gpiochip_add_by_name(_gpio_chip, "bcm2708_gpio",
-RTDM_SUBCLASS_BCM2835);
+   return rtdm_gpiochip_scan_of(NULL, "brcm,bcm2835-gpio",
+RTDM_SUBCLASS_BCM2835);
 }
+module_init(bcm2835_gpio_init);
 
 static void __exit bcm2835_gpio_exit(void)
 {
-   rtdm_gpiochip_remove(_gpio_chip);
+   rtdm_gpiochip_remove_of(RTDM_SUBCLASS_BCM2835);
 }
-
-module_init(bcm2835_gpio_init);
 module_exit(bcm2835_gpio_exit);
 
 MODULE_LICENSE("GPL");
+
diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c
index f18d571..5c08355 100644
--- a/kernel/drivers/gpio/gpio-core.c
+++ b/kernel/drivers/gpio/gpio-core.c
@@ -203,22 +203,23 @@ static void delete_pin_devices(struct rtdm_gpio_chip *rgc)
 {
struct rtdm_gpio_pin *pin, *n;
struct rtdm_device *dev;
+   rtdm_lockctx_t s;
 
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);

list_for_each_entry_safe(pin, n, >pins, next) {
list_del(>next);
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
dev = >dev;
rtdm_dev_unregister(dev);
rtdm_event_destroy(>event);
kfree(dev->label);
kfree(pin->name);
kfree(pin);
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);
}
 
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
 }
 
 static int create_pin_devices(struct rtdm_gpio_chip *rgc)
@@ -226,6 +227,7 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc)
struct gpio_chip *gc = rgc->gc;
struct rtdm_gpio_pin *pin;
struct rtdm_device *dev;
+   rtdm_lockctx_t s;
int n, ret;
 
for (n = gc->base; n < gc->base + gc->ngpio - 1; n++) {
@@ -252,9 +254,9 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc)
if (ret)
goto fail_register;
rtdm_event_init(>event, 0);
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);
list_add_tail(>next, >pins);
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
}
 
return 0;
@@ -362,8 +364,41 @@ EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name);
 
 #include 
 
+LIST_HEAD(rtdm_gpio_chips);
+
+static DEFINE_MUTEX(chip_lock);
+
+static int match_gpio_chip(struct gpio_chip *gc, void *data)
+{
+   struct device *dev = data;
+
+   return gc->dev == dev;
+}
+
+static int add_gpio_chip(struct gpio_chip *gc, int type)
+{
+   struct rtdm_gpio_chip *rgc;
+   int ret;
+
+   rgc = kzalloc(sizeof(*rgc), 

[Xenomai-git] Philippe Gerum : drivers/gpio: fix enumeration/detection of controllers

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: stable-3.0.x
Commit: bb9c92b86ac166f12d5661950fe53187af3247cf
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bb9c92b86ac166f12d5661950fe53187af3247cf

Author: Philippe Gerum 
Date:   Thu Sep 29 15:22:24 2016 +0200

drivers/gpio: fix enumeration/detection of controllers

---

 kernel/drivers/gpio/Kconfig|   18 +
 kernel/drivers/gpio/gpio-bcm2835.c |   12 +++---
 kernel/drivers/gpio/gpio-core.c|   71 +++-
 kernel/drivers/gpio/gpio-core.h|   10 -
 kernel/drivers/gpio/gpio-mxc.c |   39 ++--
 5 files changed, 89 insertions(+), 61 deletions(-)

diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig
index 850127f..74c56d4 100644
--- a/kernel/drivers/gpio/Kconfig
+++ b/kernel/drivers/gpio/Kconfig
@@ -1,13 +1,17 @@
 menu "Real-time GPIO drivers"
 
 config XENO_DRIVERS_GPIO
-   tristate
+   tristate "GPIO controller"
depends on GPIOLIB
+   help
+
+   Real-time capable GPIO module.
+  
+if XENO_DRIVERS_GPIO
 
 config XENO_DRIVERS_GPIO_BCM2835
depends on MACH_BCM2708
-   select XENO_DRIVERS_GPIO
-   tristate "Support for BCM2835 GPIOs"
+   bool "Support for BCM2835 GPIOs"
help
 
Enables support for the GPIO controller available from
@@ -15,15 +19,15 @@ config XENO_DRIVERS_GPIO_BCM2835
 
 config XENO_DRIVERS_GPIO_MXC
depends on GPIO_MXC
-   select XENO_DRIVERS_GPIO
-   tristate "Support for MXC GPIOs"
+   bool "Support for MXC GPIOs"
help
 
Suitable for the GPIO controller available from
Freescale/NXP's MXC architecture.
 
 config XENO_DRIVERS_GPIO_DEBUG
-   depends on XENO_DRIVERS_GPIO
bool "Enable GPIO core debugging features"
-   
+
+endif
+
 endmenu
diff --git a/kernel/drivers/gpio/gpio-bcm2835.c 
b/kernel/drivers/gpio/gpio-bcm2835.c
index f277262..6328955 100644
--- a/kernel/drivers/gpio/gpio-bcm2835.c
+++ b/kernel/drivers/gpio/gpio-bcm2835.c
@@ -20,20 +20,18 @@
 
 #define RTDM_SUBCLASS_BCM2835  1
 
-static struct rtdm_gpio_chip bcm2835_gpio_chip;
-
 static int __init bcm2835_gpio_init(void)
 {
-   return rtdm_gpiochip_add_by_name(_gpio_chip, "bcm2708_gpio",
-RTDM_SUBCLASS_BCM2835);
+   return rtdm_gpiochip_scan_of(NULL, "brcm,bcm2835-gpio",
+RTDM_SUBCLASS_BCM2835);
 }
+module_init(bcm2835_gpio_init);
 
 static void __exit bcm2835_gpio_exit(void)
 {
-   rtdm_gpiochip_remove(_gpio_chip);
+   rtdm_gpiochip_remove_of(RTDM_SUBCLASS_BCM2835);
 }
-
-module_init(bcm2835_gpio_init);
 module_exit(bcm2835_gpio_exit);
 
 MODULE_LICENSE("GPL");
+
diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c
index f18d571..5c08355 100644
--- a/kernel/drivers/gpio/gpio-core.c
+++ b/kernel/drivers/gpio/gpio-core.c
@@ -203,22 +203,23 @@ static void delete_pin_devices(struct rtdm_gpio_chip *rgc)
 {
struct rtdm_gpio_pin *pin, *n;
struct rtdm_device *dev;
+   rtdm_lockctx_t s;
 
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);

list_for_each_entry_safe(pin, n, >pins, next) {
list_del(>next);
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
dev = >dev;
rtdm_dev_unregister(dev);
rtdm_event_destroy(>event);
kfree(dev->label);
kfree(pin->name);
kfree(pin);
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);
}
 
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
 }
 
 static int create_pin_devices(struct rtdm_gpio_chip *rgc)
@@ -226,6 +227,7 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc)
struct gpio_chip *gc = rgc->gc;
struct rtdm_gpio_pin *pin;
struct rtdm_device *dev;
+   rtdm_lockctx_t s;
int n, ret;
 
for (n = gc->base; n < gc->base + gc->ngpio - 1; n++) {
@@ -252,9 +254,9 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc)
if (ret)
goto fail_register;
rtdm_event_init(>event, 0);
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);
list_add_tail(>next, >pins);
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
}
 
return 0;
@@ -362,8 +364,41 @@ EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name);
 
 #include 
 
+LIST_HEAD(rtdm_gpio_chips);
+
+static DEFINE_MUTEX(chip_lock);
+
+static int match_gpio_chip(struct gpio_chip *gc, void *data)
+{
+   struct device *dev = data;
+
+   return gc->dev == dev;
+}
+
+static int add_gpio_chip(struct gpio_chip *gc, int type)
+{
+   struct rtdm_gpio_chip *rgc;
+   int ret;
+
+   rgc = kzalloc(sizeof(*rgc), 

[Xenomai-git] Philippe Gerum : drivers/gpio: fix enumeration/detection of controllers

2016-12-27 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: bb9c92b86ac166f12d5661950fe53187af3247cf
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bb9c92b86ac166f12d5661950fe53187af3247cf

Author: Philippe Gerum 
Date:   Thu Sep 29 15:22:24 2016 +0200

drivers/gpio: fix enumeration/detection of controllers

---

 kernel/drivers/gpio/Kconfig|   18 +
 kernel/drivers/gpio/gpio-bcm2835.c |   12 +++---
 kernel/drivers/gpio/gpio-core.c|   71 +++-
 kernel/drivers/gpio/gpio-core.h|   10 -
 kernel/drivers/gpio/gpio-mxc.c |   39 ++--
 5 files changed, 89 insertions(+), 61 deletions(-)

diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig
index 850127f..74c56d4 100644
--- a/kernel/drivers/gpio/Kconfig
+++ b/kernel/drivers/gpio/Kconfig
@@ -1,13 +1,17 @@
 menu "Real-time GPIO drivers"
 
 config XENO_DRIVERS_GPIO
-   tristate
+   tristate "GPIO controller"
depends on GPIOLIB
+   help
+
+   Real-time capable GPIO module.
+  
+if XENO_DRIVERS_GPIO
 
 config XENO_DRIVERS_GPIO_BCM2835
depends on MACH_BCM2708
-   select XENO_DRIVERS_GPIO
-   tristate "Support for BCM2835 GPIOs"
+   bool "Support for BCM2835 GPIOs"
help
 
Enables support for the GPIO controller available from
@@ -15,15 +19,15 @@ config XENO_DRIVERS_GPIO_BCM2835
 
 config XENO_DRIVERS_GPIO_MXC
depends on GPIO_MXC
-   select XENO_DRIVERS_GPIO
-   tristate "Support for MXC GPIOs"
+   bool "Support for MXC GPIOs"
help
 
Suitable for the GPIO controller available from
Freescale/NXP's MXC architecture.
 
 config XENO_DRIVERS_GPIO_DEBUG
-   depends on XENO_DRIVERS_GPIO
bool "Enable GPIO core debugging features"
-   
+
+endif
+
 endmenu
diff --git a/kernel/drivers/gpio/gpio-bcm2835.c 
b/kernel/drivers/gpio/gpio-bcm2835.c
index f277262..6328955 100644
--- a/kernel/drivers/gpio/gpio-bcm2835.c
+++ b/kernel/drivers/gpio/gpio-bcm2835.c
@@ -20,20 +20,18 @@
 
 #define RTDM_SUBCLASS_BCM2835  1
 
-static struct rtdm_gpio_chip bcm2835_gpio_chip;
-
 static int __init bcm2835_gpio_init(void)
 {
-   return rtdm_gpiochip_add_by_name(_gpio_chip, "bcm2708_gpio",
-RTDM_SUBCLASS_BCM2835);
+   return rtdm_gpiochip_scan_of(NULL, "brcm,bcm2835-gpio",
+RTDM_SUBCLASS_BCM2835);
 }
+module_init(bcm2835_gpio_init);
 
 static void __exit bcm2835_gpio_exit(void)
 {
-   rtdm_gpiochip_remove(_gpio_chip);
+   rtdm_gpiochip_remove_of(RTDM_SUBCLASS_BCM2835);
 }
-
-module_init(bcm2835_gpio_init);
 module_exit(bcm2835_gpio_exit);
 
 MODULE_LICENSE("GPL");
+
diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c
index f18d571..5c08355 100644
--- a/kernel/drivers/gpio/gpio-core.c
+++ b/kernel/drivers/gpio/gpio-core.c
@@ -203,22 +203,23 @@ static void delete_pin_devices(struct rtdm_gpio_chip *rgc)
 {
struct rtdm_gpio_pin *pin, *n;
struct rtdm_device *dev;
+   rtdm_lockctx_t s;
 
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);

list_for_each_entry_safe(pin, n, >pins, next) {
list_del(>next);
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
dev = >dev;
rtdm_dev_unregister(dev);
rtdm_event_destroy(>event);
kfree(dev->label);
kfree(pin->name);
kfree(pin);
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);
}
 
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
 }
 
 static int create_pin_devices(struct rtdm_gpio_chip *rgc)
@@ -226,6 +227,7 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc)
struct gpio_chip *gc = rgc->gc;
struct rtdm_gpio_pin *pin;
struct rtdm_device *dev;
+   rtdm_lockctx_t s;
int n, ret;
 
for (n = gc->base; n < gc->base + gc->ngpio - 1; n++) {
@@ -252,9 +254,9 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc)
if (ret)
goto fail_register;
rtdm_event_init(>event, 0);
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);
list_add_tail(>next, >pins);
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
}
 
return 0;
@@ -362,8 +364,41 @@ EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name);
 
 #include 
 
+LIST_HEAD(rtdm_gpio_chips);
+
+static DEFINE_MUTEX(chip_lock);
+
+static int match_gpio_chip(struct gpio_chip *gc, void *data)
+{
+   struct device *dev = data;
+
+   return gc->dev == dev;
+}
+
+static int add_gpio_chip(struct gpio_chip *gc, int type)
+{
+   struct rtdm_gpio_chip *rgc;
+   int ret;
+
+   rgc = kzalloc(sizeof(*rgc), 

[Xenomai-git] Philippe Gerum : drivers/gpio: fix enumeration/detection of controllers

2016-11-21 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: e862c055998aceeab3253991fcfc3dfd469dda6a
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e862c055998aceeab3253991fcfc3dfd469dda6a

Author: Philippe Gerum 
Date:   Thu Sep 29 15:22:24 2016 +0200

drivers/gpio: fix enumeration/detection of controllers

---

 kernel/drivers/gpio/Kconfig|   18 +
 kernel/drivers/gpio/gpio-bcm2835.c |   12 +++---
 kernel/drivers/gpio/gpio-core.c|   71 +++-
 kernel/drivers/gpio/gpio-core.h|   10 -
 kernel/drivers/gpio/gpio-mxc.c |   39 ++--
 5 files changed, 89 insertions(+), 61 deletions(-)

diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig
index 850127f..74c56d4 100644
--- a/kernel/drivers/gpio/Kconfig
+++ b/kernel/drivers/gpio/Kconfig
@@ -1,13 +1,17 @@
 menu "Real-time GPIO drivers"
 
 config XENO_DRIVERS_GPIO
-   tristate
+   tristate "GPIO controller"
depends on GPIOLIB
+   help
+
+   Real-time capable GPIO module.
+  
+if XENO_DRIVERS_GPIO
 
 config XENO_DRIVERS_GPIO_BCM2835
depends on MACH_BCM2708
-   select XENO_DRIVERS_GPIO
-   tristate "Support for BCM2835 GPIOs"
+   bool "Support for BCM2835 GPIOs"
help
 
Enables support for the GPIO controller available from
@@ -15,15 +19,15 @@ config XENO_DRIVERS_GPIO_BCM2835
 
 config XENO_DRIVERS_GPIO_MXC
depends on GPIO_MXC
-   select XENO_DRIVERS_GPIO
-   tristate "Support for MXC GPIOs"
+   bool "Support for MXC GPIOs"
help
 
Suitable for the GPIO controller available from
Freescale/NXP's MXC architecture.
 
 config XENO_DRIVERS_GPIO_DEBUG
-   depends on XENO_DRIVERS_GPIO
bool "Enable GPIO core debugging features"
-   
+
+endif
+
 endmenu
diff --git a/kernel/drivers/gpio/gpio-bcm2835.c 
b/kernel/drivers/gpio/gpio-bcm2835.c
index f277262..6328955 100644
--- a/kernel/drivers/gpio/gpio-bcm2835.c
+++ b/kernel/drivers/gpio/gpio-bcm2835.c
@@ -20,20 +20,18 @@
 
 #define RTDM_SUBCLASS_BCM2835  1
 
-static struct rtdm_gpio_chip bcm2835_gpio_chip;
-
 static int __init bcm2835_gpio_init(void)
 {
-   return rtdm_gpiochip_add_by_name(_gpio_chip, "bcm2708_gpio",
-RTDM_SUBCLASS_BCM2835);
+   return rtdm_gpiochip_scan_of(NULL, "brcm,bcm2835-gpio",
+RTDM_SUBCLASS_BCM2835);
 }
+module_init(bcm2835_gpio_init);
 
 static void __exit bcm2835_gpio_exit(void)
 {
-   rtdm_gpiochip_remove(_gpio_chip);
+   rtdm_gpiochip_remove_of(RTDM_SUBCLASS_BCM2835);
 }
-
-module_init(bcm2835_gpio_init);
 module_exit(bcm2835_gpio_exit);
 
 MODULE_LICENSE("GPL");
+
diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c
index f18d571..5c08355 100644
--- a/kernel/drivers/gpio/gpio-core.c
+++ b/kernel/drivers/gpio/gpio-core.c
@@ -203,22 +203,23 @@ static void delete_pin_devices(struct rtdm_gpio_chip *rgc)
 {
struct rtdm_gpio_pin *pin, *n;
struct rtdm_device *dev;
+   rtdm_lockctx_t s;
 
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);

list_for_each_entry_safe(pin, n, >pins, next) {
list_del(>next);
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
dev = >dev;
rtdm_dev_unregister(dev);
rtdm_event_destroy(>event);
kfree(dev->label);
kfree(pin->name);
kfree(pin);
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);
}
 
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
 }
 
 static int create_pin_devices(struct rtdm_gpio_chip *rgc)
@@ -226,6 +227,7 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc)
struct gpio_chip *gc = rgc->gc;
struct rtdm_gpio_pin *pin;
struct rtdm_device *dev;
+   rtdm_lockctx_t s;
int n, ret;
 
for (n = gc->base; n < gc->base + gc->ngpio - 1; n++) {
@@ -252,9 +254,9 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc)
if (ret)
goto fail_register;
rtdm_event_init(>event, 0);
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);
list_add_tail(>next, >pins);
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
}
 
return 0;
@@ -362,8 +364,41 @@ EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name);
 
 #include 
 
+LIST_HEAD(rtdm_gpio_chips);
+
+static DEFINE_MUTEX(chip_lock);
+
+static int match_gpio_chip(struct gpio_chip *gc, void *data)
+{
+   struct device *dev = data;
+
+   return gc->dev == dev;
+}
+
+static int add_gpio_chip(struct gpio_chip *gc, int type)
+{
+   struct rtdm_gpio_chip *rgc;
+   int ret;
+
+   rgc = kzalloc(sizeof(*rgc), 

[Xenomai-git] Philippe Gerum : drivers/gpio: fix enumeration/detection of controllers

2016-09-29 Thread git repository hosting
Module: xenomai-3
Branch: wip/drivers
Commit: b4afc3ed63caaac49881c2be4a9f150ca182e735
URL:
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b4afc3ed63caaac49881c2be4a9f150ca182e735

Author: Philippe Gerum 
Date:   Thu Sep 29 15:22:24 2016 +0200

drivers/gpio: fix enumeration/detection of controllers

---

 kernel/drivers/gpio/Kconfig|   18 +
 kernel/drivers/gpio/gpio-bcm2835.c |   12 +++---
 kernel/drivers/gpio/gpio-core.c|   71 +++-
 kernel/drivers/gpio/gpio-core.h|   10 -
 kernel/drivers/gpio/gpio-mxc.c |   39 ++--
 5 files changed, 89 insertions(+), 61 deletions(-)

diff --git a/kernel/drivers/gpio/Kconfig b/kernel/drivers/gpio/Kconfig
index 850127f..74c56d4 100644
--- a/kernel/drivers/gpio/Kconfig
+++ b/kernel/drivers/gpio/Kconfig
@@ -1,13 +1,17 @@
 menu "Real-time GPIO drivers"
 
 config XENO_DRIVERS_GPIO
-   tristate
+   tristate "GPIO controller"
depends on GPIOLIB
+   help
+
+   Real-time capable GPIO module.
+  
+if XENO_DRIVERS_GPIO
 
 config XENO_DRIVERS_GPIO_BCM2835
depends on MACH_BCM2708
-   select XENO_DRIVERS_GPIO
-   tristate "Support for BCM2835 GPIOs"
+   bool "Support for BCM2835 GPIOs"
help
 
Enables support for the GPIO controller available from
@@ -15,15 +19,15 @@ config XENO_DRIVERS_GPIO_BCM2835
 
 config XENO_DRIVERS_GPIO_MXC
depends on GPIO_MXC
-   select XENO_DRIVERS_GPIO
-   tristate "Support for MXC GPIOs"
+   bool "Support for MXC GPIOs"
help
 
Suitable for the GPIO controller available from
Freescale/NXP's MXC architecture.
 
 config XENO_DRIVERS_GPIO_DEBUG
-   depends on XENO_DRIVERS_GPIO
bool "Enable GPIO core debugging features"
-   
+
+endif
+
 endmenu
diff --git a/kernel/drivers/gpio/gpio-bcm2835.c 
b/kernel/drivers/gpio/gpio-bcm2835.c
index f277262..6328955 100644
--- a/kernel/drivers/gpio/gpio-bcm2835.c
+++ b/kernel/drivers/gpio/gpio-bcm2835.c
@@ -20,20 +20,18 @@
 
 #define RTDM_SUBCLASS_BCM2835  1
 
-static struct rtdm_gpio_chip bcm2835_gpio_chip;
-
 static int __init bcm2835_gpio_init(void)
 {
-   return rtdm_gpiochip_add_by_name(_gpio_chip, "bcm2708_gpio",
-RTDM_SUBCLASS_BCM2835);
+   return rtdm_gpiochip_scan_of(NULL, "brcm,bcm2835-gpio",
+RTDM_SUBCLASS_BCM2835);
 }
+module_init(bcm2835_gpio_init);
 
 static void __exit bcm2835_gpio_exit(void)
 {
-   rtdm_gpiochip_remove(_gpio_chip);
+   rtdm_gpiochip_remove_of(RTDM_SUBCLASS_BCM2835);
 }
-
-module_init(bcm2835_gpio_init);
 module_exit(bcm2835_gpio_exit);
 
 MODULE_LICENSE("GPL");
+
diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c
index f18d571..5c08355 100644
--- a/kernel/drivers/gpio/gpio-core.c
+++ b/kernel/drivers/gpio/gpio-core.c
@@ -203,22 +203,23 @@ static void delete_pin_devices(struct rtdm_gpio_chip *rgc)
 {
struct rtdm_gpio_pin *pin, *n;
struct rtdm_device *dev;
+   rtdm_lockctx_t s;
 
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);

list_for_each_entry_safe(pin, n, >pins, next) {
list_del(>next);
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
dev = >dev;
rtdm_dev_unregister(dev);
rtdm_event_destroy(>event);
kfree(dev->label);
kfree(pin->name);
kfree(pin);
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);
}
 
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
 }
 
 static int create_pin_devices(struct rtdm_gpio_chip *rgc)
@@ -226,6 +227,7 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc)
struct gpio_chip *gc = rgc->gc;
struct rtdm_gpio_pin *pin;
struct rtdm_device *dev;
+   rtdm_lockctx_t s;
int n, ret;
 
for (n = gc->base; n < gc->base + gc->ngpio - 1; n++) {
@@ -252,9 +254,9 @@ static int create_pin_devices(struct rtdm_gpio_chip *rgc)
if (ret)
goto fail_register;
rtdm_event_init(>event, 0);
-   rtdm_lock_get(>lock);
+   rtdm_lock_get_irqsave(>lock, s);
list_add_tail(>next, >pins);
-   rtdm_lock_put(>lock);
+   rtdm_lock_put_irqrestore(>lock, s);
}
 
return 0;
@@ -362,8 +364,41 @@ EXPORT_SYMBOL_GPL(rtdm_gpiochip_add_by_name);
 
 #include 
 
+LIST_HEAD(rtdm_gpio_chips);
+
+static DEFINE_MUTEX(chip_lock);
+
+static int match_gpio_chip(struct gpio_chip *gc, void *data)
+{
+   struct device *dev = data;
+
+   return gc->dev == dev;
+}
+
+static int add_gpio_chip(struct gpio_chip *gc, int type)
+{
+   struct rtdm_gpio_chip *rgc;
+   int ret;
+
+   rgc = kzalloc(sizeof(*rgc),