max20411-regulator.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022, Linaro Ltd.
  5. */
  6. #include <linux/bitfield.h>
  7. #include <linux/gpio/consumer.h>
  8. #include <linux/i2c.h>
  9. #include <linux/module.h>
  10. #include <linux/of_platform.h>
  11. #include <linux/regmap.h>
  12. #include <linux/regulator/driver.h>
  13. #include <linux/regulator/machine.h>
  14. #include <linux/regulator/of_regulator.h>
  15. #define MAX20411_UV_STEP 6250
  16. #define MAX20411_BASE_UV 243750
  17. #define MAX20411_MIN_SEL 41 /* 0.5V */
  18. #define MAX20411_MAX_SEL 165 /* 1.275V */
  19. #define MAX20411_VID_OFFSET 0x7
  20. #define MAX20411_VID_MASK 0xff
  21. #define MAX20411_SLEW_OFFSET 0x6
  22. #define MAX20411_SLEW_DVS_MASK 0xc
  23. #define MAX20411_SLEW_SR_MASK 0x3
  24. struct max20411 {
  25. struct device *dev;
  26. struct device_node *of_node;
  27. struct regulator_desc desc;
  28. struct regulator_dev *rdev;
  29. struct regmap *regmap;
  30. };
  31. static const unsigned int max20411_slew_rates[] = { 13100, 6600, 3300, 1600 };
  32. static int max20411_enable_time(struct regulator_dev *rdev)
  33. {
  34. int voltage, rate, ret;
  35. unsigned int val;
  36. /* get voltage */
  37. ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
  38. if (ret)
  39. return ret;
  40. val &= rdev->desc->vsel_mask;
  41. voltage = regulator_list_voltage_linear(rdev, val);
  42. /* get rate */
  43. ret = regmap_read(rdev->regmap, MAX20411_SLEW_OFFSET, &val);
  44. if (ret)
  45. return ret;
  46. val = FIELD_GET(MAX20411_SLEW_SR_MASK, val);
  47. rate = max20411_slew_rates[val];
  48. return DIV_ROUND_UP(voltage, rate);
  49. }
  50. static const struct regmap_config max20411_regmap_config = {
  51. .reg_bits = 8,
  52. .val_bits = 8,
  53. .max_register = 0xe,
  54. };
  55. static const struct regulator_ops max20411_ops = {
  56. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  57. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  58. .list_voltage = regulator_list_voltage_linear,
  59. .enable_time = max20411_enable_time,
  60. };
  61. static const struct regulator_desc max20411_desc = {
  62. .ops = &max20411_ops,
  63. .owner = THIS_MODULE,
  64. .type = REGULATOR_VOLTAGE,
  65. .supply_name = "vin",
  66. .name = "max20411",
  67. /*
  68. * voltage = 0.24375V + selector * 6.25mV
  69. * with valid selector between 41 to 165 (0.5V to 1.275V)
  70. */
  71. .min_uV = MAX20411_BASE_UV,
  72. .uV_step = MAX20411_UV_STEP,
  73. .linear_min_sel = MAX20411_MIN_SEL,
  74. .n_voltages = MAX20411_MAX_SEL + 1,
  75. .vsel_reg = MAX20411_VID_OFFSET,
  76. .vsel_mask = MAX20411_VID_MASK,
  77. .ramp_reg = MAX20411_SLEW_OFFSET,
  78. .ramp_mask = MAX20411_SLEW_DVS_MASK,
  79. .ramp_delay_table = max20411_slew_rates,
  80. .n_ramp_values = ARRAY_SIZE(max20411_slew_rates),
  81. };
  82. static int max20411_probe(struct i2c_client *client)
  83. {
  84. struct regulator_init_data *init_data;
  85. struct device *dev = &client->dev;
  86. struct regulator_config cfg = {};
  87. struct max20411 *max20411;
  88. max20411 = devm_kzalloc(dev, sizeof(*max20411), GFP_KERNEL);
  89. if (!max20411)
  90. return -ENOMEM;
  91. max20411->regmap = devm_regmap_init_i2c(client, &max20411_regmap_config);
  92. if (IS_ERR(max20411->regmap)) {
  93. dev_err(dev, "Failed to allocate regmap!\n");
  94. return PTR_ERR(max20411->regmap);
  95. }
  96. max20411->dev = dev;
  97. max20411->of_node = dev->of_node;
  98. max20411->desc = max20411_desc;
  99. init_data = of_get_regulator_init_data(max20411->dev, max20411->of_node, &max20411->desc);
  100. if (!init_data)
  101. return -ENODATA;
  102. cfg.dev = max20411->dev;
  103. cfg.init_data = init_data;
  104. cfg.of_node = max20411->of_node;
  105. cfg.driver_data = max20411;
  106. cfg.ena_gpiod = gpiod_get(max20411->dev, "enable", GPIOD_ASIS);
  107. if (IS_ERR(cfg.ena_gpiod))
  108. return dev_err_probe(dev, PTR_ERR(cfg.ena_gpiod),
  109. "unable to acquire enable gpio\n");
  110. max20411->rdev = devm_regulator_register(max20411->dev, &max20411->desc, &cfg);
  111. if (IS_ERR(max20411->rdev))
  112. dev_err(max20411->dev, "Failed to register regulator\n");
  113. return PTR_ERR_OR_ZERO(max20411->rdev);
  114. }
  115. static const struct of_device_id of_max20411_match_tbl[] = {
  116. { .compatible = "maxim,max20411", },
  117. { },
  118. };
  119. MODULE_DEVICE_TABLE(of, of_max20411_match_tbl);
  120. static const struct i2c_device_id max20411_id[] = {
  121. { "max20411" },
  122. { }
  123. };
  124. MODULE_DEVICE_TABLE(i2c, max20411_id);
  125. static struct i2c_driver max20411_i2c_driver = {
  126. .driver = {
  127. .name = "max20411",
  128. .probe_type = PROBE_PREFER_ASYNCHRONOUS,
  129. .of_match_table = of_max20411_match_tbl,
  130. },
  131. .probe = max20411_probe,
  132. .id_table = max20411_id,
  133. };
  134. module_i2c_driver(max20411_i2c_driver);
  135. MODULE_DESCRIPTION("Maxim MAX20411 High-Efficiency Single Step-Down Converter driver");
  136. MODULE_LICENSE("GPL");