diff options
| author | Tony Lindgren <tony@atomide.com> | 2010-01-08 17:27:56 -0500 |
|---|---|---|
| committer | Tony Lindgren <tony@atomide.com> | 2010-01-08 17:27:56 -0500 |
| commit | 27dba4bcf87494e2909f6b0035f0a9a038e80f83 (patch) | |
| tree | 4108c443870e45f67aad4b33a6cd9ad35fd2d6d9 | |
| parent | 342aa2c1721e2714f43d957c3dd0bdaaa688c207 (diff) | |
| parent | cdf1a915569ea9c3f6b9b4ef48a189d531d3954c (diff) | |
Merge branch 'for_2.6.33rc_c' of git://git.pwsan.com/linux-2.6 into omap-fixes-for-linus
| -rw-r--r-- | arch/arm/mach-omap1/clock_data.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clock2xxx.c | 57 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clock34xx.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clock34xx_data.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/clockdomain.c | 4 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/io.c | 19 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/opp2420_data.c | 38 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/opp2430_data.c | 30 | ||||
| -rw-r--r-- | arch/arm/plat-omap/clock.c | 16 | ||||
| -rw-r--r-- | arch/arm/plat-omap/cpu-omap.c | 1 | ||||
| -rw-r--r-- | arch/arm/plat-omap/include/plat/clock.h | 2 | ||||
| -rw-r--r-- | arch/arm/plat-omap/include/plat/io.h | 36 | ||||
| -rw-r--r-- | arch/arm/plat-omap/io.c | 12 |
13 files changed, 137 insertions, 91 deletions
diff --git a/arch/arm/mach-omap1/clock_data.c b/arch/arm/mach-omap1/clock_data.c index 6887bf308aac..65e7b5b85d83 100644 --- a/arch/arm/mach-omap1/clock_data.c +++ b/arch/arm/mach-omap1/clock_data.c | |||
| @@ -599,7 +599,7 @@ static struct clk i2c_ick = { | |||
| 599 | static struct omap_clk omap_clks[] = { | 599 | static struct omap_clk omap_clks[] = { |
| 600 | /* non-ULPD clocks */ | 600 | /* non-ULPD clocks */ |
| 601 | CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX), | 601 | CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX), |
| 602 | CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310), | 602 | CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310 | CK_7XX), |
| 603 | /* CK_GEN1 clocks */ | 603 | /* CK_GEN1 clocks */ |
| 604 | CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX), | 604 | CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX), |
| 605 | CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX), | 605 | CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX), |
| @@ -627,7 +627,7 @@ static struct omap_clk omap_clks[] = { | |||
| 627 | CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX), | 627 | CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX), |
| 628 | CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310), | 628 | CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310), |
| 629 | CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX), | 629 | CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX), |
| 630 | CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310), | 630 | CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX), |
| 631 | CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310), | 631 | CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310), |
| 632 | CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX), | 632 | CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX), |
| 633 | CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX), | 633 | CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX), |
| @@ -678,7 +678,7 @@ static struct omap_clk omap_clks[] = { | |||
| 678 | * init | 678 | * init |
| 679 | */ | 679 | */ |
| 680 | 680 | ||
| 681 | static struct clk_functions omap1_clk_functions __initdata = { | 681 | static struct clk_functions omap1_clk_functions = { |
| 682 | .clk_enable = omap1_clk_enable, | 682 | .clk_enable = omap1_clk_enable, |
| 683 | .clk_disable = omap1_clk_disable, | 683 | .clk_disable = omap1_clk_disable, |
| 684 | .clk_round_rate = omap1_clk_round_rate, | 684 | .clk_round_rate = omap1_clk_round_rate, |
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..c6031d74d6f6 100644 --- a/arch/arm/mach-omap2/clock34xx_data.c +++ b/arch/arm/mach-omap2/clock34xx_data.c | |||
| @@ -776,6 +776,8 @@ static struct clk dpll4_m5_ck = { | |||
| 776 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, | 776 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, |
| 777 | .clksel = div16_dpll4_clksel, | 777 | .clksel = div16_dpll4_clksel, |
| 778 | .clkdm_name = "dpll4_clkdm", | 778 | .clkdm_name = "dpll4_clkdm", |
| 779 | .set_rate = &omap2_clksel_set_rate, | ||
| 780 | .round_rate = &omap2_clksel_round_rate, | ||
| 779 | .recalc = &omap2_clksel_recalc, | 781 | .recalc = &omap2_clksel_recalc, |
| 780 | }; | 782 | }; |
| 781 | 783 | ||
| @@ -1500,6 +1502,7 @@ static struct clk uart2_fck = { | |||
| 1500 | .parent = &core_48m_fck, | 1502 | .parent = &core_48m_fck, |
| 1501 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1503 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
| 1502 | .enable_bit = OMAP3430_EN_UART2_SHIFT, | 1504 | .enable_bit = OMAP3430_EN_UART2_SHIFT, |
| 1505 | .clkdm_name = "core_l4_clkdm", | ||
| 1503 | .recalc = &followparent_recalc, | 1506 | .recalc = &followparent_recalc, |
| 1504 | }; | 1507 | }; |
| 1505 | 1508 | ||
| @@ -1509,6 +1512,7 @@ static struct clk uart1_fck = { | |||
| 1509 | .parent = &core_48m_fck, | 1512 | .parent = &core_48m_fck, |
| 1510 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1513 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
| 1511 | .enable_bit = OMAP3430_EN_UART1_SHIFT, | 1514 | .enable_bit = OMAP3430_EN_UART1_SHIFT, |
| 1515 | .clkdm_name = "core_l4_clkdm", | ||
| 1512 | .recalc = &followparent_recalc, | 1516 | .recalc = &followparent_recalc, |
| 1513 | }; | 1517 | }; |
| 1514 | 1518 | ||
| @@ -2745,7 +2749,7 @@ static struct clk mcbsp4_ick = { | |||
| 2745 | }; | 2749 | }; |
| 2746 | 2750 | ||
| 2747 | static const struct clksel mcbsp_234_clksel[] = { | 2751 | static const struct clksel mcbsp_234_clksel[] = { |
| 2748 | { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates }, | 2752 | { .parent = &per_96m_fck, .rates = common_mcbsp_96m_rates }, |
| 2749 | { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, | 2753 | { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, |
| 2750 | { .parent = NULL } | 2754 | { .parent = NULL } |
| 2751 | }; | 2755 | }; |
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/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/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/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index 89cafc937249..d9f8c844c385 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c | |||
| @@ -36,10 +36,6 @@ static struct clk_functions *arch_clock; | |||
| 36 | * Standard clock functions defined in include/linux/clk.h | 36 | * Standard clock functions defined in include/linux/clk.h |
| 37 | *-------------------------------------------------------------------------*/ | 37 | *-------------------------------------------------------------------------*/ |
| 38 | 38 | ||
| 39 | /* This functions is moved to arch/arm/common/clkdev.c. For OMAP4 since | ||
| 40 | * clock framework is not up , it is defined here to avoid rework in | ||
| 41 | * every driver. Also dummy prcm reset function is added */ | ||
| 42 | |||
| 43 | int clk_enable(struct clk *clk) | 39 | int clk_enable(struct clk *clk) |
| 44 | { | 40 | { |
| 45 | unsigned long flags; | 41 | unsigned long flags; |
| @@ -305,7 +301,6 @@ void clk_enable_init_clocks(void) | |||
| 305 | clk_enable(clkp); | 301 | clk_enable(clkp); |
| 306 | } | 302 | } |
| 307 | } | 303 | } |
| 308 | EXPORT_SYMBOL(clk_enable_init_clocks); | ||
| 309 | 304 | ||
| 310 | /* | 305 | /* |
| 311 | * Low level helpers | 306 | * Low level helpers |
| @@ -334,7 +329,16 @@ void clk_init_cpufreq_table(struct cpufreq_frequency_table **table) | |||
| 334 | arch_clock->clk_init_cpufreq_table(table); | 329 | arch_clock->clk_init_cpufreq_table(table); |
| 335 | spin_unlock_irqrestore(&clockfw_lock, flags); | 330 | spin_unlock_irqrestore(&clockfw_lock, flags); |
| 336 | } | 331 | } |
| 337 | EXPORT_SYMBOL(clk_init_cpufreq_table); | 332 | |
| 333 | void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table) | ||
| 334 | { | ||
| 335 | unsigned long flags; | ||
| 336 | |||
| 337 | spin_lock_irqsave(&clockfw_lock, flags); | ||
| 338 | if (arch_clock->clk_exit_cpufreq_table) | ||
| 339 | arch_clock->clk_exit_cpufreq_table(table); | ||
| 340 | spin_unlock_irqrestore(&clockfw_lock, flags); | ||
| 341 | } | ||
| 338 | #endif | 342 | #endif |
| 339 | 343 | ||
| 340 | /*-------------------------------------------------------------------------*/ | 344 | /*-------------------------------------------------------------------------*/ |
diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c index f8ddbdd8b076..6d3d33360056 100644 --- a/arch/arm/plat-omap/cpu-omap.c +++ b/arch/arm/plat-omap/cpu-omap.c | |||
| @@ -134,6 +134,7 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy) | |||
| 134 | 134 | ||
| 135 | static int omap_cpu_exit(struct cpufreq_policy *policy) | 135 | static int omap_cpu_exit(struct cpufreq_policy *policy) |
| 136 | { | 136 | { |
| 137 | clk_exit_cpufreq_table(&freq_table); | ||
| 137 | clk_put(mpu_clk); | 138 | clk_put(mpu_clk); |
| 138 | return 0; | 139 | return 0; |
| 139 | } | 140 | } |
diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h index 309b6d1dccdb..94fe2a0ce40a 100644 --- a/arch/arm/plat-omap/include/plat/clock.h +++ b/arch/arm/plat-omap/include/plat/clock.h | |||
| @@ -119,6 +119,7 @@ struct clk_functions { | |||
| 119 | void (*clk_disable_unused)(struct clk *clk); | 119 | void (*clk_disable_unused)(struct clk *clk); |
| 120 | #ifdef CONFIG_CPU_FREQ | 120 | #ifdef CONFIG_CPU_FREQ |
| 121 | void (*clk_init_cpufreq_table)(struct cpufreq_frequency_table **); | 121 | void (*clk_init_cpufreq_table)(struct cpufreq_frequency_table **); |
| 122 | void (*clk_exit_cpufreq_table)(struct cpufreq_frequency_table **); | ||
| 122 | #endif | 123 | #endif |
| 123 | }; | 124 | }; |
| 124 | 125 | ||
| @@ -135,6 +136,7 @@ extern unsigned long followparent_recalc(struct clk *clk); | |||
| 135 | extern void clk_enable_init_clocks(void); | 136 | extern void clk_enable_init_clocks(void); |
| 136 | #ifdef CONFIG_CPU_FREQ | 137 | #ifdef CONFIG_CPU_FREQ |
| 137 | extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table); | 138 | extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table); |
| 139 | extern void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table); | ||
| 138 | #endif | 140 | #endif |
| 139 | 141 | ||
| 140 | extern const struct clkops clkops_null; | 142 | extern const struct clkops clkops_null; |
diff --git a/arch/arm/plat-omap/include/plat/io.h b/arch/arm/plat-omap/include/plat/io.h index 7e5319f907d1..a3e7b471bcba 100644 --- a/arch/arm/plat-omap/include/plat/io.h +++ b/arch/arm/plat-omap/include/plat/io.h | |||
| @@ -122,16 +122,21 @@ | |||
| 122 | #define OMAP243X_SMS_VIRT (OMAP243X_SMS_PHYS + OMAP2_L3_IO_OFFSET) | 122 | #define OMAP243X_SMS_VIRT (OMAP243X_SMS_PHYS + OMAP2_L3_IO_OFFSET) |
| 123 | #define OMAP243X_SMS_SIZE SZ_1M | 123 | #define OMAP243X_SMS_SIZE SZ_1M |
| 124 | 124 | ||
| 125 | /* DSP */ | 125 | /* 2420 IVA */ |
| 126 | #define DSP_MEM_24XX_PHYS OMAP2420_DSP_MEM_BASE /* 0x58000000 */ | 126 | #define DSP_MEM_2420_PHYS OMAP2420_DSP_MEM_BASE |
| 127 | #define DSP_MEM_24XX_VIRT 0xe0000000 | 127 | /* 0x58000000 --> 0xfc100000 */ |
| 128 | #define DSP_MEM_24XX_SIZE 0x28000 | 128 | #define DSP_MEM_2420_VIRT 0xfc100000 |
| 129 | #define DSP_IPI_24XX_PHYS OMAP2420_DSP_IPI_BASE /* 0x59000000 */ | 129 | #define DSP_MEM_2420_SIZE 0x28000 |
| 130 | #define DSP_IPI_24XX_VIRT 0xe1000000 | 130 | #define DSP_IPI_2420_PHYS OMAP2420_DSP_IPI_BASE |
| 131 | #define DSP_IPI_24XX_SIZE SZ_4K | 131 | /* 0x59000000 --> 0xfc128000 */ |
| 132 | #define DSP_MMU_24XX_PHYS OMAP2420_DSP_MMU_BASE /* 0x5a000000 */ | 132 | #define DSP_IPI_2420_VIRT 0xfc128000 |
| 133 | #define DSP_MMU_24XX_VIRT 0xe2000000 | 133 | #define DSP_IPI_2420_SIZE SZ_4K |
| 134 | #define DSP_MMU_24XX_SIZE SZ_4K | 134 | #define DSP_MMU_2420_PHYS OMAP2420_DSP_MMU_BASE |
| 135 | /* 0x5a000000 --> 0xfc129000 */ | ||
| 136 | #define DSP_MMU_2420_VIRT 0xfc129000 | ||
| 137 | #define DSP_MMU_2420_SIZE SZ_4K | ||
| 138 | |||
| 139 | /* 2430 IVA2.1 - currently unmapped */ | ||
| 135 | 140 | ||
| 136 | /* | 141 | /* |
| 137 | * ---------------------------------------------------------------------------- | 142 | * ---------------------------------------------------------------------------- |
| @@ -182,16 +187,7 @@ | |||
| 182 | #define OMAP343X_SDRC_VIRT (OMAP343X_SDRC_PHYS + OMAP2_L3_IO_OFFSET) | 187 | #define OMAP343X_SDRC_VIRT (OMAP343X_SDRC_PHYS + OMAP2_L3_IO_OFFSET) |
| 183 | #define OMAP343X_SDRC_SIZE SZ_1M | 188 | #define OMAP343X_SDRC_SIZE SZ_1M |
| 184 | 189 | ||
| 185 | /* DSP */ | 190 | /* 3430 IVA - currently unmapped */ |
| 186 | #define DSP_MEM_34XX_PHYS OMAP34XX_DSP_MEM_BASE /* 0x58000000 */ | ||
| 187 | #define DSP_MEM_34XX_VIRT 0xe0000000 | ||
| 188 | #define DSP_MEM_34XX_SIZE 0x28000 | ||
| 189 | #define DSP_IPI_34XX_PHYS OMAP34XX_DSP_IPI_BASE /* 0x59000000 */ | ||
| 190 | #define DSP_IPI_34XX_VIRT 0xe1000000 | ||
| 191 | #define DSP_IPI_34XX_SIZE SZ_4K | ||
| 192 | #define DSP_MMU_34XX_PHYS OMAP34XX_DSP_MMU_BASE /* 0x5a000000 */ | ||
| 193 | #define DSP_MMU_34XX_VIRT 0xe2000000 | ||
| 194 | #define DSP_MMU_34XX_SIZE SZ_4K | ||
| 195 | 191 | ||
| 196 | /* | 192 | /* |
| 197 | * ---------------------------------------------------------------------------- | 193 | * ---------------------------------------------------------------------------- |
diff --git a/arch/arm/plat-omap/io.c b/arch/arm/plat-omap/io.c index 11f5d7961c73..0cfd54f519c4 100644 --- a/arch/arm/plat-omap/io.c +++ b/arch/arm/plat-omap/io.c | |||
| @@ -66,12 +66,12 @@ void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type) | |||
| 66 | return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT); | 66 | return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT); |
| 67 | } | 67 | } |
| 68 | if (cpu_is_omap2420()) { | 68 | if (cpu_is_omap2420()) { |
| 69 | if (BETWEEN(p, DSP_MEM_24XX_PHYS, DSP_MEM_24XX_SIZE)) | 69 | if (BETWEEN(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_SIZE)) |
| 70 | return XLATE(p, DSP_MEM_24XX_PHYS, DSP_MEM_24XX_VIRT); | 70 | return XLATE(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_VIRT); |
| 71 | if (BETWEEN(p, DSP_IPI_24XX_PHYS, DSP_IPI_24XX_SIZE)) | 71 | if (BETWEEN(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE)) |
| 72 | return XLATE(p, DSP_IPI_24XX_PHYS, DSP_IPI_24XX_SIZE); | 72 | return XLATE(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE); |
| 73 | if (BETWEEN(p, DSP_MMU_24XX_PHYS, DSP_MMU_24XX_SIZE)) | 73 | if (BETWEEN(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_SIZE)) |
| 74 | return XLATE(p, DSP_MMU_24XX_PHYS, DSP_MMU_24XX_VIRT); | 74 | return XLATE(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_VIRT); |
| 75 | } | 75 | } |
| 76 | if (cpu_is_omap2430()) { | 76 | if (cpu_is_omap2430()) { |
| 77 | if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE)) | 77 | if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE)) |
