[U-Boot-Users] ppc4xx: gpio setup broken for ppc405ep
Stefan Roese
sr at denx.de
Fri Mar 28 11:34:41 CET 2008
On Thursday 27 March 2008, M B wrote:
> I found some bugs for the gpio setup for ppc405ep and was about to fix
> them. After i fixed them (for 405ep) I realised that it's rather impossible
> to have a function like gpio_set_chip_configuration to setup the gpios for
> all ppc4xx, without turning it into ifdef hell.
I definitely don't hope so. Till now it works quite well. And currently most
440 variants and 405EX are supported, IIRC.
> Even worse you can't even
> have one which only takes care of the ppc440ep.
ppc405ep?
> Maybe I misunderstood the datasheet of the ppc440ep, so please correct
> me if I'm wrong.
> According to Table 29-6 on page 687 which lists the registers for the
> alternate1 function the tsrl bits for gpio 12 have to be 01, but for
> gpio 13 they have to be 00. Both are inputs and both are alt1, so I
> don't see how to find a rule to decide what value has to be set.
I'm pretty sure that this is a documentation fault. Please contact AMCC
support on this.
> It's no big deal to have such a function for the ppc405ep and some
> others, but it should be obvious to see for what processors this
> function was tested and should fail with #error else.
>
> The Bugs I've found:
Now, that's a list...
> 1. The addresses of the select registers (input/output/3state), which
> are defined in gpio.h of the ppc405ep are wrong. The address of the
> low register is 4 bytes higher than the high register.
I think you spotted an error in U-Boot here. Seems like this is defined
incorrectly for some 405 variants. Please take a look at the 405EX defines.
They are correct.
> Furthermore
> GPIOs 0-16 are managed by the high register. Because the meaning and
> the address of the registers have changed, gpios 0-16 can be
> configured, which makes spotting this bug more difficult.
> 2. config_gpio assumes the address of the high register to be 4 bytes
> above the low register, which isn't the case for 405ep.
Please see above.
> 3. gpio_set_chip_configuration also assumes the address of the high
> register to be 4 bytes above the low register.
> 3.1 Furthermore the 3state select registers will get set, which should
> always be 00 for the 405ep.
> 3.2 The TCR register bits will only get set for gpio_out && gpio_sel,
> but they must be set for all outputs on 405ep.
Not sure here. I'll have to look at this when I have more time.
> 4. The taihu board (405ep) uses gpio_set_chip_configuration.
Right. And it seems to work. Or did I miss something here?
> This bugs probably could have been avoided if the addresses of the
> registers would have been defined with #else #error, at least we would
> have a scapegoat now, who defined the wrong addresses.
> So why not add this rule to the coding style?
Not sure what you mean with this.
> Because no 405ep board uses config_gpio and only taihu uses
> gpio_set_chip_configuration, I think it would be best to undef this
> error prone functions and registers for 405ep.
I don't think so.
> The registers defined
> in ppc405.h are correct,
No, I don't think they are correct. These are the defines for 405EP (and 405GP
btw) in ppc405.h (I know this file is hell):
#define GPIO_BASE 0xEF600700
#define GPIO0_OR (GPIO_BASE+0x0)
#define GPIO0_TCR (GPIO_BASE+0x4)
#define GPIO0_OSRH (GPIO_BASE+0x8)
#define GPIO0_OSRL (GPIO_BASE+0xC)
#define GPIO0_TSRH (GPIO_BASE+0x10)
#define GPIO0_TSRL (GPIO_BASE+0x14)
#define GPIO0_ODR (GPIO_BASE+0x18)
#define GPIO0_IR (GPIO_BASE+0x1C)
#define GPIO0_RR1 (GPIO_BASE+0x20)
#define GPIO0_RR2 (GPIO_BASE+0x24)
#define GPIO0_ISR1H (GPIO_BASE+0x30)
#define GPIO0_ISR1L (GPIO_BASE+0x34)
#define GPIO0_ISR2H (GPIO_BASE+0x38)
#define GPIO0_ISR2L (GPIO_BASE+0x3C)
And as you pointed out above, this is incorrect. High and low is swapped here.
But these defines are not used in gpio_set_chip_configuration(). So it should
not matter for this function. But they *are* used in gpio_config(). And
that's the reason why this functions can't be used correctly on 405EX/GR
currently.
> so most boards are o.k. anyway.
> I would have a patch for the registers and config_gpio, so if you
> don't agree with my solution I can submit it.
I suggest to fix gpio_config() to use the same GPIO register access as done in
gpio_set_chip_configuration(). Then this function should be usable for those
PPC variants too.
Please let me know if you think I missed something. Thanks.
Best regards,
Stefan
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
=====================================================================
More information about the U-Boot
mailing list