pfuze100.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2017 NXP
  4. *
  5. * Peng Fan <peng.fan@nxp.com>
  6. */
  7. #include <common.h>
  8. #include <fdtdec.h>
  9. #include <errno.h>
  10. #include <dm.h>
  11. #include <i2c.h>
  12. #include <power/pmic.h>
  13. #include <power/regulator.h>
  14. #include <power/pfuze100_pmic.h>
  15. /**
  16. * struct pfuze100_regulator_desc - regulator descriptor
  17. *
  18. * @name: Identify name for the regulator.
  19. * @type: Indicates the regulator type.
  20. * @uV_step: Voltage increase for each selector.
  21. * @vsel_reg: Register for adjust regulator voltage for normal.
  22. * @vsel_mask: Mask bit for setting regulator voltage for normal.
  23. * @stby_reg: Register for adjust regulator voltage for standby.
  24. * @stby_mask: Mask bit for setting regulator voltage for standby.
  25. * @volt_table: Voltage mapping table (if table based mapping).
  26. * @voltage: Current voltage for REGULATOR_TYPE_FIXED type regulator.
  27. */
  28. struct pfuze100_regulator_desc {
  29. char *name;
  30. enum regulator_type type;
  31. unsigned int uV_step;
  32. unsigned int vsel_reg;
  33. unsigned int vsel_mask;
  34. unsigned int stby_reg;
  35. unsigned int stby_mask;
  36. unsigned int *volt_table;
  37. unsigned int voltage;
  38. };
  39. /**
  40. * struct pfuze100_regulator_platdata - platform data for pfuze100
  41. *
  42. * @desc: Points the description entry of one regulator of pfuze100
  43. */
  44. struct pfuze100_regulator_platdata {
  45. struct pfuze100_regulator_desc *desc;
  46. };
  47. #define PFUZE100_FIXED_REG(_name, base, vol) \
  48. { \
  49. .name = #_name, \
  50. .type = REGULATOR_TYPE_FIXED, \
  51. .voltage = (vol), \
  52. }
  53. #define PFUZE100_SW_REG(_name, base, step) \
  54. { \
  55. .name = #_name, \
  56. .type = REGULATOR_TYPE_BUCK, \
  57. .uV_step = (step), \
  58. .vsel_reg = (base) + PFUZE100_VOL_OFFSET, \
  59. .vsel_mask = 0x3F, \
  60. .stby_reg = (base) + PFUZE100_STBY_OFFSET, \
  61. .stby_mask = 0x3F, \
  62. }
  63. #define PFUZE100_SWB_REG(_name, base, mask, step, voltages) \
  64. { \
  65. .name = #_name, \
  66. .type = REGULATOR_TYPE_BUCK, \
  67. .uV_step = (step), \
  68. .vsel_reg = (base), \
  69. .vsel_mask = (mask), \
  70. .volt_table = (voltages), \
  71. }
  72. #define PFUZE100_SNVS_REG(_name, base, mask, voltages) \
  73. { \
  74. .name = #_name, \
  75. .type = REGULATOR_TYPE_OTHER, \
  76. .vsel_reg = (base), \
  77. .vsel_mask = (mask), \
  78. .volt_table = (voltages), \
  79. }
  80. #define PFUZE100_VGEN_REG(_name, base, step) \
  81. { \
  82. .name = #_name, \
  83. .type = REGULATOR_TYPE_LDO, \
  84. .uV_step = (step), \
  85. .vsel_reg = (base), \
  86. .vsel_mask = 0xF, \
  87. .stby_reg = (base), \
  88. .stby_mask = 0x20, \
  89. }
  90. #define PFUZE3000_VCC_REG(_name, base, step) \
  91. { \
  92. .name = #_name, \
  93. .type = REGULATOR_TYPE_LDO, \
  94. .uV_step = (step), \
  95. .vsel_reg = (base), \
  96. .vsel_mask = 0x3, \
  97. .stby_reg = (base), \
  98. .stby_mask = 0x20, \
  99. }
  100. #define PFUZE3000_SW1_REG(_name, base, step) \
  101. { \
  102. .name = #_name, \
  103. .type = REGULATOR_TYPE_BUCK, \
  104. .uV_step = (step), \
  105. .vsel_reg = (base) + PFUZE100_VOL_OFFSET, \
  106. .vsel_mask = 0x1F, \
  107. .stby_reg = (base) + PFUZE100_STBY_OFFSET, \
  108. .stby_mask = 0x1F, \
  109. }
  110. #define PFUZE3000_SW2_REG(_name, base, step) \
  111. { \
  112. .name = #_name, \
  113. .type = REGULATOR_TYPE_BUCK, \
  114. .uV_step = (step), \
  115. .vsel_reg = (base) + PFUZE100_VOL_OFFSET, \
  116. .vsel_mask = 0x7, \
  117. .stby_reg = (base) + PFUZE100_STBY_OFFSET, \
  118. .stby_mask = 0x7, \
  119. }
  120. #define PFUZE3000_SW3_REG(_name, base, step) \
  121. { \
  122. .name = #_name, \
  123. .type = REGULATOR_TYPE_BUCK, \
  124. .uV_step = (step), \
  125. .vsel_reg = (base) + PFUZE100_VOL_OFFSET, \
  126. .vsel_mask = 0xF, \
  127. .stby_reg = (base) + PFUZE100_STBY_OFFSET, \
  128. .stby_mask = 0xF, \
  129. }
  130. static unsigned int pfuze100_swbst[] = {
  131. 5000000, 5050000, 5100000, 5150000
  132. };
  133. static unsigned int pfuze100_vsnvs[] = {
  134. 1000000, 1100000, 1200000, 1300000, 1500000, 1800000, 3000000, -1
  135. };
  136. static unsigned int pfuze3000_vsnvs[] = {
  137. -1, -1, -1, -1, -1, -1, 3000000, -1
  138. };
  139. static unsigned int pfuze3000_sw2lo[] = {
  140. 1500000, 1550000, 1600000, 1650000, 1700000, 1750000, 1800000, 1850000
  141. };
  142. /* PFUZE100 */
  143. static struct pfuze100_regulator_desc pfuze100_regulators[] = {
  144. PFUZE100_SW_REG(sw1ab, PFUZE100_SW1ABVOL, 25000),
  145. PFUZE100_SW_REG(sw1c, PFUZE100_SW1CVOL, 25000),
  146. PFUZE100_SW_REG(sw2, PFUZE100_SW2VOL, 25000),
  147. PFUZE100_SW_REG(sw3a, PFUZE100_SW3AVOL, 25000),
  148. PFUZE100_SW_REG(sw3b, PFUZE100_SW3BVOL, 25000),
  149. PFUZE100_SW_REG(sw4, PFUZE100_SW4VOL, 25000),
  150. PFUZE100_SWB_REG(swbst, PFUZE100_SWBSTCON1, 0x3, 50000, pfuze100_swbst),
  151. PFUZE100_SNVS_REG(vsnvs, PFUZE100_VSNVSVOL, 0x7, pfuze100_vsnvs),
  152. PFUZE100_FIXED_REG(vrefddr, PFUZE100_VREFDDRCON, 750000),
  153. PFUZE100_VGEN_REG(vgen1, PFUZE100_VGEN1VOL, 50000),
  154. PFUZE100_VGEN_REG(vgen2, PFUZE100_VGEN2VOL, 50000),
  155. PFUZE100_VGEN_REG(vgen3, PFUZE100_VGEN3VOL, 100000),
  156. PFUZE100_VGEN_REG(vgen4, PFUZE100_VGEN4VOL, 100000),
  157. PFUZE100_VGEN_REG(vgen5, PFUZE100_VGEN5VOL, 100000),
  158. PFUZE100_VGEN_REG(vgen6, PFUZE100_VGEN6VOL, 100000),
  159. };
  160. /* PFUZE200 */
  161. static struct pfuze100_regulator_desc pfuze200_regulators[] = {
  162. PFUZE100_SW_REG(sw1ab, PFUZE100_SW1ABVOL, 25000),
  163. PFUZE100_SW_REG(sw2, PFUZE100_SW2VOL, 25000),
  164. PFUZE100_SW_REG(sw3a, PFUZE100_SW3AVOL, 25000),
  165. PFUZE100_SW_REG(sw3b, PFUZE100_SW3BVOL, 25000),
  166. PFUZE100_SWB_REG(swbst, PFUZE100_SWBSTCON1, 0x3, 50000, pfuze100_swbst),
  167. PFUZE100_SNVS_REG(vsnvs, PFUZE100_VSNVSVOL, 0x7, pfuze100_vsnvs),
  168. PFUZE100_FIXED_REG(vrefddr, PFUZE100_VREFDDRCON, 750000),
  169. PFUZE100_VGEN_REG(vgen1, PFUZE100_VGEN1VOL, 50000),
  170. PFUZE100_VGEN_REG(vgen2, PFUZE100_VGEN2VOL, 50000),
  171. PFUZE100_VGEN_REG(vgen3, PFUZE100_VGEN3VOL, 100000),
  172. PFUZE100_VGEN_REG(vgen4, PFUZE100_VGEN4VOL, 100000),
  173. PFUZE100_VGEN_REG(vgen5, PFUZE100_VGEN5VOL, 100000),
  174. PFUZE100_VGEN_REG(vgen6, PFUZE100_VGEN6VOL, 100000),
  175. };
  176. /* PFUZE3000 */
  177. static struct pfuze100_regulator_desc pfuze3000_regulators[] = {
  178. PFUZE3000_SW1_REG(sw1a, PFUZE100_SW1ABVOL, 25000),
  179. PFUZE3000_SW1_REG(sw1b, PFUZE100_SW1CVOL, 25000),
  180. PFUZE100_SWB_REG(sw2, PFUZE100_SW2VOL, 0x7, 50000, pfuze3000_sw2lo),
  181. PFUZE3000_SW3_REG(sw3, PFUZE100_SW3AVOL, 50000),
  182. PFUZE100_SWB_REG(swbst, PFUZE100_SWBSTCON1, 0x3, 50000, pfuze100_swbst),
  183. PFUZE100_SNVS_REG(vsnvs, PFUZE100_VSNVSVOL, 0x7, pfuze3000_vsnvs),
  184. PFUZE100_FIXED_REG(vrefddr, PFUZE100_VREFDDRCON, 750000),
  185. PFUZE100_VGEN_REG(vldo1, PFUZE100_VGEN1VOL, 100000),
  186. PFUZE100_VGEN_REG(vldo2, PFUZE100_VGEN2VOL, 50000),
  187. PFUZE3000_VCC_REG(vccsd, PFUZE100_VGEN3VOL, 150000),
  188. PFUZE3000_VCC_REG(v33, PFUZE100_VGEN4VOL, 150000),
  189. PFUZE100_VGEN_REG(vldo3, PFUZE100_VGEN5VOL, 100000),
  190. PFUZE100_VGEN_REG(vldo4, PFUZE100_VGEN6VOL, 100000),
  191. };
  192. #define MODE(_id, _val, _name) { \
  193. .id = _id, \
  194. .register_value = _val, \
  195. .name = _name, \
  196. }
  197. /* SWx Buck regulator mode */
  198. static struct dm_regulator_mode pfuze_sw_modes[] = {
  199. MODE(OFF_OFF, OFF_OFF, "OFF_OFF"),
  200. MODE(PWM_OFF, PWM_OFF, "PWM_OFF"),
  201. MODE(PFM_OFF, PFM_OFF, "PFM_OFF"),
  202. MODE(APS_OFF, APS_OFF, "APS_OFF"),
  203. MODE(PWM_PWM, PWM_PWM, "PWM_PWM"),
  204. MODE(PWM_APS, PWM_APS, "PWM_APS"),
  205. MODE(APS_APS, APS_APS, "APS_APS"),
  206. MODE(APS_PFM, APS_PFM, "APS_PFM"),
  207. MODE(PWM_PFM, PWM_PFM, "PWM_PFM"),
  208. };
  209. /* Boost Buck regulator mode for normal operation */
  210. static struct dm_regulator_mode pfuze_swbst_modes[] = {
  211. MODE(SWBST_MODE_OFF, SWBST_MODE_OFF , "SWBST_MODE_OFF"),
  212. MODE(SWBST_MODE_PFM, SWBST_MODE_PFM, "SWBST_MODE_PFM"),
  213. MODE(SWBST_MODE_AUTO, SWBST_MODE_AUTO, "SWBST_MODE_AUTO"),
  214. MODE(SWBST_MODE_APS, SWBST_MODE_APS, "SWBST_MODE_APS"),
  215. };
  216. /* VGENx LDO regulator mode for normal operation */
  217. static struct dm_regulator_mode pfuze_ldo_modes[] = {
  218. MODE(LDO_MODE_OFF, LDO_MODE_OFF, "LDO_MODE_OFF"),
  219. MODE(LDO_MODE_ON, LDO_MODE_ON, "LDO_MODE_ON"),
  220. };
  221. static struct pfuze100_regulator_desc *se_desc(struct pfuze100_regulator_desc *desc,
  222. int size,
  223. const char *name)
  224. {
  225. int i;
  226. for (i = 0; i < size; desc++) {
  227. if (!strcmp(desc->name, name))
  228. return desc;
  229. continue;
  230. }
  231. return NULL;
  232. }
  233. static int pfuze100_regulator_probe(struct udevice *dev)
  234. {
  235. struct dm_regulator_uclass_platdata *uc_pdata;
  236. struct pfuze100_regulator_platdata *plat = dev_get_platdata(dev);
  237. struct pfuze100_regulator_desc *desc;
  238. switch (dev_get_driver_data(dev_get_parent(dev))) {
  239. case PFUZE100:
  240. desc = se_desc(pfuze100_regulators,
  241. ARRAY_SIZE(pfuze100_regulators),
  242. dev->name);
  243. break;
  244. case PFUZE200:
  245. desc = se_desc(pfuze200_regulators,
  246. ARRAY_SIZE(pfuze200_regulators),
  247. dev->name);
  248. break;
  249. case PFUZE3000:
  250. desc = se_desc(pfuze3000_regulators,
  251. ARRAY_SIZE(pfuze3000_regulators),
  252. dev->name);
  253. break;
  254. default:
  255. debug("Unsupported PFUZE\n");
  256. return -EINVAL;
  257. }
  258. if (!desc) {
  259. debug("Do not support regulator %s\n", dev->name);
  260. return -EINVAL;
  261. }
  262. plat->desc = desc;
  263. uc_pdata = dev_get_uclass_platdata(dev);
  264. uc_pdata->type = desc->type;
  265. if (uc_pdata->type == REGULATOR_TYPE_BUCK) {
  266. if (!strcmp(dev->name, "swbst")) {
  267. uc_pdata->mode = pfuze_swbst_modes;
  268. uc_pdata->mode_count = ARRAY_SIZE(pfuze_swbst_modes);
  269. } else {
  270. uc_pdata->mode = pfuze_sw_modes;
  271. uc_pdata->mode_count = ARRAY_SIZE(pfuze_sw_modes);
  272. }
  273. } else if (uc_pdata->type == REGULATOR_TYPE_LDO) {
  274. uc_pdata->mode = pfuze_ldo_modes;
  275. uc_pdata->mode_count = ARRAY_SIZE(pfuze_ldo_modes);
  276. } else {
  277. uc_pdata->mode = NULL;
  278. uc_pdata->mode_count = 0;
  279. }
  280. return 0;
  281. }
  282. static int pfuze100_regulator_mode(struct udevice *dev, int op, int *opmode)
  283. {
  284. int val;
  285. struct pfuze100_regulator_platdata *plat = dev_get_platdata(dev);
  286. struct pfuze100_regulator_desc *desc = plat->desc;
  287. if (op == PMIC_OP_GET) {
  288. if (desc->type == REGULATOR_TYPE_BUCK) {
  289. if (!strcmp(dev->name, "swbst")) {
  290. val = pmic_reg_read(dev->parent,
  291. desc->vsel_reg);
  292. if (val < 0)
  293. return val;
  294. val &= SWBST_MODE_MASK;
  295. val >>= SWBST_MODE_SHIFT;
  296. *opmode = val;
  297. return 0;
  298. }
  299. val = pmic_reg_read(dev->parent,
  300. desc->vsel_reg +
  301. PFUZE100_MODE_OFFSET);
  302. if (val < 0)
  303. return val;
  304. val &= SW_MODE_MASK;
  305. val >>= SW_MODE_SHIFT;
  306. *opmode = val;
  307. return 0;
  308. } else if (desc->type == REGULATOR_TYPE_LDO) {
  309. val = pmic_reg_read(dev->parent, desc->vsel_reg);
  310. if (val < 0)
  311. return val;
  312. val &= LDO_MODE_MASK;
  313. val >>= LDO_MODE_SHIFT;
  314. *opmode = val;
  315. return 0;
  316. } else {
  317. return -EINVAL;
  318. }
  319. }
  320. if (desc->type == REGULATOR_TYPE_BUCK) {
  321. if (!strcmp(dev->name, "swbst"))
  322. return pmic_clrsetbits(dev->parent, desc->vsel_reg,
  323. SWBST_MODE_MASK,
  324. *opmode << SWBST_MODE_SHIFT);
  325. val = pmic_clrsetbits(dev->parent,
  326. desc->vsel_reg + PFUZE100_MODE_OFFSET,
  327. SW_MODE_MASK,
  328. *opmode << SW_MODE_SHIFT);
  329. } else if (desc->type == REGULATOR_TYPE_LDO) {
  330. val = pmic_clrsetbits(dev->parent, desc->vsel_reg,
  331. LDO_MODE_MASK,
  332. *opmode << LDO_MODE_SHIFT);
  333. return val;
  334. } else {
  335. return -EINVAL;
  336. }
  337. return 0;
  338. }
  339. static int pfuze100_regulator_enable(struct udevice *dev, int op, bool *enable)
  340. {
  341. int val;
  342. int ret, on_off;
  343. struct dm_regulator_uclass_platdata *uc_pdata =
  344. dev_get_uclass_platdata(dev);
  345. if (op == PMIC_OP_GET) {
  346. if (!strcmp(dev->name, "vrefddr")) {
  347. val = pmic_reg_read(dev->parent, PFUZE100_VREFDDRCON);
  348. if (val < 0)
  349. return val;
  350. if (val & VREFDDRCON_EN)
  351. *enable = true;
  352. else
  353. *enable = false;
  354. return 0;
  355. }
  356. ret = pfuze100_regulator_mode(dev, op, &on_off);
  357. if (ret)
  358. return ret;
  359. switch (on_off) {
  360. /* OFF_OFF, SWBST_MODE_OFF, LDO_MODE_OFF have same value */
  361. case OFF_OFF:
  362. *enable = false;
  363. break;
  364. default:
  365. *enable = true;
  366. break;
  367. }
  368. } else if (op == PMIC_OP_SET) {
  369. if (!strcmp(dev->name, "vrefddr")) {
  370. val = pmic_reg_read(dev->parent, PFUZE100_VREFDDRCON);
  371. if (val < 0)
  372. return val;
  373. if (val & VREFDDRCON_EN)
  374. return 0;
  375. val |= VREFDDRCON_EN;
  376. return pmic_reg_write(dev->parent, PFUZE100_VREFDDRCON,
  377. val);
  378. }
  379. if (uc_pdata->type == REGULATOR_TYPE_LDO) {
  380. on_off = *enable ? LDO_MODE_ON : LDO_MODE_OFF;
  381. } else if (uc_pdata->type == REGULATOR_TYPE_BUCK) {
  382. if (!strcmp(dev->name, "swbst"))
  383. on_off = *enable ? SWBST_MODE_AUTO :
  384. SWBST_MODE_OFF;
  385. else
  386. on_off = *enable ? APS_PFM : OFF_OFF;
  387. } else {
  388. return -EINVAL;
  389. }
  390. return pfuze100_regulator_mode(dev, op, &on_off);
  391. }
  392. return 0;
  393. }
  394. static int pfuze100_regulator_val(struct udevice *dev, int op, int *uV)
  395. {
  396. int i;
  397. int val;
  398. struct pfuze100_regulator_platdata *plat = dev_get_platdata(dev);
  399. struct pfuze100_regulator_desc *desc = plat->desc;
  400. struct dm_regulator_uclass_platdata *uc_pdata =
  401. dev_get_uclass_platdata(dev);
  402. if (op == PMIC_OP_GET) {
  403. *uV = 0;
  404. if (uc_pdata->type == REGULATOR_TYPE_FIXED) {
  405. *uV = desc->voltage;
  406. } else if (desc->volt_table) {
  407. val = pmic_reg_read(dev->parent, desc->vsel_reg);
  408. if (val < 0)
  409. return val;
  410. val &= desc->vsel_mask;
  411. *uV = desc->volt_table[val];
  412. } else {
  413. if (uc_pdata->min_uV < 0) {
  414. debug("Need to provide min_uV in dts.\n");
  415. return -EINVAL;
  416. }
  417. val = pmic_reg_read(dev->parent, desc->vsel_reg);
  418. if (val < 0)
  419. return val;
  420. val &= desc->vsel_mask;
  421. *uV = uc_pdata->min_uV + (int)val * desc->uV_step;
  422. }
  423. return 0;
  424. }
  425. if (uc_pdata->type == REGULATOR_TYPE_FIXED) {
  426. debug("Set voltage for REGULATOR_TYPE_FIXED regulator\n");
  427. return -EINVAL;
  428. } else if (desc->volt_table) {
  429. for (i = 0; i < desc->vsel_mask; i++) {
  430. if (*uV == desc->volt_table[i])
  431. break;
  432. }
  433. if (i == desc->vsel_mask) {
  434. debug("Unsupported voltage %u\n", *uV);
  435. return -EINVAL;
  436. }
  437. return pmic_clrsetbits(dev->parent, desc->vsel_reg,
  438. desc->vsel_mask, i);
  439. } else {
  440. if (uc_pdata->min_uV < 0) {
  441. debug("Need to provide min_uV in dts.\n");
  442. return -EINVAL;
  443. }
  444. return pmic_clrsetbits(dev->parent, desc->vsel_reg,
  445. desc->vsel_mask,
  446. (*uV - uc_pdata->min_uV) / desc->uV_step);
  447. }
  448. return 0;
  449. }
  450. static int pfuze100_regulator_get_value(struct udevice *dev)
  451. {
  452. int uV;
  453. int ret;
  454. ret = pfuze100_regulator_val(dev, PMIC_OP_GET, &uV);
  455. if (ret)
  456. return ret;
  457. return uV;
  458. }
  459. static int pfuze100_regulator_set_value(struct udevice *dev, int uV)
  460. {
  461. return pfuze100_regulator_val(dev, PMIC_OP_SET, &uV);
  462. }
  463. static int pfuze100_regulator_get_enable(struct udevice *dev)
  464. {
  465. int ret;
  466. bool enable = false;
  467. ret = pfuze100_regulator_enable(dev, PMIC_OP_GET, &enable);
  468. if (ret)
  469. return ret;
  470. return enable;
  471. }
  472. static int pfuze100_regulator_set_enable(struct udevice *dev, bool enable)
  473. {
  474. return pfuze100_regulator_enable(dev, PMIC_OP_SET, &enable);
  475. }
  476. static int pfuze100_regulator_get_mode(struct udevice *dev)
  477. {
  478. int mode;
  479. int ret;
  480. ret = pfuze100_regulator_mode(dev, PMIC_OP_GET, &mode);
  481. if (ret)
  482. return ret;
  483. return mode;
  484. }
  485. static int pfuze100_regulator_set_mode(struct udevice *dev, int mode)
  486. {
  487. return pfuze100_regulator_mode(dev, PMIC_OP_SET, &mode);
  488. }
  489. static const struct dm_regulator_ops pfuze100_regulator_ops = {
  490. .get_value = pfuze100_regulator_get_value,
  491. .set_value = pfuze100_regulator_set_value,
  492. .get_enable = pfuze100_regulator_get_enable,
  493. .set_enable = pfuze100_regulator_set_enable,
  494. .get_mode = pfuze100_regulator_get_mode,
  495. .set_mode = pfuze100_regulator_set_mode,
  496. };
  497. U_BOOT_DRIVER(pfuze100_regulator) = {
  498. .name = "pfuze100_regulator",
  499. .id = UCLASS_REGULATOR,
  500. .ops = &pfuze100_regulator_ops,
  501. .probe = pfuze100_regulator_probe,
  502. .platdata_auto_alloc_size = sizeof(struct pfuze100_regulator_platdata),
  503. };