[PATCH] pinctrl: Add SPEAr pinctrl drivers
viresh kumar
viresh.linux at gmail.com
Tue Apr 3 10:10:26 EDT 2012
On 4/3/12, Arnd Bergmann <arnd at arndb.de> wrote:
> On Tuesday 03 April 2012, Viresh Kumar wrote:
>> This adds pinctrl driver for SPEAr family. Currently it contains
>> machine/SoC
>> drivers for SPEAr3xx family only. SPEAr13xx family drivers will follow.
>>
>> Signed-off-by: Viresh Kumar <viresh.kumar at st.com>
>
> This is quite a lot of data, especially for the spear320. Have you
> tried moving some or all of the data into device tree properties?
I haven't tried DT for the properties till now.
> I can only guess that the spear13xx file would be even larger than
> these.
Not Actually. 13xx only has two SoCs - 1310 and 1340. And their
muxing is much lighter. 320 is a real big one.
>> +static struct of_device_id spear_pinctrl_of_match[] __devinitdata = {
>> +#ifdef CONFIG_PINCTRL_SPEAR300
>> + {
>> + .compatible = "st,spear300-pinmux",
>> + .data = spear300_mach_init,
>> + },
>> +#endif
>> +#ifdef CONFIG_PINCTRL_SPEAR310
>> + {
>> + .compatible = "st,spear310-pinmux",
>> + .data = spear310_mach_init,
>> + },
>> +#endif
>> +#ifdef CONFIG_PINCTRL_SPEAR320
>> + {
>> + .compatible = "st,spear320-pinmux",
>> + .data = spear320_mach_init,
>> + },
>> +#endif
>> + {},
>> +};
>
> I would recommend turning the logic around here: instead of having
> a common driver that calls into the soc specific drivers, make the
> common code a library that just exports a few symbols, and move
> each of the socs into its own module with one init function
> that calls the generic spear_pinctrl_probe, passing the appropriate
> arguments on the code that that differs.
Sure.
>> +static int __init spear_pinctrl_init(void)
>> +{
>> + return platform_driver_register(&spear_pinctrl_driver);
>> +}
>> +arch_initcall(spear_pinctrl_init);
>
> Does this need to be an arch_initcall? If it becomes a regular
> module_init(), you can condense all of this into a single
> line using module_platform_driver(), one per soc if you do as
> I suggest above.
I need to enable pinmux onetime from my soc dt_init() and
so need a arch_init here. For SPEAr, we would be doing
onetime pmx mostly.
> The initialization order dependencies can now be handled using
> the deferred probe mechanism, by returning -EPROBE_DEFER from
> the probe() function of any driver that is loaded before its
> pins are available.
Can be done, but i need arch_init() as explained earlier.
>> +static struct spear_pmx_mode pmx_mode_nand = {
>> + .name = "nand",
>> + .mode = NAND_MODE,
>> + .reg = MODE_CONFIG_REG,
>> + .mask = 0x0000000F,
>> + .val = 0x00,
>> +};
>> +
>
> These all look like they can easily get transformed into
> device nodes in the device tree.
Any example driver doing this would be helpful. Can you
give me a link. :)
>> +/* pingroups */
>> +static struct spear_pingroup *spear310_pingroups[] = {
>> + SPEAR3XX_COMMON_PINGROUPS,
>> + &emi_cs_0_to_5_pingroup,
>> + &uart1_pingroup,
>> + &uart2_pingroup,
>> + &uart3_pingroup,
>> + &uart4_pingroup,
>> + &uart5_pingroup,
>> + &fsmc_pingroup,
>> + &rs485_0_pingroup,
>> + &rs485_1_pingroup,
>> + &tdm_pingroup,
>> +};
>> +
>> +/* functions */
>> +static struct spear_function *spear310_functions[] = {
>> + SPEAR3XX_COMMON_FUNCTIONS,
>> + &emi_cs_0_to_5_function,
>> + &uart1_function,
>> + &uart2_function,
>> + &uart3_function,
>> + &uart4_function,
>> + &uart5_function,
>> + &fsmc_function,
>> + &rs485_0_function,
>> + &rs485_1_function,
>> + &tdm_function,
>> +};
>
> I believe the macros like SPEAR3XX_COMMON_FUNCTIONS are not
> needed any more, you can simply register multiple sets of pingroups
> and functions.
You mean to say, we can do multiple pinctrl_register() and define multiple
struct pinctrl_desc?
--
Viresh
More information about the linux-arm-kernel
mailing list