diff options
| -rw-r--r-- | arch/arm/mach-omap2/clock2xxx.c | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/arch/arm/mach-omap2/clock2xxx.c b/arch/arm/mach-omap2/clock2xxx.c index ce6742f7894a..5420356eb407 100644 --- a/arch/arm/mach-omap2/clock2xxx.c +++ b/arch/arm/mach-omap2/clock2xxx.c | |||
| @@ -449,14 +449,16 @@ 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; |
| 458 | long sys_ck_rate; | 459 | long sys_ck_rate; |
| 459 | int i = 0; | 460 | int i = 0; |
| 461 | int tbl_sz = 0; | ||
| 460 | 462 | ||
| 461 | sys_ck_rate = clk_get_rate(sclk); | 463 | sys_ck_rate = clk_get_rate(sclk); |
| 462 | 464 | ||
| @@ -470,22 +472,55 @@ void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table) | |||
| 470 | if (prcm->dpll_speed == prcm->xtal_speed) | 472 | if (prcm->dpll_speed == prcm->xtal_speed) |
| 471 | continue; | 473 | continue; |
| 472 | 474 | ||
| 473 | freq_table[i].index = i; | 475 | tbl_sz++; |
| 474 | freq_table[i].frequency = prcm->mpu_speed / 1000; | ||
| 475 | i++; | ||
| 476 | } | 476 | } |
| 477 | 477 | ||
| 478 | if (i == 0) { | 478 | /* |
| 479 | printk(KERN_WARNING "%s: failed to initialize frequency " | 479 | * XXX Ensure that we're doing what CPUFreq expects for this error |
| 480 | "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__); | ||
| 481 | return; | 485 | return; |
| 482 | } | 486 | } |
| 483 | 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__); | ||
| 495 | return; | ||
| 496 | } | ||
| 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 | |||
| 484 | freq_table[i].index = i; | 513 | freq_table[i].index = i; |
| 485 | freq_table[i].frequency = CPUFREQ_TABLE_END; | 514 | freq_table[i].frequency = CPUFREQ_TABLE_END; |
| 486 | 515 | ||
| 487 | *table = &freq_table[0]; | 516 | *table = &freq_table[0]; |
| 488 | } | 517 | } |
| 518 | |||
| 519 | void omap2_clk_exit_cpufreq_table(struct cpufreq_frequency_table **table) | ||
| 520 | { | ||
| 521 | kfree(freq_table); | ||
| 522 | } | ||
| 523 | |||
| 489 | #endif | 524 | #endif |
| 490 | 525 | ||
| 491 | struct clk_functions omap2_clk_functions = { | 526 | struct clk_functions omap2_clk_functions = { |
| @@ -497,6 +532,7 @@ struct clk_functions omap2_clk_functions = { | |||
| 497 | .clk_disable_unused = omap2_clk_disable_unused, | 532 | .clk_disable_unused = omap2_clk_disable_unused, |
| 498 | #ifdef CONFIG_CPU_FREQ | 533 | #ifdef CONFIG_CPU_FREQ |
| 499 | .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, | ||
| 500 | #endif | 536 | #endif |
| 501 | }; | 537 | }; |
| 502 | 538 | ||
