s2mpa01.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. // SPDX-License-Identifier: GPL-2.0+
  2. //
  3. // Copyright (c) 2013 Samsung Electronics Co., Ltd
  4. // http://www.samsung.com
  5. #include <linux/bug.h>
  6. #include <linux/err.h>
  7. #include <linux/slab.h>
  8. #include <linux/module.h>
  9. #include <linux/of.h>
  10. #include <linux/regmap.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/regulator/driver.h>
  13. #include <linux/regulator/machine.h>
  14. #include <linux/regulator/of_regulator.h>
  15. #include <linux/mfd/samsung/core.h>
  16. #include <linux/mfd/samsung/s2mpa01.h>
  17. struct s2mpa01_info {
  18. int ramp_delay24;
  19. int ramp_delay3;
  20. int ramp_delay5;
  21. int ramp_delay16;
  22. int ramp_delay7;
  23. int ramp_delay8910;
  24. };
  25. static int get_ramp_delay(int ramp_delay)
  26. {
  27. unsigned char cnt = 0;
  28. ramp_delay /= 6250;
  29. while (true) {
  30. ramp_delay = ramp_delay >> 1;
  31. if (ramp_delay == 0)
  32. break;
  33. cnt++;
  34. }
  35. if (cnt > 3)
  36. cnt = 3;
  37. return cnt;
  38. }
  39. static int s2mpa01_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
  40. unsigned int old_selector,
  41. unsigned int new_selector)
  42. {
  43. struct s2mpa01_info *s2mpa01 = rdev_get_drvdata(rdev);
  44. unsigned int ramp_delay = 0;
  45. int old_volt, new_volt;
  46. switch (rdev_get_id(rdev)) {
  47. case S2MPA01_BUCK2:
  48. case S2MPA01_BUCK4:
  49. ramp_delay = s2mpa01->ramp_delay24;
  50. break;
  51. case S2MPA01_BUCK3:
  52. ramp_delay = s2mpa01->ramp_delay3;
  53. break;
  54. case S2MPA01_BUCK5:
  55. ramp_delay = s2mpa01->ramp_delay5;
  56. break;
  57. case S2MPA01_BUCK1:
  58. case S2MPA01_BUCK6:
  59. ramp_delay = s2mpa01->ramp_delay16;
  60. break;
  61. case S2MPA01_BUCK7:
  62. ramp_delay = s2mpa01->ramp_delay7;
  63. break;
  64. case S2MPA01_BUCK8:
  65. case S2MPA01_BUCK9:
  66. case S2MPA01_BUCK10:
  67. ramp_delay = s2mpa01->ramp_delay8910;
  68. break;
  69. }
  70. if (ramp_delay == 0)
  71. ramp_delay = rdev->desc->ramp_delay;
  72. old_volt = rdev->desc->min_uV + (rdev->desc->uV_step * old_selector);
  73. new_volt = rdev->desc->min_uV + (rdev->desc->uV_step * new_selector);
  74. return DIV_ROUND_UP(abs(new_volt - old_volt), ramp_delay);
  75. }
  76. static int s2mpa01_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
  77. {
  78. struct s2mpa01_info *s2mpa01 = rdev_get_drvdata(rdev);
  79. unsigned int ramp_val, ramp_shift, ramp_reg = S2MPA01_REG_RAMP2;
  80. unsigned int ramp_enable = 1, enable_shift = 0;
  81. int ret;
  82. switch (rdev_get_id(rdev)) {
  83. case S2MPA01_BUCK1:
  84. enable_shift = S2MPA01_BUCK1_RAMP_EN_SHIFT;
  85. if (!ramp_delay) {
  86. ramp_enable = 0;
  87. break;
  88. }
  89. if (ramp_delay > s2mpa01->ramp_delay16)
  90. s2mpa01->ramp_delay16 = ramp_delay;
  91. else
  92. ramp_delay = s2mpa01->ramp_delay16;
  93. ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT;
  94. break;
  95. case S2MPA01_BUCK2:
  96. enable_shift = S2MPA01_BUCK2_RAMP_EN_SHIFT;
  97. if (!ramp_delay) {
  98. ramp_enable = 0;
  99. break;
  100. }
  101. if (ramp_delay > s2mpa01->ramp_delay24)
  102. s2mpa01->ramp_delay24 = ramp_delay;
  103. else
  104. ramp_delay = s2mpa01->ramp_delay24;
  105. ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT;
  106. ramp_reg = S2MPA01_REG_RAMP1;
  107. break;
  108. case S2MPA01_BUCK3:
  109. enable_shift = S2MPA01_BUCK3_RAMP_EN_SHIFT;
  110. if (!ramp_delay) {
  111. ramp_enable = 0;
  112. break;
  113. }
  114. s2mpa01->ramp_delay3 = ramp_delay;
  115. ramp_shift = S2MPA01_BUCK3_RAMP_SHIFT;
  116. ramp_reg = S2MPA01_REG_RAMP1;
  117. break;
  118. case S2MPA01_BUCK4:
  119. enable_shift = S2MPA01_BUCK4_RAMP_EN_SHIFT;
  120. if (!ramp_delay) {
  121. ramp_enable = 0;
  122. break;
  123. }
  124. if (ramp_delay > s2mpa01->ramp_delay24)
  125. s2mpa01->ramp_delay24 = ramp_delay;
  126. else
  127. ramp_delay = s2mpa01->ramp_delay24;
  128. ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT;
  129. ramp_reg = S2MPA01_REG_RAMP1;
  130. break;
  131. case S2MPA01_BUCK5:
  132. s2mpa01->ramp_delay5 = ramp_delay;
  133. ramp_shift = S2MPA01_BUCK5_RAMP_SHIFT;
  134. break;
  135. case S2MPA01_BUCK6:
  136. if (ramp_delay > s2mpa01->ramp_delay16)
  137. s2mpa01->ramp_delay16 = ramp_delay;
  138. else
  139. ramp_delay = s2mpa01->ramp_delay16;
  140. ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT;
  141. break;
  142. case S2MPA01_BUCK7:
  143. s2mpa01->ramp_delay7 = ramp_delay;
  144. ramp_shift = S2MPA01_BUCK7_RAMP_SHIFT;
  145. break;
  146. case S2MPA01_BUCK8:
  147. case S2MPA01_BUCK9:
  148. case S2MPA01_BUCK10:
  149. if (ramp_delay > s2mpa01->ramp_delay8910)
  150. s2mpa01->ramp_delay8910 = ramp_delay;
  151. else
  152. ramp_delay = s2mpa01->ramp_delay8910;
  153. ramp_shift = S2MPA01_BUCK8910_RAMP_SHIFT;
  154. break;
  155. default:
  156. return 0;
  157. }
  158. if (!ramp_enable)
  159. goto ramp_disable;
  160. /* Ramp delay can be enabled/disabled only for buck[1234] */
  161. if (rdev_get_id(rdev) >= S2MPA01_BUCK1 &&
  162. rdev_get_id(rdev) <= S2MPA01_BUCK4) {
  163. ret = regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1,
  164. 1 << enable_shift, 1 << enable_shift);
  165. if (ret) {
  166. dev_err(&rdev->dev, "failed to enable ramp rate\n");
  167. return ret;
  168. }
  169. }
  170. ramp_val = get_ramp_delay(ramp_delay);
  171. return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift,
  172. ramp_val << ramp_shift);
  173. ramp_disable:
  174. return regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1,
  175. 1 << enable_shift, 0);
  176. }
  177. static const struct regulator_ops s2mpa01_ldo_ops = {
  178. .list_voltage = regulator_list_voltage_linear,
  179. .map_voltage = regulator_map_voltage_linear,
  180. .is_enabled = regulator_is_enabled_regmap,
  181. .enable = regulator_enable_regmap,
  182. .disable = regulator_disable_regmap,
  183. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  184. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  185. .set_voltage_time_sel = regulator_set_voltage_time_sel,
  186. };
  187. static const struct regulator_ops s2mpa01_buck_ops = {
  188. .list_voltage = regulator_list_voltage_linear,
  189. .map_voltage = regulator_map_voltage_linear,
  190. .is_enabled = regulator_is_enabled_regmap,
  191. .enable = regulator_enable_regmap,
  192. .disable = regulator_disable_regmap,
  193. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  194. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  195. .set_voltage_time_sel = s2mpa01_regulator_set_voltage_time_sel,
  196. .set_ramp_delay = s2mpa01_set_ramp_delay,
  197. };
  198. #define regulator_desc_ldo(num, step) { \
  199. .name = "LDO"#num, \
  200. .of_match = of_match_ptr("LDO"#num), \
  201. .regulators_node = of_match_ptr("regulators"), \
  202. .id = S2MPA01_LDO##num, \
  203. .ops = &s2mpa01_ldo_ops, \
  204. .type = REGULATOR_VOLTAGE, \
  205. .owner = THIS_MODULE, \
  206. .min_uV = MIN_800_MV, \
  207. .uV_step = step, \
  208. .n_voltages = S2MPA01_LDO_N_VOLTAGES, \
  209. .vsel_reg = S2MPA01_REG_L1CTRL + num - 1, \
  210. .vsel_mask = S2MPA01_LDO_VSEL_MASK, \
  211. .enable_reg = S2MPA01_REG_L1CTRL + num - 1, \
  212. .enable_mask = S2MPA01_ENABLE_MASK \
  213. }
  214. #define regulator_desc_buck1_4(num) { \
  215. .name = "BUCK"#num, \
  216. .of_match = of_match_ptr("BUCK"#num), \
  217. .regulators_node = of_match_ptr("regulators"), \
  218. .id = S2MPA01_BUCK##num, \
  219. .ops = &s2mpa01_buck_ops, \
  220. .type = REGULATOR_VOLTAGE, \
  221. .owner = THIS_MODULE, \
  222. .min_uV = MIN_600_MV, \
  223. .uV_step = STEP_6_25_MV, \
  224. .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \
  225. .ramp_delay = S2MPA01_RAMP_DELAY, \
  226. .vsel_reg = S2MPA01_REG_B1CTRL2 + (num - 1) * 2, \
  227. .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \
  228. .enable_reg = S2MPA01_REG_B1CTRL1 + (num - 1) * 2, \
  229. .enable_mask = S2MPA01_ENABLE_MASK \
  230. }
  231. #define regulator_desc_buck5 { \
  232. .name = "BUCK5", \
  233. .of_match = of_match_ptr("BUCK5"), \
  234. .regulators_node = of_match_ptr("regulators"), \
  235. .id = S2MPA01_BUCK5, \
  236. .ops = &s2mpa01_buck_ops, \
  237. .type = REGULATOR_VOLTAGE, \
  238. .owner = THIS_MODULE, \
  239. .min_uV = MIN_800_MV, \
  240. .uV_step = STEP_6_25_MV, \
  241. .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \
  242. .ramp_delay = S2MPA01_RAMP_DELAY, \
  243. .vsel_reg = S2MPA01_REG_B5CTRL2, \
  244. .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \
  245. .enable_reg = S2MPA01_REG_B5CTRL1, \
  246. .enable_mask = S2MPA01_ENABLE_MASK \
  247. }
  248. #define regulator_desc_buck6_10(num, min, step) { \
  249. .name = "BUCK"#num, \
  250. .of_match = of_match_ptr("BUCK"#num), \
  251. .regulators_node = of_match_ptr("regulators"), \
  252. .id = S2MPA01_BUCK##num, \
  253. .ops = &s2mpa01_buck_ops, \
  254. .type = REGULATOR_VOLTAGE, \
  255. .owner = THIS_MODULE, \
  256. .min_uV = min, \
  257. .uV_step = step, \
  258. .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \
  259. .ramp_delay = S2MPA01_RAMP_DELAY, \
  260. .vsel_reg = S2MPA01_REG_B6CTRL2 + (num - 6) * 2, \
  261. .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \
  262. .enable_reg = S2MPA01_REG_B6CTRL1 + (num - 6) * 2, \
  263. .enable_mask = S2MPA01_ENABLE_MASK \
  264. }
  265. static const struct regulator_desc regulators[] = {
  266. regulator_desc_ldo(1, STEP_25_MV),
  267. regulator_desc_ldo(2, STEP_50_MV),
  268. regulator_desc_ldo(3, STEP_50_MV),
  269. regulator_desc_ldo(4, STEP_50_MV),
  270. regulator_desc_ldo(5, STEP_25_MV),
  271. regulator_desc_ldo(6, STEP_25_MV),
  272. regulator_desc_ldo(7, STEP_50_MV),
  273. regulator_desc_ldo(8, STEP_50_MV),
  274. regulator_desc_ldo(9, STEP_50_MV),
  275. regulator_desc_ldo(10, STEP_50_MV),
  276. regulator_desc_ldo(11, STEP_50_MV),
  277. regulator_desc_ldo(12, STEP_50_MV),
  278. regulator_desc_ldo(13, STEP_50_MV),
  279. regulator_desc_ldo(14, STEP_50_MV),
  280. regulator_desc_ldo(15, STEP_50_MV),
  281. regulator_desc_ldo(16, STEP_50_MV),
  282. regulator_desc_ldo(17, STEP_50_MV),
  283. regulator_desc_ldo(18, STEP_50_MV),
  284. regulator_desc_ldo(19, STEP_50_MV),
  285. regulator_desc_ldo(20, STEP_50_MV),
  286. regulator_desc_ldo(21, STEP_50_MV),
  287. regulator_desc_ldo(22, STEP_50_MV),
  288. regulator_desc_ldo(23, STEP_50_MV),
  289. regulator_desc_ldo(24, STEP_50_MV),
  290. regulator_desc_ldo(25, STEP_50_MV),
  291. regulator_desc_ldo(26, STEP_25_MV),
  292. regulator_desc_buck1_4(1),
  293. regulator_desc_buck1_4(2),
  294. regulator_desc_buck1_4(3),
  295. regulator_desc_buck1_4(4),
  296. regulator_desc_buck5,
  297. regulator_desc_buck6_10(6, MIN_600_MV, STEP_6_25_MV),
  298. regulator_desc_buck6_10(7, MIN_600_MV, STEP_6_25_MV),
  299. regulator_desc_buck6_10(8, MIN_800_MV, STEP_12_5_MV),
  300. regulator_desc_buck6_10(9, MIN_1500_MV, STEP_12_5_MV),
  301. regulator_desc_buck6_10(10, MIN_1000_MV, STEP_12_5_MV),
  302. };
  303. static int s2mpa01_pmic_probe(struct platform_device *pdev)
  304. {
  305. struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
  306. struct regulator_config config = { };
  307. struct s2mpa01_info *s2mpa01;
  308. int i;
  309. s2mpa01 = devm_kzalloc(&pdev->dev, sizeof(*s2mpa01), GFP_KERNEL);
  310. if (!s2mpa01)
  311. return -ENOMEM;
  312. config.dev = iodev->dev;
  313. config.regmap = iodev->regmap_pmic;
  314. config.driver_data = s2mpa01;
  315. for (i = 0; i < S2MPA01_REGULATOR_MAX; i++) {
  316. struct regulator_dev *rdev;
  317. rdev = devm_regulator_register(&pdev->dev,
  318. &regulators[i], &config);
  319. if (IS_ERR(rdev)) {
  320. dev_err(&pdev->dev, "regulator init failed for %d\n",
  321. i);
  322. return PTR_ERR(rdev);
  323. }
  324. }
  325. return 0;
  326. }
  327. static const struct platform_device_id s2mpa01_pmic_id[] = {
  328. { "s2mpa01-pmic", 0},
  329. { },
  330. };
  331. MODULE_DEVICE_TABLE(platform, s2mpa01_pmic_id);
  332. static struct platform_driver s2mpa01_pmic_driver = {
  333. .driver = {
  334. .name = "s2mpa01-pmic",
  335. .probe_type = PROBE_PREFER_ASYNCHRONOUS,
  336. },
  337. .probe = s2mpa01_pmic_probe,
  338. .id_table = s2mpa01_pmic_id,
  339. };
  340. module_platform_driver(s2mpa01_pmic_driver);
  341. /* Module information */
  342. MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
  343. MODULE_AUTHOR("Sachin Kamat <sachin.kamat@samsung.com>");
  344. MODULE_DESCRIPTION("Samsung S2MPA01 Regulator Driver");
  345. MODULE_LICENSE("GPL");