blob: e77e7c05cb248be42f00d94a2c30c1400ff1baa4 [file] [log] [blame]
Jay Chokshie8741282012-01-25 15:22:55 -08001/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -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/init.h>
15#include <linux/ioport.h>
Steve Mucklef132c6c2012-06-06 18:30:57 -070016#include <linux/gpio.h>
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -080017#include <linux/platform_device.h>
18#include <linux/bootmem.h>
Jay Chokshie8741282012-01-25 15:22:55 -080019#include <linux/mfd/pm8xxx/pm8921.h>
20#include <linux/leds.h>
21#include <linux/leds-pm8xxx.h>
Jay Chokshif3a9ea82012-01-12 16:34:43 -080022#include <linux/mfd/pm8xxx/pm8xxx-adc.h>
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -080023#include <asm/mach-types.h>
24#include <asm/mach/mmc.h>
25#include <mach/msm_bus_board.h>
26#include <mach/board.h>
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -080027#include <mach/gpiomux.h>
Jay Chokshie8741282012-01-25 15:22:55 -080028#include <mach/restart.h>
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -080029#include "devices.h"
30#include "board-8064.h"
31
Jay Chokshie8741282012-01-25 15:22:55 -080032struct pm8xxx_gpio_init {
33 unsigned gpio;
34 struct pm_gpio config;
35};
36
37struct pm8xxx_mpp_init {
38 unsigned mpp;
39 struct pm8xxx_mpp_config_data config;
40};
41
42#define PM8921_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \
43 _func, _inv, _disable) \
44{ \
45 .gpio = PM8921_GPIO_PM_TO_SYS(_gpio), \
46 .config = { \
47 .direction = _dir, \
48 .output_buffer = _buf, \
49 .output_value = _val, \
50 .pull = _pull, \
51 .vin_sel = _vin, \
52 .out_strength = _out_strength, \
53 .function = _func, \
54 .inv_int_pol = _inv, \
55 .disable_pin = _disable, \
56 } \
57}
58
59#define PM8921_MPP_INIT(_mpp, _type, _level, _control) \
60{ \
61 .mpp = PM8921_MPP_PM_TO_SYS(_mpp), \
62 .config = { \
63 .type = PM8XXX_MPP_TYPE_##_type, \
64 .level = _level, \
65 .control = PM8XXX_MPP_##_control, \
66 } \
67}
68
69#define PM8821_MPP_INIT(_mpp, _type, _level, _control) \
70{ \
71 .mpp = PM8821_MPP_PM_TO_SYS(_mpp), \
72 .config = { \
73 .type = PM8XXX_MPP_TYPE_##_type, \
74 .level = _level, \
75 .control = PM8XXX_MPP_##_control, \
76 } \
77}
78
79#define PM8921_GPIO_DISABLE(_gpio) \
80 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM_GPIO_VIN_S4, \
81 0, 0, 0, 1)
82
83#define PM8921_GPIO_OUTPUT(_gpio, _val, _strength) \
84 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
85 PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
86 PM_GPIO_STRENGTH_##_strength, \
87 PM_GPIO_FUNC_NORMAL, 0, 0)
88
Jay Chokshi1de4f9d2012-02-07 16:11:31 -080089#define PM8921_GPIO_OUTPUT_BUFCONF(_gpio, _val, _strength, _bufconf) \
90 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT,\
91 PM_GPIO_OUT_BUF_##_bufconf, _val, \
92 PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
93 PM_GPIO_STRENGTH_##_strength, \
94 PM_GPIO_FUNC_NORMAL, 0, 0)
95
Jay Chokshie8741282012-01-25 15:22:55 -080096#define PM8921_GPIO_INPUT(_gpio, _pull) \
97 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \
98 _pull, PM_GPIO_VIN_S4, \
99 PM_GPIO_STRENGTH_NO, \
100 PM_GPIO_FUNC_NORMAL, 0, 0)
101
102#define PM8921_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \
103 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
104 PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
105 PM_GPIO_STRENGTH_HIGH, \
106 _func, 0, 0)
107
108#define PM8921_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \
109 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
110 PM_GPIO_PULL_NO, _vin, \
111 PM_GPIO_STRENGTH_HIGH, \
112 PM_GPIO_FUNC_NORMAL, 0, 0)
113
114/* Initial PM8921 GPIO configurations */
115static struct pm8xxx_gpio_init pm8921_gpios[] __initdata = {
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800116 PM8921_GPIO_OUTPUT(14, 1, HIGH), /* HDMI Mux Selector */
David Collins390fc332012-02-07 14:38:16 -0800117 PM8921_GPIO_OUTPUT(23, 0, HIGH), /* touchscreen power FET */
Jay Chokshi1de4f9d2012-02-07 16:11:31 -0800118 PM8921_GPIO_OUTPUT_BUFCONF(25, 0, LOW, CMOS), /* DISP_RESET_N */
119 PM8921_GPIO_OUTPUT_FUNC(26, 0, PM_GPIO_FUNC_2), /* Bl: Off, PWM mode */
David Keitel2f613d92012-02-15 11:29:16 -0800120 PM8921_GPIO_OUTPUT_VIN(30, 1, PM_GPIO_VIN_VPH), /* SMB349 susp line */
Jay Chokshi1de4f9d2012-02-07 16:11:31 -0800121 PM8921_GPIO_OUTPUT_BUFCONF(36, 1, LOW, OPEN_DRAIN),
Amy Maloche70090f992012-02-16 16:35:26 -0800122 PM8921_GPIO_OUTPUT_FUNC(44, 0, PM_GPIO_FUNC_2),
123 PM8921_GPIO_OUTPUT(33, 0, HIGH),
124 PM8921_GPIO_OUTPUT(20, 0, HIGH),
Anirudh Ghayal71478012012-03-08 17:54:23 -0800125 PM8921_GPIO_INPUT(35, PM_GPIO_PULL_UP_30),
126 PM8921_GPIO_INPUT(38, PM_GPIO_PULL_UP_30),
Shiv Maliyappanahalli7e0beff2012-02-06 15:56:39 -0800127 /* TABLA CODEC RESET */
128 PM8921_GPIO_OUTPUT(34, 1, MED),
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -0600129 PM8921_GPIO_OUTPUT(13, 0, HIGH), /* PCIE_CLK_PWR_EN */
Niranjana Vishwanathapura459a27d2012-07-20 12:23:55 -0600130 PM8921_GPIO_INPUT(12, PM_GPIO_PULL_UP_30), /* PCIE_WAKE_N */
Mohan Pallaka474b94b2012-01-25 12:59:58 +0530131};
132
133static struct pm8xxx_gpio_init pm8921_mtp_kp_gpios[] __initdata = {
Anirudh Ghayal71478012012-03-08 17:54:23 -0800134 PM8921_GPIO_INPUT(3, PM_GPIO_PULL_UP_30),
135 PM8921_GPIO_INPUT(4, PM_GPIO_PULL_UP_30),
Mohan Pallaka474b94b2012-01-25 12:59:58 +0530136};
137
138static struct pm8xxx_gpio_init pm8921_cdp_kp_gpios[] __initdata = {
Anirudh Ghayal71478012012-03-08 17:54:23 -0800139 PM8921_GPIO_INPUT(27, PM_GPIO_PULL_UP_30),
140 PM8921_GPIO_INPUT(42, PM_GPIO_PULL_UP_30),
Oluwafemi Adeyemi48fc3262012-03-19 13:26:52 -0700141 PM8921_GPIO_INPUT(17, PM_GPIO_PULL_UP_1P5), /* SD_WP */
Jay Chokshie8741282012-01-25 15:22:55 -0800142};
143
Vijayavardhan Vennapusa4fa13692012-08-02 14:35:03 +0530144static struct pm8xxx_gpio_init pm8921_mpq_gpios[] __initdata = {
145 PM8921_GPIO_INIT(27, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0,
146 PM_GPIO_PULL_NO, PM_GPIO_VIN_VPH, PM_GPIO_STRENGTH_NO,
147 PM_GPIO_FUNC_NORMAL, 0, 0),
148};
149
Jay Chokshie8741282012-01-25 15:22:55 -0800150/* Initial PM8XXX MPP configurations */
151static struct pm8xxx_mpp_init pm8xxx_mpps[] __initdata = {
Jay Chokshi1de4f9d2012-02-07 16:11:31 -0800152 PM8921_MPP_INIT(3, D_OUTPUT, PM8921_MPP_DIG_LEVEL_VPH, DOUT_CTRL_LOW),
Jay Chokshi1de4f9d2012-02-07 16:11:31 -0800153 PM8921_MPP_INIT(8, D_OUTPUT, PM8921_MPP_DIG_LEVEL_S4, DOUT_CTRL_LOW),
Hemant Kumar56925352012-02-13 16:59:52 -0800154 /*MPP9 is used to detect docking station connection/removal on Liquid*/
155 PM8921_MPP_INIT(9, D_INPUT, PM8921_MPP_DIG_LEVEL_S4, DIN_TO_INT),
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -0600156 /* PCIE_RESET_N */
157 PM8921_MPP_INIT(1, D_OUTPUT, PM8921_MPP_DIG_LEVEL_VPH, DOUT_CTRL_HIGH),
Jay Chokshie8741282012-01-25 15:22:55 -0800158};
159
160void __init apq8064_pm8xxx_gpio_mpp_init(void)
161{
162 int i, rc;
163
164 for (i = 0; i < ARRAY_SIZE(pm8921_gpios); i++) {
165 rc = pm8xxx_gpio_config(pm8921_gpios[i].gpio,
166 &pm8921_gpios[i].config);
167 if (rc) {
168 pr_err("%s: pm8xxx_gpio_config: rc=%d\n", __func__, rc);
169 break;
170 }
171 }
172
Mohan Pallaka474b94b2012-01-25 12:59:58 +0530173 if (machine_is_apq8064_cdp() || machine_is_apq8064_liquid())
174 for (i = 0; i < ARRAY_SIZE(pm8921_cdp_kp_gpios); i++) {
175 rc = pm8xxx_gpio_config(pm8921_cdp_kp_gpios[i].gpio,
176 &pm8921_cdp_kp_gpios[i].config);
177 if (rc) {
178 pr_err("%s: pm8xxx_gpio_config: rc=%d\n",
179 __func__, rc);
180 break;
181 }
182 }
183
184 if (machine_is_apq8064_mtp())
185 for (i = 0; i < ARRAY_SIZE(pm8921_mtp_kp_gpios); i++) {
186 rc = pm8xxx_gpio_config(pm8921_mtp_kp_gpios[i].gpio,
187 &pm8921_mtp_kp_gpios[i].config);
188 if (rc) {
189 pr_err("%s: pm8xxx_gpio_config: rc=%d\n",
190 __func__, rc);
191 break;
192 }
193 }
194
Vijayavardhan Vennapusa4fa13692012-08-02 14:35:03 +0530195 if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd()
196 || machine_is_mpq8064_dtv())
197 for (i = 0; i < ARRAY_SIZE(pm8921_mpq_gpios); i++) {
198 rc = pm8xxx_gpio_config(pm8921_mpq_gpios[i].gpio,
199 &pm8921_mpq_gpios[i].config);
200 if (rc) {
201 pr_err("%s: pm8xxx_gpio_config: rc=%d\n",
202 __func__, rc);
203 break;
204 }
205 }
206
Jay Chokshie8741282012-01-25 15:22:55 -0800207 for (i = 0; i < ARRAY_SIZE(pm8xxx_mpps); i++) {
208 rc = pm8xxx_mpp_config(pm8xxx_mpps[i].mpp,
209 &pm8xxx_mpps[i].config);
210 if (rc) {
211 pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc);
212 break;
213 }
214 }
215}
216
217static struct pm8xxx_pwrkey_platform_data apq8064_pm8921_pwrkey_pdata = {
218 .pull_up = 1,
219 .kpd_trigger_delay_us = 15625,
220 .wakeup = 1,
221};
222
223static struct pm8xxx_misc_platform_data apq8064_pm8921_misc_pdata = {
224 .priority = 0,
225};
226
227#define PM8921_LC_LED_MAX_CURRENT 4 /* I = 4mA */
228#define PM8921_LC_LED_LOW_CURRENT 1 /* I = 1mA */
229#define PM8XXX_LED_PWM_PERIOD 1000
230#define PM8XXX_LED_PWM_DUTY_MS 20
231/**
232 * PM8XXX_PWM_CHANNEL_NONE shall be used when LED shall not be
233 * driven using PWM feature.
234 */
235#define PM8XXX_PWM_CHANNEL_NONE -1
236
237static struct led_info pm8921_led_info[] = {
238 [0] = {
239 .name = "led:red",
240 .default_trigger = "ac-online",
241 },
242};
243
244static struct led_platform_data pm8921_led_core_pdata = {
245 .num_leds = ARRAY_SIZE(pm8921_led_info),
246 .leds = pm8921_led_info,
247};
248
249static int pm8921_led0_pwm_duty_pcts[56] = {
250 1, 4, 8, 12, 16, 20, 24, 28, 32, 36,
251 40, 44, 46, 52, 56, 60, 64, 68, 72, 76,
252 80, 84, 88, 92, 96, 100, 100, 100, 98, 95,
253 92, 88, 84, 82, 78, 74, 70, 66, 62, 58,
254 58, 54, 50, 48, 42, 38, 34, 30, 26, 22,
255 14, 10, 6, 4, 1
256};
257
Jay Chokshibe517232012-06-15 18:20:56 -0700258/*
259 * Note: There is a bug in LPG module that results in incorrect
260 * behavior of pattern when LUT index 0 is used. So effectively
261 * there are 63 usable LUT entries.
262 */
Jay Chokshie8741282012-01-25 15:22:55 -0800263static struct pm8xxx_pwm_duty_cycles pm8921_led0_pwm_duty_cycles = {
264 .duty_pcts = (int *)&pm8921_led0_pwm_duty_pcts,
265 .num_duty_pcts = ARRAY_SIZE(pm8921_led0_pwm_duty_pcts),
266 .duty_ms = PM8XXX_LED_PWM_DUTY_MS,
Jay Chokshibe517232012-06-15 18:20:56 -0700267 .start_idx = 1,
Jay Chokshie8741282012-01-25 15:22:55 -0800268};
269
270static struct pm8xxx_led_config pm8921_led_configs[] = {
271 [0] = {
272 .id = PM8XXX_ID_LED_0,
273 .mode = PM8XXX_LED_MODE_PWM2,
274 .max_current = PM8921_LC_LED_MAX_CURRENT,
275 .pwm_channel = 5,
276 .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
277 .pwm_duty_cycles = &pm8921_led0_pwm_duty_cycles,
278 },
279};
280
281static struct pm8xxx_led_platform_data apq8064_pm8921_leds_pdata = {
282 .led_core = &pm8921_led_core_pdata,
283 .configs = pm8921_led_configs,
284 .num_configs = ARRAY_SIZE(pm8921_led_configs),
285};
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800286
Jay Chokshif3a9ea82012-01-12 16:34:43 -0800287static struct pm8xxx_adc_amux apq8064_pm8921_adc_channels_data[] = {
288 {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1,
289 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
290 {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1,
291 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
292 {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1,
293 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
294 {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1,
295 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
296 {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1,
297 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
298 {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1,
299 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
300 {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2,
301 ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM},
302 {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV1,
303 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
304 {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1,
305 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
306 {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
307 ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM},
308 {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1,
309 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
310 {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1,
311 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
312 {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
313 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
314 {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0,
315 ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM},
316};
317
318static struct pm8xxx_adc_properties apq8064_pm8921_adc_data = {
319 .adc_vdd_reference = 1800, /* milli-voltage for this adc */
320 .bitresolution = 15,
321 .bipolar = 0,
322};
323
324static struct pm8xxx_adc_platform_data apq8064_pm8921_adc_pdata = {
325 .adc_channel = apq8064_pm8921_adc_channels_data,
326 .adc_num_board_channel = ARRAY_SIZE(apq8064_pm8921_adc_channels_data),
327 .adc_prop = &apq8064_pm8921_adc_data,
328 .adc_mpp_base = PM8921_MPP_PM_TO_SYS(1),
329};
330
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800331static struct pm8xxx_mpp_platform_data
332apq8064_pm8921_mpp_pdata __devinitdata = {
333 .mpp_base = PM8921_MPP_PM_TO_SYS(1),
334};
335
336static struct pm8xxx_gpio_platform_data
337apq8064_pm8921_gpio_pdata __devinitdata = {
338 .gpio_base = PM8921_GPIO_PM_TO_SYS(1),
339};
340
341static struct pm8xxx_irq_platform_data
342apq8064_pm8921_irq_pdata __devinitdata = {
343 .irq_base = PM8921_IRQ_BASE,
Jeffrey Chuanga92c7ab2012-03-01 23:56:00 -0800344 .devirq = MSM_GPIO_TO_INT(74),
345 .irq_trigger_flag = IRQF_TRIGGER_LOW,
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800346 .dev_id = 0,
347};
348
Ashay Jaiswal0b023dc2012-01-25 10:18:36 +0530349static struct pm8xxx_rtc_platform_data
350apq8064_pm8921_rtc_pdata = {
351 .rtc_write_enable = false,
352 .rtc_alarm_powerup = false,
353};
354
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800355static int apq8064_pm8921_therm_mitigation[] = {
356 1100,
357 700,
358 600,
359 325,
360};
361
362#define MAX_VOLTAGE_MV 4200
363static struct pm8921_charger_platform_data
364apq8064_pm8921_chg_pdata __devinitdata = {
365 .safety_time = 180,
366 .update_time = 60000,
367 .max_voltage = MAX_VOLTAGE_MV,
368 .min_voltage = 3200,
David Keitel0789fc62012-06-07 17:43:27 -0700369 .uvd_thresh_voltage = 4050,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800370 .resume_voltage_delta = 100,
371 .term_current = 100,
372 .cool_temp = 10,
373 .warm_temp = 40,
374 .temp_check_period = 1,
375 .max_bat_chg_current = 1100,
376 .cool_bat_chg_current = 350,
377 .warm_bat_chg_current = 350,
378 .cool_bat_voltage = 4100,
379 .warm_bat_voltage = 4100,
380 .thermal_mitigation = apq8064_pm8921_therm_mitigation,
381 .thermal_levels = ARRAY_SIZE(apq8064_pm8921_therm_mitigation),
382};
383
384static struct pm8xxx_ccadc_platform_data
385apq8064_pm8xxx_ccadc_pdata = {
386 .r_sense = 10,
David Keitel3c378822012-06-07 13:43:22 -0700387 .calib_delay_ms = 600000,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800388};
389
390static struct pm8921_bms_platform_data
391apq8064_pm8921_bms_pdata __devinitdata = {
David Keitel35e11872012-02-17 17:40:42 -0800392 .battery_type = BATT_UNKNOWN,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800393 .r_sense = 10,
394 .i_test = 2500,
395 .v_failure = 3000,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800396 .max_voltage_uv = MAX_VOLTAGE_MV * 1000,
397};
398
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800399static struct pm8921_platform_data
400apq8064_pm8921_platform_data __devinitdata = {
401 .regulator_pdatas = msm8064_pm8921_regulator_pdata,
402 .irq_pdata = &apq8064_pm8921_irq_pdata,
403 .gpio_pdata = &apq8064_pm8921_gpio_pdata,
404 .mpp_pdata = &apq8064_pm8921_mpp_pdata,
Ashay Jaiswal0b023dc2012-01-25 10:18:36 +0530405 .rtc_pdata = &apq8064_pm8921_rtc_pdata,
Jay Chokshie8741282012-01-25 15:22:55 -0800406 .pwrkey_pdata = &apq8064_pm8921_pwrkey_pdata,
407 .misc_pdata = &apq8064_pm8921_misc_pdata,
408 .leds_pdata = &apq8064_pm8921_leds_pdata,
Jay Chokshif3a9ea82012-01-12 16:34:43 -0800409 .adc_pdata = &apq8064_pm8921_adc_pdata,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800410 .charger_pdata = &apq8064_pm8921_chg_pdata,
411 .bms_pdata = &apq8064_pm8921_bms_pdata,
412 .ccadc_pdata = &apq8064_pm8xxx_ccadc_pdata,
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800413};
414
415static struct pm8xxx_irq_platform_data
416apq8064_pm8821_irq_pdata __devinitdata = {
417 .irq_base = PM8821_IRQ_BASE,
Jay Chokshie8741282012-01-25 15:22:55 -0800418 .devirq = PM8821_SEC_IRQ_N,
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800419 .irq_trigger_flag = IRQF_TRIGGER_HIGH,
420 .dev_id = 1,
421};
422
423static struct pm8xxx_mpp_platform_data
424apq8064_pm8821_mpp_pdata __devinitdata = {
425 .mpp_base = PM8821_MPP_PM_TO_SYS(1),
426};
427
428static struct pm8821_platform_data
429apq8064_pm8821_platform_data __devinitdata = {
430 .irq_pdata = &apq8064_pm8821_irq_pdata,
431 .mpp_pdata = &apq8064_pm8821_mpp_pdata,
432};
433
434static struct msm_ssbi_platform_data apq8064_ssbi_pm8921_pdata __devinitdata = {
435 .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
436 .slave = {
437 .name = "pm8921-core",
438 .platform_data = &apq8064_pm8921_platform_data,
439 },
440};
441
442static struct msm_ssbi_platform_data apq8064_ssbi_pm8821_pdata __devinitdata = {
443 .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
444 .slave = {
445 .name = "pm8821-core",
446 .platform_data = &apq8064_pm8821_platform_data,
447 },
448};
449
450void __init apq8064_init_pmic(void)
451{
Jay Chokshie8741282012-01-25 15:22:55 -0800452 pmic_reset_irq = PM8921_IRQ_BASE + PM8921_RESOUT_IRQ;
453
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800454 apq8064_device_ssbi_pmic1.dev.platform_data =
455 &apq8064_ssbi_pm8921_pdata;
456 apq8064_device_ssbi_pmic2.dev.platform_data =
457 &apq8064_ssbi_pm8821_pdata;
458 apq8064_pm8921_platform_data.num_regulators =
459 msm8064_pm8921_regulator_pdata_len;
460
Jin Hongc5f5d542012-04-12 16:48:51 -0700461 if (machine_is_apq8064_mtp()) {
David Keitel35e11872012-02-17 17:40:42 -0800462 apq8064_pm8921_bms_pdata.battery_type = BATT_PALLADIUM;
463 } else if (machine_is_apq8064_liquid()) {
464 apq8064_pm8921_bms_pdata.battery_type = BATT_DESAY;
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800465 }
466}