From mboxrd@z Thu Jan 1 00:00:00 1970 From: mcuos.com@gmail.com (Wan ZongShun) Date: Mon, 11 Apr 2011 22:27:56 +0800 Subject: [RFC PATCH 3/5] w90x900: convert to basic-mmio-gpio In-Reply-To: <1302522502-24381-4-git-send-email-jamie@jamieiles.com> References: <1302522502-24381-1-git-send-email-jamie@jamieiles.com> <1302522502-24381-4-git-send-email-jamie@jamieiles.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org 2011/4/11 Jamie Iles : > The basic-mmio-gpio driver is capable of supporting this controller so > convert the platform to use it for basic GPIO support. > > Cc: Wan ZongShun > Signed-off-by: Jamie Iles Acked-by: Wan ZongShun Thanks, so you can submit it to Russell for merging. > --- > ?arch/arm/mach-w90x900/gpio.c | ?162 +++++++++++------------------------------- > ?1 files changed, 43 insertions(+), 119 deletions(-) > > diff --git a/arch/arm/mach-w90x900/gpio.c b/arch/arm/mach-w90x900/gpio.c > index ba05aec..5dd7efe 100644 > --- a/arch/arm/mach-w90x900/gpio.c > +++ b/arch/arm/mach-w90x900/gpio.c > @@ -10,145 +10,69 @@ > ?* published by the Free Software Foundation. > ?*/ > > -#include > -#include > -#include > -#include > -#include > -#include > +#include > +#include > ?#include > -#include > ?#include > -#include > ?#include > +#include > > ?#include > > -#define GPIO_BASE ? ? ? ? ? ? ?(W90X900_VA_GPIO) > ?#define GPIO_DIR ? ? ? ? ? ? ? (0x04) > ?#define GPIO_OUT ? ? ? ? ? ? ? (0x08) > ?#define GPIO_IN ? ? ? ? ? ? ? ? ? ? ? ?(0x0C) > ?#define GROUPINERV ? ? ? ? ? ? (0x10) > -#define GPIO_GPIO(Nb) ? ? ? ? ?(0x00000001 << (Nb)) > -#define to_nuc900_gpio_chip(c) container_of(c, struct nuc900_gpio_chip, chip) > > -#define NUC900_GPIO_CHIP(name, base_gpio, nr_gpio) ? ? ? ? ? ? ? ? ? ? \ > - ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ > - ? ? ? ? ? ? ? .chip = { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ > - ? ? ? ? ? ? ? ? ? ? ? .label ? ? ? ? ? ?= name, ? ? ? ? ? ? ? ? ? ? ? \ > - ? ? ? ? ? ? ? ? ? ? ? .direction_input ?= nuc900_dir_input, ? ? ? ? ? \ > - ? ? ? ? ? ? ? ? ? ? ? .direction_output = nuc900_dir_output, ? ? ? ? ?\ > - ? ? ? ? ? ? ? ? ? ? ? .get ? ? ? ? ? ? ?= nuc900_gpio_get, ? ? ? ? ? ?\ > - ? ? ? ? ? ? ? ? ? ? ? .set ? ? ? ? ? ? ?= nuc900_gpio_set, ? ? ? ? ? ?\ > - ? ? ? ? ? ? ? ? ? ? ? .base ? ? ? ? ? ? = base_gpio, ? ? ? ? ? ? ? ? ?\ > - ? ? ? ? ? ? ? ? ? ? ? .ngpio ? ? ? ? ? ?= nr_gpio, ? ? ? ? ? ? ? ? ? ?\ > - ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ > +#define GPIO_RES(__name, __addr) \ > + ? ? ? { \ > + ? ? ? ? ? ? ? .start = (__addr), \ > + ? ? ? ? ? ? ? .end = (__addr) + 0x3, \ > + ? ? ? ? ? ? ? .flags = IORESOURCE_MEM, \ > + ? ? ? ? ? ? ? .name = #__name, \ > ? ? ? ?} > > -struct nuc900_gpio_chip { > - ? ? ? struct gpio_chip ? ? ? ?chip; > - ? ? ? void __iomem ? ? ? ? ? ?*regbase; ? ? ? /* Base of group register*/ > - ? ? ? spinlock_t ? ? ? ? ? ? ?gpio_lock; > -}; > - > -static int nuc900_gpio_get(struct gpio_chip *chip, unsigned offset) > -{ > - ? ? ? struct nuc900_gpio_chip *nuc900_gpio = to_nuc900_gpio_chip(chip); > - ? ? ? void __iomem *pio = nuc900_gpio->regbase + GPIO_IN; > - ? ? ? unsigned int regval; > - > - ? ? ? regval = __raw_readl(pio); > - ? ? ? regval &= GPIO_GPIO(offset); > - > - ? ? ? return (regval != 0); > -} > - > -static void nuc900_gpio_set(struct gpio_chip *chip, unsigned offset, int val) > -{ > - ? ? ? struct nuc900_gpio_chip *nuc900_gpio = to_nuc900_gpio_chip(chip); > - ? ? ? void __iomem *pio = nuc900_gpio->regbase + GPIO_OUT; > - ? ? ? unsigned int regval; > - ? ? ? unsigned long flags; > - > - ? ? ? spin_lock_irqsave(&nuc900_gpio->gpio_lock, flags); > - > - ? ? ? regval = __raw_readl(pio); > - > - ? ? ? if (val) > - ? ? ? ? ? ? ? regval |= GPIO_GPIO(offset); > - ? ? ? else > - ? ? ? ? ? ? ? regval &= ~GPIO_GPIO(offset); > - > - ? ? ? __raw_writel(regval, pio); > - > - ? ? ? spin_unlock_irqrestore(&nuc900_gpio->gpio_lock, flags); > -} > - > -static int nuc900_dir_input(struct gpio_chip *chip, unsigned offset) > -{ > - ? ? ? struct nuc900_gpio_chip *nuc900_gpio = to_nuc900_gpio_chip(chip); > - ? ? ? void __iomem *pio = nuc900_gpio->regbase + GPIO_DIR; > - ? ? ? unsigned int regval; > - ? ? ? unsigned long flags; > - > - ? ? ? spin_lock_irqsave(&nuc900_gpio->gpio_lock, flags); > - > - ? ? ? regval = __raw_readl(pio); > - ? ? ? regval &= ~GPIO_GPIO(offset); > - ? ? ? __raw_writel(regval, pio); > - > - ? ? ? spin_unlock_irqrestore(&nuc900_gpio->gpio_lock, flags); > - > - ? ? ? return 0; > -} > - > -static int nuc900_dir_output(struct gpio_chip *chip, unsigned offset, int val) > -{ > - ? ? ? struct nuc900_gpio_chip *nuc900_gpio = to_nuc900_gpio_chip(chip); > - ? ? ? void __iomem *outreg = nuc900_gpio->regbase + GPIO_OUT; > - ? ? ? void __iomem *pio = nuc900_gpio->regbase + GPIO_DIR; > - ? ? ? unsigned int regval; > - ? ? ? unsigned long flags; > - > - ? ? ? spin_lock_irqsave(&nuc900_gpio->gpio_lock, flags); > - > - ? ? ? regval = __raw_readl(pio); > - ? ? ? regval |= GPIO_GPIO(offset); > - ? ? ? __raw_writel(regval, pio); > - > - ? ? ? regval = __raw_readl(outreg); > - > - ? ? ? if (val) > - ? ? ? ? ? ? ? regval |= GPIO_GPIO(offset); > - ? ? ? else > - ? ? ? ? ? ? ? regval &= ~GPIO_GPIO(offset); > - > - ? ? ? __raw_writel(regval, outreg); > - > - ? ? ? spin_unlock_irqrestore(&nuc900_gpio->gpio_lock, flags); > - > - ? ? ? return 0; > -} > +#define NUC900_GPIO_BANK(base_gpio, nr_gpio) ? ? ? ? ? ? ? ? ? \ > + ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ > + ? ? ? ? ? ? ? .ngpio ?= (nr_gpio), ? ? ? ? ? ? ? ? ? ? ? ? ? ?\ > + ? ? ? ? ? ? ? .base ? = (base_gpio), ? ? ? ? ? ? ? ? ? ? ? ? ?\ > + ? ? ? } > > -static struct nuc900_gpio_chip nuc900_gpio[] = { > - ? ? ? NUC900_GPIO_CHIP("GROUPC", 0, 16), > - ? ? ? NUC900_GPIO_CHIP("GROUPD", 16, 10), > - ? ? ? NUC900_GPIO_CHIP("GROUPE", 26, 14), > - ? ? ? NUC900_GPIO_CHIP("GROUPF", 40, 10), > - ? ? ? NUC900_GPIO_CHIP("GROUPG", 50, 17), > - ? ? ? NUC900_GPIO_CHIP("GROUPH", 67, 8), > - ? ? ? NUC900_GPIO_CHIP("GROUPI", 75, 17), > +struct nuc900_gpio_bank { > + ? ? ? unsigned int ? ? ? ? ? ?base; > + ? ? ? unsigned int ? ? ? ? ? ?ngpio; > ?}; > > ?void __init nuc900_init_gpio(int nr_group) > ?{ > ? ? ? ?unsigned ? ? ? ?i; > - ? ? ? struct nuc900_gpio_chip *gpio_chip; > + > + ? ? ? struct nuc900_gpio_bank nuc900_gpio[] = { > + ? ? ? ? ? ? ? NUC900_GPIO_BANK(0, 16), > + ? ? ? ? ? ? ? NUC900_GPIO_BANK(16, 10), > + ? ? ? ? ? ? ? NUC900_GPIO_BANK(26, 14), > + ? ? ? ? ? ? ? NUC900_GPIO_BANK(40, 10), > + ? ? ? ? ? ? ? NUC900_GPIO_BANK(50, 17), > + ? ? ? ? ? ? ? NUC900_GPIO_BANK(67, 8), > + ? ? ? ? ? ? ? NUC900_GPIO_BANK(75, 17), > + ? ? ? }; > > ? ? ? ?for (i = 0; i < nr_group; i++) { > - ? ? ? ? ? ? ? gpio_chip = &nuc900_gpio[i]; > - ? ? ? ? ? ? ? spin_lock_init(&gpio_chip->gpio_lock); > - ? ? ? ? ? ? ? gpio_chip->regbase = GPIO_BASE + i * GROUPINERV; > - ? ? ? ? ? ? ? gpiochip_add(&gpio_chip->chip); > + ? ? ? ? ? ? ? unsigned long addr = W90X900_PA_GPIO + i * GROUPINERV; > + ? ? ? ? ? ? ? struct resource res[] = { > + ? ? ? ? ? ? ? ? ? ? ? GPIO_RES(dat, addr + GPIO_IN), > + ? ? ? ? ? ? ? ? ? ? ? GPIO_RES(set, addr + GPIO_OUT), > + ? ? ? ? ? ? ? ? ? ? ? GPIO_RES(dirout, addr + GPIO_DIR), > + ? ? ? ? ? ? ? }; > + ? ? ? ? ? ? ? struct bgpio_pdata pdata = { > + ? ? ? ? ? ? ? ? ? ? ? .ngpio ?= nuc900_gpio[i].ngpio, > + ? ? ? ? ? ? ? ? ? ? ? .base ? = nuc900_gpio[i].base, > + ? ? ? ? ? ? ? }; > + ? ? ? ? ? ? ? struct platform_device *pdev; > + > + ? ? ? ? ? ? ? pdev = platform_device_register_resndata(NULL, > + ? ? ? ? ? ? ? ? ? ? ? "basic-mmio-gpio", i, res, ARRAY_SIZE(res), &pdata, > + ? ? ? ? ? ? ? ? ? ? ? sizeof(pdata)); > + ? ? ? ? ? ? ? WARN_ON(IS_ERR(pdev)); > ? ? ? ?} > ?} > -- > 1.7.4.2 > > -- *linux-arm-kernel mailing list mail addr:linux-arm-kernel at lists.infradead.org you can subscribe by: http://lists.infradead.org/mailman/listinfo/linux-arm-kernel * linux-arm-NUC900 mailing list mail addr:NUC900 at googlegroups.com main web: https://groups.google.com/group/NUC900 you can subscribe it by sending me mail: mcuos.com at gmail.com