Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-10 Thread Russell King - ARM Linux
On Fri, Aug 10, 2012 at 10:41:58AM +0200, Linus Walleij wrote:
> On Fri, Aug 10, 2012 at 10:35 AM, Thierry Reding
>  wrote:
> >> Consult the following article on LWN:
> >> http://lwn.net/Articles/470820/
> >>
> >> Then grep your gitlog and you'll see we got rid of it from ARM.
> >
> > Then why is there still the following in arch/arm/include/asm/irq.h?
> >
> > /*
> >  * Use this value to indicate lack of interrupt
> >  * capability
> >  */
> > #ifndef NO_IRQ
> > #define NO_IRQ  ((unsigned int)(-1))
> > #endif
> 
> That's a question for Russell but I think it's basically there for
> old platforms, on a "don't use it"-basis. (Maybe a comment could
> be good.)

Just don't use it.  It's there for old stuff which still needs fixing.

New code should not use it, and should test for one of:

irq <= 0
irq == 0

And new code should set irq = 0 to indicate a lack of interrupt.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-10 Thread Thierry Reding
On Fri, Aug 10, 2012 at 10:41:58AM +0200, Linus Walleij wrote:
> On Fri, Aug 10, 2012 at 10:35 AM, Thierry Reding
>  wrote:
> >> Consult the following article on LWN:
> >> http://lwn.net/Articles/470820/
> >>
> >> Then grep your gitlog and you'll see we got rid of it from ARM.
> >
> > Then why is there still the following in arch/arm/include/asm/irq.h?
> >
> > /*
> >  * Use this value to indicate lack of interrupt
> >  * capability
> >  */
> > #ifndef NO_IRQ
> > #define NO_IRQ  ((unsigned int)(-1))
> > #endif
> 
> That's a question for Russell but I think it's basically there for
> old platforms, on a "don't use it"-basis. (Maybe a comment could
> be good.)
> 
> As you see non-sparse platforms can redefine NO_IRQS in their
>  file, but in practice things like the VIC and GIC
> drivers have been switched over to using irqdomain which
> in turn does *not* allow IRQ 0 to be used, so most platforms
> are indirectly disallowed to use IRQ 0 anyway. In fact I think
> some of them are just broken now.

In that case it might be better to just drop it altogether and wait
until people with the broken platforms start complaining.

Thierry


pgpOCscxTQviC.pgp
Description: PGP signature


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-10 Thread Linus Walleij
On Fri, Aug 10, 2012 at 10:35 AM, Thierry Reding
 wrote:
>> Consult the following article on LWN:
>> http://lwn.net/Articles/470820/
>>
>> Then grep your gitlog and you'll see we got rid of it from ARM.
>
> Then why is there still the following in arch/arm/include/asm/irq.h?
>
> /*
>  * Use this value to indicate lack of interrupt
>  * capability
>  */
> #ifndef NO_IRQ
> #define NO_IRQ  ((unsigned int)(-1))
> #endif

That's a question for Russell but I think it's basically there for
old platforms, on a "don't use it"-basis. (Maybe a comment could
be good.)

As you see non-sparse platforms can redefine NO_IRQS in their
 file, but in practice things like the VIC and GIC
drivers have been switched over to using irqdomain which
in turn does *not* allow IRQ 0 to be used, so most platforms
are indirectly disallowed to use IRQ 0 anyway. In fact I think
some of them are just broken now.

>> If this driver is for some other arch like openrisc I might accept
>> it but please reconsider.
>
> There's nothing in the driver that makes it ARM specific, so it could be
> used on other platforms just as well.

The linked article makes it clear that the direction for the entire
kernel is to get rid of NO_IRQ and !irq is used all over the place.

> But as I also said in my previous
> mail, in this particular case the value for the interrupt comes from the
> call to irq_of_parse_and_map(), which will return 0 on failure,
> regardless of the architecture, so there is actually no problem.

OK cool.

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


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-10 Thread Thierry Reding
On Fri, Aug 10, 2012 at 10:19:02AM +0200, Linus Walleij wrote:
> On Thu, Aug 9, 2012 at 10:20 PM, Thierry Reding
>  wrote:
> > On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
> >> > +   client->irq = irq_of_parse_and_map(client->dev.of_node, 0);
> >> > +   if (client->irq == NO_IRQ)
> >>
> >> Just if (!client->irq) since NO_IRQ is 0 nowadays.
> >
> > At the risk of seeming pedantic, NO_IRQ is in fact quite often not 0.
> 
> No. A year back, yes, but not anymore. We went to great lengths in the
> ARM architecture to ensure NO_IRQ is *always 0. Russell spent
> a lot of time on this.
> 
> Consult the following article on LWN:
> http://lwn.net/Articles/470820/
> 
> Then grep your gitlog and you'll see we got rid of it from ARM.

Then why is there still the following in arch/arm/include/asm/irq.h?

/*
 * Use this value to indicate lack of interrupt
 * capability
 */
#ifndef NO_IRQ
#define NO_IRQ  ((unsigned int)(-1))
#endif

> If this driver is for some other arch like openrisc I might accept
> it but please reconsider.

There's nothing in the driver that makes it ARM specific, so it could be
used on other platforms just as well. But as I also said in my previous
mail, in this particular case the value for the interrupt comes from the
call to irq_of_parse_and_map(), which will return 0 on failure,
regardless of the architecture, so there is actually no problem.

Thierry


pgpoLpPlYj3ra.pgp
Description: PGP signature


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-10 Thread Linus Walleij
On Thu, Aug 9, 2012 at 10:20 PM, Thierry Reding
 wrote:
> On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
>> > +   client->irq = irq_of_parse_and_map(client->dev.of_node, 0);
>> > +   if (client->irq == NO_IRQ)
>>
>> Just if (!client->irq) since NO_IRQ is 0 nowadays.
>
> At the risk of seeming pedantic, NO_IRQ is in fact quite often not 0.

No. A year back, yes, but not anymore. We went to great lengths in the
ARM architecture to ensure NO_IRQ is *always 0. Russell spent
a lot of time on this.

Consult the following article on LWN:
http://lwn.net/Articles/470820/

Then grep your gitlog and you'll see we got rid of it from ARM.

If this driver is for some other arch like openrisc I might accept
it but please reconsider.

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


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-10 Thread Linus Walleij
On Thu, Aug 9, 2012 at 10:20 PM, Thierry Reding
thierry.red...@avionic-design.de wrote:
 On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
  +   client-irq = irq_of_parse_and_map(client-dev.of_node, 0);
  +   if (client-irq == NO_IRQ)

 Just if (!client-irq) since NO_IRQ is 0 nowadays.

 At the risk of seeming pedantic, NO_IRQ is in fact quite often not 0.

No. A year back, yes, but not anymore. We went to great lengths in the
ARM architecture to ensure NO_IRQ is *always 0. Russell spent
a lot of time on this.

Consult the following article on LWN:
http://lwn.net/Articles/470820/

Then grep your gitlog and you'll see we got rid of it from ARM.

If this driver is for some other arch like openrisc I might accept
it but please reconsider.

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


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-10 Thread Thierry Reding
On Fri, Aug 10, 2012 at 10:19:02AM +0200, Linus Walleij wrote:
 On Thu, Aug 9, 2012 at 10:20 PM, Thierry Reding
 thierry.red...@avionic-design.de wrote:
  On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
   +   client-irq = irq_of_parse_and_map(client-dev.of_node, 0);
   +   if (client-irq == NO_IRQ)
 
  Just if (!client-irq) since NO_IRQ is 0 nowadays.
 
  At the risk of seeming pedantic, NO_IRQ is in fact quite often not 0.
 
 No. A year back, yes, but not anymore. We went to great lengths in the
 ARM architecture to ensure NO_IRQ is *always 0. Russell spent
 a lot of time on this.
 
 Consult the following article on LWN:
 http://lwn.net/Articles/470820/
 
 Then grep your gitlog and you'll see we got rid of it from ARM.

Then why is there still the following in arch/arm/include/asm/irq.h?

/*
 * Use this value to indicate lack of interrupt
 * capability
 */
#ifndef NO_IRQ
#define NO_IRQ  ((unsigned int)(-1))
#endif

 If this driver is for some other arch like openrisc I might accept
 it but please reconsider.

There's nothing in the driver that makes it ARM specific, so it could be
used on other platforms just as well. But as I also said in my previous
mail, in this particular case the value for the interrupt comes from the
call to irq_of_parse_and_map(), which will return 0 on failure,
regardless of the architecture, so there is actually no problem.

Thierry


pgpoLpPlYj3ra.pgp
Description: PGP signature


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-10 Thread Linus Walleij
On Fri, Aug 10, 2012 at 10:35 AM, Thierry Reding
thierry.red...@avionic-design.de wrote:
 Consult the following article on LWN:
 http://lwn.net/Articles/470820/

 Then grep your gitlog and you'll see we got rid of it from ARM.

 Then why is there still the following in arch/arm/include/asm/irq.h?

 /*
  * Use this value to indicate lack of interrupt
  * capability
  */
 #ifndef NO_IRQ
 #define NO_IRQ  ((unsigned int)(-1))
 #endif

That's a question for Russell but I think it's basically there for
old platforms, on a don't use it-basis. (Maybe a comment could
be good.)

As you see non-sparse platforms can redefine NO_IRQS in their
mach/irqs.h file, but in practice things like the VIC and GIC
drivers have been switched over to using irqdomain which
in turn does *not* allow IRQ 0 to be used, so most platforms
are indirectly disallowed to use IRQ 0 anyway. In fact I think
some of them are just broken now.

 If this driver is for some other arch like openrisc I might accept
 it but please reconsider.

 There's nothing in the driver that makes it ARM specific, so it could be
 used on other platforms just as well.

The linked article makes it clear that the direction for the entire
kernel is to get rid of NO_IRQ and !irq is used all over the place.

 But as I also said in my previous
 mail, in this particular case the value for the interrupt comes from the
 call to irq_of_parse_and_map(), which will return 0 on failure,
 regardless of the architecture, so there is actually no problem.

OK cool.

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


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-10 Thread Thierry Reding
On Fri, Aug 10, 2012 at 10:41:58AM +0200, Linus Walleij wrote:
 On Fri, Aug 10, 2012 at 10:35 AM, Thierry Reding
 thierry.red...@avionic-design.de wrote:
  Consult the following article on LWN:
  http://lwn.net/Articles/470820/
 
  Then grep your gitlog and you'll see we got rid of it from ARM.
 
  Then why is there still the following in arch/arm/include/asm/irq.h?
 
  /*
   * Use this value to indicate lack of interrupt
   * capability
   */
  #ifndef NO_IRQ
  #define NO_IRQ  ((unsigned int)(-1))
  #endif
 
 That's a question for Russell but I think it's basically there for
 old platforms, on a don't use it-basis. (Maybe a comment could
 be good.)
 
 As you see non-sparse platforms can redefine NO_IRQS in their
 mach/irqs.h file, but in practice things like the VIC and GIC
 drivers have been switched over to using irqdomain which
 in turn does *not* allow IRQ 0 to be used, so most platforms
 are indirectly disallowed to use IRQ 0 anyway. In fact I think
 some of them are just broken now.

In that case it might be better to just drop it altogether and wait
until people with the broken platforms start complaining.

Thierry


pgpOCscxTQviC.pgp
Description: PGP signature


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-10 Thread Russell King - ARM Linux
On Fri, Aug 10, 2012 at 10:41:58AM +0200, Linus Walleij wrote:
 On Fri, Aug 10, 2012 at 10:35 AM, Thierry Reding
 thierry.red...@avionic-design.de wrote:
  Consult the following article on LWN:
  http://lwn.net/Articles/470820/
 
  Then grep your gitlog and you'll see we got rid of it from ARM.
 
  Then why is there still the following in arch/arm/include/asm/irq.h?
 
  /*
   * Use this value to indicate lack of interrupt
   * capability
   */
  #ifndef NO_IRQ
  #define NO_IRQ  ((unsigned int)(-1))
  #endif
 
 That's a question for Russell but I think it's basically there for
 old platforms, on a don't use it-basis. (Maybe a comment could
 be good.)

Just don't use it.  It's there for old stuff which still needs fixing.

New code should not use it, and should test for one of:

irq = 0
irq == 0

And new code should set irq = 0 to indicate a lack of interrupt.
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-09 Thread Thierry Reding
On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
> On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
>  wrote:
> > +static __devinit int adnp_i2c_probe(struct i2c_client *client,
> > +   const struct i2c_device_id *id)
> > +{
> > +   struct adnp *gpio;
> > +   u32 num_gpios;
> > +   int err;
> > +
> > +   err = of_property_read_u32(client->dev.of_node, "nr-gpios",
> > +  _gpios);
> > +   if (err < 0)
> > +   return err;
> > +
> > +   client->irq = irq_of_parse_and_map(client->dev.of_node, 0);
> > +   if (client->irq == NO_IRQ)
> 
> Just if (!client->irq) since NO_IRQ is 0 nowadays.

At the risk of seeming pedantic, NO_IRQ is in fact quite often not 0.
However, irq_of_parse_and_map() returns 0 if the interrupt cannot be
parsed or mapped, so checking for !client->irq is, as you say, correct.

Thierry


pgpTQ1BKHEjMm.pgp
Description: PGP signature


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-09 Thread Thierry Reding
On Sun, Aug 05, 2012 at 12:50:54PM +0200, Linus Walleij wrote:
> On Mon, Jul 30, 2012 at 9:47 AM, Thierry Reding
>  wrote:
> > On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
> >> On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
> >>  wrote:
> 
> >> > +- interrupt-controller: Marks the device as an interrupt controller.
> >> > +- nr-gpios: The number of pins supported by the controller.
> >>
> >> These two last things look very generic, like something every GPIO
> >> driver could want to expose.
> >
> > As Arnd mentioned, interrupt-controller is a generic property required
> > by all interrupt controller nodes. Perhaps it shouldn't be listed in the
> > DT binding for this driver.
> 
> After reading Rob's etc comments I think nr-gpios should be in this
> binding, but interrupt-controller seems like it should go into
> Documentation/devicetree/bindings/gpio/gpio.txt
> can you take care of this?
> 
> (Anyone agains, beat me up...)

Perhaps this should go into some more generic document (perhaps
something like Documentation/devicetree/bindings/interrupts.txt) to
describe the common properties for interrupt controllers and refer to
that document in bindings that use them.

It might be good to document the #interrupt-cells property as well, with
the common meaning as defined by the various irq_domain_ops.xlate()
callbacks.

Do you want me to replace occurrences of this in other binding documents
by a reference to the new document while I'm at it?

Thierry


pgpOdea7mUDdh.pgp
Description: PGP signature


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-09 Thread Thierry Reding
On Sun, Aug 05, 2012 at 12:50:54PM +0200, Linus Walleij wrote:
 On Mon, Jul 30, 2012 at 9:47 AM, Thierry Reding
 thierry.red...@avionic-design.de wrote:
  On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
  On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
  thierry.red...@avionic-design.de wrote:
 
   +- interrupt-controller: Marks the device as an interrupt controller.
   +- nr-gpios: The number of pins supported by the controller.
 
  These two last things look very generic, like something every GPIO
  driver could want to expose.
 
  As Arnd mentioned, interrupt-controller is a generic property required
  by all interrupt controller nodes. Perhaps it shouldn't be listed in the
  DT binding for this driver.
 
 After reading Rob's etc comments I think nr-gpios should be in this
 binding, but interrupt-controller seems like it should go into
 Documentation/devicetree/bindings/gpio/gpio.txt
 can you take care of this?
 
 (Anyone agains, beat me up...)

Perhaps this should go into some more generic document (perhaps
something like Documentation/devicetree/bindings/interrupts.txt) to
describe the common properties for interrupt controllers and refer to
that document in bindings that use them.

It might be good to document the #interrupt-cells property as well, with
the common meaning as defined by the various irq_domain_ops.xlate()
callbacks.

Do you want me to replace occurrences of this in other binding documents
by a reference to the new document while I'm at it?

Thierry


pgpOdea7mUDdh.pgp
Description: PGP signature


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-09 Thread Thierry Reding
On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
 On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
 thierry.red...@avionic-design.de wrote:
  +static __devinit int adnp_i2c_probe(struct i2c_client *client,
  +   const struct i2c_device_id *id)
  +{
  +   struct adnp *gpio;
  +   u32 num_gpios;
  +   int err;
  +
  +   err = of_property_read_u32(client-dev.of_node, nr-gpios,
  +  num_gpios);
  +   if (err  0)
  +   return err;
  +
  +   client-irq = irq_of_parse_and_map(client-dev.of_node, 0);
  +   if (client-irq == NO_IRQ)
 
 Just if (!client-irq) since NO_IRQ is 0 nowadays.

At the risk of seeming pedantic, NO_IRQ is in fact quite often not 0.
However, irq_of_parse_and_map() returns 0 if the interrupt cannot be
parsed or mapped, so checking for !client-irq is, as you say, correct.

Thierry


pgpTQ1BKHEjMm.pgp
Description: PGP signature


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-06 Thread Linus Walleij
On Mon, Aug 6, 2012 at 7:11 AM, Thierry Reding
 wrote:
> On Sun, Aug 05, 2012 at 12:50:54PM +0200, Linus Walleij wrote:

>> We're working on a goal of a "single zImage" (one unified ARM
>> kernel) which means your platform must be able to handle the
>> case where this is turned on anyway, so I would suggest you
>> drop the optional compile-time IRQ support, just make it
>> optional at runtime instead.
>
> I don't quite understand. Do you want me to add a module parameter to
> make it optional at runtime? Since the driver is now OF only I suppose I
> could make it optional on the interrupt-controller property as well.

No, no module parameter. Just don't register the IRQ domain if there
are not IRQ resources in the device tree, if the interrupt-controller
property is not present I guess?

>> OK but atleast find a way to move this to the probe() function,
>> what happens if the debugfs file is browsed and you run out
>> of memory? Not nice, and you were using this to debug as
>> well...
>
> Alright, I can do that. Alternatively I could probably drop the
> allocations altogether and use local variables within the second loop to
> store the variables:
>
> for (i = 0; i < num_regs; i++) {
> u8 ddr, plr, ier, isr, ptr;
>
> err = adnp_read(gpio, GPIO_DDR(gpio) + i, );
> if (err < 0)
> goto out;
>
> ...
> }
>
> With the proper locking this shouldn't be a problem. The reason why I
> used the block-wise approach in the first place was that the register
> accesses were more "atomic". Of course without locking this is non-
> sense.

Either approach works, the above seems more elegant though!

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


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-06 Thread Linus Walleij
On Mon, Aug 6, 2012 at 7:11 AM, Thierry Reding
thierry.red...@avionic-design.de wrote:
 On Sun, Aug 05, 2012 at 12:50:54PM +0200, Linus Walleij wrote:

 We're working on a goal of a single zImage (one unified ARM
 kernel) which means your platform must be able to handle the
 case where this is turned on anyway, so I would suggest you
 drop the optional compile-time IRQ support, just make it
 optional at runtime instead.

 I don't quite understand. Do you want me to add a module parameter to
 make it optional at runtime? Since the driver is now OF only I suppose I
 could make it optional on the interrupt-controller property as well.

No, no module parameter. Just don't register the IRQ domain if there
are not IRQ resources in the device tree, if the interrupt-controller
property is not present I guess?

 OK but atleast find a way to move this to the probe() function,
 what happens if the debugfs file is browsed and you run out
 of memory? Not nice, and you were using this to debug as
 well...

 Alright, I can do that. Alternatively I could probably drop the
 allocations altogether and use local variables within the second loop to
 store the variables:

 for (i = 0; i  num_regs; i++) {
 u8 ddr, plr, ier, isr, ptr;

 err = adnp_read(gpio, GPIO_DDR(gpio) + i, ddr);
 if (err  0)
 goto out;

 ...
 }

 With the proper locking this shouldn't be a problem. The reason why I
 used the block-wise approach in the first place was that the register
 accesses were more atomic. Of course without locking this is non-
 sense.

Either approach works, the above seems more elegant though!

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


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-05 Thread Thierry Reding
On Sun, Aug 05, 2012 at 12:50:54PM +0200, Linus Walleij wrote:
> On Mon, Jul 30, 2012 at 9:47 AM, Thierry Reding
>  wrote:
> > On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
> >> On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
> >>  wrote:
> 
> >> > +- interrupt-controller: Marks the device as an interrupt controller.
> >> > +- nr-gpios: The number of pins supported by the controller.
> >>
> >> These two last things look very generic, like something every GPIO
> >> driver could want to expose.
> >
> > As Arnd mentioned, interrupt-controller is a generic property required
> > by all interrupt controller nodes. Perhaps it shouldn't be listed in the
> > DT binding for this driver.
> 
> After reading Rob's etc comments I think nr-gpios should be in this
> binding, but interrupt-controller seems like it should go into
> Documentation/devicetree/bindings/gpio/gpio.txt
> can you take care of this?
> 
> (Anyone agains, beat me up...)

Yes, that makes sense. The interrupt-controller property is not
explicitly mentioned in Documentation/devicetree at all. Perhaps the
reason is that it is in fact a standard property and, I think, is
already defined by IEEE 1275. I don't think it would hurt to repeat it
explicitly for GPIO bindings in general, though.

> >> > +config GPIO_ADNP
> >> > +   tristate "Avionic Design N-bit GPIO expander"
> >> > +   depends on I2C && OF
> >> > +   help
> >> > + This option enables support for N GPIOs found on Avionic Design
> >> > + I2C GPIO expanders. The register space will be extended by 
> >> > powers
> >> > + of two, so the controller will need to accomodate for that. For
> >> > + example: if a controller provides 48 pins, 6 registers will be
> >> > + enough to represent all pins, but the driver will assume a
> >> > + register layout for 64 pins (8 registers).
> >> > +
> >> > +config GPIO_ADNP_IRQ
> >> > +   tristate "Interrupt controller support"
> >> > +   depends on GPIO_ADNP
> >> > +   help
> >> > + Say yes here to enable the Avionic Design N-bit GPIO expander 
> >> > to
> >> > + be used as an interrupt controller.
> >>
> >> First: please describe the usecase where the Avionic driver is used
> >> without making use of the IRQ, and *why* it should be possible
> >> to configure this out. E.g. is there a hardware which isn't using the
> >> IRQ portions? If there is no non-irq usecase just drop this
> >> config option.
> >
> > This expander is used in a number of Tegra-based boards and handles
> > things like enabling or disabling power to a given IC but on other
> > boards it is also used to handle interrupts from input devices or
> > card-detect for example.
> >
> > The controller is synthesized in a CPLD, which is one of the reasons for
> > the nr-gpios DT property. There is at least one platform that currently
> > doesn't use the interrupt functionality. Mainly I allowed this to be
> > configured out in order to reduce the number of interrupts required for
> > a platform. Another reason was that at the time I first wrote this, IRQ
> > domains hadn't been available, so the driver couldn't be built as a
> > module if interrupt support was required. This also no longer applies.
> >
> > I'm actually fine either way, but I thought it'd be most flexible by
> > keeping the IRQ support optional for the above reasons.
> 
> We're working on a goal of a "single zImage" (one unified ARM
> kernel) which means your platform must be able to handle the
> case where this is turned on anyway, so I would suggest you
> drop the optional compile-time IRQ support, just make it
> optional at runtime instead.

I don't quite understand. Do you want me to add a module parameter to
make it optional at runtime? Since the driver is now OF only I suppose I
could make it optional on the interrupt-controller property as well.

> > On that note, provided there is special additional circuitry, the GPIO
> > controller is able to detect tristate on an input. I'm not aware that
> > the pinctrl subsystem provides for that functionality yet, right?
> 
> pinctrl is usually about *setting* things into tristate, but I'm all
> for adding support for getting it as well. But that depends on
> the generic pin configurations being adopted first (still most
> controllers have their own way of doing pin config, so this
> cannot be represented in a generic way).

As I mentioned, the only hardware where this was ever used is already
EOL and I don't expect this functionality to be required anytime soon
for another project.

> >> > +   base = kzalloc(regs * 5, GFP_KERNEL);
> >>
> >> Why kzalloc()/kfree() when you can just use a
> >>
> >> static u8 base[N];
> >>
> >> where N is the max number of registers on any HW instead?
> >
> > As I explained above, the number of pins is configurable, so it'd be
> > quite a waste to always assume a maximum of, say, 256 pins if the
> > hardware actually only uses 8.
> 
> OK but atleast find 

Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-05 Thread Linus Walleij
On Mon, Jul 30, 2012 at 9:47 AM, Thierry Reding
 wrote:
> On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
>> On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
>>  wrote:

>> > +- interrupt-controller: Marks the device as an interrupt controller.
>> > +- nr-gpios: The number of pins supported by the controller.
>>
>> These two last things look very generic, like something every GPIO
>> driver could want to expose.
>
> As Arnd mentioned, interrupt-controller is a generic property required
> by all interrupt controller nodes. Perhaps it shouldn't be listed in the
> DT binding for this driver.

After reading Rob's etc comments I think nr-gpios should be in this
binding, but interrupt-controller seems like it should go into
Documentation/devicetree/bindings/gpio/gpio.txt
can you take care of this?

(Anyone agains, beat me up...)

>> > +config GPIO_ADNP
>> > +   tristate "Avionic Design N-bit GPIO expander"
>> > +   depends on I2C && OF
>> > +   help
>> > + This option enables support for N GPIOs found on Avionic Design
>> > + I2C GPIO expanders. The register space will be extended by powers
>> > + of two, so the controller will need to accomodate for that. For
>> > + example: if a controller provides 48 pins, 6 registers will be
>> > + enough to represent all pins, but the driver will assume a
>> > + register layout for 64 pins (8 registers).
>> > +
>> > +config GPIO_ADNP_IRQ
>> > +   tristate "Interrupt controller support"
>> > +   depends on GPIO_ADNP
>> > +   help
>> > + Say yes here to enable the Avionic Design N-bit GPIO expander to
>> > + be used as an interrupt controller.
>>
>> First: please describe the usecase where the Avionic driver is used
>> without making use of the IRQ, and *why* it should be possible
>> to configure this out. E.g. is there a hardware which isn't using the
>> IRQ portions? If there is no non-irq usecase just drop this
>> config option.
>
> This expander is used in a number of Tegra-based boards and handles
> things like enabling or disabling power to a given IC but on other
> boards it is also used to handle interrupts from input devices or
> card-detect for example.
>
> The controller is synthesized in a CPLD, which is one of the reasons for
> the nr-gpios DT property. There is at least one platform that currently
> doesn't use the interrupt functionality. Mainly I allowed this to be
> configured out in order to reduce the number of interrupts required for
> a platform. Another reason was that at the time I first wrote this, IRQ
> domains hadn't been available, so the driver couldn't be built as a
> module if interrupt support was required. This also no longer applies.
>
> I'm actually fine either way, but I thought it'd be most flexible by
> keeping the IRQ support optional for the above reasons.

We're working on a goal of a "single zImage" (one unified ARM
kernel) which means your platform must be able to handle the
case where this is turned on anyway, so I would suggest you
drop the optional compile-time IRQ support, just make it
optional at runtime instead.

>> > +   u8 *irq_mask;
>> > +   u8 *irq_mask_cur;
>> > +   u8 *irq_level;
>> > +   u8 *irq_rise;
>> > +   u8 *irq_fall;
>> > +   u8 *irq_high;
>> > +   u8 *irq_low;
>>
>> Some or all of this looks like a regmap reimplementation, see below.
>
> Actually none of these represent actual registers, except for irq_mask
> and irq_mask_cur. They are used to emulate various IRQ trigger modes.

OK.

>> When I do this at several places in a driver I usually define
>> a macro like
>>
>> #define to_adnp(foo) container_of(foo, struct adnp, gpio)
>>
>> Used like so:
>>
>> struct adnp *adnp = to_adnp(chip);
>
> Yes, I usually do that as well. I guess this driver has been in the
> works in too many variants for too long. =)

OK expect it to be changed in v3 then...

>> > +   unsigned int reg = offset >> gpio->reg_shift;
>> > +   unsigned int pos = offset & 7;
>> > +   u8 value;
>> > +   int err;
>> > +
>> > +   mutex_lock(>i2c_lock);
>>
>> The point of taking this mutex here avoids me.
>> adnp_read() only performs a single transaction.
>
> I think that's a relic from an earlier version that used to access the
> PTR (Pin Tristate Register) as well. At the time I used to return 2 here
> to signify a tristated input, which was dependent on the contents of the
> PTR. Tristating an output is, I believe, better done using pinmux/
> pinctrl nowadays, so I took that code because the only platform where
> this was ever used will probably never be mainlined.

OK so will be gone in v3 I guess.

> On that note, provided there is special additional circuitry, the GPIO
> controller is able to detect tristate on an input. I'm not aware that
> the pinctrl subsystem provides for that functionality yet, right?

pinctrl is usually about *setting* things into tristate, but I'm all
for adding support for 

Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-05 Thread Linus Walleij
On Mon, Jul 30, 2012 at 9:47 AM, Thierry Reding
thierry.red...@avionic-design.de wrote:
 On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
 On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
 thierry.red...@avionic-design.de wrote:

  +- interrupt-controller: Marks the device as an interrupt controller.
  +- nr-gpios: The number of pins supported by the controller.

 These two last things look very generic, like something every GPIO
 driver could want to expose.

 As Arnd mentioned, interrupt-controller is a generic property required
 by all interrupt controller nodes. Perhaps it shouldn't be listed in the
 DT binding for this driver.

After reading Rob's etc comments I think nr-gpios should be in this
binding, but interrupt-controller seems like it should go into
Documentation/devicetree/bindings/gpio/gpio.txt
can you take care of this?

(Anyone agains, beat me up...)

  +config GPIO_ADNP
  +   tristate Avionic Design N-bit GPIO expander
  +   depends on I2C  OF
  +   help
  + This option enables support for N GPIOs found on Avionic Design
  + I2C GPIO expanders. The register space will be extended by powers
  + of two, so the controller will need to accomodate for that. For
  + example: if a controller provides 48 pins, 6 registers will be
  + enough to represent all pins, but the driver will assume a
  + register layout for 64 pins (8 registers).
  +
  +config GPIO_ADNP_IRQ
  +   tristate Interrupt controller support
  +   depends on GPIO_ADNP
  +   help
  + Say yes here to enable the Avionic Design N-bit GPIO expander to
  + be used as an interrupt controller.

 First: please describe the usecase where the Avionic driver is used
 without making use of the IRQ, and *why* it should be possible
 to configure this out. E.g. is there a hardware which isn't using the
 IRQ portions? If there is no non-irq usecase just drop this
 config option.

 This expander is used in a number of Tegra-based boards and handles
 things like enabling or disabling power to a given IC but on other
 boards it is also used to handle interrupts from input devices or
 card-detect for example.

 The controller is synthesized in a CPLD, which is one of the reasons for
 the nr-gpios DT property. There is at least one platform that currently
 doesn't use the interrupt functionality. Mainly I allowed this to be
 configured out in order to reduce the number of interrupts required for
 a platform. Another reason was that at the time I first wrote this, IRQ
 domains hadn't been available, so the driver couldn't be built as a
 module if interrupt support was required. This also no longer applies.

 I'm actually fine either way, but I thought it'd be most flexible by
 keeping the IRQ support optional for the above reasons.

We're working on a goal of a single zImage (one unified ARM
kernel) which means your platform must be able to handle the
case where this is turned on anyway, so I would suggest you
drop the optional compile-time IRQ support, just make it
optional at runtime instead.

  +   u8 *irq_mask;
  +   u8 *irq_mask_cur;
  +   u8 *irq_level;
  +   u8 *irq_rise;
  +   u8 *irq_fall;
  +   u8 *irq_high;
  +   u8 *irq_low;

 Some or all of this looks like a regmap reimplementation, see below.

 Actually none of these represent actual registers, except for irq_mask
 and irq_mask_cur. They are used to emulate various IRQ trigger modes.

OK.

 When I do this at several places in a driver I usually define
 a macro like

 #define to_adnp(foo) container_of(foo, struct adnp, gpio)

 Used like so:

 struct adnp *adnp = to_adnp(chip);

 Yes, I usually do that as well. I guess this driver has been in the
 works in too many variants for too long. =)

OK expect it to be changed in v3 then...

  +   unsigned int reg = offset  gpio-reg_shift;
  +   unsigned int pos = offset  7;
  +   u8 value;
  +   int err;
  +
  +   mutex_lock(gpio-i2c_lock);

 The point of taking this mutex here avoids me.
 adnp_read() only performs a single transaction.

 I think that's a relic from an earlier version that used to access the
 PTR (Pin Tristate Register) as well. At the time I used to return 2 here
 to signify a tristated input, which was dependent on the contents of the
 PTR. Tristating an output is, I believe, better done using pinmux/
 pinctrl nowadays, so I took that code because the only platform where
 this was ever used will probably never be mainlined.

OK so will be gone in v3 I guess.

 On that note, provided there is special additional circuitry, the GPIO
 controller is able to detect tristate on an input. I'm not aware that
 the pinctrl subsystem provides for that functionality yet, right?

pinctrl is usually about *setting* things into tristate, but I'm all
for adding support for getting it as well. But that depends on
the generic pin configurations being adopted first (still most
controllers have their own 

Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-05 Thread Thierry Reding
On Sun, Aug 05, 2012 at 12:50:54PM +0200, Linus Walleij wrote:
 On Mon, Jul 30, 2012 at 9:47 AM, Thierry Reding
 thierry.red...@avionic-design.de wrote:
  On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
  On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
  thierry.red...@avionic-design.de wrote:
 
   +- interrupt-controller: Marks the device as an interrupt controller.
   +- nr-gpios: The number of pins supported by the controller.
 
  These two last things look very generic, like something every GPIO
  driver could want to expose.
 
  As Arnd mentioned, interrupt-controller is a generic property required
  by all interrupt controller nodes. Perhaps it shouldn't be listed in the
  DT binding for this driver.
 
 After reading Rob's etc comments I think nr-gpios should be in this
 binding, but interrupt-controller seems like it should go into
 Documentation/devicetree/bindings/gpio/gpio.txt
 can you take care of this?
 
 (Anyone agains, beat me up...)

Yes, that makes sense. The interrupt-controller property is not
explicitly mentioned in Documentation/devicetree at all. Perhaps the
reason is that it is in fact a standard property and, I think, is
already defined by IEEE 1275. I don't think it would hurt to repeat it
explicitly for GPIO bindings in general, though.

   +config GPIO_ADNP
   +   tristate Avionic Design N-bit GPIO expander
   +   depends on I2C  OF
   +   help
   + This option enables support for N GPIOs found on Avionic Design
   + I2C GPIO expanders. The register space will be extended by 
   powers
   + of two, so the controller will need to accomodate for that. For
   + example: if a controller provides 48 pins, 6 registers will be
   + enough to represent all pins, but the driver will assume a
   + register layout for 64 pins (8 registers).
   +
   +config GPIO_ADNP_IRQ
   +   tristate Interrupt controller support
   +   depends on GPIO_ADNP
   +   help
   + Say yes here to enable the Avionic Design N-bit GPIO expander 
   to
   + be used as an interrupt controller.
 
  First: please describe the usecase where the Avionic driver is used
  without making use of the IRQ, and *why* it should be possible
  to configure this out. E.g. is there a hardware which isn't using the
  IRQ portions? If there is no non-irq usecase just drop this
  config option.
 
  This expander is used in a number of Tegra-based boards and handles
  things like enabling or disabling power to a given IC but on other
  boards it is also used to handle interrupts from input devices or
  card-detect for example.
 
  The controller is synthesized in a CPLD, which is one of the reasons for
  the nr-gpios DT property. There is at least one platform that currently
  doesn't use the interrupt functionality. Mainly I allowed this to be
  configured out in order to reduce the number of interrupts required for
  a platform. Another reason was that at the time I first wrote this, IRQ
  domains hadn't been available, so the driver couldn't be built as a
  module if interrupt support was required. This also no longer applies.
 
  I'm actually fine either way, but I thought it'd be most flexible by
  keeping the IRQ support optional for the above reasons.
 
 We're working on a goal of a single zImage (one unified ARM
 kernel) which means your platform must be able to handle the
 case where this is turned on anyway, so I would suggest you
 drop the optional compile-time IRQ support, just make it
 optional at runtime instead.

I don't quite understand. Do you want me to add a module parameter to
make it optional at runtime? Since the driver is now OF only I suppose I
could make it optional on the interrupt-controller property as well.

  On that note, provided there is special additional circuitry, the GPIO
  controller is able to detect tristate on an input. I'm not aware that
  the pinctrl subsystem provides for that functionality yet, right?
 
 pinctrl is usually about *setting* things into tristate, but I'm all
 for adding support for getting it as well. But that depends on
 the generic pin configurations being adopted first (still most
 controllers have their own way of doing pin config, so this
 cannot be represented in a generic way).

As I mentioned, the only hardware where this was ever used is already
EOL and I don't expect this functionality to be required anytime soon
for another project.

   +   base = kzalloc(regs * 5, GFP_KERNEL);
 
  Why kzalloc()/kfree() when you can just use a
 
  static u8 base[N];
 
  where N is the max number of registers on any HW instead?
 
  As I explained above, the number of pins is configurable, so it'd be
  quite a waste to always assume a maximum of, say, 256 pins if the
  hardware actually only uses 8.
 
 OK but atleast find a way to move this to the probe() function,
 what happens if the debugfs file is browsed and you run out
 of memory? Not nice, and you were using this to debug as
 

Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-02 Thread Thierry Reding
On Tue, Jul 31, 2012 at 05:03:05PM -0500, Rob Herring wrote:
> For nr-gpios, I think it is typically not needed. Generally, you will
> know how many gpio lines the h/w has based on the compatible string. If
> this part really is the same part but different packages with different
> numbers of gpio, then this property makes sense.

That's exactly what I need it for. The controller is synthesized in a
CPLD, so technically the part is always the same, but the configured
logic can implement any number of GPIOs.

Thierry


pgpJLaYwYBts2.pgp
Description: PGP signature


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-08-02 Thread Thierry Reding
On Tue, Jul 31, 2012 at 05:03:05PM -0500, Rob Herring wrote:
 For nr-gpios, I think it is typically not needed. Generally, you will
 know how many gpio lines the h/w has based on the compatible string. If
 this part really is the same part but different packages with different
 numbers of gpio, then this property makes sense.

That's exactly what I need it for. The controller is synthesized in a
CPLD, so technically the part is always the same, but the configured
logic can implement any number of GPIOs.

Thierry


pgpJLaYwYBts2.pgp
Description: PGP signature


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-31 Thread Stephen Warren
On 07/31/2012 04:03 PM, Rob Herring wrote:
> On 07/30/2012 02:47 AM, Thierry Reding wrote:
>> On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
>>> On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
>>>  wrote:
>>>
 This commit adds a driver for the Avionic Design N-bit GPIO expander.
 The expander provides a variable number of GPIO pins with interrupt
 support.

 diff --git a/Documentation/devicetree/bindings/gpio/gpio-adnp.txt 
 b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt

 +Required properties:

 +- nr-gpios: The number of pins supported by the controller.

> For nr-gpios, I think it is typically not needed. Generally, you will
> know how many gpio lines the h/w has based on the compatible string. If
> this part really is the same part but different packages with different
> numbers of gpio, then this property makes sense. Otherwise, I would say
> drop it.
> 
> If your goal is how many gpios are you using, you really need a bitmap
> instead if you want it to be generic.
> 
> IIRC, Tegra also needed this in that they N instances of some number of
> bits and the registers are interleaved so they can't have separate nodes.

In the end, I got away without having a separate property to represent
this. Instead, the code keys off the number of interrupts listed in the
interrupts property, there being one interrupt per GPIO bank, and hence
dynamically instantiates the number of banks based on that.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-31 Thread Rob Herring
On 07/30/2012 02:47 AM, Thierry Reding wrote:
> On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
>> On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
>>  wrote:
>>
>>> This commit adds a driver for the Avionic Design N-bit GPIO expander.
>>> The expander provides a variable number of GPIO pins with interrupt
>>> support.
>> (...)
>>> diff --git a/Documentation/devicetree/bindings/gpio/gpio-adnp.txt 
>>> b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
>>> new file mode 100644
>>> index 000..513a18e
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
>>> @@ -0,0 +1,38 @@
>>> +Avionic Design N-bit GPIO expander bindings
>>> +
>>> +Required properties:
>>> +- compatible: should be "ad,gpio-adnp"
>>> +- reg: The I2C slave address for this device.
>>> +- interrupt-parent: phandle of the parent interrupt controller.
>>> +- interrupts: Interrupt specifier for the controllers interrupt.
>>> +- #gpio-cells: Should be 2. The first cell is the GPIO number and the
>>> +  second cell is used to specify optional parameters:
>>> +  - bit 0: polarity (0: normal, 1: inverted)
>>> +- gpio-controller: Marks the device as a GPIO controller
>>> +- #interrupt-cells: Should be 2. The first cell contains the GPIO number,
>>> +  whereas the second cell is used to specify flags:
>>> +bits[3:0] trigger type and level flags
>>> +  1 = low-to-high edge triggered
>>> +  2 = high-to-low edge triggered
>>> +  4 = active high level-sensitive
>>> +  8 = active low level-sensitive
>>
>> Why on earth would a bunch of flags be an "interrupt cell"?
>>
>> Maybe there is something about DT bindings I don't get so
>> please educate me.
>>
>> I can see that OMAP is doing this, but is it a good idea?
>> I really need Rob/Grant to comment on this.
>>
>>> +- interrupt-controller: Marks the device as an interrupt controller.
>>> +- nr-gpios: The number of pins supported by the controller.
>>
>> These two last things look very generic, like something every GPIO
>> driver could want to expose.
> 
> As Arnd mentioned, interrupt-controller is a generic property required
> by all interrupt controller nodes. Perhaps it shouldn't be listed in the
> DT binding for this driver.
> 
> As to the nr-gpios property, this is actually not only for informational
> purposes, but it also allows the driver to be configured to handle any
> number of bits (powers of two). However since this is also a description
> of the hardware it may be useful to make this into a generic property
> for GPIO controllers.
> 
>> I'd really like to have Grant's word on GPIO DT bindings and how these
>> should look, I had some discussion with Wolfram (the I2C maintainer)
>> about bindings turning out less generic than they ought to be, so we
>> need some discussion on this.
>>
>> Arnd recently consolidated some MMC props, maybe we need to do
>> the same for GPIO drivers.

For nr-gpios, I think it is typically not needed. Generally, you will
know how many gpio lines the h/w has based on the compatible string. If
this part really is the same part but different packages with different
numbers of gpio, then this property makes sense. Otherwise, I would say
drop it.

If your goal is how many gpios are you using, you really need a bitmap
instead if you want it to be generic.

IIRC, Tegra also needed this in that they N instances of some number of
bits and the registers are interleaved so they can't have separate nodes.

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


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-31 Thread Rob Herring
On 07/30/2012 02:47 AM, Thierry Reding wrote:
 On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
 On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
 thierry.red...@avionic-design.de wrote:

 This commit adds a driver for the Avionic Design N-bit GPIO expander.
 The expander provides a variable number of GPIO pins with interrupt
 support.
 (...)
 diff --git a/Documentation/devicetree/bindings/gpio/gpio-adnp.txt 
 b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
 new file mode 100644
 index 000..513a18e
 --- /dev/null
 +++ b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
 @@ -0,0 +1,38 @@
 +Avionic Design N-bit GPIO expander bindings
 +
 +Required properties:
 +- compatible: should be ad,gpio-adnp
 +- reg: The I2C slave address for this device.
 +- interrupt-parent: phandle of the parent interrupt controller.
 +- interrupts: Interrupt specifier for the controllers interrupt.
 +- #gpio-cells: Should be 2. The first cell is the GPIO number and the
 +  second cell is used to specify optional parameters:
 +  - bit 0: polarity (0: normal, 1: inverted)
 +- gpio-controller: Marks the device as a GPIO controller
 +- #interrupt-cells: Should be 2. The first cell contains the GPIO number,
 +  whereas the second cell is used to specify flags:
 +bits[3:0] trigger type and level flags
 +  1 = low-to-high edge triggered
 +  2 = high-to-low edge triggered
 +  4 = active high level-sensitive
 +  8 = active low level-sensitive

 Why on earth would a bunch of flags be an interrupt cell?

 Maybe there is something about DT bindings I don't get so
 please educate me.

 I can see that OMAP is doing this, but is it a good idea?
 I really need Rob/Grant to comment on this.

 +- interrupt-controller: Marks the device as an interrupt controller.
 +- nr-gpios: The number of pins supported by the controller.

 These two last things look very generic, like something every GPIO
 driver could want to expose.
 
 As Arnd mentioned, interrupt-controller is a generic property required
 by all interrupt controller nodes. Perhaps it shouldn't be listed in the
 DT binding for this driver.
 
 As to the nr-gpios property, this is actually not only for informational
 purposes, but it also allows the driver to be configured to handle any
 number of bits (powers of two). However since this is also a description
 of the hardware it may be useful to make this into a generic property
 for GPIO controllers.
 
 I'd really like to have Grant's word on GPIO DT bindings and how these
 should look, I had some discussion with Wolfram (the I2C maintainer)
 about bindings turning out less generic than they ought to be, so we
 need some discussion on this.

 Arnd recently consolidated some MMC props, maybe we need to do
 the same for GPIO drivers.

For nr-gpios, I think it is typically not needed. Generally, you will
know how many gpio lines the h/w has based on the compatible string. If
this part really is the same part but different packages with different
numbers of gpio, then this property makes sense. Otherwise, I would say
drop it.

If your goal is how many gpios are you using, you really need a bitmap
instead if you want it to be generic.

IIRC, Tegra also needed this in that they N instances of some number of
bits and the registers are interleaved so they can't have separate nodes.

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


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-31 Thread Stephen Warren
On 07/31/2012 04:03 PM, Rob Herring wrote:
 On 07/30/2012 02:47 AM, Thierry Reding wrote:
 On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
 On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
 thierry.red...@avionic-design.de wrote:

 This commit adds a driver for the Avionic Design N-bit GPIO expander.
 The expander provides a variable number of GPIO pins with interrupt
 support.

 diff --git a/Documentation/devicetree/bindings/gpio/gpio-adnp.txt 
 b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt

 +Required properties:

 +- nr-gpios: The number of pins supported by the controller.

 For nr-gpios, I think it is typically not needed. Generally, you will
 know how many gpio lines the h/w has based on the compatible string. If
 this part really is the same part but different packages with different
 numbers of gpio, then this property makes sense. Otherwise, I would say
 drop it.
 
 If your goal is how many gpios are you using, you really need a bitmap
 instead if you want it to be generic.
 
 IIRC, Tegra also needed this in that they N instances of some number of
 bits and the registers are interleaved so they can't have separate nodes.

In the end, I got away without having a separate property to represent
this. Instead, the code keys off the number of interrupts listed in the
interrupts property, there being one interrupt per GPIO bank, and hence
dynamically instantiates the number of banks based on that.
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-30 Thread Thierry Reding
On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
> On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
>  wrote:
> 
> > This commit adds a driver for the Avionic Design N-bit GPIO expander.
> > The expander provides a variable number of GPIO pins with interrupt
> > support.
> (...)
> > diff --git a/Documentation/devicetree/bindings/gpio/gpio-adnp.txt 
> > b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
> > new file mode 100644
> > index 000..513a18e
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
> > @@ -0,0 +1,38 @@
> > +Avionic Design N-bit GPIO expander bindings
> > +
> > +Required properties:
> > +- compatible: should be "ad,gpio-adnp"
> > +- reg: The I2C slave address for this device.
> > +- interrupt-parent: phandle of the parent interrupt controller.
> > +- interrupts: Interrupt specifier for the controllers interrupt.
> > +- #gpio-cells: Should be 2. The first cell is the GPIO number and the
> > +  second cell is used to specify optional parameters:
> > +  - bit 0: polarity (0: normal, 1: inverted)
> > +- gpio-controller: Marks the device as a GPIO controller
> > +- #interrupt-cells: Should be 2. The first cell contains the GPIO number,
> > +  whereas the second cell is used to specify flags:
> > +bits[3:0] trigger type and level flags
> > +  1 = low-to-high edge triggered
> > +  2 = high-to-low edge triggered
> > +  4 = active high level-sensitive
> > +  8 = active low level-sensitive
> 
> Why on earth would a bunch of flags be an "interrupt cell"?
> 
> Maybe there is something about DT bindings I don't get so
> please educate me.
> 
> I can see that OMAP is doing this, but is it a good idea?
> I really need Rob/Grant to comment on this.
> 
> > +- interrupt-controller: Marks the device as an interrupt controller.
> > +- nr-gpios: The number of pins supported by the controller.
> 
> These two last things look very generic, like something every GPIO
> driver could want to expose.

As Arnd mentioned, interrupt-controller is a generic property required
by all interrupt controller nodes. Perhaps it shouldn't be listed in the
DT binding for this driver.

As to the nr-gpios property, this is actually not only for informational
purposes, but it also allows the driver to be configured to handle any
number of bits (powers of two). However since this is also a description
of the hardware it may be useful to make this into a generic property
for GPIO controllers.

> I'd really like to have Grant's word on GPIO DT bindings and how these
> should look, I had some discussion with Wolfram (the I2C maintainer)
> about bindings turning out less generic than they ought to be, so we
> need some discussion on this.
> 
> Arnd recently consolidated some MMC props, maybe we need to do
> the same for GPIO drivers.
> 
> (...)
> > diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> > index 502b5ea..d1b0f7d 100644
> > --- a/drivers/gpio/Kconfig
> > +++ b/drivers/gpio/Kconfig
> > @@ -444,6 +444,24 @@ config GPIO_ADP5588_IRQ
> >   Say yes here to enable the adp5588 to be used as an interrupt
> >   controller. It requires the driver to be built in the kernel.
> >
> > +config GPIO_ADNP
> > +   tristate "Avionic Design N-bit GPIO expander"
> > +   depends on I2C && OF
> > +   help
> > + This option enables support for N GPIOs found on Avionic Design
> > + I2C GPIO expanders. The register space will be extended by powers
> > + of two, so the controller will need to accomodate for that. For
> > + example: if a controller provides 48 pins, 6 registers will be
> > + enough to represent all pins, but the driver will assume a
> > + register layout for 64 pins (8 registers).
> > +
> > +config GPIO_ADNP_IRQ
> > +   tristate "Interrupt controller support"
> > +   depends on GPIO_ADNP
> > +   help
> > + Say yes here to enable the Avionic Design N-bit GPIO expander to
> > + be used as an interrupt controller.
> 
> First: please describe the usecase where the Avionic driver is used
> without making use of the IRQ, and *why* it should be possible
> to configure this out. E.g. is there a hardware which isn't using the
> IRQ portions? If there is no non-irq usecase just drop this
> config option.

This expander is used in a number of Tegra-based boards and handles
things like enabling or disabling power to a given IC but on other
boards it is also used to handle interrupts from input devices or
card-detect for example.

The controller is synthesized in a CPLD, which is one of the reasons for
the nr-gpios DT property. There is at least one platform that currently
doesn't use the interrupt functionality. Mainly I allowed this to be
configured out in order to reduce the number of interrupts required for
a platform. Another reason was that at the time I first wrote this, IRQ
domains hadn't been available, so the driver couldn't be built as a
module if interrupt 

Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-30 Thread Thierry Reding
On Sun, Jul 29, 2012 at 07:13:57PM +0200, Linus Walleij wrote:
 On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
 thierry.red...@avionic-design.de wrote:
 
  This commit adds a driver for the Avionic Design N-bit GPIO expander.
  The expander provides a variable number of GPIO pins with interrupt
  support.
 (...)
  diff --git a/Documentation/devicetree/bindings/gpio/gpio-adnp.txt 
  b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
  new file mode 100644
  index 000..513a18e
  --- /dev/null
  +++ b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
  @@ -0,0 +1,38 @@
  +Avionic Design N-bit GPIO expander bindings
  +
  +Required properties:
  +- compatible: should be ad,gpio-adnp
  +- reg: The I2C slave address for this device.
  +- interrupt-parent: phandle of the parent interrupt controller.
  +- interrupts: Interrupt specifier for the controllers interrupt.
  +- #gpio-cells: Should be 2. The first cell is the GPIO number and the
  +  second cell is used to specify optional parameters:
  +  - bit 0: polarity (0: normal, 1: inverted)
  +- gpio-controller: Marks the device as a GPIO controller
  +- #interrupt-cells: Should be 2. The first cell contains the GPIO number,
  +  whereas the second cell is used to specify flags:
  +bits[3:0] trigger type and level flags
  +  1 = low-to-high edge triggered
  +  2 = high-to-low edge triggered
  +  4 = active high level-sensitive
  +  8 = active low level-sensitive
 
 Why on earth would a bunch of flags be an interrupt cell?
 
 Maybe there is something about DT bindings I don't get so
 please educate me.
 
 I can see that OMAP is doing this, but is it a good idea?
 I really need Rob/Grant to comment on this.
 
  +- interrupt-controller: Marks the device as an interrupt controller.
  +- nr-gpios: The number of pins supported by the controller.
 
 These two last things look very generic, like something every GPIO
 driver could want to expose.

As Arnd mentioned, interrupt-controller is a generic property required
by all interrupt controller nodes. Perhaps it shouldn't be listed in the
DT binding for this driver.

As to the nr-gpios property, this is actually not only for informational
purposes, but it also allows the driver to be configured to handle any
number of bits (powers of two). However since this is also a description
of the hardware it may be useful to make this into a generic property
for GPIO controllers.

 I'd really like to have Grant's word on GPIO DT bindings and how these
 should look, I had some discussion with Wolfram (the I2C maintainer)
 about bindings turning out less generic than they ought to be, so we
 need some discussion on this.
 
 Arnd recently consolidated some MMC props, maybe we need to do
 the same for GPIO drivers.
 
 (...)
  diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
  index 502b5ea..d1b0f7d 100644
  --- a/drivers/gpio/Kconfig
  +++ b/drivers/gpio/Kconfig
  @@ -444,6 +444,24 @@ config GPIO_ADP5588_IRQ
Say yes here to enable the adp5588 to be used as an interrupt
controller. It requires the driver to be built in the kernel.
 
  +config GPIO_ADNP
  +   tristate Avionic Design N-bit GPIO expander
  +   depends on I2C  OF
  +   help
  + This option enables support for N GPIOs found on Avionic Design
  + I2C GPIO expanders. The register space will be extended by powers
  + of two, so the controller will need to accomodate for that. For
  + example: if a controller provides 48 pins, 6 registers will be
  + enough to represent all pins, but the driver will assume a
  + register layout for 64 pins (8 registers).
  +
  +config GPIO_ADNP_IRQ
  +   tristate Interrupt controller support
  +   depends on GPIO_ADNP
  +   help
  + Say yes here to enable the Avionic Design N-bit GPIO expander to
  + be used as an interrupt controller.
 
 First: please describe the usecase where the Avionic driver is used
 without making use of the IRQ, and *why* it should be possible
 to configure this out. E.g. is there a hardware which isn't using the
 IRQ portions? If there is no non-irq usecase just drop this
 config option.

This expander is used in a number of Tegra-based boards and handles
things like enabling or disabling power to a given IC but on other
boards it is also used to handle interrupts from input devices or
card-detect for example.

The controller is synthesized in a CPLD, which is one of the reasons for
the nr-gpios DT property. There is at least one platform that currently
doesn't use the interrupt functionality. Mainly I allowed this to be
configured out in order to reduce the number of interrupts required for
a platform. Another reason was that at the time I first wrote this, IRQ
domains hadn't been available, so the driver couldn't be built as a
module if interrupt support was required. This also no longer applies.

I'm actually fine either way, but I thought it'd be most flexible by

Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-29 Thread Arnd Bergmann
On Sunday 29 July 2012, Linus Walleij wrote:
> > +- #interrupt-cells: Should be 2. The first cell contains the GPIO number,
> > +  whereas the second cell is used to specify flags:
> > +bits[3:0] trigger type and level flags
> > +  1 = low-to-high edge triggered
> > +  2 = high-to-low edge triggered
> > +  4 = active high level-sensitive
> > +  8 = active low level-sensitive
> 
> Why on earth would a bunch of flags be an "interrupt cell"?
> 
> Maybe there is something about DT bindings I don't get so
> please educate me.
> 
> I can see that OMAP is doing this, but is it a good idea?
> I really need Rob/Grant to comment on this.

It is in fact a good idea, and it's very common to have it. The point is that
the interrupt controller requires this setting in order to configure that IRQ
for use, so putting it into a property of the device that triggers the IRQ
is the right place to have it.

> > +- interrupt-controller: Marks the device as an interrupt controller.
> > +- nr-gpios: The number of pins supported by the controller.
> 
> These two last things look very generic, like something every GPIO
> driver could want to expose.
> 
> I'd really like to have Grant's word on GPIO DT bindings and how these
> should look, I had some discussion with Wolfram (the I2C maintainer)
> about bindings turning out less generic than they ought to be, so we
> need some discussion on this.
> 
> Arnd recently consolidated some MMC props, maybe we need to do
> the same for GPIO drivers.

The "interrupt-controller" property is standardized by IEEE. Not sure 
about what specifies the "nr-gpios" one, but it seems to be a good idea
to have everyone do the same thing here.

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


Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-29 Thread Linus Walleij
On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
 wrote:

> This commit adds a driver for the Avionic Design N-bit GPIO expander.
> The expander provides a variable number of GPIO pins with interrupt
> support.
(...)
> diff --git a/Documentation/devicetree/bindings/gpio/gpio-adnp.txt 
> b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
> new file mode 100644
> index 000..513a18e
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
> @@ -0,0 +1,38 @@
> +Avionic Design N-bit GPIO expander bindings
> +
> +Required properties:
> +- compatible: should be "ad,gpio-adnp"
> +- reg: The I2C slave address for this device.
> +- interrupt-parent: phandle of the parent interrupt controller.
> +- interrupts: Interrupt specifier for the controllers interrupt.
> +- #gpio-cells: Should be 2. The first cell is the GPIO number and the
> +  second cell is used to specify optional parameters:
> +  - bit 0: polarity (0: normal, 1: inverted)
> +- gpio-controller: Marks the device as a GPIO controller
> +- #interrupt-cells: Should be 2. The first cell contains the GPIO number,
> +  whereas the second cell is used to specify flags:
> +bits[3:0] trigger type and level flags
> +  1 = low-to-high edge triggered
> +  2 = high-to-low edge triggered
> +  4 = active high level-sensitive
> +  8 = active low level-sensitive

Why on earth would a bunch of flags be an "interrupt cell"?

Maybe there is something about DT bindings I don't get so
please educate me.

I can see that OMAP is doing this, but is it a good idea?
I really need Rob/Grant to comment on this.

> +- interrupt-controller: Marks the device as an interrupt controller.
> +- nr-gpios: The number of pins supported by the controller.

These two last things look very generic, like something every GPIO
driver could want to expose.

I'd really like to have Grant's word on GPIO DT bindings and how these
should look, I had some discussion with Wolfram (the I2C maintainer)
about bindings turning out less generic than they ought to be, so we
need some discussion on this.

Arnd recently consolidated some MMC props, maybe we need to do
the same for GPIO drivers.

(...)
> diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
> index 502b5ea..d1b0f7d 100644
> --- a/drivers/gpio/Kconfig
> +++ b/drivers/gpio/Kconfig
> @@ -444,6 +444,24 @@ config GPIO_ADP5588_IRQ
>   Say yes here to enable the adp5588 to be used as an interrupt
>   controller. It requires the driver to be built in the kernel.
>
> +config GPIO_ADNP
> +   tristate "Avionic Design N-bit GPIO expander"
> +   depends on I2C && OF
> +   help
> + This option enables support for N GPIOs found on Avionic Design
> + I2C GPIO expanders. The register space will be extended by powers
> + of two, so the controller will need to accomodate for that. For
> + example: if a controller provides 48 pins, 6 registers will be
> + enough to represent all pins, but the driver will assume a
> + register layout for 64 pins (8 registers).
> +
> +config GPIO_ADNP_IRQ
> +   tristate "Interrupt controller support"
> +   depends on GPIO_ADNP
> +   help
> + Say yes here to enable the Avionic Design N-bit GPIO expander to
> + be used as an interrupt controller.

First: please describe the usecase where the Avionic driver is used
without making use of the IRQ, and *why* it should be possible
to configure this out. E.g. is there a hardware which isn't using the
IRQ portions? If there is no non-irq usecase just drop this
config option.

If you're keeping it:

Now this is going to appear as a single line under the ADNP driver
config entry saying "Interrupt controller support", which is too
generic.

Please make it expand to a submenu so that it gets indented below the
controller driver.

(...)
> diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c
> new file mode 100644
> index 000..c122ff4
> --- /dev/null
> +++ b/drivers/gpio/gpio-adnp.c
> @@ -0,0 +1,615 @@
> +/*
> + * Copyright (C) 2011-2012 Avionic Design GmbH
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 

Good!

> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define GPIO_DDR(gpio) (0x00 << (gpio)->reg_shift)
> +#define GPIO_PLR(gpio) (0x01 << (gpio)->reg_shift)
> +#define GPIO_IER(gpio) (0x02 << (gpio)->reg_shift)
> +#define GPIO_ISR(gpio) (0x03 << (gpio)->reg_shift)
> +#define GPIO_PTR(gpio) (0x04 << (gpio)->reg_shift)
> +
> +struct adnp {
> +   struct i2c_client *client;
> +   struct gpio_chip gpio;
> +   unsigned int reg_shift;
> +
> +   struct mutex i2c_lock;
> +
> +   struct irq_domain *domain;
> +   struct mutex irq_lock;
> +
> +   u8 *irq_mask;
> +   u8 *irq_mask_cur;
> + 

Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-29 Thread Linus Walleij
On Mon, Jul 23, 2012 at 1:59 PM, Thierry Reding
thierry.red...@avionic-design.de wrote:

 This commit adds a driver for the Avionic Design N-bit GPIO expander.
 The expander provides a variable number of GPIO pins with interrupt
 support.
(...)
 diff --git a/Documentation/devicetree/bindings/gpio/gpio-adnp.txt 
 b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
 new file mode 100644
 index 000..513a18e
 --- /dev/null
 +++ b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
 @@ -0,0 +1,38 @@
 +Avionic Design N-bit GPIO expander bindings
 +
 +Required properties:
 +- compatible: should be ad,gpio-adnp
 +- reg: The I2C slave address for this device.
 +- interrupt-parent: phandle of the parent interrupt controller.
 +- interrupts: Interrupt specifier for the controllers interrupt.
 +- #gpio-cells: Should be 2. The first cell is the GPIO number and the
 +  second cell is used to specify optional parameters:
 +  - bit 0: polarity (0: normal, 1: inverted)
 +- gpio-controller: Marks the device as a GPIO controller
 +- #interrupt-cells: Should be 2. The first cell contains the GPIO number,
 +  whereas the second cell is used to specify flags:
 +bits[3:0] trigger type and level flags
 +  1 = low-to-high edge triggered
 +  2 = high-to-low edge triggered
 +  4 = active high level-sensitive
 +  8 = active low level-sensitive

Why on earth would a bunch of flags be an interrupt cell?

Maybe there is something about DT bindings I don't get so
please educate me.

I can see that OMAP is doing this, but is it a good idea?
I really need Rob/Grant to comment on this.

 +- interrupt-controller: Marks the device as an interrupt controller.
 +- nr-gpios: The number of pins supported by the controller.

These two last things look very generic, like something every GPIO
driver could want to expose.

I'd really like to have Grant's word on GPIO DT bindings and how these
should look, I had some discussion with Wolfram (the I2C maintainer)
about bindings turning out less generic than they ought to be, so we
need some discussion on this.

Arnd recently consolidated some MMC props, maybe we need to do
the same for GPIO drivers.

(...)
 diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
 index 502b5ea..d1b0f7d 100644
 --- a/drivers/gpio/Kconfig
 +++ b/drivers/gpio/Kconfig
 @@ -444,6 +444,24 @@ config GPIO_ADP5588_IRQ
   Say yes here to enable the adp5588 to be used as an interrupt
   controller. It requires the driver to be built in the kernel.

 +config GPIO_ADNP
 +   tristate Avionic Design N-bit GPIO expander
 +   depends on I2C  OF
 +   help
 + This option enables support for N GPIOs found on Avionic Design
 + I2C GPIO expanders. The register space will be extended by powers
 + of two, so the controller will need to accomodate for that. For
 + example: if a controller provides 48 pins, 6 registers will be
 + enough to represent all pins, but the driver will assume a
 + register layout for 64 pins (8 registers).
 +
 +config GPIO_ADNP_IRQ
 +   tristate Interrupt controller support
 +   depends on GPIO_ADNP
 +   help
 + Say yes here to enable the Avionic Design N-bit GPIO expander to
 + be used as an interrupt controller.

First: please describe the usecase where the Avionic driver is used
without making use of the IRQ, and *why* it should be possible
to configure this out. E.g. is there a hardware which isn't using the
IRQ portions? If there is no non-irq usecase just drop this
config option.

If you're keeping it:

Now this is going to appear as a single line under the ADNP driver
config entry saying Interrupt controller support, which is too
generic.

Please make it expand to a submenu so that it gets indented below the
controller driver.

(...)
 diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c
 new file mode 100644
 index 000..c122ff4
 --- /dev/null
 +++ b/drivers/gpio/gpio-adnp.c
 @@ -0,0 +1,615 @@
 +/*
 + * Copyright (C) 2011-2012 Avionic Design GmbH
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License version 2 as
 + * published by the Free Software Foundation.
 + */
 +
 +#include linux/gpio.h
 +#include linux/i2c.h
 +#include linux/interrupt.h
 +#include linux/irqdomain.h

Good!

 +#include linux/module.h
 +#include linux/of_irq.h
 +#include linux/seq_file.h
 +#include linux/slab.h
 +
 +#define GPIO_DDR(gpio) (0x00  (gpio)-reg_shift)
 +#define GPIO_PLR(gpio) (0x01  (gpio)-reg_shift)
 +#define GPIO_IER(gpio) (0x02  (gpio)-reg_shift)
 +#define GPIO_ISR(gpio) (0x03  (gpio)-reg_shift)
 +#define GPIO_PTR(gpio) (0x04  (gpio)-reg_shift)
 +
 +struct adnp {
 +   struct i2c_client *client;
 +   struct gpio_chip gpio;
 +   unsigned int reg_shift;
 +
 +   struct mutex i2c_lock;
 +
 +   struct irq_domain *domain;
 +   struct mutex irq_lock;
 +
 +   u8 *irq_mask;
 +   

Re: [PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-29 Thread Arnd Bergmann
On Sunday 29 July 2012, Linus Walleij wrote:
  +- #interrupt-cells: Should be 2. The first cell contains the GPIO number,
  +  whereas the second cell is used to specify flags:
  +bits[3:0] trigger type and level flags
  +  1 = low-to-high edge triggered
  +  2 = high-to-low edge triggered
  +  4 = active high level-sensitive
  +  8 = active low level-sensitive
 
 Why on earth would a bunch of flags be an interrupt cell?
 
 Maybe there is something about DT bindings I don't get so
 please educate me.
 
 I can see that OMAP is doing this, but is it a good idea?
 I really need Rob/Grant to comment on this.

It is in fact a good idea, and it's very common to have it. The point is that
the interrupt controller requires this setting in order to configure that IRQ
for use, so putting it into a property of the device that triggers the IRQ
is the right place to have it.

  +- interrupt-controller: Marks the device as an interrupt controller.
  +- nr-gpios: The number of pins supported by the controller.
 
 These two last things look very generic, like something every GPIO
 driver could want to expose.
 
 I'd really like to have Grant's word on GPIO DT bindings and how these
 should look, I had some discussion with Wolfram (the I2C maintainer)
 about bindings turning out less generic than they ought to be, so we
 need some discussion on this.
 
 Arnd recently consolidated some MMC props, maybe we need to do
 the same for GPIO drivers.

The interrupt-controller property is standardized by IEEE. Not sure 
about what specifies the nr-gpios one, but it seems to be a good idea
to have everyone do the same thing here.

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


[PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-23 Thread Thierry Reding
This commit adds a driver for the Avionic Design N-bit GPIO expander.
The expander provides a variable number of GPIO pins with interrupt
support.

Cc: Grant Likely 
Cc: Rob Herring 
Cc: devicetree-disc...@lists.ozlabs.org
Cc: Linus Walleij 
Signed-off-by: Thierry Reding 

---
Changes in v2:
- allow building the driver as a module
- assign of_node unconditionally
- use linear mapping IRQ domain
- properly cleanup IRQ domain
- add OF device table and annotate device tables
- emulate rising and falling edge triggers
- increase #gpio-cells to 2
- drop support for !OF
- use IS_ENABLED to conditionalize DEBUG_FS code
---
 .../devicetree/bindings/gpio/gpio-adnp.txt |  38 ++
 drivers/gpio/Kconfig   |  18 +
 drivers/gpio/Makefile  |   1 +
 drivers/gpio/gpio-adnp.c   | 615 +
 4 files changed, 672 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-adnp.txt
 create mode 100644 drivers/gpio/gpio-adnp.c

diff --git a/Documentation/devicetree/bindings/gpio/gpio-adnp.txt 
b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
new file mode 100644
index 000..513a18e
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
@@ -0,0 +1,38 @@
+Avionic Design N-bit GPIO expander bindings
+
+Required properties:
+- compatible: should be "ad,gpio-adnp"
+- reg: The I2C slave address for this device.
+- interrupt-parent: phandle of the parent interrupt controller.
+- interrupts: Interrupt specifier for the controllers interrupt.
+- #gpio-cells: Should be 2. The first cell is the GPIO number and the
+  second cell is used to specify optional parameters:
+  - bit 0: polarity (0: normal, 1: inverted)
+- gpio-controller: Marks the device as a GPIO controller
+- #interrupt-cells: Should be 2. The first cell contains the GPIO number,
+  whereas the second cell is used to specify flags:
+bits[3:0] trigger type and level flags
+  1 = low-to-high edge triggered
+  2 = high-to-low edge triggered
+  4 = active high level-sensitive
+  8 = active low level-sensitive
+- interrupt-controller: Marks the device as an interrupt controller.
+- nr-gpios: The number of pins supported by the controller.
+
+Example:
+
+   gpioext: gpio-adnp@41 {
+   compatible = "ad,gpio-adnp";
+   reg = <0x41>;
+
+   interrupt-parent = <>;
+   interrupts = <160 1>;
+
+   gpio-controller;
+   #gpio-cells = <2>;
+
+   interrupt-controller;
+   #interrupt-cells = <2>;
+
+   nr-gpios = <64>;
+   };
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 502b5ea..d1b0f7d 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -444,6 +444,24 @@ config GPIO_ADP5588_IRQ
  Say yes here to enable the adp5588 to be used as an interrupt
  controller. It requires the driver to be built in the kernel.
 
+config GPIO_ADNP
+   tristate "Avionic Design N-bit GPIO expander"
+   depends on I2C && OF
+   help
+ This option enables support for N GPIOs found on Avionic Design
+ I2C GPIO expanders. The register space will be extended by powers
+ of two, so the controller will need to accomodate for that. For
+ example: if a controller provides 48 pins, 6 registers will be
+ enough to represent all pins, but the driver will assume a
+ register layout for 64 pins (8 registers).
+
+config GPIO_ADNP_IRQ
+   tristate "Interrupt controller support"
+   depends on GPIO_ADNP
+   help
+ Say yes here to enable the Avionic Design N-bit GPIO expander to
+ be used as an interrupt controller.
+
 comment "PCI GPIO expanders:"
 
 config GPIO_CS5535
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index d370481..73affce 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_GPIO_GENERIC)+= gpio-generic.o
 
 obj-$(CONFIG_GPIO_74X164)  += gpio-74x164.o
 obj-$(CONFIG_GPIO_AB8500)  += gpio-ab8500.o
+obj-$(CONFIG_GPIO_ADNP)+= gpio-adnp.o
 obj-$(CONFIG_GPIO_ADP5520) += gpio-adp5520.o
 obj-$(CONFIG_GPIO_ADP5588) += gpio-adp5588.o
 obj-$(CONFIG_GPIO_AMD8111) += gpio-amd8111.o
diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c
new file mode 100644
index 000..c122ff4
--- /dev/null
+++ b/drivers/gpio/gpio-adnp.c
@@ -0,0 +1,615 @@
+/*
+ * Copyright (C) 2011-2012 Avionic Design GmbH
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define GPIO_DDR(gpio) (0x00 << (gpio)->reg_shift)
+#define GPIO_PLR(gpio) (0x01 << (gpio)->reg_shift)
+#define GPIO_IER(gpio) (0x02 << 

[PATCH v2] gpio: Add Avionic Design N-bit GPIO expander support

2012-07-23 Thread Thierry Reding
This commit adds a driver for the Avionic Design N-bit GPIO expander.
The expander provides a variable number of GPIO pins with interrupt
support.

Cc: Grant Likely grant.lik...@secretlab.ca
Cc: Rob Herring rob.herr...@calxeda.com
Cc: devicetree-disc...@lists.ozlabs.org
Cc: Linus Walleij linus.wall...@stericsson.com
Signed-off-by: Thierry Reding thierry.red...@avionic-design.de

---
Changes in v2:
- allow building the driver as a module
- assign of_node unconditionally
- use linear mapping IRQ domain
- properly cleanup IRQ domain
- add OF device table and annotate device tables
- emulate rising and falling edge triggers
- increase #gpio-cells to 2
- drop support for !OF
- use IS_ENABLED to conditionalize DEBUG_FS code
---
 .../devicetree/bindings/gpio/gpio-adnp.txt |  38 ++
 drivers/gpio/Kconfig   |  18 +
 drivers/gpio/Makefile  |   1 +
 drivers/gpio/gpio-adnp.c   | 615 +
 4 files changed, 672 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/gpio/gpio-adnp.txt
 create mode 100644 drivers/gpio/gpio-adnp.c

diff --git a/Documentation/devicetree/bindings/gpio/gpio-adnp.txt 
b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
new file mode 100644
index 000..513a18e
--- /dev/null
+++ b/Documentation/devicetree/bindings/gpio/gpio-adnp.txt
@@ -0,0 +1,38 @@
+Avionic Design N-bit GPIO expander bindings
+
+Required properties:
+- compatible: should be ad,gpio-adnp
+- reg: The I2C slave address for this device.
+- interrupt-parent: phandle of the parent interrupt controller.
+- interrupts: Interrupt specifier for the controllers interrupt.
+- #gpio-cells: Should be 2. The first cell is the GPIO number and the
+  second cell is used to specify optional parameters:
+  - bit 0: polarity (0: normal, 1: inverted)
+- gpio-controller: Marks the device as a GPIO controller
+- #interrupt-cells: Should be 2. The first cell contains the GPIO number,
+  whereas the second cell is used to specify flags:
+bits[3:0] trigger type and level flags
+  1 = low-to-high edge triggered
+  2 = high-to-low edge triggered
+  4 = active high level-sensitive
+  8 = active low level-sensitive
+- interrupt-controller: Marks the device as an interrupt controller.
+- nr-gpios: The number of pins supported by the controller.
+
+Example:
+
+   gpioext: gpio-adnp@41 {
+   compatible = ad,gpio-adnp;
+   reg = 0x41;
+
+   interrupt-parent = gpio;
+   interrupts = 160 1;
+
+   gpio-controller;
+   #gpio-cells = 2;
+
+   interrupt-controller;
+   #interrupt-cells = 2;
+
+   nr-gpios = 64;
+   };
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 502b5ea..d1b0f7d 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -444,6 +444,24 @@ config GPIO_ADP5588_IRQ
  Say yes here to enable the adp5588 to be used as an interrupt
  controller. It requires the driver to be built in the kernel.
 
+config GPIO_ADNP
+   tristate Avionic Design N-bit GPIO expander
+   depends on I2C  OF
+   help
+ This option enables support for N GPIOs found on Avionic Design
+ I2C GPIO expanders. The register space will be extended by powers
+ of two, so the controller will need to accomodate for that. For
+ example: if a controller provides 48 pins, 6 registers will be
+ enough to represent all pins, but the driver will assume a
+ register layout for 64 pins (8 registers).
+
+config GPIO_ADNP_IRQ
+   tristate Interrupt controller support
+   depends on GPIO_ADNP
+   help
+ Say yes here to enable the Avionic Design N-bit GPIO expander to
+ be used as an interrupt controller.
+
 comment PCI GPIO expanders:
 
 config GPIO_CS5535
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index d370481..73affce 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_GPIO_GENERIC)+= gpio-generic.o
 
 obj-$(CONFIG_GPIO_74X164)  += gpio-74x164.o
 obj-$(CONFIG_GPIO_AB8500)  += gpio-ab8500.o
+obj-$(CONFIG_GPIO_ADNP)+= gpio-adnp.o
 obj-$(CONFIG_GPIO_ADP5520) += gpio-adp5520.o
 obj-$(CONFIG_GPIO_ADP5588) += gpio-adp5588.o
 obj-$(CONFIG_GPIO_AMD8111) += gpio-amd8111.o
diff --git a/drivers/gpio/gpio-adnp.c b/drivers/gpio/gpio-adnp.c
new file mode 100644
index 000..c122ff4
--- /dev/null
+++ b/drivers/gpio/gpio-adnp.c
@@ -0,0 +1,615 @@
+/*
+ * Copyright (C) 2011-2012 Avionic Design GmbH
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include linux/gpio.h
+#include linux/i2c.h
+#include linux/interrupt.h
+#include linux/irqdomain.h
+#include linux/module.h
+#include