max77620-regulator.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. /*
  2. * Maxim MAX77620 Regulator driver
  3. *
  4. * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
  5. *
  6. * Author: Mallikarjun Kasoju <mkasoju@nvidia.com>
  7. * Laxman Dewangan <ldewangan@nvidia.com>
  8. *
  9. * This program is free software; you can redistribute it and/or modify it
  10. * under the terms and conditions of the GNU General Public License,
  11. * version 2, as published by the Free Software Foundation.
  12. */
  13. #include <linux/init.h>
  14. #include <linux/mfd/max77620.h>
  15. #include <linux/module.h>
  16. #include <linux/of.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/regmap.h>
  19. #include <linux/regulator/driver.h>
  20. #include <linux/regulator/machine.h>
  21. #include <linux/regulator/of_regulator.h>
  22. #define max77620_rails(_name) "max77620-"#_name
  23. /* Power Mode */
  24. #define MAX77620_POWER_MODE_NORMAL 3
  25. #define MAX77620_POWER_MODE_LPM 2
  26. #define MAX77620_POWER_MODE_GLPM 1
  27. #define MAX77620_POWER_MODE_DISABLE 0
  28. /* SD Slew Rate */
  29. #define MAX77620_SD_SR_13_75 0
  30. #define MAX77620_SD_SR_27_5 1
  31. #define MAX77620_SD_SR_55 2
  32. #define MAX77620_SD_SR_100 3
  33. enum max77620_regulators {
  34. MAX77620_REGULATOR_ID_SD0,
  35. MAX77620_REGULATOR_ID_SD1,
  36. MAX77620_REGULATOR_ID_SD2,
  37. MAX77620_REGULATOR_ID_SD3,
  38. MAX77620_REGULATOR_ID_SD4,
  39. MAX77620_REGULATOR_ID_LDO0,
  40. MAX77620_REGULATOR_ID_LDO1,
  41. MAX77620_REGULATOR_ID_LDO2,
  42. MAX77620_REGULATOR_ID_LDO3,
  43. MAX77620_REGULATOR_ID_LDO4,
  44. MAX77620_REGULATOR_ID_LDO5,
  45. MAX77620_REGULATOR_ID_LDO6,
  46. MAX77620_REGULATOR_ID_LDO7,
  47. MAX77620_REGULATOR_ID_LDO8,
  48. MAX77620_NUM_REGS,
  49. };
  50. /* Regulator types */
  51. enum max77620_regulator_type {
  52. MAX77620_REGULATOR_TYPE_SD,
  53. MAX77620_REGULATOR_TYPE_LDO_N,
  54. MAX77620_REGULATOR_TYPE_LDO_P,
  55. };
  56. struct max77620_regulator_info {
  57. u8 type;
  58. u8 fps_addr;
  59. u8 volt_addr;
  60. u8 cfg_addr;
  61. u8 power_mode_mask;
  62. u8 power_mode_shift;
  63. u8 remote_sense_addr;
  64. u8 remote_sense_mask;
  65. struct regulator_desc desc;
  66. };
  67. struct max77620_regulator_pdata {
  68. struct regulator_init_data *reg_idata;
  69. int active_fps_src;
  70. int active_fps_pd_slot;
  71. int active_fps_pu_slot;
  72. int suspend_fps_src;
  73. int suspend_fps_pd_slot;
  74. int suspend_fps_pu_slot;
  75. int current_mode;
  76. };
  77. struct max77620_regulator {
  78. struct device *dev;
  79. struct regmap *rmap;
  80. struct max77620_regulator_info *rinfo[MAX77620_NUM_REGS];
  81. struct max77620_regulator_pdata reg_pdata[MAX77620_NUM_REGS];
  82. int enable_power_mode[MAX77620_NUM_REGS];
  83. int current_power_mode[MAX77620_NUM_REGS];
  84. int active_fps_src[MAX77620_NUM_REGS];
  85. };
  86. #define fps_src_name(fps_src) \
  87. (fps_src == MAX77620_FPS_SRC_0 ? "FPS_SRC_0" : \
  88. fps_src == MAX77620_FPS_SRC_1 ? "FPS_SRC_1" : \
  89. fps_src == MAX77620_FPS_SRC_2 ? "FPS_SRC_2" : "FPS_SRC_NONE")
  90. static int max77620_regulator_get_fps_src(struct max77620_regulator *pmic,
  91. int id)
  92. {
  93. struct max77620_regulator_info *rinfo = pmic->rinfo[id];
  94. unsigned int val;
  95. int ret;
  96. ret = regmap_read(pmic->rmap, rinfo->fps_addr, &val);
  97. if (ret < 0) {
  98. dev_err(pmic->dev, "Reg 0x%02x read failed %d\n",
  99. rinfo->fps_addr, ret);
  100. return ret;
  101. }
  102. return (val & MAX77620_FPS_SRC_MASK) >> MAX77620_FPS_SRC_SHIFT;
  103. }
  104. static int max77620_regulator_set_fps_src(struct max77620_regulator *pmic,
  105. int fps_src, int id)
  106. {
  107. struct max77620_regulator_info *rinfo = pmic->rinfo[id];
  108. unsigned int val;
  109. int ret;
  110. switch (fps_src) {
  111. case MAX77620_FPS_SRC_0:
  112. case MAX77620_FPS_SRC_1:
  113. case MAX77620_FPS_SRC_2:
  114. case MAX77620_FPS_SRC_NONE:
  115. break;
  116. case MAX77620_FPS_SRC_DEF:
  117. ret = regmap_read(pmic->rmap, rinfo->fps_addr, &val);
  118. if (ret < 0) {
  119. dev_err(pmic->dev, "Reg 0x%02x read failed %d\n",
  120. rinfo->fps_addr, ret);
  121. return ret;
  122. }
  123. ret = (val & MAX77620_FPS_SRC_MASK) >> MAX77620_FPS_SRC_SHIFT;
  124. pmic->active_fps_src[id] = ret;
  125. return 0;
  126. default:
  127. dev_err(pmic->dev, "Invalid FPS %d for regulator %d\n",
  128. fps_src, id);
  129. return -EINVAL;
  130. }
  131. ret = regmap_update_bits(pmic->rmap, rinfo->fps_addr,
  132. MAX77620_FPS_SRC_MASK,
  133. fps_src << MAX77620_FPS_SRC_SHIFT);
  134. if (ret < 0) {
  135. dev_err(pmic->dev, "Reg 0x%02x update failed %d\n",
  136. rinfo->fps_addr, ret);
  137. return ret;
  138. }
  139. pmic->active_fps_src[id] = fps_src;
  140. return 0;
  141. }
  142. static int max77620_regulator_set_fps_slots(struct max77620_regulator *pmic,
  143. int id, bool is_suspend)
  144. {
  145. struct max77620_regulator_pdata *rpdata = &pmic->reg_pdata[id];
  146. struct max77620_regulator_info *rinfo = pmic->rinfo[id];
  147. unsigned int val = 0;
  148. unsigned int mask = 0;
  149. int pu = rpdata->active_fps_pu_slot;
  150. int pd = rpdata->active_fps_pd_slot;
  151. int ret = 0;
  152. if (is_suspend) {
  153. pu = rpdata->suspend_fps_pu_slot;
  154. pd = rpdata->suspend_fps_pd_slot;
  155. }
  156. /* FPS power up period setting */
  157. if (pu >= 0) {
  158. val |= (pu << MAX77620_FPS_PU_PERIOD_SHIFT);
  159. mask |= MAX77620_FPS_PU_PERIOD_MASK;
  160. }
  161. /* FPS power down period setting */
  162. if (pd >= 0) {
  163. val |= (pd << MAX77620_FPS_PD_PERIOD_SHIFT);
  164. mask |= MAX77620_FPS_PD_PERIOD_MASK;
  165. }
  166. if (mask) {
  167. ret = regmap_update_bits(pmic->rmap, rinfo->fps_addr,
  168. mask, val);
  169. if (ret < 0) {
  170. dev_err(pmic->dev, "Reg 0x%02x update failed: %d\n",
  171. rinfo->fps_addr, ret);
  172. return ret;
  173. }
  174. }
  175. return ret;
  176. }
  177. static int max77620_regulator_set_power_mode(struct max77620_regulator *pmic,
  178. int power_mode, int id)
  179. {
  180. struct max77620_regulator_info *rinfo = pmic->rinfo[id];
  181. u8 mask = rinfo->power_mode_mask;
  182. u8 shift = rinfo->power_mode_shift;
  183. u8 addr;
  184. int ret;
  185. switch (rinfo->type) {
  186. case MAX77620_REGULATOR_TYPE_SD:
  187. addr = rinfo->cfg_addr;
  188. break;
  189. default:
  190. addr = rinfo->volt_addr;
  191. break;
  192. }
  193. ret = regmap_update_bits(pmic->rmap, addr, mask, power_mode << shift);
  194. if (ret < 0) {
  195. dev_err(pmic->dev, "Regulator %d mode set failed: %d\n",
  196. id, ret);
  197. return ret;
  198. }
  199. pmic->current_power_mode[id] = power_mode;
  200. return ret;
  201. }
  202. static int max77620_regulator_get_power_mode(struct max77620_regulator *pmic,
  203. int id)
  204. {
  205. struct max77620_regulator_info *rinfo = pmic->rinfo[id];
  206. unsigned int val, addr;
  207. u8 mask = rinfo->power_mode_mask;
  208. u8 shift = rinfo->power_mode_shift;
  209. int ret;
  210. switch (rinfo->type) {
  211. case MAX77620_REGULATOR_TYPE_SD:
  212. addr = rinfo->cfg_addr;
  213. break;
  214. default:
  215. addr = rinfo->volt_addr;
  216. break;
  217. }
  218. ret = regmap_read(pmic->rmap, addr, &val);
  219. if (ret < 0) {
  220. dev_err(pmic->dev, "Regulator %d: Reg 0x%02x read failed: %d\n",
  221. id, addr, ret);
  222. return ret;
  223. }
  224. return (val & mask) >> shift;
  225. }
  226. static int max77620_read_slew_rate(struct max77620_regulator *pmic, int id)
  227. {
  228. struct max77620_regulator_info *rinfo = pmic->rinfo[id];
  229. unsigned int rval;
  230. int slew_rate;
  231. int ret;
  232. ret = regmap_read(pmic->rmap, rinfo->cfg_addr, &rval);
  233. if (ret < 0) {
  234. dev_err(pmic->dev, "Register 0x%02x read failed: %d\n",
  235. rinfo->cfg_addr, ret);
  236. return ret;
  237. }
  238. switch (rinfo->type) {
  239. case MAX77620_REGULATOR_TYPE_SD:
  240. slew_rate = (rval >> MAX77620_SD_SR_SHIFT) & 0x3;
  241. switch (slew_rate) {
  242. case 0:
  243. slew_rate = 13750;
  244. break;
  245. case 1:
  246. slew_rate = 27500;
  247. break;
  248. case 2:
  249. slew_rate = 55000;
  250. break;
  251. case 3:
  252. slew_rate = 100000;
  253. break;
  254. }
  255. rinfo->desc.ramp_delay = slew_rate;
  256. break;
  257. default:
  258. slew_rate = rval & 0x1;
  259. switch (slew_rate) {
  260. case 0:
  261. slew_rate = 100000;
  262. break;
  263. case 1:
  264. slew_rate = 5000;
  265. break;
  266. }
  267. rinfo->desc.ramp_delay = slew_rate;
  268. break;
  269. }
  270. return 0;
  271. }
  272. static int max77620_init_pmic(struct max77620_regulator *pmic, int id)
  273. {
  274. struct max77620_regulator_pdata *rpdata = &pmic->reg_pdata[id];
  275. int ret;
  276. /* Update power mode */
  277. ret = max77620_regulator_get_power_mode(pmic, id);
  278. if (ret < 0)
  279. return ret;
  280. pmic->current_power_mode[id] = ret;
  281. pmic->enable_power_mode[id] = MAX77620_POWER_MODE_NORMAL;
  282. if (rpdata->active_fps_src == MAX77620_FPS_SRC_DEF) {
  283. ret = max77620_regulator_get_fps_src(pmic, id);
  284. if (ret < 0)
  285. return ret;
  286. rpdata->active_fps_src = ret;
  287. }
  288. /* If rails are externally control of FPS then enable it always. */
  289. if (rpdata->active_fps_src == MAX77620_FPS_SRC_NONE) {
  290. ret = max77620_regulator_set_power_mode(pmic,
  291. pmic->enable_power_mode[id], id);
  292. if (ret < 0)
  293. return ret;
  294. } else {
  295. if (pmic->current_power_mode[id] !=
  296. pmic->enable_power_mode[id]) {
  297. ret = max77620_regulator_set_power_mode(pmic,
  298. pmic->enable_power_mode[id], id);
  299. if (ret < 0)
  300. return ret;
  301. }
  302. }
  303. ret = max77620_regulator_set_fps_src(pmic, rpdata->active_fps_src, id);
  304. if (ret < 0)
  305. return ret;
  306. ret = max77620_regulator_set_fps_slots(pmic, id, false);
  307. if (ret < 0)
  308. return ret;
  309. return 0;
  310. }
  311. static int max77620_regulator_enable(struct regulator_dev *rdev)
  312. {
  313. struct max77620_regulator *pmic = rdev_get_drvdata(rdev);
  314. int id = rdev_get_id(rdev);
  315. if (pmic->active_fps_src[id] != MAX77620_FPS_SRC_NONE)
  316. return 0;
  317. return max77620_regulator_set_power_mode(pmic,
  318. pmic->enable_power_mode[id], id);
  319. }
  320. static int max77620_regulator_disable(struct regulator_dev *rdev)
  321. {
  322. struct max77620_regulator *pmic = rdev_get_drvdata(rdev);
  323. int id = rdev_get_id(rdev);
  324. if (pmic->active_fps_src[id] != MAX77620_FPS_SRC_NONE)
  325. return 0;
  326. return max77620_regulator_set_power_mode(pmic,
  327. MAX77620_POWER_MODE_DISABLE, id);
  328. }
  329. static int max77620_regulator_is_enabled(struct regulator_dev *rdev)
  330. {
  331. struct max77620_regulator *pmic = rdev_get_drvdata(rdev);
  332. int id = rdev_get_id(rdev);
  333. int ret = 1;
  334. if (pmic->active_fps_src[id] != MAX77620_FPS_SRC_NONE)
  335. return 1;
  336. ret = max77620_regulator_get_power_mode(pmic, id);
  337. if (ret < 0)
  338. return ret;
  339. if (ret != MAX77620_POWER_MODE_DISABLE)
  340. return 1;
  341. return 0;
  342. }
  343. static int max77620_regulator_set_mode(struct regulator_dev *rdev,
  344. unsigned int mode)
  345. {
  346. struct max77620_regulator *pmic = rdev_get_drvdata(rdev);
  347. int id = rdev_get_id(rdev);
  348. struct max77620_regulator_info *rinfo = pmic->rinfo[id];
  349. struct max77620_regulator_pdata *rpdata = &pmic->reg_pdata[id];
  350. bool fpwm = false;
  351. int power_mode;
  352. int ret;
  353. u8 val;
  354. switch (mode) {
  355. case REGULATOR_MODE_FAST:
  356. fpwm = true;
  357. power_mode = MAX77620_POWER_MODE_NORMAL;
  358. break;
  359. case REGULATOR_MODE_NORMAL:
  360. power_mode = MAX77620_POWER_MODE_NORMAL;
  361. break;
  362. case REGULATOR_MODE_IDLE:
  363. power_mode = MAX77620_POWER_MODE_LPM;
  364. break;
  365. default:
  366. dev_err(pmic->dev, "Regulator %d mode %d is invalid\n",
  367. id, mode);
  368. return -EINVAL;
  369. }
  370. if (rinfo->type != MAX77620_REGULATOR_TYPE_SD)
  371. goto skip_fpwm;
  372. val = (fpwm) ? MAX77620_SD_FPWM_MASK : 0;
  373. ret = regmap_update_bits(pmic->rmap, rinfo->cfg_addr,
  374. MAX77620_SD_FPWM_MASK, val);
  375. if (ret < 0) {
  376. dev_err(pmic->dev, "Reg 0x%02x update failed: %d\n",
  377. rinfo->cfg_addr, ret);
  378. return ret;
  379. }
  380. rpdata->current_mode = mode;
  381. skip_fpwm:
  382. ret = max77620_regulator_set_power_mode(pmic, power_mode, id);
  383. if (ret < 0)
  384. return ret;
  385. pmic->enable_power_mode[id] = power_mode;
  386. return 0;
  387. }
  388. static unsigned int max77620_regulator_get_mode(struct regulator_dev *rdev)
  389. {
  390. struct max77620_regulator *pmic = rdev_get_drvdata(rdev);
  391. int id = rdev_get_id(rdev);
  392. struct max77620_regulator_info *rinfo = pmic->rinfo[id];
  393. int fpwm = 0;
  394. int ret;
  395. int pm_mode, reg_mode;
  396. unsigned int val;
  397. ret = max77620_regulator_get_power_mode(pmic, id);
  398. if (ret < 0)
  399. return 0;
  400. pm_mode = ret;
  401. if (rinfo->type == MAX77620_REGULATOR_TYPE_SD) {
  402. ret = regmap_read(pmic->rmap, rinfo->cfg_addr, &val);
  403. if (ret < 0) {
  404. dev_err(pmic->dev, "Reg 0x%02x read failed: %d\n",
  405. rinfo->cfg_addr, ret);
  406. return ret;
  407. }
  408. fpwm = !!(val & MAX77620_SD_FPWM_MASK);
  409. }
  410. switch (pm_mode) {
  411. case MAX77620_POWER_MODE_NORMAL:
  412. case MAX77620_POWER_MODE_DISABLE:
  413. if (fpwm)
  414. reg_mode = REGULATOR_MODE_FAST;
  415. else
  416. reg_mode = REGULATOR_MODE_NORMAL;
  417. break;
  418. case MAX77620_POWER_MODE_LPM:
  419. case MAX77620_POWER_MODE_GLPM:
  420. reg_mode = REGULATOR_MODE_IDLE;
  421. break;
  422. default:
  423. return 0;
  424. }
  425. return reg_mode;
  426. }
  427. static int max77620_regulator_set_ramp_delay(struct regulator_dev *rdev,
  428. int ramp_delay)
  429. {
  430. struct max77620_regulator *pmic = rdev_get_drvdata(rdev);
  431. int id = rdev_get_id(rdev);
  432. struct max77620_regulator_info *rinfo = pmic->rinfo[id];
  433. int ret, val;
  434. u8 mask;
  435. if (rinfo->type == MAX77620_REGULATOR_TYPE_SD) {
  436. if (ramp_delay <= 13750)
  437. val = 0;
  438. else if (ramp_delay <= 27500)
  439. val = 1;
  440. else if (ramp_delay <= 55000)
  441. val = 2;
  442. else
  443. val = 3;
  444. val <<= MAX77620_SD_SR_SHIFT;
  445. mask = MAX77620_SD_SR_MASK;
  446. } else {
  447. if (ramp_delay <= 5000)
  448. val = 1;
  449. else
  450. val = 0;
  451. mask = MAX77620_LDO_SLEW_RATE_MASK;
  452. }
  453. ret = regmap_update_bits(pmic->rmap, rinfo->cfg_addr, mask, val);
  454. if (ret < 0)
  455. dev_err(pmic->dev, "Reg 0x%02x update failed: %d\n",
  456. rinfo->cfg_addr, ret);
  457. return ret;
  458. }
  459. static int max77620_of_parse_cb(struct device_node *np,
  460. const struct regulator_desc *desc,
  461. struct regulator_config *config)
  462. {
  463. struct max77620_regulator *pmic = config->driver_data;
  464. struct max77620_regulator_pdata *rpdata = &pmic->reg_pdata[desc->id];
  465. u32 pval;
  466. int ret;
  467. ret = of_property_read_u32(np, "maxim,active-fps-source", &pval);
  468. rpdata->active_fps_src = (!ret) ? pval : MAX77620_FPS_SRC_DEF;
  469. ret = of_property_read_u32(np, "maxim,active-fps-power-up-slot", &pval);
  470. rpdata->active_fps_pu_slot = (!ret) ? pval : -1;
  471. ret = of_property_read_u32(
  472. np, "maxim,active-fps-power-down-slot", &pval);
  473. rpdata->active_fps_pd_slot = (!ret) ? pval : -1;
  474. ret = of_property_read_u32(np, "maxim,suspend-fps-source", &pval);
  475. rpdata->suspend_fps_src = (!ret) ? pval : -1;
  476. ret = of_property_read_u32(
  477. np, "maxim,suspend-fps-power-up-slot", &pval);
  478. rpdata->suspend_fps_pu_slot = (!ret) ? pval : -1;
  479. ret = of_property_read_u32(
  480. np, "maxim,suspend-fps-power-down-slot", &pval);
  481. rpdata->suspend_fps_pd_slot = (!ret) ? pval : -1;
  482. return max77620_init_pmic(pmic, desc->id);
  483. }
  484. static struct regulator_ops max77620_regulator_ops = {
  485. .is_enabled = max77620_regulator_is_enabled,
  486. .enable = max77620_regulator_enable,
  487. .disable = max77620_regulator_disable,
  488. .list_voltage = regulator_list_voltage_linear,
  489. .map_voltage = regulator_map_voltage_linear,
  490. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  491. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  492. .set_mode = max77620_regulator_set_mode,
  493. .get_mode = max77620_regulator_get_mode,
  494. .set_ramp_delay = max77620_regulator_set_ramp_delay,
  495. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  496. .set_active_discharge = regulator_set_active_discharge_regmap,
  497. };
  498. #define MAX77620_SD_CNF2_ROVS_EN_NONE 0
  499. #define RAIL_SD(_id, _name, _sname, _volt_mask, _min_uV, _max_uV, \
  500. _step_uV, _rs_add, _rs_mask) \
  501. [MAX77620_REGULATOR_ID_##_id] = { \
  502. .type = MAX77620_REGULATOR_TYPE_SD, \
  503. .volt_addr = MAX77620_REG_##_id, \
  504. .cfg_addr = MAX77620_REG_##_id##_CFG, \
  505. .fps_addr = MAX77620_REG_FPS_##_id, \
  506. .remote_sense_addr = _rs_add, \
  507. .remote_sense_mask = MAX77620_SD_CNF2_ROVS_EN_##_rs_mask, \
  508. .power_mode_mask = MAX77620_SD_POWER_MODE_MASK, \
  509. .power_mode_shift = MAX77620_SD_POWER_MODE_SHIFT, \
  510. .desc = { \
  511. .name = max77620_rails(_name), \
  512. .of_match = of_match_ptr(#_name), \
  513. .regulators_node = of_match_ptr("regulators"), \
  514. .of_parse_cb = max77620_of_parse_cb, \
  515. .supply_name = _sname, \
  516. .id = MAX77620_REGULATOR_ID_##_id, \
  517. .ops = &max77620_regulator_ops, \
  518. .n_voltages = ((_max_uV - _min_uV) / _step_uV) + 1, \
  519. .min_uV = _min_uV, \
  520. .uV_step = _step_uV, \
  521. .enable_time = 500, \
  522. .vsel_mask = MAX77620_##_volt_mask##_VOLT_MASK, \
  523. .vsel_reg = MAX77620_REG_##_id, \
  524. .active_discharge_off = 0, \
  525. .active_discharge_on = MAX77620_SD_CFG1_ADE_ENABLE, \
  526. .active_discharge_mask = MAX77620_SD_CFG1_ADE_MASK, \
  527. .active_discharge_reg = MAX77620_REG_##_id##_CFG, \
  528. .type = REGULATOR_VOLTAGE, \
  529. }, \
  530. }
  531. #define RAIL_LDO(_id, _name, _sname, _type, _min_uV, _max_uV, _step_uV) \
  532. [MAX77620_REGULATOR_ID_##_id] = { \
  533. .type = MAX77620_REGULATOR_TYPE_LDO_##_type, \
  534. .volt_addr = MAX77620_REG_##_id##_CFG, \
  535. .cfg_addr = MAX77620_REG_##_id##_CFG2, \
  536. .fps_addr = MAX77620_REG_FPS_##_id, \
  537. .remote_sense_addr = 0xFF, \
  538. .power_mode_mask = MAX77620_LDO_POWER_MODE_MASK, \
  539. .power_mode_shift = MAX77620_LDO_POWER_MODE_SHIFT, \
  540. .desc = { \
  541. .name = max77620_rails(_name), \
  542. .of_match = of_match_ptr(#_name), \
  543. .regulators_node = of_match_ptr("regulators"), \
  544. .of_parse_cb = max77620_of_parse_cb, \
  545. .supply_name = _sname, \
  546. .id = MAX77620_REGULATOR_ID_##_id, \
  547. .ops = &max77620_regulator_ops, \
  548. .n_voltages = ((_max_uV - _min_uV) / _step_uV) + 1, \
  549. .min_uV = _min_uV, \
  550. .uV_step = _step_uV, \
  551. .enable_time = 500, \
  552. .vsel_mask = MAX77620_LDO_VOLT_MASK, \
  553. .vsel_reg = MAX77620_REG_##_id##_CFG, \
  554. .active_discharge_off = 0, \
  555. .active_discharge_on = MAX77620_LDO_CFG2_ADE_ENABLE, \
  556. .active_discharge_mask = MAX77620_LDO_CFG2_ADE_MASK, \
  557. .active_discharge_reg = MAX77620_REG_##_id##_CFG2, \
  558. .type = REGULATOR_VOLTAGE, \
  559. }, \
  560. }
  561. static struct max77620_regulator_info max77620_regs_info[MAX77620_NUM_REGS] = {
  562. RAIL_SD(SD0, sd0, "in-sd0", SD0, 600000, 1400000, 12500, 0x22, SD0),
  563. RAIL_SD(SD1, sd1, "in-sd1", SD1, 600000, 1550000, 12500, 0x22, SD1),
  564. RAIL_SD(SD2, sd2, "in-sd2", SDX, 600000, 3787500, 12500, 0xFF, NONE),
  565. RAIL_SD(SD3, sd3, "in-sd3", SDX, 600000, 3787500, 12500, 0xFF, NONE),
  566. RAIL_SD(SD4, sd4, "in-sd4", SDX, 600000, 3787500, 12500, 0xFF, NONE),
  567. RAIL_LDO(LDO0, ldo0, "in-ldo0-1", N, 800000, 2375000, 25000),
  568. RAIL_LDO(LDO1, ldo1, "in-ldo0-1", N, 800000, 2375000, 25000),
  569. RAIL_LDO(LDO2, ldo2, "in-ldo2", P, 800000, 3950000, 50000),
  570. RAIL_LDO(LDO3, ldo3, "in-ldo3-5", P, 800000, 3950000, 50000),
  571. RAIL_LDO(LDO4, ldo4, "in-ldo4-6", P, 800000, 1587500, 12500),
  572. RAIL_LDO(LDO5, ldo5, "in-ldo3-5", P, 800000, 3950000, 50000),
  573. RAIL_LDO(LDO6, ldo6, "in-ldo4-6", P, 800000, 3950000, 50000),
  574. RAIL_LDO(LDO7, ldo7, "in-ldo7-8", N, 800000, 3950000, 50000),
  575. RAIL_LDO(LDO8, ldo8, "in-ldo7-8", N, 800000, 3950000, 50000),
  576. };
  577. static struct max77620_regulator_info max20024_regs_info[MAX77620_NUM_REGS] = {
  578. RAIL_SD(SD0, sd0, "in-sd0", SD0, 800000, 1587500, 12500, 0x22, SD0),
  579. RAIL_SD(SD1, sd1, "in-sd1", SD1, 600000, 3387500, 12500, 0x22, SD1),
  580. RAIL_SD(SD2, sd2, "in-sd2", SDX, 600000, 3787500, 12500, 0xFF, NONE),
  581. RAIL_SD(SD3, sd3, "in-sd3", SDX, 600000, 3787500, 12500, 0xFF, NONE),
  582. RAIL_SD(SD4, sd4, "in-sd4", SDX, 600000, 3787500, 12500, 0xFF, NONE),
  583. RAIL_LDO(LDO0, ldo0, "in-ldo0-1", N, 800000, 2375000, 25000),
  584. RAIL_LDO(LDO1, ldo1, "in-ldo0-1", N, 800000, 2375000, 25000),
  585. RAIL_LDO(LDO2, ldo2, "in-ldo2", P, 800000, 3950000, 50000),
  586. RAIL_LDO(LDO3, ldo3, "in-ldo3-5", P, 800000, 3950000, 50000),
  587. RAIL_LDO(LDO4, ldo4, "in-ldo4-6", P, 800000, 1587500, 12500),
  588. RAIL_LDO(LDO5, ldo5, "in-ldo3-5", P, 800000, 3950000, 50000),
  589. RAIL_LDO(LDO6, ldo6, "in-ldo4-6", P, 800000, 3950000, 50000),
  590. RAIL_LDO(LDO7, ldo7, "in-ldo7-8", N, 800000, 3950000, 50000),
  591. RAIL_LDO(LDO8, ldo8, "in-ldo7-8", N, 800000, 3950000, 50000),
  592. };
  593. static int max77620_regulator_probe(struct platform_device *pdev)
  594. {
  595. struct max77620_chip *max77620_chip = dev_get_drvdata(pdev->dev.parent);
  596. struct max77620_regulator_info *rinfo;
  597. struct device *dev = &pdev->dev;
  598. struct regulator_config config = { };
  599. struct max77620_regulator *pmic;
  600. int ret = 0;
  601. int id;
  602. pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL);
  603. if (!pmic)
  604. return -ENOMEM;
  605. platform_set_drvdata(pdev, pmic);
  606. pmic->dev = dev;
  607. pmic->rmap = max77620_chip->rmap;
  608. if (!dev->of_node)
  609. dev->of_node = pdev->dev.parent->of_node;
  610. switch (max77620_chip->chip_id) {
  611. case MAX77620:
  612. rinfo = max77620_regs_info;
  613. break;
  614. default:
  615. rinfo = max20024_regs_info;
  616. break;
  617. }
  618. config.regmap = pmic->rmap;
  619. config.dev = dev;
  620. config.driver_data = pmic;
  621. for (id = 0; id < MAX77620_NUM_REGS; id++) {
  622. struct regulator_dev *rdev;
  623. struct regulator_desc *rdesc;
  624. if ((max77620_chip->chip_id == MAX77620) &&
  625. (id == MAX77620_REGULATOR_ID_SD4))
  626. continue;
  627. rdesc = &rinfo[id].desc;
  628. pmic->rinfo[id] = &max77620_regs_info[id];
  629. pmic->enable_power_mode[id] = MAX77620_POWER_MODE_NORMAL;
  630. ret = max77620_read_slew_rate(pmic, id);
  631. if (ret < 0)
  632. return ret;
  633. rdev = devm_regulator_register(dev, rdesc, &config);
  634. if (IS_ERR(rdev)) {
  635. ret = PTR_ERR(rdev);
  636. dev_err(dev, "Regulator registration %s failed: %d\n",
  637. rdesc->name, ret);
  638. return ret;
  639. }
  640. }
  641. return 0;
  642. }
  643. #ifdef CONFIG_PM_SLEEP
  644. static int max77620_regulator_suspend(struct device *dev)
  645. {
  646. struct max77620_regulator *pmic = dev_get_drvdata(dev);
  647. struct max77620_regulator_pdata *reg_pdata;
  648. int id;
  649. for (id = 0; id < MAX77620_NUM_REGS; id++) {
  650. reg_pdata = &pmic->reg_pdata[id];
  651. max77620_regulator_set_fps_slots(pmic, id, true);
  652. if (reg_pdata->suspend_fps_src < 0)
  653. continue;
  654. max77620_regulator_set_fps_src(pmic, reg_pdata->suspend_fps_src,
  655. id);
  656. }
  657. return 0;
  658. }
  659. static int max77620_regulator_resume(struct device *dev)
  660. {
  661. struct max77620_regulator *pmic = dev_get_drvdata(dev);
  662. struct max77620_regulator_pdata *reg_pdata;
  663. int id;
  664. for (id = 0; id < MAX77620_NUM_REGS; id++) {
  665. reg_pdata = &pmic->reg_pdata[id];
  666. max77620_regulator_set_fps_slots(pmic, id, false);
  667. if (reg_pdata->active_fps_src < 0)
  668. continue;
  669. max77620_regulator_set_fps_src(pmic, reg_pdata->active_fps_src,
  670. id);
  671. }
  672. return 0;
  673. }
  674. #endif
  675. static const struct dev_pm_ops max77620_regulator_pm_ops = {
  676. SET_SYSTEM_SLEEP_PM_OPS(max77620_regulator_suspend,
  677. max77620_regulator_resume)
  678. };
  679. static const struct platform_device_id max77620_regulator_devtype[] = {
  680. { .name = "max77620-pmic", },
  681. { .name = "max20024-pmic", },
  682. {},
  683. };
  684. MODULE_DEVICE_TABLE(platform, max77620_regulator_devtype);
  685. static struct platform_driver max77620_regulator_driver = {
  686. .probe = max77620_regulator_probe,
  687. .id_table = max77620_regulator_devtype,
  688. .driver = {
  689. .name = "max77620-pmic",
  690. .pm = &max77620_regulator_pm_ops,
  691. },
  692. };
  693. module_platform_driver(max77620_regulator_driver);
  694. MODULE_DESCRIPTION("MAX77620/MAX20024 regulator driver");
  695. MODULE_AUTHOR("Mallikarjun Kasoju <mkasoju@nvidia.com>");
  696. MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
  697. MODULE_LICENSE("GPL v2");