lp8788.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. /*
  2. * TI LP8788 MFD Device
  3. *
  4. * Copyright 2012 Texas Instruments
  5. *
  6. * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. *
  12. */
  13. #ifndef __MFD_LP8788_H__
  14. #define __MFD_LP8788_H__
  15. #include <linux/gpio.h>
  16. #include <linux/irqdomain.h>
  17. #include <linux/regmap.h>
  18. #define LP8788_DEV_BUCK "lp8788-buck"
  19. #define LP8788_DEV_DLDO "lp8788-dldo"
  20. #define LP8788_DEV_ALDO "lp8788-aldo"
  21. #define LP8788_DEV_CHARGER "lp8788-charger"
  22. #define LP8788_DEV_RTC "lp8788-rtc"
  23. #define LP8788_DEV_BACKLIGHT "lp8788-backlight"
  24. #define LP8788_DEV_VIBRATOR "lp8788-vibrator"
  25. #define LP8788_DEV_KEYLED "lp8788-keyled"
  26. #define LP8788_DEV_ADC "lp8788-adc"
  27. #define LP8788_NUM_BUCKS 4
  28. #define LP8788_NUM_DLDOS 12
  29. #define LP8788_NUM_ALDOS 10
  30. #define LP8788_NUM_BUCK2_DVS 2
  31. #define LP8788_CHG_IRQ "CHG_IRQ"
  32. #define LP8788_PRSW_IRQ "PRSW_IRQ"
  33. #define LP8788_BATT_IRQ "BATT_IRQ"
  34. #define LP8788_ALM_IRQ "ALARM_IRQ"
  35. enum lp8788_int_id {
  36. /* interrup register 1 : Addr 00h */
  37. LP8788_INT_TSDL,
  38. LP8788_INT_TSDH,
  39. LP8788_INT_UVLO,
  40. LP8788_INT_FLAGMON,
  41. LP8788_INT_PWRON_TIME,
  42. LP8788_INT_PWRON,
  43. LP8788_INT_COMP1,
  44. LP8788_INT_COMP2,
  45. /* interrupt register 2 : Addr 01h */
  46. LP8788_INT_CHG_INPUT_STATE,
  47. LP8788_INT_CHG_STATE,
  48. LP8788_INT_EOC,
  49. LP8788_INT_CHG_RESTART,
  50. LP8788_INT_RESTART_TIMEOUT,
  51. LP8788_INT_FULLCHG_TIMEOUT,
  52. LP8788_INT_PRECHG_TIMEOUT,
  53. /* interrupt register 3 : Addr 02h */
  54. LP8788_INT_RTC_ALARM1 = 17,
  55. LP8788_INT_RTC_ALARM2,
  56. LP8788_INT_ENTER_SYS_SUPPORT,
  57. LP8788_INT_EXIT_SYS_SUPPORT,
  58. LP8788_INT_BATT_LOW,
  59. LP8788_INT_NO_BATT,
  60. LP8788_INT_MAX = 24,
  61. };
  62. enum lp8788_dvs_sel {
  63. DVS_SEL_V0,
  64. DVS_SEL_V1,
  65. DVS_SEL_V2,
  66. DVS_SEL_V3,
  67. };
  68. enum lp8788_ext_ldo_en_id {
  69. EN_ALDO1,
  70. EN_ALDO234,
  71. EN_ALDO5,
  72. EN_ALDO7,
  73. EN_DLDO7,
  74. EN_DLDO911,
  75. EN_LDOS_MAX,
  76. };
  77. enum lp8788_charger_event {
  78. NO_CHARGER,
  79. CHARGER_DETECTED,
  80. };
  81. enum lp8788_bl_ctrl_mode {
  82. LP8788_BL_REGISTER_ONLY,
  83. LP8788_BL_COMB_PWM_BASED, /* PWM + I2C, changed by PWM input */
  84. LP8788_BL_COMB_REGISTER_BASED, /* PWM + I2C, changed by I2C */
  85. };
  86. enum lp8788_bl_dim_mode {
  87. LP8788_DIM_EXPONENTIAL,
  88. LP8788_DIM_LINEAR,
  89. };
  90. enum lp8788_bl_full_scale_current {
  91. LP8788_FULLSCALE_5000uA,
  92. LP8788_FULLSCALE_8500uA,
  93. LP8788_FULLSCALE_1200uA,
  94. LP8788_FULLSCALE_1550uA,
  95. LP8788_FULLSCALE_1900uA,
  96. LP8788_FULLSCALE_2250uA,
  97. LP8788_FULLSCALE_2600uA,
  98. LP8788_FULLSCALE_2950uA,
  99. };
  100. enum lp8788_bl_ramp_step {
  101. LP8788_RAMP_8us,
  102. LP8788_RAMP_1024us,
  103. LP8788_RAMP_2048us,
  104. LP8788_RAMP_4096us,
  105. LP8788_RAMP_8192us,
  106. LP8788_RAMP_16384us,
  107. LP8788_RAMP_32768us,
  108. LP8788_RAMP_65538us,
  109. };
  110. enum lp8788_bl_pwm_polarity {
  111. LP8788_PWM_ACTIVE_HIGH,
  112. LP8788_PWM_ACTIVE_LOW,
  113. };
  114. enum lp8788_isink_scale {
  115. LP8788_ISINK_SCALE_100mA,
  116. LP8788_ISINK_SCALE_120mA,
  117. };
  118. enum lp8788_isink_number {
  119. LP8788_ISINK_1,
  120. LP8788_ISINK_2,
  121. LP8788_ISINK_3,
  122. };
  123. enum lp8788_alarm_sel {
  124. LP8788_ALARM_1,
  125. LP8788_ALARM_2,
  126. LP8788_ALARM_MAX,
  127. };
  128. enum lp8788_adc_id {
  129. LPADC_VBATT_5P5,
  130. LPADC_VIN_CHG,
  131. LPADC_IBATT,
  132. LPADC_IC_TEMP,
  133. LPADC_VBATT_6P0,
  134. LPADC_VBATT_5P0,
  135. LPADC_ADC1,
  136. LPADC_ADC2,
  137. LPADC_VDD,
  138. LPADC_VCOIN,
  139. LPADC_VDD_LDO,
  140. LPADC_ADC3,
  141. LPADC_ADC4,
  142. LPADC_MAX,
  143. };
  144. struct lp8788;
  145. /*
  146. * lp8788_buck1_dvs
  147. * @gpio : gpio pin number for dvs control
  148. * @vsel : dvs selector for buck v1 register
  149. */
  150. struct lp8788_buck1_dvs {
  151. int gpio;
  152. enum lp8788_dvs_sel vsel;
  153. };
  154. /*
  155. * lp8788_buck2_dvs
  156. * @gpio : two gpio pin numbers are used for dvs
  157. * @vsel : dvs selector for buck v2 register
  158. */
  159. struct lp8788_buck2_dvs {
  160. int gpio[LP8788_NUM_BUCK2_DVS];
  161. enum lp8788_dvs_sel vsel;
  162. };
  163. /*
  164. * struct lp8788_ldo_enable_pin
  165. *
  166. * Basically, all LDOs are enabled through the I2C commands.
  167. * But ALDO 1 ~ 5, 7, DLDO 7, 9, 11 can be enabled by external gpio pins.
  168. *
  169. * @gpio : gpio number which is used for enabling ldos
  170. * @init_state : initial gpio state (ex. GPIOF_OUT_INIT_LOW)
  171. */
  172. struct lp8788_ldo_enable_pin {
  173. int gpio;
  174. int init_state;
  175. };
  176. /*
  177. * struct lp8788_chg_param
  178. * @addr : charging control register address (range : 0x11 ~ 0x1C)
  179. * @val : charging parameter value
  180. */
  181. struct lp8788_chg_param {
  182. u8 addr;
  183. u8 val;
  184. };
  185. /*
  186. * struct lp8788_charger_platform_data
  187. * @vbatt_adc : adc selection id for battery voltage
  188. * @batt_temp_adc : adc selection id for battery temperature
  189. * @max_vbatt_mv : used for calculating battery capacity
  190. * @chg_params : initial charging parameters
  191. * @num_chg_params : numbers of charging parameters
  192. * @charger_event : the charger event can be reported to the platform side
  193. */
  194. struct lp8788_charger_platform_data {
  195. enum lp8788_adc_id vbatt_adc;
  196. enum lp8788_adc_id batt_temp_adc;
  197. unsigned int max_vbatt_mv;
  198. struct lp8788_chg_param *chg_params;
  199. int num_chg_params;
  200. void (*charger_event) (struct lp8788 *lp,
  201. enum lp8788_charger_event event);
  202. };
  203. /*
  204. * struct lp8788_bl_pwm_data
  205. * @pwm_set_intensity : set duty of pwm
  206. * @pwm_get_intensity : get current duty of pwm
  207. */
  208. struct lp8788_bl_pwm_data {
  209. void (*pwm_set_intensity) (int brightness, int max_brightness);
  210. int (*pwm_get_intensity) (int max_brightness);
  211. };
  212. /*
  213. * struct lp8788_backlight_platform_data
  214. * @name : backlight driver name. (default: "lcd-backlight")
  215. * @initial_brightness : initial value of backlight brightness
  216. * @bl_mode : brightness control by pwm or lp8788 register
  217. * @dim_mode : dimming mode selection
  218. * @full_scale : full scale current setting
  219. * @rise_time : brightness ramp up step time
  220. * @fall_time : brightness ramp down step time
  221. * @pwm_pol : pwm polarity setting when bl_mode is pwm based
  222. * @pwm_data : platform specific pwm generation functions
  223. * only valid when bl_mode is pwm based
  224. */
  225. struct lp8788_backlight_platform_data {
  226. char *name;
  227. int initial_brightness;
  228. enum lp8788_bl_ctrl_mode bl_mode;
  229. enum lp8788_bl_dim_mode dim_mode;
  230. enum lp8788_bl_full_scale_current full_scale;
  231. enum lp8788_bl_ramp_step rise_time;
  232. enum lp8788_bl_ramp_step fall_time;
  233. enum lp8788_bl_pwm_polarity pwm_pol;
  234. struct lp8788_bl_pwm_data pwm_data;
  235. };
  236. /*
  237. * struct lp8788_led_platform_data
  238. * @name : led driver name. (default: "keyboard-backlight")
  239. * @scale : current scale
  240. * @num : current sink number
  241. * @iout_code : current output value (Addr 9Ah ~ 9Bh)
  242. */
  243. struct lp8788_led_platform_data {
  244. char *name;
  245. enum lp8788_isink_scale scale;
  246. enum lp8788_isink_number num;
  247. int iout_code;
  248. };
  249. /*
  250. * struct lp8788_vib_platform_data
  251. * @name : vibrator driver name
  252. * @scale : current scale
  253. * @num : current sink number
  254. * @iout_code : current output value (Addr 9Ah ~ 9Bh)
  255. * @pwm_code : PWM code value (Addr 9Ch ~ 9Eh)
  256. */
  257. struct lp8788_vib_platform_data {
  258. char *name;
  259. enum lp8788_isink_scale scale;
  260. enum lp8788_isink_number num;
  261. int iout_code;
  262. int pwm_code;
  263. };
  264. /*
  265. * struct lp8788_platform_data
  266. * @init_func : used for initializing registers
  267. * before mfd driver is registered
  268. * @buck_data : regulator initial data for buck
  269. * @dldo_data : regulator initial data for digital ldo
  270. * @aldo_data : regulator initial data for analog ldo
  271. * @buck1_dvs : gpio configurations for buck1 dvs
  272. * @buck2_dvs : gpio configurations for buck2 dvs
  273. * @ldo_pin : gpio configurations for enabling LDOs
  274. * @chg_pdata : platform data for charger driver
  275. * @alarm_sel : rtc alarm selection (1 or 2)
  276. * @bl_pdata : configurable data for backlight driver
  277. * @led_pdata : configurable data for led driver
  278. * @vib_pdata : configurable data for vibrator driver
  279. * @adc_pdata : iio map data for adc driver
  280. */
  281. struct lp8788_platform_data {
  282. /* general system information */
  283. int (*init_func) (struct lp8788 *lp);
  284. /* regulators */
  285. struct regulator_init_data *buck_data[LP8788_NUM_BUCKS];
  286. struct regulator_init_data *dldo_data[LP8788_NUM_DLDOS];
  287. struct regulator_init_data *aldo_data[LP8788_NUM_ALDOS];
  288. struct lp8788_buck1_dvs *buck1_dvs;
  289. struct lp8788_buck2_dvs *buck2_dvs;
  290. struct lp8788_ldo_enable_pin *ldo_pin[EN_LDOS_MAX];
  291. /* charger */
  292. struct lp8788_charger_platform_data *chg_pdata;
  293. /* rtc alarm */
  294. enum lp8788_alarm_sel alarm_sel;
  295. /* backlight */
  296. struct lp8788_backlight_platform_data *bl_pdata;
  297. /* current sinks */
  298. struct lp8788_led_platform_data *led_pdata;
  299. struct lp8788_vib_platform_data *vib_pdata;
  300. /* adc iio map data */
  301. struct iio_map *adc_pdata;
  302. };
  303. /*
  304. * struct lp8788
  305. * @dev : parent device pointer
  306. * @regmap : used for i2c communcation on accessing registers
  307. * @irqdm : interrupt domain for handling nested interrupt
  308. * @irq : pin number of IRQ_N
  309. * @pdata : lp8788 platform specific data
  310. */
  311. struct lp8788 {
  312. struct device *dev;
  313. struct regmap *regmap;
  314. struct irq_domain *irqdm;
  315. int irq;
  316. struct lp8788_platform_data *pdata;
  317. };
  318. int lp8788_irq_init(struct lp8788 *lp, int chip_irq);
  319. void lp8788_irq_exit(struct lp8788 *lp);
  320. int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data);
  321. int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count);
  322. int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data);
  323. int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data);
  324. #endif