mt6363-regulator.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Copyright (c) 2024 MediaTek Inc.
  4. // Copyright (c) 2025 Collabora Ltd
  5. // AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
  6. #include <linux/bitfield.h>
  7. #include <linux/delay.h>
  8. #include <linux/devm-helpers.h>
  9. #include <linux/err.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/irq.h>
  12. #include <linux/irqdomain.h>
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/of_device.h>
  17. #include <linux/of_irq.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/regmap.h>
  20. #include <linux/spmi.h>
  21. #include <linux/regulator/driver.h>
  22. #include <linux/regulator/machine.h>
  23. #include <linux/regulator/mt6363-regulator.h>
  24. #include <linux/regulator/of_regulator.h>
  25. #define MT6363_REGULATOR_MODE_NORMAL 0
  26. #define MT6363_REGULATOR_MODE_FCCM 1
  27. #define MT6363_REGULATOR_MODE_LP 2
  28. #define MT6363_REGULATOR_MODE_ULP 3
  29. #define EN_SET_OFFSET 0x1
  30. #define EN_CLR_OFFSET 0x2
  31. #define OP_CFG_OFFSET 0x5
  32. #define NORMAL_OP_CFG 0x10
  33. #define NORMAL_OP_EN 0x800000
  34. #define OC_IRQ_ENABLE_DELAY_MS 10
  35. /* Unlock keys for TMA and BUCK_TOP */
  36. #define MT6363_TMA_UNLOCK_VALUE 0x9c9c
  37. #define MT6363_BUCK_TOP_UNLOCK_VALUE 0x5543
  38. enum {
  39. MT6363_ID_VBUCK1,
  40. MT6363_ID_VBUCK2,
  41. MT6363_ID_VBUCK3,
  42. MT6363_ID_VBUCK4,
  43. MT6363_ID_VBUCK5,
  44. MT6363_ID_VBUCK6,
  45. MT6363_ID_VBUCK7,
  46. MT6363_ID_VS1,
  47. MT6363_ID_VS2,
  48. MT6363_ID_VS3,
  49. MT6363_ID_VA12_1,
  50. MT6363_ID_VA12_2,
  51. MT6363_ID_VA15,
  52. MT6363_ID_VAUX18,
  53. MT6363_ID_VCN13,
  54. MT6363_ID_VCN15,
  55. MT6363_ID_VEMC,
  56. MT6363_ID_VIO075,
  57. MT6363_ID_VIO18,
  58. MT6363_ID_VM18,
  59. MT6363_ID_VSRAM_APU,
  60. MT6363_ID_VSRAM_CPUB,
  61. MT6363_ID_VSRAM_CPUM,
  62. MT6363_ID_VSRAM_CPUL,
  63. MT6363_ID_VSRAM_DIGRF,
  64. MT6363_ID_VSRAM_MDFE,
  65. MT6363_ID_VSRAM_MODEM,
  66. MT6363_ID_VRF09,
  67. MT6363_ID_VRF12,
  68. MT6363_ID_VRF13,
  69. MT6363_ID_VRF18,
  70. MT6363_ID_VRFIO18,
  71. MT6363_ID_VTREF18,
  72. MT6363_ID_VUFS12,
  73. MT6363_ID_VUFS18,
  74. };
  75. /**
  76. * struct mt6363_regulator_info - MT6363 regulators information
  77. * @desc: Regulator description structure
  78. * @lp_mode_reg: Low Power mode register (normal/idle)
  79. * @lp_mode_mask: Low Power mode regulator mask
  80. * @hw_lp_mode_reg: Hardware voted Low Power mode register (normal/idle)
  81. * @hw_lp_mode_mask: Hardware voted Low Power mode regulator mask
  82. * @modeset_reg: AUTO/PWM mode register
  83. * @modeset_mask: AUTO/PWM regulator mask
  84. * @lp_imax_uA: Maximum load current (microamps), for Low Power mode only
  85. * @op_en_reg: Operation mode enablement register
  86. * @orig_op_en: Backup of a regulator's operation mode enablement register
  87. * @orig_op_cfg: Backup of a regulator's operation mode configuration register
  88. * @oc_work: Delayed work for enabling overcurrent IRQ
  89. * @hwirq: PMIC-Internal HW Interrupt for overcurrent event
  90. * @virq: Mapped Interrupt for overcurrent event
  91. */
  92. struct mt6363_regulator_info {
  93. struct regulator_desc desc;
  94. u16 lp_mode_reg;
  95. u16 lp_mode_mask;
  96. u16 hw_lp_mode_reg;
  97. u16 hw_lp_mode_mask;
  98. u16 modeset_reg;
  99. u16 modeset_mask;
  100. int lp_imax_uA;
  101. u16 op_en_reg;
  102. u32 orig_op_en;
  103. u8 orig_op_cfg;
  104. struct delayed_work oc_work;
  105. u8 hwirq;
  106. int virq;
  107. };
  108. #define MT6363_BUCK(match, vreg, min, max, step, en_reg, lp_reg, \
  109. mset_reg, ocp_intn) \
  110. [MT6363_ID_##vreg] = { \
  111. .desc = { \
  112. .name = match, \
  113. .supply_name = "vsys-"match, \
  114. .of_match = of_match_ptr(match), \
  115. .ops = &mt6363_vreg_setclr_ops, \
  116. .type = REGULATOR_VOLTAGE, \
  117. .id = MT6363_ID_##vreg, \
  118. .owner = THIS_MODULE, \
  119. .n_voltages = (max - min) / step + 1, \
  120. .min_uV = min, \
  121. .uV_step = step, \
  122. .enable_reg = en_reg, \
  123. .enable_mask = BIT(MT6363_RG_BUCK_##vreg##_EN_BIT), \
  124. .vsel_reg = MT6363_RG_BUCK_##vreg##_VOSEL_ADDR, \
  125. .vsel_mask = MT6363_RG_BUCK_##vreg##_VOSEL_MASK, \
  126. .of_map_mode = mt6363_map_mode, \
  127. }, \
  128. .lp_mode_reg = lp_reg, \
  129. .lp_mode_mask = BIT(MT6363_RG_BUCK_##vreg##_LP_BIT), \
  130. .hw_lp_mode_reg = MT6363_BUCK_##vreg##_HW_LP_MODE, \
  131. .hw_lp_mode_mask = 0xc, \
  132. .modeset_reg = mset_reg, \
  133. .modeset_mask = BIT(MT6363_RG_##vreg##_FCCM_BIT), \
  134. .lp_imax_uA = 100000, \
  135. .op_en_reg = MT6363_BUCK_##vreg##_OP_EN_0, \
  136. .hwirq = ocp_intn, \
  137. }
  138. #define MT6363_LDO_LINEAR_OPS(match, vreg, in_sup, vops, min, max, \
  139. step, buck_reg, ocp_intn) \
  140. [MT6363_ID_##vreg] = { \
  141. .desc = { \
  142. .name = match, \
  143. .supply_name = in_sup, \
  144. .of_match = of_match_ptr(match), \
  145. .ops = &vops, \
  146. .type = REGULATOR_VOLTAGE, \
  147. .id = MT6363_ID_##vreg, \
  148. .owner = THIS_MODULE, \
  149. .n_voltages = (max - min) / step + 1, \
  150. .min_uV = min, \
  151. .uV_step = step, \
  152. .enable_reg = MT6363_RG_##buck_reg##_EN_ADDR, \
  153. .enable_mask = BIT(MT6363_RG_LDO_##vreg##_EN_BIT), \
  154. .vsel_reg = MT6363_RG_LDO_##vreg##_VOSEL_ADDR, \
  155. .vsel_mask = MT6363_RG_LDO_##vreg##_VOSEL_MASK, \
  156. .of_map_mode = mt6363_map_mode, \
  157. }, \
  158. .lp_mode_reg = MT6363_RG_##buck_reg##_LP_ADDR, \
  159. .lp_mode_mask = BIT(MT6363_RG_LDO_##vreg##_LP_BIT), \
  160. .hw_lp_mode_reg = MT6363_LDO_##vreg##_HW_LP_MODE, \
  161. .hw_lp_mode_mask = 0x4, \
  162. .hwirq = ocp_intn, \
  163. }
  164. #define MT6363_LDO_L_SC(match, vreg, inp, min, max, step, buck_reg, \
  165. ocp_intn) \
  166. MT6363_LDO_LINEAR_OPS(match, vreg, inp, mt6363_vreg_setclr_ops, \
  167. min, max, step, buck_reg, ocp_intn)
  168. #define MT6363_LDO_L(match, vreg, inp, min, max, step, buck_reg, \
  169. ocp_intn) \
  170. MT6363_LDO_LINEAR_OPS(match, vreg, inp, mt6363_ldo_linear_ops, \
  171. min, max, step, buck_reg, ocp_intn)
  172. #define MT6363_LDO_LINEAR_CAL_OPS(match, vreg, in_sup, vops, vrnum, \
  173. ocp_intn) \
  174. [MT6363_ID_##vreg] = { \
  175. .desc = { \
  176. .name = match, \
  177. .supply_name = in_sup, \
  178. .of_match = of_match_ptr(match), \
  179. .ops = &vops, \
  180. .type = REGULATOR_VOLTAGE, \
  181. .id = MT6363_ID_##vreg, \
  182. .owner = THIS_MODULE, \
  183. .n_voltages = ARRAY_SIZE(ldo_volt_ranges##vrnum) * 11, \
  184. .linear_ranges = ldo_volt_ranges##vrnum, \
  185. .n_linear_ranges = ARRAY_SIZE(ldo_volt_ranges##vrnum), \
  186. .linear_range_selectors_bitfield = ldos_cal_selectors, \
  187. .enable_reg = MT6363_RG_LDO_##vreg##_ADDR, \
  188. .enable_mask = BIT(MT6363_RG_LDO_##vreg##_EN_BIT), \
  189. .vsel_reg = MT6363_RG_##vreg##_VOCAL_ADDR, \
  190. .vsel_mask = MT6363_RG_##vreg##_VOCAL_MASK, \
  191. .vsel_range_reg = MT6363_RG_##vreg##_VOSEL_ADDR, \
  192. .vsel_range_mask = MT6363_RG_##vreg##_VOSEL_MASK, \
  193. .of_map_mode = mt6363_map_mode, \
  194. }, \
  195. .lp_mode_reg = MT6363_RG_LDO_##vreg##_ADDR, \
  196. .lp_mode_mask = BIT(MT6363_RG_LDO_##vreg##_LP_BIT), \
  197. .hw_lp_mode_reg = MT6363_LDO_##vreg##_HW_LP_MODE, \
  198. .hw_lp_mode_mask = 0x4, \
  199. .lp_imax_uA = 10000, \
  200. .op_en_reg = MT6363_LDO_##vreg##_OP_EN0, \
  201. .hwirq = ocp_intn, \
  202. }
  203. #define MT6363_LDO_VT(match, vreg, inp, vranges_num, ocp_intn) \
  204. MT6363_LDO_LINEAR_CAL_OPS(match, vreg, inp, mt6363_ldo_vtable_ops,\
  205. vranges_num, ocp_intn)
  206. static const unsigned int ldos_cal_selectors[] = {
  207. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
  208. };
  209. static const struct linear_range ldo_volt_ranges0[] = {
  210. REGULATOR_LINEAR_RANGE(1200000, 0, 10, 10000),
  211. REGULATOR_LINEAR_RANGE(1300000, 0, 10, 10000),
  212. REGULATOR_LINEAR_RANGE(1500000, 0, 10, 10000),
  213. REGULATOR_LINEAR_RANGE(1700000, 0, 10, 10000),
  214. REGULATOR_LINEAR_RANGE(1800000, 0, 10, 10000),
  215. REGULATOR_LINEAR_RANGE(2000000, 0, 10, 10000),
  216. REGULATOR_LINEAR_RANGE(2500000, 0, 10, 10000),
  217. REGULATOR_LINEAR_RANGE(2600000, 0, 10, 10000),
  218. REGULATOR_LINEAR_RANGE(2700000, 0, 10, 10000),
  219. REGULATOR_LINEAR_RANGE(2800000, 0, 10, 10000),
  220. REGULATOR_LINEAR_RANGE(2900000, 0, 10, 10000),
  221. REGULATOR_LINEAR_RANGE(3000000, 0, 10, 10000),
  222. REGULATOR_LINEAR_RANGE(3100000, 0, 10, 10000),
  223. REGULATOR_LINEAR_RANGE(3300000, 0, 10, 10000),
  224. REGULATOR_LINEAR_RANGE(3400000, 0, 10, 10000),
  225. REGULATOR_LINEAR_RANGE(3500000, 0, 10, 10000)
  226. };
  227. static const struct linear_range ldo_volt_ranges1[] = {
  228. REGULATOR_LINEAR_RANGE(900000, 0, 10, 10000),
  229. REGULATOR_LINEAR_RANGE(1000000, 0, 10, 10000),
  230. REGULATOR_LINEAR_RANGE(1100000, 0, 10, 10000),
  231. REGULATOR_LINEAR_RANGE(1200000, 0, 10, 10000),
  232. REGULATOR_LINEAR_RANGE(1300000, 0, 10, 10000),
  233. REGULATOR_LINEAR_RANGE(1700000, 0, 10, 10000),
  234. REGULATOR_LINEAR_RANGE(1800000, 0, 10, 10000),
  235. REGULATOR_LINEAR_RANGE(1810000, 0, 10, 10000)
  236. };
  237. static const struct linear_range ldo_volt_ranges2[] = {
  238. REGULATOR_LINEAR_RANGE(1800000, 0, 10, 10000),
  239. REGULATOR_LINEAR_RANGE(1900000, 0, 10, 10000),
  240. REGULATOR_LINEAR_RANGE(2000000, 0, 10, 10000),
  241. REGULATOR_LINEAR_RANGE(2100000, 0, 10, 10000),
  242. REGULATOR_LINEAR_RANGE(2200000, 0, 10, 10000),
  243. REGULATOR_LINEAR_RANGE(2300000, 0, 10, 10000),
  244. REGULATOR_LINEAR_RANGE(2400000, 0, 10, 10000),
  245. REGULATOR_LINEAR_RANGE(2500000, 0, 10, 10000),
  246. REGULATOR_LINEAR_RANGE(2600000, 0, 10, 10000),
  247. REGULATOR_LINEAR_RANGE(2700000, 0, 10, 10000),
  248. REGULATOR_LINEAR_RANGE(2800000, 0, 10, 10000),
  249. REGULATOR_LINEAR_RANGE(2900000, 0, 10, 10000),
  250. REGULATOR_LINEAR_RANGE(3000000, 0, 10, 10000),
  251. REGULATOR_LINEAR_RANGE(3100000, 0, 10, 10000),
  252. REGULATOR_LINEAR_RANGE(3200000, 0, 10, 10000),
  253. REGULATOR_LINEAR_RANGE(3300000, 0, 10, 10000)
  254. };
  255. static const struct linear_range ldo_volt_ranges3[] = {
  256. REGULATOR_LINEAR_RANGE(600000, 0, 10, 10000),
  257. REGULATOR_LINEAR_RANGE(700000, 0, 10, 10000),
  258. REGULATOR_LINEAR_RANGE(800000, 0, 10, 10000),
  259. REGULATOR_LINEAR_RANGE(900000, 0, 10, 10000),
  260. REGULATOR_LINEAR_RANGE(1000000, 0, 10, 10000),
  261. REGULATOR_LINEAR_RANGE(1100000, 0, 10, 10000),
  262. REGULATOR_LINEAR_RANGE(1200000, 0, 10, 10000),
  263. REGULATOR_LINEAR_RANGE(1300000, 0, 10, 10000),
  264. REGULATOR_LINEAR_RANGE(1400000, 0, 10, 10000),
  265. REGULATOR_LINEAR_RANGE(1500000, 0, 10, 10000),
  266. REGULATOR_LINEAR_RANGE(1600000, 0, 10, 10000),
  267. REGULATOR_LINEAR_RANGE(1700000, 0, 10, 10000),
  268. REGULATOR_LINEAR_RANGE(1800000, 0, 10, 10000),
  269. REGULATOR_LINEAR_RANGE(1900000, 0, 10, 10000),
  270. REGULATOR_LINEAR_RANGE(2000000, 0, 10, 10000),
  271. REGULATOR_LINEAR_RANGE(2100000, 0, 10, 10000)
  272. };
  273. static const struct linear_range ldo_volt_ranges4[] = {
  274. REGULATOR_LINEAR_RANGE(550000, 0, 10, 5000),
  275. REGULATOR_LINEAR_RANGE(600000, 0, 10, 5000),
  276. REGULATOR_LINEAR_RANGE(650000, 0, 10, 5000),
  277. REGULATOR_LINEAR_RANGE(700000, 0, 10, 5000),
  278. REGULATOR_LINEAR_RANGE(750000, 0, 10, 5000),
  279. REGULATOR_LINEAR_RANGE(800000, 0, 10, 5000),
  280. REGULATOR_LINEAR_RANGE(900000, 0, 10, 5000),
  281. REGULATOR_LINEAR_RANGE(950000, 0, 10, 5000),
  282. REGULATOR_LINEAR_RANGE(1000000, 0, 10, 5000),
  283. REGULATOR_LINEAR_RANGE(1050000, 0, 10, 5000),
  284. REGULATOR_LINEAR_RANGE(1100000, 0, 10, 5000),
  285. REGULATOR_LINEAR_RANGE(1150000, 0, 10, 5000),
  286. REGULATOR_LINEAR_RANGE(1700000, 0, 10, 5000),
  287. REGULATOR_LINEAR_RANGE(1750000, 0, 10, 5000),
  288. REGULATOR_LINEAR_RANGE(1800000, 0, 10, 5000),
  289. REGULATOR_LINEAR_RANGE(1850000, 0, 10, 5000)
  290. };
  291. static const struct linear_range ldo_volt_ranges5[] = {
  292. REGULATOR_LINEAR_RANGE(600000, 0, 10, 5000),
  293. REGULATOR_LINEAR_RANGE(650000, 0, 10, 5000),
  294. REGULATOR_LINEAR_RANGE(700000, 0, 10, 5000),
  295. REGULATOR_LINEAR_RANGE(750000, 0, 10, 5000),
  296. REGULATOR_LINEAR_RANGE(800000, 0, 10, 5000)
  297. };
  298. static int mt6363_vreg_enable_setclr(struct regulator_dev *rdev)
  299. {
  300. return regmap_write(rdev->regmap, rdev->desc->enable_reg + EN_SET_OFFSET,
  301. rdev->desc->enable_mask);
  302. }
  303. static int mt6363_vreg_disable_setclr(struct regulator_dev *rdev)
  304. {
  305. return regmap_write(rdev->regmap, rdev->desc->enable_reg + EN_CLR_OFFSET,
  306. rdev->desc->enable_mask);
  307. }
  308. static inline unsigned int mt6363_map_mode(unsigned int mode)
  309. {
  310. switch (mode) {
  311. case MT6363_REGULATOR_MODE_NORMAL:
  312. return REGULATOR_MODE_NORMAL;
  313. case MT6363_REGULATOR_MODE_FCCM:
  314. return REGULATOR_MODE_FAST;
  315. case MT6363_REGULATOR_MODE_LP:
  316. return REGULATOR_MODE_IDLE;
  317. case MT6363_REGULATOR_MODE_ULP:
  318. return REGULATOR_MODE_STANDBY;
  319. default:
  320. return REGULATOR_MODE_INVALID;
  321. }
  322. }
  323. static unsigned int mt6363_regulator_get_mode(struct regulator_dev *rdev)
  324. {
  325. struct mt6363_regulator_info *info = rdev_get_drvdata(rdev);
  326. unsigned int val;
  327. int ret;
  328. if (info->modeset_reg) {
  329. ret = regmap_read(rdev->regmap, info->modeset_reg, &val);
  330. if (ret) {
  331. dev_err(&rdev->dev, "Failed to get mt6363 mode: %d\n", ret);
  332. return ret;
  333. }
  334. if (val & info->modeset_mask)
  335. return REGULATOR_MODE_FAST;
  336. } else {
  337. val = 0;
  338. }
  339. ret = regmap_read(rdev->regmap, info->hw_lp_mode_reg, &val);
  340. val &= info->hw_lp_mode_mask;
  341. if (ret) {
  342. dev_err(&rdev->dev, "Failed to get lp mode: %d\n", ret);
  343. return ret;
  344. }
  345. if (val)
  346. return REGULATOR_MODE_IDLE;
  347. else
  348. return REGULATOR_MODE_NORMAL;
  349. }
  350. static int mt6363_buck_unlock(struct regmap *map, bool unlock)
  351. {
  352. u16 buf = unlock ? MT6363_BUCK_TOP_UNLOCK_VALUE : 0;
  353. return regmap_bulk_write(map, MT6363_BUCK_TOP_KEY_PROT_LO, &buf, sizeof(buf));
  354. }
  355. static int mt6363_regulator_set_mode(struct regulator_dev *rdev,
  356. unsigned int mode)
  357. {
  358. struct mt6363_regulator_info *info = rdev_get_drvdata(rdev);
  359. struct regmap *regmap = rdev->regmap;
  360. int cur_mode, ret;
  361. if (!info->modeset_reg && mode == REGULATOR_MODE_FAST)
  362. return -EOPNOTSUPP;
  363. switch (mode) {
  364. case REGULATOR_MODE_FAST:
  365. ret = mt6363_buck_unlock(regmap, true);
  366. if (ret)
  367. break;
  368. ret = regmap_set_bits(regmap, info->modeset_reg, info->modeset_mask);
  369. mt6363_buck_unlock(regmap, false);
  370. break;
  371. case REGULATOR_MODE_NORMAL:
  372. cur_mode = mt6363_regulator_get_mode(rdev);
  373. if (cur_mode < 0) {
  374. ret = cur_mode;
  375. break;
  376. }
  377. if (cur_mode == REGULATOR_MODE_FAST) {
  378. ret = mt6363_buck_unlock(regmap, true);
  379. if (ret)
  380. break;
  381. ret = regmap_clear_bits(regmap, info->modeset_reg, info->modeset_mask);
  382. mt6363_buck_unlock(regmap, false);
  383. break;
  384. } else if (cur_mode == REGULATOR_MODE_IDLE) {
  385. ret = regmap_clear_bits(regmap, info->lp_mode_reg, info->lp_mode_mask);
  386. if (ret == 0)
  387. usleep_range(100, 200);
  388. } else {
  389. ret = 0;
  390. }
  391. break;
  392. case REGULATOR_MODE_IDLE:
  393. ret = regmap_set_bits(regmap, info->lp_mode_reg, info->lp_mode_mask);
  394. break;
  395. default:
  396. ret = -EINVAL;
  397. }
  398. if (ret) {
  399. dev_err(&rdev->dev, "Failed to set mode %u: %d\n", mode, ret);
  400. return ret;
  401. }
  402. return 0;
  403. }
  404. static int mt6363_regulator_set_load(struct regulator_dev *rdev, int load_uA)
  405. {
  406. struct mt6363_regulator_info *info = rdev_get_drvdata(rdev);
  407. unsigned int opmode_cfg, opmode_en;
  408. int i, ret;
  409. if (!info->lp_imax_uA)
  410. return -EINVAL;
  411. if (load_uA >= info->lp_imax_uA) {
  412. ret = mt6363_regulator_set_mode(rdev, REGULATOR_MODE_NORMAL);
  413. if (ret)
  414. return ret;
  415. opmode_cfg = NORMAL_OP_CFG;
  416. opmode_en = NORMAL_OP_EN;
  417. } else {
  418. opmode_cfg = info->orig_op_cfg;
  419. opmode_en = info->orig_op_en;
  420. }
  421. ret = regmap_write(rdev->regmap, info->op_en_reg + OP_CFG_OFFSET, opmode_cfg);
  422. if (ret)
  423. return ret;
  424. for (i = 0; i < 3; i++) {
  425. ret = regmap_write(rdev->regmap, info->op_en_reg + i,
  426. (opmode_en >> (i * 8)) & GENMASK(7, 0));
  427. if (ret)
  428. return ret;
  429. }
  430. return 0;
  431. }
  432. static int mt6363_vemc_set_voltage_sel(struct regulator_dev *rdev, unsigned int sel)
  433. {
  434. const u16 tma_unlock_key = MT6363_TMA_UNLOCK_VALUE;
  435. const struct regulator_desc *rdesc = rdev->desc;
  436. struct regmap *regmap = rdev->regmap;
  437. unsigned int range, val;
  438. int i, ret;
  439. u16 mask;
  440. for (i = 0; i < rdesc->n_linear_ranges; i++) {
  441. const struct linear_range *r = &rdesc->linear_ranges[i];
  442. unsigned int voltages_in_range = linear_range_values_in_range(r);
  443. if (sel < voltages_in_range)
  444. break;
  445. sel -= voltages_in_range;
  446. }
  447. if (i == rdesc->n_linear_ranges)
  448. return -EINVAL;
  449. ret = regmap_read(rdev->regmap, MT6363_TOP_TRAP, &val);
  450. if (ret)
  451. return ret;
  452. if (val > 1)
  453. return -EINVAL;
  454. /* Unlock TMA for writing */
  455. ret = regmap_bulk_write(rdev->regmap, MT6363_TOP_TMA_KEY_L,
  456. &tma_unlock_key, sizeof(tma_unlock_key));
  457. if (ret)
  458. return ret;
  459. /* If HW trapping value is 1, use VEMC_VOSEL_1 instead of VEMC_VOSEL_0 */
  460. if (val == 1) {
  461. mask = MT6363_RG_VEMC_VOSEL_1_MASK;
  462. sel = FIELD_PREP(MT6363_RG_VEMC_VOSEL_1_MASK, sel);
  463. } else {
  464. mask = rdesc->vsel_mask;
  465. }
  466. sel <<= ffs(rdesc->vsel_mask) - 1;
  467. sel += rdesc->linear_ranges[i].min_sel;
  468. range = rdesc->linear_range_selectors_bitfield[i];
  469. range <<= ffs(rdesc->vsel_range_mask) - 1;
  470. /* Write to the vreg calibration register for voltage finetuning */
  471. ret = regmap_update_bits(regmap, rdesc->vsel_range_reg,
  472. rdesc->vsel_range_mask, range);
  473. if (ret)
  474. goto lock_tma;
  475. /* Function must return the result of this write operation */
  476. ret = regmap_update_bits(regmap, rdesc->vsel_reg, mask, sel);
  477. lock_tma:
  478. /* Unconditionally re-lock TMA */
  479. val = 0;
  480. regmap_bulk_write(rdev->regmap, MT6363_TOP_TMA_KEY_L, &val, 2);
  481. return ret;
  482. }
  483. static int mt6363_vemc_get_voltage_sel(struct regulator_dev *rdev)
  484. {
  485. const struct regulator_desc *rdesc = rdev->desc;
  486. unsigned int vosel, trap, calsel;
  487. int vcal, vsel, range, ret;
  488. ret = regmap_read(rdev->regmap, rdesc->vsel_reg, &vosel);
  489. if (ret)
  490. return ret;
  491. ret = regmap_read(rdev->regmap, rdesc->vsel_range_reg, &calsel);
  492. if (ret)
  493. return ret;
  494. calsel &= rdesc->vsel_range_mask;
  495. for (range = 0; range < rdesc->n_linear_ranges; range++)
  496. if (rdesc->linear_range_selectors_bitfield[range] != calsel)
  497. break;
  498. if (range == rdesc->n_linear_ranges)
  499. return -EINVAL;
  500. ret = regmap_read(rdev->regmap, MT6363_TOP_TRAP, &trap);
  501. if (ret)
  502. return ret;
  503. /* If HW trapping value is 1, use VEMC_VOSEL_1 instead of VEMC_VOSEL_0 */
  504. if (trap > 1)
  505. return -EINVAL;
  506. else if (trap == 1)
  507. vsel = FIELD_GET(MT6363_RG_VEMC_VOSEL_1_MASK, vosel);
  508. else
  509. vsel = vosel & rdesc->vsel_mask;
  510. vcal = linear_range_values_in_range_array(rdesc->linear_ranges, range);
  511. return vsel + vcal;
  512. }
  513. static int mt6363_va15_set_voltage_sel(struct regulator_dev *rdev, unsigned int sel)
  514. {
  515. struct regmap *regmap = rdev->regmap;
  516. int ret;
  517. ret = mt6363_buck_unlock(regmap, true);
  518. if (ret)
  519. return ret;
  520. ret = regulator_set_voltage_sel_pickable_regmap(rdev, sel);
  521. if (ret)
  522. goto va15_unlock;
  523. ret = regmap_update_bits(regmap, MT6363_RG_BUCK_EFUSE_RSV1,
  524. MT6363_RG_BUCK_EFUSE_RSV1_MASK, sel);
  525. if (ret)
  526. goto va15_unlock;
  527. va15_unlock:
  528. mt6363_buck_unlock(rdev->regmap, false);
  529. return ret;
  530. }
  531. static void mt6363_oc_irq_enable_work(struct work_struct *work)
  532. {
  533. struct delayed_work *dwork = to_delayed_work(work);
  534. struct mt6363_regulator_info *info =
  535. container_of(dwork, struct mt6363_regulator_info, oc_work);
  536. enable_irq(info->virq);
  537. }
  538. static irqreturn_t mt6363_oc_isr(int irq, void *data)
  539. {
  540. struct regulator_dev *rdev = (struct regulator_dev *)data;
  541. struct mt6363_regulator_info *info = rdev_get_drvdata(rdev);
  542. disable_irq_nosync(info->virq);
  543. if (regulator_is_enabled_regmap(rdev))
  544. regulator_notifier_call_chain(rdev, REGULATOR_EVENT_OVER_CURRENT, NULL);
  545. schedule_delayed_work(&info->oc_work, msecs_to_jiffies(OC_IRQ_ENABLE_DELAY_MS));
  546. return IRQ_HANDLED;
  547. }
  548. static int mt6363_set_ocp(struct regulator_dev *rdev, int lim, int severity, bool enable)
  549. {
  550. struct mt6363_regulator_info *info = rdev_get_drvdata(rdev);
  551. /* MT6363 supports only enabling protection and does not support limits */
  552. if (lim || severity != REGULATOR_SEVERITY_PROT || !enable)
  553. return -EOPNOTSUPP;
  554. /* If there is no OCP interrupt, there's nothing to set */
  555. if (info->virq <= 0)
  556. return -EOPNOTSUPP;
  557. return devm_request_threaded_irq(&rdev->dev, info->virq, NULL,
  558. mt6363_oc_isr, IRQF_ONESHOT,
  559. info->desc.name, rdev);
  560. }
  561. static const struct regulator_ops mt6363_vreg_setclr_ops = {
  562. .list_voltage = regulator_list_voltage_linear,
  563. .map_voltage = regulator_map_voltage_linear,
  564. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  565. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  566. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  567. .enable = mt6363_vreg_enable_setclr,
  568. .disable = mt6363_vreg_disable_setclr,
  569. .is_enabled = regulator_is_enabled_regmap,
  570. .set_mode = mt6363_regulator_set_mode,
  571. .get_mode = mt6363_regulator_get_mode,
  572. .set_load = mt6363_regulator_set_load,
  573. .set_over_current_protection = mt6363_set_ocp,
  574. };
  575. static const struct regulator_ops mt6363_ldo_linear_ops = {
  576. .list_voltage = regulator_list_voltage_linear,
  577. .map_voltage = regulator_map_voltage_linear,
  578. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  579. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  580. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  581. .enable = regulator_enable_regmap,
  582. .disable = regulator_disable_regmap,
  583. .is_enabled = regulator_is_enabled_regmap,
  584. .set_mode = mt6363_regulator_set_mode,
  585. .get_mode = mt6363_regulator_get_mode,
  586. .set_over_current_protection = mt6363_set_ocp,
  587. };
  588. static const struct regulator_ops mt6363_ldo_vtable_ops = {
  589. .list_voltage = regulator_list_voltage_pickable_linear_range,
  590. .map_voltage = regulator_map_voltage_pickable_linear_range,
  591. .set_voltage_sel = regulator_set_voltage_sel_pickable_regmap,
  592. .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
  593. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  594. .enable = regulator_enable_regmap,
  595. .disable = regulator_disable_regmap,
  596. .is_enabled = regulator_is_enabled_regmap,
  597. .set_mode = mt6363_regulator_set_mode,
  598. .get_mode = mt6363_regulator_get_mode,
  599. .set_load = mt6363_regulator_set_load,
  600. .set_over_current_protection = mt6363_set_ocp,
  601. };
  602. static const struct regulator_ops mt6363_ldo_vemc_ops = {
  603. .list_voltage = regulator_list_voltage_pickable_linear_range,
  604. .map_voltage = regulator_map_voltage_pickable_linear_range,
  605. .set_voltage_sel = mt6363_vemc_set_voltage_sel,
  606. .get_voltage_sel = mt6363_vemc_get_voltage_sel,
  607. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  608. .enable = regulator_enable_regmap,
  609. .disable = regulator_disable_regmap,
  610. .is_enabled = regulator_is_enabled_regmap,
  611. .set_mode = mt6363_regulator_set_mode,
  612. .get_mode = mt6363_regulator_get_mode,
  613. .set_load = mt6363_regulator_set_load,
  614. .set_over_current_protection = mt6363_set_ocp,
  615. };
  616. static const struct regulator_ops mt6363_ldo_va15_ops = {
  617. .list_voltage = regulator_list_voltage_pickable_linear_range,
  618. .map_voltage = regulator_map_voltage_pickable_linear_range,
  619. .set_voltage_sel = mt6363_va15_set_voltage_sel,
  620. .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
  621. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  622. .enable = regulator_enable_regmap,
  623. .disable = regulator_disable_regmap,
  624. .is_enabled = regulator_is_enabled_regmap,
  625. .set_mode = mt6363_regulator_set_mode,
  626. .get_mode = mt6363_regulator_get_mode,
  627. .set_load = mt6363_regulator_set_load,
  628. .set_over_current_protection = mt6363_set_ocp,
  629. };
  630. /* The array is indexed by id(MT6363_ID_XXX) */
  631. static struct mt6363_regulator_info mt6363_regulators[] = {
  632. MT6363_BUCK("vbuck1", VBUCK1, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
  633. MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_FCCM_ADDR, 1),
  634. MT6363_BUCK("vbuck2", VBUCK2, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
  635. MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_FCCM_ADDR, 2),
  636. MT6363_BUCK("vbuck3", VBUCK3, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
  637. MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_FCCM_ADDR, 3),
  638. MT6363_BUCK("vbuck4", VBUCK4, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
  639. MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_1_FCCM_ADDR, 4),
  640. MT6363_BUCK("vbuck5", VBUCK5, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
  641. MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_1_FCCM_ADDR, 5),
  642. MT6363_BUCK("vbuck6", VBUCK6, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
  643. MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_1_FCCM_ADDR, 6),
  644. MT6363_BUCK("vbuck7", VBUCK7, 0, 1193750, 6250, MT6363_RG_BUCK0_EN_ADDR,
  645. MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_1_FCCM_ADDR, 7),
  646. MT6363_BUCK("vs1", VS1, 0, 2200000, 12500, MT6363_RG_BUCK1_EN_ADDR,
  647. MT6363_RG_BUCK1_LP_ADDR, MT6363_RG_VS1_FCCM_ADDR, 8),
  648. MT6363_BUCK("vs2", VS2, 0, 1600000, 12500, MT6363_RG_BUCK0_EN_ADDR,
  649. MT6363_RG_BUCK0_LP_ADDR, MT6363_RG_BUCK0_FCCM_ADDR, 0),
  650. MT6363_BUCK("vs3", VS3, 0, 1193750, 6250, MT6363_RG_BUCK1_EN_ADDR,
  651. MT6363_RG_BUCK1_LP_ADDR, MT6363_RG_VS3_FCCM_ADDR, 9),
  652. MT6363_LDO_VT("va12-1", VA12_1, "vs2-ldo2", 3, 37),
  653. MT6363_LDO_VT("va12-2", VA12_2, "vs2-ldo2", 3, 38),
  654. MT6363_LDO_LINEAR_CAL_OPS("va15", VA15, "vs1-ldo1", mt6363_ldo_va15_ops, 3, 39),
  655. MT6363_LDO_VT("vaux18", VAUX18, "vsys-ldo1", 2, 31),
  656. MT6363_LDO_VT("vcn13", VCN13, "vs2-ldo2", 1, 17),
  657. MT6363_LDO_VT("vcn15", VCN15, "vs1-ldo2", 3, 16),
  658. MT6363_LDO_LINEAR_CAL_OPS("vemc", VEMC, "vsys-ldo1", mt6363_ldo_vemc_ops, 0, 32),
  659. MT6363_LDO_VT("vio0p75", VIO075, "vs1-ldo1", 5, 36),
  660. MT6363_LDO_VT("vio18", VIO18, "vs1-ldo2", 3, 35),
  661. MT6363_LDO_VT("vm18", VM18, "vs1-ldo1", 4, 40),
  662. MT6363_LDO_L("vsram-apu", VSRAM_APU, "vs3-ldo1", 400000, 1193750, 6250, BUCK1, 30),
  663. MT6363_LDO_L("vsram-cpub", VSRAM_CPUB, "vs2-ldo1", 400000, 1193750, 6250, BUCK1, 27),
  664. MT6363_LDO_L("vsram-cpum", VSRAM_CPUM, "vs2-ldo1", 400000, 1193750, 6250, BUCK1, 28),
  665. MT6363_LDO_L("vsram-cpul", VSRAM_CPUL, "vs2-ldo2", 400000, 1193750, 6250, BUCK1, 29),
  666. MT6363_LDO_L_SC("vsram-digrf", VSRAM_DIGRF, "vs3-ldo1", 400000, 1193750, 6250, BUCK1, 23),
  667. MT6363_LDO_L_SC("vsram-mdfe", VSRAM_MDFE, "vs3-ldo1", 400000, 1193750, 6250, BUCK1, 24),
  668. MT6363_LDO_L_SC("vsram-modem", VSRAM_MODEM, "vs3-ldo2", 400000, 1193750, 6250, BUCK1, 25),
  669. MT6363_LDO_VT("vrf0p9", VRF09, "vs3-ldo2", 1, 18),
  670. MT6363_LDO_VT("vrf12", VRF12, "vs2-ldo1", 3, 19),
  671. MT6363_LDO_VT("vrf13", VRF13, "vs2-ldo1", 1, 20),
  672. MT6363_LDO_VT("vrf18", VRF18, "vs1-ldo1", 3, 21),
  673. MT6363_LDO_VT("vrf-io18", VRFIO18, "vs1-ldo1", 3, 22),
  674. MT6363_LDO_VT("vtref18", VTREF18, "vsys-ldo1", 2, 26),
  675. MT6363_LDO_VT("vufs12", VUFS12, "vs2-ldo1", 4, 33),
  676. MT6363_LDO_VT("vufs18", VUFS18, "vs1-ldo2", 3, 34),
  677. };
  678. static int mt6363_backup_op_setting(struct regmap *map, struct mt6363_regulator_info *info)
  679. {
  680. unsigned int i, val;
  681. int ret;
  682. ret = regmap_read(map, info->op_en_reg + OP_CFG_OFFSET, &val);
  683. if (ret)
  684. return ret;
  685. info->orig_op_cfg = val;
  686. for (i = 0; i < 3; i++) {
  687. ret = regmap_read(map, info->op_en_reg + i, &val);
  688. if (ret)
  689. return ret;
  690. info->orig_op_en |= val << (i * 8);
  691. }
  692. return 0;
  693. }
  694. static void mt6363_irq_remove(void *data)
  695. {
  696. int *virq = data;
  697. irq_dispose_mapping(*virq);
  698. }
  699. static void mt6363_spmi_remove(void *data)
  700. {
  701. struct spmi_device *sdev = data;
  702. spmi_device_remove(sdev);
  703. };
  704. static struct regmap *mt6363_spmi_register_regmap(struct device *dev)
  705. {
  706. struct regmap_config mt6363_regmap_config = {
  707. .reg_bits = 16,
  708. .val_bits = 16,
  709. .max_register = 0x1f90,
  710. .fast_io = true,
  711. };
  712. struct spmi_device *sdev, *sparent;
  713. u32 base;
  714. int ret;
  715. if (!dev->parent)
  716. return ERR_PTR(-ENODEV);
  717. ret = device_property_read_u32(dev, "reg", &base);
  718. if (ret)
  719. return ERR_PTR(ret);
  720. sparent = to_spmi_device(dev->parent);
  721. if (!sparent)
  722. return ERR_PTR(-ENODEV);
  723. sdev = spmi_device_alloc(sparent->ctrl);
  724. if (!sdev)
  725. return ERR_PTR(-ENODEV);
  726. sdev->usid = sparent->usid;
  727. dev_set_name(&sdev->dev, "%d-%02x-regulator", sdev->ctrl->nr, sdev->usid);
  728. ret = device_add(&sdev->dev);
  729. if (ret) {
  730. put_device(&sdev->dev);
  731. return ERR_PTR(ret);
  732. };
  733. ret = devm_add_action_or_reset(dev, mt6363_spmi_remove, sdev);
  734. if (ret)
  735. return ERR_PTR(ret);
  736. mt6363_regmap_config.reg_base = base;
  737. return devm_regmap_init_spmi_ext(sdev, &mt6363_regmap_config);
  738. }
  739. static int mt6363_regulator_probe(struct platform_device *pdev)
  740. {
  741. struct device_node *interrupt_parent;
  742. struct regulator_config config = {};
  743. struct mt6363_regulator_info *info;
  744. struct device *dev = &pdev->dev;
  745. struct regulator_dev *rdev;
  746. struct irq_domain *domain;
  747. struct irq_fwspec fwspec;
  748. struct spmi_device *sdev;
  749. int i, ret, val;
  750. config.regmap = mt6363_spmi_register_regmap(dev);
  751. if (IS_ERR(config.regmap))
  752. return dev_err_probe(dev, PTR_ERR(config.regmap),
  753. "Cannot get regmap\n");
  754. config.dev = dev;
  755. sdev = to_spmi_device(dev->parent);
  756. /*
  757. * The first read may fail if the bootloader sets sleep mode: wake up
  758. * this PMIC with W/R on the SPMI bus and ignore the first result.
  759. * This matches the MT6373 driver behavior.
  760. */
  761. regmap_read(config.regmap, MT6363_TOP_TRAP, &val);
  762. interrupt_parent = of_irq_find_parent(dev->of_node);
  763. if (!interrupt_parent)
  764. return dev_err_probe(dev, -EINVAL, "Cannot find IRQ parent\n");
  765. domain = irq_find_host(interrupt_parent);
  766. of_node_put(interrupt_parent);
  767. fwspec.fwnode = domain->fwnode;
  768. fwspec.param_count = 3;
  769. fwspec.param[0] = sdev->usid;
  770. fwspec.param[2] = IRQ_TYPE_LEVEL_HIGH;
  771. for (i = 0; i < ARRAY_SIZE(mt6363_regulators); i++) {
  772. info = &mt6363_regulators[i];
  773. fwspec.param[1] = info->hwirq;
  774. info->virq = irq_create_fwspec_mapping(&fwspec);
  775. if (!info->virq)
  776. return dev_err_probe(dev, -EINVAL,
  777. "Failed to map IRQ%d\n", info->hwirq);
  778. ret = devm_add_action_or_reset(dev, mt6363_irq_remove, &info->virq);
  779. if (ret)
  780. return ret;
  781. config.driver_data = info;
  782. INIT_DELAYED_WORK(&info->oc_work, mt6363_oc_irq_enable_work);
  783. rdev = devm_regulator_register(dev, &info->desc, &config);
  784. if (IS_ERR(rdev))
  785. return dev_err_probe(dev, PTR_ERR(rdev),
  786. "failed to register %s\n", info->desc.name);
  787. if (info->lp_imax_uA) {
  788. ret = mt6363_backup_op_setting(config.regmap, info);
  789. if (ret) {
  790. dev_warn(dev, "Failed to backup op_setting for %s\n",
  791. info->desc.name);
  792. info->lp_imax_uA = 0;
  793. }
  794. }
  795. }
  796. return 0;
  797. }
  798. static const struct of_device_id mt6363_regulator_match[] = {
  799. { .compatible = "mediatek,mt6363-regulator" },
  800. { /* sentinel */ }
  801. };
  802. static struct platform_driver mt6363_regulator_driver = {
  803. .driver = {
  804. .name = "mt6363-regulator",
  805. .probe_type = PROBE_PREFER_ASYNCHRONOUS,
  806. .of_match_table = mt6363_regulator_match,
  807. },
  808. .probe = mt6363_regulator_probe,
  809. };
  810. module_platform_driver(mt6363_regulator_driver);
  811. MODULE_AUTHOR("AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>");
  812. MODULE_DESCRIPTION("Regulator Driver for MediaTek MT6363 PMIC");
  813. MODULE_LICENSE("GPL");