Re: [PATCH] gpio: support for Synopsys DesignWare APB GPIO

From: Grant Likely
Date: Mon Apr 04 2011 - 22:49:01 EST


On Sun, Apr 03, 2011 at 04:22:44PM +0100, Jamie Iles wrote:
> Hi Grant,
>
> On Sun, Apr 03, 2011 at 08:47:25AM -0600, Grant Likely wrote:
> > On Sun, Apr 3, 2011 at 8:07 AM, Jamie Iles <jamie@xxxxxxxxxxxxx> wrote:
> > > My first idea would be to have something like:
> > >
> > > struct mmio_gpio_bank {
> > >        unsigned int            ngpio;
> > >        unsigned long           set_offs;
> > >        unsigned long           clr_offs;
> > >        unsigned long           dout_offs;
> > >        unsigned long           din_offs;
> > >        unsigned long           dir_offs;
> > > };
> > >
> > > struct mmio_gpio_pdata {
> > >        size_t                  bus_width_bits;
> > >        int                     gpio_base;
> > >        unsigned int            nr_banks;
> > >        struct mmio_gpio_bank   banks[];
> > > };
> >
> > As discussed earlier in the thread, you probably don't need to support
> > multiple banks with this driver. Instead, create a separate device
> > instance for each bank.
>
> The reason I proposed this was for controllers where the registers
> aren't grouped together for each bank. For example, the Synopsys block
> has:
>
> 0x00-0x08 bank A control registers
> 0x0c-0x14 bank B control registers
> ...
> 0x50 bank A input register
> 0x54 bank B input register.
>
> So when you mentioned before using a single register resource with
> offsets I understood it to be something like what I've proposed
> otherwise multiple banks would have overlapping resources (or the
> resource would just be used to indicate the start address rather than
> start + end).

That may be a problem for request_mem_region() which would indeed
prevent the driver from specifying the full register range with
offsets inside it. I suspect that the platform_bus_type will inhibit
two platform_devices with overlapping regions from getting registered.
Fair enough, that is a pretty strong argument for Anton's model. I
don't think it would be a good idea to try and work around it by
making the resource only include the start address.

It does mean some gymnastics for a device tree binding to figure out
which registers are present, but the appropriate behaviour could be
selected by a set of compatible values for each kind of register
interface.

>
> Also, it's not clear here but this would create one gpio_chip per bank.

And that's bad why? :-)

g.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/