diff options
Diffstat (limited to 'arch/arm/mach-omap2')
| -rw-r--r-- | arch/arm/mach-omap2/cclock44xx_data.c | 20 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/common.h | 3 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/io.c | 18 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.c | 7 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.h | 9 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 7 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/timer.c | 4 |
8 files changed, 63 insertions, 11 deletions
diff --git a/arch/arm/mach-omap2/cclock44xx_data.c b/arch/arm/mach-omap2/cclock44xx_data.c index 3d58f335f173..0c6834ae1fc4 100644 --- a/arch/arm/mach-omap2/cclock44xx_data.c +++ b/arch/arm/mach-omap2/cclock44xx_data.c | |||
| @@ -52,6 +52,13 @@ | |||
| 52 | */ | 52 | */ |
| 53 | #define OMAP4_DPLL_ABE_DEFFREQ 98304000 | 53 | #define OMAP4_DPLL_ABE_DEFFREQ 98304000 |
| 54 | 54 | ||
| 55 | /* | ||
| 56 | * OMAP4 USB DPLL default frequency. In OMAP4430 TRM version V, section | ||
| 57 | * "3.6.3.9.5 DPLL_USB Preferred Settings" shows that the preferred | ||
| 58 | * locked frequency for the USB DPLL is 960MHz. | ||
| 59 | */ | ||
| 60 | #define OMAP4_DPLL_USB_DEFFREQ 960000000 | ||
| 61 | |||
| 55 | /* Root clocks */ | 62 | /* Root clocks */ |
| 56 | 63 | ||
| 57 | DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0); | 64 | DEFINE_CLK_FIXED_RATE(extalt_clkin_ck, CLK_IS_ROOT, 59000000, 0x0); |
| @@ -1011,6 +1018,10 @@ DEFINE_CLK_OMAP_MUX(hsmmc2_fclk, "l3_init_clkdm", hsmmc1_fclk_sel, | |||
| 1011 | OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK, | 1018 | OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK, |
| 1012 | hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops); | 1019 | hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops); |
| 1013 | 1020 | ||
| 1021 | DEFINE_CLK_GATE(ocp2scp_usb_phy_phy_48m, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
| 1022 | OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL, | ||
| 1023 | OMAP4430_OPTFCLKEN_PHY_48M_SHIFT, 0x0, NULL); | ||
| 1024 | |||
| 1014 | DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0, | 1025 | DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0, |
| 1015 | OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL, | 1026 | OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL, |
| 1016 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | 1027 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); |
| @@ -1538,6 +1549,7 @@ static struct omap_clk omap44xx_clks[] = { | |||
| 1538 | CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk, CK_443X), | 1549 | CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk, CK_443X), |
| 1539 | CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk, CK_443X), | 1550 | CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk, CK_443X), |
| 1540 | CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk, CK_443X), | 1551 | CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk, CK_443X), |
| 1552 | CLK(NULL, "ocp2scp_usb_phy_phy_48m", &ocp2scp_usb_phy_phy_48m, CK_443X), | ||
| 1541 | CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X), | 1553 | CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X), |
| 1542 | CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X), | 1554 | CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X), |
| 1543 | CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X), | 1555 | CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X), |
| @@ -1705,5 +1717,13 @@ int __init omap4xxx_clk_init(void) | |||
| 1705 | if (rc) | 1717 | if (rc) |
| 1706 | pr_err("%s: failed to configure ABE DPLL!\n", __func__); | 1718 | pr_err("%s: failed to configure ABE DPLL!\n", __func__); |
| 1707 | 1719 | ||
| 1720 | /* | ||
| 1721 | * Lock USB DPLL on OMAP4 devices so that the L3INIT power | ||
| 1722 | * domain can transition to retention state when not in use. | ||
| 1723 | */ | ||
| 1724 | rc = clk_set_rate(&dpll_usb_ck, OMAP4_DPLL_USB_DEFFREQ); | ||
| 1725 | if (rc) | ||
| 1726 | pr_err("%s: failed to configure USB DPLL!\n", __func__); | ||
| 1727 | |||
| 1708 | return 0; | 1728 | return 0; |
| 1709 | } | 1729 | } |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 40f4a03d728f..d6ba13e1c540 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
| @@ -293,5 +293,8 @@ extern void omap_reserve(void); | |||
| 293 | struct omap_hwmod; | 293 | struct omap_hwmod; |
| 294 | extern int omap_dss_reset(struct omap_hwmod *); | 294 | extern int omap_dss_reset(struct omap_hwmod *); |
| 295 | 295 | ||
| 296 | /* SoC specific clock initializer */ | ||
| 297 | extern int (*omap_clk_init)(void); | ||
| 298 | |||
| 296 | #endif /* __ASSEMBLER__ */ | 299 | #endif /* __ASSEMBLER__ */ |
| 297 | #endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */ | 300 | #endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */ |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 2c3fdd65387b..5c445ca1e271 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -55,6 +55,12 @@ | |||
| 55 | #include "prm44xx.h" | 55 | #include "prm44xx.h" |
| 56 | 56 | ||
| 57 | /* | 57 | /* |
| 58 | * omap_clk_init: points to a function that does the SoC-specific | ||
| 59 | * clock initializations | ||
| 60 | */ | ||
| 61 | int (*omap_clk_init)(void); | ||
| 62 | |||
| 63 | /* | ||
| 58 | * The machine specific code may provide the extra mapping besides the | 64 | * The machine specific code may provide the extra mapping besides the |
| 59 | * default mapping provided here. | 65 | * default mapping provided here. |
| 60 | */ | 66 | */ |
| @@ -397,7 +403,7 @@ void __init omap2420_init_early(void) | |||
| 397 | omap242x_clockdomains_init(); | 403 | omap242x_clockdomains_init(); |
| 398 | omap2420_hwmod_init(); | 404 | omap2420_hwmod_init(); |
| 399 | omap_hwmod_init_postsetup(); | 405 | omap_hwmod_init_postsetup(); |
| 400 | omap2420_clk_init(); | 406 | omap_clk_init = omap2420_clk_init; |
| 401 | } | 407 | } |
| 402 | 408 | ||
| 403 | void __init omap2420_init_late(void) | 409 | void __init omap2420_init_late(void) |
| @@ -427,7 +433,7 @@ void __init omap2430_init_early(void) | |||
| 427 | omap243x_clockdomains_init(); | 433 | omap243x_clockdomains_init(); |
| 428 | omap2430_hwmod_init(); | 434 | omap2430_hwmod_init(); |
| 429 | omap_hwmod_init_postsetup(); | 435 | omap_hwmod_init_postsetup(); |
| 430 | omap2430_clk_init(); | 436 | omap_clk_init = omap2430_clk_init; |
| 431 | } | 437 | } |
| 432 | 438 | ||
| 433 | void __init omap2430_init_late(void) | 439 | void __init omap2430_init_late(void) |
| @@ -462,7 +468,7 @@ void __init omap3_init_early(void) | |||
| 462 | omap3xxx_clockdomains_init(); | 468 | omap3xxx_clockdomains_init(); |
| 463 | omap3xxx_hwmod_init(); | 469 | omap3xxx_hwmod_init(); |
| 464 | omap_hwmod_init_postsetup(); | 470 | omap_hwmod_init_postsetup(); |
| 465 | omap3xxx_clk_init(); | 471 | omap_clk_init = omap3xxx_clk_init; |
| 466 | } | 472 | } |
| 467 | 473 | ||
| 468 | void __init omap3430_init_early(void) | 474 | void __init omap3430_init_early(void) |
| @@ -500,7 +506,7 @@ void __init ti81xx_init_early(void) | |||
| 500 | omap3xxx_clockdomains_init(); | 506 | omap3xxx_clockdomains_init(); |
| 501 | omap3xxx_hwmod_init(); | 507 | omap3xxx_hwmod_init(); |
| 502 | omap_hwmod_init_postsetup(); | 508 | omap_hwmod_init_postsetup(); |
| 503 | omap3xxx_clk_init(); | 509 | omap_clk_init = omap3xxx_clk_init; |
| 504 | } | 510 | } |
| 505 | 511 | ||
| 506 | void __init omap3_init_late(void) | 512 | void __init omap3_init_late(void) |
| @@ -568,7 +574,7 @@ void __init am33xx_init_early(void) | |||
| 568 | am33xx_clockdomains_init(); | 574 | am33xx_clockdomains_init(); |
| 569 | am33xx_hwmod_init(); | 575 | am33xx_hwmod_init(); |
| 570 | omap_hwmod_init_postsetup(); | 576 | omap_hwmod_init_postsetup(); |
| 571 | am33xx_clk_init(); | 577 | omap_clk_init = am33xx_clk_init; |
| 572 | } | 578 | } |
| 573 | #endif | 579 | #endif |
| 574 | 580 | ||
| @@ -593,7 +599,7 @@ void __init omap4430_init_early(void) | |||
| 593 | omap44xx_clockdomains_init(); | 599 | omap44xx_clockdomains_init(); |
| 594 | omap44xx_hwmod_init(); | 600 | omap44xx_hwmod_init(); |
| 595 | omap_hwmod_init_postsetup(); | 601 | omap_hwmod_init_postsetup(); |
| 596 | omap4xxx_clk_init(); | 602 | omap_clk_init = omap4xxx_clk_init; |
| 597 | } | 603 | } |
| 598 | 604 | ||
| 599 | void __init omap4430_init_late(void) | 605 | void __init omap4430_init_late(void) |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index c2c798c08c2b..a202a4785104 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -1368,7 +1368,9 @@ static void _enable_sysc(struct omap_hwmod *oh) | |||
| 1368 | } | 1368 | } |
| 1369 | 1369 | ||
| 1370 | if (sf & SYSC_HAS_MIDLEMODE) { | 1370 | if (sf & SYSC_HAS_MIDLEMODE) { |
| 1371 | if (oh->flags & HWMOD_SWSUP_MSTANDBY) { | 1371 | if (oh->flags & HWMOD_FORCE_MSTANDBY) { |
| 1372 | idlemode = HWMOD_IDLEMODE_FORCE; | ||
| 1373 | } else if (oh->flags & HWMOD_SWSUP_MSTANDBY) { | ||
| 1372 | idlemode = HWMOD_IDLEMODE_NO; | 1374 | idlemode = HWMOD_IDLEMODE_NO; |
| 1373 | } else { | 1375 | } else { |
| 1374 | if (sf & SYSC_HAS_ENAWAKEUP) | 1376 | if (sf & SYSC_HAS_ENAWAKEUP) |
| @@ -1440,7 +1442,8 @@ static void _idle_sysc(struct omap_hwmod *oh) | |||
| 1440 | } | 1442 | } |
| 1441 | 1443 | ||
| 1442 | if (sf & SYSC_HAS_MIDLEMODE) { | 1444 | if (sf & SYSC_HAS_MIDLEMODE) { |
| 1443 | if (oh->flags & HWMOD_SWSUP_MSTANDBY) { | 1445 | if ((oh->flags & HWMOD_SWSUP_MSTANDBY) || |
| 1446 | (oh->flags & HWMOD_FORCE_MSTANDBY)) { | ||
| 1444 | idlemode = HWMOD_IDLEMODE_FORCE; | 1447 | idlemode = HWMOD_IDLEMODE_FORCE; |
| 1445 | } else { | 1448 | } else { |
| 1446 | if (sf & SYSC_HAS_ENAWAKEUP) | 1449 | if (sf & SYSC_HAS_ENAWAKEUP) |
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index d43d9b608eda..d5dc935f6060 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
| @@ -427,8 +427,8 @@ struct omap_hwmod_omap4_prcm { | |||
| 427 | * | 427 | * |
| 428 | * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out | 428 | * HWMOD_SWSUP_SIDLE: omap_hwmod code should manually bring module in and out |
| 429 | * of idle, rather than relying on module smart-idle | 429 | * of idle, rather than relying on module smart-idle |
| 430 | * HWMOD_SWSUP_MSTDBY: omap_hwmod code should manually bring module in and out | 430 | * HWMOD_SWSUP_MSTANDBY: omap_hwmod code should manually bring module in and |
| 431 | * of standby, rather than relying on module smart-standby | 431 | * out of standby, rather than relying on module smart-standby |
| 432 | * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for | 432 | * HWMOD_INIT_NO_RESET: don't reset this module at boot - important for |
| 433 | * SDRAM controller, etc. XXX probably belongs outside the main hwmod file | 433 | * SDRAM controller, etc. XXX probably belongs outside the main hwmod file |
| 434 | * XXX Should be HWMOD_SETUP_NO_RESET | 434 | * XXX Should be HWMOD_SETUP_NO_RESET |
| @@ -459,6 +459,10 @@ struct omap_hwmod_omap4_prcm { | |||
| 459 | * correctly, or this is being abused to deal with some PM latency | 459 | * correctly, or this is being abused to deal with some PM latency |
| 460 | * issues -- but we're currently suffering from a shortage of | 460 | * issues -- but we're currently suffering from a shortage of |
| 461 | * folks who are able to track these issues down properly. | 461 | * folks who are able to track these issues down properly. |
| 462 | * HWMOD_FORCE_MSTANDBY: Always keep MIDLEMODE bits cleared so that device | ||
| 463 | * is kept in force-standby mode. Failing to do so causes PM problems | ||
| 464 | * with musb on OMAP3630 at least. Note that musb has a dedicated register | ||
| 465 | * to control MSTANDBY signal when MIDLEMODE is set to force-standby. | ||
| 462 | */ | 466 | */ |
| 463 | #define HWMOD_SWSUP_SIDLE (1 << 0) | 467 | #define HWMOD_SWSUP_SIDLE (1 << 0) |
| 464 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) | 468 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) |
| @@ -471,6 +475,7 @@ struct omap_hwmod_omap4_prcm { | |||
| 471 | #define HWMOD_16BIT_REG (1 << 8) | 475 | #define HWMOD_16BIT_REG (1 << 8) |
| 472 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) | 476 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) |
| 473 | #define HWMOD_BLOCK_WFI (1 << 10) | 477 | #define HWMOD_BLOCK_WFI (1 << 10) |
| 478 | #define HWMOD_FORCE_MSTANDBY (1 << 11) | ||
| 474 | 479 | ||
| 475 | /* | 480 | /* |
| 476 | * omap_hwmod._int_flags definitions | 481 | * omap_hwmod._int_flags definitions |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index ac7e03ec952f..5112d04e7b79 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
| @@ -1707,9 +1707,14 @@ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = { | |||
| 1707 | * Erratum ID: i479 idle_req / idle_ack mechanism potentially | 1707 | * Erratum ID: i479 idle_req / idle_ack mechanism potentially |
| 1708 | * broken when autoidle is enabled | 1708 | * broken when autoidle is enabled |
| 1709 | * workaround is to disable the autoidle bit at module level. | 1709 | * workaround is to disable the autoidle bit at module level. |
| 1710 | * | ||
| 1711 | * Enabling the device in any other MIDLEMODE setting but force-idle | ||
| 1712 | * causes core_pwrdm not enter idle states at least on OMAP3630. | ||
| 1713 | * Note that musb has OTG_FORCESTDBY register that controls MSTANDBY | ||
| 1714 | * signal when MIDLEMODE is set to force-idle. | ||
| 1710 | */ | 1715 | */ |
| 1711 | .flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE | 1716 | .flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE |
| 1712 | | HWMOD_SWSUP_MSTANDBY, | 1717 | | HWMOD_FORCE_MSTANDBY, |
| 1713 | }; | 1718 | }; |
| 1714 | 1719 | ||
| 1715 | /* usb_otg_hs */ | 1720 | /* usb_otg_hs */ |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 0e47d2e1687c..9e0576569e07 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
| @@ -2714,6 +2714,10 @@ static struct omap_ocp2scp_dev ocp2scp_dev_attr[] = { | |||
| 2714 | { } | 2714 | { } |
| 2715 | }; | 2715 | }; |
| 2716 | 2716 | ||
| 2717 | static struct omap_hwmod_opt_clk ocp2scp_usb_phy_opt_clks[] = { | ||
| 2718 | { .role = "48mhz", .clk = "ocp2scp_usb_phy_phy_48m" }, | ||
| 2719 | }; | ||
| 2720 | |||
| 2717 | /* ocp2scp_usb_phy */ | 2721 | /* ocp2scp_usb_phy */ |
| 2718 | static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { | 2722 | static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { |
| 2719 | .name = "ocp2scp_usb_phy", | 2723 | .name = "ocp2scp_usb_phy", |
| @@ -2728,6 +2732,8 @@ static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { | |||
| 2728 | }, | 2732 | }, |
| 2729 | }, | 2733 | }, |
| 2730 | .dev_attr = ocp2scp_dev_attr, | 2734 | .dev_attr = ocp2scp_dev_attr, |
| 2735 | .opt_clks = ocp2scp_usb_phy_opt_clks, | ||
| 2736 | .opt_clks_cnt = ARRAY_SIZE(ocp2scp_usb_phy_opt_clks), | ||
| 2731 | }; | 2737 | }; |
| 2732 | 2738 | ||
| 2733 | /* | 2739 | /* |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 2bdd4cf17a8f..f62b509ed08d 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
| @@ -547,6 +547,8 @@ static inline void __init realtime_counter_init(void) | |||
| 547 | clksrc_nr, clksrc_src) \ | 547 | clksrc_nr, clksrc_src) \ |
| 548 | void __init omap##name##_gptimer_timer_init(void) \ | 548 | void __init omap##name##_gptimer_timer_init(void) \ |
| 549 | { \ | 549 | { \ |
| 550 | if (omap_clk_init) \ | ||
| 551 | omap_clk_init(); \ | ||
| 550 | omap_dmtimer_init(); \ | 552 | omap_dmtimer_init(); \ |
| 551 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ | 553 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ |
| 552 | omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \ | 554 | omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \ |
| @@ -556,6 +558,8 @@ void __init omap##name##_gptimer_timer_init(void) \ | |||
| 556 | clksrc_nr, clksrc_src) \ | 558 | clksrc_nr, clksrc_src) \ |
| 557 | void __init omap##name##_sync32k_timer_init(void) \ | 559 | void __init omap##name##_sync32k_timer_init(void) \ |
| 558 | { \ | 560 | { \ |
| 561 | if (omap_clk_init) \ | ||
| 562 | omap_clk_init(); \ | ||
| 559 | omap_dmtimer_init(); \ | 563 | omap_dmtimer_init(); \ |
| 560 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ | 564 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ |
| 561 | /* Enable the use of clocksource="gp_timer" kernel parameter */ \ | 565 | /* Enable the use of clocksource="gp_timer" kernel parameter */ \ |
