diff options
author | Kevin Hilman <khilman@deeprootsystems.com> | 2009-04-28 18:27:44 -0400 |
---|---|---|
committer | Kevin Hilman <khilman@deeprootsystems.com> | 2009-05-28 13:59:07 -0400 |
commit | 8111b221a275cbc974eba26059dc764680ded9a9 (patch) | |
tree | c64ee856ffe9ff796f8a746025b82586c19e5617 /arch | |
parent | ba87a9beae8b39894f55761f4aff5ae2ca624f81 (diff) |
OMAP3: PM: Add D2D clocks and auto-idle setup to PRCM init
Add D2D clocks (modem_fck, sad2d_ick, mad2d_ick) to clock framework
and ensure that auto-idle bits are set for these clocks during PRCM
init.
Also add omap3_d2d_idle() function called durint PRCM setup which
ensures D2D pins are MUX'd correctly to enable retention for
standalone (no-modem) devices.
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-omap2/clock34xx.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock34xx.h | 33 | ||||
-rw-r--r-- | arch/arm/mach-omap2/cm-regbits-34xx.h | 14 | ||||
-rw-r--r-- | arch/arm/mach-omap2/pm34xx.c | 25 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/control.h | 4 |
5 files changed, 75 insertions, 4 deletions
diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index 62021397e5f9..9e43fe5209d3 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c | |||
@@ -129,6 +129,9 @@ static struct omap_clk omap34xx_clks[] = { | |||
129 | CLK(NULL, "sgx_fck", &sgx_fck, CK_3430ES2), | 129 | CLK(NULL, "sgx_fck", &sgx_fck, CK_3430ES2), |
130 | CLK(NULL, "sgx_ick", &sgx_ick, CK_3430ES2), | 130 | CLK(NULL, "sgx_ick", &sgx_ick, CK_3430ES2), |
131 | CLK(NULL, "d2d_26m_fck", &d2d_26m_fck, CK_3430ES1), | 131 | CLK(NULL, "d2d_26m_fck", &d2d_26m_fck, CK_3430ES1), |
132 | CLK(NULL, "modem_fck", &modem_fck, CK_343X), | ||
133 | CLK(NULL, "sad2d_ick", &sad2d_ick, CK_343X), | ||
134 | CLK(NULL, "mad2d_ick", &mad2d_ick, CK_343X), | ||
132 | CLK(NULL, "gpt10_fck", &gpt10_fck, CK_343X), | 135 | CLK(NULL, "gpt10_fck", &gpt10_fck, CK_343X), |
133 | CLK(NULL, "gpt11_fck", &gpt11_fck, CK_343X), | 136 | CLK(NULL, "gpt11_fck", &gpt11_fck, CK_343X), |
134 | CLK(NULL, "cpefuse_fck", &cpefuse_fck, CK_3430ES2), | 137 | CLK(NULL, "cpefuse_fck", &cpefuse_fck, CK_3430ES2), |
diff --git a/arch/arm/mach-omap2/clock34xx.h b/arch/arm/mach-omap2/clock34xx.h index 496f0e9caeb2..e433aec4efdd 100644 --- a/arch/arm/mach-omap2/clock34xx.h +++ b/arch/arm/mach-omap2/clock34xx.h | |||
@@ -1230,6 +1230,37 @@ static struct clk d2d_26m_fck = { | |||
1230 | .recalc = &followparent_recalc, | 1230 | .recalc = &followparent_recalc, |
1231 | }; | 1231 | }; |
1232 | 1232 | ||
1233 | static struct clk modem_fck = { | ||
1234 | .name = "modem_fck", | ||
1235 | .ops = &clkops_omap2_dflt_wait, | ||
1236 | .parent = &sys_ck, | ||
1237 | .init = &omap2_init_clk_clkdm, | ||
1238 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | ||
1239 | .enable_bit = OMAP3430_EN_MODEM_SHIFT, | ||
1240 | .clkdm_name = "d2d_clkdm", | ||
1241 | .recalc = &followparent_recalc, | ||
1242 | }; | ||
1243 | |||
1244 | static struct clk sad2d_ick = { | ||
1245 | .name = "sad2d_ick", | ||
1246 | .ops = &clkops_omap2_dflt_wait, | ||
1247 | .parent = &l3_ick, | ||
1248 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | ||
1249 | .enable_bit = OMAP3430_EN_SAD2D_SHIFT, | ||
1250 | .clkdm_name = "d2d_clkdm", | ||
1251 | .recalc = &followparent_recalc, | ||
1252 | }; | ||
1253 | |||
1254 | static struct clk mad2d_ick = { | ||
1255 | .name = "mad2d_ick", | ||
1256 | .ops = &clkops_omap2_dflt_wait, | ||
1257 | .parent = &l3_ick, | ||
1258 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3), | ||
1259 | .enable_bit = OMAP3430_EN_MAD2D_SHIFT, | ||
1260 | .clkdm_name = "d2d_clkdm", | ||
1261 | .recalc = &followparent_recalc, | ||
1262 | }; | ||
1263 | |||
1233 | static const struct clksel omap343x_gpt_clksel[] = { | 1264 | static const struct clksel omap343x_gpt_clksel[] = { |
1234 | { .parent = &omap_32k_fck, .rates = gpt_32k_rates }, | 1265 | { .parent = &omap_32k_fck, .rates = gpt_32k_rates }, |
1235 | { .parent = &sys_ck, .rates = gpt_sys_rates }, | 1266 | { .parent = &sys_ck, .rates = gpt_sys_rates }, |
@@ -1947,8 +1978,6 @@ static struct clk usb_l4_ick = { | |||
1947 | .recalc = &omap2_clksel_recalc, | 1978 | .recalc = &omap2_clksel_recalc, |
1948 | }; | 1979 | }; |
1949 | 1980 | ||
1950 | /* XXX MDM_INTC_ICK, SAD2D_ICK ?? */ | ||
1951 | |||
1952 | /* SECURITY_L4_ICK2 based clocks */ | 1981 | /* SECURITY_L4_ICK2 based clocks */ |
1953 | 1982 | ||
1954 | static struct clk security_l4_ick2 = { | 1983 | static struct clk security_l4_ick2 = { |
diff --git a/arch/arm/mach-omap2/cm-regbits-34xx.h b/arch/arm/mach-omap2/cm-regbits-34xx.h index 6f3f5a36aae6..6923deb98a28 100644 --- a/arch/arm/mach-omap2/cm-regbits-34xx.h +++ b/arch/arm/mach-omap2/cm-regbits-34xx.h | |||
@@ -145,6 +145,8 @@ | |||
145 | #define OMAP3430_CLKACTIVITY_MPU_MASK (1 << 0) | 145 | #define OMAP3430_CLKACTIVITY_MPU_MASK (1 << 0) |
146 | 146 | ||
147 | /* CM_FCLKEN1_CORE specific bits */ | 147 | /* CM_FCLKEN1_CORE specific bits */ |
148 | #define OMAP3430_EN_MODEM (1 << 31) | ||
149 | #define OMAP3430_EN_MODEM_SHIFT 31 | ||
148 | 150 | ||
149 | /* CM_ICLKEN1_CORE specific bits */ | 151 | /* CM_ICLKEN1_CORE specific bits */ |
150 | #define OMAP3430_EN_ICR (1 << 29) | 152 | #define OMAP3430_EN_ICR (1 << 29) |
@@ -161,6 +163,8 @@ | |||
161 | #define OMAP3430_EN_MAILBOXES_SHIFT 7 | 163 | #define OMAP3430_EN_MAILBOXES_SHIFT 7 |
162 | #define OMAP3430_EN_OMAPCTRL (1 << 6) | 164 | #define OMAP3430_EN_OMAPCTRL (1 << 6) |
163 | #define OMAP3430_EN_OMAPCTRL_SHIFT 6 | 165 | #define OMAP3430_EN_OMAPCTRL_SHIFT 6 |
166 | #define OMAP3430_EN_SAD2D (1 << 3) | ||
167 | #define OMAP3430_EN_SAD2D_SHIFT 3 | ||
164 | #define OMAP3430_EN_SDRC (1 << 1) | 168 | #define OMAP3430_EN_SDRC (1 << 1) |
165 | #define OMAP3430_EN_SDRC_SHIFT 1 | 169 | #define OMAP3430_EN_SDRC_SHIFT 1 |
166 | 170 | ||
@@ -176,6 +180,10 @@ | |||
176 | #define OMAP3430_EN_DES1 (1 << 0) | 180 | #define OMAP3430_EN_DES1 (1 << 0) |
177 | #define OMAP3430_EN_DES1_SHIFT 0 | 181 | #define OMAP3430_EN_DES1_SHIFT 0 |
178 | 182 | ||
183 | /* CM_ICLKEN3_CORE */ | ||
184 | #define OMAP3430_EN_MAD2D_SHIFT 3 | ||
185 | #define OMAP3430_EN_MAD2D (1 << 3) | ||
186 | |||
179 | /* CM_FCLKEN3_CORE specific bits */ | 187 | /* CM_FCLKEN3_CORE specific bits */ |
180 | #define OMAP3430ES2_EN_TS_SHIFT 1 | 188 | #define OMAP3430ES2_EN_TS_SHIFT 1 |
181 | #define OMAP3430ES2_EN_TS_MASK (1 << 1) | 189 | #define OMAP3430ES2_EN_TS_MASK (1 << 1) |
@@ -231,6 +239,8 @@ | |||
231 | #define OMAP3430ES2_ST_CPEFUSE_MASK (1 << 0) | 239 | #define OMAP3430ES2_ST_CPEFUSE_MASK (1 << 0) |
232 | 240 | ||
233 | /* CM_AUTOIDLE1_CORE */ | 241 | /* CM_AUTOIDLE1_CORE */ |
242 | #define OMAP3430_AUTO_MODEM (1 << 31) | ||
243 | #define OMAP3430_AUTO_MODEM_SHIFT 31 | ||
234 | #define OMAP3430ES2_AUTO_MMC3 (1 << 30) | 244 | #define OMAP3430ES2_AUTO_MMC3 (1 << 30) |
235 | #define OMAP3430ES2_AUTO_MMC3_SHIFT 30 | 245 | #define OMAP3430ES2_AUTO_MMC3_SHIFT 30 |
236 | #define OMAP3430ES2_AUTO_ICR (1 << 29) | 246 | #define OMAP3430ES2_AUTO_ICR (1 << 29) |
@@ -287,6 +297,8 @@ | |||
287 | #define OMAP3430_AUTO_HSOTGUSB_SHIFT 4 | 297 | #define OMAP3430_AUTO_HSOTGUSB_SHIFT 4 |
288 | #define OMAP3430ES1_AUTO_D2D (1 << 3) | 298 | #define OMAP3430ES1_AUTO_D2D (1 << 3) |
289 | #define OMAP3430ES1_AUTO_D2D_SHIFT 3 | 299 | #define OMAP3430ES1_AUTO_D2D_SHIFT 3 |
300 | #define OMAP3430_AUTO_SAD2D (1 << 3) | ||
301 | #define OMAP3430_AUTO_SAD2D_SHIFT 3 | ||
290 | #define OMAP3430_AUTO_SSI (1 << 0) | 302 | #define OMAP3430_AUTO_SSI (1 << 0) |
291 | #define OMAP3430_AUTO_SSI_SHIFT 0 | 303 | #define OMAP3430_AUTO_SSI_SHIFT 0 |
292 | 304 | ||
@@ -308,6 +320,8 @@ | |||
308 | #define OMAP3430ES2_AUTO_USBTLL (1 << 2) | 320 | #define OMAP3430ES2_AUTO_USBTLL (1 << 2) |
309 | #define OMAP3430ES2_AUTO_USBTLL_SHIFT 2 | 321 | #define OMAP3430ES2_AUTO_USBTLL_SHIFT 2 |
310 | #define OMAP3430ES2_AUTO_USBTLL_MASK (1 << 2) | 322 | #define OMAP3430ES2_AUTO_USBTLL_MASK (1 << 2) |
323 | #define OMAP3430_AUTO_MAD2D_SHIFT 3 | ||
324 | #define OMAP3430_AUTO_MAD2D (1 << 3) | ||
311 | 325 | ||
312 | /* CM_CLKSEL_CORE */ | 326 | /* CM_CLKSEL_CORE */ |
313 | #define OMAP3430_CLKSEL_SSI_SHIFT 8 | 327 | #define OMAP3430_CLKSEL_SSI_SHIFT 8 |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 54876aca2d45..f72e25465429 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -415,14 +415,32 @@ static void __init omap3_iva_idle(void) | |||
415 | OMAP3430_IVA2_MOD, RM_RSTCTRL); | 415 | OMAP3430_IVA2_MOD, RM_RSTCTRL); |
416 | } | 416 | } |
417 | 417 | ||
418 | static void __init prcm_setup_regs(void) | 418 | static void __init omap3_d2d_idle(void) |
419 | { | 419 | { |
420 | u16 mask, padconf; | ||
421 | |||
422 | /* In a stand alone OMAP3430 where there is not a stacked | ||
423 | * modem for the D2D Idle Ack and D2D MStandby must be pulled | ||
424 | * high. S CONTROL_PADCONF_SAD2D_IDLEACK and | ||
425 | * CONTROL_PADCONF_SAD2D_MSTDBY to have a pull up. */ | ||
426 | mask = (1 << 4) | (1 << 3); /* pull-up, enabled */ | ||
427 | padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_MSTANDBY); | ||
428 | padconf |= mask; | ||
429 | omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_MSTANDBY); | ||
430 | |||
431 | padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_IDLEACK); | ||
432 | padconf |= mask; | ||
433 | omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_IDLEACK); | ||
434 | |||
420 | /* reset modem */ | 435 | /* reset modem */ |
421 | prm_write_mod_reg(OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON | | 436 | prm_write_mod_reg(OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON | |
422 | OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST, | 437 | OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST, |
423 | CORE_MOD, RM_RSTCTRL); | 438 | CORE_MOD, RM_RSTCTRL); |
424 | prm_write_mod_reg(0, CORE_MOD, RM_RSTCTRL); | 439 | prm_write_mod_reg(0, CORE_MOD, RM_RSTCTRL); |
440 | } | ||
425 | 441 | ||
442 | static void __init prcm_setup_regs(void) | ||
443 | { | ||
426 | /* XXX Reset all wkdeps. This should be done when initializing | 444 | /* XXX Reset all wkdeps. This should be done when initializing |
427 | * powerdomains */ | 445 | * powerdomains */ |
428 | prm_write_mod_reg(0, OMAP3430_IVA2_MOD, PM_WKDEP); | 446 | prm_write_mod_reg(0, OMAP3430_IVA2_MOD, PM_WKDEP); |
@@ -442,6 +460,7 @@ static void __init prcm_setup_regs(void) | |||
442 | * Note that in the long run this should be done by clockfw | 460 | * Note that in the long run this should be done by clockfw |
443 | */ | 461 | */ |
444 | cm_write_mod_reg( | 462 | cm_write_mod_reg( |
463 | OMAP3430_AUTO_MODEM | | ||
445 | OMAP3430ES2_AUTO_MMC3 | | 464 | OMAP3430ES2_AUTO_MMC3 | |
446 | OMAP3430ES2_AUTO_ICR | | 465 | OMAP3430ES2_AUTO_ICR | |
447 | OMAP3430_AUTO_AES2 | | 466 | OMAP3430_AUTO_AES2 | |
@@ -469,7 +488,7 @@ static void __init prcm_setup_regs(void) | |||
469 | OMAP3430_AUTO_OMAPCTRL | | 488 | OMAP3430_AUTO_OMAPCTRL | |
470 | OMAP3430ES1_AUTO_FSHOSTUSB | | 489 | OMAP3430ES1_AUTO_FSHOSTUSB | |
471 | OMAP3430_AUTO_HSOTGUSB | | 490 | OMAP3430_AUTO_HSOTGUSB | |
472 | OMAP3430ES1_AUTO_D2D | /* This is es1 only */ | 491 | OMAP3430_AUTO_SAD2D | |
473 | OMAP3430_AUTO_SSI, | 492 | OMAP3430_AUTO_SSI, |
474 | CORE_MOD, CM_AUTOIDLE1); | 493 | CORE_MOD, CM_AUTOIDLE1); |
475 | 494 | ||
@@ -483,6 +502,7 @@ static void __init prcm_setup_regs(void) | |||
483 | 502 | ||
484 | if (omap_rev() > OMAP3430_REV_ES1_0) { | 503 | if (omap_rev() > OMAP3430_REV_ES1_0) { |
485 | cm_write_mod_reg( | 504 | cm_write_mod_reg( |
505 | OMAP3430_AUTO_MAD2D | | ||
486 | OMAP3430ES2_AUTO_USBTLL, | 506 | OMAP3430ES2_AUTO_USBTLL, |
487 | CORE_MOD, CM_AUTOIDLE3); | 507 | CORE_MOD, CM_AUTOIDLE3); |
488 | } | 508 | } |
@@ -576,6 +596,7 @@ static void __init prcm_setup_regs(void) | |||
576 | OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); | 596 | OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); |
577 | 597 | ||
578 | omap3_iva_idle(); | 598 | omap3_iva_idle(); |
599 | omap3_d2d_idle(); | ||
579 | } | 600 | } |
580 | 601 | ||
581 | static int __init pwrdms_setup(struct powerdomain *pwrdm) | 602 | static int __init pwrdms_setup(struct powerdomain *pwrdm) |
diff --git a/arch/arm/plat-omap/include/mach/control.h b/arch/arm/plat-omap/include/mach/control.h index a9f05e5bb2ba..fcc5a9b76973 100644 --- a/arch/arm/plat-omap/include/mach/control.h +++ b/arch/arm/plat-omap/include/mach/control.h | |||
@@ -144,6 +144,10 @@ | |||
144 | #define OMAP343X_CONTROL_PBIAS_LITE (OMAP2_CONTROL_GENERAL + 0x02b0) | 144 | #define OMAP343X_CONTROL_PBIAS_LITE (OMAP2_CONTROL_GENERAL + 0x02b0) |
145 | #define OMAP343X_CONTROL_TEMP_SENSOR (OMAP2_CONTROL_GENERAL + 0x02b4) | 145 | #define OMAP343X_CONTROL_TEMP_SENSOR (OMAP2_CONTROL_GENERAL + 0x02b4) |
146 | 146 | ||
147 | /* 34xx D2D idle-related pins, handled by PM core */ | ||
148 | #define OMAP3_PADCONF_SAD2D_MSTANDBY 0x250 | ||
149 | #define OMAP3_PADCONF_SAD2D_IDLEACK 0x254 | ||
150 | |||
147 | /* | 151 | /* |
148 | * REVISIT: This list of registers is not comprehensive - there are more | 152 | * REVISIT: This list of registers is not comprehensive - there are more |
149 | * that should be added. | 153 | * that should be added. |