[Xenomai-git] Philippe Gerum : drivers/gpio: fix enumeration/detection of controllers
Module: xenomai-3 Branch: master Commit: bb9c92b86ac166f12d5661950fe53187af3247cf URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bb9c92b86ac166f12d5661950fe53187af3247cf Author: Philippe GerumDate: 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
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 GerumDate: 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
Module: xenomai-3 Branch: wip/drivers Commit: bb9c92b86ac166f12d5661950fe53187af3247cf URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=bb9c92b86ac166f12d5661950fe53187af3247cf Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: wip/drivers Commit: e862c055998aceeab3253991fcfc3dfd469dda6a URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=e862c055998aceeab3253991fcfc3dfd469dda6a Author: Philippe GerumDate: 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
Module: xenomai-3 Branch: wip/drivers Commit: b4afc3ed63caaac49881c2be4a9f150ca182e735 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b4afc3ed63caaac49881c2be4a9f150ca182e735 Author: Philippe GerumDate: 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),