lp8788-ldo.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  1. /*
  2. * TI LP8788 MFD - ldo regulator driver
  3. *
  4. * Copyright 2012 Texas Instruments
  5. *
  6. * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. *
  12. */
  13. #include <linux/module.h>
  14. #include <linux/slab.h>
  15. #include <linux/err.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/regulator/driver.h>
  18. #include <linux/gpio.h>
  19. #include <linux/mfd/lp8788.h>
  20. /* register address */
  21. #define LP8788_EN_LDO_A 0x0D /* DLDO 1 ~ 8 */
  22. #define LP8788_EN_LDO_B 0x0E /* DLDO 9 ~ 12, ALDO 1 ~ 4 */
  23. #define LP8788_EN_LDO_C 0x0F /* ALDO 5 ~ 10 */
  24. #define LP8788_EN_SEL 0x10
  25. #define LP8788_DLDO1_VOUT 0x2E
  26. #define LP8788_DLDO2_VOUT 0x2F
  27. #define LP8788_DLDO3_VOUT 0x30
  28. #define LP8788_DLDO4_VOUT 0x31
  29. #define LP8788_DLDO5_VOUT 0x32
  30. #define LP8788_DLDO6_VOUT 0x33
  31. #define LP8788_DLDO7_VOUT 0x34
  32. #define LP8788_DLDO8_VOUT 0x35
  33. #define LP8788_DLDO9_VOUT 0x36
  34. #define LP8788_DLDO10_VOUT 0x37
  35. #define LP8788_DLDO11_VOUT 0x38
  36. #define LP8788_DLDO12_VOUT 0x39
  37. #define LP8788_ALDO1_VOUT 0x3A
  38. #define LP8788_ALDO2_VOUT 0x3B
  39. #define LP8788_ALDO3_VOUT 0x3C
  40. #define LP8788_ALDO4_VOUT 0x3D
  41. #define LP8788_ALDO5_VOUT 0x3E
  42. #define LP8788_ALDO6_VOUT 0x3F
  43. #define LP8788_ALDO7_VOUT 0x40
  44. #define LP8788_ALDO8_VOUT 0x41
  45. #define LP8788_ALDO9_VOUT 0x42
  46. #define LP8788_ALDO10_VOUT 0x43
  47. #define LP8788_DLDO1_TIMESTEP 0x44
  48. /* mask/shift bits */
  49. #define LP8788_EN_DLDO1_M BIT(0) /* Addr 0Dh ~ 0Fh */
  50. #define LP8788_EN_DLDO2_M BIT(1)
  51. #define LP8788_EN_DLDO3_M BIT(2)
  52. #define LP8788_EN_DLDO4_M BIT(3)
  53. #define LP8788_EN_DLDO5_M BIT(4)
  54. #define LP8788_EN_DLDO6_M BIT(5)
  55. #define LP8788_EN_DLDO7_M BIT(6)
  56. #define LP8788_EN_DLDO8_M BIT(7)
  57. #define LP8788_EN_DLDO9_M BIT(0)
  58. #define LP8788_EN_DLDO10_M BIT(1)
  59. #define LP8788_EN_DLDO11_M BIT(2)
  60. #define LP8788_EN_DLDO12_M BIT(3)
  61. #define LP8788_EN_ALDO1_M BIT(4)
  62. #define LP8788_EN_ALDO2_M BIT(5)
  63. #define LP8788_EN_ALDO3_M BIT(6)
  64. #define LP8788_EN_ALDO4_M BIT(7)
  65. #define LP8788_EN_ALDO5_M BIT(0)
  66. #define LP8788_EN_ALDO6_M BIT(1)
  67. #define LP8788_EN_ALDO7_M BIT(2)
  68. #define LP8788_EN_ALDO8_M BIT(3)
  69. #define LP8788_EN_ALDO9_M BIT(4)
  70. #define LP8788_EN_ALDO10_M BIT(5)
  71. #define LP8788_EN_SEL_DLDO911_M BIT(0) /* Addr 10h */
  72. #define LP8788_EN_SEL_DLDO7_M BIT(1)
  73. #define LP8788_EN_SEL_ALDO7_M BIT(2)
  74. #define LP8788_EN_SEL_ALDO5_M BIT(3)
  75. #define LP8788_EN_SEL_ALDO234_M BIT(4)
  76. #define LP8788_EN_SEL_ALDO1_M BIT(5)
  77. #define LP8788_VOUT_5BIT_M 0x1F /* Addr 2Eh ~ 43h */
  78. #define LP8788_VOUT_4BIT_M 0x0F
  79. #define LP8788_VOUT_3BIT_M 0x07
  80. #define LP8788_VOUT_1BIT_M 0x01
  81. #define LP8788_STARTUP_TIME_M 0xF8 /* Addr 44h ~ 59h */
  82. #define LP8788_STARTUP_TIME_S 3
  83. #define ENABLE_TIME_USEC 32
  84. #define ENABLE GPIOF_OUT_INIT_HIGH
  85. #define DISABLE GPIOF_OUT_INIT_LOW
  86. enum lp8788_ldo_id {
  87. DLDO1,
  88. DLDO2,
  89. DLDO3,
  90. DLDO4,
  91. DLDO5,
  92. DLDO6,
  93. DLDO7,
  94. DLDO8,
  95. DLDO9,
  96. DLDO10,
  97. DLDO11,
  98. DLDO12,
  99. ALDO1,
  100. ALDO2,
  101. ALDO3,
  102. ALDO4,
  103. ALDO5,
  104. ALDO6,
  105. ALDO7,
  106. ALDO8,
  107. ALDO9,
  108. ALDO10,
  109. };
  110. struct lp8788_ldo {
  111. struct lp8788 *lp;
  112. struct regulator_desc *desc;
  113. struct regulator_dev *regulator;
  114. struct lp8788_ldo_enable_pin *en_pin;
  115. };
  116. /* DLDO 1, 2, 3, 9 voltage table */
  117. static const int lp8788_dldo1239_vtbl[] = {
  118. 1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
  119. 2600000, 2700000, 2800000, 2900000, 3000000, 2850000, 2850000, 2850000,
  120. 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000,
  121. 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000,
  122. };
  123. /* DLDO 4 voltage table */
  124. static const int lp8788_dldo4_vtbl[] = { 1800000, 3000000 };
  125. /* DLDO 5, 7, 8 and ALDO 6 voltage table */
  126. static const int lp8788_dldo578_aldo6_vtbl[] = {
  127. 1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
  128. 2600000, 2700000, 2800000, 2900000, 3000000, 3000000, 3000000, 3000000,
  129. };
  130. /* DLDO 6 voltage table */
  131. static const int lp8788_dldo6_vtbl[] = {
  132. 3000000, 3100000, 3200000, 3300000, 3400000, 3500000, 3600000, 3600000,
  133. };
  134. /* DLDO 10, 11 voltage table */
  135. static const int lp8788_dldo1011_vtbl[] = {
  136. 1100000, 1150000, 1200000, 1250000, 1300000, 1350000, 1400000, 1450000,
  137. 1500000, 1500000, 1500000, 1500000, 1500000, 1500000, 1500000, 1500000,
  138. };
  139. /* ALDO 1 voltage table */
  140. static const int lp8788_aldo1_vtbl[] = { 1800000, 2850000 };
  141. /* ALDO 7 voltage table */
  142. static const int lp8788_aldo7_vtbl[] = {
  143. 1200000, 1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1800000,
  144. };
  145. static enum lp8788_ldo_id lp8788_dldo_id[] = {
  146. DLDO1,
  147. DLDO2,
  148. DLDO3,
  149. DLDO4,
  150. DLDO5,
  151. DLDO6,
  152. DLDO7,
  153. DLDO8,
  154. DLDO9,
  155. DLDO10,
  156. DLDO11,
  157. DLDO12,
  158. };
  159. static enum lp8788_ldo_id lp8788_aldo_id[] = {
  160. ALDO1,
  161. ALDO2,
  162. ALDO3,
  163. ALDO4,
  164. ALDO5,
  165. ALDO6,
  166. ALDO7,
  167. ALDO8,
  168. ALDO9,
  169. ALDO10,
  170. };
  171. static int lp8788_ldo_enable(struct regulator_dev *rdev)
  172. {
  173. struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
  174. if (ldo->en_pin) {
  175. gpio_set_value(ldo->en_pin->gpio, ENABLE);
  176. return 0;
  177. } else {
  178. return regulator_enable_regmap(rdev);
  179. }
  180. }
  181. static int lp8788_ldo_disable(struct regulator_dev *rdev)
  182. {
  183. struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
  184. if (ldo->en_pin) {
  185. gpio_set_value(ldo->en_pin->gpio, DISABLE);
  186. return 0;
  187. } else {
  188. return regulator_disable_regmap(rdev);
  189. }
  190. }
  191. static int lp8788_ldo_is_enabled(struct regulator_dev *rdev)
  192. {
  193. struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
  194. if (ldo->en_pin)
  195. return gpio_get_value(ldo->en_pin->gpio) ? 1 : 0;
  196. else
  197. return regulator_is_enabled_regmap(rdev);
  198. }
  199. static int lp8788_ldo_enable_time(struct regulator_dev *rdev)
  200. {
  201. struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
  202. enum lp8788_ldo_id id = rdev_get_id(rdev);
  203. u8 val, addr = LP8788_DLDO1_TIMESTEP + id;
  204. if (lp8788_read_byte(ldo->lp, addr, &val))
  205. return -EINVAL;
  206. val = (val & LP8788_STARTUP_TIME_M) >> LP8788_STARTUP_TIME_S;
  207. return ENABLE_TIME_USEC * val;
  208. }
  209. static int lp8788_ldo_fixed_get_voltage(struct regulator_dev *rdev)
  210. {
  211. enum lp8788_ldo_id id = rdev_get_id(rdev);
  212. switch (id) {
  213. case ALDO2 ... ALDO5:
  214. return 2850000;
  215. case DLDO12:
  216. case ALDO8 ... ALDO9:
  217. return 2500000;
  218. case ALDO10:
  219. return 1100000;
  220. default:
  221. return -EINVAL;
  222. }
  223. }
  224. static struct regulator_ops lp8788_ldo_voltage_table_ops = {
  225. .list_voltage = regulator_list_voltage_table,
  226. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  227. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  228. .enable = lp8788_ldo_enable,
  229. .disable = lp8788_ldo_disable,
  230. .is_enabled = lp8788_ldo_is_enabled,
  231. .enable_time = lp8788_ldo_enable_time,
  232. };
  233. static struct regulator_ops lp8788_ldo_voltage_fixed_ops = {
  234. .get_voltage = lp8788_ldo_fixed_get_voltage,
  235. .enable = lp8788_ldo_enable,
  236. .disable = lp8788_ldo_disable,
  237. .is_enabled = lp8788_ldo_is_enabled,
  238. .enable_time = lp8788_ldo_enable_time,
  239. };
  240. static struct regulator_desc lp8788_dldo_desc[] = {
  241. {
  242. .name = "dldo1",
  243. .id = DLDO1,
  244. .ops = &lp8788_ldo_voltage_table_ops,
  245. .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
  246. .volt_table = lp8788_dldo1239_vtbl,
  247. .type = REGULATOR_VOLTAGE,
  248. .owner = THIS_MODULE,
  249. .vsel_reg = LP8788_DLDO1_VOUT,
  250. .vsel_mask = LP8788_VOUT_5BIT_M,
  251. .enable_reg = LP8788_EN_LDO_A,
  252. .enable_mask = LP8788_EN_DLDO1_M,
  253. },
  254. {
  255. .name = "dldo2",
  256. .id = DLDO2,
  257. .ops = &lp8788_ldo_voltage_table_ops,
  258. .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
  259. .volt_table = lp8788_dldo1239_vtbl,
  260. .type = REGULATOR_VOLTAGE,
  261. .owner = THIS_MODULE,
  262. .vsel_reg = LP8788_DLDO2_VOUT,
  263. .vsel_mask = LP8788_VOUT_5BIT_M,
  264. .enable_reg = LP8788_EN_LDO_A,
  265. .enable_mask = LP8788_EN_DLDO2_M,
  266. },
  267. {
  268. .name = "dldo3",
  269. .id = DLDO3,
  270. .ops = &lp8788_ldo_voltage_table_ops,
  271. .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
  272. .volt_table = lp8788_dldo1239_vtbl,
  273. .type = REGULATOR_VOLTAGE,
  274. .owner = THIS_MODULE,
  275. .vsel_reg = LP8788_DLDO3_VOUT,
  276. .vsel_mask = LP8788_VOUT_5BIT_M,
  277. .enable_reg = LP8788_EN_LDO_A,
  278. .enable_mask = LP8788_EN_DLDO3_M,
  279. },
  280. {
  281. .name = "dldo4",
  282. .id = DLDO4,
  283. .ops = &lp8788_ldo_voltage_table_ops,
  284. .n_voltages = ARRAY_SIZE(lp8788_dldo4_vtbl),
  285. .volt_table = lp8788_dldo4_vtbl,
  286. .type = REGULATOR_VOLTAGE,
  287. .owner = THIS_MODULE,
  288. .vsel_reg = LP8788_DLDO4_VOUT,
  289. .vsel_mask = LP8788_VOUT_1BIT_M,
  290. .enable_reg = LP8788_EN_LDO_A,
  291. .enable_mask = LP8788_EN_DLDO4_M,
  292. },
  293. {
  294. .name = "dldo5",
  295. .id = DLDO5,
  296. .ops = &lp8788_ldo_voltage_table_ops,
  297. .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
  298. .volt_table = lp8788_dldo578_aldo6_vtbl,
  299. .type = REGULATOR_VOLTAGE,
  300. .owner = THIS_MODULE,
  301. .vsel_reg = LP8788_DLDO5_VOUT,
  302. .vsel_mask = LP8788_VOUT_4BIT_M,
  303. .enable_reg = LP8788_EN_LDO_A,
  304. .enable_mask = LP8788_EN_DLDO5_M,
  305. },
  306. {
  307. .name = "dldo6",
  308. .id = DLDO6,
  309. .ops = &lp8788_ldo_voltage_table_ops,
  310. .n_voltages = ARRAY_SIZE(lp8788_dldo6_vtbl),
  311. .volt_table = lp8788_dldo6_vtbl,
  312. .type = REGULATOR_VOLTAGE,
  313. .owner = THIS_MODULE,
  314. .vsel_reg = LP8788_DLDO6_VOUT,
  315. .vsel_mask = LP8788_VOUT_3BIT_M,
  316. .enable_reg = LP8788_EN_LDO_A,
  317. .enable_mask = LP8788_EN_DLDO6_M,
  318. },
  319. {
  320. .name = "dldo7",
  321. .id = DLDO7,
  322. .ops = &lp8788_ldo_voltage_table_ops,
  323. .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
  324. .volt_table = lp8788_dldo578_aldo6_vtbl,
  325. .type = REGULATOR_VOLTAGE,
  326. .owner = THIS_MODULE,
  327. .vsel_reg = LP8788_DLDO7_VOUT,
  328. .vsel_mask = LP8788_VOUT_4BIT_M,
  329. .enable_reg = LP8788_EN_LDO_A,
  330. .enable_mask = LP8788_EN_DLDO7_M,
  331. },
  332. {
  333. .name = "dldo8",
  334. .id = DLDO8,
  335. .ops = &lp8788_ldo_voltage_table_ops,
  336. .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
  337. .volt_table = lp8788_dldo578_aldo6_vtbl,
  338. .type = REGULATOR_VOLTAGE,
  339. .owner = THIS_MODULE,
  340. .vsel_reg = LP8788_DLDO8_VOUT,
  341. .vsel_mask = LP8788_VOUT_4BIT_M,
  342. .enable_reg = LP8788_EN_LDO_A,
  343. .enable_mask = LP8788_EN_DLDO8_M,
  344. },
  345. {
  346. .name = "dldo9",
  347. .id = DLDO9,
  348. .ops = &lp8788_ldo_voltage_table_ops,
  349. .n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
  350. .volt_table = lp8788_dldo1239_vtbl,
  351. .type = REGULATOR_VOLTAGE,
  352. .owner = THIS_MODULE,
  353. .vsel_reg = LP8788_DLDO9_VOUT,
  354. .vsel_mask = LP8788_VOUT_5BIT_M,
  355. .enable_reg = LP8788_EN_LDO_B,
  356. .enable_mask = LP8788_EN_DLDO9_M,
  357. },
  358. {
  359. .name = "dldo10",
  360. .id = DLDO10,
  361. .ops = &lp8788_ldo_voltage_table_ops,
  362. .n_voltages = ARRAY_SIZE(lp8788_dldo1011_vtbl),
  363. .volt_table = lp8788_dldo1011_vtbl,
  364. .type = REGULATOR_VOLTAGE,
  365. .owner = THIS_MODULE,
  366. .vsel_reg = LP8788_DLDO10_VOUT,
  367. .vsel_mask = LP8788_VOUT_4BIT_M,
  368. .enable_reg = LP8788_EN_LDO_B,
  369. .enable_mask = LP8788_EN_DLDO10_M,
  370. },
  371. {
  372. .name = "dldo11",
  373. .id = DLDO11,
  374. .ops = &lp8788_ldo_voltage_table_ops,
  375. .n_voltages = ARRAY_SIZE(lp8788_dldo1011_vtbl),
  376. .volt_table = lp8788_dldo1011_vtbl,
  377. .type = REGULATOR_VOLTAGE,
  378. .owner = THIS_MODULE,
  379. .vsel_reg = LP8788_DLDO11_VOUT,
  380. .vsel_mask = LP8788_VOUT_4BIT_M,
  381. .enable_reg = LP8788_EN_LDO_B,
  382. .enable_mask = LP8788_EN_DLDO11_M,
  383. },
  384. {
  385. .name = "dldo12",
  386. .id = DLDO12,
  387. .ops = &lp8788_ldo_voltage_fixed_ops,
  388. .n_voltages = 1,
  389. .type = REGULATOR_VOLTAGE,
  390. .owner = THIS_MODULE,
  391. .enable_reg = LP8788_EN_LDO_B,
  392. .enable_mask = LP8788_EN_DLDO12_M,
  393. },
  394. };
  395. static struct regulator_desc lp8788_aldo_desc[] = {
  396. {
  397. .name = "aldo1",
  398. .id = ALDO1,
  399. .ops = &lp8788_ldo_voltage_table_ops,
  400. .n_voltages = ARRAY_SIZE(lp8788_aldo1_vtbl),
  401. .volt_table = lp8788_aldo1_vtbl,
  402. .type = REGULATOR_VOLTAGE,
  403. .owner = THIS_MODULE,
  404. .vsel_reg = LP8788_ALDO1_VOUT,
  405. .vsel_mask = LP8788_VOUT_1BIT_M,
  406. .enable_reg = LP8788_EN_LDO_B,
  407. .enable_mask = LP8788_EN_ALDO1_M,
  408. },
  409. {
  410. .name = "aldo2",
  411. .id = ALDO2,
  412. .ops = &lp8788_ldo_voltage_fixed_ops,
  413. .n_voltages = 1,
  414. .type = REGULATOR_VOLTAGE,
  415. .owner = THIS_MODULE,
  416. .enable_reg = LP8788_EN_LDO_B,
  417. .enable_mask = LP8788_EN_ALDO2_M,
  418. },
  419. {
  420. .name = "aldo3",
  421. .id = ALDO3,
  422. .ops = &lp8788_ldo_voltage_fixed_ops,
  423. .n_voltages = 1,
  424. .type = REGULATOR_VOLTAGE,
  425. .owner = THIS_MODULE,
  426. .enable_reg = LP8788_EN_LDO_B,
  427. .enable_mask = LP8788_EN_ALDO3_M,
  428. },
  429. {
  430. .name = "aldo4",
  431. .id = ALDO4,
  432. .ops = &lp8788_ldo_voltage_fixed_ops,
  433. .n_voltages = 1,
  434. .type = REGULATOR_VOLTAGE,
  435. .owner = THIS_MODULE,
  436. .enable_reg = LP8788_EN_LDO_B,
  437. .enable_mask = LP8788_EN_ALDO4_M,
  438. },
  439. {
  440. .name = "aldo5",
  441. .id = ALDO5,
  442. .ops = &lp8788_ldo_voltage_fixed_ops,
  443. .n_voltages = 1,
  444. .type = REGULATOR_VOLTAGE,
  445. .owner = THIS_MODULE,
  446. .enable_reg = LP8788_EN_LDO_C,
  447. .enable_mask = LP8788_EN_ALDO5_M,
  448. },
  449. {
  450. .name = "aldo6",
  451. .id = ALDO6,
  452. .ops = &lp8788_ldo_voltage_table_ops,
  453. .n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
  454. .volt_table = lp8788_dldo578_aldo6_vtbl,
  455. .type = REGULATOR_VOLTAGE,
  456. .owner = THIS_MODULE,
  457. .vsel_reg = LP8788_ALDO6_VOUT,
  458. .vsel_mask = LP8788_VOUT_4BIT_M,
  459. .enable_reg = LP8788_EN_LDO_C,
  460. .enable_mask = LP8788_EN_ALDO6_M,
  461. },
  462. {
  463. .name = "aldo7",
  464. .id = ALDO7,
  465. .ops = &lp8788_ldo_voltage_table_ops,
  466. .n_voltages = ARRAY_SIZE(lp8788_aldo7_vtbl),
  467. .volt_table = lp8788_aldo7_vtbl,
  468. .type = REGULATOR_VOLTAGE,
  469. .owner = THIS_MODULE,
  470. .vsel_reg = LP8788_ALDO7_VOUT,
  471. .vsel_mask = LP8788_VOUT_3BIT_M,
  472. .enable_reg = LP8788_EN_LDO_C,
  473. .enable_mask = LP8788_EN_ALDO7_M,
  474. },
  475. {
  476. .name = "aldo8",
  477. .id = ALDO8,
  478. .ops = &lp8788_ldo_voltage_fixed_ops,
  479. .n_voltages = 1,
  480. .type = REGULATOR_VOLTAGE,
  481. .owner = THIS_MODULE,
  482. .enable_reg = LP8788_EN_LDO_C,
  483. .enable_mask = LP8788_EN_ALDO8_M,
  484. },
  485. {
  486. .name = "aldo9",
  487. .id = ALDO9,
  488. .ops = &lp8788_ldo_voltage_fixed_ops,
  489. .n_voltages = 1,
  490. .type = REGULATOR_VOLTAGE,
  491. .owner = THIS_MODULE,
  492. .enable_reg = LP8788_EN_LDO_C,
  493. .enable_mask = LP8788_EN_ALDO9_M,
  494. },
  495. {
  496. .name = "aldo10",
  497. .id = ALDO10,
  498. .ops = &lp8788_ldo_voltage_fixed_ops,
  499. .n_voltages = 1,
  500. .type = REGULATOR_VOLTAGE,
  501. .owner = THIS_MODULE,
  502. .enable_reg = LP8788_EN_LDO_C,
  503. .enable_mask = LP8788_EN_ALDO10_M,
  504. },
  505. };
  506. static int lp8788_gpio_request_ldo_en(struct platform_device *pdev,
  507. struct lp8788_ldo *ldo,
  508. enum lp8788_ext_ldo_en_id id)
  509. {
  510. struct device *dev = &pdev->dev;
  511. struct lp8788_ldo_enable_pin *pin = ldo->en_pin;
  512. int ret, gpio, pinstate;
  513. char *name[] = {
  514. [EN_ALDO1] = "LP8788_EN_ALDO1",
  515. [EN_ALDO234] = "LP8788_EN_ALDO234",
  516. [EN_ALDO5] = "LP8788_EN_ALDO5",
  517. [EN_ALDO7] = "LP8788_EN_ALDO7",
  518. [EN_DLDO7] = "LP8788_EN_DLDO7",
  519. [EN_DLDO911] = "LP8788_EN_DLDO911",
  520. };
  521. gpio = pin->gpio;
  522. if (!gpio_is_valid(gpio)) {
  523. dev_err(dev, "invalid gpio: %d\n", gpio);
  524. return -EINVAL;
  525. }
  526. pinstate = pin->init_state;
  527. ret = devm_gpio_request_one(dev, gpio, pinstate, name[id]);
  528. if (ret == -EBUSY) {
  529. dev_warn(dev, "gpio%d already used\n", gpio);
  530. return 0;
  531. }
  532. return ret;
  533. }
  534. static int lp8788_config_ldo_enable_mode(struct platform_device *pdev,
  535. struct lp8788_ldo *ldo,
  536. enum lp8788_ldo_id id)
  537. {
  538. int ret;
  539. struct lp8788 *lp = ldo->lp;
  540. struct lp8788_platform_data *pdata = lp->pdata;
  541. enum lp8788_ext_ldo_en_id enable_id;
  542. u8 en_mask[] = {
  543. [EN_ALDO1] = LP8788_EN_SEL_ALDO1_M,
  544. [EN_ALDO234] = LP8788_EN_SEL_ALDO234_M,
  545. [EN_ALDO5] = LP8788_EN_SEL_ALDO5_M,
  546. [EN_ALDO7] = LP8788_EN_SEL_ALDO7_M,
  547. [EN_DLDO7] = LP8788_EN_SEL_DLDO7_M,
  548. [EN_DLDO911] = LP8788_EN_SEL_DLDO911_M,
  549. };
  550. switch (id) {
  551. case DLDO7:
  552. enable_id = EN_DLDO7;
  553. break;
  554. case DLDO9:
  555. case DLDO11:
  556. enable_id = EN_DLDO911;
  557. break;
  558. case ALDO1:
  559. enable_id = EN_ALDO1;
  560. break;
  561. case ALDO2 ... ALDO4:
  562. enable_id = EN_ALDO234;
  563. break;
  564. case ALDO5:
  565. enable_id = EN_ALDO5;
  566. break;
  567. case ALDO7:
  568. enable_id = EN_ALDO7;
  569. break;
  570. default:
  571. return 0;
  572. }
  573. /* if no platform data for ldo pin, then set default enable mode */
  574. if (!pdata || !pdata->ldo_pin || !pdata->ldo_pin[enable_id])
  575. goto set_default_ldo_enable_mode;
  576. ldo->en_pin = pdata->ldo_pin[enable_id];
  577. ret = lp8788_gpio_request_ldo_en(pdev, ldo, enable_id);
  578. if (ret) {
  579. ldo->en_pin = NULL;
  580. goto set_default_ldo_enable_mode;
  581. }
  582. return ret;
  583. set_default_ldo_enable_mode:
  584. return lp8788_update_bits(lp, LP8788_EN_SEL, en_mask[enable_id], 0);
  585. }
  586. static int lp8788_dldo_probe(struct platform_device *pdev)
  587. {
  588. struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
  589. int id = pdev->id;
  590. struct lp8788_ldo *ldo;
  591. struct regulator_config cfg = { };
  592. struct regulator_dev *rdev;
  593. int ret;
  594. ldo = devm_kzalloc(&pdev->dev, sizeof(struct lp8788_ldo), GFP_KERNEL);
  595. if (!ldo)
  596. return -ENOMEM;
  597. ldo->lp = lp;
  598. ret = lp8788_config_ldo_enable_mode(pdev, ldo, lp8788_dldo_id[id]);
  599. if (ret)
  600. return ret;
  601. cfg.dev = pdev->dev.parent;
  602. cfg.init_data = lp->pdata ? lp->pdata->dldo_data[id] : NULL;
  603. cfg.driver_data = ldo;
  604. cfg.regmap = lp->regmap;
  605. rdev = regulator_register(&lp8788_dldo_desc[id], &cfg);
  606. if (IS_ERR(rdev)) {
  607. ret = PTR_ERR(rdev);
  608. dev_err(&pdev->dev, "DLDO%d regulator register err = %d\n",
  609. id + 1, ret);
  610. return ret;
  611. }
  612. ldo->regulator = rdev;
  613. platform_set_drvdata(pdev, ldo);
  614. return 0;
  615. }
  616. static int lp8788_dldo_remove(struct platform_device *pdev)
  617. {
  618. struct lp8788_ldo *ldo = platform_get_drvdata(pdev);
  619. platform_set_drvdata(pdev, NULL);
  620. regulator_unregister(ldo->regulator);
  621. return 0;
  622. }
  623. static struct platform_driver lp8788_dldo_driver = {
  624. .probe = lp8788_dldo_probe,
  625. .remove = lp8788_dldo_remove,
  626. .driver = {
  627. .name = LP8788_DEV_DLDO,
  628. .owner = THIS_MODULE,
  629. },
  630. };
  631. static int lp8788_aldo_probe(struct platform_device *pdev)
  632. {
  633. struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
  634. int id = pdev->id;
  635. struct lp8788_ldo *ldo;
  636. struct regulator_config cfg = { };
  637. struct regulator_dev *rdev;
  638. int ret;
  639. ldo = devm_kzalloc(&pdev->dev, sizeof(struct lp8788_ldo), GFP_KERNEL);
  640. if (!ldo)
  641. return -ENOMEM;
  642. ldo->lp = lp;
  643. ret = lp8788_config_ldo_enable_mode(pdev, ldo, lp8788_aldo_id[id]);
  644. if (ret)
  645. return ret;
  646. cfg.dev = pdev->dev.parent;
  647. cfg.init_data = lp->pdata ? lp->pdata->aldo_data[id] : NULL;
  648. cfg.driver_data = ldo;
  649. cfg.regmap = lp->regmap;
  650. rdev = regulator_register(&lp8788_aldo_desc[id], &cfg);
  651. if (IS_ERR(rdev)) {
  652. ret = PTR_ERR(rdev);
  653. dev_err(&pdev->dev, "ALDO%d regulator register err = %d\n",
  654. id + 1, ret);
  655. return ret;
  656. }
  657. ldo->regulator = rdev;
  658. platform_set_drvdata(pdev, ldo);
  659. return 0;
  660. }
  661. static int lp8788_aldo_remove(struct platform_device *pdev)
  662. {
  663. struct lp8788_ldo *ldo = platform_get_drvdata(pdev);
  664. platform_set_drvdata(pdev, NULL);
  665. regulator_unregister(ldo->regulator);
  666. return 0;
  667. }
  668. static struct platform_driver lp8788_aldo_driver = {
  669. .probe = lp8788_aldo_probe,
  670. .remove = lp8788_aldo_remove,
  671. .driver = {
  672. .name = LP8788_DEV_ALDO,
  673. .owner = THIS_MODULE,
  674. },
  675. };
  676. static int __init lp8788_ldo_init(void)
  677. {
  678. int ret;
  679. ret = platform_driver_register(&lp8788_dldo_driver);
  680. if (ret)
  681. return ret;
  682. return platform_driver_register(&lp8788_aldo_driver);
  683. }
  684. subsys_initcall(lp8788_ldo_init);
  685. static void __exit lp8788_ldo_exit(void)
  686. {
  687. platform_driver_unregister(&lp8788_aldo_driver);
  688. platform_driver_unregister(&lp8788_dldo_driver);
  689. }
  690. module_exit(lp8788_ldo_exit);
  691. MODULE_DESCRIPTION("TI LP8788 LDO Driver");
  692. MODULE_AUTHOR("Milo Kim");
  693. MODULE_LICENSE("GPL");
  694. MODULE_ALIAS("platform:lp8788-dldo");
  695. MODULE_ALIAS("platform:lp8788-aldo");