bd718x7-regulator.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (C) 2018 ROHM Semiconductors
  3. // bd71837-regulator.c ROHM BD71837MWV/BD71847MWV regulator driver
  4. #include <linux/delay.h>
  5. #include <linux/err.h>
  6. #include <linux/gpio.h>
  7. #include <linux/interrupt.h>
  8. #include <linux/kernel.h>
  9. #include <linux/mfd/rohm-bd718x7.h>
  10. #include <linux/module.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/regulator/driver.h>
  13. #include <linux/regulator/machine.h>
  14. #include <linux/regulator/of_regulator.h>
  15. #include <linux/slab.h>
  16. /*
  17. * BUCK1/2/3/4
  18. * BUCK1RAMPRATE[1:0] BUCK1 DVS ramp rate setting
  19. * 00: 10.00mV/usec 10mV 1uS
  20. * 01: 5.00mV/usec 10mV 2uS
  21. * 10: 2.50mV/usec 10mV 4uS
  22. * 11: 1.25mV/usec 10mV 8uS
  23. */
  24. static int bd718xx_buck1234_set_ramp_delay(struct regulator_dev *rdev,
  25. int ramp_delay)
  26. {
  27. int id = rdev->desc->id;
  28. unsigned int ramp_value = BUCK_RAMPRATE_10P00MV;
  29. dev_dbg(&rdev->dev, "Buck[%d] Set Ramp = %d\n", id + 1,
  30. ramp_delay);
  31. switch (ramp_delay) {
  32. case 1 ... 1250:
  33. ramp_value = BUCK_RAMPRATE_1P25MV;
  34. break;
  35. case 1251 ... 2500:
  36. ramp_value = BUCK_RAMPRATE_2P50MV;
  37. break;
  38. case 2501 ... 5000:
  39. ramp_value = BUCK_RAMPRATE_5P00MV;
  40. break;
  41. case 5001 ... 10000:
  42. ramp_value = BUCK_RAMPRATE_10P00MV;
  43. break;
  44. default:
  45. ramp_value = BUCK_RAMPRATE_10P00MV;
  46. dev_err(&rdev->dev,
  47. "%s: ramp_delay: %d not supported, setting 10000mV//us\n",
  48. rdev->desc->name, ramp_delay);
  49. }
  50. return regmap_update_bits(rdev->regmap, BD718XX_REG_BUCK1_CTRL + id,
  51. BUCK_RAMPRATE_MASK, ramp_value << 6);
  52. }
  53. /* Bucks 1 to 4 support DVS. PWM mode is used when voltage is changed.
  54. * Bucks 5 to 8 and LDOs can use PFM and must be disabled when voltage
  55. * is changed. Hence we return -EBUSY for these if voltage is changed
  56. * when BUCK/LDO is enabled.
  57. */
  58. static int bd718xx_set_voltage_sel_restricted(struct regulator_dev *rdev,
  59. unsigned int sel)
  60. {
  61. if (regulator_is_enabled_regmap(rdev))
  62. return -EBUSY;
  63. return regulator_set_voltage_sel_regmap(rdev, sel);
  64. }
  65. static int bd718xx_set_voltage_sel_pickable_restricted(
  66. struct regulator_dev *rdev, unsigned int sel)
  67. {
  68. if (regulator_is_enabled_regmap(rdev))
  69. return -EBUSY;
  70. return regulator_set_voltage_sel_pickable_regmap(rdev, sel);
  71. }
  72. static struct regulator_ops bd718xx_pickable_range_ldo_ops = {
  73. .enable = regulator_enable_regmap,
  74. .disable = regulator_disable_regmap,
  75. .is_enabled = regulator_is_enabled_regmap,
  76. .list_voltage = regulator_list_voltage_pickable_linear_range,
  77. .set_voltage_sel = bd718xx_set_voltage_sel_pickable_restricted,
  78. .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
  79. };
  80. static struct regulator_ops bd718xx_pickable_range_buck_ops = {
  81. .enable = regulator_enable_regmap,
  82. .disable = regulator_disable_regmap,
  83. .is_enabled = regulator_is_enabled_regmap,
  84. .list_voltage = regulator_list_voltage_pickable_linear_range,
  85. .set_voltage_sel = bd718xx_set_voltage_sel_pickable_restricted,
  86. .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
  87. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  88. };
  89. static struct regulator_ops bd718xx_ldo_regulator_ops = {
  90. .enable = regulator_enable_regmap,
  91. .disable = regulator_disable_regmap,
  92. .is_enabled = regulator_is_enabled_regmap,
  93. .list_voltage = regulator_list_voltage_linear_range,
  94. .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
  95. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  96. };
  97. static struct regulator_ops bd718xx_ldo_regulator_nolinear_ops = {
  98. .enable = regulator_enable_regmap,
  99. .disable = regulator_disable_regmap,
  100. .is_enabled = regulator_is_enabled_regmap,
  101. .list_voltage = regulator_list_voltage_table,
  102. .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
  103. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  104. };
  105. static struct regulator_ops bd718xx_buck_regulator_ops = {
  106. .enable = regulator_enable_regmap,
  107. .disable = regulator_disable_regmap,
  108. .is_enabled = regulator_is_enabled_regmap,
  109. .list_voltage = regulator_list_voltage_linear_range,
  110. .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
  111. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  112. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  113. };
  114. static struct regulator_ops bd718xx_buck_regulator_nolinear_ops = {
  115. .enable = regulator_enable_regmap,
  116. .disable = regulator_disable_regmap,
  117. .is_enabled = regulator_is_enabled_regmap,
  118. .list_voltage = regulator_list_voltage_table,
  119. .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
  120. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  121. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  122. };
  123. static struct regulator_ops bd718xx_dvs_buck_regulator_ops = {
  124. .enable = regulator_enable_regmap,
  125. .disable = regulator_disable_regmap,
  126. .is_enabled = regulator_is_enabled_regmap,
  127. .list_voltage = regulator_list_voltage_linear_range,
  128. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  129. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  130. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  131. .set_ramp_delay = bd718xx_buck1234_set_ramp_delay,
  132. };
  133. /*
  134. * BD71837 BUCK1/2/3/4
  135. * BD71847 BUCK1/2
  136. * 0.70 to 1.30V (10mV step)
  137. */
  138. static const struct regulator_linear_range bd718xx_dvs_buck_volts[] = {
  139. REGULATOR_LINEAR_RANGE(700000, 0x00, 0x3C, 10000),
  140. REGULATOR_LINEAR_RANGE(1300000, 0x3D, 0x3F, 0),
  141. };
  142. /*
  143. * BD71837 BUCK5
  144. * 0.7V to 1.35V (range 0)
  145. * and
  146. * 0.675 to 1.325 (range 1)
  147. */
  148. static const struct regulator_linear_range bd71837_buck5_volts[] = {
  149. /* Ranges when VOLT_SEL bit is 0 */
  150. REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000),
  151. REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000),
  152. REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000),
  153. /* Ranges when VOLT_SEL bit is 1 */
  154. REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000),
  155. REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000),
  156. REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000),
  157. };
  158. /*
  159. * Range selector for first 3 linear ranges is 0x0
  160. * and 0x1 for last 3 ranges.
  161. */
  162. static const unsigned int bd71837_buck5_volt_range_sel[] = {
  163. 0x0, 0x0, 0x0, 0x80, 0x80, 0x80
  164. };
  165. /*
  166. * BD71847 BUCK3
  167. */
  168. static const struct regulator_linear_range bd71847_buck3_volts[] = {
  169. /* Ranges when VOLT_SEL bits are 00 */
  170. REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000),
  171. REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000),
  172. REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000),
  173. /* Ranges when VOLT_SEL bits are 01 */
  174. REGULATOR_LINEAR_RANGE(550000, 0x0, 0x7, 50000),
  175. /* Ranges when VOLT_SEL bits are 11 */
  176. REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000),
  177. REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000),
  178. REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000),
  179. };
  180. static const unsigned int bd71847_buck3_volt_range_sel[] = {
  181. 0x0, 0x0, 0x0, 0x40, 0x80, 0x80, 0x80
  182. };
  183. static const struct regulator_linear_range bd71847_buck4_volts[] = {
  184. REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
  185. REGULATOR_LINEAR_RANGE(2600000, 0x00, 0x03, 100000),
  186. };
  187. static const unsigned int bd71847_buck4_volt_range_sel[] = { 0x0, 0x40 };
  188. /*
  189. * BUCK6
  190. * 3.0V to 3.3V (step 100mV)
  191. */
  192. static const struct regulator_linear_range bd71837_buck6_volts[] = {
  193. REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
  194. };
  195. /*
  196. * BD71837 BUCK7
  197. * BD71847 BUCK5
  198. * 000 = 1.605V
  199. * 001 = 1.695V
  200. * 010 = 1.755V
  201. * 011 = 1.8V (Initial)
  202. * 100 = 1.845V
  203. * 101 = 1.905V
  204. * 110 = 1.95V
  205. * 111 = 1.995V
  206. */
  207. static const unsigned int bd718xx_3rd_nodvs_buck_volts[] = {
  208. 1605000, 1695000, 1755000, 1800000, 1845000, 1905000, 1950000, 1995000
  209. };
  210. /*
  211. * BUCK8
  212. * 0.8V to 1.40V (step 10mV)
  213. */
  214. static const struct regulator_linear_range bd718xx_4th_nodvs_buck_volts[] = {
  215. REGULATOR_LINEAR_RANGE(800000, 0x00, 0x3C, 10000),
  216. };
  217. /*
  218. * LDO1
  219. * 3.0 to 3.3V (100mV step)
  220. */
  221. static const struct regulator_linear_range bd718xx_ldo1_volts[] = {
  222. REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
  223. REGULATOR_LINEAR_RANGE(1600000, 0x00, 0x03, 100000),
  224. };
  225. static const unsigned int bd718xx_ldo1_volt_range_sel[] = { 0x0, 0x20 };
  226. /*
  227. * LDO2
  228. * 0.8 or 0.9V
  229. */
  230. static const unsigned int ldo_2_volts[] = {
  231. 900000, 800000
  232. };
  233. /*
  234. * LDO3
  235. * 1.8 to 3.3V (100mV step)
  236. */
  237. static const struct regulator_linear_range bd718xx_ldo3_volts[] = {
  238. REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
  239. };
  240. /*
  241. * LDO4
  242. * 0.9 to 1.8V (100mV step)
  243. */
  244. static const struct regulator_linear_range bd718xx_ldo4_volts[] = {
  245. REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000),
  246. };
  247. /*
  248. * LDO5 for BD71837
  249. * 1.8 to 3.3V (100mV step)
  250. */
  251. static const struct regulator_linear_range bd71837_ldo5_volts[] = {
  252. REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
  253. };
  254. /*
  255. * LDO5 for BD71837
  256. * 1.8 to 3.3V (100mV step)
  257. */
  258. static const struct regulator_linear_range bd71847_ldo5_volts[] = {
  259. REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
  260. REGULATOR_LINEAR_RANGE(800000, 0x00, 0x0F, 100000),
  261. };
  262. static const unsigned int bd71847_ldo5_volt_range_sel[] = { 0x0, 0x20 };
  263. /*
  264. * LDO6
  265. * 0.9 to 1.8V (100mV step)
  266. */
  267. static const struct regulator_linear_range bd718xx_ldo6_volts[] = {
  268. REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000),
  269. };
  270. /*
  271. * LDO7
  272. * 1.8 to 3.3V (100mV step)
  273. */
  274. static const struct regulator_linear_range bd71837_ldo7_volts[] = {
  275. REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
  276. };
  277. struct reg_init {
  278. unsigned int reg;
  279. unsigned int mask;
  280. unsigned int val;
  281. };
  282. struct bd718xx_regulator_data {
  283. struct regulator_desc desc;
  284. const struct reg_init init;
  285. const struct reg_init *additional_inits;
  286. int additional_init_amnt;
  287. };
  288. /*
  289. * There is a HW quirk in BD71837. The shutdown sequence timings for
  290. * bucks/LDOs which are controlled via register interface are changed.
  291. * At PMIC poweroff the voltage for BUCK6/7 is cut immediately at the
  292. * beginning of shut-down sequence. As bucks 6 and 7 are parent
  293. * supplies for LDO5 and LDO6 - this causes LDO5/6 voltage
  294. * monitoring to errorneously detect under voltage and force PMIC to
  295. * emergency state instead of poweroff. In order to avoid this we
  296. * disable voltage monitoring for LDO5 and LDO6
  297. */
  298. static const struct reg_init bd71837_ldo5_inits[] = {
  299. {
  300. .reg = BD718XX_REG_MVRFLTMASK2,
  301. .mask = BD718XX_LDO5_VRMON80,
  302. .val = BD718XX_LDO5_VRMON80,
  303. },
  304. };
  305. static const struct reg_init bd71837_ldo6_inits[] = {
  306. {
  307. .reg = BD718XX_REG_MVRFLTMASK2,
  308. .mask = BD718XX_LDO6_VRMON80,
  309. .val = BD718XX_LDO6_VRMON80,
  310. },
  311. };
  312. static const struct bd718xx_regulator_data bd71847_regulators[] = {
  313. {
  314. .desc = {
  315. .name = "buck1",
  316. .of_match = of_match_ptr("BUCK1"),
  317. .regulators_node = of_match_ptr("regulators"),
  318. .id = BD718XX_BUCK1,
  319. .ops = &bd718xx_dvs_buck_regulator_ops,
  320. .type = REGULATOR_VOLTAGE,
  321. .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
  322. .linear_ranges = bd718xx_dvs_buck_volts,
  323. .n_linear_ranges =
  324. ARRAY_SIZE(bd718xx_dvs_buck_volts),
  325. .vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN,
  326. .vsel_mask = DVS_BUCK_RUN_MASK,
  327. .enable_reg = BD718XX_REG_BUCK1_CTRL,
  328. .enable_mask = BD718XX_BUCK_EN,
  329. .owner = THIS_MODULE,
  330. },
  331. .init = {
  332. .reg = BD718XX_REG_BUCK1_CTRL,
  333. .mask = BD718XX_BUCK_SEL,
  334. .val = BD718XX_BUCK_SEL,
  335. },
  336. },
  337. {
  338. .desc = {
  339. .name = "buck2",
  340. .of_match = of_match_ptr("BUCK2"),
  341. .regulators_node = of_match_ptr("regulators"),
  342. .id = BD718XX_BUCK2,
  343. .ops = &bd718xx_dvs_buck_regulator_ops,
  344. .type = REGULATOR_VOLTAGE,
  345. .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
  346. .linear_ranges = bd718xx_dvs_buck_volts,
  347. .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
  348. .vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN,
  349. .vsel_mask = DVS_BUCK_RUN_MASK,
  350. .enable_reg = BD718XX_REG_BUCK2_CTRL,
  351. .enable_mask = BD718XX_BUCK_EN,
  352. .owner = THIS_MODULE,
  353. },
  354. .init = {
  355. .reg = BD718XX_REG_BUCK2_CTRL,
  356. .mask = BD718XX_BUCK_SEL,
  357. .val = BD718XX_BUCK_SEL,
  358. },
  359. },
  360. {
  361. .desc = {
  362. .name = "buck3",
  363. .of_match = of_match_ptr("BUCK3"),
  364. .regulators_node = of_match_ptr("regulators"),
  365. .id = BD718XX_BUCK3,
  366. .ops = &bd718xx_pickable_range_buck_ops,
  367. .type = REGULATOR_VOLTAGE,
  368. .n_voltages = BD71847_BUCK3_VOLTAGE_NUM,
  369. .linear_ranges = bd71847_buck3_volts,
  370. .n_linear_ranges =
  371. ARRAY_SIZE(bd71847_buck3_volts),
  372. .vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
  373. .vsel_mask = BD718XX_1ST_NODVS_BUCK_MASK,
  374. .vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
  375. .vsel_range_mask = BD71847_BUCK3_RANGE_MASK,
  376. .linear_range_selectors = bd71847_buck3_volt_range_sel,
  377. .enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
  378. .enable_mask = BD718XX_BUCK_EN,
  379. .owner = THIS_MODULE,
  380. },
  381. .init = {
  382. .reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
  383. .mask = BD718XX_BUCK_SEL,
  384. .val = BD718XX_BUCK_SEL,
  385. },
  386. },
  387. {
  388. .desc = {
  389. .name = "buck4",
  390. .of_match = of_match_ptr("BUCK4"),
  391. .regulators_node = of_match_ptr("regulators"),
  392. .id = BD718XX_BUCK4,
  393. .ops = &bd718xx_pickable_range_buck_ops,
  394. .type = REGULATOR_VOLTAGE,
  395. .n_voltages = BD71847_BUCK4_VOLTAGE_NUM,
  396. .linear_ranges = bd71847_buck4_volts,
  397. .n_linear_ranges =
  398. ARRAY_SIZE(bd71847_buck4_volts),
  399. .enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
  400. .vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
  401. .vsel_mask = BD71847_BUCK4_MASK,
  402. .vsel_range_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
  403. .vsel_range_mask = BD71847_BUCK4_RANGE_MASK,
  404. .linear_range_selectors = bd71847_buck4_volt_range_sel,
  405. .enable_mask = BD718XX_BUCK_EN,
  406. .owner = THIS_MODULE,
  407. },
  408. .init = {
  409. .reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
  410. .mask = BD718XX_BUCK_SEL,
  411. .val = BD718XX_BUCK_SEL,
  412. },
  413. },
  414. {
  415. .desc = {
  416. .name = "buck5",
  417. .of_match = of_match_ptr("BUCK5"),
  418. .regulators_node = of_match_ptr("regulators"),
  419. .id = BD718XX_BUCK5,
  420. .ops = &bd718xx_buck_regulator_nolinear_ops,
  421. .type = REGULATOR_VOLTAGE,
  422. .volt_table = &bd718xx_3rd_nodvs_buck_volts[0],
  423. .n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts),
  424. .vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT,
  425. .vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK,
  426. .enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
  427. .enable_mask = BD718XX_BUCK_EN,
  428. .owner = THIS_MODULE,
  429. },
  430. .init = {
  431. .reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
  432. .mask = BD718XX_BUCK_SEL,
  433. .val = BD718XX_BUCK_SEL,
  434. },
  435. },
  436. {
  437. .desc = {
  438. .name = "buck6",
  439. .of_match = of_match_ptr("BUCK6"),
  440. .regulators_node = of_match_ptr("regulators"),
  441. .id = BD718XX_BUCK6,
  442. .ops = &bd718xx_buck_regulator_ops,
  443. .type = REGULATOR_VOLTAGE,
  444. .n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM,
  445. .linear_ranges = bd718xx_4th_nodvs_buck_volts,
  446. .n_linear_ranges =
  447. ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts),
  448. .vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT,
  449. .vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK,
  450. .enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
  451. .enable_mask = BD718XX_BUCK_EN,
  452. .owner = THIS_MODULE,
  453. },
  454. .init = {
  455. .reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
  456. .mask = BD718XX_BUCK_SEL,
  457. .val = BD718XX_BUCK_SEL,
  458. },
  459. },
  460. {
  461. .desc = {
  462. .name = "ldo1",
  463. .of_match = of_match_ptr("LDO1"),
  464. .regulators_node = of_match_ptr("regulators"),
  465. .id = BD718XX_LDO1,
  466. .ops = &bd718xx_pickable_range_ldo_ops,
  467. .type = REGULATOR_VOLTAGE,
  468. .n_voltages = BD718XX_LDO1_VOLTAGE_NUM,
  469. .linear_ranges = bd718xx_ldo1_volts,
  470. .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts),
  471. .vsel_reg = BD718XX_REG_LDO1_VOLT,
  472. .vsel_mask = BD718XX_LDO1_MASK,
  473. .vsel_range_reg = BD718XX_REG_LDO1_VOLT,
  474. .vsel_range_mask = BD718XX_LDO1_RANGE_MASK,
  475. .linear_range_selectors = bd718xx_ldo1_volt_range_sel,
  476. .enable_reg = BD718XX_REG_LDO1_VOLT,
  477. .enable_mask = BD718XX_LDO_EN,
  478. .owner = THIS_MODULE,
  479. },
  480. .init = {
  481. .reg = BD718XX_REG_LDO1_VOLT,
  482. .mask = BD718XX_LDO_SEL,
  483. .val = BD718XX_LDO_SEL,
  484. },
  485. },
  486. {
  487. .desc = {
  488. .name = "ldo2",
  489. .of_match = of_match_ptr("LDO2"),
  490. .regulators_node = of_match_ptr("regulators"),
  491. .id = BD718XX_LDO2,
  492. .ops = &bd718xx_ldo_regulator_nolinear_ops,
  493. .type = REGULATOR_VOLTAGE,
  494. .volt_table = &ldo_2_volts[0],
  495. .vsel_reg = BD718XX_REG_LDO2_VOLT,
  496. .vsel_mask = BD718XX_LDO2_MASK,
  497. .n_voltages = ARRAY_SIZE(ldo_2_volts),
  498. .enable_reg = BD718XX_REG_LDO2_VOLT,
  499. .enable_mask = BD718XX_LDO_EN,
  500. .owner = THIS_MODULE,
  501. },
  502. .init = {
  503. .reg = BD718XX_REG_LDO2_VOLT,
  504. .mask = BD718XX_LDO_SEL,
  505. .val = BD718XX_LDO_SEL,
  506. },
  507. },
  508. {
  509. .desc = {
  510. .name = "ldo3",
  511. .of_match = of_match_ptr("LDO3"),
  512. .regulators_node = of_match_ptr("regulators"),
  513. .id = BD718XX_LDO3,
  514. .ops = &bd718xx_ldo_regulator_ops,
  515. .type = REGULATOR_VOLTAGE,
  516. .n_voltages = BD718XX_LDO3_VOLTAGE_NUM,
  517. .linear_ranges = bd718xx_ldo3_volts,
  518. .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts),
  519. .vsel_reg = BD718XX_REG_LDO3_VOLT,
  520. .vsel_mask = BD718XX_LDO3_MASK,
  521. .enable_reg = BD718XX_REG_LDO3_VOLT,
  522. .enable_mask = BD718XX_LDO_EN,
  523. .owner = THIS_MODULE,
  524. },
  525. .init = {
  526. .reg = BD718XX_REG_LDO3_VOLT,
  527. .mask = BD718XX_LDO_SEL,
  528. .val = BD718XX_LDO_SEL,
  529. },
  530. },
  531. {
  532. .desc = {
  533. .name = "ldo4",
  534. .of_match = of_match_ptr("LDO4"),
  535. .regulators_node = of_match_ptr("regulators"),
  536. .id = BD718XX_LDO4,
  537. .ops = &bd718xx_ldo_regulator_ops,
  538. .type = REGULATOR_VOLTAGE,
  539. .n_voltages = BD718XX_LDO4_VOLTAGE_NUM,
  540. .linear_ranges = bd718xx_ldo4_volts,
  541. .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts),
  542. .vsel_reg = BD718XX_REG_LDO4_VOLT,
  543. .vsel_mask = BD718XX_LDO4_MASK,
  544. .enable_reg = BD718XX_REG_LDO4_VOLT,
  545. .enable_mask = BD718XX_LDO_EN,
  546. .owner = THIS_MODULE,
  547. },
  548. .init = {
  549. .reg = BD718XX_REG_LDO4_VOLT,
  550. .mask = BD718XX_LDO_SEL,
  551. .val = BD718XX_LDO_SEL,
  552. },
  553. },
  554. {
  555. .desc = {
  556. .name = "ldo5",
  557. .of_match = of_match_ptr("LDO5"),
  558. .regulators_node = of_match_ptr("regulators"),
  559. .id = BD718XX_LDO5,
  560. .ops = &bd718xx_pickable_range_ldo_ops,
  561. .type = REGULATOR_VOLTAGE,
  562. .n_voltages = BD71847_LDO5_VOLTAGE_NUM,
  563. .linear_ranges = bd71847_ldo5_volts,
  564. .n_linear_ranges = ARRAY_SIZE(bd71847_ldo5_volts),
  565. .vsel_reg = BD718XX_REG_LDO5_VOLT,
  566. .vsel_mask = BD71847_LDO5_MASK,
  567. .vsel_range_reg = BD718XX_REG_LDO5_VOLT,
  568. .vsel_range_mask = BD71847_LDO5_RANGE_MASK,
  569. .linear_range_selectors = bd71847_ldo5_volt_range_sel,
  570. .enable_reg = BD718XX_REG_LDO5_VOLT,
  571. .enable_mask = BD718XX_LDO_EN,
  572. .owner = THIS_MODULE,
  573. },
  574. .init = {
  575. .reg = BD718XX_REG_LDO5_VOLT,
  576. .mask = BD718XX_LDO_SEL,
  577. .val = BD718XX_LDO_SEL,
  578. },
  579. },
  580. {
  581. .desc = {
  582. .name = "ldo6",
  583. .of_match = of_match_ptr("LDO6"),
  584. .regulators_node = of_match_ptr("regulators"),
  585. .id = BD718XX_LDO6,
  586. .ops = &bd718xx_ldo_regulator_ops,
  587. .type = REGULATOR_VOLTAGE,
  588. .n_voltages = BD718XX_LDO6_VOLTAGE_NUM,
  589. .linear_ranges = bd718xx_ldo6_volts,
  590. .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts),
  591. /* LDO6 is supplied by buck5 */
  592. .supply_name = "buck5",
  593. .vsel_reg = BD718XX_REG_LDO6_VOLT,
  594. .vsel_mask = BD718XX_LDO6_MASK,
  595. .enable_reg = BD718XX_REG_LDO6_VOLT,
  596. .enable_mask = BD718XX_LDO_EN,
  597. .owner = THIS_MODULE,
  598. },
  599. .init = {
  600. .reg = BD718XX_REG_LDO6_VOLT,
  601. .mask = BD718XX_LDO_SEL,
  602. .val = BD718XX_LDO_SEL,
  603. },
  604. },
  605. };
  606. static const struct bd718xx_regulator_data bd71837_regulators[] = {
  607. {
  608. .desc = {
  609. .name = "buck1",
  610. .of_match = of_match_ptr("BUCK1"),
  611. .regulators_node = of_match_ptr("regulators"),
  612. .id = BD718XX_BUCK1,
  613. .ops = &bd718xx_dvs_buck_regulator_ops,
  614. .type = REGULATOR_VOLTAGE,
  615. .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
  616. .linear_ranges = bd718xx_dvs_buck_volts,
  617. .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
  618. .vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN,
  619. .vsel_mask = DVS_BUCK_RUN_MASK,
  620. .enable_reg = BD718XX_REG_BUCK1_CTRL,
  621. .enable_mask = BD718XX_BUCK_EN,
  622. .owner = THIS_MODULE,
  623. },
  624. .init = {
  625. .reg = BD718XX_REG_BUCK1_CTRL,
  626. .mask = BD718XX_BUCK_SEL,
  627. .val = BD718XX_BUCK_SEL,
  628. },
  629. },
  630. {
  631. .desc = {
  632. .name = "buck2",
  633. .of_match = of_match_ptr("BUCK2"),
  634. .regulators_node = of_match_ptr("regulators"),
  635. .id = BD718XX_BUCK2,
  636. .ops = &bd718xx_dvs_buck_regulator_ops,
  637. .type = REGULATOR_VOLTAGE,
  638. .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
  639. .linear_ranges = bd718xx_dvs_buck_volts,
  640. .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
  641. .vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN,
  642. .vsel_mask = DVS_BUCK_RUN_MASK,
  643. .enable_reg = BD718XX_REG_BUCK2_CTRL,
  644. .enable_mask = BD718XX_BUCK_EN,
  645. .owner = THIS_MODULE,
  646. },
  647. .init = {
  648. .reg = BD718XX_REG_BUCK2_CTRL,
  649. .mask = BD718XX_BUCK_SEL,
  650. .val = BD718XX_BUCK_SEL,
  651. },
  652. },
  653. {
  654. .desc = {
  655. .name = "buck3",
  656. .of_match = of_match_ptr("BUCK3"),
  657. .regulators_node = of_match_ptr("regulators"),
  658. .id = BD718XX_BUCK3,
  659. .ops = &bd718xx_dvs_buck_regulator_ops,
  660. .type = REGULATOR_VOLTAGE,
  661. .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
  662. .linear_ranges = bd718xx_dvs_buck_volts,
  663. .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
  664. .vsel_reg = BD71837_REG_BUCK3_VOLT_RUN,
  665. .vsel_mask = DVS_BUCK_RUN_MASK,
  666. .enable_reg = BD71837_REG_BUCK3_CTRL,
  667. .enable_mask = BD718XX_BUCK_EN,
  668. .owner = THIS_MODULE,
  669. },
  670. .init = {
  671. .reg = BD71837_REG_BUCK3_CTRL,
  672. .mask = BD718XX_BUCK_SEL,
  673. .val = BD718XX_BUCK_SEL,
  674. },
  675. },
  676. {
  677. .desc = {
  678. .name = "buck4",
  679. .of_match = of_match_ptr("BUCK4"),
  680. .regulators_node = of_match_ptr("regulators"),
  681. .id = BD718XX_BUCK4,
  682. .ops = &bd718xx_dvs_buck_regulator_ops,
  683. .type = REGULATOR_VOLTAGE,
  684. .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
  685. .linear_ranges = bd718xx_dvs_buck_volts,
  686. .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
  687. .vsel_reg = BD71837_REG_BUCK4_VOLT_RUN,
  688. .vsel_mask = DVS_BUCK_RUN_MASK,
  689. .enable_reg = BD71837_REG_BUCK4_CTRL,
  690. .enable_mask = BD718XX_BUCK_EN,
  691. .owner = THIS_MODULE,
  692. },
  693. .init = {
  694. .reg = BD71837_REG_BUCK4_CTRL,
  695. .mask = BD718XX_BUCK_SEL,
  696. .val = BD718XX_BUCK_SEL,
  697. },
  698. },
  699. {
  700. .desc = {
  701. .name = "buck5",
  702. .of_match = of_match_ptr("BUCK5"),
  703. .regulators_node = of_match_ptr("regulators"),
  704. .id = BD718XX_BUCK5,
  705. .ops = &bd718xx_pickable_range_buck_ops,
  706. .type = REGULATOR_VOLTAGE,
  707. .n_voltages = BD71837_BUCK5_VOLTAGE_NUM,
  708. .linear_ranges = bd71837_buck5_volts,
  709. .n_linear_ranges =
  710. ARRAY_SIZE(bd71837_buck5_volts),
  711. .vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
  712. .vsel_mask = BD71837_BUCK5_MASK,
  713. .vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
  714. .vsel_range_mask = BD71837_BUCK5_RANGE_MASK,
  715. .linear_range_selectors = bd71837_buck5_volt_range_sel,
  716. .enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
  717. .enable_mask = BD718XX_BUCK_EN,
  718. .owner = THIS_MODULE,
  719. },
  720. .init = {
  721. .reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
  722. .mask = BD718XX_BUCK_SEL,
  723. .val = BD718XX_BUCK_SEL,
  724. },
  725. },
  726. {
  727. .desc = {
  728. .name = "buck6",
  729. .of_match = of_match_ptr("BUCK6"),
  730. .regulators_node = of_match_ptr("regulators"),
  731. .id = BD718XX_BUCK6,
  732. .ops = &bd718xx_buck_regulator_ops,
  733. .type = REGULATOR_VOLTAGE,
  734. .n_voltages = BD71837_BUCK6_VOLTAGE_NUM,
  735. .linear_ranges = bd71837_buck6_volts,
  736. .n_linear_ranges =
  737. ARRAY_SIZE(bd71837_buck6_volts),
  738. .vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
  739. .vsel_mask = BD71837_BUCK6_MASK,
  740. .enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
  741. .enable_mask = BD718XX_BUCK_EN,
  742. .owner = THIS_MODULE,
  743. },
  744. .init = {
  745. .reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
  746. .mask = BD718XX_BUCK_SEL,
  747. .val = BD718XX_BUCK_SEL,
  748. },
  749. },
  750. {
  751. .desc = {
  752. .name = "buck7",
  753. .of_match = of_match_ptr("BUCK7"),
  754. .regulators_node = of_match_ptr("regulators"),
  755. .id = BD718XX_BUCK7,
  756. .ops = &bd718xx_buck_regulator_nolinear_ops,
  757. .type = REGULATOR_VOLTAGE,
  758. .volt_table = &bd718xx_3rd_nodvs_buck_volts[0],
  759. .n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts),
  760. .vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT,
  761. .vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK,
  762. .enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
  763. .enable_mask = BD718XX_BUCK_EN,
  764. .owner = THIS_MODULE,
  765. },
  766. .init = {
  767. .reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
  768. .mask = BD718XX_BUCK_SEL,
  769. .val = BD718XX_BUCK_SEL,
  770. },
  771. },
  772. {
  773. .desc = {
  774. .name = "buck8",
  775. .of_match = of_match_ptr("BUCK8"),
  776. .regulators_node = of_match_ptr("regulators"),
  777. .id = BD718XX_BUCK8,
  778. .ops = &bd718xx_buck_regulator_ops,
  779. .type = REGULATOR_VOLTAGE,
  780. .n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM,
  781. .linear_ranges = bd718xx_4th_nodvs_buck_volts,
  782. .n_linear_ranges =
  783. ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts),
  784. .vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT,
  785. .vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK,
  786. .enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
  787. .enable_mask = BD718XX_BUCK_EN,
  788. .owner = THIS_MODULE,
  789. },
  790. .init = {
  791. .reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
  792. .mask = BD718XX_BUCK_SEL,
  793. .val = BD718XX_BUCK_SEL,
  794. },
  795. },
  796. {
  797. .desc = {
  798. .name = "ldo1",
  799. .of_match = of_match_ptr("LDO1"),
  800. .regulators_node = of_match_ptr("regulators"),
  801. .id = BD718XX_LDO1,
  802. .ops = &bd718xx_pickable_range_ldo_ops,
  803. .type = REGULATOR_VOLTAGE,
  804. .n_voltages = BD718XX_LDO1_VOLTAGE_NUM,
  805. .linear_ranges = bd718xx_ldo1_volts,
  806. .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts),
  807. .vsel_reg = BD718XX_REG_LDO1_VOLT,
  808. .vsel_mask = BD718XX_LDO1_MASK,
  809. .vsel_range_reg = BD718XX_REG_LDO1_VOLT,
  810. .vsel_range_mask = BD718XX_LDO1_RANGE_MASK,
  811. .linear_range_selectors = bd718xx_ldo1_volt_range_sel,
  812. .enable_reg = BD718XX_REG_LDO1_VOLT,
  813. .enable_mask = BD718XX_LDO_EN,
  814. .owner = THIS_MODULE,
  815. },
  816. .init = {
  817. .reg = BD718XX_REG_LDO1_VOLT,
  818. .mask = BD718XX_LDO_SEL,
  819. .val = BD718XX_LDO_SEL,
  820. },
  821. },
  822. {
  823. .desc = {
  824. .name = "ldo2",
  825. .of_match = of_match_ptr("LDO2"),
  826. .regulators_node = of_match_ptr("regulators"),
  827. .id = BD718XX_LDO2,
  828. .ops = &bd718xx_ldo_regulator_nolinear_ops,
  829. .type = REGULATOR_VOLTAGE,
  830. .volt_table = &ldo_2_volts[0],
  831. .vsel_reg = BD718XX_REG_LDO2_VOLT,
  832. .vsel_mask = BD718XX_LDO2_MASK,
  833. .n_voltages = ARRAY_SIZE(ldo_2_volts),
  834. .enable_reg = BD718XX_REG_LDO2_VOLT,
  835. .enable_mask = BD718XX_LDO_EN,
  836. .owner = THIS_MODULE,
  837. },
  838. .init = {
  839. .reg = BD718XX_REG_LDO2_VOLT,
  840. .mask = BD718XX_LDO_SEL,
  841. .val = BD718XX_LDO_SEL,
  842. },
  843. },
  844. {
  845. .desc = {
  846. .name = "ldo3",
  847. .of_match = of_match_ptr("LDO3"),
  848. .regulators_node = of_match_ptr("regulators"),
  849. .id = BD718XX_LDO3,
  850. .ops = &bd718xx_ldo_regulator_ops,
  851. .type = REGULATOR_VOLTAGE,
  852. .n_voltages = BD718XX_LDO3_VOLTAGE_NUM,
  853. .linear_ranges = bd718xx_ldo3_volts,
  854. .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts),
  855. .vsel_reg = BD718XX_REG_LDO3_VOLT,
  856. .vsel_mask = BD718XX_LDO3_MASK,
  857. .enable_reg = BD718XX_REG_LDO3_VOLT,
  858. .enable_mask = BD718XX_LDO_EN,
  859. .owner = THIS_MODULE,
  860. },
  861. .init = {
  862. .reg = BD718XX_REG_LDO3_VOLT,
  863. .mask = BD718XX_LDO_SEL,
  864. .val = BD718XX_LDO_SEL,
  865. },
  866. },
  867. {
  868. .desc = {
  869. .name = "ldo4",
  870. .of_match = of_match_ptr("LDO4"),
  871. .regulators_node = of_match_ptr("regulators"),
  872. .id = BD718XX_LDO4,
  873. .ops = &bd718xx_ldo_regulator_ops,
  874. .type = REGULATOR_VOLTAGE,
  875. .n_voltages = BD718XX_LDO4_VOLTAGE_NUM,
  876. .linear_ranges = bd718xx_ldo4_volts,
  877. .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts),
  878. .vsel_reg = BD718XX_REG_LDO4_VOLT,
  879. .vsel_mask = BD718XX_LDO4_MASK,
  880. .enable_reg = BD718XX_REG_LDO4_VOLT,
  881. .enable_mask = BD718XX_LDO_EN,
  882. .owner = THIS_MODULE,
  883. },
  884. .init = {
  885. .reg = BD718XX_REG_LDO4_VOLT,
  886. .mask = BD718XX_LDO_SEL,
  887. .val = BD718XX_LDO_SEL,
  888. },
  889. },
  890. {
  891. .desc = {
  892. .name = "ldo5",
  893. .of_match = of_match_ptr("LDO5"),
  894. .regulators_node = of_match_ptr("regulators"),
  895. .id = BD718XX_LDO5,
  896. .ops = &bd718xx_ldo_regulator_ops,
  897. .type = REGULATOR_VOLTAGE,
  898. .n_voltages = BD71837_LDO5_VOLTAGE_NUM,
  899. .linear_ranges = bd71837_ldo5_volts,
  900. .n_linear_ranges = ARRAY_SIZE(bd71837_ldo5_volts),
  901. /* LDO5 is supplied by buck6 */
  902. .supply_name = "buck6",
  903. .vsel_reg = BD718XX_REG_LDO5_VOLT,
  904. .vsel_mask = BD71837_LDO5_MASK,
  905. .enable_reg = BD718XX_REG_LDO5_VOLT,
  906. .enable_mask = BD718XX_LDO_EN,
  907. .owner = THIS_MODULE,
  908. },
  909. .init = {
  910. .reg = BD718XX_REG_LDO5_VOLT,
  911. .mask = BD718XX_LDO_SEL,
  912. .val = BD718XX_LDO_SEL,
  913. },
  914. .additional_inits = bd71837_ldo5_inits,
  915. .additional_init_amnt = ARRAY_SIZE(bd71837_ldo5_inits),
  916. },
  917. {
  918. .desc = {
  919. .name = "ldo6",
  920. .of_match = of_match_ptr("LDO6"),
  921. .regulators_node = of_match_ptr("regulators"),
  922. .id = BD718XX_LDO6,
  923. .ops = &bd718xx_ldo_regulator_ops,
  924. .type = REGULATOR_VOLTAGE,
  925. .n_voltages = BD718XX_LDO6_VOLTAGE_NUM,
  926. .linear_ranges = bd718xx_ldo6_volts,
  927. .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts),
  928. /* LDO6 is supplied by buck7 */
  929. .supply_name = "buck7",
  930. .vsel_reg = BD718XX_REG_LDO6_VOLT,
  931. .vsel_mask = BD718XX_LDO6_MASK,
  932. .enable_reg = BD718XX_REG_LDO6_VOLT,
  933. .enable_mask = BD718XX_LDO_EN,
  934. .owner = THIS_MODULE,
  935. },
  936. .init = {
  937. .reg = BD718XX_REG_LDO6_VOLT,
  938. .mask = BD718XX_LDO_SEL,
  939. .val = BD718XX_LDO_SEL,
  940. },
  941. .additional_inits = bd71837_ldo6_inits,
  942. .additional_init_amnt = ARRAY_SIZE(bd71837_ldo6_inits),
  943. },
  944. {
  945. .desc = {
  946. .name = "ldo7",
  947. .of_match = of_match_ptr("LDO7"),
  948. .regulators_node = of_match_ptr("regulators"),
  949. .id = BD718XX_LDO7,
  950. .ops = &bd718xx_ldo_regulator_ops,
  951. .type = REGULATOR_VOLTAGE,
  952. .n_voltages = BD71837_LDO7_VOLTAGE_NUM,
  953. .linear_ranges = bd71837_ldo7_volts,
  954. .n_linear_ranges = ARRAY_SIZE(bd71837_ldo7_volts),
  955. .vsel_reg = BD71837_REG_LDO7_VOLT,
  956. .vsel_mask = BD71837_LDO7_MASK,
  957. .enable_reg = BD71837_REG_LDO7_VOLT,
  958. .enable_mask = BD718XX_LDO_EN,
  959. .owner = THIS_MODULE,
  960. },
  961. .init = {
  962. .reg = BD71837_REG_LDO7_VOLT,
  963. .mask = BD718XX_LDO_SEL,
  964. .val = BD718XX_LDO_SEL,
  965. },
  966. },
  967. };
  968. struct bd718xx_pmic_inits {
  969. const struct bd718xx_regulator_data (*r_datas)[];
  970. unsigned int r_amount;
  971. };
  972. static int bd718xx_probe(struct platform_device *pdev)
  973. {
  974. struct bd718xx *mfd;
  975. struct regulator_config config = { 0 };
  976. struct bd718xx_pmic_inits pmic_regulators[] = {
  977. [BD718XX_TYPE_BD71837] = {
  978. .r_datas = &bd71837_regulators,
  979. .r_amount = ARRAY_SIZE(bd71837_regulators),
  980. },
  981. [BD718XX_TYPE_BD71847] = {
  982. .r_datas = &bd71847_regulators,
  983. .r_amount = ARRAY_SIZE(bd71847_regulators),
  984. },
  985. };
  986. int i, j, err;
  987. mfd = dev_get_drvdata(pdev->dev.parent);
  988. if (!mfd) {
  989. dev_err(&pdev->dev, "No MFD driver data\n");
  990. err = -EINVAL;
  991. goto err;
  992. }
  993. if (mfd->chip_type >= BD718XX_TYPE_AMOUNT ||
  994. !pmic_regulators[mfd->chip_type].r_datas) {
  995. dev_err(&pdev->dev, "Unsupported chip type\n");
  996. err = -EINVAL;
  997. goto err;
  998. }
  999. /* Register LOCK release */
  1000. err = regmap_update_bits(mfd->regmap, BD718XX_REG_REGLOCK,
  1001. (REGLOCK_PWRSEQ | REGLOCK_VREG), 0);
  1002. if (err) {
  1003. dev_err(&pdev->dev, "Failed to unlock PMIC (%d)\n", err);
  1004. goto err;
  1005. } else {
  1006. dev_dbg(&pdev->dev, "Unlocked lock register 0x%x\n",
  1007. BD718XX_REG_REGLOCK);
  1008. }
  1009. for (i = 0; i < pmic_regulators[mfd->chip_type].r_amount; i++) {
  1010. const struct regulator_desc *desc;
  1011. struct regulator_dev *rdev;
  1012. const struct bd718xx_regulator_data *r;
  1013. r = &(*pmic_regulators[mfd->chip_type].r_datas)[i];
  1014. desc = &r->desc;
  1015. config.dev = pdev->dev.parent;
  1016. config.regmap = mfd->regmap;
  1017. rdev = devm_regulator_register(&pdev->dev, desc, &config);
  1018. if (IS_ERR(rdev)) {
  1019. dev_err(&pdev->dev,
  1020. "failed to register %s regulator\n",
  1021. desc->name);
  1022. err = PTR_ERR(rdev);
  1023. goto err;
  1024. }
  1025. /* Regulator register gets the regulator constraints and
  1026. * applies them (set_machine_constraints). This should have
  1027. * turned the control register(s) to correct values and we
  1028. * can now switch the control from PMIC state machine to the
  1029. * register interface
  1030. */
  1031. err = regmap_update_bits(mfd->regmap, r->init.reg,
  1032. r->init.mask, r->init.val);
  1033. if (err) {
  1034. dev_err(&pdev->dev,
  1035. "Failed to write BUCK/LDO SEL bit for (%s)\n",
  1036. desc->name);
  1037. goto err;
  1038. }
  1039. for (j = 0; j < r->additional_init_amnt; j++) {
  1040. err = regmap_update_bits(mfd->regmap,
  1041. r->additional_inits[j].reg,
  1042. r->additional_inits[j].mask,
  1043. r->additional_inits[j].val);
  1044. if (err) {
  1045. dev_err(&pdev->dev,
  1046. "Buck (%s) initialization failed\n",
  1047. desc->name);
  1048. goto err;
  1049. }
  1050. }
  1051. }
  1052. err:
  1053. return err;
  1054. }
  1055. static struct platform_driver bd718xx_regulator = {
  1056. .driver = {
  1057. .name = "bd718xx-pmic",
  1058. },
  1059. .probe = bd718xx_probe,
  1060. };
  1061. module_platform_driver(bd718xx_regulator);
  1062. MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
  1063. MODULE_DESCRIPTION("BD71837/BD71847 voltage regulator driver");
  1064. MODULE_LICENSE("GPL");