On Mon, Nov 9, 2009 at 8:34 AM, Aggarwal, Anuj <anuj.aggar...@ti.com> wrote:
> Based on your suggestions, I tried creating macros specific to TWL > regulators in a common header file. This file then can be included by > the different board files and the structures can then be appropriately > created. > Here is the sample of what could be done on these lines: > > #define TWL_VDAC_SUPPLY(device) { \ The brace is not needed here --------------^ > static struct regulator_consumer_supply vdac_supply[] = { \ > { \ > .supply = "vdac", \ > .dev = device, \ > }, \ > }; \ > } ditto > #define TWL_VPLL2_SUPPLY(device) { \ the same here --------------------------------------------^ > static struct regulator_consumer_supply vpll2_supply[] = { \ > { \ > .supply = "vpll2", \ > .dev = device, \ > }, \ > }; \ > } and here > And similarly: > #define TWL_VAUX1_VDAC_DATA() { \ > static struct regulator_init_data vdac_data = { \ > .constraints = { \ > .min_uV = 1800000, \ > .max_uV = 1800000, \ > .apply_uV = true, \ > .valid_modes_mask = REGULATOR_MODE_NORMAL \ > | REGULATOR_MODE_STANDBY, \ > .valid_ops_mask = REGULATOR_CHANGE_MODE \ > | REGULATOR_CHANGE_STATUS, \ > }, \ > .num_consumer_supplies = ARRAY_SIZE(vdac_supply), \ > .consumer_supplies = vdac_supply, \ > }; \ > } > > This way, user can define his board-specific regulators in the board-* > file. > Only problem I can forsee in this approach is how to create regulators > supplying multiple devices? VLPP2 might be supplying 2-3 devices in the > system which the above #define doesn't take care. How that can be > solved? The macros should be usable for the common case to avoid code duplication in the board-* files. Boards with different supplies configuration will explicitly define their regulator_consumer_supply and regulator_init_data. > >> >> >> >> > +#include <linux/i2c/twl4030.h> >> >> > + >> >> > +extern struct twl4030_platform_data omap3evm_twldata; >> >> >> >> The *twldata does not have to be global, it can be passed to pmic_init >> >> as a parameter. >> >> >> >> > +/* VDAC */ >> >> > +static struct regulator_consumer_supply vdac_consumers[] = { >> >> > + { >> >> > + .supply = "dac", >> >> > + }, >> >> > +}; >> >> > + >> >> > +static struct regulator_init_data vdac_data = { >> >> > + .constraints = { >> >> > + .name = "VDAC", >> >> > + .min_uV = 1800000, >> >> > + .max_uV = 1800000, >> >> > + .apply_uV = true, >> >> > + .valid_modes_mask = REGULATOR_MODE_NORMAL >> >> > + | REGULATOR_MODE_STANDBY, >> >> > + .valid_ops_mask = REGULATOR_CHANGE_MODE >> >> > + | REGULATOR_CHANGE_STATUS, >> >> > + }, >> >> > + .num_consumer_supplies = ARRAY_SIZE(vdac_consumers), >> >> > + .consumer_supplies = vdac_consumers, >> >> > +}; >> >> > + >> >> > +/* VPLL2 */ >> >> > +static struct regulator_consumer_supply vpll2_consumers[] = { >> >> > + { >> >> > + .supply = "lcd", >> >> > + }, >> >> > + { >> >> > + .supply = "sdi", >> >> > + }, >> >> > +}; >> >> > + >> >> > +static struct regulator_init_data vpll2_data = { >> >> > + .constraints = { >> >> > + .name = "VPLL2", >> >> > + .min_uV = 1800000, >> >> > + .max_uV = 1800000, >> >> > + .apply_uV = true, >> >> > + .valid_modes_mask = REGULATOR_MODE_NORMAL >> >> > + | REGULATOR_MODE_STANDBY, >> >> > + .valid_ops_mask = REGULATOR_CHANGE_MODE >> >> > + | REGULATOR_CHANGE_STATUS, >> >> > + }, >> >> > + .num_consumer_supplies = ARRAY_SIZE(vpll2_consumers), >> >> > + .consumer_supplies = vpll2_consumers, >> >> > +}; >> >> > + >> >> > +/* VMMC1 */ >> >> > +struct regulator_consumer_supply vmmc1_consumers[] = { >> >> > + { >> >> > + .supply = "mmc", >> >> > + }, >> >> > +}; >> >> > + >> >> > +static struct regulator_init_data vmmc1_data = { >> >> > + .constraints = { >> >> > + .name = "VMMC1", >> >> > + .min_uV = 1850000, >> >> > + .max_uV = 3150000, >> >> > + .valid_modes_mask = REGULATOR_MODE_NORMAL >> >> > + | REGULATOR_MODE_STANDBY, >> >> > + .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE >> >> > + | REGULATOR_CHANGE_MODE | >> >> REGULATOR_CHANGE_STATUS, >> >> > + }, >> >> > + .num_consumer_supplies = ARRAY_SIZE(vmmc1_consumers), >> >> > + .consumer_supplies = vmmc1_consumers, >> >> > +}; >> >> > + >> >> > +static void __init pmic_twl4030_init(void) >> >> > { >> >> > - /* TWL4030 specific init code */ >> >> > + /* Initialize the regulator specific fields here */ >> >> > + omap3evm_twldata.vdac = &vdac_data; >> >> > + omap3evm_twldata.vpll2 = &vpll2_data; >> >> > + omap3evm_twldata.vmmc1 = &vmmc1_data; >> >> > } >> >> > +#endif /* CONFIG_MACH_OMAP3EVM */ >> >> >> >> I don't see why would you move board specific code from board specific >> >> file to some "generic" file and add #ifdefs to enable this code only >> >> for that board. Indeed, many OMAP3 boards use TWL/TPS in very similar >> >> way and it does make sence to factor the common code out. But with >> >> your approach each board will have to add its own #ifdef with almost >> >> identical code inside it. >> > [Aggarwal, Anuj] As explained above, same code can be used for OMAP3 >> based >> > platforms having the same regulator requirements. >> >> >> >> > #else >> >> > static inline void pmic_twl4030_init(void) >> >> > { >> >> > diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach- >> >> omap2/board-omap3evm.c >> >> > index dbdf062..10ac0d2 100644 >> >> > --- a/arch/arm/mach-omap2/board-omap3evm.c >> >> > +++ b/arch/arm/mach-omap2/board-omap3evm.c >> >> > @@ -197,7 +197,7 @@ static struct twl4030_madc_platform_data >> >> omap3evm_madc_data = { >> >> > .irq_line = 1, >> >> > }; >> >> > >> >> > -static struct twl4030_platform_data omap3evm_twldata = { >> >> > +struct twl4030_platform_data omap3evm_twldata = { >> >> > .irq_base = TWL4030_IRQ_BASE, >> >> > .irq_end = TWL4030_IRQ_END, >> >> > >> >> > -- >> >> > 1.6.2.4 >> >> > >> >> > -- >> >> > To unsubscribe from this list: send the line "unsubscribe linux-omap" >> in >> >> > the body of a message to majord...@vger.kernel.org >> >> > More majordomo info at http://vger.kernel.org/majordomo-info.html >> >> > >> >> >> >> >> >> >> >> -- >> >> Sincerely Yours, >> >> Mike. >> > >> > >> >> >> >> -- >> Sincerely Yours, >> Mike. > > -- Sincerely Yours, Mike. -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html