OMAP PM, clock, and SDRC updates for the 2.6.32 merge window
Subsystems (7)
Paul Walmsley
maintainerv2 cover OMAP PM, clock, and SDRC updates for the 2.6.32 merge window
Hello,
This second revision of this series drops the patch that ensures that OMAP clocks use unique names, and the patch that adds omap_clk_get_by_name(). The omap_hwmod code has been changed to use clk_get_sys().
- Paul
--------------------------------------------------------------------------
This series contains power management, clock, and SDRC patches for the 2.6.32 merge window. All but the bugfix patches 1 and 3 are in use in Kevin's PM branch.
The series includes:
- several bugfixes (patches 1, 3, 4, 5);
- introduces the OMAP PM interface (patch 6), used by core code and some device drivers (via platform_data function pointers) to communicate OMAP-specific PM requirements to OMAP core code;
- introduces the omap_hwmod and omap_device layers (prereqs are patches 7, 8; core is patches 9, 10, 11);
- and adds some missing SDRC registers that are used by other code in the PM branch (patch 2).
For reference:
Code that uses the OMAP PM interface is here: (despite the header text, this was not written by me; the header was simply copied from omap-pm-noop.c):
http://git.kernel.org/?p=linux/kernel/git/khilman/linux-omap-pm.git;a=blob;f=arch/arm/plat-omap/omap-pm-srf.c;h=4350650b95090b2a5b503b09830bac42109dc262;hb=pm
Code that uses the omap_hwmod/omap_device code is here:
http://git.kernel.org/?p=linux/kernel/git/khilman/linux-omap-pm.git;a=commit;h=0ddd9080f3c20c32dadf40e12bee05b8cf6784bc http://git.kernel.org/?p=linux/kernel/git/khilman/linux-omap-pm.git;a=commit;h=4d04506972aba09f21df3b956895fe59a9230697 http://git.kernel.org/?p=linux/kernel/git/khilman/linux-omap-pm.git;a=commit;h=9ef2c1a657621b10e0ea46f7824ebbc725cd2c26
regards,
- Paul
---
Paul Walmsley (9):
OMAP: powerdomain: Fix overflow when doing powerdomain deps lookups. OMAP clock: associate MPU clocks with the mpu_clkdm
OMAP3 clock: remove superfluous calls to omap2_init_clk_clkdm OMAP2/3 PM: create the OMAP PM interface and add a default OMAP PM no-op layer OMAP2/3/4 PRCM: add module IDLEST wait code
OMAP2/3 board-*.c files: read bootloader configuration earlier OMAP2/3/4: create omap_hwmod layer
OMAP: omap_hwmod: call omap_hwmod init at boot; create interconnects OMAP2/3/4 core: create omap_device layer
Sanjeev Premi (1):
OMAP3 clock: Fixed processing of bootarg 'mpurate'
Tero Kristo (1):
OMAP: SDRC: Add several new register definitions
Documentation/arm/OMAP/omap_pm | 129 ++ arch/arm/mach-omap2/Makefile | 7 arch/arm/mach-omap2/board-2430sdp.c | 17 arch/arm/mach-omap2/board-3430sdp.c | 18 arch/arm/mach-omap2/board-apollon.c | 20 arch/arm/mach-omap2/board-generic.c | 14 arch/arm/mach-omap2/board-h4.c | 20 arch/arm/mach-omap2/board-ldp.c | 20 arch/arm/mach-omap2/board-omap3beagle.c | 26 arch/arm/mach-omap2/board-omap3evm.c | 14 arch/arm/mach-omap2/board-omap3pandora.c | 20 arch/arm/mach-omap2/board-overo.c | 20 arch/arm/mach-omap2/board-rx51.c | 4 arch/arm/mach-omap2/board-zoom2.c | 18 arch/arm/mach-omap2/clock34xx.c | 17 arch/arm/mach-omap2/clock34xx.h | 21 arch/arm/mach-omap2/cm.c | 70 + arch/arm/mach-omap2/cm.h | 4 arch/arm/mach-omap2/cm4xxx.c | 68 + arch/arm/mach-omap2/io.c | 23 arch/arm/mach-omap2/omap_hwmod.c | 1554 +++++++++++++++++++++++++ arch/arm/mach-omap2/omap_hwmod_2420.h | 141 ++ arch/arm/mach-omap2/omap_hwmod_2430.h | 143 ++ arch/arm/mach-omap2/omap_hwmod_34xx.h | 168 +++ arch/arm/mach-omap2/powerdomain.c | 4 arch/arm/mach-omap2/serial.c | 14 arch/arm/plat-omap/Kconfig | 13 arch/arm/plat-omap/Makefile | 5 arch/arm/plat-omap/include/mach/omap-pm.h | 301 +++++ arch/arm/plat-omap/include/mach/omap_device.h | 141 ++ arch/arm/plat-omap/include/mach/omap_hwmod.h | 447 +++++++ arch/arm/plat-omap/include/mach/sdrc.h | 9 arch/arm/plat-omap/include/mach/serial.h | 3 arch/arm/plat-omap/omap-pm-noop.c | 296 +++++ arch/arm/plat-omap/omap_device.c | 687 +++++++++++ 35 files changed, 4337 insertions(+), 139 deletions(-) create mode 100644 Documentation/arm/OMAP/omap_pm create mode 100644 arch/arm/mach-omap2/cm.c create mode 100644 arch/arm/mach-omap2/cm4xxx.c create mode 100644 arch/arm/mach-omap2/omap_hwmod.c create mode 100644 arch/arm/mach-omap2/omap_hwmod_2420.h create mode 100644 arch/arm/mach-omap2/omap_hwmod_2430.h create mode 100644 arch/arm/mach-omap2/omap_hwmod_34xx.h create mode 100644 arch/arm/plat-omap/include/mach/omap-pm.h create mode 100644 arch/arm/plat-omap/include/mach/omap_device.h create mode 100644 arch/arm/plat-omap/include/mach/omap_hwmod.h create mode 100644 arch/arm/plat-omap/omap-pm-noop.c create mode 100644 arch/arm/plat-omap/omap_device.c
A message that is not in the archive (sent off-list or not yet received): 20090818115147.14171.55785.stgit-bi+AKbBUZKY6gyzm1THtWbp2dZbC/[email protected]
PATCH v2 1/11 OMAP: powerdomain: Fix overflow when doing powerdomain deps lookups.
At the end of the list pd is a pointer to a NULL struct, so checking if the address == NULL doesn't help here. In fact the original code will just keep running past the struct to read who knows what in memory.
This case manifests itself when from clkdms_setup() when enabling auto idle for a clock domain and the clockdomain usecount is greater than
0. When _clkdm_add_autodeps() tries to add the a dependency that does not exist in the powerdomain->wkdep_srcs array the for loop will run past the wkdep_srcs array.
Currently in linux-omap you won't hit this because the not found case is never executed, unless you start modifying powerdomains and their wakeup/sleep deps.
--- arch/arm/mach-omap2/powerdomain.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
arch/arm/mach-omap2/powerdomain.c +2 -2
@@ -83,7 +83,7 @@ static struct powerdomain *_pwrdm_deps_lookup(struct powerdomain *pwrdm,if (!pwrdm || !deps || !omap_chip_is (pwrdm->omap_chip))return ERR_PTR (-EINVAL ); -for (pd = deps; pd; pd++) { +for (pd = deps; pd->pwrdm_name; pd++) {if (!omap_chip_is (pd->omap_chip))continue ;
@@ -96,7 +96,7 @@ static struct powerdomain *_pwrdm_deps_lookup(struct powerdomain *pwrdm, } -if (!pd) +if (!pd->pwrdm_name)return ERR_PTR (-ENOENT );return pd->pwrdm;
--
To unsubscribe from this list: send the line "unsubscribe linux-arm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 2/11 OMAP: SDRC: Add several new register definitions
In reply to a message not in the archiveFrom: Tero Kristo <[email protected]>
Add missing SDRC register offset macros.
--- arch/arm/plat-omap/include/mach/sdrc.h | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-)
arch/arm/plat-omap/include/mach/sdrc.h +9 -0
@@ -21,19 +21,28 @@/* SDRC register offsets - read/write with sdrc_{read,write}_reg() */ #define SDRC_SYSCONFIG 0x010 +#define SDRC_CS_CFG 0x040 +#define SDRC_SHARING 0x044 +#define SDRC_ERR_TYPE 0x04C#define SDRC_DLLA_CTRL 0x060#define SDRC_DLLA_STATUS 0x064#define SDRC_DLLB_CTRL 0x068#define SDRC_DLLB_STATUS 0x06C#define SDRC_POWER 0x070 +#define SDRC_MCFG_0 0x080#define SDRC_MR_0 0x084 +#define SDRC_EMR2_0 0x08c#define SDRC_ACTIM_CTRL_A_0 0x09c#define SDRC_ACTIM_CTRL_B_0 0x0a0#define SDRC_RFR_CTRL_0 0x0a4 +#define SDRC_MANUAL_0 0x0a8 +#define SDRC_MCFG_1 0x0B0#define SDRC_MR_1 0x0B4 +#define SDRC_EMR2_1 0x0BC#define SDRC_ACTIM_CTRL_A_1 0x0C4#define SDRC_ACTIM_CTRL_B_1 0x0C8#define SDRC_RFR_CTRL_1 0x0D4 +#define SDRC_MANUAL_1 0x0D8/* * These values represent the number of memory clock cycles between
--
To unsubscribe from this list: send the line "unsubscribe linux-arm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 3/11 OMAP3 clock: Fixed processing of bootarg 'mpurate'
In reply to a message not in the archiveFrom: Sanjeev Premi <[email protected]>
The argument 'mpurate' had no effect on the MPU
frequency. This patch fixes the same.
--- arch/arm/mach-omap2/clock34xx.c | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-)
arch/arm/mach-omap2/clock34xx.c +9 -8
@@ -27,6 +27,7 @@#include <linux/limits.h> #include <linux/bitops.h> +#include <mach/cpu.h> #include <mach/clock.h> #include <mach/sram.h> #include <asm/div64.h>
@@ -1067,17 +1068,17 @@ static int __init omap2_clk_arch_init(void)return -EINVAL ;/* REVISIT: not yet ready for 343x */ -#if 0 -if (clk_set_rate (&virt_prcm_set, mpurate)) -printk (KERN_ERR "Could not find matching MPU rate\n" ); -#endif +if (clk_set_rate (&dpll1_ck, mpurate)) +printk (KERN_ERR "*** Unable to set MPU rate\n" );recalculate_root_clocks (); -printk (KERN_INFO "Switched to new clocking rate (Crystal/DPLL3/MPU): " +printk (KERN_INFO "Switched to new clocking rate (Crystal/Core/MPU): " "%ld.%01ld/%ld/%ld MHz\n" , - (osc_sys_ck.rate /1000000 ), (osc_sys_ck.rate /100000 ) %10 , - (core_ck.rate /1000000 ), (dpll1_fck.rate /1000000 )) ; + (osc_sys_ck.rate /1000000 ), ((osc_sys_ck.rate /100000 ) %10 ), + (core_ck.rate /1000000 ), (arm_fck.rate /1000000 )) ; + +calibrate_delay ();return 0 ; }
@@ -1136,7 +1137,7 @@ int __init omap2_clk_init(void)recalculate_root_clocks (); -printk (KERN_INFO "Clocking rate (Crystal/DPLL/ARM core): " +printk (KERN_INFO "Clocking rate (Crystal/Core/MPU): " "%ld.%01ld/%ld/%ld MHz\n" , (osc_sys_ck.rate /1000000 ), (osc_sys_ck.rate /100000 ) %10 , (core_ck.rate /1000000 ), (arm_fck.rate /1000000 ));
--
To unsubscribe from this list: send the line "unsubscribe linux-arm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 4/11 OMAP clock: associate MPU clocks with the mpu_clkdm
In reply to a message not in the archiveAll MPU-related clocks should be in the mpu_clkdm. This is needed for the upcoming omap_hwmod patches, which needs to know the clockdomain that arm_fck is in.
--- arch/arm/mach-omap2/clock34xx.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
arch/arm/mach-omap2/clock34xx.h +1 -0
@@ -1020,6 +1020,7 @@ static struct clk arm_fck = { .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL), .clksel_mask = OMAP3430_ST_MPU_CLK_MASK, .clksel = arm_fck_clksel, + .clkdm_name = "mpu_clkdm", .recalc = &omap2_clksel_recalc, };
--
To unsubscribe from this list: send the line "unsubscribe linux-arm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 5/11 OMAP3 clock: remove superfluous calls to omap2_init_clk_clkdm
In reply to a message not in the archiveomap2_init_clk_clkdm() is called as part of the chip architecture-specific initialization code, so calling it again from the struct clk init pointer just wastes cycles.
--- arch/arm/mach-omap2/clock34xx.h | 20 -------------------- 1 files changed, 0 insertions(+), 20 deletions(-)
arch/arm/mach-omap2/clock34xx.h +0 -20
@@ -1156,7 +1156,6 @@ static struct clk gfx_cg1_ck = { .name = "gfx_cg1_ck", .ops = &clkops_omap2_dflt_wait, .parent = &gfx_l3_fck, /* REVISIT: correct? */ - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN), .enable_bit = OMAP3430ES1_EN_2D_SHIFT, .clkdm_name = "gfx_3430es1_clkdm",
@@ -1167,7 +1166,6 @@ static struct clk gfx_cg2_ck = { .name = "gfx_cg2_ck", .ops = &clkops_omap2_dflt_wait, .parent = &gfx_l3_fck, /* REVISIT: correct? */ - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN), .enable_bit = OMAP3430ES1_EN_3D_SHIFT, .clkdm_name = "gfx_3430es1_clkdm",
@@ -1211,7 +1209,6 @@ static struct clk sgx_ick = { .name = "sgx_ick", .ops = &clkops_omap2_dflt_wait, .parent = &l3_ick, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_ICLKEN), .enable_bit = OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT, .clkdm_name = "sgx_clkdm",
@@ -1224,7 +1221,6 @@ static struct clk d2d_26m_fck = { .name = "d2d_26m_fck", .ops = &clkops_omap2_dflt_wait, .parent = &sys_ck, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), .enable_bit = OMAP3430ES1_EN_D2D_SHIFT, .clkdm_name = "d2d_clkdm",
@@ -1235,7 +1231,6 @@ static struct clk modem_fck = { .name = "modem_fck", .ops = &clkops_omap2_dflt_wait, .parent = &sys_ck, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), .enable_bit = OMAP3430_EN_MODEM_SHIFT, .clkdm_name = "d2d_clkdm",
@@ -1623,7 +1618,6 @@ static struct clk core_l3_ick = { .name = "core_l3_ick", .ops = &clkops_null, .parent = &l3_ick, - .init = &omap2_init_clk_clkdm, .clkdm_name = "core_l3_clkdm", .recalc = &followparent_recalc, };
@@ -1692,7 +1686,6 @@ static struct clk core_l4_ick = { .name = "core_l4_ick", .ops = &clkops_null, .parent = &l4_ick, - .init = &omap2_init_clk_clkdm, .clkdm_name = "core_l4_clkdm", .recalc = &followparent_recalc, };
@@ -2090,7 +2083,6 @@ static struct clk dss_tv_fck = { .name = "dss_tv_fck", .ops = &clkops_omap2_dflt, .parent = &omap_54m_fck, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), .enable_bit = OMAP3430_EN_TV_SHIFT, .clkdm_name = "dss_clkdm",
@@ -2101,7 +2093,6 @@ static struct clk dss_96m_fck = { .name = "dss_96m_fck", .ops = &clkops_omap2_dflt, .parent = &omap_96m_fck, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), .enable_bit = OMAP3430_EN_TV_SHIFT, .clkdm_name = "dss_clkdm",
@@ -2112,7 +2103,6 @@ static struct clk dss2_alwon_fck = { .name = "dss2_alwon_fck", .ops = &clkops_omap2_dflt, .parent = &sys_ck, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN), .enable_bit = OMAP3430_EN_DSS2_SHIFT, .clkdm_name = "dss_clkdm",
@@ -2124,7 +2114,6 @@ static struct clk dss_ick_3430es1 = { .name = "dss_ick", .ops = &clkops_omap2_dflt, .parent = &l4_ick, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, .clkdm_name = "dss_clkdm",
@@ -2136,7 +2125,6 @@ static struct clk dss_ick_3430es2 = { .name = "dss_ick", .ops = &clkops_omap3430es2_dss_usbhost_wait, .parent = &l4_ick, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN), .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT, .clkdm_name = "dss_clkdm",
@@ -2160,7 +2148,6 @@ static struct clk cam_ick = { .name = "cam_ick", .ops = &clkops_omap2_dflt, .parent = &l4_ick, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_ICLKEN), .enable_bit = OMAP3430_EN_CAM_SHIFT, .clkdm_name = "cam_clkdm",
@@ -2171,7 +2158,6 @@ static struct clk csi2_96m_fck = { .name = "csi2_96m_fck", .ops = &clkops_omap2_dflt, .parent = &core_96m_fck, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN), .enable_bit = OMAP3430_EN_CSI2_SHIFT, .clkdm_name = "cam_clkdm",
@@ -2184,7 +2170,6 @@ static struct clk usbhost_120m_fck = { .name = "usbhost_120m_fck", .ops = &clkops_omap2_dflt, .parent = &dpll5_m2_ck, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN), .enable_bit = OMAP3430ES2_EN_USBHOST2_SHIFT, .clkdm_name = "usbhost_clkdm",
@@ -2195,7 +2180,6 @@ static struct clk usbhost_48m_fck = { .name = "usbhost_48m_fck", .ops = &clkops_omap3430es2_dss_usbhost_wait, .parent = &omap_48m_fck, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN), .enable_bit = OMAP3430ES2_EN_USBHOST1_SHIFT, .clkdm_name = "usbhost_clkdm",
@@ -2207,7 +2191,6 @@ static struct clk usbhost_ick = { .name = "usbhost_ick", .ops = &clkops_omap3430es2_dss_usbhost_wait, .parent = &l4_ick, - .init = &omap2_init_clk_clkdm, .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN), .enable_bit = OMAP3430ES2_EN_USBHOST_SHIFT, .clkdm_name = "usbhost_clkdm",
@@ -2269,7 +2252,6 @@ static struct clk gpt1_fck = {static struct clk wkup_32k_fck = { .name ="wkup_32k_fck" , .ops = &clkops_null, - .init = &omap2_init_clk_clkdm, .parent = &omap_32k_fck, .clkdm_name ="wkup_clkdm" , .recalc = &followparent_recalc,
@@ -2384,7 +2366,6 @@ static struct clk per_96m_fck = { .name = "per_96m_fck", .ops = &clkops_null, .parent = &omap_96m_alwon_fck, - .init = &omap2_init_clk_clkdm, .clkdm_name = "per_clkdm", .recalc = &followparent_recalc, };
@@ -2393,7 +2374,6 @@ static struct clk per_48m_fck = { .name = "per_48m_fck", .ops = &clkops_null, .parent = &omap_48m_fck, - .init = &omap2_init_clk_clkdm, .clkdm_name = "per_clkdm", .recalc = &followparent_recalc, };
--
To unsubscribe from this list: send the line "unsubscribe linux-arm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 6/11 OMAP2/3 PM: create the OMAP PM interface and add a default OMAP PM no-op layer
In reply to a message not in the archiveThe interface provides device drivers, CPUFreq, and DSPBridge with a means of controlling OMAP power management parameters that are not yet supported by the Linux PM PMQoS interface. Copious documentation is in the patch in Documentation/arm/OMAP/omap_pm and the interface header file, arch/arm/plat-omap/include/mach/omap-pm.h.
Thanks to Rajendra Nayak <[email protected]> for adding CORE (VDD2) OPP support and moving the OPP table initialization earlier in the event
that the clock code needs them. Thanks to Tero Kristo <[email protected]> for fixing the parameter check in omap_pm_set_min_bus_tput(). Jouni signed off on Tero's patch.
--- Documentation/arm/OMAP/omap_pm | 129 ++++++++++++ arch/arm/mach-omap2/io.c | 4 arch/arm/plat-omap/Kconfig | 13 + arch/arm/plat-omap/Makefile | 1 arch/arm/plat-omap/include/mach/omap-pm.h | 301 +++++++++++++++++++++++++++++ arch/arm/plat-omap/omap-pm-noop.c | 296 +++++++++++++++++++++++++++++ 6 files changed, 744 insertions(+), 0 deletions(-) create mode 100644 Documentation/arm/OMAP/omap_pm create mode 100644 arch/arm/plat-omap/include/mach/omap-pm.h create mode 100644 arch/arm/plat-omap/omap-pm-noop.c
Documentation/arm/OMAP/omap_pm new file +129 -0
@@ -0,0 +1,129 @@ + +The OMAP PM interface +===================== + +This document describes the temporary OMAP PM interface. Driver +authors use these functions to communicate minimum latency or +throughput constraints to the kernel power management code. +Over time, the intention is to merge features from the OMAP PM +interface into the Linux PM QoS code. + +Drivers need to express PM parameters which: + +- support the range of power management parameters present in the TI SRF; + +- separate the drivers from the underlying PM parameter + implementation, whether it is the TI SRF or Linux PM QoS or Linux + latency framework or something else; + +- specify PM parameters in terms of fundamental units, such as + latency and throughput, rather than units which are specific to OMAP + or to particular OMAP variants; + +- allow drivers which are shared with other architectures (e.g., + DaVinci) to add these constraints in a way which won't affect non-OMAP + systems, + +- can be implemented immediately with minimal disruption of other + architectures. + + +This document proposes the OMAP PM interface, including the following +five power management functions for driver code: + +1. Set the maximum MPU wakeup latency: + (*pdata->set_max_mpu_wakeup_lat)(struct device *dev, unsigned long t) + +2. Set the maximum device wakeup latency: + (*pdata->set_max_dev_wakeup_lat)(struct device *dev, unsigned long t) + +3. Set the maximum system DMA transfer start latency (CORE pwrdm): + (*pdata->set_max_sdma_lat)(struct device *dev, long t) + +4. Set the minimum bus throughput needed by a device: + (*pdata->set_min_bus_tput)(struct device *dev, u8 agent_id, unsigned long r) + +5. Return the number of times the device has lost context + (*pdata->get_dev_context_loss_count)(struct device *dev) + + +Further documentation for all OMAP PM interface functions can be +found in arch/arm/plat-omap/include/mach/omap-pm.h. + + +The OMAP PM layer is intended to be temporary +--------------------------------------------- + +The intention is that eventually the Linux PM QoS layer should support +the range of power management features present in OMAP3. As this +happens, existing drivers using the OMAP PM interface can be modified +to use the Linux PM QoS code; and the OMAP PM interface can disappear. + + +Driver usage of the OMAP PM functions +------------------------------------- + +As the 'pdata' in the above examples indicates, these functions are +exposed to drivers through function pointers in driver .platform_data +structures. The function pointers are initialized by the board-*.c +files to point to the corresponding OMAP PM functions: +.set_max_dev_wakeup_lat will point to +omap_pm_set_max_dev_wakeup_lat(), etc. Other architectures which do +not support these functions should leave these function pointers set +to NULL. Drivers should use the following idiom: + + if (pdata->set_max_dev_wakeup_lat) + (*pdata->set_max_dev_wakeup_lat)(dev, t); + +The most common usage of these functions will probably be to specify +the maximum time from when an interrupt occurs, to when the device +becomes accessible. To accomplish this, driver writers should use the +set_max_mpu_wakeup_lat() function to to constrain the MPU wakeup +latency, and the set_max_dev_wakeup_lat() function to constrain the +device wakeup latency (from clk_enable() to accessibility). For +example, + + /* Limit MPU wakeup latency */ + if (pdata->set_max_mpu_wakeup_lat) + (*pdata->set_max_mpu_wakeup_lat)(dev, tc); + + /* Limit device powerdomain wakeup latency */ + if (pdata->set_max_dev_wakeup_lat) + (*pdata->set_max_dev_wakeup_lat)(dev, td); + + /* total wakeup latency in this example: (tc + td) */ + +The PM parameters can be overwritten by calling the function again +with the new value. The settings can be removed by calling the +function with a t argument of -1 (except in the case of +set_max_bus_tput(), which should be called with an r argument of 0). + +The fifth function above, omap_pm_get_dev_context_loss_count(), +is intended as an optimization to allow drivers to determine whether the +device has lost its internal context. If context has been lost, the +driver must restore its internal context before proceeding. + + +Other specialized interface functions +------------------------------------- + +The five functions listed above are intended to be usable by any +device driver. DSPBridge and CPUFreq have a few special requirements. +DSPBridge expresses target DSP performance levels in terms of OPP IDs. +CPUFreq expresses target MPU performance levels in terms of MPU +frequency. The OMAP PM interface contains functions for these +specialized cases to convert that input information (OPPs/MPU +frequency) into the form that the underlying power management +implementation needs: + +6. (*pdata->dsp_get_opp_table)(void) + +7. (*pdata->dsp_set_min_opp)(u8 opp_id) + +8. (*pdata->dsp_get_opp)(void) + +9. (*pdata->cpu_get_freq_table)(void) + +10. (*pdata->cpu_set_freq)(unsigned long f) + +11. (*pdata->cpu_get_freq)(void)
arch/arm/mach-omap2/io.c +4 -0
@@ -36,6 +36,7 @@#ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdev is ready */ #include "clock.h" +#include <mach/omap-pm.h> #include <mach/powerdomain.h> #include "powerdomains.h"
@@ -281,9 +282,12 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, {omap2_mux_init ();#ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once the clkdev is ready */ +/* The OPP tables have to be registered before a clk init */ +omap_pm_if_early_init (mpu_opps, dsp_opps, l3_opps);pwrdm_init (powerdomains_omap);clkdm_init (clockdomains_omap, clkdm_pwrdm_autodeps);omap2_clk_init (); +omap_pm_if_init ();omap2_sdrc_init (sdrc_cs0, sdrc_cs1);_omap2_init_reprogram_sdrc ();#endif
arch/arm/plat-omap/Kconfig +13 -0
@@ -183,6 +183,19 @@ config OMAP_SERIAL_WAKE to data on the serial RX line. This allows you to wake the system from serial console. +choice + prompt "OMAP PM layer selection" + depends on ARCH_OMAP + default OMAP_PM_NOOP + +config OMAP_PM_NONE + bool "No PM layer" + +config OMAP_PM_NOOP + bool "No-op/debug PM layer" + +endchoice + endmenu endif
arch/arm/plat-omap/Makefile +1 -0
@@ -25,3 +25,4 @@ obj-y += $(i2c-omap-m) $(i2c-omap-y) # OMAP mailbox framework obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox.o +obj-$(CONFIG_OMAP_PM_NOOP) += omap-pm-noop.o
arch/arm/plat-omap/include/mach/omap-pm.h new file +301 -0
301 lines not on this page · raw message
arch/arm/plat-omap/omap-pm-noop.c new file +296 -0
296 lines not on this page · raw message
--
To unsubscribe from this list: send the line "unsubscribe linux-arm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 8/11 OMAP2/3 board-*.c files: read bootloader configuration earlier
In reply to a message not in the archiveMost board-*.c files read configuration data from the bootloader in their .init_machine() function. This needs to happen earlier, at some point before omap2_init_common_hw() is called. This is because a future patch will use the bootloader serial console port information to enable the UART clocks earlier, immediately after omap2_clk_init(). This is in turn necessary since otherwise clock tree usecounts on clocks like dpll4_m2x2_ck will be bogus, which can cause the currently-active console UART clock to be disabled during boot.
--- arch/arm/mach-omap2/board-2430sdp.c | 17 ++++++++--------- arch/arm/mach-omap2/board-3430sdp.c | 18 +++++++++--------- arch/arm/mach-omap2/board-apollon.c | 20 ++++++++++---------- arch/arm/mach-omap2/board-generic.c | 14 +++++++------- arch/arm/mach-omap2/board-h4.c | 20 ++++++++++---------- arch/arm/mach-omap2/board-ldp.c | 20 ++++++++++---------- arch/arm/mach-omap2/board-omap3beagle.c | 26 +++++++++++++------------- arch/arm/mach-omap2/board-omap3evm.c | 14 +++++++------- arch/arm/mach-omap2/board-omap3pandora.c | 20 ++++++++++---------- arch/arm/mach-omap2/board-overo.c | 20 ++++++++++---------- arch/arm/mach-omap2/board-rx51.c | 4 ++-- arch/arm/mach-omap2/board-zoom2.c | 18 +++++++++--------- arch/arm/mach-omap2/io.c | 2 ++ arch/arm/mach-omap2/serial.c | 14 +++++++++++++- arch/arm/plat-omap/include/mach/serial.h | 3 +++ 15 files changed, 123 insertions(+), 107 deletions(-)
arch/arm/mach-omap2/board-2430sdp.c +8 -9
@@ -139,13 +139,6 @@ static inline void board_smc91x_init(void)#endif -static void __init omap_2430sdp_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -omap_gpio_init (); -} -static struct omap_uart_config sdp2430_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };
@@ -155,6 +148,14 @@ static struct omap_board_config_kernel sdp2430_config[] = { {OMAP_TAG_LCD, &sdp2430_lcd_config}, }; +static void __init omap_2430sdp_init_irq (void ) +{ + omap_board_config = sdp2430_config; + omap_board_config_size =ARRAY_SIZE (sdp2430_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +omap_gpio_init (); +}static struct twl4030_gpio_platform_data sdp2430_gpio_data = { .gpio_base = OMAP_MAX_GPIO_LINES,
@@ -205,8 +206,6 @@ static void __init omap_2430sdp_init(void)omap2430_i2c_init ();platform_add_devices (sdp2430_devices,ARRAY_SIZE (sdp2430_devices)); - omap_board_config = sdp2430_config; - omap_board_config_size =ARRAY_SIZE (sdp2430_config);omap_serial_init ();twl4030_mmc_init (mmc);usb_musb_init ();
arch/arm/mach-omap2/board-3430sdp.c +9 -9
@@ -167,13 +167,6 @@ static struct platform_device *sdp3430_devices[] __initdata = { &sdp3430_lcd_device, }; -static void __init omap_3430sdp_init_irq (void ) -{ -omap2_init_common_hw (hyb18m512160af6_sdrc_params,NULL ); -omap_init_irq (); -omap_gpio_init (); -} -static struct omap_uart_config sdp3430_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };
@@ -187,6 +180,15 @@ static struct omap_board_config_kernel sdp3430_config[] __initdata = { { OMAP_TAG_LCD, &sdp3430_lcd_config }, }; +static void __init omap_3430sdp_init_irq (void ) +{ + omap_board_config = sdp3430_config; + omap_board_config_size =ARRAY_SIZE (sdp3430_config); +omap2_init_common_hw (hyb18m512160af6_sdrc_params,NULL ); +omap_init_irq (); +omap_gpio_init (); +} +static int sdp3430_batt_table[] = {/* 0 C*/ 30800, 29500, 28300, 27100,
@@ -482,8 +484,6 @@ static void __init omap_3430sdp_init(void) {omap3430_i2c_init ();platform_add_devices (sdp3430_devices,ARRAY_SIZE (sdp3430_devices)); - omap_board_config = sdp3430_config; - omap_board_config_size =ARRAY_SIZE (sdp3430_config);if (omap_rev () >OMAP3430_REV_ES1_0 ) ts_gpio =SDP3430_TS_GPIO_IRQ_SDPV2 ;else
arch/arm/mach-omap2/board-apollon.c +10 -10
@@ -248,14 +248,6 @@ out:clk_put (gpmc_fck); } -static void __init omap_apollon_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -omap_gpio_init (); -apollon_init_smc91x (); -} -static struct omap_uart_config apollon_uart_config__initdata = { .enabled_uarts = (1 <<0 ) | (0 <<1 ) | (0 <<2 ), };
@@ -276,6 +268,16 @@ static struct omap_board_config_kernel apollon_config[] = { { OMAP_TAG_LCD, &apollon_lcd_config }, }; +static void __init omap_apollon_init_irq (void ) +{ + omap_board_config = apollon_config; + omap_board_config_size =ARRAY_SIZE (apollon_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +omap_gpio_init (); +apollon_init_smc91x (); +} +static void __init apollon_led_init (void ) {/* LED0 - AA10 */
@@ -324,8 +326,6 @@ static void __init omap_apollon_init(void)* if not needed. */ platform_add_devices (apollon_devices,ARRAY_SIZE (apollon_devices)); - omap_board_config = apollon_config; - omap_board_config_size =ARRAY_SIZE (apollon_config);omap_serial_init (); }
arch/arm/mach-omap2/board-generic.c +7 -7
@@ -31,12 +31,6 @@#include <mach/board.h> #include <mach/common.h> -static void __init omap_generic_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -} -static struct omap_uart_config generic_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };
@@ -45,10 +39,16 @@ static struct omap_board_config_kernel generic_config[] = { { OMAP_TAG_UART, &generic_uart_config }, }; -static void __init omap_generic_init (void ) +static void __init omap_generic_init_irq (void ) { omap_board_config = generic_config; omap_board_config_size =ARRAY_SIZE (generic_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +} + +static void __init omap_generic_init (void ) +{omap_serial_init (); }
arch/arm/mach-omap2/board-h4.c +10 -10
@@ -268,14 +268,6 @@ static void __init h4_init_flash(void) h4_flash_resource.end = base +SZ_64M -1 ; } -static void __init omap_h4_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -omap_gpio_init (); -h4_init_flash (); -} -static struct omap_uart_config h4_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };
@@ -322,6 +314,16 @@ static struct omap_board_config_kernel h4_config[] = { { OMAP_TAG_LCD, &h4_lcd_config }, }; +static void __init omap_h4_init_irq (void ) +{ + omap_board_config = h4_config; + omap_board_config_size =ARRAY_SIZE (h4_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +omap_gpio_init (); +h4_init_flash (); +} +static struct at24_platform_data m24c01 = { .byte_len =SZ_1K /8 , .page_size = 16,
@@ -366,8 +368,6 @@ static void __init omap_h4_init(void) ARRAY_SIZE(h4_i2c_board_info));platform_add_devices (h4_devices,ARRAY_SIZE (h4_devices)); - omap_board_config = h4_config; - omap_board_config_size =ARRAY_SIZE (h4_config);omap_usb_init (&h4_usb_config);omap_serial_init (); }
arch/arm/mach-omap2/board-ldp.c +10 -10
@@ -268,14 +268,6 @@ static inline void __init ldp_init_smsc911x(void)gpio_direction_input (eth_gpio); } -static void __init omap_ldp_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -omap_gpio_init (); -ldp_init_smsc911x (); -} -static struct omap_uart_config ldp_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };
@@ -294,6 +286,16 @@ static struct omap_board_config_kernel ldp_config[] __initdata = { { OMAP_TAG_LCD, &ldp_lcd_config }, }; +static void __init omap_ldp_init_irq (void ) +{ + omap_board_config = ldp_config; + omap_board_config_size =ARRAY_SIZE (ldp_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +omap_gpio_init (); +ldp_init_smsc911x (); +} +static struct twl4030_usb_data ldp_usb_data = { .usb_mode =T2_USB_MODE_ULPI , };
@@ -377,8 +379,6 @@ static void __init omap_ldp_init(void) {omap_i2c_init ();platform_add_devices (ldp_devices,ARRAY_SIZE (ldp_devices)); - omap_board_config = ldp_config; - omap_board_config_size =ARRAY_SIZE (ldp_config); ts_gpio =54 ; ldp_spi_board_info[0 ].irq =gpio_to_irq (ts_gpio); spi_register_board_info(ldp_spi_board_info,
arch/arm/mach-omap2/board-omap3beagle.c +13 -13
@@ -280,17 +280,6 @@ static int __init omap3_beagle_i2c_init(void)return 0 ; } -static void __init omap3_beagle_init_irq (void ) -{ -omap2_init_common_hw (mt46h32m32lf6_sdrc_params, - mt46h32m32lf6_sdrc_params); -omap_init_irq (); -#ifdef CONFIG_OMAP_32K_TIMER -omap2_gp_clockevent_set_gptimer (12 ); -#endif -omap_gpio_init (); -} -static struct gpio_led gpio_leds[] = { { .name ="beagleboard::usr0" ,
@@ -349,6 +338,19 @@ static struct omap_board_config_kernel omap3_beagle_config[] __initdata = { { OMAP_TAG_LCD, &omap3_beagle_lcd_config }, }; +static void __init omap3_beagle_init_irq (void ) +{ + omap_board_config = omap3_beagle_config; + omap_board_config_size =ARRAY_SIZE (omap3_beagle_config); +omap2_init_common_hw (mt46h32m32lf6_sdrc_params, + mt46h32m32lf6_sdrc_params); +omap_init_irq (); +#ifdef CONFIG_OMAP_32K_TIMER +omap2_gp_clockevent_set_gptimer (12 ); +#endif +omap_gpio_init (); +} +static struct platform_device *omap3_beagle_devices[]__initdata = { &omap3_beagle_lcd_device, &leds_gpio,
@@ -398,8 +400,6 @@ static void __init omap3_beagle_init(void)omap3_beagle_i2c_init ();platform_add_devices (omap3_beagle_devices,ARRAY_SIZE (omap3_beagle_devices)); - omap_board_config = omap3_beagle_config; - omap_board_config_size =ARRAY_SIZE (omap3_beagle_config);omap_serial_init ();omap_cfg_reg (J25_34XX_GPIO170 );
arch/arm/mach-omap2/board-omap3evm.c +7 -7
@@ -278,19 +278,21 @@ struct spi_board_info omap3evm_spi_board_info[] = { }, }; +static struct omap_board_config_kernel omap3_evm_config[]__initdata = { + {OMAP_TAG_UART , &omap3_evm_uart_config }, + {OMAP_TAG_LCD , &omap3_evm_lcd_config }, +}; +static void __init omap3_evm_init_irq (void ) { + omap_board_config = omap3_evm_config; + omap_board_config_size =ARRAY_SIZE (omap3_evm_config);omap2_init_common_hw (mt46h32m32lf6_sdrc_params,NULL );omap_init_irq ();omap_gpio_init ();omap3evm_init_smc911x (); } -static struct omap_board_config_kernel omap3_evm_config[]__initdata = { - {OMAP_TAG_UART , &omap3_evm_uart_config }, - {OMAP_TAG_LCD , &omap3_evm_lcd_config }, -}; -static struct platform_device *omap3_evm_devices[]__initdata = { &omap3_evm_lcd_device, &omap3evm_smc911x_device,
@@ -301,8 +303,6 @@ static void __init omap3_evm_init(void)omap3_evm_i2c_init ();platform_add_devices (omap3_evm_devices,ARRAY_SIZE (omap3_evm_devices)); - omap_board_config = omap3_evm_config; - omap_board_config_size =ARRAY_SIZE (omap3_evm_config);spi_register_board_info (omap3evm_spi_board_info,ARRAY_SIZE (omap3evm_spi_board_info));
arch/arm/mach-omap2/board-omap3pandora.c +10 -10
@@ -309,14 +309,6 @@ static int __init omap3pandora_i2c_init(void)return 0 ; } -static void __init omap3pandora_init_irq (void ) -{ -omap2_init_common_hw (mt46h32m32lf6_sdrc_params, - mt46h32m32lf6_sdrc_params); -omap_init_irq (); -omap_gpio_init (); -} -static void __init omap3pandora_ads7846_init (void ) {int gpio =OMAP3_PANDORA_TS_GPIO ;
@@ -380,6 +372,16 @@ static struct omap_board_config_kernel omap3pandora_config[] __initdata = { { OMAP_TAG_LCD, &omap3pandora_lcd_config }, }; +static void __init omap3pandora_init_irq (void ) +{ + omap_board_config = omap3pandora_config; + omap_board_config_size =ARRAY_SIZE (omap3pandora_config); +omap2_init_common_hw (mt46h32m32lf6_sdrc_params, + mt46h32m32lf6_sdrc_params); +omap_init_irq (); +omap_gpio_init (); +} +static struct platform_device *omap3pandora_devices[]__initdata = { &omap3pandora_lcd_device, &pandora_leds_gpio,
@@ -391,8 +393,6 @@ static void __init omap3pandora_init(void)omap3pandora_i2c_init ();platform_add_devices (omap3pandora_devices,ARRAY_SIZE (omap3pandora_devices)); - omap_board_config = omap3pandora_config; - omap_board_config_size =ARRAY_SIZE (omap3pandora_config);omap_serial_init ();spi_register_board_info (omap3pandora_spi_board_info,ARRAY_SIZE (omap3pandora_spi_board_info));
arch/arm/mach-omap2/board-overo.c +10 -10
@@ -360,14 +360,6 @@ static int __init overo_i2c_init(void)return 0 ; } -static void __init overo_init_irq (void ) -{ -omap2_init_common_hw (mt46h32m32lf6_sdrc_params, - mt46h32m32lf6_sdrc_params); -omap_init_irq (); -omap_gpio_init (); -} -static struct platform_device overo_lcd_device = { .name ="overo_lcd" , .id =-1 ,
@@ -382,6 +374,16 @@ static struct omap_board_config_kernel overo_config[] __initdata = { { OMAP_TAG_LCD, &overo_lcd_config }, }; +static void __init overo_init_irq (void ) +{ + omap_board_config = overo_config; + omap_board_config_size =ARRAY_SIZE (overo_config); +omap2_init_common_hw (mt46h32m32lf6_sdrc_params, + mt46h32m32lf6_sdrc_params); +omap_init_irq (); +omap_gpio_init (); +} +static struct platform_device *overo_devices[]__initdata = { &overo_lcd_device, };
@@ -390,8 +392,6 @@ static void __init overo_init(void) {overo_i2c_init ();platform_add_devices (overo_devices,ARRAY_SIZE (overo_devices)); - omap_board_config = overo_config; - omap_board_config_size =ARRAY_SIZE (overo_config);omap_serial_init ();overo_flash_init ();usb_musb_init ();
arch/arm/mach-omap2/board-rx51.c +2 -2
@@ -61,6 +61,8 @@ static struct omap_board_config_kernel rx51_config[] = {static void __init rx51_init_irq (void ) { + omap_board_config = rx51_config; + omap_board_config_size =ARRAY_SIZE (rx51_config);omap2_init_common_hw (NULL ,NULL );omap_init_irq ();omap_gpio_init ();
@@ -70,8 +72,6 @@ extern void __init rx51_peripherals_init(void);static void __init rx51_init (void ) { - omap_board_config = rx51_config; - omap_board_config_size =ARRAY_SIZE (rx51_config);omap_serial_init ();usb_musb_init ();rx51_peripherals_init ();
arch/arm/mach-omap2/board-zoom2.c +9 -9
@@ -23,13 +23,6 @@#include "mmc-twl4030.h" -static void __init omap_zoom2_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -omap_gpio_init (); -} -static struct omap_uart_config zoom2_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };
@@ -38,6 +31,15 @@ static struct omap_board_config_kernel zoom2_config[] __initdata = { { OMAP_TAG_UART, &zoom2_uart_config }, }; +static void __init omap_zoom2_init_irq (void ) +{ + omap_board_config = zoom2_config; + omap_board_config_size =ARRAY_SIZE (zoom2_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +omap_gpio_init (); +} +static struct twl4030_gpio_platform_data zoom2_gpio_data = { .gpio_base =OMAP_MAX_GPIO_LINES , .irq_base = TWL4030_GPIO_IRQ_BASE,
@@ -85,8 +87,6 @@ extern int __init omap_zoom2_debugboard_init(void);static void __init omap_zoom2_init (void ) {omap_i2c_init (); - omap_board_config = zoom2_config; - omap_board_config_size =ARRAY_SIZE (zoom2_config);omap_serial_init ();omap_zoom2_debugboard_init ();twl4030_mmc_init (mmc);
arch/arm/mach-omap2/io.c +2 -0
@@ -32,6 +32,7 @@#include <mach/sram.h> #include <mach/sdrc.h> #include <mach/gpmc.h> +#include <mach/serial.h> #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdev is ready */ #include "clock.h"
@@ -287,6 +288,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,pwrdm_init (powerdomains_omap);clkdm_init (clockdomains_omap, clkdm_pwrdm_autodeps);omap2_clk_init (); +omap_serial_early_init ();omap_pm_if_init ();omap2_sdrc_init (sdrc_cs0, sdrc_cs1);_omap2_init_reprogram_sdrc ();
arch/arm/mach-omap2/serial.c +13 -1
@@ -552,7 +552,7 @@ static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = { }, }; -void __init omap_serial_init (void ) +void __init omap_serial_early_init (void ) {int i;const struct omap_uart_config *info;
@@ -607,6 +607,18 @@ void __init omap_serial_init(void) p->irq +=32 ;omap_uart_enable_clocks (uart); + } +} + +void __init omap_serial_init (void ) +{ +int i; + +for (i =0 ; i <OMAP_MAX_NR_PORTS ; i++) { +struct omap_uart_state *uart = &omap_uart[i]; +struct platform_device *pdev = &uart->pdev; +struct device *dev = &pdev->dev; +omap_uart_reset (uart);omap_uart_idle_init (uart);
arch/arm/plat-omap/include/mach/serial.h +3 -0
@@ -13,6 +13,8 @@#ifndef __ASM_ARCH_SERIAL_H#define __ASM_ARCH_SERIAL_H +#include <linux/init.h> +#if defined(CONFIG_ARCH_OMAP1 )/* OMAP1 serial ports */ #define OMAP_UART1_BASE 0xfffb0000
@@ -53,6 +55,7 @@ })#ifndef __ASSEMBLER__ +extern void __init omap_serial_early_init (void );extern void omap_serial_init (void );extern int omap_uart_can_sleep (void );extern void omap_uart_check_wakeup (void );
--
To unsubscribe from this list: send the line "unsubscribe linux-arm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 08/11] OMAP2/3 board-*.c files: read bootloader configuration earlier
Hi Paul,
Quoted 19 lines · Paul Walmsley
Most board-*.c files read configuration data from the bootloader in their .init_machine() function. This needs to happen earlier, at some point before
omap2_init_common_hw()is called. This is because a future patch will use the bootloader serial console port information to enable the UART clocks earlier, immediately afteromap2_clk_init(). This is in turn necessary since otherwise clock tree usecounts on clocks likedpll4_m2x2_ckwill be bogus, which can cause the currently-active console UART clock to be disabled during boot.Signed-off-by Paul Walmsley <[email protected]>--- arch/arm/mach-omap2/board-2430sdp.c | 17 ++++++++--------- arch/arm/mach-omap2/board-3430sdp.c | 18 +++++++++--------- arch/arm/mach-omap2/board-apollon.c | 20 ++++++++++---------- arch/arm/mach-omap2/board-generic.c | 14 +++++++------- arch/arm/mach-omap2/board-h4.c | 20 ++++++++++---------- arch/arm/mach-omap2/board-ldp.c | 20 ++++++++++---------- arch/arm/mach-omap2/board-omap3beagle.c | 26 +++++++++++++------------- arch/arm/mach-omap2/board-omap3evm.c | 14 +++++++-------
Quoted 8 lines
arch/arm/mach-omap2/board-omap3pandora.c | 20 ++++++++++---------- arch/arm/mach-omap2/board-overo.c | 20 ++++++++++---------- arch/arm/mach-omap2/board-rx51.c | 4 ++-- arch/arm/mach-omap2/board-zoom2.c | 18 +++++++++--------- arch/arm/mach-omap2/io.c | 2 ++ arch/arm/mach-omap2/serial.c | 14 +++++++++++++- arch/arm/plat-omap/include/mach/serial.h | 3 +++ 15 files changed, 123 insertions(+), 107 deletions(-)
This one needs an update to apply on omap/master since Tony has done the serial init rework which touches all these board files as well :(
Kevin
Quoted 580 lines
arch/arm/mach-omap2/board-2430sdp.c +8
-9@@ -139,13 +139,6 @@ static inline void board_smc91x_init(void)#endif -static void __init omap_2430sdp_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -omap_gpio_init (); -} -static struct omap_uart_config sdp2430_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };@@ -155,6 +148,14 @@ static struct omap_board_config_kernel sdp2430_config[] = { {OMAP_TAG_LCD, &sdp2430_lcd_config}, }; +static void __init omap_2430sdp_init_irq (void ) +{ + omap_board_config = sdp2430_config; + omap_board_config_size =ARRAY_SIZE (sdp2430_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +omap_gpio_init (); +}static struct twl4030_gpio_platform_data sdp2430_gpio_data = { .gpio_base = OMAP_MAX_GPIO_LINES,@@ -205,8 +206,6 @@ static void __init omap_2430sdp_init(void)omap2430_i2c_init ();platform_add_devices (sdp2430_devices,ARRAY_SIZE (sdp2430_devices)); - omap_board_config = sdp2430_config; - omap_board_config_size =ARRAY_SIZE (sdp2430_config);omap_serial_init ();twl4030_mmc_init (mmc);usb_musb_init ();arch/arm/mach-omap2/board-3430sdp.c +9
-9@@ -167,13 +167,6 @@ static struct platform_device *sdp3430_devices[] __initdata = { &sdp3430_lcd_device, }; -static void __init omap_3430sdp_init_irq (void ) -{ -omap2_init_common_hw (hyb18m512160af6_sdrc_params,NULL ); -omap_init_irq (); -omap_gpio_init (); -} -static struct omap_uart_config sdp3430_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };@@ -187,6 +180,15 @@ static struct omap_board_config_kernel sdp3430_config[] __initdata = { { OMAP_TAG_LCD, &sdp3430_lcd_config }, }; +static void __init omap_3430sdp_init_irq (void ) +{ + omap_board_config = sdp3430_config; + omap_board_config_size =ARRAY_SIZE (sdp3430_config); +omap2_init_common_hw (hyb18m512160af6_sdrc_params,NULL ); +omap_init_irq (); +omap_gpio_init (); +} +static int sdp3430_batt_table[] = {/* 0 C*/ 30800, 29500, 28300, 27100,@@ -482,8 +484,6 @@ static void __init omap_3430sdp_init(void) {omap3430_i2c_init ();platform_add_devices (sdp3430_devices,ARRAY_SIZE (sdp3430_devices)); - omap_board_config = sdp3430_config; - omap_board_config_size =ARRAY_SIZE (sdp3430_config);if (omap_rev () >OMAP3430_REV_ES1_0 ) ts_gpio =SDP3430_TS_GPIO_IRQ_SDPV2 ;else arch/arm/mach-omap2/board-apollon.c +10
-10@@ -248,14 +248,6 @@ out:clk_put (gpmc_fck); } -static void __init omap_apollon_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -omap_gpio_init (); -apollon_init_smc91x (); -} -static struct omap_uart_config apollon_uart_config__initdata = { .enabled_uarts = (1 <<0 ) | (0 <<1 ) | (0 <<2 ), };@@ -276,6 +268,16 @@ static struct omap_board_config_kernel apollon_config[] = { { OMAP_TAG_LCD, &apollon_lcd_config }, }; +static void __init omap_apollon_init_irq (void ) +{ + omap_board_config = apollon_config; + omap_board_config_size =ARRAY_SIZE (apollon_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +omap_gpio_init (); +apollon_init_smc91x (); +} +static void __init apollon_led_init (void ) {/* LED0 - AA10 */ @@ -324,8 +326,6 @@ static void __init omap_apollon_init(void)* if not needed. */ platform_add_devices (apollon_devices,ARRAY_SIZE (apollon_devices)); - omap_board_config = apollon_config; - omap_board_config_size =ARRAY_SIZE (apollon_config);omap_serial_init (); }arch/arm/mach-omap2/board-generic.c +7
-7@@ -31,12 +31,6 @@#include <mach/board.h> #include <mach/common.h> -static void __init omap_generic_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -} -static struct omap_uart_config generic_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };@@ -45,10 +39,16 @@ static struct omap_board_config_kernel generic_config[] = { { OMAP_TAG_UART, &generic_uart_config }, }; -static void __init omap_generic_init (void ) +static void __init omap_generic_init_irq (void ) { omap_board_config = generic_config; omap_board_config_size =ARRAY_SIZE (generic_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +} + +static void __init omap_generic_init (void ) +{omap_serial_init (); }arch/arm/mach-omap2/board-h4.c +10
-10@@ -268,14 +268,6 @@ static void __init h4_init_flash(void) h4_flash_resource.end = base +SZ_64M -1 ; } -static void __init omap_h4_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -omap_gpio_init (); -h4_init_flash (); -} -static struct omap_uart_config h4_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };@@ -322,6 +314,16 @@ static struct omap_board_config_kernel h4_config[] = { { OMAP_TAG_LCD, &h4_lcd_config }, }; +static void __init omap_h4_init_irq (void ) +{ + omap_board_config = h4_config; + omap_board_config_size =ARRAY_SIZE (h4_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +omap_gpio_init (); +h4_init_flash (); +} +static struct at24_platform_data m24c01 = { .byte_len =SZ_1K /8 , .page_size = 16,@@ -366,8 +368,6 @@ static void __init omap_h4_init(void) ARRAY_SIZE(h4_i2c_board_info));platform_add_devices (h4_devices,ARRAY_SIZE (h4_devices)); - omap_board_config = h4_config; - omap_board_config_size =ARRAY_SIZE (h4_config);omap_usb_init (&h4_usb_config);omap_serial_init (); }arch/arm/mach-omap2/board-ldp.c +10
-10@@ -268,14 +268,6 @@ static inline void __init ldp_init_smsc911x(void)gpio_direction_input (eth_gpio); } -static void __init omap_ldp_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -omap_gpio_init (); -ldp_init_smsc911x (); -} -static struct omap_uart_config ldp_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };@@ -294,6 +286,16 @@ static struct omap_board_config_kernel ldp_config[] __initdata = { { OMAP_TAG_LCD, &ldp_lcd_config }, }; +static void __init omap_ldp_init_irq (void ) +{ + omap_board_config = ldp_config; + omap_board_config_size =ARRAY_SIZE (ldp_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +omap_gpio_init (); +ldp_init_smsc911x (); +} +static struct twl4030_usb_data ldp_usb_data = { .usb_mode =T2_USB_MODE_ULPI , };@@ -377,8 +379,6 @@ static void __init omap_ldp_init(void) {omap_i2c_init ();platform_add_devices (ldp_devices,ARRAY_SIZE (ldp_devices)); - omap_board_config = ldp_config; - omap_board_config_size =ARRAY_SIZE (ldp_config); ts_gpio =54 ; ldp_spi_board_info[0 ].irq =gpio_to_irq (ts_gpio); spi_register_board_info(ldp_spi_board_info,arch/arm/mach-omap2/board-omap3beagle.c +13
-13@@ -280,17 +280,6 @@ static int __init omap3_beagle_i2c_init(void)return 0 ; } -static void __init omap3_beagle_init_irq (void ) -{ -omap2_init_common_hw (mt46h32m32lf6_sdrc_params, - mt46h32m32lf6_sdrc_params); -omap_init_irq (); -#ifdef CONFIG_OMAP_32K_TIMER -omap2_gp_clockevent_set_gptimer (12 ); -#endif -omap_gpio_init (); -} -static struct gpio_led gpio_leds[] = { { .name ="beagleboard::usr0" ,@@ -349,6 +338,19 @@ static struct omap_board_config_kernel omap3_beagle_config[] __initdata = { { OMAP_TAG_LCD, &omap3_beagle_lcd_config }, }; +static void __init omap3_beagle_init_irq (void ) +{ + omap_board_config = omap3_beagle_config; + omap_board_config_size =ARRAY_SIZE (omap3_beagle_config); +omap2_init_common_hw (mt46h32m32lf6_sdrc_params, + mt46h32m32lf6_sdrc_params); +omap_init_irq (); +#ifdef CONFIG_OMAP_32K_TIMER +omap2_gp_clockevent_set_gptimer (12 ); +#endif +omap_gpio_init (); +} +static struct platform_device *omap3_beagle_devices[]__initdata = { &omap3_beagle_lcd_device, &leds_gpio,@@ -398,8 +400,6 @@ static void __init omap3_beagle_init(void)omap3_beagle_i2c_init ();platform_add_devices (omap3_beagle_devices,ARRAY_SIZE (omap3_beagle_devices)); - omap_board_config = omap3_beagle_config; - omap_board_config_size =ARRAY_SIZE (omap3_beagle_config);omap_serial_init ();omap_cfg_reg (J25_34XX_GPIO170 );arch/arm/mach-omap2/board-omap3evm.c +7
-7@@ -278,19 +278,21 @@ struct spi_board_info omap3evm_spi_board_info[] = { }, }; +static struct omap_board_config_kernel omap3_evm_config[]__initdata = { + {OMAP_TAG_UART , &omap3_evm_uart_config }, + {OMAP_TAG_LCD , &omap3_evm_lcd_config }, +}; +static void __init omap3_evm_init_irq (void ) { + omap_board_config = omap3_evm_config; + omap_board_config_size =ARRAY_SIZE (omap3_evm_config);omap2_init_common_hw (mt46h32m32lf6_sdrc_params,NULL );omap_init_irq ();omap_gpio_init ();omap3evm_init_smc911x (); } -static struct omap_board_config_kernel omap3_evm_config[]__initdata = { - {OMAP_TAG_UART , &omap3_evm_uart_config }, - {OMAP_TAG_LCD , &omap3_evm_lcd_config }, -}; -static struct platform_device *omap3_evm_devices[]__initdata = { &omap3_evm_lcd_device, &omap3evm_smc911x_device,@@ -301,8 +303,6 @@ static void __init omap3_evm_init(void)omap3_evm_i2c_init ();platform_add_devices (omap3_evm_devices,ARRAY_SIZE (omap3_evm_devices)); - omap_board_config = omap3_evm_config; - omap_board_config_size =ARRAY_SIZE (omap3_evm_config);spi_register_board_info (omap3evm_spi_board_info,ARRAY_SIZE (omap3evm_spi_board_info));arch/arm/mach-omap2/board-omap3pandora.c +10
-10@@ -309,14 +309,6 @@ static int __init omap3pandora_i2c_init(void)return 0 ; } -static void __init omap3pandora_init_irq (void ) -{ -omap2_init_common_hw (mt46h32m32lf6_sdrc_params, - mt46h32m32lf6_sdrc_params); -omap_init_irq (); -omap_gpio_init (); -} -static void __init omap3pandora_ads7846_init (void ) {int gpio =OMAP3_PANDORA_TS_GPIO ;@@ -380,6 +372,16 @@ static struct omap_board_config_kernel omap3pandora_config[] __initdata = { { OMAP_TAG_LCD, &omap3pandora_lcd_config }, }; +static void __init omap3pandora_init_irq (void ) +{ + omap_board_config = omap3pandora_config; + omap_board_config_size =ARRAY_SIZE (omap3pandora_config); +omap2_init_common_hw (mt46h32m32lf6_sdrc_params, + mt46h32m32lf6_sdrc_params); +omap_init_irq (); +omap_gpio_init (); +} +static struct platform_device *omap3pandora_devices[]__initdata = { &omap3pandora_lcd_device, &pandora_leds_gpio,@@ -391,8 +393,6 @@ static void __init omap3pandora_init(void)omap3pandora_i2c_init ();platform_add_devices (omap3pandora_devices,ARRAY_SIZE (omap3pandora_devices)); - omap_board_config = omap3pandora_config; - omap_board_config_size =ARRAY_SIZE (omap3pandora_config);omap_serial_init ();spi_register_board_info (omap3pandora_spi_board_info,ARRAY_SIZE (omap3pandora_spi_board_info));arch/arm/mach-omap2/board-overo.c +10
-10@@ -360,14 +360,6 @@ static int __init overo_i2c_init(void)return 0 ; } -static void __init overo_init_irq (void ) -{ -omap2_init_common_hw (mt46h32m32lf6_sdrc_params, - mt46h32m32lf6_sdrc_params); -omap_init_irq (); -omap_gpio_init (); -} -static struct platform_device overo_lcd_device = { .name ="overo_lcd" , .id =-1 ,@@ -382,6 +374,16 @@ static struct omap_board_config_kernel overo_config[] __initdata = { { OMAP_TAG_LCD, &overo_lcd_config }, }; +static void __init overo_init_irq (void ) +{ + omap_board_config = overo_config; + omap_board_config_size =ARRAY_SIZE (overo_config); +omap2_init_common_hw (mt46h32m32lf6_sdrc_params, + mt46h32m32lf6_sdrc_params); +omap_init_irq (); +omap_gpio_init (); +} +static struct platform_device *overo_devices[]__initdata = { &overo_lcd_device, };@@ -390,8 +392,6 @@ static void __init overo_init(void) {overo_i2c_init ();platform_add_devices (overo_devices,ARRAY_SIZE (overo_devices)); - omap_board_config = overo_config; - omap_board_config_size =ARRAY_SIZE (overo_config);omap_serial_init ();overo_flash_init ();usb_musb_init ();arch/arm/mach-omap2/board-rx51.c +2
-2@@ -61,6 +61,8 @@ static struct omap_board_config_kernel rx51_config[] = {static void __init rx51_init_irq (void ) { + omap_board_config = rx51_config; + omap_board_config_size =ARRAY_SIZE (rx51_config);omap2_init_common_hw (NULL ,NULL );omap_init_irq ();omap_gpio_init ();@@ -70,8 +72,6 @@ extern void __init rx51_peripherals_init(void);static void __init rx51_init (void ) { - omap_board_config = rx51_config; - omap_board_config_size =ARRAY_SIZE (rx51_config);omap_serial_init ();usb_musb_init ();rx51_peripherals_init ();arch/arm/mach-omap2/board-zoom2.c +9
-9@@ -23,13 +23,6 @@#include "mmc-twl4030.h" -static void __init omap_zoom2_init_irq (void ) -{ -omap2_init_common_hw (NULL ,NULL ); -omap_init_irq (); -omap_gpio_init (); -} -static struct omap_uart_config zoom2_uart_config__initdata = { .enabled_uarts = ((1 <<0 ) | (1 <<1 ) | (1 <<2 )), };@@ -38,6 +31,15 @@ static struct omap_board_config_kernel zoom2_config[] __initdata = { { OMAP_TAG_UART, &zoom2_uart_config }, }; +static void __init omap_zoom2_init_irq (void ) +{ + omap_board_config = zoom2_config; + omap_board_config_size =ARRAY_SIZE (zoom2_config); +omap2_init_common_hw (NULL ,NULL ); +omap_init_irq (); +omap_gpio_init (); +} +static struct twl4030_gpio_platform_data zoom2_gpio_data = { .gpio_base =OMAP_MAX_GPIO_LINES , .irq_base = TWL4030_GPIO_IRQ_BASE,@@ -85,8 +87,6 @@ extern int __init omap_zoom2_debugboard_init(void);static void __init omap_zoom2_init (void ) {omap_i2c_init (); - omap_board_config = zoom2_config; - omap_board_config_size =ARRAY_SIZE (zoom2_config);omap_serial_init ();omap_zoom2_debugboard_init ();twl4030_mmc_init (mmc);arch/arm/mach-omap2/io.c +2
-0@@ -32,6 +32,7 @@#include <mach/sram.h> #include <mach/sdrc.h> #include <mach/gpmc.h> +#include <mach/serial.h> #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdev is ready */ #include "clock.h" @@ -287,6 +288,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,pwrdm_init (powerdomains_omap);clkdm_init (clockdomains_omap, clkdm_pwrdm_autodeps);omap2_clk_init (); +omap_serial_early_init ();omap_pm_if_init ();omap2_sdrc_init (sdrc_cs0, sdrc_cs1);_omap2_init_reprogram_sdrc ();arch/arm/mach-omap2/serial.c +13
-1@@ -552,7 +552,7 @@ static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = { }, }; -void __init omap_serial_init (void ) +void __init omap_serial_early_init (void ) {int i;const struct omap_uart_config *info;@@ -607,6 +607,18 @@ void __init omap_serial_init(void) p->irq +=32 ;omap_uart_enable_clocks (uart); + } +} + +void __init omap_serial_init (void ) +{ +int i; + +for (i =0 ; i <OMAP_MAX_NR_PORTS ; i++) { +struct omap_uart_state *uart = &omap_uart[i]; +struct platform_device *pdev = &uart->pdev; +struct device *dev = &pdev->dev; +omap_uart_reset (uart);omap_uart_idle_init (uart);arch/arm/plat-omap/include/mach/serial.h +3
-1@@ -13,6 +13,8 @@#ifndef __ASM_ARCH_SERIAL_H#define __ASM_ARCH_SERIAL_H +#include <linux/init.h> +#if defined(CONFIG_ARCH_OMAP1 )/* OMAP1 serial ports */ #define OMAP_UART1_BASE 0xfffb0000@@ -53,6 +55,7 @@ })#ifndef __ASSEMBLER__ +extern void __init omap_serial_early_init (void );extern void omap_serial_init (void );extern int omap_uart_can_sleep (void );extern void omap_uart_check_wakeup (void ); --To unsubscribe from this list: send the line "unsubscribe linux-arm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 9/11 OMAP2/3/4: create omap_hwmod layer
In reply to a message not in the archiveOMAP SoCs can be considered a collection of hardware IP blocks connected by various interconnects. The bus topology and device integration data is somewhat more complex than platform_device can encode. This patch creates code and structures to manage information about OMAP on-chip devices ("hardware modules") and their integration to the rest of the chip. Hardware module data is intended to be generated dynamically from the TI hardware database for the OMAP4 chips and beyond, easing Linux support for new chip variants.
This code currently:
- resets and configures all hardware modules upon startup, reducing bootloader dependencies;
- provides hooks for Linux driver model code to enable, idle, and shutdown hardware modules (forthcoming patch);
- waits for hardware modules to leave idle once their clocks are enabled and OCP_SYSCONFIG bits are set appropriately.
- provides a means to pass arbitrary IP block configuration data (e.g., FIFO size) to the device driver (via the dev_attr void pointer)
In the future this code is intended to:
- estimate interconnect bandwidth and latency characteristics to ensure constraints are satisfied during DVFS
- provide *GRPSEL bit data to the powerdomain code
- handle pin/ball muxing for devices
- generate IO mapping information dynamically
- supply device firewall configuration data
- provide hardware module data to other on-chip coprocessor software
- allow the removal of the "disable unused clocks" code in the OMAP2/3 clock code
This patch represents a collaborative effort involving many people from TI, Nokia, and the Linux-OMAP community.
--- arch/arm/mach-omap2/Makefile | 2 arch/arm/mach-omap2/omap_hwmod.c | 1555 ++++++++++++++++++++++++++ arch/arm/plat-omap/include/mach/omap_hwmod.h | 447 +++++++ 3 files changed, 2003 insertions(+), 1 deletions(-) create mode 100644 arch/arm/mach-omap2/omap_hwmod.c create mode 100644 arch/arm/plat-omap/include/mach/omap_hwmod.h
arch/arm/mach-omap2/Makefile +1 -1
@@ -5,7 +5,7 @@ # Common support obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o -omap-2-3-common = irq.o sdrc.o +omap-2-3-common = irq.o sdrc.o omap_hwmod.o prcm-common = prcm.o powerdomain.o clock-common = clock.o clockdomain.o
arch/arm/mach-omap2/omap_hwmod.c new file +1555 -0
1,555 lines not on this page · raw message
arch/arm/plat-omap/include/mach/omap_hwmod.h new file +447 -0
447 lines not on this page · raw message
--
To unsubscribe from this list: send the line "unsubscribe linux-arm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 11/11 OMAP2/3/4 core: create omap_device layer
In reply to a message not in the archiveThe omap_device code provides a mapping of omap_hwmod structures into the platform_device system, and includes some details on external (board-level) integration. This allows drivers to enable, idle, and shutdown on-chip device resources, including clocks, regulators, etc. The resources enabled and idled are dependent on the device's maximum wakeup latency constraint (if present).
At the moment, omap_device functions are intended to be called from platform_data function pointers. Ideally in the future these functions will be called from either subarchitecture-specific platform_data activate, deactivate functions, or via an custom bus/device type for OMAP.
--- arch/arm/plat-omap/Makefile | 4 arch/arm/plat-omap/include/mach/omap_device.h | 141 +++++ arch/arm/plat-omap/omap_device.c | 687 +++++++++++++++++++++++++ 3 files changed, 832 insertions(+), 0 deletions(-) create mode 100644 arch/arm/plat-omap/include/mach/omap_device.h create mode 100644 arch/arm/plat-omap/omap_device.c
arch/arm/plat-omap/Makefile +4 -0
@@ -12,6 +12,10 @@ obj- := # OCPI interconnect support for 1710, 1610 and 5912 obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o +# omap_device support (OMAP2+ only at the moment) +obj-$(CONFIG_ARCH_OMAP2) += omap_device.o +obj-$(CONFIG_ARCH_OMAP3) += omap_device.o + obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o obj-$(CONFIG_OMAP_IOMMU) += iommu.o iovmm.o
arch/arm/plat-omap/include/mach/omap_device.h new file +141 -0
141 lines not on this page · raw message
arch/arm/plat-omap/omap_device.c new file +687 -0
687 lines not on this page · raw message
--
To unsubscribe from this list: send the line "unsubscribe linux-arm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Paul Walmsley
maintainerPATCH v2 7/11 OMAP2/3/4 PRCM: add module IDLEST wait code
In reply to Paul WalmsleyAfter a hardware module's clocks are enabled, Linux must wait for it to indicate readiness via its IDLEST bit before attempting to access the device, otherwise register accesses to the device may trigger an abort. This has traditionally been implemented in the clock framework, but this is the wrong place for it: the clock framework doesn't know which module clocks must be enabled for a module to leave idle; and if a module is not in smart-idle mode, it may never leave idle at all. This type of information is best stored in a per-hardware module data structure (coming in a following patch), rather than a per-clock data structure. The new code will use these new functions to handle waiting for modules to enable.
Once hardware module data is filled in for all of the on-chip devices, the clock framework code to handle IDLEST waiting can be removed.
--- arch/arm/mach-omap2/Makefile | 5 +++ arch/arm/mach-omap2/cm.c | 70 ++++++++++++++++++++++++++++++++++++++++++ arch/arm/mach-omap2/cm.h | 4 ++ arch/arm/mach-omap2/cm4xxx.c | 68 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 147 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-omap2/cm.c create mode 100644 arch/arm/mach-omap2/cm4xxx.c
arch/arm/mach-omap2/Makefile +5 -0
@@ -35,6 +35,11 @@ obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o obj-$(CONFIG_PM_DEBUG) += pm-debug.o endif +# PRCM +obj-$(CONFIG_ARCH_OMAP2) += cm.o +obj-$(CONFIG_ARCH_OMAP3) += cm.o +obj-$(CONFIG_ARCH_OMAP4) += cm4xxx.o + # Clock framework obj-$(CONFIG_ARCH_OMAP2) += clock24xx.o obj-$(CONFIG_ARCH_OMAP3) += clock34xx.o
arch/arm/mach-omap2/cm.c new file +70 -0
70 lines not on this page · raw message
arch/arm/mach-omap2/cm.h +4 -0
@@ -98,6 +98,10 @@ extern u32 cm_read_mod_reg(s16 module, u16 idx);extern void cm_write_mod_reg (u32 val,s16 module,u16 idx);extern u32 cm_rmw_mod_reg_bits (u32 mask,u32 bits,s16 module,s16 idx); +extern int omap2_cm_wait_module_ready (s16 prcm_mod,u8 idlest_id, +u8 idlest_shift); +extern int omap4_cm_wait_module_ready (u32 prcm_mod,u8 prcm_dev_offs); +static inline u32 cm_set_mod_reg_bits (u32 bits,s16 module,s16 idx) {return cm_rmw_mod_reg_bits (bits, bits, module, idx);
arch/arm/mach-omap2/cm4xxx.c new file +68 -0
68 lines not on this page · raw message
Paul Walmsley
maintainerPATCH v2 10/11 OMAP: omap_hwmod: call omap_hwmod init at boot; create interconnects
In reply to Paul WalmsleyConnect the omap_hwmod code to the kernel boot. Create some basic interconnect and device structures for OMAP2/3 chips.
--- arch/arm/mach-omap2/io.c | 17 +++ arch/arm/mach-omap2/omap_hwmod.c | 3 - arch/arm/mach-omap2/omap_hwmod_2420.h | 141 ++++++++++++++++++++++++++++ arch/arm/mach-omap2/omap_hwmod_2430.h | 143 ++++++++++++++++++++++++++++ arch/arm/mach-omap2/omap_hwmod_34xx.h | 168 +++++++++++++++++++++++++++++++++ 5 files changed, 469 insertions(+), 3 deletions(-) create mode 100644 arch/arm/mach-omap2/omap_hwmod_2420.h create mode 100644 arch/arm/mach-omap2/omap_hwmod_2430.h create mode 100644 arch/arm/mach-omap2/omap_hwmod_34xx.h
arch/arm/mach-omap2/io.c +16 -1
@@ -39,12 +39,16 @@#include <mach/omap-pm.h> #include <mach/powerdomain.h> -#include "powerdomains.h" #include <mach/clockdomain.h> #include "clockdomains.h" #endif +#include <mach/omap_hwmod.h> +#include "omap_hwmod_2420.h" +#include "omap_hwmod_2430.h" +#include "omap_hwmod_34xx.h" +/* * The machine specific code may provide the extra mapping besides the * default mapping provided here.
@@ -281,6 +285,16 @@ static int __init _omap2_init_reprogram_sdrc(void)void __init omap2_init_common_hw (struct omap_sdrc_params *sdrc_cs0,struct omap_sdrc_params *sdrc_cs1) { +struct omap_hwmod **hwmods =NULL ; + +if (cpu_is_omap2420 ()) + hwmods = omap2420_hwmods; +else if (cpu_is_omap2430 ()) + hwmods = omap2430_hwmods; +else if (cpu_is_omap34xx ()) + hwmods = omap34xx_hwmods; + +omap_hwmod_init (hwmods);omap2_mux_init ();#ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once the clkdev is ready */ /* The OPP tables have to be registered before a clk init */
@@ -289,6 +303,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,clkdm_init (clockdomains_omap, clkdm_pwrdm_autodeps);omap2_clk_init ();omap_serial_early_init (); +omap_hwmod_late_init ();omap_pm_if_init ();omap2_sdrc_init (sdrc_cs0, sdrc_cs1);_omap2_init_reprogram_sdrc ();
arch/arm/mach-omap2/omap_hwmod.c +1 -2
@@ -765,8 +765,7 @@ static int _reset(struct omap_hwmod *oh)WARN (1 ,"omap_hwmod: %s: failed to reset in %d usec\n" , oh->name,MAX_MODULE_RESET_WAIT ); else - pr_debug("omap_hwmod: %s: reset in %d usec\n", oh->name, - MAX_MODULE_RESET_WAIT); + pr_debug("omap_hwmod: %s: reset in %d usec\n", oh->name, c);/* * XXX add _HWMOD_STATE_WEDGED for modules that don't come back from
arch/arm/mach-omap2/omap_hwmod_2420.h new file +141 -0
141 lines not on this page · raw message
arch/arm/mach-omap2/omap_hwmod_2430.h new file +143 -0
143 lines not on this page · raw message
arch/arm/mach-omap2/omap_hwmod_34xx.h new file +168 -0
168 lines not on this page · raw message