blob: 3b848753e9a7bdc5620eeda13fe840540d20c0e0 [file] [log] [blame]
Amir Samuelov7f0cc072012-02-07 09:23:57 +02001/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -08002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/interrupt.h>
15#include <linux/mfd/pm8xxx/pm8921.h>
16#include <linux/mfd/pm8xxx/pm8xxx-adc.h>
17#include <linux/leds.h>
18#include <linux/leds-pm8xxx.h>
19#include <linux/msm_ssbi.h>
20#include <asm/mach-types.h>
21#include <mach/msm_bus_board.h>
22#include <mach/restart.h>
23#include "devices.h"
Stepan Moskovchenko5a83dba2011-12-05 17:30:17 -080024#include "board-8960.h"
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -080025
26struct pm8xxx_gpio_init {
27 unsigned gpio;
28 struct pm_gpio config;
29};
30
31struct pm8xxx_mpp_init {
32 unsigned mpp;
33 struct pm8xxx_mpp_config_data config;
34};
35
36#define PM8XXX_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \
37 _func, _inv, _disable) \
38{ \
39 .gpio = PM8921_GPIO_PM_TO_SYS(_gpio), \
40 .config = { \
41 .direction = _dir, \
42 .output_buffer = _buf, \
43 .output_value = _val, \
44 .pull = _pull, \
45 .vin_sel = _vin, \
46 .out_strength = _out_strength, \
47 .function = _func, \
48 .inv_int_pol = _inv, \
49 .disable_pin = _disable, \
50 } \
51}
52
53#define PM8XXX_MPP_INIT(_mpp, _type, _level, _control) \
54{ \
55 .mpp = PM8921_MPP_PM_TO_SYS(_mpp), \
56 .config = { \
57 .type = PM8XXX_MPP_TYPE_##_type, \
58 .level = _level, \
59 .control = PM8XXX_MPP_##_control, \
60 } \
61}
62
63#define PM8XXX_GPIO_DISABLE(_gpio) \
64 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM_GPIO_VIN_S4, \
65 0, 0, 0, 1)
66
67#define PM8XXX_GPIO_OUTPUT(_gpio, _val) \
68 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
69 PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
70 PM_GPIO_STRENGTH_HIGH, \
71 PM_GPIO_FUNC_NORMAL, 0, 0)
72
73#define PM8XXX_GPIO_INPUT(_gpio, _pull) \
74 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \
75 _pull, PM_GPIO_VIN_S4, \
76 PM_GPIO_STRENGTH_NO, \
77 PM_GPIO_FUNC_NORMAL, 0, 0)
78
79#define PM8XXX_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \
80 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
81 PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
82 PM_GPIO_STRENGTH_HIGH, \
83 _func, 0, 0)
84
85#define PM8XXX_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \
86 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
87 PM_GPIO_PULL_NO, _vin, \
88 PM_GPIO_STRENGTH_HIGH, \
89 PM_GPIO_FUNC_NORMAL, 0, 0)
90
Shiv Maliyappanahalli7e0beff2012-02-06 15:56:39 -080091#define PM8XXX_GPIO_OUTPUT_STRENGTH(_gpio, _val, _out_strength) \
92 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
93 PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
94 _out_strength, \
95 PM_GPIO_FUNC_NORMAL, 0, 0)
96
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -080097/* Initial PM8921 GPIO configurations */
98static struct pm8xxx_gpio_init pm8921_gpios[] __initdata = {
Eugene Yasman97ee5c62011-12-20 16:20:42 +020099 PM8XXX_GPIO_OUTPUT_VIN(6, 1, PM_GPIO_VIN_VPH), /* MHL power EN_N */
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800100 PM8XXX_GPIO_DISABLE(7), /* Disable NFC */
101 PM8XXX_GPIO_INPUT(16, PM_GPIO_PULL_UP_30), /* SD_CARD_WP */
102 /* External regulator shared by display and touchscreen on LiQUID */
103 PM8XXX_GPIO_OUTPUT(17, 0), /* DISP 3.3 V Boost */
Amir Samuelovb105a3e2012-02-09 10:45:32 +0200104 PM8XXX_GPIO_OUTPUT(18, 1), /* TABLA SPKR_LEFT_EN */
105 PM8XXX_GPIO_OUTPUT(19, 1), /* TABLA SPKR_RIGHT_EN */
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800106 PM8XXX_GPIO_OUTPUT_VIN(21, 1, PM_GPIO_VIN_VPH), /* Backlight Enable */
107 PM8XXX_GPIO_DISABLE(22), /* Disable NFC */
108 PM8XXX_GPIO_OUTPUT_FUNC(24, 0, PM_GPIO_FUNC_2), /* Bl: Off, PWM mode */
Amir Samuelov7f0cc072012-02-07 09:23:57 +0200109 PM8XXX_GPIO_OUTPUT_FUNC(25, 0, PM_GPIO_FUNC_2), /* TN_CLK */
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800110 PM8XXX_GPIO_INPUT(26, PM_GPIO_PULL_UP_30), /* SD_CARD_DET_N */
111 PM8XXX_GPIO_OUTPUT(43, PM_GPIO_PULL_UP_30), /* DISP_RESET_N */
112 PM8XXX_GPIO_OUTPUT(42, 0), /* USB 5V reg enable */
Shiv Maliyappanahalli7e0beff2012-02-06 15:56:39 -0800113 /* TABLA CODEC RESET */
114 PM8XXX_GPIO_OUTPUT_STRENGTH(34, 1, PM_GPIO_STRENGTH_MED)
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800115};
116
117/* Initial PM8921 MPP configurations */
118static struct pm8xxx_mpp_init pm8921_mpps[] __initdata = {
119 /* External 5V regulator enable; shared by HDMI and USB_OTG switches. */
120 PM8XXX_MPP_INIT(7, D_INPUT, PM8921_MPP_DIG_LEVEL_VPH, DIN_TO_INT),
121 PM8XXX_MPP_INIT(PM8XXX_AMUX_MPP_8, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH8,
122 DOUT_CTRL_LOW),
123};
124
125void __init msm8960_pm8921_gpio_mpp_init(void)
126{
127 int i, rc;
128
129 for (i = 0; i < ARRAY_SIZE(pm8921_gpios); i++) {
130 rc = pm8xxx_gpio_config(pm8921_gpios[i].gpio,
131 &pm8921_gpios[i].config);
132 if (rc) {
133 pr_err("%s: pm8xxx_gpio_config: rc=%d\n", __func__, rc);
134 break;
135 }
136 }
137
138 for (i = 0; i < ARRAY_SIZE(pm8921_mpps); i++) {
139 rc = pm8xxx_mpp_config(pm8921_mpps[i].mpp,
140 &pm8921_mpps[i].config);
141 if (rc) {
142 pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc);
143 break;
144 }
145 }
146}
147
148static struct pm8xxx_adc_amux pm8xxx_adc_channels_data[] = {
149 {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1,
150 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
151 {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1,
152 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
153 {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1,
154 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
155 {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1,
156 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
157 {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1,
158 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
159 {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1,
160 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
161 {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2,
162 ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM},
163 {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV1,
164 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
165 {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1,
166 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
167 {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
168 ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM},
169 {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1,
170 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
171 {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1,
172 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
173 {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
174 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
175 {"pa_therm1", ADC_MPP_1_AMUX8, CHAN_PATH_SCALING1, AMUX_RSV1,
176 ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM},
177 {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0,
178 ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM},
179 {"pa_therm0", ADC_MPP_1_AMUX3, CHAN_PATH_SCALING1, AMUX_RSV1,
180 ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM},
181};
182
183static struct pm8xxx_adc_properties pm8xxx_adc_data = {
184 .adc_vdd_reference = 1800, /* milli-voltage for this adc */
185 .bitresolution = 15,
186 .bipolar = 0,
187};
188
189static struct pm8xxx_adc_platform_data pm8xxx_adc_pdata = {
190 .adc_channel = pm8xxx_adc_channels_data,
191 .adc_num_board_channel = ARRAY_SIZE(pm8xxx_adc_channels_data),
192 .adc_prop = &pm8xxx_adc_data,
193 .adc_mpp_base = PM8921_MPP_PM_TO_SYS(1),
194};
195
196static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata __devinitdata = {
197 .irq_base = PM8921_IRQ_BASE,
198 .devirq = MSM_GPIO_TO_INT(104),
199 .irq_trigger_flag = IRQF_TRIGGER_LOW,
200};
201
202static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata __devinitdata = {
203 .gpio_base = PM8921_GPIO_PM_TO_SYS(1),
204};
205
206static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata __devinitdata = {
207 .mpp_base = PM8921_MPP_PM_TO_SYS(1),
208};
209
210static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata __devinitdata = {
211 .rtc_write_enable = false,
212 .rtc_alarm_powerup = false,
213};
214
215static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = {
216 .pull_up = 1,
Jing Lineecdc062011-11-17 09:47:09 -0800217 .kpd_trigger_delay_us = 15625,
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800218 .wakeup = 1,
219};
220
221/* Rotate lock key is not available so use F1 */
222#define KEY_ROTATE_LOCK KEY_F1
223
224static const unsigned int keymap_liquid[] = {
225 KEY(0, 0, KEY_VOLUMEUP),
226 KEY(0, 1, KEY_VOLUMEDOWN),
227 KEY(1, 3, KEY_ROTATE_LOCK),
228 KEY(1, 4, KEY_HOME),
229};
230
231static struct matrix_keymap_data keymap_data_liquid = {
232 .keymap_size = ARRAY_SIZE(keymap_liquid),
233 .keymap = keymap_liquid,
234};
235
236static struct pm8xxx_keypad_platform_data keypad_data_liquid = {
237 .input_name = "keypad_8960_liquid",
238 .input_phys_device = "keypad_8960/input0",
239 .num_rows = 2,
240 .num_cols = 5,
241 .rows_gpio_start = PM8921_GPIO_PM_TO_SYS(9),
242 .cols_gpio_start = PM8921_GPIO_PM_TO_SYS(1),
243 .debounce_ms = 15,
244 .scan_delay_ms = 32,
245 .row_hold_ns = 91500,
246 .wakeup = 1,
247 .keymap_data = &keymap_data_liquid,
248};
249
250
251static const unsigned int keymap[] = {
252 KEY(0, 0, KEY_VOLUMEUP),
253 KEY(0, 1, KEY_VOLUMEDOWN),
254 KEY(0, 2, KEY_CAMERA_SNAPSHOT),
255 KEY(0, 3, KEY_CAMERA_FOCUS),
256};
257
258static struct matrix_keymap_data keymap_data = {
259 .keymap_size = ARRAY_SIZE(keymap),
260 .keymap = keymap,
261};
262
263static struct pm8xxx_keypad_platform_data keypad_data = {
264 .input_name = "keypad_8960",
265 .input_phys_device = "keypad_8960/input0",
266 .num_rows = 1,
267 .num_cols = 5,
268 .rows_gpio_start = PM8921_GPIO_PM_TO_SYS(9),
269 .cols_gpio_start = PM8921_GPIO_PM_TO_SYS(1),
270 .debounce_ms = 15,
271 .scan_delay_ms = 32,
272 .row_hold_ns = 91500,
273 .wakeup = 1,
274 .keymap_data = &keymap_data,
275};
276
277static const unsigned int keymap_sim[] = {
278 KEY(0, 0, KEY_7),
279 KEY(0, 1, KEY_DOWN),
280 KEY(0, 2, KEY_UP),
281 KEY(0, 3, KEY_RIGHT),
282 KEY(0, 4, KEY_ENTER),
283 KEY(0, 5, KEY_L),
284 KEY(0, 6, KEY_BACK),
285 KEY(0, 7, KEY_M),
286
287 KEY(1, 0, KEY_LEFT),
288 KEY(1, 1, KEY_SEND),
289 KEY(1, 2, KEY_1),
290 KEY(1, 3, KEY_4),
291 KEY(1, 4, KEY_CLEAR),
292 KEY(1, 5, KEY_MSDOS),
293 KEY(1, 6, KEY_SPACE),
294 KEY(1, 7, KEY_COMMA),
295
296 KEY(2, 0, KEY_6),
297 KEY(2, 1, KEY_5),
298 KEY(2, 2, KEY_8),
299 KEY(2, 3, KEY_3),
300 KEY(2, 4, KEY_NUMERIC_STAR),
301 KEY(2, 5, KEY_UP),
302 KEY(2, 6, KEY_DOWN),
303 KEY(2, 7, KEY_LEFTSHIFT),
304
305 KEY(3, 0, KEY_9),
306 KEY(3, 1, KEY_NUMERIC_POUND),
307 KEY(3, 2, KEY_0),
308 KEY(3, 3, KEY_2),
309 KEY(3, 4, KEY_SLEEP),
310 KEY(3, 5, KEY_F1),
311 KEY(3, 6, KEY_F2),
312 KEY(3, 7, KEY_F3),
313
314 KEY(4, 0, KEY_BACK),
315 KEY(4, 1, KEY_HOME),
316 KEY(4, 2, KEY_MENU),
317 KEY(4, 3, KEY_VOLUMEUP),
318 KEY(4, 4, KEY_VOLUMEDOWN),
319 KEY(4, 5, KEY_F4),
320 KEY(4, 6, KEY_F5),
321 KEY(4, 7, KEY_F6),
322
323 KEY(5, 0, KEY_R),
324 KEY(5, 1, KEY_T),
325 KEY(5, 2, KEY_Y),
326 KEY(5, 3, KEY_LEFTALT),
327 KEY(5, 4, KEY_KPENTER),
328 KEY(5, 5, KEY_Q),
329 KEY(5, 6, KEY_W),
330 KEY(5, 7, KEY_E),
331
332 KEY(6, 0, KEY_F),
333 KEY(6, 1, KEY_G),
334 KEY(6, 2, KEY_H),
335 KEY(6, 3, KEY_CAPSLOCK),
336 KEY(6, 4, KEY_PAGEUP),
337 KEY(6, 5, KEY_A),
338 KEY(6, 6, KEY_S),
339 KEY(6, 7, KEY_D),
340
341 KEY(7, 0, KEY_V),
342 KEY(7, 1, KEY_B),
343 KEY(7, 2, KEY_N),
344 KEY(7, 3, KEY_MENU),
345 KEY(7, 4, KEY_PAGEDOWN),
346 KEY(7, 5, KEY_Z),
347 KEY(7, 6, KEY_X),
348 KEY(7, 7, KEY_C),
349
350 KEY(8, 0, KEY_P),
351 KEY(8, 1, KEY_J),
352 KEY(8, 2, KEY_K),
353 KEY(8, 3, KEY_INSERT),
354 KEY(8, 4, KEY_LINEFEED),
355 KEY(8, 5, KEY_U),
356 KEY(8, 6, KEY_I),
357 KEY(8, 7, KEY_O),
358
359 KEY(9, 0, KEY_4),
360 KEY(9, 1, KEY_5),
361 KEY(9, 2, KEY_6),
362 KEY(9, 3, KEY_7),
363 KEY(9, 4, KEY_8),
364 KEY(9, 5, KEY_1),
365 KEY(9, 6, KEY_2),
366 KEY(9, 7, KEY_3),
367
368 KEY(10, 0, KEY_F7),
369 KEY(10, 1, KEY_F8),
370 KEY(10, 2, KEY_F9),
371 KEY(10, 3, KEY_F10),
372 KEY(10, 4, KEY_FN),
373 KEY(10, 5, KEY_9),
374 KEY(10, 6, KEY_0),
375 KEY(10, 7, KEY_DOT),
376
377 KEY(11, 0, KEY_LEFTCTRL),
378 KEY(11, 1, KEY_F11),
379 KEY(11, 2, KEY_ENTER),
380 KEY(11, 3, KEY_SEARCH),
381 KEY(11, 4, KEY_DELETE),
382 KEY(11, 5, KEY_RIGHT),
383 KEY(11, 6, KEY_LEFT),
384 KEY(11, 7, KEY_RIGHTSHIFT),
385 KEY(0, 0, KEY_VOLUMEUP),
386 KEY(0, 1, KEY_VOLUMEDOWN),
387 KEY(0, 2, KEY_CAMERA_SNAPSHOT),
388 KEY(0, 3, KEY_CAMERA_FOCUS),
389};
390
391static struct matrix_keymap_data keymap_data_sim = {
392 .keymap_size = ARRAY_SIZE(keymap_sim),
393 .keymap = keymap_sim,
394};
395
396static struct pm8xxx_keypad_platform_data keypad_data_sim = {
397 .input_name = "keypad_8960",
398 .input_phys_device = "keypad_8960/input0",
399 .num_rows = 12,
400 .num_cols = 8,
401 .rows_gpio_start = PM8921_GPIO_PM_TO_SYS(9),
402 .cols_gpio_start = PM8921_GPIO_PM_TO_SYS(1),
403 .debounce_ms = 15,
404 .scan_delay_ms = 32,
405 .row_hold_ns = 91500,
406 .wakeup = 1,
407 .keymap_data = &keymap_data_sim,
408};
409
410static int pm8921_therm_mitigation[] = {
411 1100,
412 700,
413 600,
414 325,
415};
416
Abhijeet Dharmapurikara93ede82011-11-17 12:20:03 -0800417#define MAX_VOLTAGE_MV 4200
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800418static struct pm8921_charger_platform_data pm8921_chg_pdata __devinitdata = {
419 .safety_time = 180,
420 .update_time = 60000,
Abhijeet Dharmapurikara93ede82011-11-17 12:20:03 -0800421 .max_voltage = MAX_VOLTAGE_MV,
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800422 .min_voltage = 3200,
423 .resume_voltage_delta = 100,
424 .term_current = 100,
425 .cool_temp = 10,
426 .warm_temp = 40,
427 .temp_check_period = 1,
428 .max_bat_chg_current = 1100,
429 .cool_bat_chg_current = 350,
430 .warm_bat_chg_current = 350,
431 .cool_bat_voltage = 4100,
432 .warm_bat_voltage = 4100,
433 .thermal_mitigation = pm8921_therm_mitigation,
434 .thermal_levels = ARRAY_SIZE(pm8921_therm_mitigation),
Abhijeet Dharmapurikar40491ce2011-11-07 11:38:54 -0800435 .rconn_mohm = 18,
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800436};
437
438static struct pm8xxx_misc_platform_data pm8xxx_misc_pdata = {
439 .priority = 0,
440};
441
442static struct pm8921_bms_platform_data pm8921_bms_pdata __devinitdata = {
David Keitel35e11872012-02-17 17:40:42 -0800443 .battery_type = BATT_UNKNOWN,
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800444 .r_sense = 10,
445 .i_test = 2500,
446 .v_failure = 3000,
447 .calib_delay_ms = 600000,
Abhijeet Dharmapurikara93ede82011-11-17 12:20:03 -0800448 .max_voltage_uv = MAX_VOLTAGE_MV * 1000,
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800449};
450
451#define PM8921_LC_LED_MAX_CURRENT 4 /* I = 4mA */
Amy Maloche38dd7a72011-12-06 09:51:41 -0800452#define PM8921_LC_LED_LOW_CURRENT 1 /* I = 1mA */
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800453#define PM8XXX_LED_PWM_PERIOD 1000
454#define PM8XXX_LED_PWM_DUTY_MS 20
455/**
456 * PM8XXX_PWM_CHANNEL_NONE shall be used when LED shall not be
457 * driven using PWM feature.
458 */
459#define PM8XXX_PWM_CHANNEL_NONE -1
460
Amy Maloche38dd7a72011-12-06 09:51:41 -0800461static struct led_info pm8921_led_info_liquid[] = {
462 {
463 .name = "led:red",
464 .flags = PM8XXX_ID_LED_0,
Amy Maloche65a01a82012-01-30 12:36:42 -0800465 .default_trigger = "battery-charging",
Amy Maloche38dd7a72011-12-06 09:51:41 -0800466 },
467 {
468 .name = "led:green",
469 .flags = PM8XXX_ID_LED_0,
Amy Maloche65a01a82012-01-30 12:36:42 -0800470 .default_trigger = "battery-full",
Amy Maloche38dd7a72011-12-06 09:51:41 -0800471 },
472 {
473 .name = "led:blue",
474 .flags = PM8XXX_ID_LED_2,
Amy Maloche65a01a82012-01-30 12:36:42 -0800475 .default_trigger = "dc-online",
Amy Maloche38dd7a72011-12-06 09:51:41 -0800476 },
477};
478
479static struct pm8xxx_led_config pm8921_led_configs_liquid[] = {
480 [0] = {
481 .id = PM8XXX_ID_LED_0,
482 .mode = PM8XXX_LED_MODE_MANUAL,
483 .max_current = PM8921_LC_LED_MAX_CURRENT,
484 },
485 [1] = {
486 .id = PM8XXX_ID_LED_1,
487 .mode = PM8XXX_LED_MODE_MANUAL,
488 .max_current = PM8921_LC_LED_LOW_CURRENT,
489 },
490 [2] = {
491 .id = PM8XXX_ID_LED_2,
492 .mode = PM8XXX_LED_MODE_MANUAL,
493 .max_current = PM8921_LC_LED_MAX_CURRENT,
494 },
495};
496
497static struct led_platform_data pm8xxx_leds_core_liquid = {
498 .num_leds = ARRAY_SIZE(pm8921_led_info_liquid),
499 .leds = pm8921_led_info_liquid,
500};
501
502static struct pm8xxx_led_platform_data pm8xxx_leds_pdata_liquid = {
503 .led_core = &pm8xxx_leds_core_liquid,
504 .configs = pm8921_led_configs_liquid,
505 .num_configs = ARRAY_SIZE(pm8921_led_configs_liquid),
506};
507
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800508static struct led_info pm8921_led_info[] = {
509 [0] = {
510 .name = "led:battery_charging",
511 .default_trigger = "battery-charging",
512 },
513 [1] = {
514 .name = "led:battery_full",
515 .default_trigger = "battery-full",
516 },
517};
518
519static struct led_platform_data pm8921_led_core_pdata = {
520 .num_leds = ARRAY_SIZE(pm8921_led_info),
521 .leds = pm8921_led_info,
522};
523
524static int pm8921_led0_pwm_duty_pcts[56] = {
525 1, 4, 8, 12, 16, 20, 24, 28, 32, 36,
526 40, 44, 46, 52, 56, 60, 64, 68, 72, 76,
527 80, 84, 88, 92, 96, 100, 100, 100, 98, 95,
528 92, 88, 84, 82, 78, 74, 70, 66, 62, 58,
529 58, 54, 50, 48, 42, 38, 34, 30, 26, 22,
530 14, 10, 6, 4, 1
531};
532
533static struct pm8xxx_pwm_duty_cycles pm8921_led0_pwm_duty_cycles = {
534 .duty_pcts = (int *)&pm8921_led0_pwm_duty_pcts,
535 .num_duty_pcts = ARRAY_SIZE(pm8921_led0_pwm_duty_pcts),
536 .duty_ms = PM8XXX_LED_PWM_DUTY_MS,
537 .start_idx = 0,
538};
539
540static struct pm8xxx_led_config pm8921_led_configs[] = {
541 [0] = {
542 .id = PM8XXX_ID_LED_0,
543 .mode = PM8XXX_LED_MODE_PWM2,
544 .max_current = PM8921_LC_LED_MAX_CURRENT,
545 .pwm_channel = 5,
546 .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
547 .pwm_duty_cycles = &pm8921_led0_pwm_duty_cycles,
548 },
549 [1] = {
550 .id = PM8XXX_ID_LED_1,
551 .mode = PM8XXX_LED_MODE_PWM1,
552 .max_current = PM8921_LC_LED_MAX_CURRENT,
553 .pwm_channel = 4,
554 .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
555 },
556};
557
558static struct pm8xxx_led_platform_data pm8xxx_leds_pdata = {
559 .led_core = &pm8921_led_core_pdata,
560 .configs = pm8921_led_configs,
561 .num_configs = ARRAY_SIZE(pm8921_led_configs),
562};
563
564static struct pm8xxx_ccadc_platform_data pm8xxx_ccadc_pdata = {
565 .r_sense = 10,
566};
567
Jay Chokshi63c3bcc2012-02-27 18:54:37 -0800568/**
569 * PM8XXX_PWM_DTEST_CHANNEL_NONE shall be used when no LPG
570 * channel should be in DTEST mode.
571 */
572
573#define PM8XXX_PWM_DTEST_CHANNEL_NONE (-1)
574
575static struct pm8xxx_pwm_platform_data pm8xxx_pwm_pdata = {
576 .dtest_channel = PM8XXX_PWM_DTEST_CHANNEL_NONE,
577};
578
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800579static struct pm8921_platform_data pm8921_platform_data __devinitdata = {
580 .irq_pdata = &pm8xxx_irq_pdata,
581 .gpio_pdata = &pm8xxx_gpio_pdata,
582 .mpp_pdata = &pm8xxx_mpp_pdata,
583 .rtc_pdata = &pm8xxx_rtc_pdata,
584 .pwrkey_pdata = &pm8xxx_pwrkey_pdata,
585 .keypad_pdata = &keypad_data,
586 .misc_pdata = &pm8xxx_misc_pdata,
587 .regulator_pdatas = msm_pm8921_regulator_pdata,
588 .charger_pdata = &pm8921_chg_pdata,
589 .bms_pdata = &pm8921_bms_pdata,
590 .adc_pdata = &pm8xxx_adc_pdata,
591 .leds_pdata = &pm8xxx_leds_pdata,
592 .ccadc_pdata = &pm8xxx_ccadc_pdata,
Jay Chokshi63c3bcc2012-02-27 18:54:37 -0800593 .pwm_pdata = &pm8xxx_pwm_pdata,
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800594};
595
596static struct msm_ssbi_platform_data msm8960_ssbi_pm8921_pdata __devinitdata = {
597 .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
598 .slave = {
599 .name = "pm8921-core",
600 .platform_data = &pm8921_platform_data,
601 },
602};
603
604void __init msm8960_init_pmic(void)
605{
606 pmic_reset_irq = PM8921_IRQ_BASE + PM8921_RESOUT_IRQ;
Jay Chokshi33c044a2011-12-07 13:05:40 -0800607 msm8960_device_ssbi_pmic.dev.platform_data =
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800608 &msm8960_ssbi_pm8921_pdata;
609 pm8921_platform_data.num_regulators = msm_pm8921_regulator_pdata_len;
610
611 /* Simulator supports a QWERTY keypad */
612 if (machine_is_msm8960_sim())
613 pm8921_platform_data.keypad_pdata = &keypad_data_sim;
614
Amy Maloche38dd7a72011-12-06 09:51:41 -0800615 if (machine_is_msm8960_liquid()) {
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800616 pm8921_platform_data.keypad_pdata = &keypad_data_liquid;
Amy Maloche38dd7a72011-12-06 09:51:41 -0800617 pm8921_platform_data.leds_pdata = &pm8xxx_leds_pdata_liquid;
David Keitel35e11872012-02-17 17:40:42 -0800618 pm8921_platform_data.bms_pdata->battery_type = BATT_DESAY;
619 } else if (machine_is_msm8960_mtp()) {
620 pm8921_platform_data.bms_pdata->battery_type = BATT_PALLADIUM;
Amy Maloche38dd7a72011-12-06 09:51:41 -0800621 }
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800622}