Signed-off-by: Alexander Shiyan <shc_work@xxxxxxx> --- 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 *)®s); 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 barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox