tps68470-regulator.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Regulator driver for TPS68470 PMIC
  4. //
  5. // Copyright (c) 2021 Red Hat Inc.
  6. // Copyright (C) 2018 Intel Corporation
  7. //
  8. // Authors:
  9. // Hans de Goede <[email protected]>
  10. // Zaikuo Wang <[email protected]>
  11. // Tianshu Qiu <[email protected]>
  12. // Jian Xu Zheng <[email protected]>
  13. // Yuning Pu <[email protected]>
  14. // Rajmohan Mani <[email protected]>
  15. #include <linux/clk.h>
  16. #include <linux/device.h>
  17. #include <linux/err.h>
  18. #include <linux/init.h>
  19. #include <linux/kernel.h>
  20. #include <linux/mfd/tps68470.h>
  21. #include <linux/module.h>
  22. #include <linux/platform_data/tps68470.h>
  23. #include <linux/platform_device.h>
  24. #include <linux/regulator/driver.h>
  25. #include <linux/regulator/machine.h>
  26. struct tps68470_regulator_data {
  27. struct clk *clk;
  28. };
  29. #define TPS68470_REGULATOR(_name, _id, _ops, _n, \
  30. _vr, _vm, _er, _em, _lr, _nlr) \
  31. [TPS68470_ ## _name] = { \
  32. .name = # _name, \
  33. .id = _id, \
  34. .ops = &_ops, \
  35. .n_voltages = _n, \
  36. .type = REGULATOR_VOLTAGE, \
  37. .owner = THIS_MODULE, \
  38. .vsel_reg = _vr, \
  39. .vsel_mask = _vm, \
  40. .enable_reg = _er, \
  41. .enable_mask = _em, \
  42. .linear_ranges = _lr, \
  43. .n_linear_ranges = _nlr, \
  44. }
  45. static const struct linear_range tps68470_ldo_ranges[] = {
  46. REGULATOR_LINEAR_RANGE(875000, 0, 125, 17800),
  47. };
  48. static const struct linear_range tps68470_core_ranges[] = {
  49. REGULATOR_LINEAR_RANGE(900000, 0, 42, 25000),
  50. };
  51. static int tps68470_regulator_enable(struct regulator_dev *rdev)
  52. {
  53. struct tps68470_regulator_data *data = rdev->reg_data;
  54. int ret;
  55. /* The Core buck regulator needs the PMIC's PLL to be enabled */
  56. if (rdev->desc->id == TPS68470_CORE) {
  57. ret = clk_prepare_enable(data->clk);
  58. if (ret) {
  59. dev_err(&rdev->dev, "Error enabling TPS68470 clock\n");
  60. return ret;
  61. }
  62. }
  63. return regulator_enable_regmap(rdev);
  64. }
  65. static int tps68470_regulator_disable(struct regulator_dev *rdev)
  66. {
  67. struct tps68470_regulator_data *data = rdev->reg_data;
  68. if (rdev->desc->id == TPS68470_CORE)
  69. clk_disable_unprepare(data->clk);
  70. return regulator_disable_regmap(rdev);
  71. }
  72. /* Operations permitted on DCDCx, LDO2, LDO3 and LDO4 */
  73. static const struct regulator_ops tps68470_regulator_ops = {
  74. .is_enabled = regulator_is_enabled_regmap,
  75. .enable = tps68470_regulator_enable,
  76. .disable = tps68470_regulator_disable,
  77. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  78. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  79. .list_voltage = regulator_list_voltage_linear_range,
  80. .map_voltage = regulator_map_voltage_linear_range,
  81. };
  82. static const struct regulator_ops tps68470_always_on_reg_ops = {
  83. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  84. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  85. .list_voltage = regulator_list_voltage_linear_range,
  86. .map_voltage = regulator_map_voltage_linear_range,
  87. };
  88. static const struct regulator_desc regulators[] = {
  89. TPS68470_REGULATOR(CORE, TPS68470_CORE, tps68470_regulator_ops, 43,
  90. TPS68470_REG_VDVAL, TPS68470_VDVAL_DVOLT_MASK,
  91. TPS68470_REG_VDCTL, TPS68470_VDCTL_EN_MASK,
  92. tps68470_core_ranges, ARRAY_SIZE(tps68470_core_ranges)),
  93. TPS68470_REGULATOR(ANA, TPS68470_ANA, tps68470_regulator_ops, 126,
  94. TPS68470_REG_VAVAL, TPS68470_VAVAL_AVOLT_MASK,
  95. TPS68470_REG_VACTL, TPS68470_VACTL_EN_MASK,
  96. tps68470_ldo_ranges, ARRAY_SIZE(tps68470_ldo_ranges)),
  97. TPS68470_REGULATOR(VCM, TPS68470_VCM, tps68470_regulator_ops, 126,
  98. TPS68470_REG_VCMVAL, TPS68470_VCMVAL_VCVOLT_MASK,
  99. TPS68470_REG_VCMCTL, TPS68470_VCMCTL_EN_MASK,
  100. tps68470_ldo_ranges, ARRAY_SIZE(tps68470_ldo_ranges)),
  101. TPS68470_REGULATOR(VIO, TPS68470_VIO, tps68470_always_on_reg_ops, 126,
  102. TPS68470_REG_VIOVAL, TPS68470_VIOVAL_IOVOLT_MASK,
  103. 0, 0,
  104. tps68470_ldo_ranges, ARRAY_SIZE(tps68470_ldo_ranges)),
  105. /*
  106. * (1) This regulator must have the same voltage as VIO if S_IO LDO is used to
  107. * power a sensor/VCM which I2C is daisy chained behind the PMIC.
  108. * (2) If there is no I2C daisy chain it can be set freely.
  109. */
  110. TPS68470_REGULATOR(VSIO, TPS68470_VSIO, tps68470_regulator_ops, 126,
  111. TPS68470_REG_VSIOVAL, TPS68470_VSIOVAL_IOVOLT_MASK,
  112. TPS68470_REG_S_I2C_CTL, TPS68470_S_I2C_CTL_EN_MASK,
  113. tps68470_ldo_ranges, ARRAY_SIZE(tps68470_ldo_ranges)),
  114. TPS68470_REGULATOR(AUX1, TPS68470_AUX1, tps68470_regulator_ops, 126,
  115. TPS68470_REG_VAUX1VAL, TPS68470_VAUX1VAL_AUX1VOLT_MASK,
  116. TPS68470_REG_VAUX1CTL, TPS68470_VAUX1CTL_EN_MASK,
  117. tps68470_ldo_ranges, ARRAY_SIZE(tps68470_ldo_ranges)),
  118. TPS68470_REGULATOR(AUX2, TPS68470_AUX2, tps68470_regulator_ops, 126,
  119. TPS68470_REG_VAUX2VAL, TPS68470_VAUX2VAL_AUX2VOLT_MASK,
  120. TPS68470_REG_VAUX2CTL, TPS68470_VAUX2CTL_EN_MASK,
  121. tps68470_ldo_ranges, ARRAY_SIZE(tps68470_ldo_ranges)),
  122. };
  123. static int tps68470_regulator_probe(struct platform_device *pdev)
  124. {
  125. struct device *dev = &pdev->dev;
  126. struct tps68470_regulator_platform_data *pdata = dev_get_platdata(dev);
  127. struct tps68470_regulator_data *data;
  128. struct regulator_config config = { };
  129. struct regulator_dev *rdev;
  130. int i;
  131. data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
  132. if (!data)
  133. return -ENOMEM;
  134. data->clk = devm_clk_get(dev, "tps68470-clk");
  135. if (IS_ERR(data->clk))
  136. return dev_err_probe(dev, PTR_ERR(data->clk), "getting tps68470-clk\n");
  137. config.dev = dev->parent;
  138. config.regmap = dev_get_drvdata(dev->parent);
  139. config.driver_data = data;
  140. for (i = 0; i < TPS68470_NUM_REGULATORS; i++) {
  141. if (pdata)
  142. config.init_data = pdata->reg_init_data[i];
  143. else
  144. config.init_data = NULL;
  145. rdev = devm_regulator_register(dev, &regulators[i], &config);
  146. if (IS_ERR(rdev))
  147. return dev_err_probe(dev, PTR_ERR(rdev),
  148. "registering %s regulator\n",
  149. regulators[i].name);
  150. }
  151. return 0;
  152. }
  153. static struct platform_driver tps68470_regulator_driver = {
  154. .driver = {
  155. .name = "tps68470-regulator",
  156. },
  157. .probe = tps68470_regulator_probe,
  158. };
  159. /*
  160. * The ACPI tps68470 probe-ordering depends on the clk/gpio/regulator drivers
  161. * registering before the drivers for the camera-sensors which use them bind.
  162. * subsys_initcall() ensures this when the drivers are builtin.
  163. */
  164. static int __init tps68470_regulator_init(void)
  165. {
  166. return platform_driver_register(&tps68470_regulator_driver);
  167. }
  168. subsys_initcall(tps68470_regulator_init);
  169. static void __exit tps68470_regulator_exit(void)
  170. {
  171. platform_driver_unregister(&tps68470_regulator_driver);
  172. }
  173. module_exit(tps68470_regulator_exit);
  174. MODULE_ALIAS("platform:tps68470-regulator");
  175. MODULE_DESCRIPTION("TPS68470 voltage regulator driver");
  176. MODULE_LICENSE("GPL v2");