max1586.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * max1586.c -- Voltage and current regulation for the Maxim 1586
  4. *
  5. * Copyright (C) 2008 Robert Jarzmik
  6. */
  7. #include <linux/module.h>
  8. #include <linux/err.h>
  9. #include <linux/i2c.h>
  10. #include <linux/platform_device.h>
  11. #include <linux/regulator/driver.h>
  12. #include <linux/slab.h>
  13. #include <linux/regulator/max1586.h>
  14. #include <linux/of_device.h>
  15. #include <linux/regulator/of_regulator.h>
  16. #define MAX1586_V3_MAX_VSEL 31
  17. #define MAX1586_V6_MAX_VSEL 3
  18. #define MAX1586_V3_MIN_UV 700000
  19. #define MAX1586_V3_MAX_UV 1475000
  20. #define MAX1586_V6_MIN_UV 0
  21. #define MAX1586_V6_MAX_UV 3000000
  22. #define I2C_V3_SELECT (0 << 5)
  23. #define I2C_V6_SELECT (1 << 5)
  24. struct max1586_data {
  25. struct i2c_client *client;
  26. /* min/max V3 voltage */
  27. unsigned int min_uV;
  28. unsigned int max_uV;
  29. unsigned int v3_curr_sel;
  30. unsigned int v6_curr_sel;
  31. };
  32. /*
  33. * V6 voltage
  34. * On I2C bus, sending a "x" byte to the max1586 means :
  35. * set V6 to either 0V, 1.8V, 2.5V, 3V depending on (x & 0x3)
  36. * As regulator framework doesn't accept voltages to be 0V, we use 1uV.
  37. */
  38. static const unsigned int v6_voltages_uv[] = { 1, 1800000, 2500000, 3000000 };
  39. /*
  40. * V3 voltage
  41. * On I2C bus, sending a "x" byte to the max1586 means :
  42. * set V3 to 0.700V + (x & 0x1f) * 0.025V
  43. * This voltage can be increased by external resistors
  44. * R24 and R25=100kOhm as described in the data sheet.
  45. * The gain is approximately: 1 + R24/R25 + R24/185.5kOhm
  46. */
  47. static int max1586_v3_get_voltage_sel(struct regulator_dev *rdev)
  48. {
  49. struct max1586_data *max1586 = rdev_get_drvdata(rdev);
  50. return max1586->v3_curr_sel;
  51. }
  52. static int max1586_v3_set_voltage_sel(struct regulator_dev *rdev,
  53. unsigned selector)
  54. {
  55. struct max1586_data *max1586 = rdev_get_drvdata(rdev);
  56. struct i2c_client *client = max1586->client;
  57. int ret;
  58. u8 v3_prog;
  59. dev_dbg(&client->dev, "changing voltage v3 to %dmv\n",
  60. regulator_list_voltage_linear(rdev, selector) / 1000);
  61. v3_prog = I2C_V3_SELECT | (u8) selector;
  62. ret = i2c_smbus_write_byte(client, v3_prog);
  63. if (ret)
  64. return ret;
  65. max1586->v3_curr_sel = selector;
  66. return 0;
  67. }
  68. static int max1586_v6_get_voltage_sel(struct regulator_dev *rdev)
  69. {
  70. struct max1586_data *max1586 = rdev_get_drvdata(rdev);
  71. return max1586->v6_curr_sel;
  72. }
  73. static int max1586_v6_set_voltage_sel(struct regulator_dev *rdev,
  74. unsigned int selector)
  75. {
  76. struct max1586_data *max1586 = rdev_get_drvdata(rdev);
  77. struct i2c_client *client = max1586->client;
  78. u8 v6_prog;
  79. int ret;
  80. dev_dbg(&client->dev, "changing voltage v6 to %dmv\n",
  81. rdev->desc->volt_table[selector] / 1000);
  82. v6_prog = I2C_V6_SELECT | (u8) selector;
  83. ret = i2c_smbus_write_byte(client, v6_prog);
  84. if (ret)
  85. return ret;
  86. max1586->v6_curr_sel = selector;
  87. return 0;
  88. }
  89. /*
  90. * The Maxim 1586 controls V3 and V6 voltages, but offers no way of reading back
  91. * the set up value.
  92. */
  93. static const struct regulator_ops max1586_v3_ops = {
  94. .get_voltage_sel = max1586_v3_get_voltage_sel,
  95. .set_voltage_sel = max1586_v3_set_voltage_sel,
  96. .list_voltage = regulator_list_voltage_linear,
  97. .map_voltage = regulator_map_voltage_linear,
  98. };
  99. static const struct regulator_ops max1586_v6_ops = {
  100. .get_voltage_sel = max1586_v6_get_voltage_sel,
  101. .set_voltage_sel = max1586_v6_set_voltage_sel,
  102. .list_voltage = regulator_list_voltage_table,
  103. };
  104. static struct regulator_desc max1586_reg[] = {
  105. {
  106. .name = "Output_V3",
  107. .id = MAX1586_V3,
  108. .ops = &max1586_v3_ops,
  109. .type = REGULATOR_VOLTAGE,
  110. .n_voltages = MAX1586_V3_MAX_VSEL + 1,
  111. .owner = THIS_MODULE,
  112. },
  113. {
  114. .name = "Output_V6",
  115. .id = MAX1586_V6,
  116. .ops = &max1586_v6_ops,
  117. .type = REGULATOR_VOLTAGE,
  118. .n_voltages = MAX1586_V6_MAX_VSEL + 1,
  119. .volt_table = v6_voltages_uv,
  120. .owner = THIS_MODULE,
  121. },
  122. };
  123. static int of_get_max1586_platform_data(struct device *dev,
  124. struct max1586_platform_data *pdata)
  125. {
  126. struct max1586_subdev_data *sub;
  127. struct of_regulator_match rmatch[ARRAY_SIZE(max1586_reg)] = { };
  128. struct device_node *np = dev->of_node;
  129. int i, matched;
  130. if (of_property_read_u32(np, "v3-gain",
  131. &pdata->v3_gain) < 0) {
  132. dev_err(dev, "%pOF has no 'v3-gain' property\n", np);
  133. return -EINVAL;
  134. }
  135. np = of_get_child_by_name(np, "regulators");
  136. if (!np) {
  137. dev_err(dev, "missing 'regulators' subnode in DT\n");
  138. return -EINVAL;
  139. }
  140. for (i = 0; i < ARRAY_SIZE(rmatch); i++)
  141. rmatch[i].name = max1586_reg[i].name;
  142. matched = of_regulator_match(dev, np, rmatch, ARRAY_SIZE(rmatch));
  143. of_node_put(np);
  144. /*
  145. * If matched is 0, ie. neither Output_V3 nor Output_V6 have been found,
  146. * return 0, which signals the normal situation where no subregulator is
  147. * available. This is normal because the max1586 doesn't provide any
  148. * readback support, so the subregulators can't report any status
  149. * anyway. If matched < 0, return the error.
  150. */
  151. if (matched <= 0)
  152. return matched;
  153. pdata->subdevs = devm_kcalloc(dev,
  154. matched,
  155. sizeof(struct max1586_subdev_data),
  156. GFP_KERNEL);
  157. if (!pdata->subdevs)
  158. return -ENOMEM;
  159. pdata->num_subdevs = matched;
  160. sub = pdata->subdevs;
  161. for (i = 0; i < matched; i++) {
  162. sub->id = i;
  163. sub->name = rmatch[i].of_node->name;
  164. sub->platform_data = rmatch[i].init_data;
  165. sub++;
  166. }
  167. return 0;
  168. }
  169. static const struct of_device_id max1586_of_match[] = {
  170. { .compatible = "maxim,max1586", },
  171. {},
  172. };
  173. MODULE_DEVICE_TABLE(of, max1586_of_match);
  174. static int max1586_pmic_probe(struct i2c_client *client,
  175. const struct i2c_device_id *i2c_id)
  176. {
  177. struct max1586_platform_data *pdata, pdata_of;
  178. struct regulator_config config = { };
  179. struct max1586_data *max1586;
  180. int i, id, ret;
  181. const struct of_device_id *match;
  182. pdata = dev_get_platdata(&client->dev);
  183. if (client->dev.of_node && !pdata) {
  184. match = of_match_device(of_match_ptr(max1586_of_match),
  185. &client->dev);
  186. if (!match) {
  187. dev_err(&client->dev, "Error: No device match found\n");
  188. return -ENODEV;
  189. }
  190. ret = of_get_max1586_platform_data(&client->dev, &pdata_of);
  191. if (ret < 0)
  192. return ret;
  193. pdata = &pdata_of;
  194. }
  195. max1586 = devm_kzalloc(&client->dev, sizeof(struct max1586_data),
  196. GFP_KERNEL);
  197. if (!max1586)
  198. return -ENOMEM;
  199. max1586->client = client;
  200. if (!pdata->v3_gain)
  201. return -EINVAL;
  202. max1586->min_uV = MAX1586_V3_MIN_UV / 1000 * pdata->v3_gain / 1000;
  203. max1586->max_uV = MAX1586_V3_MAX_UV / 1000 * pdata->v3_gain / 1000;
  204. /* Set curr_sel to default voltage on power-up */
  205. max1586->v3_curr_sel = 24; /* 1.3V */
  206. max1586->v6_curr_sel = 0;
  207. for (i = 0; i < pdata->num_subdevs && i <= MAX1586_V6; i++) {
  208. struct regulator_dev *rdev;
  209. id = pdata->subdevs[i].id;
  210. if (!pdata->subdevs[i].platform_data)
  211. continue;
  212. if (id < MAX1586_V3 || id > MAX1586_V6) {
  213. dev_err(&client->dev, "invalid regulator id %d\n", id);
  214. return -EINVAL;
  215. }
  216. if (id == MAX1586_V3) {
  217. max1586_reg[id].min_uV = max1586->min_uV;
  218. max1586_reg[id].uV_step =
  219. (max1586->max_uV - max1586->min_uV) /
  220. MAX1586_V3_MAX_VSEL;
  221. }
  222. config.dev = &client->dev;
  223. config.init_data = pdata->subdevs[i].platform_data;
  224. config.driver_data = max1586;
  225. rdev = devm_regulator_register(&client->dev,
  226. &max1586_reg[id], &config);
  227. if (IS_ERR(rdev)) {
  228. dev_err(&client->dev, "failed to register %s\n",
  229. max1586_reg[id].name);
  230. return PTR_ERR(rdev);
  231. }
  232. }
  233. i2c_set_clientdata(client, max1586);
  234. dev_info(&client->dev, "Maxim 1586 regulator driver loaded\n");
  235. return 0;
  236. }
  237. static const struct i2c_device_id max1586_id[] = {
  238. { "max1586", 0 },
  239. { }
  240. };
  241. MODULE_DEVICE_TABLE(i2c, max1586_id);
  242. static struct i2c_driver max1586_pmic_driver = {
  243. .probe = max1586_pmic_probe,
  244. .driver = {
  245. .name = "max1586",
  246. .of_match_table = of_match_ptr(max1586_of_match),
  247. },
  248. .id_table = max1586_id,
  249. };
  250. static int __init max1586_pmic_init(void)
  251. {
  252. return i2c_add_driver(&max1586_pmic_driver);
  253. }
  254. subsys_initcall(max1586_pmic_init);
  255. static void __exit max1586_pmic_exit(void)
  256. {
  257. i2c_del_driver(&max1586_pmic_driver);
  258. }
  259. module_exit(max1586_pmic_exit);
  260. /* Module information */
  261. MODULE_DESCRIPTION("MAXIM 1586 voltage regulator driver");
  262. MODULE_AUTHOR("Robert Jarzmik");
  263. MODULE_LICENSE("GPL");