Commit 4a3f8913f5f89039d97acdd8f896a31ee60a7c78
Committed by
Afzal Mohammed
1 parent
866c74bf7d
Exists in
master
OMAP3+: OPP: add clock and voltagedomain info
With hwmods, ideally, we should have been able to do: pdm = omap_hwmod_get_pwrdm(oh); voltdm = pwrdm_get_voltdm(pdm); clk = clk_get(oh->main_clk); Unfortunately hwmod database is'nt mature enough yet to handle silicon variance within the same family, e.g. 4430 Vs 4460. So we explicitly map the domain and clk names within the OPP entries. This allows us to scale by having a central location for the registration. IMPORTANT NOTE: we probably will need to fix core and iva clk setting. Signed-off-by: Nishanth Menon <nm@ti.com> Signed-off-by: Vishwanath BS <vishwanath.bs@ti.com> [vaibhav.bedia@ti.com: Pull in for AM33xx] Signed-off-by: Vaibhav Bedia <vaibhav.bedia@ti.com>
Showing 3 changed files with 37 additions and 33 deletions Inline Diff
arch/arm/mach-omap2/omap_opp_data.h
1 | /* | 1 | /* |
2 | * OMAP SoC specific OPP Data helpers | 2 | * OMAP SoC specific OPP Data helpers |
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 Nokia Corporation. | 7 | * Copyright (C) 2010 Nokia Corporation. |
8 | * Eduardo Valentin | 8 | * Eduardo Valentin |
9 | * | 9 | * |
10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
13 | * | 13 | * |
14 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | 14 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any |
15 | * kind, whether express or implied; without even the implied warranty | 15 | * kind, whether express or implied; without even the implied warranty |
16 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 16 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | * GNU General Public License for more details. | 17 | * GNU General Public License for more details. |
18 | */ | 18 | */ |
19 | #ifndef __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H | 19 | #ifndef __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H |
20 | #define __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H | 20 | #define __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H |
21 | 21 | ||
22 | #include <plat/omap_hwmod.h> | 22 | #include <plat/omap_hwmod.h> |
23 | 23 | ||
24 | #include "voltage.h" | 24 | #include "voltage.h" |
25 | 25 | ||
26 | /* | 26 | /* |
27 | * *BIG FAT WARNING*: | 27 | * *BIG FAT WARNING*: |
28 | * USE the following ONLY in opp data initialization common to an SoC. | 28 | * USE the following ONLY in opp data initialization common to an SoC. |
29 | * DO NOT USE these in board files/pm core etc. | 29 | * DO NOT USE these in board files/pm core etc. |
30 | */ | 30 | */ |
31 | 31 | ||
32 | /** | 32 | /** |
33 | * struct omap_opp_def - OMAP OPP Definition | 33 | * struct omap_opp_def - OMAP OPP Definition |
34 | * @hwmod_name: Name of the hwmod for this domain | 34 | * @hwmod_name: Name of the hwmod for this domain |
35 | * @freq: Frequency in hertz corresponding to this OPP | 35 | * @freq: Frequency in hertz corresponding to this OPP |
36 | * @u_volt: Nominal voltage in microvolts corresponding to this OPP | 36 | * @u_volt: Nominal voltage in microvolts corresponding to this OPP |
37 | * @default_available: True/false - is this OPP available by default | 37 | * @default_available: True/false - is this OPP available by default |
38 | * | 38 | * |
39 | * OMAP SOCs have a standard set of tuples consisting of frequency and voltage | 39 | * OMAP SOCs have a standard set of tuples consisting of frequency and voltage |
40 | * pairs that the device will support per voltage domain. This is called | 40 | * pairs that the device will support per voltage domain. This is called |
41 | * Operating Points or OPP. The actual definitions of OMAP Operating Points | 41 | * Operating Points or OPP. The actual definitions of OMAP Operating Points |
42 | * varies over silicon within the same family of devices. For a specific | 42 | * varies over silicon within the same family of devices. For a specific |
43 | * domain, you can have a set of {frequency, voltage} pairs and this is denoted | 43 | * domain, you can have a set of {frequency, voltage} pairs and this is denoted |
44 | * by an array of omap_opp_def. As the kernel boots and more information is | 44 | * by an array of omap_opp_def. As the kernel boots and more information is |
45 | * available, a set of these are activated based on the precise nature of | 45 | * available, a set of these are activated based on the precise nature of |
46 | * device the kernel boots up on. It is interesting to remember that each IP | 46 | * device the kernel boots up on. It is interesting to remember that each IP |
47 | * which belongs to a voltage domain may define their own set of OPPs on top | 47 | * which belongs to a voltage domain may define their own set of OPPs on top |
48 | * of this - but this is handled by the appropriate driver. | 48 | * of this - but this is handled by the appropriate driver. |
49 | */ | 49 | */ |
50 | struct omap_opp_def { | 50 | struct omap_opp_def { |
51 | char *hwmod_name; | 51 | char *hwmod_name; |
52 | char *voltdm_name; | ||
53 | char *clk_name; | ||
52 | 54 | ||
53 | unsigned long freq; | 55 | unsigned long freq; |
54 | unsigned long u_volt; | 56 | unsigned long u_volt; |
55 | 57 | ||
56 | bool default_available; | 58 | bool default_available; |
57 | }; | 59 | }; |
58 | 60 | ||
59 | /* | 61 | /* |
60 | * Initialization wrapper used to define an OPP for OMAP variants. | 62 | * Initialization wrapper used to define an OPP for OMAP variants. |
61 | */ | 63 | */ |
62 | #define OPP_INITIALIZER(_hwmod_name, _enabled, _freq, _uv) \ | 64 | #define OPP_INITIALIZER(_hwmod_name, _clk_name, _voltdm_name, _enabled, _freq, _uv) \ |
63 | { \ | 65 | { \ |
64 | .hwmod_name = _hwmod_name, \ | 66 | .hwmod_name = _hwmod_name, \ |
67 | .clk_name = _clk_name, \ | ||
68 | .voltdm_name = _voltdm_name, \ | ||
65 | .default_available = _enabled, \ | 69 | .default_available = _enabled, \ |
66 | .freq = _freq, \ | 70 | .freq = _freq, \ |
67 | .u_volt = _uv, \ | 71 | .u_volt = _uv, \ |
68 | } | 72 | } |
69 | 73 | ||
70 | /* | 74 | /* |
71 | * Initialization wrapper used to define SmartReflex process data | 75 | * Initialization wrapper used to define SmartReflex process data |
72 | * XXX Is this needed? Just use C99 initializers in data files? | 76 | * XXX Is this needed? Just use C99 initializers in data files? |
73 | */ | 77 | */ |
74 | #define VOLT_DATA_DEFINE(_v_nom, _efuse_offs, _errminlimit, _errgain) \ | 78 | #define VOLT_DATA_DEFINE(_v_nom, _efuse_offs, _errminlimit, _errgain) \ |
75 | { \ | 79 | { \ |
76 | .volt_nominal = _v_nom, \ | 80 | .volt_nominal = _v_nom, \ |
77 | .sr_efuse_offs = _efuse_offs, \ | 81 | .sr_efuse_offs = _efuse_offs, \ |
78 | .sr_errminlimit = _errminlimit, \ | 82 | .sr_errminlimit = _errminlimit, \ |
79 | .vp_errgain = _errgain \ | 83 | .vp_errgain = _errgain \ |
80 | } | 84 | } |
81 | 85 | ||
82 | /* Use this to initialize the default table */ | 86 | /* Use this to initialize the default table */ |
83 | extern int __init omap_init_opp_table(struct omap_opp_def *opp_def, | 87 | extern int __init omap_init_opp_table(struct omap_opp_def *opp_def, |
84 | u32 opp_def_size); | 88 | u32 opp_def_size); |
85 | 89 | ||
86 | 90 | ||
87 | extern struct omap_volt_data omap34xx_vddmpu_volt_data[]; | 91 | extern struct omap_volt_data omap34xx_vddmpu_volt_data[]; |
88 | extern struct omap_volt_data omap34xx_vddcore_volt_data[]; | 92 | extern struct omap_volt_data omap34xx_vddcore_volt_data[]; |
89 | extern struct omap_vdd_dep_info omap34xx_vddmpu_dep_info[]; | 93 | extern struct omap_vdd_dep_info omap34xx_vddmpu_dep_info[]; |
90 | extern struct omap_volt_data omap36xx_vddmpu_volt_data[]; | 94 | extern struct omap_volt_data omap36xx_vddmpu_volt_data[]; |
91 | extern struct omap_volt_data omap36xx_vddcore_volt_data[]; | 95 | extern struct omap_volt_data omap36xx_vddcore_volt_data[]; |
92 | extern struct omap_vdd_dep_info omap36xx_vddmpu_dep_info[]; | 96 | extern struct omap_vdd_dep_info omap36xx_vddmpu_dep_info[]; |
93 | 97 | ||
94 | extern struct omap_volt_data omap44xx_vdd_mpu_volt_data[]; | 98 | extern struct omap_volt_data omap44xx_vdd_mpu_volt_data[]; |
95 | extern struct omap_volt_data omap44xx_vdd_iva_volt_data[]; | 99 | extern struct omap_volt_data omap44xx_vdd_iva_volt_data[]; |
96 | extern struct omap_volt_data omap44xx_vdd_core_volt_data[]; | 100 | extern struct omap_volt_data omap44xx_vdd_core_volt_data[]; |
97 | 101 | ||
98 | extern struct omap_vdd_dep_info omap443x_vddmpu_dep_info[]; | 102 | extern struct omap_vdd_dep_info omap443x_vddmpu_dep_info[]; |
99 | extern struct omap_vdd_dep_info omap443x_vddiva_dep_info[]; | 103 | extern struct omap_vdd_dep_info omap443x_vddiva_dep_info[]; |
100 | 104 | ||
101 | #endif /* __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H */ | 105 | #endif /* __ARCH_ARM_MACH_OMAP2_OMAP_OPP_DATA_H */ |
102 | 106 |
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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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 | /** | 188 | /** |
189 | * omap3_opp_init() - initialize omap3 opp table | 189 | * omap3_opp_init() - initialize omap3 opp table |
190 | */ | 190 | */ |
191 | int __init omap3_opp_init(void) | 191 | int __init omap3_opp_init(void) |
192 | { | 192 | { |
193 | int r = -ENODEV; | 193 | int r = -ENODEV; |
194 | 194 | ||
195 | if (!cpu_is_omap34xx()) | 195 | if (!cpu_is_omap34xx()) |
196 | return r; | 196 | return r; |
197 | 197 | ||
198 | if (cpu_is_omap3630()) | 198 | if (cpu_is_omap3630()) |
199 | r = omap_init_opp_table(omap36xx_opp_def_list, | 199 | r = omap_init_opp_table(omap36xx_opp_def_list, |
200 | ARRAY_SIZE(omap36xx_opp_def_list)); | 200 | ARRAY_SIZE(omap36xx_opp_def_list)); |
201 | else | 201 | else |
202 | r = omap_init_opp_table(omap34xx_opp_def_list, | 202 | r = omap_init_opp_table(omap34xx_opp_def_list, |
203 | ARRAY_SIZE(omap34xx_opp_def_list)); | 203 | ARRAY_SIZE(omap34xx_opp_def_list)); |
204 | 204 | ||
205 | return r; | 205 | return r; |
206 | } | 206 | } |
207 | device_initcall(omap3_opp_init); | 207 | device_initcall(omap3_opp_init); |
208 | 208 |
arch/arm/mach-omap2/opp4xxx_data.c
1 | /* | 1 | /* |
2 | * OMAP4 OPP table definitions. | 2 | * OMAP4 OPP table definitions. |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ | 4 | * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ |
5 | * Nishanth Menon | 5 | * Nishanth Menon |
6 | * Kevin Hilman | 6 | * Kevin Hilman |
7 | * Thara Gopinath | 7 | * Thara Gopinath |
8 | * Copyright (C) 2010-2011 Nokia Corporation. | 8 | * Copyright (C) 2010-2011 Nokia Corporation. |
9 | * Eduardo Valentin | 9 | * Eduardo Valentin |
10 | * Paul Walmsley | 10 | * Paul Walmsley |
11 | * | 11 | * |
12 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
13 | * it under the terms of the GNU General Public License version 2 as | 13 | * it under the terms of the GNU General Public License version 2 as |
14 | * published by the Free Software Foundation. | 14 | * published by the Free Software Foundation. |
15 | * | 15 | * |
16 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | 16 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any |
17 | * kind, whether express or implied; without even the implied warranty | 17 | * kind, whether express or implied; without even the implied warranty |
18 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 18 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 | * GNU General Public License for more details. | 19 | * GNU General Public License for more details. |
20 | */ | 20 | */ |
21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
22 | 22 | ||
23 | #include <plat/cpu.h> | 23 | #include <plat/cpu.h> |
24 | 24 | ||
25 | #include "control.h" | 25 | #include "control.h" |
26 | #include "omap_opp_data.h" | 26 | #include "omap_opp_data.h" |
27 | #include "pm.h" | 27 | #include "pm.h" |
28 | 28 | ||
29 | /* | 29 | /* |
30 | * Structures containing OMAP4430 voltage supported and various | 30 | * Structures containing OMAP4430 voltage supported and various |
31 | * voltage dependent data for each VDD. | 31 | * voltage dependent data for each VDD. |
32 | */ | 32 | */ |
33 | 33 | ||
34 | #define OMAP4430_VDD_MPU_OPP50_UV 1025000 | 34 | #define OMAP4430_VDD_MPU_OPP50_UV 1025000 |
35 | #define OMAP4430_VDD_MPU_OPP100_UV 1200000 | 35 | #define OMAP4430_VDD_MPU_OPP100_UV 1200000 |
36 | #define OMAP4430_VDD_MPU_OPPTURBO_UV 1313000 | 36 | #define OMAP4430_VDD_MPU_OPPTURBO_UV 1313000 |
37 | #define OMAP4430_VDD_MPU_OPPNITRO_UV 1375000 | 37 | #define OMAP4430_VDD_MPU_OPPNITRO_UV 1375000 |
38 | 38 | ||
39 | struct omap_volt_data omap44xx_vdd_mpu_volt_data[] = { | 39 | struct omap_volt_data omap44xx_vdd_mpu_volt_data[] = { |
40 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP50_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c), | 40 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP50_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP50, 0xf4, 0x0c), |
41 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP100_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP100, 0xf9, 0x16), | 41 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPP100_UV, OMAP44XX_CONTROL_FUSE_MPU_OPP100, 0xf9, 0x16), |
42 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO, 0xfa, 0x23), | 42 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPTURBO, 0xfa, 0x23), |
43 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPNITRO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO, 0xfa, 0x27), | 43 | VOLT_DATA_DEFINE(OMAP4430_VDD_MPU_OPPNITRO_UV, OMAP44XX_CONTROL_FUSE_MPU_OPPNITRO, 0xfa, 0x27), |
44 | VOLT_DATA_DEFINE(0, 0, 0, 0), | 44 | VOLT_DATA_DEFINE(0, 0, 0, 0), |
45 | }; | 45 | }; |
46 | 46 | ||
47 | #define OMAP4430_VDD_IVA_OPP50_UV 1013000 | 47 | #define OMAP4430_VDD_IVA_OPP50_UV 1013000 |
48 | #define OMAP4430_VDD_IVA_OPP100_UV 1188000 | 48 | #define OMAP4430_VDD_IVA_OPP100_UV 1188000 |
49 | #define OMAP4430_VDD_IVA_OPPTURBO_UV 1300000 | 49 | #define OMAP4430_VDD_IVA_OPPTURBO_UV 1300000 |
50 | 50 | ||
51 | struct omap_volt_data omap44xx_vdd_iva_volt_data[] = { | 51 | struct omap_volt_data omap44xx_vdd_iva_volt_data[] = { |
52 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP50_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c), | 52 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP50_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP50, 0xf4, 0x0c), |
53 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP100_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP100, 0xf9, 0x16), | 53 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPP100_UV, OMAP44XX_CONTROL_FUSE_IVA_OPP100, 0xf9, 0x16), |
54 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO, 0xfa, 0x23), | 54 | VOLT_DATA_DEFINE(OMAP4430_VDD_IVA_OPPTURBO_UV, OMAP44XX_CONTROL_FUSE_IVA_OPPTURBO, 0xfa, 0x23), |
55 | VOLT_DATA_DEFINE(0, 0, 0, 0), | 55 | VOLT_DATA_DEFINE(0, 0, 0, 0), |
56 | }; | 56 | }; |
57 | 57 | ||
58 | #define OMAP4430_VDD_CORE_OPP50_UV 1025000 | 58 | #define OMAP4430_VDD_CORE_OPP50_UV 1025000 |
59 | #define OMAP4430_VDD_CORE_OPP100_UV 1200000 | 59 | #define OMAP4430_VDD_CORE_OPP100_UV 1200000 |
60 | 60 | ||
61 | struct omap_volt_data omap44xx_vdd_core_volt_data[] = { | 61 | struct omap_volt_data omap44xx_vdd_core_volt_data[] = { |
62 | VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP50_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP50, 0xf4, 0x0c), | 62 | VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP50_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP50, 0xf4, 0x0c), |
63 | VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP100_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP100, 0xf9, 0x16), | 63 | VOLT_DATA_DEFINE(OMAP4430_VDD_CORE_OPP100_UV, OMAP44XX_CONTROL_FUSE_CORE_OPP100, 0xf9, 0x16), |
64 | VOLT_DATA_DEFINE(0, 0, 0, 0), | 64 | VOLT_DATA_DEFINE(0, 0, 0, 0), |
65 | }; | 65 | }; |
66 | 66 | ||
67 | /* Dependency of domains are as follows for OMAP4430 (OPP based): | 67 | /* Dependency of domains are as follows for OMAP4430 (OPP based): |
68 | * | 68 | * |
69 | * MPU IVA CORE | 69 | * MPU IVA CORE |
70 | * 50 50 50+ | 70 | * 50 50 50+ |
71 | * 50 100+ 100 | 71 | * 50 100+ 100 |
72 | * 100+ 50 100 | 72 | * 100+ 50 100 |
73 | * 100+ 100+ 100 | 73 | * 100+ 100+ 100 |
74 | */ | 74 | */ |
75 | 75 | ||
76 | /* OMAP 4430 MPU Core VDD dependency table */ | 76 | /* OMAP 4430 MPU Core VDD dependency table */ |
77 | static struct omap_vdd_dep_volt omap443x_vdd_mpu_core_dep_data[] = { | 77 | static struct omap_vdd_dep_volt omap443x_vdd_mpu_core_dep_data[] = { |
78 | {.main_vdd_volt = OMAP4430_VDD_MPU_OPP50_UV, .dep_vdd_volt = OMAP4430_VDD_MPU_OPP50_UV}, | 78 | {.main_vdd_volt = OMAP4430_VDD_MPU_OPP50_UV, .dep_vdd_volt = OMAP4430_VDD_MPU_OPP50_UV}, |
79 | {.main_vdd_volt = OMAP4430_VDD_MPU_OPP100_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, | 79 | {.main_vdd_volt = OMAP4430_VDD_MPU_OPP100_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, |
80 | {.main_vdd_volt = OMAP4430_VDD_MPU_OPPTURBO_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, | 80 | {.main_vdd_volt = OMAP4430_VDD_MPU_OPPTURBO_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, |
81 | {.main_vdd_volt = OMAP4430_VDD_MPU_OPPNITRO_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, | 81 | {.main_vdd_volt = OMAP4430_VDD_MPU_OPPNITRO_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, |
82 | }; | 82 | }; |
83 | 83 | ||
84 | struct omap_vdd_dep_info omap443x_vddmpu_dep_info[] = { | 84 | struct omap_vdd_dep_info omap443x_vddmpu_dep_info[] = { |
85 | { | 85 | { |
86 | .name = "core", | 86 | .name = "core", |
87 | .dep_table = omap443x_vdd_mpu_core_dep_data, | 87 | .dep_table = omap443x_vdd_mpu_core_dep_data, |
88 | .nr_dep_entries = ARRAY_SIZE(omap443x_vdd_mpu_core_dep_data), | 88 | .nr_dep_entries = ARRAY_SIZE(omap443x_vdd_mpu_core_dep_data), |
89 | }, | 89 | }, |
90 | {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, | 90 | {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, |
91 | }; | 91 | }; |
92 | 92 | ||
93 | /* OMAP 4430 MPU IVA VDD dependency table */ | 93 | /* OMAP 4430 MPU IVA VDD dependency table */ |
94 | static struct omap_vdd_dep_volt omap443x_vdd_iva_core_dep_data[] = { | 94 | static struct omap_vdd_dep_volt omap443x_vdd_iva_core_dep_data[] = { |
95 | {.main_vdd_volt = OMAP4430_VDD_IVA_OPP50_UV, .dep_vdd_volt = OMAP4430_VDD_MPU_OPP50_UV}, | 95 | {.main_vdd_volt = OMAP4430_VDD_IVA_OPP50_UV, .dep_vdd_volt = OMAP4430_VDD_MPU_OPP50_UV}, |
96 | {.main_vdd_volt = OMAP4430_VDD_IVA_OPP100_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, | 96 | {.main_vdd_volt = OMAP4430_VDD_IVA_OPP100_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, |
97 | {.main_vdd_volt = OMAP4430_VDD_IVA_OPPTURBO_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, | 97 | {.main_vdd_volt = OMAP4430_VDD_IVA_OPPTURBO_UV, .dep_vdd_volt = OMAP4430_VDD_CORE_OPP100_UV}, |
98 | }; | 98 | }; |
99 | 99 | ||
100 | struct omap_vdd_dep_info omap443x_vddiva_dep_info[] = { | 100 | struct omap_vdd_dep_info omap443x_vddiva_dep_info[] = { |
101 | { | 101 | { |
102 | .name = "core", | 102 | .name = "core", |
103 | .dep_table = omap443x_vdd_iva_core_dep_data, | 103 | .dep_table = omap443x_vdd_iva_core_dep_data, |
104 | .nr_dep_entries = ARRAY_SIZE(omap443x_vdd_iva_core_dep_data), | 104 | .nr_dep_entries = ARRAY_SIZE(omap443x_vdd_iva_core_dep_data), |
105 | }, | 105 | }, |
106 | {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, | 106 | {.name = NULL, .dep_table = NULL, .nr_dep_entries = 0}, |
107 | }; | 107 | }; |
108 | 108 | ||
109 | static struct omap_opp_def __initdata omap44xx_opp_def_list[] = { | 109 | static struct omap_opp_def __initdata omap44xx_opp_def_list[] = { |
110 | /* MPU OPP1 - OPP50 */ | 110 | /* MPU OPP1 - OPP50 */ |
111 | OPP_INITIALIZER("mpu", true, 300000000, OMAP4430_VDD_MPU_OPP50_UV), | 111 | OPP_INITIALIZER("mpu", "dpll_mpu_ck", "mpu", true, 300000000, OMAP4430_VDD_MPU_OPP50_UV), |
112 | /* MPU OPP2 - OPP100 */ | 112 | /* MPU OPP2 - OPP100 */ |
113 | OPP_INITIALIZER("mpu", true, 600000000, OMAP4430_VDD_MPU_OPP100_UV), | 113 | OPP_INITIALIZER("mpu", "dpll_mpu_ck", "mpu", true, 600000000, OMAP4430_VDD_MPU_OPP100_UV), |
114 | /* MPU OPP3 - OPP-Turbo */ | 114 | /* MPU OPP3 - OPP-Turbo */ |
115 | OPP_INITIALIZER("mpu", true, 800000000, OMAP4430_VDD_MPU_OPPTURBO_UV), | 115 | OPP_INITIALIZER("mpu", "dpll_mpu_ck", "mpu", true, 800000000, OMAP4430_VDD_MPU_OPPTURBO_UV), |
116 | /* MPU OPP4 - OPP-SB */ | 116 | /* MPU OPP4 - OPP-SB */ |
117 | OPP_INITIALIZER("mpu", true, 1008000000, OMAP4430_VDD_MPU_OPPNITRO_UV), | 117 | OPP_INITIALIZER("mpu", "dpll_mpu_ck", "mpu", true, 1008000000, OMAP4430_VDD_MPU_OPPNITRO_UV), |
118 | /* L3 OPP1 - OPP50 */ | 118 | /* L3 OPP1 - OPP50 */ |
119 | OPP_INITIALIZER("l3_main_1", true, 100000000, OMAP4430_VDD_CORE_OPP50_UV), | 119 | OPP_INITIALIZER("l3_main_1", "dpll_core_m5x2_ck", "core", true, 100000000, OMAP4430_VDD_CORE_OPP50_UV), |
120 | /* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */ | 120 | /* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */ |
121 | OPP_INITIALIZER("l3_main_1", true, 200000000, OMAP4430_VDD_CORE_OPP100_UV), | 121 | OPP_INITIALIZER("l3_main_1", "dpll_core_m5x2_ck", "core", true, 200000000, OMAP4430_VDD_CORE_OPP100_UV), |
122 | /* IVA OPP1 - OPP50 */ | 122 | /* IVA OPP1 - OPP50 */ |
123 | OPP_INITIALIZER("iva", true, 133000000, OMAP4430_VDD_IVA_OPP50_UV), | 123 | OPP_INITIALIZER("iva", "dpll_iva_m5x2_ck", "iva", true, 133000000, OMAP4430_VDD_IVA_OPP50_UV), |
124 | /* IVA OPP2 - OPP100 */ | 124 | /* IVA OPP2 - OPP100 */ |
125 | OPP_INITIALIZER("iva", true, 266100000, OMAP4430_VDD_IVA_OPP100_UV), | 125 | OPP_INITIALIZER("iva", "dpll_iva_m5x2_ck", "iva", true, 266100000, OMAP4430_VDD_IVA_OPP100_UV), |
126 | /* IVA OPP3 - OPP-Turbo */ | 126 | /* IVA OPP3 - OPP-Turbo */ |
127 | OPP_INITIALIZER("iva", false, 332000000, OMAP4430_VDD_IVA_OPPTURBO_UV), | 127 | OPP_INITIALIZER("iva", "dpll_iva_m5x2_ck", "iva", false, 332000000, OMAP4430_VDD_IVA_OPPTURBO_UV), |
128 | /* TODO: add DSP, aess, fdif, gpu */ | 128 | /* TODO: add DSP, aess, fdif, gpu */ |
129 | }; | 129 | }; |
130 | 130 | ||
131 | /** | 131 | /** |
132 | * omap4_opp_init() - initialize omap4 opp table | 132 | * omap4_opp_init() - initialize omap4 opp table |
133 | */ | 133 | */ |
134 | int __init omap4_opp_init(void) | 134 | int __init omap4_opp_init(void) |
135 | { | 135 | { |
136 | int r = -ENODEV; | 136 | int r = -ENODEV; |
137 | 137 | ||
138 | if (!cpu_is_omap44xx()) | 138 | if (!cpu_is_omap44xx()) |
139 | return r; | 139 | return r; |
140 | 140 | ||
141 | r = omap_init_opp_table(omap44xx_opp_def_list, | 141 | r = omap_init_opp_table(omap44xx_opp_def_list, |
142 | ARRAY_SIZE(omap44xx_opp_def_list)); | 142 | ARRAY_SIZE(omap44xx_opp_def_list)); |
143 | 143 | ||
144 | return r; | 144 | return r; |
145 | } | 145 | } |
146 | device_initcall(omap4_opp_init); | 146 | device_initcall(omap4_opp_init); |
147 | 147 |