Loading Documentation/arm/OMAP/omap_pm +25 −0 Original line number Diff line number Diff line Loading @@ -127,3 +127,28 @@ implementation needs: 10. (*pdata->cpu_set_freq)(unsigned long f) 11. (*pdata->cpu_get_freq)(void) Customizing OPP for platform ============================ Defining CONFIG_PM should enable OPP layer for the silicon and the registration of OPP table should take place automatically. However, in special cases, the default OPP table may need to be tweaked, for e.g.: * enable default OPPs which are disabled by default, but which could be enabled on a platform * Disable an unsupported OPP on the platform * Define and add a custom opp table entry in these cases, the board file needs to do additional steps as follows: arch/arm/mach-omapx/board-xyz.c #include "pm.h" .... static void __init omap_xyz_init_irq(void) { .... /* Initialize the default table */ omapx_opp_init(); /* Do customization to the defaults */ .... } NOTE: omapx_opp_init will be omap3_opp_init or as required based on the omap family. arch/arm/mach-omap2/Kconfig +4 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,8 @@ config ARCH_OMAP3 select CPU_V7 select USB_ARCH_HAS_EHCI select ARM_L1_CACHE_SHIFT_6 if !ARCH_OMAP4 select ARCH_HAS_OPP select PM_OPP if PM config ARCH_OMAP4 bool "TI OMAP4" Loading @@ -44,6 +46,8 @@ config ARCH_OMAP4 select ARM_GIC select PL310_ERRATA_588369 select ARM_ERRATA_720789 select ARCH_HAS_OPP select PM_OPP if PM comment "OMAP Core Type" depends on ARCH_OMAP2 Loading arch/arm/mach-omap2/Makefile +7 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,13 @@ obj-$(CONFIG_ARCH_OMAP4) += mux44xx.o obj-$(CONFIG_ARCH_OMAP2) += sdrc2xxx.o # obj-$(CONFIG_ARCH_OMAP3) += sdrc3xxx.o # OPP table initialization ifeq ($(CONFIG_PM_OPP),y) obj-y += opp.o obj-$(CONFIG_ARCH_OMAP3) += opp3xxx_data.o obj-$(CONFIG_ARCH_OMAP4) += opp4xxx_data.o endif # Power Management ifeq ($(CONFIG_PM),y) obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o Loading arch/arm/mach-omap2/io.c +1 −2 Original line number Diff line number Diff line Loading @@ -347,8 +347,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, else if (cpu_is_omap44xx()) omap44xx_hwmod_init(); /* The OPP tables have to be registered before a clk init */ omap_pm_if_early_init(mpu_opps, dsp_opps, l3_opps); omap_pm_if_early_init(); if (cpu_is_omap2420()) omap2420_clk_init(); Loading arch/arm/mach-omap2/omap_opp_data.h 0 → 100644 +72 −0 Original line number Diff line number Diff line /* * OMAP SoC specific OPP Data helpers * * Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/ * Nishanth Menon * Kevin Hilman * Copyright (C) 2010 Nokia Corporation. * Eduardo Valentin * * 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 "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. */ #ifndef __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H #define __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H #include <plat/omap_hwmod.h> /* * *BIG FAT WARNING*: * USE the following ONLY in opp data initialization common to an SoC. * DO NOT USE these in board files/pm core etc. */ /** * struct omap_opp_def - OMAP OPP Definition * @hwmod_name: Name of the hwmod for this domain * @freq: Frequency in hertz corresponding to this OPP * @u_volt: Nominal voltage in microvolts corresponding to this OPP * @default_available: True/false - is this OPP available by default * * OMAP SOCs have a standard set of tuples consisting of frequency and voltage * pairs that the device will support per voltage domain. This is called * Operating Points or OPP. The actual definitions of OMAP Operating Points * varies over silicon within the same family of devices. For a specific * domain, you can have a set of {frequency, voltage} pairs and this is denoted * by an array of omap_opp_def. As the kernel boots and more information is * available, a set of these are activated based on the precise nature of * device the kernel boots up on. It is interesting to remember that each IP * which belongs to a voltage domain may define their own set of OPPs on top * of this - but this is handled by the appropriate driver. */ struct omap_opp_def { char *hwmod_name; unsigned long freq; unsigned long u_volt; bool default_available; }; /* * Initialization wrapper used to define an OPP for OMAP variants. */ #define OPP_INITIALIZER(_hwmod_name, _enabled, _freq, _uv) \ { \ .hwmod_name = _hwmod_name, \ .default_available = _enabled, \ .freq = _freq, \ .u_volt = _uv, \ } /* Use this to initialize the default table */ extern int __init omap_init_opp_table(struct omap_opp_def *opp_def, u32 opp_def_size); #endif /* __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H */ Loading
Documentation/arm/OMAP/omap_pm +25 −0 Original line number Diff line number Diff line Loading @@ -127,3 +127,28 @@ implementation needs: 10. (*pdata->cpu_set_freq)(unsigned long f) 11. (*pdata->cpu_get_freq)(void) Customizing OPP for platform ============================ Defining CONFIG_PM should enable OPP layer for the silicon and the registration of OPP table should take place automatically. However, in special cases, the default OPP table may need to be tweaked, for e.g.: * enable default OPPs which are disabled by default, but which could be enabled on a platform * Disable an unsupported OPP on the platform * Define and add a custom opp table entry in these cases, the board file needs to do additional steps as follows: arch/arm/mach-omapx/board-xyz.c #include "pm.h" .... static void __init omap_xyz_init_irq(void) { .... /* Initialize the default table */ omapx_opp_init(); /* Do customization to the defaults */ .... } NOTE: omapx_opp_init will be omap3_opp_init or as required based on the omap family.
arch/arm/mach-omap2/Kconfig +4 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,8 @@ config ARCH_OMAP3 select CPU_V7 select USB_ARCH_HAS_EHCI select ARM_L1_CACHE_SHIFT_6 if !ARCH_OMAP4 select ARCH_HAS_OPP select PM_OPP if PM config ARCH_OMAP4 bool "TI OMAP4" Loading @@ -44,6 +46,8 @@ config ARCH_OMAP4 select ARM_GIC select PL310_ERRATA_588369 select ARM_ERRATA_720789 select ARCH_HAS_OPP select PM_OPP if PM comment "OMAP Core Type" depends on ARCH_OMAP2 Loading
arch/arm/mach-omap2/Makefile +7 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,13 @@ obj-$(CONFIG_ARCH_OMAP4) += mux44xx.o obj-$(CONFIG_ARCH_OMAP2) += sdrc2xxx.o # obj-$(CONFIG_ARCH_OMAP3) += sdrc3xxx.o # OPP table initialization ifeq ($(CONFIG_PM_OPP),y) obj-y += opp.o obj-$(CONFIG_ARCH_OMAP3) += opp3xxx_data.o obj-$(CONFIG_ARCH_OMAP4) += opp4xxx_data.o endif # Power Management ifeq ($(CONFIG_PM),y) obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o Loading
arch/arm/mach-omap2/io.c +1 −2 Original line number Diff line number Diff line Loading @@ -347,8 +347,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, else if (cpu_is_omap44xx()) omap44xx_hwmod_init(); /* The OPP tables have to be registered before a clk init */ omap_pm_if_early_init(mpu_opps, dsp_opps, l3_opps); omap_pm_if_early_init(); if (cpu_is_omap2420()) omap2420_clk_init(); Loading
arch/arm/mach-omap2/omap_opp_data.h 0 → 100644 +72 −0 Original line number Diff line number Diff line /* * OMAP SoC specific OPP Data helpers * * Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/ * Nishanth Menon * Kevin Hilman * Copyright (C) 2010 Nokia Corporation. * Eduardo Valentin * * 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 "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. */ #ifndef __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H #define __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H #include <plat/omap_hwmod.h> /* * *BIG FAT WARNING*: * USE the following ONLY in opp data initialization common to an SoC. * DO NOT USE these in board files/pm core etc. */ /** * struct omap_opp_def - OMAP OPP Definition * @hwmod_name: Name of the hwmod for this domain * @freq: Frequency in hertz corresponding to this OPP * @u_volt: Nominal voltage in microvolts corresponding to this OPP * @default_available: True/false - is this OPP available by default * * OMAP SOCs have a standard set of tuples consisting of frequency and voltage * pairs that the device will support per voltage domain. This is called * Operating Points or OPP. The actual definitions of OMAP Operating Points * varies over silicon within the same family of devices. For a specific * domain, you can have a set of {frequency, voltage} pairs and this is denoted * by an array of omap_opp_def. As the kernel boots and more information is * available, a set of these are activated based on the precise nature of * device the kernel boots up on. It is interesting to remember that each IP * which belongs to a voltage domain may define their own set of OPPs on top * of this - but this is handled by the appropriate driver. */ struct omap_opp_def { char *hwmod_name; unsigned long freq; unsigned long u_volt; bool default_available; }; /* * Initialization wrapper used to define an OPP for OMAP variants. */ #define OPP_INITIALIZER(_hwmod_name, _enabled, _freq, _uv) \ { \ .hwmod_name = _hwmod_name, \ .default_available = _enabled, \ .freq = _freq, \ .u_volt = _uv, \ } /* Use this to initialize the default table */ extern int __init omap_init_opp_table(struct omap_opp_def *opp_def, u32 opp_def_size); #endif /* __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H */