diff mbox

[v4,11/11] ARM: OMAP2+: AM33XX: Hookup AM33XX PM code into OMAP builds

Message ID 1405047349-15101-12-git-send-email-d-gerlach@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dave Gerlach July 11, 2014, 2:55 a.m. UTC
With all the requisite changes in place we can now enable the basic
PM support for AM33xx. This patch updates the various OMAP files
to enable suspend-resume on AM33xx.

Because the suspend resume functionality is different on AM33xx
than other OMAP platforms due to the need for M3 firmware and an
IPC channel to be in place, separate PM ops are used instead of
omap_pm_ops. These are now set using omap2_common_suspend_init
so the AM33xx can make a decision at runtime to enable suspend based
on the availabilty of aforementioned requirements.

Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
---
v3->v4:
	Updated for rproc usage now.

 arch/arm/mach-omap2/Kconfig  |  1 +
 arch/arm/mach-omap2/Makefile |  2 ++
 arch/arm/mach-omap2/common.h |  9 +++++++++
 arch/arm/mach-omap2/io.c     |  1 +
 arch/arm/mach-omap2/pm.h     |  5 +++++
 arch/arm/mach-omap2/sram.c   | 10 +++++++++-
 arch/arm/mach-omap2/sram.h   |  2 ++
 7 files changed, 29 insertions(+), 1 deletion(-)

Comments

Tony Lindgren July 14, 2014, 11:21 a.m. UTC | #1
* Dave Gerlach <d-gerlach@ti.com> [140710 19:59]:
> With all the requisite changes in place we can now enable the basic
> PM support for AM33xx. This patch updates the various OMAP files
> to enable suspend-resume on AM33xx.
> 
> Because the suspend resume functionality is different on AM33xx
> than other OMAP platforms due to the need for M3 firmware and an
> IPC channel to be in place, separate PM ops are used instead of
> omap_pm_ops. These are now set using omap2_common_suspend_init
> so the AM33xx can make a decision at runtime to enable suspend based
> on the availabilty of aforementioned requirements.
> 
> Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
> ---
> v3->v4:
> 	Updated for rproc usage now.
> 
>  arch/arm/mach-omap2/Kconfig  |  1 +
>  arch/arm/mach-omap2/Makefile |  2 ++
>  arch/arm/mach-omap2/common.h |  9 +++++++++
>  arch/arm/mach-omap2/io.c     |  1 +
>  arch/arm/mach-omap2/pm.h     |  5 +++++
>  arch/arm/mach-omap2/sram.c   | 10 +++++++++-
>  arch/arm/mach-omap2/sram.h   |  2 ++
>  7 files changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
> index 1c1ed73..f8a56e5 100644
> --- a/arch/arm/mach-omap2/Kconfig
> +++ b/arch/arm/mach-omap2/Kconfig
> @@ -59,6 +59,7 @@ config SOC_AM33XX
>  	select ARCH_OMAP2PLUS
>  	select ARCH_HAS_OPP
>  	select ARM_CPU_SUSPEND if PM
> +	select WKUP_M3_RPROC if PM

You should not do a select in Kconfig for a driver,
that will lead into various randconfig build errors
at some point. It's probably best to make the PM code
depend on the WKUP_M3_RPROC driver instead.

Regards,

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
Dave Gerlach July 14, 2014, 5:46 p.m. UTC | #2
On 07/14/2014 06:21 AM, Tony Lindgren wrote:
> * Dave Gerlach <d-gerlach@ti.com> [140710 19:59]:
>> With all the requisite changes in place we can now enable the basic
>> PM support for AM33xx. This patch updates the various OMAP files
>> to enable suspend-resume on AM33xx.
>>
>> Because the suspend resume functionality is different on AM33xx
>> than other OMAP platforms due to the need for M3 firmware and an
>> IPC channel to be in place, separate PM ops are used instead of
>> omap_pm_ops. These are now set using omap2_common_suspend_init
>> so the AM33xx can make a decision at runtime to enable suspend based
>> on the availabilty of aforementioned requirements.
>>
>> Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
>> ---
>> v3->v4:
>> 	Updated for rproc usage now.
>>
>>   arch/arm/mach-omap2/Kconfig  |  1 +
>>   arch/arm/mach-omap2/Makefile |  2 ++
>>   arch/arm/mach-omap2/common.h |  9 +++++++++
>>   arch/arm/mach-omap2/io.c     |  1 +
>>   arch/arm/mach-omap2/pm.h     |  5 +++++
>>   arch/arm/mach-omap2/sram.c   | 10 +++++++++-
>>   arch/arm/mach-omap2/sram.h   |  2 ++
>>   7 files changed, 29 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
>> index 1c1ed73..f8a56e5 100644
>> --- a/arch/arm/mach-omap2/Kconfig
>> +++ b/arch/arm/mach-omap2/Kconfig
>> @@ -59,6 +59,7 @@ config SOC_AM33XX
>>   	select ARCH_OMAP2PLUS
>>   	select ARCH_HAS_OPP
>>   	select ARM_CPU_SUSPEND if PM
>> +	select WKUP_M3_RPROC if PM
>
> You should not do a select in Kconfig for a driver,
> that will lead into various randconfig build errors
> at some point. It's probably best to make the PM code
> depend on the WKUP_M3_RPROC driver instead.

Ok, I didn't consider that, thanks.

Regards,
Dave

>
> Regards,
>
> 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
diff mbox

Patch

diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 1c1ed73..f8a56e5 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -59,6 +59,7 @@  config SOC_AM33XX
 	select ARCH_OMAP2PLUS
 	select ARCH_HAS_OPP
 	select ARM_CPU_SUSPEND if PM
+	select WKUP_M3_RPROC if PM
 
 config SOC_AM43XX
 	bool "TI AM43x"
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 8ca99e9..3c8d30c 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -90,6 +90,7 @@  obj-$(CONFIG_ARCH_OMAP3)		+= pm34xx.o sleep34xx.o
 obj-$(CONFIG_ARCH_OMAP4)		+= pm44xx.o omap-mpuss-lowpower.o
 obj-$(CONFIG_SOC_OMAP5)			+= omap-mpuss-lowpower.o
 obj-$(CONFIG_SOC_DRA7XX)		+= omap-mpuss-lowpower.o
+obj-$(CONFIG_SOC_AM33XX)		+= pm33xx.o sleep33xx.o
 obj-$(CONFIG_PM_DEBUG)			+= pm-debug.o
 
 obj-$(CONFIG_POWER_AVS_OMAP)		+= sr_device.o
@@ -97,6 +98,7 @@  obj-$(CONFIG_POWER_AVS_OMAP_CLASS3)    += smartreflex-class3.o
 
 AFLAGS_sleep24xx.o			:=-Wa,-march=armv6
 AFLAGS_sleep34xx.o			:=-Wa,-march=armv7-a$(plus_sec)
+AFLAGS_sleep33xx.o			:=-Wa,-march=armv7-a$(plus_sec)
 
 endif
 
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h
index 1536338..1bcd475 100644
--- a/arch/arm/mach-omap2/common.h
+++ b/arch/arm/mach-omap2/common.h
@@ -75,6 +75,15 @@  static inline int omap4_pm_init_early(void)
 }
 #endif
 
+#if defined(CONFIG_PM) && defined(CONFIG_SOC_AM33XX)
+int am33xx_pm_init(void);
+#else
+static inline int am33xx_pm_init(void)
+{
+	return 0;
+}
+#endif
+
 #ifdef CONFIG_OMAP_MUX
 int omap_mux_late_init(void);
 #else
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index 4d4d150..fb23f83 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -590,6 +590,7 @@  void __init am33xx_init_early(void)
 void __init am33xx_init_late(void)
 {
 	omap_common_late_init();
+	am33xx_pm_init();
 }
 #endif
 
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
index e150102..b6f72a4 100644
--- a/arch/arm/mach-omap2/pm.h
+++ b/arch/arm/mach-omap2/pm.h
@@ -81,6 +81,11 @@  extern unsigned int omap3_do_wfi_sz;
 /* ... and its pointer from SRAM after copy */
 extern void (*omap3_do_wfi_sram)(void);
 
+/* am33xx_do_wfi function pointer and size, for copy to SRAM */
+extern void am33xx_do_wfi(void);
+extern unsigned int am33xx_do_wfi_sz;
+extern unsigned int am33xx_resume_offset;
+
 /* save_secure_ram_context function pointer and size, for copy to SRAM */
 extern int save_secure_ram_context(u32 *addr);
 extern unsigned int save_secure_ram_context_sz;
diff --git a/arch/arm/mach-omap2/sram.c b/arch/arm/mach-omap2/sram.c
index ddf1818..2227f20 100644
--- a/arch/arm/mach-omap2/sram.c
+++ b/arch/arm/mach-omap2/sram.c
@@ -154,7 +154,7 @@  static void __init omap2_map_sram(void)
 		omap_sram_size -= SZ_16K;
 	}
 #endif
-	if (cpu_is_omap34xx()) {
+	if (cpu_is_omap34xx() || soc_is_am33xx()) {
 		/*
 		 * SRAM must be marked as non-cached on OMAP3 since the
 		 * CORE DPLL M2 divider change code (in SRAM) runs with the
@@ -285,10 +285,18 @@  static inline int omap34xx_sram_init(void)
 }
 #endif /* CONFIG_ARCH_OMAP3 */
 
+#ifdef CONFIG_SOC_AM33XX
 static inline int am33xx_sram_init(void)
 {
+	am33xx_push_sram_idle();
 	return 0;
 }
+#else
+static inline int am33xx_sram_init(void)
+{
+	return 0;
+}
+#endif
 
 int __init omap_sram_init(void)
 {
diff --git a/arch/arm/mach-omap2/sram.h b/arch/arm/mach-omap2/sram.h
index ca7277c..24788b5 100644
--- a/arch/arm/mach-omap2/sram.h
+++ b/arch/arm/mach-omap2/sram.h
@@ -62,8 +62,10 @@  extern unsigned long omap3_sram_configure_core_dpll_sz;
 
 #ifdef CONFIG_PM
 extern void omap_push_sram_idle(void);
+extern void am33xx_push_sram_idle(void);
 #else
 static inline void omap_push_sram_idle(void) {}
+static inline void am33xx_push_sram_idle(void) {}
 #endif /* CONFIG_PM */
 
 #endif /* __ASSEMBLY__ */