virtual.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * reg-virtual-consumer.c
  4. *
  5. * Copyright 2008 Wolfson Microelectronics PLC.
  6. *
  7. * Author: Mark Brown <[email protected]>
  8. */
  9. #include <linux/err.h>
  10. #include <linux/mutex.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/regulator/consumer.h>
  13. #include <linux/slab.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. struct virtual_consumer_data {
  17. struct mutex lock;
  18. struct regulator *regulator;
  19. bool enabled;
  20. int min_uV;
  21. int max_uV;
  22. int min_uA;
  23. int max_uA;
  24. unsigned int mode;
  25. };
  26. static void update_voltage_constraints(struct device *dev,
  27. struct virtual_consumer_data *data)
  28. {
  29. int ret;
  30. if (data->min_uV && data->max_uV
  31. && data->min_uV <= data->max_uV) {
  32. dev_dbg(dev, "Requesting %d-%duV\n",
  33. data->min_uV, data->max_uV);
  34. ret = regulator_set_voltage(data->regulator,
  35. data->min_uV, data->max_uV);
  36. if (ret != 0) {
  37. dev_err(dev,
  38. "regulator_set_voltage() failed: %d\n", ret);
  39. return;
  40. }
  41. }
  42. if (data->min_uV && data->max_uV && !data->enabled) {
  43. dev_dbg(dev, "Enabling regulator\n");
  44. ret = regulator_enable(data->regulator);
  45. if (ret == 0)
  46. data->enabled = true;
  47. else
  48. dev_err(dev, "regulator_enable() failed: %d\n",
  49. ret);
  50. }
  51. if (!(data->min_uV && data->max_uV) && data->enabled) {
  52. dev_dbg(dev, "Disabling regulator\n");
  53. ret = regulator_disable(data->regulator);
  54. if (ret == 0)
  55. data->enabled = false;
  56. else
  57. dev_err(dev, "regulator_disable() failed: %d\n",
  58. ret);
  59. }
  60. }
  61. static void update_current_limit_constraints(struct device *dev,
  62. struct virtual_consumer_data *data)
  63. {
  64. int ret;
  65. if (data->max_uA
  66. && data->min_uA <= data->max_uA) {
  67. dev_dbg(dev, "Requesting %d-%duA\n",
  68. data->min_uA, data->max_uA);
  69. ret = regulator_set_current_limit(data->regulator,
  70. data->min_uA, data->max_uA);
  71. if (ret != 0) {
  72. dev_err(dev,
  73. "regulator_set_current_limit() failed: %d\n",
  74. ret);
  75. return;
  76. }
  77. }
  78. if (data->max_uA && !data->enabled) {
  79. dev_dbg(dev, "Enabling regulator\n");
  80. ret = regulator_enable(data->regulator);
  81. if (ret == 0)
  82. data->enabled = true;
  83. else
  84. dev_err(dev, "regulator_enable() failed: %d\n",
  85. ret);
  86. }
  87. if (!(data->min_uA && data->max_uA) && data->enabled) {
  88. dev_dbg(dev, "Disabling regulator\n");
  89. ret = regulator_disable(data->regulator);
  90. if (ret == 0)
  91. data->enabled = false;
  92. else
  93. dev_err(dev, "regulator_disable() failed: %d\n",
  94. ret);
  95. }
  96. }
  97. static ssize_t show_min_uV(struct device *dev,
  98. struct device_attribute *attr, char *buf)
  99. {
  100. struct virtual_consumer_data *data = dev_get_drvdata(dev);
  101. return sprintf(buf, "%d\n", data->min_uV);
  102. }
  103. static ssize_t set_min_uV(struct device *dev, struct device_attribute *attr,
  104. const char *buf, size_t count)
  105. {
  106. struct virtual_consumer_data *data = dev_get_drvdata(dev);
  107. long val;
  108. if (kstrtol(buf, 10, &val) != 0)
  109. return count;
  110. mutex_lock(&data->lock);
  111. data->min_uV = val;
  112. update_voltage_constraints(dev, data);
  113. mutex_unlock(&data->lock);
  114. return count;
  115. }
  116. static ssize_t show_max_uV(struct device *dev,
  117. struct device_attribute *attr, char *buf)
  118. {
  119. struct virtual_consumer_data *data = dev_get_drvdata(dev);
  120. return sprintf(buf, "%d\n", data->max_uV);
  121. }
  122. static ssize_t set_max_uV(struct device *dev, struct device_attribute *attr,
  123. const char *buf, size_t count)
  124. {
  125. struct virtual_consumer_data *data = dev_get_drvdata(dev);
  126. long val;
  127. if (kstrtol(buf, 10, &val) != 0)
  128. return count;
  129. mutex_lock(&data->lock);
  130. data->max_uV = val;
  131. update_voltage_constraints(dev, data);
  132. mutex_unlock(&data->lock);
  133. return count;
  134. }
  135. static ssize_t show_min_uA(struct device *dev,
  136. struct device_attribute *attr, char *buf)
  137. {
  138. struct virtual_consumer_data *data = dev_get_drvdata(dev);
  139. return sprintf(buf, "%d\n", data->min_uA);
  140. }
  141. static ssize_t set_min_uA(struct device *dev, struct device_attribute *attr,
  142. const char *buf, size_t count)
  143. {
  144. struct virtual_consumer_data *data = dev_get_drvdata(dev);
  145. long val;
  146. if (kstrtol(buf, 10, &val) != 0)
  147. return count;
  148. mutex_lock(&data->lock);
  149. data->min_uA = val;
  150. update_current_limit_constraints(dev, data);
  151. mutex_unlock(&data->lock);
  152. return count;
  153. }
  154. static ssize_t show_max_uA(struct device *dev,
  155. struct device_attribute *attr, char *buf)
  156. {
  157. struct virtual_consumer_data *data = dev_get_drvdata(dev);
  158. return sprintf(buf, "%d\n", data->max_uA);
  159. }
  160. static ssize_t set_max_uA(struct device *dev, struct device_attribute *attr,
  161. const char *buf, size_t count)
  162. {
  163. struct virtual_consumer_data *data = dev_get_drvdata(dev);
  164. long val;
  165. if (kstrtol(buf, 10, &val) != 0)
  166. return count;
  167. mutex_lock(&data->lock);
  168. data->max_uA = val;
  169. update_current_limit_constraints(dev, data);
  170. mutex_unlock(&data->lock);
  171. return count;
  172. }
  173. static ssize_t show_mode(struct device *dev,
  174. struct device_attribute *attr, char *buf)
  175. {
  176. struct virtual_consumer_data *data = dev_get_drvdata(dev);
  177. switch (data->mode) {
  178. case REGULATOR_MODE_FAST:
  179. return sprintf(buf, "fast\n");
  180. case REGULATOR_MODE_NORMAL:
  181. return sprintf(buf, "normal\n");
  182. case REGULATOR_MODE_IDLE:
  183. return sprintf(buf, "idle\n");
  184. case REGULATOR_MODE_STANDBY:
  185. return sprintf(buf, "standby\n");
  186. default:
  187. return sprintf(buf, "unknown\n");
  188. }
  189. }
  190. static ssize_t set_mode(struct device *dev, struct device_attribute *attr,
  191. const char *buf, size_t count)
  192. {
  193. struct virtual_consumer_data *data = dev_get_drvdata(dev);
  194. unsigned int mode;
  195. int ret;
  196. /*
  197. * sysfs_streq() doesn't need the \n's, but we add them so the strings
  198. * will be shared with show_mode(), above.
  199. */
  200. if (sysfs_streq(buf, "fast\n"))
  201. mode = REGULATOR_MODE_FAST;
  202. else if (sysfs_streq(buf, "normal\n"))
  203. mode = REGULATOR_MODE_NORMAL;
  204. else if (sysfs_streq(buf, "idle\n"))
  205. mode = REGULATOR_MODE_IDLE;
  206. else if (sysfs_streq(buf, "standby\n"))
  207. mode = REGULATOR_MODE_STANDBY;
  208. else {
  209. dev_err(dev, "Configuring invalid mode\n");
  210. return count;
  211. }
  212. mutex_lock(&data->lock);
  213. ret = regulator_set_mode(data->regulator, mode);
  214. if (ret == 0)
  215. data->mode = mode;
  216. else
  217. dev_err(dev, "Failed to configure mode: %d\n", ret);
  218. mutex_unlock(&data->lock);
  219. return count;
  220. }
  221. static DEVICE_ATTR(min_microvolts, 0664, show_min_uV, set_min_uV);
  222. static DEVICE_ATTR(max_microvolts, 0664, show_max_uV, set_max_uV);
  223. static DEVICE_ATTR(min_microamps, 0664, show_min_uA, set_min_uA);
  224. static DEVICE_ATTR(max_microamps, 0664, show_max_uA, set_max_uA);
  225. static DEVICE_ATTR(mode, 0664, show_mode, set_mode);
  226. static struct attribute *regulator_virtual_attributes[] = {
  227. &dev_attr_min_microvolts.attr,
  228. &dev_attr_max_microvolts.attr,
  229. &dev_attr_min_microamps.attr,
  230. &dev_attr_max_microamps.attr,
  231. &dev_attr_mode.attr,
  232. NULL
  233. };
  234. static const struct attribute_group regulator_virtual_attr_group = {
  235. .attrs = regulator_virtual_attributes,
  236. };
  237. #ifdef CONFIG_OF
  238. static const struct of_device_id regulator_virtual_consumer_of_match[] = {
  239. { .compatible = "regulator-virtual-consumer" },
  240. {},
  241. };
  242. MODULE_DEVICE_TABLE(of, regulator_virtual_consumer_of_match);
  243. #endif
  244. static int regulator_virtual_probe(struct platform_device *pdev)
  245. {
  246. char *reg_id = dev_get_platdata(&pdev->dev);
  247. struct virtual_consumer_data *drvdata;
  248. static bool warned;
  249. int ret;
  250. if (!warned) {
  251. warned = true;
  252. pr_warn("**********************************************************\n");
  253. pr_warn("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **\n");
  254. pr_warn("** **\n");
  255. pr_warn("** regulator-virtual-consumer is only for testing and **\n");
  256. pr_warn("** debugging. Do not use it in a production kernel. **\n");
  257. pr_warn("** **\n");
  258. pr_warn("** NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE **\n");
  259. pr_warn("**********************************************************\n");
  260. }
  261. drvdata = devm_kzalloc(&pdev->dev, sizeof(struct virtual_consumer_data),
  262. GFP_KERNEL);
  263. if (drvdata == NULL)
  264. return -ENOMEM;
  265. /*
  266. * This virtual consumer does not have any hardware-defined supply
  267. * name, so just allow the regulator to be specified in a property
  268. * named "default-supply" when we're being probed from devicetree.
  269. */
  270. if (!reg_id && pdev->dev.of_node)
  271. reg_id = "default";
  272. mutex_init(&drvdata->lock);
  273. drvdata->regulator = devm_regulator_get(&pdev->dev, reg_id);
  274. if (IS_ERR(drvdata->regulator))
  275. return dev_err_probe(&pdev->dev, PTR_ERR(drvdata->regulator),
  276. "Failed to obtain supply '%s'\n",
  277. reg_id);
  278. ret = sysfs_create_group(&pdev->dev.kobj,
  279. &regulator_virtual_attr_group);
  280. if (ret != 0) {
  281. dev_err(&pdev->dev,
  282. "Failed to create attribute group: %d\n", ret);
  283. return ret;
  284. }
  285. drvdata->mode = regulator_get_mode(drvdata->regulator);
  286. platform_set_drvdata(pdev, drvdata);
  287. return 0;
  288. }
  289. static int regulator_virtual_remove(struct platform_device *pdev)
  290. {
  291. struct virtual_consumer_data *drvdata = platform_get_drvdata(pdev);
  292. sysfs_remove_group(&pdev->dev.kobj, &regulator_virtual_attr_group);
  293. if (drvdata->enabled)
  294. regulator_disable(drvdata->regulator);
  295. return 0;
  296. }
  297. static struct platform_driver regulator_virtual_consumer_driver = {
  298. .probe = regulator_virtual_probe,
  299. .remove = regulator_virtual_remove,
  300. .driver = {
  301. .name = "reg-virt-consumer",
  302. .of_match_table = of_match_ptr(regulator_virtual_consumer_of_match),
  303. },
  304. };
  305. module_platform_driver(regulator_virtual_consumer_driver);
  306. MODULE_AUTHOR("Mark Brown <[email protected]>");
  307. MODULE_DESCRIPTION("Virtual regulator consumer");
  308. MODULE_LICENSE("GPL");
  309. MODULE_ALIAS("platform:reg-virt-consumer");