lp872x.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  1. /*
  2. * Copyright 2012 Texas Instruments
  3. *
  4. * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License version 2 as
  8. * published by the Free Software Foundation.
  9. *
  10. */
  11. #include <linux/module.h>
  12. #include <linux/slab.h>
  13. #include <linux/i2c.h>
  14. #include <linux/regmap.h>
  15. #include <linux/err.h>
  16. #include <linux/gpio.h>
  17. #include <linux/regulator/lp872x.h>
  18. #include <linux/regulator/driver.h>
  19. #include <linux/platform_device.h>
  20. /* Registers : LP8720/8725 shared */
  21. #define LP872X_GENERAL_CFG 0x00
  22. #define LP872X_LDO1_VOUT 0x01
  23. #define LP872X_LDO2_VOUT 0x02
  24. #define LP872X_LDO3_VOUT 0x03
  25. #define LP872X_LDO4_VOUT 0x04
  26. #define LP872X_LDO5_VOUT 0x05
  27. /* Registers : LP8720 */
  28. #define LP8720_BUCK_VOUT1 0x06
  29. #define LP8720_BUCK_VOUT2 0x07
  30. #define LP8720_ENABLE 0x08
  31. /* Registers : LP8725 */
  32. #define LP8725_LILO1_VOUT 0x06
  33. #define LP8725_LILO2_VOUT 0x07
  34. #define LP8725_BUCK1_VOUT1 0x08
  35. #define LP8725_BUCK1_VOUT2 0x09
  36. #define LP8725_BUCK2_VOUT1 0x0A
  37. #define LP8725_BUCK2_VOUT2 0x0B
  38. #define LP8725_BUCK_CTRL 0x0C
  39. #define LP8725_LDO_CTRL 0x0D
  40. /* Mask/shift : LP8720/LP8725 shared */
  41. #define LP872X_VOUT_M 0x1F
  42. #define LP872X_START_DELAY_M 0xE0
  43. #define LP872X_START_DELAY_S 5
  44. #define LP872X_EN_LDO1_M BIT(0)
  45. #define LP872X_EN_LDO2_M BIT(1)
  46. #define LP872X_EN_LDO3_M BIT(2)
  47. #define LP872X_EN_LDO4_M BIT(3)
  48. #define LP872X_EN_LDO5_M BIT(4)
  49. /* Mask/shift : LP8720 */
  50. #define LP8720_TIMESTEP_S 0 /* Addr 00h */
  51. #define LP8720_TIMESTEP_M BIT(0)
  52. #define LP8720_EXT_DVS_M BIT(2)
  53. #define LP8720_BUCK_FPWM_S 5 /* Addr 07h */
  54. #define LP8720_BUCK_FPWM_M BIT(5)
  55. #define LP8720_EN_BUCK_M BIT(5) /* Addr 08h */
  56. #define LP8720_DVS_SEL_M BIT(7)
  57. /* Mask/shift : LP8725 */
  58. #define LP8725_TIMESTEP_M 0xC0 /* Addr 00h */
  59. #define LP8725_TIMESTEP_S 6
  60. #define LP8725_BUCK1_EN_M BIT(0)
  61. #define LP8725_DVS1_M BIT(2)
  62. #define LP8725_DVS2_M BIT(3)
  63. #define LP8725_BUCK2_EN_M BIT(4)
  64. #define LP8725_BUCK_CL_M 0xC0 /* Addr 09h, 0Bh */
  65. #define LP8725_BUCK_CL_S 6
  66. #define LP8725_BUCK1_FPWM_S 1 /* Addr 0Ch */
  67. #define LP8725_BUCK1_FPWM_M BIT(1)
  68. #define LP8725_BUCK2_FPWM_S 5
  69. #define LP8725_BUCK2_FPWM_M BIT(5)
  70. #define LP8725_EN_LILO1_M BIT(5) /* Addr 0Dh */
  71. #define LP8725_EN_LILO2_M BIT(6)
  72. /* PWM mode */
  73. #define LP872X_FORCE_PWM 1
  74. #define LP872X_AUTO_PWM 0
  75. #define LP8720_NUM_REGULATORS 6
  76. #define LP8725_NUM_REGULATORS 9
  77. #define EXTERN_DVS_USED 0
  78. #define MAX_DELAY 6
  79. /* dump registers in regmap-debugfs */
  80. #define MAX_REGISTERS 0x0F
  81. enum lp872x_id {
  82. LP8720,
  83. LP8725,
  84. };
  85. struct lp872x {
  86. struct regmap *regmap;
  87. struct device *dev;
  88. enum lp872x_id chipid;
  89. struct lp872x_platform_data *pdata;
  90. struct regulator_dev **regulators;
  91. int num_regulators;
  92. enum lp872x_dvs_state dvs_pin;
  93. int dvs_gpio;
  94. };
  95. /* LP8720/LP8725 shared voltage table for LDOs */
  96. static const unsigned int lp872x_ldo_vtbl[] = {
  97. 1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000, 1550000,
  98. 1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000, 2000000,
  99. 2100000, 2200000, 2300000, 2400000, 2500000, 2600000, 2650000, 2700000,
  100. 2750000, 2800000, 2850000, 2900000, 2950000, 3000000, 3100000, 3300000,
  101. };
  102. /* LP8720 LDO4 voltage table */
  103. static const unsigned int lp8720_ldo4_vtbl[] = {
  104. 800000, 850000, 900000, 1000000, 1100000, 1200000, 1250000, 1300000,
  105. 1350000, 1400000, 1450000, 1500000, 1550000, 1600000, 1650000, 1700000,
  106. 1750000, 1800000, 1850000, 1900000, 2000000, 2100000, 2200000, 2300000,
  107. 2400000, 2500000, 2600000, 2650000, 2700000, 2750000, 2800000, 2850000,
  108. };
  109. /* LP8725 LILO(Low Input Low Output) voltage table */
  110. static const unsigned int lp8725_lilo_vtbl[] = {
  111. 800000, 850000, 900000, 950000, 1000000, 1050000, 1100000, 1150000,
  112. 1200000, 1250000, 1300000, 1350000, 1400000, 1500000, 1600000, 1700000,
  113. 1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
  114. 2600000, 2700000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000,
  115. };
  116. /* LP8720 BUCK voltage table */
  117. #define EXT_R 0 /* external resistor divider */
  118. static const unsigned int lp8720_buck_vtbl[] = {
  119. EXT_R, 800000, 850000, 900000, 950000, 1000000, 1050000, 1100000,
  120. 1150000, 1200000, 1250000, 1300000, 1350000, 1400000, 1450000, 1500000,
  121. 1550000, 1600000, 1650000, 1700000, 1750000, 1800000, 1850000, 1900000,
  122. 1950000, 2000000, 2050000, 2100000, 2150000, 2200000, 2250000, 2300000,
  123. };
  124. /* LP8725 BUCK voltage table */
  125. static const unsigned int lp8725_buck_vtbl[] = {
  126. 800000, 850000, 900000, 950000, 1000000, 1050000, 1100000, 1150000,
  127. 1200000, 1250000, 1300000, 1350000, 1400000, 1500000, 1600000, 1700000,
  128. 1750000, 1800000, 1850000, 1900000, 2000000, 2100000, 2200000, 2300000,
  129. 2400000, 2500000, 2600000, 2700000, 2800000, 2850000, 2900000, 3000000,
  130. };
  131. /* LP8725 BUCK current limit */
  132. static const unsigned int lp8725_buck_uA[] = {
  133. 460000, 780000, 1050000, 1370000,
  134. };
  135. static int lp872x_read_byte(struct lp872x *lp, u8 addr, u8 *data)
  136. {
  137. int ret;
  138. unsigned int val;
  139. ret = regmap_read(lp->regmap, addr, &val);
  140. if (ret < 0) {
  141. dev_err(lp->dev, "failed to read 0x%.2x\n", addr);
  142. return ret;
  143. }
  144. *data = (u8)val;
  145. return 0;
  146. }
  147. static inline int lp872x_write_byte(struct lp872x *lp, u8 addr, u8 data)
  148. {
  149. return regmap_write(lp->regmap, addr, data);
  150. }
  151. static inline int lp872x_update_bits(struct lp872x *lp, u8 addr,
  152. unsigned int mask, u8 data)
  153. {
  154. return regmap_update_bits(lp->regmap, addr, mask, data);
  155. }
  156. static int _rdev_to_offset(struct regulator_dev *rdev)
  157. {
  158. enum lp872x_regulator_id id = rdev_get_id(rdev);
  159. switch (id) {
  160. case LP8720_ID_LDO1 ... LP8720_ID_BUCK:
  161. return id;
  162. case LP8725_ID_LDO1 ... LP8725_ID_BUCK2:
  163. return id - LP8725_ID_BASE;
  164. default:
  165. return -EINVAL;
  166. }
  167. }
  168. static int lp872x_get_timestep_usec(struct lp872x *lp)
  169. {
  170. enum lp872x_id chip = lp->chipid;
  171. u8 val, mask, shift;
  172. int *time_usec, size, ret;
  173. int lp8720_time_usec[] = { 25, 50 };
  174. int lp8725_time_usec[] = { 32, 64, 128, 256 };
  175. switch (chip) {
  176. case LP8720:
  177. mask = LP8720_TIMESTEP_M;
  178. shift = LP8720_TIMESTEP_S;
  179. time_usec = &lp8720_time_usec[0];
  180. size = ARRAY_SIZE(lp8720_time_usec);
  181. break;
  182. case LP8725:
  183. mask = LP8725_TIMESTEP_M;
  184. shift = LP8725_TIMESTEP_S;
  185. time_usec = &lp8725_time_usec[0];
  186. size = ARRAY_SIZE(lp8725_time_usec);
  187. break;
  188. default:
  189. return -EINVAL;
  190. }
  191. ret = lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val);
  192. if (ret)
  193. return -EINVAL;
  194. val = (val & mask) >> shift;
  195. if (val >= size)
  196. return -EINVAL;
  197. return *(time_usec + val);
  198. }
  199. static int lp872x_regulator_enable_time(struct regulator_dev *rdev)
  200. {
  201. struct lp872x *lp = rdev_get_drvdata(rdev);
  202. enum lp872x_regulator_id regulator = rdev_get_id(rdev);
  203. int time_step_us = lp872x_get_timestep_usec(lp);
  204. int ret, offset;
  205. u8 addr, val;
  206. if (time_step_us < 0)
  207. return -EINVAL;
  208. switch (regulator) {
  209. case LP8720_ID_LDO1 ... LP8720_ID_LDO5:
  210. case LP8725_ID_LDO1 ... LP8725_ID_LILO2:
  211. offset = _rdev_to_offset(rdev);
  212. if (offset < 0)
  213. return -EINVAL;
  214. addr = LP872X_LDO1_VOUT + offset;
  215. break;
  216. case LP8720_ID_BUCK:
  217. addr = LP8720_BUCK_VOUT1;
  218. break;
  219. case LP8725_ID_BUCK1:
  220. addr = LP8725_BUCK1_VOUT1;
  221. break;
  222. case LP8725_ID_BUCK2:
  223. addr = LP8725_BUCK2_VOUT1;
  224. break;
  225. default:
  226. return -EINVAL;
  227. }
  228. ret = lp872x_read_byte(lp, addr, &val);
  229. if (ret)
  230. return ret;
  231. val = (val & LP872X_START_DELAY_M) >> LP872X_START_DELAY_S;
  232. return val > MAX_DELAY ? 0 : val * time_step_us;
  233. }
  234. static void lp872x_set_dvs(struct lp872x *lp, int gpio)
  235. {
  236. enum lp872x_dvs_sel dvs_sel = lp->pdata->dvs->vsel;
  237. enum lp872x_dvs_state state;
  238. state = dvs_sel == SEL_V1 ? DVS_HIGH : DVS_LOW;
  239. gpio_set_value(gpio, state);
  240. lp->dvs_pin = state;
  241. }
  242. static u8 lp872x_select_buck_vout_addr(struct lp872x *lp,
  243. enum lp872x_regulator_id buck)
  244. {
  245. u8 val, addr;
  246. if (lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val))
  247. return 0;
  248. switch (buck) {
  249. case LP8720_ID_BUCK:
  250. if (val & LP8720_EXT_DVS_M) {
  251. addr = (lp->dvs_pin == DVS_HIGH) ?
  252. LP8720_BUCK_VOUT1 : LP8720_BUCK_VOUT2;
  253. } else {
  254. if (lp872x_read_byte(lp, LP8720_ENABLE, &val))
  255. return 0;
  256. addr = val & LP8720_DVS_SEL_M ?
  257. LP8720_BUCK_VOUT1 : LP8720_BUCK_VOUT2;
  258. }
  259. break;
  260. case LP8725_ID_BUCK1:
  261. if (val & LP8725_DVS1_M)
  262. addr = LP8725_BUCK1_VOUT1;
  263. else
  264. addr = (lp->dvs_pin == DVS_HIGH) ?
  265. LP8725_BUCK1_VOUT1 : LP8725_BUCK1_VOUT2;
  266. break;
  267. case LP8725_ID_BUCK2:
  268. addr = val & LP8725_DVS2_M ?
  269. LP8725_BUCK2_VOUT1 : LP8725_BUCK2_VOUT2;
  270. break;
  271. default:
  272. return 0;
  273. }
  274. return addr;
  275. }
  276. static bool lp872x_is_valid_buck_addr(u8 addr)
  277. {
  278. switch (addr) {
  279. case LP8720_BUCK_VOUT1:
  280. case LP8720_BUCK_VOUT2:
  281. case LP8725_BUCK1_VOUT1:
  282. case LP8725_BUCK1_VOUT2:
  283. case LP8725_BUCK2_VOUT1:
  284. case LP8725_BUCK2_VOUT2:
  285. return true;
  286. default:
  287. return false;
  288. }
  289. }
  290. static int lp872x_buck_set_voltage_sel(struct regulator_dev *rdev,
  291. unsigned selector)
  292. {
  293. struct lp872x *lp = rdev_get_drvdata(rdev);
  294. enum lp872x_regulator_id buck = rdev_get_id(rdev);
  295. u8 addr, mask = LP872X_VOUT_M;
  296. struct lp872x_dvs *dvs = lp->pdata->dvs;
  297. if (dvs && gpio_is_valid(dvs->gpio))
  298. lp872x_set_dvs(lp, dvs->gpio);
  299. addr = lp872x_select_buck_vout_addr(lp, buck);
  300. if (!lp872x_is_valid_buck_addr(addr))
  301. return -EINVAL;
  302. return lp872x_update_bits(lp, addr, mask, selector);
  303. }
  304. static int lp872x_buck_get_voltage_sel(struct regulator_dev *rdev)
  305. {
  306. struct lp872x *lp = rdev_get_drvdata(rdev);
  307. enum lp872x_regulator_id buck = rdev_get_id(rdev);
  308. u8 addr, val;
  309. int ret;
  310. addr = lp872x_select_buck_vout_addr(lp, buck);
  311. if (!lp872x_is_valid_buck_addr(addr))
  312. return -EINVAL;
  313. ret = lp872x_read_byte(lp, addr, &val);
  314. if (ret)
  315. return ret;
  316. return val & LP872X_VOUT_M;
  317. }
  318. static int lp8725_buck_set_current_limit(struct regulator_dev *rdev,
  319. int min_uA, int max_uA)
  320. {
  321. struct lp872x *lp = rdev_get_drvdata(rdev);
  322. enum lp872x_regulator_id buck = rdev_get_id(rdev);
  323. int i, max = ARRAY_SIZE(lp8725_buck_uA);
  324. u8 addr, val;
  325. switch (buck) {
  326. case LP8725_ID_BUCK1:
  327. addr = LP8725_BUCK1_VOUT2;
  328. break;
  329. case LP8725_ID_BUCK2:
  330. addr = LP8725_BUCK2_VOUT2;
  331. break;
  332. default:
  333. return -EINVAL;
  334. }
  335. for (i = 0 ; i < max ; i++)
  336. if (lp8725_buck_uA[i] >= min_uA &&
  337. lp8725_buck_uA[i] <= max_uA)
  338. break;
  339. if (i == max)
  340. return -EINVAL;
  341. val = i << LP8725_BUCK_CL_S;
  342. return lp872x_update_bits(lp, addr, LP8725_BUCK_CL_M, val);
  343. }
  344. static int lp8725_buck_get_current_limit(struct regulator_dev *rdev)
  345. {
  346. struct lp872x *lp = rdev_get_drvdata(rdev);
  347. enum lp872x_regulator_id buck = rdev_get_id(rdev);
  348. u8 addr, val;
  349. int ret;
  350. switch (buck) {
  351. case LP8725_ID_BUCK1:
  352. addr = LP8725_BUCK1_VOUT2;
  353. break;
  354. case LP8725_ID_BUCK2:
  355. addr = LP8725_BUCK2_VOUT2;
  356. break;
  357. default:
  358. return -EINVAL;
  359. }
  360. ret = lp872x_read_byte(lp, addr, &val);
  361. if (ret)
  362. return ret;
  363. val = (val & LP8725_BUCK_CL_M) >> LP8725_BUCK_CL_S;
  364. return (val < ARRAY_SIZE(lp8725_buck_uA)) ?
  365. lp8725_buck_uA[val] : -EINVAL;
  366. }
  367. static int lp872x_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
  368. {
  369. struct lp872x *lp = rdev_get_drvdata(rdev);
  370. enum lp872x_regulator_id buck = rdev_get_id(rdev);
  371. u8 addr, mask, shift, val;
  372. switch (buck) {
  373. case LP8720_ID_BUCK:
  374. addr = LP8720_BUCK_VOUT2;
  375. mask = LP8720_BUCK_FPWM_M;
  376. shift = LP8720_BUCK_FPWM_S;
  377. break;
  378. case LP8725_ID_BUCK1:
  379. addr = LP8725_BUCK_CTRL;
  380. mask = LP8725_BUCK1_FPWM_M;
  381. shift = LP8725_BUCK1_FPWM_S;
  382. break;
  383. case LP8725_ID_BUCK2:
  384. addr = LP8725_BUCK_CTRL;
  385. mask = LP8725_BUCK2_FPWM_M;
  386. shift = LP8725_BUCK2_FPWM_S;
  387. break;
  388. default:
  389. return -EINVAL;
  390. }
  391. if (mode == REGULATOR_MODE_FAST)
  392. val = LP872X_FORCE_PWM << shift;
  393. else if (mode == REGULATOR_MODE_NORMAL)
  394. val = LP872X_AUTO_PWM << shift;
  395. else
  396. return -EINVAL;
  397. return lp872x_update_bits(lp, addr, mask, val);
  398. }
  399. static unsigned int lp872x_buck_get_mode(struct regulator_dev *rdev)
  400. {
  401. struct lp872x *lp = rdev_get_drvdata(rdev);
  402. enum lp872x_regulator_id buck = rdev_get_id(rdev);
  403. u8 addr, mask, val;
  404. int ret;
  405. switch (buck) {
  406. case LP8720_ID_BUCK:
  407. addr = LP8720_BUCK_VOUT2;
  408. mask = LP8720_BUCK_FPWM_M;
  409. break;
  410. case LP8725_ID_BUCK1:
  411. addr = LP8725_BUCK_CTRL;
  412. mask = LP8725_BUCK1_FPWM_M;
  413. break;
  414. case LP8725_ID_BUCK2:
  415. addr = LP8725_BUCK_CTRL;
  416. mask = LP8725_BUCK2_FPWM_M;
  417. break;
  418. default:
  419. return -EINVAL;
  420. }
  421. ret = lp872x_read_byte(lp, addr, &val);
  422. if (ret)
  423. return ret;
  424. return val & mask ? REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL;
  425. }
  426. static struct regulator_ops lp872x_ldo_ops = {
  427. .list_voltage = regulator_list_voltage_table,
  428. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  429. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  430. .enable = regulator_enable_regmap,
  431. .disable = regulator_disable_regmap,
  432. .is_enabled = regulator_is_enabled_regmap,
  433. .enable_time = lp872x_regulator_enable_time,
  434. };
  435. static struct regulator_ops lp8720_buck_ops = {
  436. .list_voltage = regulator_list_voltage_table,
  437. .set_voltage_sel = lp872x_buck_set_voltage_sel,
  438. .get_voltage_sel = lp872x_buck_get_voltage_sel,
  439. .enable = regulator_enable_regmap,
  440. .disable = regulator_disable_regmap,
  441. .is_enabled = regulator_is_enabled_regmap,
  442. .enable_time = lp872x_regulator_enable_time,
  443. .set_mode = lp872x_buck_set_mode,
  444. .get_mode = lp872x_buck_get_mode,
  445. };
  446. static struct regulator_ops lp8725_buck_ops = {
  447. .list_voltage = regulator_list_voltage_table,
  448. .set_voltage_sel = lp872x_buck_set_voltage_sel,
  449. .get_voltage_sel = lp872x_buck_get_voltage_sel,
  450. .enable = regulator_enable_regmap,
  451. .disable = regulator_disable_regmap,
  452. .is_enabled = regulator_is_enabled_regmap,
  453. .enable_time = lp872x_regulator_enable_time,
  454. .set_mode = lp872x_buck_set_mode,
  455. .get_mode = lp872x_buck_get_mode,
  456. .set_current_limit = lp8725_buck_set_current_limit,
  457. .get_current_limit = lp8725_buck_get_current_limit,
  458. };
  459. static struct regulator_desc lp8720_regulator_desc[] = {
  460. {
  461. .name = "ldo1",
  462. .id = LP8720_ID_LDO1,
  463. .ops = &lp872x_ldo_ops,
  464. .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
  465. .volt_table = lp872x_ldo_vtbl,
  466. .type = REGULATOR_VOLTAGE,
  467. .owner = THIS_MODULE,
  468. .vsel_reg = LP872X_LDO1_VOUT,
  469. .vsel_mask = LP872X_VOUT_M,
  470. .enable_reg = LP8720_ENABLE,
  471. .enable_mask = LP872X_EN_LDO1_M,
  472. },
  473. {
  474. .name = "ldo2",
  475. .id = LP8720_ID_LDO2,
  476. .ops = &lp872x_ldo_ops,
  477. .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
  478. .volt_table = lp872x_ldo_vtbl,
  479. .type = REGULATOR_VOLTAGE,
  480. .owner = THIS_MODULE,
  481. .vsel_reg = LP872X_LDO2_VOUT,
  482. .vsel_mask = LP872X_VOUT_M,
  483. .enable_reg = LP8720_ENABLE,
  484. .enable_mask = LP872X_EN_LDO2_M,
  485. },
  486. {
  487. .name = "ldo3",
  488. .id = LP8720_ID_LDO3,
  489. .ops = &lp872x_ldo_ops,
  490. .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
  491. .volt_table = lp872x_ldo_vtbl,
  492. .type = REGULATOR_VOLTAGE,
  493. .owner = THIS_MODULE,
  494. .vsel_reg = LP872X_LDO3_VOUT,
  495. .vsel_mask = LP872X_VOUT_M,
  496. .enable_reg = LP8720_ENABLE,
  497. .enable_mask = LP872X_EN_LDO3_M,
  498. },
  499. {
  500. .name = "ldo4",
  501. .id = LP8720_ID_LDO4,
  502. .ops = &lp872x_ldo_ops,
  503. .n_voltages = ARRAY_SIZE(lp8720_ldo4_vtbl),
  504. .volt_table = lp8720_ldo4_vtbl,
  505. .type = REGULATOR_VOLTAGE,
  506. .owner = THIS_MODULE,
  507. .vsel_reg = LP872X_LDO4_VOUT,
  508. .vsel_mask = LP872X_VOUT_M,
  509. .enable_reg = LP8720_ENABLE,
  510. .enable_mask = LP872X_EN_LDO4_M,
  511. },
  512. {
  513. .name = "ldo5",
  514. .id = LP8720_ID_LDO5,
  515. .ops = &lp872x_ldo_ops,
  516. .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
  517. .volt_table = lp872x_ldo_vtbl,
  518. .type = REGULATOR_VOLTAGE,
  519. .owner = THIS_MODULE,
  520. .vsel_reg = LP872X_LDO5_VOUT,
  521. .vsel_mask = LP872X_VOUT_M,
  522. .enable_reg = LP8720_ENABLE,
  523. .enable_mask = LP872X_EN_LDO5_M,
  524. },
  525. {
  526. .name = "buck",
  527. .id = LP8720_ID_BUCK,
  528. .ops = &lp8720_buck_ops,
  529. .n_voltages = ARRAY_SIZE(lp8720_buck_vtbl),
  530. .volt_table = lp8720_buck_vtbl,
  531. .type = REGULATOR_VOLTAGE,
  532. .owner = THIS_MODULE,
  533. .enable_reg = LP8720_ENABLE,
  534. .enable_mask = LP8720_EN_BUCK_M,
  535. },
  536. };
  537. static struct regulator_desc lp8725_regulator_desc[] = {
  538. {
  539. .name = "ldo1",
  540. .id = LP8725_ID_LDO1,
  541. .ops = &lp872x_ldo_ops,
  542. .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
  543. .volt_table = lp872x_ldo_vtbl,
  544. .type = REGULATOR_VOLTAGE,
  545. .owner = THIS_MODULE,
  546. .vsel_reg = LP872X_LDO1_VOUT,
  547. .vsel_mask = LP872X_VOUT_M,
  548. .enable_reg = LP8725_LDO_CTRL,
  549. .enable_mask = LP872X_EN_LDO1_M,
  550. },
  551. {
  552. .name = "ldo2",
  553. .id = LP8725_ID_LDO2,
  554. .ops = &lp872x_ldo_ops,
  555. .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
  556. .volt_table = lp872x_ldo_vtbl,
  557. .type = REGULATOR_VOLTAGE,
  558. .owner = THIS_MODULE,
  559. .vsel_reg = LP872X_LDO2_VOUT,
  560. .vsel_mask = LP872X_VOUT_M,
  561. .enable_reg = LP8725_LDO_CTRL,
  562. .enable_mask = LP872X_EN_LDO2_M,
  563. },
  564. {
  565. .name = "ldo3",
  566. .id = LP8725_ID_LDO3,
  567. .ops = &lp872x_ldo_ops,
  568. .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
  569. .volt_table = lp872x_ldo_vtbl,
  570. .type = REGULATOR_VOLTAGE,
  571. .owner = THIS_MODULE,
  572. .vsel_reg = LP872X_LDO3_VOUT,
  573. .vsel_mask = LP872X_VOUT_M,
  574. .enable_reg = LP8725_LDO_CTRL,
  575. .enable_mask = LP872X_EN_LDO3_M,
  576. },
  577. {
  578. .name = "ldo4",
  579. .id = LP8725_ID_LDO4,
  580. .ops = &lp872x_ldo_ops,
  581. .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
  582. .volt_table = lp872x_ldo_vtbl,
  583. .type = REGULATOR_VOLTAGE,
  584. .owner = THIS_MODULE,
  585. .vsel_reg = LP872X_LDO4_VOUT,
  586. .vsel_mask = LP872X_VOUT_M,
  587. .enable_reg = LP8725_LDO_CTRL,
  588. .enable_mask = LP872X_EN_LDO4_M,
  589. },
  590. {
  591. .name = "ldo5",
  592. .id = LP8725_ID_LDO5,
  593. .ops = &lp872x_ldo_ops,
  594. .n_voltages = ARRAY_SIZE(lp872x_ldo_vtbl),
  595. .volt_table = lp872x_ldo_vtbl,
  596. .type = REGULATOR_VOLTAGE,
  597. .owner = THIS_MODULE,
  598. .vsel_reg = LP872X_LDO5_VOUT,
  599. .vsel_mask = LP872X_VOUT_M,
  600. .enable_reg = LP8725_LDO_CTRL,
  601. .enable_mask = LP872X_EN_LDO5_M,
  602. },
  603. {
  604. .name = "lilo1",
  605. .id = LP8725_ID_LILO1,
  606. .ops = &lp872x_ldo_ops,
  607. .n_voltages = ARRAY_SIZE(lp8725_lilo_vtbl),
  608. .volt_table = lp8725_lilo_vtbl,
  609. .type = REGULATOR_VOLTAGE,
  610. .owner = THIS_MODULE,
  611. .vsel_reg = LP8725_LILO1_VOUT,
  612. .vsel_mask = LP872X_VOUT_M,
  613. .enable_reg = LP8725_LDO_CTRL,
  614. .enable_mask = LP8725_EN_LILO1_M,
  615. },
  616. {
  617. .name = "lilo2",
  618. .id = LP8725_ID_LILO2,
  619. .ops = &lp872x_ldo_ops,
  620. .n_voltages = ARRAY_SIZE(lp8725_lilo_vtbl),
  621. .volt_table = lp8725_lilo_vtbl,
  622. .type = REGULATOR_VOLTAGE,
  623. .owner = THIS_MODULE,
  624. .vsel_reg = LP8725_LILO2_VOUT,
  625. .vsel_mask = LP872X_VOUT_M,
  626. .enable_reg = LP8725_LDO_CTRL,
  627. .enable_mask = LP8725_EN_LILO2_M,
  628. },
  629. {
  630. .name = "buck1",
  631. .id = LP8725_ID_BUCK1,
  632. .ops = &lp8725_buck_ops,
  633. .n_voltages = ARRAY_SIZE(lp8725_buck_vtbl),
  634. .volt_table = lp8725_buck_vtbl,
  635. .type = REGULATOR_VOLTAGE,
  636. .owner = THIS_MODULE,
  637. .enable_reg = LP872X_GENERAL_CFG,
  638. .enable_mask = LP8725_BUCK1_EN_M,
  639. },
  640. {
  641. .name = "buck2",
  642. .id = LP8725_ID_BUCK2,
  643. .ops = &lp8725_buck_ops,
  644. .n_voltages = ARRAY_SIZE(lp8725_buck_vtbl),
  645. .volt_table = lp8725_buck_vtbl,
  646. .type = REGULATOR_VOLTAGE,
  647. .owner = THIS_MODULE,
  648. .enable_reg = LP872X_GENERAL_CFG,
  649. .enable_mask = LP8725_BUCK2_EN_M,
  650. },
  651. };
  652. static int lp872x_check_dvs_validity(struct lp872x *lp)
  653. {
  654. struct lp872x_dvs *dvs = lp->pdata->dvs;
  655. u8 val = 0;
  656. int ret;
  657. ret = lp872x_read_byte(lp, LP872X_GENERAL_CFG, &val);
  658. if (ret)
  659. return ret;
  660. ret = 0;
  661. if (lp->chipid == LP8720) {
  662. if (val & LP8720_EXT_DVS_M)
  663. ret = dvs ? 0 : -EINVAL;
  664. } else {
  665. if ((val & LP8725_DVS1_M) == EXTERN_DVS_USED)
  666. ret = dvs ? 0 : -EINVAL;
  667. }
  668. return ret;
  669. }
  670. static int lp872x_init_dvs(struct lp872x *lp)
  671. {
  672. int ret, gpio;
  673. struct lp872x_dvs *dvs = lp->pdata->dvs;
  674. enum lp872x_dvs_state pinstate;
  675. ret = lp872x_check_dvs_validity(lp);
  676. if (ret) {
  677. dev_warn(lp->dev, "invalid dvs data: %d\n", ret);
  678. return ret;
  679. }
  680. gpio = dvs->gpio;
  681. if (!gpio_is_valid(gpio)) {
  682. dev_err(lp->dev, "invalid gpio: %d\n", gpio);
  683. return -EINVAL;
  684. }
  685. pinstate = dvs->init_state;
  686. ret = devm_gpio_request_one(lp->dev, gpio, pinstate, "LP872X DVS");
  687. if (ret) {
  688. dev_err(lp->dev, "gpio request err: %d\n", ret);
  689. return ret;
  690. }
  691. lp->dvs_pin = pinstate;
  692. lp->dvs_gpio = gpio;
  693. return 0;
  694. }
  695. static int lp872x_config(struct lp872x *lp)
  696. {
  697. struct lp872x_platform_data *pdata = lp->pdata;
  698. int ret;
  699. if (!pdata->update_config)
  700. return 0;
  701. ret = lp872x_write_byte(lp, LP872X_GENERAL_CFG, pdata->general_config);
  702. if (ret)
  703. return ret;
  704. return lp872x_init_dvs(lp);
  705. }
  706. static struct regulator_init_data
  707. *lp872x_find_regulator_init_data(int id, struct lp872x *lp)
  708. {
  709. int i;
  710. for (i = 0; i < lp->num_regulators; i++) {
  711. if (lp->pdata->regulator_data[i].id == id)
  712. return lp->pdata->regulator_data[i].init_data;
  713. }
  714. return NULL;
  715. }
  716. static int lp872x_regulator_register(struct lp872x *lp)
  717. {
  718. struct regulator_desc *desc;
  719. struct regulator_config cfg = { };
  720. struct regulator_dev *rdev;
  721. int i, ret;
  722. for (i = 0 ; i < lp->num_regulators ; i++) {
  723. desc = (lp->chipid == LP8720) ? &lp8720_regulator_desc[i] :
  724. &lp8725_regulator_desc[i];
  725. cfg.dev = lp->dev;
  726. cfg.init_data = lp872x_find_regulator_init_data(desc->id, lp);
  727. cfg.driver_data = lp;
  728. cfg.regmap = lp->regmap;
  729. rdev = regulator_register(desc, &cfg);
  730. if (IS_ERR(rdev)) {
  731. dev_err(lp->dev, "regulator register err");
  732. ret = PTR_ERR(rdev);
  733. goto err;
  734. }
  735. *(lp->regulators + i) = rdev;
  736. }
  737. return 0;
  738. err:
  739. while (--i >= 0) {
  740. rdev = *(lp->regulators + i);
  741. regulator_unregister(rdev);
  742. }
  743. return ret;
  744. }
  745. static void lp872x_regulator_unregister(struct lp872x *lp)
  746. {
  747. struct regulator_dev *rdev;
  748. int i;
  749. for (i = 0 ; i < lp->num_regulators ; i++) {
  750. rdev = *(lp->regulators + i);
  751. regulator_unregister(rdev);
  752. }
  753. }
  754. static const struct regmap_config lp872x_regmap_config = {
  755. .reg_bits = 8,
  756. .val_bits = 8,
  757. .max_register = MAX_REGISTERS,
  758. };
  759. static int lp872x_probe(struct i2c_client *cl, const struct i2c_device_id *id)
  760. {
  761. struct lp872x *lp;
  762. struct lp872x_platform_data *pdata = cl->dev.platform_data;
  763. int ret, size, num_regulators;
  764. const int lp872x_num_regulators[] = {
  765. [LP8720] = LP8720_NUM_REGULATORS,
  766. [LP8725] = LP8725_NUM_REGULATORS,
  767. };
  768. if (!pdata) {
  769. dev_err(&cl->dev, "no platform data\n");
  770. return -EINVAL;
  771. }
  772. lp = devm_kzalloc(&cl->dev, sizeof(struct lp872x), GFP_KERNEL);
  773. if (!lp)
  774. goto err_mem;
  775. num_regulators = lp872x_num_regulators[id->driver_data];
  776. size = sizeof(struct regulator_dev *) * num_regulators;
  777. lp->regulators = devm_kzalloc(&cl->dev, size, GFP_KERNEL);
  778. if (!lp->regulators)
  779. goto err_mem;
  780. lp->regmap = devm_regmap_init_i2c(cl, &lp872x_regmap_config);
  781. if (IS_ERR(lp->regmap)) {
  782. ret = PTR_ERR(lp->regmap);
  783. dev_err(&cl->dev, "regmap init i2c err: %d\n", ret);
  784. goto err_dev;
  785. }
  786. lp->dev = &cl->dev;
  787. lp->pdata = pdata;
  788. lp->chipid = id->driver_data;
  789. lp->num_regulators = num_regulators;
  790. i2c_set_clientdata(cl, lp);
  791. ret = lp872x_config(lp);
  792. if (ret)
  793. goto err_dev;
  794. return lp872x_regulator_register(lp);
  795. err_mem:
  796. return -ENOMEM;
  797. err_dev:
  798. return ret;
  799. }
  800. static int __devexit lp872x_remove(struct i2c_client *cl)
  801. {
  802. struct lp872x *lp = i2c_get_clientdata(cl);
  803. lp872x_regulator_unregister(lp);
  804. return 0;
  805. }
  806. static const struct i2c_device_id lp872x_ids[] = {
  807. {"lp8720", LP8720},
  808. {"lp8725", LP8725},
  809. { }
  810. };
  811. MODULE_DEVICE_TABLE(i2c, lp872x_ids);
  812. static struct i2c_driver lp872x_driver = {
  813. .driver = {
  814. .name = "lp872x",
  815. .owner = THIS_MODULE,
  816. },
  817. .probe = lp872x_probe,
  818. .remove = __devexit_p(lp872x_remove),
  819. .id_table = lp872x_ids,
  820. };
  821. module_i2c_driver(lp872x_driver);
  822. MODULE_DESCRIPTION("TI/National Semiconductor LP872x PMU Regulator Driver");
  823. MODULE_AUTHOR("Milo Kim");
  824. MODULE_LICENSE("GPL");