From 101e611ad203eb0d6a2f0c29375950916620b106 Mon Sep 17 00:00:00 2001 From: Kevin Hilman Date: Thu, 21 Apr 2011 09:08:15 -0700 Subject: [PATCH] --- yaml --- r: 256699 b: refs/heads/master c: df3c851716424fda0c7b14c4cae71cea467a9944 h: refs/heads/master i: 256697: 0548fb12e9ef6daa1d56bb195427d2e6eda7fcd4 256695: e47c935747f9fca5d0bc66e4e7bf0728838ca62e v: v3 --- [refs] | 2 +- .../devicetree/bindings/gpio/gpio_nvidia.txt | 7 - trunk/arch/arm/mach-ep93xx/Makefile | 2 +- trunk/arch/arm/mach-ep93xx/core.c | 27 +- .../arm/mach-ep93xx/gpio.c} | 243 ++++++------- .../mach-ep93xx/include/mach/ep93xx-regs.h | 1 - trunk/arch/arm/mach-imx/mach-apf9328.c | 2 - trunk/arch/arm/mach-imx/mach-armadillo5x0.c | 2 - trunk/arch/arm/mach-imx/mach-bug.c | 2 - trunk/arch/arm/mach-imx/mach-cpuimx27.c | 2 - trunk/arch/arm/mach-imx/mach-cpuimx35.c | 2 - .../arch/arm/mach-imx/mach-eukrea_cpuimx25.c | 2 - .../arm/mach-imx/mach-imx27_visstrim_m10.c | 2 - trunk/arch/arm/mach-imx/mach-imx27ipcam.c | 2 - trunk/arch/arm/mach-imx/mach-imx27lite.c | 2 - trunk/arch/arm/mach-imx/mach-kzm_arm11_01.c | 2 - trunk/arch/arm/mach-imx/mach-mx1ads.c | 2 - trunk/arch/arm/mach-imx/mach-mx21ads.c | 2 - trunk/arch/arm/mach-imx/mach-mx25_3ds.c | 2 - trunk/arch/arm/mach-imx/mach-mx27_3ds.c | 2 - trunk/arch/arm/mach-imx/mach-mx27ads.c | 2 - trunk/arch/arm/mach-imx/mach-mx31_3ds.c | 2 - trunk/arch/arm/mach-imx/mach-mx31ads.c | 2 - trunk/arch/arm/mach-imx/mach-mx31lilly.c | 2 - trunk/arch/arm/mach-imx/mach-mx31lite.c | 2 - trunk/arch/arm/mach-imx/mach-mx31moboard.c | 2 - trunk/arch/arm/mach-imx/mach-mx35_3ds.c | 2 - trunk/arch/arm/mach-imx/mach-mxt_td60.c | 2 - trunk/arch/arm/mach-imx/mach-pca100.c | 2 - trunk/arch/arm/mach-imx/mach-pcm037.c | 2 - trunk/arch/arm/mach-imx/mach-pcm038.c | 2 - trunk/arch/arm/mach-imx/mach-pcm043.c | 2 - trunk/arch/arm/mach-imx/mach-qong.c | 2 - trunk/arch/arm/mach-imx/mach-scb9328.c | 2 - trunk/arch/arm/mach-imx/mach-vpr200.c | 2 - trunk/arch/arm/mach-imx/mm-imx1.c | 17 +- trunk/arch/arm/mach-imx/mm-imx21.c | 21 +- trunk/arch/arm/mach-imx/mm-imx25.c | 16 +- trunk/arch/arm/mach-imx/mm-imx27.c | 21 +- trunk/arch/arm/mach-imx/mm-imx31.c | 15 +- trunk/arch/arm/mach-imx/mm-imx35.c | 15 +- trunk/arch/arm/mach-mx5/board-cpuimx51.c | 2 - trunk/arch/arm/mach-mx5/board-cpuimx51sd.c | 2 - trunk/arch/arm/mach-mx5/board-mx50_rdp.c | 2 - trunk/arch/arm/mach-mx5/board-mx51_3ds.c | 2 - trunk/arch/arm/mach-mx5/board-mx51_babbage.c | 2 - trunk/arch/arm/mach-mx5/board-mx51_efikamx.c | 2 - trunk/arch/arm/mach-mx5/board-mx51_efikasb.c | 2 - trunk/arch/arm/mach-mx5/board-mx53_evk.c | 2 - trunk/arch/arm/mach-mx5/board-mx53_loco.c | 2 - trunk/arch/arm/mach-mx5/board-mx53_smd.c | 2 - trunk/arch/arm/mach-mx5/devices.c | 64 ++++ trunk/arch/arm/mach-mx5/mm-mx50.c | 21 +- trunk/arch/arm/mach-mx5/mm.c | 25 +- trunk/arch/arm/mach-mxs/Makefile | 2 +- trunk/arch/arm/mach-mxs/devices.c | 11 - trunk/arch/arm/mach-mxs/devices/Makefile | 1 - .../arm/mach-mxs/devices/platform-gpio-mxs.c | 53 --- trunk/arch/arm/mach-mxs/gpio.c | 331 ++++++++++++++++++ trunk/arch/arm/mach-mxs/gpio.h | 34 ++ .../mach-mxs/include/mach/devices-common.h | 2 - trunk/arch/arm/mach-mxs/mach-mx28evk.c | 1 + trunk/arch/arm/mach-mxs/mm-mx23.c | 1 + trunk/arch/arm/mach-mxs/mm-mx28.c | 1 + trunk/arch/arm/mach-tegra/Makefile | 1 + .../arm/mach-tegra/gpio.c} | 10 - trunk/arch/arm/plat-mxc/Makefile | 2 +- trunk/arch/arm/plat-mxc/devices.c | 11 - trunk/arch/arm/plat-mxc/devices/Makefile | 1 - .../arm/plat-mxc/devices/platform-gpio-mxc.c | 32 -- .../gpio-mxc.c => arch/arm/plat-mxc/gpio.c} | 306 ++++++++-------- trunk/arch/arm/plat-mxc/include/mach/common.h | 12 +- .../plat-mxc/include/mach/devices-common.h | 2 - trunk/arch/arm/plat-mxc/include/mach/gpio.h | 27 ++ .../drivers/gpio/{gpio-74x164.c => 74x164.c} | 33 +- trunk/drivers/gpio/Kconfig | 49 ++- trunk/drivers/gpio/Makefile | 85 +++-- .../gpio/{gpio-ab8500.c => ab8500-gpio.c} | 0 .../gpio/{gpio-adp5520.c => adp5520-gpio.c} | 0 .../gpio/{gpio-adp5588.c => adp5588-gpio.c} | 0 .../{gpio-generic.c => basic_mmio_gpio.c} | 6 +- .../gpio/{gpio-bt8xx.c => bt8xxgpio.c} | 0 .../gpio/{gpio-cs5535.c => cs5535-gpio.c} | 0 trunk/drivers/gpio/gpio-exynos4.c | 5 +- trunk/drivers/gpio/gpio-mxs.c | 289 --------------- trunk/drivers/gpio/gpio-omap.c | 3 +- trunk/drivers/gpio/gpio-plat-samsung.c | 3 +- trunk/drivers/gpio/gpio-s5pc100.c | 5 +- trunk/drivers/gpio/gpio-s5pv210.c | 5 +- trunk/drivers/gpio/gpio-u300.c | 5 +- .../gpio/{gpio-it8761e.c => it8761e_gpio.c} | 2 +- .../gpio/{gpio-janz-ttl.c => janz-ttl.c} | 0 .../gpio/{gpio-langwell.c => langwell_gpio.c} | 4 +- .../gpio/{gpio-max7300.c => max7300.c} | 2 + .../gpio/{gpio-max7301.c => max7301.c} | 2 + .../gpio/{gpio-max730x.c => max730x.c} | 2 + .../gpio/{gpio-max732x.c => max732x.c} | 2 +- .../gpio/{gpio-mc33880.c => mc33880.c} | 2 +- .../gpio/{gpio-mcp23s08.c => mcp23s08.c} | 2 +- .../gpio/{gpio-ml-ioh.c => ml_ioh_gpio.c} | 0 .../gpio/{gpio-pca953x.c => pca953x.c} | 17 +- .../gpio/{gpio-pcf857x.c => pcf857x.c} | 2 +- trunk/drivers/gpio/{gpio-pch.c => pch_gpio.c} | 0 trunk/drivers/gpio/{gpio-pl061.c => pl061.c} | 4 +- .../gpio/{gpio-rdc321x.c => rdc321x-gpio.c} | 0 trunk/drivers/gpio/{gpio-sch.c => sch_gpio.c} | 2 +- .../gpio/{gpio-stmpe.c => stmpe-gpio.c} | 0 .../drivers/gpio/{gpio-sx150x.c => sx150x.c} | 0 .../gpio/{gpio-tc3589x.c => tc3589x-gpio.c} | 0 .../gpio/{gpio-timberdale.c => timbgpio.c} | 2 +- .../gpio/{gpio-tps65910.c => tps65910-gpio.c} | 2 +- .../gpio/{gpio-twl4030.c => twl4030-gpio.c} | 2 +- .../gpio/{gpio-ucb1400.c => ucb1400_gpio.c} | 0 .../gpio/{gpio-vr41xx.c => vr41xx_giu.c} | 2 +- .../gpio/{gpio-vx855.c => vx855_gpio.c} | 0 .../gpio/{gpio-wm831x.c => wm831x-gpio.c} | 2 +- .../gpio/{gpio-wm8350.c => wm8350-gpiolib.c} | 2 +- .../gpio/{gpio-wm8994.c => wm8994-gpio.c} | 2 +- .../gpio/{gpio-xilinx.c => xilinx_gpio.c} | 0 trunk/drivers/leds/Kconfig | 19 +- trunk/drivers/leds/leds-gpio.c | 6 +- trunk/include/linux/spi/74x164.h | 2 + 122 files changed, 983 insertions(+), 1005 deletions(-) delete mode 100644 trunk/Documentation/devicetree/bindings/gpio/gpio_nvidia.txt rename trunk/{drivers/gpio/gpio-ep93xx.c => arch/arm/mach-ep93xx/gpio.c} (69%) delete mode 100644 trunk/arch/arm/mach-mxs/devices/platform-gpio-mxs.c create mode 100644 trunk/arch/arm/mach-mxs/gpio.c create mode 100644 trunk/arch/arm/mach-mxs/gpio.h rename trunk/{drivers/gpio/gpio-tegra.c => arch/arm/mach-tegra/gpio.c} (97%) delete mode 100644 trunk/arch/arm/plat-mxc/devices/platform-gpio-mxc.c rename trunk/{drivers/gpio/gpio-mxc.c => arch/arm/plat-mxc/gpio.c} (51%) rename trunk/drivers/gpio/{gpio-74x164.c => 74x164.c} (88%) rename trunk/drivers/gpio/{gpio-ab8500.c => ab8500-gpio.c} (100%) rename trunk/drivers/gpio/{gpio-adp5520.c => adp5520-gpio.c} (100%) rename trunk/drivers/gpio/{gpio-adp5588.c => adp5588-gpio.c} (100%) rename trunk/drivers/gpio/{gpio-generic.c => basic_mmio_gpio.c} (99%) rename trunk/drivers/gpio/{gpio-bt8xx.c => bt8xxgpio.c} (100%) rename trunk/drivers/gpio/{gpio-cs5535.c => cs5535-gpio.c} (100%) delete mode 100644 trunk/drivers/gpio/gpio-mxs.c rename trunk/drivers/gpio/{gpio-it8761e.c => it8761e_gpio.c} (98%) rename trunk/drivers/gpio/{gpio-janz-ttl.c => janz-ttl.c} (100%) rename trunk/drivers/gpio/{gpio-langwell.c => langwell_gpio.c} (99%) rename trunk/drivers/gpio/{gpio-max7300.c => max7300.c} (98%) rename trunk/drivers/gpio/{gpio-max7301.c => max7301.c} (98%) rename trunk/drivers/gpio/{gpio-max730x.c => max730x.c} (99%) rename trunk/drivers/gpio/{gpio-max732x.c => max732x.c} (99%) rename trunk/drivers/gpio/{gpio-mc33880.c => mc33880.c} (98%) rename trunk/drivers/gpio/{gpio-mcp23s08.c => mcp23s08.c} (99%) rename trunk/drivers/gpio/{gpio-ml-ioh.c => ml_ioh_gpio.c} (100%) rename trunk/drivers/gpio/{gpio-pca953x.c => pca953x.c} (97%) rename trunk/drivers/gpio/{gpio-pcf857x.c => pcf857x.c} (99%) rename trunk/drivers/gpio/{gpio-pch.c => pch_gpio.c} (100%) rename trunk/drivers/gpio/{gpio-pl061.c => pl061.c} (99%) rename trunk/drivers/gpio/{gpio-rdc321x.c => rdc321x-gpio.c} (100%) rename trunk/drivers/gpio/{gpio-sch.c => sch_gpio.c} (99%) rename trunk/drivers/gpio/{gpio-stmpe.c => stmpe-gpio.c} (100%) rename trunk/drivers/gpio/{gpio-sx150x.c => sx150x.c} (100%) rename trunk/drivers/gpio/{gpio-tc3589x.c => tc3589x-gpio.c} (100%) rename trunk/drivers/gpio/{gpio-timberdale.c => timbgpio.c} (99%) rename trunk/drivers/gpio/{gpio-tps65910.c => tps65910-gpio.c} (98%) rename trunk/drivers/gpio/{gpio-twl4030.c => twl4030-gpio.c} (99%) rename trunk/drivers/gpio/{gpio-ucb1400.c => ucb1400_gpio.c} (100%) rename trunk/drivers/gpio/{gpio-vr41xx.c => vr41xx_giu.c} (99%) rename trunk/drivers/gpio/{gpio-vx855.c => vx855_gpio.c} (100%) rename trunk/drivers/gpio/{gpio-wm831x.c => wm831x-gpio.c} (99%) rename trunk/drivers/gpio/{gpio-wm8350.c => wm8350-gpiolib.c} (98%) rename trunk/drivers/gpio/{gpio-wm8994.c => wm8994-gpio.c} (99%) rename trunk/drivers/gpio/{gpio-xilinx.c => xilinx_gpio.c} (100%) diff --git a/[refs] b/[refs] index 5f3a6e972bbd..f0ba74784e88 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2bc7c85210d75b7a8a7326284b4f608a16f52ffc +refs/heads/master: df3c851716424fda0c7b14c4cae71cea467a9944 diff --git a/trunk/Documentation/devicetree/bindings/gpio/gpio_nvidia.txt b/trunk/Documentation/devicetree/bindings/gpio/gpio_nvidia.txt deleted file mode 100644 index afb3ff3134c8..000000000000 --- a/trunk/Documentation/devicetree/bindings/gpio/gpio_nvidia.txt +++ /dev/null @@ -1,7 +0,0 @@ -NVIDIA Tegra 2 GPIO controller - -Required properties: -- compatible : "nvidia,tegra250-gpio" -- #gpio-cells : Should be two. The first cell is the pin number and the - second cell is used to specify optional parameters (currently unused). -- gpio-controller : Marks the device node as a GPIO controller. diff --git a/trunk/arch/arm/mach-ep93xx/Makefile b/trunk/arch/arm/mach-ep93xx/Makefile index 6b7c41d155df..33ee2c863d18 100644 --- a/trunk/arch/arm/mach-ep93xx/Makefile +++ b/trunk/arch/arm/mach-ep93xx/Makefile @@ -1,7 +1,7 @@ # # Makefile for the linux kernel. # -obj-y := core.o clock.o dma-m2p.o +obj-y := core.o clock.o dma-m2p.o gpio.o obj-m := obj-n := obj- := diff --git a/trunk/arch/arm/mach-ep93xx/core.c b/trunk/arch/arm/mach-ep93xx/core.c index b80d9670cdd5..1d4b65fd673e 100644 --- a/trunk/arch/arm/mach-ep93xx/core.c +++ b/trunk/arch/arm/mach-ep93xx/core.c @@ -174,10 +174,14 @@ struct sys_timer ep93xx_timer = { /************************************************************************* * EP93xx IRQ handling *************************************************************************/ +extern void ep93xx_gpio_init_irq(void); + void __init ep93xx_init_irq(void) { vic_init(EP93XX_VIC1_BASE, 0, EP93XX_VIC1_VALID_IRQ_MASK, 0); vic_init(EP93XX_VIC2_BASE, 32, EP93XX_VIC2_VALID_IRQ_MASK, 0); + + ep93xx_gpio_init_irq(); } @@ -236,24 +240,6 @@ unsigned int ep93xx_chip_revision(void) return v; } -/************************************************************************* - * EP93xx GPIO - *************************************************************************/ -static struct resource ep93xx_gpio_resource[] = { - { - .start = EP93XX_GPIO_PHYS_BASE, - .end = EP93XX_GPIO_PHYS_BASE + 0xcc - 1, - .flags = IORESOURCE_MEM, - }, -}; - -static struct platform_device ep93xx_gpio_device = { - .name = "gpio-ep93xx", - .id = -1, - .num_resources = ARRAY_SIZE(ep93xx_gpio_resource), - .resource = ep93xx_gpio_resource, -}; - /************************************************************************* * EP93xx peripheral handling *************************************************************************/ @@ -884,13 +870,14 @@ void __init ep93xx_register_ac97(void) platform_device_register(&ep93xx_pcm_device); } +extern void ep93xx_gpio_init(void); + void __init ep93xx_init_devices(void) { /* Disallow access to MaverickCrunch initially */ ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_CPENA); - /* Get the GPIO working early, other devices need it */ - platform_device_register(&ep93xx_gpio_device); + ep93xx_gpio_init(); amba_device_register(&uart1_device, &iomem_resource); amba_device_register(&uart2_device, &iomem_resource); diff --git a/trunk/drivers/gpio/gpio-ep93xx.c b/trunk/arch/arm/mach-ep93xx/gpio.c similarity index 69% rename from trunk/drivers/gpio/gpio-ep93xx.c rename to trunk/arch/arm/mach-ep93xx/gpio.c index 3bfd3417ab11..415dce37b88c 100644 --- a/trunk/drivers/gpio/gpio-ep93xx.c +++ b/trunk/arch/arm/mach-ep93xx/gpio.c @@ -1,8 +1,9 @@ /* + * linux/arch/arm/mach-ep93xx/gpio.c + * * Generic EP93xx GPIO handling * * Copyright (c) 2008 Ryan Mallon - * Copyright (c) 2011 H Hartley Sweeten * * Based on code originally from: * linux/arch/arm/mach-ep93xx/core.c @@ -12,23 +13,17 @@ * published by the Free Software Foundation. */ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#define pr_fmt(fmt) "ep93xx " KBUILD_MODNAME ": " fmt #include -#include +#include +#include #include #include #include -#include -#include #include -struct ep93xx_gpio { - void __iomem *mmio_base; - struct bgpio_chip bgc[8]; -}; - /************************************************************************* * Interrupt handling for EP93xx on-chip GPIOs *************************************************************************/ @@ -230,7 +225,7 @@ static struct irq_chip ep93xx_gpio_irq_chip = { .irq_set_type = ep93xx_gpio_irq_type, }; -static void ep93xx_gpio_init_irq(void) +void __init ep93xx_gpio_init_irq(void) { int gpio_irq; @@ -265,141 +260,151 @@ static void ep93xx_gpio_init_irq(void) /************************************************************************* * gpiolib interface for EP93xx on-chip GPIOs *************************************************************************/ -struct ep93xx_gpio_bank { - const char *label; - int data; - int dir; - int base; - bool has_debounce; -}; +struct ep93xx_gpio_chip { + struct gpio_chip chip; -#define EP93XX_GPIO_BANK(_label, _data, _dir, _base, _debounce) \ - { \ - .label = _label, \ - .data = _data, \ - .dir = _dir, \ - .base = _base, \ - .has_debounce = _debounce, \ - } - -static struct ep93xx_gpio_bank ep93xx_gpio_banks[] = { - EP93XX_GPIO_BANK("A", 0x00, 0x10, 0, true), - EP93XX_GPIO_BANK("B", 0x04, 0x14, 8, true), - EP93XX_GPIO_BANK("C", 0x08, 0x18, 40, false), - EP93XX_GPIO_BANK("D", 0x0c, 0x1c, 24, false), - EP93XX_GPIO_BANK("E", 0x20, 0x24, 32, false), - EP93XX_GPIO_BANK("F", 0x30, 0x34, 16, true), - EP93XX_GPIO_BANK("G", 0x38, 0x3c, 48, false), - EP93XX_GPIO_BANK("H", 0x40, 0x44, 56, false), + void __iomem *data_reg; + void __iomem *data_dir_reg; }; -static int ep93xx_gpio_set_debounce(struct gpio_chip *chip, - unsigned offset, unsigned debounce) -{ - int gpio = chip->base + offset; - int irq = gpio_to_irq(gpio); +#define to_ep93xx_gpio_chip(c) container_of(c, struct ep93xx_gpio_chip, chip) - if (irq < 0) - return -EINVAL; +static int ep93xx_gpio_direction_input(struct gpio_chip *chip, unsigned offset) +{ + struct ep93xx_gpio_chip *ep93xx_chip = to_ep93xx_gpio_chip(chip); + unsigned long flags; + u8 v; - ep93xx_gpio_int_debounce(irq, debounce ? true : false); + local_irq_save(flags); + v = __raw_readb(ep93xx_chip->data_dir_reg); + v &= ~(1 << offset); + __raw_writeb(v, ep93xx_chip->data_dir_reg); + local_irq_restore(flags); return 0; } -static int ep93xx_gpio_add_bank(struct bgpio_chip *bgc, struct device *dev, - void __iomem *mmio_base, struct ep93xx_gpio_bank *bank) +static int ep93xx_gpio_direction_output(struct gpio_chip *chip, + unsigned offset, int val) { - void __iomem *data = mmio_base + bank->data; - void __iomem *dir = mmio_base + bank->dir; - int err; + struct ep93xx_gpio_chip *ep93xx_chip = to_ep93xx_gpio_chip(chip); + unsigned long flags; + int line; + u8 v; - err = bgpio_init(bgc, dev, 1, data, NULL, NULL, dir, NULL, false); - if (err) - return err; + local_irq_save(flags); - bgc->gc.label = bank->label; - bgc->gc.base = bank->base; + /* Set the value */ + v = __raw_readb(ep93xx_chip->data_reg); + if (val) + v |= (1 << offset); + else + v &= ~(1 << offset); + __raw_writeb(v, ep93xx_chip->data_reg); + + /* Drive as an output */ + line = chip->base + offset; + if (line <= EP93XX_GPIO_LINE_MAX_IRQ) { + /* Ports A/B/F */ + ep93xx_gpio_int_mask(line); + ep93xx_gpio_update_int_params(line >> 3); + } - if (bank->has_debounce) - bgc->gc.set_debounce = ep93xx_gpio_set_debounce; + v = __raw_readb(ep93xx_chip->data_dir_reg); + v |= (1 << offset); + __raw_writeb(v, ep93xx_chip->data_dir_reg); - return gpiochip_add(&bgc->gc); + local_irq_restore(flags); + + return 0; } -static int __devinit ep93xx_gpio_probe(struct platform_device *pdev) +static int ep93xx_gpio_get(struct gpio_chip *chip, unsigned offset) { - struct ep93xx_gpio *ep93xx_gpio; - struct resource *res; - void __iomem *mmio; - int i; - int ret; + struct ep93xx_gpio_chip *ep93xx_chip = to_ep93xx_gpio_chip(chip); - ep93xx_gpio = kzalloc(sizeof(*ep93xx_gpio), GFP_KERNEL); - if (!ep93xx_gpio) - return -ENOMEM; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - ret = -ENXIO; - goto exit_free; - } - - if (!request_mem_region(res->start, resource_size(res), pdev->name)) { - ret = -EBUSY; - goto exit_free; - } - - mmio = ioremap(res->start, resource_size(res)); - if (!mmio) { - ret = -ENXIO; - goto exit_release; - } - ep93xx_gpio->mmio_base = mmio; + return !!(__raw_readb(ep93xx_chip->data_reg) & (1 << offset)); +} - /* Default all ports to GPIO */ - ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_KEYS | - EP93XX_SYSCON_DEVCFG_GONK | - EP93XX_SYSCON_DEVCFG_EONIDE | - EP93XX_SYSCON_DEVCFG_GONIDE | - EP93XX_SYSCON_DEVCFG_HONIDE); +static void ep93xx_gpio_set(struct gpio_chip *chip, unsigned offset, int val) +{ + struct ep93xx_gpio_chip *ep93xx_chip = to_ep93xx_gpio_chip(chip); + unsigned long flags; + u8 v; + + local_irq_save(flags); + v = __raw_readb(ep93xx_chip->data_reg); + if (val) + v |= (1 << offset); + else + v &= ~(1 << offset); + __raw_writeb(v, ep93xx_chip->data_reg); + local_irq_restore(flags); +} - for (i = 0; i < ARRAY_SIZE(ep93xx_gpio_banks); i++) { - struct bgpio_chip *bgc = &ep93xx_gpio->bgc[i]; - struct ep93xx_gpio_bank *bank = &ep93xx_gpio_banks[i]; +static int ep93xx_gpio_set_debounce(struct gpio_chip *chip, + unsigned offset, unsigned debounce) +{ + int gpio = chip->base + offset; + int irq = gpio_to_irq(gpio); - if (ep93xx_gpio_add_bank(bgc, &pdev->dev, mmio, bank)) - dev_warn(&pdev->dev, "Unable to add gpio bank %s\n", - bank->label); - } + if (irq < 0) + return -EINVAL; - ep93xx_gpio_init_irq(); + ep93xx_gpio_int_debounce(irq, debounce ? true : false); return 0; - -exit_release: - release_mem_region(res->start, resource_size(res)); -exit_free: - kfree(ep93xx_gpio); - dev_info(&pdev->dev, "%s failed with errno %d\n", __func__, ret); - return ret; } -static struct platform_driver ep93xx_gpio_driver = { - .driver = { - .name = "gpio-ep93xx", - .owner = THIS_MODULE, - }, - .probe = ep93xx_gpio_probe, +#define EP93XX_GPIO_BANK(name, dr, ddr, base_gpio) \ + { \ + .chip = { \ + .label = name, \ + .direction_input = ep93xx_gpio_direction_input, \ + .direction_output = ep93xx_gpio_direction_output, \ + .get = ep93xx_gpio_get, \ + .set = ep93xx_gpio_set, \ + .base = base_gpio, \ + .ngpio = 8, \ + }, \ + .data_reg = EP93XX_GPIO_REG(dr), \ + .data_dir_reg = EP93XX_GPIO_REG(ddr), \ + } + +static struct ep93xx_gpio_chip ep93xx_gpio_banks[] = { + EP93XX_GPIO_BANK("A", 0x00, 0x10, 0), + EP93XX_GPIO_BANK("B", 0x04, 0x14, 8), + EP93XX_GPIO_BANK("C", 0x08, 0x18, 40), + EP93XX_GPIO_BANK("D", 0x0c, 0x1c, 24), + EP93XX_GPIO_BANK("E", 0x20, 0x24, 32), + EP93XX_GPIO_BANK("F", 0x30, 0x34, 16), + EP93XX_GPIO_BANK("G", 0x38, 0x3c, 48), + EP93XX_GPIO_BANK("H", 0x40, 0x44, 56), }; -static int __init ep93xx_gpio_init(void) +void __init ep93xx_gpio_init(void) { - return platform_driver_register(&ep93xx_gpio_driver); -} -postcore_initcall(ep93xx_gpio_init); + int i; + + /* Set Ports C, D, E, G, and H for GPIO use */ + ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_KEYS | + EP93XX_SYSCON_DEVCFG_GONK | + EP93XX_SYSCON_DEVCFG_EONIDE | + EP93XX_SYSCON_DEVCFG_GONIDE | + EP93XX_SYSCON_DEVCFG_HONIDE); -MODULE_AUTHOR("Ryan Mallon " - "H Hartley Sweeten "); -MODULE_DESCRIPTION("EP93XX GPIO driver"); -MODULE_LICENSE("GPL"); + for (i = 0; i < ARRAY_SIZE(ep93xx_gpio_banks); i++) { + struct gpio_chip *chip = &ep93xx_gpio_banks[i].chip; + + /* + * Ports A, B, and F support input debouncing when + * used as interrupts. + */ + if (!strcmp(chip->label, "A") || + !strcmp(chip->label, "B") || + !strcmp(chip->label, "F")) + chip->set_debounce = ep93xx_gpio_set_debounce; + + gpiochip_add(chip); + } +} diff --git a/trunk/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h b/trunk/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h index c4a7b84ef06d..9ac4d1055097 100644 --- a/trunk/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h +++ b/trunk/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h @@ -98,7 +98,6 @@ #define EP93XX_SECURITY_BASE EP93XX_APB_IOMEM(0x00030000) -#define EP93XX_GPIO_PHYS_BASE EP93XX_APB_PHYS(0x00040000) #define EP93XX_GPIO_BASE EP93XX_APB_IOMEM(0x00040000) #define EP93XX_GPIO_REG(x) (EP93XX_GPIO_BASE + (x)) #define EP93XX_GPIO_F_INT_STATUS EP93XX_GPIO_REG(0x5c) diff --git a/trunk/arch/arm/mach-imx/mach-apf9328.c b/trunk/arch/arm/mach-imx/mach-apf9328.c index 59d2a3b137d9..15e45c84e371 100644 --- a/trunk/arch/arm/mach-imx/mach-apf9328.c +++ b/trunk/arch/arm/mach-imx/mach-apf9328.c @@ -115,8 +115,6 @@ static struct platform_device *devices[] __initdata = { static void __init apf9328_init(void) { - imx1_soc_init(); - mxc_gpio_setup_multiple_pins(apf9328_pins, ARRAY_SIZE(apf9328_pins), "APF9328"); diff --git a/trunk/arch/arm/mach-imx/mach-armadillo5x0.c b/trunk/arch/arm/mach-imx/mach-armadillo5x0.c index ede2710f8b76..ffb40ff619b1 100644 --- a/trunk/arch/arm/mach-imx/mach-armadillo5x0.c +++ b/trunk/arch/arm/mach-imx/mach-armadillo5x0.c @@ -490,8 +490,6 @@ static struct platform_device *devices[] __initdata = { */ static void __init armadillo5x0_init(void) { - imx31_soc_init(); - mxc_iomux_setup_multiple_pins(armadillo5x0_pins, ARRAY_SIZE(armadillo5x0_pins), "armadillo5x0"); diff --git a/trunk/arch/arm/mach-imx/mach-bug.c b/trunk/arch/arm/mach-imx/mach-bug.c index f49470553bdf..42e4f078a19c 100644 --- a/trunk/arch/arm/mach-imx/mach-bug.c +++ b/trunk/arch/arm/mach-imx/mach-bug.c @@ -42,8 +42,6 @@ static const unsigned int bug_pins[] __initconst = { static void __init bug_board_init(void) { - imx31_soc_init(); - mxc_iomux_setup_multiple_pins(bug_pins, ARRAY_SIZE(bug_pins), "uart-4"); imx31_add_imx_uart4(&uart_pdata); diff --git a/trunk/arch/arm/mach-imx/mach-cpuimx27.c b/trunk/arch/arm/mach-imx/mach-cpuimx27.c index 87887ac5806b..46a2e41d43d2 100644 --- a/trunk/arch/arm/mach-imx/mach-cpuimx27.c +++ b/trunk/arch/arm/mach-imx/mach-cpuimx27.c @@ -250,8 +250,6 @@ __setup("otg_mode=", eukrea_cpuimx27_otg_mode); static void __init eukrea_cpuimx27_init(void) { - imx27_soc_init(); - mxc_gpio_setup_multiple_pins(eukrea_cpuimx27_pins, ARRAY_SIZE(eukrea_cpuimx27_pins), "CPUIMX27"); diff --git a/trunk/arch/arm/mach-imx/mach-cpuimx35.c b/trunk/arch/arm/mach-imx/mach-cpuimx35.c index f39a478ba1a6..3f8ef825fa6f 100644 --- a/trunk/arch/arm/mach-imx/mach-cpuimx35.c +++ b/trunk/arch/arm/mach-imx/mach-cpuimx35.c @@ -156,8 +156,6 @@ __setup("otg_mode=", eukrea_cpuimx35_otg_mode); */ static void __init eukrea_cpuimx35_init(void) { - imx35_soc_init(); - mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx35_pads, ARRAY_SIZE(eukrea_cpuimx35_pads)); diff --git a/trunk/arch/arm/mach-imx/mach-eukrea_cpuimx25.c b/trunk/arch/arm/mach-imx/mach-eukrea_cpuimx25.c index da36da52969d..148cff2819b9 100644 --- a/trunk/arch/arm/mach-imx/mach-eukrea_cpuimx25.c +++ b/trunk/arch/arm/mach-imx/mach-eukrea_cpuimx25.c @@ -125,8 +125,6 @@ __setup("otg_mode=", eukrea_cpuimx25_otg_mode); static void __init eukrea_cpuimx25_init(void) { - imx25_soc_init(); - if (mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx25_pads, ARRAY_SIZE(eukrea_cpuimx25_pads))) printk(KERN_ERR "error setting cpuimx25 pads !\n"); diff --git a/trunk/arch/arm/mach-imx/mach-imx27_visstrim_m10.c b/trunk/arch/arm/mach-imx/mach-imx27_visstrim_m10.c index c6269d60ddbc..7ae43b1ec517 100644 --- a/trunk/arch/arm/mach-imx/mach-imx27_visstrim_m10.c +++ b/trunk/arch/arm/mach-imx/mach-imx27_visstrim_m10.c @@ -231,8 +231,6 @@ static void __init visstrim_m10_board_init(void) { int ret; - imx27_soc_init(); - ret = mxc_gpio_setup_multiple_pins(visstrim_m10_pins, ARRAY_SIZE(visstrim_m10_pins), "VISSTRIM_M10"); if (ret) diff --git a/trunk/arch/arm/mach-imx/mach-imx27ipcam.c b/trunk/arch/arm/mach-imx/mach-imx27ipcam.c index 272f793e9247..9be6cd6fbf8c 100644 --- a/trunk/arch/arm/mach-imx/mach-imx27ipcam.c +++ b/trunk/arch/arm/mach-imx/mach-imx27ipcam.c @@ -50,8 +50,6 @@ static const int mx27ipcam_pins[] __initconst = { static void __init mx27ipcam_init(void) { - imx27_soc_init(); - mxc_gpio_setup_multiple_pins(mx27ipcam_pins, ARRAY_SIZE(mx27ipcam_pins), "mx27ipcam"); diff --git a/trunk/arch/arm/mach-imx/mach-imx27lite.c b/trunk/arch/arm/mach-imx/mach-imx27lite.c index d81a769fe895..841140516ede 100644 --- a/trunk/arch/arm/mach-imx/mach-imx27lite.c +++ b/trunk/arch/arm/mach-imx/mach-imx27lite.c @@ -59,8 +59,6 @@ static const struct imxuart_platform_data uart_pdata __initconst = { static void __init mx27lite_init(void) { - imx27_soc_init(); - mxc_gpio_setup_multiple_pins(mx27lite_pins, ARRAY_SIZE(mx27lite_pins), "imx27lite"); imx27_add_imx_uart0(&uart_pdata); diff --git a/trunk/arch/arm/mach-imx/mach-kzm_arm11_01.c b/trunk/arch/arm/mach-imx/mach-kzm_arm11_01.c index e472a1d88058..1ecae20cf4e3 100644 --- a/trunk/arch/arm/mach-imx/mach-kzm_arm11_01.c +++ b/trunk/arch/arm/mach-imx/mach-kzm_arm11_01.c @@ -223,8 +223,6 @@ static int kzm_pins[] __initdata = { */ static void __init kzm_board_init(void) { - imx31_soc_init(); - mxc_iomux_setup_multiple_pins(kzm_pins, ARRAY_SIZE(kzm_pins), "kzm"); kzm_init_ext_uart(); diff --git a/trunk/arch/arm/mach-imx/mach-mx1ads.c b/trunk/arch/arm/mach-imx/mach-mx1ads.c index 5cd8bee46960..38ec5cbbda9b 100644 --- a/trunk/arch/arm/mach-imx/mach-mx1ads.c +++ b/trunk/arch/arm/mach-imx/mach-mx1ads.c @@ -115,8 +115,6 @@ static struct i2c_board_info mx1ads_i2c_devices[] = { */ static void __init mx1ads_init(void) { - imx1_soc_init(); - mxc_gpio_setup_multiple_pins(mx1ads_pins, ARRAY_SIZE(mx1ads_pins), "mx1ads"); diff --git a/trunk/arch/arm/mach-imx/mach-mx21ads.c b/trunk/arch/arm/mach-imx/mach-mx21ads.c index d389ecf9b5a8..74ac88978ddd 100644 --- a/trunk/arch/arm/mach-imx/mach-mx21ads.c +++ b/trunk/arch/arm/mach-imx/mach-mx21ads.c @@ -279,8 +279,6 @@ static struct platform_device *platform_devices[] __initdata = { static void __init mx21ads_board_init(void) { - imx21_soc_init(); - mxc_gpio_setup_multiple_pins(mx21ads_pins, ARRAY_SIZE(mx21ads_pins), "mx21ads"); diff --git a/trunk/arch/arm/mach-imx/mach-mx25_3ds.c b/trunk/arch/arm/mach-imx/mach-mx25_3ds.c index 01534bb61305..58ea3fdf0911 100644 --- a/trunk/arch/arm/mach-imx/mach-mx25_3ds.c +++ b/trunk/arch/arm/mach-imx/mach-mx25_3ds.c @@ -219,8 +219,6 @@ static const struct esdhc_platform_data mx25pdk_esdhc_pdata __initconst = { static void __init mx25pdk_init(void) { - imx25_soc_init(); - mxc_iomux_v3_setup_multiple_pads(mx25pdk_pads, ARRAY_SIZE(mx25pdk_pads)); diff --git a/trunk/arch/arm/mach-imx/mach-mx27_3ds.c b/trunk/arch/arm/mach-imx/mach-mx27_3ds.c index 117ce0a50f4e..6e1accf93f81 100644 --- a/trunk/arch/arm/mach-imx/mach-mx27_3ds.c +++ b/trunk/arch/arm/mach-imx/mach-mx27_3ds.c @@ -267,8 +267,6 @@ static const struct imxi2c_platform_data mx27_3ds_i2c0_data __initconst = { static void __init mx27pdk_init(void) { - imx27_soc_init(); - mxc_gpio_setup_multiple_pins(mx27pdk_pins, ARRAY_SIZE(mx27pdk_pins), "mx27pdk"); mx27_3ds_sdhc1_enable_level_translator(); diff --git a/trunk/arch/arm/mach-imx/mach-mx27ads.c b/trunk/arch/arm/mach-imx/mach-mx27ads.c index fc26ed71b9ed..1db79506f5e4 100644 --- a/trunk/arch/arm/mach-imx/mach-mx27ads.c +++ b/trunk/arch/arm/mach-imx/mach-mx27ads.c @@ -288,8 +288,6 @@ static const struct imxuart_platform_data uart_pdata __initconst = { static void __init mx27ads_board_init(void) { - imx27_soc_init(); - mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins), "mx27ads"); diff --git a/trunk/arch/arm/mach-imx/mach-mx31_3ds.c b/trunk/arch/arm/mach-imx/mach-mx31_3ds.c index ab2a6268b50b..9b982449cb52 100644 --- a/trunk/arch/arm/mach-imx/mach-mx31_3ds.c +++ b/trunk/arch/arm/mach-imx/mach-mx31_3ds.c @@ -689,8 +689,6 @@ static void __init mx31_3ds_init(void) { int ret; - imx31_soc_init(); - mxc_iomux_setup_multiple_pins(mx31_3ds_pins, ARRAY_SIZE(mx31_3ds_pins), "mx31_3ds"); diff --git a/trunk/arch/arm/mach-imx/mach-mx31ads.c b/trunk/arch/arm/mach-imx/mach-mx31ads.c index 0ce49478a479..f4dee0254634 100644 --- a/trunk/arch/arm/mach-imx/mach-mx31ads.c +++ b/trunk/arch/arm/mach-imx/mach-mx31ads.c @@ -516,8 +516,6 @@ static void __init mx31ads_init_irq(void) static void __init mx31ads_init(void) { - imx31_soc_init(); - mxc_init_extuart(); mxc_init_imx_uart(); mxc_init_i2c(); diff --git a/trunk/arch/arm/mach-imx/mach-mx31lilly.c b/trunk/arch/arm/mach-imx/mach-mx31lilly.c index 750368ddf0f9..410e676ae087 100644 --- a/trunk/arch/arm/mach-imx/mach-mx31lilly.c +++ b/trunk/arch/arm/mach-imx/mach-mx31lilly.c @@ -243,8 +243,6 @@ core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444); static void __init mx31lilly_board_init(void) { - imx31_soc_init(); - switch (mx31lilly_baseboard) { case MX31LILLY_NOBOARD: break; diff --git a/trunk/arch/arm/mach-imx/mach-mx31lite.c b/trunk/arch/arm/mach-imx/mach-mx31lite.c index 4b47fd9fdd89..ac9b4cad320e 100644 --- a/trunk/arch/arm/mach-imx/mach-mx31lite.c +++ b/trunk/arch/arm/mach-imx/mach-mx31lite.c @@ -230,8 +230,6 @@ static void __init mx31lite_init(void) { int ret; - imx31_soc_init(); - switch (mx31lite_baseboard) { case MX31LITE_NOBOARD: break; diff --git a/trunk/arch/arm/mach-imx/mach-mx31moboard.c b/trunk/arch/arm/mach-imx/mach-mx31moboard.c index a52fd36e2b52..eaa51e49ca95 100644 --- a/trunk/arch/arm/mach-imx/mach-mx31moboard.c +++ b/trunk/arch/arm/mach-imx/mach-mx31moboard.c @@ -507,8 +507,6 @@ core_param(mx31moboard_baseboard, mx31moboard_baseboard, int, 0444); */ static void __init mx31moboard_init(void) { - imx31_soc_init(); - mxc_iomux_setup_multiple_pins(moboard_pins, ARRAY_SIZE(moboard_pins), "moboard"); diff --git a/trunk/arch/arm/mach-imx/mach-mx35_3ds.c b/trunk/arch/arm/mach-imx/mach-mx35_3ds.c index 48b3c6fd5cf0..882880ac1bbc 100644 --- a/trunk/arch/arm/mach-imx/mach-mx35_3ds.c +++ b/trunk/arch/arm/mach-imx/mach-mx35_3ds.c @@ -179,8 +179,6 @@ static const struct imxi2c_platform_data mx35_3ds_i2c0_data __initconst = { */ static void __init mx35_3ds_init(void) { - imx35_soc_init(); - mxc_iomux_v3_setup_multiple_pads(mx35pdk_pads, ARRAY_SIZE(mx35pdk_pads)); imx35_add_fec(NULL); diff --git a/trunk/arch/arm/mach-imx/mach-mxt_td60.c b/trunk/arch/arm/mach-imx/mach-mxt_td60.c index c85876fed663..2774541511e7 100644 --- a/trunk/arch/arm/mach-imx/mach-mxt_td60.c +++ b/trunk/arch/arm/mach-imx/mach-mxt_td60.c @@ -233,8 +233,6 @@ static const struct imxuart_platform_data uart_pdata __initconst = { static void __init mxt_td60_board_init(void) { - imx27_soc_init(); - mxc_gpio_setup_multiple_pins(mxt_td60_pins, ARRAY_SIZE(mxt_td60_pins), "MXT_TD60"); diff --git a/trunk/arch/arm/mach-imx/mach-pca100.c b/trunk/arch/arm/mach-imx/mach-pca100.c index 71083aa16038..bbddc5a11c43 100644 --- a/trunk/arch/arm/mach-imx/mach-pca100.c +++ b/trunk/arch/arm/mach-imx/mach-pca100.c @@ -357,8 +357,6 @@ static void __init pca100_init(void) { int ret; - imx27_soc_init(); - /* SSI unit */ mxc_audmux_v1_configure_port(MX27_AUDMUX_HPCR1_SSI0, MXC_AUDMUX_V1_PCR_SYN | /* 4wire mode */ diff --git a/trunk/arch/arm/mach-imx/mach-pcm037.c b/trunk/arch/arm/mach-imx/mach-pcm037.c index f45b7cd72c8a..89c213b81295 100644 --- a/trunk/arch/arm/mach-imx/mach-pcm037.c +++ b/trunk/arch/arm/mach-imx/mach-pcm037.c @@ -576,8 +576,6 @@ static void __init pcm037_init(void) { int ret; - imx31_soc_init(); - mxc_iomux_set_gpr(MUX_PGP_UH2, 1); mxc_iomux_setup_multiple_pins(pcm037_pins, ARRAY_SIZE(pcm037_pins), diff --git a/trunk/arch/arm/mach-imx/mach-pcm038.c b/trunk/arch/arm/mach-imx/mach-pcm038.c index 2d6a64bbac44..853bb871c7ed 100644 --- a/trunk/arch/arm/mach-imx/mach-pcm038.c +++ b/trunk/arch/arm/mach-imx/mach-pcm038.c @@ -295,8 +295,6 @@ static const struct mxc_usbh_platform_data usbh2_pdata __initconst = { static void __init pcm038_init(void) { - imx27_soc_init(); - mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins), "PCM038"); diff --git a/trunk/arch/arm/mach-imx/mach-pcm043.c b/trunk/arch/arm/mach-imx/mach-pcm043.c index 163cc318cafb..026441628dfa 100644 --- a/trunk/arch/arm/mach-imx/mach-pcm043.c +++ b/trunk/arch/arm/mach-imx/mach-pcm043.c @@ -356,8 +356,6 @@ static struct esdhc_platform_data sd1_pdata = { */ static void __init pcm043_init(void) { - imx35_soc_init(); - mxc_iomux_v3_setup_multiple_pads(pcm043_pads, ARRAY_SIZE(pcm043_pads)); mxc_audmux_v2_configure_port(3, diff --git a/trunk/arch/arm/mach-imx/mach-qong.c b/trunk/arch/arm/mach-imx/mach-qong.c index 3626f486498a..c16328715939 100644 --- a/trunk/arch/arm/mach-imx/mach-qong.c +++ b/trunk/arch/arm/mach-imx/mach-qong.c @@ -244,8 +244,6 @@ static void __init qong_init_fpga(void) */ static void __init qong_init(void) { - imx31_soc_init(); - mxc_init_imx_uart(); qong_init_nor_mtd(); qong_init_fpga(); diff --git a/trunk/arch/arm/mach-imx/mach-scb9328.c b/trunk/arch/arm/mach-imx/mach-scb9328.c index 82805260e19c..dcaee043628e 100644 --- a/trunk/arch/arm/mach-imx/mach-scb9328.c +++ b/trunk/arch/arm/mach-imx/mach-scb9328.c @@ -129,8 +129,6 @@ static struct platform_device *devices[] __initdata = { */ static void __init scb9328_init(void) { - imx1_soc_init(); - imx1_add_imx_uart0(&uart_pdata); printk(KERN_INFO"Scb9328: Adding devices\n"); diff --git a/trunk/arch/arm/mach-imx/mach-vpr200.c b/trunk/arch/arm/mach-imx/mach-vpr200.c index 7d8e012a6335..d74e3473d236 100644 --- a/trunk/arch/arm/mach-imx/mach-vpr200.c +++ b/trunk/arch/arm/mach-imx/mach-vpr200.c @@ -267,8 +267,6 @@ static struct platform_device *devices[] __initdata = { */ static void __init vpr200_board_init(void) { - imx35_soc_init(); - mxc_iomux_v3_setup_multiple_pads(vpr200_pads, ARRAY_SIZE(vpr200_pads)); imx35_add_fec(NULL); diff --git a/trunk/arch/arm/mach-imx/mm-imx1.c b/trunk/arch/arm/mach-imx/mm-imx1.c index b486595701b7..2e482ba5a0e7 100644 --- a/trunk/arch/arm/mach-imx/mm-imx1.c +++ b/trunk/arch/arm/mach-imx/mm-imx1.c @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -43,15 +44,15 @@ void __init imx1_init_early(void) MX1_NUM_GPIO_PORT); } +static struct mxc_gpio_port imx1_gpio_ports[] = { + DEFINE_IMX_GPIO_PORT_IRQ(MX1, 0, 1, MX1_GPIO_INT_PORTA), + DEFINE_IMX_GPIO_PORT_IRQ(MX1, 1, 2, MX1_GPIO_INT_PORTB), + DEFINE_IMX_GPIO_PORT_IRQ(MX1, 2, 3, MX1_GPIO_INT_PORTC), + DEFINE_IMX_GPIO_PORT_IRQ(MX1, 3, 4, MX1_GPIO_INT_PORTD), +}; + void __init mx1_init_irq(void) { mxc_init_irq(MX1_IO_ADDRESS(MX1_AVIC_BASE_ADDR)); -} - -void __init imx1_soc_init(void) -{ - mxc_register_gpio(0, MX1_GPIO1_BASE_ADDR, SZ_4K, MX1_GPIO_INT_PORTA, 0); - mxc_register_gpio(1, MX1_GPIO2_BASE_ADDR, SZ_4K, MX1_GPIO_INT_PORTB, 0); - mxc_register_gpio(2, MX1_GPIO3_BASE_ADDR, SZ_4K, MX1_GPIO_INT_PORTC, 0); - mxc_register_gpio(3, MX1_GPIO4_BASE_ADDR, SZ_4K, MX1_GPIO_INT_PORTD, 0); + mxc_gpio_init(imx1_gpio_ports, ARRAY_SIZE(imx1_gpio_ports)); } diff --git a/trunk/arch/arm/mach-imx/mm-imx21.c b/trunk/arch/arm/mach-imx/mm-imx21.c index f0fb8bcce6f9..7a0c500ac2c8 100644 --- a/trunk/arch/arm/mach-imx/mm-imx21.c +++ b/trunk/arch/arm/mach-imx/mm-imx21.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -69,17 +70,17 @@ void __init imx21_init_early(void) MX21_NUM_GPIO_PORT); } +static struct mxc_gpio_port imx21_gpio_ports[] = { + DEFINE_IMX_GPIO_PORT_IRQ(MX21, 0, 1, MX21_INT_GPIO), + DEFINE_IMX_GPIO_PORT(MX21, 1, 2), + DEFINE_IMX_GPIO_PORT(MX21, 2, 3), + DEFINE_IMX_GPIO_PORT(MX21, 3, 4), + DEFINE_IMX_GPIO_PORT(MX21, 4, 5), + DEFINE_IMX_GPIO_PORT(MX21, 5, 6), +}; + void __init mx21_init_irq(void) { mxc_init_irq(MX21_IO_ADDRESS(MX21_AVIC_BASE_ADDR)); -} - -void __init imx21_soc_init(void) -{ - mxc_register_gpio(0, MX21_GPIO1_BASE_ADDR, SZ_4K, MX21_INT_GPIO, 0); - mxc_register_gpio(1, MX21_GPIO2_BASE_ADDR, SZ_4K, MX21_INT_GPIO, 0); - mxc_register_gpio(2, MX21_GPIO3_BASE_ADDR, SZ_4K, MX21_INT_GPIO, 0); - mxc_register_gpio(3, MX21_GPIO4_BASE_ADDR, SZ_4K, MX21_INT_GPIO, 0); - mxc_register_gpio(4, MX21_GPIO5_BASE_ADDR, SZ_4K, MX21_INT_GPIO, 0); - mxc_register_gpio(5, MX21_GPIO6_BASE_ADDR, SZ_4K, MX21_INT_GPIO, 0); + mxc_gpio_init(imx21_gpio_ports, ARRAY_SIZE(imx21_gpio_ports)); } diff --git a/trunk/arch/arm/mach-imx/mm-imx25.c b/trunk/arch/arm/mach-imx/mm-imx25.c index 1b6d583f750a..02f7b5c7fa8e 100644 --- a/trunk/arch/arm/mach-imx/mm-imx25.c +++ b/trunk/arch/arm/mach-imx/mm-imx25.c @@ -27,6 +27,7 @@ #include #include #include +#include #include /* @@ -56,15 +57,16 @@ void __init imx25_init_early(void) mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR)); } +static struct mxc_gpio_port imx25_gpio_ports[] = { + DEFINE_IMX_GPIO_PORT_IRQ(MX25, 0, 1, MX25_INT_GPIO1), + DEFINE_IMX_GPIO_PORT_IRQ(MX25, 1, 2, MX25_INT_GPIO2), + DEFINE_IMX_GPIO_PORT_IRQ(MX25, 2, 3, MX25_INT_GPIO3), + DEFINE_IMX_GPIO_PORT_IRQ(MX25, 3, 4, MX25_INT_GPIO4), +}; + void __init mx25_init_irq(void) { mxc_init_irq(MX25_IO_ADDRESS(MX25_AVIC_BASE_ADDR)); + mxc_gpio_init(imx25_gpio_ports, ARRAY_SIZE(imx25_gpio_ports)); } -void __init imx25_soc_init(void) -{ - mxc_register_gpio(0, MX25_GPIO1_BASE_ADDR, SZ_16K, MX25_INT_GPIO1, 0); - mxc_register_gpio(1, MX25_GPIO2_BASE_ADDR, SZ_16K, MX25_INT_GPIO2, 0); - mxc_register_gpio(2, MX25_GPIO3_BASE_ADDR, SZ_16K, MX25_INT_GPIO3, 0); - mxc_register_gpio(3, MX25_GPIO4_BASE_ADDR, SZ_16K, MX25_INT_GPIO4, 0); -} diff --git a/trunk/arch/arm/mach-imx/mm-imx27.c b/trunk/arch/arm/mach-imx/mm-imx27.c index d3700cec8ec5..a6761a39f08c 100644 --- a/trunk/arch/arm/mach-imx/mm-imx27.c +++ b/trunk/arch/arm/mach-imx/mm-imx27.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -69,17 +70,17 @@ void __init imx27_init_early(void) MX27_NUM_GPIO_PORT); } +static struct mxc_gpio_port imx27_gpio_ports[] = { + DEFINE_IMX_GPIO_PORT_IRQ(MX27, 0, 1, MX27_INT_GPIO), + DEFINE_IMX_GPIO_PORT(MX27, 1, 2), + DEFINE_IMX_GPIO_PORT(MX27, 2, 3), + DEFINE_IMX_GPIO_PORT(MX27, 3, 4), + DEFINE_IMX_GPIO_PORT(MX27, 4, 5), + DEFINE_IMX_GPIO_PORT(MX27, 5, 6), +}; + void __init mx27_init_irq(void) { mxc_init_irq(MX27_IO_ADDRESS(MX27_AVIC_BASE_ADDR)); -} - -void __init imx27_soc_init(void) -{ - mxc_register_gpio(0, MX27_GPIO1_BASE_ADDR, SZ_4K, MX27_INT_GPIO, 0); - mxc_register_gpio(1, MX27_GPIO2_BASE_ADDR, SZ_4K, MX27_INT_GPIO, 0); - mxc_register_gpio(2, MX27_GPIO3_BASE_ADDR, SZ_4K, MX27_INT_GPIO, 0); - mxc_register_gpio(3, MX27_GPIO4_BASE_ADDR, SZ_4K, MX27_INT_GPIO, 0); - mxc_register_gpio(4, MX27_GPIO5_BASE_ADDR, SZ_4K, MX27_INT_GPIO, 0); - mxc_register_gpio(5, MX27_GPIO6_BASE_ADDR, SZ_4K, MX27_INT_GPIO, 0); + mxc_gpio_init(imx27_gpio_ports, ARRAY_SIZE(imx27_gpio_ports)); } diff --git a/trunk/arch/arm/mach-imx/mm-imx31.c b/trunk/arch/arm/mach-imx/mm-imx31.c index cb16ac661776..86b9b45864d2 100644 --- a/trunk/arch/arm/mach-imx/mm-imx31.c +++ b/trunk/arch/arm/mach-imx/mm-imx31.c @@ -26,6 +26,7 @@ #include #include #include +#include #include static struct map_desc mx31_io_desc[] __initdata = { @@ -52,14 +53,14 @@ void __init imx31_init_early(void) mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); } +static struct mxc_gpio_port imx31_gpio_ports[] = { + DEFINE_IMX_GPIO_PORT_IRQ(MX31, 0, 1, MX31_INT_GPIO1), + DEFINE_IMX_GPIO_PORT_IRQ(MX31, 1, 2, MX31_INT_GPIO2), + DEFINE_IMX_GPIO_PORT_IRQ(MX31, 2, 3, MX31_INT_GPIO3), +}; + void __init mx31_init_irq(void) { mxc_init_irq(MX31_IO_ADDRESS(MX31_AVIC_BASE_ADDR)); -} - -void __init imx31_soc_init(void) -{ - mxc_register_gpio(0, MX31_GPIO1_BASE_ADDR, SZ_16K, MX31_INT_GPIO1, 0); - mxc_register_gpio(1, MX31_GPIO2_BASE_ADDR, SZ_16K, MX31_INT_GPIO2, 0); - mxc_register_gpio(2, MX31_GPIO3_BASE_ADDR, SZ_16K, MX31_INT_GPIO3, 0); + mxc_gpio_init(imx31_gpio_ports, ARRAY_SIZE(imx31_gpio_ports)); } diff --git a/trunk/arch/arm/mach-imx/mm-imx35.c b/trunk/arch/arm/mach-imx/mm-imx35.c index 648bfca0163e..c880e6d1ae55 100644 --- a/trunk/arch/arm/mach-imx/mm-imx35.c +++ b/trunk/arch/arm/mach-imx/mm-imx35.c @@ -27,6 +27,7 @@ #include #include #include +#include #include static struct map_desc mx35_io_desc[] __initdata = { @@ -49,14 +50,14 @@ void __init imx35_init_early(void) mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR)); } +static struct mxc_gpio_port imx35_gpio_ports[] = { + DEFINE_IMX_GPIO_PORT_IRQ(MX35, 0, 1, MX35_INT_GPIO1), + DEFINE_IMX_GPIO_PORT_IRQ(MX35, 1, 2, MX35_INT_GPIO2), + DEFINE_IMX_GPIO_PORT_IRQ(MX35, 2, 3, MX35_INT_GPIO3), +}; + void __init mx35_init_irq(void) { mxc_init_irq(MX35_IO_ADDRESS(MX35_AVIC_BASE_ADDR)); -} - -void __init imx35_soc_init(void) -{ - mxc_register_gpio(0, MX35_GPIO1_BASE_ADDR, SZ_16K, MX35_INT_GPIO1, 0); - mxc_register_gpio(1, MX35_GPIO2_BASE_ADDR, SZ_16K, MX35_INT_GPIO2, 0); - mxc_register_gpio(2, MX35_GPIO3_BASE_ADDR, SZ_16K, MX35_INT_GPIO3, 0); + mxc_gpio_init(imx35_gpio_ports, ARRAY_SIZE(imx35_gpio_ports)); } diff --git a/trunk/arch/arm/mach-mx5/board-cpuimx51.c b/trunk/arch/arm/mach-mx5/board-cpuimx51.c index add0d42de7af..4efa02ee1639 100644 --- a/trunk/arch/arm/mach-mx5/board-cpuimx51.c +++ b/trunk/arch/arm/mach-mx5/board-cpuimx51.c @@ -245,8 +245,6 @@ __setup("otg_mode=", eukrea_cpuimx51_otg_mode); */ static void __init eukrea_cpuimx51_init(void) { - imx51_soc_init(); - mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51_pads, ARRAY_SIZE(eukrea_cpuimx51_pads)); diff --git a/trunk/arch/arm/mach-mx5/board-cpuimx51sd.c b/trunk/arch/arm/mach-mx5/board-cpuimx51sd.c index ff096d587299..5ef25a596143 100644 --- a/trunk/arch/arm/mach-mx5/board-cpuimx51sd.c +++ b/trunk/arch/arm/mach-mx5/board-cpuimx51sd.c @@ -264,8 +264,6 @@ static struct platform_device *platform_devices[] __initdata = { static void __init eukrea_cpuimx51sd_init(void) { - imx51_soc_init(); - mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51sd_pads, ARRAY_SIZE(eukrea_cpuimx51sd_pads)); diff --git a/trunk/arch/arm/mach-mx5/board-mx50_rdp.c b/trunk/arch/arm/mach-mx5/board-mx50_rdp.c index 7de25c6712eb..11210e1ae42a 100644 --- a/trunk/arch/arm/mach-mx5/board-mx50_rdp.c +++ b/trunk/arch/arm/mach-mx5/board-mx50_rdp.c @@ -192,8 +192,6 @@ static const struct imxi2c_platform_data i2c_data __initconst = { */ static void __init mx50_rdp_board_init(void) { - imx50_soc_init(); - mxc_iomux_v3_setup_multiple_pads(mx50_rdp_pads, ARRAY_SIZE(mx50_rdp_pads)); diff --git a/trunk/arch/arm/mach-mx5/board-mx51_3ds.c b/trunk/arch/arm/mach-mx5/board-mx51_3ds.c index 3112d15feebc..63dfbeafbc1e 100644 --- a/trunk/arch/arm/mach-mx5/board-mx51_3ds.c +++ b/trunk/arch/arm/mach-mx5/board-mx51_3ds.c @@ -135,8 +135,6 @@ static struct spi_board_info mx51_3ds_spi_nor_device[] = { */ static void __init mx51_3ds_init(void) { - imx51_soc_init(); - mxc_iomux_v3_setup_multiple_pads(mx51_3ds_pads, ARRAY_SIZE(mx51_3ds_pads)); diff --git a/trunk/arch/arm/mach-mx5/board-mx51_babbage.c b/trunk/arch/arm/mach-mx5/board-mx51_babbage.c index 6021dd00ec75..c7b3fabf50f9 100644 --- a/trunk/arch/arm/mach-mx5/board-mx51_babbage.c +++ b/trunk/arch/arm/mach-mx5/board-mx51_babbage.c @@ -340,8 +340,6 @@ static void __init mx51_babbage_init(void) iomux_v3_cfg_t power_key = _MX51_PAD_EIM_A27__GPIO2_21 | MUX_PAD_CTRL(PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | PAD_CTL_PUS_100K_UP); - imx51_soc_init(); - #if defined(CONFIG_CPU_FREQ_IMX) get_cpu_op = mx51_get_cpu_op; #endif diff --git a/trunk/arch/arm/mach-mx5/board-mx51_efikamx.c b/trunk/arch/arm/mach-mx5/board-mx51_efikamx.c index 3be603b9075a..6e362315291b 100644 --- a/trunk/arch/arm/mach-mx5/board-mx51_efikamx.c +++ b/trunk/arch/arm/mach-mx5/board-mx51_efikamx.c @@ -236,8 +236,6 @@ late_initcall(mx51_efikamx_power_init); static void __init mx51_efikamx_init(void) { - imx51_soc_init(); - mxc_iomux_v3_setup_multiple_pads(mx51efikamx_pads, ARRAY_SIZE(mx51efikamx_pads)); efika_board_common_init(); diff --git a/trunk/arch/arm/mach-mx5/board-mx51_efikasb.c b/trunk/arch/arm/mach-mx5/board-mx51_efikasb.c index 4b2e522de0f8..474fc6e4c6df 100644 --- a/trunk/arch/arm/mach-mx5/board-mx51_efikasb.c +++ b/trunk/arch/arm/mach-mx5/board-mx51_efikasb.c @@ -248,8 +248,6 @@ static void __init mx51_efikasb_board_id(void) static void __init efikasb_board_init(void) { - imx51_soc_init(); - mxc_iomux_v3_setup_multiple_pads(mx51efikasb_pads, ARRAY_SIZE(mx51efikasb_pads)); efika_board_common_init(); diff --git a/trunk/arch/arm/mach-mx5/board-mx53_evk.c b/trunk/arch/arm/mach-mx5/board-mx53_evk.c index 0d9218a6e2d2..f87d571882c6 100644 --- a/trunk/arch/arm/mach-mx5/board-mx53_evk.c +++ b/trunk/arch/arm/mach-mx5/board-mx53_evk.c @@ -117,8 +117,6 @@ static const struct spi_imx_master mx53_evk_spi_data __initconst = { static void __init mx53_evk_board_init(void) { - imx53_soc_init(); - mxc_iomux_v3_setup_multiple_pads(mx53_evk_pads, ARRAY_SIZE(mx53_evk_pads)); mx53_evk_init_uart(); diff --git a/trunk/arch/arm/mach-mx5/board-mx53_loco.c b/trunk/arch/arm/mach-mx5/board-mx53_loco.c index 359c3e248add..1b947e8c9c0c 100644 --- a/trunk/arch/arm/mach-mx5/board-mx53_loco.c +++ b/trunk/arch/arm/mach-mx5/board-mx53_loco.c @@ -227,8 +227,6 @@ static const struct imxi2c_platform_data mx53_loco_i2c_data __initconst = { static void __init mx53_loco_board_init(void) { - imx53_soc_init(); - mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads, ARRAY_SIZE(mx53_loco_pads)); imx53_add_imx_uart(0, NULL); diff --git a/trunk/arch/arm/mach-mx5/board-mx53_smd.c b/trunk/arch/arm/mach-mx5/board-mx53_smd.c index bc02894eafef..817c08938f55 100644 --- a/trunk/arch/arm/mach-mx5/board-mx53_smd.c +++ b/trunk/arch/arm/mach-mx5/board-mx53_smd.c @@ -113,8 +113,6 @@ static const struct imxi2c_platform_data mx53_smd_i2c_data __initconst = { static void __init mx53_smd_board_init(void) { - imx53_soc_init(); - mxc_iomux_v3_setup_multiple_pads(mx53_smd_pads, ARRAY_SIZE(mx53_smd_pads)); mx53_smd_init_uart(); diff --git a/trunk/arch/arm/mach-mx5/devices.c b/trunk/arch/arm/mach-mx5/devices.c index 371ca8c8414c..153ada53e575 100644 --- a/trunk/arch/arm/mach-mx5/devices.c +++ b/trunk/arch/arm/mach-mx5/devices.c @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -118,3 +119,66 @@ struct platform_device mxc_usbh2_device = { .coherent_dma_mask = DMA_BIT_MASK(32), }, }; + +static struct mxc_gpio_port mxc_gpio_ports[] = { + { + .chip.label = "gpio-0", + .base = MX51_IO_ADDRESS(MX51_GPIO1_BASE_ADDR), + .irq = MX51_MXC_INT_GPIO1_LOW, + .irq_high = MX51_MXC_INT_GPIO1_HIGH, + .virtual_irq_start = MXC_GPIO_IRQ_START + }, + { + .chip.label = "gpio-1", + .base = MX51_IO_ADDRESS(MX51_GPIO2_BASE_ADDR), + .irq = MX51_MXC_INT_GPIO2_LOW, + .irq_high = MX51_MXC_INT_GPIO2_HIGH, + .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 1 + }, + { + .chip.label = "gpio-2", + .base = MX51_IO_ADDRESS(MX51_GPIO3_BASE_ADDR), + .irq = MX51_MXC_INT_GPIO3_LOW, + .irq_high = MX51_MXC_INT_GPIO3_HIGH, + .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 2 + }, + { + .chip.label = "gpio-3", + .base = MX51_IO_ADDRESS(MX51_GPIO4_BASE_ADDR), + .irq = MX51_MXC_INT_GPIO4_LOW, + .irq_high = MX51_MXC_INT_GPIO4_HIGH, + .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 3 + }, + { + .chip.label = "gpio-4", + .base = MX53_IO_ADDRESS(MX53_GPIO5_BASE_ADDR), + .irq = MX53_INT_GPIO5_LOW, + .irq_high = MX53_INT_GPIO5_HIGH, + .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 4 + }, + { + .chip.label = "gpio-5", + .base = MX53_IO_ADDRESS(MX53_GPIO6_BASE_ADDR), + .irq = MX53_INT_GPIO6_LOW, + .irq_high = MX53_INT_GPIO6_HIGH, + .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 5 + }, + { + .chip.label = "gpio-6", + .base = MX53_IO_ADDRESS(MX53_GPIO7_BASE_ADDR), + .irq = MX53_INT_GPIO7_LOW, + .irq_high = MX53_INT_GPIO7_HIGH, + .virtual_irq_start = MXC_GPIO_IRQ_START + 32 * 6 + }, +}; + +int __init imx51_register_gpios(void) +{ + return mxc_gpio_init(mxc_gpio_ports, 4); +} + +int __init imx53_register_gpios(void) +{ + return mxc_gpio_init(mxc_gpio_ports, ARRAY_SIZE(mxc_gpio_ports)); +} + diff --git a/trunk/arch/arm/mach-mx5/mm-mx50.c b/trunk/arch/arm/mach-mx5/mm-mx50.c index 28c3f60f734f..b9c363b514a9 100644 --- a/trunk/arch/arm/mach-mx5/mm-mx50.c +++ b/trunk/arch/arm/mach-mx5/mm-mx50.c @@ -26,6 +26,7 @@ #include #include #include +#include #include /* @@ -55,17 +56,17 @@ void __init imx50_init_early(void) mxc_arch_reset_init(MX50_IO_ADDRESS(MX50_WDOG_BASE_ADDR)); } +static struct mxc_gpio_port imx50_gpio_ports[] = { + DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 0, 1, MX50_INT_GPIO1_LOW, MX50_INT_GPIO1_HIGH), + DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 1, 2, MX50_INT_GPIO2_LOW, MX50_INT_GPIO2_HIGH), + DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 2, 3, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH), + DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 3, 4, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH), + DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 4, 5, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH), + DEFINE_IMX_GPIO_PORT_IRQ_HIGH(MX50, 5, 6, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH), +}; + void __init mx50_init_irq(void) { tzic_init_irq(MX50_IO_ADDRESS(MX50_TZIC_BASE_ADDR)); -} - -void __init imx50_soc_init(void) -{ - mxc_register_gpio(0, MX50_GPIO1_BASE_ADDR, SZ_16K, MX50_INT_GPIO1_LOW, MX50_INT_GPIO1_HIGH); - mxc_register_gpio(1, MX50_GPIO2_BASE_ADDR, SZ_16K, MX50_INT_GPIO2_LOW, MX50_INT_GPIO2_HIGH); - mxc_register_gpio(2, MX50_GPIO3_BASE_ADDR, SZ_16K, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH); - mxc_register_gpio(3, MX50_GPIO4_BASE_ADDR, SZ_16K, MX50_INT_GPIO4_LOW, MX50_INT_GPIO4_HIGH); - mxc_register_gpio(4, MX50_GPIO5_BASE_ADDR, SZ_16K, MX50_INT_GPIO5_LOW, MX50_INT_GPIO5_HIGH); - mxc_register_gpio(5, MX50_GPIO6_BASE_ADDR, SZ_16K, MX50_INT_GPIO6_LOW, MX50_INT_GPIO6_HIGH); + mxc_gpio_init(imx50_gpio_ports, ARRAY_SIZE(imx50_gpio_ports)); } diff --git a/trunk/arch/arm/mach-mx5/mm.c b/trunk/arch/arm/mach-mx5/mm.c index 800bb8b21081..ff557301b42b 100644 --- a/trunk/arch/arm/mach-mx5/mm.c +++ b/trunk/arch/arm/mach-mx5/mm.c @@ -69,6 +69,8 @@ void __init imx53_init_early(void) mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR)); } +int imx51_register_gpios(void); + void __init mx51_init_irq(void) { unsigned long tzic_addr; @@ -84,8 +86,11 @@ void __init mx51_init_irq(void) panic("unable to map TZIC interrupt controller\n"); tzic_init_irq(tzic_virt); + imx51_register_gpios(); } +int imx53_register_gpios(void); + void __init mx53_init_irq(void) { unsigned long tzic_addr; @@ -98,23 +103,5 @@ void __init mx53_init_irq(void) panic("unable to map TZIC interrupt controller\n"); tzic_init_irq(tzic_virt); -} - -void __init imx51_soc_init(void) -{ - mxc_register_gpio(0, MX51_GPIO1_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO1_LOW, MX51_MXC_INT_GPIO1_HIGH); - mxc_register_gpio(1, MX51_GPIO2_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO2_LOW, MX51_MXC_INT_GPIO2_HIGH); - mxc_register_gpio(2, MX51_GPIO3_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO3_LOW, MX51_MXC_INT_GPIO3_HIGH); - mxc_register_gpio(3, MX51_GPIO4_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO4_LOW, MX51_MXC_INT_GPIO4_HIGH); -} - -void __init imx53_soc_init(void) -{ - mxc_register_gpio(0, MX53_GPIO1_BASE_ADDR, SZ_16K, MX53_INT_GPIO1_LOW, MX53_INT_GPIO1_HIGH); - mxc_register_gpio(1, MX53_GPIO2_BASE_ADDR, SZ_16K, MX53_INT_GPIO2_LOW, MX53_INT_GPIO2_HIGH); - mxc_register_gpio(2, MX53_GPIO3_BASE_ADDR, SZ_16K, MX53_INT_GPIO3_LOW, MX53_INT_GPIO3_HIGH); - mxc_register_gpio(3, MX53_GPIO4_BASE_ADDR, SZ_16K, MX53_INT_GPIO4_LOW, MX53_INT_GPIO4_HIGH); - mxc_register_gpio(4, MX53_GPIO5_BASE_ADDR, SZ_16K, MX53_INT_GPIO5_LOW, MX53_INT_GPIO5_HIGH); - mxc_register_gpio(5, MX53_GPIO6_BASE_ADDR, SZ_16K, MX53_INT_GPIO6_LOW, MX53_INT_GPIO6_HIGH); - mxc_register_gpio(6, MX53_GPIO7_BASE_ADDR, SZ_16K, MX53_INT_GPIO7_LOW, MX53_INT_GPIO7_HIGH); + imx53_register_gpios(); } diff --git a/trunk/arch/arm/mach-mxs/Makefile b/trunk/arch/arm/mach-mxs/Makefile index 6c38262a3aaa..58e892376bf2 100644 --- a/trunk/arch/arm/mach-mxs/Makefile +++ b/trunk/arch/arm/mach-mxs/Makefile @@ -1,5 +1,5 @@ # Common support -obj-y := clock.o devices.o icoll.o iomux.o system.o timer.o +obj-y := clock.o devices.o gpio.o icoll.o iomux.o system.o timer.o obj-$(CONFIG_MXS_OCOTP) += ocotp.o obj-$(CONFIG_PM) += pm.o diff --git a/trunk/arch/arm/mach-mxs/devices.c b/trunk/arch/arm/mach-mxs/devices.c index fe3e847930c9..cfdb6b284702 100644 --- a/trunk/arch/arm/mach-mxs/devices.c +++ b/trunk/arch/arm/mach-mxs/devices.c @@ -88,14 +88,3 @@ int __init mxs_add_amba_device(const struct amba_device *dev) return amba_device_register(adev, &iomem_resource); } - -struct device mxs_apbh_bus = { - .init_name = "mxs_apbh", - .parent = &platform_bus, -}; - -static int __init mxs_device_init(void) -{ - return device_register(&mxs_apbh_bus); -} -core_initcall(mxs_device_init); diff --git a/trunk/arch/arm/mach-mxs/devices/Makefile b/trunk/arch/arm/mach-mxs/devices/Makefile index 351915c683ff..324f2824d38d 100644 --- a/trunk/arch/arm/mach-mxs/devices/Makefile +++ b/trunk/arch/arm/mach-mxs/devices/Makefile @@ -6,5 +6,4 @@ obj-$(CONFIG_MXS_HAVE_PLATFORM_FLEXCAN) += platform-flexcan.o obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_I2C) += platform-mxs-i2c.o obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_MMC) += platform-mxs-mmc.o obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_PWM) += platform-mxs-pwm.o -obj-y += platform-gpio-mxs.o obj-$(CONFIG_MXS_HAVE_PLATFORM_MXSFB) += platform-mxsfb.o diff --git a/trunk/arch/arm/mach-mxs/devices/platform-gpio-mxs.c b/trunk/arch/arm/mach-mxs/devices/platform-gpio-mxs.c deleted file mode 100644 index ed0885e414e0..000000000000 --- a/trunk/arch/arm/mach-mxs/devices/platform-gpio-mxs.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License version 2 as published by the - * Free Software Foundation. - */ -#include -#include -#include - -#include -#include -#include - -struct platform_device *__init mxs_add_gpio( - int id, resource_size_t iobase, int irq) -{ - struct resource res[] = { - { - .start = iobase, - .end = iobase + SZ_8K - 1, - .flags = IORESOURCE_MEM, - }, { - .start = irq, - .end = irq, - .flags = IORESOURCE_IRQ, - }, - }; - - return platform_device_register_resndata(&mxs_apbh_bus, - "gpio-mxs", id, res, ARRAY_SIZE(res), NULL, 0); -} - -static int __init mxs_add_mxs_gpio(void) -{ - if (cpu_is_mx23()) { - mxs_add_gpio(0, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO0); - mxs_add_gpio(1, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO1); - mxs_add_gpio(2, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO2); - } - - if (cpu_is_mx28()) { - mxs_add_gpio(0, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO0); - mxs_add_gpio(1, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO1); - mxs_add_gpio(2, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO2); - mxs_add_gpio(3, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO3); - mxs_add_gpio(4, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO4); - } - - return 0; -} -postcore_initcall(mxs_add_mxs_gpio); diff --git a/trunk/arch/arm/mach-mxs/gpio.c b/trunk/arch/arm/mach-mxs/gpio.c new file mode 100644 index 000000000000..2c950fef71a8 --- /dev/null +++ b/trunk/arch/arm/mach-mxs/gpio.c @@ -0,0 +1,331 @@ +/* + * MXC GPIO support. (c) 2008 Daniel Mack + * Copyright 2008 Juergen Beisert, kernel@pengutronix.de + * + * Based on code from Freescale, + * Copyright (C) 2004-2010 Freescale Semiconductor, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gpio.h" + +static struct mxs_gpio_port *mxs_gpio_ports; +static int gpio_table_size; + +#define PINCTRL_DOUT(n) ((cpu_is_mx23() ? 0x0500 : 0x0700) + (n) * 0x10) +#define PINCTRL_DIN(n) ((cpu_is_mx23() ? 0x0600 : 0x0900) + (n) * 0x10) +#define PINCTRL_DOE(n) ((cpu_is_mx23() ? 0x0700 : 0x0b00) + (n) * 0x10) +#define PINCTRL_PIN2IRQ(n) ((cpu_is_mx23() ? 0x0800 : 0x1000) + (n) * 0x10) +#define PINCTRL_IRQEN(n) ((cpu_is_mx23() ? 0x0900 : 0x1100) + (n) * 0x10) +#define PINCTRL_IRQLEV(n) ((cpu_is_mx23() ? 0x0a00 : 0x1200) + (n) * 0x10) +#define PINCTRL_IRQPOL(n) ((cpu_is_mx23() ? 0x0b00 : 0x1300) + (n) * 0x10) +#define PINCTRL_IRQSTAT(n) ((cpu_is_mx23() ? 0x0c00 : 0x1400) + (n) * 0x10) + +#define GPIO_INT_FALL_EDGE 0x0 +#define GPIO_INT_LOW_LEV 0x1 +#define GPIO_INT_RISE_EDGE 0x2 +#define GPIO_INT_HIGH_LEV 0x3 +#define GPIO_INT_LEV_MASK (1 << 0) +#define GPIO_INT_POL_MASK (1 << 1) + +/* Note: This driver assumes 32 GPIOs are handled in one register */ + +static void clear_gpio_irqstatus(struct mxs_gpio_port *port, u32 index) +{ + __mxs_clrl(1 << index, port->base + PINCTRL_IRQSTAT(port->id)); +} + +static void set_gpio_irqenable(struct mxs_gpio_port *port, u32 index, + int enable) +{ + if (enable) { + __mxs_setl(1 << index, port->base + PINCTRL_IRQEN(port->id)); + __mxs_setl(1 << index, port->base + PINCTRL_PIN2IRQ(port->id)); + } else { + __mxs_clrl(1 << index, port->base + PINCTRL_IRQEN(port->id)); + } +} + +static void mxs_gpio_ack_irq(struct irq_data *d) +{ + u32 gpio = irq_to_gpio(d->irq); + clear_gpio_irqstatus(&mxs_gpio_ports[gpio / 32], gpio & 0x1f); +} + +static void mxs_gpio_mask_irq(struct irq_data *d) +{ + u32 gpio = irq_to_gpio(d->irq); + set_gpio_irqenable(&mxs_gpio_ports[gpio / 32], gpio & 0x1f, 0); +} + +static void mxs_gpio_unmask_irq(struct irq_data *d) +{ + u32 gpio = irq_to_gpio(d->irq); + set_gpio_irqenable(&mxs_gpio_ports[gpio / 32], gpio & 0x1f, 1); +} + +static int mxs_gpio_get(struct gpio_chip *chip, unsigned offset); + +static int mxs_gpio_set_irq_type(struct irq_data *d, unsigned int type) +{ + u32 gpio = irq_to_gpio(d->irq); + u32 pin_mask = 1 << (gpio & 31); + struct mxs_gpio_port *port = &mxs_gpio_ports[gpio / 32]; + void __iomem *pin_addr; + int edge; + + switch (type) { + case IRQ_TYPE_EDGE_RISING: + edge = GPIO_INT_RISE_EDGE; + break; + case IRQ_TYPE_EDGE_FALLING: + edge = GPIO_INT_FALL_EDGE; + break; + case IRQ_TYPE_LEVEL_LOW: + edge = GPIO_INT_LOW_LEV; + break; + case IRQ_TYPE_LEVEL_HIGH: + edge = GPIO_INT_HIGH_LEV; + break; + default: + return -EINVAL; + } + + /* set level or edge */ + pin_addr = port->base + PINCTRL_IRQLEV(port->id); + if (edge & GPIO_INT_LEV_MASK) + __mxs_setl(pin_mask, pin_addr); + else + __mxs_clrl(pin_mask, pin_addr); + + /* set polarity */ + pin_addr = port->base + PINCTRL_IRQPOL(port->id); + if (edge & GPIO_INT_POL_MASK) + __mxs_setl(pin_mask, pin_addr); + else + __mxs_clrl(pin_mask, pin_addr); + + clear_gpio_irqstatus(port, gpio & 0x1f); + + return 0; +} + +/* MXS has one interrupt *per* gpio port */ +static void mxs_gpio_irq_handler(u32 irq, struct irq_desc *desc) +{ + u32 irq_stat; + struct mxs_gpio_port *port = (struct mxs_gpio_port *)irq_get_handler_data(irq); + u32 gpio_irq_no_base = port->virtual_irq_start; + + desc->irq_data.chip->irq_ack(&desc->irq_data); + + irq_stat = __raw_readl(port->base + PINCTRL_IRQSTAT(port->id)) & + __raw_readl(port->base + PINCTRL_IRQEN(port->id)); + + while (irq_stat != 0) { + int irqoffset = fls(irq_stat) - 1; + generic_handle_irq(gpio_irq_no_base + irqoffset); + irq_stat &= ~(1 << irqoffset); + } +} + +/* + * Set interrupt number "irq" in the GPIO as a wake-up source. + * While system is running, all registered GPIO interrupts need to have + * wake-up enabled. When system is suspended, only selected GPIO interrupts + * need to have wake-up enabled. + * @param irq interrupt source number + * @param enable enable as wake-up if equal to non-zero + * @return This function returns 0 on success. + */ +static int mxs_gpio_set_wake_irq(struct irq_data *d, unsigned int enable) +{ + u32 gpio = irq_to_gpio(d->irq); + u32 gpio_idx = gpio & 0x1f; + struct mxs_gpio_port *port = &mxs_gpio_ports[gpio / 32]; + + if (enable) { + if (port->irq_high && (gpio_idx >= 16)) + enable_irq_wake(port->irq_high); + else + enable_irq_wake(port->irq); + } else { + if (port->irq_high && (gpio_idx >= 16)) + disable_irq_wake(port->irq_high); + else + disable_irq_wake(port->irq); + } + + return 0; +} + +static struct irq_chip gpio_irq_chip = { + .name = "mxs gpio", + .irq_ack = mxs_gpio_ack_irq, + .irq_mask = mxs_gpio_mask_irq, + .irq_unmask = mxs_gpio_unmask_irq, + .irq_set_type = mxs_gpio_set_irq_type, + .irq_set_wake = mxs_gpio_set_wake_irq, +}; + +static void mxs_set_gpio_direction(struct gpio_chip *chip, unsigned offset, + int dir) +{ + struct mxs_gpio_port *port = + container_of(chip, struct mxs_gpio_port, chip); + void __iomem *pin_addr = port->base + PINCTRL_DOE(port->id); + + if (dir) + __mxs_setl(1 << offset, pin_addr); + else + __mxs_clrl(1 << offset, pin_addr); +} + +static int mxs_gpio_get(struct gpio_chip *chip, unsigned offset) +{ + struct mxs_gpio_port *port = + container_of(chip, struct mxs_gpio_port, chip); + + return (__raw_readl(port->base + PINCTRL_DIN(port->id)) >> offset) & 1; +} + +static void mxs_gpio_set(struct gpio_chip *chip, unsigned offset, int value) +{ + struct mxs_gpio_port *port = + container_of(chip, struct mxs_gpio_port, chip); + void __iomem *pin_addr = port->base + PINCTRL_DOUT(port->id); + + if (value) + __mxs_setl(1 << offset, pin_addr); + else + __mxs_clrl(1 << offset, pin_addr); +} + +static int mxs_gpio_to_irq(struct gpio_chip *chip, unsigned offset) +{ + struct mxs_gpio_port *port = + container_of(chip, struct mxs_gpio_port, chip); + + return port->virtual_irq_start + offset; +} + +static int mxs_gpio_direction_input(struct gpio_chip *chip, unsigned offset) +{ + mxs_set_gpio_direction(chip, offset, 0); + return 0; +} + +static int mxs_gpio_direction_output(struct gpio_chip *chip, + unsigned offset, int value) +{ + mxs_gpio_set(chip, offset, value); + mxs_set_gpio_direction(chip, offset, 1); + return 0; +} + +int __init mxs_gpio_init(struct mxs_gpio_port *port, int cnt) +{ + int i, j; + + /* save for local usage */ + mxs_gpio_ports = port; + gpio_table_size = cnt; + + pr_info("MXS GPIO hardware\n"); + + for (i = 0; i < cnt; i++) { + /* disable the interrupt and clear the status */ + __raw_writel(0, port[i].base + PINCTRL_PIN2IRQ(i)); + __raw_writel(0, port[i].base + PINCTRL_IRQEN(i)); + + /* clear address has to be used to clear IRQSTAT bits */ + __mxs_clrl(~0U, port[i].base + PINCTRL_IRQSTAT(i)); + + for (j = port[i].virtual_irq_start; + j < port[i].virtual_irq_start + 32; j++) { + irq_set_chip_and_handler(j, &gpio_irq_chip, + handle_level_irq); + set_irq_flags(j, IRQF_VALID); + } + + /* setup one handler for each entry */ + irq_set_chained_handler(port[i].irq, mxs_gpio_irq_handler); + irq_set_handler_data(port[i].irq, &port[i]); + + /* register gpio chip */ + port[i].chip.direction_input = mxs_gpio_direction_input; + port[i].chip.direction_output = mxs_gpio_direction_output; + port[i].chip.get = mxs_gpio_get; + port[i].chip.set = mxs_gpio_set; + port[i].chip.to_irq = mxs_gpio_to_irq; + port[i].chip.base = i * 32; + port[i].chip.ngpio = 32; + + /* its a serious configuration bug when it fails */ + BUG_ON(gpiochip_add(&port[i].chip) < 0); + } + + return 0; +} + +#define MX23_GPIO_BASE MX23_IO_ADDRESS(MX23_PINCTRL_BASE_ADDR) +#define MX28_GPIO_BASE MX28_IO_ADDRESS(MX28_PINCTRL_BASE_ADDR) + +#define DEFINE_MXS_GPIO_PORT(_base, _irq, _id) \ + { \ + .chip.label = "gpio-" #_id, \ + .id = _id, \ + .irq = _irq, \ + .base = _base, \ + .virtual_irq_start = MXS_GPIO_IRQ_START + (_id) * 32, \ + } + +#ifdef CONFIG_SOC_IMX23 +static struct mxs_gpio_port mx23_gpio_ports[] = { + DEFINE_MXS_GPIO_PORT(MX23_GPIO_BASE, MX23_INT_GPIO0, 0), + DEFINE_MXS_GPIO_PORT(MX23_GPIO_BASE, MX23_INT_GPIO1, 1), + DEFINE_MXS_GPIO_PORT(MX23_GPIO_BASE, MX23_INT_GPIO2, 2), +}; + +int __init mx23_register_gpios(void) +{ + return mxs_gpio_init(mx23_gpio_ports, ARRAY_SIZE(mx23_gpio_ports)); +} +#endif + +#ifdef CONFIG_SOC_IMX28 +static struct mxs_gpio_port mx28_gpio_ports[] = { + DEFINE_MXS_GPIO_PORT(MX28_GPIO_BASE, MX28_INT_GPIO0, 0), + DEFINE_MXS_GPIO_PORT(MX28_GPIO_BASE, MX28_INT_GPIO1, 1), + DEFINE_MXS_GPIO_PORT(MX28_GPIO_BASE, MX28_INT_GPIO2, 2), + DEFINE_MXS_GPIO_PORT(MX28_GPIO_BASE, MX28_INT_GPIO3, 3), + DEFINE_MXS_GPIO_PORT(MX28_GPIO_BASE, MX28_INT_GPIO4, 4), +}; + +int __init mx28_register_gpios(void) +{ + return mxs_gpio_init(mx28_gpio_ports, ARRAY_SIZE(mx28_gpio_ports)); +} +#endif diff --git a/trunk/arch/arm/mach-mxs/gpio.h b/trunk/arch/arm/mach-mxs/gpio.h new file mode 100644 index 000000000000..005bb06630b1 --- /dev/null +++ b/trunk/arch/arm/mach-mxs/gpio.h @@ -0,0 +1,34 @@ +/* + * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright 2008 Juergen Beisert, kernel@pengutronix.de + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#ifndef __MXS_GPIO_H__ +#define __MXS_GPIO_H__ + +struct mxs_gpio_port { + void __iomem *base; + int id; + int irq; + int irq_high; + int virtual_irq_start; + struct gpio_chip chip; +}; + +int mxs_gpio_init(struct mxs_gpio_port*, int); + +#endif /* __MXS_GPIO_H__ */ diff --git a/trunk/arch/arm/mach-mxs/include/mach/devices-common.h b/trunk/arch/arm/mach-mxs/include/mach/devices-common.h index 812d7a813a78..7a37469ed5bf 100644 --- a/trunk/arch/arm/mach-mxs/include/mach/devices-common.h +++ b/trunk/arch/arm/mach-mxs/include/mach/devices-common.h @@ -11,8 +11,6 @@ #include #include -extern struct device mxs_apbh_bus; - struct platform_device *mxs_add_platform_device_dmamask( const char *name, int id, const struct resource *res, unsigned int num_resources, diff --git a/trunk/arch/arm/mach-mxs/mach-mx28evk.c b/trunk/arch/arm/mach-mxs/mach-mx28evk.c index 56767a5cce0e..eacdc6b0e70a 100644 --- a/trunk/arch/arm/mach-mxs/mach-mx28evk.c +++ b/trunk/arch/arm/mach-mxs/mach-mx28evk.c @@ -26,6 +26,7 @@ #include #include "devices-mx28.h" +#include "gpio.h" #define MX28EVK_FLEXCAN_SWITCH MXS_GPIO_NR(2, 13) #define MX28EVK_FEC_PHY_POWER MXS_GPIO_NR(2, 15) diff --git a/trunk/arch/arm/mach-mxs/mm-mx23.c b/trunk/arch/arm/mach-mxs/mm-mx23.c index 1b2345ac1a87..5148cd64a6b7 100644 --- a/trunk/arch/arm/mach-mxs/mm-mx23.c +++ b/trunk/arch/arm/mach-mxs/mm-mx23.c @@ -41,4 +41,5 @@ void __init mx23_map_io(void) void __init mx23_init_irq(void) { icoll_init_irq(); + mx23_register_gpios(); } diff --git a/trunk/arch/arm/mach-mxs/mm-mx28.c b/trunk/arch/arm/mach-mxs/mm-mx28.c index b6e18ddb92c0..7e4cea32ebc6 100644 --- a/trunk/arch/arm/mach-mxs/mm-mx28.c +++ b/trunk/arch/arm/mach-mxs/mm-mx28.c @@ -41,4 +41,5 @@ void __init mx28_map_io(void) void __init mx28_init_irq(void) { icoll_init_irq(); + mx28_register_gpios(); } diff --git a/trunk/arch/arm/mach-tegra/Makefile b/trunk/arch/arm/mach-tegra/Makefile index ed58ef9019b5..823c703e573c 100644 --- a/trunk/arch/arm/mach-tegra/Makefile +++ b/trunk/arch/arm/mach-tegra/Makefile @@ -4,6 +4,7 @@ obj-y += io.o obj-y += irq.o obj-y += clock.o obj-y += timer.o +obj-y += gpio.o obj-y += pinmux.o obj-y += powergate.o obj-y += fuse.o diff --git a/trunk/drivers/gpio/gpio-tegra.c b/trunk/arch/arm/mach-tegra/gpio.c similarity index 97% rename from trunk/drivers/gpio/gpio-tegra.c rename to trunk/arch/arm/mach-tegra/gpio.c index 13afb881ffc3..919d63837736 100644 --- a/trunk/drivers/gpio/gpio-tegra.c +++ b/trunk/arch/arm/mach-tegra/gpio.c @@ -23,7 +23,6 @@ #include #include -#include #include @@ -341,15 +340,6 @@ static int __init tegra_gpio_init(void) } } -#ifdef CONFIG_OF_GPIO - /* - * This isn't ideal, but it gets things hooked up until this - * driver is converted into a platform_device - */ - tegra_gpio_chip.of_node = of_find_compatible_node(NULL, NULL, - "nvidia,tegra250-gpio"); -#endif /* CONFIG_OF_GPIO */ - gpiochip_add(&tegra_gpio_chip); for (i = INT_GPIO_BASE; i < (INT_GPIO_BASE + TEGRA_NR_GPIOS); i++) { diff --git a/trunk/arch/arm/plat-mxc/Makefile b/trunk/arch/arm/plat-mxc/Makefile index d53c35fe2ea7..a1387875a491 100644 --- a/trunk/arch/arm/plat-mxc/Makefile +++ b/trunk/arch/arm/plat-mxc/Makefile @@ -3,7 +3,7 @@ # # Common support -obj-y := clock.o time.o devices.o cpu.o system.o irq-common.o +obj-y := clock.o gpio.o time.o devices.o cpu.o system.o irq-common.o # MX51 uses the TZIC interrupt controller, older platforms use AVIC obj-$(CONFIG_MXC_TZIC) += tzic.o diff --git a/trunk/arch/arm/plat-mxc/devices.c b/trunk/arch/arm/plat-mxc/devices.c index fb166b20f60f..eee1b6096a08 100644 --- a/trunk/arch/arm/plat-mxc/devices.c +++ b/trunk/arch/arm/plat-mxc/devices.c @@ -89,14 +89,3 @@ struct platform_device *__init imx_add_platform_device_dmamask( return pdev; } - -struct device mxc_aips_bus = { - .init_name = "mxc_aips", - .parent = &platform_bus, -}; - -static int __init mxc_device_init(void) -{ - return device_register(&mxc_aips_bus); -} -core_initcall(mxc_device_init); diff --git a/trunk/arch/arm/plat-mxc/devices/Makefile b/trunk/arch/arm/plat-mxc/devices/Makefile index b41bf972b54b..ad2922acf480 100644 --- a/trunk/arch/arm/plat-mxc/devices/Makefile +++ b/trunk/arch/arm/plat-mxc/devices/Makefile @@ -2,7 +2,6 @@ obj-$(CONFIG_IMX_HAVE_PLATFORM_FEC) += platform-fec.o obj-$(CONFIG_IMX_HAVE_PLATFORM_FLEXCAN) += platform-flexcan.o obj-$(CONFIG_IMX_HAVE_PLATFORM_FSL_USB2_UDC) += platform-fsl-usb2-udc.o obj-$(CONFIG_IMX_HAVE_PLATFORM_GPIO_KEYS) += platform-gpio_keys.o -obj-y += platform-gpio-mxc.o obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX21_HCD) += platform-imx21-hcd.o obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX2_WDT) += platform-imx2-wdt.o obj-$(CONFIG_IMX_HAVE_PLATFORM_IMXDI_RTC) += platform-imxdi_rtc.o diff --git a/trunk/arch/arm/plat-mxc/devices/platform-gpio-mxc.c b/trunk/arch/arm/plat-mxc/devices/platform-gpio-mxc.c deleted file mode 100644 index cf1b7fdfa20d..000000000000 --- a/trunk/arch/arm/plat-mxc/devices/platform-gpio-mxc.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved. - * Copyright 2011 Linaro Limited - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License version 2 as published by the - * Free Software Foundation. - */ -#include - -struct platform_device *__init mxc_register_gpio(int id, - resource_size_t iobase, resource_size_t iosize, int irq, int irq_high) -{ - struct resource res[] = { - { - .start = iobase, - .end = iobase + iosize - 1, - .flags = IORESOURCE_MEM, - }, { - .start = irq, - .end = irq, - .flags = IORESOURCE_IRQ, - }, { - .start = irq_high, - .end = irq_high, - .flags = IORESOURCE_IRQ, - }, - }; - - return platform_device_register_resndata(&mxc_aips_bus, - "gpio-mxc", id, res, ARRAY_SIZE(res), NULL, 0); -} diff --git a/trunk/drivers/gpio/gpio-mxc.c b/trunk/arch/arm/plat-mxc/gpio.c similarity index 51% rename from trunk/drivers/gpio/gpio-mxc.c rename to trunk/arch/arm/plat-mxc/gpio.c index 2f6a81b8f12e..6cd6d7f686f6 100644 --- a/trunk/drivers/gpio/gpio-mxc.c +++ b/trunk/arch/arm/plat-mxc/gpio.c @@ -24,28 +24,11 @@ #include #include #include -#include -#include -#include #include #include -struct mxc_gpio_port { - struct list_head node; - void __iomem *base; - int irq; - int irq_high; - int virtual_irq_start; - struct bgpio_chip bgc; - u32 both_edges; -}; - -/* - * MX2 has one interrupt *for all* gpio ports. The list is used - * to save the references to all ports, so that mx2_gpio_irq_handler - * can walk through all interrupt status registers. - */ -static LIST_HEAD(mxc_gpio_ports); +static struct mxc_gpio_port *mxc_gpio_ports; +static int gpio_table_size; #define cpu_is_mx1_mx2() (cpu_is_mx1() || cpu_is_mx2()) @@ -65,11 +48,45 @@ static LIST_HEAD(mxc_gpio_ports); /* Note: This driver assumes 32 GPIOs are handled in one register */ +static void _clear_gpio_irqstatus(struct mxc_gpio_port *port, u32 index) +{ + __raw_writel(1 << index, port->base + GPIO_ISR); +} + +static void _set_gpio_irqenable(struct mxc_gpio_port *port, u32 index, + int enable) +{ + u32 l; + + l = __raw_readl(port->base + GPIO_IMR); + l = (l & (~(1 << index))) | (!!enable << index); + __raw_writel(l, port->base + GPIO_IMR); +} + +static void gpio_ack_irq(struct irq_data *d) +{ + u32 gpio = irq_to_gpio(d->irq); + _clear_gpio_irqstatus(&mxc_gpio_ports[gpio / 32], gpio & 0x1f); +} + +static void gpio_mask_irq(struct irq_data *d) +{ + u32 gpio = irq_to_gpio(d->irq); + _set_gpio_irqenable(&mxc_gpio_ports[gpio / 32], gpio & 0x1f, 0); +} + +static void gpio_unmask_irq(struct irq_data *d) +{ + u32 gpio = irq_to_gpio(d->irq); + _set_gpio_irqenable(&mxc_gpio_ports[gpio / 32], gpio & 0x1f, 1); +} + +static int mxc_gpio_get(struct gpio_chip *chip, unsigned offset); + static int gpio_set_irq_type(struct irq_data *d, u32 type) { u32 gpio = irq_to_gpio(d->irq); - struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); - struct mxc_gpio_port *port = gc->private; + struct mxc_gpio_port *port = &mxc_gpio_ports[gpio / 32]; u32 bit, val; int edge; void __iomem *reg = port->base; @@ -83,7 +100,7 @@ static int gpio_set_irq_type(struct irq_data *d, u32 type) edge = GPIO_INT_FALL_EDGE; break; case IRQ_TYPE_EDGE_BOTH: - val = gpio_get_value(gpio); + val = mxc_gpio_get(&port->chip, gpio & 31); if (val) { edge = GPIO_INT_LOW_LEV; pr_debug("mxc: set GPIO %d to low trigger\n", gpio); @@ -105,9 +122,9 @@ static int gpio_set_irq_type(struct irq_data *d, u32 type) reg += GPIO_ICR1 + ((gpio & 0x10) >> 2); /* lower or upper register */ bit = gpio & 0xf; - val = readl(reg) & ~(0x3 << (bit << 1)); - writel(val | (edge << (bit << 1)), reg); - writel(1 << (gpio & 0x1f), port->base + GPIO_ISR); + val = __raw_readl(reg) & ~(0x3 << (bit << 1)); + __raw_writel(val | (edge << (bit << 1)), reg); + _clear_gpio_irqstatus(port, gpio & 0x1f); return 0; } @@ -120,7 +137,7 @@ static void mxc_flip_edge(struct mxc_gpio_port *port, u32 gpio) reg += GPIO_ICR1 + ((gpio & 0x10) >> 2); /* lower or upper register */ bit = gpio & 0xf; - val = readl(reg); + val = __raw_readl(reg); edge = (val >> (bit << 1)) & 3; val &= ~(0x3 << (bit << 1)); if (edge == GPIO_INT_HIGH_LEV) { @@ -134,7 +151,7 @@ static void mxc_flip_edge(struct mxc_gpio_port *port, u32 gpio) gpio, edge); return; } - writel(val | (edge << (bit << 1)), reg); + __raw_writel(val | (edge << (bit << 1)), reg); } /* handle 32 interrupts in one status register */ @@ -160,7 +177,8 @@ static void mx3_gpio_irq_handler(u32 irq, struct irq_desc *desc) u32 irq_stat; struct mxc_gpio_port *port = irq_get_handler_data(irq); - irq_stat = readl(port->base + GPIO_ISR) & readl(port->base + GPIO_IMR); + irq_stat = __raw_readl(port->base + GPIO_ISR) & + __raw_readl(port->base + GPIO_IMR); mxc_gpio_irq_handler(port, irq_stat); } @@ -168,18 +186,19 @@ static void mx3_gpio_irq_handler(u32 irq, struct irq_desc *desc) /* MX2 has one interrupt *for all* gpio ports */ static void mx2_gpio_irq_handler(u32 irq, struct irq_desc *desc) { + int i; u32 irq_msk, irq_stat; - struct mxc_gpio_port *port; + struct mxc_gpio_port *port = irq_get_handler_data(irq); /* walk through all interrupt status registers */ - list_for_each_entry(port, &mxc_gpio_ports, node) { - irq_msk = readl(port->base + GPIO_IMR); + for (i = 0; i < gpio_table_size; i++) { + irq_msk = __raw_readl(port[i].base + GPIO_IMR); if (!irq_msk) continue; - irq_stat = readl(port->base + GPIO_ISR) & irq_msk; + irq_stat = __raw_readl(port[i].base + GPIO_ISR) & irq_msk; if (irq_stat) - mxc_gpio_irq_handler(port, irq_stat); + mxc_gpio_irq_handler(&port[i], irq_stat); } } @@ -196,8 +215,7 @@ static int gpio_set_wake_irq(struct irq_data *d, u32 enable) { u32 gpio = irq_to_gpio(d->irq); u32 gpio_idx = gpio & 0x1F; - struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); - struct mxc_gpio_port *port = gc->private; + struct mxc_gpio_port *port = &mxc_gpio_ports[gpio / 32]; if (enable) { if (port->irq_high && (gpio_idx >= 16)) @@ -214,134 +232,130 @@ static int gpio_set_wake_irq(struct irq_data *d, u32 enable) return 0; } -static void __init mxc_gpio_init_gc(struct mxc_gpio_port *port) +static struct irq_chip gpio_irq_chip = { + .name = "GPIO", + .irq_ack = gpio_ack_irq, + .irq_mask = gpio_mask_irq, + .irq_unmask = gpio_unmask_irq, + .irq_set_type = gpio_set_irq_type, + .irq_set_wake = gpio_set_wake_irq, +}; + +static void _set_gpio_direction(struct gpio_chip *chip, unsigned offset, + int dir) { - struct irq_chip_generic *gc; - struct irq_chip_type *ct; - - gc = irq_alloc_generic_chip("gpio-mxc", 1, port->virtual_irq_start, - port->base, handle_level_irq); - gc->private = port; - - ct = gc->chip_types; - ct->chip.irq_ack = irq_gc_ack, - ct->chip.irq_mask = irq_gc_mask_clr_bit; - ct->chip.irq_unmask = irq_gc_mask_set_bit; - ct->chip.irq_set_type = gpio_set_irq_type; - ct->chip.irq_set_wake = gpio_set_wake_irq, - ct->regs.ack = GPIO_ISR; - ct->regs.mask = GPIO_IMR; - - irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_NESTED_LOCK, - IRQ_NOREQUEST, 0); + struct mxc_gpio_port *port = + container_of(chip, struct mxc_gpio_port, chip); + u32 l; + unsigned long flags; + + spin_lock_irqsave(&port->lock, flags); + l = __raw_readl(port->base + GPIO_GDIR); + if (dir) + l |= 1 << offset; + else + l &= ~(1 << offset); + __raw_writel(l, port->base + GPIO_GDIR); + spin_unlock_irqrestore(&port->lock, flags); } -static int __devinit mxc_gpio_probe(struct platform_device *pdev) +static void mxc_gpio_set(struct gpio_chip *chip, unsigned offset, int value) { - struct mxc_gpio_port *port; - struct resource *iores; - int err; + struct mxc_gpio_port *port = + container_of(chip, struct mxc_gpio_port, chip); + void __iomem *reg = port->base + GPIO_DR; + u32 l; + unsigned long flags; + + spin_lock_irqsave(&port->lock, flags); + l = (__raw_readl(reg) & (~(1 << offset))) | (!!value << offset); + __raw_writel(l, reg); + spin_unlock_irqrestore(&port->lock, flags); +} - port = kzalloc(sizeof(struct mxc_gpio_port), GFP_KERNEL); - if (!port) - return -ENOMEM; +static int mxc_gpio_get(struct gpio_chip *chip, unsigned offset) +{ + struct mxc_gpio_port *port = + container_of(chip, struct mxc_gpio_port, chip); - port->virtual_irq_start = MXC_GPIO_IRQ_START + pdev->id * 32; + return (__raw_readl(port->base + GPIO_PSR) >> offset) & 1; +} - iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!iores) { - err = -ENODEV; - goto out_kfree; - } +static int mxc_gpio_direction_input(struct gpio_chip *chip, unsigned offset) +{ + _set_gpio_direction(chip, offset, 0); + return 0; +} - if (!request_mem_region(iores->start, resource_size(iores), - pdev->name)) { - err = -EBUSY; - goto out_kfree; - } +static int mxc_gpio_direction_output(struct gpio_chip *chip, + unsigned offset, int value) +{ + mxc_gpio_set(chip, offset, value); + _set_gpio_direction(chip, offset, 1); + return 0; +} - port->base = ioremap(iores->start, resource_size(iores)); - if (!port->base) { - err = -ENOMEM; - goto out_release_mem; - } +/* + * This lock class tells lockdep that GPIO irqs are in a different + * category than their parents, so it won't report false recursion. + */ +static struct lock_class_key gpio_lock_class; - port->irq_high = platform_get_irq(pdev, 1); - port->irq = platform_get_irq(pdev, 0); - if (port->irq < 0) { - err = -EINVAL; - goto out_iounmap; - } +int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt) +{ + int i, j; + + /* save for local usage */ + mxc_gpio_ports = port; + gpio_table_size = cnt; + + printk(KERN_INFO "MXC GPIO hardware\n"); + + for (i = 0; i < cnt; i++) { + /* disable the interrupt and clear the status */ + __raw_writel(0, port[i].base + GPIO_IMR); + __raw_writel(~0, port[i].base + GPIO_ISR); + for (j = port[i].virtual_irq_start; + j < port[i].virtual_irq_start + 32; j++) { + irq_set_lockdep_class(j, &gpio_lock_class); + irq_set_chip_and_handler(j, &gpio_irq_chip, + handle_level_irq); + set_irq_flags(j, IRQF_VALID); + } - /* disable the interrupt and clear the status */ - writel(0, port->base + GPIO_IMR); - writel(~0, port->base + GPIO_ISR); + /* register gpio chip */ + port[i].chip.direction_input = mxc_gpio_direction_input; + port[i].chip.direction_output = mxc_gpio_direction_output; + port[i].chip.get = mxc_gpio_get; + port[i].chip.set = mxc_gpio_set; + port[i].chip.base = i * 32; + port[i].chip.ngpio = 32; - /* gpio-mxc can be a generic irq chip */ - mxc_gpio_init_gc(port); + spin_lock_init(&port[i].lock); - if (cpu_is_mx2()) { - /* setup one handler for all GPIO interrupts */ - if (pdev->id == 0) - irq_set_chained_handler(port->irq, - mx2_gpio_irq_handler); - } else { - /* setup one handler for each entry */ - irq_set_chained_handler(port->irq, mx3_gpio_irq_handler); - irq_set_handler_data(port->irq, port); - if (port->irq_high > 0) { - /* setup handler for GPIO 16 to 31 */ - irq_set_chained_handler(port->irq_high, + /* its a serious configuration bug when it fails */ + BUG_ON( gpiochip_add(&port[i].chip) < 0 ); + + if (cpu_is_mx1() || cpu_is_mx3() || cpu_is_mx25() || cpu_is_mx51()) { + /* setup one handler for each entry */ + irq_set_chained_handler(port[i].irq, mx3_gpio_irq_handler); - irq_set_handler_data(port->irq_high, port); + irq_set_handler_data(port[i].irq, &port[i]); + if (port[i].irq_high) { + /* setup handler for GPIO 16 to 31 */ + irq_set_chained_handler(port[i].irq_high, + mx3_gpio_irq_handler); + irq_set_handler_data(port[i].irq_high, + &port[i]); + } } } - err = bgpio_init(&port->bgc, &pdev->dev, 4, - port->base + GPIO_PSR, - port->base + GPIO_DR, NULL, - port->base + GPIO_GDIR, NULL, false); - if (err) - goto out_iounmap; - - port->bgc.gc.base = pdev->id * 32; - - err = gpiochip_add(&port->bgc.gc); - if (err) - goto out_bgpio_remove; - - list_add_tail(&port->node, &mxc_gpio_ports); + if (cpu_is_mx2()) { + /* setup one handler for all GPIO interrupts */ + irq_set_chained_handler(port[0].irq, mx2_gpio_irq_handler); + irq_set_handler_data(port[0].irq, port); + } return 0; - -out_bgpio_remove: - bgpio_remove(&port->bgc); -out_iounmap: - iounmap(port->base); -out_release_mem: - release_mem_region(iores->start, resource_size(iores)); -out_kfree: - kfree(port); - dev_info(&pdev->dev, "%s failed with errno %d\n", __func__, err); - return err; } - -static struct platform_driver mxc_gpio_driver = { - .driver = { - .name = "gpio-mxc", - .owner = THIS_MODULE, - }, - .probe = mxc_gpio_probe, -}; - -static int __init gpio_mxc_init(void) -{ - return platform_driver_register(&mxc_gpio_driver); -} -postcore_initcall(gpio_mxc_init); - -MODULE_AUTHOR("Freescale Semiconductor, " - "Daniel Mack , " - "Juergen Beisert "); -MODULE_DESCRIPTION("Freescale MXC GPIO"); -MODULE_LICENSE("GPL"); diff --git a/trunk/arch/arm/plat-mxc/include/mach/common.h b/trunk/arch/arm/plat-mxc/include/mach/common.h index 91fa2632aa5e..da7991832af6 100644 --- a/trunk/arch/arm/plat-mxc/include/mach/common.h +++ b/trunk/arch/arm/plat-mxc/include/mach/common.h @@ -43,15 +43,6 @@ extern void mx35_init_irq(void); extern void mx50_init_irq(void); extern void mx51_init_irq(void); extern void mx53_init_irq(void); -extern void imx1_soc_init(void); -extern void imx21_soc_init(void); -extern void imx25_soc_init(void); -extern void imx27_soc_init(void); -extern void imx31_soc_init(void); -extern void imx35_soc_init(void); -extern void imx50_soc_init(void); -extern void imx51_soc_init(void); -extern void imx53_soc_init(void); extern void epit_timer_init(struct clk *timer_clk, void __iomem *base, int irq); extern void mxc_timer_init(struct clk *timer_clk, void __iomem *, int); extern int mx1_clocks_init(unsigned long fref); @@ -64,8 +55,7 @@ extern int mx51_clocks_init(unsigned long ckil, unsigned long osc, unsigned long ckih1, unsigned long ckih2); extern int mx53_clocks_init(unsigned long ckil, unsigned long osc, unsigned long ckih1, unsigned long ckih2); -extern struct platform_device *mxc_register_gpio(int id, - resource_size_t iobase, resource_size_t iosize, int irq, int irq_high); +extern int mxc_register_gpios(void); extern int mxc_register_device(struct platform_device *pdev, void *data); extern void mxc_set_cpu_type(unsigned int type); extern void mxc_arch_reset_init(void __iomem *); diff --git a/trunk/arch/arm/plat-mxc/include/mach/devices-common.h b/trunk/arch/arm/plat-mxc/include/mach/devices-common.h index 03f626645374..fa8477337f91 100644 --- a/trunk/arch/arm/plat-mxc/include/mach/devices-common.h +++ b/trunk/arch/arm/plat-mxc/include/mach/devices-common.h @@ -10,8 +10,6 @@ #include #include -extern struct device mxc_aips_bus; - struct platform_device *imx_add_platform_device_dmamask( const char *name, int id, const struct resource *res, unsigned int num_resources, diff --git a/trunk/arch/arm/plat-mxc/include/mach/gpio.h b/trunk/arch/arm/plat-mxc/include/mach/gpio.h index 31c820c1b796..a2747f12813e 100644 --- a/trunk/arch/arm/plat-mxc/include/mach/gpio.h +++ b/trunk/arch/arm/plat-mxc/include/mach/gpio.h @@ -36,4 +36,31 @@ #define gpio_to_irq(gpio) (MXC_GPIO_IRQ_START + (gpio)) #define irq_to_gpio(irq) ((irq) - MXC_GPIO_IRQ_START) +struct mxc_gpio_port { + void __iomem *base; + int irq; + int irq_high; + int virtual_irq_start; + struct gpio_chip chip; + u32 both_edges; + spinlock_t lock; +}; + +#define DEFINE_IMX_GPIO_PORT_IRQ_HIGH(soc, _id, _hwid, _irq, _irq_high) \ + { \ + .chip.label = "gpio-" #_id, \ + .irq = _irq, \ + .irq_high = _irq_high, \ + .base = soc ## _IO_ADDRESS( \ + soc ## _GPIO ## _hwid ## _BASE_ADDR), \ + .virtual_irq_start = MXC_GPIO_IRQ_START + (_id) * 32, \ + } + +#define DEFINE_IMX_GPIO_PORT_IRQ(soc, _id, _hwid, _irq) \ + DEFINE_IMX_GPIO_PORT_IRQ_HIGH(soc, _id, _hwid, _irq, 0) +#define DEFINE_IMX_GPIO_PORT(soc, _id, _hwid) \ + DEFINE_IMX_GPIO_PORT_IRQ(soc, _id, _hwid, 0) + +int mxc_gpio_init(struct mxc_gpio_port*, int); + #endif diff --git a/trunk/drivers/gpio/gpio-74x164.c b/trunk/drivers/gpio/74x164.c similarity index 88% rename from trunk/drivers/gpio/gpio-74x164.c rename to trunk/drivers/gpio/74x164.c index ff525c0958dd..84e070219839 100644 --- a/trunk/drivers/gpio/gpio-74x164.c +++ b/trunk/drivers/gpio/74x164.c @@ -16,6 +16,9 @@ #include #include +#define GEN_74X164_GPIO_COUNT 8 + + struct gen_74x164_chip { struct spi_device *spi; struct gpio_chip gpio_chip; @@ -23,7 +26,9 @@ struct gen_74x164_chip { u8 port_config; }; -static struct gen_74x164_chip *gpio_to_74x164_chip(struct gpio_chip *gc) +static void gen_74x164_set_value(struct gpio_chip *, unsigned, int); + +static struct gen_74x164_chip *gpio_to_chip(struct gpio_chip *gc) { return container_of(gc, struct gen_74x164_chip, gpio_chip); } @@ -34,9 +39,16 @@ static int __gen_74x164_write_config(struct gen_74x164_chip *chip) &chip->port_config, sizeof(chip->port_config)); } +static int gen_74x164_direction_output(struct gpio_chip *gc, + unsigned offset, int val) +{ + gen_74x164_set_value(gc, offset, val); + return 0; +} + static int gen_74x164_get_value(struct gpio_chip *gc, unsigned offset) { - struct gen_74x164_chip *chip = gpio_to_74x164_chip(gc); + struct gen_74x164_chip *chip = gpio_to_chip(gc); int ret; mutex_lock(&chip->lock); @@ -49,7 +61,7 @@ static int gen_74x164_get_value(struct gpio_chip *gc, unsigned offset) static void gen_74x164_set_value(struct gpio_chip *gc, unsigned offset, int val) { - struct gen_74x164_chip *chip = gpio_to_74x164_chip(gc); + struct gen_74x164_chip *chip = gpio_to_chip(gc); mutex_lock(&chip->lock); if (val) @@ -61,13 +73,6 @@ static void gen_74x164_set_value(struct gpio_chip *gc, mutex_unlock(&chip->lock); } -static int gen_74x164_direction_output(struct gpio_chip *gc, - unsigned offset, int val) -{ - gen_74x164_set_value(gc, offset, val); - return 0; -} - static int __devinit gen_74x164_probe(struct spi_device *spi) { struct gen_74x164_chip *chip; @@ -99,12 +104,12 @@ static int __devinit gen_74x164_probe(struct spi_device *spi) chip->spi = spi; - chip->gpio_chip.label = spi->modalias; - chip->gpio_chip.direction_output = gen_74x164_direction_output; + chip->gpio_chip.label = GEN_74X164_DRIVER_NAME, + chip->gpio_chip.direction_output = gen_74x164_direction_output; chip->gpio_chip.get = gen_74x164_get_value; chip->gpio_chip.set = gen_74x164_set_value; chip->gpio_chip.base = pdata->base; - chip->gpio_chip.ngpio = 8; + chip->gpio_chip.ngpio = GEN_74X164_GPIO_COUNT; chip->gpio_chip.can_sleep = 1; chip->gpio_chip.dev = &spi->dev; chip->gpio_chip.owner = THIS_MODULE; @@ -152,7 +157,7 @@ static int __devexit gen_74x164_remove(struct spi_device *spi) static struct spi_driver gen_74x164_driver = { .driver = { - .name = "74x164", + .name = GEN_74X164_DRIVER_NAME, .owner = THIS_MODULE, }, .probe = gen_74x164_probe, diff --git a/trunk/drivers/gpio/Kconfig b/trunk/drivers/gpio/Kconfig index 9f06e63fbc8e..2967002a9f82 100644 --- a/trunk/drivers/gpio/Kconfig +++ b/trunk/drivers/gpio/Kconfig @@ -63,9 +63,6 @@ config GPIO_SYSFS Kernel drivers may also request that a particular GPIO be exported to userspace; this can be useful when debugging. -config GPIO_GENERIC - tristate - # put drivers in the right section, in alphabetical order config GPIO_MAX730X @@ -73,38 +70,26 @@ config GPIO_MAX730X comment "Memory mapped GPIO drivers:" -config GPIO_GENERIC_PLATFORM - tristate "Generic memory-mapped GPIO controller support (MMIO platform device)" - select GPIO_GENERIC +config GPIO_BASIC_MMIO_CORE + tristate + help + Provides core functionality for basic memory-mapped GPIO controllers. + +config GPIO_BASIC_MMIO + tristate "Basic memory-mapped GPIO controllers support" + select GPIO_BASIC_MMIO_CORE help - Say yes here to support basic platform_device memory-mapped GPIO controllers. + Say yes here to support basic memory-mapped GPIO controllers. config GPIO_IT8761E tristate "IT8761E GPIO support" help Say yes here to support GPIO functionality of IT8761E super I/O chip. -config GPIO_EP93XX - def_bool y - depends on ARCH_EP93XX - select GPIO_GENERIC - config GPIO_EXYNOS4 def_bool y depends on CPU_EXYNOS4210 -config GPIO_MXC - def_bool y - depends on ARCH_MXC - select GPIO_GENERIC - select GENERIC_IRQ_CHIP - -config GPIO_MXS - def_bool y - depends on ARCH_MXS - select GPIO_GENERIC - select GENERIC_IRQ_CHIP - config GPIO_PLAT_SAMSUNG def_bool y depends on SAMSUNG_GPIOLIB_4BIT @@ -152,6 +137,9 @@ config GPIO_SCH The Intel Tunnel Creek processor has 5 GPIOs powered by the core power rail and 9 from suspend power supply. + This driver can also be built as a module. If so, the module + will be called sch-gpio. + config GPIO_VX855 tristate "VIA VX855/VX875 GPIO" depends on MFD_SUPPORT && PCI @@ -214,6 +202,9 @@ config GPIO_PCA953X 16 bits: pca9535, pca9539, pca9555, tca6416 + This driver can also be built as a module. If so, the module + will be called pca953x. + config GPIO_PCA953X_IRQ bool "Interrupt controller support for PCA953x" depends on GPIO_PCA953X=y @@ -305,12 +296,17 @@ config GPIO_ADP5520 This option enables support for on-chip GPIO found on Analog Devices ADP5520 PMICs. + To compile this driver as a module, choose M here: the module will + be called adp5520-gpio. + config GPIO_ADP5588 tristate "ADP5588 I2C GPIO expander" depends on I2C help This option enables support for 18 GPIOs found on Analog Devices ADP5588 GPIO Expanders. + To compile this driver as a module, choose M here: the module will be + called adp5588-gpio. config GPIO_ADP5588_IRQ bool "Interrupt controller support for ADP5588" @@ -432,6 +428,9 @@ config GPIO_UCB1400 This enables support for the Philips UCB1400 GPIO pins. The UCB1400 is an AC97 audio codec. + To compile this driver as a module, choose M here: the + module will be called ucb1400_gpio. + comment "MODULbus GPIO expanders:" config GPIO_JANZ_TTL @@ -442,7 +441,7 @@ config GPIO_JANZ_TTL This driver provides support for driving the pins in output mode only. Input mode is not supported. -config GPIO_AB8500 +config AB8500_GPIO bool "ST-Ericsson AB8500 Mixed Signal Circuit gpio functions" depends on AB8500_CORE && BROKEN help diff --git a/trunk/drivers/gpio/Makefile b/trunk/drivers/gpio/Makefile index 0fbdd75996e3..b605f8ec6fbe 100644 --- a/trunk/drivers/gpio/Makefile +++ b/trunk/drivers/gpio/Makefile @@ -4,54 +4,47 @@ ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG obj-$(CONFIG_GPIOLIB) += gpiolib.o -# Device drivers. Generally keep list sorted alphabetically -obj-$(CONFIG_GPIO_GENERIC) += gpio-generic.o - -obj-$(CONFIG_GPIO_74X164) += gpio-74x164.o -obj-$(CONFIG_GPIO_AB8500) += gpio-ab8500.o -obj-$(CONFIG_GPIO_ADP5520) += gpio-adp5520.o -obj-$(CONFIG_GPIO_ADP5588) += gpio-adp5588.o -obj-$(CONFIG_GPIO_BT8XX) += gpio-bt8xx.o -obj-$(CONFIG_GPIO_CS5535) += gpio-cs5535.o -obj-$(CONFIG_GPIO_EP93XX) += gpio-ep93xx.o +obj-$(CONFIG_GPIO_ADP5520) += adp5520-gpio.o +obj-$(CONFIG_GPIO_ADP5588) += adp5588-gpio.o +obj-$(CONFIG_GPIO_BASIC_MMIO_CORE) += basic_mmio_gpio.o +obj-$(CONFIG_GPIO_BASIC_MMIO) += basic_mmio_gpio.o obj-$(CONFIG_GPIO_EXYNOS4) += gpio-exynos4.o -obj-$(CONFIG_GPIO_IT8761E) += gpio-it8761e.o -obj-$(CONFIG_GPIO_JANZ_TTL) += gpio-janz-ttl.o -obj-$(CONFIG_GPIO_LANGWELL) += gpio-langwell.o -obj-$(CONFIG_GPIO_MAX730X) += gpio-max730x.o -obj-$(CONFIG_GPIO_MAX7300) += gpio-max7300.o -obj-$(CONFIG_GPIO_MAX7301) += gpio-max7301.o -obj-$(CONFIG_GPIO_MAX732X) += gpio-max732x.o -obj-$(CONFIG_GPIO_MC33880) += gpio-mc33880.o -obj-$(CONFIG_GPIO_MCP23S08) += gpio-mcp23s08.o -obj-$(CONFIG_GPIO_ML_IOH) += gpio-ml-ioh.o -obj-$(CONFIG_GPIO_MXC) += gpio-mxc.o -obj-$(CONFIG_GPIO_MXS) += gpio-mxs.o -obj-$(CONFIG_PLAT_NOMADIK) += gpio-nomadik.o -obj-$(CONFIG_ARCH_OMAP) += gpio-omap.o -obj-$(CONFIG_GPIO_PCA953X) += gpio-pca953x.o -obj-$(CONFIG_GPIO_PCF857X) += gpio-pcf857x.o -obj-$(CONFIG_GPIO_PCH) += gpio-pch.o -obj-$(CONFIG_GPIO_PL061) += gpio-pl061.o -obj-$(CONFIG_GPIO_RDC321X) += gpio-rdc321x.o - obj-$(CONFIG_GPIO_PLAT_SAMSUNG) += gpio-plat-samsung.o obj-$(CONFIG_GPIO_S5PC100) += gpio-s5pc100.o obj-$(CONFIG_GPIO_S5PV210) += gpio-s5pv210.o - -obj-$(CONFIG_GPIO_SCH) += gpio-sch.o -obj-$(CONFIG_GPIO_STMPE) += gpio-stmpe.o -obj-$(CONFIG_GPIO_SX150X) += gpio-sx150x.o -obj-$(CONFIG_GPIO_TC3589X) += gpio-tc3589x.o -obj-$(CONFIG_ARCH_TEGRA) += gpio-tegra.o -obj-$(CONFIG_GPIO_TIMBERDALE) += gpio-timberdale.o -obj-$(CONFIG_GPIO_TPS65910) += gpio-tps65910.o -obj-$(CONFIG_GPIO_TWL4030) += gpio-twl4030.o +obj-$(CONFIG_GPIO_LANGWELL) += langwell_gpio.o +obj-$(CONFIG_GPIO_MAX730X) += max730x.o +obj-$(CONFIG_GPIO_MAX7300) += max7300.o +obj-$(CONFIG_GPIO_MAX7301) += max7301.o +obj-$(CONFIG_GPIO_MAX732X) += max732x.o +obj-$(CONFIG_GPIO_MC33880) += mc33880.o +obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o +obj-$(CONFIG_GPIO_74X164) += 74x164.o +obj-$(CONFIG_ARCH_OMAP) += gpio-omap.o +obj-$(CONFIG_GPIO_PCA953X) += pca953x.o +obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o +obj-$(CONFIG_GPIO_PCH) += pch_gpio.o +obj-$(CONFIG_GPIO_PL061) += pl061.o +obj-$(CONFIG_GPIO_STMPE) += stmpe-gpio.o +obj-$(CONFIG_GPIO_TC3589X) += tc3589x-gpio.o +obj-$(CONFIG_GPIO_TIMBERDALE) += timbgpio.o +obj-$(CONFIG_GPIO_TWL4030) += twl4030-gpio.o +obj-$(CONFIG_GPIO_UCB1400) += ucb1400_gpio.o +obj-$(CONFIG_GPIO_XILINX) += xilinx_gpio.o +obj-$(CONFIG_GPIO_CS5535) += cs5535-gpio.o +obj-$(CONFIG_GPIO_BT8XX) += bt8xxgpio.o +obj-$(CONFIG_GPIO_IT8761E) += it8761e_gpio.o +obj-$(CONFIG_GPIO_VR41XX) += vr41xx_giu.o +obj-$(CONFIG_GPIO_WM831X) += wm831x-gpio.o +obj-$(CONFIG_GPIO_WM8350) += wm8350-gpiolib.o +obj-$(CONFIG_GPIO_WM8994) += wm8994-gpio.o +obj-$(CONFIG_GPIO_SCH) += sch_gpio.o obj-$(CONFIG_MACH_U300) += gpio-u300.o -obj-$(CONFIG_GPIO_UCB1400) += gpio-ucb1400.o -obj-$(CONFIG_GPIO_VR41XX) += gpio-vr41xx.o -obj-$(CONFIG_GPIO_VX855) += gpio-vx855.o -obj-$(CONFIG_GPIO_WM831X) += gpio-wm831x.o -obj-$(CONFIG_GPIO_WM8350) += gpio-wm8350.o -obj-$(CONFIG_GPIO_WM8994) += gpio-wm8994.o -obj-$(CONFIG_GPIO_XILINX) += gpio-xilinx.o +obj-$(CONFIG_PLAT_NOMADIK) += gpio-nomadik.o +obj-$(CONFIG_GPIO_RDC321X) += rdc321x-gpio.o +obj-$(CONFIG_GPIO_JANZ_TTL) += janz-ttl.o +obj-$(CONFIG_GPIO_SX150X) += sx150x.o +obj-$(CONFIG_GPIO_VX855) += vx855_gpio.o +obj-$(CONFIG_GPIO_ML_IOH) += ml_ioh_gpio.o +obj-$(CONFIG_AB8500_GPIO) += ab8500-gpio.o +obj-$(CONFIG_GPIO_TPS65910) += tps65910-gpio.o diff --git a/trunk/drivers/gpio/gpio-ab8500.c b/trunk/drivers/gpio/ab8500-gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-ab8500.c rename to trunk/drivers/gpio/ab8500-gpio.c diff --git a/trunk/drivers/gpio/gpio-adp5520.c b/trunk/drivers/gpio/adp5520-gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-adp5520.c rename to trunk/drivers/gpio/adp5520-gpio.c diff --git a/trunk/drivers/gpio/gpio-adp5588.c b/trunk/drivers/gpio/adp5588-gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-adp5588.c rename to trunk/drivers/gpio/adp5588-gpio.c diff --git a/trunk/drivers/gpio/gpio-generic.c b/trunk/drivers/gpio/basic_mmio_gpio.c similarity index 99% rename from trunk/drivers/gpio/gpio-generic.c rename to trunk/drivers/gpio/basic_mmio_gpio.c index 231714def4d2..8152e9f516b0 100644 --- a/trunk/drivers/gpio/gpio-generic.c +++ b/trunk/drivers/gpio/basic_mmio_gpio.c @@ -1,5 +1,5 @@ /* - * Generic driver for memory-mapped GPIO controllers. + * Driver for basic memory-mapped GPIO controllers. * * Copyright 2008 MontaVista Software, Inc. * Copyright 2008,2010 Anton Vorontsov @@ -404,7 +404,7 @@ int __devinit bgpio_init(struct bgpio_chip *bgc, } EXPORT_SYMBOL_GPL(bgpio_init); -#ifdef CONFIG_GPIO_GENERIC_PLATFORM +#ifdef CONFIG_GPIO_BASIC_MMIO static void __iomem *bgpio_map(struct platform_device *pdev, const char *name, @@ -541,7 +541,7 @@ static void __exit bgpio_platform_exit(void) } module_exit(bgpio_platform_exit); -#endif /* CONFIG_GPIO_GENERIC_PLATFORM */ +#endif /* CONFIG_GPIO_BASIC_MMIO */ MODULE_DESCRIPTION("Driver for basic memory-mapped GPIO controllers"); MODULE_AUTHOR("Anton Vorontsov "); diff --git a/trunk/drivers/gpio/gpio-bt8xx.c b/trunk/drivers/gpio/bt8xxgpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-bt8xx.c rename to trunk/drivers/gpio/bt8xxgpio.c diff --git a/trunk/drivers/gpio/gpio-cs5535.c b/trunk/drivers/gpio/cs5535-gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-cs5535.c rename to trunk/drivers/gpio/cs5535-gpio.c diff --git a/trunk/drivers/gpio/gpio-exynos4.c b/trunk/drivers/gpio/gpio-exynos4.c index d24b337cf1ac..9029835112e7 100644 --- a/trunk/drivers/gpio/gpio-exynos4.c +++ b/trunk/drivers/gpio/gpio-exynos4.c @@ -1,9 +1,10 @@ -/* - * EXYNOS4 - GPIOlib support +/* linux/arch/arm/mach-exynos4/gpiolib.c * * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. * http://www.samsung.com * + * EXYNOS4 - GPIOlib support + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. diff --git a/trunk/drivers/gpio/gpio-mxs.c b/trunk/drivers/gpio/gpio-mxs.c deleted file mode 100644 index d8cafba8c829..000000000000 --- a/trunk/drivers/gpio/gpio-mxs.c +++ /dev/null @@ -1,289 +0,0 @@ -/* - * MXC GPIO support. (c) 2008 Daniel Mack - * Copyright 2008 Juergen Beisert, kernel@pengutronix.de - * - * Based on code from Freescale, - * Copyright (C) 2004-2010 Freescale Semiconductor, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MXS_SET 0x4 -#define MXS_CLR 0x8 - -#define PINCTRL_DOUT(n) ((cpu_is_mx23() ? 0x0500 : 0x0700) + (n) * 0x10) -#define PINCTRL_DIN(n) ((cpu_is_mx23() ? 0x0600 : 0x0900) + (n) * 0x10) -#define PINCTRL_DOE(n) ((cpu_is_mx23() ? 0x0700 : 0x0b00) + (n) * 0x10) -#define PINCTRL_PIN2IRQ(n) ((cpu_is_mx23() ? 0x0800 : 0x1000) + (n) * 0x10) -#define PINCTRL_IRQEN(n) ((cpu_is_mx23() ? 0x0900 : 0x1100) + (n) * 0x10) -#define PINCTRL_IRQLEV(n) ((cpu_is_mx23() ? 0x0a00 : 0x1200) + (n) * 0x10) -#define PINCTRL_IRQPOL(n) ((cpu_is_mx23() ? 0x0b00 : 0x1300) + (n) * 0x10) -#define PINCTRL_IRQSTAT(n) ((cpu_is_mx23() ? 0x0c00 : 0x1400) + (n) * 0x10) - -#define GPIO_INT_FALL_EDGE 0x0 -#define GPIO_INT_LOW_LEV 0x1 -#define GPIO_INT_RISE_EDGE 0x2 -#define GPIO_INT_HIGH_LEV 0x3 -#define GPIO_INT_LEV_MASK (1 << 0) -#define GPIO_INT_POL_MASK (1 << 1) - -struct mxs_gpio_port { - void __iomem *base; - int id; - int irq; - int virtual_irq_start; - struct bgpio_chip bgc; -}; - -/* Note: This driver assumes 32 GPIOs are handled in one register */ - -static int mxs_gpio_set_irq_type(struct irq_data *d, unsigned int type) -{ - u32 gpio = irq_to_gpio(d->irq); - u32 pin_mask = 1 << (gpio & 31); - struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); - struct mxs_gpio_port *port = gc->private; - void __iomem *pin_addr; - int edge; - - switch (type) { - case IRQ_TYPE_EDGE_RISING: - edge = GPIO_INT_RISE_EDGE; - break; - case IRQ_TYPE_EDGE_FALLING: - edge = GPIO_INT_FALL_EDGE; - break; - case IRQ_TYPE_LEVEL_LOW: - edge = GPIO_INT_LOW_LEV; - break; - case IRQ_TYPE_LEVEL_HIGH: - edge = GPIO_INT_HIGH_LEV; - break; - default: - return -EINVAL; - } - - /* set level or edge */ - pin_addr = port->base + PINCTRL_IRQLEV(port->id); - if (edge & GPIO_INT_LEV_MASK) - writel(pin_mask, pin_addr + MXS_SET); - else - writel(pin_mask, pin_addr + MXS_CLR); - - /* set polarity */ - pin_addr = port->base + PINCTRL_IRQPOL(port->id); - if (edge & GPIO_INT_POL_MASK) - writel(pin_mask, pin_addr + MXS_SET); - else - writel(pin_mask, pin_addr + MXS_CLR); - - writel(1 << (gpio & 0x1f), - port->base + PINCTRL_IRQSTAT(port->id) + MXS_CLR); - - return 0; -} - -/* MXS has one interrupt *per* gpio port */ -static void mxs_gpio_irq_handler(u32 irq, struct irq_desc *desc) -{ - u32 irq_stat; - struct mxs_gpio_port *port = irq_get_handler_data(irq); - u32 gpio_irq_no_base = port->virtual_irq_start; - - desc->irq_data.chip->irq_ack(&desc->irq_data); - - irq_stat = readl(port->base + PINCTRL_IRQSTAT(port->id)) & - readl(port->base + PINCTRL_IRQEN(port->id)); - - while (irq_stat != 0) { - int irqoffset = fls(irq_stat) - 1; - generic_handle_irq(gpio_irq_no_base + irqoffset); - irq_stat &= ~(1 << irqoffset); - } -} - -/* - * Set interrupt number "irq" in the GPIO as a wake-up source. - * While system is running, all registered GPIO interrupts need to have - * wake-up enabled. When system is suspended, only selected GPIO interrupts - * need to have wake-up enabled. - * @param irq interrupt source number - * @param enable enable as wake-up if equal to non-zero - * @return This function returns 0 on success. - */ -static int mxs_gpio_set_wake_irq(struct irq_data *d, unsigned int enable) -{ - struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); - struct mxs_gpio_port *port = gc->private; - - if (enable) - enable_irq_wake(port->irq); - else - disable_irq_wake(port->irq); - - return 0; -} - -static void __init mxs_gpio_init_gc(struct mxs_gpio_port *port) -{ - struct irq_chip_generic *gc; - struct irq_chip_type *ct; - - gc = irq_alloc_generic_chip("gpio-mxs", 1, port->virtual_irq_start, - port->base, handle_level_irq); - gc->private = port; - - ct = gc->chip_types; - ct->chip.irq_ack = irq_gc_ack, - ct->chip.irq_mask = irq_gc_mask_clr_bit; - ct->chip.irq_unmask = irq_gc_mask_set_bit; - ct->chip.irq_set_type = mxs_gpio_set_irq_type; - ct->chip.irq_set_wake = mxs_gpio_set_wake_irq, - ct->regs.ack = PINCTRL_IRQSTAT(port->id) + MXS_CLR; - ct->regs.mask = PINCTRL_IRQEN(port->id); - - irq_setup_generic_chip(gc, IRQ_MSK(32), 0, IRQ_NOREQUEST, 0); -} - -static int mxs_gpio_to_irq(struct gpio_chip *gc, unsigned offset) -{ - struct bgpio_chip *bgc = to_bgpio_chip(gc); - struct mxs_gpio_port *port = - container_of(bgc, struct mxs_gpio_port, bgc); - - return port->virtual_irq_start + offset; -} - -static int __devinit mxs_gpio_probe(struct platform_device *pdev) -{ - static void __iomem *base; - struct mxs_gpio_port *port; - struct resource *iores = NULL; - int err; - - port = kzalloc(sizeof(struct mxs_gpio_port), GFP_KERNEL); - if (!port) - return -ENOMEM; - - port->id = pdev->id; - port->virtual_irq_start = MXS_GPIO_IRQ_START + port->id * 32; - - /* - * map memory region only once, as all the gpio ports - * share the same one - */ - if (!base) { - iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!iores) { - err = -ENODEV; - goto out_kfree; - } - - if (!request_mem_region(iores->start, resource_size(iores), - pdev->name)) { - err = -EBUSY; - goto out_kfree; - } - - base = ioremap(iores->start, resource_size(iores)); - if (!base) { - err = -ENOMEM; - goto out_release_mem; - } - } - port->base = base; - - port->irq = platform_get_irq(pdev, 0); - if (port->irq < 0) { - err = -EINVAL; - goto out_iounmap; - } - - /* - * select the pin interrupt functionality but initially - * disable the interrupts - */ - writel(~0U, port->base + PINCTRL_PIN2IRQ(port->id)); - writel(0, port->base + PINCTRL_IRQEN(port->id)); - - /* clear address has to be used to clear IRQSTAT bits */ - writel(~0U, port->base + PINCTRL_IRQSTAT(port->id) + MXS_CLR); - - /* gpio-mxs can be a generic irq chip */ - mxs_gpio_init_gc(port); - - /* setup one handler for each entry */ - irq_set_chained_handler(port->irq, mxs_gpio_irq_handler); - irq_set_handler_data(port->irq, port); - - err = bgpio_init(&port->bgc, &pdev->dev, 4, - port->base + PINCTRL_DIN(port->id), - port->base + PINCTRL_DOUT(port->id), NULL, - port->base + PINCTRL_DOE(port->id), NULL, false); - if (err) - goto out_iounmap; - - port->bgc.gc.to_irq = mxs_gpio_to_irq; - port->bgc.gc.base = port->id * 32; - - err = gpiochip_add(&port->bgc.gc); - if (err) - goto out_bgpio_remove; - - return 0; - -out_bgpio_remove: - bgpio_remove(&port->bgc); -out_iounmap: - if (iores) - iounmap(port->base); -out_release_mem: - if (iores) - release_mem_region(iores->start, resource_size(iores)); -out_kfree: - kfree(port); - dev_info(&pdev->dev, "%s failed with errno %d\n", __func__, err); - return err; -} - -static struct platform_driver mxs_gpio_driver = { - .driver = { - .name = "gpio-mxs", - .owner = THIS_MODULE, - }, - .probe = mxs_gpio_probe, -}; - -static int __init mxs_gpio_init(void) -{ - return platform_driver_register(&mxs_gpio_driver); -} -postcore_initcall(mxs_gpio_init); - -MODULE_AUTHOR("Freescale Semiconductor, " - "Daniel Mack , " - "Juergen Beisert "); -MODULE_DESCRIPTION("Freescale MXS GPIO"); -MODULE_LICENSE("GPL"); diff --git a/trunk/drivers/gpio/gpio-omap.c b/trunk/drivers/gpio/gpio-omap.c index 01f74a8459d9..2ca814294c5e 100644 --- a/trunk/drivers/gpio/gpio-omap.c +++ b/trunk/drivers/gpio/gpio-omap.c @@ -700,12 +700,11 @@ static void _clear_gpio_irqbank(struct gpio_bank *bank, int gpio_mask) else if (cpu_is_omap44xx()) reg = bank->base + OMAP4_GPIO_IRQSTATUS1; - if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) { + if (cpu_is_omap24xx() || cpu_is_omap34xx() || cpu_is_omap44xx()) __raw_writel(gpio_mask, reg); /* Flush posted write for the irq status to avoid spurious interrupts */ __raw_readl(reg); - } } static inline void _clear_gpio_irqstatus(struct gpio_bank *bank, int gpio) diff --git a/trunk/drivers/gpio/gpio-plat-samsung.c b/trunk/drivers/gpio/gpio-plat-samsung.c index ef67f1952a72..ea37c0461788 100644 --- a/trunk/drivers/gpio/gpio-plat-samsung.c +++ b/trunk/drivers/gpio/gpio-plat-samsung.c @@ -1,4 +1,5 @@ -/* +/* arch/arm/plat-samsung/gpiolib.c + * * Copyright 2008 Openmoko, Inc. * Copyright 2008 Simtec Electronics * Ben Dooks diff --git a/trunk/drivers/gpio/gpio-s5pc100.c b/trunk/drivers/gpio/gpio-s5pc100.c index 7f87b0c76e0b..2842394b28b5 100644 --- a/trunk/drivers/gpio/gpio-s5pc100.c +++ b/trunk/drivers/gpio/gpio-s5pc100.c @@ -1,5 +1,4 @@ -/* - * S5PC100 - GPIOlib support +/* linux/arch/arm/mach-s5pc100/gpiolib.c * * Copyright (c) 2010 Samsung Electronics Co., Ltd. * http://www.samsung.com @@ -7,6 +6,8 @@ * Copyright 2009 Samsung Electronics Co * Kyungmin Park * + * S5PC100 - GPIOlib support + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. diff --git a/trunk/drivers/gpio/gpio-s5pv210.c b/trunk/drivers/gpio/gpio-s5pv210.c index eb12f1602de9..1ba20a703e05 100644 --- a/trunk/drivers/gpio/gpio-s5pv210.c +++ b/trunk/drivers/gpio/gpio-s5pv210.c @@ -1,9 +1,10 @@ -/* - * S5PV210 - GPIOlib support +/* linux/arch/arm/mach-s5pv210/gpiolib.c * * Copyright (c) 2010 Samsung Electronics Co., Ltd. * http://www.samsung.com/ * + * S5PV210 - GPIOlib support + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. diff --git a/trunk/drivers/gpio/gpio-u300.c b/trunk/drivers/gpio/gpio-u300.c index fd2dfeeefdf3..d92790140fe5 100644 --- a/trunk/drivers/gpio/gpio-u300.c +++ b/trunk/drivers/gpio/gpio-u300.c @@ -1,8 +1,11 @@ /* - * U300 GPIO module. + * + * arch/arm/mach-u300/gpio.c + * * * Copyright (C) 2007-2009 ST-Ericsson AB * License terms: GNU General Public License (GPL) version 2 + * U300 GPIO module. * This can driver either of the two basic GPIO cores * available in the U300 platforms: * COH 901 335 - Used in DB3150 (U300 1.0) and DB3200 (U330 1.0) diff --git a/trunk/drivers/gpio/gpio-it8761e.c b/trunk/drivers/gpio/it8761e_gpio.c similarity index 98% rename from trunk/drivers/gpio/gpio-it8761e.c rename to trunk/drivers/gpio/it8761e_gpio.c index 278b81317010..48fc43c4bdd1 100644 --- a/trunk/drivers/gpio/gpio-it8761e.c +++ b/trunk/drivers/gpio/it8761e_gpio.c @@ -1,5 +1,5 @@ /* - * GPIO interface for IT8761E Super I/O chip + * it8761_gpio.c - GPIO interface for IT8761E Super I/O chip * * Author: Denis Turischev * diff --git a/trunk/drivers/gpio/gpio-janz-ttl.c b/trunk/drivers/gpio/janz-ttl.c similarity index 100% rename from trunk/drivers/gpio/gpio-janz-ttl.c rename to trunk/drivers/gpio/janz-ttl.c diff --git a/trunk/drivers/gpio/gpio-langwell.c b/trunk/drivers/gpio/langwell_gpio.c similarity index 99% rename from trunk/drivers/gpio/gpio-langwell.c rename to trunk/drivers/gpio/langwell_gpio.c index e7a7ea760efc..bd6571e0097a 100644 --- a/trunk/drivers/gpio/gpio-langwell.c +++ b/trunk/drivers/gpio/langwell_gpio.c @@ -1,6 +1,4 @@ -/* - * Moorestown platform Langwell chip GPIO driver - * +/* langwell_gpio.c Moorestown platform Langwell chip GPIO driver * Copyright (c) 2008 - 2009, Intel Corporation. * * This program is free software; you can redistribute it and/or modify diff --git a/trunk/drivers/gpio/gpio-max7300.c b/trunk/drivers/gpio/max7300.c similarity index 98% rename from trunk/drivers/gpio/gpio-max7300.c rename to trunk/drivers/gpio/max7300.c index a5ca0ab1b372..962f661c18c7 100644 --- a/trunk/drivers/gpio/gpio-max7300.c +++ b/trunk/drivers/gpio/max7300.c @@ -1,4 +1,6 @@ /* + * drivers/gpio/max7300.c + * * Copyright (C) 2009 Wolfram Sang, Pengutronix * * This program is free software; you can redistribute it and/or modify diff --git a/trunk/drivers/gpio/gpio-max7301.c b/trunk/drivers/gpio/max7301.c similarity index 98% rename from trunk/drivers/gpio/gpio-max7301.c rename to trunk/drivers/gpio/max7301.c index 741acfcbe761..92a100ddef6b 100644 --- a/trunk/drivers/gpio/gpio-max7301.c +++ b/trunk/drivers/gpio/max7301.c @@ -1,4 +1,6 @@ /* + * drivers/gpio/max7301.c + * * Copyright (C) 2006 Juergen Beisert, Pengutronix * Copyright (C) 2008 Guennadi Liakhovetski, Pengutronix * Copyright (C) 2009 Wolfram Sang, Pengutronix diff --git a/trunk/drivers/gpio/gpio-max730x.c b/trunk/drivers/gpio/max730x.c similarity index 99% rename from trunk/drivers/gpio/gpio-max730x.c rename to trunk/drivers/gpio/max730x.c index 05e2dac60b3b..94ce773f95f8 100644 --- a/trunk/drivers/gpio/gpio-max730x.c +++ b/trunk/drivers/gpio/max730x.c @@ -1,4 +1,6 @@ /** + * drivers/gpio/max7301.c + * * Copyright (C) 2006 Juergen Beisert, Pengutronix * Copyright (C) 2008 Guennadi Liakhovetski, Pengutronix * Copyright (C) 2009 Wolfram Sang, Pengutronix diff --git a/trunk/drivers/gpio/gpio-max732x.c b/trunk/drivers/gpio/max732x.c similarity index 99% rename from trunk/drivers/gpio/gpio-max732x.c rename to trunk/drivers/gpio/max732x.c index 9504120812a5..ad6951edc16c 100644 --- a/trunk/drivers/gpio/gpio-max732x.c +++ b/trunk/drivers/gpio/max732x.c @@ -1,5 +1,5 @@ /* - * MAX732x I2C Port Expander with 8/16 I/O + * max732x.c - I2C Port Expander with 8/16 I/O * * Copyright (C) 2007 Marvell International Ltd. * Copyright (C) 2008 Jack Ren diff --git a/trunk/drivers/gpio/gpio-mc33880.c b/trunk/drivers/gpio/mc33880.c similarity index 98% rename from trunk/drivers/gpio/gpio-mc33880.c rename to trunk/drivers/gpio/mc33880.c index b3b4652e89ec..4ec797593bdb 100644 --- a/trunk/drivers/gpio/gpio-mc33880.c +++ b/trunk/drivers/gpio/mc33880.c @@ -1,5 +1,5 @@ /* - * MC33880 high-side/low-side switch GPIO driver + * mc33880.c MC33880 high-side/low-side switch GPIO driver * Copyright (c) 2009 Intel Corporation * * This program is free software; you can redistribute it and/or modify diff --git a/trunk/drivers/gpio/gpio-mcp23s08.c b/trunk/drivers/gpio/mcp23s08.c similarity index 99% rename from trunk/drivers/gpio/gpio-mcp23s08.c rename to trunk/drivers/gpio/mcp23s08.c index 0083ec051de5..40e076083ec0 100644 --- a/trunk/drivers/gpio/gpio-mcp23s08.c +++ b/trunk/drivers/gpio/mcp23s08.c @@ -1,5 +1,5 @@ /* - * MCP23S08 SPI gpio expander driver + * mcp23s08.c - SPI gpio expander driver */ #include diff --git a/trunk/drivers/gpio/gpio-ml-ioh.c b/trunk/drivers/gpio/ml_ioh_gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-ml-ioh.c rename to trunk/drivers/gpio/ml_ioh_gpio.c diff --git a/trunk/drivers/gpio/gpio-pca953x.c b/trunk/drivers/gpio/pca953x.c similarity index 97% rename from trunk/drivers/gpio/gpio-pca953x.c rename to trunk/drivers/gpio/pca953x.c index 4b8446e98de5..0451d7ac94ac 100644 --- a/trunk/drivers/gpio/gpio-pca953x.c +++ b/trunk/drivers/gpio/pca953x.c @@ -1,5 +1,5 @@ /* - * PCA953x 4/8/16 bit I/O ports + * pca953x.c - 4/8/16 bit I/O ports * * Copyright (C) 2005 Ben Gardner * Copyright (C) 2007 Marvell International Ltd. @@ -437,7 +437,7 @@ static irqreturn_t pca953x_irq_handler(int irq, void *devid) do { level = __ffs(pending); - handle_nested_irq(level + chip->irq_base); + generic_handle_irq(level + chip->irq_base); pending &= ~(1 << level); } while (pending); @@ -474,19 +474,15 @@ static int pca953x_irq_setup(struct pca953x_chip *chip, * this purpose. */ chip->irq_stat &= chip->reg_direction; + chip->irq_base = pdata->irq_base; mutex_init(&chip->irq_lock); - chip->irq_base = irq_alloc_descs(-1, pdata->irq_base, chip->gpio_chip.ngpio, -1); - if (chip->irq_base < 0) - goto out_failed; - for (lvl = 0; lvl < chip->gpio_chip.ngpio; lvl++) { int irq = lvl + chip->irq_base; - irq_clear_status_flags(irq, IRQ_NOREQUEST); irq_set_chip_data(irq, chip); - irq_set_chip(irq, &pca953x_irq_chip); - irq_set_nested_thread(irq, true); + irq_set_chip_and_handler(irq, &pca953x_irq_chip, + handle_simple_irq); #ifdef CONFIG_ARM set_irq_flags(irq, IRQF_VALID); #else @@ -497,7 +493,8 @@ static int pca953x_irq_setup(struct pca953x_chip *chip, ret = request_threaded_irq(client->irq, NULL, pca953x_irq_handler, - IRQF_TRIGGER_LOW | IRQF_ONESHOT, + IRQF_TRIGGER_RISING | + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, dev_name(&client->dev), chip); if (ret) { dev_err(&client->dev, "failed to request irq %d\n", diff --git a/trunk/drivers/gpio/gpio-pcf857x.c b/trunk/drivers/gpio/pcf857x.c similarity index 99% rename from trunk/drivers/gpio/gpio-pcf857x.c rename to trunk/drivers/gpio/pcf857x.c index 7369fdda92b0..879b473aab5a 100644 --- a/trunk/drivers/gpio/gpio-pcf857x.c +++ b/trunk/drivers/gpio/pcf857x.c @@ -1,5 +1,5 @@ /* - * Driver for pcf857x, pca857x, and pca967x I2C GPIO expanders + * pcf857x - driver for pcf857x, pca857x, and pca967x I2C GPIO expanders * * Copyright (C) 2007 David Brownell * diff --git a/trunk/drivers/gpio/gpio-pch.c b/trunk/drivers/gpio/pch_gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-pch.c rename to trunk/drivers/gpio/pch_gpio.c diff --git a/trunk/drivers/gpio/gpio-pl061.c b/trunk/drivers/gpio/pl061.c similarity index 99% rename from trunk/drivers/gpio/gpio-pl061.c rename to trunk/drivers/gpio/pl061.c index 2c5a18f32bf3..6fcb28cdd862 100644 --- a/trunk/drivers/gpio/gpio-pl061.c +++ b/trunk/drivers/gpio/pl061.c @@ -1,5 +1,7 @@ /* - * Copyright (C) 2008, 2009 Provigent Ltd. + * linux/drivers/gpio/pl061.c + * + * Copyright (C) 2008, 2009 Provigent Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as diff --git a/trunk/drivers/gpio/gpio-rdc321x.c b/trunk/drivers/gpio/rdc321x-gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-rdc321x.c rename to trunk/drivers/gpio/rdc321x-gpio.c diff --git a/trunk/drivers/gpio/gpio-sch.c b/trunk/drivers/gpio/sch_gpio.c similarity index 99% rename from trunk/drivers/gpio/gpio-sch.c rename to trunk/drivers/gpio/sch_gpio.c index 163515845494..56060421cdff 100644 --- a/trunk/drivers/gpio/gpio-sch.c +++ b/trunk/drivers/gpio/sch_gpio.c @@ -1,5 +1,5 @@ /* - * GPIO interface for Intel Poulsbo SCH + * sch_gpio.c - GPIO interface for Intel Poulsbo SCH * * Copyright (c) 2010 CompuLab Ltd * Author: Denis Turischev diff --git a/trunk/drivers/gpio/gpio-stmpe.c b/trunk/drivers/gpio/stmpe-gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-stmpe.c rename to trunk/drivers/gpio/stmpe-gpio.c diff --git a/trunk/drivers/gpio/gpio-sx150x.c b/trunk/drivers/gpio/sx150x.c similarity index 100% rename from trunk/drivers/gpio/gpio-sx150x.c rename to trunk/drivers/gpio/sx150x.c diff --git a/trunk/drivers/gpio/gpio-tc3589x.c b/trunk/drivers/gpio/tc3589x-gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-tc3589x.c rename to trunk/drivers/gpio/tc3589x-gpio.c diff --git a/trunk/drivers/gpio/gpio-timberdale.c b/trunk/drivers/gpio/timbgpio.c similarity index 99% rename from trunk/drivers/gpio/gpio-timberdale.c rename to trunk/drivers/gpio/timbgpio.c index c593bd46bfb6..0265872e57d1 100644 --- a/trunk/drivers/gpio/gpio-timberdale.c +++ b/trunk/drivers/gpio/timbgpio.c @@ -1,5 +1,5 @@ /* - * Timberdale FPGA GPIO driver + * timbgpio.c timberdale FPGA GPIO driver * Copyright (c) 2009 Intel Corporation * * This program is free software; you can redistribute it and/or modify diff --git a/trunk/drivers/gpio/gpio-tps65910.c b/trunk/drivers/gpio/tps65910-gpio.c similarity index 98% rename from trunk/drivers/gpio/gpio-tps65910.c rename to trunk/drivers/gpio/tps65910-gpio.c index 41710332cb00..8d1ddfdd63eb 100644 --- a/trunk/drivers/gpio/gpio-tps65910.c +++ b/trunk/drivers/gpio/tps65910-gpio.c @@ -1,5 +1,5 @@ /* - * TI TPS6591x GPIO driver + * tps65910-gpio.c -- TI TPS6591x * * Copyright 2010 Texas Instruments Inc. * diff --git a/trunk/drivers/gpio/gpio-twl4030.c b/trunk/drivers/gpio/twl4030-gpio.c similarity index 99% rename from trunk/drivers/gpio/gpio-twl4030.c rename to trunk/drivers/gpio/twl4030-gpio.c index b8b4f228757c..57635ac35a73 100644 --- a/trunk/drivers/gpio/gpio-twl4030.c +++ b/trunk/drivers/gpio/twl4030-gpio.c @@ -1,5 +1,5 @@ /* - * Access to GPIOs on TWL4030/TPS659x0 chips + * twl4030_gpio.c -- access to GPIOs on TWL4030/TPS659x0 chips * * Copyright (C) 2006-2007 Texas Instruments, Inc. * Copyright (C) 2006 MontaVista Software, Inc. diff --git a/trunk/drivers/gpio/gpio-ucb1400.c b/trunk/drivers/gpio/ucb1400_gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-ucb1400.c rename to trunk/drivers/gpio/ucb1400_gpio.c diff --git a/trunk/drivers/gpio/gpio-vr41xx.c b/trunk/drivers/gpio/vr41xx_giu.c similarity index 99% rename from trunk/drivers/gpio/gpio-vr41xx.c rename to trunk/drivers/gpio/vr41xx_giu.c index 98723cb9ac68..a365be040b36 100644 --- a/trunk/drivers/gpio/gpio-vr41xx.c +++ b/trunk/drivers/gpio/vr41xx_giu.c @@ -518,7 +518,7 @@ static int __devinit giu_probe(struct platform_device *pdev) if (!res) return -EBUSY; - giu_base = ioremap(res->start, resource_size(res)); + giu_base = ioremap(res->start, res->end - res->start + 1); if (!giu_base) return -ENOMEM; diff --git a/trunk/drivers/gpio/gpio-vx855.c b/trunk/drivers/gpio/vx855_gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-vx855.c rename to trunk/drivers/gpio/vx855_gpio.c diff --git a/trunk/drivers/gpio/gpio-wm831x.c b/trunk/drivers/gpio/wm831x-gpio.c similarity index 99% rename from trunk/drivers/gpio/gpio-wm831x.c rename to trunk/drivers/gpio/wm831x-gpio.c index 31a9ed7bba83..309644cf4d9b 100644 --- a/trunk/drivers/gpio/gpio-wm831x.c +++ b/trunk/drivers/gpio/wm831x-gpio.c @@ -1,5 +1,5 @@ /* - * gpiolib support for Wolfson WM831x PMICs + * wm831x-gpio.c -- gpiolib support for Wolfson WM831x PMICs * * Copyright 2009 Wolfson Microelectronics PLC. * diff --git a/trunk/drivers/gpio/gpio-wm8350.c b/trunk/drivers/gpio/wm8350-gpiolib.c similarity index 98% rename from trunk/drivers/gpio/gpio-wm8350.c rename to trunk/drivers/gpio/wm8350-gpiolib.c index a06af5154838..359999290f55 100644 --- a/trunk/drivers/gpio/gpio-wm8350.c +++ b/trunk/drivers/gpio/wm8350-gpiolib.c @@ -1,5 +1,5 @@ /* - * gpiolib support for Wolfson WM835x PMICs + * wm835x-gpiolib.c -- gpiolib support for Wolfson WM835x PMICs * * Copyright 2009 Wolfson Microelectronics PLC. * diff --git a/trunk/drivers/gpio/gpio-wm8994.c b/trunk/drivers/gpio/wm8994-gpio.c similarity index 99% rename from trunk/drivers/gpio/gpio-wm8994.c rename to trunk/drivers/gpio/wm8994-gpio.c index 96198f3fab73..c822baacd8fc 100644 --- a/trunk/drivers/gpio/gpio-wm8994.c +++ b/trunk/drivers/gpio/wm8994-gpio.c @@ -1,5 +1,5 @@ /* - * gpiolib support for Wolfson WM8994 + * wm8994-gpio.c -- gpiolib support for Wolfson WM8994 * * Copyright 2009 Wolfson Microelectronics PLC. * diff --git a/trunk/drivers/gpio/gpio-xilinx.c b/trunk/drivers/gpio/xilinx_gpio.c similarity index 100% rename from trunk/drivers/gpio/gpio-xilinx.c rename to trunk/drivers/gpio/xilinx_gpio.c diff --git a/trunk/drivers/leds/Kconfig b/trunk/drivers/leds/Kconfig index 9d7d9400bbf5..23f0d5e99f35 100644 --- a/trunk/drivers/leds/Kconfig +++ b/trunk/drivers/leds/Kconfig @@ -93,7 +93,7 @@ config LEDS_NET48XX config LEDS_NET5501 tristate "LED Support for Soekris net5501 series Error LED" depends on LEDS_TRIGGERS - depends on X86 && GPIO_CS5535 + depends on X86 && LEDS_GPIO_PLATFORM && GPIO_CS5535 select LEDS_TRIGGER_DEFAULT_ON default n help @@ -183,6 +183,23 @@ config LEDS_GPIO defined as platform devices and/or OpenFirmware platform devices. The code to use these bindings can be selected below. +config LEDS_GPIO_PLATFORM + bool "Platform device bindings for GPIO LEDs" + depends on LEDS_GPIO + default y + help + Let the leds-gpio driver drive LEDs which have been defined as + platform devices. If you don't know what this means, say yes. + +config LEDS_GPIO_OF + bool "OpenFirmware platform device bindings for GPIO LEDs" + depends on LEDS_GPIO && OF_DEVICE + default y + help + Let the leds-gpio driver drive LEDs which have been defined as + of_platform devices. For instance, LEDs which are listed in a "dts" + file. + config LEDS_LP3944 tristate "LED Support for N.S. LP3944 (Fun Light) I2C chip" depends on LEDS_CLASS diff --git a/trunk/drivers/leds/leds-gpio.c b/trunk/drivers/leds/leds-gpio.c index 3d8bc327a68d..b0480c8fbcbf 100644 --- a/trunk/drivers/leds/leds-gpio.c +++ b/trunk/drivers/leds/leds-gpio.c @@ -165,7 +165,7 @@ static inline int sizeof_gpio_leds_priv(int num_leds) } /* Code to create from OpenFirmware platform devices */ -#ifdef CONFIG_OF_GPIO +#ifdef CONFIG_LEDS_GPIO_OF static struct gpio_leds_priv * __devinit gpio_leds_create_of(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node, *child; @@ -223,13 +223,13 @@ static const struct of_device_id of_gpio_leds_match[] = { { .compatible = "gpio-leds", }, {}, }; -#else /* CONFIG_OF_GPIO */ +#else static struct gpio_leds_priv * __devinit gpio_leds_create_of(struct platform_device *pdev) { return NULL; } #define of_gpio_leds_match NULL -#endif /* CONFIG_OF_GPIO */ +#endif static int __devinit gpio_led_probe(struct platform_device *pdev) diff --git a/trunk/include/linux/spi/74x164.h b/trunk/include/linux/spi/74x164.h index 0aa6acc73317..d85c52f294a0 100644 --- a/trunk/include/linux/spi/74x164.h +++ b/trunk/include/linux/spi/74x164.h @@ -1,6 +1,8 @@ #ifndef LINUX_SPI_74X164_H #define LINUX_SPI_74X164_H +#define GEN_74X164_DRIVER_NAME "74x164" + struct gen_74x164_chip_platform_data { /* number assigned to the first GPIO */ unsigned base;