1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * Copyright (C) 2015 Texas Instruments Incorporated - https://www.ti.com/ |
4 | * |
5 | * Author: Andrew F. Davis <afd@ti.com> |
6 | * |
7 | * Based on the TPS65912 driver |
8 | */ |
9 | |
10 | #include <linux/module.h> |
11 | #include <linux/of.h> |
12 | #include <linux/platform_device.h> |
13 | #include <linux/regulator/driver.h> |
14 | |
15 | #include <linux/mfd/tps65086.h> |
16 | |
17 | enum tps65086_regulators { BUCK1, BUCK2, BUCK3, BUCK4, BUCK5, BUCK6, LDOA1, |
18 | LDOA2, LDOA3, VTT, SWA1, SWB1, SWB2 }; |
19 | |
20 | /* Selector for regulator configuration regarding PMIC chip ID. */ |
21 | enum tps65086_ids { |
22 | TPS6508640 = 0, |
23 | TPS65086401, |
24 | TPS6508641, |
25 | TPS65086470, |
26 | }; |
27 | |
28 | #define TPS65086_REGULATOR(_name, _of, _id, _nv, _vr, _vm, _er, _em, _lr, _dr, _dm) \ |
29 | [_id] = { \ |
30 | .desc = { \ |
31 | .name = _name, \ |
32 | .of_match = of_match_ptr(_of), \ |
33 | .regulators_node = "regulators", \ |
34 | .of_parse_cb = tps65086_of_parse_cb, \ |
35 | .id = _id, \ |
36 | .ops = ®_ops, \ |
37 | .n_voltages = _nv, \ |
38 | .type = REGULATOR_VOLTAGE, \ |
39 | .owner = THIS_MODULE, \ |
40 | .vsel_reg = _vr, \ |
41 | .vsel_mask = _vm, \ |
42 | .enable_reg = _er, \ |
43 | .enable_mask = _em, \ |
44 | .volt_table = NULL, \ |
45 | .linear_ranges = _lr, \ |
46 | .n_linear_ranges = ARRAY_SIZE(_lr), \ |
47 | }, \ |
48 | .decay_reg = _dr, \ |
49 | .decay_mask = _dm, \ |
50 | } |
51 | |
52 | #define TPS65086_SWITCH(_name, _of, _id, _er, _em) \ |
53 | [_id] = { \ |
54 | .desc = { \ |
55 | .name = _name, \ |
56 | .of_match = of_match_ptr(_of), \ |
57 | .regulators_node = "regulators", \ |
58 | .of_parse_cb = tps65086_of_parse_cb, \ |
59 | .id = _id, \ |
60 | .ops = &switch_ops, \ |
61 | .type = REGULATOR_VOLTAGE, \ |
62 | .owner = THIS_MODULE, \ |
63 | .enable_reg = _er, \ |
64 | .enable_mask = _em, \ |
65 | }, \ |
66 | } |
67 | |
68 | |
69 | #define TPS65086_REGULATOR_CONFIG(_chip_id, _config) \ |
70 | [_chip_id] = { \ |
71 | .config = _config, \ |
72 | .num_elems = ARRAY_SIZE(_config), \ |
73 | } |
74 | |
75 | struct tps65086_regulator { |
76 | struct regulator_desc desc; |
77 | unsigned int decay_reg; |
78 | unsigned int decay_mask; |
79 | }; |
80 | |
81 | struct tps65086_regulator_config { |
82 | struct tps65086_regulator * const config; |
83 | const unsigned int num_elems; |
84 | }; |
85 | |
86 | static const struct linear_range tps65086_10mv_ranges[] = { |
87 | REGULATOR_LINEAR_RANGE(0, 0x0, 0x0, 0), |
88 | REGULATOR_LINEAR_RANGE(410000, 0x1, 0x7F, 10000), |
89 | }; |
90 | |
91 | static const struct linear_range tps65086_buck126_25mv_ranges[] = { |
92 | REGULATOR_LINEAR_RANGE(0, 0x0, 0x0, 0), |
93 | REGULATOR_LINEAR_RANGE(1000000, 0x1, 0x18, 0), |
94 | REGULATOR_LINEAR_RANGE(1025000, 0x19, 0x7F, 25000), |
95 | }; |
96 | |
97 | static const struct linear_range tps65086_buck345_25mv_ranges[] = { |
98 | REGULATOR_LINEAR_RANGE(0, 0x0, 0x0, 0), |
99 | REGULATOR_LINEAR_RANGE(425000, 0x1, 0x7F, 25000), |
100 | }; |
101 | |
102 | static const struct linear_range tps65086_ldoa1_ranges[] = { |
103 | REGULATOR_LINEAR_RANGE(1350000, 0x0, 0x0, 0), |
104 | REGULATOR_LINEAR_RANGE(1500000, 0x1, 0x7, 100000), |
105 | REGULATOR_LINEAR_RANGE(2300000, 0x8, 0xB, 100000), |
106 | REGULATOR_LINEAR_RANGE(2850000, 0xC, 0xD, 150000), |
107 | REGULATOR_LINEAR_RANGE(3300000, 0xE, 0xE, 0), |
108 | }; |
109 | |
110 | static const struct linear_range tps65086_ldoa23_ranges[] = { |
111 | REGULATOR_LINEAR_RANGE(700000, 0x0, 0xD, 50000), |
112 | REGULATOR_LINEAR_RANGE(1400000, 0xE, 0xF, 100000), |
113 | }; |
114 | |
115 | /* Operations permitted on regulators */ |
116 | static const struct regulator_ops reg_ops = { |
117 | .enable = regulator_enable_regmap, |
118 | .disable = regulator_disable_regmap, |
119 | .is_enabled = regulator_is_enabled_regmap, |
120 | .set_voltage_sel = regulator_set_voltage_sel_regmap, |
121 | .map_voltage = regulator_map_voltage_linear_range, |
122 | .get_voltage_sel = regulator_get_voltage_sel_regmap, |
123 | .list_voltage = regulator_list_voltage_linear_range, |
124 | }; |
125 | |
126 | /* Operations permitted on load switches */ |
127 | static const struct regulator_ops switch_ops = { |
128 | .enable = regulator_enable_regmap, |
129 | .disable = regulator_disable_regmap, |
130 | .is_enabled = regulator_is_enabled_regmap, |
131 | }; |
132 | |
133 | static int tps65086_of_parse_cb(struct device_node *dev, |
134 | const struct regulator_desc *desc, |
135 | struct regulator_config *config); |
136 | |
137 | static struct tps65086_regulator tps6508640_regulator_config[] = { |
138 | TPS65086_REGULATOR("BUCK1" , "buck1" , BUCK1, 0x80, TPS65086_BUCK1CTRL, |
139 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(0), |
140 | tps65086_10mv_ranges, TPS65086_BUCK1CTRL, |
141 | BIT(0)), |
142 | TPS65086_REGULATOR("BUCK2" , "buck2" , BUCK2, 0x80, TPS65086_BUCK2CTRL, |
143 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(1), |
144 | tps65086_10mv_ranges, TPS65086_BUCK2CTRL, |
145 | BIT(0)), |
146 | TPS65086_REGULATOR("BUCK3" , "buck3" , BUCK3, 0x80, TPS65086_BUCK3VID, |
147 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(2), |
148 | tps65086_10mv_ranges, TPS65086_BUCK3DECAY, |
149 | BIT(0)), |
150 | TPS65086_REGULATOR("BUCK4" , "buck4" , BUCK4, 0x80, TPS65086_BUCK4VID, |
151 | BUCK_VID_MASK, TPS65086_BUCK4CTRL, BIT(0), |
152 | tps65086_10mv_ranges, TPS65086_BUCK4VID, |
153 | BIT(0)), |
154 | TPS65086_REGULATOR("BUCK5" , "buck5" , BUCK5, 0x80, TPS65086_BUCK5VID, |
155 | BUCK_VID_MASK, TPS65086_BUCK5CTRL, BIT(0), |
156 | tps65086_10mv_ranges, TPS65086_BUCK5CTRL, |
157 | BIT(0)), |
158 | TPS65086_REGULATOR("BUCK6" , "buck6" , BUCK6, 0x80, TPS65086_BUCK6VID, |
159 | BUCK_VID_MASK, TPS65086_BUCK6CTRL, BIT(0), |
160 | tps65086_10mv_ranges, TPS65086_BUCK6CTRL, |
161 | BIT(0)), |
162 | TPS65086_REGULATOR("LDOA1" , "ldoa1" , LDOA1, 0xF, TPS65086_LDOA1CTRL, |
163 | VDOA1_VID_MASK, TPS65086_SWVTT_EN, BIT(7), |
164 | tps65086_ldoa1_ranges, 0, 0), |
165 | TPS65086_REGULATOR("LDOA2" , "ldoa2" , LDOA2, 0x10, TPS65086_LDOA2VID, |
166 | VDOA23_VID_MASK, TPS65086_LDOA2CTRL, BIT(0), |
167 | tps65086_ldoa23_ranges, 0, 0), |
168 | TPS65086_REGULATOR("LDOA3" , "ldoa3" , LDOA3, 0x10, TPS65086_LDOA3VID, |
169 | VDOA23_VID_MASK, TPS65086_LDOA3CTRL, BIT(0), |
170 | tps65086_ldoa23_ranges, 0, 0), |
171 | TPS65086_SWITCH("VTT" , "vtt" , VTT, TPS65086_SWVTT_EN, BIT(4)), |
172 | TPS65086_SWITCH("SWA1" , "swa1" , SWA1, TPS65086_SWVTT_EN, BIT(5)), |
173 | TPS65086_SWITCH("SWB1" , "swb1" , SWB1, TPS65086_SWVTT_EN, BIT(6)), |
174 | TPS65086_SWITCH("SWB2" , "swb2" , SWB2, TPS65086_LDOA1CTRL, BIT(0)), |
175 | }; |
176 | |
177 | static struct tps65086_regulator tps65086401_regulator_config[] = { |
178 | TPS65086_REGULATOR("BUCK1" , "buck1" , BUCK1, 0x80, TPS65086_BUCK1CTRL, |
179 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(0), |
180 | tps65086_10mv_ranges, TPS65086_BUCK1CTRL, |
181 | BIT(0)), |
182 | TPS65086_REGULATOR("BUCK2" , "buck2" , BUCK2, 0x80, TPS65086_BUCK2CTRL, |
183 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(1), |
184 | tps65086_10mv_ranges, TPS65086_BUCK2CTRL, |
185 | BIT(0)), |
186 | TPS65086_REGULATOR("BUCK3" , "buck3" , BUCK3, 0x80, TPS65086_BUCK3VID, |
187 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(2), |
188 | tps65086_10mv_ranges, TPS65086_BUCK3DECAY, |
189 | BIT(0)), |
190 | TPS65086_REGULATOR("BUCK4" , "buck4" , BUCK4, 0x80, TPS65086_BUCK4VID, |
191 | BUCK_VID_MASK, TPS65086_BUCK4CTRL, BIT(0), |
192 | tps65086_10mv_ranges, TPS65086_BUCK4VID, |
193 | BIT(0)), |
194 | TPS65086_REGULATOR("BUCK5" , "buck5" , BUCK5, 0x80, TPS65086_BUCK5VID, |
195 | BUCK_VID_MASK, TPS65086_BUCK5CTRL, BIT(0), |
196 | tps65086_10mv_ranges, TPS65086_BUCK5CTRL, |
197 | BIT(0)), |
198 | TPS65086_REGULATOR("BUCK6" , "buck6" , BUCK6, 0x80, TPS65086_BUCK6VID, |
199 | BUCK_VID_MASK, TPS65086_BUCK6CTRL, BIT(0), |
200 | tps65086_10mv_ranges, TPS65086_BUCK6CTRL, |
201 | BIT(0)), |
202 | TPS65086_REGULATOR("LDOA1" , "ldoa1" , LDOA1, 0xF, TPS65086_LDOA1CTRL, |
203 | VDOA1_VID_MASK, TPS65086_SWVTT_EN, BIT(7), |
204 | tps65086_ldoa1_ranges, 0, 0), |
205 | TPS65086_REGULATOR("LDOA2" , "ldoa2" , LDOA2, 0x10, TPS65086_LDOA2VID, |
206 | VDOA23_VID_MASK, TPS65086_LDOA2CTRL, BIT(0), |
207 | tps65086_ldoa23_ranges, 0, 0), |
208 | TPS65086_REGULATOR("LDOA3" , "ldoa3" , LDOA3, 0x10, TPS65086_LDOA3VID, |
209 | VDOA23_VID_MASK, TPS65086_LDOA3CTRL, BIT(0), |
210 | tps65086_ldoa23_ranges, 0, 0), |
211 | TPS65086_SWITCH("VTT" , "vtt" , VTT, TPS65086_SWVTT_EN, BIT(4)), |
212 | TPS65086_SWITCH("SWA1" , "swa1" , SWA1, TPS65086_SWVTT_EN, BIT(5)), |
213 | TPS65086_SWITCH("SWB1" , "swb1" , SWB1, TPS65086_SWVTT_EN, BIT(6)), |
214 | }; |
215 | |
216 | static struct tps65086_regulator tps6508641_regulator_config[] = { |
217 | TPS65086_REGULATOR("BUCK1" , "buck1" , BUCK1, 0x80, TPS65086_BUCK1CTRL, |
218 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(0), |
219 | tps65086_10mv_ranges, TPS65086_BUCK1CTRL, |
220 | BIT(0)), |
221 | TPS65086_REGULATOR("BUCK2" , "buck2" , BUCK2, 0x80, TPS65086_BUCK2CTRL, |
222 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(1), |
223 | tps65086_10mv_ranges, TPS65086_BUCK2CTRL, |
224 | BIT(0)), |
225 | TPS65086_REGULATOR("BUCK3" , "buck3" , BUCK3, 0x80, TPS65086_BUCK3VID, |
226 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(2), |
227 | tps65086_10mv_ranges, TPS65086_BUCK3DECAY, |
228 | BIT(0)), |
229 | TPS65086_REGULATOR("BUCK4" , "buck4" , BUCK4, 0x80, TPS65086_BUCK4VID, |
230 | BUCK_VID_MASK, TPS65086_BUCK4CTRL, BIT(0), |
231 | tps65086_10mv_ranges, TPS65086_BUCK4VID, |
232 | BIT(0)), |
233 | TPS65086_REGULATOR("BUCK5" , "buck5" , BUCK5, 0x80, TPS65086_BUCK5VID, |
234 | BUCK_VID_MASK, TPS65086_BUCK5CTRL, BIT(0), |
235 | tps65086_10mv_ranges, TPS65086_BUCK5CTRL, |
236 | BIT(0)), |
237 | TPS65086_REGULATOR("BUCK6" , "buck6" , BUCK6, 0x80, TPS65086_BUCK6VID, |
238 | BUCK_VID_MASK, TPS65086_BUCK6CTRL, BIT(0), |
239 | tps65086_10mv_ranges, TPS65086_BUCK6CTRL, |
240 | BIT(0)), |
241 | TPS65086_REGULATOR("LDOA1" , "ldoa1" , LDOA1, 0xF, TPS65086_LDOA1CTRL, |
242 | VDOA1_VID_MASK, TPS65086_SWVTT_EN, BIT(7), |
243 | tps65086_ldoa1_ranges, 0, 0), |
244 | TPS65086_REGULATOR("LDOA2" , "ldoa2" , LDOA2, 0x10, TPS65086_LDOA2VID, |
245 | VDOA23_VID_MASK, TPS65086_LDOA2CTRL, BIT(0), |
246 | tps65086_ldoa23_ranges, 0, 0), |
247 | TPS65086_REGULATOR("LDOA3" , "ldoa3" , LDOA3, 0x10, TPS65086_LDOA3VID, |
248 | VDOA23_VID_MASK, TPS65086_LDOA3CTRL, BIT(0), |
249 | tps65086_ldoa23_ranges, 0, 0), |
250 | TPS65086_SWITCH("VTT" , "vtt" , VTT, TPS65086_SWVTT_EN, BIT(4)), |
251 | TPS65086_SWITCH("SWA1" , "swa1" , SWA1, TPS65086_SWVTT_EN, BIT(5)), |
252 | TPS65086_SWITCH("SWB1" , "swb1" , SWB1, TPS65086_SWVTT_EN, BIT(6)), |
253 | }; |
254 | |
255 | static struct tps65086_regulator tps65086470_regulator_config[] = { |
256 | TPS65086_REGULATOR("BUCK1" , "buck1" , BUCK1, 0x80, TPS65086_BUCK1CTRL, |
257 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(0), |
258 | tps65086_10mv_ranges, TPS65086_BUCK1CTRL, |
259 | BIT(0)), |
260 | TPS65086_REGULATOR("BUCK2" , "buck2" , BUCK2, 0x80, TPS65086_BUCK2CTRL, |
261 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(1), |
262 | tps65086_10mv_ranges, TPS65086_BUCK2CTRL, |
263 | BIT(0)), |
264 | TPS65086_REGULATOR("BUCK3" , "buck3" , BUCK3, 0x80, TPS65086_BUCK3VID, |
265 | BUCK_VID_MASK, TPS65086_BUCK123CTRL, BIT(2), |
266 | tps65086_10mv_ranges, TPS65086_BUCK3DECAY, |
267 | BIT(0)), |
268 | TPS65086_REGULATOR("BUCK4" , "buck4" , BUCK4, 0x80, TPS65086_BUCK4VID, |
269 | BUCK_VID_MASK, TPS65086_BUCK4CTRL, BIT(0), |
270 | tps65086_10mv_ranges, TPS65086_BUCK4VID, |
271 | BIT(0)), |
272 | TPS65086_REGULATOR("BUCK5" , "buck5" , BUCK5, 0x80, TPS65086_BUCK5VID, |
273 | BUCK_VID_MASK, TPS65086_BUCK5CTRL, BIT(0), |
274 | tps65086_10mv_ranges, TPS65086_BUCK5CTRL, |
275 | BIT(0)), |
276 | TPS65086_REGULATOR("BUCK6" , "buck6" , BUCK6, 0x80, TPS65086_BUCK6VID, |
277 | BUCK_VID_MASK, TPS65086_BUCK6CTRL, BIT(0), |
278 | tps65086_10mv_ranges, TPS65086_BUCK6CTRL, |
279 | BIT(0)), |
280 | TPS65086_REGULATOR("LDOA1" , "ldoa1" , LDOA1, 0xF, TPS65086_LDOA1CTRL, |
281 | VDOA1_VID_MASK, TPS65086_LDOA1CTRL, BIT(0), |
282 | tps65086_ldoa1_ranges, 0, 0), |
283 | TPS65086_REGULATOR("LDOA2" , "ldoa2" , LDOA2, 0x10, TPS65086_LDOA2VID, |
284 | VDOA23_VID_MASK, TPS65086_LDOA2CTRL, BIT(0), |
285 | tps65086_ldoa23_ranges, 0, 0), |
286 | TPS65086_REGULATOR("LDOA3" , "ldoa3" , LDOA3, 0x10, TPS65086_LDOA3VID, |
287 | VDOA23_VID_MASK, TPS65086_LDOA3CTRL, BIT(0), |
288 | tps65086_ldoa23_ranges, 0, 0), |
289 | TPS65086_SWITCH("VTT" , "vtt" , VTT, TPS65086_SWVTT_EN, BIT(4)), |
290 | TPS65086_SWITCH("SWA1" , "swa1" , SWA1, TPS65086_SWVTT_EN, BIT(5)), |
291 | TPS65086_SWITCH("SWB1" , "swb1" , SWB1, TPS65086_SWVTT_EN, BIT(6)), |
292 | TPS65086_SWITCH("SWB2" , "swb2" , SWB2, TPS65086_SWVTT_EN, BIT(7)), |
293 | }; |
294 | |
295 | static const struct tps65086_regulator_config regulator_configs[] = { |
296 | TPS65086_REGULATOR_CONFIG(TPS6508640, tps6508640_regulator_config), |
297 | TPS65086_REGULATOR_CONFIG(TPS65086401, tps65086401_regulator_config), |
298 | TPS65086_REGULATOR_CONFIG(TPS6508641, tps6508641_regulator_config), |
299 | TPS65086_REGULATOR_CONFIG(TPS65086470, tps65086470_regulator_config) |
300 | }; |
301 | |
302 | static int tps65086_of_parse_cb(struct device_node *node, |
303 | const struct regulator_desc *desc, |
304 | struct regulator_config *config) |
305 | { |
306 | struct tps65086 * const tps = dev_get_drvdata(dev: config->dev); |
307 | struct tps65086_regulator *regulators = tps->reg_config->config; |
308 | int ret; |
309 | |
310 | /* Check for 25mV step mode */ |
311 | if (of_property_read_bool(np: node, propname: "ti,regulator-step-size-25mv" )) { |
312 | switch (desc->id) { |
313 | case BUCK1: |
314 | case BUCK2: |
315 | case BUCK6: |
316 | regulators[desc->id].desc.linear_ranges = |
317 | tps65086_buck126_25mv_ranges; |
318 | regulators[desc->id].desc.n_linear_ranges = |
319 | ARRAY_SIZE(tps65086_buck126_25mv_ranges); |
320 | break; |
321 | case BUCK3: |
322 | case BUCK4: |
323 | case BUCK5: |
324 | regulators[desc->id].desc.linear_ranges = |
325 | tps65086_buck345_25mv_ranges; |
326 | regulators[desc->id].desc.n_linear_ranges = |
327 | ARRAY_SIZE(tps65086_buck345_25mv_ranges); |
328 | break; |
329 | default: |
330 | dev_warn(config->dev, "25mV step mode only valid for BUCK regulators\n" ); |
331 | } |
332 | } |
333 | |
334 | /* Check for decay mode */ |
335 | if (desc->id <= BUCK6 && of_property_read_bool(np: node, propname: "ti,regulator-decay" )) { |
336 | ret = regmap_write_bits(map: config->regmap, |
337 | reg: regulators[desc->id].decay_reg, |
338 | mask: regulators[desc->id].decay_mask, |
339 | val: regulators[desc->id].decay_mask); |
340 | if (ret) { |
341 | dev_err(config->dev, "Error setting decay\n" ); |
342 | return ret; |
343 | } |
344 | } |
345 | |
346 | return 0; |
347 | } |
348 | |
349 | static int tps65086_regulator_probe(struct platform_device *pdev) |
350 | { |
351 | struct tps65086 *tps = dev_get_drvdata(dev: pdev->dev.parent); |
352 | struct regulator_config config = { }; |
353 | unsigned int selector_reg_config; |
354 | struct regulator_dev *rdev; |
355 | int i; |
356 | |
357 | /* Select regulator configuration for used PMIC device */ |
358 | switch (tps->chip_id) { |
359 | case TPS6508640_ID: |
360 | selector_reg_config = TPS6508640; |
361 | break; |
362 | case TPS65086401_ID: |
363 | selector_reg_config = TPS65086401; |
364 | break; |
365 | case TPS6508641_ID: |
366 | selector_reg_config = TPS6508641; |
367 | break; |
368 | case TPS65086470_ID: |
369 | selector_reg_config = TPS65086470; |
370 | break; |
371 | default: |
372 | dev_err(tps->dev, "Unknown device ID. Cannot determine regulator config.\n" ); |
373 | return -ENODEV; |
374 | } |
375 | tps->reg_config = ®ulator_configs[selector_reg_config]; |
376 | |
377 | platform_set_drvdata(pdev, data: tps); |
378 | |
379 | config.dev = &pdev->dev; |
380 | config.dev->of_node = tps->dev->of_node; |
381 | config.driver_data = tps; |
382 | config.regmap = tps->regmap; |
383 | |
384 | for (i = 0; i < tps->reg_config->num_elems; ++i) { |
385 | struct regulator_desc * const desc_ptr = &tps->reg_config->config[i].desc; |
386 | |
387 | dev_dbg(tps->dev, "Index: %u; Regulator name: \"%s\"; Regulator ID: %d\n" , |
388 | i, desc_ptr->name, desc_ptr->id); |
389 | |
390 | rdev = devm_regulator_register(dev: &pdev->dev, regulator_desc: desc_ptr, config: &config); |
391 | if (IS_ERR(ptr: rdev)) { |
392 | dev_err(tps->dev, "failed to register %d \"%s\" regulator\n" , |
393 | i, desc_ptr->name); |
394 | return PTR_ERR(ptr: rdev); |
395 | } |
396 | } |
397 | |
398 | return 0; |
399 | } |
400 | |
401 | static const struct platform_device_id tps65086_regulator_id_table[] = { |
402 | { "tps65086-regulator" , }, |
403 | { /* sentinel */ } |
404 | }; |
405 | MODULE_DEVICE_TABLE(platform, tps65086_regulator_id_table); |
406 | |
407 | static struct platform_driver tps65086_regulator_driver = { |
408 | .driver = { |
409 | .name = "tps65086-regulator" , |
410 | .probe_type = PROBE_PREFER_ASYNCHRONOUS, |
411 | }, |
412 | .probe = tps65086_regulator_probe, |
413 | .id_table = tps65086_regulator_id_table, |
414 | }; |
415 | module_platform_driver(tps65086_regulator_driver); |
416 | |
417 | MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>" ); |
418 | MODULE_DESCRIPTION("TPS65086 Regulator driver" ); |
419 | MODULE_LICENSE("GPL v2" ); |
420 | |