Commit fe9bf4373aa24e077bfac4e8da94fa3cb43ae184
1 parent
af4ec5a39f
Exists in
master
arm:omap:am33xx: MPU voltage domain
MPU voltage domain data added. Also added OPP table for MPU voltage domain. OPP table for CORE voltage domain has not been added as there were issues upon reducing CORE voltage, hence no dependency has been defined for MPU. Signed-off-by: Afzal Mohammed <afzal@ti.com>
Showing 2 changed files with 96 additions and 0 deletions Inline Diff
arch/arm/mach-omap2/opp3xxx_data.c
1 | /* | 1 | /* |
2 | * OMAP3 OPP table definitions. | 2 | * OMAP3 OPP table definitions. |
3 | * | 3 | * |
4 | * Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/ | 4 | * Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/ |
5 | * Nishanth Menon | 5 | * Nishanth Menon |
6 | * Kevin Hilman | 6 | * Kevin Hilman |
7 | * Copyright (C) 2010-2011 Nokia Corporation. | 7 | * Copyright (C) 2010-2011 Nokia Corporation. |
8 | * Eduardo Valentin | 8 | * Eduardo Valentin |
9 | * Paul Walmsley | 9 | * Paul Walmsley |
10 | * | 10 | * |
11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of the GNU General Public License version 2 as | 12 | * it under the terms of the GNU General Public License version 2 as |
13 | * published by the Free Software Foundation. | 13 | * published by the Free Software Foundation. |
14 | * | 14 | * |
15 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | 15 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any |
16 | * kind, whether express or implied; without even the implied warranty | 16 | * kind, whether express or implied; without even the implied warranty |
17 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 17 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
18 | * GNU General Public License for more details. | 18 | * GNU General Public License for more details. |
19 | */ | 19 | */ |
20 | #include <linux/module.h> | 20 | #include <linux/module.h> |
21 | 21 | ||
22 | #include <plat/cpu.h> | 22 | #include <plat/cpu.h> |
23 | 23 | ||
24 | #include "control.h" | 24 | #include "control.h" |
25 | #include "omap_opp_data.h" | 25 | #include "omap_opp_data.h" |
26 | #include "pm.h" | 26 | #include "pm.h" |
27 | 27 | ||
28 | /* 34xx */ | 28 | /* 34xx */ |
29 | 29 | ||
30 | /* VDD1 */ | 30 | /* VDD1 */ |
31 | 31 | ||
32 | #define OMAP3430_VDD_MPU_OPP1_UV 975000 | 32 | #define OMAP3430_VDD_MPU_OPP1_UV 975000 |
33 | #define OMAP3430_VDD_MPU_OPP2_UV 1075000 | 33 | #define OMAP3430_VDD_MPU_OPP2_UV 1075000 |
34 | #define OMAP3430_VDD_MPU_OPP3_UV 1200000 | 34 | #define OMAP3430_VDD_MPU_OPP3_UV 1200000 |
35 | #define OMAP3430_VDD_MPU_OPP4_UV 1270000 | 35 | #define OMAP3430_VDD_MPU_OPP4_UV 1270000 |
36 | #define OMAP3430_VDD_MPU_OPP5_UV 1350000 | 36 | #define OMAP3430_VDD_MPU_OPP5_UV 1350000 |
37 | 37 | ||
38 | struct omap_volt_data omap34xx_vddmpu_volt_data[] = { | 38 | struct omap_volt_data omap34xx_vddmpu_volt_data[] = { |
39 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD1, 0xf4, 0x0c), | 39 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD1, 0xf4, 0x0c), |
40 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD1, 0xf4, 0x0c), | 40 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD1, 0xf4, 0x0c), |
41 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD1, 0xf9, 0x18), | 41 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD1, 0xf9, 0x18), |
42 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP4_UV, OMAP343X_CONTROL_FUSE_OPP4_VDD1, 0xf9, 0x18), | 42 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP4_UV, OMAP343X_CONTROL_FUSE_OPP4_VDD1, 0xf9, 0x18), |
43 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP5_UV, OMAP343X_CONTROL_FUSE_OPP5_VDD1, 0xf9, 0x18), | 43 | VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP5_UV, OMAP343X_CONTROL_FUSE_OPP5_VDD1, 0xf9, 0x18), |
44 | VOLT_DATA_DEFINE(0, 0, 0, 0), | 44 | VOLT_DATA_DEFINE(0, 0, 0, 0), |
45 | }; | 45 | }; |
46 | 46 | ||
47 | /* VDD2 */ | 47 | /* VDD2 */ |
48 | 48 | ||
49 | #define OMAP3430_VDD_CORE_OPP1_UV 975000 | 49 | #define OMAP3430_VDD_CORE_OPP1_UV 975000 |
50 | #define OMAP3430_VDD_CORE_OPP2_UV 1050000 | 50 | #define OMAP3430_VDD_CORE_OPP2_UV 1050000 |
51 | #define OMAP3430_VDD_CORE_OPP3_UV 1150000 | 51 | #define OMAP3430_VDD_CORE_OPP3_UV 1150000 |
52 | 52 | ||
53 | struct omap_volt_data omap34xx_vddcore_volt_data[] = { | 53 | struct omap_volt_data omap34xx_vddcore_volt_data[] = { |
54 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD2, 0xf4, 0x0c), | 54 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD2, 0xf4, 0x0c), |
55 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD2, 0xf4, 0x0c), | 55 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD2, 0xf4, 0x0c), |
56 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD2, 0xf9, 0x18), | 56 | VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD2, 0xf9, 0x18), |
57 | VOLT_DATA_DEFINE(0, 0, 0, 0), | 57 | VOLT_DATA_DEFINE(0, 0, 0, 0), |
58 | }; | 58 | }; |
59 | 59 | ||
60 | /* OMAP 3430 MPU Core VDD dependency table */ | 60 | /* OMAP 3430 MPU Core VDD dependency table */ |
61 | static struct omap_vdd_dep_volt omap34xx_vdd_mpu_core_dep_data[] = { | 61 | static struct omap_vdd_dep_volt omap34xx_vdd_mpu_core_dep_data[] = { |
62 | {.main_vdd_volt = OMAP3430_VDD_MPU_OPP1_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP2_UV}, | 62 | {.main_vdd_volt = OMAP3430_VDD_MPU_OPP1_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP2_UV}, |
63 | {.main_vdd_volt = OMAP3430_VDD_MPU_OPP2_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP2_UV}, | 63 | {.main_vdd_volt = OMAP3430_VDD_MPU_OPP2_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP2_UV}, |
64 | {.main_vdd_volt = OMAP3430_VDD_MPU_OPP3_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP3_UV}, | 64 | {.main_vdd_volt = OMAP3430_VDD_MPU_OPP3_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP3_UV}, |
65 | {.main_vdd_volt = OMAP3430_VDD_MPU_OPP4_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP3_UV}, | 65 | {.main_vdd_volt = OMAP3430_VDD_MPU_OPP4_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP3_UV}, |
66 | {.main_vdd_volt = OMAP3430_VDD_MPU_OPP5_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP3_UV}, | 66 | {.main_vdd_volt = OMAP3430_VDD_MPU_OPP5_UV, .dep_vdd_volt = OMAP3430_VDD_CORE_OPP3_UV}, |
67 | }; | 67 | }; |
68 | 68 | ||
69 | struct omap_vdd_dep_info omap34xx_vddmpu_dep_info[] = { | 69 | struct omap_vdd_dep_info omap34xx_vddmpu_dep_info[] = { |
70 | { | 70 | { |
71 | .name = "core", | 71 | .name = "core", |
72 | .dep_table = omap34xx_vdd_mpu_core_dep_data, | 72 | .dep_table = omap34xx_vdd_mpu_core_dep_data, |
73 | .nr_dep_entries = ARRAY_SIZE(omap34xx_vdd_mpu_core_dep_data), | 73 | .nr_dep_entries = ARRAY_SIZE(omap34xx_vdd_mpu_core_dep_data), |
74 | }, | 74 | }, |
75 | {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, | 75 | {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, |
76 | }; | 76 | }; |
77 | 77 | ||
78 | /* 36xx */ | 78 | /* 36xx */ |
79 | 79 | ||
80 | /* VDD1 */ | 80 | /* VDD1 */ |
81 | 81 | ||
82 | #define OMAP3630_VDD_MPU_OPP50_UV 1012500 | 82 | #define OMAP3630_VDD_MPU_OPP50_UV 1012500 |
83 | #define OMAP3630_VDD_MPU_OPP100_UV 1200000 | 83 | #define OMAP3630_VDD_MPU_OPP100_UV 1200000 |
84 | #define OMAP3630_VDD_MPU_OPP120_UV 1325000 | 84 | #define OMAP3630_VDD_MPU_OPP120_UV 1325000 |
85 | #define OMAP3630_VDD_MPU_OPP1G_UV 1375000 | 85 | #define OMAP3630_VDD_MPU_OPP1G_UV 1375000 |
86 | 86 | ||
87 | struct omap_volt_data omap36xx_vddmpu_volt_data[] = { | 87 | struct omap_volt_data omap36xx_vddmpu_volt_data[] = { |
88 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD1, 0xf4, 0x0c), | 88 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD1, 0xf4, 0x0c), |
89 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD1, 0xf9, 0x16), | 89 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD1, 0xf9, 0x16), |
90 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP120_UV, OMAP3630_CONTROL_FUSE_OPP120_VDD1, 0xfa, 0x23), | 90 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP120_UV, OMAP3630_CONTROL_FUSE_OPP120_VDD1, 0xfa, 0x23), |
91 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP1G_UV, OMAP3630_CONTROL_FUSE_OPP1G_VDD1, 0xfa, 0x27), | 91 | VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP1G_UV, OMAP3630_CONTROL_FUSE_OPP1G_VDD1, 0xfa, 0x27), |
92 | VOLT_DATA_DEFINE(0, 0, 0, 0), | 92 | VOLT_DATA_DEFINE(0, 0, 0, 0), |
93 | }; | 93 | }; |
94 | 94 | ||
95 | /* VDD2 */ | 95 | /* VDD2 */ |
96 | 96 | ||
97 | #define OMAP3630_VDD_CORE_OPP50_UV 1000000 | 97 | #define OMAP3630_VDD_CORE_OPP50_UV 1000000 |
98 | #define OMAP3630_VDD_CORE_OPP100_UV 1200000 | 98 | #define OMAP3630_VDD_CORE_OPP100_UV 1200000 |
99 | 99 | ||
100 | struct omap_volt_data omap36xx_vddcore_volt_data[] = { | 100 | struct omap_volt_data omap36xx_vddcore_volt_data[] = { |
101 | VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD2, 0xf4, 0x0c), | 101 | VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD2, 0xf4, 0x0c), |
102 | VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD2, 0xf9, 0x16), | 102 | VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD2, 0xf9, 0x16), |
103 | VOLT_DATA_DEFINE(0, 0, 0, 0), | 103 | VOLT_DATA_DEFINE(0, 0, 0, 0), |
104 | }; | 104 | }; |
105 | 105 | ||
106 | /* OPP data */ | 106 | /* OPP data */ |
107 | 107 | ||
108 | static struct omap_opp_def __initdata omap34xx_opp_def_list[] = { | 108 | static struct omap_opp_def __initdata omap34xx_opp_def_list[] = { |
109 | /* MPU OPP1 */ | 109 | /* MPU OPP1 */ |
110 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 125000000, OMAP3430_VDD_MPU_OPP1_UV), | 110 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 125000000, OMAP3430_VDD_MPU_OPP1_UV), |
111 | /* MPU OPP2 */ | 111 | /* MPU OPP2 */ |
112 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 250000000, OMAP3430_VDD_MPU_OPP2_UV), | 112 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 250000000, OMAP3430_VDD_MPU_OPP2_UV), |
113 | /* MPU OPP3 */ | 113 | /* MPU OPP3 */ |
114 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 500000000, OMAP3430_VDD_MPU_OPP3_UV), | 114 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 500000000, OMAP3430_VDD_MPU_OPP3_UV), |
115 | /* MPU OPP4 */ | 115 | /* MPU OPP4 */ |
116 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 550000000, OMAP3430_VDD_MPU_OPP4_UV), | 116 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 550000000, OMAP3430_VDD_MPU_OPP4_UV), |
117 | /* MPU OPP5 */ | 117 | /* MPU OPP5 */ |
118 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 600000000, OMAP3430_VDD_MPU_OPP5_UV), | 118 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 600000000, OMAP3430_VDD_MPU_OPP5_UV), |
119 | 119 | ||
120 | /* | 120 | /* |
121 | * L3 OPP1 - 41.5 MHz is disabled because: The voltage for that OPP is | 121 | * L3 OPP1 - 41.5 MHz is disabled because: The voltage for that OPP is |
122 | * almost the same than the one at 83MHz thus providing very little | 122 | * almost the same than the one at 83MHz thus providing very little |
123 | * gain for the power point of view. In term of energy it will even | 123 | * gain for the power point of view. In term of energy it will even |
124 | * increase the consumption due to the very negative performance | 124 | * increase the consumption due to the very negative performance |
125 | * impact that frequency will do to the MPU and the whole system in | 125 | * impact that frequency will do to the MPU and the whole system in |
126 | * general. | 126 | * general. |
127 | */ | 127 | */ |
128 | OPP_INITIALIZER("l3_main", "dpll3_ck", "core", false, 41500000, OMAP3430_VDD_CORE_OPP1_UV), | 128 | OPP_INITIALIZER("l3_main", "dpll3_ck", "core", false, 41500000, OMAP3430_VDD_CORE_OPP1_UV), |
129 | /* L3 OPP2 */ | 129 | /* L3 OPP2 */ |
130 | OPP_INITIALIZER("l3_main", "dpll3_ck", "core", true, 83000000, OMAP3430_VDD_CORE_OPP2_UV), | 130 | OPP_INITIALIZER("l3_main", "dpll3_ck", "core", true, 83000000, OMAP3430_VDD_CORE_OPP2_UV), |
131 | /* L3 OPP3 */ | 131 | /* L3 OPP3 */ |
132 | OPP_INITIALIZER("l3_main", "dpll3_ck", "core", true, 166000000, OMAP3430_VDD_CORE_OPP3_UV), | 132 | OPP_INITIALIZER("l3_main", "dpll3_ck", "core", true, 166000000, OMAP3430_VDD_CORE_OPP3_UV), |
133 | 133 | ||
134 | /* DSP OPP1 */ | 134 | /* DSP OPP1 */ |
135 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 90000000, OMAP3430_VDD_MPU_OPP1_UV), | 135 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 90000000, OMAP3430_VDD_MPU_OPP1_UV), |
136 | /* DSP OPP2 */ | 136 | /* DSP OPP2 */ |
137 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 180000000, OMAP3430_VDD_MPU_OPP2_UV), | 137 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 180000000, OMAP3430_VDD_MPU_OPP2_UV), |
138 | /* DSP OPP3 */ | 138 | /* DSP OPP3 */ |
139 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 360000000, OMAP3430_VDD_MPU_OPP3_UV), | 139 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 360000000, OMAP3430_VDD_MPU_OPP3_UV), |
140 | /* DSP OPP4 */ | 140 | /* DSP OPP4 */ |
141 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 400000000, OMAP3430_VDD_MPU_OPP4_UV), | 141 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 400000000, OMAP3430_VDD_MPU_OPP4_UV), |
142 | /* DSP OPP5 */ | 142 | /* DSP OPP5 */ |
143 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 430000000, OMAP3430_VDD_MPU_OPP5_UV), | 143 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 430000000, OMAP3430_VDD_MPU_OPP5_UV), |
144 | }; | 144 | }; |
145 | 145 | ||
146 | static struct omap_opp_def __initdata omap36xx_opp_def_list[] = { | 146 | static struct omap_opp_def __initdata omap36xx_opp_def_list[] = { |
147 | /* MPU OPP1 - OPP50 */ | 147 | /* MPU OPP1 - OPP50 */ |
148 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 300000000, OMAP3630_VDD_MPU_OPP50_UV), | 148 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 300000000, OMAP3630_VDD_MPU_OPP50_UV), |
149 | /* MPU OPP2 - OPP100 */ | 149 | /* MPU OPP2 - OPP100 */ |
150 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 600000000, OMAP3630_VDD_MPU_OPP100_UV), | 150 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", true, 600000000, OMAP3630_VDD_MPU_OPP100_UV), |
151 | /* MPU OPP3 - OPP-Turbo */ | 151 | /* MPU OPP3 - OPP-Turbo */ |
152 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", false, 800000000, OMAP3630_VDD_MPU_OPP120_UV), | 152 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", false, 800000000, OMAP3630_VDD_MPU_OPP120_UV), |
153 | /* MPU OPP4 - OPP-SB */ | 153 | /* MPU OPP4 - OPP-SB */ |
154 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", false, 1000000000, OMAP3630_VDD_MPU_OPP1G_UV), | 154 | OPP_INITIALIZER("mpu", "dpll1_ck", "mpu_iva", false, 1000000000, OMAP3630_VDD_MPU_OPP1G_UV), |
155 | 155 | ||
156 | /* L3 OPP1 - OPP50 */ | 156 | /* L3 OPP1 - OPP50 */ |
157 | OPP_INITIALIZER("l3_main", "dpll3_ck", "core", true, 100000000, OMAP3630_VDD_CORE_OPP50_UV), | 157 | OPP_INITIALIZER("l3_main", "dpll3_ck", "core", true, 100000000, OMAP3630_VDD_CORE_OPP50_UV), |
158 | /* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */ | 158 | /* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */ |
159 | OPP_INITIALIZER("l3_main", "dpll3_ck", "core", true, 200000000, OMAP3630_VDD_CORE_OPP100_UV), | 159 | OPP_INITIALIZER("l3_main", "dpll3_ck", "core", true, 200000000, OMAP3630_VDD_CORE_OPP100_UV), |
160 | 160 | ||
161 | /* DSP OPP1 - OPP50 */ | 161 | /* DSP OPP1 - OPP50 */ |
162 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 260000000, OMAP3630_VDD_MPU_OPP50_UV), | 162 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 260000000, OMAP3630_VDD_MPU_OPP50_UV), |
163 | /* DSP OPP2 - OPP100 */ | 163 | /* DSP OPP2 - OPP100 */ |
164 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 520000000, OMAP3630_VDD_MPU_OPP100_UV), | 164 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", true, 520000000, OMAP3630_VDD_MPU_OPP100_UV), |
165 | /* DSP OPP3 - OPP-Turbo */ | 165 | /* DSP OPP3 - OPP-Turbo */ |
166 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", false, 660000000, OMAP3630_VDD_MPU_OPP120_UV), | 166 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", false, 660000000, OMAP3630_VDD_MPU_OPP120_UV), |
167 | /* DSP OPP4 - OPP-SB */ | 167 | /* DSP OPP4 - OPP-SB */ |
168 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", false, 800000000, OMAP3630_VDD_MPU_OPP1G_UV), | 168 | OPP_INITIALIZER("iva", "dpll2_ck", "mpu_iva", false, 800000000, OMAP3630_VDD_MPU_OPP1G_UV), |
169 | }; | 169 | }; |
170 | 170 | ||
171 | /* OMAP 3630 MPU Core VDD dependency table */ | 171 | /* OMAP 3630 MPU Core VDD dependency table */ |
172 | static struct omap_vdd_dep_volt omap36xx_vdd_mpu_core_dep_data[] = { | 172 | static struct omap_vdd_dep_volt omap36xx_vdd_mpu_core_dep_data[] = { |
173 | {.main_vdd_volt = OMAP3630_VDD_MPU_OPP50_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP50_UV}, | 173 | {.main_vdd_volt = OMAP3630_VDD_MPU_OPP50_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP50_UV}, |
174 | {.main_vdd_volt = OMAP3630_VDD_MPU_OPP100_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP100_UV}, | 174 | {.main_vdd_volt = OMAP3630_VDD_MPU_OPP100_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP100_UV}, |
175 | {.main_vdd_volt = OMAP3630_VDD_MPU_OPP120_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP100_UV}, | 175 | {.main_vdd_volt = OMAP3630_VDD_MPU_OPP120_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP100_UV}, |
176 | {.main_vdd_volt = OMAP3630_VDD_MPU_OPP1G_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP100_UV}, | 176 | {.main_vdd_volt = OMAP3630_VDD_MPU_OPP1G_UV, .dep_vdd_volt = OMAP3630_VDD_CORE_OPP100_UV}, |
177 | }; | 177 | }; |
178 | 178 | ||
179 | struct omap_vdd_dep_info omap36xx_vddmpu_dep_info[] = { | 179 | struct omap_vdd_dep_info omap36xx_vddmpu_dep_info[] = { |
180 | { | 180 | { |
181 | .name = "core", | 181 | .name = "core", |
182 | .dep_table = omap36xx_vdd_mpu_core_dep_data, | 182 | .dep_table = omap36xx_vdd_mpu_core_dep_data, |
183 | .nr_dep_entries = ARRAY_SIZE(omap36xx_vdd_mpu_core_dep_data), | 183 | .nr_dep_entries = ARRAY_SIZE(omap36xx_vdd_mpu_core_dep_data), |
184 | }, | 184 | }, |
185 | {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, | 185 | {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, |
186 | }; | 186 | }; |
187 | 187 | ||
188 | /* 33xx */ | ||
189 | |||
190 | /* VDD1 */ | ||
191 | |||
192 | #define AM33XX_VDD_MPU_OPP50_UV 950000 | ||
193 | #define AM33XX_VDD_MPU_OPP100_UV 1100000 | ||
194 | #define AM33XX_VDD_MPU_OPP120_UV 1200000 | ||
195 | #define AM33XX_VDD_MPU_OPPTURBO_UV 1260000 | ||
196 | |||
197 | static struct omap_opp_def __initdata am33xx_opp_def_list[] = { | ||
198 | /* MPU OPP1 - OPP50 */ | ||
199 | OPP_INITIALIZER("mpu", "dpll_mpu_ck", "mpu", true, 275000000, AM33XX_VDD_MPU_OPP50_UV), | ||
200 | /* MPU OPP2 - OPP100 */ | ||
201 | OPP_INITIALIZER("mpu", "dpll_mpu_ck", "mpu", true, 500000000, AM33XX_VDD_MPU_OPP100_UV), | ||
202 | /* MPU OPP3 - OPP120 */ | ||
203 | OPP_INITIALIZER("mpu", "dpll_mpu_ck", "mpu", true, 600000000, AM33XX_VDD_MPU_OPP120_UV), | ||
204 | /* MPU OPP4 - OPPTurbo */ | ||
205 | OPP_INITIALIZER("mpu", "dpll_mpu_ck", "mpu", true, 720000000, AM33XX_VDD_MPU_OPPTURBO_UV), | ||
206 | }; | ||
207 | |||
188 | /** | 208 | /** |
189 | * omap3_opp_init() - initialize omap3 opp table | 209 | * omap3_opp_init() - initialize omap3 opp table |
190 | */ | 210 | */ |
191 | int __init omap3_opp_init(void) | 211 | int __init omap3_opp_init(void) |
192 | { | 212 | { |
193 | int r = -ENODEV; | 213 | int r = -ENODEV; |
194 | 214 | ||
195 | if (!cpu_is_omap34xx()) | 215 | if (!cpu_is_omap34xx()) |
196 | return r; | 216 | return r; |
197 | 217 | ||
198 | if (cpu_is_omap3630()) | 218 | if (cpu_is_omap3630()) |
199 | r = omap_init_opp_table(omap36xx_opp_def_list, | 219 | r = omap_init_opp_table(omap36xx_opp_def_list, |
200 | ARRAY_SIZE(omap36xx_opp_def_list)); | 220 | ARRAY_SIZE(omap36xx_opp_def_list)); |
221 | else if (cpu_is_am33xx()) | ||
222 | r = omap_init_opp_table(am33xx_opp_def_list, | ||
223 | ARRAY_SIZE(am33xx_opp_def_list)); | ||
201 | else | 224 | else |
202 | r = omap_init_opp_table(omap34xx_opp_def_list, | 225 | r = omap_init_opp_table(omap34xx_opp_def_list, |
203 | ARRAY_SIZE(omap34xx_opp_def_list)); | 226 | ARRAY_SIZE(omap34xx_opp_def_list)); |
204 | 227 | ||
205 | return r; | 228 | return r; |
206 | } | 229 | } |
207 | device_initcall(omap3_opp_init); | 230 | device_initcall(omap3_opp_init); |
208 | 231 |
arch/arm/mach-omap2/voltagedomains33xx_data.c
1 | /* | 1 | /* |
2 | * AM33XX voltage domain data | 2 | * AM33XX voltage domain data |
3 | * | 3 | * |
4 | * Copyright (C) 2011 Texas Instruments, Inc. | 4 | * Copyright (C) 2011 Texas Instruments, Inc. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/regulator/consumer.h> | ||
12 | 13 | ||
13 | #include <plat/voltage.h> | 14 | #include <plat/voltage.h> |
15 | #include <plat/omap_device.h> | ||
14 | 16 | ||
17 | #include "omap_opp_data.h" | ||
18 | |||
19 | #define TOLERANCE 12500 /* in uV */ | ||
20 | |||
21 | int am33x_mpu_voltdm_scale(struct voltagedomain *voltdm, | ||
22 | unsigned long target_volt) | ||
23 | { | ||
24 | int ret = -EINVAL; | ||
25 | |||
26 | |||
27 | if (!voltdm->regulator) | ||
28 | return ret; | ||
29 | |||
30 | |||
31 | ret = regulator_set_voltage(voltdm->regulator, target_volt, | ||
32 | target_volt + TOLERANCE); | ||
33 | |||
34 | if (ret) | ||
35 | pr_debug("Voltage change failed, ret = %d\n", ret); | ||
36 | else | ||
37 | pr_debug("Voltage scaled to %d\n", | ||
38 | regulator_get_voltage(voltdm->regulator)); | ||
39 | |||
40 | return ret; | ||
41 | } | ||
42 | |||
43 | struct omap_vdd_dep_info am33xx_vddmpu_dep_info[] = { | ||
44 | {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, | ||
45 | }; | ||
46 | |||
47 | static struct omap_vdd_info am33xx_vdd1_info; | ||
48 | |||
49 | int am33x_mpu_voltdm_init(struct voltagedomain *voltdm) | ||
50 | { | ||
51 | struct regulator *mpu_regulator; | ||
52 | struct device *mpu_dev; | ||
53 | |||
54 | mpu_dev = omap_device_get_by_hwmod_name("mpu"); | ||
55 | if (!mpu_dev) { | ||
56 | pr_warning("%s: unable to get the mpu device\n", __func__); | ||
57 | return -EINVAL; | ||
58 | } | ||
59 | |||
60 | mpu_regulator = regulator_get(mpu_dev, voltdm->name); | ||
61 | |||
62 | if (IS_ERR(mpu_regulator)) { | ||
63 | pr_err("%s: Could not get regulator for %s\n", | ||
64 | __func__, voltdm->name); | ||
65 | return -ENODEV; | ||
66 | } else { | ||
67 | voltdm->regulator = mpu_regulator; | ||
68 | voltdm->scale = &am33x_mpu_voltdm_scale; | ||
69 | } | ||
70 | |||
71 | return 0; | ||
72 | } | ||
73 | |||
15 | static struct voltagedomain am33xx_voltdm_mpu = { | 74 | static struct voltagedomain am33xx_voltdm_mpu = { |
16 | .name = "mpu", | 75 | .name = "mpu", |
76 | .scalable = true, | ||
77 | .use_regulator = 1, | ||
78 | .regulator_init = &am33x_mpu_voltdm_init, | ||
79 | .vdd = &am33xx_vdd1_info, | ||
17 | }; | 80 | }; |
18 | 81 | ||
19 | static struct voltagedomain am33xx_voltdm_core = { | 82 | static struct voltagedomain am33xx_voltdm_core = { |
20 | .name = "core", | 83 | .name = "core", |
21 | }; | 84 | }; |
22 | 85 | ||
23 | static struct voltagedomain am33xx_voltdm_rtc = { | 86 | static struct voltagedomain am33xx_voltdm_rtc = { |
24 | .name = "rtc", | 87 | .name = "rtc", |
25 | }; | 88 | }; |
26 | 89 | ||
27 | static struct voltagedomain *voltagedomains_am33xx[] __initdata = { | 90 | static struct voltagedomain *voltagedomains_am33xx[] __initdata = { |
28 | &am33xx_voltdm_mpu, | 91 | &am33xx_voltdm_mpu, |
29 | &am33xx_voltdm_core, | 92 | &am33xx_voltdm_core, |
30 | &am33xx_voltdm_rtc, | 93 | &am33xx_voltdm_rtc, |
31 | NULL, | 94 | NULL, |
32 | }; | 95 | }; |
33 | 96 | ||
97 | static const char *sys_clk_name __initdata = "sys_clkin_ck"; | ||
98 | |||
34 | void __init am33xx_voltagedomains_init(void) | 99 | void __init am33xx_voltagedomains_init(void) |
35 | { | 100 | { |
101 | struct voltagedomain *voltdm; | ||
102 | int i; | ||
103 | |||
104 | am33xx_vdd1_info.dep_vdd_info = am33xx_vddmpu_dep_info; | ||
105 | |||
106 | for (i = 0; voltdm = voltagedomains_am33xx[i], voltdm; i++) | ||
107 | voltdm->sys_clk.name = sys_clk_name; | ||
108 | |||
36 | voltdm_init(voltagedomains_am33xx); | 109 | voltdm_init(voltagedomains_am33xx); |
37 | } | 110 | } |
38 | 111 |