max77857-regulator.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2023 Analog Devices, Inc.
  4. * ADI Regulator driver for the MAX77857
  5. * MAX77859 and MAX77831.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/i2c.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/module.h>
  11. #include <linux/regmap.h>
  12. #include <linux/regulator/driver.h>
  13. #include <linux/regulator/machine.h>
  14. #include <linux/regulator/of_regulator.h>
  15. #include <linux/util_macros.h>
  16. #define MAX77857_REG_INT_SRC 0x10
  17. #define MAX77857_REG_INT_MASK 0x11
  18. #define MAX77857_REG_CONT1 0x12
  19. #define MAX77857_REG_CONT2 0x13
  20. #define MAX77857_REG_CONT3 0x14
  21. #define MAX77857_INT_SRC_OCP BIT(0)
  22. #define MAX77857_INT_SRC_THS BIT(1)
  23. #define MAX77857_INT_SRC_HARDSHORT BIT(2)
  24. #define MAX77857_INT_SRC_OVP BIT(3)
  25. #define MAX77857_INT_SRC_POK BIT(4)
  26. #define MAX77857_ILIM_MASK GENMASK(2, 0)
  27. #define MAX77857_CONT1_FREQ GENMASK(4, 3)
  28. #define MAX77857_CONT3_FPWM BIT(5)
  29. #define MAX77859_REG_INT_SRC 0x11
  30. #define MAX77859_REG_CONT1 0x13
  31. #define MAX77859_REG_CONT2 0x14
  32. #define MAX77859_REG_CONT3 0x15
  33. #define MAX77859_REG_CONT5 0x17
  34. #define MAX77859_CONT2_FPWM BIT(2)
  35. #define MAX77859_CONT2_INTB BIT(3)
  36. #define MAX77859_CONT3_DVS_START BIT(2)
  37. #define MAX77859_VOLTAGE_SEL_MASK GENMASK(9, 0)
  38. #define MAX77859_CURRENT_MIN 1000000
  39. #define MAX77859_CURRENT_MAX 5000000
  40. #define MAX77859_CURRENT_STEP 50000
  41. enum max77857_id {
  42. ID_MAX77831 = 1,
  43. ID_MAX77857,
  44. ID_MAX77859,
  45. ID_MAX77859A,
  46. };
  47. static bool max77857_volatile_reg(struct device *dev, unsigned int reg)
  48. {
  49. enum max77857_id id = (uintptr_t)dev_get_drvdata(dev);
  50. switch (id) {
  51. case ID_MAX77831:
  52. case ID_MAX77857:
  53. return reg == MAX77857_REG_INT_SRC;
  54. case ID_MAX77859:
  55. case ID_MAX77859A:
  56. return reg == MAX77859_REG_INT_SRC;
  57. default:
  58. return true;
  59. }
  60. }
  61. static const struct regmap_config max77857_regmap_config = {
  62. .reg_bits = 8,
  63. .val_bits = 8,
  64. .cache_type = REGCACHE_MAPLE,
  65. .volatile_reg = max77857_volatile_reg,
  66. };
  67. static int max77857_get_status(struct regulator_dev *rdev)
  68. {
  69. unsigned int val;
  70. int ret;
  71. ret = regmap_read(rdev->regmap, MAX77857_REG_INT_SRC, &val);
  72. if (ret)
  73. return ret;
  74. if (FIELD_GET(MAX77857_INT_SRC_POK, val))
  75. return REGULATOR_STATUS_ON;
  76. return REGULATOR_STATUS_ERROR;
  77. }
  78. static unsigned int max77857_get_mode(struct regulator_dev *rdev)
  79. {
  80. enum max77857_id id = (uintptr_t)rdev_get_drvdata(rdev);
  81. unsigned int regval;
  82. int ret;
  83. switch (id) {
  84. case ID_MAX77831:
  85. case ID_MAX77857:
  86. ret = regmap_read(rdev->regmap, MAX77857_REG_CONT3, &regval);
  87. if (ret)
  88. return ret;
  89. if (FIELD_GET(MAX77857_CONT3_FPWM, regval))
  90. return REGULATOR_MODE_FAST;
  91. break;
  92. case ID_MAX77859:
  93. case ID_MAX77859A:
  94. ret = regmap_read(rdev->regmap, MAX77859_REG_CONT2, &regval);
  95. if (ret)
  96. return ret;
  97. if (FIELD_GET(MAX77859_CONT2_FPWM, regval))
  98. return REGULATOR_MODE_FAST;
  99. break;
  100. default:
  101. return -EINVAL;
  102. }
  103. return REGULATOR_MODE_NORMAL;
  104. }
  105. static int max77857_set_mode(struct regulator_dev *rdev, unsigned int mode)
  106. {
  107. enum max77857_id id = (uintptr_t)rdev_get_drvdata(rdev);
  108. unsigned int reg, val;
  109. switch (id) {
  110. case ID_MAX77831:
  111. case ID_MAX77857:
  112. reg = MAX77857_REG_CONT3;
  113. val = MAX77857_CONT3_FPWM;
  114. break;
  115. case ID_MAX77859:
  116. case ID_MAX77859A:
  117. reg = MAX77859_REG_CONT2;
  118. val = MAX77859_CONT2_FPWM;
  119. break;
  120. default:
  121. return -EINVAL;
  122. }
  123. switch (mode) {
  124. case REGULATOR_MODE_FAST:
  125. return regmap_set_bits(rdev->regmap, reg, val);
  126. case REGULATOR_MODE_NORMAL:
  127. return regmap_clear_bits(rdev->regmap, reg, val);
  128. default:
  129. return -EINVAL;
  130. }
  131. }
  132. static int max77857_get_error_flags(struct regulator_dev *rdev,
  133. unsigned int *flags)
  134. {
  135. unsigned int val;
  136. int ret;
  137. ret = regmap_read(rdev->regmap, MAX77857_REG_INT_SRC, &val);
  138. if (ret)
  139. return ret;
  140. *flags = 0;
  141. if (FIELD_GET(MAX77857_INT_SRC_OVP, val))
  142. *flags |= REGULATOR_ERROR_OVER_VOLTAGE_WARN;
  143. if (FIELD_GET(MAX77857_INT_SRC_OCP, val) ||
  144. FIELD_GET(MAX77857_INT_SRC_HARDSHORT, val))
  145. *flags |= REGULATOR_ERROR_OVER_CURRENT;
  146. if (FIELD_GET(MAX77857_INT_SRC_THS, val))
  147. *flags |= REGULATOR_ERROR_OVER_TEMP;
  148. if (!FIELD_GET(MAX77857_INT_SRC_POK, val))
  149. *flags |= REGULATOR_ERROR_FAIL;
  150. return 0;
  151. }
  152. static struct linear_range max77859_lin_ranges[] = {
  153. REGULATOR_LINEAR_RANGE(3200000, 0x0A0, 0x320, 20000)
  154. };
  155. static const unsigned int max77859_ramp_table[4] = {
  156. 1000, 500, 250, 125
  157. };
  158. static int max77859_set_voltage_sel(struct regulator_dev *rdev,
  159. unsigned int sel)
  160. {
  161. __be16 reg;
  162. int ret;
  163. reg = cpu_to_be16(sel);
  164. ret = regmap_bulk_write(rdev->regmap, MAX77859_REG_CONT3, &reg, 2);
  165. if (ret)
  166. return ret;
  167. /* actually apply new voltage */
  168. return regmap_set_bits(rdev->regmap, MAX77859_REG_CONT3,
  169. MAX77859_CONT3_DVS_START);
  170. }
  171. static int max77859_get_voltage_sel(struct regulator_dev *rdev)
  172. {
  173. __be16 reg;
  174. int ret;
  175. ret = regmap_bulk_read(rdev->regmap, MAX77859_REG_CONT3, &reg, 2);
  176. if (ret)
  177. return ret;
  178. return FIELD_GET(MAX77859_VOLTAGE_SEL_MASK, __be16_to_cpu(reg));
  179. }
  180. static int max77859_set_current_limit(struct regulator_dev *rdev, int min_uA, int max_uA)
  181. {
  182. u32 selector;
  183. if (max_uA < MAX77859_CURRENT_MIN)
  184. return -EINVAL;
  185. selector = 0x12 + (max_uA - MAX77859_CURRENT_MIN) / MAX77859_CURRENT_STEP;
  186. selector = clamp_val(selector, 0x00, 0x7F);
  187. return regmap_write(rdev->regmap, MAX77859_REG_CONT5, selector);
  188. }
  189. static int max77859_get_current_limit(struct regulator_dev *rdev)
  190. {
  191. u32 selector;
  192. int ret;
  193. ret = regmap_read(rdev->regmap, MAX77859_REG_CONT5, &selector);
  194. if (ret)
  195. return ret;
  196. if (selector <= 0x12)
  197. return MAX77859_CURRENT_MIN;
  198. if (selector >= 0x64)
  199. return MAX77859_CURRENT_MAX;
  200. return MAX77859_CURRENT_MIN + (selector - 0x12) * MAX77859_CURRENT_STEP;
  201. }
  202. static const struct regulator_ops max77859_regulator_ops = {
  203. .list_voltage = regulator_list_voltage_linear_range,
  204. .set_voltage_sel = max77859_set_voltage_sel,
  205. .get_voltage_sel = max77859_get_voltage_sel,
  206. .set_ramp_delay = regulator_set_ramp_delay_regmap,
  207. .get_status = max77857_get_status,
  208. .set_mode = max77857_set_mode,
  209. .get_mode = max77857_get_mode,
  210. .get_error_flags = max77857_get_error_flags,
  211. };
  212. static const struct regulator_ops max77859a_regulator_ops = {
  213. .list_voltage = regulator_list_voltage_linear_range,
  214. .set_voltage_sel = max77859_set_voltage_sel,
  215. .get_voltage_sel = max77859_get_voltage_sel,
  216. .set_current_limit = max77859_set_current_limit,
  217. .get_current_limit = max77859_get_current_limit,
  218. .set_ramp_delay = regulator_set_ramp_delay_regmap,
  219. .get_status = max77857_get_status,
  220. .set_mode = max77857_set_mode,
  221. .get_mode = max77857_get_mode,
  222. .get_error_flags = max77857_get_error_flags,
  223. };
  224. static const struct regulator_ops max77857_regulator_ops = {
  225. .list_voltage = regulator_list_voltage_linear_range,
  226. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  227. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  228. .set_ramp_delay = regulator_set_ramp_delay_regmap,
  229. .get_status = max77857_get_status,
  230. .set_mode = max77857_set_mode,
  231. .get_mode = max77857_get_mode,
  232. .get_error_flags = max77857_get_error_flags,
  233. };
  234. static struct linear_range max77857_lin_ranges[] = {
  235. REGULATOR_LINEAR_RANGE(4485000, 0x3D, 0xCC, 73500)
  236. };
  237. static const unsigned int max77857_switch_freq[] = {
  238. 1200000, 1500000, 1800000, 2100000
  239. };
  240. #define RAMAP_DELAY_INIT_VAL 1333
  241. static const unsigned int max77857_ramp_table[2][4] = {
  242. { RAMAP_DELAY_INIT_VAL, 667, 333, 227 }, /* when switch freq is 1.8MHz or 2.1MHz */
  243. { 1166, 667, 333, 167 }, /* when switch freq is 1.2MHz or 1.5MHz */
  244. };
  245. static struct regulator_desc max77857_regulator_desc = {
  246. .ops = &max77857_regulator_ops,
  247. .name = "max77857",
  248. .linear_ranges = max77857_lin_ranges,
  249. .n_linear_ranges = ARRAY_SIZE(max77857_lin_ranges),
  250. .vsel_mask = 0xFF,
  251. .vsel_reg = MAX77857_REG_CONT2,
  252. .ramp_delay_table = max77857_ramp_table[0],
  253. .n_ramp_values = ARRAY_SIZE(max77857_ramp_table[0]),
  254. .ramp_reg = MAX77857_REG_CONT3,
  255. .ramp_mask = GENMASK(1, 0),
  256. .ramp_delay = RAMAP_DELAY_INIT_VAL,
  257. .owner = THIS_MODULE,
  258. };
  259. static void max77857_calc_range(struct device *dev, enum max77857_id id)
  260. {
  261. struct linear_range *range;
  262. unsigned long vref_step;
  263. u32 rtop = 0;
  264. u32 rbot = 0;
  265. device_property_read_u32(dev, "adi,rtop-ohms", &rtop);
  266. device_property_read_u32(dev, "adi,rbot-ohms", &rbot);
  267. if (!rbot || !rtop)
  268. return;
  269. switch (id) {
  270. case ID_MAX77831:
  271. case ID_MAX77857:
  272. range = max77857_lin_ranges;
  273. vref_step = 4900UL;
  274. break;
  275. case ID_MAX77859:
  276. case ID_MAX77859A:
  277. range = max77859_lin_ranges;
  278. vref_step = 1250UL;
  279. break;
  280. }
  281. range->step = DIV_ROUND_CLOSEST(vref_step * (rbot + rtop), rbot);
  282. range->min = range->step * range->min_sel;
  283. }
  284. static int max77857_probe(struct i2c_client *client)
  285. {
  286. const struct i2c_device_id *i2c_id;
  287. struct device *dev = &client->dev;
  288. struct regulator_config cfg = { };
  289. struct regulator_dev *rdev;
  290. struct regmap *regmap;
  291. enum max77857_id id;
  292. u32 switch_freq = 0;
  293. int ret;
  294. i2c_id = i2c_client_get_device_id(client);
  295. if (!i2c_id)
  296. return -EINVAL;
  297. id = i2c_id->driver_data;
  298. dev_set_drvdata(dev, (void *)id);
  299. if (id == ID_MAX77859 || id == ID_MAX77859A) {
  300. max77857_regulator_desc.ops = &max77859_regulator_ops;
  301. max77857_regulator_desc.linear_ranges = max77859_lin_ranges;
  302. max77857_regulator_desc.ramp_delay_table = max77859_ramp_table;
  303. max77857_regulator_desc.ramp_delay = max77859_ramp_table[0];
  304. }
  305. if (id == ID_MAX77859A)
  306. max77857_regulator_desc.ops = &max77859a_regulator_ops;
  307. max77857_calc_range(dev, id);
  308. regmap = devm_regmap_init_i2c(client, &max77857_regmap_config);
  309. if (IS_ERR(regmap))
  310. return dev_err_probe(dev, PTR_ERR(regmap),
  311. "cannot initialize regmap\n");
  312. device_property_read_u32(dev, "adi,switch-frequency-hz", &switch_freq);
  313. if (switch_freq) {
  314. switch_freq = find_closest(switch_freq, max77857_switch_freq,
  315. ARRAY_SIZE(max77857_switch_freq));
  316. if (id == ID_MAX77831 && switch_freq == 3)
  317. switch_freq = 2;
  318. switch (id) {
  319. case ID_MAX77831:
  320. case ID_MAX77857:
  321. ret = regmap_update_bits(regmap, MAX77857_REG_CONT1,
  322. MAX77857_CONT1_FREQ, switch_freq);
  323. if (switch_freq >= 2)
  324. break;
  325. max77857_regulator_desc.ramp_delay_table = max77857_ramp_table[1];
  326. max77857_regulator_desc.ramp_delay = max77857_ramp_table[1][0];
  327. break;
  328. case ID_MAX77859:
  329. case ID_MAX77859A:
  330. ret = regmap_update_bits(regmap, MAX77859_REG_CONT1,
  331. MAX77857_CONT1_FREQ, switch_freq);
  332. break;
  333. }
  334. if (ret)
  335. return ret;
  336. }
  337. cfg.dev = dev;
  338. cfg.driver_data = (void *)id;
  339. cfg.regmap = regmap;
  340. cfg.init_data = of_get_regulator_init_data(dev, dev->of_node,
  341. &max77857_regulator_desc);
  342. if (!cfg.init_data)
  343. return -ENOMEM;
  344. rdev = devm_regulator_register(dev, &max77857_regulator_desc, &cfg);
  345. if (IS_ERR(rdev))
  346. return dev_err_probe(dev, PTR_ERR(rdev),
  347. "cannot register regulator\n");
  348. return 0;
  349. }
  350. static const struct i2c_device_id max77857_id[] = {
  351. { "max77831", ID_MAX77831 },
  352. { "max77857", ID_MAX77857 },
  353. { "max77859", ID_MAX77859 },
  354. { "max77859a", ID_MAX77859A },
  355. { }
  356. };
  357. MODULE_DEVICE_TABLE(i2c, max77857_id);
  358. static const struct of_device_id max77857_of_id[] = {
  359. { .compatible = "adi,max77831", .data = (void *)ID_MAX77831 },
  360. { .compatible = "adi,max77857", .data = (void *)ID_MAX77857 },
  361. { .compatible = "adi,max77859", .data = (void *)ID_MAX77859 },
  362. { .compatible = "adi,max77859a", .data = (void *)ID_MAX77859A },
  363. { }
  364. };
  365. MODULE_DEVICE_TABLE(of, max77857_of_id);
  366. static struct i2c_driver max77857_driver = {
  367. .driver = {
  368. .name = "max77857",
  369. .of_match_table = max77857_of_id,
  370. },
  371. .id_table = max77857_id,
  372. .probe = max77857_probe,
  373. };
  374. module_i2c_driver(max77857_driver);
  375. MODULE_DESCRIPTION("Analog Devices MAX77857 Buck-Boost Converter Driver");
  376. MODULE_AUTHOR("Ibrahim Tilki <Ibrahim.Tilki@analog.com>");
  377. MODULE_AUTHOR("Okan Sahin <Okan.Sahin@analog.com>");
  378. MODULE_LICENSE("GPL");