rt6245-regulator.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <linux/bitops.h>
  3. #include <linux/delay.h>
  4. #include <linux/gpio/consumer.h>
  5. #include <linux/i2c.h>
  6. #include <linux/kernel.h>
  7. #include <linux/module.h>
  8. #include <linux/regmap.h>
  9. #include <linux/regulator/driver.h>
  10. #include <linux/regulator/of_regulator.h>
  11. #define RT6245_VIRT_OCLIMIT 0x00
  12. #define RT6245_VIRT_OTLEVEL 0x01
  13. #define RT6245_VIRT_PGDLYTIME 0x02
  14. #define RT6245_VIRT_SLEWRATE 0x03
  15. #define RT6245_VIRT_SWFREQ 0x04
  16. #define RT6245_VIRT_VOUT 0x05
  17. #define RT6245_VOUT_MASK GENMASK(6, 0)
  18. #define RT6245_SLEW_MASK GENMASK(2, 0)
  19. #define RT6245_CHKSUM_MASK BIT(7)
  20. #define RT6245_CODE_MASK GENMASK(6, 0)
  21. /* HW Enable + Soft start time */
  22. #define RT6245_ENTIME_IN_US 5000
  23. #define RT6245_VOUT_MINUV 437500
  24. #define RT6245_VOUT_MAXUV 1387500
  25. #define RT6245_VOUT_STEPUV 12500
  26. #define RT6245_NUM_VOUT ((RT6245_VOUT_MAXUV - RT6245_VOUT_MINUV) / RT6245_VOUT_STEPUV + 1)
  27. struct rt6245_priv {
  28. struct gpio_desc *enable_gpio;
  29. bool enable_state;
  30. };
  31. static int rt6245_enable(struct regulator_dev *rdev)
  32. {
  33. struct rt6245_priv *priv = rdev_get_drvdata(rdev);
  34. struct regmap *regmap = rdev_get_regmap(rdev);
  35. int ret;
  36. if (!priv->enable_gpio)
  37. return 0;
  38. gpiod_direction_output(priv->enable_gpio, 1);
  39. usleep_range(RT6245_ENTIME_IN_US, RT6245_ENTIME_IN_US + 1000);
  40. regcache_cache_only(regmap, false);
  41. ret = regcache_sync(regmap);
  42. if (ret)
  43. return ret;
  44. priv->enable_state = true;
  45. return 0;
  46. }
  47. static int rt6245_disable(struct regulator_dev *rdev)
  48. {
  49. struct rt6245_priv *priv = rdev_get_drvdata(rdev);
  50. struct regmap *regmap = rdev_get_regmap(rdev);
  51. if (!priv->enable_gpio)
  52. return -EINVAL;
  53. regcache_cache_only(regmap, true);
  54. regcache_mark_dirty(regmap);
  55. gpiod_direction_output(priv->enable_gpio, 0);
  56. priv->enable_state = false;
  57. return 0;
  58. }
  59. static int rt6245_is_enabled(struct regulator_dev *rdev)
  60. {
  61. struct rt6245_priv *priv = rdev_get_drvdata(rdev);
  62. return priv->enable_state ? 1 : 0;
  63. }
  64. static const struct regulator_ops rt6245_regulator_ops = {
  65. .list_voltage = regulator_list_voltage_linear,
  66. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  67. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  68. .set_ramp_delay = regulator_set_ramp_delay_regmap,
  69. .enable = rt6245_enable,
  70. .disable = rt6245_disable,
  71. .is_enabled = rt6245_is_enabled,
  72. };
  73. /* ramp delay dividend is 12500 uV/uS, and divisor from 1 to 8 */
  74. static const unsigned int rt6245_ramp_delay_table[] = {
  75. 12500, 6250, 4167, 3125, 2500, 2083, 1786, 1562
  76. };
  77. static const struct regulator_desc rt6245_regulator_desc = {
  78. .name = "rt6245-regulator",
  79. .ops = &rt6245_regulator_ops,
  80. .type = REGULATOR_VOLTAGE,
  81. .min_uV = RT6245_VOUT_MINUV,
  82. .uV_step = RT6245_VOUT_STEPUV,
  83. .n_voltages = RT6245_NUM_VOUT,
  84. .ramp_delay_table = rt6245_ramp_delay_table,
  85. .n_ramp_values = ARRAY_SIZE(rt6245_ramp_delay_table),
  86. .owner = THIS_MODULE,
  87. .vsel_reg = RT6245_VIRT_VOUT,
  88. .vsel_mask = RT6245_VOUT_MASK,
  89. .ramp_reg = RT6245_VIRT_SLEWRATE,
  90. .ramp_mask = RT6245_SLEW_MASK,
  91. };
  92. static int rt6245_init_device_properties(struct device *dev)
  93. {
  94. const struct {
  95. const char *name;
  96. unsigned int reg;
  97. } rt6245_props[] = {
  98. { "richtek,oc-level-select", RT6245_VIRT_OCLIMIT },
  99. { "richtek,ot-level-select", RT6245_VIRT_OTLEVEL },
  100. { "richtek,pgdly-time-select", RT6245_VIRT_PGDLYTIME },
  101. { "richtek,switch-freq-select", RT6245_VIRT_SWFREQ }
  102. };
  103. struct regmap *regmap = dev_get_regmap(dev, NULL);
  104. u8 propval;
  105. int i, ret;
  106. for (i = 0; i < ARRAY_SIZE(rt6245_props); i++) {
  107. ret = device_property_read_u8(dev, rt6245_props[i].name, &propval);
  108. if (ret)
  109. continue;
  110. ret = regmap_write(regmap, rt6245_props[i].reg, propval);
  111. if (ret) {
  112. dev_err(dev, "Fail to apply [%s:%d]\n", rt6245_props[i].name, propval);
  113. return ret;
  114. }
  115. }
  116. return 0;
  117. }
  118. static int rt6245_reg_write(void *context, unsigned int reg, unsigned int val)
  119. {
  120. struct i2c_client *i2c = context;
  121. static const u8 func_base[] = { 0x6F, 0x73, 0x78, 0x61, 0x7C, 0 };
  122. unsigned int code, bit_count;
  123. code = func_base[reg];
  124. code += val;
  125. /* xor checksum for bit 6 to 0 */
  126. bit_count = hweight8(code & RT6245_CODE_MASK);
  127. if (bit_count % 2)
  128. code |= RT6245_CHKSUM_MASK;
  129. else
  130. code &= ~RT6245_CHKSUM_MASK;
  131. return i2c_smbus_write_byte(i2c, code);
  132. }
  133. static const struct reg_default rt6245_reg_defaults[] = {
  134. /* Default over current 14A */
  135. { RT6245_VIRT_OCLIMIT, 2 },
  136. /* Default over temperature 150'c */
  137. { RT6245_VIRT_OTLEVEL, 0 },
  138. /* Default power good delay time 10us */
  139. { RT6245_VIRT_PGDLYTIME, 1 },
  140. /* Default slewrate 12.5mV/uS */
  141. { RT6245_VIRT_SLEWRATE, 0 },
  142. /* Default switch frequency 800KHz */
  143. { RT6245_VIRT_SWFREQ, 1 },
  144. /* Default voltage 750mV */
  145. { RT6245_VIRT_VOUT, 0x19 }
  146. };
  147. static const struct regmap_config rt6245_regmap_config = {
  148. .reg_bits = 8,
  149. .val_bits = 8,
  150. .max_register = RT6245_VIRT_VOUT,
  151. .cache_type = REGCACHE_FLAT,
  152. .reg_defaults = rt6245_reg_defaults,
  153. .num_reg_defaults = ARRAY_SIZE(rt6245_reg_defaults),
  154. .reg_write = rt6245_reg_write,
  155. };
  156. static int rt6245_probe(struct i2c_client *i2c)
  157. {
  158. struct rt6245_priv *priv;
  159. struct regmap *regmap;
  160. struct regulator_config regulator_cfg = {};
  161. struct regulator_dev *rdev;
  162. int ret;
  163. priv = devm_kzalloc(&i2c->dev, sizeof(*priv), GFP_KERNEL);
  164. if (!priv)
  165. return -ENOMEM;
  166. priv->enable_state = true;
  167. priv->enable_gpio = devm_gpiod_get_optional(&i2c->dev, "enable", GPIOD_OUT_HIGH);
  168. if (IS_ERR(priv->enable_gpio)) {
  169. dev_err(&i2c->dev, "Failed to get 'enable' gpio\n");
  170. return PTR_ERR(priv->enable_gpio);
  171. }
  172. usleep_range(RT6245_ENTIME_IN_US, RT6245_ENTIME_IN_US + 1000);
  173. regmap = devm_regmap_init(&i2c->dev, NULL, i2c, &rt6245_regmap_config);
  174. if (IS_ERR(regmap)) {
  175. dev_err(&i2c->dev, "Failed to initialize the regmap\n");
  176. return PTR_ERR(regmap);
  177. }
  178. ret = rt6245_init_device_properties(&i2c->dev);
  179. if (ret) {
  180. dev_err(&i2c->dev, "Failed to initialize device properties\n");
  181. return ret;
  182. }
  183. regulator_cfg.dev = &i2c->dev;
  184. regulator_cfg.of_node = i2c->dev.of_node;
  185. regulator_cfg.regmap = regmap;
  186. regulator_cfg.driver_data = priv;
  187. regulator_cfg.init_data = of_get_regulator_init_data(&i2c->dev, i2c->dev.of_node,
  188. &rt6245_regulator_desc);
  189. rdev = devm_regulator_register(&i2c->dev, &rt6245_regulator_desc, &regulator_cfg);
  190. if (IS_ERR(rdev)) {
  191. dev_err(&i2c->dev, "Failed to register regulator\n");
  192. return PTR_ERR(rdev);
  193. }
  194. return 0;
  195. }
  196. static const struct of_device_id __maybe_unused rt6245_of_match_table[] = {
  197. { .compatible = "richtek,rt6245", },
  198. {}
  199. };
  200. MODULE_DEVICE_TABLE(of, rt6245_of_match_table);
  201. static struct i2c_driver rt6245_driver = {
  202. .driver = {
  203. .name = "rt6245",
  204. .of_match_table = rt6245_of_match_table,
  205. },
  206. .probe_new = rt6245_probe,
  207. };
  208. module_i2c_driver(rt6245_driver);
  209. MODULE_AUTHOR("ChiYuan Huang <[email protected]>");
  210. MODULE_DESCRIPTION("Richtek RT6245 Regulator Driver");
  211. MODULE_LICENSE("GPL v2");