hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/drivers/regulator/lp87565-regulator.c
....@@ -1,11 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Regulator driver for LP87565 PMIC
34 *
4
- * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
5
- *
6
- * This program is free software; you can redistribute it and/or modify it
7
- * under the terms of the GNU General Public License as published by the
8
- * Free Software Foundation version 2.
5
+ * Copyright (C) 2017 Texas Instruments Incorporated - https://www.ti.com/
96 */
107
118 #include <linux/module.h>
....@@ -14,8 +11,8 @@
1411
1512 #include <linux/mfd/lp87565.h>
1613
17
-#define LP87565_REGULATOR(_name, _id, _of, _ops, _n, _vr, _vm, _er, _em, \
18
- _delay, _lr, _cr) \
14
+#define LP87565_REGULATOR(_name, _id, _of, _ops, _n, _vr, _vm, \
15
+ _er, _em, _ev, _delay, _lr, _cr) \
1916 [_id] = { \
2017 .desc = { \
2118 .name = _name, \
....@@ -31,9 +28,14 @@
3128 .vsel_mask = _vm, \
3229 .enable_reg = _er, \
3330 .enable_mask = _em, \
31
+ .enable_val = _ev, \
3432 .ramp_delay = _delay, \
3533 .linear_ranges = _lr, \
3634 .n_linear_ranges = ARRAY_SIZE(_lr), \
35
+ .curr_table = lp87565_buck_uA, \
36
+ .n_current_limits = ARRAY_SIZE(lp87565_buck_uA),\
37
+ .csel_reg = (_cr), \
38
+ .csel_mask = LP87565_BUCK_CTRL_2_ILIM, \
3739 }, \
3840 .ctrl2_reg = _cr, \
3941 }
....@@ -45,13 +47,13 @@
4547
4648 static const struct lp87565_regulator regulators[];
4749
48
-static const struct regulator_linear_range buck0_1_2_3_ranges[] = {
50
+static const struct linear_range buck0_1_2_3_ranges[] = {
4951 REGULATOR_LINEAR_RANGE(600000, 0xA, 0x17, 10000),
5052 REGULATOR_LINEAR_RANGE(735000, 0x18, 0x9d, 5000),
5153 REGULATOR_LINEAR_RANGE(1420000, 0x9e, 0xff, 20000),
5254 };
5355
54
-static unsigned int lp87565_buck_ramp_delay[] = {
56
+static const unsigned int lp87565_buck_ramp_delay[] = {
5557 30000, 15000, 10000, 7500, 3800, 1900, 940, 470
5658 };
5759
....@@ -64,7 +66,6 @@
6466 int ramp_delay)
6567 {
6668 int id = rdev_get_id(rdev);
67
- struct lp87565 *lp87565 = rdev_get_drvdata(rdev);
6869 unsigned int reg;
6970 int ret;
7071
....@@ -85,11 +86,11 @@
8586 else
8687 reg = 0;
8788
88
- ret = regmap_update_bits(lp87565->regmap, regulators[id].ctrl2_reg,
89
+ ret = regmap_update_bits(rdev->regmap, regulators[id].ctrl2_reg,
8990 LP87565_BUCK_CTRL_2_SLEW_RATE,
9091 reg << __ffs(LP87565_BUCK_CTRL_2_SLEW_RATE));
9192 if (ret) {
92
- dev_err(lp87565->dev, "SLEW RATE write failed: %d\n", ret);
93
+ dev_err(&rdev->dev, "SLEW RATE write failed: %d\n", ret);
9394 return ret;
9495 }
9596
....@@ -102,45 +103,8 @@
102103 return 0;
103104 }
104105
105
-static int lp87565_buck_set_current_limit(struct regulator_dev *rdev,
106
- int min_uA, int max_uA)
107
-{
108
- int id = rdev_get_id(rdev);
109
- struct lp87565 *lp87565 = rdev_get_drvdata(rdev);
110
- int i;
111
-
112
- for (i = ARRAY_SIZE(lp87565_buck_uA) - 1; i >= 0; i--) {
113
- if (lp87565_buck_uA[i] >= min_uA &&
114
- lp87565_buck_uA[i] <= max_uA)
115
- return regmap_update_bits(lp87565->regmap,
116
- regulators[id].ctrl2_reg,
117
- LP87565_BUCK_CTRL_2_ILIM,
118
- i << __ffs(LP87565_BUCK_CTRL_2_ILIM));
119
- }
120
-
121
- return -EINVAL;
122
-}
123
-
124
-static int lp87565_buck_get_current_limit(struct regulator_dev *rdev)
125
-{
126
- int id = rdev_get_id(rdev);
127
- struct lp87565 *lp87565 = rdev_get_drvdata(rdev);
128
- int ret;
129
- unsigned int val;
130
-
131
- ret = regmap_read(lp87565->regmap, regulators[id].ctrl2_reg, &val);
132
- if (ret)
133
- return ret;
134
-
135
- val = (val & LP87565_BUCK_CTRL_2_ILIM) >>
136
- __ffs(LP87565_BUCK_CTRL_2_ILIM);
137
-
138
- return (val < ARRAY_SIZE(lp87565_buck_uA)) ?
139
- lp87565_buck_uA[val] : -EINVAL;
140
-}
141
-
142
-/* Operations permitted on BUCK0, BUCK1 */
143
-static struct regulator_ops lp87565_buck_ops = {
106
+/* Operations permitted on BUCKs */
107
+static const struct regulator_ops lp87565_buck_ops = {
144108 .is_enabled = regulator_is_enabled_regmap,
145109 .enable = regulator_enable_regmap,
146110 .disable = regulator_disable_regmap,
....@@ -150,42 +114,64 @@
150114 .map_voltage = regulator_map_voltage_linear_range,
151115 .set_voltage_time_sel = regulator_set_voltage_time_sel,
152116 .set_ramp_delay = lp87565_buck_set_ramp_delay,
153
- .set_current_limit = lp87565_buck_set_current_limit,
154
- .get_current_limit = lp87565_buck_get_current_limit,
117
+ .set_current_limit = regulator_set_current_limit_regmap,
118
+ .get_current_limit = regulator_get_current_limit_regmap,
155119 };
156120
157121 static const struct lp87565_regulator regulators[] = {
158122 LP87565_REGULATOR("BUCK0", LP87565_BUCK_0, "buck0", lp87565_buck_ops,
159123 256, LP87565_REG_BUCK0_VOUT, LP87565_BUCK_VSET,
160124 LP87565_REG_BUCK0_CTRL_1,
125
+ LP87565_BUCK_CTRL_1_EN |
126
+ LP87565_BUCK_CTRL_1_EN_PIN_CTRL,
161127 LP87565_BUCK_CTRL_1_EN, 3230,
162128 buck0_1_2_3_ranges, LP87565_REG_BUCK0_CTRL_2),
163129 LP87565_REGULATOR("BUCK1", LP87565_BUCK_1, "buck1", lp87565_buck_ops,
164130 256, LP87565_REG_BUCK1_VOUT, LP87565_BUCK_VSET,
165131 LP87565_REG_BUCK1_CTRL_1,
132
+ LP87565_BUCK_CTRL_1_EN |
133
+ LP87565_BUCK_CTRL_1_EN_PIN_CTRL,
166134 LP87565_BUCK_CTRL_1_EN, 3230,
167135 buck0_1_2_3_ranges, LP87565_REG_BUCK1_CTRL_2),
168136 LP87565_REGULATOR("BUCK2", LP87565_BUCK_2, "buck2", lp87565_buck_ops,
169137 256, LP87565_REG_BUCK2_VOUT, LP87565_BUCK_VSET,
170138 LP87565_REG_BUCK2_CTRL_1,
139
+ LP87565_BUCK_CTRL_1_EN |
140
+ LP87565_BUCK_CTRL_1_EN_PIN_CTRL,
171141 LP87565_BUCK_CTRL_1_EN, 3230,
172142 buck0_1_2_3_ranges, LP87565_REG_BUCK2_CTRL_2),
173143 LP87565_REGULATOR("BUCK3", LP87565_BUCK_3, "buck3", lp87565_buck_ops,
174144 256, LP87565_REG_BUCK3_VOUT, LP87565_BUCK_VSET,
175145 LP87565_REG_BUCK3_CTRL_1,
146
+ LP87565_BUCK_CTRL_1_EN |
147
+ LP87565_BUCK_CTRL_1_EN_PIN_CTRL,
176148 LP87565_BUCK_CTRL_1_EN, 3230,
177149 buck0_1_2_3_ranges, LP87565_REG_BUCK3_CTRL_2),
178150 LP87565_REGULATOR("BUCK10", LP87565_BUCK_10, "buck10", lp87565_buck_ops,
179151 256, LP87565_REG_BUCK0_VOUT, LP87565_BUCK_VSET,
180152 LP87565_REG_BUCK0_CTRL_1,
181153 LP87565_BUCK_CTRL_1_EN |
154
+ LP87565_BUCK_CTRL_1_EN_PIN_CTRL |
155
+ LP87565_BUCK_CTRL_1_FPWM_MP_0_2,
156
+ LP87565_BUCK_CTRL_1_EN |
182157 LP87565_BUCK_CTRL_1_FPWM_MP_0_2, 3230,
183158 buck0_1_2_3_ranges, LP87565_REG_BUCK0_CTRL_2),
184159 LP87565_REGULATOR("BUCK23", LP87565_BUCK_23, "buck23", lp87565_buck_ops,
185160 256, LP87565_REG_BUCK2_VOUT, LP87565_BUCK_VSET,
186161 LP87565_REG_BUCK2_CTRL_1,
162
+ LP87565_BUCK_CTRL_1_EN |
163
+ LP87565_BUCK_CTRL_1_EN_PIN_CTRL,
187164 LP87565_BUCK_CTRL_1_EN, 3230,
188165 buck0_1_2_3_ranges, LP87565_REG_BUCK2_CTRL_2),
166
+ LP87565_REGULATOR("BUCK3210", LP87565_BUCK_3210, "buck3210",
167
+ lp87565_buck_ops, 256, LP87565_REG_BUCK0_VOUT,
168
+ LP87565_BUCK_VSET, LP87565_REG_BUCK0_CTRL_1,
169
+ LP87565_BUCK_CTRL_1_EN |
170
+ LP87565_BUCK_CTRL_1_EN_PIN_CTRL |
171
+ LP87565_BUCK_CTRL_1_FPWM_MP_0_2,
172
+ LP87565_BUCK_CTRL_1_EN |
173
+ LP87565_BUCK_CTRL_1_FPWM_MP_0_2, 3230,
174
+ buck0_1_2_3_ranges, LP87565_REG_BUCK0_CTRL_2),
189175 };
190176
191177 static int lp87565_regulator_probe(struct platform_device *pdev)
....@@ -193,7 +179,7 @@
193179 struct lp87565 *lp87565 = dev_get_drvdata(pdev->dev.parent);
194180 struct regulator_config config = { };
195181 struct regulator_dev *rdev;
196
- int i, min_idx = LP87565_BUCK_0, max_idx = LP87565_BUCK_3;
182
+ int i, min_idx, max_idx;
197183
198184 platform_set_drvdata(pdev, lp87565);
199185
....@@ -202,9 +188,19 @@
202188 config.driver_data = lp87565;
203189 config.regmap = lp87565->regmap;
204190
205
- if (lp87565->dev_type == LP87565_DEVICE_TYPE_LP87565_Q1) {
191
+ switch (lp87565->dev_type) {
192
+ case LP87565_DEVICE_TYPE_LP87565_Q1:
206193 min_idx = LP87565_BUCK_10;
207194 max_idx = LP87565_BUCK_23;
195
+ break;
196
+ case LP87565_DEVICE_TYPE_LP87561_Q1:
197
+ min_idx = LP87565_BUCK_3210;
198
+ max_idx = LP87565_BUCK_3210;
199
+ break;
200
+ default:
201
+ min_idx = LP87565_BUCK_0;
202
+ max_idx = LP87565_BUCK_3;
203
+ break;
208204 }
209205
210206 for (i = min_idx; i <= max_idx; i++) {