hi6421v600-regulator.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Device driver for regulators in Hisi IC
  4. //
  5. // Copyright (c) 2013 Linaro Ltd.
  6. // Copyright (c) 2011 HiSilicon Ltd.
  7. // Copyright (c) 2020-2021 Huawei Technologies Co., Ltd.
  8. //
  9. // Guodong Xu <[email protected]>
  10. #include <linux/delay.h>
  11. #include <linux/module.h>
  12. #include <linux/of.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/regmap.h>
  15. #include <linux/regulator/driver.h>
  16. #include <linux/spmi.h>
  17. struct hi6421_spmi_reg_priv {
  18. /* Serialize regulator enable logic */
  19. struct mutex enable_mutex;
  20. };
  21. struct hi6421_spmi_reg_info {
  22. struct regulator_desc desc;
  23. u8 eco_mode_mask;
  24. u32 eco_uA;
  25. };
  26. static const unsigned int range_1v5_to_2v0[] = {
  27. 1500000, 1550000, 1600000, 1650000,
  28. 1700000, 1725000, 1750000, 1775000,
  29. 1800000, 1825000, 1850000, 1875000,
  30. 1900000, 1925000, 1950000, 2000000
  31. };
  32. static const unsigned int range_1v725_to_1v9[] = {
  33. 1725000, 1750000, 1775000, 1800000,
  34. 1825000, 1850000, 1875000, 1900000
  35. };
  36. static const unsigned int range_1v75_to_3v3[] = {
  37. 1750000, 1800000, 1825000, 2800000,
  38. 2850000, 2950000, 3000000, 3300000
  39. };
  40. static const unsigned int range_1v8_to_3v0[] = {
  41. 1800000, 1850000, 2400000, 2600000,
  42. 2700000, 2850000, 2950000, 3000000
  43. };
  44. static const unsigned int range_2v5_to_3v3[] = {
  45. 2500000, 2600000, 2700000, 2800000,
  46. 3000000, 3100000, 3200000, 3300000
  47. };
  48. static const unsigned int range_2v6_to_3v3[] = {
  49. 2600000, 2700000, 2800000, 2900000,
  50. 3000000, 3100000, 3200000, 3300000
  51. };
  52. /**
  53. * HI6421V600_LDO() - specify a LDO power line
  54. * @_id: LDO id name string
  55. * @vtable: voltage table
  56. * @ereg: enable register
  57. * @emask: enable mask
  58. * @vreg: voltage select register
  59. * @odelay: off/on delay time in uS
  60. * @etime: enable time in uS
  61. * @ecomask: eco mode mask
  62. * @ecoamp: eco mode load uppler limit in uA
  63. */
  64. #define HI6421V600_LDO(_id, vtable, ereg, emask, vreg, \
  65. odelay, etime, ecomask, ecoamp) \
  66. [hi6421v600_##_id] = { \
  67. .desc = { \
  68. .name = #_id, \
  69. .of_match = of_match_ptr(#_id), \
  70. .regulators_node = of_match_ptr("regulators"), \
  71. .ops = &hi6421_spmi_ldo_rops, \
  72. .type = REGULATOR_VOLTAGE, \
  73. .id = hi6421v600_##_id, \
  74. .owner = THIS_MODULE, \
  75. .volt_table = vtable, \
  76. .n_voltages = ARRAY_SIZE(vtable), \
  77. .vsel_mask = ARRAY_SIZE(vtable) - 1, \
  78. .vsel_reg = vreg, \
  79. .enable_reg = ereg, \
  80. .enable_mask = emask, \
  81. .enable_time = etime, \
  82. .ramp_delay = etime, \
  83. .off_on_delay = odelay, \
  84. }, \
  85. .eco_mode_mask = ecomask, \
  86. .eco_uA = ecoamp, \
  87. }
  88. static int hi6421_spmi_regulator_enable(struct regulator_dev *rdev)
  89. {
  90. struct hi6421_spmi_reg_priv *priv = rdev_get_drvdata(rdev);
  91. int ret;
  92. /* cannot enable more than one regulator at one time */
  93. mutex_lock(&priv->enable_mutex);
  94. ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  95. rdev->desc->enable_mask,
  96. rdev->desc->enable_mask);
  97. /* Avoid powering up multiple devices at the same time */
  98. usleep_range(rdev->desc->off_on_delay, rdev->desc->off_on_delay + 60);
  99. mutex_unlock(&priv->enable_mutex);
  100. return ret;
  101. }
  102. static unsigned int hi6421_spmi_regulator_get_mode(struct regulator_dev *rdev)
  103. {
  104. struct hi6421_spmi_reg_info *sreg;
  105. unsigned int reg_val;
  106. sreg = container_of(rdev->desc, struct hi6421_spmi_reg_info, desc);
  107. regmap_read(rdev->regmap, rdev->desc->enable_reg, &reg_val);
  108. if (reg_val & sreg->eco_mode_mask)
  109. return REGULATOR_MODE_IDLE;
  110. return REGULATOR_MODE_NORMAL;
  111. }
  112. static int hi6421_spmi_regulator_set_mode(struct regulator_dev *rdev,
  113. unsigned int mode)
  114. {
  115. struct hi6421_spmi_reg_info *sreg;
  116. unsigned int val;
  117. sreg = container_of(rdev->desc, struct hi6421_spmi_reg_info, desc);
  118. switch (mode) {
  119. case REGULATOR_MODE_NORMAL:
  120. val = 0;
  121. break;
  122. case REGULATOR_MODE_IDLE:
  123. if (!sreg->eco_mode_mask)
  124. return -EINVAL;
  125. val = sreg->eco_mode_mask;
  126. break;
  127. default:
  128. return -EINVAL;
  129. }
  130. return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
  131. sreg->eco_mode_mask, val);
  132. }
  133. static unsigned int
  134. hi6421_spmi_regulator_get_optimum_mode(struct regulator_dev *rdev,
  135. int input_uV, int output_uV,
  136. int load_uA)
  137. {
  138. struct hi6421_spmi_reg_info *sreg;
  139. sreg = container_of(rdev->desc, struct hi6421_spmi_reg_info, desc);
  140. if (!sreg->eco_uA || ((unsigned int)load_uA > sreg->eco_uA))
  141. return REGULATOR_MODE_NORMAL;
  142. return REGULATOR_MODE_IDLE;
  143. }
  144. static const struct regulator_ops hi6421_spmi_ldo_rops = {
  145. .is_enabled = regulator_is_enabled_regmap,
  146. .enable = hi6421_spmi_regulator_enable,
  147. .disable = regulator_disable_regmap,
  148. .list_voltage = regulator_list_voltage_table,
  149. .map_voltage = regulator_map_voltage_ascend,
  150. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  151. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  152. .get_mode = hi6421_spmi_regulator_get_mode,
  153. .set_mode = hi6421_spmi_regulator_set_mode,
  154. .get_optimum_mode = hi6421_spmi_regulator_get_optimum_mode,
  155. };
  156. /* HI6421v600 regulators with known registers */
  157. enum hi6421_spmi_regulator_id {
  158. hi6421v600_ldo3,
  159. hi6421v600_ldo4,
  160. hi6421v600_ldo9,
  161. hi6421v600_ldo15,
  162. hi6421v600_ldo16,
  163. hi6421v600_ldo17,
  164. hi6421v600_ldo33,
  165. hi6421v600_ldo34,
  166. };
  167. static struct hi6421_spmi_reg_info regulator_info[] = {
  168. HI6421V600_LDO(ldo3, range_1v5_to_2v0,
  169. 0x16, 0x01, 0x51,
  170. 20000, 120,
  171. 0, 0),
  172. HI6421V600_LDO(ldo4, range_1v725_to_1v9,
  173. 0x17, 0x01, 0x52,
  174. 20000, 120,
  175. 0x10, 10000),
  176. HI6421V600_LDO(ldo9, range_1v75_to_3v3,
  177. 0x1c, 0x01, 0x57,
  178. 20000, 360,
  179. 0x10, 10000),
  180. HI6421V600_LDO(ldo15, range_1v8_to_3v0,
  181. 0x21, 0x01, 0x5c,
  182. 20000, 360,
  183. 0x10, 10000),
  184. HI6421V600_LDO(ldo16, range_1v8_to_3v0,
  185. 0x22, 0x01, 0x5d,
  186. 20000, 360,
  187. 0x10, 10000),
  188. HI6421V600_LDO(ldo17, range_2v5_to_3v3,
  189. 0x23, 0x01, 0x5e,
  190. 20000, 120,
  191. 0x10, 10000),
  192. HI6421V600_LDO(ldo33, range_2v5_to_3v3,
  193. 0x32, 0x01, 0x6d,
  194. 20000, 120,
  195. 0, 0),
  196. HI6421V600_LDO(ldo34, range_2v6_to_3v3,
  197. 0x33, 0x01, 0x6e,
  198. 20000, 120,
  199. 0, 0),
  200. };
  201. static int hi6421_spmi_regulator_probe(struct platform_device *pdev)
  202. {
  203. struct device *pmic_dev = pdev->dev.parent;
  204. struct regulator_config config = { };
  205. struct hi6421_spmi_reg_priv *priv;
  206. struct hi6421_spmi_reg_info *info;
  207. struct device *dev = &pdev->dev;
  208. struct regmap *regmap;
  209. struct regulator_dev *rdev;
  210. int i;
  211. /*
  212. * This driver is meant to be called by hi6421-spmi-core,
  213. * which should first set drvdata. If this doesn't happen, hit
  214. * a warn on and return.
  215. */
  216. regmap = dev_get_drvdata(pmic_dev);
  217. if (WARN_ON(!regmap))
  218. return -ENODEV;
  219. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  220. if (!priv)
  221. return -ENOMEM;
  222. mutex_init(&priv->enable_mutex);
  223. for (i = 0; i < ARRAY_SIZE(regulator_info); i++) {
  224. info = &regulator_info[i];
  225. config.dev = pdev->dev.parent;
  226. config.driver_data = priv;
  227. config.regmap = regmap;
  228. rdev = devm_regulator_register(dev, &info->desc, &config);
  229. if (IS_ERR(rdev)) {
  230. dev_err(dev, "failed to register %s\n",
  231. info->desc.name);
  232. return PTR_ERR(rdev);
  233. }
  234. }
  235. return 0;
  236. }
  237. static const struct platform_device_id hi6421_spmi_regulator_table[] = {
  238. { .name = "hi6421v600-regulator" },
  239. {},
  240. };
  241. MODULE_DEVICE_TABLE(platform, hi6421_spmi_regulator_table);
  242. static struct platform_driver hi6421_spmi_regulator_driver = {
  243. .id_table = hi6421_spmi_regulator_table,
  244. .driver = {
  245. .name = "hi6421v600-regulator",
  246. },
  247. .probe = hi6421_spmi_regulator_probe,
  248. };
  249. module_platform_driver(hi6421_spmi_regulator_driver);
  250. MODULE_DESCRIPTION("Hi6421v600 SPMI regulator driver");
  251. MODULE_LICENSE("GPL v2");