Message ID | 1304687833-4578-5-git-send-email-leslyam@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
* Lesly A M <leslyam@ti.com> [110506 06:14]: > Power bus message sequence for TWL4030 to enter sleep/wakeup/warm_reset. > > TWL4030 power scripts which can be used by different OMAP3 boards > with the power companion chip (TWL4030 series). > > The twl4030 generic script can be used by any board file to update > the power data in twl4030_platform_data. > > Since the TWL4030 power script has dependency with APIs in twl4030-power.c > removing the __init for these APIs. > > For more information please see: > http://omapedia.org/wiki/TWL4030_power_scripts > > Signed-off-by: Lesly A M <leslyam@ti.com> > Cc: Nishanth Menon <nm@ti.com> > Cc: David Derrick <dderrick@ti.com> > Cc: Samuel Ortiz <sameo@linux.intel.com> > --- > arch/arm/configs/omap2plus_defconfig | 1 + > arch/arm/mach-omap2/devices.c | 15 ++ > drivers/mfd/Kconfig | 11 + > drivers/mfd/Makefile | 1 + > drivers/mfd/twl4030-power.c | 31 ++-- > drivers/mfd/twl4030-script-omap.c | 373 ++++++++++++++++++++++++++++++++++ > include/linux/i2c/twl.h | 41 ++++- > 7 files changed, 454 insertions(+), 19 deletions(-) > create mode 100644 drivers/mfd/twl4030-script-omap.c > > diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig > index 076db52..d9b9858 100644 > --- a/arch/arm/configs/omap2plus_defconfig > +++ b/arch/arm/configs/omap2plus_defconfig > @@ -184,6 +184,7 @@ CONFIG_TWL4030_WATCHDOG=y > CONFIG_MENELAUS=y > CONFIG_TWL4030_CORE=y > CONFIG_TWL4030_POWER=y > +CONFIG_TWL4030_SCRIPT=m > CONFIG_REGULATOR=y > CONFIG_REGULATOR_TWL4030=y > CONFIG_REGULATOR_TPS65023=y > diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c > index 7b85585..7653329 100644 > --- a/arch/arm/mach-omap2/devices.c > +++ b/arch/arm/mach-omap2/devices.c > @@ -329,6 +329,20 @@ static void omap_init_audio(void) > static inline void omap_init_audio(void) {} > #endif > > +#ifdef CONFIG_ARCH_OMAP3 > +static struct platform_device omap_twl4030_script = { > + .name = "twl4030_script", > + .id = -1, > +}; > + > +static void omap_init_twl4030_script(void) > +{ > + platform_device_register(&omap_twl4030_script); > +} > +#else > +static inline void omap_init_twl4030_script(void) {} > +#endif This should be if defined(CONFIG_TWL4030_SCRIPT) || defined(CONFIG_TWL4030_SCRIPT_MODULE) instead. And you should probably only enable it based on some board specific flag. > #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE) > > #include <plat/mcspi.h> > @@ -691,6 +705,7 @@ static int __init omap2_init_devices(void) > omap_init_sham(); > omap_init_aes(); > omap_init_vout(); > + omap_init_twl4030_script(); > > return 0; > } The changes above probably also conflict with what I have in devel-cleanup branch. So maybe split it so I can take this part? Also, please note that patches touching arch/arm/*omap*/ files should also be sent with linux-arm-kernel list Cc'd. Regards, Tony Tony -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Tony, On Thu, May 12, 2011 at 4:26 PM, Tony Lindgren <tony@atomide.com> wrote: > * Lesly A M <leslyam@ti.com> [110506 06:14]: >> Power bus message sequence for TWL4030 to enter sleep/wakeup/warm_reset. >> >> TWL4030 power scripts which can be used by different OMAP3 boards >> with the power companion chip (TWL4030 series). >> >> The twl4030 generic script can be used by any board file to update >> the power data in twl4030_platform_data. >> >> Since the TWL4030 power script has dependency with APIs in twl4030-power.c >> removing the __init for these APIs. >> >> For more information please see: >> http://omapedia.org/wiki/TWL4030_power_scripts >> >> Signed-off-by: Lesly A M <leslyam@ti.com> >> Cc: Nishanth Menon <nm@ti.com> >> Cc: David Derrick <dderrick@ti.com> >> Cc: Samuel Ortiz <sameo@linux.intel.com> >> --- >> arch/arm/configs/omap2plus_defconfig | 1 + >> arch/arm/mach-omap2/devices.c | 15 ++ >> drivers/mfd/Kconfig | 11 + >> drivers/mfd/Makefile | 1 + >> drivers/mfd/twl4030-power.c | 31 ++-- >> drivers/mfd/twl4030-script-omap.c | 373 ++++++++++++++++++++++++++++++++++ >> include/linux/i2c/twl.h | 41 ++++- >> 7 files changed, 454 insertions(+), 19 deletions(-) >> create mode 100644 drivers/mfd/twl4030-script-omap.c >> >> diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig >> index 076db52..d9b9858 100644 >> --- a/arch/arm/configs/omap2plus_defconfig >> +++ b/arch/arm/configs/omap2plus_defconfig >> @@ -184,6 +184,7 @@ CONFIG_TWL4030_WATCHDOG=y >> CONFIG_MENELAUS=y >> CONFIG_TWL4030_CORE=y >> CONFIG_TWL4030_POWER=y >> +CONFIG_TWL4030_SCRIPT=m >> CONFIG_REGULATOR=y >> CONFIG_REGULATOR_TWL4030=y >> CONFIG_REGULATOR_TPS65023=y >> diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c >> index 7b85585..7653329 100644 >> --- a/arch/arm/mach-omap2/devices.c >> +++ b/arch/arm/mach-omap2/devices.c >> @@ -329,6 +329,20 @@ static void omap_init_audio(void) >> static inline void omap_init_audio(void) {} >> #endif >> >> +#ifdef CONFIG_ARCH_OMAP3 >> +static struct platform_device omap_twl4030_script = { >> + .name = "twl4030_script", >> + .id = -1, >> +}; >> + >> +static void omap_init_twl4030_script(void) >> +{ >> + platform_device_register(&omap_twl4030_script); >> +} >> +#else >> +static inline void omap_init_twl4030_script(void) {} >> +#endif > > This should be if defined(CONFIG_TWL4030_SCRIPT) || > defined(CONFIG_TWL4030_SCRIPT_MODULE) instead. And you should > probably only enable it based on some board specific flag. Ok > >> #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE) >> >> #include <plat/mcspi.h> >> @@ -691,6 +705,7 @@ static int __init omap2_init_devices(void) >> omap_init_sham(); >> omap_init_aes(); >> omap_init_vout(); >> + omap_init_twl4030_script(); >> >> return 0; >> } > > The changes above probably also conflict with what I have > in devel-cleanup branch. So maybe split it so I can take this > part? Ok, I will split this change to a separate patch. > Also, please note that patches touching arch/arm/*omap*/ > files should also be sent with linux-arm-kernel list Cc'd. Ok Regards, Lesly -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Lesly, On Fri, May 06, 2011 at 06:47:10PM +0530, Lesly A M wrote: > Power bus message sequence for TWL4030 to enter sleep/wakeup/warm_reset. > > TWL4030 power scripts which can be used by different OMAP3 boards > with the power companion chip (TWL4030 series). > > The twl4030 generic script can be used by any board file to update > the power data in twl4030_platform_data. > > Since the TWL4030 power script has dependency with APIs in twl4030-power.c > removing the __init for these APIs. > > For more information please see: > http://omapedia.org/wiki/TWL4030_power_scripts I understand you guys are trying to keep the arch/arm stats to a sane level, but I don't see why this driver should be under drivers/mfd/. I'm usually flexible about what goes into drivers/mfd, but this one seems out of context to me. Cheers, Samuel.
Hi Samuel, On Sat, May 14, 2011 at 12:09 AM, Samuel Ortiz <sameo@linux.intel.com> wrote: > Hi Lesly, > > On Fri, May 06, 2011 at 06:47:10PM +0530, Lesly A M wrote: >> Power bus message sequence for TWL4030 to enter sleep/wakeup/warm_reset. >> >> TWL4030 power scripts which can be used by different OMAP3 boards >> with the power companion chip (TWL4030 series). >> >> The twl4030 generic script can be used by any board file to update >> the power data in twl4030_platform_data. >> >> Since the TWL4030 power script has dependency with APIs in twl4030-power.c >> removing the __init for these APIs. >> >> For more information please see: >> http://omapedia.org/wiki/TWL4030_power_scripts > I understand you guys are trying to keep the arch/arm stats to a sane level, > but I don't see why this driver should be under drivers/mfd/. I'm usually > flexible about what goes into drivers/mfd, but this one seems out of context > to me. Since this script driver file contains the changes for PM IC (TWL4030 series), which is a Multifunction devices with GPIOs, USB, audio, current regulators, power management chip, ... This script driver file contains the pm bus message sequence which will be programmed in the scratch memory of the PM IC, and some resource configuration data for PM IC resources. This change was suggested by Tony for the last version of this patch series. Regards, Lesly A M -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Lesly, On Tue, May 17, 2011 at 07:10:03PM +0530, Manuel, Lesly Arackal wrote: > Hi Samuel, > > On Sat, May 14, 2011 at 12:09 AM, Samuel Ortiz <sameo@linux.intel.com> wrote: > > Hi Lesly, > > > > On Fri, May 06, 2011 at 06:47:10PM +0530, Lesly A M wrote: > >> Power bus message sequence for TWL4030 to enter sleep/wakeup/warm_reset. > >> > >> TWL4030 power scripts which can be used by different OMAP3 boards > >> with the power companion chip (TWL4030 series). > >> > >> The twl4030 generic script can be used by any board file to update > >> the power data in twl4030_platform_data. > >> > >> Since the TWL4030 power script has dependency with APIs in twl4030-power.c > >> removing the __init for these APIs. > >> > >> For more information please see: > >> http://omapedia.org/wiki/TWL4030_power_scripts > > I understand you guys are trying to keep the arch/arm stats to a sane level, > > but I don't see why this driver should be under drivers/mfd/. I'm usually > > flexible about what goes into drivers/mfd, but this one seems out of context > > to me. > > Since this script driver file contains the changes for PM IC (TWL4030 series), > which is a Multifunction devices with GPIOs, USB, audio, > current regulators, power management chip, ... > > This script driver file contains the pm bus message sequence which will be > programmed in the scratch memory of the PM IC, and some resource configuration > data for PM IC resources. > > This change was suggested by Tony for the last version of this patch series. I understand, but I'm trying to get the "let's push everything that somehow linked to our MFD driver to drivers/mfd/" crazyness down to a sane level. This one doesn't look like it should be part of drivers/mfd. Cheers, Samuel.
Hi Samuel, On Mon, May 23, 2011 at 3:10 AM, Samuel Ortiz <sameo@linux.intel.com> wrote: > Hi Lesly, > > On Tue, May 17, 2011 at 07:10:03PM +0530, Manuel, Lesly Arackal wrote: >> Hi Samuel, >> >> On Sat, May 14, 2011 at 12:09 AM, Samuel Ortiz <sameo@linux.intel.com> wrote: >> > Hi Lesly, >> > >> > On Fri, May 06, 2011 at 06:47:10PM +0530, Lesly A M wrote: >> >> Power bus message sequence for TWL4030 to enter sleep/wakeup/warm_reset. >> >> >> >> TWL4030 power scripts which can be used by different OMAP3 boards >> >> with the power companion chip (TWL4030 series). >> >> >> >> The twl4030 generic script can be used by any board file to update >> >> the power data in twl4030_platform_data. >> >> >> >> Since the TWL4030 power script has dependency with APIs in twl4030-power.c >> >> removing the __init for these APIs. >> >> >> >> For more information please see: >> >> http://omapedia.org/wiki/TWL4030_power_scripts >> > I understand you guys are trying to keep the arch/arm stats to a sane level, >> > but I don't see why this driver should be under drivers/mfd/. I'm usually >> > flexible about what goes into drivers/mfd, but this one seems out of context >> > to me. >> >> Since this script driver file contains the changes for PM IC (TWL4030 series), >> which is a Multifunction devices with GPIOs, USB, audio, >> current regulators, power management chip, ... >> >> This script driver file contains the pm bus message sequence which will be >> programmed in the scratch memory of the PM IC, and some resource configuration >> data for PM IC resources. >> >> This change was suggested by Tony for the last version of this patch series. > I understand, but I'm trying to get the "let's push everything that somehow > linked to our MFD driver to drivers/mfd/" crazyness down to a sane level. > This one doesn't look like it should be part of drivers/mfd. > This was moved to drivers/mfd/ based on the discussion of last version of this patch series. http://www.mail-archive.com/linux-omap@vger.kernel.org/msg48349.html I am slightly confused about, where to place these changes ? in ../../mach-omap2/ or drivers/mfd/ ... -- Thanks & Regards, Lesly A M -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Lesly A M <leslyam@ti.com> writes: > Power bus message sequence for TWL4030 to enter sleep/wakeup/warm_reset. > > TWL4030 power scripts which can be used by different OMAP3 boards > with the power companion chip (TWL4030 series). > > The twl4030 generic script can be used by any board file to update > the power data in twl4030_platform_data. What about existing board files that are using their own scripts? On n900 for example, board-rx51-peripherals.c has its own custom scripts which are registered at board init time. These are then over written by your new driver which loads later. So first, can you verify if the n900 scripts can/should be replaced by these generic ones. And second, please find a way for board files to override these scripts at runtime instead of using a Kconfig. > Since the TWL4030 power script has dependency with APIs in twl4030-power.c > removing the __init for these APIs. I think separating this part out into a separate patch, with a better description would make the rest of this patch much more readable. As it is, it doesn't make much sense since all the script functions and data are __init or __initdata. These changes also introduce a new complier warning: CC drivers/mfd/twl4030-power.o /work/kernel/omap/pm/drivers/mfd/twl4030-power.c: In function 'twl4030_power_init': /work/kernel/omap/pm/drivers/mfd/twl4030-power.c:457:5: warning: 'err' may be used uninitialized in this function /work/kernel/omap/pm/drivers/mfd/twl4030-power.c:171:6: note: 'err' was declared here > For more information please see: > http://omapedia.org/wiki/TWL4030_power_scripts This is an excellent wiki, thank for the detailed description! > Signed-off-by: Lesly A M <leslyam@ti.com> > Cc: Nishanth Menon <nm@ti.com> > Cc: David Derrick <dderrick@ti.com> > Cc: Samuel Ortiz <sameo@linux.intel.com> > --- > arch/arm/configs/omap2plus_defconfig | 1 + > arch/arm/mach-omap2/devices.c | 15 ++ > drivers/mfd/Kconfig | 11 + > drivers/mfd/Makefile | 1 + > drivers/mfd/twl4030-power.c | 31 ++-- > drivers/mfd/twl4030-script-omap.c | 373 ++++++++++++++++++++++++++++++++++ > include/linux/i2c/twl.h | 41 ++++- > 7 files changed, 454 insertions(+), 19 deletions(-) > create mode 100644 drivers/mfd/twl4030-script-omap.c > > diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig > index 076db52..d9b9858 100644 > --- a/arch/arm/configs/omap2plus_defconfig > +++ b/arch/arm/configs/omap2plus_defconfig > @@ -184,6 +184,7 @@ CONFIG_TWL4030_WATCHDOG=y > CONFIG_MENELAUS=y > CONFIG_TWL4030_CORE=y > CONFIG_TWL4030_POWER=y > +CONFIG_TWL4030_SCRIPT=m > CONFIG_REGULATOR=y > CONFIG_REGULATOR_TWL4030=y > CONFIG_REGULATOR_TPS65023=y > diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c > index 7b85585..7653329 100644 > --- a/arch/arm/mach-omap2/devices.c > +++ b/arch/arm/mach-omap2/devices.c > @@ -329,6 +329,20 @@ static void omap_init_audio(void) > static inline void omap_init_audio(void) {} > #endif > > +#ifdef CONFIG_ARCH_OMAP3 Shouldn't this depend on CONFIG_TWL4030_SCRIPT ? > +static struct platform_device omap_twl4030_script = { > + .name = "twl4030_script", > + .id = -1, > +}; > + > +static void omap_init_twl4030_script(void) > +{ > + platform_device_register(&omap_twl4030_script); > +} > +#else > +static inline void omap_init_twl4030_script(void) {} > +#endif I guess this gets to the debate about whether these scripts should be in drivers/mfd or in arch/arm/mach-omap2, but wherever the script data lives, this platform_device definition and register should be also. IOW, there's not a clean separation between driver and device currently. IMO, The platform_driver part should just be part of twl4030-power.c, and all the scripts and platform_device creation/registration should be part of the script file. As far as where the script device data should go, I'd vote for drivers/mfd, where it can be compiled as a module along with the rest of the twl4030 code. > #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE) > > #include <plat/mcspi.h> > @@ -691,6 +705,7 @@ static int __init omap2_init_devices(void) > omap_init_sham(); > omap_init_aes(); > omap_init_vout(); > + omap_init_twl4030_script(); > > return 0; > } > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index 3ed3ff0..bed88ce 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -204,6 +204,17 @@ config TWL4030_POWER > and load scripts controlling which resources are switched off/on > or reset when a sleep, wakeup or warm reset event occurs. > > +config TWL4030_SCRIPT > + tristate "Support TWL4030 script for OMAP3 boards" > + depends on TWL4030_CORE && TWL4030_POWER > + help > + Say yes here if you want to use the twl4030 power scripts > + for OMAP3 boards. Power bus message sequence for > + TWL4030 to enter sleep/wakeup/warm_reset. > + > + TWL4030 power scripts which can be used by different > + OMAP3 boards with the power companion chip (TWL4030 series). > + Why do we need another Kconfig for this? It should be enabled and overridden at runtime via board files. Kevin -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Kevin, On Thu, Jun 2, 2011 at 11:59 PM, Kevin Hilman <khilman@ti.com> wrote: > Lesly A M <leslyam@ti.com> writes: > >> Power bus message sequence for TWL4030 to enter sleep/wakeup/warm_reset. >> >> TWL4030 power scripts which can be used by different OMAP3 boards >> with the power companion chip (TWL4030 series). >> >> The twl4030 generic script can be used by any board file to update >> the power data in twl4030_platform_data. > > What about existing board files that are using their own scripts? > > On n900 for example, board-rx51-peripherals.c has its own custom > scripts which are registered at board init time. These are then > over written by your new driver which loads later. > > So first, can you verify if the n900 scripts can/should be replaced by > these generic ones. And second, please find a way for board files to > override these scripts at runtime instead of using a Kconfig. Customer boards have to modify the script for their board (may be using modem which is not present in SDP). Is it ok to add a flag to check whether the board file has already initialized the script. >> Since the TWL4030 power script has dependency with APIs in twl4030-power.c >> removing the __init for these APIs. > > I think separating this part out into a separate patch, with a better > description would make the rest of this patch much more readable. As it > is, it doesn't make much sense since all the script functions and data > are __init or __initdata. Ok > These changes also introduce a new complier warning: > > CC drivers/mfd/twl4030-power.o > /work/kernel/omap/pm/drivers/mfd/twl4030-power.c: In function 'twl4030_power_init': > /work/kernel/omap/pm/drivers/mfd/twl4030-power.c:457:5: warning: 'err' may be used uninitialized in this function > /work/kernel/omap/pm/drivers/mfd/twl4030-power.c:171:6: note: 'err' was declared here Ok, I will fix it > >> For more information please see: >> http://omapedia.org/wiki/TWL4030_power_scripts > > This is an excellent wiki, thank for the detailed description! > >> Signed-off-by: Lesly A M <leslyam@ti.com> >> Cc: Nishanth Menon <nm@ti.com> >> Cc: David Derrick <dderrick@ti.com> >> Cc: Samuel Ortiz <sameo@linux.intel.com> >> --- >> arch/arm/configs/omap2plus_defconfig | 1 + >> arch/arm/mach-omap2/devices.c | 15 ++ >> drivers/mfd/Kconfig | 11 + >> drivers/mfd/Makefile | 1 + >> drivers/mfd/twl4030-power.c | 31 ++-- >> drivers/mfd/twl4030-script-omap.c | 373 ++++++++++++++++++++++++++++++++++ >> include/linux/i2c/twl.h | 41 ++++- >> 7 files changed, 454 insertions(+), 19 deletions(-) >> create mode 100644 drivers/mfd/twl4030-script-omap.c >> >> diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig >> index 076db52..d9b9858 100644 >> --- a/arch/arm/configs/omap2plus_defconfig >> +++ b/arch/arm/configs/omap2plus_defconfig >> @@ -184,6 +184,7 @@ CONFIG_TWL4030_WATCHDOG=y >> CONFIG_MENELAUS=y >> CONFIG_TWL4030_CORE=y >> CONFIG_TWL4030_POWER=y >> +CONFIG_TWL4030_SCRIPT=m >> CONFIG_REGULATOR=y >> CONFIG_REGULATOR_TWL4030=y >> CONFIG_REGULATOR_TPS65023=y >> diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c >> index 7b85585..7653329 100644 >> --- a/arch/arm/mach-omap2/devices.c >> +++ b/arch/arm/mach-omap2/devices.c >> @@ -329,6 +329,20 @@ static void omap_init_audio(void) >> static inline void omap_init_audio(void) {} >> #endif >> >> +#ifdef CONFIG_ARCH_OMAP3 > > Shouldn't this depend on CONFIG_TWL4030_SCRIPT ? Ok >> +static struct platform_device omap_twl4030_script = { >> + .name = "twl4030_script", >> + .id = -1, >> +}; >> + >> +static void omap_init_twl4030_script(void) >> +{ >> + platform_device_register(&omap_twl4030_script); >> +} >> +#else >> +static inline void omap_init_twl4030_script(void) {} >> +#endif > > I guess this gets to the debate about whether these scripts should be in > drivers/mfd or in arch/arm/mach-omap2, but wherever the script data > lives, this platform_device definition and register should be also. > > IOW, there's not a clean separation between driver and device currently. > IMO, The platform_driver part should just be part of twl4030-power.c, > and all the scripts and platform_device creation/registration should be > part of the script file. > > As far as where the script device data should go, I'd vote for > drivers/mfd, where it can be compiled as a module along with the rest of > the twl4030 code. Any final conclusion ? >> #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE) >> >> #include <plat/mcspi.h> >> @@ -691,6 +705,7 @@ static int __init omap2_init_devices(void) >> omap_init_sham(); >> omap_init_aes(); >> omap_init_vout(); >> + omap_init_twl4030_script(); >> >> return 0; >> } >> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig >> index 3ed3ff0..bed88ce 100644 >> --- a/drivers/mfd/Kconfig >> +++ b/drivers/mfd/Kconfig >> @@ -204,6 +204,17 @@ config TWL4030_POWER >> and load scripts controlling which resources are switched off/on >> or reset when a sleep, wakeup or warm reset event occurs. >> >> +config TWL4030_SCRIPT >> + tristate "Support TWL4030 script for OMAP3 boards" >> + depends on TWL4030_CORE && TWL4030_POWER >> + help >> + Say yes here if you want to use the twl4030 power scripts >> + for OMAP3 boards. Power bus message sequence for >> + TWL4030 to enter sleep/wakeup/warm_reset. >> + >> + TWL4030 power scripts which can be used by different >> + OMAP3 boards with the power companion chip (TWL4030 series). >> + > > Why do we need another Kconfig for this? It should be enabled and > overridden at runtime via board files. Kconfig option was added when script was changed to insert-able module, which was suggested by Tony as comment for last version. Thanks & Regards, Lesly -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
"Manuel, Lesly Arackal" <leslyam@ti.com> writes: > Hi Kevin, > > On Thu, Jun 2, 2011 at 11:59 PM, Kevin Hilman <khilman@ti.com> wrote: >> Lesly A M <leslyam@ti.com> writes: >> >>> Power bus message sequence for TWL4030 to enter sleep/wakeup/warm_reset. >>> >>> TWL4030 power scripts which can be used by different OMAP3 boards >>> with the power companion chip (TWL4030 series). >>> >>> The twl4030 generic script can be used by any board file to update >>> the power data in twl4030_platform_data. >> >> What about existing board files that are using their own scripts? >> >> On n900 for example, board-rx51-peripherals.c has its own custom >> scripts which are registered at board init time. These are then >> over written by your new driver which loads later. >> >> So first, can you verify if the n900 scripts can/should be replaced by >> these generic ones. And second, please find a way for board files to >> override these scripts at runtime instead of using a Kconfig. > > Customer boards have to modify the script for their board > (may be using modem which is not present in SDP). > Is it ok to add a flag to check whether the board file has already > initialized the script. Sounds fine. >>> Since the TWL4030 power script has dependency with APIs in twl4030-power.c >>> removing the __init for these APIs. >> >> I think separating this part out into a separate patch, with a better >> description would make the rest of this patch much more readable. As it >> is, it doesn't make much sense since all the script functions and data >> are __init or __initdata. > Ok > >> These changes also introduce a new complier warning: >> >> CC drivers/mfd/twl4030-power.o >> /work/kernel/omap/pm/drivers/mfd/twl4030-power.c: In function 'twl4030_power_init': >> /work/kernel/omap/pm/drivers/mfd/twl4030-power.c:457:5: warning: 'err' may be used uninitialized in this function >> /work/kernel/omap/pm/drivers/mfd/twl4030-power.c:171:6: note: 'err' was declared here > > Ok, I will fix it >> >>> For more information please see: >>> http://omapedia.org/wiki/TWL4030_power_scripts >> >> This is an excellent wiki, thank for the detailed description! >> >>> Signed-off-by: Lesly A M <leslyam@ti.com> >>> Cc: Nishanth Menon <nm@ti.com> >>> Cc: David Derrick <dderrick@ti.com> >>> Cc: Samuel Ortiz <sameo@linux.intel.com> >>> --- >>> arch/arm/configs/omap2plus_defconfig | 1 + >>> arch/arm/mach-omap2/devices.c | 15 ++ >>> drivers/mfd/Kconfig | 11 + >>> drivers/mfd/Makefile | 1 + >>> drivers/mfd/twl4030-power.c | 31 ++-- >>> drivers/mfd/twl4030-script-omap.c | 373 ++++++++++++++++++++++++++++++++++ >>> include/linux/i2c/twl.h | 41 ++++- >>> 7 files changed, 454 insertions(+), 19 deletions(-) >>> create mode 100644 drivers/mfd/twl4030-script-omap.c >>> >>> diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig >>> index 076db52..d9b9858 100644 >>> --- a/arch/arm/configs/omap2plus_defconfig >>> +++ b/arch/arm/configs/omap2plus_defconfig >>> @@ -184,6 +184,7 @@ CONFIG_TWL4030_WATCHDOG=y >>> CONFIG_MENELAUS=y >>> CONFIG_TWL4030_CORE=y >>> CONFIG_TWL4030_POWER=y >>> +CONFIG_TWL4030_SCRIPT=m >>> CONFIG_REGULATOR=y >>> CONFIG_REGULATOR_TWL4030=y >>> CONFIG_REGULATOR_TPS65023=y >>> diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c >>> index 7b85585..7653329 100644 >>> --- a/arch/arm/mach-omap2/devices.c >>> +++ b/arch/arm/mach-omap2/devices.c >>> @@ -329,6 +329,20 @@ static void omap_init_audio(void) >>> static inline void omap_init_audio(void) {} >>> #endif >>> >>> +#ifdef CONFIG_ARCH_OMAP3 >> >> Shouldn't this depend on CONFIG_TWL4030_SCRIPT ? > Ok > >>> +static struct platform_device omap_twl4030_script = { >>> + .name = "twl4030_script", >>> + .id = -1, >>> +}; >>> + >>> +static void omap_init_twl4030_script(void) >>> +{ >>> + platform_device_register(&omap_twl4030_script); >>> +} >>> +#else >>> +static inline void omap_init_twl4030_script(void) {} >>> +#endif >> >> I guess this gets to the debate about whether these scripts should be in >> drivers/mfd or in arch/arm/mach-omap2, but wherever the script data >> lives, this platform_device definition and register should be also. >> >> IOW, there's not a clean separation between driver and device currently. >> IMO, The platform_driver part should just be part of twl4030-power.c, >> and all the scripts and platform_device creation/registration should be >> part of the script file. >> >> As far as where the script device data should go, I'd vote for >> drivers/mfd, where it can be compiled as a module along with the rest of >> the twl4030 code. > > Any final conclusion ? > >>> #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE) >>> >>> #include <plat/mcspi.h> >>> @@ -691,6 +705,7 @@ static int __init omap2_init_devices(void) >>> omap_init_sham(); >>> omap_init_aes(); >>> omap_init_vout(); >>> + omap_init_twl4030_script(); >>> >>> return 0; >>> } >>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig >>> index 3ed3ff0..bed88ce 100644 >>> --- a/drivers/mfd/Kconfig >>> +++ b/drivers/mfd/Kconfig >>> @@ -204,6 +204,17 @@ config TWL4030_POWER >>> and load scripts controlling which resources are switched off/on >>> or reset when a sleep, wakeup or warm reset event occurs. >>> >>> +config TWL4030_SCRIPT >>> + tristate "Support TWL4030 script for OMAP3 boards" >>> + depends on TWL4030_CORE && TWL4030_POWER >>> + help >>> + Say yes here if you want to use the twl4030 power scripts >>> + for OMAP3 boards. Power bus message sequence for >>> + TWL4030 to enter sleep/wakeup/warm_reset. >>> + >>> + TWL4030 power scripts which can be used by different >>> + OMAP3 boards with the power companion chip (TWL4030 series). >>> + >> >> Why do we need another Kconfig for this? It should be enabled and >> overridden at runtime via board files. > > Kconfig option was added when script was changed to insert-able module, > which was suggested by Tony as comment for last version. Yes, it needs to be a loadable module, but doesn't need Kconfig. IMO, it should just be build whenever CONFIG_TWL4030_POWER=y && CONFIG_ARCH_OMAP2PLUS=y Adding another build option means needing to ensure more build-option testing coverage. Kevin -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index 076db52..d9b9858 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig @@ -184,6 +184,7 @@ CONFIG_TWL4030_WATCHDOG=y CONFIG_MENELAUS=y CONFIG_TWL4030_CORE=y CONFIG_TWL4030_POWER=y +CONFIG_TWL4030_SCRIPT=m CONFIG_REGULATOR=y CONFIG_REGULATOR_TWL4030=y CONFIG_REGULATOR_TPS65023=y diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 7b85585..7653329 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -329,6 +329,20 @@ static void omap_init_audio(void) static inline void omap_init_audio(void) {} #endif +#ifdef CONFIG_ARCH_OMAP3 +static struct platform_device omap_twl4030_script = { + .name = "twl4030_script", + .id = -1, +}; + +static void omap_init_twl4030_script(void) +{ + platform_device_register(&omap_twl4030_script); +} +#else +static inline void omap_init_twl4030_script(void) {} +#endif + #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE) #include <plat/mcspi.h> @@ -691,6 +705,7 @@ static int __init omap2_init_devices(void) omap_init_sham(); omap_init_aes(); omap_init_vout(); + omap_init_twl4030_script(); return 0; } diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 3ed3ff0..bed88ce 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -204,6 +204,17 @@ config TWL4030_POWER and load scripts controlling which resources are switched off/on or reset when a sleep, wakeup or warm reset event occurs. +config TWL4030_SCRIPT + tristate "Support TWL4030 script for OMAP3 boards" + depends on TWL4030_CORE && TWL4030_POWER + help + Say yes here if you want to use the twl4030 power scripts + for OMAP3 boards. Power bus message sequence for + TWL4030 to enter sleep/wakeup/warm_reset. + + TWL4030 power scripts which can be used by different + OMAP3 boards with the power companion chip (TWL4030 series). + config TWL4030_CODEC bool depends on TWL4030_CORE diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index 419caa9..53ada21 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -42,6 +42,7 @@ obj-$(CONFIG_TWL4030_MADC) += twl4030-madc.o obj-$(CONFIG_TWL4030_POWER) += twl4030-power.o obj-$(CONFIG_TWL4030_CODEC) += twl4030-codec.o obj-$(CONFIG_TWL6030_PWM) += twl6030-pwm.o +obj-$(CONFIG_TWL4030_SCRIPT) += twl4030-script-omap.o obj-$(CONFIG_MFD_MC13XXX) += mc13xxx-core.o diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c index a764676..88195e2 100644 --- a/drivers/mfd/twl4030-power.c +++ b/drivers/mfd/twl4030-power.c @@ -123,7 +123,7 @@ static u8 res_config_addrs[] = { [RES_MAIN_REF] = 0x94, }; -static int __init twl4030_write_script_byte(u8 address, u8 byte) +static int twl4030_write_script_byte(u8 address, u8 byte) { int err; @@ -137,7 +137,7 @@ out: return err; } -static int __init twl4030_write_script_ins(u8 address, u16 pmb_message, +static int twl4030_write_script_ins(u8 address, u16 pmb_message, u8 delay, u8 next) { int err; @@ -157,7 +157,7 @@ out: return err; } -static int __init twl4030_write_script(u8 address, struct twl4030_ins *script, +static int twl4030_write_script(u8 address, struct twl4030_ins *script, int len) { int err; @@ -182,7 +182,7 @@ static int __init twl4030_write_script(u8 address, struct twl4030_ins *script, return err; } -static int __init twl4030_config_wakeup3_sequence(u8 address) +static int twl4030_config_wakeup3_sequence(u8 address) { int err; u8 data; @@ -207,7 +207,7 @@ out: return err; } -static int __init twl4030_config_wakeup12_sequence(u8 address) +static int twl4030_config_wakeup12_sequence(u8 address) { int err = 0; u8 data; @@ -261,7 +261,7 @@ out: return err; } -static int __init twl4030_config_sleep_sequence(u8 address) +static int twl4030_config_sleep_sequence(u8 address) { int err; @@ -275,7 +275,7 @@ static int __init twl4030_config_sleep_sequence(u8 address) return err; } -static int __init twl4030_config_warmreset_sequence(u8 address) +static int twl4030_config_warmreset_sequence(u8 address) { int err; u8 rd_data; @@ -323,7 +323,7 @@ out: return err; } -static int __init twl4030_configure_resource(struct twl4030_resconfig *rconfig) +static int twl4030_configure_resource(struct twl4030_resconfig *rconfig) { int rconfig_addr; int err; @@ -415,7 +415,7 @@ static int __init twl4030_configure_resource(struct twl4030_resconfig *rconfig) return 0; } -static int __init load_twl4030_script(struct twl4030_script *tscript, +static int load_twl4030_script(struct twl4030_script *tscript, u8 address) { int err; @@ -510,8 +510,9 @@ int twl4030_remove_script(u8 flags) return err; } +EXPORT_SYMBOL_GPL(twl4030_remove_script); -void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts) +int twl4030_power_init(struct twl4030_power_data *twl4030_scripts) { int err = 0; int i; @@ -529,7 +530,6 @@ void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts) TWL4030_PM_MASTER_PROTECT_KEY); if (err) goto unlock; - for (i = 0; i < twl4030_scripts->num; i++) { err = load_twl4030_script(twl4030_scripts->scripts[i], address); if (err) @@ -552,18 +552,19 @@ void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts) TWL4030_PM_MASTER_PROTECT_KEY); if (err) pr_err("TWL4030 Unable to relock registers\n"); - return; + return err; unlock: if (err) pr_err("TWL4030 Unable to unlock registers\n"); - return; + return err; load: if (err) pr_err("TWL4030 failed to load scripts\n"); - return; + return err; resource: if (err) pr_err("TWL4030 failed to configure resource\n"); - return; + return err; } +EXPORT_SYMBOL_GPL(twl4030_power_init); diff --git a/drivers/mfd/twl4030-script-omap.c b/drivers/mfd/twl4030-script-omap.c new file mode 100644 index 0000000..867a442 --- /dev/null +++ b/drivers/mfd/twl4030-script-omap.c @@ -0,0 +1,373 @@ +/* + * OMAP power script for PMIC TWL4030 + * + * Author: Lesly A M <leslyam@ti.com> + * + * Copyright (C) 2010 Texas Instruments, Inc. + * Lesly A M <leslyam@ti.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +#include <linux/i2c/twl.h> + +/* + * power management signal connections for OMAP3430 with TWL5030 + * + * TWL5030 OMAP3430 + * ______________________ _____________________ + * | | | | + * | (P1) NSLEEP1|<----------|SYS_OFFMODE | + * | NRESWARM|<----------|NWARMRESET | + * | (P2) NSLEEP2|---| | | + * | | === | | + * | | - | | + * | | | | + * | VDD1 |---------->| VDD1 | + * | VDD2 |---------->| VDD2 | + * | VIO |---------->| VDDS | + * ________ | VAUX1 | | | + * | | | ... | | | + * | ENABLE|<--------|CLKEN CLKREQ|<----------|SYS_CLKREQ | + * | CLKOUT|-------->|HFCLKIN (P3) HFCLKOUT|---------->|XTALIN | + * |________| |______________________| |_____________________| + * + * + * Signal descriptions: + * + * SYS_OFFMODE - OMAP drives this signal low only when the OMAP is in the + * OFF idle mode. It is driven high when a wake up event is detected. + * This signal should control the P1 device group in the PMIC. + * + * SYS_CLKREQ - OMAP should drive this signal low when the OMAP goes into + * any idle mode. This signal should control the P3 device group + * in the PMIC. It is used to notify PMIC when XTALIN is no longer needed. + * + * NSLEEP1(P1) - When this signal goes low the P1 sleep sequence is executed + * in the PMIC turning off certain resources. When this signal goes high + * the P1 active sequence is executed turning back on certain resources. + * + * NSLEEP2(P2) - This signal controls the P2 device group of the PMIC. + * It is not used in this setup and should be tied to ground. + * This can be used for connecting a different processor or MODEM chip. + * + * CLKREQ(P3) - When this signal goes low the P3 sleep sequence is executed + * in the PMIC turning off HFCLKOUT. When this signal goes high + * the P3 active sequence is executed turning back on HFCLKOUT and other + * resources. + * + * CLKEN - Enable signal for oscillator. Should only go low when OMAP is + * in the OFF idle mode due to long oscillator startup times. + * + * HFCLKIN - Oscillator output clock into PMIC. + * + * HFCLKOUT - System clock output from PMIC to OMAP. + * + * XTALIN - OMAP system clock input(HFCLKOUT). + */ + +/* + * Recommended sleep and active sequences for TWL5030 when connected to OMAP3 + * + * WARNING: If the board is using NSLEEP2(P2), should modify this script and + * setuptime values accordingly. + * + * Chip Retention/Off (using i2c for scaling voltage): + * When OMAP de-assert the SYS_CLKREQ signal, only HFCLKOUT is affected + * since it is the only resource assigned to P3 only. + * + * Sysoff (using sys_off signal): + * When OMAP de-assert the SYS_OFFMODE signal A2S(active to sleep sequence) + * on the PMIC is executed. This will put resources of TYPE2=1 and TYPE2=2 + * into sleep. At this point only resources assigned to P1 only will be + * affected (VDD1, VDD2 & VPLL1). + * + * Next the OMAP will lower SYS_CLKREQ which will allow the A2S sequence + * in PMIC to execute again. This will put resources of TYPE2=1 and TYPE2=2 + * into sleep but will affect resources that are assigned to P3(HFCLKOUT) + * only or assigned to P1 and P3. + * + * On wakeup event OMAP goes active and pulls the SYS_CLKREQ high, + * which will execute the P3 S2A sequence on the PMIC. This will turn on + * resources assigned to P3 or assigned to P1 and P3 and of TYPE2=2. + * + * Next the OMAP will wait the PRM_VOLTOFFSET time and then de-assert + * the SYS_OFFMODE pin allowing the PMIC to execute the P1 S2A active + * sequence. This will turn on resources assigned to P1 or assigned to + * P1 and P3 and of TYPE2=1. + * + * Timing diagram for OMAP wakeup from OFFMODE using sys_off signal + * _____________________________________________________________ + * OMAP active __/ + * |<--------------------PRM_CLKSETP-------------------->| + * ______________________________________________________ + * SYS_CLKREQ _________/ + * ___________________________________________________ + * CLKEN ____________/ + * + * HFCLKIN _______________________________________________///////////////// + * + * HFCLKOUT __________________________________________________////////////// + * |<---PRM_VOLTOFFSET-->| + * ________________________________ + * SYS_OFFMODE _______________________________/ + * |<--------PRM_VOLTSETUP2------->| + * ___________ + * VPLL1 ____________________________________________________/ + * __ + * VDD1 _____________________________________________________________/ + * __ + * VDD2 _____________________________________________________________/ + * + * Other resources which are not handled by this script should be + * controlled by the respective drivers using them (VAUX1, VAUX2, VAUX3, + * VAUX4, VMMC1, VMMC2, VPLL2, VSIM, VDAC, VUSB1V5, VUSB1V8 & VUSB3V1). + * + * More info: + * http://omapedia.org/wiki/TWL4030_power_scripts + */ + +/** + * DOC: Sleep to active sequence for P1/P2 + * + * Sequence to control the TWL4030 Power resources, + * when the system wakeup from sleep. + * Executed upon P1_P2 transition for wakeup + * (sys_offmode signal de-asserted on OMAP). + */ +static struct twl4030_ins wakeup_p12_seq[] __initdata = { + /* + * Broadcast message to put resources to active + * + * Since we are not using TYPE, resources which have TYPE2 configured + * as 1 will be targeted (VPLL1, VDD1, VDD2, REGEN, NRES_PWRON, SYSEN). + */ + {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, RES_TYPE_R0, RES_TYPE2_R1, + RES_STATE_ACTIVE), 2}, +}; + +static struct twl4030_script wakeup_p12_script __initdata = { + .script = wakeup_p12_seq, + .size = ARRAY_SIZE(wakeup_p12_seq), + .flags = TWL4030_WAKEUP12_SCRIPT, +}; + +/** + * DOC: Sleep to active sequence for P3 + * + * Sequence to control the TWL4030 Power resources, + * when the system wakeup from sleep. + * Executed upon P3 transition for wakeup + * (clkreq signal asserted on OMAP). + */ +static struct twl4030_ins wakeup_p3_seq[] __initdata = { + /* + * Broadcast message to put resources to active + * + * Since we are not using TYPE, resources which have TYPE2 configured + * as 2 will be targeted + * (VINTANA1, VINTANA2, VINTDIG, VIO, CLKEN, HFCLKOUT). + */ + {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, RES_TYPE_R0, RES_TYPE2_R2, + RES_STATE_ACTIVE), 2}, +}; + +static struct twl4030_script wakeup_p3_script __initdata = { + .script = wakeup_p3_seq, + .size = ARRAY_SIZE(wakeup_p3_seq), + .flags = TWL4030_WAKEUP3_SCRIPT, +}; + +/** + * DOC: Active to sleep sequence for P1/P2/P3 + * + * Sequence to control the TWL4030 Power resources, + * when the system goes into sleep. + * Executed upon P1_P2/P3 transition for sleep. + * (sys_offmode signal asserted/clkreq de-asserted on OMAP). + */ +static struct twl4030_ins sleep_on_seq[] __initdata = { + /* Broadcast message to put res to sleep (TYPE2 = 1, 2) */ + {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, RES_TYPE_R0, RES_TYPE2_R1, + RES_STATE_SLEEP), 2}, + {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, RES_TYPE_R0, RES_TYPE2_R2, + RES_STATE_SLEEP), 2}, +}; + +static struct twl4030_script sleep_on_script __initdata = { + .script = sleep_on_seq, + .size = ARRAY_SIZE(sleep_on_seq), + .flags = TWL4030_SLEEP_SCRIPT, +}; + +/** + * DOC: Warm reset sequence + * + * Sequence to reset the TWL4030 Power resources, + * when the system gets warm reset. + * Executed upon warm reset signal. + * + * First the device is put in reset, then the system clock is requested to + * the external oscillator, and default ON power reference and power providers + * are enabled. Next some additional resources which are software controlled + * are enabled. Finally sequence is ended by the release of TWL5030 reset. + */ +static struct twl4030_ins wrst_seq[] __initdata = { + /* + * As a workaround for OMAP Erratum (ID: i537 - OMAP HS devices are + * not recovering from warm reset while in OFF mode) + * NRESPWRON is toggled to force a power on reset condition to OMAP + */ + /* Trun OFF NRES_PWRON */ + {MSG_SINGULAR(DEV_GRP_NULL, RES_NRES_PWRON, RES_STATE_OFF), 2}, + /* Reset twl4030 */ + {MSG_SINGULAR(DEV_GRP_NULL, RES_RESET, RES_STATE_OFF), 2}, + /* Reset MAIN_REF */ + {MSG_SINGULAR(DEV_GRP_NULL, RES_MAIN_REF, RES_STATE_WRST), 2}, + /* Reset All type2_group2 */ + {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, RES_TYPE_R0, RES_TYPE2_R2, + RES_STATE_WRST), 2}, + /* Reset VUSB_3v1 */ + {MSG_SINGULAR(DEV_GRP_NULL, RES_VUSB_3V1, RES_STATE_WRST), 2}, + /* Reset All type2_group1 */ + {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, RES_TYPE_R0, RES_TYPE2_R1, + RES_STATE_WRST), 2}, + /* Reset the Reset & Contorl_signals */ + {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_RC, RES_TYPE_ALL, RES_TYPE2_R0, + RES_STATE_WRST), 2}, + /* Re-enable twl4030 */ + {MSG_SINGULAR(DEV_GRP_NULL, RES_RESET, RES_STATE_ACTIVE), 2}, + /* Trun ON NRES_PWRON */ + {MSG_SINGULAR(DEV_GRP_NULL, RES_NRES_PWRON, RES_STATE_ACTIVE), 2}, +}; + +static struct twl4030_script wrst_script __initdata = { + .script = wrst_seq, + .size = ARRAY_SIZE(wrst_seq), + .flags = TWL4030_WRST_SCRIPT, +}; + +/* TWL4030 script for sleep, wakeup & warm_reset */ +static struct twl4030_script *twl4030_scripts[] __initdata = { + &wakeup_p12_script, + &wakeup_p3_script, + &sleep_on_script, + &wrst_script, +}; + +/** + * DOC: TWL4030 resource configuration + * + * Resource which are attached to P1 device group alone + * will go to sleep state, when sys_off signal from OMAP is de-asserted. + * (VPLL1, VDD1, VDD2) + * + * None of the resources are attached to P2 device group alone. + * (WARNING: If MODEM or connectivity chip is connected to NSLEEP2 PIN on + * TWL4030, should modify the resource configuration accordingly). + * + * Resource which are attached to P3 device group alone + * will go to sleep state, when clk_req signal from OMAP is de-asserted. + * (HFCLKOUT) + * + * Resource which are attached to more than one device group + * will go to sleep state, when corresponding signals are de-asserted. + * (VINTANA1, VINTANA2, VINTDIG, VIO, REGEN, NRESPWRON, CLKEN, SYSEN) + * + * REGEN is an output of the device which can be connected to slave power ICs + * or external LDOs that power on before voltage for the IO interface (VIO). + * + * SYSEN is a bidirectional signal of the device that controls slave power ICs. + * In master mode, the device sets SYSEN high to enable the slave power ICs. + * In slave mode, when one of the power ICs drives the SYSEN signal low, + * all devices of the platform stay in the wait-on state. + * + * Resource which are attached to none of the device group by default + * will be in sleep state. These resource should be controlled by + * the respective drivers using them. + * Resource which are controlled by drivers are not modified here. + * (VAUX1, VAUX2, VAUX3, VAUX4, VMMC1, VMMC2, VPLL2, VSIM, VDAC, + * VUSB1V5, VUSB1V8, VUSB3V1) + * + * Resource using reset values. + * (32KCLKOUT, TRITON_RESET, MAINREF) + */ +static struct twl4030_resconfig twl4030_rconfig[] __initdata = { + { .resource = RES_VPLL1, .devgroup = DEV_GRP_P1, .type = 3, + .type2 = 1, .remap_sleep = RES_STATE_OFF }, + { .resource = RES_VINTANA1, .devgroup = DEV_GRP_ALL, .type = 1, + .type2 = 2, .remap_sleep = RES_STATE_SLEEP }, + { .resource = RES_VINTANA2, .devgroup = DEV_GRP_ALL, .type = 0, + .type2 = 2, .remap_sleep = RES_STATE_SLEEP }, + { .resource = RES_VINTDIG, .devgroup = DEV_GRP_ALL, .type = 1, + .type2 = 2, .remap_sleep = RES_STATE_SLEEP }, + { .resource = RES_VIO, .devgroup = DEV_GRP_ALL, .type = 2, + .type2 = 2, .remap_sleep = RES_STATE_SLEEP }, + { .resource = RES_VDD1, .devgroup = DEV_GRP_P1, + .type = 4, .type2 = 1, .remap_sleep = RES_STATE_OFF }, + { .resource = RES_VDD2, .devgroup = DEV_GRP_P1, + .type = 3, .type2 = 1, .remap_sleep = RES_STATE_OFF }, + { .resource = RES_REGEN, .devgroup = DEV_GRP_ALL, .type = 2, + .type2 = 1, .remap_sleep = RES_STATE_SLEEP }, + { .resource = RES_NRES_PWRON, .devgroup = DEV_GRP_ALL, .type = 0, + .type2 = 1, .remap_sleep = RES_STATE_SLEEP }, + { .resource = RES_CLKEN, .devgroup = DEV_GRP_ALL, .type = 3, + .type2 = 2, .remap_sleep = RES_STATE_SLEEP }, + { .resource = RES_SYSEN, .devgroup = DEV_GRP_ALL, .type = 6, + .type2 = 1, .remap_sleep = RES_STATE_SLEEP }, + { .resource = RES_HFCLKOUT, .devgroup = DEV_GRP_P3, + .type = 0, .type2 = 2, .remap_sleep = RES_STATE_SLEEP }, + { 0, 0}, +}; + +struct twl4030_power_data twl4030_generic_script __initdata = { + .scripts = twl4030_scripts, + .num = ARRAY_SIZE(twl4030_scripts), + .resource_config = twl4030_rconfig, +}; + +static int __init twl4030_script_probe(struct platform_device *pdev) +{ + return twl4030_power_init(&twl4030_generic_script); +} + +static int twl4030_script_remove(struct platform_device *pdev) +{ + return twl4030_remove_script(TWL4030_SLEEP_SCRIPT | + TWL4030_WAKEUP12_SCRIPT | TWL4030_WAKEUP3_SCRIPT | + TWL4030_WRST_SCRIPT); +} + +static struct platform_driver twl4030_script_driver = { + .remove = twl4030_script_remove, + .driver = { + .name = "twl4030_script", + .owner = THIS_MODULE, + }, +}; + +static int __init twl4030_script_init(void) +{ + /* Register the TWL4030 script driver */ + return platform_driver_probe(&twl4030_script_driver, + twl4030_script_probe); +} + +static void __exit twl4030_script_cleanup(void) +{ + /* Unregister TWL4030 script driver */ + platform_driver_unregister(&twl4030_script_driver); +} + +module_init(twl4030_script_init); +module_exit(twl4030_script_cleanup); + +MODULE_DESCRIPTION("OMAP TWL4030 script driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Texas Instruments Inc"); diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index 4ebd7c3..41c9448 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h @@ -204,6 +204,12 @@ static inline int twl6030_mmc_card_detect(struct device *dev, int slot) return -EIO; } #endif + +#ifdef CONFIG_TWL4030_POWER +extern struct twl4030_power_data twl4030_generic_script; +#else +#define twl4030_generic_script NULL; +#endif /*----------------------------------------------------------------------*/ /* @@ -436,9 +442,23 @@ static inline int twl6030_mmc_card_detect(struct device *dev, int slot) /* Power bus message definitions */ -/* The TWL4030/5030 splits its power-management resources (the various - * regulators, clock and reset lines) into 3 processor groups - P1, P2 and - * P3. These groups can then be configured to transition between sleep, wait-on +/* + * The TWL4030/5030 splits its power-management resources (the various + * regulators, clock and reset lines) into 3 processor groups - P1, P2 and P3. + * + * Resources attached to device group P1 is managed depending on the state of + * NSLEEP1 pin of TWL4030, which is connected to sys_off signal from OMAP + * + * Resources attached to device group P2 is managed depending on the state of + * NSLEEP2 pin of TWL4030, which is can be connected to a modem or + * connectivity chip + * + * Resources attached to device group P3 is managed depending on the state of + * CLKREQ pin of TWL4030, which is connected to clk request signal from OMAP + * + * If required these resources can be attached to combination of P1/P2/P3. + * + * These groups can then be configured to transition between sleep, wait-on * and active states by sending messages to the power bus. See Section 5.4.2 * Power Resources of TWL4030 TRM */ @@ -448,7 +468,17 @@ static inline int twl6030_mmc_card_detect(struct device *dev, int slot) #define DEV_GRP_P1 0x1 /* P1: all OMAP devices */ #define DEV_GRP_P2 0x2 /* P2: all Modem devices */ #define DEV_GRP_P3 0x4 /* P3: all peripheral devices */ +#define DEV_GRP_ALL 0x7 /* P1/P2/P3: all devices */ +/* + * The 27 power resources in TWL4030 is again divided into + * analog resources: + * Power Providers - LDO regulators, dc-to-dc regulators + * Power Reference - analog reference + * + * and digital resources: + * Reset & Clock - reset and clock signals. + */ /* Resource groups */ #define RES_GRP_RES 0x0 /* Reserved */ #define RES_GRP_PP 0x1 /* Power providers */ @@ -460,7 +490,10 @@ static inline int twl6030_mmc_card_detect(struct device *dev, int slot) #define RES_GRP_ALL 0x7 /* All resource groups */ #define RES_TYPE2_R0 0x0 +#define RES_TYPE2_R1 0x1 +#define RES_TYPE2_R2 0x2 +#define RES_TYPE_R0 0x0 #define RES_TYPE_ALL 0x7 /* Resource states */ @@ -635,7 +668,7 @@ struct twl4030_power_data { #define TWL4030_RESCONFIG_UNDEF ((u8)-1) }; -extern void twl4030_power_init(struct twl4030_power_data *triton2_scripts); +extern int twl4030_power_init(struct twl4030_power_data *triton2_scripts); extern int twl4030_remove_script(u8 flags); struct twl4030_codec_audio_data {
Power bus message sequence for TWL4030 to enter sleep/wakeup/warm_reset. TWL4030 power scripts which can be used by different OMAP3 boards with the power companion chip (TWL4030 series). The twl4030 generic script can be used by any board file to update the power data in twl4030_platform_data. Since the TWL4030 power script has dependency with APIs in twl4030-power.c removing the __init for these APIs. For more information please see: http://omapedia.org/wiki/TWL4030_power_scripts Signed-off-by: Lesly A M <leslyam@ti.com> Cc: Nishanth Menon <nm@ti.com> Cc: David Derrick <dderrick@ti.com> Cc: Samuel Ortiz <sameo@linux.intel.com> --- arch/arm/configs/omap2plus_defconfig | 1 + arch/arm/mach-omap2/devices.c | 15 ++ drivers/mfd/Kconfig | 11 + drivers/mfd/Makefile | 1 + drivers/mfd/twl4030-power.c | 31 ++-- drivers/mfd/twl4030-script-omap.c | 373 ++++++++++++++++++++++++++++++++++ include/linux/i2c/twl.h | 41 ++++- 7 files changed, 454 insertions(+), 19 deletions(-) create mode 100644 drivers/mfd/twl4030-script-omap.c