Chromium Code Reviews| Index: arch/arm/mach-tegra/tegra2_dvfs.c |
| diff --git a/arch/arm/mach-tegra/tegra2_dvfs.c b/arch/arm/mach-tegra/tegra2_dvfs.c |
| index 90f301eb50e2c556f2d6123ed92fe13ee06cccd4..c5ca6abe3ca892ef998201f7b9c754660798d693 100644 |
| --- a/arch/arm/mach-tegra/tegra2_dvfs.c |
| +++ b/arch/arm/mach-tegra/tegra2_dvfs.c |
| @@ -38,13 +38,16 @@ static bool tegra_dvfs_cpu_disabled = true; |
| #endif |
| static const int core_millivolts[MAX_DVFS_FREQS] = |
| - {950, 1000, 1100, 1200, 1275}; |
| + {950, 1000, 1100, 1200, 1225, 1275, 1300}; |
| static const int cpu_millivolts[MAX_DVFS_FREQS] = |
| {750, 775, 800, 825, 850, 875, 900, 925, 950, 975, 1000, 1025, 1050, 1100, 1125}; |
| static const int cpu_speedo_max_millivolts[NUM_SPEED_LEVELS] = |
| { 1100, 1025, 1125 }; |
| +static const int core_speedo_max_millivolts[NUM_SPEED_LEVELS] = |
| + { 1225, 1225, 1300 }; |
| + |
| #define KHZ 1000 |
| #define MHZ 1000000 |
| @@ -167,8 +170,8 @@ static struct dvfs dvfs_cpu[NUM_SPEED_LEVELS][NUM_PROCESS_CORNERS] = { |
| }; |
| static struct dvfs dvfs_init[] = { |
| - /* Core voltages (mV): 950, 1000, 1100, 1200, 1275 */ |
| - CORE_DVFS("emc", 1, KHZ, 57000, 333000, 333000, 666000, 666000), |
| + /* Core voltages (mV): 950, 1000, 1100, 1200, 1225, 1275, 1300*/ |
| + CORE_DVFS("emc", 1, KHZ, 57000, 333000, 380000, 666000, 666000, 666000, 760000), |
| #if 0 |
| /* |
| @@ -177,22 +180,22 @@ static struct dvfs dvfs_init[] = { |
| * For now, boards must ensure that the core voltage does not drop |
| * below 1V, or that the sdmmc busses are set to 44 MHz or less. |
| */ |
| - CORE_DVFS("sdmmc1", 1, KHZ, 44000, 52000, 52000, 52000, 52000), |
| - CORE_DVFS("sdmmc2", 1, KHZ, 44000, 52000, 52000, 52000, 52000), |
| - CORE_DVFS("sdmmc3", 1, KHZ, 44000, 52000, 52000, 52000, 52000), |
| - CORE_DVFS("sdmmc4", 1, KHZ, 44000, 52000, 52000, 52000, 52000), |
| + CORE_DVFS("sdmmc1", 1, KHZ, 44000, 52000, 52000, 52000, 52000, 52000, 52000), |
| + CORE_DVFS("sdmmc2", 1, KHZ, 44000, 52000, 52000, 52000, 52000, 52000, 52000), |
| + CORE_DVFS("sdmmc3", 1, KHZ, 44000, 52000, 52000, 52000, 52000, 52000, 52000), |
| + CORE_DVFS("sdmmc4", 1, KHZ, 44000, 52000, 52000, 52000, 52000, 52000, 52000), |
| #endif |
| - CORE_DVFS("ndflash", 1, KHZ, 130000, 150000, 158000, 164000, 164000), |
| - CORE_DVFS("nor", 1, KHZ, 0, 92000, 92000, 92000, 92000), |
| - CORE_DVFS("ide", 1, KHZ, 0, 0, 100000, 100000, 100000), |
| - CORE_DVFS("mipi", 1, KHZ, 0, 40000, 40000, 40000, 60000), |
| - CORE_DVFS("usbd", 1, KHZ, 0, 0, 480000, 480000, 480000), |
| - CORE_DVFS("usb2", 1, KHZ, 0, 0, 480000, 480000, 480000), |
| - CORE_DVFS("usb3", 1, KHZ, 0, 0, 480000, 480000, 480000), |
| - CORE_DVFS("pcie", 1, KHZ, 0, 0, 0, 250000, 250000), |
| - CORE_DVFS("dsi", 1, KHZ, 100000, 100000, 100000, 500000, 500000), |
| - CORE_DVFS("tvo", 1, KHZ, 0, 0, 0, 250000, 250000), |
| + CORE_DVFS("ndflash", 1, KHZ, 130000, 150000, 158000, 164000, 164000, 164000, 164000), |
| + CORE_DVFS("nor", 1, KHZ, 0, 92000, 92000, 92000, 92000, 92000, 92000), |
| + CORE_DVFS("ide", 1, KHZ, 0, 0, 100000, 100000, 100000, 100000, 100000), |
| + CORE_DVFS("mipi", 1, KHZ, 0, 40000, 40000, 40000, 40000, 60000, 60000), |
| + CORE_DVFS("usbd", 1, KHZ, 0, 0, 480000, 480000, 480000, 480000, 480000), |
| + CORE_DVFS("usb2", 1, KHZ, 0, 0, 480000, 480000, 480000, 480000, 480000), |
| + CORE_DVFS("usb3", 1, KHZ, 0, 0, 480000, 480000, 480000, 480000, 480000), |
| + CORE_DVFS("pcie", 1, KHZ, 0, 0, 0, 250000, 250000, 250000, 250000), |
| + CORE_DVFS("dsi", 1, KHZ, 100000, 100000, 100000, 500000, 500000, 500000, 500000), |
| + CORE_DVFS("tvo", 1, KHZ, 0, 0, 0, 250000, 250000, 250000, 250000), |
| /* |
| * The clock rate for the display controllers that determines the |
| @@ -200,24 +203,49 @@ static struct dvfs dvfs_init[] = { |
| * to the display block. Disable auto-dvfs on the display clocks, |
| * and let the display driver call tegra_dvfs_set_rate manually |
| */ |
| - CORE_DVFS("disp1", 0, KHZ, 158000, 158000, 190000, 190000, 190000), |
| - CORE_DVFS("disp2", 0, KHZ, 158000, 158000, 190000, 190000, 190000), |
| - CORE_DVFS("hdmi", 0, KHZ, 0, 0, 0, 148500, 148500), |
| + CORE_DVFS("disp1", 0, KHZ, 158000, 158000, 190000, 190000, 190000, 190000, 190000), |
| + CORE_DVFS("disp2", 0, KHZ, 158000, 158000, 190000, 190000, 190000, 190000, 190000), |
| + CORE_DVFS("hdmi", 0, KHZ, 0, 0, 0, 148500, 148500, 148500, 148500), |
| /* |
| * These clocks technically depend on the core process id, |
| * but just use the worst case value for now |
| */ |
| - CORE_DVFS("host1x", 1, KHZ, 104500, 133000, 166000, 166000, 166000), |
| - CORE_DVFS("epp", 1, KHZ, 133000, 171000, 247000, 300000, 300000), |
| - CORE_DVFS("2d", 1, KHZ, 133000, 171000, 247000, 300000, 300000), |
| - CORE_DVFS("3d", 1, KHZ, 114000, 161500, 247000, 300000, 300000), |
| - CORE_DVFS("mpe", 1, KHZ, 104500, 152000, 228000, 250000, 250000), |
| - CORE_DVFS("vi", 1, KHZ, 85000, 100000, 150000, 150000, 150000), |
| - CORE_DVFS("sclk", 1, KHZ, 95000, 133000, 190000, 250000, 250000), |
| - CORE_DVFS("vde", 1, KHZ, 95000, 123500, 209000, 250000, 250000), |
| + CORE_DVFS("host1x", 1, KHZ, 104500, 133000, 166000, 166000, 166000, 166000, 166000), |
| + CORE_DVFS("epp", 1, KHZ, 133000, 171000, 247000, 300000, 300000, 300000, 300000), |
| + CORE_DVFS("2d", 1, KHZ, 133000, 171000, 247000, 300000, 300000, 300000, 300000), |
| + CORE_DVFS("vi", 1, KHZ, 85000, 100000, 150000, 150000, 150000, 150000, 150000), |
| + |
| /* What is this? */ |
| - CORE_DVFS("NVRM_DEVID_CLK_SRC", 1, MHZ, 480, 600, 800, 1067, 1067), |
| + CORE_DVFS("NVRM_DEVID_CLK_SRC", 1, MHZ, 480, 600, 800, 1067, 1067, 1067, 1067), |
| +}; |
| + |
| + |
| +static struct dvfs dvfs_init_misc[][NUM_PROCESS_CORNERS] = { |
|
Olof Johansson
2011/03/07 01:01:57
This should be named "dvfs_core" to go with the ot
|
| + { |
| + CORE_DVFS("mpe", 1, KHZ, 104500, 152000, 228000, 300000, 300000, 300000, 300000), |
| + CORE_DVFS("mpe", 1, KHZ, 142500, 190000, 275500, 300000, 300000, 300000, 300000), |
| + CORE_DVFS("mpe", 1, KHZ, 190000, 237500, 300000, 300000, 300000, 300000, 300000), |
| + CORE_DVFS("mpe", 1, KHZ, 228000, 266000, 300000, 300000, 300000, 300000, 300000), |
| + }, |
| + { |
| + CORE_DVFS("3d", 1, KHZ, 114000, 161500, 247000, 304000, 304000, 335000, 335000), |
| + CORE_DVFS("3d", 1, KHZ, 161500, 209000, 285000, 333500, 333500, 361000, 361000), |
| + CORE_DVFS("3d", 1, KHZ, 218500, 256500, 323000, 380000, 380000, 400000, 400000), |
| + CORE_DVFS("3d", 1, KHZ, 247000, 285000, 351500, 400000, 400000, 400000, 400000), |
| + }, |
| + { |
| + CORE_DVFS("sclk", 1, KHZ, 95000, 133000, 190000, 240000, 240000, 247000, 262000), |
| + CORE_DVFS("sclk", 1, KHZ, 123500, 159500, 207000, 240000, 240000, 264000, 277500), |
| + CORE_DVFS("sclk", 1, KHZ, 152000, 180500, 229500, 260000, 260000, 285000, 300000), |
| + CORE_DVFS("sclk", 1, KHZ, 171000, 218500, 256500, 292500, 292500, 300000, 300000), |
| + }, |
| + { |
| + CORE_DVFS("vde", 1, KHZ, 95000, 123500, 209000, 275500, 275500, 300000, 300000), |
| + CORE_DVFS("vde", 1, KHZ, 123500, 152000, 237500, 300000, 300000, 300000, 300000), |
| + CORE_DVFS("vde", 1, KHZ, 152000, 209000, 285000, 300000, 300000, 300000, 300000), |
| + CORE_DVFS("vde", 1, KHZ, 171000, 218500, 300000, 300000, 300000, 300000, 300000), |
| + }, |
| }; |
| int tegra_dvfs_disable_core_set(const char *arg, const struct kernel_param *kp) |
| @@ -305,10 +333,24 @@ void __init tegra2_init_dvfs(void) |
| return; |
| } |
| + if (tegra_core_process_id > NUM_PROCESS_CORNERS) { |
| + pr_err("Warning: Unsupported DVFS core process id: %d\n", |
| + tegra_core_process_id); |
| + return; |
| + } |
| + |
| tegra2_dvfs_rail_vdd_cpu.nominal_millivolts = |
| cpu_speedo_max_millivolts[speedo_id]; |
| tegra2_dvfs_rail_vdd_cpu.max_millivolts = |
| cpu_speedo_max_millivolts[speedo_id]; |
| + tegra2_dvfs_rail_vdd_core.nominal_millivolts = |
| + core_speedo_max_millivolts[speedo_id]; |
| + tegra2_dvfs_rail_vdd_core.max_millivolts = |
| + core_speedo_max_millivolts[speedo_id]; |
| + tegra2_dvfs_rail_vdd_aon.nominal_millivolts = |
| + core_speedo_max_millivolts[speedo_id]; |
| + tegra2_dvfs_rail_vdd_aon.max_millivolts = |
| + core_speedo_max_millivolts[speedo_id]; |
| tegra_dvfs_init_rails(tegra2_dvfs_rails, ARRAY_SIZE(tegra2_dvfs_rails)); |
| tegra_dvfs_add_relationships(tegra2_dvfs_relationships, |
| @@ -323,6 +365,9 @@ void __init tegra2_init_dvfs(void) |
| for (i = 0; i < ARRAY_SIZE(dvfs_init); i++) |
| dvfs_init_one(&dvfs_init[i]); |
| + for (i = 0; i < ARRAY_SIZE(dvfs_init_misc); i++) |
| + dvfs_init_one(&dvfs_init_misc[i][tegra_core_process_id]); |
| + |
| if (tegra_dvfs_core_disabled) |
| tegra_dvfs_rail_disable(&tegra2_dvfs_rail_vdd_core); |