rt5120-regulator.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <linux/bits.h>
  3. #include <linux/kernel.h>
  4. #include <linux/module.h>
  5. #include <linux/of.h>
  6. #include <linux/platform_device.h>
  7. #include <linux/regmap.h>
  8. #include <linux/regulator/driver.h>
  9. #include <linux/regulator/machine.h>
  10. #include <linux/regulator/of_regulator.h>
  11. #define RT5120_REG_PGSTAT 0x03
  12. #define RT5120_REG_CH1VID 0x06
  13. #define RT5120_REG_CH1SLPVID 0x07
  14. #define RT5120_REG_ENABLE 0x08
  15. #define RT5120_REG_MODECTL 0x09
  16. #define RT5120_REG_UVOVPROT 0x0A
  17. #define RT5120_REG_SLPCTL 0x0C
  18. #define RT5120_REG_INTSTAT 0x1E
  19. #define RT5120_REG_DISCHG 0x1F
  20. #define RT5120_OUTPG_MASK(rid) BIT(rid + 1)
  21. #define RT5120_OUTUV_MASK(rid) BIT(rid + 9)
  22. #define RT5120_OUTOV_MASK(rid) BIT(rid + 16)
  23. #define RT5120_CH1VID_MASK GENMASK(6, 0)
  24. #define RT5120_RIDEN_MASK(rid) BIT(rid + 1)
  25. #define RT5120_RADEN_MASK(rid) BIT(rid)
  26. #define RT5120_FPWM_MASK(rid) BIT(rid + 1)
  27. #define RT5120_UVHICCUP_MASK BIT(1)
  28. #define RT5120_OVHICCUP_MASK BIT(0)
  29. #define RT5120_HOTDIE_MASK BIT(1)
  30. #define RT5120_BUCK1_MINUV 600000
  31. #define RT5120_BUCK1_MAXUV 1393750
  32. #define RT5120_BUCK1_STEPUV 6250
  33. #define RT5120_BUCK1_NUM_VOLT 0x80
  34. #define RT5120_AUTO_MODE 0
  35. #define RT5120_FPWM_MODE 1
  36. enum {
  37. RT5120_REGULATOR_BUCK1 = 0,
  38. RT5120_REGULATOR_BUCK2,
  39. RT5120_REGULATOR_BUCK3,
  40. RT5120_REGULATOR_BUCK4,
  41. RT5120_REGULATOR_LDO,
  42. RT5120_REGULATOR_EXTEN,
  43. RT5120_MAX_REGULATOR
  44. };
  45. struct rt5120_priv {
  46. struct device *dev;
  47. struct regmap *regmap;
  48. struct regulator_desc rdesc[RT5120_MAX_REGULATOR];
  49. };
  50. static int rt5120_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
  51. {
  52. struct regmap *regmap = rdev_get_regmap(rdev);
  53. int rid = rdev_get_id(rdev);
  54. unsigned int mask = RT5120_FPWM_MASK(rid), val;
  55. switch (mode) {
  56. case REGULATOR_MODE_NORMAL:
  57. val = 0;
  58. break;
  59. case REGULATOR_MODE_FAST:
  60. val = RT5120_FPWM_MASK(rid);
  61. break;
  62. default:
  63. return -EINVAL;
  64. }
  65. return regmap_update_bits(regmap, RT5120_REG_MODECTL, mask, val);
  66. }
  67. static unsigned int rt5120_buck_get_mode(struct regulator_dev *rdev)
  68. {
  69. struct regmap *regmap = rdev_get_regmap(rdev);
  70. int ret, rid = rdev_get_id(rdev);
  71. unsigned int val;
  72. ret = regmap_read(regmap, RT5120_REG_MODECTL, &val);
  73. if (ret)
  74. return REGULATOR_MODE_INVALID;
  75. if (val & RT5120_FPWM_MASK(rid))
  76. return REGULATOR_MODE_FAST;
  77. return REGULATOR_MODE_NORMAL;
  78. }
  79. static int rt5120_regulator_get_error_flags(struct regulator_dev *rdev,
  80. unsigned int *flags)
  81. {
  82. struct regmap *regmap = rdev_get_regmap(rdev);
  83. unsigned int stat, hd_stat, cur_flags = 0;
  84. int rid = rdev_get_id(rdev), ret;
  85. /*
  86. * reg 0x03/0x04/0x05 to indicate PG/UV/OV
  87. * use block read to descrease I/O xfer time
  88. */
  89. ret = regmap_raw_read(regmap, RT5120_REG_PGSTAT, &stat, 3);
  90. if (ret)
  91. return ret;
  92. ret = regmap_read(regmap, RT5120_REG_INTSTAT, &hd_stat);
  93. if (ret)
  94. return ret;
  95. if (!(stat & RT5120_OUTPG_MASK(rid))) {
  96. if (stat & RT5120_OUTUV_MASK(rid))
  97. cur_flags |= REGULATOR_ERROR_UNDER_VOLTAGE;
  98. if (stat & RT5120_OUTOV_MASK(rid))
  99. cur_flags |= REGULATOR_ERROR_REGULATION_OUT;
  100. }
  101. if (hd_stat & RT5120_HOTDIE_MASK)
  102. cur_flags |= REGULATOR_ERROR_OVER_TEMP;
  103. *flags = cur_flags;
  104. return 0;
  105. }
  106. static int rt5120_buck1_set_suspend_voltage(struct regulator_dev *rdev, int uV)
  107. {
  108. struct regmap *regmap = rdev_get_regmap(rdev);
  109. int sel;
  110. if (uV < RT5120_BUCK1_MINUV || uV > RT5120_BUCK1_MAXUV)
  111. return -EINVAL;
  112. sel = (uV - RT5120_BUCK1_MINUV) / RT5120_BUCK1_STEPUV;
  113. return regmap_write(regmap, RT5120_REG_CH1SLPVID, sel);
  114. }
  115. static int rt5120_regulator_set_suspend_enable(struct regulator_dev *rdev)
  116. {
  117. struct regmap *regmap = rdev_get_regmap(rdev);
  118. int rid = rdev_get_id(rdev);
  119. unsigned int mask = RT5120_RIDEN_MASK(rid);
  120. return regmap_update_bits(regmap, RT5120_REG_SLPCTL, mask, mask);
  121. }
  122. static int rt5120_regulator_set_suspend_disable(struct regulator_dev *rdev)
  123. {
  124. struct regmap *regmap = rdev_get_regmap(rdev);
  125. int rid = rdev_get_id(rdev);
  126. unsigned int mask = RT5120_RIDEN_MASK(rid);
  127. return regmap_update_bits(regmap, RT5120_REG_SLPCTL, mask, 0);
  128. }
  129. static const struct regulator_ops rt5120_buck1_ops = {
  130. .enable = regulator_enable_regmap,
  131. .disable = regulator_disable_regmap,
  132. .is_enabled = regulator_is_enabled_regmap,
  133. .list_voltage = regulator_list_voltage_linear,
  134. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  135. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  136. .set_active_discharge = regulator_set_active_discharge_regmap,
  137. .set_mode = rt5120_buck_set_mode,
  138. .get_mode = rt5120_buck_get_mode,
  139. .get_error_flags = rt5120_regulator_get_error_flags,
  140. .set_suspend_voltage = rt5120_buck1_set_suspend_voltage,
  141. .set_suspend_enable = rt5120_regulator_set_suspend_enable,
  142. .set_suspend_disable = rt5120_regulator_set_suspend_disable,
  143. };
  144. static const struct regulator_ops rt5120_buck234_ops = {
  145. .enable = regulator_enable_regmap,
  146. .disable = regulator_disable_regmap,
  147. .is_enabled = regulator_is_enabled_regmap,
  148. .set_active_discharge = regulator_set_active_discharge_regmap,
  149. .set_mode = rt5120_buck_set_mode,
  150. .get_mode = rt5120_buck_get_mode,
  151. .get_error_flags = rt5120_regulator_get_error_flags,
  152. .set_suspend_enable = rt5120_regulator_set_suspend_enable,
  153. .set_suspend_disable = rt5120_regulator_set_suspend_disable,
  154. };
  155. static const struct regulator_ops rt5120_ldo_ops = {
  156. .enable = regulator_enable_regmap,
  157. .disable = regulator_disable_regmap,
  158. .is_enabled = regulator_is_enabled_regmap,
  159. .set_active_discharge = regulator_set_active_discharge_regmap,
  160. .get_error_flags = rt5120_regulator_get_error_flags,
  161. .set_suspend_enable = rt5120_regulator_set_suspend_enable,
  162. .set_suspend_disable = rt5120_regulator_set_suspend_disable,
  163. };
  164. static const struct regulator_ops rt5120_exten_ops = {
  165. .enable = regulator_enable_regmap,
  166. .disable = regulator_disable_regmap,
  167. .is_enabled = regulator_is_enabled_regmap,
  168. .set_suspend_enable = rt5120_regulator_set_suspend_enable,
  169. .set_suspend_disable = rt5120_regulator_set_suspend_disable,
  170. };
  171. static unsigned int rt5120_buck_of_map_mode(unsigned int mode)
  172. {
  173. switch (mode) {
  174. case RT5120_AUTO_MODE:
  175. return REGULATOR_MODE_NORMAL;
  176. case RT5120_FPWM_MODE:
  177. return REGULATOR_MODE_FAST;
  178. default:
  179. return REGULATOR_MODE_INVALID;
  180. }
  181. }
  182. static void rt5120_fillin_regulator_desc(struct regulator_desc *desc, int rid)
  183. {
  184. static const char * const name[] = {
  185. "buck1", "buck2", "buck3", "buck4", "ldo", "exten" };
  186. static const char * const sname[] = {
  187. "vin1", "vin2", "vin3", "vin4", "vinldo", NULL };
  188. /* Common regulator property */
  189. desc->name = name[rid];
  190. desc->supply_name = sname[rid];
  191. desc->owner = THIS_MODULE;
  192. desc->type = REGULATOR_VOLTAGE;
  193. desc->id = rid;
  194. desc->enable_reg = RT5120_REG_ENABLE;
  195. desc->enable_mask = RT5120_RIDEN_MASK(rid);
  196. desc->active_discharge_reg = RT5120_REG_DISCHG;
  197. desc->active_discharge_mask = RT5120_RADEN_MASK(rid);
  198. desc->active_discharge_on = RT5120_RADEN_MASK(rid);
  199. /* Config n_voltages to 1 for all*/
  200. desc->n_voltages = 1;
  201. /* Only buck support mode change */
  202. if (rid >= RT5120_REGULATOR_BUCK1 && rid <= RT5120_REGULATOR_BUCK4)
  203. desc->of_map_mode = rt5120_buck_of_map_mode;
  204. /* RID specific property init */
  205. switch (rid) {
  206. case RT5120_REGULATOR_BUCK1:
  207. /* Only buck1 support voltage change by I2C */
  208. desc->n_voltages = RT5120_BUCK1_NUM_VOLT;
  209. desc->min_uV = RT5120_BUCK1_MINUV;
  210. desc->uV_step = RT5120_BUCK1_STEPUV;
  211. desc->vsel_reg = RT5120_REG_CH1VID,
  212. desc->vsel_mask = RT5120_CH1VID_MASK,
  213. desc->ops = &rt5120_buck1_ops;
  214. break;
  215. case RT5120_REGULATOR_BUCK2 ... RT5120_REGULATOR_BUCK4:
  216. desc->ops = &rt5120_buck234_ops;
  217. break;
  218. case RT5120_REGULATOR_LDO:
  219. desc->ops = &rt5120_ldo_ops;
  220. break;
  221. default:
  222. desc->ops = &rt5120_exten_ops;
  223. }
  224. }
  225. static int rt5120_of_parse_cb(struct rt5120_priv *priv, int rid,
  226. struct of_regulator_match *match)
  227. {
  228. struct regulator_desc *desc = priv->rdesc + rid;
  229. struct regulator_init_data *init_data = match->init_data;
  230. if (!init_data || rid == RT5120_REGULATOR_BUCK1)
  231. return 0;
  232. if (init_data->constraints.min_uV != init_data->constraints.max_uV) {
  233. dev_err(priv->dev, "Variable voltage for fixed regulator\n");
  234. return -EINVAL;
  235. }
  236. desc->fixed_uV = init_data->constraints.min_uV;
  237. return 0;
  238. }
  239. static struct of_regulator_match rt5120_regu_match[RT5120_MAX_REGULATOR] = {
  240. [RT5120_REGULATOR_BUCK1] = { .name = "buck1", },
  241. [RT5120_REGULATOR_BUCK2] = { .name = "buck2", },
  242. [RT5120_REGULATOR_BUCK3] = { .name = "buck3", },
  243. [RT5120_REGULATOR_BUCK4] = { .name = "buck4", },
  244. [RT5120_REGULATOR_LDO] = { .name = "ldo", },
  245. [RT5120_REGULATOR_EXTEN] = { .name = "exten", }
  246. };
  247. static int rt5120_parse_regulator_dt_data(struct rt5120_priv *priv)
  248. {
  249. struct device *dev = priv->dev->parent;
  250. struct device_node *reg_node;
  251. int i, ret;
  252. for (i = 0; i < RT5120_MAX_REGULATOR; i++) {
  253. rt5120_fillin_regulator_desc(priv->rdesc + i, i);
  254. rt5120_regu_match[i].desc = priv->rdesc + i;
  255. }
  256. reg_node = of_get_child_by_name(dev->of_node, "regulators");
  257. if (!reg_node) {
  258. dev_err(priv->dev, "Couldn't find 'regulators' node\n");
  259. return -ENODEV;
  260. }
  261. ret = of_regulator_match(priv->dev, reg_node, rt5120_regu_match,
  262. ARRAY_SIZE(rt5120_regu_match));
  263. of_node_put(reg_node);
  264. if (ret < 0) {
  265. dev_err(priv->dev,
  266. "Error parsing regulator init data (%d)\n", ret);
  267. return ret;
  268. }
  269. for (i = 0; i < RT5120_MAX_REGULATOR; i++) {
  270. ret = rt5120_of_parse_cb(priv, i, rt5120_regu_match + i);
  271. if (ret) {
  272. dev_err(priv->dev, "Failed in [%d] of_passe_cb\n", i);
  273. return ret;
  274. }
  275. }
  276. return 0;
  277. }
  278. static int rt5120_device_property_init(struct rt5120_priv *priv)
  279. {
  280. struct device *dev = priv->dev->parent;
  281. struct device_node *np = dev->of_node;
  282. bool prot_enable;
  283. unsigned int prot_enable_val = 0;
  284. /* Assign UV/OV HW protection behavior */
  285. prot_enable = of_property_read_bool(np,
  286. "richtek,enable-undervolt-hiccup");
  287. if (prot_enable)
  288. prot_enable_val |= RT5120_UVHICCUP_MASK;
  289. prot_enable = of_property_read_bool(np,
  290. "richtek,enable-overvolt-hiccup");
  291. if (prot_enable)
  292. prot_enable_val |= RT5120_OVHICCUP_MASK;
  293. return regmap_update_bits(priv->regmap, RT5120_REG_UVOVPROT,
  294. RT5120_UVHICCUP_MASK | RT5120_OVHICCUP_MASK,
  295. prot_enable_val);
  296. }
  297. static int rt5120_regulator_probe(struct platform_device *pdev)
  298. {
  299. struct rt5120_priv *priv;
  300. struct regulator_dev *rdev;
  301. struct regulator_config config = {};
  302. int i, ret;
  303. priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
  304. if (!priv)
  305. return -ENOMEM;
  306. priv->dev = &pdev->dev;
  307. priv->regmap = dev_get_regmap(pdev->dev.parent, NULL);
  308. if (!priv->regmap) {
  309. dev_err(&pdev->dev, "Failed to init regmap\n");
  310. return -ENODEV;
  311. }
  312. ret = rt5120_device_property_init(priv);
  313. if (ret) {
  314. dev_err(&pdev->dev, "Failed to do property init\n");
  315. return ret;
  316. }
  317. ret = rt5120_parse_regulator_dt_data(priv);
  318. if (ret) {
  319. dev_err(&pdev->dev, "Failed to parse dt data\n");
  320. return ret;
  321. }
  322. config.dev = &pdev->dev;
  323. config.regmap = priv->regmap;
  324. for (i = 0; i < RT5120_MAX_REGULATOR; i++) {
  325. config.of_node = rt5120_regu_match[i].of_node;
  326. config.init_data = rt5120_regu_match[i].init_data;
  327. rdev = devm_regulator_register(&pdev->dev, priv->rdesc + i,
  328. &config);
  329. if (IS_ERR(rdev)) {
  330. dev_err(&pdev->dev,
  331. "Failed to register regulator [%d]\n", i);
  332. return PTR_ERR(rdev);
  333. }
  334. }
  335. return 0;
  336. }
  337. static const struct platform_device_id rt5120_regulator_dev_table[] = {
  338. { "rt5120-regulator", 0 },
  339. {}
  340. };
  341. MODULE_DEVICE_TABLE(platform, rt5120_regulator_dev_table);
  342. static struct platform_driver rt5120_regulator_driver = {
  343. .driver = {
  344. .name = "rt5120-regulator",
  345. },
  346. .id_table = rt5120_regulator_dev_table,
  347. .probe = rt5120_regulator_probe,
  348. };
  349. module_platform_driver(rt5120_regulator_driver);
  350. MODULE_AUTHOR("ChiYuan Huang <[email protected]>");
  351. MODULE_DESCRIPTION("Richtek RT5120 regulator driver");
  352. MODULE_LICENSE("GPL v2");