All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH V2 1/3] gpio: Add DW APB GPIO driver
Date: Wed, 12 Aug 2015 22:29:39 +0200	[thread overview]
Message-ID: <201508122229.39296.marex@denx.de> (raw)
In-Reply-To: <CAPnjgZ1pmXJMQKu45TN5jvUNRwH6oOMOCsaKkqUhTUtfroQbSg@mail.gmail.com>

On Wednesday, August 12, 2015 at 04:15:00 PM, Simon Glass wrote:
> Hi Marek,
> 
> On 10 August 2015 at 09:30, Marek Vasut <marex@denx.de> wrote:
> > Add driver for the DesignWare APB GPIO IP block.
> > This driver is DM capable and probes from DT.
> > 
> > Signed-off-by: Marek Vasut <marex@denx.de>
> > Cc: Simon Glass <sjg@chromium.org>
> > ---
> > 
> >  drivers/gpio/Kconfig      |   7 ++
> >  drivers/gpio/Makefile     |   1 +
> >  drivers/gpio/dwapb_gpio.c | 167
> >  ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 175
> >  insertions(+)
> >  create mode 100644 drivers/gpio/dwapb_gpio.c
> 
> Reviewed-by: Simon Glass <sjg@chromium.org>
> 
> Please see nits/suggestions below.
> 
> Are you going to submit a GPIO binding change for this?

You mean for the bank-name ? Yes, I think it only makes sense to do it.

> > V2: Obtain the bank name from the "bank-name" property instead.
> > 
> > diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> > index 0c43777..c04388d 100644
> > --- a/drivers/gpio/Kconfig
> > +++ b/drivers/gpio/Kconfig
> > @@ -8,6 +8,13 @@ config DM_GPIO
> > 
> >           particular GPIOs that they provide. The uclass interface
> >           is defined in include/asm-generic/gpio.h.
> > 
> > +config DWAPB_GPIO
> > +       bool "DWAPB GPIO driver"
> > +       depends on DM && DM_GPIO
> > +       default n
> > +       help
> > +         Support for the Designware APB GPIO driver.
> 
> You could expand this to talk about bank naming, features supported,
> chips which use it.

Done

> > +
> > 
> >  config LPC32XX_GPIO
> >  
> >         bool "LPC32XX GPIO driver"
> >         depends on DM
> > 
> > diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
> > index 67c6374..603c96b 100644
> > --- a/drivers/gpio/Makefile
> > +++ b/drivers/gpio/Makefile
> > @@ -6,6 +6,7 @@
> > 
> >  #
> >  
> >  ifndef CONFIG_SPL_BUILD
> > 
> > +obj-$(CONFIG_DWAPB_GPIO)       += dwapb_gpio.o
> > 
> >  obj-$(CONFIG_AXP_GPIO)         += axp_gpio.o
> >  endif
> >  obj-$(CONFIG_DM_GPIO)          += gpio-uclass.o
> > 
> > diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c
> > new file mode 100644
> > index 0000000..72cec48
> > --- /dev/null
> > +++ b/drivers/gpio/dwapb_gpio.c
> > @@ -0,0 +1,167 @@
> > +/*
> > + * (C) Copyright 2015 Marek Vasut <marex@denx.de>
> > + *
> > + * DesignWare APB GPIO driver
> > + *
> > + * SPDX-License-Identifier:    GPL-2.0+
> > + */
> > +
> > +#include <common.h>
> > +#include <malloc.h>
> > +#include <asm/arch/gpio.h>
> > +#include <asm/gpio.h>
> > +#include <asm/io.h>
> > +#include <dm.h>
> > +#include <dm/device-internal.h>
> > +#include <dm/lists.h>
> > +#include <dm/root.h>
> > +#include <errno.h>
> 
> should go just below common.h

Yup

> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +#define GPIO_SWPORTA_DR                0x00
> > +#define GPIO_SWPORTA_DDR       0x04
> > +#define GPIO_INTEN             0x30
> > +#define GPIO_INTMASK           0x34
> > +#define GPIO_INTTYPE_LEVEL     0x38
> > +#define GPIO_INT_POLARITY      0x3c
> > +#define GPIO_INTSTATUS         0x40
> > +#define GPIO_PORTA_DEBOUNCE    0x48
> > +#define GPIO_PORTA_EOI         0x4c
> > +#define GPIO_EXT_PORTA         0x50
> 
> What's the deal with C structures? Has the policy on this changed? I
> can't help thinking that your GPIO_ prefix is unnecessary.

I think we don't do that anymore. The GPIO_ stuff is copied from Linux.

> > +
> > +struct gpio_dwapb_platdata {
> > +       const char      *name;
> > +       int             bank;
> > +       int             pins;
> > +       fdt_addr_t      base;
> > +};
> > +
> > +static int dwapb_gpio_direction_input(struct udevice *dev, unsigned pin)
> > +{
> > +       struct gpio_dwapb_platdata *plat = dev_get_platdata(dev);
> > +
> > +       clrbits_le32(plat->base + GPIO_SWPORTA_DDR, 1 << pin);
> > +       return 0;
> > +}
> > +
> > +static int dwapb_gpio_direction_output(struct udevice *dev, unsigned
> > pin, +                                    int val)
> > +{
> > +       struct gpio_dwapb_platdata *plat = dev_get_platdata(dev);
> > +
> > +       setbits_le32(plat->base + GPIO_SWPORTA_DDR, 1 << pin);
> > +
> > +       if (val)
> > +               setbits_le32(plat->base + GPIO_SWPORTA_DR, 1 << pin);
> > +       else
> > +               clrbits_le32(plat->base + GPIO_SWPORTA_DR, 1 << pin);
> > +
> > +       return 0;
> > +}
> > +
> > +static int dwapb_gpio_get_value(struct udevice *dev, unsigned pin)
> > +{
> > +       struct gpio_dwapb_platdata *plat = dev_get_platdata(dev);
> > +       return !!(readl(plat->base + GPIO_EXT_PORTA) & (1 << pin));
> > +}
> > +
> > +
> > +static int dwapb_gpio_set_value(struct udevice *dev, unsigned pin, int
> > val) +{
> > +       struct gpio_dwapb_platdata *plat = dev_get_platdata(dev);
> > +
> > +       if (val)
> > +               setbits_le32(plat->base + GPIO_SWPORTA_DR, 1 << pin);
> > +       else
> > +               clrbits_le32(plat->base + GPIO_SWPORTA_DR, 1 << pin);
> > +
> > +       return 0;
> > +}
> > +
> > +static const struct dm_gpio_ops gpio_dwapb_ops = {
> > +       .direction_input        = dwapb_gpio_direction_input,
> > +       .direction_output       = dwapb_gpio_direction_output,
> > +       .get_value              = dwapb_gpio_get_value,
> > +       .set_value              = dwapb_gpio_set_value,
> > +};
> > +
> > +static int gpio_dwapb_probe(struct udevice *dev)
> > +{
> > +       struct gpio_dev_priv *priv = dev_get_uclass_priv(dev);
> > +       struct gpio_dwapb_platdata *plat = dev->platdata;
> > +
> > +       if (!plat)
> > +               return 0;
> > +
> > +       priv->gpio_count = plat->pins;
> > +       priv->bank_name = plat->name;
> > +
> > +       return 0;
> > +}
> > +
> > +static int gpio_dwapb_bind(struct udevice *dev)
> > +{
> > +       struct gpio_dwapb_platdata *plat = dev_get_platdata(dev);
> > +       const void *blob = gd->fdt_blob;
> > +       struct udevice *subdev;
> > +       fdt_addr_t base;
> > +       int ret, node, bank = 0;
> > +
> > +       /* If this is a child device, there is nothing to do here */
> > +       if (plat)
> > +               return 0;
> > +
> > +       base = fdtdec_get_addr(blob, dev->of_offset, "reg");
> > +       if (base == FDT_ADDR_T_NONE) {
> > +               debug("Can't get the GPIO register base address\n");
> > +               return -ENXIO;
> 
> -EINVAL I think, since this is an invalid parameter

OK

[...]

  parent reply	other threads:[~2015-08-12 20:29 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-10 15:30 [U-Boot] [PATCH V2 1/3] gpio: Add DW APB GPIO driver Marek Vasut
2015-08-10 15:30 ` [U-Boot] [PATCH 2/3] arm: socfpga: dts: Add bank-name property to each GPIO bank Marek Vasut
2015-08-12 14:15   ` Simon Glass
2015-08-10 15:30 ` [U-Boot] [PATCH 3/3] arm: socfpga: Enable DWAPB GPIO driver Marek Vasut
2015-08-12 14:15   ` Simon Glass
2015-08-12 14:15 ` [U-Boot] [PATCH V2 1/3] gpio: Add DW APB " Simon Glass
2015-08-12 14:24   ` Fabio Estevam
2015-08-12 17:24     ` Simon Glass
2015-08-12 20:29   ` Marek Vasut [this message]
2015-08-12 20:32   ` [U-Boot] [PATCH V3 " Marek Vasut

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=201508122229.39296.marex@denx.de \
    --to=marex@denx.de \
    --cc=u-boot@lists.denx.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.