Message ID | 20170519200438.9502-4-d-gerlach@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, * Dave Gerlach <d-gerlach@ti.com> [170519 13:08]: > In addition to this, to be able to share data structures between C and > the sleep33xx and sleep43xx assembly code, we can automatically generate > all of the C struct member offsets and sizes as macros by making use of > the ARM asm-offsets file. In the same header that we define our data > structures in we also define all the macros in an inline function and by > adding a call to this in the asm_offsets file all macros are properly > generated and available to the assembly code without cluttering up the > asm-offsets file. ... > diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c > index d728b5660e36..62253e7bfac4 100644 > --- a/arch/arm/kernel/asm-offsets.c > +++ b/arch/arm/kernel/asm-offsets.c > @@ -28,6 +28,7 @@ > #include <asm/vdso_datapage.h> > #include <asm/hardware/cache-l2x0.h> > #include <linux/kbuild.h> > +#include <linux/platform_data/pm33xx.h> > #include <linux/ti-emif-sram.h> > > /* > @@ -187,6 +188,7 @@ int main(void) > #if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX) > BLANK(); > ti_emif_offsets(); > + amx3_pm_asm_offsets(); > #endif > > return 0; Russell, care to take a look at the above if you're OK with it or if you prefer to do it some other way? Also please see thread "[PATCH v2 0/2] memory: Introduce ti-emif-sram driver" for similar changes. Thanks, Tony
On Fri, May 19, 2017 at 03:04:36PM -0500, Dave Gerlach wrote: > Most of the PM code needed for am335x and am437x can be moved into a > module under drivers but some core code must remain in mach-omap2 at the > moment. This includes some internal clockdomain APIs and low-level ARM > APIs which are also not exported for use by modules. > > Implement a few functions that handle these low-level platform > operations can be passed to the pm33xx module through the use of > platform data. > > In addition to this, to be able to share data structures between C and > the sleep33xx and sleep43xx assembly code, we can automatically generate > all of the C struct member offsets and sizes as macros by making use of > the ARM asm-offsets file. In the same header that we define our data > structures in we also define all the macros in an inline function and by > adding a call to this in the asm_offsets file all macros are properly > generated and available to the assembly code without cluttering up the > asm-offsets file. > > Signed-off-by: Dave Gerlach <d-gerlach@ti.com> > --- > diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h > index b668719b9b25..2f9649b89053 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); > > +struct am33xx_pm_platform_data *am33xx_pm_get_pdata(void); This one is not used outside of pm33xx-core.c so can now be static, and this declaration can be dropped. > diff --git a/arch/arm/mach-omap2/pm33xx-core.c b/arch/arm/mach-omap2/pm33xx-core.c > new file mode 100644 > index 000000000000..c84ffc4de2e9 > --- /dev/null > +++ b/arch/arm/mach-omap2/pm33xx-core.c > @@ -0,0 +1,181 @@ > +/* > + * AM33XX Arch Power Management Routines > + * > + * Copyright (C) 2016-2017 Texas Instruments Incorporated - http://www.ti.com/ > + * Dave Gerlach > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation version 2. > + * > + * This program is distributed "as is" WITHOUT ANY WARRANTY of any > + * kind, whether express or implied; without even the implied warranty > + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#include <asm/smp_scu.h> I get a compilation error here when compiling for am335x without CONFIG_HAVE_ARM_SCU due to a missing errno.h include: In file included from /home/johan/work/omicron/src/linux/arch/arm/mach-omap2/pm33xx-core.c:17:0: /home/johan/work/omicron/src/linux/arch/arm/include/asm/smp_scu.h: In function 'scu_power_mode': /home/johan/work/omicron/src/linux/arch/arm/include/asm/smp_scu.h:36:10: error: 'EINVAL' undeclared (first use in this function) return -EINVAL; ^ /home/johan/work/omicron/src/linux/arch/arm/include/asm/smp_scu.h:36:10: note: each undeclared identifier is reported only once for each function it appears in This is arguably a bug in the header, which I'm submitting a fix for, but you should include errno.h above anyway as you use its definitions below as well. > +#include <asm/suspend.h> > +#include <linux/platform_data/pm33xx.h> <snip> > diff --git a/include/linux/platform_data/pm33xx.h b/include/linux/platform_data/pm33xx.h > new file mode 100644 > index 000000000000..c191ab681093 > --- /dev/null > +++ b/include/linux/platform_data/pm33xx.h > @@ -0,0 +1,69 @@ > +/* > + * TI pm33xx platform data > + * > + * Copyright (C) 2016-2017 Texas Instruments, Inc. > + * Dave Gerlach <d-gerlach@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. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + */ > + > +#ifndef _LINUX_PLATFORM_DATA_PM33XX_H > +#define _LINUX_PLATFORM_DATA_PM33XX_H > + And here you should add a linux/types.h include to make this header self-contained. Right now you are depending on the scu header to pull in the types for pm33xx-core.c above. > +#include <linux/kbuild.h> > + > +#ifndef __ASSEMBLER__ > +struct am33xx_pm_sram_addr { > + void (*do_wfi)(void); > + unsigned long *do_wfi_sz; > + unsigned long *resume_offset; > + unsigned long *emif_sram_table; > + unsigned long *ro_sram_data; > +}; > + > +struct am33xx_pm_platform_data { > + int (*init)(void); > + int (*soc_suspend)(unsigned int state, int (*fn)(unsigned long)); > + struct am33xx_pm_sram_addr *(*get_sram_addrs)(void); > +}; > + > +struct am33xx_pm_sram_data { > + u32 wfi_flags; > + u32 l2_aux_ctrl_val; > + u32 l2_prefetch_ctrl_val; > +}; > + > +struct am33xx_pm_ro_sram_data { > + u32 amx3_pm_sram_data_virt; > + u32 amx3_pm_sram_data_phys; > +}; Johan
On 07/04/2017 08:14 AM, Johan Hovold wrote: > On Fri, May 19, 2017 at 03:04:36PM -0500, Dave Gerlach wrote: >> Most of the PM code needed for am335x and am437x can be moved into a >> module under drivers but some core code must remain in mach-omap2 at the >> moment. This includes some internal clockdomain APIs and low-level ARM >> APIs which are also not exported for use by modules. >> >> Implement a few functions that handle these low-level platform >> operations can be passed to the pm33xx module through the use of >> platform data. >> >> In addition to this, to be able to share data structures between C and >> the sleep33xx and sleep43xx assembly code, we can automatically generate >> all of the C struct member offsets and sizes as macros by making use of >> the ARM asm-offsets file. In the same header that we define our data >> structures in we also define all the macros in an inline function and by >> adding a call to this in the asm_offsets file all macros are properly >> generated and available to the assembly code without cluttering up the >> asm-offsets file. >> >> Signed-off-by: Dave Gerlach <d-gerlach@ti.com> >> --- > >> diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h >> index b668719b9b25..2f9649b89053 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); >> >> +struct am33xx_pm_platform_data *am33xx_pm_get_pdata(void); > > This one is not used outside of pm33xx-core.c so can now be static, and > this declaration can be dropped. Yes you are correct, seems I missed this in a refactor. > >> diff --git a/arch/arm/mach-omap2/pm33xx-core.c b/arch/arm/mach-omap2/pm33xx-core.c >> new file mode 100644 >> index 000000000000..c84ffc4de2e9 >> --- /dev/null >> +++ b/arch/arm/mach-omap2/pm33xx-core.c >> @@ -0,0 +1,181 @@ >> +/* >> + * AM33XX Arch Power Management Routines >> + * >> + * Copyright (C) 2016-2017 Texas Instruments Incorporated - http://www.ti.com/ >> + * Dave Gerlach >> + * >> + * This program is free software; you can redistribute it and/or >> + * modify it under the terms of the GNU General Public License as >> + * published by the Free Software Foundation version 2. >> + * >> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any >> + * kind, whether express or implied; without even the implied warranty >> + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + */ >> + >> +#include <asm/smp_scu.h> > > I get a compilation error here when compiling for am335x without > CONFIG_HAVE_ARM_SCU due to a missing errno.h include: > > In file included from /home/johan/work/omicron/src/linux/arch/arm/mach-omap2/pm33xx-core.c:17:0: > /home/johan/work/omicron/src/linux/arch/arm/include/asm/smp_scu.h: In function 'scu_power_mode': > /home/johan/work/omicron/src/linux/arch/arm/include/asm/smp_scu.h:36:10: error: 'EINVAL' undeclared (first use in this function) > return -EINVAL; > ^ > /home/johan/work/omicron/src/linux/arch/arm/include/asm/smp_scu.h:36:10: note: each undeclared identifier is reported only once for each function it appears in > > This is arguably a bug in the header, which I'm submitting a fix for, > but you should include errno.h above anyway as you use its definitions > below as well. > Yes ok, good catch. >> +#include <asm/suspend.h> >> +#include <linux/platform_data/pm33xx.h> > > <snip> > >> diff --git a/include/linux/platform_data/pm33xx.h b/include/linux/platform_data/pm33xx.h >> new file mode 100644 >> index 000000000000..c191ab681093 >> --- /dev/null >> +++ b/include/linux/platform_data/pm33xx.h >> @@ -0,0 +1,69 @@ >> +/* >> + * TI pm33xx platform data >> + * >> + * Copyright (C) 2016-2017 Texas Instruments, Inc. >> + * Dave Gerlach <d-gerlach@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. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + */ >> + >> +#ifndef _LINUX_PLATFORM_DATA_PM33XX_H >> +#define _LINUX_PLATFORM_DATA_PM33XX_H >> + > > And here you should add a linux/types.h include to make this header > self-contained. Right now you are depending on the scu header to pull in > the types for pm33xx-core.c above. > Ok will do. Thanks for the comments. Regards, Dave >> +#include <linux/kbuild.h> >> + >> +#ifndef __ASSEMBLER__ >> +struct am33xx_pm_sram_addr { >> + void (*do_wfi)(void); >> + unsigned long *do_wfi_sz; >> + unsigned long *resume_offset; >> + unsigned long *emif_sram_table; >> + unsigned long *ro_sram_data; >> +}; >> + >> +struct am33xx_pm_platform_data { >> + int (*init)(void); >> + int (*soc_suspend)(unsigned int state, int (*fn)(unsigned long)); >> + struct am33xx_pm_sram_addr *(*get_sram_addrs)(void); >> +}; >> + >> +struct am33xx_pm_sram_data { >> + u32 wfi_flags; >> + u32 l2_aux_ctrl_val; >> + u32 l2_prefetch_ctrl_val; >> +}; >> + >> +struct am33xx_pm_ro_sram_data { >> + u32 amx3_pm_sram_data_virt; >> + u32 amx3_pm_sram_data_phys; >> +}; > > Johan >
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index d728b5660e36..62253e7bfac4 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c @@ -28,6 +28,7 @@ #include <asm/vdso_datapage.h> #include <asm/hardware/cache-l2x0.h> #include <linux/kbuild.h> +#include <linux/platform_data/pm33xx.h> #include <linux/ti-emif-sram.h> /* @@ -187,6 +188,7 @@ int main(void) #if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX) BLANK(); ti_emif_offsets(); + amx3_pm_asm_offsets(); #endif return 0; diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 0465338183c7..940173fa0992 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -72,6 +72,7 @@ config SOC_AM43XX select ARM_ERRATA_754322 select ARM_ERRATA_775420 select OMAP_INTERCONNECT + select ARM_CPU_SUSPEND if PM config SOC_DRA7XX bool "TI DRA7XX" diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index c89757abb0ae..8475ae3f9ff1 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -88,6 +88,8 @@ omap-4-5-pm-common += pm44xx.o obj-$(CONFIG_ARCH_OMAP4) += $(omap-4-5-pm-common) obj-$(CONFIG_SOC_OMAP5) += $(omap-4-5-pm-common) obj-$(CONFIG_SOC_DRA7XX) += $(omap-4-5-pm-common) +obj-$(CONFIG_SOC_AM33XX) += pm33xx-core.o sleep33xx.o +obj-$(CONFIG_SOC_AM43XX) += pm33xx-core.o sleep43xx.o obj-$(CONFIG_PM_DEBUG) += pm-debug.o obj-$(CONFIG_POWER_AVS_OMAP) += sr_device.o @@ -95,6 +97,8 @@ 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) +AFLAGS_sleep43xx.o :=-Wa,-march=armv7-a$(plus_sec) endif diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index b668719b9b25..2f9649b89053 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); +struct am33xx_pm_platform_data *am33xx_pm_get_pdata(void); + +extern struct am33xx_pm_sram_addr am33xx_pm_sram; +extern struct am33xx_pm_sram_addr am43xx_pm_sram; + /* 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/pm33xx-core.c b/arch/arm/mach-omap2/pm33xx-core.c new file mode 100644 index 000000000000..c84ffc4de2e9 --- /dev/null +++ b/arch/arm/mach-omap2/pm33xx-core.c @@ -0,0 +1,181 @@ +/* + * AM33XX Arch Power Management Routines + * + * Copyright (C) 2016-2017 Texas Instruments Incorporated - http://www.ti.com/ + * Dave Gerlach + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <asm/smp_scu.h> +#include <asm/suspend.h> +#include <linux/platform_data/pm33xx.h> + +#include "cm33xx.h" +#include "common.h" +#include "control.h" +#include "clockdomain.h" +#include "iomap.h" +#include "omap_hwmod.h" +#include "pm.h" +#include "powerdomain.h" +#include "prm33xx.h" +#include "soc.h" +#include "sram.h" + +static struct powerdomain *cefuse_pwrdm, *gfx_pwrdm, *per_pwrdm, *mpu_pwrdm; +static struct clockdomain *gfx_l4ls_clkdm; +static void __iomem *scu_base; + +static int __init am43xx_map_scu(void) +{ + scu_base = ioremap(scu_a9_get_base(), SZ_256); + + if (!scu_base) + return -ENOMEM; + + return 0; +} + +static int amx3_common_init(void) +{ + gfx_pwrdm = pwrdm_lookup("gfx_pwrdm"); + per_pwrdm = pwrdm_lookup("per_pwrdm"); + mpu_pwrdm = pwrdm_lookup("mpu_pwrdm"); + + if ((!gfx_pwrdm) || (!per_pwrdm) || (!mpu_pwrdm)) + return -ENODEV; + + (void)clkdm_for_each(omap_pm_clkdms_setup, NULL); + + /* CEFUSE domain can be turned off post bootup */ + cefuse_pwrdm = pwrdm_lookup("cefuse_pwrdm"); + if (cefuse_pwrdm) + omap_set_pwrdm_state(cefuse_pwrdm, PWRDM_POWER_OFF); + else + pr_err("PM: Failed to get cefuse_pwrdm\n"); + + return 0; +} + +static int am33xx_suspend_init(void) +{ + int ret; + + gfx_l4ls_clkdm = clkdm_lookup("gfx_l4ls_gfx_clkdm"); + + if (!gfx_l4ls_clkdm) { + pr_err("PM: Cannot lookup gfx_l4ls_clkdm clockdomains\n"); + return -ENODEV; + } + + ret = amx3_common_init(); + + return ret; +} + +static int am43xx_suspend_init(void) +{ + int ret = 0; + + ret = am43xx_map_scu(); + if (ret) { + pr_err("PM: Could not ioremap SCU\n"); + return ret; + } + + ret = amx3_common_init(); + + return ret; +} + +static void amx3_pre_suspend_common(void) +{ + omap_set_pwrdm_state(gfx_pwrdm, PWRDM_POWER_OFF); +} + +static void amx3_post_suspend_common(void) +{ + int status; + /* + * Because gfx_pwrdm is the only one under MPU control, + * comment on transition status + */ + status = pwrdm_read_pwrst(gfx_pwrdm); + if (status != PWRDM_POWER_OFF) + pr_err("PM: GFX domain did not transition: %x\n", status); +} + +static int am33xx_suspend(unsigned int state, int (*fn)(unsigned long)) +{ + int ret = 0; + + amx3_pre_suspend_common(); + ret = cpu_suspend(0, fn); + amx3_post_suspend_common(); + + /* + * BUG: GFX_L4LS clock domain needs to be woken up to + * ensure thet L4LS clock domain does not get stuck in + * transition. If that happens L3 module does not get + * disabled, thereby leading to PER power domain + * transition failing + */ + + clkdm_wakeup(gfx_l4ls_clkdm); + clkdm_sleep(gfx_l4ls_clkdm); + + return ret; +} + +static int am43xx_suspend(unsigned int state, int (*fn)(unsigned long)) +{ + int ret = 0; + + amx3_pre_suspend_common(); + scu_power_mode(scu_base, SCU_PM_POWEROFF); + ret = cpu_suspend(0, fn); + scu_power_mode(scu_base, SCU_PM_NORMAL); + amx3_post_suspend_common(); + + return ret; +} + +static struct am33xx_pm_sram_addr *amx3_get_sram_addrs(void) +{ + if (soc_is_am33xx()) + return &am33xx_pm_sram; + else if (soc_is_am437x()) + return &am43xx_pm_sram; + else + return NULL; +} + +static struct am33xx_pm_platform_data am33xx_ops = { + .init = am33xx_suspend_init, + .soc_suspend = am33xx_suspend, + .get_sram_addrs = amx3_get_sram_addrs, +}; + +static struct am33xx_pm_platform_data am43xx_ops = { + .init = am43xx_suspend_init, + .soc_suspend = am43xx_suspend, + .get_sram_addrs = amx3_get_sram_addrs, +}; + +struct am33xx_pm_platform_data *am33xx_pm_get_pdata(void) +{ + if (soc_is_am33xx()) + return &am33xx_ops; + else if (soc_is_am437x()) + return &am43xx_ops; + else + return NULL; +} diff --git a/include/linux/platform_data/pm33xx.h b/include/linux/platform_data/pm33xx.h new file mode 100644 index 000000000000..c191ab681093 --- /dev/null +++ b/include/linux/platform_data/pm33xx.h @@ -0,0 +1,69 @@ +/* + * TI pm33xx platform data + * + * Copyright (C) 2016-2017 Texas Instruments, Inc. + * Dave Gerlach <d-gerlach@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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _LINUX_PLATFORM_DATA_PM33XX_H +#define _LINUX_PLATFORM_DATA_PM33XX_H + +#include <linux/kbuild.h> + +#ifndef __ASSEMBLER__ +struct am33xx_pm_sram_addr { + void (*do_wfi)(void); + unsigned long *do_wfi_sz; + unsigned long *resume_offset; + unsigned long *emif_sram_table; + unsigned long *ro_sram_data; +}; + +struct am33xx_pm_platform_data { + int (*init)(void); + int (*soc_suspend)(unsigned int state, int (*fn)(unsigned long)); + struct am33xx_pm_sram_addr *(*get_sram_addrs)(void); +}; + +struct am33xx_pm_sram_data { + u32 wfi_flags; + u32 l2_aux_ctrl_val; + u32 l2_prefetch_ctrl_val; +}; + +struct am33xx_pm_ro_sram_data { + u32 amx3_pm_sram_data_virt; + u32 amx3_pm_sram_data_phys; +}; + +extern inline void amx3_pm_asm_offsets(void) +{ + DEFINE(AMX3_PM_WFI_FLAGS_OFFSET, + offsetof(struct am33xx_pm_sram_data, wfi_flags)); + DEFINE(AMX3_PM_L2_AUX_CTRL_VAL_OFFSET, + offsetof(struct am33xx_pm_sram_data, l2_aux_ctrl_val)); + DEFINE(AMX3_PM_L2_PREFETCH_CTRL_VAL_OFFSET, + offsetof(struct am33xx_pm_sram_data, l2_prefetch_ctrl_val)); + DEFINE(AMX3_PM_SRAM_DATA_SIZE, sizeof(struct am33xx_pm_sram_data)); + + BLANK(); + + DEFINE(AMX3_PM_RO_SRAM_DATA_VIRT_OFFSET, + offsetof(struct am33xx_pm_ro_sram_data, amx3_pm_sram_data_virt)); + DEFINE(AMX3_PM_RO_SRAM_DATA_PHYS_OFFSET, + offsetof(struct am33xx_pm_ro_sram_data, amx3_pm_sram_data_phys)); + DEFINE(AMX3_PM_RO_SRAM_DATA_SIZE, + sizeof(struct am33xx_pm_ro_sram_data)); +} + +#endif /* __ASSEMBLER__ */ +#endif /* _LINUX_PLATFORM_DATA_PM33XX_H */
Most of the PM code needed for am335x and am437x can be moved into a module under drivers but some core code must remain in mach-omap2 at the moment. This includes some internal clockdomain APIs and low-level ARM APIs which are also not exported for use by modules. Implement a few functions that handle these low-level platform operations can be passed to the pm33xx module through the use of platform data. In addition to this, to be able to share data structures between C and the sleep33xx and sleep43xx assembly code, we can automatically generate all of the C struct member offsets and sizes as macros by making use of the ARM asm-offsets file. In the same header that we define our data structures in we also define all the macros in an inline function and by adding a call to this in the asm_offsets file all macros are properly generated and available to the assembly code without cluttering up the asm-offsets file. Signed-off-by: Dave Gerlach <d-gerlach@ti.com> --- arch/arm/kernel/asm-offsets.c | 2 + arch/arm/mach-omap2/Kconfig | 1 + arch/arm/mach-omap2/Makefile | 4 + arch/arm/mach-omap2/pm.h | 5 + arch/arm/mach-omap2/pm33xx-core.c | 181 +++++++++++++++++++++++++++++++++++ include/linux/platform_data/pm33xx.h | 69 +++++++++++++ 6 files changed, 262 insertions(+) create mode 100644 arch/arm/mach-omap2/pm33xx-core.c create mode 100644 include/linux/platform_data/pm33xx.h