lp872x.c 25 KB

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