Signed-off-by: Alexander Shiyan <[email protected]>
---
 arch/arm/Kconfig        |   1 -
 drivers/gpio/Kconfig    |   1 +
 drivers/gpio/gpio-imx.c | 125 ++++++++++++------------------------------------
 3 files changed, 31 insertions(+), 96 deletions(-)

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index bb9b47b..5607754 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -72,7 +72,6 @@ config ARCH_HIGHBANK
 
 config ARCH_IMX
        bool "Freescale iMX-based"
-       select GENERIC_GPIO
        select GPIOLIB
        select COMMON_CLK
        select CLKDEV_LOOKUP
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 74a4baa..5ccd35b 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -29,6 +29,7 @@ config GPIO_GENERIC_PLATFORM
 
 config GPIO_IMX
        def_bool ARCH_IMX
+       select GPIO_GENERIC
 
 config GPIO_PL061
        bool "PrimeCell PL061 GPIO support"
diff --git a/drivers/gpio/gpio-imx.c b/drivers/gpio/gpio-imx.c
index 1bf4100..9dcabfc 100644
--- a/drivers/gpio/gpio-imx.c
+++ b/drivers/gpio/gpio-imx.c
@@ -20,17 +20,11 @@
  *
  */
 
-#include <common.h>
-#include <errno.h>
-#include <io.h>
-#include <gpio.h>
 #include <init.h>
+#include <common.h>
+#include <malloc.h>
 
-struct imx_gpio_chip {
-       void __iomem *base;
-       struct gpio_chip chip;
-       struct imx_gpio_regs *regs;
-};
+#include <linux/basic_mmio_gpio.h>
 
 struct imx_gpio_regs {
        unsigned int dr;
@@ -50,104 +44,45 @@ static struct imx_gpio_regs regs_imx31 = {
        .psr = 0x08,
 };
 
-static void imx_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int 
value)
-{
-       struct imx_gpio_chip *imxgpio = container_of(chip, struct 
imx_gpio_chip, chip);
-       void __iomem *base = imxgpio->base;
-       u32 val;
-
-       if (!base)
-               return;
-
-       val = readl(base + imxgpio->regs->dr);
-
-       if (value)
-               val |= 1 << gpio;
-       else
-               val &= ~(1 << gpio);
-
-       writel(val, base + imxgpio->regs->dr);
-}
-
-static int imx_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
-{
-       struct imx_gpio_chip *imxgpio = container_of(chip, struct 
imx_gpio_chip, chip);
-       void __iomem *base = imxgpio->base;
-       u32 val;
-
-       if (!base)
-               return -EINVAL;
-
-       val = readl(base + imxgpio->regs->gdir);
-       val &= ~(1 << gpio);
-       writel(val, base + imxgpio->regs->gdir);
-
-       return 0;
-}
-
-
-static int imx_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, 
int value)
-{
-       struct imx_gpio_chip *imxgpio = container_of(chip, struct 
imx_gpio_chip, chip);
-       void __iomem *base = imxgpio->base;
-       u32 val;
-
-       gpio_set_value(gpio + chip->base, value);
-
-       val = readl(base + imxgpio->regs->gdir);
-       val |= 1 << gpio;
-       writel(val, base + imxgpio->regs->gdir);
-
-       return 0;
-}
-
-static int imx_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
-{
-       struct imx_gpio_chip *imxgpio = container_of(chip, struct 
imx_gpio_chip, chip);
-       void __iomem *base = imxgpio->base;
-       u32 val;
-
-       val = readl(base + imxgpio->regs->psr);
-
-       return val & (1 << gpio) ? 1 : 0;
-}
-
-static struct gpio_ops imx_gpio_ops = {
-       .direction_input = imx_gpio_direction_input,
-       .direction_output = imx_gpio_direction_output,
-       .get = imx_gpio_get_value,
-       .set = imx_gpio_set_value,
-};
-
 static int imx_gpio_probe(struct device_d *dev)
 {
-       struct imx_gpio_chip *imxgpio;
        struct imx_gpio_regs *regs;
+       struct bgpio_chip *bgc;
+       void __iomem *base;
        int ret;
 
        ret = dev_get_drvdata(dev, (unsigned long *)&regs);
        if (ret)
                return ret;
 
-       imxgpio = xzalloc(sizeof(*imxgpio));
-       imxgpio->base = dev_request_mem_region(dev, 0);
-       imxgpio->chip.ops = &imx_gpio_ops;
-       if (dev->id < 0) {
-               imxgpio->chip.base = of_alias_get_id(dev->device_node, "gpio");
-               if (imxgpio->chip.base < 0)
-                       return imxgpio->chip.base;
-               imxgpio->chip.base *= 32;
-       } else {
-               imxgpio->chip.base = dev->id * 32;
+       bgc = xzalloc(sizeof(*bgc));
+       if (!bgc)
+               return -ENOMEM;
+
+       base = dev_request_mem_region(dev, 0);
+       if (!base) {
+               free(bgc);
+               return -EINVAL;
        }
-       imxgpio->chip.ngpio = 32;
-       imxgpio->chip.dev = dev;
-       imxgpio->regs = regs;
-       gpiochip_add(&imxgpio->chip);
 
-       dev_dbg(dev, "probed gpiochip%d with base %d\n", dev->id, 
imxgpio->chip.base);
+       ret = bgpio_init(bgc, dev, 4, base + regs->psr, base + regs->dr, NULL,
+                        base + regs->gdir, NULL, 0);
+       if (ret) {
+               free(bgc);
+               return ret;
+       }
 
-       return 0;
+       if (dev->id < 0) {
+               bgc->gc.base = of_alias_get_id(dev->device_node, "gpio");
+               if (bgc->gc.base < 0) {
+                       free(bgc);
+                       return bgc->gc.base;
+               }
+               bgc->gc.base *= 32;
+       } else
+               bgc->gc.base = dev->id * 32;
+
+       return gpiochip_add(&bgc->gc);
 }
 
 static __maybe_unused struct of_device_id imx_gpio_dt_ids[] = {
-- 
1.8.1.5


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to