rt4801-regulator.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <linux/gpio/consumer.h>
  3. #include <linux/i2c.h>
  4. #include <linux/kernel.h>
  5. #include <linux/module.h>
  6. #include <linux/of.h>
  7. #include <linux/regmap.h>
  8. #include <linux/regulator/driver.h>
  9. #define RT4801_REG_VOP 0x00
  10. #define RT4801_REG_VON 0x01
  11. #define RT4801_REG_APPS 0x03
  12. #define VOUT_MASK 0x1F
  13. #define MIN_UV 4000000
  14. #define STEP_UV 100000
  15. #define MAX_UV 6000000
  16. #define N_VOLTAGES ((MAX_UV - MIN_UV) / STEP_UV + 1)
  17. #define DSV_OUT_POS 0
  18. #define DSV_OUT_NEG 1
  19. #define DSV_OUT_MAX 2
  20. #define DSVP_ENABLE BIT(0)
  21. #define DSVN_ENABLE BIT(1)
  22. #define DSVALL_ENABLE (DSVP_ENABLE | DSVN_ENABLE)
  23. struct rt4801_priv {
  24. struct device *dev;
  25. struct gpio_desc *enable_gpios[DSV_OUT_MAX];
  26. unsigned int enable_flag;
  27. unsigned int volt_sel[DSV_OUT_MAX];
  28. };
  29. static int rt4801_of_parse_cb(struct device_node *np,
  30. const struct regulator_desc *desc,
  31. struct regulator_config *config)
  32. {
  33. struct rt4801_priv *priv = config->driver_data;
  34. int id = desc->id;
  35. if (priv->enable_gpios[id]) {
  36. dev_warn(priv->dev, "duplicated enable-gpios property\n");
  37. return 0;
  38. }
  39. priv->enable_gpios[id] = devm_fwnode_gpiod_get_index(priv->dev,
  40. of_fwnode_handle(np),
  41. "enable", 0,
  42. GPIOD_OUT_HIGH,
  43. "rt4801");
  44. if (IS_ERR(priv->enable_gpios[id]))
  45. priv->enable_gpios[id] = NULL;
  46. return 0;
  47. }
  48. static int rt4801_set_voltage_sel(struct regulator_dev *rdev, unsigned int selector)
  49. {
  50. struct rt4801_priv *priv = rdev_get_drvdata(rdev);
  51. int id = rdev_get_id(rdev), ret;
  52. if (priv->enable_flag & BIT(id)) {
  53. ret = regulator_set_voltage_sel_regmap(rdev, selector);
  54. if (ret)
  55. return ret;
  56. }
  57. priv->volt_sel[id] = selector;
  58. return 0;
  59. }
  60. static int rt4801_get_voltage_sel(struct regulator_dev *rdev)
  61. {
  62. struct rt4801_priv *priv = rdev_get_drvdata(rdev);
  63. int id = rdev_get_id(rdev);
  64. if (priv->enable_flag & BIT(id))
  65. return regulator_get_voltage_sel_regmap(rdev);
  66. return priv->volt_sel[id];
  67. }
  68. static int rt4801_enable(struct regulator_dev *rdev)
  69. {
  70. struct rt4801_priv *priv = rdev_get_drvdata(rdev);
  71. int id = rdev_get_id(rdev), ret;
  72. if (!priv->enable_gpios[id]) {
  73. dev_warn(&rdev->dev, "no dedicated gpio can control\n");
  74. goto bypass_gpio;
  75. }
  76. gpiod_set_value(priv->enable_gpios[id], 1);
  77. bypass_gpio:
  78. ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, priv->volt_sel[id]);
  79. if (ret)
  80. return ret;
  81. priv->enable_flag |= BIT(id);
  82. return 0;
  83. }
  84. static int rt4801_disable(struct regulator_dev *rdev)
  85. {
  86. struct rt4801_priv *priv = rdev_get_drvdata(rdev);
  87. int id = rdev_get_id(rdev);
  88. if (!priv->enable_gpios[id]) {
  89. dev_warn(&rdev->dev, "no dedicated gpio can control\n");
  90. goto bypass_gpio;
  91. }
  92. gpiod_set_value(priv->enable_gpios[id], 0);
  93. bypass_gpio:
  94. priv->enable_flag &= ~BIT(id);
  95. return 0;
  96. }
  97. static int rt4801_is_enabled(struct regulator_dev *rdev)
  98. {
  99. struct rt4801_priv *priv = rdev_get_drvdata(rdev);
  100. int id = rdev_get_id(rdev);
  101. return !!(priv->enable_flag & BIT(id));
  102. }
  103. static const struct regulator_ops rt4801_regulator_ops = {
  104. .list_voltage = regulator_list_voltage_linear,
  105. .set_voltage_sel = rt4801_set_voltage_sel,
  106. .get_voltage_sel = rt4801_get_voltage_sel,
  107. .enable = rt4801_enable,
  108. .disable = rt4801_disable,
  109. .is_enabled = rt4801_is_enabled,
  110. };
  111. static const struct regulator_desc rt4801_regulator_descs[] = {
  112. {
  113. .name = "DSVP",
  114. .ops = &rt4801_regulator_ops,
  115. .of_match = of_match_ptr("DSVP"),
  116. .of_parse_cb = rt4801_of_parse_cb,
  117. .type = REGULATOR_VOLTAGE,
  118. .id = DSV_OUT_POS,
  119. .min_uV = MIN_UV,
  120. .uV_step = STEP_UV,
  121. .n_voltages = N_VOLTAGES,
  122. .owner = THIS_MODULE,
  123. .vsel_reg = RT4801_REG_VOP,
  124. .vsel_mask = VOUT_MASK,
  125. },
  126. {
  127. .name = "DSVN",
  128. .ops = &rt4801_regulator_ops,
  129. .of_match = of_match_ptr("DSVN"),
  130. .of_parse_cb = rt4801_of_parse_cb,
  131. .type = REGULATOR_VOLTAGE,
  132. .id = DSV_OUT_NEG,
  133. .min_uV = MIN_UV,
  134. .uV_step = STEP_UV,
  135. .n_voltages = N_VOLTAGES,
  136. .owner = THIS_MODULE,
  137. .vsel_reg = RT4801_REG_VON,
  138. .vsel_mask = VOUT_MASK,
  139. },
  140. };
  141. static const struct regmap_config rt4801_regmap_config = {
  142. .reg_bits = 8,
  143. .val_bits = 8,
  144. .max_register = RT4801_REG_APPS,
  145. };
  146. static int rt4801_probe(struct i2c_client *i2c)
  147. {
  148. struct rt4801_priv *priv;
  149. struct regmap *regmap;
  150. int i;
  151. priv = devm_kzalloc(&i2c->dev, sizeof(*priv), GFP_KERNEL);
  152. if (!priv)
  153. return -ENOMEM;
  154. priv->dev = &i2c->dev;
  155. /* bootloader will on, driver only reconfigure enable to all output high */
  156. priv->enable_flag = DSVALL_ENABLE;
  157. regmap = devm_regmap_init_i2c(i2c, &rt4801_regmap_config);
  158. if (IS_ERR(regmap)) {
  159. dev_err(&i2c->dev, "Failed to init regmap\n");
  160. return PTR_ERR(regmap);
  161. }
  162. for (i = 0; i < DSV_OUT_MAX; i++) {
  163. priv->enable_gpios[i] = devm_gpiod_get_index_optional(&i2c->dev,
  164. "enable",
  165. i,
  166. GPIOD_OUT_HIGH);
  167. if (IS_ERR(priv->enable_gpios[i])) {
  168. dev_err(&i2c->dev, "Failed to get gpios\n");
  169. return PTR_ERR(priv->enable_gpios[i]);
  170. }
  171. }
  172. for (i = 0; i < DSV_OUT_MAX; i++) {
  173. const struct regulator_desc *desc = rt4801_regulator_descs + i;
  174. struct regulator_config config = { .dev = &i2c->dev, .driver_data = priv,
  175. .regmap = regmap, };
  176. struct regulator_dev *rdev;
  177. unsigned int val;
  178. int ret;
  179. /* initialize volt_sel variable */
  180. ret = regmap_read(regmap, desc->vsel_reg, &val);
  181. if (ret)
  182. return ret;
  183. priv->volt_sel[i] = val & desc->vsel_mask;
  184. rdev = devm_regulator_register(&i2c->dev, desc, &config);
  185. if (IS_ERR(rdev)) {
  186. dev_err(&i2c->dev, "Failed to register [%d] regulator\n", i);
  187. return PTR_ERR(rdev);
  188. }
  189. }
  190. return 0;
  191. }
  192. static const struct of_device_id __maybe_unused rt4801_of_id[] = {
  193. { .compatible = "richtek,rt4801", },
  194. { },
  195. };
  196. MODULE_DEVICE_TABLE(of, rt4801_of_id);
  197. static struct i2c_driver rt4801_driver = {
  198. .driver = {
  199. .name = "rt4801",
  200. .of_match_table = of_match_ptr(rt4801_of_id),
  201. },
  202. .probe_new = rt4801_probe,
  203. };
  204. module_i2c_driver(rt4801_driver);
  205. MODULE_AUTHOR("ChiYuan Hwang <[email protected]>");
  206. MODULE_DESCRIPTION("Richtek RT4801 Display Bias Driver");
  207. MODULE_LICENSE("GPL v2");