rk808-regulator.c 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Regulator driver for Rockchip RK805/RK808/RK818
  4. *
  5. * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
  6. *
  7. * Author: Chris Zhong <[email protected]>
  8. * Author: Zhang Qing <[email protected]>
  9. *
  10. * Copyright (C) 2016 PHYTEC Messtechnik GmbH
  11. *
  12. * Author: Wadim Egorov <[email protected]>
  13. */
  14. #include <linux/delay.h>
  15. #include <linux/gpio.h>
  16. #include <linux/i2c.h>
  17. #include <linux/module.h>
  18. #include <linux/of_device.h>
  19. #include <linux/of_gpio.h>
  20. #include <linux/mfd/rk808.h>
  21. #include <linux/regulator/driver.h>
  22. #include <linux/regulator/of_regulator.h>
  23. #include <linux/gpio/consumer.h>
  24. /* Field Definitions */
  25. #define RK808_BUCK_VSEL_MASK 0x3f
  26. #define RK808_BUCK4_VSEL_MASK 0xf
  27. #define RK808_LDO_VSEL_MASK 0x1f
  28. #define RK809_BUCK5_VSEL_MASK 0x7
  29. #define RK817_LDO_VSEL_MASK 0x7f
  30. #define RK817_BOOST_VSEL_MASK 0x7
  31. #define RK817_BUCK_VSEL_MASK 0x7f
  32. #define RK818_BUCK_VSEL_MASK 0x3f
  33. #define RK818_BUCK4_VSEL_MASK 0x1f
  34. #define RK818_LDO_VSEL_MASK 0x1f
  35. #define RK818_LDO3_ON_VSEL_MASK 0xf
  36. #define RK818_BOOST_ON_VSEL_MASK 0xe0
  37. /* Ramp rate definitions for buck1 / buck2 only */
  38. #define RK808_RAMP_RATE_OFFSET 3
  39. #define RK808_RAMP_RATE_MASK (3 << RK808_RAMP_RATE_OFFSET)
  40. #define RK808_RAMP_RATE_2MV_PER_US (0 << RK808_RAMP_RATE_OFFSET)
  41. #define RK808_RAMP_RATE_4MV_PER_US (1 << RK808_RAMP_RATE_OFFSET)
  42. #define RK808_RAMP_RATE_6MV_PER_US (2 << RK808_RAMP_RATE_OFFSET)
  43. #define RK808_RAMP_RATE_10MV_PER_US (3 << RK808_RAMP_RATE_OFFSET)
  44. #define RK808_DVS2_POL BIT(2)
  45. #define RK808_DVS1_POL BIT(1)
  46. /* Offset from XXX_ON_VSEL to XXX_SLP_VSEL */
  47. #define RK808_SLP_REG_OFFSET 1
  48. /* Offset from XXX_ON_VSEL to XXX_DVS_VSEL */
  49. #define RK808_DVS_REG_OFFSET 2
  50. /* Offset from XXX_EN_REG to SLEEP_SET_OFF_XXX */
  51. #define RK808_SLP_SET_OFF_REG_OFFSET 2
  52. /* max steps for increase voltage of Buck1/2, equal 100mv*/
  53. #define MAX_STEPS_ONE_TIME 8
  54. #define ENABLE_MASK(id) (BIT(id) | BIT(4 + (id)))
  55. #define DISABLE_VAL(id) (BIT(4 + (id)))
  56. #define RK817_BOOST_DESC(_id, _match, _supply, _min, _max, _step, _vreg,\
  57. _vmask, _ereg, _emask, _enval, _disval, _etime, m_drop) \
  58. { \
  59. .name = (_match), \
  60. .supply_name = (_supply), \
  61. .of_match = of_match_ptr(_match), \
  62. .regulators_node = of_match_ptr("regulators"), \
  63. .type = REGULATOR_VOLTAGE, \
  64. .id = (_id), \
  65. .n_voltages = (((_max) - (_min)) / (_step) + 1), \
  66. .owner = THIS_MODULE, \
  67. .min_uV = (_min) * 1000, \
  68. .uV_step = (_step) * 1000, \
  69. .vsel_reg = (_vreg), \
  70. .vsel_mask = (_vmask), \
  71. .enable_reg = (_ereg), \
  72. .enable_mask = (_emask), \
  73. .enable_val = (_enval), \
  74. .disable_val = (_disval), \
  75. .enable_time = (_etime), \
  76. .min_dropout_uV = (m_drop) * 1000, \
  77. .ops = &rk817_boost_ops, \
  78. }
  79. #define RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
  80. _vmask, _ereg, _emask, _enval, _disval, _etime, _ops) \
  81. { \
  82. .name = (_match), \
  83. .supply_name = (_supply), \
  84. .of_match = of_match_ptr(_match), \
  85. .regulators_node = of_match_ptr("regulators"), \
  86. .type = REGULATOR_VOLTAGE, \
  87. .id = (_id), \
  88. .n_voltages = (((_max) - (_min)) / (_step) + 1), \
  89. .owner = THIS_MODULE, \
  90. .min_uV = (_min) * 1000, \
  91. .uV_step = (_step) * 1000, \
  92. .vsel_reg = (_vreg), \
  93. .vsel_mask = (_vmask), \
  94. .enable_reg = (_ereg), \
  95. .enable_mask = (_emask), \
  96. .enable_val = (_enval), \
  97. .disable_val = (_disval), \
  98. .enable_time = (_etime), \
  99. .ops = _ops, \
  100. }
  101. #define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
  102. _vmask, _ereg, _emask, _etime) \
  103. RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
  104. _vmask, _ereg, _emask, 0, 0, _etime, &rk805_reg_ops)
  105. #define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
  106. _vmask, _ereg, _emask, _etime) \
  107. RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
  108. _vmask, _ereg, _emask, 0, 0, _etime, &rk808_reg_ops)
  109. #define RK817_DESC(_id, _match, _supply, _min, _max, _step, _vreg, \
  110. _vmask, _ereg, _emask, _disval, _etime) \
  111. RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg, \
  112. _vmask, _ereg, _emask, _emask, _disval, _etime, &rk817_reg_ops)
  113. #define RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \
  114. _enval, _disval, _ops) \
  115. { \
  116. .name = (_match), \
  117. .supply_name = (_supply), \
  118. .of_match = of_match_ptr(_match), \
  119. .regulators_node = of_match_ptr("regulators"), \
  120. .type = REGULATOR_VOLTAGE, \
  121. .id = (_id), \
  122. .enable_reg = (_ereg), \
  123. .enable_mask = (_emask), \
  124. .enable_val = (_enval), \
  125. .disable_val = (_disval), \
  126. .owner = THIS_MODULE, \
  127. .ops = _ops \
  128. }
  129. #define RK817_DESC_SWITCH(_id, _match, _supply, _ereg, _emask, \
  130. _disval) \
  131. RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \
  132. _emask, _disval, &rk817_switch_ops)
  133. #define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask) \
  134. RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask, \
  135. 0, 0, &rk808_switch_ops)
  136. struct rk808_regulator_data {
  137. struct gpio_desc *dvs_gpio[2];
  138. };
  139. static const struct linear_range rk808_ldo3_voltage_ranges[] = {
  140. REGULATOR_LINEAR_RANGE(800000, 0, 13, 100000),
  141. REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0),
  142. };
  143. #define RK809_BUCK5_SEL_CNT (8)
  144. static const struct linear_range rk809_buck5_voltage_ranges[] = {
  145. REGULATOR_LINEAR_RANGE(1500000, 0, 0, 0),
  146. REGULATOR_LINEAR_RANGE(1800000, 1, 3, 200000),
  147. REGULATOR_LINEAR_RANGE(2800000, 4, 5, 200000),
  148. REGULATOR_LINEAR_RANGE(3300000, 6, 7, 300000),
  149. };
  150. #define RK817_BUCK1_MIN0 500000
  151. #define RK817_BUCK1_MAX0 1500000
  152. #define RK817_BUCK1_MIN1 1600000
  153. #define RK817_BUCK1_MAX1 2400000
  154. #define RK817_BUCK3_MAX1 3400000
  155. #define RK817_BUCK1_STP0 12500
  156. #define RK817_BUCK1_STP1 100000
  157. #define RK817_BUCK1_SEL0 ((RK817_BUCK1_MAX0 - RK817_BUCK1_MIN0) /\
  158. RK817_BUCK1_STP0)
  159. #define RK817_BUCK1_SEL1 ((RK817_BUCK1_MAX1 - RK817_BUCK1_MIN1) /\
  160. RK817_BUCK1_STP1)
  161. #define RK817_BUCK3_SEL1 ((RK817_BUCK3_MAX1 - RK817_BUCK1_MIN1) /\
  162. RK817_BUCK1_STP1)
  163. #define RK817_BUCK1_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK1_SEL1 + 1)
  164. #define RK817_BUCK3_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK3_SEL1 + 1)
  165. static const struct linear_range rk817_buck1_voltage_ranges[] = {
  166. REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,
  167. RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
  168. REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,
  169. RK817_BUCK1_SEL_CNT, RK817_BUCK1_STP1),
  170. };
  171. static const struct linear_range rk817_buck3_voltage_ranges[] = {
  172. REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,
  173. RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
  174. REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,
  175. RK817_BUCK3_SEL_CNT, RK817_BUCK1_STP1),
  176. };
  177. static const unsigned int rk808_buck1_2_ramp_table[] = {
  178. 2000, 4000, 6000, 10000
  179. };
  180. /* RK817 RK809 */
  181. static const unsigned int rk817_buck1_4_ramp_table[] = {
  182. 3000, 6300, 12500, 25000
  183. };
  184. static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
  185. {
  186. struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
  187. int id = rdev_get_id(rdev);
  188. struct gpio_desc *gpio = pdata->dvs_gpio[id];
  189. unsigned int val;
  190. int ret;
  191. if (!gpio || gpiod_get_value(gpio) == 0)
  192. return regulator_get_voltage_sel_regmap(rdev);
  193. ret = regmap_read(rdev->regmap,
  194. rdev->desc->vsel_reg + RK808_DVS_REG_OFFSET,
  195. &val);
  196. if (ret != 0)
  197. return ret;
  198. val &= rdev->desc->vsel_mask;
  199. val >>= ffs(rdev->desc->vsel_mask) - 1;
  200. return val;
  201. }
  202. static int rk808_buck1_2_i2c_set_voltage_sel(struct regulator_dev *rdev,
  203. unsigned sel)
  204. {
  205. int ret, delta_sel;
  206. unsigned int old_sel, tmp, val, mask = rdev->desc->vsel_mask;
  207. ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
  208. if (ret != 0)
  209. return ret;
  210. tmp = val & ~mask;
  211. old_sel = val & mask;
  212. old_sel >>= ffs(mask) - 1;
  213. delta_sel = sel - old_sel;
  214. /*
  215. * If directly modify the register to change the voltage, we will face
  216. * the risk of overshoot. Put it into a multi-step, can effectively
  217. * avoid this problem, a step is 100mv here.
  218. */
  219. while (delta_sel > MAX_STEPS_ONE_TIME) {
  220. old_sel += MAX_STEPS_ONE_TIME;
  221. val = old_sel << (ffs(mask) - 1);
  222. val |= tmp;
  223. /*
  224. * i2c is 400kHz (2.5us per bit) and we must transmit _at least_
  225. * 3 bytes (24 bits) plus start and stop so 26 bits. So we've
  226. * got more than 65 us between each voltage change and thus
  227. * won't ramp faster than ~1500 uV / us.
  228. */
  229. ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
  230. delta_sel = sel - old_sel;
  231. }
  232. sel <<= ffs(mask) - 1;
  233. val = tmp | sel;
  234. ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
  235. /*
  236. * When we change the voltage register directly, the ramp rate is about
  237. * 100000uv/us, wait 1us to make sure the target voltage to be stable,
  238. * so we needn't wait extra time after that.
  239. */
  240. udelay(1);
  241. return ret;
  242. }
  243. static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,
  244. unsigned sel)
  245. {
  246. struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
  247. int id = rdev_get_id(rdev);
  248. struct gpio_desc *gpio = pdata->dvs_gpio[id];
  249. unsigned int reg = rdev->desc->vsel_reg;
  250. unsigned old_sel;
  251. int ret, gpio_level;
  252. if (!gpio)
  253. return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);
  254. gpio_level = gpiod_get_value(gpio);
  255. if (gpio_level == 0) {
  256. reg += RK808_DVS_REG_OFFSET;
  257. ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &old_sel);
  258. } else {
  259. ret = regmap_read(rdev->regmap,
  260. reg + RK808_DVS_REG_OFFSET,
  261. &old_sel);
  262. }
  263. if (ret != 0)
  264. return ret;
  265. sel <<= ffs(rdev->desc->vsel_mask) - 1;
  266. sel |= old_sel & ~rdev->desc->vsel_mask;
  267. ret = regmap_write(rdev->regmap, reg, sel);
  268. if (ret)
  269. return ret;
  270. gpiod_set_value(gpio, !gpio_level);
  271. return ret;
  272. }
  273. static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
  274. unsigned int old_selector,
  275. unsigned int new_selector)
  276. {
  277. struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
  278. int id = rdev_get_id(rdev);
  279. struct gpio_desc *gpio = pdata->dvs_gpio[id];
  280. /* if there is no dvs1/2 pin, we don't need wait extra time here. */
  281. if (!gpio)
  282. return 0;
  283. return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);
  284. }
  285. static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
  286. {
  287. unsigned int reg;
  288. int sel = regulator_map_voltage_linear(rdev, uv, uv);
  289. if (sel < 0)
  290. return -EINVAL;
  291. reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
  292. return regmap_update_bits(rdev->regmap, reg,
  293. rdev->desc->vsel_mask,
  294. sel);
  295. }
  296. static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
  297. {
  298. unsigned int reg;
  299. int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
  300. if (sel < 0)
  301. return -EINVAL;
  302. reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
  303. return regmap_update_bits(rdev->regmap, reg,
  304. rdev->desc->vsel_mask,
  305. sel);
  306. }
  307. static int rk805_set_suspend_enable(struct regulator_dev *rdev)
  308. {
  309. unsigned int reg;
  310. reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
  311. return regmap_update_bits(rdev->regmap, reg,
  312. rdev->desc->enable_mask,
  313. rdev->desc->enable_mask);
  314. }
  315. static int rk805_set_suspend_disable(struct regulator_dev *rdev)
  316. {
  317. unsigned int reg;
  318. reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
  319. return regmap_update_bits(rdev->regmap, reg,
  320. rdev->desc->enable_mask,
  321. 0);
  322. }
  323. static int rk808_set_suspend_enable(struct regulator_dev *rdev)
  324. {
  325. unsigned int reg;
  326. reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
  327. return regmap_update_bits(rdev->regmap, reg,
  328. rdev->desc->enable_mask,
  329. 0);
  330. }
  331. static int rk808_set_suspend_disable(struct regulator_dev *rdev)
  332. {
  333. unsigned int reg;
  334. reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
  335. return regmap_update_bits(rdev->regmap, reg,
  336. rdev->desc->enable_mask,
  337. rdev->desc->enable_mask);
  338. }
  339. static int rk817_set_suspend_enable_ctrl(struct regulator_dev *rdev,
  340. unsigned int en)
  341. {
  342. unsigned int reg;
  343. int id = rdev_get_id(rdev);
  344. unsigned int id_slp, msk, val;
  345. if (id >= RK817_ID_DCDC1 && id <= RK817_ID_DCDC4)
  346. id_slp = id;
  347. else if (id >= RK817_ID_LDO1 && id <= RK817_ID_LDO8)
  348. id_slp = 8 + (id - RK817_ID_LDO1);
  349. else if (id >= RK817_ID_LDO9 && id <= RK809_ID_SW2)
  350. id_slp = 4 + (id - RK817_ID_LDO9);
  351. else
  352. return -EINVAL;
  353. reg = RK817_POWER_SLP_EN_REG(id_slp / 8);
  354. msk = BIT(id_slp % 8);
  355. if (en)
  356. val = msk;
  357. else
  358. val = 0;
  359. return regmap_update_bits(rdev->regmap, reg, msk, val);
  360. }
  361. static int rk817_set_suspend_enable(struct regulator_dev *rdev)
  362. {
  363. return rk817_set_suspend_enable_ctrl(rdev, 1);
  364. }
  365. static int rk817_set_suspend_disable(struct regulator_dev *rdev)
  366. {
  367. return rk817_set_suspend_enable_ctrl(rdev, 0);
  368. }
  369. static int rk8xx_set_suspend_mode(struct regulator_dev *rdev, unsigned int mode)
  370. {
  371. unsigned int reg;
  372. reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
  373. switch (mode) {
  374. case REGULATOR_MODE_FAST:
  375. return regmap_update_bits(rdev->regmap, reg,
  376. PWM_MODE_MSK, FPWM_MODE);
  377. case REGULATOR_MODE_NORMAL:
  378. return regmap_update_bits(rdev->regmap, reg,
  379. PWM_MODE_MSK, AUTO_PWM_MODE);
  380. default:
  381. dev_err(&rdev->dev, "do not support this mode\n");
  382. return -EINVAL;
  383. }
  384. return 0;
  385. }
  386. static int rk8xx_set_mode(struct regulator_dev *rdev, unsigned int mode)
  387. {
  388. switch (mode) {
  389. case REGULATOR_MODE_FAST:
  390. return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
  391. PWM_MODE_MSK, FPWM_MODE);
  392. case REGULATOR_MODE_NORMAL:
  393. return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
  394. PWM_MODE_MSK, AUTO_PWM_MODE);
  395. default:
  396. dev_err(&rdev->dev, "do not support this mode\n");
  397. return -EINVAL;
  398. }
  399. return 0;
  400. }
  401. static unsigned int rk8xx_get_mode(struct regulator_dev *rdev)
  402. {
  403. unsigned int val;
  404. int err;
  405. err = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
  406. if (err)
  407. return err;
  408. if (val & FPWM_MODE)
  409. return REGULATOR_MODE_FAST;
  410. else
  411. return REGULATOR_MODE_NORMAL;
  412. }
  413. static int rk8xx_is_enabled_wmsk_regmap(struct regulator_dev *rdev)
  414. {
  415. unsigned int val;
  416. int ret;
  417. ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
  418. if (ret != 0)
  419. return ret;
  420. /* add write mask bit */
  421. val |= (rdev->desc->enable_mask & 0xf0);
  422. val &= rdev->desc->enable_mask;
  423. if (rdev->desc->enable_is_inverted) {
  424. if (rdev->desc->enable_val)
  425. return val != rdev->desc->enable_val;
  426. return (val == 0);
  427. }
  428. if (rdev->desc->enable_val)
  429. return val == rdev->desc->enable_val;
  430. return val != 0;
  431. }
  432. static unsigned int rk8xx_regulator_of_map_mode(unsigned int mode)
  433. {
  434. switch (mode) {
  435. case 1:
  436. return REGULATOR_MODE_FAST;
  437. case 2:
  438. return REGULATOR_MODE_NORMAL;
  439. default:
  440. return REGULATOR_MODE_INVALID;
  441. }
  442. }
  443. static const struct regulator_ops rk805_reg_ops = {
  444. .list_voltage = regulator_list_voltage_linear,
  445. .map_voltage = regulator_map_voltage_linear,
  446. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  447. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  448. .enable = regulator_enable_regmap,
  449. .disable = regulator_disable_regmap,
  450. .is_enabled = regulator_is_enabled_regmap,
  451. .set_suspend_voltage = rk808_set_suspend_voltage,
  452. .set_suspend_enable = rk805_set_suspend_enable,
  453. .set_suspend_disable = rk805_set_suspend_disable,
  454. };
  455. static const struct regulator_ops rk805_switch_ops = {
  456. .enable = regulator_enable_regmap,
  457. .disable = regulator_disable_regmap,
  458. .is_enabled = regulator_is_enabled_regmap,
  459. .set_suspend_enable = rk805_set_suspend_enable,
  460. .set_suspend_disable = rk805_set_suspend_disable,
  461. };
  462. static const struct regulator_ops rk808_buck1_2_ops = {
  463. .list_voltage = regulator_list_voltage_linear,
  464. .map_voltage = regulator_map_voltage_linear,
  465. .get_voltage_sel = rk808_buck1_2_get_voltage_sel_regmap,
  466. .set_voltage_sel = rk808_buck1_2_set_voltage_sel,
  467. .set_voltage_time_sel = rk808_buck1_2_set_voltage_time_sel,
  468. .enable = regulator_enable_regmap,
  469. .disable = regulator_disable_regmap,
  470. .is_enabled = regulator_is_enabled_regmap,
  471. .set_ramp_delay = regulator_set_ramp_delay_regmap,
  472. .set_suspend_voltage = rk808_set_suspend_voltage,
  473. .set_suspend_enable = rk808_set_suspend_enable,
  474. .set_suspend_disable = rk808_set_suspend_disable,
  475. };
  476. static const struct regulator_ops rk808_reg_ops = {
  477. .list_voltage = regulator_list_voltage_linear,
  478. .map_voltage = regulator_map_voltage_linear,
  479. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  480. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  481. .enable = regulator_enable_regmap,
  482. .disable = regulator_disable_regmap,
  483. .is_enabled = regulator_is_enabled_regmap,
  484. .set_suspend_voltage = rk808_set_suspend_voltage,
  485. .set_suspend_enable = rk808_set_suspend_enable,
  486. .set_suspend_disable = rk808_set_suspend_disable,
  487. };
  488. static const struct regulator_ops rk808_reg_ops_ranges = {
  489. .list_voltage = regulator_list_voltage_linear_range,
  490. .map_voltage = regulator_map_voltage_linear_range,
  491. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  492. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  493. .enable = regulator_enable_regmap,
  494. .disable = regulator_disable_regmap,
  495. .is_enabled = regulator_is_enabled_regmap,
  496. .set_suspend_voltage = rk808_set_suspend_voltage_range,
  497. .set_suspend_enable = rk808_set_suspend_enable,
  498. .set_suspend_disable = rk808_set_suspend_disable,
  499. };
  500. static const struct regulator_ops rk808_switch_ops = {
  501. .enable = regulator_enable_regmap,
  502. .disable = regulator_disable_regmap,
  503. .is_enabled = regulator_is_enabled_regmap,
  504. .set_suspend_enable = rk808_set_suspend_enable,
  505. .set_suspend_disable = rk808_set_suspend_disable,
  506. };
  507. static const struct linear_range rk805_buck_1_2_voltage_ranges[] = {
  508. REGULATOR_LINEAR_RANGE(712500, 0, 59, 12500),
  509. REGULATOR_LINEAR_RANGE(1800000, 60, 62, 200000),
  510. REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0),
  511. };
  512. static const struct regulator_ops rk809_buck5_ops_range = {
  513. .list_voltage = regulator_list_voltage_linear_range,
  514. .map_voltage = regulator_map_voltage_linear_range,
  515. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  516. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  517. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  518. .enable = regulator_enable_regmap,
  519. .disable = regulator_disable_regmap,
  520. .is_enabled = rk8xx_is_enabled_wmsk_regmap,
  521. .set_suspend_voltage = rk808_set_suspend_voltage_range,
  522. .set_suspend_enable = rk817_set_suspend_enable,
  523. .set_suspend_disable = rk817_set_suspend_disable,
  524. };
  525. static const struct regulator_ops rk817_reg_ops = {
  526. .list_voltage = regulator_list_voltage_linear,
  527. .map_voltage = regulator_map_voltage_linear,
  528. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  529. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  530. .enable = regulator_enable_regmap,
  531. .disable = regulator_disable_regmap,
  532. .is_enabled = rk8xx_is_enabled_wmsk_regmap,
  533. .set_suspend_voltage = rk808_set_suspend_voltage,
  534. .set_suspend_enable = rk817_set_suspend_enable,
  535. .set_suspend_disable = rk817_set_suspend_disable,
  536. };
  537. static const struct regulator_ops rk817_boost_ops = {
  538. .list_voltage = regulator_list_voltage_linear,
  539. .map_voltage = regulator_map_voltage_linear,
  540. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  541. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  542. .enable = regulator_enable_regmap,
  543. .disable = regulator_disable_regmap,
  544. .is_enabled = rk8xx_is_enabled_wmsk_regmap,
  545. .set_suspend_enable = rk817_set_suspend_enable,
  546. .set_suspend_disable = rk817_set_suspend_disable,
  547. };
  548. static const struct regulator_ops rk817_buck_ops_range = {
  549. .list_voltage = regulator_list_voltage_linear_range,
  550. .map_voltage = regulator_map_voltage_linear_range,
  551. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  552. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  553. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  554. .enable = regulator_enable_regmap,
  555. .disable = regulator_disable_regmap,
  556. .is_enabled = rk8xx_is_enabled_wmsk_regmap,
  557. .set_mode = rk8xx_set_mode,
  558. .get_mode = rk8xx_get_mode,
  559. .set_suspend_mode = rk8xx_set_suspend_mode,
  560. .set_ramp_delay = regulator_set_ramp_delay_regmap,
  561. .set_suspend_voltage = rk808_set_suspend_voltage_range,
  562. .set_suspend_enable = rk817_set_suspend_enable,
  563. .set_suspend_disable = rk817_set_suspend_disable,
  564. };
  565. static const struct regulator_ops rk817_switch_ops = {
  566. .enable = regulator_enable_regmap,
  567. .disable = regulator_disable_regmap,
  568. .is_enabled = rk8xx_is_enabled_wmsk_regmap,
  569. .set_suspend_enable = rk817_set_suspend_enable,
  570. .set_suspend_disable = rk817_set_suspend_disable,
  571. };
  572. static const struct regulator_desc rk805_reg[] = {
  573. {
  574. .name = "DCDC_REG1",
  575. .supply_name = "vcc1",
  576. .of_match = of_match_ptr("DCDC_REG1"),
  577. .regulators_node = of_match_ptr("regulators"),
  578. .id = RK805_ID_DCDC1,
  579. .ops = &rk808_reg_ops_ranges,
  580. .type = REGULATOR_VOLTAGE,
  581. .n_voltages = 64,
  582. .linear_ranges = rk805_buck_1_2_voltage_ranges,
  583. .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
  584. .vsel_reg = RK805_BUCK1_ON_VSEL_REG,
  585. .vsel_mask = RK818_BUCK_VSEL_MASK,
  586. .enable_reg = RK805_DCDC_EN_REG,
  587. .enable_mask = BIT(0),
  588. .owner = THIS_MODULE,
  589. }, {
  590. .name = "DCDC_REG2",
  591. .supply_name = "vcc2",
  592. .of_match = of_match_ptr("DCDC_REG2"),
  593. .regulators_node = of_match_ptr("regulators"),
  594. .id = RK805_ID_DCDC2,
  595. .ops = &rk808_reg_ops_ranges,
  596. .type = REGULATOR_VOLTAGE,
  597. .n_voltages = 64,
  598. .linear_ranges = rk805_buck_1_2_voltage_ranges,
  599. .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
  600. .vsel_reg = RK805_BUCK2_ON_VSEL_REG,
  601. .vsel_mask = RK818_BUCK_VSEL_MASK,
  602. .enable_reg = RK805_DCDC_EN_REG,
  603. .enable_mask = BIT(1),
  604. .owner = THIS_MODULE,
  605. }, {
  606. .name = "DCDC_REG3",
  607. .supply_name = "vcc3",
  608. .of_match = of_match_ptr("DCDC_REG3"),
  609. .regulators_node = of_match_ptr("regulators"),
  610. .id = RK805_ID_DCDC3,
  611. .ops = &rk805_switch_ops,
  612. .type = REGULATOR_VOLTAGE,
  613. .n_voltages = 1,
  614. .enable_reg = RK805_DCDC_EN_REG,
  615. .enable_mask = BIT(2),
  616. .owner = THIS_MODULE,
  617. },
  618. RK805_DESC(RK805_ID_DCDC4, "DCDC_REG4", "vcc4", 800, 3400, 100,
  619. RK805_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
  620. RK805_DCDC_EN_REG, BIT(3), 0),
  621. RK805_DESC(RK805_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100,
  622. RK805_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
  623. BIT(0), 400),
  624. RK805_DESC(RK805_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100,
  625. RK805_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
  626. BIT(1), 400),
  627. RK805_DESC(RK805_ID_LDO3, "LDO_REG3", "vcc6", 800, 3400, 100,
  628. RK805_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
  629. BIT(2), 400),
  630. };
  631. static const struct regulator_desc rk808_reg[] = {
  632. {
  633. .name = "DCDC_REG1",
  634. .supply_name = "vcc1",
  635. .of_match = of_match_ptr("DCDC_REG1"),
  636. .regulators_node = of_match_ptr("regulators"),
  637. .id = RK808_ID_DCDC1,
  638. .ops = &rk808_buck1_2_ops,
  639. .type = REGULATOR_VOLTAGE,
  640. .min_uV = 712500,
  641. .uV_step = 12500,
  642. .n_voltages = 64,
  643. .vsel_reg = RK808_BUCK1_ON_VSEL_REG,
  644. .vsel_mask = RK808_BUCK_VSEL_MASK,
  645. .enable_reg = RK808_DCDC_EN_REG,
  646. .enable_mask = BIT(0),
  647. .ramp_reg = RK808_BUCK1_CONFIG_REG,
  648. .ramp_mask = RK808_RAMP_RATE_MASK,
  649. .ramp_delay_table = rk808_buck1_2_ramp_table,
  650. .n_ramp_values = ARRAY_SIZE(rk808_buck1_2_ramp_table),
  651. .owner = THIS_MODULE,
  652. }, {
  653. .name = "DCDC_REG2",
  654. .supply_name = "vcc2",
  655. .of_match = of_match_ptr("DCDC_REG2"),
  656. .regulators_node = of_match_ptr("regulators"),
  657. .id = RK808_ID_DCDC2,
  658. .ops = &rk808_buck1_2_ops,
  659. .type = REGULATOR_VOLTAGE,
  660. .min_uV = 712500,
  661. .uV_step = 12500,
  662. .n_voltages = 64,
  663. .vsel_reg = RK808_BUCK2_ON_VSEL_REG,
  664. .vsel_mask = RK808_BUCK_VSEL_MASK,
  665. .enable_reg = RK808_DCDC_EN_REG,
  666. .enable_mask = BIT(1),
  667. .ramp_reg = RK808_BUCK2_CONFIG_REG,
  668. .ramp_mask = RK808_RAMP_RATE_MASK,
  669. .ramp_delay_table = rk808_buck1_2_ramp_table,
  670. .n_ramp_values = ARRAY_SIZE(rk808_buck1_2_ramp_table),
  671. .owner = THIS_MODULE,
  672. }, {
  673. .name = "DCDC_REG3",
  674. .supply_name = "vcc3",
  675. .of_match = of_match_ptr("DCDC_REG3"),
  676. .regulators_node = of_match_ptr("regulators"),
  677. .id = RK808_ID_DCDC3,
  678. .ops = &rk808_switch_ops,
  679. .type = REGULATOR_VOLTAGE,
  680. .n_voltages = 1,
  681. .enable_reg = RK808_DCDC_EN_REG,
  682. .enable_mask = BIT(2),
  683. .owner = THIS_MODULE,
  684. },
  685. RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100,
  686. RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,
  687. RK808_DCDC_EN_REG, BIT(3), 0),
  688. RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
  689. RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
  690. BIT(0), 400),
  691. RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
  692. RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
  693. BIT(1), 400),
  694. {
  695. .name = "LDO_REG3",
  696. .supply_name = "vcc7",
  697. .of_match = of_match_ptr("LDO_REG3"),
  698. .regulators_node = of_match_ptr("regulators"),
  699. .id = RK808_ID_LDO3,
  700. .ops = &rk808_reg_ops_ranges,
  701. .type = REGULATOR_VOLTAGE,
  702. .n_voltages = 16,
  703. .linear_ranges = rk808_ldo3_voltage_ranges,
  704. .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
  705. .vsel_reg = RK808_LDO3_ON_VSEL_REG,
  706. .vsel_mask = RK808_BUCK4_VSEL_MASK,
  707. .enable_reg = RK808_LDO_EN_REG,
  708. .enable_mask = BIT(2),
  709. .enable_time = 400,
  710. .owner = THIS_MODULE,
  711. },
  712. RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100,
  713. RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
  714. BIT(3), 400),
  715. RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100,
  716. RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
  717. BIT(4), 400),
  718. RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100,
  719. RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
  720. BIT(5), 400),
  721. RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
  722. RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
  723. BIT(6), 400),
  724. RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100,
  725. RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
  726. BIT(7), 400),
  727. RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8",
  728. RK808_DCDC_EN_REG, BIT(5)),
  729. RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12",
  730. RK808_DCDC_EN_REG, BIT(6)),
  731. };
  732. static const struct regulator_desc rk809_reg[] = {
  733. {
  734. .name = "DCDC_REG1",
  735. .supply_name = "vcc1",
  736. .of_match = of_match_ptr("DCDC_REG1"),
  737. .regulators_node = of_match_ptr("regulators"),
  738. .id = RK817_ID_DCDC1,
  739. .ops = &rk817_buck_ops_range,
  740. .type = REGULATOR_VOLTAGE,
  741. .n_voltages = RK817_BUCK1_SEL_CNT + 1,
  742. .linear_ranges = rk817_buck1_voltage_ranges,
  743. .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
  744. .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
  745. .vsel_mask = RK817_BUCK_VSEL_MASK,
  746. .enable_reg = RK817_POWER_EN_REG(0),
  747. .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
  748. .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
  749. .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
  750. .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC1),
  751. .ramp_mask = RK817_RAMP_RATE_MASK,
  752. .ramp_delay_table = rk817_buck1_4_ramp_table,
  753. .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
  754. .of_map_mode = rk8xx_regulator_of_map_mode,
  755. .owner = THIS_MODULE,
  756. }, {
  757. .name = "DCDC_REG2",
  758. .supply_name = "vcc2",
  759. .of_match = of_match_ptr("DCDC_REG2"),
  760. .regulators_node = of_match_ptr("regulators"),
  761. .id = RK817_ID_DCDC2,
  762. .ops = &rk817_buck_ops_range,
  763. .type = REGULATOR_VOLTAGE,
  764. .n_voltages = RK817_BUCK1_SEL_CNT + 1,
  765. .linear_ranges = rk817_buck1_voltage_ranges,
  766. .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
  767. .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
  768. .vsel_mask = RK817_BUCK_VSEL_MASK,
  769. .enable_reg = RK817_POWER_EN_REG(0),
  770. .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
  771. .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
  772. .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
  773. .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC2),
  774. .ramp_mask = RK817_RAMP_RATE_MASK,
  775. .ramp_delay_table = rk817_buck1_4_ramp_table,
  776. .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
  777. .of_map_mode = rk8xx_regulator_of_map_mode,
  778. .owner = THIS_MODULE,
  779. }, {
  780. .name = "DCDC_REG3",
  781. .supply_name = "vcc3",
  782. .of_match = of_match_ptr("DCDC_REG3"),
  783. .regulators_node = of_match_ptr("regulators"),
  784. .id = RK817_ID_DCDC3,
  785. .ops = &rk817_buck_ops_range,
  786. .type = REGULATOR_VOLTAGE,
  787. .n_voltages = RK817_BUCK1_SEL_CNT + 1,
  788. .linear_ranges = rk817_buck1_voltage_ranges,
  789. .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
  790. .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
  791. .vsel_mask = RK817_BUCK_VSEL_MASK,
  792. .enable_reg = RK817_POWER_EN_REG(0),
  793. .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
  794. .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
  795. .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
  796. .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC3),
  797. .ramp_mask = RK817_RAMP_RATE_MASK,
  798. .ramp_delay_table = rk817_buck1_4_ramp_table,
  799. .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
  800. .of_map_mode = rk8xx_regulator_of_map_mode,
  801. .owner = THIS_MODULE,
  802. }, {
  803. .name = "DCDC_REG4",
  804. .supply_name = "vcc4",
  805. .of_match = of_match_ptr("DCDC_REG4"),
  806. .regulators_node = of_match_ptr("regulators"),
  807. .id = RK817_ID_DCDC4,
  808. .ops = &rk817_buck_ops_range,
  809. .type = REGULATOR_VOLTAGE,
  810. .n_voltages = RK817_BUCK3_SEL_CNT + 1,
  811. .linear_ranges = rk817_buck3_voltage_ranges,
  812. .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
  813. .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
  814. .vsel_mask = RK817_BUCK_VSEL_MASK,
  815. .enable_reg = RK817_POWER_EN_REG(0),
  816. .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
  817. .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
  818. .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
  819. .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC4),
  820. .ramp_mask = RK817_RAMP_RATE_MASK,
  821. .ramp_delay_table = rk817_buck1_4_ramp_table,
  822. .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
  823. .of_map_mode = rk8xx_regulator_of_map_mode,
  824. .owner = THIS_MODULE,
  825. },
  826. {
  827. .name = "DCDC_REG5",
  828. .supply_name = "vcc9",
  829. .of_match = of_match_ptr("DCDC_REG5"),
  830. .regulators_node = of_match_ptr("regulators"),
  831. .id = RK809_ID_DCDC5,
  832. .ops = &rk809_buck5_ops_range,
  833. .type = REGULATOR_VOLTAGE,
  834. .n_voltages = RK809_BUCK5_SEL_CNT,
  835. .linear_ranges = rk809_buck5_voltage_ranges,
  836. .n_linear_ranges = ARRAY_SIZE(rk809_buck5_voltage_ranges),
  837. .vsel_reg = RK809_BUCK5_CONFIG(0),
  838. .vsel_mask = RK809_BUCK5_VSEL_MASK,
  839. .enable_reg = RK817_POWER_EN_REG(3),
  840. .enable_mask = ENABLE_MASK(1),
  841. .enable_val = ENABLE_MASK(1),
  842. .disable_val = DISABLE_VAL(1),
  843. .of_map_mode = rk8xx_regulator_of_map_mode,
  844. .owner = THIS_MODULE,
  845. },
  846. RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,
  847. RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
  848. RK817_POWER_EN_REG(1), ENABLE_MASK(0),
  849. DISABLE_VAL(0), 400),
  850. RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,
  851. RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
  852. RK817_POWER_EN_REG(1), ENABLE_MASK(1),
  853. DISABLE_VAL(1), 400),
  854. RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,
  855. RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
  856. RK817_POWER_EN_REG(1), ENABLE_MASK(2),
  857. DISABLE_VAL(2), 400),
  858. RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,
  859. RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
  860. RK817_POWER_EN_REG(1), ENABLE_MASK(3),
  861. DISABLE_VAL(3), 400),
  862. RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,
  863. RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
  864. RK817_POWER_EN_REG(2), ENABLE_MASK(0),
  865. DISABLE_VAL(0), 400),
  866. RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,
  867. RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
  868. RK817_POWER_EN_REG(2), ENABLE_MASK(1),
  869. DISABLE_VAL(1), 400),
  870. RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,
  871. RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
  872. RK817_POWER_EN_REG(2), ENABLE_MASK(2),
  873. DISABLE_VAL(2), 400),
  874. RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,
  875. RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
  876. RK817_POWER_EN_REG(2), ENABLE_MASK(3),
  877. DISABLE_VAL(3), 400),
  878. RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,
  879. RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
  880. RK817_POWER_EN_REG(3), ENABLE_MASK(0),
  881. DISABLE_VAL(0), 400),
  882. RK817_DESC_SWITCH(RK809_ID_SW1, "SWITCH_REG1", "vcc9",
  883. RK817_POWER_EN_REG(3), ENABLE_MASK(2),
  884. DISABLE_VAL(2)),
  885. RK817_DESC_SWITCH(RK809_ID_SW2, "SWITCH_REG2", "vcc8",
  886. RK817_POWER_EN_REG(3), ENABLE_MASK(3),
  887. DISABLE_VAL(3)),
  888. };
  889. static const struct regulator_desc rk817_reg[] = {
  890. {
  891. .name = "DCDC_REG1",
  892. .supply_name = "vcc1",
  893. .of_match = of_match_ptr("DCDC_REG1"),
  894. .regulators_node = of_match_ptr("regulators"),
  895. .id = RK817_ID_DCDC1,
  896. .ops = &rk817_buck_ops_range,
  897. .type = REGULATOR_VOLTAGE,
  898. .n_voltages = RK817_BUCK1_SEL_CNT + 1,
  899. .linear_ranges = rk817_buck1_voltage_ranges,
  900. .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
  901. .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
  902. .vsel_mask = RK817_BUCK_VSEL_MASK,
  903. .enable_reg = RK817_POWER_EN_REG(0),
  904. .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
  905. .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
  906. .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
  907. .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC1),
  908. .ramp_mask = RK817_RAMP_RATE_MASK,
  909. .ramp_delay_table = rk817_buck1_4_ramp_table,
  910. .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
  911. .of_map_mode = rk8xx_regulator_of_map_mode,
  912. .owner = THIS_MODULE,
  913. }, {
  914. .name = "DCDC_REG2",
  915. .supply_name = "vcc2",
  916. .of_match = of_match_ptr("DCDC_REG2"),
  917. .regulators_node = of_match_ptr("regulators"),
  918. .id = RK817_ID_DCDC2,
  919. .ops = &rk817_buck_ops_range,
  920. .type = REGULATOR_VOLTAGE,
  921. .n_voltages = RK817_BUCK1_SEL_CNT + 1,
  922. .linear_ranges = rk817_buck1_voltage_ranges,
  923. .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
  924. .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
  925. .vsel_mask = RK817_BUCK_VSEL_MASK,
  926. .enable_reg = RK817_POWER_EN_REG(0),
  927. .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
  928. .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
  929. .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
  930. .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC2),
  931. .ramp_mask = RK817_RAMP_RATE_MASK,
  932. .ramp_delay_table = rk817_buck1_4_ramp_table,
  933. .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
  934. .of_map_mode = rk8xx_regulator_of_map_mode,
  935. .owner = THIS_MODULE,
  936. }, {
  937. .name = "DCDC_REG3",
  938. .supply_name = "vcc3",
  939. .of_match = of_match_ptr("DCDC_REG3"),
  940. .regulators_node = of_match_ptr("regulators"),
  941. .id = RK817_ID_DCDC3,
  942. .ops = &rk817_buck_ops_range,
  943. .type = REGULATOR_VOLTAGE,
  944. .n_voltages = RK817_BUCK1_SEL_CNT + 1,
  945. .linear_ranges = rk817_buck1_voltage_ranges,
  946. .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
  947. .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
  948. .vsel_mask = RK817_BUCK_VSEL_MASK,
  949. .enable_reg = RK817_POWER_EN_REG(0),
  950. .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
  951. .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
  952. .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
  953. .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC3),
  954. .ramp_mask = RK817_RAMP_RATE_MASK,
  955. .ramp_delay_table = rk817_buck1_4_ramp_table,
  956. .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
  957. .of_map_mode = rk8xx_regulator_of_map_mode,
  958. .owner = THIS_MODULE,
  959. }, {
  960. .name = "DCDC_REG4",
  961. .supply_name = "vcc4",
  962. .of_match = of_match_ptr("DCDC_REG4"),
  963. .regulators_node = of_match_ptr("regulators"),
  964. .id = RK817_ID_DCDC4,
  965. .ops = &rk817_buck_ops_range,
  966. .type = REGULATOR_VOLTAGE,
  967. .n_voltages = RK817_BUCK3_SEL_CNT + 1,
  968. .linear_ranges = rk817_buck3_voltage_ranges,
  969. .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
  970. .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
  971. .vsel_mask = RK817_BUCK_VSEL_MASK,
  972. .enable_reg = RK817_POWER_EN_REG(0),
  973. .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
  974. .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
  975. .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
  976. .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC4),
  977. .ramp_mask = RK817_RAMP_RATE_MASK,
  978. .ramp_delay_table = rk817_buck1_4_ramp_table,
  979. .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table),
  980. .of_map_mode = rk8xx_regulator_of_map_mode,
  981. .owner = THIS_MODULE,
  982. },
  983. RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,
  984. RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
  985. RK817_POWER_EN_REG(1), ENABLE_MASK(0),
  986. DISABLE_VAL(0), 400),
  987. RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,
  988. RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
  989. RK817_POWER_EN_REG(1), ENABLE_MASK(1),
  990. DISABLE_VAL(1), 400),
  991. RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,
  992. RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
  993. RK817_POWER_EN_REG(1), ENABLE_MASK(2),
  994. DISABLE_VAL(2), 400),
  995. RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,
  996. RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
  997. RK817_POWER_EN_REG(1), ENABLE_MASK(3),
  998. DISABLE_VAL(3), 400),
  999. RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,
  1000. RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
  1001. RK817_POWER_EN_REG(2), ENABLE_MASK(0),
  1002. DISABLE_VAL(0), 400),
  1003. RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,
  1004. RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
  1005. RK817_POWER_EN_REG(2), ENABLE_MASK(1),
  1006. DISABLE_VAL(1), 400),
  1007. RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,
  1008. RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
  1009. RK817_POWER_EN_REG(2), ENABLE_MASK(2),
  1010. DISABLE_VAL(2), 400),
  1011. RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,
  1012. RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
  1013. RK817_POWER_EN_REG(2), ENABLE_MASK(3),
  1014. DISABLE_VAL(3), 400),
  1015. RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,
  1016. RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
  1017. RK817_POWER_EN_REG(3), ENABLE_MASK(0),
  1018. DISABLE_VAL(0), 400),
  1019. RK817_BOOST_DESC(RK817_ID_BOOST, "BOOST", "vcc8", 4700, 5400, 100,
  1020. RK817_BOOST_OTG_CFG, RK817_BOOST_VSEL_MASK,
  1021. RK817_POWER_EN_REG(3), ENABLE_MASK(1), ENABLE_MASK(1),
  1022. DISABLE_VAL(1), 400, 3500 - 5400),
  1023. RK817_DESC_SWITCH(RK817_ID_BOOST_OTG_SW, "OTG_SWITCH", "vcc9",
  1024. RK817_POWER_EN_REG(3), ENABLE_MASK(2),
  1025. DISABLE_VAL(2)),
  1026. };
  1027. static const struct regulator_desc rk818_reg[] = {
  1028. {
  1029. .name = "DCDC_REG1",
  1030. .supply_name = "vcc1",
  1031. .of_match = of_match_ptr("DCDC_REG1"),
  1032. .regulators_node = of_match_ptr("regulators"),
  1033. .id = RK818_ID_DCDC1,
  1034. .ops = &rk808_reg_ops,
  1035. .type = REGULATOR_VOLTAGE,
  1036. .min_uV = 712500,
  1037. .uV_step = 12500,
  1038. .n_voltages = 64,
  1039. .vsel_reg = RK818_BUCK1_ON_VSEL_REG,
  1040. .vsel_mask = RK818_BUCK_VSEL_MASK,
  1041. .enable_reg = RK818_DCDC_EN_REG,
  1042. .enable_mask = BIT(0),
  1043. .owner = THIS_MODULE,
  1044. }, {
  1045. .name = "DCDC_REG2",
  1046. .supply_name = "vcc2",
  1047. .of_match = of_match_ptr("DCDC_REG2"),
  1048. .regulators_node = of_match_ptr("regulators"),
  1049. .id = RK818_ID_DCDC2,
  1050. .ops = &rk808_reg_ops,
  1051. .type = REGULATOR_VOLTAGE,
  1052. .min_uV = 712500,
  1053. .uV_step = 12500,
  1054. .n_voltages = 64,
  1055. .vsel_reg = RK818_BUCK2_ON_VSEL_REG,
  1056. .vsel_mask = RK818_BUCK_VSEL_MASK,
  1057. .enable_reg = RK818_DCDC_EN_REG,
  1058. .enable_mask = BIT(1),
  1059. .owner = THIS_MODULE,
  1060. }, {
  1061. .name = "DCDC_REG3",
  1062. .supply_name = "vcc3",
  1063. .of_match = of_match_ptr("DCDC_REG3"),
  1064. .regulators_node = of_match_ptr("regulators"),
  1065. .id = RK818_ID_DCDC3,
  1066. .ops = &rk808_switch_ops,
  1067. .type = REGULATOR_VOLTAGE,
  1068. .n_voltages = 1,
  1069. .enable_reg = RK818_DCDC_EN_REG,
  1070. .enable_mask = BIT(2),
  1071. .owner = THIS_MODULE,
  1072. },
  1073. RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100,
  1074. RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
  1075. RK818_DCDC_EN_REG, BIT(3), 0),
  1076. RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100,
  1077. RK818_BOOST_LDO9_ON_VSEL_REG, RK818_BOOST_ON_VSEL_MASK,
  1078. RK818_DCDC_EN_REG, BIT(4), 0),
  1079. RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
  1080. RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
  1081. BIT(0), 400),
  1082. RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
  1083. RK818_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
  1084. BIT(1), 400),
  1085. {
  1086. .name = "LDO_REG3",
  1087. .supply_name = "vcc7",
  1088. .of_match = of_match_ptr("LDO_REG3"),
  1089. .regulators_node = of_match_ptr("regulators"),
  1090. .id = RK818_ID_LDO3,
  1091. .ops = &rk808_reg_ops_ranges,
  1092. .type = REGULATOR_VOLTAGE,
  1093. .n_voltages = 16,
  1094. .linear_ranges = rk808_ldo3_voltage_ranges,
  1095. .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
  1096. .vsel_reg = RK818_LDO3_ON_VSEL_REG,
  1097. .vsel_mask = RK818_LDO3_ON_VSEL_MASK,
  1098. .enable_reg = RK818_LDO_EN_REG,
  1099. .enable_mask = BIT(2),
  1100. .enable_time = 400,
  1101. .owner = THIS_MODULE,
  1102. },
  1103. RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100,
  1104. RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
  1105. BIT(3), 400),
  1106. RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100,
  1107. RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
  1108. BIT(4), 400),
  1109. RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100,
  1110. RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
  1111. BIT(5), 400),
  1112. RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
  1113. RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
  1114. BIT(6), 400),
  1115. RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100,
  1116. RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
  1117. BIT(7), 400),
  1118. RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100,
  1119. RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
  1120. RK818_DCDC_EN_REG, BIT(5), 400),
  1121. RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9",
  1122. RK818_DCDC_EN_REG, BIT(6)),
  1123. RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v",
  1124. RK818_H5V_EN_REG, BIT(0)),
  1125. RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb",
  1126. RK818_DCDC_EN_REG, BIT(7)),
  1127. };
  1128. static int rk808_regulator_dt_parse_pdata(struct device *dev,
  1129. struct device *client_dev,
  1130. struct regmap *map,
  1131. struct rk808_regulator_data *pdata)
  1132. {
  1133. struct device_node *np;
  1134. int tmp, ret = 0, i;
  1135. np = of_get_child_by_name(client_dev->of_node, "regulators");
  1136. if (!np)
  1137. return -ENXIO;
  1138. for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
  1139. pdata->dvs_gpio[i] =
  1140. devm_gpiod_get_index_optional(client_dev, "dvs", i,
  1141. GPIOD_OUT_LOW);
  1142. if (IS_ERR(pdata->dvs_gpio[i])) {
  1143. ret = PTR_ERR(pdata->dvs_gpio[i]);
  1144. dev_err(dev, "failed to get dvs%d gpio (%d)\n", i, ret);
  1145. goto dt_parse_end;
  1146. }
  1147. if (!pdata->dvs_gpio[i]) {
  1148. dev_info(dev, "there is no dvs%d gpio\n", i);
  1149. continue;
  1150. }
  1151. tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;
  1152. ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp,
  1153. gpiod_is_active_low(pdata->dvs_gpio[i]) ?
  1154. 0 : tmp);
  1155. }
  1156. dt_parse_end:
  1157. of_node_put(np);
  1158. return ret;
  1159. }
  1160. static int rk808_regulator_probe(struct platform_device *pdev)
  1161. {
  1162. struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
  1163. struct i2c_client *client = rk808->i2c;
  1164. struct regulator_config config = {};
  1165. struct regulator_dev *rk808_rdev;
  1166. struct rk808_regulator_data *pdata;
  1167. const struct regulator_desc *regulators;
  1168. int ret, i, nregulators;
  1169. pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
  1170. if (!pdata)
  1171. return -ENOMEM;
  1172. ret = rk808_regulator_dt_parse_pdata(&pdev->dev, &client->dev,
  1173. rk808->regmap, pdata);
  1174. if (ret < 0)
  1175. return ret;
  1176. platform_set_drvdata(pdev, pdata);
  1177. switch (rk808->variant) {
  1178. case RK805_ID:
  1179. regulators = rk805_reg;
  1180. nregulators = RK805_NUM_REGULATORS;
  1181. break;
  1182. case RK808_ID:
  1183. regulators = rk808_reg;
  1184. nregulators = RK808_NUM_REGULATORS;
  1185. break;
  1186. case RK809_ID:
  1187. regulators = rk809_reg;
  1188. nregulators = RK809_NUM_REGULATORS;
  1189. break;
  1190. case RK817_ID:
  1191. regulators = rk817_reg;
  1192. nregulators = RK817_NUM_REGULATORS;
  1193. break;
  1194. case RK818_ID:
  1195. regulators = rk818_reg;
  1196. nregulators = RK818_NUM_REGULATORS;
  1197. break;
  1198. default:
  1199. dev_err(&client->dev, "unsupported RK8XX ID %lu\n",
  1200. rk808->variant);
  1201. return -EINVAL;
  1202. }
  1203. config.dev = &client->dev;
  1204. config.driver_data = pdata;
  1205. config.regmap = rk808->regmap;
  1206. /* Instantiate the regulators */
  1207. for (i = 0; i < nregulators; i++) {
  1208. rk808_rdev = devm_regulator_register(&pdev->dev,
  1209. &regulators[i], &config);
  1210. if (IS_ERR(rk808_rdev)) {
  1211. dev_err(&client->dev,
  1212. "failed to register %d regulator\n", i);
  1213. return PTR_ERR(rk808_rdev);
  1214. }
  1215. }
  1216. return 0;
  1217. }
  1218. static struct platform_driver rk808_regulator_driver = {
  1219. .probe = rk808_regulator_probe,
  1220. .driver = {
  1221. .name = "rk808-regulator"
  1222. },
  1223. };
  1224. module_platform_driver(rk808_regulator_driver);
  1225. MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK818 series PMICs");
  1226. MODULE_AUTHOR("Tony xie <[email protected]>");
  1227. MODULE_AUTHOR("Chris Zhong <[email protected]>");
  1228. MODULE_AUTHOR("Zhang Qing <[email protected]>");
  1229. MODULE_AUTHOR("Wadim Egorov <[email protected]>");
  1230. MODULE_LICENSE("GPL");
  1231. MODULE_ALIAS("platform:rk808-regulator");