blob: a3e1b279104a2c6ac38cdd5cb3f2aae2354eb6b6 [file] [log] [blame]
Amy Maloche6218d682012-01-10 17:25:03 -08001/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
Stepan Moskovchenko39236d72011-11-30 17:42:23 -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>
Jay Chokshi06fa7542011-12-07 13:09:17 -080015#include <linux/mfd/pm8xxx/pm8038.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080016#include <linux/mfd/pm8xxx/pm8xxx-adc.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080017#include <linux/msm_ssbi.h>
18#include <asm/mach-types.h>
19#include <mach/msm_bus_board.h>
20#include <mach/restart.h>
21#include "devices.h"
Stepan Moskovchenko5a83dba2011-12-05 17:30:17 -080022#include "board-8930.h"
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080023
24struct pm8xxx_gpio_init {
25 unsigned gpio;
26 struct pm_gpio config;
27};
28
29struct pm8xxx_mpp_init {
30 unsigned mpp;
31 struct pm8xxx_mpp_config_data config;
32};
33
34#define PM8XXX_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \
35 _func, _inv, _disable) \
36{ \
Jay Chokshi06fa7542011-12-07 13:09:17 -080037 .gpio = PM8038_GPIO_PM_TO_SYS(_gpio), \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080038 .config = { \
39 .direction = _dir, \
40 .output_buffer = _buf, \
41 .output_value = _val, \
42 .pull = _pull, \
43 .vin_sel = _vin, \
44 .out_strength = _out_strength, \
45 .function = _func, \
46 .inv_int_pol = _inv, \
47 .disable_pin = _disable, \
48 } \
49}
50
51#define PM8XXX_MPP_INIT(_mpp, _type, _level, _control) \
52{ \
Jay Chokshi06fa7542011-12-07 13:09:17 -080053 .mpp = PM8038_MPP_PM_TO_SYS(_mpp), \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080054 .config = { \
55 .type = PM8XXX_MPP_TYPE_##_type, \
56 .level = _level, \
57 .control = PM8XXX_MPP_##_control, \
58 } \
59}
60
61#define PM8XXX_GPIO_DISABLE(_gpio) \
Jay Chokshi06fa7542011-12-07 13:09:17 -080062 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM8038_GPIO_VIN_L11, \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080063 0, 0, 0, 1)
64
65#define PM8XXX_GPIO_OUTPUT(_gpio, _val) \
66 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
Jay Chokshi06fa7542011-12-07 13:09:17 -080067 PM_GPIO_PULL_NO, PM8038_GPIO_VIN_L11, \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080068 PM_GPIO_STRENGTH_HIGH, \
69 PM_GPIO_FUNC_NORMAL, 0, 0)
70
71#define PM8XXX_GPIO_INPUT(_gpio, _pull) \
72 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \
Jay Chokshi06fa7542011-12-07 13:09:17 -080073 _pull, PM8038_GPIO_VIN_L11, \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080074 PM_GPIO_STRENGTH_NO, \
75 PM_GPIO_FUNC_NORMAL, 0, 0)
76
77#define PM8XXX_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \
78 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
Jay Chokshi06fa7542011-12-07 13:09:17 -080079 PM_GPIO_PULL_NO, PM8038_GPIO_VIN_L11, \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080080 PM_GPIO_STRENGTH_HIGH, \
81 _func, 0, 0)
82
83#define PM8XXX_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \
84 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
85 PM_GPIO_PULL_NO, _vin, \
86 PM_GPIO_STRENGTH_HIGH, \
87 PM_GPIO_FUNC_NORMAL, 0, 0)
88
Jay Chokshi06fa7542011-12-07 13:09:17 -080089/* Initial pm8038 GPIO configurations */
Anirudh Ghayaleb3af972011-12-13 17:29:06 +053090static struct pm8xxx_gpio_init pm8038_gpios[] __initdata = {
91 /* keys GPIOs */
Anirudh Ghayalc066e042012-03-09 10:16:58 -080092 PM8XXX_GPIO_INPUT(3, PM_GPIO_PULL_UP_30),
93 PM8XXX_GPIO_INPUT(8, PM_GPIO_PULL_UP_30),
94 PM8XXX_GPIO_INPUT(10, PM_GPIO_PULL_UP_30),
95 PM8XXX_GPIO_INPUT(11, PM_GPIO_PULL_UP_30),
Amy Malochee8de95d2012-02-23 10:40:25 -080096 /* haptics gpio */
97 PM8XXX_GPIO_OUTPUT_FUNC(7, 0, PM_GPIO_FUNC_1),
Manoj Raoc6d904c2012-06-22 00:32:14 -070098 /* MHL PWR EN */
99 PM8XXX_GPIO_OUTPUT_VIN(5, 1, PM_GPIO_VIN_VPH),
Anirudh Ghayaleb3af972011-12-13 17:29:06 +0530100};
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800101
Jay Chokshi06fa7542011-12-07 13:09:17 -0800102/* Initial pm8038 MPP configurations */
Jay Chokshicee3d062012-07-02 19:09:45 -0700103static struct pm8xxx_mpp_init pm8038_mpps[] __initdata = {};
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800104
Jay Chokshi06fa7542011-12-07 13:09:17 -0800105void __init msm8930_pm8038_gpio_mpp_init(void)
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800106{
107 int i, rc;
108
Jay Chokshi06fa7542011-12-07 13:09:17 -0800109 for (i = 0; i < ARRAY_SIZE(pm8038_gpios); i++) {
110 rc = pm8xxx_gpio_config(pm8038_gpios[i].gpio,
111 &pm8038_gpios[i].config);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800112 if (rc) {
113 pr_err("%s: pm8xxx_gpio_config: rc=%d\n", __func__, rc);
114 break;
115 }
116 }
117
Jay Chokshi06fa7542011-12-07 13:09:17 -0800118 /* Initial MPP configuration. */
119 for (i = 0; i < ARRAY_SIZE(pm8038_mpps); i++) {
120 rc = pm8xxx_mpp_config(pm8038_mpps[i].mpp,
121 &pm8038_mpps[i].config);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800122 if (rc) {
123 pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc);
124 break;
125 }
126 }
127}
128
Siddartha Mohanadoss3da01a12011-12-21 19:31:24 -0800129static struct pm8xxx_adc_amux pm8xxx_adc_channels_data[] = {
130 {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1,
131 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
132 {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1,
133 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
134 {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1,
135 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
136 {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1,
137 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
138 {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1,
139 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
140 {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1,
141 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
142 {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2,
143 ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM},
144 {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV2,
145 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
146 {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1,
147 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
148 {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
149 ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM},
150 {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1,
151 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
152 {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1,
153 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
154 {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
155 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
156 {"pa_therm1", ADC_MPP_1_AMUX4, CHAN_PATH_SCALING1, AMUX_RSV1,
157 ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM},
158 {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0,
159 ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM},
160 {"pa_therm0", ADC_MPP_1_AMUX3, CHAN_PATH_SCALING1, AMUX_RSV1,
161 ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM},
162};
163
164static struct pm8xxx_adc_properties pm8xxx_adc_data = {
165 .adc_vdd_reference = 1800, /* milli-voltage for this adc */
166 .bitresolution = 15,
167 .bipolar = 0,
168};
169
170static struct pm8xxx_adc_platform_data pm8xxx_adc_pdata = {
171 .adc_channel = pm8xxx_adc_channels_data,
172 .adc_num_board_channel = ARRAY_SIZE(pm8xxx_adc_channels_data),
173 .adc_prop = &pm8xxx_adc_data,
174 .adc_mpp_base = PM8038_MPP_PM_TO_SYS(1),
175};
176
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800177static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata __devinitdata = {
Jay Chokshi06fa7542011-12-07 13:09:17 -0800178 .irq_base = PM8038_IRQ_BASE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800179 .devirq = MSM_GPIO_TO_INT(104),
180 .irq_trigger_flag = IRQF_TRIGGER_LOW,
181};
182
183static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata __devinitdata = {
Jay Chokshi06fa7542011-12-07 13:09:17 -0800184 .gpio_base = PM8038_GPIO_PM_TO_SYS(1),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800185};
186
187static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata __devinitdata = {
Jay Chokshi06fa7542011-12-07 13:09:17 -0800188 .mpp_base = PM8038_MPP_PM_TO_SYS(1),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800189};
190
191static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata __devinitdata = {
Jay Chokshi06fa7542011-12-07 13:09:17 -0800192 .rtc_write_enable = false,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800193 .rtc_alarm_powerup = false,
194};
195
196static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = {
197 .pull_up = 1,
Amy Maloche6218d682012-01-10 17:25:03 -0800198 .kpd_trigger_delay_us = 15625,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800199 .wakeup = 1,
200};
201
David Keitelc72d8192012-01-09 11:33:55 -0800202static int pm8921_therm_mitigation[] = {
203 1100,
204 700,
205 600,
206 325,
207};
208
209#define MAX_VOLTAGE_MV 4200
Abhijeet Dharmapurikard6d66c72012-08-06 14:02:51 -0700210#define CHG_TERM_MA 100
David Keitelc72d8192012-01-09 11:33:55 -0800211static struct pm8921_charger_platform_data pm8921_chg_pdata __devinitdata = {
212 .safety_time = 180,
213 .update_time = 60000,
214 .max_voltage = MAX_VOLTAGE_MV,
215 .min_voltage = 3200,
David Keitel0789fc62012-06-07 17:43:27 -0700216 .uvd_thresh_voltage = 4050,
Abhijeet Dharmapurikar5d404652012-11-14 17:57:53 -0800217 .alarm_voltage = 3400,
David Keitelc72d8192012-01-09 11:33:55 -0800218 .resume_voltage_delta = 100,
Abhijeet Dharmapurikard6d66c72012-08-06 14:02:51 -0700219 .term_current = CHG_TERM_MA,
David Keitelc72d8192012-01-09 11:33:55 -0800220 .cool_temp = 10,
221 .warm_temp = 40,
222 .temp_check_period = 1,
223 .max_bat_chg_current = 1100,
224 .cool_bat_chg_current = 350,
225 .warm_bat_chg_current = 350,
226 .cool_bat_voltage = 4100,
227 .warm_bat_voltage = 4100,
228 .thermal_mitigation = pm8921_therm_mitigation,
229 .thermal_levels = ARRAY_SIZE(pm8921_therm_mitigation),
Jay Chokshi74730c72012-03-15 14:11:28 -0700230 .led_src_config = LED_SRC_VPH_PWR,
David Keitelc72d8192012-01-09 11:33:55 -0800231};
232
Amy Maloche8a219312012-01-19 17:39:56 -0800233#define PM8038_WLED_MAX_CURRENT 25
Amy Malochea0352b52012-02-27 18:35:23 -0800234#define PM8XXX_LED_PWM_PERIOD 1000
235#define PM8XXX_LED_PWM_DUTY_MS 20
236#define PM8038_RGB_LED_MAX_CURRENT 12
Amy Maloche8a219312012-01-19 17:39:56 -0800237
238static struct led_info pm8038_led_info[] = {
239 [0] = {
240 .name = "wled",
Chandan Uddaraju194a4b52012-03-21 10:11:18 -0700241 .default_trigger = "bkl_trigger",
Amy Maloche8a219312012-01-19 17:39:56 -0800242 },
Amy Malochea0352b52012-02-27 18:35:23 -0800243 [1] = {
244 .name = "led:rgb_red",
245 .default_trigger = "battery-charging",
246 },
247 [2] = {
248 .name = "led:rgb_green",
249 },
250 [3] = {
251 .name = "led:rgb_blue",
252 },
Amy Maloche8a219312012-01-19 17:39:56 -0800253};
254
255static struct led_platform_data pm8038_led_core_pdata = {
256 .num_leds = ARRAY_SIZE(pm8038_led_info),
257 .leds = pm8038_led_info,
258};
259
260static struct wled_config_data wled_cfg = {
261 .dig_mod_gen_en = true,
262 .cs_out_en = true,
263 .ctrl_delay_us = 0,
264 .op_fdbck = true,
265 .ovp_val = WLED_OVP_32V,
266 .boost_curr_lim = WLED_CURR_LIMIT_525mA,
267 .num_strings = 1,
268};
269
Amy Malochea0352b52012-02-27 18:35:23 -0800270static int pm8038_led0_pwm_duty_pcts[56] = {
271 1, 4, 8, 12, 16, 20, 24, 28, 32, 36,
272 40, 44, 46, 52, 56, 60, 64, 68, 72, 76,
273 80, 84, 88, 92, 96, 100, 100, 100, 98, 95,
274 92, 88, 84, 82, 78, 74, 70, 66, 62, 58,
275 58, 54, 50, 48, 42, 38, 34, 30, 26, 22,
276 14, 10, 6, 4, 1
277};
278
Jay Chokshibe517232012-06-15 18:20:56 -0700279/*
280 * Note: There is a bug in LPG module that results in incorrect
281 * behavior of pattern when LUT index 0 is used. So effectively
282 * there are 63 usable LUT entries.
283 */
Amy Malochea0352b52012-02-27 18:35:23 -0800284static struct pm8xxx_pwm_duty_cycles pm8038_led0_pwm_duty_cycles = {
285 .duty_pcts = (int *)&pm8038_led0_pwm_duty_pcts,
286 .num_duty_pcts = ARRAY_SIZE(pm8038_led0_pwm_duty_pcts),
287 .duty_ms = PM8XXX_LED_PWM_DUTY_MS,
Jay Chokshibe517232012-06-15 18:20:56 -0700288 .start_idx = 1,
Amy Malochea0352b52012-02-27 18:35:23 -0800289};
290
Amy Maloche8a219312012-01-19 17:39:56 -0800291static struct pm8xxx_led_config pm8038_led_configs[] = {
292 [0] = {
293 .id = PM8XXX_ID_WLED,
294 .mode = PM8XXX_LED_MODE_MANUAL,
295 .max_current = PM8038_WLED_MAX_CURRENT,
Chandan Uddaraju194a4b52012-03-21 10:11:18 -0700296 .default_state = 0,
Amy Maloche8a219312012-01-19 17:39:56 -0800297 .wled_cfg = &wled_cfg,
298 },
Amy Malochea0352b52012-02-27 18:35:23 -0800299 [1] = {
300 .id = PM8XXX_ID_RGB_LED_RED,
301 .mode = PM8XXX_LED_MODE_PWM1,
302 .max_current = PM8038_RGB_LED_MAX_CURRENT,
303 .pwm_channel = 5,
304 .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
305 .pwm_duty_cycles = &pm8038_led0_pwm_duty_cycles,
306 },
307 [2] = {
308 .id = PM8XXX_ID_RGB_LED_GREEN,
309 .mode = PM8XXX_LED_MODE_PWM1,
310 .max_current = PM8038_RGB_LED_MAX_CURRENT,
311 .pwm_channel = 4,
312 .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
313 .pwm_duty_cycles = &pm8038_led0_pwm_duty_cycles,
314 },
315 [3] = {
316 .id = PM8XXX_ID_RGB_LED_BLUE,
317 .mode = PM8XXX_LED_MODE_PWM1,
318 .max_current = PM8038_RGB_LED_MAX_CURRENT,
319 .pwm_channel = 3,
320 .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
321 .pwm_duty_cycles = &pm8038_led0_pwm_duty_cycles,
322 },
Amy Maloche8a219312012-01-19 17:39:56 -0800323};
324
325static struct pm8xxx_led_platform_data pm8xxx_leds_pdata = {
326 .led_core = &pm8038_led_core_pdata,
327 .configs = pm8038_led_configs,
328 .num_configs = ARRAY_SIZE(pm8038_led_configs),
329};
330
David Keitelc72d8192012-01-09 11:33:55 -0800331static struct pm8xxx_ccadc_platform_data pm8xxx_ccadc_pdata = {
332 .r_sense = 10,
David Keitel3c378822012-06-07 13:43:22 -0700333 .calib_delay_ms = 600000,
David Keitelc72d8192012-01-09 11:33:55 -0800334};
335
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800336static struct pm8xxx_misc_platform_data pm8xxx_misc_pdata = {
337 .priority = 0,
338};
339
Asish Bhattacharya4c24bca2012-09-07 17:22:57 +0530340/*
341 * 0x254=0xC8 (Threshold=110, preamp bias=01)
342 * 0x255=0xC1 (Hold=110, max attn=0000, mute=1)
343 * 0x256=0xB0 (decay=101, attack=10, delay=0)
344 */
345
Asish Bhattacharya218f80b2012-03-19 02:47:34 -0700346static struct pm8xxx_spk_platform_data pm8xxx_spk_pdata = {
347 .spk_add_enable = false,
Asish Bhattacharya4c24bca2012-09-07 17:22:57 +0530348 .cd_ng_threshold = 0x6,
349 .cd_nf_preamp_bias = 0x1,
350 .cd_ng_hold = 0x6,
351 .cd_ng_max_atten = 0x0,
352 .noise_mute = 1,
353 .cd_ng_decay_rate = 0x5,
354 .cd_ng_attack_rate = 0x2,
355 .cd_delay = 0x0,
Asish Bhattacharya218f80b2012-03-19 02:47:34 -0700356};
357
David Keitelc72d8192012-01-09 11:33:55 -0800358static struct pm8921_bms_platform_data pm8921_bms_pdata __devinitdata = {
Abhijeet Dharmapurikard6d66c72012-08-06 14:02:51 -0700359 .battery_type = BATT_UNKNOWN,
360 .r_sense = 10,
361 .v_cutoff = 3400,
362 .max_voltage_uv = MAX_VOLTAGE_MV * 1000,
363 .shutdown_soc_valid_limit = 20,
364 .adjust_soc_low_threshold = 25,
365 .chg_term_ua = CHG_TERM_MA * 1000,
David Keitelc72d8192012-01-09 11:33:55 -0800366};
367
Jay Chokshi06fa7542011-12-07 13:09:17 -0800368static struct pm8038_platform_data pm8038_platform_data __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800369 .irq_pdata = &pm8xxx_irq_pdata,
370 .gpio_pdata = &pm8xxx_gpio_pdata,
371 .mpp_pdata = &pm8xxx_mpp_pdata,
372 .rtc_pdata = &pm8xxx_rtc_pdata,
373 .pwrkey_pdata = &pm8xxx_pwrkey_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800374 .misc_pdata = &pm8xxx_misc_pdata,
David Collins1d4061b2011-12-06 15:36:40 -0800375 .regulator_pdatas = msm8930_pm8038_regulator_pdata,
David Keitelc72d8192012-01-09 11:33:55 -0800376 .charger_pdata = &pm8921_chg_pdata,
377 .bms_pdata = &pm8921_bms_pdata,
Siddartha Mohanadoss3da01a12011-12-21 19:31:24 -0800378 .adc_pdata = &pm8xxx_adc_pdata,
Amy Maloche8a219312012-01-19 17:39:56 -0800379 .leds_pdata = &pm8xxx_leds_pdata,
David Keitelc72d8192012-01-09 11:33:55 -0800380 .ccadc_pdata = &pm8xxx_ccadc_pdata,
Asish Bhattacharya218f80b2012-03-19 02:47:34 -0700381 .spk_pdata = &pm8xxx_spk_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800382};
383
Jay Chokshi06fa7542011-12-07 13:09:17 -0800384static struct msm_ssbi_platform_data msm8930_ssbi_pm8038_pdata __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800385 .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
386 .slave = {
Jay Chokshi06fa7542011-12-07 13:09:17 -0800387 .name = "pm8038-core",
388 .platform_data = &pm8038_platform_data,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800389 },
390};
391
392void __init msm8930_init_pmic(void)
393{
Jay Chokshi06fa7542011-12-07 13:09:17 -0800394 pmic_reset_irq = PM8038_IRQ_BASE + PM8038_RESOUT_IRQ;
Jay Chokshi33c044a2011-12-07 13:05:40 -0800395 msm8960_device_ssbi_pmic.dev.platform_data =
Jay Chokshi06fa7542011-12-07 13:09:17 -0800396 &msm8930_ssbi_pm8038_pdata;
David Collins1d4061b2011-12-06 15:36:40 -0800397 pm8038_platform_data.num_regulators
398 = msm8930_pm8038_regulator_pdata_len;
David Keitel35e11872012-02-17 17:40:42 -0800399 if (machine_is_apq8064_mtp())
400 pm8921_bms_pdata.battery_type = BATT_PALLADIUM;
401 else if (machine_is_apq8064_liquid())
402 pm8921_bms_pdata.battery_type = BATT_DESAY;
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800403}