From: mcuos.com@gmail.com (Wan ZongShun)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH 3/5] w90x900: convert to basic-mmio-gpio
Date: Mon, 11 Apr 2011 22:27:56 +0800 [thread overview]
Message-ID: <BANLkTincujypx04vpogGyZ8c0SDz9uUUrg@mail.gmail.com> (raw)
In-Reply-To: <1302522502-24381-4-git-send-email-jamie@jamieiles.com>
2011/4/11 Jamie Iles <jamie@jamieiles.com>:
> 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 <mcuos.com@gmail.com>
> Signed-off-by: Jamie Iles <jamie@jamieiles.com>
Acked-by: Wan ZongShun <mcuos.com@gmail.com>
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 <linux/clk.h>
> -#include <linux/errno.h>
> -#include <linux/interrupt.h>
> -#include <linux/irq.h>
> -#include <linux/debugfs.h>
> -#include <linux/seq_file.h>
> +#include <linux/basic_mmio_gpio.h>
> +#include <linux/err.h>
> ?#include <linux/kernel.h>
> -#include <linux/list.h>
> ?#include <linux/module.h>
> -#include <linux/io.h>
> ?#include <linux/gpio.h>
> +#include <linux/platform_device.h>
>
> ?#include <mach/hardware.h>
>
> -#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
next prev parent reply other threads:[~2011-04-11 14:27 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-11 11:48 [RFC PATCH 0/5] Convert some ARM platforms to basic-mmio-gpio Jamie Iles
2011-04-11 11:48 ` [RFC PATCH 1/5] gemini: convert " Jamie Iles
2011-04-12 14:37 ` Anton Vorontsov
2011-04-12 15:01 ` Jamie Iles
2011-04-13 11:46 ` Sergei Shtylyov
2011-04-11 11:48 ` [RFC PATCH 2/5] sa1100: " Jamie Iles
2011-04-11 16:00 ` Jamie Iles
2011-04-11 11:48 ` [RFC PATCH 3/5] w90x900: " Jamie Iles
2011-04-11 14:27 ` Wan ZongShun [this message]
2011-06-10 12:50 ` Jamie Iles
2011-04-11 11:48 ` [RFC PATCH 4/5] iop: " Jamie Iles
2011-04-11 11:48 ` [RFC PATCH 5/5] mxc: " Jamie Iles
2011-04-11 13:43 ` [RFC PATCH 0/5] Convert some ARM platforms " Uwe Kleine-König
2011-04-11 13:52 ` Jamie Iles
2011-04-11 14:23 ` Uwe Kleine-König
2011-04-11 14:33 ` Jamie Iles
2011-04-11 14:49 ` Uwe Kleine-König
2011-04-11 15:13 ` Jamie Iles
2011-04-12 15:06 ` Anton Vorontsov
2011-04-11 15:17 ` Linus Walleij
2011-04-11 15:21 ` Jamie Iles
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BANLkTincujypx04vpogGyZ8c0SDz9uUUrg@mail.gmail.com \
--to=mcuos.com@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).