max77802-regulator.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. // SPDX-License-Identifier: GPL-2.0+
  2. //
  3. // max77802.c - Regulator driver for the Maxim 77802
  4. //
  5. // Copyright (C) 2013-2014 Google, Inc
  6. // Simon Glass <sjg@chromium.org>
  7. //
  8. // Copyright (C) 2012 Samsung Electronics
  9. // Chiwoong Byun <woong.byun@samsung.com>
  10. // Jonghwa Lee <jonghwa3.lee@samsung.com>
  11. //
  12. // This driver is based on max8997.c
  13. #include <linux/kernel.h>
  14. #include <linux/bug.h>
  15. #include <linux/err.h>
  16. #include <linux/slab.h>
  17. #include <linux/module.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/regulator/driver.h>
  20. #include <linux/regulator/machine.h>
  21. #include <linux/regulator/of_regulator.h>
  22. #include <linux/mfd/max77686.h>
  23. #include <linux/mfd/max77686-private.h>
  24. #include <dt-bindings/regulator/maxim,max77802.h>
  25. /* Default ramp delay in case it is not manually set */
  26. #define MAX77802_RAMP_DELAY 100000 /* uV/us */
  27. #define MAX77802_OPMODE_SHIFT_LDO 6
  28. #define MAX77802_OPMODE_BUCK234_SHIFT 4
  29. #define MAX77802_OPMODE_MASK 0x3
  30. #define MAX77802_VSEL_MASK 0x3F
  31. #define MAX77802_DVS_VSEL_MASK 0xFF
  32. #define MAX77802_RAMP_RATE_MASK_2BIT 0xC0
  33. #define MAX77802_RAMP_RATE_SHIFT_2BIT 6
  34. #define MAX77802_RAMP_RATE_MASK_4BIT 0xF0
  35. #define MAX77802_RAMP_RATE_SHIFT_4BIT 4
  36. #define MAX77802_STATUS_OFF 0x0
  37. #define MAX77802_OFF_PWRREQ 0x1
  38. #define MAX77802_LP_PWRREQ 0x2
  39. /* MAX77802 has two register formats: 2-bit and 4-bit */
  40. static const unsigned int ramp_table_77802_2bit[] = {
  41. 12500,
  42. 25000,
  43. 50000,
  44. 100000,
  45. };
  46. static unsigned int ramp_table_77802_4bit[] = {
  47. 1000, 2000, 3030, 4000,
  48. 5000, 5880, 7140, 8330,
  49. 9090, 10000, 11110, 12500,
  50. 16670, 25000, 50000, 100000,
  51. };
  52. struct max77802_regulator_prv {
  53. /* Array indexed by regulator id */
  54. unsigned int opmode[MAX77802_REG_MAX];
  55. };
  56. static inline unsigned int max77802_map_mode(unsigned int mode)
  57. {
  58. return mode == MAX77802_OPMODE_NORMAL ?
  59. REGULATOR_MODE_NORMAL : REGULATOR_MODE_STANDBY;
  60. }
  61. static int max77802_get_opmode_shift(int id)
  62. {
  63. if (id == MAX77802_BUCK1 || (id >= MAX77802_BUCK5 &&
  64. id <= MAX77802_BUCK10))
  65. return 0;
  66. if (id >= MAX77802_BUCK2 && id <= MAX77802_BUCK4)
  67. return MAX77802_OPMODE_BUCK234_SHIFT;
  68. if (id >= MAX77802_LDO1 && id <= MAX77802_LDO35)
  69. return MAX77802_OPMODE_SHIFT_LDO;
  70. return -EINVAL;
  71. }
  72. /**
  73. * max77802_set_suspend_disable - Disable the regulator during system suspend
  74. * @rdev: regulator to mark as disabled
  75. *
  76. * All regulators expect LDO 1, 3, 20 and 21 support OFF by PWRREQ.
  77. * Configure the regulator so the PMIC will turn it OFF during system suspend.
  78. */
  79. static int max77802_set_suspend_disable(struct regulator_dev *rdev)
  80. {
  81. unsigned int val = MAX77802_OFF_PWRREQ;
  82. struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
  83. int id = rdev_get_id(rdev);
  84. int shift = max77802_get_opmode_shift(id);
  85. max77802->opmode[id] = val;
  86. return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  87. rdev->desc->enable_mask, val << shift);
  88. }
  89. /*
  90. * Some LDOs support Low Power Mode while the system is running.
  91. *
  92. * LDOs 1, 3, 20, 21.
  93. */
  94. static int max77802_set_mode(struct regulator_dev *rdev, unsigned int mode)
  95. {
  96. struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
  97. int id = rdev_get_id(rdev);
  98. unsigned int val;
  99. int shift = max77802_get_opmode_shift(id);
  100. switch (mode) {
  101. case REGULATOR_MODE_STANDBY:
  102. val = MAX77802_OPMODE_LP; /* ON in Low Power Mode */
  103. break;
  104. case REGULATOR_MODE_NORMAL:
  105. val = MAX77802_OPMODE_NORMAL; /* ON in Normal Mode */
  106. break;
  107. default:
  108. dev_warn(&rdev->dev, "%s: regulator mode: 0x%x not supported\n",
  109. rdev->desc->name, mode);
  110. return -EINVAL;
  111. }
  112. max77802->opmode[id] = val;
  113. return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  114. rdev->desc->enable_mask, val << shift);
  115. }
  116. static unsigned max77802_get_mode(struct regulator_dev *rdev)
  117. {
  118. struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
  119. int id = rdev_get_id(rdev);
  120. return max77802_map_mode(max77802->opmode[id]);
  121. }
  122. /**
  123. * max77802_set_suspend_mode - set regulator opmode when the system is suspended
  124. * @rdev: regulator to change mode
  125. * @mode: operating mode to be set
  126. *
  127. * Will set the operating mode for the regulators during system suspend.
  128. * This function is valid for the three different enable control logics:
  129. *
  130. * Enable Control Logic1 by PWRREQ (BUCK 2-4 and LDOs 2, 4-19, 22-35)
  131. * Enable Control Logic2 by PWRREQ (LDOs 1, 20, 21)
  132. * Enable Control Logic3 by PWRREQ (LDO 3)
  133. *
  134. * If setting the regulator mode fails, the function only warns but does
  135. * not return an error code to avoid the regulator core to stop setting
  136. * the operating mode for the remaining regulators.
  137. */
  138. static int max77802_set_suspend_mode(struct regulator_dev *rdev,
  139. unsigned int mode)
  140. {
  141. struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
  142. int id = rdev_get_id(rdev);
  143. unsigned int val;
  144. int shift = max77802_get_opmode_shift(id);
  145. /*
  146. * If the regulator has been disabled for suspend
  147. * then is invalid to try setting a suspend mode.
  148. */
  149. if (max77802->opmode[id] == MAX77802_OFF_PWRREQ) {
  150. dev_warn(&rdev->dev, "%s: is disabled, mode: 0x%x not set\n",
  151. rdev->desc->name, mode);
  152. return 0;
  153. }
  154. switch (mode) {
  155. case REGULATOR_MODE_STANDBY:
  156. /*
  157. * If the regulator opmode is normal then enable
  158. * ON in Low Power Mode by PWRREQ. If the mode is
  159. * already Low Power then no action is required.
  160. */
  161. if (max77802->opmode[id] == MAX77802_OPMODE_NORMAL)
  162. val = MAX77802_LP_PWRREQ;
  163. else
  164. return 0;
  165. break;
  166. case REGULATOR_MODE_NORMAL:
  167. /*
  168. * If the regulator operating mode is Low Power then
  169. * normal is not a valid opmode in suspend. If the
  170. * mode is already normal then no action is required.
  171. */
  172. if (max77802->opmode[id] == MAX77802_OPMODE_LP)
  173. dev_warn(&rdev->dev, "%s: in Low Power: 0x%x invalid\n",
  174. rdev->desc->name, mode);
  175. return 0;
  176. default:
  177. dev_warn(&rdev->dev, "%s: regulator mode: 0x%x not supported\n",
  178. rdev->desc->name, mode);
  179. return -EINVAL;
  180. }
  181. return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  182. rdev->desc->enable_mask, val << shift);
  183. }
  184. static int max77802_enable(struct regulator_dev *rdev)
  185. {
  186. struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev);
  187. int id = rdev_get_id(rdev);
  188. int shift = max77802_get_opmode_shift(id);
  189. if (max77802->opmode[id] == MAX77802_OFF_PWRREQ)
  190. max77802->opmode[id] = MAX77802_OPMODE_NORMAL;
  191. return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  192. rdev->desc->enable_mask,
  193. max77802->opmode[id] << shift);
  194. }
  195. static int max77802_find_ramp_value(struct regulator_dev *rdev,
  196. const unsigned int limits[], int size,
  197. unsigned int ramp_delay)
  198. {
  199. int i;
  200. for (i = 0; i < size; i++) {
  201. if (ramp_delay <= limits[i])
  202. return i;
  203. }
  204. /* Use maximum value for no ramp control */
  205. dev_warn(&rdev->dev, "%s: ramp_delay: %d not supported, setting 100000\n",
  206. rdev->desc->name, ramp_delay);
  207. return size - 1;
  208. }
  209. /* Used for BUCKs 2-4 */
  210. static int max77802_set_ramp_delay_2bit(struct regulator_dev *rdev,
  211. int ramp_delay)
  212. {
  213. int id = rdev_get_id(rdev);
  214. unsigned int ramp_value;
  215. if (id > MAX77802_BUCK4) {
  216. dev_warn(&rdev->dev,
  217. "%s: regulator: ramp delay not supported\n",
  218. rdev->desc->name);
  219. return -EINVAL;
  220. }
  221. ramp_value = max77802_find_ramp_value(rdev, ramp_table_77802_2bit,
  222. ARRAY_SIZE(ramp_table_77802_2bit), ramp_delay);
  223. return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  224. MAX77802_RAMP_RATE_MASK_2BIT,
  225. ramp_value << MAX77802_RAMP_RATE_SHIFT_2BIT);
  226. }
  227. /* For BUCK1, 6 */
  228. static int max77802_set_ramp_delay_4bit(struct regulator_dev *rdev,
  229. int ramp_delay)
  230. {
  231. unsigned int ramp_value;
  232. ramp_value = max77802_find_ramp_value(rdev, ramp_table_77802_4bit,
  233. ARRAY_SIZE(ramp_table_77802_4bit), ramp_delay);
  234. return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  235. MAX77802_RAMP_RATE_MASK_4BIT,
  236. ramp_value << MAX77802_RAMP_RATE_SHIFT_4BIT);
  237. }
  238. /*
  239. * LDOs 2, 4-19, 22-35
  240. */
  241. static const struct regulator_ops max77802_ldo_ops_logic1 = {
  242. .list_voltage = regulator_list_voltage_linear,
  243. .map_voltage = regulator_map_voltage_linear,
  244. .is_enabled = regulator_is_enabled_regmap,
  245. .enable = max77802_enable,
  246. .disable = regulator_disable_regmap,
  247. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  248. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  249. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  250. .set_suspend_disable = max77802_set_suspend_disable,
  251. .set_suspend_mode = max77802_set_suspend_mode,
  252. };
  253. /*
  254. * LDOs 1, 20, 21, 3
  255. */
  256. static const struct regulator_ops max77802_ldo_ops_logic2 = {
  257. .list_voltage = regulator_list_voltage_linear,
  258. .map_voltage = regulator_map_voltage_linear,
  259. .is_enabled = regulator_is_enabled_regmap,
  260. .enable = max77802_enable,
  261. .disable = regulator_disable_regmap,
  262. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  263. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  264. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  265. .set_mode = max77802_set_mode,
  266. .get_mode = max77802_get_mode,
  267. .set_suspend_mode = max77802_set_suspend_mode,
  268. };
  269. /* BUCKS 1, 6 */
  270. static const struct regulator_ops max77802_buck_16_dvs_ops = {
  271. .list_voltage = regulator_list_voltage_linear,
  272. .map_voltage = regulator_map_voltage_linear,
  273. .is_enabled = regulator_is_enabled_regmap,
  274. .enable = max77802_enable,
  275. .disable = regulator_disable_regmap,
  276. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  277. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  278. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  279. .set_ramp_delay = max77802_set_ramp_delay_4bit,
  280. .set_suspend_disable = max77802_set_suspend_disable,
  281. };
  282. /* BUCKs 2-4 */
  283. static const struct regulator_ops max77802_buck_234_ops = {
  284. .list_voltage = regulator_list_voltage_linear,
  285. .map_voltage = regulator_map_voltage_linear,
  286. .is_enabled = regulator_is_enabled_regmap,
  287. .enable = max77802_enable,
  288. .disable = regulator_disable_regmap,
  289. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  290. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  291. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  292. .set_ramp_delay = max77802_set_ramp_delay_2bit,
  293. .set_suspend_disable = max77802_set_suspend_disable,
  294. .set_suspend_mode = max77802_set_suspend_mode,
  295. };
  296. /* BUCKs 5, 7-10 */
  297. static const struct regulator_ops max77802_buck_dvs_ops = {
  298. .list_voltage = regulator_list_voltage_linear,
  299. .map_voltage = regulator_map_voltage_linear,
  300. .is_enabled = regulator_is_enabled_regmap,
  301. .enable = max77802_enable,
  302. .disable = regulator_disable_regmap,
  303. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  304. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  305. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  306. .set_ramp_delay = max77802_set_ramp_delay_2bit,
  307. .set_suspend_disable = max77802_set_suspend_disable,
  308. };
  309. /* LDOs 3-7, 9-14, 18-26, 28, 29, 32-34 */
  310. #define regulator_77802_desc_p_ldo(num, supply, log) { \
  311. .name = "LDO"#num, \
  312. .of_match = of_match_ptr("LDO"#num), \
  313. .regulators_node = of_match_ptr("regulators"), \
  314. .id = MAX77802_LDO##num, \
  315. .supply_name = "inl"#supply, \
  316. .ops = &max77802_ldo_ops_logic##log, \
  317. .type = REGULATOR_VOLTAGE, \
  318. .owner = THIS_MODULE, \
  319. .min_uV = 800000, \
  320. .uV_step = 50000, \
  321. .ramp_delay = MAX77802_RAMP_DELAY, \
  322. .n_voltages = 1 << 6, \
  323. .vsel_reg = MAX77802_REG_LDO1CTRL1 + num - 1, \
  324. .vsel_mask = MAX77802_VSEL_MASK, \
  325. .enable_reg = MAX77802_REG_LDO1CTRL1 + num - 1, \
  326. .enable_mask = MAX77802_OPMODE_MASK << MAX77802_OPMODE_SHIFT_LDO, \
  327. .of_map_mode = max77802_map_mode, \
  328. }
  329. /* LDOs 1, 2, 8, 15, 17, 27, 30, 35 */
  330. #define regulator_77802_desc_n_ldo(num, supply, log) { \
  331. .name = "LDO"#num, \
  332. .of_match = of_match_ptr("LDO"#num), \
  333. .regulators_node = of_match_ptr("regulators"), \
  334. .id = MAX77802_LDO##num, \
  335. .supply_name = "inl"#supply, \
  336. .ops = &max77802_ldo_ops_logic##log, \
  337. .type = REGULATOR_VOLTAGE, \
  338. .owner = THIS_MODULE, \
  339. .min_uV = 800000, \
  340. .uV_step = 25000, \
  341. .ramp_delay = MAX77802_RAMP_DELAY, \
  342. .n_voltages = 1 << 6, \
  343. .vsel_reg = MAX77802_REG_LDO1CTRL1 + num - 1, \
  344. .vsel_mask = MAX77802_VSEL_MASK, \
  345. .enable_reg = MAX77802_REG_LDO1CTRL1 + num - 1, \
  346. .enable_mask = MAX77802_OPMODE_MASK << MAX77802_OPMODE_SHIFT_LDO, \
  347. .of_map_mode = max77802_map_mode, \
  348. }
  349. /* BUCKs 1, 6 */
  350. #define regulator_77802_desc_16_buck(num) { \
  351. .name = "BUCK"#num, \
  352. .of_match = of_match_ptr("BUCK"#num), \
  353. .regulators_node = of_match_ptr("regulators"), \
  354. .id = MAX77802_BUCK##num, \
  355. .supply_name = "inb"#num, \
  356. .ops = &max77802_buck_16_dvs_ops, \
  357. .type = REGULATOR_VOLTAGE, \
  358. .owner = THIS_MODULE, \
  359. .min_uV = 612500, \
  360. .uV_step = 6250, \
  361. .ramp_delay = MAX77802_RAMP_DELAY, \
  362. .n_voltages = 1 << 8, \
  363. .vsel_reg = MAX77802_REG_BUCK ## num ## DVS1, \
  364. .vsel_mask = MAX77802_DVS_VSEL_MASK, \
  365. .enable_reg = MAX77802_REG_BUCK ## num ## CTRL, \
  366. .enable_mask = MAX77802_OPMODE_MASK, \
  367. .of_map_mode = max77802_map_mode, \
  368. }
  369. /* BUCKS 2-4 */
  370. #define regulator_77802_desc_234_buck(num) { \
  371. .name = "BUCK"#num, \
  372. .of_match = of_match_ptr("BUCK"#num), \
  373. .regulators_node = of_match_ptr("regulators"), \
  374. .id = MAX77802_BUCK##num, \
  375. .supply_name = "inb"#num, \
  376. .ops = &max77802_buck_234_ops, \
  377. .type = REGULATOR_VOLTAGE, \
  378. .owner = THIS_MODULE, \
  379. .min_uV = 600000, \
  380. .uV_step = 6250, \
  381. .ramp_delay = MAX77802_RAMP_DELAY, \
  382. .n_voltages = 0x91, \
  383. .vsel_reg = MAX77802_REG_BUCK ## num ## DVS1, \
  384. .vsel_mask = MAX77802_DVS_VSEL_MASK, \
  385. .enable_reg = MAX77802_REG_BUCK ## num ## CTRL1, \
  386. .enable_mask = MAX77802_OPMODE_MASK << \
  387. MAX77802_OPMODE_BUCK234_SHIFT, \
  388. .of_map_mode = max77802_map_mode, \
  389. }
  390. /* BUCK 5 */
  391. #define regulator_77802_desc_buck5(num) { \
  392. .name = "BUCK"#num, \
  393. .of_match = of_match_ptr("BUCK"#num), \
  394. .regulators_node = of_match_ptr("regulators"), \
  395. .id = MAX77802_BUCK##num, \
  396. .supply_name = "inb"#num, \
  397. .ops = &max77802_buck_dvs_ops, \
  398. .type = REGULATOR_VOLTAGE, \
  399. .owner = THIS_MODULE, \
  400. .min_uV = 750000, \
  401. .uV_step = 50000, \
  402. .ramp_delay = MAX77802_RAMP_DELAY, \
  403. .n_voltages = 1 << 6, \
  404. .vsel_reg = MAX77802_REG_BUCK5OUT, \
  405. .vsel_mask = MAX77802_VSEL_MASK, \
  406. .enable_reg = MAX77802_REG_BUCK5CTRL, \
  407. .enable_mask = MAX77802_OPMODE_MASK, \
  408. .of_map_mode = max77802_map_mode, \
  409. }
  410. /* BUCKs 7-10 */
  411. #define regulator_77802_desc_buck7_10(num) { \
  412. .name = "BUCK"#num, \
  413. .of_match = of_match_ptr("BUCK"#num), \
  414. .regulators_node = of_match_ptr("regulators"), \
  415. .id = MAX77802_BUCK##num, \
  416. .supply_name = "inb"#num, \
  417. .ops = &max77802_buck_dvs_ops, \
  418. .type = REGULATOR_VOLTAGE, \
  419. .owner = THIS_MODULE, \
  420. .min_uV = 750000, \
  421. .uV_step = 50000, \
  422. .ramp_delay = MAX77802_RAMP_DELAY, \
  423. .n_voltages = 1 << 6, \
  424. .vsel_reg = MAX77802_REG_BUCK7OUT + (num - 7) * 3, \
  425. .vsel_mask = MAX77802_VSEL_MASK, \
  426. .enable_reg = MAX77802_REG_BUCK7CTRL + (num - 7) * 3, \
  427. .enable_mask = MAX77802_OPMODE_MASK, \
  428. .of_map_mode = max77802_map_mode, \
  429. }
  430. static const struct regulator_desc regulators[] = {
  431. regulator_77802_desc_16_buck(1),
  432. regulator_77802_desc_234_buck(2),
  433. regulator_77802_desc_234_buck(3),
  434. regulator_77802_desc_234_buck(4),
  435. regulator_77802_desc_buck5(5),
  436. regulator_77802_desc_16_buck(6),
  437. regulator_77802_desc_buck7_10(7),
  438. regulator_77802_desc_buck7_10(8),
  439. regulator_77802_desc_buck7_10(9),
  440. regulator_77802_desc_buck7_10(10),
  441. regulator_77802_desc_n_ldo(1, 10, 2),
  442. regulator_77802_desc_n_ldo(2, 10, 1),
  443. regulator_77802_desc_p_ldo(3, 3, 2),
  444. regulator_77802_desc_p_ldo(4, 6, 1),
  445. regulator_77802_desc_p_ldo(5, 3, 1),
  446. regulator_77802_desc_p_ldo(6, 3, 1),
  447. regulator_77802_desc_p_ldo(7, 3, 1),
  448. regulator_77802_desc_n_ldo(8, 1, 1),
  449. regulator_77802_desc_p_ldo(9, 5, 1),
  450. regulator_77802_desc_p_ldo(10, 4, 1),
  451. regulator_77802_desc_p_ldo(11, 4, 1),
  452. regulator_77802_desc_p_ldo(12, 9, 1),
  453. regulator_77802_desc_p_ldo(13, 4, 1),
  454. regulator_77802_desc_p_ldo(14, 4, 1),
  455. regulator_77802_desc_n_ldo(15, 1, 1),
  456. regulator_77802_desc_n_ldo(17, 2, 1),
  457. regulator_77802_desc_p_ldo(18, 7, 1),
  458. regulator_77802_desc_p_ldo(19, 5, 1),
  459. regulator_77802_desc_p_ldo(20, 7, 2),
  460. regulator_77802_desc_p_ldo(21, 6, 2),
  461. regulator_77802_desc_p_ldo(23, 9, 1),
  462. regulator_77802_desc_p_ldo(24, 6, 1),
  463. regulator_77802_desc_p_ldo(25, 9, 1),
  464. regulator_77802_desc_p_ldo(26, 9, 1),
  465. regulator_77802_desc_n_ldo(27, 2, 1),
  466. regulator_77802_desc_p_ldo(28, 7, 1),
  467. regulator_77802_desc_p_ldo(29, 7, 1),
  468. regulator_77802_desc_n_ldo(30, 2, 1),
  469. regulator_77802_desc_p_ldo(32, 9, 1),
  470. regulator_77802_desc_p_ldo(33, 6, 1),
  471. regulator_77802_desc_p_ldo(34, 9, 1),
  472. regulator_77802_desc_n_ldo(35, 2, 1),
  473. };
  474. static int max77802_pmic_probe(struct platform_device *pdev)
  475. {
  476. struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent);
  477. struct max77802_regulator_prv *max77802;
  478. int i, val;
  479. struct regulator_config config = { };
  480. max77802 = devm_kzalloc(&pdev->dev,
  481. sizeof(struct max77802_regulator_prv),
  482. GFP_KERNEL);
  483. if (!max77802)
  484. return -ENOMEM;
  485. config.dev = iodev->dev;
  486. config.regmap = iodev->regmap;
  487. config.driver_data = max77802;
  488. platform_set_drvdata(pdev, max77802);
  489. for (i = 0; i < MAX77802_REG_MAX; i++) {
  490. struct regulator_dev *rdev;
  491. int id = regulators[i].id;
  492. int shift = max77802_get_opmode_shift(id);
  493. int ret;
  494. ret = regmap_read(iodev->regmap, regulators[i].enable_reg, &val);
  495. if (ret < 0) {
  496. dev_warn(&pdev->dev,
  497. "cannot read current mode for %d\n", i);
  498. val = MAX77802_OPMODE_NORMAL;
  499. } else {
  500. val = val >> shift & MAX77802_OPMODE_MASK;
  501. }
  502. /*
  503. * If the regulator is disabled and the system warm rebooted,
  504. * the hardware reports OFF as the regulator operating mode.
  505. * Default to operating mode NORMAL in that case.
  506. */
  507. if (val == MAX77802_STATUS_OFF)
  508. max77802->opmode[id] = MAX77802_OPMODE_NORMAL;
  509. else
  510. max77802->opmode[id] = val;
  511. rdev = devm_regulator_register(&pdev->dev,
  512. &regulators[i], &config);
  513. if (IS_ERR(rdev)) {
  514. ret = PTR_ERR(rdev);
  515. dev_err(&pdev->dev,
  516. "regulator init failed for %d: %d\n", i, ret);
  517. return ret;
  518. }
  519. }
  520. return 0;
  521. }
  522. static const struct platform_device_id max77802_pmic_id[] = {
  523. {"max77802-pmic", 0},
  524. { },
  525. };
  526. MODULE_DEVICE_TABLE(platform, max77802_pmic_id);
  527. static struct platform_driver max77802_pmic_driver = {
  528. .driver = {
  529. .name = "max77802-pmic",
  530. },
  531. .probe = max77802_pmic_probe,
  532. .id_table = max77802_pmic_id,
  533. };
  534. module_platform_driver(max77802_pmic_driver);
  535. MODULE_DESCRIPTION("MAXIM 77802 Regulator Driver");
  536. MODULE_AUTHOR("Simon Glass <sjg@chromium.org>");
  537. MODULE_LICENSE("GPL");