1fd1478cdSNishanth Menon /*
2fd1478cdSNishanth Menon  * OMAP3 OPP table definitions.
3fd1478cdSNishanth Menon  *
4fd1478cdSNishanth Menon  * Copyright (C) 2009-2010 Texas Instruments Incorporated - http://www.ti.com/
5fd1478cdSNishanth Menon  *	Nishanth Menon
6fd1478cdSNishanth Menon  *	Kevin Hilman
7c0718df4SPaul Walmsley  * Copyright (C) 2010-2011 Nokia Corporation.
8fd1478cdSNishanth Menon  *      Eduardo Valentin
9c0718df4SPaul Walmsley  *      Paul Walmsley
10fd1478cdSNishanth Menon  *
11fd1478cdSNishanth Menon  * This program is free software; you can redistribute it and/or modify
12fd1478cdSNishanth Menon  * it under the terms of the GNU General Public License version 2 as
13fd1478cdSNishanth Menon  * published by the Free Software Foundation.
14fd1478cdSNishanth Menon  *
15fd1478cdSNishanth Menon  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
16fd1478cdSNishanth Menon  * kind, whether express or implied; without even the implied warranty
17fd1478cdSNishanth Menon  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18fd1478cdSNishanth Menon  * GNU General Public License for more details.
19fd1478cdSNishanth Menon  */
20fd1478cdSNishanth Menon #include <linux/module.h>
21fd1478cdSNishanth Menon 
22e4c060dbSTony Lindgren #include "soc.h"
23c0718df4SPaul Walmsley #include "control.h"
24fd1478cdSNishanth Menon #include "omap_opp_data.h"
25eb05ead9SMenon, Nishanth #include "pm.h"
26fd1478cdSNishanth Menon 
27c0718df4SPaul Walmsley /* 34xx */
28c0718df4SPaul Walmsley 
29c0718df4SPaul Walmsley /* VDD1 */
30c0718df4SPaul Walmsley 
31c0718df4SPaul Walmsley #define OMAP3430_VDD_MPU_OPP1_UV		975000
32c0718df4SPaul Walmsley #define OMAP3430_VDD_MPU_OPP2_UV		1075000
33c0718df4SPaul Walmsley #define OMAP3430_VDD_MPU_OPP3_UV		1200000
34c0718df4SPaul Walmsley #define OMAP3430_VDD_MPU_OPP4_UV		1270000
35c0718df4SPaul Walmsley #define OMAP3430_VDD_MPU_OPP5_UV		1350000
36c0718df4SPaul Walmsley 
37c0718df4SPaul Walmsley struct omap_volt_data omap34xx_vddmpu_volt_data[] = {
38c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD1, 0xf4, 0x0c),
39c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD1, 0xf4, 0x0c),
40c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD1, 0xf9, 0x18),
41c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP4_UV, OMAP343X_CONTROL_FUSE_OPP4_VDD1, 0xf9, 0x18),
42c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3430_VDD_MPU_OPP5_UV, OMAP343X_CONTROL_FUSE_OPP5_VDD1, 0xf9, 0x18),
43c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(0, 0, 0, 0),
44c0718df4SPaul Walmsley };
45c0718df4SPaul Walmsley 
46c0718df4SPaul Walmsley /* VDD2 */
47c0718df4SPaul Walmsley 
48c0718df4SPaul Walmsley #define OMAP3430_VDD_CORE_OPP1_UV		975000
49c0718df4SPaul Walmsley #define OMAP3430_VDD_CORE_OPP2_UV		1050000
50c0718df4SPaul Walmsley #define OMAP3430_VDD_CORE_OPP3_UV		1150000
51c0718df4SPaul Walmsley 
52c0718df4SPaul Walmsley struct omap_volt_data omap34xx_vddcore_volt_data[] = {
53c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP1_UV, OMAP343X_CONTROL_FUSE_OPP1_VDD2, 0xf4, 0x0c),
54c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP2_UV, OMAP343X_CONTROL_FUSE_OPP2_VDD2, 0xf4, 0x0c),
55c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3430_VDD_CORE_OPP3_UV, OMAP343X_CONTROL_FUSE_OPP3_VDD2, 0xf9, 0x18),
56c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(0, 0, 0, 0),
57c0718df4SPaul Walmsley };
58c0718df4SPaul Walmsley 
59c0718df4SPaul Walmsley /* 36xx */
60c0718df4SPaul Walmsley 
61c0718df4SPaul Walmsley /* VDD1 */
62c0718df4SPaul Walmsley 
63c0718df4SPaul Walmsley #define OMAP3630_VDD_MPU_OPP50_UV		1012500
64c0718df4SPaul Walmsley #define OMAP3630_VDD_MPU_OPP100_UV		1200000
65c0718df4SPaul Walmsley #define OMAP3630_VDD_MPU_OPP120_UV		1325000
66c0718df4SPaul Walmsley #define OMAP3630_VDD_MPU_OPP1G_UV		1375000
67c0718df4SPaul Walmsley 
68c0718df4SPaul Walmsley struct omap_volt_data omap36xx_vddmpu_volt_data[] = {
69c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD1, 0xf4, 0x0c),
70c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD1, 0xf9, 0x16),
71c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP120_UV, OMAP3630_CONTROL_FUSE_OPP120_VDD1, 0xfa, 0x23),
72c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3630_VDD_MPU_OPP1G_UV, OMAP3630_CONTROL_FUSE_OPP1G_VDD1, 0xfa, 0x27),
73c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(0, 0, 0, 0),
74c0718df4SPaul Walmsley };
75c0718df4SPaul Walmsley 
76c0718df4SPaul Walmsley /* VDD2 */
77c0718df4SPaul Walmsley 
78c0718df4SPaul Walmsley #define OMAP3630_VDD_CORE_OPP50_UV		1000000
79c0718df4SPaul Walmsley #define OMAP3630_VDD_CORE_OPP100_UV		1200000
80c0718df4SPaul Walmsley 
81c0718df4SPaul Walmsley struct omap_volt_data omap36xx_vddcore_volt_data[] = {
82c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP50_UV, OMAP3630_CONTROL_FUSE_OPP50_VDD2, 0xf4, 0x0c),
83c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(OMAP3630_VDD_CORE_OPP100_UV, OMAP3630_CONTROL_FUSE_OPP100_VDD2, 0xf9, 0x16),
84c0718df4SPaul Walmsley 	VOLT_DATA_DEFINE(0, 0, 0, 0),
85c0718df4SPaul Walmsley };
86c0718df4SPaul Walmsley 
87c0718df4SPaul Walmsley /* OPP data */
88c0718df4SPaul Walmsley 
89fd1478cdSNishanth Menon static struct omap_opp_def __initdata omap34xx_opp_def_list[] = {
90fd1478cdSNishanth Menon 	/* MPU OPP1 */
9115f13e23SVishwanath BS 	OPP_INITIALIZER("mpu", true, 125000000, OMAP3430_VDD_MPU_OPP1_UV),
92fd1478cdSNishanth Menon 	/* MPU OPP2 */
9315f13e23SVishwanath BS 	OPP_INITIALIZER("mpu", true, 250000000, OMAP3430_VDD_MPU_OPP2_UV),
94fd1478cdSNishanth Menon 	/* MPU OPP3 */
9515f13e23SVishwanath BS 	OPP_INITIALIZER("mpu", true, 500000000, OMAP3430_VDD_MPU_OPP3_UV),
96fd1478cdSNishanth Menon 	/* MPU OPP4 */
9715f13e23SVishwanath BS 	OPP_INITIALIZER("mpu", true, 550000000, OMAP3430_VDD_MPU_OPP4_UV),
98fd1478cdSNishanth Menon 	/* MPU OPP5 */
9915f13e23SVishwanath BS 	OPP_INITIALIZER("mpu", true, 600000000, OMAP3430_VDD_MPU_OPP5_UV),
100fd1478cdSNishanth Menon 
101fd1478cdSNishanth Menon 	/*
102fd1478cdSNishanth Menon 	 * L3 OPP1 - 41.5 MHz is disabled because: The voltage for that OPP is
103fd1478cdSNishanth Menon 	 * almost the same than the one at 83MHz thus providing very little
104fd1478cdSNishanth Menon 	 * gain for the power point of view. In term of energy it will even
105fd1478cdSNishanth Menon 	 * increase the consumption due to the very negative performance
106fd1478cdSNishanth Menon 	 * impact that frequency will do to the MPU and the whole system in
107fd1478cdSNishanth Menon 	 * general.
108fd1478cdSNishanth Menon 	 */
10915f13e23SVishwanath BS 	OPP_INITIALIZER("l3_main", false, 41500000, OMAP3430_VDD_CORE_OPP1_UV),
110fd1478cdSNishanth Menon 	/* L3 OPP2 */
11115f13e23SVishwanath BS 	OPP_INITIALIZER("l3_main", true, 83000000, OMAP3430_VDD_CORE_OPP2_UV),
112fd1478cdSNishanth Menon 	/* L3 OPP3 */
11315f13e23SVishwanath BS 	OPP_INITIALIZER("l3_main", true, 166000000, OMAP3430_VDD_CORE_OPP3_UV),
114fd1478cdSNishanth Menon 
115fd1478cdSNishanth Menon 	/* DSP OPP1 */
11615f13e23SVishwanath BS 	OPP_INITIALIZER("iva", true, 90000000, OMAP3430_VDD_MPU_OPP1_UV),
117fd1478cdSNishanth Menon 	/* DSP OPP2 */
11815f13e23SVishwanath BS 	OPP_INITIALIZER("iva", true, 180000000, OMAP3430_VDD_MPU_OPP2_UV),
119fd1478cdSNishanth Menon 	/* DSP OPP3 */
12015f13e23SVishwanath BS 	OPP_INITIALIZER("iva", true, 360000000, OMAP3430_VDD_MPU_OPP3_UV),
121fd1478cdSNishanth Menon 	/* DSP OPP4 */
12215f13e23SVishwanath BS 	OPP_INITIALIZER("iva", true, 400000000, OMAP3430_VDD_MPU_OPP4_UV),
123fd1478cdSNishanth Menon 	/* DSP OPP5 */
12415f13e23SVishwanath BS 	OPP_INITIALIZER("iva", true, 430000000, OMAP3430_VDD_MPU_OPP5_UV),
125fd1478cdSNishanth Menon };
126fd1478cdSNishanth Menon 
127fd1478cdSNishanth Menon static struct omap_opp_def __initdata omap36xx_opp_def_list[] = {
128fd1478cdSNishanth Menon 	/* MPU OPP1 - OPP50 */
12915f13e23SVishwanath BS 	OPP_INITIALIZER("mpu", true,  300000000, OMAP3630_VDD_MPU_OPP50_UV),
130fd1478cdSNishanth Menon 	/* MPU OPP2 - OPP100 */
13115f13e23SVishwanath BS 	OPP_INITIALIZER("mpu", true,  600000000, OMAP3630_VDD_MPU_OPP100_UV),
132fd1478cdSNishanth Menon 	/* MPU OPP3 - OPP-Turbo */
13315f13e23SVishwanath BS 	OPP_INITIALIZER("mpu", false, 800000000, OMAP3630_VDD_MPU_OPP120_UV),
134fd1478cdSNishanth Menon 	/* MPU OPP4 - OPP-SB */
13515f13e23SVishwanath BS 	OPP_INITIALIZER("mpu", false, 1000000000, OMAP3630_VDD_MPU_OPP1G_UV),
136fd1478cdSNishanth Menon 
137fd1478cdSNishanth Menon 	/* L3 OPP1 - OPP50 */
13815f13e23SVishwanath BS 	OPP_INITIALIZER("l3_main", true, 100000000, OMAP3630_VDD_CORE_OPP50_UV),
139fd1478cdSNishanth Menon 	/* L3 OPP2 - OPP100, OPP-Turbo, OPP-SB */
14015f13e23SVishwanath BS 	OPP_INITIALIZER("l3_main", true, 200000000, OMAP3630_VDD_CORE_OPP100_UV),
141fd1478cdSNishanth Menon 
142fd1478cdSNishanth Menon 	/* DSP OPP1 - OPP50 */
14315f13e23SVishwanath BS 	OPP_INITIALIZER("iva", true,  260000000, OMAP3630_VDD_MPU_OPP50_UV),
144fd1478cdSNishanth Menon 	/* DSP OPP2 - OPP100 */
14515f13e23SVishwanath BS 	OPP_INITIALIZER("iva", true,  520000000, OMAP3630_VDD_MPU_OPP100_UV),
146fd1478cdSNishanth Menon 	/* DSP OPP3 - OPP-Turbo */
14715f13e23SVishwanath BS 	OPP_INITIALIZER("iva", false, 660000000, OMAP3630_VDD_MPU_OPP120_UV),
148fd1478cdSNishanth Menon 	/* DSP OPP4 - OPP-SB */
14915f13e23SVishwanath BS 	OPP_INITIALIZER("iva", false, 800000000, OMAP3630_VDD_MPU_OPP1G_UV),
150fd1478cdSNishanth Menon };
151fd1478cdSNishanth Menon 
152fd1478cdSNishanth Menon /**
153fd1478cdSNishanth Menon  * omap3_opp_init() - initialize omap3 opp table
154fd1478cdSNishanth Menon  */
155eb05ead9SMenon, Nishanth int __init omap3_opp_init(void)
156fd1478cdSNishanth Menon {
157fd1478cdSNishanth Menon 	int r = -ENODEV;
158fd1478cdSNishanth Menon 
159fd1478cdSNishanth Menon 	if (!cpu_is_omap34xx())
160fd1478cdSNishanth Menon 		return r;
161fd1478cdSNishanth Menon 
162fd1478cdSNishanth Menon 	if (cpu_is_omap3630())
163fd1478cdSNishanth Menon 		r = omap_init_opp_table(omap36xx_opp_def_list,
164fd1478cdSNishanth Menon 			ARRAY_SIZE(omap36xx_opp_def_list));
165fd1478cdSNishanth Menon 	else
166fd1478cdSNishanth Menon 		r = omap_init_opp_table(omap34xx_opp_def_list,
167fd1478cdSNishanth Menon 			ARRAY_SIZE(omap34xx_opp_def_list));
168fd1478cdSNishanth Menon 
169fd1478cdSNishanth Menon 	return r;
170fd1478cdSNishanth Menon }
171fd1478cdSNishanth Menon device_initcall(omap3_opp_init);
172