blob: 744709c3d7a2eb180653ad0ad41cdef308ba6b14 [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
91/* Initial PM8921 GPIO configurations */
92static struct pm8xxx_gpio_init pm8921_gpios[] __initdata = {
Eugene Yasman97ee5c62011-12-20 16:20:42 +020093 PM8XXX_GPIO_OUTPUT_VIN(6, 1, PM_GPIO_VIN_VPH), /* MHL power EN_N */
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -080094 PM8XXX_GPIO_DISABLE(7), /* Disable NFC */
95 PM8XXX_GPIO_INPUT(16, PM_GPIO_PULL_UP_30), /* SD_CARD_WP */
96 /* External regulator shared by display and touchscreen on LiQUID */
97 PM8XXX_GPIO_OUTPUT(17, 0), /* DISP 3.3 V Boost */
Amir Samuelovb105a3e2012-02-09 10:45:32 +020098 PM8XXX_GPIO_OUTPUT(18, 1), /* TABLA SPKR_LEFT_EN */
99 PM8XXX_GPIO_OUTPUT(19, 1), /* TABLA SPKR_RIGHT_EN */
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800100 PM8XXX_GPIO_OUTPUT_VIN(21, 1, PM_GPIO_VIN_VPH), /* Backlight Enable */
101 PM8XXX_GPIO_DISABLE(22), /* Disable NFC */
102 PM8XXX_GPIO_OUTPUT_FUNC(24, 0, PM_GPIO_FUNC_2), /* Bl: Off, PWM mode */
Amir Samuelov7f0cc072012-02-07 09:23:57 +0200103 PM8XXX_GPIO_OUTPUT_FUNC(25, 0, PM_GPIO_FUNC_2), /* TN_CLK */
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800104 PM8XXX_GPIO_INPUT(26, PM_GPIO_PULL_UP_30), /* SD_CARD_DET_N */
105 PM8XXX_GPIO_OUTPUT(43, PM_GPIO_PULL_UP_30), /* DISP_RESET_N */
106 PM8XXX_GPIO_OUTPUT(42, 0), /* USB 5V reg enable */
107};
108
109/* Initial PM8921 MPP configurations */
110static struct pm8xxx_mpp_init pm8921_mpps[] __initdata = {
111 /* External 5V regulator enable; shared by HDMI and USB_OTG switches. */
112 PM8XXX_MPP_INIT(7, D_INPUT, PM8921_MPP_DIG_LEVEL_VPH, DIN_TO_INT),
113 PM8XXX_MPP_INIT(PM8XXX_AMUX_MPP_8, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH8,
114 DOUT_CTRL_LOW),
115};
116
117void __init msm8960_pm8921_gpio_mpp_init(void)
118{
119 int i, rc;
120
121 for (i = 0; i < ARRAY_SIZE(pm8921_gpios); i++) {
122 rc = pm8xxx_gpio_config(pm8921_gpios[i].gpio,
123 &pm8921_gpios[i].config);
124 if (rc) {
125 pr_err("%s: pm8xxx_gpio_config: rc=%d\n", __func__, rc);
126 break;
127 }
128 }
129
130 for (i = 0; i < ARRAY_SIZE(pm8921_mpps); i++) {
131 rc = pm8xxx_mpp_config(pm8921_mpps[i].mpp,
132 &pm8921_mpps[i].config);
133 if (rc) {
134 pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc);
135 break;
136 }
137 }
138}
139
140static struct pm8xxx_adc_amux pm8xxx_adc_channels_data[] = {
141 {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1,
142 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
143 {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1,
144 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
145 {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1,
146 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
147 {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1,
148 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
149 {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1,
150 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
151 {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1,
152 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
153 {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2,
154 ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM},
155 {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV1,
156 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
157 {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1,
158 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
159 {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
160 ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM},
161 {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1,
162 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
163 {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1,
164 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
165 {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
166 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
167 {"pa_therm1", ADC_MPP_1_AMUX8, CHAN_PATH_SCALING1, AMUX_RSV1,
168 ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM},
169 {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0,
170 ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM},
171 {"pa_therm0", ADC_MPP_1_AMUX3, CHAN_PATH_SCALING1, AMUX_RSV1,
172 ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM},
173};
174
175static struct pm8xxx_adc_properties pm8xxx_adc_data = {
176 .adc_vdd_reference = 1800, /* milli-voltage for this adc */
177 .bitresolution = 15,
178 .bipolar = 0,
179};
180
181static struct pm8xxx_adc_platform_data pm8xxx_adc_pdata = {
182 .adc_channel = pm8xxx_adc_channels_data,
183 .adc_num_board_channel = ARRAY_SIZE(pm8xxx_adc_channels_data),
184 .adc_prop = &pm8xxx_adc_data,
185 .adc_mpp_base = PM8921_MPP_PM_TO_SYS(1),
186};
187
188static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata __devinitdata = {
189 .irq_base = PM8921_IRQ_BASE,
190 .devirq = MSM_GPIO_TO_INT(104),
191 .irq_trigger_flag = IRQF_TRIGGER_LOW,
192};
193
194static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata __devinitdata = {
195 .gpio_base = PM8921_GPIO_PM_TO_SYS(1),
196};
197
198static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata __devinitdata = {
199 .mpp_base = PM8921_MPP_PM_TO_SYS(1),
200};
201
202static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata __devinitdata = {
203 .rtc_write_enable = false,
204 .rtc_alarm_powerup = false,
205};
206
207static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = {
208 .pull_up = 1,
Jing Lineecdc062011-11-17 09:47:09 -0800209 .kpd_trigger_delay_us = 15625,
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800210 .wakeup = 1,
211};
212
213/* Rotate lock key is not available so use F1 */
214#define KEY_ROTATE_LOCK KEY_F1
215
216static const unsigned int keymap_liquid[] = {
217 KEY(0, 0, KEY_VOLUMEUP),
218 KEY(0, 1, KEY_VOLUMEDOWN),
219 KEY(1, 3, KEY_ROTATE_LOCK),
220 KEY(1, 4, KEY_HOME),
221};
222
223static struct matrix_keymap_data keymap_data_liquid = {
224 .keymap_size = ARRAY_SIZE(keymap_liquid),
225 .keymap = keymap_liquid,
226};
227
228static struct pm8xxx_keypad_platform_data keypad_data_liquid = {
229 .input_name = "keypad_8960_liquid",
230 .input_phys_device = "keypad_8960/input0",
231 .num_rows = 2,
232 .num_cols = 5,
233 .rows_gpio_start = PM8921_GPIO_PM_TO_SYS(9),
234 .cols_gpio_start = PM8921_GPIO_PM_TO_SYS(1),
235 .debounce_ms = 15,
236 .scan_delay_ms = 32,
237 .row_hold_ns = 91500,
238 .wakeup = 1,
239 .keymap_data = &keymap_data_liquid,
240};
241
242
243static const unsigned int keymap[] = {
244 KEY(0, 0, KEY_VOLUMEUP),
245 KEY(0, 1, KEY_VOLUMEDOWN),
246 KEY(0, 2, KEY_CAMERA_SNAPSHOT),
247 KEY(0, 3, KEY_CAMERA_FOCUS),
248};
249
250static struct matrix_keymap_data keymap_data = {
251 .keymap_size = ARRAY_SIZE(keymap),
252 .keymap = keymap,
253};
254
255static struct pm8xxx_keypad_platform_data keypad_data = {
256 .input_name = "keypad_8960",
257 .input_phys_device = "keypad_8960/input0",
258 .num_rows = 1,
259 .num_cols = 5,
260 .rows_gpio_start = PM8921_GPIO_PM_TO_SYS(9),
261 .cols_gpio_start = PM8921_GPIO_PM_TO_SYS(1),
262 .debounce_ms = 15,
263 .scan_delay_ms = 32,
264 .row_hold_ns = 91500,
265 .wakeup = 1,
266 .keymap_data = &keymap_data,
267};
268
269static const unsigned int keymap_sim[] = {
270 KEY(0, 0, KEY_7),
271 KEY(0, 1, KEY_DOWN),
272 KEY(0, 2, KEY_UP),
273 KEY(0, 3, KEY_RIGHT),
274 KEY(0, 4, KEY_ENTER),
275 KEY(0, 5, KEY_L),
276 KEY(0, 6, KEY_BACK),
277 KEY(0, 7, KEY_M),
278
279 KEY(1, 0, KEY_LEFT),
280 KEY(1, 1, KEY_SEND),
281 KEY(1, 2, KEY_1),
282 KEY(1, 3, KEY_4),
283 KEY(1, 4, KEY_CLEAR),
284 KEY(1, 5, KEY_MSDOS),
285 KEY(1, 6, KEY_SPACE),
286 KEY(1, 7, KEY_COMMA),
287
288 KEY(2, 0, KEY_6),
289 KEY(2, 1, KEY_5),
290 KEY(2, 2, KEY_8),
291 KEY(2, 3, KEY_3),
292 KEY(2, 4, KEY_NUMERIC_STAR),
293 KEY(2, 5, KEY_UP),
294 KEY(2, 6, KEY_DOWN),
295 KEY(2, 7, KEY_LEFTSHIFT),
296
297 KEY(3, 0, KEY_9),
298 KEY(3, 1, KEY_NUMERIC_POUND),
299 KEY(3, 2, KEY_0),
300 KEY(3, 3, KEY_2),
301 KEY(3, 4, KEY_SLEEP),
302 KEY(3, 5, KEY_F1),
303 KEY(3, 6, KEY_F2),
304 KEY(3, 7, KEY_F3),
305
306 KEY(4, 0, KEY_BACK),
307 KEY(4, 1, KEY_HOME),
308 KEY(4, 2, KEY_MENU),
309 KEY(4, 3, KEY_VOLUMEUP),
310 KEY(4, 4, KEY_VOLUMEDOWN),
311 KEY(4, 5, KEY_F4),
312 KEY(4, 6, KEY_F5),
313 KEY(4, 7, KEY_F6),
314
315 KEY(5, 0, KEY_R),
316 KEY(5, 1, KEY_T),
317 KEY(5, 2, KEY_Y),
318 KEY(5, 3, KEY_LEFTALT),
319 KEY(5, 4, KEY_KPENTER),
320 KEY(5, 5, KEY_Q),
321 KEY(5, 6, KEY_W),
322 KEY(5, 7, KEY_E),
323
324 KEY(6, 0, KEY_F),
325 KEY(6, 1, KEY_G),
326 KEY(6, 2, KEY_H),
327 KEY(6, 3, KEY_CAPSLOCK),
328 KEY(6, 4, KEY_PAGEUP),
329 KEY(6, 5, KEY_A),
330 KEY(6, 6, KEY_S),
331 KEY(6, 7, KEY_D),
332
333 KEY(7, 0, KEY_V),
334 KEY(7, 1, KEY_B),
335 KEY(7, 2, KEY_N),
336 KEY(7, 3, KEY_MENU),
337 KEY(7, 4, KEY_PAGEDOWN),
338 KEY(7, 5, KEY_Z),
339 KEY(7, 6, KEY_X),
340 KEY(7, 7, KEY_C),
341
342 KEY(8, 0, KEY_P),
343 KEY(8, 1, KEY_J),
344 KEY(8, 2, KEY_K),
345 KEY(8, 3, KEY_INSERT),
346 KEY(8, 4, KEY_LINEFEED),
347 KEY(8, 5, KEY_U),
348 KEY(8, 6, KEY_I),
349 KEY(8, 7, KEY_O),
350
351 KEY(9, 0, KEY_4),
352 KEY(9, 1, KEY_5),
353 KEY(9, 2, KEY_6),
354 KEY(9, 3, KEY_7),
355 KEY(9, 4, KEY_8),
356 KEY(9, 5, KEY_1),
357 KEY(9, 6, KEY_2),
358 KEY(9, 7, KEY_3),
359
360 KEY(10, 0, KEY_F7),
361 KEY(10, 1, KEY_F8),
362 KEY(10, 2, KEY_F9),
363 KEY(10, 3, KEY_F10),
364 KEY(10, 4, KEY_FN),
365 KEY(10, 5, KEY_9),
366 KEY(10, 6, KEY_0),
367 KEY(10, 7, KEY_DOT),
368
369 KEY(11, 0, KEY_LEFTCTRL),
370 KEY(11, 1, KEY_F11),
371 KEY(11, 2, KEY_ENTER),
372 KEY(11, 3, KEY_SEARCH),
373 KEY(11, 4, KEY_DELETE),
374 KEY(11, 5, KEY_RIGHT),
375 KEY(11, 6, KEY_LEFT),
376 KEY(11, 7, KEY_RIGHTSHIFT),
377 KEY(0, 0, KEY_VOLUMEUP),
378 KEY(0, 1, KEY_VOLUMEDOWN),
379 KEY(0, 2, KEY_CAMERA_SNAPSHOT),
380 KEY(0, 3, KEY_CAMERA_FOCUS),
381};
382
383static struct matrix_keymap_data keymap_data_sim = {
384 .keymap_size = ARRAY_SIZE(keymap_sim),
385 .keymap = keymap_sim,
386};
387
388static struct pm8xxx_keypad_platform_data keypad_data_sim = {
389 .input_name = "keypad_8960",
390 .input_phys_device = "keypad_8960/input0",
391 .num_rows = 12,
392 .num_cols = 8,
393 .rows_gpio_start = PM8921_GPIO_PM_TO_SYS(9),
394 .cols_gpio_start = PM8921_GPIO_PM_TO_SYS(1),
395 .debounce_ms = 15,
396 .scan_delay_ms = 32,
397 .row_hold_ns = 91500,
398 .wakeup = 1,
399 .keymap_data = &keymap_data_sim,
400};
401
402static int pm8921_therm_mitigation[] = {
403 1100,
404 700,
405 600,
406 325,
407};
408
Abhijeet Dharmapurikara93ede82011-11-17 12:20:03 -0800409#define MAX_VOLTAGE_MV 4200
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800410static struct pm8921_charger_platform_data pm8921_chg_pdata __devinitdata = {
411 .safety_time = 180,
412 .update_time = 60000,
Abhijeet Dharmapurikara93ede82011-11-17 12:20:03 -0800413 .max_voltage = MAX_VOLTAGE_MV,
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800414 .min_voltage = 3200,
415 .resume_voltage_delta = 100,
416 .term_current = 100,
417 .cool_temp = 10,
418 .warm_temp = 40,
419 .temp_check_period = 1,
420 .max_bat_chg_current = 1100,
421 .cool_bat_chg_current = 350,
422 .warm_bat_chg_current = 350,
423 .cool_bat_voltage = 4100,
424 .warm_bat_voltage = 4100,
425 .thermal_mitigation = pm8921_therm_mitigation,
426 .thermal_levels = ARRAY_SIZE(pm8921_therm_mitigation),
427};
428
429static struct pm8xxx_misc_platform_data pm8xxx_misc_pdata = {
430 .priority = 0,
431};
432
433static struct pm8921_bms_platform_data pm8921_bms_pdata __devinitdata = {
434 .r_sense = 10,
435 .i_test = 2500,
436 .v_failure = 3000,
437 .calib_delay_ms = 600000,
Abhijeet Dharmapurikara93ede82011-11-17 12:20:03 -0800438 .max_voltage_uv = MAX_VOLTAGE_MV * 1000,
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800439};
440
441#define PM8921_LC_LED_MAX_CURRENT 4 /* I = 4mA */
Amy Maloche38dd7a72011-12-06 09:51:41 -0800442#define PM8921_LC_LED_LOW_CURRENT 1 /* I = 1mA */
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800443#define PM8XXX_LED_PWM_PERIOD 1000
444#define PM8XXX_LED_PWM_DUTY_MS 20
445/**
446 * PM8XXX_PWM_CHANNEL_NONE shall be used when LED shall not be
447 * driven using PWM feature.
448 */
449#define PM8XXX_PWM_CHANNEL_NONE -1
450
Amy Maloche38dd7a72011-12-06 09:51:41 -0800451static struct led_info pm8921_led_info_liquid[] = {
452 {
453 .name = "led:red",
454 .flags = PM8XXX_ID_LED_0,
Amy Maloche65a01a82012-01-30 12:36:42 -0800455 .default_trigger = "battery-charging",
Amy Maloche38dd7a72011-12-06 09:51:41 -0800456 },
457 {
458 .name = "led:green",
459 .flags = PM8XXX_ID_LED_0,
Amy Maloche65a01a82012-01-30 12:36:42 -0800460 .default_trigger = "battery-full",
Amy Maloche38dd7a72011-12-06 09:51:41 -0800461 },
462 {
463 .name = "led:blue",
464 .flags = PM8XXX_ID_LED_2,
Amy Maloche65a01a82012-01-30 12:36:42 -0800465 .default_trigger = "dc-online",
Amy Maloche38dd7a72011-12-06 09:51:41 -0800466 },
467};
468
469static struct pm8xxx_led_config pm8921_led_configs_liquid[] = {
470 [0] = {
471 .id = PM8XXX_ID_LED_0,
472 .mode = PM8XXX_LED_MODE_MANUAL,
473 .max_current = PM8921_LC_LED_MAX_CURRENT,
474 },
475 [1] = {
476 .id = PM8XXX_ID_LED_1,
477 .mode = PM8XXX_LED_MODE_MANUAL,
478 .max_current = PM8921_LC_LED_LOW_CURRENT,
479 },
480 [2] = {
481 .id = PM8XXX_ID_LED_2,
482 .mode = PM8XXX_LED_MODE_MANUAL,
483 .max_current = PM8921_LC_LED_MAX_CURRENT,
484 },
485};
486
487static struct led_platform_data pm8xxx_leds_core_liquid = {
488 .num_leds = ARRAY_SIZE(pm8921_led_info_liquid),
489 .leds = pm8921_led_info_liquid,
490};
491
492static struct pm8xxx_led_platform_data pm8xxx_leds_pdata_liquid = {
493 .led_core = &pm8xxx_leds_core_liquid,
494 .configs = pm8921_led_configs_liquid,
495 .num_configs = ARRAY_SIZE(pm8921_led_configs_liquid),
496};
497
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800498static struct led_info pm8921_led_info[] = {
499 [0] = {
500 .name = "led:battery_charging",
501 .default_trigger = "battery-charging",
502 },
503 [1] = {
504 .name = "led:battery_full",
505 .default_trigger = "battery-full",
506 },
507};
508
509static struct led_platform_data pm8921_led_core_pdata = {
510 .num_leds = ARRAY_SIZE(pm8921_led_info),
511 .leds = pm8921_led_info,
512};
513
514static int pm8921_led0_pwm_duty_pcts[56] = {
515 1, 4, 8, 12, 16, 20, 24, 28, 32, 36,
516 40, 44, 46, 52, 56, 60, 64, 68, 72, 76,
517 80, 84, 88, 92, 96, 100, 100, 100, 98, 95,
518 92, 88, 84, 82, 78, 74, 70, 66, 62, 58,
519 58, 54, 50, 48, 42, 38, 34, 30, 26, 22,
520 14, 10, 6, 4, 1
521};
522
523static struct pm8xxx_pwm_duty_cycles pm8921_led0_pwm_duty_cycles = {
524 .duty_pcts = (int *)&pm8921_led0_pwm_duty_pcts,
525 .num_duty_pcts = ARRAY_SIZE(pm8921_led0_pwm_duty_pcts),
526 .duty_ms = PM8XXX_LED_PWM_DUTY_MS,
527 .start_idx = 0,
528};
529
530static struct pm8xxx_led_config pm8921_led_configs[] = {
531 [0] = {
532 .id = PM8XXX_ID_LED_0,
533 .mode = PM8XXX_LED_MODE_PWM2,
534 .max_current = PM8921_LC_LED_MAX_CURRENT,
535 .pwm_channel = 5,
536 .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
537 .pwm_duty_cycles = &pm8921_led0_pwm_duty_cycles,
538 },
539 [1] = {
540 .id = PM8XXX_ID_LED_1,
541 .mode = PM8XXX_LED_MODE_PWM1,
542 .max_current = PM8921_LC_LED_MAX_CURRENT,
543 .pwm_channel = 4,
544 .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
545 },
546};
547
548static struct pm8xxx_led_platform_data pm8xxx_leds_pdata = {
549 .led_core = &pm8921_led_core_pdata,
550 .configs = pm8921_led_configs,
551 .num_configs = ARRAY_SIZE(pm8921_led_configs),
552};
553
554static struct pm8xxx_ccadc_platform_data pm8xxx_ccadc_pdata = {
555 .r_sense = 10,
556};
557
558static struct pm8921_platform_data pm8921_platform_data __devinitdata = {
559 .irq_pdata = &pm8xxx_irq_pdata,
560 .gpio_pdata = &pm8xxx_gpio_pdata,
561 .mpp_pdata = &pm8xxx_mpp_pdata,
562 .rtc_pdata = &pm8xxx_rtc_pdata,
563 .pwrkey_pdata = &pm8xxx_pwrkey_pdata,
564 .keypad_pdata = &keypad_data,
565 .misc_pdata = &pm8xxx_misc_pdata,
566 .regulator_pdatas = msm_pm8921_regulator_pdata,
567 .charger_pdata = &pm8921_chg_pdata,
568 .bms_pdata = &pm8921_bms_pdata,
569 .adc_pdata = &pm8xxx_adc_pdata,
570 .leds_pdata = &pm8xxx_leds_pdata,
571 .ccadc_pdata = &pm8xxx_ccadc_pdata,
572};
573
574static struct msm_ssbi_platform_data msm8960_ssbi_pm8921_pdata __devinitdata = {
575 .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
576 .slave = {
577 .name = "pm8921-core",
578 .platform_data = &pm8921_platform_data,
579 },
580};
581
582void __init msm8960_init_pmic(void)
583{
584 pmic_reset_irq = PM8921_IRQ_BASE + PM8921_RESOUT_IRQ;
Jay Chokshi33c044a2011-12-07 13:05:40 -0800585 msm8960_device_ssbi_pmic.dev.platform_data =
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800586 &msm8960_ssbi_pm8921_pdata;
587 pm8921_platform_data.num_regulators = msm_pm8921_regulator_pdata_len;
588
589 /* Simulator supports a QWERTY keypad */
590 if (machine_is_msm8960_sim())
591 pm8921_platform_data.keypad_pdata = &keypad_data_sim;
592
Amy Maloche38dd7a72011-12-06 09:51:41 -0800593 if (machine_is_msm8960_liquid()) {
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800594 pm8921_platform_data.keypad_pdata = &keypad_data_liquid;
Amy Maloche38dd7a72011-12-06 09:51:41 -0800595 pm8921_platform_data.leds_pdata = &pm8xxx_leds_pdata_liquid;
596 }
Stepan Moskovchenkoef1e0b62011-12-01 12:10:16 -0800597}