ARM: OMAP4+: Cleanup the clocks layer
[glsdk/glsdk-u-boot.git] / arch / arm / cpu / armv7 / omap4 / clocks.c
1 /*
2  *
3  * Clock initialization for OMAP4
4  *
5  * (C) Copyright 2010
6  * Texas Instruments, <www.ti.com>
7  *
8  * Aneesh V <aneesh@ti.com>
9  *
10  * Based on previous work by:
11  *      Santosh Shilimkar <santosh.shilimkar@ti.com>
12  *      Rajendra Nayak <rnayak@ti.com>
13  *
14  * See file CREDITS for list of people who contributed to this
15  * project.
16  *
17  * This program is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU General Public License as
19  * published by the Free Software Foundation; either version 2 of
20  * the License, or (at your option) any later version.
21  *
22  * This program is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25  * GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with this program; if not, write to the Free Software
29  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
30  * MA 02111-1307 USA
31  */
32 #include <common.h>
33 #include <asm/omap_common.h>
34 #include <asm/gpio.h>
35 #include <asm/arch/clocks.h>
36 #include <asm/arch/sys_proto.h>
37 #include <asm/utils.h>
38 #include <asm/omap_gpio.h>
40 #ifndef CONFIG_SPL_BUILD
41 /*
42  * printing to console doesn't work unless
43  * this code is executed from SPL
44  */
45 #define printf(fmt, args...)
46 #define puts(s)
47 #endif /* !CONFIG_SPL_BUILD */
49 /*
50  * Setup the voltages for vdd_mpu, vdd_core, and vdd_iva
51  * We set the maximum voltages allowed here because Smart-Reflex is not
52  * enabled in bootloader. Voltage initialization in the kernel will set
53  * these to the nominal values after enabling Smart-Reflex
54  */
55 void scale_vcores(void)
56 {
57         u32 volt, omap_rev;
59         omap_vc_init(PRM_VC_I2C_CHANNEL_FREQ_KHZ);
61         omap_rev = omap_revision();
63         /*
64          * Scale Voltage rails:
65          * 1. VDD_CORE
66          * 3. VDD_MPU
67          * 3. VDD_IVA
68          */
69         if (omap_rev < OMAP4460_ES1_0) {
70                 /*
71                  * OMAP4430:
72                  * VDD_CORE = TWL6030 VCORE3
73                  * VDD_MPU = TWL6030 VCORE1
74                  * VDD_IVA = TWL6030 VCORE2
75                  */
76                 volt = 1200;
77                 do_scale_vcore(SMPS_REG_ADDR_VCORE3, volt);
79                 /*
80                  * note on VDD_MPU:
81                  * Setting a high voltage for Nitro mode as smart reflex is not
82                  * enabled. We use the maximum possible value in the AVS range
83                  * because the next higher voltage in the discrete range
84                  * (code >= 0b111010) is way too high.
85                  */
86                 volt = 1325;
87                 do_scale_vcore(SMPS_REG_ADDR_VCORE1, volt);
88                 volt = 1200;
89                 do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
91         } else {
92                 /*
93                  * OMAP4460:
94                  * VDD_CORE = TWL6030 VCORE1
95                  * VDD_MPU = TPS62361
96                  * VDD_IVA = TWL6030 VCORE2
97                  */
98                 volt = 1200;
99                 do_scale_vcore(SMPS_REG_ADDR_VCORE1, volt);
100                 /* TPS62361 */
101                 volt = 1203;
102                 do_scale_tps62361(TPS62361_VSEL0_GPIO,
103                                   TPS62361_REG_ADDR_SET1, volt);
104                 /* VCORE 2 - supplies vdd_iva */
105                 volt = 1200;
106                 do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
107         }
110 u32 get_offset_code(u32 offset)
112         u32 offset_code, step = 12660; /* 12.66 mV represented in uV */
114         if (omap_revision() == OMAP4430_ES1_0)
115                 offset -= PHOENIX_SMPS_BASE_VOLT_STD_MODE_UV;
116         else
117                 offset -= PHOENIX_SMPS_BASE_VOLT_STD_MODE_WITH_OFFSET_UV;
119         offset_code = (offset + step - 1) / step;
121         /* The code starts at 1 not 0 */
122         return ++offset_code;