
Hi,
On 10/30/2014 10:08 AM, Ian Campbell wrote:
On Wed, 2014-10-29 at 13:28 -0600, Simon Glass wrote:
In the meantime could we somehow replace/augment the #ifdef chain in gpio_init with something keyed off the stdout alias perhaps?
Tegra has code to convert a device interrupt number (which uniquely identifies a peripheral in that SoC) to an internal peripheral ID, then these is a function which can enable a peripheral given the ID (funcmux). In some cases you could have multiple options for the funcmux, but there is no easy way to support this.
I think that although there are multiple options for some functions (UARTs come to mind) we haven't yet found the need to make any dynamic choices, so it's all static right now.
But this approach might be good enough for sunxi. We can easily write the function to enable the pins for a particular port, and this could go in arch/arm/...sunxi/ perhaps.
I'm ok with it so long as it isn't going to stand in the way of proper dt based pinmux in the future.
One way to help with that might be to use the allwinner,function property in DT as the funcmux name.
Hans, what do you think?
I'm not 100% sure what you're suggesting here, are you suggesting to have a 1:1 mapping between function names as stored in allwinner,function in dts and the value to pass to sunxi_gpio_set_cfgpin ?
This is not going to fly very far, e.g. the "uart0" function has cfg value of 2 on portb while it has a value of 4 on portf.
So we will really need a sunxi specific function to go from port-no + allwinner,function-string to a sunxi_gpio_set_cfgpin function.
I think the best thing we can do to not make this function too big is do 3 things:
1) Have a table which only contains mapping where the cfg value is not 2, most ipblocks have a "primary" gpio port they are intended to be used with, and this usage maps to a cfg value of 2, and most designs use this, so have a list of exceptions and return 2 otherwise, this will make debugging of issues where the mux is not setup a bit harder, but it will keep things a lot smaller.
2) Only but things in there which are actually used by boards, or we expect to need in the near future.
3) Have #ifndef CONFIG_SPL_BUILD .. #endif around anything but mmc / uart entries in that table.
Together those should keep things small enough for the SPL.
Regards,
Hans