blob: 53c32a799e082e8f7ee6f26c81dcceb6198807ec [file] [log] [blame]
Brian Swetland9a477532009-01-01 11:40:02 -08001/*
2 * Copyright (c) 2008, Google Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include <debug.h>
30#include <reg.h>
31
32#include <platform/iomap.h>
33
34#define ACPU_CLK 0 /* Applications processor clock */
35#define ADM_CLK 1 /* Applications data mover clock */
36#define ADSP_CLK 2 /* ADSP clock */
37#define EBI1_CLK 3 /* External bus interface 1 clock */
38#define EBI2_CLK 4 /* External bus interface 2 clock */
39#define ECODEC_CLK 5 /* External CODEC clock */
40#define EMDH_CLK 6 /* External MDDI host clock */
41#define GP_CLK 7 /* General purpose clock */
42#define GRP_CLK 8 /* Graphics clock */
43#define I2C_CLK 9 /* I2C clock */
44#define ICODEC_RX_CLK 10 /* Internal CODEX RX clock */
45#define ICODEC_TX_CLK 11 /* Internal CODEX TX clock */
46#define IMEM_CLK 12 /* Internal graphics memory clock */
47#define MDC_CLK 13 /* MDDI client clock */
48#define MDP_CLK 14 /* Mobile display processor clock */
49#define PBUS_CLK 15 /* Peripheral bus clock */
50#define PCM_CLK 16 /* PCM clock */
51#define PMDH_CLK 17 /* Primary MDDI host clock */
52#define SDAC_CLK 18 /* Stereo DAC clock */
53#define SDC1_CLK 19 /* Secure Digital Card clocks */
54#define SDC1_PCLK 20
55#define SDC2_CLK 21
56#define SDC2_PCLK 22
57#define SDC3_CLK 23
58#define SDC3_PCLK 24
59#define SDC4_CLK 25
60#define SDC4_PCLK 26
61#define TSIF_CLK 27 /* Transport Stream Interface clocks */
62#define TSIF_REF_CLK 28
63#define TV_DAC_CLK 29 /* TV clocks */
64#define TV_ENC_CLK 30
65#define UART1_CLK 31 /* UART clocks */
66#define UART2_CLK 32
67#define UART3_CLK 33
68#define UART1DM_CLK 34
69#define UART2DM_CLK 35
70#define USB_HS_CLK 36 /* High speed USB core clock */
71#define USB_HS_PCLK 37 /* High speed USB pbus clock */
72#define USB_OTG_CLK 38 /* Full speed USB clock */
73#define VDC_CLK 39 /* Video controller clock */
74#define VFE_CLK 40 /* Camera / Video Front End clock */
75#define VFE_MDC_CLK 41 /* VFE MDDI client clock */
76
77/* qsd8k adds... */
78#define MDP_LCDC_PCLK_CLK 42
79#define MDP_LCDC_PAD_PCLK_CLK 43
80#define MDP_VSYNC_CLK 44
81
82enum {
83 PCOM_CMD_IDLE = 0x0,
84 PCOM_CMD_DONE,
85 PCOM_RESET_APPS,
86 PCOM_RESET_CHIP,
87 PCOM_CONFIG_NAND_MPU,
88 PCOM_CONFIG_USB_CLKS,
89 PCOM_GET_POWER_ON_STATUS,
90 PCOM_GET_WAKE_UP_STATUS,
91 PCOM_GET_BATT_LEVEL,
92 PCOM_CHG_IS_CHARGING,
93 PCOM_POWER_DOWN,
94 PCOM_USB_PIN_CONFIG,
95 PCOM_USB_PIN_SEL,
96 PCOM_SET_RTC_ALARM,
97 PCOM_NV_READ,
98 PCOM_NV_WRITE,
99 PCOM_GET_UUID_HIGH,
100 PCOM_GET_UUID_LOW,
101 PCOM_GET_HW_ENTROPY,
102 PCOM_RPC_GPIO_TLMM_CONFIG_REMOTE,
103 PCOM_CLKCTL_RPC_ENABLE,
104 PCOM_CLKCTL_RPC_DISABLE,
105 PCOM_CLKCTL_RPC_RESET,
106 PCOM_CLKCTL_RPC_SET_FLAGS,
107 PCOM_CLKCTL_RPC_SET_RATE,
108 PCOM_CLKCTL_RPC_MIN_RATE,
109 PCOM_CLKCTL_RPC_MAX_RATE,
110 PCOM_CLKCTL_RPC_RATE,
111 PCOM_CLKCTL_RPC_PLL_REQUEST,
112 PCOM_CLKCTL_RPC_ENABLED,
113 PCOM_VREG_SWITCH,
114 PCOM_VREG_SET_LEVEL,
115 PCOM_GPIO_TLMM_CONFIG_GROUP,
116 PCOM_GPIO_TLMM_UNCONFIG_GROUP,
117 PCOM_NV_READ_HIGH_BITS,
118 PCOM_NV_WRITE_HIGH_BITS,
119 PCOM_NUM_CMDS,
120};
121
122enum {
123 PCOM_INVALID_STATUS = 0x0,
124 PCOM_READY,
125 PCOM_CMD_RUNNING,
126 PCOM_CMD_SUCCESS,
127 PCOM_CMD_FAIL,
128};
129
130#define MSM_A2M_INT(n) (MSM_CSR_BASE + 0x400 + (n) * 4)
131
132static inline void notify_other_proc_comm(void)
133{
134 writel(1, MSM_A2M_INT(6));
135}
136
137#define APP_COMMAND (MSM_SHARED_BASE + 0x00)
138#define APP_STATUS (MSM_SHARED_BASE + 0x04)
139#define APP_DATA1 (MSM_SHARED_BASE + 0x08)
140#define APP_DATA2 (MSM_SHARED_BASE + 0x0C)
141
142#define MDM_COMMAND (MSM_SHARED_BASE + 0x10)
143#define MDM_STATUS (MSM_SHARED_BASE + 0x14)
144#define MDM_DATA1 (MSM_SHARED_BASE + 0x18)
145#define MDM_DATA2 (MSM_SHARED_BASE + 0x1C)
146
147int msm_proc_comm(unsigned cmd, unsigned *data1, unsigned *data2)
148{
149 int ret = -1;
150 unsigned status;
151
152// dprintf(INFO, "proc_comm(%d,%d,%d)\n",
153// cmd, data1 ? *data1 : 0, data2 ? *data2 : 0);
154 while (readl(MDM_STATUS) != PCOM_READY) {
155 /* XXX check for A9 reset */
156 }
157
158 writel(cmd, APP_COMMAND);
159 if (data1)
160 writel(*data1, APP_DATA1);
161 if (data2)
162 writel(*data2, APP_DATA2);
163
164// dprintf(INFO, "proc_comm tx\n");
165 notify_other_proc_comm();
166 while (readl(APP_COMMAND) != PCOM_CMD_DONE) {
167 /* XXX check for A9 reset */
168 }
169
170 status = readl(APP_STATUS);
171// dprintf(INFO, "proc_comm status %d\n", status);
172
173 if (status != PCOM_CMD_FAIL) {
174 if (data1)
175 *data1 = readl(APP_DATA1);
176 if (data2)
177 *data2 = readl(APP_DATA2);
178 ret = 0;
179 }
180
181 return ret;
182}
183
184static int clock_enable(unsigned id)
185{
186 return msm_proc_comm(PCOM_CLKCTL_RPC_ENABLE, &id, 0);
187}
188
189static int clock_disable(unsigned id)
190{
191 return msm_proc_comm(PCOM_CLKCTL_RPC_DISABLE, &id, 0);
192}
193
194static int clock_set_rate(unsigned id, unsigned rate)
195{
196 return msm_proc_comm(PCOM_CLKCTL_RPC_SET_RATE, &id, &rate);
197}
198
199void lcdc_clock_init(unsigned rate)
200{
201 clock_enable(100);
202
203 clock_enable(MDP_LCDC_PCLK_CLK);
204 clock_enable(MDP_LCDC_PAD_PCLK_CLK);
205
206 clock_set_rate(MDP_LCDC_PCLK_CLK, rate);
207 clock_set_rate(MDP_LCDC_PAD_PCLK_CLK, rate);
208
209 clock_enable(MDP_CLK);
210}
211
212void uart3_clock_init(void)
213{
214 clock_enable(UART3_CLK);
215 clock_set_rate(UART3_CLK, 19200000 / 4);
216}
Brian Swetland977224f2009-01-02 01:33:04 -0800217
218void hsusb_clock_init(void)
219{
220 clock_enable(USB_HS_CLK);
221 clock_enable(USB_HS_PCLK);
222}