diff options
| author | H. Peter Anvin <hpa@zytor.com> | 2010-02-22 19:20:34 -0500 |
|---|---|---|
| committer | H. Peter Anvin <hpa@zytor.com> | 2010-02-22 19:20:34 -0500 |
| commit | d02e30c31c57683a66ed68a1bcff900ca78f6d56 (patch) | |
| tree | c3ce99a00061bcc1199b50fa838147d876c56717 /arch/arm/mach-omap2 | |
| parent | 0fdc7a8022c3eaff6b5ee27ffb9e913e5e58d8e9 (diff) | |
| parent | aef55d4922e62a0d887e60d87319f3718aec6ced (diff) | |
Merge branch 'x86/irq' into x86/apic
Merge reason:
Conflicts in arch/x86/kernel/apic/io_apic.c
Resolved Conflicts:
arch/x86/kernel/apic/io_apic.c
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'arch/arm/mach-omap2')
26 files changed, 373 insertions, 198 deletions
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 10eafa70a909..606bf04f51b6 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
| @@ -80,6 +80,7 @@ config MACH_OVERO | |||
| 80 | config MACH_OMAP3EVM | 80 | config MACH_OMAP3EVM |
| 81 | bool "OMAP 3530 EVM board" | 81 | bool "OMAP 3530 EVM board" |
| 82 | depends on ARCH_OMAP3 && ARCH_OMAP34XX | 82 | depends on ARCH_OMAP3 && ARCH_OMAP34XX |
| 83 | select OMAP_PACKAGE_CBB | ||
| 83 | 84 | ||
| 84 | config MACH_OMAP3517EVM | 85 | config MACH_OMAP3517EVM |
| 85 | bool "OMAP3517/ AM3517 EVM board" | 86 | bool "OMAP3517/ AM3517 EVM board" |
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 8dd277c36661..1e3dfb652acc 100755 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c | |||
| @@ -63,21 +63,21 @@ static int board_keymap[] = { | |||
| 63 | KEY(5, 1, KEY_H), | 63 | KEY(5, 1, KEY_H), |
| 64 | KEY(5, 2, KEY_J), | 64 | KEY(5, 2, KEY_J), |
| 65 | KEY(5, 3, KEY_F3), | 65 | KEY(5, 3, KEY_F3), |
| 66 | KEY(5, 4, KEY_UNKNOWN), | ||
| 66 | KEY(5, 5, KEY_VOLUMEDOWN), | 67 | KEY(5, 5, KEY_VOLUMEDOWN), |
| 67 | KEY(5, 6, KEY_M), | 68 | KEY(5, 6, KEY_M), |
| 68 | KEY(5, 7, KEY_ENTER), | 69 | KEY(5, 7, KEY_RIGHT), |
| 69 | KEY(6, 0, KEY_Q), | 70 | KEY(6, 0, KEY_Q), |
| 70 | KEY(6, 1, KEY_A), | 71 | KEY(6, 1, KEY_A), |
| 71 | KEY(6, 2, KEY_N), | 72 | KEY(6, 2, KEY_N), |
| 72 | KEY(6, 3, KEY_BACKSPACE), | 73 | KEY(6, 3, KEY_BACKSPACE), |
| 73 | KEY(6, 6, KEY_P), | 74 | KEY(6, 6, KEY_P), |
| 74 | KEY(6, 7, KEY_SELECT), | 75 | KEY(6, 7, KEY_UP), |
| 75 | KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */ | 76 | KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */ |
| 76 | KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */ | 77 | KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */ |
| 77 | KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */ | 78 | KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */ |
| 78 | KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */ | 79 | KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */ |
| 79 | KEY(7, 5, KEY_RIGHT), | 80 | KEY(7, 6, KEY_SELECT), |
| 80 | KEY(7, 6, KEY_UP), | ||
| 81 | KEY(7, 7, KEY_DOWN) | 81 | KEY(7, 7, KEY_DOWN) |
| 82 | }; | 82 | }; |
| 83 | 83 | ||
diff --git a/arch/arm/mach-omap2/clock2xxx.c b/arch/arm/mach-omap2/clock2xxx.c index d0e3fb7f9298..5420356eb407 100644 --- a/arch/arm/mach-omap2/clock2xxx.c +++ b/arch/arm/mach-omap2/clock2xxx.c | |||
| @@ -449,40 +449,78 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate) | |||
| 449 | #ifdef CONFIG_CPU_FREQ | 449 | #ifdef CONFIG_CPU_FREQ |
| 450 | /* | 450 | /* |
| 451 | * Walk PRCM rate table and fillout cpufreq freq_table | 451 | * Walk PRCM rate table and fillout cpufreq freq_table |
| 452 | * XXX This should be replaced by an OPP layer in the near future | ||
| 452 | */ | 453 | */ |
| 453 | static struct cpufreq_frequency_table freq_table[ARRAY_SIZE(rate_table)]; | 454 | static struct cpufreq_frequency_table *freq_table; |
| 454 | 455 | ||
| 455 | void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table) | 456 | void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table) |
| 456 | { | 457 | { |
| 457 | struct prcm_config *prcm; | 458 | const struct prcm_config *prcm; |
| 459 | long sys_ck_rate; | ||
| 458 | int i = 0; | 460 | int i = 0; |
| 461 | int tbl_sz = 0; | ||
| 462 | |||
| 463 | sys_ck_rate = clk_get_rate(sclk); | ||
| 459 | 464 | ||
| 460 | for (prcm = rate_table; prcm->mpu_speed; prcm++) { | 465 | for (prcm = rate_table; prcm->mpu_speed; prcm++) { |
| 461 | if (!(prcm->flags & cpu_mask)) | 466 | if (!(prcm->flags & cpu_mask)) |
| 462 | continue; | 467 | continue; |
| 463 | if (prcm->xtal_speed != sys_ck.rate) | 468 | if (prcm->xtal_speed != sys_ck_rate) |
| 464 | continue; | 469 | continue; |
| 465 | 470 | ||
| 466 | /* don't put bypass rates in table */ | 471 | /* don't put bypass rates in table */ |
| 467 | if (prcm->dpll_speed == prcm->xtal_speed) | 472 | if (prcm->dpll_speed == prcm->xtal_speed) |
| 468 | continue; | 473 | continue; |
| 469 | 474 | ||
| 470 | freq_table[i].index = i; | 475 | tbl_sz++; |
| 471 | freq_table[i].frequency = prcm->mpu_speed / 1000; | ||
| 472 | i++; | ||
| 473 | } | 476 | } |
| 474 | 477 | ||
| 475 | if (i == 0) { | 478 | /* |
| 476 | printk(KERN_WARNING "%s: failed to initialize frequency " | 479 | * XXX Ensure that we're doing what CPUFreq expects for this error |
| 477 | "table\n", __func__); | 480 | * case and the following one |
| 481 | */ | ||
| 482 | if (tbl_sz == 0) { | ||
| 483 | pr_warning("%s: no matching entries in rate_table\n", | ||
| 484 | __func__); | ||
| 485 | return; | ||
| 486 | } | ||
| 487 | |||
| 488 | /* Include the CPUFREQ_TABLE_END terminator entry */ | ||
| 489 | tbl_sz++; | ||
| 490 | |||
| 491 | freq_table = kzalloc(sizeof(struct cpufreq_frequency_table) * tbl_sz, | ||
| 492 | GFP_ATOMIC); | ||
| 493 | if (!freq_table) { | ||
| 494 | pr_err("%s: could not kzalloc frequency table\n", __func__); | ||
| 478 | return; | 495 | return; |
| 479 | } | 496 | } |
| 480 | 497 | ||
| 498 | for (prcm = rate_table; prcm->mpu_speed; prcm++) { | ||
| 499 | if (!(prcm->flags & cpu_mask)) | ||
| 500 | continue; | ||
| 501 | if (prcm->xtal_speed != sys_ck_rate) | ||
| 502 | continue; | ||
| 503 | |||
| 504 | /* don't put bypass rates in table */ | ||
| 505 | if (prcm->dpll_speed == prcm->xtal_speed) | ||
| 506 | continue; | ||
| 507 | |||
| 508 | freq_table[i].index = i; | ||
| 509 | freq_table[i].frequency = prcm->mpu_speed / 1000; | ||
| 510 | i++; | ||
| 511 | } | ||
| 512 | |||
| 481 | freq_table[i].index = i; | 513 | freq_table[i].index = i; |
| 482 | freq_table[i].frequency = CPUFREQ_TABLE_END; | 514 | freq_table[i].frequency = CPUFREQ_TABLE_END; |
| 483 | 515 | ||
| 484 | *table = &freq_table[0]; | 516 | *table = &freq_table[0]; |
| 485 | } | 517 | } |
| 518 | |||
| 519 | void omap2_clk_exit_cpufreq_table(struct cpufreq_frequency_table **table) | ||
| 520 | { | ||
| 521 | kfree(freq_table); | ||
| 522 | } | ||
| 523 | |||
| 486 | #endif | 524 | #endif |
| 487 | 525 | ||
| 488 | struct clk_functions omap2_clk_functions = { | 526 | struct clk_functions omap2_clk_functions = { |
| @@ -494,6 +532,7 @@ struct clk_functions omap2_clk_functions = { | |||
| 494 | .clk_disable_unused = omap2_clk_disable_unused, | 532 | .clk_disable_unused = omap2_clk_disable_unused, |
| 495 | #ifdef CONFIG_CPU_FREQ | 533 | #ifdef CONFIG_CPU_FREQ |
| 496 | .clk_init_cpufreq_table = omap2_clk_init_cpufreq_table, | 534 | .clk_init_cpufreq_table = omap2_clk_init_cpufreq_table, |
| 535 | .clk_exit_cpufreq_table = omap2_clk_exit_cpufreq_table, | ||
| 497 | #endif | 536 | #endif |
| 498 | }; | 537 | }; |
| 499 | 538 | ||
diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index ded32364f32b..d4217b93e10b 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c | |||
| @@ -34,7 +34,6 @@ | |||
| 34 | #include <asm/div64.h> | 34 | #include <asm/div64.h> |
| 35 | #include <asm/clkdev.h> | 35 | #include <asm/clkdev.h> |
| 36 | 36 | ||
| 37 | #include <plat/sdrc.h> | ||
| 38 | #include "clock.h" | 37 | #include "clock.h" |
| 39 | #include "clock34xx.h" | 38 | #include "clock34xx.h" |
| 40 | #include "sdrc.h" | 39 | #include "sdrc.h" |
diff --git a/arch/arm/mach-omap2/clock34xx_data.c b/arch/arm/mach-omap2/clock34xx_data.c index 8bdcc9cc7f9a..74930e3158e3 100644 --- a/arch/arm/mach-omap2/clock34xx_data.c +++ b/arch/arm/mach-omap2/clock34xx_data.c | |||
| @@ -671,7 +671,6 @@ static struct clk dpll4_m3x2_ck = { | |||
| 671 | .name = "dpll4_m3x2_ck", | 671 | .name = "dpll4_m3x2_ck", |
| 672 | .ops = &clkops_omap2_dflt_wait, | 672 | .ops = &clkops_omap2_dflt_wait, |
| 673 | .parent = &dpll4_m3_ck, | 673 | .parent = &dpll4_m3_ck, |
| 674 | .init = &omap2_init_clksel_parent, | ||
| 675 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 674 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
| 676 | .enable_bit = OMAP3430_PWRDN_TV_SHIFT, | 675 | .enable_bit = OMAP3430_PWRDN_TV_SHIFT, |
| 677 | .flags = INVERT_ENABLE, | 676 | .flags = INVERT_ENABLE, |
| @@ -776,6 +775,8 @@ static struct clk dpll4_m5_ck = { | |||
| 776 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, | 775 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, |
| 777 | .clksel = div16_dpll4_clksel, | 776 | .clksel = div16_dpll4_clksel, |
| 778 | .clkdm_name = "dpll4_clkdm", | 777 | .clkdm_name = "dpll4_clkdm", |
| 778 | .set_rate = &omap2_clksel_set_rate, | ||
| 779 | .round_rate = &omap2_clksel_round_rate, | ||
| 779 | .recalc = &omap2_clksel_recalc, | 780 | .recalc = &omap2_clksel_recalc, |
| 780 | }; | 781 | }; |
| 781 | 782 | ||
| @@ -809,7 +810,6 @@ static struct clk dpll4_m6x2_ck = { | |||
| 809 | .name = "dpll4_m6x2_ck", | 810 | .name = "dpll4_m6x2_ck", |
| 810 | .ops = &clkops_omap2_dflt_wait, | 811 | .ops = &clkops_omap2_dflt_wait, |
| 811 | .parent = &dpll4_m6_ck, | 812 | .parent = &dpll4_m6_ck, |
| 812 | .init = &omap2_init_clksel_parent, | ||
| 813 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), | 813 | .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), |
| 814 | .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT, | 814 | .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT, |
| 815 | .flags = INVERT_ENABLE, | 815 | .flags = INVERT_ENABLE, |
| @@ -1045,7 +1045,6 @@ static struct clk iva2_ck = { | |||
| 1045 | .name = "iva2_ck", | 1045 | .name = "iva2_ck", |
| 1046 | .ops = &clkops_omap2_dflt_wait, | 1046 | .ops = &clkops_omap2_dflt_wait, |
| 1047 | .parent = &dpll2_m2_ck, | 1047 | .parent = &dpll2_m2_ck, |
| 1048 | .init = &omap2_init_clksel_parent, | ||
| 1049 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN), | 1048 | .enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN), |
| 1050 | .enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT, | 1049 | .enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT, |
| 1051 | .clkdm_name = "iva2_clkdm", | 1050 | .clkdm_name = "iva2_clkdm", |
| @@ -1119,7 +1118,6 @@ static struct clk gfx_l3_ck = { | |||
| 1119 | .name = "gfx_l3_ck", | 1118 | .name = "gfx_l3_ck", |
| 1120 | .ops = &clkops_omap2_dflt_wait, | 1119 | .ops = &clkops_omap2_dflt_wait, |
| 1121 | .parent = &l3_ick, | 1120 | .parent = &l3_ick, |
| 1122 | .init = &omap2_init_clksel_parent, | ||
| 1123 | .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN), | 1121 | .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN), |
| 1124 | .enable_bit = OMAP_EN_GFX_SHIFT, | 1122 | .enable_bit = OMAP_EN_GFX_SHIFT, |
| 1125 | .recalc = &followparent_recalc, | 1123 | .recalc = &followparent_recalc, |
| @@ -1500,6 +1498,7 @@ static struct clk uart2_fck = { | |||
| 1500 | .parent = &core_48m_fck, | 1498 | .parent = &core_48m_fck, |
| 1501 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1499 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
| 1502 | .enable_bit = OMAP3430_EN_UART2_SHIFT, | 1500 | .enable_bit = OMAP3430_EN_UART2_SHIFT, |
| 1501 | .clkdm_name = "core_l4_clkdm", | ||
| 1503 | .recalc = &followparent_recalc, | 1502 | .recalc = &followparent_recalc, |
| 1504 | }; | 1503 | }; |
| 1505 | 1504 | ||
| @@ -1509,6 +1508,7 @@ static struct clk uart1_fck = { | |||
| 1509 | .parent = &core_48m_fck, | 1508 | .parent = &core_48m_fck, |
| 1510 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1509 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
| 1511 | .enable_bit = OMAP3430_EN_UART1_SHIFT, | 1510 | .enable_bit = OMAP3430_EN_UART1_SHIFT, |
| 1511 | .clkdm_name = "core_l4_clkdm", | ||
| 1512 | .recalc = &followparent_recalc, | 1512 | .recalc = &followparent_recalc, |
| 1513 | }; | 1513 | }; |
| 1514 | 1514 | ||
| @@ -2745,7 +2745,7 @@ static struct clk mcbsp4_ick = { | |||
| 2745 | }; | 2745 | }; |
| 2746 | 2746 | ||
| 2747 | static const struct clksel mcbsp_234_clksel[] = { | 2747 | static const struct clksel mcbsp_234_clksel[] = { |
| 2748 | { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates }, | 2748 | { .parent = &per_96m_fck, .rates = common_mcbsp_96m_rates }, |
| 2749 | { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, | 2749 | { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, |
| 2750 | { .parent = NULL } | 2750 | { .parent = NULL } |
| 2751 | }; | 2751 | }; |
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index 2210e227d78a..9d882bcb56e3 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c | |||
| @@ -346,37 +346,37 @@ static struct clk aess_fclk = { | |||
| 346 | }; | 346 | }; |
| 347 | 347 | ||
| 348 | static const struct clksel_rate div31_1to31_rates[] = { | 348 | static const struct clksel_rate div31_1to31_rates[] = { |
| 349 | { .div = 1, .val = 0, .flags = RATE_IN_4430 }, | 349 | { .div = 1, .val = 1, .flags = RATE_IN_4430 }, |
| 350 | { .div = 2, .val = 1, .flags = RATE_IN_4430 }, | 350 | { .div = 2, .val = 2, .flags = RATE_IN_4430 }, |
| 351 | { .div = 3, .val = 2, .flags = RATE_IN_4430 }, | 351 | { .div = 3, .val = 3, .flags = RATE_IN_4430 }, |
| 352 | { .div = 4, .val = 3, .flags = RATE_IN_4430 }, | 352 | { .div = 4, .val = 4, .flags = RATE_IN_4430 }, |
| 353 | { .div = 5, .val = 4, .flags = RATE_IN_4430 }, | 353 | { .div = 5, .val = 5, .flags = RATE_IN_4430 }, |
| 354 | { .div = 6, .val = 5, .flags = RATE_IN_4430 }, | 354 | { .div = 6, .val = 6, .flags = RATE_IN_4430 }, |
| 355 | { .div = 7, .val = 6, .flags = RATE_IN_4430 }, | 355 | { .div = 7, .val = 7, .flags = RATE_IN_4430 }, |
| 356 | { .div = 8, .val = 7, .flags = RATE_IN_4430 }, | 356 | { .div = 8, .val = 8, .flags = RATE_IN_4430 }, |
| 357 | { .div = 9, .val = 8, .flags = RATE_IN_4430 }, | 357 | { .div = 9, .val = 9, .flags = RATE_IN_4430 }, |
| 358 | { .div = 10, .val = 9, .flags = RATE_IN_4430 }, | 358 | { .div = 10, .val = 10, .flags = RATE_IN_4430 }, |
| 359 | { .div = 11, .val = 10, .flags = RATE_IN_4430 }, | 359 | { .div = 11, .val = 11, .flags = RATE_IN_4430 }, |
| 360 | { .div = 12, .val = 11, .flags = RATE_IN_4430 }, | 360 | { .div = 12, .val = 12, .flags = RATE_IN_4430 }, |
| 361 | { .div = 13, .val = 12, .flags = RATE_IN_4430 }, | 361 | { .div = 13, .val = 13, .flags = RATE_IN_4430 }, |
| 362 | { .div = 14, .val = 13, .flags = RATE_IN_4430 }, | 362 | { .div = 14, .val = 14, .flags = RATE_IN_4430 }, |
| 363 | { .div = 15, .val = 14, .flags = RATE_IN_4430 }, | 363 | { .div = 15, .val = 15, .flags = RATE_IN_4430 }, |
| 364 | { .div = 16, .val = 15, .flags = RATE_IN_4430 }, | 364 | { .div = 16, .val = 16, .flags = RATE_IN_4430 }, |
| 365 | { .div = 17, .val = 16, .flags = RATE_IN_4430 }, | 365 | { .div = 17, .val = 17, .flags = RATE_IN_4430 }, |
| 366 | { .div = 18, .val = 17, .flags = RATE_IN_4430 }, | 366 | { .div = 18, .val = 18, .flags = RATE_IN_4430 }, |
| 367 | { .div = 19, .val = 18, .flags = RATE_IN_4430 }, | 367 | { .div = 19, .val = 19, .flags = RATE_IN_4430 }, |
| 368 | { .div = 20, .val = 19, .flags = RATE_IN_4430 }, | 368 | { .div = 20, .val = 20, .flags = RATE_IN_4430 }, |
| 369 | { .div = 21, .val = 20, .flags = RATE_IN_4430 }, | 369 | { .div = 21, .val = 21, .flags = RATE_IN_4430 }, |
| 370 | { .div = 22, .val = 21, .flags = RATE_IN_4430 }, | 370 | { .div = 22, .val = 22, .flags = RATE_IN_4430 }, |
| 371 | { .div = 23, .val = 22, .flags = RATE_IN_4430 }, | 371 | { .div = 23, .val = 23, .flags = RATE_IN_4430 }, |
| 372 | { .div = 24, .val = 23, .flags = RATE_IN_4430 }, | 372 | { .div = 24, .val = 24, .flags = RATE_IN_4430 }, |
| 373 | { .div = 25, .val = 24, .flags = RATE_IN_4430 }, | 373 | { .div = 25, .val = 25, .flags = RATE_IN_4430 }, |
| 374 | { .div = 26, .val = 25, .flags = RATE_IN_4430 }, | 374 | { .div = 26, .val = 26, .flags = RATE_IN_4430 }, |
| 375 | { .div = 27, .val = 26, .flags = RATE_IN_4430 }, | 375 | { .div = 27, .val = 27, .flags = RATE_IN_4430 }, |
| 376 | { .div = 28, .val = 27, .flags = RATE_IN_4430 }, | 376 | { .div = 28, .val = 28, .flags = RATE_IN_4430 }, |
| 377 | { .div = 29, .val = 28, .flags = RATE_IN_4430 }, | 377 | { .div = 29, .val = 29, .flags = RATE_IN_4430 }, |
| 378 | { .div = 30, .val = 29, .flags = RATE_IN_4430 }, | 378 | { .div = 30, .val = 30, .flags = RATE_IN_4430 }, |
| 379 | { .div = 31, .val = 30, .flags = RATE_IN_4430 }, | 379 | { .div = 31, .val = 31, .flags = RATE_IN_4430 }, |
| 380 | { .div = 0 }, | 380 | { .div = 0 }, |
| 381 | }; | 381 | }; |
| 382 | 382 | ||
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c index 1a45ed1e8ba1..dd285f001467 100644 --- a/arch/arm/mach-omap2/clockdomain.c +++ b/arch/arm/mach-omap2/clockdomain.c | |||
| @@ -559,7 +559,7 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) | |||
| 559 | * downstream clocks for debugging purposes? | 559 | * downstream clocks for debugging purposes? |
| 560 | */ | 560 | */ |
| 561 | 561 | ||
| 562 | if (!clkdm || !clk) | 562 | if (!clkdm || !clk || !clkdm->clktrctrl_mask) |
| 563 | return -EINVAL; | 563 | return -EINVAL; |
| 564 | 564 | ||
| 565 | if (atomic_inc_return(&clkdm->usecount) > 1) | 565 | if (atomic_inc_return(&clkdm->usecount) > 1) |
| @@ -610,7 +610,7 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) | |||
| 610 | * downstream clocks for debugging purposes? | 610 | * downstream clocks for debugging purposes? |
| 611 | */ | 611 | */ |
| 612 | 612 | ||
| 613 | if (!clkdm || !clk) | 613 | if (!clkdm || !clk || !clkdm->clktrctrl_mask) |
| 614 | return -EINVAL; | 614 | return -EINVAL; |
| 615 | 615 | ||
| 616 | #ifdef DEBUG | 616 | #ifdef DEBUG |
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index a26d6a08ae3f..12f0cbfc2894 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c | |||
| @@ -137,7 +137,7 @@ return_sleep_time: | |||
| 137 | local_irq_enable(); | 137 | local_irq_enable(); |
| 138 | local_fiq_enable(); | 138 | local_fiq_enable(); |
| 139 | 139 | ||
| 140 | return (u32)timespec_to_ns(&ts_idle)/1000; | 140 | return ts_idle.tv_nsec / NSEC_PER_USEC + ts_idle.tv_sec * USEC_PER_SEC; |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | /** | 143 | /** |
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index bd8cb5974726..7027cdc1ba49 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
| @@ -505,7 +505,7 @@ static void __init gpmc_mem_init(void) | |||
| 505 | void __init gpmc_init(void) | 505 | void __init gpmc_init(void) |
| 506 | { | 506 | { |
| 507 | u32 l; | 507 | u32 l; |
| 508 | char *ck; | 508 | char *ck = NULL; |
| 509 | 509 | ||
| 510 | if (cpu_is_omap24xx()) { | 510 | if (cpu_is_omap24xx()) { |
| 511 | ck = "core_l3_ck"; | 511 | ck = "core_l3_ck"; |
| @@ -521,6 +521,9 @@ void __init gpmc_init(void) | |||
| 521 | l = OMAP44XX_GPMC_BASE; | 521 | l = OMAP44XX_GPMC_BASE; |
| 522 | } | 522 | } |
| 523 | 523 | ||
| 524 | if (WARN_ON(!ck)) | ||
| 525 | return; | ||
| 526 | |||
| 524 | gpmc_l3_clk = clk_get(NULL, ck); | 527 | gpmc_l3_clk = clk_get(NULL, ck); |
| 525 | if (IS_ERR(gpmc_l3_clk)) { | 528 | if (IS_ERR(gpmc_l3_clk)) { |
| 526 | printk(KERN_ERR "Could not get GPMC clock %s\n", ck); | 529 | printk(KERN_ERR "Could not get GPMC clock %s\n", ck); |
| @@ -534,6 +537,8 @@ void __init gpmc_init(void) | |||
| 534 | BUG(); | 537 | BUG(); |
| 535 | } | 538 | } |
| 536 | 539 | ||
| 540 | clk_enable(gpmc_l3_clk); | ||
| 541 | |||
| 537 | l = gpmc_read_reg(GPMC_REVISION); | 542 | l = gpmc_read_reg(GPMC_REVISION); |
| 538 | printk(KERN_INFO "GPMC revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f); | 543 | printk(KERN_INFO "GPMC revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f); |
| 539 | /* Set smart idle mode and automatic L3 clock gating */ | 544 | /* Set smart idle mode and automatic L3 clock gating */ |
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index a091b53657b9..3d65c50bd017 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c | |||
| @@ -188,6 +188,8 @@ void __init omap3_check_revision(void) | |||
| 188 | u16 hawkeye; | 188 | u16 hawkeye; |
| 189 | u8 rev; | 189 | u8 rev; |
| 190 | 190 | ||
| 191 | omap_chip.oc = CHIP_IS_OMAP3430; | ||
| 192 | |||
| 191 | /* | 193 | /* |
| 192 | * We cannot access revision registers on ES1.0. | 194 | * We cannot access revision registers on ES1.0. |
| 193 | * If the processor type is Cortex-A8 and the revision is 0x0 | 195 | * If the processor type is Cortex-A8 and the revision is 0x0 |
| @@ -196,6 +198,7 @@ void __init omap3_check_revision(void) | |||
| 196 | cpuid = read_cpuid(CPUID_ID); | 198 | cpuid = read_cpuid(CPUID_ID); |
| 197 | if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) { | 199 | if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) { |
| 198 | omap_revision = OMAP3430_REV_ES1_0; | 200 | omap_revision = OMAP3430_REV_ES1_0; |
| 201 | omap_chip.oc |= CHIP_IS_OMAP3430ES1; | ||
| 199 | return; | 202 | return; |
| 200 | } | 203 | } |
| 201 | 204 | ||
| @@ -216,18 +219,28 @@ void __init omap3_check_revision(void) | |||
| 216 | case 0: /* Take care of early samples */ | 219 | case 0: /* Take care of early samples */ |
| 217 | case 1: | 220 | case 1: |
| 218 | omap_revision = OMAP3430_REV_ES2_0; | 221 | omap_revision = OMAP3430_REV_ES2_0; |
| 222 | omap_chip.oc |= CHIP_IS_OMAP3430ES2; | ||
| 219 | break; | 223 | break; |
| 220 | case 2: | 224 | case 2: |
| 221 | omap_revision = OMAP3430_REV_ES2_1; | 225 | omap_revision = OMAP3430_REV_ES2_1; |
| 226 | omap_chip.oc |= CHIP_IS_OMAP3430ES2; | ||
| 222 | break; | 227 | break; |
| 223 | case 3: | 228 | case 3: |
| 224 | omap_revision = OMAP3430_REV_ES3_0; | 229 | omap_revision = OMAP3430_REV_ES3_0; |
| 230 | omap_chip.oc |= CHIP_IS_OMAP3430ES3_0; | ||
| 225 | break; | 231 | break; |
| 226 | case 4: | 232 | case 4: |
| 233 | omap_revision = OMAP3430_REV_ES3_1; | ||
| 234 | omap_chip.oc |= CHIP_IS_OMAP3430ES3_1; | ||
| 235 | break; | ||
| 236 | case 7: | ||
| 227 | /* FALLTHROUGH */ | 237 | /* FALLTHROUGH */ |
| 228 | default: | 238 | default: |
| 229 | /* Use the latest known revision as default */ | 239 | /* Use the latest known revision as default */ |
| 230 | omap_revision = OMAP3430_REV_ES3_1; | 240 | omap_revision = OMAP3430_REV_ES3_1_2; |
| 241 | |||
| 242 | /* REVISIT: Add CHIP_IS_OMAP3430ES3_1_2? */ | ||
| 243 | omap_chip.oc |= CHIP_IS_OMAP3430ES3_1; | ||
| 231 | } | 244 | } |
| 232 | break; | 245 | break; |
| 233 | case 0xb868: | 246 | case 0xb868: |
| @@ -235,14 +248,18 @@ void __init omap3_check_revision(void) | |||
| 235 | * | 248 | * |
| 236 | * Set the device to be OMAP3505 here. Actual device | 249 | * Set the device to be OMAP3505 here. Actual device |
| 237 | * is identified later based on the features. | 250 | * is identified later based on the features. |
| 251 | * | ||
| 252 | * REVISIT: AM3505/AM3517 should have their own CHIP_IS | ||
| 238 | */ | 253 | */ |
| 239 | omap_revision = OMAP3505_REV(rev); | 254 | omap_revision = OMAP3505_REV(rev); |
| 255 | omap_chip.oc |= CHIP_IS_OMAP3430ES3_1; | ||
| 240 | break; | 256 | break; |
| 241 | case 0xb891: | 257 | case 0xb891: |
| 242 | /* FALLTHROUGH */ | 258 | /* FALLTHROUGH */ |
| 243 | default: | 259 | default: |
| 244 | /* Unknown default to latest silicon rev as default*/ | 260 | /* Unknown default to latest silicon rev as default*/ |
| 245 | omap_revision = OMAP3630_REV_ES1_0; | 261 | omap_revision = OMAP3630_REV_ES1_0; |
| 262 | omap_chip.oc |= CHIP_IS_OMAP3630ES1; | ||
| 246 | } | 263 | } |
| 247 | } | 264 | } |
| 248 | 265 | ||
| @@ -360,6 +377,7 @@ void __init omap2_check_revision(void) | |||
| 360 | omap3_check_revision(); | 377 | omap3_check_revision(); |
| 361 | omap3_check_features(); | 378 | omap3_check_features(); |
| 362 | omap3_cpuinfo(); | 379 | omap3_cpuinfo(); |
| 380 | return; | ||
| 363 | } else if (cpu_is_omap44xx()) { | 381 | } else if (cpu_is_omap44xx()) { |
| 364 | omap4_check_revision(); | 382 | omap4_check_revision(); |
| 365 | return; | 383 | return; |
| @@ -374,27 +392,14 @@ void __init omap2_check_revision(void) | |||
| 374 | if (cpu_is_omap243x()) { | 392 | if (cpu_is_omap243x()) { |
| 375 | /* Currently only supports 2430ES2.1 and 2430-all */ | 393 | /* Currently only supports 2430ES2.1 and 2430-all */ |
| 376 | omap_chip.oc |= CHIP_IS_OMAP2430; | 394 | omap_chip.oc |= CHIP_IS_OMAP2430; |
| 395 | return; | ||
| 377 | } else if (cpu_is_omap242x()) { | 396 | } else if (cpu_is_omap242x()) { |
| 378 | /* Currently only supports 2420ES2.1.1 and 2420-all */ | 397 | /* Currently only supports 2420ES2.1.1 and 2420-all */ |
| 379 | omap_chip.oc |= CHIP_IS_OMAP2420; | 398 | omap_chip.oc |= CHIP_IS_OMAP2420; |
| 380 | } else if (cpu_is_omap3505() || cpu_is_omap3517()) { | 399 | return; |
| 381 | omap_chip.oc = CHIP_IS_OMAP3430 | CHIP_IS_OMAP3430ES3_1; | ||
| 382 | } else if (cpu_is_omap343x()) { | ||
| 383 | omap_chip.oc = CHIP_IS_OMAP3430; | ||
| 384 | if (omap_rev() == OMAP3430_REV_ES1_0) | ||
| 385 | omap_chip.oc |= CHIP_IS_OMAP3430ES1; | ||
| 386 | else if (omap_rev() >= OMAP3430_REV_ES2_0 && | ||
| 387 | omap_rev() <= OMAP3430_REV_ES2_1) | ||
| 388 | omap_chip.oc |= CHIP_IS_OMAP3430ES2; | ||
| 389 | else if (omap_rev() == OMAP3430_REV_ES3_0) | ||
| 390 | omap_chip.oc |= CHIP_IS_OMAP3430ES3_0; | ||
| 391 | else if (omap_rev() == OMAP3430_REV_ES3_1) | ||
| 392 | omap_chip.oc |= CHIP_IS_OMAP3430ES3_1; | ||
| 393 | else if (omap_rev() == OMAP3630_REV_ES1_0) | ||
| 394 | omap_chip.oc |= CHIP_IS_OMAP3630ES1; | ||
| 395 | } else { | ||
| 396 | pr_err("Uninitialized omap_chip, please fix!\n"); | ||
| 397 | } | 400 | } |
| 401 | |||
| 402 | pr_err("Uninitialized omap_chip, please fix!\n"); | ||
| 398 | } | 403 | } |
| 399 | 404 | ||
| 400 | /* | 405 | /* |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index a8749e8017b9..5a7996402c53 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -33,7 +33,6 @@ | |||
| 33 | #include <plat/sdrc.h> | 33 | #include <plat/sdrc.h> |
| 34 | #include <plat/gpmc.h> | 34 | #include <plat/gpmc.h> |
| 35 | #include <plat/serial.h> | 35 | #include <plat/serial.h> |
| 36 | #include <plat/mux.h> | ||
| 37 | #include <plat/vram.h> | 36 | #include <plat/vram.h> |
| 38 | 37 | ||
| 39 | #include "clock.h" | 38 | #include "clock.h" |
| @@ -73,21 +72,21 @@ static struct map_desc omap24xx_io_desc[] __initdata = { | |||
| 73 | #ifdef CONFIG_ARCH_OMAP2420 | 72 | #ifdef CONFIG_ARCH_OMAP2420 |
| 74 | static struct map_desc omap242x_io_desc[] __initdata = { | 73 | static struct map_desc omap242x_io_desc[] __initdata = { |
| 75 | { | 74 | { |
| 76 | .virtual = DSP_MEM_24XX_VIRT, | 75 | .virtual = DSP_MEM_2420_VIRT, |
| 77 | .pfn = __phys_to_pfn(DSP_MEM_24XX_PHYS), | 76 | .pfn = __phys_to_pfn(DSP_MEM_2420_PHYS), |
| 78 | .length = DSP_MEM_24XX_SIZE, | 77 | .length = DSP_MEM_2420_SIZE, |
| 79 | .type = MT_DEVICE | 78 | .type = MT_DEVICE |
| 80 | }, | 79 | }, |
| 81 | { | 80 | { |
| 82 | .virtual = DSP_IPI_24XX_VIRT, | 81 | .virtual = DSP_IPI_2420_VIRT, |
| 83 | .pfn = __phys_to_pfn(DSP_IPI_24XX_PHYS), | 82 | .pfn = __phys_to_pfn(DSP_IPI_2420_PHYS), |
| 84 | .length = DSP_IPI_24XX_SIZE, | 83 | .length = DSP_IPI_2420_SIZE, |
| 85 | .type = MT_DEVICE | 84 | .type = MT_DEVICE |
| 86 | }, | 85 | }, |
| 87 | { | 86 | { |
| 88 | .virtual = DSP_MMU_24XX_VIRT, | 87 | .virtual = DSP_MMU_2420_VIRT, |
| 89 | .pfn = __phys_to_pfn(DSP_MMU_24XX_PHYS), | 88 | .pfn = __phys_to_pfn(DSP_MMU_2420_PHYS), |
| 90 | .length = DSP_MMU_24XX_SIZE, | 89 | .length = DSP_MMU_2420_SIZE, |
| 91 | .type = MT_DEVICE | 90 | .type = MT_DEVICE |
| 92 | }, | 91 | }, |
| 93 | }; | 92 | }; |
diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index e9bc782fa414..26aeef560aa3 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c | |||
| @@ -194,7 +194,7 @@ void __init omap_init_irq(void) | |||
| 194 | int i; | 194 | int i; |
| 195 | 195 | ||
| 196 | for (i = 0; i < ARRAY_SIZE(irq_banks); i++) { | 196 | for (i = 0; i < ARRAY_SIZE(irq_banks); i++) { |
| 197 | unsigned long base; | 197 | unsigned long base = 0; |
| 198 | struct omap_irq_bank *bank = irq_banks + i; | 198 | struct omap_irq_bank *bank = irq_banks + i; |
| 199 | 199 | ||
| 200 | if (cpu_is_omap24xx()) | 200 | if (cpu_is_omap24xx()) |
| @@ -202,6 +202,8 @@ void __init omap_init_irq(void) | |||
| 202 | else if (cpu_is_omap34xx()) | 202 | else if (cpu_is_omap34xx()) |
| 203 | base = OMAP34XX_IC_BASE; | 203 | base = OMAP34XX_IC_BASE; |
| 204 | 204 | ||
| 205 | BUG_ON(!base); | ||
| 206 | |||
| 205 | /* Static mapping, never released */ | 207 | /* Static mapping, never released */ |
| 206 | bank->base_reg = ioremap(base, SZ_4K); | 208 | bank->base_reg = ioremap(base, SZ_4K); |
| 207 | if (!bank->base_reg) { | 209 | if (!bank->base_reg) { |
| @@ -274,4 +276,22 @@ void omap_intc_restore_context(void) | |||
| 274 | } | 276 | } |
| 275 | /* MIRs are saved and restore with other PRCM registers */ | 277 | /* MIRs are saved and restore with other PRCM registers */ |
| 276 | } | 278 | } |
| 279 | |||
| 280 | void omap3_intc_suspend(void) | ||
| 281 | { | ||
| 282 | /* A pending interrupt would prevent OMAP from entering suspend */ | ||
| 283 | omap_ack_irq(0); | ||
| 284 | } | ||
| 285 | |||
| 286 | void omap3_intc_prepare_idle(void) | ||
| 287 | { | ||
| 288 | /* Disable autoidle as it can stall interrupt controller */ | ||
| 289 | intc_bank_write_reg(0, &irq_banks[0], INTC_SYSCONFIG); | ||
| 290 | } | ||
| 291 | |||
| 292 | void omap3_intc_resume_idle(void) | ||
| 293 | { | ||
| 294 | /* Re-enable autoidle */ | ||
| 295 | intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG); | ||
| 296 | } | ||
| 277 | #endif /* CONFIG_ARCH_OMAP3 */ | 297 | #endif /* CONFIG_ARCH_OMAP3 */ |
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c index e071b3fd1878..5fedc50c58e4 100644 --- a/arch/arm/mach-omap2/mux.c +++ b/arch/arm/mach-omap2/mux.c | |||
| @@ -51,7 +51,7 @@ struct omap_mux_entry { | |||
| 51 | static unsigned long mux_phys; | 51 | static unsigned long mux_phys; |
| 52 | static void __iomem *mux_base; | 52 | static void __iomem *mux_base; |
| 53 | 53 | ||
| 54 | static inline u16 omap_mux_read(u16 reg) | 54 | u16 omap_mux_read(u16 reg) |
| 55 | { | 55 | { |
| 56 | if (cpu_is_omap24xx()) | 56 | if (cpu_is_omap24xx()) |
| 57 | return __raw_readb(mux_base + reg); | 57 | return __raw_readb(mux_base + reg); |
| @@ -59,7 +59,7 @@ static inline u16 omap_mux_read(u16 reg) | |||
| 59 | return __raw_readw(mux_base + reg); | 59 | return __raw_readw(mux_base + reg); |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | static inline void omap_mux_write(u16 val, u16 reg) | 62 | void omap_mux_write(u16 val, u16 reg) |
| 63 | { | 63 | { |
| 64 | if (cpu_is_omap24xx()) | 64 | if (cpu_is_omap24xx()) |
| 65 | __raw_writeb(val, mux_base + reg); | 65 | __raw_writeb(val, mux_base + reg); |
| @@ -67,6 +67,14 @@ static inline void omap_mux_write(u16 val, u16 reg) | |||
| 67 | __raw_writew(val, mux_base + reg); | 67 | __raw_writew(val, mux_base + reg); |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | void omap_mux_write_array(struct omap_board_mux *board_mux) | ||
| 71 | { | ||
| 72 | while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) { | ||
| 73 | omap_mux_write(board_mux->value, board_mux->reg_offset); | ||
| 74 | board_mux++; | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 70 | #if defined(CONFIG_ARCH_OMAP24XX) && defined(CONFIG_OMAP_MUX) | 78 | #if defined(CONFIG_ARCH_OMAP24XX) && defined(CONFIG_OMAP_MUX) |
| 71 | 79 | ||
| 72 | static struct omap_mux_cfg arch_mux_cfg; | 80 | static struct omap_mux_cfg arch_mux_cfg; |
| @@ -478,7 +486,7 @@ int __init omap_mux_init_signal(char *muxname, int val) | |||
| 478 | static inline void omap_mux_decode(struct seq_file *s, u16 val) | 486 | static inline void omap_mux_decode(struct seq_file *s, u16 val) |
| 479 | { | 487 | { |
| 480 | char *flags[OMAP_MUX_MAX_NR_FLAGS]; | 488 | char *flags[OMAP_MUX_MAX_NR_FLAGS]; |
| 481 | char mode[14]; | 489 | char mode[sizeof("OMAP_MUX_MODE") + 1]; |
| 482 | int i = -1; | 490 | int i = -1; |
| 483 | 491 | ||
| 484 | sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7); | 492 | sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7); |
| @@ -545,6 +553,7 @@ static int omap_mux_dbg_board_show(struct seq_file *s, void *unused) | |||
| 545 | if (!m0_name) | 553 | if (!m0_name) |
| 546 | continue; | 554 | continue; |
| 547 | 555 | ||
| 556 | /* REVISIT: Needs to be updated if mode0 names get longer */ | ||
| 548 | for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) { | 557 | for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) { |
| 549 | if (m0_name[i] == '\0') { | 558 | if (m0_name[i] == '\0') { |
| 550 | m0_def[i] = m0_name[i]; | 559 | m0_def[i] = m0_name[i]; |
| @@ -833,14 +842,6 @@ static void __init omap_mux_set_cmdline_signals(void) | |||
| 833 | kfree(options); | 842 | kfree(options); |
| 834 | } | 843 | } |
| 835 | 844 | ||
| 836 | static void __init omap_mux_set_board_signals(struct omap_board_mux *board_mux) | ||
| 837 | { | ||
| 838 | while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) { | ||
| 839 | omap_mux_write(board_mux->value, board_mux->reg_offset); | ||
| 840 | board_mux++; | ||
| 841 | } | ||
| 842 | } | ||
| 843 | |||
| 844 | static int __init omap_mux_copy_names(struct omap_mux *src, | 845 | static int __init omap_mux_copy_names(struct omap_mux *src, |
| 845 | struct omap_mux *dst) | 846 | struct omap_mux *dst) |
| 846 | { | 847 | { |
| @@ -968,6 +969,13 @@ static void __init omap_mux_init_list(struct omap_mux *superset) | |||
| 968 | } | 969 | } |
| 969 | #endif | 970 | #endif |
| 970 | 971 | ||
| 972 | #if defined(CONFIG_OMAP_MUX) && defined(CONFIG_DEBUG_FS) | ||
| 973 | if (!superset->muxnames || !superset->muxnames[0]) { | ||
| 974 | superset++; | ||
| 975 | continue; | ||
| 976 | } | ||
| 977 | #endif | ||
| 978 | |||
| 971 | entry = omap_mux_list_add(superset); | 979 | entry = omap_mux_list_add(superset); |
| 972 | if (!entry) { | 980 | if (!entry) { |
| 973 | printk(KERN_ERR "mux: Could not add entry\n"); | 981 | printk(KERN_ERR "mux: Could not add entry\n"); |
| @@ -994,14 +1002,19 @@ int __init omap_mux_init(u32 mux_pbase, u32 mux_size, | |||
| 994 | } | 1002 | } |
| 995 | 1003 | ||
| 996 | #ifdef CONFIG_OMAP_MUX | 1004 | #ifdef CONFIG_OMAP_MUX |
| 997 | omap_mux_package_fixup(package_subset, superset); | 1005 | if (package_subset) |
| 998 | omap_mux_package_init_balls(package_balls, superset); | 1006 | omap_mux_package_fixup(package_subset, superset); |
| 999 | omap_mux_set_cmdline_signals(); | 1007 | if (package_balls) |
| 1000 | omap_mux_set_board_signals(board_mux); | 1008 | omap_mux_package_init_balls(package_balls, superset); |
| 1001 | #endif | 1009 | #endif |
| 1002 | 1010 | ||
| 1003 | omap_mux_init_list(superset); | 1011 | omap_mux_init_list(superset); |
| 1004 | 1012 | ||
| 1013 | #ifdef CONFIG_OMAP_MUX | ||
| 1014 | omap_mux_set_cmdline_signals(); | ||
| 1015 | omap_mux_write_array(board_mux); | ||
| 1016 | #endif | ||
| 1017 | |||
| 1005 | return 0; | 1018 | return 0; |
| 1006 | } | 1019 | } |
| 1007 | 1020 | ||
diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h index d8b4d5ad2278..f8c2e7a8f063 100644 --- a/arch/arm/mach-omap2/mux.h +++ b/arch/arm/mach-omap2/mux.h | |||
| @@ -147,6 +147,30 @@ u16 omap_mux_get_gpio(int gpio); | |||
| 147 | void omap_mux_set_gpio(u16 val, int gpio); | 147 | void omap_mux_set_gpio(u16 val, int gpio); |
| 148 | 148 | ||
| 149 | /** | 149 | /** |
| 150 | * omap_mux_read() - read mux register | ||
| 151 | * @mux_offset: Offset of the mux register | ||
| 152 | * | ||
| 153 | */ | ||
| 154 | u16 omap_mux_read(u16 mux_offset); | ||
| 155 | |||
| 156 | /** | ||
| 157 | * omap_mux_write() - write mux register | ||
| 158 | * @val: New mux register value | ||
| 159 | * @mux_offset: Offset of the mux register | ||
| 160 | * | ||
| 161 | * This should be only needed for dynamic remuxing of non-gpio signals. | ||
| 162 | */ | ||
| 163 | void omap_mux_write(u16 val, u16 mux_offset); | ||
| 164 | |||
| 165 | /** | ||
| 166 | * omap_mux_write_array() - write an array of mux registers | ||
| 167 | * @board_mux: Array of mux registers terminated by MAP_MUX_TERMINATOR | ||
| 168 | * | ||
| 169 | * This should be only needed for dynamic remuxing of non-gpio signals. | ||
| 170 | */ | ||
| 171 | void omap_mux_write_array(struct omap_board_mux *board_mux); | ||
| 172 | |||
| 173 | /** | ||
| 150 | * omap3_mux_init() - initialize mux system with board specific set | 174 | * omap3_mux_init() - initialize mux system with board specific set |
| 151 | * @board_mux: Board specific mux table | 175 | * @board_mux: Board specific mux table |
| 152 | * @flags: OMAP package type used for the board | 176 | * @flags: OMAP package type used for the board |
diff --git a/arch/arm/mach-omap2/mux34xx.c b/arch/arm/mach-omap2/mux34xx.c index 68e0a595f9a1..07aa7b3c95f7 100644 --- a/arch/arm/mach-omap2/mux34xx.c +++ b/arch/arm/mach-omap2/mux34xx.c | |||
| @@ -649,6 +649,53 @@ static struct omap_mux __initdata omap3_muxmodes[] = { | |||
| 649 | _OMAP3_MUXENTRY(UART3_TX_IRTX, 166, | 649 | _OMAP3_MUXENTRY(UART3_TX_IRTX, 166, |
| 650 | "uart3_tx_irtx", NULL, NULL, NULL, | 650 | "uart3_tx_irtx", NULL, NULL, NULL, |
| 651 | "gpio_166", NULL, NULL, "safe_mode"), | 651 | "gpio_166", NULL, NULL, "safe_mode"), |
| 652 | |||
| 653 | /* Only on 3630, see omap36xx_cbp_subset for the signals */ | ||
| 654 | _OMAP3_MUXENTRY(GPMC_A11, 0, | ||
| 655 | NULL, NULL, NULL, NULL, | ||
| 656 | NULL, NULL, NULL, NULL), | ||
| 657 | _OMAP3_MUXENTRY(SAD2D_MBUSFLAG, 0, | ||
| 658 | NULL, NULL, NULL, NULL, | ||
| 659 | NULL, NULL, NULL, NULL), | ||
| 660 | _OMAP3_MUXENTRY(SAD2D_MREAD, 0, | ||
| 661 | NULL, NULL, NULL, NULL, | ||
| 662 | NULL, NULL, NULL, NULL), | ||
| 663 | _OMAP3_MUXENTRY(SAD2D_MWRITE, 0, | ||
| 664 | NULL, NULL, NULL, NULL, | ||
| 665 | NULL, NULL, NULL, NULL), | ||
| 666 | _OMAP3_MUXENTRY(SAD2D_SBUSFLAG, 0, | ||
| 667 | NULL, NULL, NULL, NULL, | ||
| 668 | NULL, NULL, NULL, NULL), | ||
| 669 | _OMAP3_MUXENTRY(SAD2D_SREAD, 0, | ||
| 670 | NULL, NULL, NULL, NULL, | ||
| 671 | NULL, NULL, NULL, NULL), | ||
| 672 | _OMAP3_MUXENTRY(SAD2D_SWRITE, 0, | ||
| 673 | NULL, NULL, NULL, NULL, | ||
| 674 | NULL, NULL, NULL, NULL), | ||
| 675 | _OMAP3_MUXENTRY(GPMC_A11, 0, | ||
| 676 | NULL, NULL, NULL, NULL, | ||
| 677 | NULL, NULL, NULL, NULL), | ||
| 678 | _OMAP3_MUXENTRY(SAD2D_MCAD28, 0, | ||
| 679 | NULL, NULL, NULL, NULL, | ||
| 680 | NULL, NULL, NULL, NULL), | ||
| 681 | _OMAP3_MUXENTRY(SAD2D_MCAD29, 0, | ||
| 682 | NULL, NULL, NULL, NULL, | ||
| 683 | NULL, NULL, NULL, NULL), | ||
| 684 | _OMAP3_MUXENTRY(SAD2D_MCAD32, 0, | ||
| 685 | NULL, NULL, NULL, NULL, | ||
| 686 | NULL, NULL, NULL, NULL), | ||
| 687 | _OMAP3_MUXENTRY(SAD2D_MCAD33, 0, | ||
| 688 | NULL, NULL, NULL, NULL, | ||
| 689 | NULL, NULL, NULL, NULL), | ||
| 690 | _OMAP3_MUXENTRY(SAD2D_MCAD34, 0, | ||
| 691 | NULL, NULL, NULL, NULL, | ||
| 692 | NULL, NULL, NULL, NULL), | ||
| 693 | _OMAP3_MUXENTRY(SAD2D_MCAD35, 0, | ||
| 694 | NULL, NULL, NULL, NULL, | ||
| 695 | NULL, NULL, NULL, NULL), | ||
| 696 | _OMAP3_MUXENTRY(SAD2D_MCAD36, 0, | ||
| 697 | NULL, NULL, NULL, NULL, | ||
| 698 | NULL, NULL, NULL, NULL), | ||
| 652 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 699 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| 653 | }; | 700 | }; |
| 654 | 701 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index d8c8545875b1..478ae585ca39 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -94,7 +94,8 @@ static int _update_sysc_cache(struct omap_hwmod *oh) | |||
| 94 | 94 | ||
| 95 | oh->_sysc_cache = omap_hwmod_readl(oh, oh->sysconfig->sysc_offs); | 95 | oh->_sysc_cache = omap_hwmod_readl(oh, oh->sysconfig->sysc_offs); |
| 96 | 96 | ||
| 97 | oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED; | 97 | if (!(oh->sysconfig->sysc_flags & SYSC_NO_CACHE)) |
| 98 | oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED; | ||
| 98 | 99 | ||
| 99 | return 0; | 100 | return 0; |
| 100 | } | 101 | } |
diff --git a/arch/arm/mach-omap2/opp2420_data.c b/arch/arm/mach-omap2/opp2420_data.c index 126a9396b3a8..e6dda694fd5c 100644 --- a/arch/arm/mach-omap2/opp2420_data.c +++ b/arch/arm/mach-omap2/opp2420_data.c | |||
| @@ -9,45 +9,47 @@ | |||
| 9 | * The OMAP2 processor can be run at several discrete 'PRCM configurations'. | 9 | * The OMAP2 processor can be run at several discrete 'PRCM configurations'. |
| 10 | * These configurations are characterized by voltage and speed for clocks. | 10 | * These configurations are characterized by voltage and speed for clocks. |
| 11 | * The device is only validated for certain combinations. One way to express | 11 | * The device is only validated for certain combinations. One way to express |
| 12 | * these combinations is via the 'ratio's' which the clocks operate with | 12 | * these combinations is via the 'ratios' which the clocks operate with |
| 13 | * respect to each other. These ratio sets are for a given voltage/DPLL | 13 | * respect to each other. These ratio sets are for a given voltage/DPLL |
| 14 | * setting. All configurations can be described by a DPLL setting and a ratio | 14 | * setting. All configurations can be described by a DPLL setting and a ratio. |
| 15 | * There are 3 ratio sets for the 2430 and X ratio sets for 2420. | ||
| 16 | * | ||
| 17 | * 2430 differs from 2420 in that there are no more phase synchronizers used. | ||
| 18 | * They both have a slightly different clock domain setup. 2420(iva1,dsp) vs | ||
| 19 | * 2430 (iva2.1, NOdsp, mdm) | ||
| 20 | * | 15 | * |
| 21 | * XXX Missing voltage data. | 16 | * XXX Missing voltage data. |
| 17 | * XXX Missing 19.2MHz sys_clk rate sets (needed for N800/N810) | ||
| 22 | * | 18 | * |
| 23 | * THe format described in this file is deprecated. Once a reasonable | 19 | * THe format described in this file is deprecated. Once a reasonable |
| 24 | * OPP API exists, the data in this file should be converted to use it. | 20 | * OPP API exists, the data in this file should be converted to use it. |
| 25 | * | 21 | * |
| 26 | * This is technically part of the OMAP2xxx clock code. | 22 | * This is technically part of the OMAP2xxx clock code. |
| 23 | * | ||
| 24 | * Considerable work is still needed to fully support dynamic frequency | ||
| 25 | * changes on OMAP2xxx-series chips. Readers interested in such a | ||
| 26 | * project are encouraged to review the Maemo Diablo RX-34 and RX-44 | ||
| 27 | * kernel source at: | ||
| 28 | * http://repository.maemo.org/pool/diablo/free/k/kernel-source-diablo/ | ||
| 27 | */ | 29 | */ |
| 28 | 30 | ||
| 29 | #include "opp2xxx.h" | 31 | #include "opp2xxx.h" |
| 30 | #include "sdrc.h" | 32 | #include "sdrc.h" |
| 31 | #include "clock.h" | 33 | #include "clock.h" |
| 32 | 34 | ||
| 33 | /*------------------------------------------------------------------------- | 35 | /* |
| 34 | * Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated. | 36 | * Key dividers which make up a PRCM set. Ratios for a PRCM are mandated. |
| 35 | * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU, | 37 | * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU, |
| 36 | * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL, | 38 | * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL, |
| 37 | * CM_CLKSEL2_PLL, CM_CLKSEL_MDM | 39 | * CM_CLKSEL2_PLL, CM_CLKSEL_MDM |
| 38 | * | 40 | * |
| 39 | * Filling in table based on H4 boards and 2430-SDPs variants available. | 41 | * Filling in table based on H4 boards available. There are quite a |
| 40 | * There are quite a few more rates combinations which could be defined. | 42 | * few more rate combinations which could be defined. |
| 41 | * | 43 | * |
| 42 | * When multiple values are defined the start up will try and choose the | 44 | * When multiple values are defined the start up will try and choose |
| 43 | * fastest one. If a 'fast' value is defined, then automatically, the /2 | 45 | * the fastest one. If a 'fast' value is defined, then automatically, |
| 44 | * one should be included as it can be used. Generally having more that | 46 | * the /2 one should be included as it can be used. Generally having |
| 45 | * one fast set does not make sense, as static timings need to be changed | 47 | * more than one fast set does not make sense, as static timings need |
| 46 | * to change the set. The exception is the bypass setting which is | 48 | * to be changed to change the set. The exception is the bypass |
| 47 | * availble for low power bypass. | 49 | * setting which is available for low power bypass. |
| 48 | * | 50 | * |
| 49 | * Note: This table needs to be sorted, fastest to slowest. | 51 | * Note: This table needs to be sorted, fastest to slowest. |
| 50 | *-------------------------------------------------------------------------*/ | 52 | **/ |
| 51 | const struct prcm_config omap2420_rate_table[] = { | 53 | const struct prcm_config omap2420_rate_table[] = { |
| 52 | /* PRCM I - FAST */ | 54 | /* PRCM I - FAST */ |
| 53 | {S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */ | 55 | {S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */ |
diff --git a/arch/arm/mach-omap2/opp2430_data.c b/arch/arm/mach-omap2/opp2430_data.c index edb81672c844..1b9596ae201e 100644 --- a/arch/arm/mach-omap2/opp2430_data.c +++ b/arch/arm/mach-omap2/opp2430_data.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * opp2420_data.c - old-style "OPP" table for OMAP2420 | 2 | * opp2430_data.c - old-style "OPP" table for OMAP2430 |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2005-2009 Texas Instruments, Inc. | 4 | * Copyright (C) 2005-2009 Texas Instruments, Inc. |
| 5 | * Copyright (C) 2004-2009 Nokia Corporation | 5 | * Copyright (C) 2004-2009 Nokia Corporation |
| @@ -9,16 +9,16 @@ | |||
| 9 | * The OMAP2 processor can be run at several discrete 'PRCM configurations'. | 9 | * The OMAP2 processor can be run at several discrete 'PRCM configurations'. |
| 10 | * These configurations are characterized by voltage and speed for clocks. | 10 | * These configurations are characterized by voltage and speed for clocks. |
| 11 | * The device is only validated for certain combinations. One way to express | 11 | * The device is only validated for certain combinations. One way to express |
| 12 | * these combinations is via the 'ratio's' which the clocks operate with | 12 | * these combinations is via the 'ratios' which the clocks operate with |
| 13 | * respect to each other. These ratio sets are for a given voltage/DPLL | 13 | * respect to each other. These ratio sets are for a given voltage/DPLL |
| 14 | * setting. All configurations can be described by a DPLL setting and a ratio | 14 | * setting. All configurations can be described by a DPLL setting and a ratio. |
| 15 | * There are 3 ratio sets for the 2430 and X ratio sets for 2420. | ||
| 16 | * | 15 | * |
| 17 | * 2430 differs from 2420 in that there are no more phase synchronizers used. | 16 | * 2430 differs from 2420 in that there are no more phase synchronizers used. |
| 18 | * They both have a slightly different clock domain setup. 2420(iva1,dsp) vs | 17 | * They both have a slightly different clock domain setup. 2420(iva1,dsp) vs |
| 19 | * 2430 (iva2.1, NOdsp, mdm) | 18 | * 2430 (iva2.1, NOdsp, mdm) |
| 20 | * | 19 | * |
| 21 | * XXX Missing voltage data. | 20 | * XXX Missing voltage data. |
| 21 | * XXX Missing 19.2MHz sys_clk rate sets. | ||
| 22 | * | 22 | * |
| 23 | * THe format described in this file is deprecated. Once a reasonable | 23 | * THe format described in this file is deprecated. Once a reasonable |
| 24 | * OPP API exists, the data in this file should be converted to use it. | 24 | * OPP API exists, the data in this file should be converted to use it. |
| @@ -30,24 +30,24 @@ | |||
| 30 | #include "sdrc.h" | 30 | #include "sdrc.h" |
| 31 | #include "clock.h" | 31 | #include "clock.h" |
| 32 | 32 | ||
| 33 | /*------------------------------------------------------------------------- | 33 | /* |
| 34 | * Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated. | 34 | * Key dividers which make up a PRCM set. Ratios for a PRCM are mandated. |
| 35 | * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU, | 35 | * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU, |
| 36 | * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL, | 36 | * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL, |
| 37 | * CM_CLKSEL2_PLL, CM_CLKSEL_MDM | 37 | * CM_CLKSEL2_PLL, CM_CLKSEL_MDM |
| 38 | * | 38 | * |
| 39 | * Filling in table based on H4 boards and 2430-SDPs variants available. | 39 | * Filling in table based on 2430-SDPs variants available. There are |
| 40 | * There are quite a few more rates combinations which could be defined. | 40 | * quite a few more rate combinations which could be defined. |
| 41 | * | 41 | * |
| 42 | * When multiple values are defined the start up will try and choose the | 42 | * When multiple values are defined the start up will try and choose |
| 43 | * fastest one. If a 'fast' value is defined, then automatically, the /2 | 43 | * the fastest one. If a 'fast' value is defined, then automatically, |
| 44 | * one should be included as it can be used. Generally having more that | 44 | * the /2 one should be included as it can be used. Generally having |
| 45 | * one fast set does not make sense, as static timings need to be changed | 45 | * more than one fast set does not make sense, as static timings need |
| 46 | * to change the set. The exception is the bypass setting which is | 46 | * to be changed to change the set. The exception is the bypass |
| 47 | * availble for low power bypass. | 47 | * setting which is available for low power bypass. |
| 48 | * | 48 | * |
| 49 | * Note: This table needs to be sorted, fastest to slowest. | 49 | * Note: This table needs to be sorted, fastest to slowest. |
| 50 | *-------------------------------------------------------------------------*/ | 50 | */ |
| 51 | const struct prcm_config omap2430_rate_table[] = { | 51 | const struct prcm_config omap2430_rate_table[] = { |
| 52 | /* PRCM #4 - ratio2 (ES2.1) - FAST */ | 52 | /* PRCM #4 - ratio2 (ES2.1) - FAST */ |
| 53 | {S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */ | 53 | {S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */ |
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c index 860b755d2220..a0866268aa41 100644 --- a/arch/arm/mach-omap2/pm-debug.c +++ b/arch/arm/mach-omap2/pm-debug.c | |||
| @@ -54,8 +54,6 @@ int omap2_pm_debug; | |||
| 54 | regs[reg_count++].val = \ | 54 | regs[reg_count++].val = \ |
| 55 | __raw_readl(OMAP2_L4_IO_ADDRESS(0x480fe000 + (off))) | 55 | __raw_readl(OMAP2_L4_IO_ADDRESS(0x480fe000 + (off))) |
| 56 | 56 | ||
| 57 | static int __init pm_dbg_init(void); | ||
| 58 | |||
| 59 | void omap2_pm_dump(int mode, int resume, unsigned int us) | 57 | void omap2_pm_dump(int mode, int resume, unsigned int us) |
| 60 | { | 58 | { |
| 61 | struct reg { | 59 | struct reg { |
| @@ -167,6 +165,8 @@ struct dentry *pm_dbg_dir; | |||
| 167 | 165 | ||
| 168 | static int pm_dbg_init_done; | 166 | static int pm_dbg_init_done; |
| 169 | 167 | ||
| 168 | static int __init pm_dbg_init(void); | ||
| 169 | |||
| 170 | enum { | 170 | enum { |
| 171 | DEBUG_FILE_COUNTERS = 0, | 171 | DEBUG_FILE_COUNTERS = 0, |
| 172 | DEBUG_FILE_TIMERS, | 172 | DEBUG_FILE_TIMERS, |
| @@ -488,9 +488,11 @@ int pm_dbg_regset_init(int reg_set) | |||
| 488 | 488 | ||
| 489 | static int pwrdm_suspend_get(void *data, u64 *val) | 489 | static int pwrdm_suspend_get(void *data, u64 *val) |
| 490 | { | 490 | { |
| 491 | *val = omap3_pm_get_suspend_state((struct powerdomain *)data); | 491 | int ret; |
| 492 | ret = omap3_pm_get_suspend_state((struct powerdomain *)data); | ||
| 493 | *val = ret; | ||
| 492 | 494 | ||
| 493 | if (*val >= 0) | 495 | if (ret >= 0) |
| 494 | return 0; | 496 | return 0; |
| 495 | return *val; | 497 | return *val; |
| 496 | } | 498 | } |
| @@ -604,6 +606,4 @@ static int __init pm_dbg_init(void) | |||
| 604 | } | 606 | } |
| 605 | arch_initcall(pm_dbg_init); | 607 | arch_initcall(pm_dbg_init); |
| 606 | 608 | ||
| 607 | #else | ||
| 608 | void pm_dbg_update_time(struct powerdomain *pwrdm, int prev) {} | ||
| 609 | #endif | 609 | #endif |
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index 0bf345db7147..7a9c2d004511 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h | |||
| @@ -32,12 +32,16 @@ extern struct omap_dm_timer *gptimer_wakeup; | |||
| 32 | #ifdef CONFIG_PM_DEBUG | 32 | #ifdef CONFIG_PM_DEBUG |
| 33 | extern void omap2_pm_dump(int mode, int resume, unsigned int us); | 33 | extern void omap2_pm_dump(int mode, int resume, unsigned int us); |
| 34 | extern int omap2_pm_debug; | 34 | extern int omap2_pm_debug; |
| 35 | #else | ||
| 36 | #define omap2_pm_dump(mode, resume, us) do {} while (0); | ||
| 37 | #define omap2_pm_debug 0 | ||
| 38 | #endif | ||
| 39 | |||
| 40 | #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) | ||
| 35 | extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev); | 41 | extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev); |
| 36 | extern int pm_dbg_regset_save(int reg_set); | 42 | extern int pm_dbg_regset_save(int reg_set); |
| 37 | extern int pm_dbg_regset_init(int reg_set); | 43 | extern int pm_dbg_regset_init(int reg_set); |
| 38 | #else | 44 | #else |
| 39 | #define omap2_pm_dump(mode, resume, us) do {} while (0); | ||
| 40 | #define omap2_pm_debug 0 | ||
| 41 | #define pm_dbg_update_time(pwrdm, prev) do {} while (0); | 45 | #define pm_dbg_update_time(pwrdm, prev) do {} while (0); |
| 42 | #define pm_dbg_regset_save(reg_set) do {} while (0); | 46 | #define pm_dbg_regset_save(reg_set) do {} while (0); |
| 43 | #define pm_dbg_regset_init(reg_set) do {} while (0); | 47 | #define pm_dbg_regset_init(reg_set) do {} while (0); |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 81ed252a0f8a..910a7acf542d 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/err.h> | 26 | #include <linux/err.h> |
| 27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
| 28 | #include <linux/clk.h> | 28 | #include <linux/clk.h> |
| 29 | #include <linux/delay.h> | ||
| 29 | 30 | ||
| 30 | #include <plat/sram.h> | 31 | #include <plat/sram.h> |
| 31 | #include <plat/clockdomain.h> | 32 | #include <plat/clockdomain.h> |
| @@ -124,9 +125,17 @@ static void omap3_core_save_context(void) | |||
| 124 | control_padconf_off |= START_PADCONF_SAVE; | 125 | control_padconf_off |= START_PADCONF_SAVE; |
| 125 | omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF); | 126 | omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF); |
| 126 | /* wait for the save to complete */ | 127 | /* wait for the save to complete */ |
| 127 | while (!omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS) | 128 | while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS) |
| 128 | & PADCONF_SAVE_DONE) | 129 | & PADCONF_SAVE_DONE)) |
| 129 | ; | 130 | udelay(1); |
| 131 | |||
| 132 | /* | ||
| 133 | * Force write last pad into memory, as this can fail in some | ||
| 134 | * cases according to erratas 1.157, 1.185 | ||
| 135 | */ | ||
| 136 | omap_ctrl_writel(omap_ctrl_readl(OMAP343X_PADCONF_ETK_D14), | ||
| 137 | OMAP343X_CONTROL_MEM_WKUP + 0x2a0); | ||
| 138 | |||
| 130 | /* Save the Interrupt controller context */ | 139 | /* Save the Interrupt controller context */ |
| 131 | omap_intc_save_context(); | 140 | omap_intc_save_context(); |
| 132 | /* Save the GPMC context */ | 141 | /* Save the GPMC context */ |
| @@ -392,6 +401,7 @@ void omap_sram_idle(void) | |||
| 392 | prm_set_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN); | 401 | prm_set_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN); |
| 393 | omap3_enable_io_chain(); | 402 | omap3_enable_io_chain(); |
| 394 | } | 403 | } |
| 404 | omap3_intc_prepare_idle(); | ||
| 395 | 405 | ||
| 396 | /* | 406 | /* |
| 397 | * On EMU/HS devices ROM code restores a SRDC value | 407 | * On EMU/HS devices ROM code restores a SRDC value |
| @@ -438,6 +448,7 @@ void omap_sram_idle(void) | |||
| 438 | OMAP3430_GR_MOD, | 448 | OMAP3430_GR_MOD, |
| 439 | OMAP3_PRM_VOLTCTRL_OFFSET); | 449 | OMAP3_PRM_VOLTCTRL_OFFSET); |
| 440 | } | 450 | } |
| 451 | omap3_intc_resume_idle(); | ||
| 441 | 452 | ||
| 442 | /* PER */ | 453 | /* PER */ |
| 443 | if (per_next_state < PWRDM_POWER_ON) { | 454 | if (per_next_state < PWRDM_POWER_ON) { |
| @@ -578,6 +589,8 @@ static int omap3_pm_suspend(void) | |||
| 578 | } | 589 | } |
| 579 | 590 | ||
| 580 | omap_uart_prepare_suspend(); | 591 | omap_uart_prepare_suspend(); |
| 592 | omap3_intc_suspend(); | ||
| 593 | |||
| 581 | omap_sram_idle(); | 594 | omap_sram_idle(); |
| 582 | 595 | ||
| 583 | restore: | 596 | restore: |
| @@ -835,6 +848,8 @@ static void __init prcm_setup_regs(void) | |||
| 835 | CM_AUTOIDLE); | 848 | CM_AUTOIDLE); |
| 836 | } | 849 | } |
| 837 | 850 | ||
| 851 | omap_ctrl_writel(OMAP3430_AUTOIDLE, OMAP2_CONTROL_SYSCONFIG); | ||
| 852 | |||
| 838 | /* | 853 | /* |
| 839 | * Set all plls to autoidle. This is needed until autoidle is | 854 | * Set all plls to autoidle. This is needed until autoidle is |
| 840 | * enabled by clockfw | 855 | * enabled by clockfw |
| @@ -875,15 +890,23 @@ static void __init prcm_setup_regs(void) | |||
| 875 | prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN, | 890 | prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN, |
| 876 | OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); | 891 | OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); |
| 877 | 892 | ||
| 893 | /* Enable PM_WKEN to support DSS LPR */ | ||
| 894 | prm_write_mod_reg(OMAP3430_PM_WKEN_DSS_EN_DSS, | ||
| 895 | OMAP3430_DSS_MOD, PM_WKEN); | ||
| 896 | |||
| 878 | /* Enable wakeups in PER */ | 897 | /* Enable wakeups in PER */ |
| 879 | prm_write_mod_reg(OMAP3430_EN_GPIO2 | OMAP3430_EN_GPIO3 | | 898 | prm_write_mod_reg(OMAP3430_EN_GPIO2 | OMAP3430_EN_GPIO3 | |
| 880 | OMAP3430_EN_GPIO4 | OMAP3430_EN_GPIO5 | | 899 | OMAP3430_EN_GPIO4 | OMAP3430_EN_GPIO5 | |
| 881 | OMAP3430_EN_GPIO6 | OMAP3430_EN_UART3, | 900 | OMAP3430_EN_GPIO6 | OMAP3430_EN_UART3 | |
| 901 | OMAP3430_EN_MCBSP2 | OMAP3430_EN_MCBSP3 | | ||
| 902 | OMAP3430_EN_MCBSP4, | ||
| 882 | OMAP3430_PER_MOD, PM_WKEN); | 903 | OMAP3430_PER_MOD, PM_WKEN); |
| 883 | /* and allow them to wake up MPU */ | 904 | /* and allow them to wake up MPU */ |
| 884 | prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2 | OMAP3430_EN_GPIO3 | | 905 | prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2 | OMAP3430_EN_GPIO3 | |
| 885 | OMAP3430_GRPSEL_GPIO4 | OMAP3430_EN_GPIO5 | | 906 | OMAP3430_GRPSEL_GPIO4 | OMAP3430_EN_GPIO5 | |
| 886 | OMAP3430_GRPSEL_GPIO6 | OMAP3430_EN_UART3, | 907 | OMAP3430_GRPSEL_GPIO6 | OMAP3430_EN_UART3 | |
| 908 | OMAP3430_EN_MCBSP2 | OMAP3430_EN_MCBSP3 | | ||
| 909 | OMAP3430_EN_MCBSP4, | ||
| 887 | OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL); | 910 | OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL); |
| 888 | 911 | ||
| 889 | /* Don't attach IVA interrupts */ | 912 | /* Don't attach IVA interrupts */ |
| @@ -904,24 +927,6 @@ static void __init prcm_setup_regs(void) | |||
| 904 | /* Clear any pending PRCM interrupts */ | 927 | /* Clear any pending PRCM interrupts */ |
| 905 | prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 928 | prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); |
| 906 | 929 | ||
| 907 | /* Don't attach IVA interrupts */ | ||
| 908 | prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); | ||
| 909 | prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); | ||
| 910 | prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3); | ||
| 911 | prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL); | ||
| 912 | |||
| 913 | /* Clear any pending 'reset' flags */ | ||
| 914 | prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST); | ||
| 915 | prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST); | ||
| 916 | prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, RM_RSTST); | ||
| 917 | prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, RM_RSTST); | ||
| 918 | prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, RM_RSTST); | ||
| 919 | prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, RM_RSTST); | ||
| 920 | prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, RM_RSTST); | ||
| 921 | |||
| 922 | /* Clear any pending PRCM interrupts */ | ||
| 923 | prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | ||
| 924 | |||
| 925 | omap3_iva_idle(); | 930 | omap3_iva_idle(); |
| 926 | omap3_d2d_idle(); | 931 | omap3_d2d_idle(); |
| 927 | } | 932 | } |
diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index 3ea8177ffb25..cf466ea1dffc 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c | |||
| @@ -44,7 +44,6 @@ struct omap3_prcm_regs { | |||
| 44 | u32 iva2_cm_clksel2; | 44 | u32 iva2_cm_clksel2; |
| 45 | u32 cm_sysconfig; | 45 | u32 cm_sysconfig; |
| 46 | u32 sgx_cm_clksel; | 46 | u32 sgx_cm_clksel; |
| 47 | u32 wkup_cm_clksel; | ||
| 48 | u32 dss_cm_clksel; | 47 | u32 dss_cm_clksel; |
| 49 | u32 cam_cm_clksel; | 48 | u32 cam_cm_clksel; |
| 50 | u32 per_cm_clksel; | 49 | u32 per_cm_clksel; |
| @@ -53,7 +52,6 @@ struct omap3_prcm_regs { | |||
| 53 | u32 pll_cm_autoidle2; | 52 | u32 pll_cm_autoidle2; |
| 54 | u32 pll_cm_clksel4; | 53 | u32 pll_cm_clksel4; |
| 55 | u32 pll_cm_clksel5; | 54 | u32 pll_cm_clksel5; |
| 56 | u32 pll_cm_clken; | ||
| 57 | u32 pll_cm_clken2; | 55 | u32 pll_cm_clken2; |
| 58 | u32 cm_polctrl; | 56 | u32 cm_polctrl; |
| 59 | u32 iva2_cm_fclken; | 57 | u32 iva2_cm_fclken; |
| @@ -77,7 +75,6 @@ struct omap3_prcm_regs { | |||
| 77 | u32 usbhost_cm_iclken; | 75 | u32 usbhost_cm_iclken; |
| 78 | u32 iva2_cm_autiidle2; | 76 | u32 iva2_cm_autiidle2; |
| 79 | u32 mpu_cm_autoidle2; | 77 | u32 mpu_cm_autoidle2; |
| 80 | u32 pll_cm_autoidle; | ||
| 81 | u32 iva2_cm_clkstctrl; | 78 | u32 iva2_cm_clkstctrl; |
| 82 | u32 mpu_cm_clkstctrl; | 79 | u32 mpu_cm_clkstctrl; |
| 83 | u32 core_cm_clkstctrl; | 80 | u32 core_cm_clkstctrl; |
| @@ -274,7 +271,6 @@ void omap3_prcm_save_context(void) | |||
| 274 | prcm_context.cm_sysconfig = __raw_readl(OMAP3430_CM_SYSCONFIG); | 271 | prcm_context.cm_sysconfig = __raw_readl(OMAP3430_CM_SYSCONFIG); |
| 275 | prcm_context.sgx_cm_clksel = | 272 | prcm_context.sgx_cm_clksel = |
| 276 | cm_read_mod_reg(OMAP3430ES2_SGX_MOD, CM_CLKSEL); | 273 | cm_read_mod_reg(OMAP3430ES2_SGX_MOD, CM_CLKSEL); |
| 277 | prcm_context.wkup_cm_clksel = cm_read_mod_reg(WKUP_MOD, CM_CLKSEL); | ||
| 278 | prcm_context.dss_cm_clksel = | 274 | prcm_context.dss_cm_clksel = |
| 279 | cm_read_mod_reg(OMAP3430_DSS_MOD, CM_CLKSEL); | 275 | cm_read_mod_reg(OMAP3430_DSS_MOD, CM_CLKSEL); |
| 280 | prcm_context.cam_cm_clksel = | 276 | prcm_context.cam_cm_clksel = |
| @@ -291,8 +287,6 @@ void omap3_prcm_save_context(void) | |||
| 291 | cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKSEL4); | 287 | cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKSEL4); |
| 292 | prcm_context.pll_cm_clksel5 = | 288 | prcm_context.pll_cm_clksel5 = |
| 293 | cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKSEL5); | 289 | cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKSEL5); |
| 294 | prcm_context.pll_cm_clken = | ||
| 295 | cm_read_mod_reg(PLL_MOD, CM_CLKEN); | ||
| 296 | prcm_context.pll_cm_clken2 = | 290 | prcm_context.pll_cm_clken2 = |
| 297 | cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKEN2); | 291 | cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKEN2); |
| 298 | prcm_context.cm_polctrl = __raw_readl(OMAP3430_CM_POLCTRL); | 292 | prcm_context.cm_polctrl = __raw_readl(OMAP3430_CM_POLCTRL); |
| @@ -338,8 +332,6 @@ void omap3_prcm_save_context(void) | |||
| 338 | cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_AUTOIDLE2); | 332 | cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_AUTOIDLE2); |
| 339 | prcm_context.mpu_cm_autoidle2 = | 333 | prcm_context.mpu_cm_autoidle2 = |
| 340 | cm_read_mod_reg(MPU_MOD, CM_AUTOIDLE2); | 334 | cm_read_mod_reg(MPU_MOD, CM_AUTOIDLE2); |
| 341 | prcm_context.pll_cm_autoidle = | ||
| 342 | cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE); | ||
| 343 | prcm_context.iva2_cm_clkstctrl = | 335 | prcm_context.iva2_cm_clkstctrl = |
| 344 | cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_CLKSTCTRL); | 336 | cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_CLKSTCTRL); |
| 345 | prcm_context.mpu_cm_clkstctrl = | 337 | prcm_context.mpu_cm_clkstctrl = |
| @@ -431,7 +423,6 @@ void omap3_prcm_restore_context(void) | |||
| 431 | __raw_writel(prcm_context.cm_sysconfig, OMAP3430_CM_SYSCONFIG); | 423 | __raw_writel(prcm_context.cm_sysconfig, OMAP3430_CM_SYSCONFIG); |
| 432 | cm_write_mod_reg(prcm_context.sgx_cm_clksel, OMAP3430ES2_SGX_MOD, | 424 | cm_write_mod_reg(prcm_context.sgx_cm_clksel, OMAP3430ES2_SGX_MOD, |
| 433 | CM_CLKSEL); | 425 | CM_CLKSEL); |
| 434 | cm_write_mod_reg(prcm_context.wkup_cm_clksel, WKUP_MOD, CM_CLKSEL); | ||
| 435 | cm_write_mod_reg(prcm_context.dss_cm_clksel, OMAP3430_DSS_MOD, | 426 | cm_write_mod_reg(prcm_context.dss_cm_clksel, OMAP3430_DSS_MOD, |
| 436 | CM_CLKSEL); | 427 | CM_CLKSEL); |
| 437 | cm_write_mod_reg(prcm_context.cam_cm_clksel, OMAP3430_CAM_MOD, | 428 | cm_write_mod_reg(prcm_context.cam_cm_clksel, OMAP3430_CAM_MOD, |
| @@ -448,7 +439,6 @@ void omap3_prcm_restore_context(void) | |||
| 448 | OMAP3430ES2_CM_CLKSEL4); | 439 | OMAP3430ES2_CM_CLKSEL4); |
| 449 | cm_write_mod_reg(prcm_context.pll_cm_clksel5, PLL_MOD, | 440 | cm_write_mod_reg(prcm_context.pll_cm_clksel5, PLL_MOD, |
| 450 | OMAP3430ES2_CM_CLKSEL5); | 441 | OMAP3430ES2_CM_CLKSEL5); |
| 451 | cm_write_mod_reg(prcm_context.pll_cm_clken, PLL_MOD, CM_CLKEN); | ||
| 452 | cm_write_mod_reg(prcm_context.pll_cm_clken2, PLL_MOD, | 442 | cm_write_mod_reg(prcm_context.pll_cm_clken2, PLL_MOD, |
| 453 | OMAP3430ES2_CM_CLKEN2); | 443 | OMAP3430ES2_CM_CLKEN2); |
| 454 | __raw_writel(prcm_context.cm_polctrl, OMAP3430_CM_POLCTRL); | 444 | __raw_writel(prcm_context.cm_polctrl, OMAP3430_CM_POLCTRL); |
| @@ -487,7 +477,6 @@ void omap3_prcm_restore_context(void) | |||
| 487 | cm_write_mod_reg(prcm_context.iva2_cm_autiidle2, OMAP3430_IVA2_MOD, | 477 | cm_write_mod_reg(prcm_context.iva2_cm_autiidle2, OMAP3430_IVA2_MOD, |
| 488 | CM_AUTOIDLE2); | 478 | CM_AUTOIDLE2); |
| 489 | cm_write_mod_reg(prcm_context.mpu_cm_autoidle2, MPU_MOD, CM_AUTOIDLE2); | 479 | cm_write_mod_reg(prcm_context.mpu_cm_autoidle2, MPU_MOD, CM_AUTOIDLE2); |
| 490 | cm_write_mod_reg(prcm_context.pll_cm_autoidle, PLL_MOD, CM_AUTOIDLE); | ||
| 491 | cm_write_mod_reg(prcm_context.iva2_cm_clkstctrl, OMAP3430_IVA2_MOD, | 480 | cm_write_mod_reg(prcm_context.iva2_cm_clkstctrl, OMAP3430_IVA2_MOD, |
| 492 | CM_CLKSTCTRL); | 481 | CM_CLKSTCTRL); |
| 493 | cm_write_mod_reg(prcm_context.mpu_cm_clkstctrl, MPU_MOD, CM_CLKSTCTRL); | 482 | cm_write_mod_reg(prcm_context.mpu_cm_clkstctrl, MPU_MOD, CM_CLKSTCTRL); |
diff --git a/arch/arm/mach-omap2/prm.h b/arch/arm/mach-omap2/prm.h index ea050ce188a7..40f006285163 100644 --- a/arch/arm/mach-omap2/prm.h +++ b/arch/arm/mach-omap2/prm.h | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE + (module) + (reg)) | 24 | OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE + (module) + (reg)) |
| 25 | #define OMAP44XX_PRM_REGADDR(module, reg) \ | 25 | #define OMAP44XX_PRM_REGADDR(module, reg) \ |
| 26 | OMAP2_L4_IO_ADDRESS(OMAP4430_PRM_BASE + (module) + (reg)) | 26 | OMAP2_L4_IO_ADDRESS(OMAP4430_PRM_BASE + (module) + (reg)) |
| 27 | #define OMAP44XX_CHIRONSS_REGADDR(module, reg) \ | ||
| 28 | OMAP2_L4_IO_ADDRESS(OMAP4430_CHIRONSS_BASE + (module) + (reg)) | ||
| 27 | 29 | ||
| 28 | #include "prm44xx.h" | 30 | #include "prm44xx.h" |
| 29 | 31 | ||
diff --git a/arch/arm/mach-omap2/prm44xx.h b/arch/arm/mach-omap2/prm44xx.h index 89be97f0589d..adb2558bb121 100644 --- a/arch/arm/mach-omap2/prm44xx.h +++ b/arch/arm/mach-omap2/prm44xx.h | |||
| @@ -386,26 +386,26 @@ | |||
| 386 | 386 | ||
| 387 | 387 | ||
| 388 | /* CHIRON_PRCM.CHIRONSS_OCP_SOCKET_PRCM register offsets */ | 388 | /* CHIRON_PRCM.CHIRONSS_OCP_SOCKET_PRCM register offsets */ |
| 389 | #define OMAP4430_REVISION_PRCM OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_OCP_SOCKET_PRCM_MOD, 0x0000) | 389 | #define OMAP4430_REVISION_PRCM OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_OCP_SOCKET_PRCM_MOD, 0x0000) |
| 390 | 390 | ||
| 391 | /* CHIRON_PRCM.CHIRONSS_DEVICE_PRM register offsets */ | 391 | /* CHIRON_PRCM.CHIRONSS_DEVICE_PRM register offsets */ |
| 392 | #define OMAP4430_CHIRON_PRCM_PRM_RSTST OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_DEVICE_PRM_MOD, 0x0000) | 392 | #define OMAP4430_CHIRON_PRCM_PRM_RSTST OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_DEVICE_PRM_MOD, 0x0000) |
| 393 | 393 | ||
| 394 | /* CHIRON_PRCM.CHIRONSS_CPU0 register offsets */ | 394 | /* CHIRON_PRCM.CHIRONSS_CPU0 register offsets */ |
| 395 | #define OMAP4430_PM_PDA_CPU0_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0000) | 395 | #define OMAP4430_PM_PDA_CPU0_PWRSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0000) |
| 396 | #define OMAP4430_PM_PDA_CPU0_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0004) | 396 | #define OMAP4430_PM_PDA_CPU0_PWRSTST OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0004) |
| 397 | #define OMAP4430_RM_PDA_CPU0_CPU0_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0008) | 397 | #define OMAP4430_RM_PDA_CPU0_CPU0_CONTEXT OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0008) |
| 398 | #define OMAP4430_RM_PDA_CPU0_CPU0_RSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x000c) | 398 | #define OMAP4430_RM_PDA_CPU0_CPU0_RSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x000c) |
| 399 | #define OMAP4430_RM_PDA_CPU0_CPU0_RSTST OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0010) | 399 | #define OMAP4430_RM_PDA_CPU0_CPU0_RSTST OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0010) |
| 400 | #define OMAP4430_CM_PDA_CPU0_CPU0_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0014) | 400 | #define OMAP4430_CM_PDA_CPU0_CPU0_CLKCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0014) |
| 401 | #define OMAP4430_CM_PDA_CPU0_CLKSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0018) | 401 | #define OMAP4430_CM_PDA_CPU0_CLKSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0018) |
| 402 | 402 | ||
| 403 | /* CHIRON_PRCM.CHIRONSS_CPU1 register offsets */ | 403 | /* CHIRON_PRCM.CHIRONSS_CPU1 register offsets */ |
| 404 | #define OMAP4430_PM_PDA_CPU1_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0000) | 404 | #define OMAP4430_PM_PDA_CPU1_PWRSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0000) |
| 405 | #define OMAP4430_PM_PDA_CPU1_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0004) | 405 | #define OMAP4430_PM_PDA_CPU1_PWRSTST OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0004) |
| 406 | #define OMAP4430_RM_PDA_CPU1_CPU1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0008) | 406 | #define OMAP4430_RM_PDA_CPU1_CPU1_CONTEXT OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0008) |
| 407 | #define OMAP4430_RM_PDA_CPU1_CPU1_RSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x000c) | 407 | #define OMAP4430_RM_PDA_CPU1_CPU1_RSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x000c) |
| 408 | #define OMAP4430_RM_PDA_CPU1_CPU1_RSTST OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0010) | 408 | #define OMAP4430_RM_PDA_CPU1_CPU1_RSTST OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0010) |
| 409 | #define OMAP4430_CM_PDA_CPU1_CPU1_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0014) | 409 | #define OMAP4430_CM_PDA_CPU1_CPU1_CLKCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0014) |
| 410 | #define OMAP4430_CM_PDA_CPU1_CLKSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0018) | 410 | #define OMAP4430_CM_PDA_CPU1_CLKSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0018) |
| 411 | #endif | 411 | #endif |
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 19805a7de06c..e10a02df6e1d 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
| @@ -36,7 +36,13 @@ | |||
| 36 | #define UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV 0x52 | 36 | #define UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV 0x52 |
| 37 | #define UART_OMAP_WER 0x17 /* Wake-up enable register */ | 37 | #define UART_OMAP_WER 0x17 /* Wake-up enable register */ |
| 38 | 38 | ||
| 39 | #define DEFAULT_TIMEOUT (5 * HZ) | 39 | /* |
| 40 | * NOTE: By default the serial timeout is disabled as it causes lost characters | ||
| 41 | * over the serial ports. This means that the UART clocks will stay on until | ||
| 42 | * disabled via sysfs. This also causes that any deeper omap sleep states are | ||
| 43 | * blocked. | ||
| 44 | */ | ||
| 45 | #define DEFAULT_TIMEOUT 0 | ||
| 40 | 46 | ||
| 41 | struct omap_uart_state { | 47 | struct omap_uart_state { |
| 42 | int num; | 48 | int num; |
| @@ -125,6 +131,13 @@ static struct plat_serial8250_port serial_platform_data3[] = { | |||
| 125 | } | 131 | } |
| 126 | }; | 132 | }; |
| 127 | #endif | 133 | #endif |
| 134 | static inline unsigned int __serial_read_reg(struct uart_port *up, | ||
| 135 | int offset) | ||
| 136 | { | ||
| 137 | offset <<= up->regshift; | ||
| 138 | return (unsigned int)__raw_readb(up->membase + offset); | ||
| 139 | } | ||
| 140 | |||
| 128 | static inline unsigned int serial_read_reg(struct plat_serial8250_port *up, | 141 | static inline unsigned int serial_read_reg(struct plat_serial8250_port *up, |
| 129 | int offset) | 142 | int offset) |
| 130 | { | 143 | { |
| @@ -415,7 +428,8 @@ static void omap_uart_idle_init(struct omap_uart_state *uart) | |||
| 415 | uart->timeout = DEFAULT_TIMEOUT; | 428 | uart->timeout = DEFAULT_TIMEOUT; |
| 416 | setup_timer(&uart->timer, omap_uart_idle_timer, | 429 | setup_timer(&uart->timer, omap_uart_idle_timer, |
| 417 | (unsigned long) uart); | 430 | (unsigned long) uart); |
| 418 | mod_timer(&uart->timer, jiffies + uart->timeout); | 431 | if (uart->timeout) |
| 432 | mod_timer(&uart->timer, jiffies + uart->timeout); | ||
| 419 | omap_uart_smart_idle_enable(uart, 0); | 433 | omap_uart_smart_idle_enable(uart, 0); |
| 420 | 434 | ||
| 421 | if (cpu_is_omap34xx()) { | 435 | if (cpu_is_omap34xx()) { |
| @@ -583,11 +597,12 @@ static unsigned int serial_in_override(struct uart_port *up, int offset) | |||
| 583 | { | 597 | { |
| 584 | if (UART_RX == offset) { | 598 | if (UART_RX == offset) { |
| 585 | unsigned int lsr; | 599 | unsigned int lsr; |
| 586 | lsr = serial_read_reg(omap_uart[up->line].p, UART_LSR); | 600 | lsr = __serial_read_reg(up, UART_LSR); |
| 587 | if (!(lsr & UART_LSR_DR)) | 601 | if (!(lsr & UART_LSR_DR)) |
| 588 | return -EPERM; | 602 | return -EPERM; |
| 589 | } | 603 | } |
| 590 | return serial_read_reg(omap_uart[up->line].p, offset); | 604 | |
| 605 | return __serial_read_reg(up, offset); | ||
| 591 | } | 606 | } |
| 592 | 607 | ||
| 593 | void __init omap_serial_early_init(void) | 608 | void __init omap_serial_early_init(void) |
diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S index 15268f8b61de..c3626ea48143 100644 --- a/arch/arm/mach-omap2/sleep34xx.S +++ b/arch/arm/mach-omap2/sleep34xx.S | |||
| @@ -245,7 +245,8 @@ restore: | |||
| 245 | mov r1, #0 @ set task id for ROM code in r1 | 245 | mov r1, #0 @ set task id for ROM code in r1 |
| 246 | mov r2, #4 @ set some flags in r2, r6 | 246 | mov r2, #4 @ set some flags in r2, r6 |
| 247 | mov r6, #0xff | 247 | mov r6, #0xff |
| 248 | adr r3, write_aux_control_params @ r3 points to parameters | 248 | ldr r4, scratchpad_base |
| 249 | ldr r3, [r4, #0xBC] @ r3 points to parameters | ||
| 249 | mcr p15, 0, r0, c7, c10, 4 @ data write barrier | 250 | mcr p15, 0, r0, c7, c10, 4 @ data write barrier |
| 250 | mcr p15, 0, r0, c7, c10, 5 @ data memory barrier | 251 | mcr p15, 0, r0, c7, c10, 5 @ data memory barrier |
| 251 | .word 0xE1600071 @ call SMI monitor (smi #1) | 252 | .word 0xE1600071 @ call SMI monitor (smi #1) |
| @@ -253,14 +254,14 @@ restore: | |||
| 253 | b logic_l1_restore | 254 | b logic_l1_restore |
| 254 | l2_inv_api_params: | 255 | l2_inv_api_params: |
| 255 | .word 0x1, 0x00 | 256 | .word 0x1, 0x00 |
| 256 | write_aux_control_params: | ||
| 257 | .word 0x1, 0x72 | ||
| 258 | l2_inv_gp: | 257 | l2_inv_gp: |
| 259 | /* Execute smi to invalidate L2 cache */ | 258 | /* Execute smi to invalidate L2 cache */ |
| 260 | mov r12, #0x1 @ set up to invalide L2 | 259 | mov r12, #0x1 @ set up to invalide L2 |
| 261 | smi: .word 0xE1600070 @ Call SMI monitor (smieq) | 260 | smi: .word 0xE1600070 @ Call SMI monitor (smieq) |
| 262 | /* Write to Aux control register to set some bits */ | 261 | /* Write to Aux control register to set some bits */ |
| 263 | mov r0, #0x72 | 262 | ldr r4, scratchpad_base |
| 263 | ldr r3, [r4,#0xBC] | ||
| 264 | ldr r0, [r3,#4] | ||
| 264 | mov r12, #0x3 | 265 | mov r12, #0x3 |
| 265 | .word 0xE1600070 @ Call SMI monitor (smieq) | 266 | .word 0xE1600070 @ Call SMI monitor (smieq) |
| 266 | logic_l1_restore: | 267 | logic_l1_restore: |
| @@ -271,6 +272,7 @@ logic_l1_restore: | |||
| 271 | 272 | ||
| 272 | ldr r4, scratchpad_base | 273 | ldr r4, scratchpad_base |
| 273 | ldr r3, [r4,#0xBC] | 274 | ldr r3, [r4,#0xBC] |
| 275 | adds r3, r3, #8 | ||
| 274 | ldmia r3!, {r4-r6} | 276 | ldmia r3!, {r4-r6} |
| 275 | mov sp, r4 | 277 | mov sp, r4 |
| 276 | msr spsr_cxsf, r5 | 278 | msr spsr_cxsf, r5 |
| @@ -387,6 +389,9 @@ usettbr0: | |||
| 387 | save_context_wfi: | 389 | save_context_wfi: |
| 388 | /*b save_context_wfi*/ @ enable to debug save code | 390 | /*b save_context_wfi*/ @ enable to debug save code |
| 389 | mov r8, r0 /* Store SDRAM address in r8 */ | 391 | mov r8, r0 /* Store SDRAM address in r8 */ |
| 392 | mrc p15, 0, r5, c1, c0, 1 @ Read Auxiliary Control Register | ||
| 393 | mov r4, #0x1 @ Number of parameters for restore call | ||
| 394 | stmia r8!, {r4-r5} | ||
| 390 | /* Check what that target sleep state is:stored in r1*/ | 395 | /* Check what that target sleep state is:stored in r1*/ |
| 391 | /* 1 - Only L1 and logic lost */ | 396 | /* 1 - Only L1 and logic lost */ |
| 392 | /* 2 - Only L2 lost */ | 397 | /* 2 - Only L2 lost */ |
