lp872x.c 22 KB

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