blob: 6845266d9c1b865d6b0ff38083951938df167901 [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>
David Collins793793b2012-08-21 15:43:02 -070029#include <mach/socinfo.h>
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -080030#include "devices.h"
31#include "board-8064.h"
32
Jay Chokshie8741282012-01-25 15:22:55 -080033struct pm8xxx_gpio_init {
34 unsigned gpio;
35 struct pm_gpio config;
36};
37
38struct pm8xxx_mpp_init {
39 unsigned mpp;
40 struct pm8xxx_mpp_config_data config;
41};
42
43#define PM8921_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \
44 _func, _inv, _disable) \
45{ \
46 .gpio = PM8921_GPIO_PM_TO_SYS(_gpio), \
47 .config = { \
48 .direction = _dir, \
49 .output_buffer = _buf, \
50 .output_value = _val, \
51 .pull = _pull, \
52 .vin_sel = _vin, \
53 .out_strength = _out_strength, \
54 .function = _func, \
55 .inv_int_pol = _inv, \
56 .disable_pin = _disable, \
57 } \
58}
59
60#define PM8921_MPP_INIT(_mpp, _type, _level, _control) \
61{ \
62 .mpp = PM8921_MPP_PM_TO_SYS(_mpp), \
63 .config = { \
64 .type = PM8XXX_MPP_TYPE_##_type, \
65 .level = _level, \
66 .control = PM8XXX_MPP_##_control, \
67 } \
68}
69
70#define PM8821_MPP_INIT(_mpp, _type, _level, _control) \
71{ \
72 .mpp = PM8821_MPP_PM_TO_SYS(_mpp), \
73 .config = { \
74 .type = PM8XXX_MPP_TYPE_##_type, \
75 .level = _level, \
76 .control = PM8XXX_MPP_##_control, \
77 } \
78}
79
80#define PM8921_GPIO_DISABLE(_gpio) \
81 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM_GPIO_VIN_S4, \
82 0, 0, 0, 1)
83
84#define PM8921_GPIO_OUTPUT(_gpio, _val, _strength) \
85 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
86 PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
87 PM_GPIO_STRENGTH_##_strength, \
88 PM_GPIO_FUNC_NORMAL, 0, 0)
89
Jay Chokshi1de4f9d2012-02-07 16:11:31 -080090#define PM8921_GPIO_OUTPUT_BUFCONF(_gpio, _val, _strength, _bufconf) \
91 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT,\
92 PM_GPIO_OUT_BUF_##_bufconf, _val, \
93 PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
94 PM_GPIO_STRENGTH_##_strength, \
95 PM_GPIO_FUNC_NORMAL, 0, 0)
96
Jay Chokshie8741282012-01-25 15:22:55 -080097#define PM8921_GPIO_INPUT(_gpio, _pull) \
98 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \
99 _pull, PM_GPIO_VIN_S4, \
100 PM_GPIO_STRENGTH_NO, \
101 PM_GPIO_FUNC_NORMAL, 0, 0)
102
103#define PM8921_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \
104 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
105 PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
106 PM_GPIO_STRENGTH_HIGH, \
107 _func, 0, 0)
108
109#define PM8921_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \
110 PM8921_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
111 PM_GPIO_PULL_NO, _vin, \
112 PM_GPIO_STRENGTH_HIGH, \
113 PM_GPIO_FUNC_NORMAL, 0, 0)
114
115/* Initial PM8921 GPIO configurations */
116static struct pm8xxx_gpio_init pm8921_gpios[] __initdata = {
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -0800117 PM8921_GPIO_OUTPUT(14, 1, HIGH), /* HDMI Mux Selector */
David Collins390fc332012-02-07 14:38:16 -0800118 PM8921_GPIO_OUTPUT(23, 0, HIGH), /* touchscreen power FET */
Jay Chokshi1de4f9d2012-02-07 16:11:31 -0800119 PM8921_GPIO_OUTPUT_BUFCONF(25, 0, LOW, CMOS), /* DISP_RESET_N */
120 PM8921_GPIO_OUTPUT_FUNC(26, 0, PM_GPIO_FUNC_2), /* Bl: Off, PWM mode */
David Keitel2f613d92012-02-15 11:29:16 -0800121 PM8921_GPIO_OUTPUT_VIN(30, 1, PM_GPIO_VIN_VPH), /* SMB349 susp line */
Jay Chokshi1de4f9d2012-02-07 16:11:31 -0800122 PM8921_GPIO_OUTPUT_BUFCONF(36, 1, LOW, OPEN_DRAIN),
Amy Maloche70090f992012-02-16 16:35:26 -0800123 PM8921_GPIO_OUTPUT_FUNC(44, 0, PM_GPIO_FUNC_2),
124 PM8921_GPIO_OUTPUT(33, 0, HIGH),
125 PM8921_GPIO_OUTPUT(20, 0, HIGH),
Anirudh Ghayal71478012012-03-08 17:54:23 -0800126 PM8921_GPIO_INPUT(35, PM_GPIO_PULL_UP_30),
127 PM8921_GPIO_INPUT(38, PM_GPIO_PULL_UP_30),
Shiv Maliyappanahalli7e0beff2012-02-06 15:56:39 -0800128 /* TABLA CODEC RESET */
129 PM8921_GPIO_OUTPUT(34, 1, MED),
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -0600130 PM8921_GPIO_OUTPUT(13, 0, HIGH), /* PCIE_CLK_PWR_EN */
Niranjana Vishwanathapura459a27d2012-07-20 12:23:55 -0600131 PM8921_GPIO_INPUT(12, PM_GPIO_PULL_UP_30), /* PCIE_WAKE_N */
Mohan Pallaka474b94b2012-01-25 12:59:58 +0530132};
133
134static struct pm8xxx_gpio_init pm8921_mtp_kp_gpios[] __initdata = {
Anirudh Ghayal71478012012-03-08 17:54:23 -0800135 PM8921_GPIO_INPUT(3, PM_GPIO_PULL_UP_30),
136 PM8921_GPIO_INPUT(4, PM_GPIO_PULL_UP_30),
Mohan Pallaka474b94b2012-01-25 12:59:58 +0530137};
138
139static struct pm8xxx_gpio_init pm8921_cdp_kp_gpios[] __initdata = {
Anirudh Ghayal71478012012-03-08 17:54:23 -0800140 PM8921_GPIO_INPUT(27, PM_GPIO_PULL_UP_30),
141 PM8921_GPIO_INPUT(42, PM_GPIO_PULL_UP_30),
Oluwafemi Adeyemi48fc3262012-03-19 13:26:52 -0700142 PM8921_GPIO_INPUT(17, PM_GPIO_PULL_UP_1P5), /* SD_WP */
Jay Chokshie8741282012-01-25 15:22:55 -0800143};
144
David Collinsd49a1c52012-08-22 13:18:06 -0700145/* Initial PM8917 GPIO configurations */
146static struct pm8xxx_gpio_init pm8917_gpios[] __initdata = {
147 PM8921_GPIO_OUTPUT(14, 1, HIGH), /* HDMI Mux Selector */
148 PM8921_GPIO_OUTPUT(23, 0, HIGH), /* touchscreen power FET */
149 PM8921_GPIO_OUTPUT_BUFCONF(25, 0, LOW, CMOS), /* DISP_RESET_N */
150 PM8921_GPIO_OUTPUT_FUNC(26, 0, PM_GPIO_FUNC_2), /* Bl: Off, PWM mode */
151 PM8921_GPIO_OUTPUT_BUFCONF(36, 1, LOW, OPEN_DRAIN),
152 PM8921_GPIO_OUTPUT_FUNC(38, 0, PM_GPIO_FUNC_2),
153 PM8921_GPIO_OUTPUT(33, 0, HIGH),
154 PM8921_GPIO_OUTPUT(20, 0, HIGH),
155 PM8921_GPIO_INPUT(35, PM_GPIO_PULL_UP_30),
156 PM8921_GPIO_INPUT(30, PM_GPIO_PULL_UP_30),
157 /* TABLA CODEC RESET */
158 PM8921_GPIO_OUTPUT(34, 1, MED),
159 PM8921_GPIO_OUTPUT(13, 0, HIGH), /* PCIE_CLK_PWR_EN */
160 PM8921_GPIO_INPUT(12, PM_GPIO_PULL_UP_30), /* PCIE_WAKE_N */
161};
162
163/* PM8921 GPIO 42 remaps to PM8917 GPIO 8 */
164static struct pm8xxx_gpio_init pm8917_cdp_kp_gpios[] __initdata = {
165 PM8921_GPIO_INPUT(27, PM_GPIO_PULL_UP_30),
166 PM8921_GPIO_INPUT(8, PM_GPIO_PULL_UP_30),
167 PM8921_GPIO_INPUT(17, PM_GPIO_PULL_UP_1P5), /* SD_WP */
168};
169
Vijayavardhan Vennapusa4fa13692012-08-02 14:35:03 +0530170static struct pm8xxx_gpio_init pm8921_mpq_gpios[] __initdata = {
171 PM8921_GPIO_INIT(27, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0,
172 PM_GPIO_PULL_NO, PM_GPIO_VIN_VPH, PM_GPIO_STRENGTH_NO,
173 PM_GPIO_FUNC_NORMAL, 0, 0),
174};
175
Jay Chokshie8741282012-01-25 15:22:55 -0800176/* Initial PM8XXX MPP configurations */
177static struct pm8xxx_mpp_init pm8xxx_mpps[] __initdata = {
Jay Chokshi1de4f9d2012-02-07 16:11:31 -0800178 PM8921_MPP_INIT(3, D_OUTPUT, PM8921_MPP_DIG_LEVEL_VPH, DOUT_CTRL_LOW),
Jay Chokshi1de4f9d2012-02-07 16:11:31 -0800179 PM8921_MPP_INIT(8, D_OUTPUT, PM8921_MPP_DIG_LEVEL_S4, DOUT_CTRL_LOW),
Hemant Kumar56925352012-02-13 16:59:52 -0800180 /*MPP9 is used to detect docking station connection/removal on Liquid*/
181 PM8921_MPP_INIT(9, D_INPUT, PM8921_MPP_DIG_LEVEL_S4, DIN_TO_INT),
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -0600182 /* PCIE_RESET_N */
183 PM8921_MPP_INIT(1, D_OUTPUT, PM8921_MPP_DIG_LEVEL_VPH, DOUT_CTRL_HIGH),
Jay Chokshie8741282012-01-25 15:22:55 -0800184};
185
David Collinsd49a1c52012-08-22 13:18:06 -0700186
187void __init apq8064_configure_gpios(struct pm8xxx_gpio_init *data, int len)
188{
189 int i, rc;
190
191 for (i = 0; i < len; i++) {
192 rc = pm8xxx_gpio_config(data[i].gpio, &data[i].config);
193 if (rc)
194 pr_err("%s: pm8xxx_gpio_config(%u) failed: rc=%d\n",
195 __func__, data[i].gpio, rc);
196 }
197}
198
Jay Chokshie8741282012-01-25 15:22:55 -0800199void __init apq8064_pm8xxx_gpio_mpp_init(void)
200{
201 int i, rc;
202
David Collinsd49a1c52012-08-22 13:18:06 -0700203 if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917)
204 apq8064_configure_gpios(pm8921_gpios, ARRAY_SIZE(pm8921_gpios));
205 else
206 apq8064_configure_gpios(pm8917_gpios, ARRAY_SIZE(pm8917_gpios));
207
208 if (machine_is_apq8064_cdp() || machine_is_apq8064_liquid()) {
209 if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917)
210 apq8064_configure_gpios(pm8921_cdp_kp_gpios,
211 ARRAY_SIZE(pm8921_cdp_kp_gpios));
212 else
213 apq8064_configure_gpios(pm8917_cdp_kp_gpios,
214 ARRAY_SIZE(pm8917_cdp_kp_gpios));
Jay Chokshie8741282012-01-25 15:22:55 -0800215 }
216
Mohan Pallaka474b94b2012-01-25 12:59:58 +0530217 if (machine_is_apq8064_mtp())
David Collinsd49a1c52012-08-22 13:18:06 -0700218 apq8064_configure_gpios(pm8921_mtp_kp_gpios,
219 ARRAY_SIZE(pm8921_mtp_kp_gpios));
Mohan Pallaka474b94b2012-01-25 12:59:58 +0530220
Vijayavardhan Vennapusa4fa13692012-08-02 14:35:03 +0530221 if (machine_is_mpq8064_cdp() || machine_is_mpq8064_hrd()
David Collinsd49a1c52012-08-22 13:18:06 -0700222 || machine_is_mpq8064_dtv())
223 apq8064_configure_gpios(pm8921_mpq_gpios,
224 ARRAY_SIZE(pm8921_mpq_gpios));
Vijayavardhan Vennapusa4fa13692012-08-02 14:35:03 +0530225
Jay Chokshie8741282012-01-25 15:22:55 -0800226 for (i = 0; i < ARRAY_SIZE(pm8xxx_mpps); i++) {
227 rc = pm8xxx_mpp_config(pm8xxx_mpps[i].mpp,
228 &pm8xxx_mpps[i].config);
229 if (rc) {
230 pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc);
231 break;
232 }
233 }
234}
235
236static struct pm8xxx_pwrkey_platform_data apq8064_pm8921_pwrkey_pdata = {
237 .pull_up = 1,
238 .kpd_trigger_delay_us = 15625,
239 .wakeup = 1,
240};
241
242static struct pm8xxx_misc_platform_data apq8064_pm8921_misc_pdata = {
243 .priority = 0,
244};
245
246#define PM8921_LC_LED_MAX_CURRENT 4 /* I = 4mA */
247#define PM8921_LC_LED_LOW_CURRENT 1 /* I = 1mA */
248#define PM8XXX_LED_PWM_PERIOD 1000
249#define PM8XXX_LED_PWM_DUTY_MS 20
250/**
251 * PM8XXX_PWM_CHANNEL_NONE shall be used when LED shall not be
252 * driven using PWM feature.
253 */
254#define PM8XXX_PWM_CHANNEL_NONE -1
255
256static struct led_info pm8921_led_info[] = {
257 [0] = {
258 .name = "led:red",
259 .default_trigger = "ac-online",
260 },
261};
262
263static struct led_platform_data pm8921_led_core_pdata = {
264 .num_leds = ARRAY_SIZE(pm8921_led_info),
265 .leds = pm8921_led_info,
266};
267
268static int pm8921_led0_pwm_duty_pcts[56] = {
269 1, 4, 8, 12, 16, 20, 24, 28, 32, 36,
270 40, 44, 46, 52, 56, 60, 64, 68, 72, 76,
271 80, 84, 88, 92, 96, 100, 100, 100, 98, 95,
272 92, 88, 84, 82, 78, 74, 70, 66, 62, 58,
273 58, 54, 50, 48, 42, 38, 34, 30, 26, 22,
274 14, 10, 6, 4, 1
275};
276
Jay Chokshibe517232012-06-15 18:20:56 -0700277/*
278 * Note: There is a bug in LPG module that results in incorrect
279 * behavior of pattern when LUT index 0 is used. So effectively
280 * there are 63 usable LUT entries.
281 */
Jay Chokshie8741282012-01-25 15:22:55 -0800282static struct pm8xxx_pwm_duty_cycles pm8921_led0_pwm_duty_cycles = {
283 .duty_pcts = (int *)&pm8921_led0_pwm_duty_pcts,
284 .num_duty_pcts = ARRAY_SIZE(pm8921_led0_pwm_duty_pcts),
285 .duty_ms = PM8XXX_LED_PWM_DUTY_MS,
Jay Chokshibe517232012-06-15 18:20:56 -0700286 .start_idx = 1,
Jay Chokshie8741282012-01-25 15:22:55 -0800287};
288
289static struct pm8xxx_led_config pm8921_led_configs[] = {
290 [0] = {
291 .id = PM8XXX_ID_LED_0,
292 .mode = PM8XXX_LED_MODE_PWM2,
293 .max_current = PM8921_LC_LED_MAX_CURRENT,
294 .pwm_channel = 5,
295 .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
296 .pwm_duty_cycles = &pm8921_led0_pwm_duty_cycles,
297 },
298};
299
300static struct pm8xxx_led_platform_data apq8064_pm8921_leds_pdata = {
301 .led_core = &pm8921_led_core_pdata,
302 .configs = pm8921_led_configs,
303 .num_configs = ARRAY_SIZE(pm8921_led_configs),
304};
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800305
Jay Chokshif3a9ea82012-01-12 16:34:43 -0800306static struct pm8xxx_adc_amux apq8064_pm8921_adc_channels_data[] = {
307 {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1,
308 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
309 {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1,
310 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
311 {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1,
312 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
313 {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1,
314 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
315 {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1,
316 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
317 {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1,
318 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
319 {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2,
320 ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM},
321 {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV1,
322 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
323 {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1,
324 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
325 {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
326 ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM},
327 {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1,
328 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
329 {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1,
330 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
331 {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
332 ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
333 {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0,
334 ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM},
335};
336
337static struct pm8xxx_adc_properties apq8064_pm8921_adc_data = {
338 .adc_vdd_reference = 1800, /* milli-voltage for this adc */
339 .bitresolution = 15,
340 .bipolar = 0,
341};
342
343static struct pm8xxx_adc_platform_data apq8064_pm8921_adc_pdata = {
344 .adc_channel = apq8064_pm8921_adc_channels_data,
345 .adc_num_board_channel = ARRAY_SIZE(apq8064_pm8921_adc_channels_data),
346 .adc_prop = &apq8064_pm8921_adc_data,
347 .adc_mpp_base = PM8921_MPP_PM_TO_SYS(1),
348};
349
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800350static struct pm8xxx_mpp_platform_data
351apq8064_pm8921_mpp_pdata __devinitdata = {
352 .mpp_base = PM8921_MPP_PM_TO_SYS(1),
353};
354
355static struct pm8xxx_gpio_platform_data
356apq8064_pm8921_gpio_pdata __devinitdata = {
357 .gpio_base = PM8921_GPIO_PM_TO_SYS(1),
358};
359
360static struct pm8xxx_irq_platform_data
361apq8064_pm8921_irq_pdata __devinitdata = {
362 .irq_base = PM8921_IRQ_BASE,
Jeffrey Chuanga92c7ab2012-03-01 23:56:00 -0800363 .devirq = MSM_GPIO_TO_INT(74),
364 .irq_trigger_flag = IRQF_TRIGGER_LOW,
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800365 .dev_id = 0,
366};
367
Ashay Jaiswal0b023dc2012-01-25 10:18:36 +0530368static struct pm8xxx_rtc_platform_data
369apq8064_pm8921_rtc_pdata = {
370 .rtc_write_enable = false,
371 .rtc_alarm_powerup = false,
372};
373
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800374static int apq8064_pm8921_therm_mitigation[] = {
375 1100,
376 700,
377 600,
378 325,
379};
380
381#define MAX_VOLTAGE_MV 4200
Abhijeet Dharmapurikard6d66c72012-08-06 14:02:51 -0700382#define CHG_TERM_MA 100
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800383static struct pm8921_charger_platform_data
384apq8064_pm8921_chg_pdata __devinitdata = {
385 .safety_time = 180,
386 .update_time = 60000,
387 .max_voltage = MAX_VOLTAGE_MV,
388 .min_voltage = 3200,
David Keitel0789fc62012-06-07 17:43:27 -0700389 .uvd_thresh_voltage = 4050,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800390 .resume_voltage_delta = 100,
Abhijeet Dharmapurikard6d66c72012-08-06 14:02:51 -0700391 .term_current = CHG_TERM_MA,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800392 .cool_temp = 10,
393 .warm_temp = 40,
394 .temp_check_period = 1,
395 .max_bat_chg_current = 1100,
396 .cool_bat_chg_current = 350,
397 .warm_bat_chg_current = 350,
398 .cool_bat_voltage = 4100,
399 .warm_bat_voltage = 4100,
400 .thermal_mitigation = apq8064_pm8921_therm_mitigation,
401 .thermal_levels = ARRAY_SIZE(apq8064_pm8921_therm_mitigation),
Abhijeet Dharmapurikar499a36f2012-07-30 12:48:17 -0700402 .rconn_mohm = 18,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800403};
404
405static struct pm8xxx_ccadc_platform_data
406apq8064_pm8xxx_ccadc_pdata = {
407 .r_sense = 10,
David Keitel3c378822012-06-07 13:43:22 -0700408 .calib_delay_ms = 600000,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800409};
410
411static struct pm8921_bms_platform_data
412apq8064_pm8921_bms_pdata __devinitdata = {
Abhijeet Dharmapurikard6d66c72012-08-06 14:02:51 -0700413 .battery_type = BATT_UNKNOWN,
414 .r_sense = 10,
415 .v_cutoff = 3400,
416 .max_voltage_uv = MAX_VOLTAGE_MV * 1000,
417 .rconn_mohm = 18,
418 .shutdown_soc_valid_limit = 20,
419 .adjust_soc_low_threshold = 25,
420 .chg_term_ua = CHG_TERM_MA * 1000,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800421};
422
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800423static struct pm8921_platform_data
424apq8064_pm8921_platform_data __devinitdata = {
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800425 .irq_pdata = &apq8064_pm8921_irq_pdata,
426 .gpio_pdata = &apq8064_pm8921_gpio_pdata,
427 .mpp_pdata = &apq8064_pm8921_mpp_pdata,
Ashay Jaiswal0b023dc2012-01-25 10:18:36 +0530428 .rtc_pdata = &apq8064_pm8921_rtc_pdata,
Jay Chokshie8741282012-01-25 15:22:55 -0800429 .pwrkey_pdata = &apq8064_pm8921_pwrkey_pdata,
430 .misc_pdata = &apq8064_pm8921_misc_pdata,
431 .leds_pdata = &apq8064_pm8921_leds_pdata,
Jay Chokshif3a9ea82012-01-12 16:34:43 -0800432 .adc_pdata = &apq8064_pm8921_adc_pdata,
Jay Chokshi42fe9f02012-02-01 20:52:08 -0800433 .charger_pdata = &apq8064_pm8921_chg_pdata,
434 .bms_pdata = &apq8064_pm8921_bms_pdata,
435 .ccadc_pdata = &apq8064_pm8xxx_ccadc_pdata,
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800436};
437
438static struct pm8xxx_irq_platform_data
439apq8064_pm8821_irq_pdata __devinitdata = {
440 .irq_base = PM8821_IRQ_BASE,
Jay Chokshie8741282012-01-25 15:22:55 -0800441 .devirq = PM8821_SEC_IRQ_N,
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800442 .irq_trigger_flag = IRQF_TRIGGER_HIGH,
443 .dev_id = 1,
444};
445
446static struct pm8xxx_mpp_platform_data
447apq8064_pm8821_mpp_pdata __devinitdata = {
448 .mpp_base = PM8821_MPP_PM_TO_SYS(1),
449};
450
451static struct pm8821_platform_data
452apq8064_pm8821_platform_data __devinitdata = {
453 .irq_pdata = &apq8064_pm8821_irq_pdata,
454 .mpp_pdata = &apq8064_pm8821_mpp_pdata,
455};
456
457static struct msm_ssbi_platform_data apq8064_ssbi_pm8921_pdata __devinitdata = {
458 .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
459 .slave = {
460 .name = "pm8921-core",
461 .platform_data = &apq8064_pm8921_platform_data,
462 },
463};
464
465static struct msm_ssbi_platform_data apq8064_ssbi_pm8821_pdata __devinitdata = {
466 .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
467 .slave = {
468 .name = "pm8821-core",
469 .platform_data = &apq8064_pm8821_platform_data,
470 },
471};
472
473void __init apq8064_init_pmic(void)
474{
Jay Chokshie8741282012-01-25 15:22:55 -0800475 pmic_reset_irq = PM8921_IRQ_BASE + PM8921_RESOUT_IRQ;
476
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800477 apq8064_device_ssbi_pmic1.dev.platform_data =
478 &apq8064_ssbi_pm8921_pdata;
479 apq8064_device_ssbi_pmic2.dev.platform_data =
480 &apq8064_ssbi_pm8821_pdata;
David Collins793793b2012-08-21 15:43:02 -0700481 if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) {
482 apq8064_pm8921_platform_data.regulator_pdatas
483 = msm8064_pm8921_regulator_pdata;
484 apq8064_pm8921_platform_data.num_regulators
485 = msm8064_pm8921_regulator_pdata_len;
486 } else {
487 apq8064_pm8921_platform_data.regulator_pdatas
488 = msm8064_pm8917_regulator_pdata;
489 apq8064_pm8921_platform_data.num_regulators
490 = msm8064_pm8917_regulator_pdata_len;
491 }
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800492
Jin Hongc5f5d542012-04-12 16:48:51 -0700493 if (machine_is_apq8064_mtp()) {
David Keitel35e11872012-02-17 17:40:42 -0800494 apq8064_pm8921_bms_pdata.battery_type = BATT_PALLADIUM;
495 } else if (machine_is_apq8064_liquid()) {
496 apq8064_pm8921_bms_pdata.battery_type = BATT_DESAY;
Stepan Moskovchenkoc1074f02011-12-14 17:51:57 -0800497 }
498}