blob: 3bd773898dd89a22fe9103928fc404be89fdff87 [file] [log] [blame]
Aparna Mallavarapu2269a2f2013-01-07 19:44:48 +05301/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
Amol Jadicd43ea02011-02-15 20:56:04 -08002 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
Amol Jadif34df2f2012-10-19 13:38:16 -070012 * * Neither the name of The Linux Foundation. nor the names of its
Amol Jadicd43ea02011-02-15 20:56:04 -080013 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <debug.h>
30#include <reg.h>
31#include <platform/iomap.h>
Amol Jadic52c8a32011-07-12 11:27:04 -070032#include <platform/gpio.h>
33#include <gsbi.h>
Shashank Mittalb3be37f2012-01-16 22:59:49 -080034#include <dev/pm8921.h>
35#include <sys/types.h>
Amol Jadia63aaff2012-02-01 15:51:50 -080036#include <smem.h>
Amol Jadicd43ea02011-02-15 20:56:04 -080037
38void gpio_tlmm_config(uint32_t gpio, uint8_t func,
Ajay Dudanib01e5062011-12-03 23:23:42 -080039 uint8_t dir, uint8_t pull,
40 uint8_t drvstr, uint32_t enable)
Amol Jadicd43ea02011-02-15 20:56:04 -080041{
Ajay Dudanib01e5062011-12-03 23:23:42 -080042 unsigned int val = 0;
43 val |= pull;
44 val |= func << 2;
45 val |= drvstr << 6;
46 val |= enable << 9;
47 unsigned int *addr = (unsigned int *)GPIO_CONFIG_ADDR(gpio);
48 writel(val, addr);
49 return;
Amol Jadicd43ea02011-02-15 20:56:04 -080050}
51
52void gpio_set(uint32_t gpio, uint32_t dir)
53{
Ajay Dudanib01e5062011-12-03 23:23:42 -080054 unsigned int *addr = (unsigned int *)GPIO_IN_OUT_ADDR(gpio);
55 writel(dir, addr);
56 return;
Amol Jadicd43ea02011-02-15 20:56:04 -080057}
Amol Jadic52c8a32011-07-12 11:27:04 -070058
Amol Jadia63aaff2012-02-01 15:51:50 -080059/* TODO: this and other code below in this file should ideally by in target dir.
60 * keeping it here for this brigup.
61 */
62
Amol Jadic52c8a32011-07-12 11:27:04 -070063/* Configure gpio for uart - based on gsbi id */
64void gpio_config_uart_dm(uint8_t id)
65{
Amol Jadic4263042012-03-29 16:18:11 -070066 if(board_platform_id() == MPQ8064)
67 {
68 switch (id) {
69
70 case GSBI_ID_5:
71 /* configure rx gpio */
Amol Jadif34df2f2012-10-19 13:38:16 -070072 gpio_tlmm_config(52, 2, GPIO_INPUT, GPIO_NO_PULL,
Amol Jadic4263042012-03-29 16:18:11 -070073 GPIO_8MA, GPIO_DISABLE);
74 /* configure tx gpio */
Amol Jadif34df2f2012-10-19 13:38:16 -070075 gpio_tlmm_config(51, 2, GPIO_OUTPUT, GPIO_NO_PULL,
Amol Jadic4263042012-03-29 16:18:11 -070076 GPIO_8MA, GPIO_DISABLE);
77 break;
78
79 default:
80 ASSERT(0);
81 }
82 }
Amol Jadi117ef3a2012-09-20 13:32:55 -070083 else if((board_platform_id() == APQ8064) ||
Aparna Mallavarapu2269a2f2013-01-07 19:44:48 +053084 (board_platform_id() == APQ8064AA) ||
Amol Jadi117ef3a2012-09-20 13:32:55 -070085 (board_platform_id() == APQ8064AB))
Amol Jadia63aaff2012-02-01 15:51:50 -080086 {
87 switch (id) {
Amol Jadi0c04df82011-10-14 17:40:21 -070088
Amol Jadia63aaff2012-02-01 15:51:50 -080089 case GSBI_ID_1:
90 /* configure rx gpio */
91 gpio_tlmm_config(19, 1, GPIO_INPUT, GPIO_NO_PULL,
92 GPIO_8MA, GPIO_DISABLE);
93 /* configure tx gpio */
94 gpio_tlmm_config(18, 1, GPIO_OUTPUT, GPIO_NO_PULL,
95 GPIO_8MA, GPIO_DISABLE);
96 break;
Amol Jadi0c04df82011-10-14 17:40:21 -070097
Amol Jadi0c04df82011-10-14 17:40:21 -070098
Amol Jadia63aaff2012-02-01 15:51:50 -080099 case GSBI_ID_7:
100 /* configure rx gpio */
101 gpio_tlmm_config(83, 1, GPIO_INPUT, GPIO_NO_PULL,
102 GPIO_8MA, GPIO_DISABLE);
103 /* configure tx gpio */
104 gpio_tlmm_config(82, 2, GPIO_OUTPUT, GPIO_NO_PULL,
105 GPIO_8MA, GPIO_DISABLE);
106 break;
107
108 default:
109 ASSERT(0);
110 }
111 }
112 else
113 {
114 switch (id) {
115
116 case GSBI_ID_3:
117 /* configure rx gpio */
118 gpio_tlmm_config(15, 1, GPIO_INPUT, GPIO_NO_PULL,
119 GPIO_8MA, GPIO_DISABLE);
120 /* configure tx gpio */
121 gpio_tlmm_config(14, 1, GPIO_OUTPUT, GPIO_NO_PULL,
122 GPIO_8MA, GPIO_DISABLE);
123 break;
124
125 case GSBI_ID_5:
126 /* configure rx gpio */
127 gpio_tlmm_config(23, 1, GPIO_INPUT, GPIO_NO_PULL,
128 GPIO_8MA, GPIO_DISABLE);
129 /* configure tx gpio */
130 gpio_tlmm_config(22, 1, GPIO_OUTPUT, GPIO_NO_PULL,
131 GPIO_8MA, GPIO_DISABLE);
132 break;
133
Neeti Desai46940292012-07-17 14:28:35 -0700134 case GSBI_ID_8:
135 /* configure rx gpio */
136 gpio_tlmm_config(35, 1, GPIO_INPUT, GPIO_NO_PULL,
137 GPIO_8MA, GPIO_DISABLE);
138 /* configure tx gpio */
139 gpio_tlmm_config(34, 1, GPIO_OUTPUT, GPIO_NO_PULL,
140 GPIO_8MA, GPIO_DISABLE);
141 break;
142
Amol Jadia63aaff2012-02-01 15:51:50 -0800143 default:
144 ASSERT(0);
145 }
Amol Jadic52c8a32011-07-12 11:27:04 -0700146 }
147}
Shashank Mittalb3be37f2012-01-16 22:59:49 -0800148
149struct pm8xxx_gpio_init {
150 uint32_t gpio;
151 struct pm8921_gpio config;
152};
153
154#define PM8XXX_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \
155 _func, _inv, _disable) \
156{ \
157 .gpio = _gpio, \
158 .config = { \
159 .direction = _dir, \
160 .output_buffer = _buf, \
161 .output_value = _val, \
162 .pull = _pull, \
163 .vin_sel = _vin, \
164 .out_strength = _out_strength, \
165 .function = _func, \
166 .inv_int_pol = _inv, \
167 .disable_pin = _disable, \
168 } \
169}
170
171#define PM8XXX_GPIO_OUTPUT(_gpio, _val) \
172 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, 0, _val, \
173 PM_GPIO_PULL_NO, 2, \
174 PM_GPIO_STRENGTH_HIGH, \
175 PM_GPIO_FUNC_NORMAL, 1, 0)
176
177
178#define PM8XXX_GPIO_INPUT(_gpio, _pull) \
179 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, \
180 _pull, 2, \
181 PM_GPIO_STRENGTH_NO, \
182 PM_GPIO_FUNC_NORMAL, 1, 0)
183
184/* Initial pm8038 GPIO configurations */
185static struct pm8xxx_gpio_init pm8038_keypad_gpios[] = {
186 /* keys GPIOs */
Ajay Dudanidc85e4a2012-03-08 20:09:17 -0800187 PM8XXX_GPIO_INPUT(PM_GPIO(3), PM_GPIO_PULL_UP_30),
188 PM8XXX_GPIO_INPUT(PM_GPIO(8), PM_GPIO_PULL_UP_30),
189 PM8XXX_GPIO_INPUT(PM_GPIO(10), PM_GPIO_PULL_UP_30),
190 PM8XXX_GPIO_INPUT(PM_GPIO(11), PM_GPIO_PULL_UP_30),
Shashank Mittalb3be37f2012-01-16 22:59:49 -0800191};
192
193static struct pm8xxx_gpio_init pm8921_keypad_gpios[] = {
194 /* keys GPIOs */
195 PM8XXX_GPIO_INPUT(PM_GPIO(1), PM_GPIO_PULL_UP_31_5),
196 PM8XXX_GPIO_INPUT(PM_GPIO(2), PM_GPIO_PULL_UP_31_5),
197 PM8XXX_GPIO_INPUT(PM_GPIO(3), PM_GPIO_PULL_UP_31_5),
198 PM8XXX_GPIO_INPUT(PM_GPIO(4), PM_GPIO_PULL_UP_31_5),
199 PM8XXX_GPIO_INPUT(PM_GPIO(5), PM_GPIO_PULL_UP_31_5),
200 PM8XXX_GPIO_OUTPUT(PM_GPIO(9), 0),
201};
202
Amol Jadi76071672012-02-03 12:19:36 -0800203/* pm8921 GPIO configuration for APQ8064 keypad */
204static struct pm8xxx_gpio_init pm8921_keypad_gpios_apq[] = {
205 /* keys GPIOs */
206 PM8XXX_GPIO_INPUT(PM_GPIO(35), PM_GPIO_PULL_UP_31_5),
207 PM8XXX_GPIO_INPUT(PM_GPIO(38), PM_GPIO_PULL_UP_31_5),
208 PM8XXX_GPIO_OUTPUT(PM_GPIO(9), 0),
209};
210
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700211/* pm8917 GPIO configuration for APQ8064 keypad */
212static struct pm8xxx_gpio_init pm8917_keypad_gpios_apq[] = {
213 /* keys GPIOs */
214 PM8XXX_GPIO_INPUT(PM_GPIO(35), PM_GPIO_PULL_UP_31_5),
215 PM8XXX_GPIO_INPUT(PM_GPIO(30), PM_GPIO_PULL_UP_31_5),
216 PM8XXX_GPIO_OUTPUT(PM_GPIO(9), 0),
217};
218
Neeti Desai7c303362012-09-18 11:50:22 -0700219/* pm8917 GPIO configuration for MSM8930 keypad */
220static struct pm8xxx_gpio_init pm8917_keypad_gpios[] = {
221 /* keys GPIOs */
222 PM8XXX_GPIO_INPUT(PM_GPIO(27), PM_GPIO_PULL_UP_30),
223 PM8XXX_GPIO_INPUT(PM_GPIO(28), PM_GPIO_PULL_UP_30),
224 PM8XXX_GPIO_INPUT(PM_GPIO(36), PM_GPIO_PULL_UP_30),
225 PM8XXX_GPIO_INPUT(PM_GPIO(37), PM_GPIO_PULL_UP_30),
226};
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700227
Shashank Mittalb3be37f2012-01-16 22:59:49 -0800228void msm8960_keypad_gpio_init()
229{
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700230 int i = 0;
231 int num = 0;
Shashank Mittalb3be37f2012-01-16 22:59:49 -0800232
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700233 num = ARRAY_SIZE(pm8921_keypad_gpios);
Shashank Mittalb3be37f2012-01-16 22:59:49 -0800234
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700235 for(i=0; i < num; i++)
236 {
237 pm8921_gpio_config(pm8921_keypad_gpios[i].gpio,
238 &(pm8921_keypad_gpios[i].config));
239 }
Shashank Mittalb3be37f2012-01-16 22:59:49 -0800240}
241
242void msm8930_keypad_gpio_init()
243{
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700244 int i = 0;
245 int num = 0;
Neeti Desai7c303362012-09-18 11:50:22 -0700246 struct pm8xxx_gpio_init *gpio_array;
247 uint32_t pmic_type;
Shashank Mittalb3be37f2012-01-16 22:59:49 -0800248
Neeti Desai7c303362012-09-18 11:50:22 -0700249 pmic_type = board_pmic_type();
250
251 if (pmic_type == PMIC_IS_PM8917)
252 {
253 num = ARRAY_SIZE(pm8917_keypad_gpios);
254 gpio_array = pm8917_keypad_gpios;
255 }
256 else
257 {
258 num = ARRAY_SIZE(pm8038_keypad_gpios);
259 gpio_array = pm8038_keypad_gpios;
260 }
Shashank Mittalb3be37f2012-01-16 22:59:49 -0800261
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700262 for(i=0; i < num; i++)
263 {
Neeti Desai7c303362012-09-18 11:50:22 -0700264 pm8921_gpio_config(gpio_array[i].gpio,
265 &(gpio_array[i].config));
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700266 }
Shashank Mittalb3be37f2012-01-16 22:59:49 -0800267}
Amol Jadi76071672012-02-03 12:19:36 -0800268
269void apq8064_keypad_gpio_init()
270{
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700271 int i = 0;
272 int num = 0;
273 struct pm8xxx_gpio_init *gpio_array;
274 uint32_t pmic_type;
Amol Jadi76071672012-02-03 12:19:36 -0800275
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700276 pmic_type = board_pmic_type();
277
278 if (pmic_type == PMIC_IS_PM8917)
279 {
280 num = ARRAY_SIZE(pm8917_keypad_gpios_apq);
281 gpio_array = pm8917_keypad_gpios_apq;
282 }
283 else
284 {
Amol Jadi76071672012-02-03 12:19:36 -0800285 num = ARRAY_SIZE(pm8921_keypad_gpios_apq);
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700286 gpio_array = pm8921_keypad_gpios_apq;
287 }
Amol Jadi76071672012-02-03 12:19:36 -0800288
Deepa Dinamanib8b16432012-08-24 15:48:45 -0700289 for(i = 0; i < num; i++)
290 {
291 pm8921_gpio_config(gpio_array[i].gpio,
292 &(gpio_array[i].config));
293 }
Amol Jadi76071672012-02-03 12:19:36 -0800294}
295
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700296#define PM8921_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \
297 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, 0, _val, \
298 PM_GPIO_PULL_NO, 2, \
299 PM_GPIO_STRENGTH_HIGH, \
300 _func, 0, 0)
301
302
303#define PM8921_GPIO_OUTPUT_BUFCONF(_gpio, _val, _strength, _bufconf) \
304 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT,\
305 PM_GPIO_OUT_BUF_##_bufconf, _val, \
306 PM_GPIO_PULL_NO, 2, \
307 PM_GPIO_STRENGTH_##_strength, \
308 PM_GPIO_FUNC_NORMAL, 0, 0)
309
310
311static struct pm8xxx_gpio_init pm8921_display_gpios_apq[] = {
312 /* Display GPIOs */
313 /* Bl: ON, PWM mode */
314 PM8921_GPIO_OUTPUT_FUNC(PM_GPIO(26), 1, PM_GPIO_FUNC_2),
315 /* LCD1_PWR_EN_N */
316 PM8921_GPIO_OUTPUT_BUFCONF(PM_GPIO(36), 0, LOW, OPEN_DRAIN),
317 /* DISP_RESET_N */
318 PM8921_GPIO_OUTPUT_BUFCONF(PM_GPIO(25), 1, LOW, CMOS),
319};
320
321void apq8064_display_gpio_init()
322{
323 int i = 0;
324 int num = 0;
325
326 num = ARRAY_SIZE(pm8921_display_gpios_apq);
327
328 for (i = 0; i < num; i++) {
329 pm8921_gpio_config(pm8921_display_gpios_apq[i].gpio,
330 &(pm8921_display_gpios_apq[i].config));
331 }
332}