[U-Boot] [PATCH 3/7] mpc85xx: Add inline GPIO acessor functions
Moffett, Kyle D
Kyle.D.Moffett at boeing.com
Mon Feb 21 22:43:10 CET 2011
On Feb 21, 2011, at 16:14, Wolfgang Denk wrote:
> In message <1298311199-18775-4-git-send-email-Kyle.D.Moffett at boeing.com> you wrote:
>> To ease the implementation of other MPC85xx board ports, several common
>> GPIO helpers are added to <asm/mpc85xx_gpio.h>.
>
> In which way is this specific to 85xx? Why not make available on a
> wider base?
This particular set of registers is a particular part of the MPC85xx-series SOC.
The other boards based on mpc85xx seem to just do stuff like this:
volatile ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR);
[...]
in_be32(&pgpio->gpdat);
[...]
out_be32(&pgpio->gpdat, newdat);
[...]
I thought that was kind of ugly and abstracted it out into static inline functions in my board-specific header. Last time this was posted for review it was pointed out that they are generally applicable to all MPC85xx chips ans so I moved them to a more-generic header for other MPC85xx boards to use.
>> To assist other board ports, a small set of wrappers are used which
>> provides a standard gpio_request() interface around the MPC85xx-specific
>> functions. This can be enabled with CONFIG_MPC85XX_GENERIC_GPIO
>
> How similar is this interface with other "generic" GPIO interfaces we
> have here in U-Boot (and in Linux) ?
The interface emulates the "generic" GPIO API in Linux because Peter Tyser indicated he would use that generic interface for his other MPC85xx board ports if it was available. I don't actually use that particular API though; it isn't really suitable to my board-support code and I'd rather delete it than try to extend it further.
>> +static inline void mpc85xx_gpio_set(unsigned int mask,
>> + unsigned int dir, unsigned int val)
>> +{
>> + volatile ccsr_gpio_t *gpio;
>> +
>> + /* First mask off the unwanted parts of "dir" and "val" */
>> + dir &= mask;
>> + val &= mask;
>> +
>> + /* Now read in the values we're supposed to preserve */
>> + gpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR + 0xc00);
>> + dir |= (in_be32(&gpio->gpdir) & ~mask);
>> + val |= (in_be32(&gpio->gpdat) & ~mask);
>> +
>> + /* Now write out the new values, writing the direction first */
>> + out_be32(&gpio->gpdir, dir);
>
> This way work, but quite often is wrong. If you set the direction
> first for an output, you start driving the old value, before you set
> the correct one. This results in a short pulse that may cause
> negative side effects.
>
> Don't!
Whoops, I did get that completely backwards! I was very carefully trying to ensure a clean transition and managed to swap it :-(.
Will fix, thanks for noticing!
>> + asm("sync; isync":::"memory");
>
> Why would that be needed? out_be32() is supposed to provide sufficient
> memory barriers.
Again, I was just cribbing from some of the other board ports. If in_be32() and out_be32() are defined to provide enough barriers then I'll remove it.
>> +static inline unsigned int mpc85xx_gpio_get(unsigned int mask)
>> +{
>> + volatile ccsr_gpio_t *gpio;
>
> Why would this volatile be needed here? [Please fix globally.]
As above this was copied from other MPC85xx boards, will fix.
>> +#ifdef CONFIG_MPC85XX_GENERIC_GPIO
>> +static inline int gpio_request(unsigned gpio, const char *label)
>> +{
>> + /* Do nothing */
>> + (void)gpio;
>> + (void)label;
>
> NAK. Please don't do that. Fix globally.
>
>> +static inline int gpio_direction_input(unsigned gpio)
>> +{
>> + mpc85xx_gpio_set_in(1U << gpio);
>> + return 0;
>> +}
>
> Why is this function not void when it cannot return any usefult return
> code anyway?
>
>> +static inline int gpio_direction_output(unsigned gpio, int value)
>> +{
>> + mpc85xx_gpio_set_low(1U << gpio);
>> + return 0;
>> +}
>
> Ditto.
This is the "Linux-compatible" gpio layer that Peter Tyser was asking for. I sort-of-copied most of these functions from arch/nios2/include/asm/gpio.h, which just does the "return 0;" in several functions.
Those 2 later functions are expected to be able to return an error (for I2C chips and such). As I said above, if these wrappers are unacceptable then I will just delete them; the only thing I use are the mpc85xx_gpio_*() functions.
Thanks for the review!
Cheers,
Kyle Moffett
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 6686 bytes
Desc: not available
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110221/2a7fba91/attachment.bin
More information about the U-Boot
mailing list