/arch/arm/mach-msm/board-8930-pmic.c

https://github.com/AICP/kernel_google_msm · C · 597 lines · 495 code · 61 blank · 41 comment · 17 complexity · 1a9607ac1c88620b062062b10ba31bb6 MD5 · raw file

  1. /* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
  2. *
  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. #include <linux/interrupt.h>
  14. #include <linux/mfd/pm8xxx/pm8038.h>
  15. #include <linux/mfd/pm8xxx/pm8xxx-adc.h>
  16. #include <linux/msm_ssbi.h>
  17. #include <asm/mach-types.h>
  18. #include <mach/msm_bus_board.h>
  19. #include <mach/restart.h>
  20. #include <mach/socinfo.h>
  21. #include "devices.h"
  22. #include "board-8930.h"
  23. struct pm8xxx_gpio_init {
  24. unsigned gpio;
  25. struct pm_gpio config;
  26. };
  27. struct pm8xxx_mpp_init {
  28. unsigned mpp;
  29. struct pm8xxx_mpp_config_data config;
  30. };
  31. #define PM8038_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \
  32. _func, _inv, _disable) \
  33. { \
  34. .gpio = PM8038_GPIO_PM_TO_SYS(_gpio), \
  35. .config = { \
  36. .direction = _dir, \
  37. .output_buffer = _buf, \
  38. .output_value = _val, \
  39. .pull = _pull, \
  40. .vin_sel = _vin, \
  41. .out_strength = _out_strength, \
  42. .function = _func, \
  43. .inv_int_pol = _inv, \
  44. .disable_pin = _disable, \
  45. } \
  46. }
  47. #define PM8038_MPP_INIT(_mpp, _type, _level, _control) \
  48. { \
  49. .mpp = PM8038_MPP_PM_TO_SYS(_mpp), \
  50. .config = { \
  51. .type = PM8XXX_MPP_TYPE_##_type, \
  52. .level = _level, \
  53. .control = PM8XXX_MPP_##_control, \
  54. } \
  55. }
  56. #define PM8038_GPIO_DISABLE(_gpio) \
  57. PM8038_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM8038_GPIO_VIN_L11, \
  58. 0, 0, 0, 1)
  59. #define PM8038_GPIO_OUTPUT(_gpio, _val) \
  60. PM8038_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
  61. PM_GPIO_PULL_NO, PM8038_GPIO_VIN_L11, \
  62. PM_GPIO_STRENGTH_HIGH, \
  63. PM_GPIO_FUNC_NORMAL, 0, 0)
  64. #define PM8038_GPIO_INPUT(_gpio, _pull) \
  65. PM8038_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \
  66. _pull, PM8038_GPIO_VIN_L11, \
  67. PM_GPIO_STRENGTH_NO, \
  68. PM_GPIO_FUNC_NORMAL, 0, 0)
  69. #define PM8038_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \
  70. PM8038_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
  71. PM_GPIO_PULL_NO, PM8038_GPIO_VIN_L11, \
  72. PM_GPIO_STRENGTH_HIGH, \
  73. _func, 0, 0)
  74. #define PM8038_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \
  75. PM8038_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
  76. PM_GPIO_PULL_NO, _vin, \
  77. PM_GPIO_STRENGTH_HIGH, \
  78. PM_GPIO_FUNC_NORMAL, 0, 0)
  79. #define PM8917_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \
  80. _func, _inv, _disable) \
  81. { \
  82. .gpio = PM8917_GPIO_PM_TO_SYS(_gpio), \
  83. .config = { \
  84. .direction = _dir, \
  85. .output_buffer = _buf, \
  86. .output_value = _val, \
  87. .pull = _pull, \
  88. .vin_sel = _vin, \
  89. .out_strength = _out_strength, \
  90. .function = _func, \
  91. .inv_int_pol = _inv, \
  92. .disable_pin = _disable, \
  93. } \
  94. }
  95. #define PM8917_MPP_INIT(_mpp, _type, _level, _control) \
  96. { \
  97. .mpp = PM8917_MPP_PM_TO_SYS(_mpp), \
  98. .config = { \
  99. .type = PM8XXX_MPP_TYPE_##_type, \
  100. .level = _level, \
  101. .control = PM8XXX_MPP_##_control, \
  102. } \
  103. }
  104. #define PM8917_GPIO_DISABLE(_gpio) \
  105. PM8917_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM_GPIO_VIN_S4, \
  106. 0, 0, 0, 1)
  107. #define PM8917_GPIO_OUTPUT(_gpio, _val) \
  108. PM8917_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
  109. PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
  110. PM_GPIO_STRENGTH_HIGH, \
  111. PM_GPIO_FUNC_NORMAL, 0, 0)
  112. #define PM8917_GPIO_INPUT(_gpio, _pull) \
  113. PM8917_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \
  114. _pull, PM_GPIO_VIN_S4, \
  115. PM_GPIO_STRENGTH_NO, \
  116. PM_GPIO_FUNC_NORMAL, 0, 0)
  117. #define PM8917_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \
  118. PM8917_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
  119. PM_GPIO_PULL_NO, PM_GPIO_VIN_S4, \
  120. PM_GPIO_STRENGTH_HIGH, \
  121. _func, 0, 0)
  122. #define PM8917_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \
  123. PM8917_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
  124. PM_GPIO_PULL_NO, _vin, \
  125. PM_GPIO_STRENGTH_HIGH, \
  126. PM_GPIO_FUNC_NORMAL, 0, 0)
  127. /* GPIO and MPP configurations for MSM8930 + PM8038 targets */
  128. /* Initial PM8038 GPIO configurations */
  129. static struct pm8xxx_gpio_init pm8038_gpios[] __initdata = {
  130. /* keys GPIOs */
  131. PM8038_GPIO_INPUT(3, PM_GPIO_PULL_UP_30),
  132. PM8038_GPIO_INPUT(8, PM_GPIO_PULL_UP_30),
  133. PM8038_GPIO_INPUT(10, PM_GPIO_PULL_UP_30),
  134. PM8038_GPIO_INPUT(11, PM_GPIO_PULL_UP_30),
  135. /* haptics gpio */
  136. PM8038_GPIO_OUTPUT_FUNC(7, 0, PM_GPIO_FUNC_1),
  137. /* MHL PWR EN */
  138. PM8038_GPIO_OUTPUT_VIN(5, 1, PM8038_GPIO_VIN_VPH),
  139. };
  140. /* Initial PM8038 MPP configurations */
  141. static struct pm8xxx_mpp_init pm8038_mpps[] __initdata = {
  142. };
  143. /* GPIO and MPP configurations for MSM8930 + PM8917 targets */
  144. /* Initial PM8917 GPIO configurations */
  145. static struct pm8xxx_gpio_init pm8917_gpios[] __initdata = {
  146. /* Backlight enable control */
  147. PM8917_GPIO_OUTPUT(24, 1),
  148. /* keys GPIOs */
  149. PM8917_GPIO_INPUT(27, PM_GPIO_PULL_UP_30),
  150. PM8917_GPIO_INPUT(28, PM_GPIO_PULL_UP_30),
  151. PM8917_GPIO_INPUT(36, PM_GPIO_PULL_UP_30),
  152. PM8917_GPIO_INPUT(37, PM_GPIO_PULL_UP_30),
  153. /* haptics gpio */
  154. PM8917_GPIO_OUTPUT_FUNC(38, 0, PM_GPIO_FUNC_2),
  155. /* MHL PWR EN */
  156. PM8917_GPIO_OUTPUT_VIN(25, 1, PM_GPIO_VIN_VPH),
  157. };
  158. /* Initial PM8917 MPP configurations */
  159. static struct pm8xxx_mpp_init pm8917_mpps[] __initdata = {
  160. PM8917_MPP_INIT(PM8XXX_AMUX_MPP_3, A_INPUT,
  161. PM8XXX_MPP_AIN_AMUX_CH8, DIN_TO_INT),
  162. /* Configure MPP01 for USB ID detection */
  163. PM8917_MPP_INIT(1, D_INPUT, PM8921_MPP_DIG_LEVEL_S4, DIN_TO_INT),
  164. };
  165. void __init msm8930_pm8038_gpio_mpp_init(void)
  166. {
  167. int i, rc;
  168. for (i = 0; i < ARRAY_SIZE(pm8038_gpios); i++) {
  169. rc = pm8xxx_gpio_config(pm8038_gpios[i].gpio,
  170. &pm8038_gpios[i].config);
  171. if (rc) {
  172. pr_err("%s: pm8xxx_gpio_config: rc=%d\n", __func__, rc);
  173. break;
  174. }
  175. }
  176. /* Initial MPP configuration. */
  177. for (i = 0; i < ARRAY_SIZE(pm8038_mpps); i++) {
  178. rc = pm8xxx_mpp_config(pm8038_mpps[i].mpp,
  179. &pm8038_mpps[i].config);
  180. if (rc) {
  181. pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc);
  182. break;
  183. }
  184. }
  185. }
  186. void __init msm8930_pm8917_gpio_mpp_init(void)
  187. {
  188. int i, rc;
  189. for (i = 0; i < ARRAY_SIZE(pm8917_gpios); i++) {
  190. rc = pm8xxx_gpio_config(pm8917_gpios[i].gpio,
  191. &pm8917_gpios[i].config);
  192. if (rc) {
  193. pr_err("%s: pm8xxx_gpio_config: rc=%d\n", __func__, rc);
  194. break;
  195. }
  196. }
  197. /* Initial MPP configuration. */
  198. for (i = 0; i < ARRAY_SIZE(pm8917_mpps); i++) {
  199. rc = pm8xxx_mpp_config(pm8917_mpps[i].mpp,
  200. &pm8917_mpps[i].config);
  201. if (rc) {
  202. pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc);
  203. break;
  204. }
  205. }
  206. }
  207. static struct pm8xxx_adc_amux pm8038_adc_channels_data[] = {
  208. {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1,
  209. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  210. {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1,
  211. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  212. {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1,
  213. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  214. {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1,
  215. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  216. {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1,
  217. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  218. {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1,
  219. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  220. {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2,
  221. ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM},
  222. {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV2,
  223. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  224. {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1,
  225. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  226. {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
  227. ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM},
  228. {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1,
  229. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  230. {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1,
  231. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  232. {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
  233. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  234. {"pa_therm1", ADC_MPP_1_AMUX4, CHAN_PATH_SCALING1, AMUX_RSV1,
  235. ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM},
  236. {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0,
  237. ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM},
  238. {"pa_therm0", ADC_MPP_1_AMUX3, CHAN_PATH_SCALING1, AMUX_RSV1,
  239. ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM},
  240. };
  241. static struct pm8xxx_adc_properties pm8038_adc_data = {
  242. .adc_vdd_reference = 1800, /* milli-voltage for this adc */
  243. .bitresolution = 15,
  244. .bipolar = 0,
  245. };
  246. static struct pm8xxx_adc_platform_data pm8038_adc_pdata = {
  247. .adc_channel = pm8038_adc_channels_data,
  248. .adc_num_board_channel = ARRAY_SIZE(pm8038_adc_channels_data),
  249. .adc_prop = &pm8038_adc_data,
  250. .adc_mpp_base = PM8038_MPP_PM_TO_SYS(1),
  251. };
  252. static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata __devinitdata = {
  253. .irq_base = PM8038_IRQ_BASE,
  254. .devirq = MSM_GPIO_TO_INT(104),
  255. .irq_trigger_flag = IRQF_TRIGGER_LOW,
  256. };
  257. static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata __devinitdata = {
  258. .gpio_base = PM8038_GPIO_PM_TO_SYS(1),
  259. };
  260. static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata __devinitdata = {
  261. .mpp_base = PM8038_MPP_PM_TO_SYS(1),
  262. };
  263. static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata __devinitdata = {
  264. .rtc_write_enable = false,
  265. .rtc_alarm_powerup = false,
  266. };
  267. static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = {
  268. .pull_up = 1,
  269. .kpd_trigger_delay_us = 15625,
  270. .wakeup = 1,
  271. };
  272. static int pm8921_therm_mitigation[] = {
  273. 1100,
  274. 700,
  275. 600,
  276. 325,
  277. };
  278. #define MAX_VOLTAGE_MV 4200
  279. #define CHG_TERM_MA 100
  280. static struct pm8921_charger_platform_data pm8921_chg_pdata __devinitdata = {
  281. .safety_time = 180,
  282. .update_time = 60000,
  283. .max_voltage = MAX_VOLTAGE_MV,
  284. .min_voltage = 3200,
  285. .uvd_thresh_voltage = 4050,
  286. .alarm_voltage = 3400,
  287. .resume_voltage_delta = 100,
  288. .term_current = CHG_TERM_MA,
  289. .cool_temp = 10,
  290. .warm_temp = 40,
  291. .temp_check_period = 1,
  292. .max_bat_chg_current = 1100,
  293. .cool_bat_chg_current = 350,
  294. .warm_bat_chg_current = 350,
  295. .cool_bat_voltage = 4100,
  296. .warm_bat_voltage = 4100,
  297. .thermal_mitigation = pm8921_therm_mitigation,
  298. .thermal_levels = ARRAY_SIZE(pm8921_therm_mitigation),
  299. .led_src_config = LED_SRC_VPH_PWR,
  300. .rconn_mohm = 18,
  301. };
  302. #define PM8038_WLED_MAX_CURRENT 25
  303. #define PM8XXX_LED_PWM_PERIOD 1000
  304. #define PM8XXX_LED_PWM_DUTY_MS 20
  305. #define PM8038_RGB_LED_MAX_CURRENT 12
  306. static struct led_info pm8038_led_info[] = {
  307. [0] = {
  308. .name = "wled",
  309. .default_trigger = "bkl_trigger",
  310. },
  311. [1] = {
  312. .name = "led:rgb_red",
  313. .default_trigger = "battery-charging",
  314. },
  315. [2] = {
  316. .name = "led:rgb_green",
  317. },
  318. [3] = {
  319. .name = "led:rgb_blue",
  320. },
  321. };
  322. static struct led_platform_data pm8038_led_core_pdata = {
  323. .num_leds = ARRAY_SIZE(pm8038_led_info),
  324. .leds = pm8038_led_info,
  325. };
  326. static struct wled_config_data wled_cfg = {
  327. .dig_mod_gen_en = true,
  328. .cs_out_en = true,
  329. .ctrl_delay_us = 0,
  330. .op_fdbck = true,
  331. .ovp_val = WLED_OVP_32V,
  332. .boost_curr_lim = WLED_CURR_LIMIT_525mA,
  333. .num_strings = 1,
  334. };
  335. static int pm8038_led0_pwm_duty_pcts[56] = {
  336. 1, 4, 8, 12, 16, 20, 24, 28, 32, 36,
  337. 40, 44, 46, 52, 56, 60, 64, 68, 72, 76,
  338. 80, 84, 88, 92, 96, 100, 100, 100, 98, 95,
  339. 92, 88, 84, 82, 78, 74, 70, 66, 62, 58,
  340. 58, 54, 50, 48, 42, 38, 34, 30, 26, 22,
  341. 14, 10, 6, 4, 1
  342. };
  343. /*
  344. * Note: There is a bug in LPG module that results in incorrect
  345. * behavior of pattern when LUT index 0 is used. So effectively
  346. * there are 63 usable LUT entries.
  347. */
  348. static struct pm8xxx_pwm_duty_cycles pm8038_led0_pwm_duty_cycles = {
  349. .duty_pcts = (int *)&pm8038_led0_pwm_duty_pcts,
  350. .num_duty_pcts = ARRAY_SIZE(pm8038_led0_pwm_duty_pcts),
  351. .duty_ms = PM8XXX_LED_PWM_DUTY_MS,
  352. .start_idx = 1,
  353. };
  354. static struct pm8xxx_led_config pm8038_led_configs[] = {
  355. [0] = {
  356. .id = PM8XXX_ID_WLED,
  357. .mode = PM8XXX_LED_MODE_MANUAL,
  358. .max_current = PM8038_WLED_MAX_CURRENT,
  359. .default_state = 0,
  360. .wled_cfg = &wled_cfg,
  361. },
  362. [1] = {
  363. .id = PM8XXX_ID_RGB_LED_RED,
  364. .mode = PM8XXX_LED_MODE_PWM1,
  365. .max_current = PM8038_RGB_LED_MAX_CURRENT,
  366. .pwm_channel = 5,
  367. .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
  368. .pwm_duty_cycles = &pm8038_led0_pwm_duty_cycles,
  369. },
  370. [2] = {
  371. .id = PM8XXX_ID_RGB_LED_GREEN,
  372. .mode = PM8XXX_LED_MODE_PWM1,
  373. .max_current = PM8038_RGB_LED_MAX_CURRENT,
  374. .pwm_channel = 4,
  375. .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
  376. .pwm_duty_cycles = &pm8038_led0_pwm_duty_cycles,
  377. },
  378. [3] = {
  379. .id = PM8XXX_ID_RGB_LED_BLUE,
  380. .mode = PM8XXX_LED_MODE_PWM1,
  381. .max_current = PM8038_RGB_LED_MAX_CURRENT,
  382. .pwm_channel = 3,
  383. .pwm_period_us = PM8XXX_LED_PWM_PERIOD,
  384. .pwm_duty_cycles = &pm8038_led0_pwm_duty_cycles,
  385. },
  386. };
  387. static struct pm8xxx_led_platform_data pm8xxx_leds_pdata = {
  388. .led_core = &pm8038_led_core_pdata,
  389. .configs = pm8038_led_configs,
  390. .num_configs = ARRAY_SIZE(pm8038_led_configs),
  391. };
  392. static struct pm8xxx_ccadc_platform_data pm8xxx_ccadc_pdata = {
  393. .r_sense = 10,
  394. .calib_delay_ms = 600000,
  395. };
  396. static struct pm8xxx_misc_platform_data pm8xxx_misc_pdata = {
  397. .priority = 0,
  398. };
  399. /*
  400. * 0x254=0xC8 (Threshold=110, preamp bias=01)
  401. * 0x255=0xC1 (Hold=110, max attn=0000, mute=1)
  402. * 0x256=0xB0 (decay=101, attack=10, delay=0)
  403. */
  404. static struct pm8xxx_spk_platform_data pm8xxx_spk_pdata = {
  405. .spk_add_enable = false,
  406. .cd_ng_threshold = 0x6,
  407. .cd_nf_preamp_bias = 0x1,
  408. .cd_ng_hold = 0x6,
  409. .cd_ng_max_atten = 0x0,
  410. .noise_mute = 1,
  411. .cd_ng_decay_rate = 0x5,
  412. .cd_ng_attack_rate = 0x2,
  413. .cd_delay = 0x0,
  414. };
  415. static struct pm8921_bms_platform_data pm8921_bms_pdata __devinitdata = {
  416. .battery_type = BATT_UNKNOWN,
  417. .r_sense = 10,
  418. .v_cutoff = 3400,
  419. .max_voltage_uv = MAX_VOLTAGE_MV * 1000,
  420. .shutdown_soc_valid_limit = 20,
  421. .adjust_soc_low_threshold = 25,
  422. .chg_term_ua = CHG_TERM_MA * 1000,
  423. .rconn_mohm = 18,
  424. };
  425. static struct pm8038_platform_data pm8038_platform_data __devinitdata = {
  426. .irq_pdata = &pm8xxx_irq_pdata,
  427. .gpio_pdata = &pm8xxx_gpio_pdata,
  428. .mpp_pdata = &pm8xxx_mpp_pdata,
  429. .rtc_pdata = &pm8xxx_rtc_pdata,
  430. .pwrkey_pdata = &pm8xxx_pwrkey_pdata,
  431. .misc_pdata = &pm8xxx_misc_pdata,
  432. .regulator_pdatas = msm8930_pm8038_regulator_pdata,
  433. .charger_pdata = &pm8921_chg_pdata,
  434. .bms_pdata = &pm8921_bms_pdata,
  435. .adc_pdata = &pm8038_adc_pdata,
  436. .leds_pdata = &pm8xxx_leds_pdata,
  437. .ccadc_pdata = &pm8xxx_ccadc_pdata,
  438. .spk_pdata = &pm8xxx_spk_pdata,
  439. };
  440. static struct msm_ssbi_platform_data msm8930_ssbi_pm8038_pdata __devinitdata = {
  441. .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
  442. .slave = {
  443. .name = "pm8038-core",
  444. .platform_data = &pm8038_platform_data,
  445. },
  446. };
  447. /* PM8917 platform data */
  448. static struct pm8xxx_adc_amux pm8917_adc_channels_data[] = {
  449. {"vcoin", CHANNEL_VCOIN, CHAN_PATH_SCALING2, AMUX_RSV1,
  450. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  451. {"vbat", CHANNEL_VBAT, CHAN_PATH_SCALING2, AMUX_RSV1,
  452. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  453. {"dcin", CHANNEL_DCIN, CHAN_PATH_SCALING4, AMUX_RSV1,
  454. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  455. {"ichg", CHANNEL_ICHG, CHAN_PATH_SCALING1, AMUX_RSV1,
  456. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  457. {"vph_pwr", CHANNEL_VPH_PWR, CHAN_PATH_SCALING2, AMUX_RSV1,
  458. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  459. {"ibat", CHANNEL_IBAT, CHAN_PATH_SCALING1, AMUX_RSV1,
  460. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  461. {"batt_therm", CHANNEL_BATT_THERM, CHAN_PATH_SCALING1, AMUX_RSV2,
  462. ADC_DECIMATION_TYPE2, ADC_SCALE_BATT_THERM},
  463. {"batt_id", CHANNEL_BATT_ID, CHAN_PATH_SCALING1, AMUX_RSV2,
  464. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  465. {"usbin", CHANNEL_USBIN, CHAN_PATH_SCALING3, AMUX_RSV1,
  466. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  467. {"pmic_therm", CHANNEL_DIE_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
  468. ADC_DECIMATION_TYPE2, ADC_SCALE_PMIC_THERM},
  469. {"625mv", CHANNEL_625MV, CHAN_PATH_SCALING1, AMUX_RSV1,
  470. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  471. {"125v", CHANNEL_125V, CHAN_PATH_SCALING1, AMUX_RSV1,
  472. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  473. {"chg_temp", CHANNEL_CHG_TEMP, CHAN_PATH_SCALING1, AMUX_RSV1,
  474. ADC_DECIMATION_TYPE2, ADC_SCALE_DEFAULT},
  475. {"xo_therm", CHANNEL_MUXOFF, CHAN_PATH_SCALING1, AMUX_RSV0,
  476. ADC_DECIMATION_TYPE2, ADC_SCALE_XOTHERM},
  477. {"pa_therm0", ADC_MPP_1_AMUX3, CHAN_PATH_SCALING1, AMUX_RSV1,
  478. ADC_DECIMATION_TYPE2, ADC_SCALE_PA_THERM},
  479. };
  480. static struct pm8xxx_adc_properties pm8917_adc_data = {
  481. .adc_vdd_reference = 1800, /* milli-voltage for this adc */
  482. .bitresolution = 15,
  483. .bipolar = 0,
  484. };
  485. static struct pm8xxx_adc_platform_data pm8917_adc_pdata = {
  486. .adc_channel = pm8917_adc_channels_data,
  487. .adc_num_board_channel = ARRAY_SIZE(pm8917_adc_channels_data),
  488. .adc_prop = &pm8917_adc_data,
  489. .adc_mpp_base = PM8917_MPP_PM_TO_SYS(1),
  490. };
  491. static struct pm8921_platform_data pm8917_platform_data __devinitdata = {
  492. .irq_pdata = &pm8xxx_irq_pdata,
  493. .gpio_pdata = &pm8xxx_gpio_pdata,
  494. .mpp_pdata = &pm8xxx_mpp_pdata,
  495. .rtc_pdata = &pm8xxx_rtc_pdata,
  496. .pwrkey_pdata = &pm8xxx_pwrkey_pdata,
  497. .misc_pdata = &pm8xxx_misc_pdata,
  498. .regulator_pdatas = msm8930_pm8917_regulator_pdata,
  499. .charger_pdata = &pm8921_chg_pdata,
  500. .bms_pdata = &pm8921_bms_pdata,
  501. .adc_pdata = &pm8917_adc_pdata,
  502. .ccadc_pdata = &pm8xxx_ccadc_pdata,
  503. };
  504. static struct msm_ssbi_platform_data msm8930_ssbi_pm8917_pdata __devinitdata = {
  505. .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
  506. .slave = {
  507. .name = "pm8921-core",
  508. .platform_data = &pm8917_platform_data,
  509. },
  510. };
  511. void __init msm8930_init_pmic(void)
  512. {
  513. if (socinfo_get_pmic_model() != PMIC_MODEL_PM8917) {
  514. /* PM8038 configuration */
  515. pmic_reset_irq = PM8038_IRQ_BASE + PM8038_RESOUT_IRQ;
  516. msm8960_device_ssbi_pmic.dev.platform_data =
  517. &msm8930_ssbi_pm8038_pdata;
  518. pm8038_platform_data.num_regulators
  519. = msm8930_pm8038_regulator_pdata_len;
  520. if (machine_is_msm8930_mtp())
  521. pm8921_bms_pdata.battery_type = BATT_PALLADIUM;
  522. else if (machine_is_msm8930_cdp())
  523. pm8921_chg_pdata.has_dc_supply = true;
  524. } else {
  525. /* PM8917 configuration */
  526. pmic_reset_irq = PM8917_IRQ_BASE + PM8921_RESOUT_IRQ;
  527. msm8960_device_ssbi_pmic.dev.platform_data =
  528. &msm8930_ssbi_pm8917_pdata;
  529. pm8917_platform_data.num_regulators
  530. = msm8930_pm8917_regulator_pdata_len;
  531. if (machine_is_msm8930_mtp())
  532. pm8921_bms_pdata.battery_type = BATT_PALLADIUM;
  533. else if (machine_is_msm8930_cdp())
  534. pm8921_chg_pdata.has_dc_supply = true;
  535. }
  536. }