1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2018, The Linux Foundation. All rights reserved.
4 #define pr_fmt(fmt) "%s: " fmt, __func__
7 #include <linux/kernel.h>
8 #include <linux/module.h>
10 #include <linux/of_device.h>
11 #include <linux/platform_device.h>
12 #include <linux/slab.h>
13 #include <linux/string.h>
14 #include <linux/regulator/driver.h>
15 #include <linux/regulator/machine.h>
16 #include <linux/regulator/of_regulator.h>
18 #include <soc/qcom/cmd-db.h>
19 #include <soc/qcom/rpmh.h>
21 #include <dt-bindings/regulator/qcom,rpmh-regulator.h>
24 * enum rpmh_regulator_type - supported RPMh accelerator types
25 * %VRM: RPMh VRM accelerator which supports voting on enable, voltage,
26 * and mode of LDO, SMPS, and BOB type PMIC regulators.
27 * %XOB: RPMh XOB accelerator which supports voting on the enable state
30 enum rpmh_regulator_type
{
35 #define RPMH_REGULATOR_REG_VRM_VOLTAGE 0x0
36 #define RPMH_REGULATOR_REG_ENABLE 0x4
37 #define RPMH_REGULATOR_REG_VRM_MODE 0x8
39 #define PMIC4_LDO_MODE_RETENTION 4
40 #define PMIC4_LDO_MODE_LPM 5
41 #define PMIC4_LDO_MODE_HPM 7
43 #define PMIC4_SMPS_MODE_RETENTION 4
44 #define PMIC4_SMPS_MODE_PFM 5
45 #define PMIC4_SMPS_MODE_AUTO 6
46 #define PMIC4_SMPS_MODE_PWM 7
48 #define PMIC4_BOB_MODE_PASS 0
49 #define PMIC4_BOB_MODE_PFM 1
50 #define PMIC4_BOB_MODE_AUTO 2
51 #define PMIC4_BOB_MODE_PWM 3
54 * struct rpmh_vreg_hw_data - RPMh regulator hardware configurations
55 * @regulator_type: RPMh accelerator type used to manage this
57 * @ops: Pointer to regulator ops callback structure
58 * @voltage_range: The single range of voltages supported by this
60 * @n_voltages: The number of unique voltage set points defined
62 * @hpm_min_load_uA: Minimum load current in microamps that requires
63 * high power mode (HPM) operation. This is used
64 * for LDO hardware type regulators only.
65 * @pmic_mode_map: Array indexed by regulator framework mode
66 * containing PMIC hardware modes. Must be large
67 * enough to index all framework modes supported
68 * by this regulator hardware type.
69 * @of_map_mode: Maps an RPMH_REGULATOR_MODE_* mode value defined
70 * in device tree to a regulator framework mode
72 struct rpmh_vreg_hw_data
{
73 enum rpmh_regulator_type regulator_type
;
74 const struct regulator_ops
*ops
;
75 const struct regulator_linear_range voltage_range
;
78 const int *pmic_mode_map
;
79 unsigned int (*of_map_mode
)(unsigned int mode
);
83 * struct rpmh_vreg - individual RPMh regulator data structure encapsulating a
84 * single regulator device
85 * @dev: Device pointer for the top-level PMIC RPMh
86 * regulator parent device. This is used as a
87 * handle in RPMh write requests.
88 * @addr: Base address of the regulator resource within
90 * @rdesc: Regulator descriptor
91 * @hw_data: PMIC regulator configuration data for this RPMh
93 * @always_wait_for_ack: Boolean flag indicating if a request must always
94 * wait for an ACK from RPMh before continuing even
95 * if it corresponds to a strictly lower power
96 * state (e.g. enabled --> disabled).
97 * @enabled: Flag indicating if the regulator is enabled or
99 * @bypassed: Boolean indicating if the regulator is in
100 * bypass (pass-through) mode or not. This is
101 * only used by BOB rpmh-regulator resources.
102 * @voltage_selector: Selector used for get_voltage_sel() and
103 * set_voltage_sel() callbacks
104 * @mode: RPMh VRM regulator current framework mode
109 struct regulator_desc rdesc
;
110 const struct rpmh_vreg_hw_data
*hw_data
;
111 bool always_wait_for_ack
;
115 int voltage_selector
;
120 * struct rpmh_vreg_init_data - initialization data for an RPMh regulator
121 * @name: Name for the regulator which also corresponds
122 * to the device tree subnode name of the regulator
123 * @resource_name: RPMh regulator resource name format string.
124 * This must include exactly one field: '%s' which
125 * is filled at run-time with the PMIC ID provided
126 * by device tree property qcom,pmic-id. Example:
127 * "ldo%s1" for RPMh resource "ldoa1".
128 * @supply_name: Parent supply regulator name
129 * @hw_data: Configuration data for this PMIC regulator type
131 struct rpmh_vreg_init_data
{
133 const char *resource_name
;
134 const char *supply_name
;
135 const struct rpmh_vreg_hw_data
*hw_data
;
139 * rpmh_regulator_send_request() - send the request to RPMh
140 * @vreg: Pointer to the RPMh regulator
141 * @cmd: Pointer to the RPMh command to send
142 * @wait_for_ack: Boolean indicating if execution must wait until the
143 * request has been acknowledged as complete
145 * Return: 0 on success, errno on failure
147 static int rpmh_regulator_send_request(struct rpmh_vreg
*vreg
,
148 struct tcs_cmd
*cmd
, bool wait_for_ack
)
152 if (wait_for_ack
|| vreg
->always_wait_for_ack
)
153 ret
= rpmh_write(vreg
->dev
, RPMH_ACTIVE_ONLY_STATE
, cmd
, 1);
155 ret
= rpmh_write_async(vreg
->dev
, RPMH_ACTIVE_ONLY_STATE
, cmd
,
161 static int _rpmh_regulator_vrm_set_voltage_sel(struct regulator_dev
*rdev
,
162 unsigned int selector
, bool wait_for_ack
)
164 struct rpmh_vreg
*vreg
= rdev_get_drvdata(rdev
);
165 struct tcs_cmd cmd
= {
166 .addr
= vreg
->addr
+ RPMH_REGULATOR_REG_VRM_VOLTAGE
,
170 /* VRM voltage control register is set with voltage in millivolts. */
171 cmd
.data
= DIV_ROUND_UP(regulator_list_voltage_linear_range(rdev
,
174 ret
= rpmh_regulator_send_request(vreg
, &cmd
, wait_for_ack
);
176 vreg
->voltage_selector
= selector
;
181 static int rpmh_regulator_vrm_set_voltage_sel(struct regulator_dev
*rdev
,
182 unsigned int selector
)
184 struct rpmh_vreg
*vreg
= rdev_get_drvdata(rdev
);
186 if (vreg
->enabled
== -EINVAL
) {
188 * Cache the voltage and send it later when the regulator is
189 * enabled or disabled.
191 vreg
->voltage_selector
= selector
;
195 return _rpmh_regulator_vrm_set_voltage_sel(rdev
, selector
,
196 selector
> vreg
->voltage_selector
);
199 static int rpmh_regulator_vrm_get_voltage_sel(struct regulator_dev
*rdev
)
201 struct rpmh_vreg
*vreg
= rdev_get_drvdata(rdev
);
203 return vreg
->voltage_selector
;
206 static int rpmh_regulator_is_enabled(struct regulator_dev
*rdev
)
208 struct rpmh_vreg
*vreg
= rdev_get_drvdata(rdev
);
210 return vreg
->enabled
;
213 static int rpmh_regulator_set_enable_state(struct regulator_dev
*rdev
,
216 struct rpmh_vreg
*vreg
= rdev_get_drvdata(rdev
);
217 struct tcs_cmd cmd
= {
218 .addr
= vreg
->addr
+ RPMH_REGULATOR_REG_ENABLE
,
223 if (vreg
->enabled
== -EINVAL
&&
224 vreg
->voltage_selector
!= -ENOTRECOVERABLE
) {
225 ret
= _rpmh_regulator_vrm_set_voltage_sel(rdev
,
226 vreg
->voltage_selector
, true);
231 ret
= rpmh_regulator_send_request(vreg
, &cmd
, enable
);
233 vreg
->enabled
= enable
;
238 static int rpmh_regulator_enable(struct regulator_dev
*rdev
)
240 return rpmh_regulator_set_enable_state(rdev
, true);
243 static int rpmh_regulator_disable(struct regulator_dev
*rdev
)
245 return rpmh_regulator_set_enable_state(rdev
, false);
248 static int rpmh_regulator_vrm_set_mode_bypass(struct rpmh_vreg
*vreg
,
249 unsigned int mode
, bool bypassed
)
251 struct tcs_cmd cmd
= {
252 .addr
= vreg
->addr
+ RPMH_REGULATOR_REG_VRM_MODE
,
256 if (mode
> REGULATOR_MODE_STANDBY
)
259 pmic_mode
= vreg
->hw_data
->pmic_mode_map
[mode
];
264 cmd
.data
= PMIC4_BOB_MODE_PASS
;
266 cmd
.data
= pmic_mode
;
268 return rpmh_regulator_send_request(vreg
, &cmd
, true);
271 static int rpmh_regulator_vrm_set_mode(struct regulator_dev
*rdev
,
274 struct rpmh_vreg
*vreg
= rdev_get_drvdata(rdev
);
277 if (mode
== vreg
->mode
)
280 ret
= rpmh_regulator_vrm_set_mode_bypass(vreg
, mode
, vreg
->bypassed
);
287 static unsigned int rpmh_regulator_vrm_get_mode(struct regulator_dev
*rdev
)
289 struct rpmh_vreg
*vreg
= rdev_get_drvdata(rdev
);
295 * rpmh_regulator_vrm_set_load() - set the regulator mode based upon the load
297 * @rdev: Regulator device pointer for the rpmh-regulator
298 * @load_uA: Aggregated load current in microamps
300 * This function is used in the regulator_ops for VRM type RPMh regulator
303 * Return: 0 on success, errno on failure
305 static int rpmh_regulator_vrm_set_load(struct regulator_dev
*rdev
, int load_uA
)
307 struct rpmh_vreg
*vreg
= rdev_get_drvdata(rdev
);
310 if (load_uA
>= vreg
->hw_data
->hpm_min_load_uA
)
311 mode
= REGULATOR_MODE_NORMAL
;
313 mode
= REGULATOR_MODE_IDLE
;
315 return rpmh_regulator_vrm_set_mode(rdev
, mode
);
318 static int rpmh_regulator_vrm_set_bypass(struct regulator_dev
*rdev
,
321 struct rpmh_vreg
*vreg
= rdev_get_drvdata(rdev
);
324 if (vreg
->bypassed
== enable
)
327 ret
= rpmh_regulator_vrm_set_mode_bypass(vreg
, vreg
->mode
, enable
);
329 vreg
->bypassed
= enable
;
334 static int rpmh_regulator_vrm_get_bypass(struct regulator_dev
*rdev
,
337 struct rpmh_vreg
*vreg
= rdev_get_drvdata(rdev
);
339 *enable
= vreg
->bypassed
;
344 static const struct regulator_ops rpmh_regulator_vrm_ops
= {
345 .enable
= rpmh_regulator_enable
,
346 .disable
= rpmh_regulator_disable
,
347 .is_enabled
= rpmh_regulator_is_enabled
,
348 .set_voltage_sel
= rpmh_regulator_vrm_set_voltage_sel
,
349 .get_voltage_sel
= rpmh_regulator_vrm_get_voltage_sel
,
350 .list_voltage
= regulator_list_voltage_linear_range
,
351 .set_mode
= rpmh_regulator_vrm_set_mode
,
352 .get_mode
= rpmh_regulator_vrm_get_mode
,
355 static const struct regulator_ops rpmh_regulator_vrm_drms_ops
= {
356 .enable
= rpmh_regulator_enable
,
357 .disable
= rpmh_regulator_disable
,
358 .is_enabled
= rpmh_regulator_is_enabled
,
359 .set_voltage_sel
= rpmh_regulator_vrm_set_voltage_sel
,
360 .get_voltage_sel
= rpmh_regulator_vrm_get_voltage_sel
,
361 .list_voltage
= regulator_list_voltage_linear_range
,
362 .set_mode
= rpmh_regulator_vrm_set_mode
,
363 .get_mode
= rpmh_regulator_vrm_get_mode
,
364 .set_load
= rpmh_regulator_vrm_set_load
,
367 static const struct regulator_ops rpmh_regulator_vrm_bypass_ops
= {
368 .enable
= rpmh_regulator_enable
,
369 .disable
= rpmh_regulator_disable
,
370 .is_enabled
= rpmh_regulator_is_enabled
,
371 .set_voltage_sel
= rpmh_regulator_vrm_set_voltage_sel
,
372 .get_voltage_sel
= rpmh_regulator_vrm_get_voltage_sel
,
373 .list_voltage
= regulator_list_voltage_linear_range
,
374 .set_mode
= rpmh_regulator_vrm_set_mode
,
375 .get_mode
= rpmh_regulator_vrm_get_mode
,
376 .set_bypass
= rpmh_regulator_vrm_set_bypass
,
377 .get_bypass
= rpmh_regulator_vrm_get_bypass
,
380 static const struct regulator_ops rpmh_regulator_xob_ops
= {
381 .enable
= rpmh_regulator_enable
,
382 .disable
= rpmh_regulator_disable
,
383 .is_enabled
= rpmh_regulator_is_enabled
,
387 * rpmh_regulator_init_vreg() - initialize all attributes of an rpmh-regulator
388 * vreg: Pointer to the individual rpmh-regulator resource
389 * dev: Pointer to the top level rpmh-regulator PMIC device
390 * node: Pointer to the individual rpmh-regulator resource
392 * pmic_id: String used to identify the top level rpmh-regulator
393 * PMIC device on the board
394 * pmic_rpmh_data: Pointer to a null-terminated array of rpmh-regulator
395 * resources defined for the top level PMIC device
397 * Return: 0 on success, errno on failure
399 static int rpmh_regulator_init_vreg(struct rpmh_vreg
*vreg
, struct device
*dev
,
400 struct device_node
*node
, const char *pmic_id
,
401 const struct rpmh_vreg_init_data
*pmic_rpmh_data
)
403 struct regulator_config reg_config
= {};
404 char rpmh_resource_name
[20] = "";
405 const struct rpmh_vreg_init_data
*rpmh_data
;
406 struct regulator_init_data
*init_data
;
407 struct regulator_dev
*rdev
;
412 for (rpmh_data
= pmic_rpmh_data
; rpmh_data
->name
; rpmh_data
++)
413 if (of_node_name_eq(node
, rpmh_data
->name
))
416 if (!rpmh_data
->name
) {
417 dev_err(dev
, "Unknown regulator %pOFn\n", node
);
421 scnprintf(rpmh_resource_name
, sizeof(rpmh_resource_name
),
422 rpmh_data
->resource_name
, pmic_id
);
424 vreg
->addr
= cmd_db_read_addr(rpmh_resource_name
);
426 dev_err(dev
, "%pOFn: could not find RPMh address for resource %s\n",
427 node
, rpmh_resource_name
);
431 vreg
->rdesc
.name
= rpmh_data
->name
;
432 vreg
->rdesc
.supply_name
= rpmh_data
->supply_name
;
433 vreg
->hw_data
= rpmh_data
->hw_data
;
435 vreg
->enabled
= -EINVAL
;
436 vreg
->voltage_selector
= -ENOTRECOVERABLE
;
437 vreg
->mode
= REGULATOR_MODE_INVALID
;
439 if (rpmh_data
->hw_data
->n_voltages
) {
440 vreg
->rdesc
.linear_ranges
= &rpmh_data
->hw_data
->voltage_range
;
441 vreg
->rdesc
.n_linear_ranges
= 1;
442 vreg
->rdesc
.n_voltages
= rpmh_data
->hw_data
->n_voltages
;
445 vreg
->always_wait_for_ack
= of_property_read_bool(node
,
446 "qcom,always-wait-for-ack");
448 vreg
->rdesc
.owner
= THIS_MODULE
;
449 vreg
->rdesc
.type
= REGULATOR_VOLTAGE
;
450 vreg
->rdesc
.ops
= vreg
->hw_data
->ops
;
451 vreg
->rdesc
.of_map_mode
= vreg
->hw_data
->of_map_mode
;
453 init_data
= of_get_regulator_init_data(dev
, node
, &vreg
->rdesc
);
457 if (rpmh_data
->hw_data
->regulator_type
== XOB
&&
458 init_data
->constraints
.min_uV
&&
459 init_data
->constraints
.min_uV
== init_data
->constraints
.max_uV
) {
460 vreg
->rdesc
.fixed_uV
= init_data
->constraints
.min_uV
;
461 vreg
->rdesc
.n_voltages
= 1;
464 reg_config
.dev
= dev
;
465 reg_config
.init_data
= init_data
;
466 reg_config
.of_node
= node
;
467 reg_config
.driver_data
= vreg
;
469 rdev
= devm_regulator_register(dev
, &vreg
->rdesc
, ®_config
);
472 dev_err(dev
, "%pOFn: devm_regulator_register() failed, ret=%d\n",
477 dev_dbg(dev
, "%pOFn regulator registered for RPMh resource %s @ 0x%05X\n",
478 node
, rpmh_resource_name
, vreg
->addr
);
483 static const int pmic_mode_map_pmic4_ldo
[REGULATOR_MODE_STANDBY
+ 1] = {
484 [REGULATOR_MODE_INVALID
] = -EINVAL
,
485 [REGULATOR_MODE_STANDBY
] = PMIC4_LDO_MODE_RETENTION
,
486 [REGULATOR_MODE_IDLE
] = PMIC4_LDO_MODE_LPM
,
487 [REGULATOR_MODE_NORMAL
] = PMIC4_LDO_MODE_HPM
,
488 [REGULATOR_MODE_FAST
] = -EINVAL
,
491 static unsigned int rpmh_regulator_pmic4_ldo_of_map_mode(unsigned int rpmh_mode
)
496 case RPMH_REGULATOR_MODE_HPM
:
497 mode
= REGULATOR_MODE_NORMAL
;
499 case RPMH_REGULATOR_MODE_LPM
:
500 mode
= REGULATOR_MODE_IDLE
;
502 case RPMH_REGULATOR_MODE_RET
:
503 mode
= REGULATOR_MODE_STANDBY
;
506 mode
= REGULATOR_MODE_INVALID
;
513 static const int pmic_mode_map_pmic4_smps
[REGULATOR_MODE_STANDBY
+ 1] = {
514 [REGULATOR_MODE_INVALID
] = -EINVAL
,
515 [REGULATOR_MODE_STANDBY
] = PMIC4_SMPS_MODE_RETENTION
,
516 [REGULATOR_MODE_IDLE
] = PMIC4_SMPS_MODE_PFM
,
517 [REGULATOR_MODE_NORMAL
] = PMIC4_SMPS_MODE_AUTO
,
518 [REGULATOR_MODE_FAST
] = PMIC4_SMPS_MODE_PWM
,
522 rpmh_regulator_pmic4_smps_of_map_mode(unsigned int rpmh_mode
)
527 case RPMH_REGULATOR_MODE_HPM
:
528 mode
= REGULATOR_MODE_FAST
;
530 case RPMH_REGULATOR_MODE_AUTO
:
531 mode
= REGULATOR_MODE_NORMAL
;
533 case RPMH_REGULATOR_MODE_LPM
:
534 mode
= REGULATOR_MODE_IDLE
;
536 case RPMH_REGULATOR_MODE_RET
:
537 mode
= REGULATOR_MODE_STANDBY
;
540 mode
= REGULATOR_MODE_INVALID
;
547 static const int pmic_mode_map_pmic4_bob
[REGULATOR_MODE_STANDBY
+ 1] = {
548 [REGULATOR_MODE_INVALID
] = -EINVAL
,
549 [REGULATOR_MODE_STANDBY
] = -EINVAL
,
550 [REGULATOR_MODE_IDLE
] = PMIC4_BOB_MODE_PFM
,
551 [REGULATOR_MODE_NORMAL
] = PMIC4_BOB_MODE_AUTO
,
552 [REGULATOR_MODE_FAST
] = PMIC4_BOB_MODE_PWM
,
555 static unsigned int rpmh_regulator_pmic4_bob_of_map_mode(unsigned int rpmh_mode
)
560 case RPMH_REGULATOR_MODE_HPM
:
561 mode
= REGULATOR_MODE_FAST
;
563 case RPMH_REGULATOR_MODE_AUTO
:
564 mode
= REGULATOR_MODE_NORMAL
;
566 case RPMH_REGULATOR_MODE_LPM
:
567 mode
= REGULATOR_MODE_IDLE
;
570 mode
= REGULATOR_MODE_INVALID
;
577 static const struct rpmh_vreg_hw_data pmic4_pldo
= {
578 .regulator_type
= VRM
,
579 .ops
= &rpmh_regulator_vrm_drms_ops
,
580 .voltage_range
= REGULATOR_LINEAR_RANGE(1664000, 0, 255, 8000),
582 .hpm_min_load_uA
= 10000,
583 .pmic_mode_map
= pmic_mode_map_pmic4_ldo
,
584 .of_map_mode
= rpmh_regulator_pmic4_ldo_of_map_mode
,
587 static const struct rpmh_vreg_hw_data pmic4_pldo_lv
= {
588 .regulator_type
= VRM
,
589 .ops
= &rpmh_regulator_vrm_drms_ops
,
590 .voltage_range
= REGULATOR_LINEAR_RANGE(1256000, 0, 127, 8000),
592 .hpm_min_load_uA
= 10000,
593 .pmic_mode_map
= pmic_mode_map_pmic4_ldo
,
594 .of_map_mode
= rpmh_regulator_pmic4_ldo_of_map_mode
,
597 static const struct rpmh_vreg_hw_data pmic4_nldo
= {
598 .regulator_type
= VRM
,
599 .ops
= &rpmh_regulator_vrm_drms_ops
,
600 .voltage_range
= REGULATOR_LINEAR_RANGE(312000, 0, 127, 8000),
602 .hpm_min_load_uA
= 30000,
603 .pmic_mode_map
= pmic_mode_map_pmic4_ldo
,
604 .of_map_mode
= rpmh_regulator_pmic4_ldo_of_map_mode
,
607 static const struct rpmh_vreg_hw_data pmic4_hfsmps3
= {
608 .regulator_type
= VRM
,
609 .ops
= &rpmh_regulator_vrm_ops
,
610 .voltage_range
= REGULATOR_LINEAR_RANGE(320000, 0, 215, 8000),
612 .pmic_mode_map
= pmic_mode_map_pmic4_smps
,
613 .of_map_mode
= rpmh_regulator_pmic4_smps_of_map_mode
,
616 static const struct rpmh_vreg_hw_data pmic4_ftsmps426
= {
617 .regulator_type
= VRM
,
618 .ops
= &rpmh_regulator_vrm_ops
,
619 .voltage_range
= REGULATOR_LINEAR_RANGE(320000, 0, 258, 4000),
621 .pmic_mode_map
= pmic_mode_map_pmic4_smps
,
622 .of_map_mode
= rpmh_regulator_pmic4_smps_of_map_mode
,
625 static const struct rpmh_vreg_hw_data pmic4_bob
= {
626 .regulator_type
= VRM
,
627 .ops
= &rpmh_regulator_vrm_bypass_ops
,
628 .voltage_range
= REGULATOR_LINEAR_RANGE(1824000, 0, 83, 32000),
630 .pmic_mode_map
= pmic_mode_map_pmic4_bob
,
631 .of_map_mode
= rpmh_regulator_pmic4_bob_of_map_mode
,
634 static const struct rpmh_vreg_hw_data pmic4_lvs
= {
635 .regulator_type
= XOB
,
636 .ops
= &rpmh_regulator_xob_ops
,
637 /* LVS hardware does not support voltage or mode configuration. */
640 #define RPMH_VREG(_name, _resource_name, _hw_data, _supply_name) \
643 .resource_name = _resource_name, \
644 .hw_data = _hw_data, \
645 .supply_name = _supply_name, \
648 static const struct rpmh_vreg_init_data pm8998_vreg_data
[] = {
649 RPMH_VREG("smps1", "smp%s1", &pmic4_ftsmps426
, "vdd-s1"),
650 RPMH_VREG("smps2", "smp%s2", &pmic4_ftsmps426
, "vdd-s2"),
651 RPMH_VREG("smps3", "smp%s3", &pmic4_hfsmps3
, "vdd-s3"),
652 RPMH_VREG("smps4", "smp%s4", &pmic4_hfsmps3
, "vdd-s4"),
653 RPMH_VREG("smps5", "smp%s5", &pmic4_hfsmps3
, "vdd-s5"),
654 RPMH_VREG("smps6", "smp%s6", &pmic4_ftsmps426
, "vdd-s6"),
655 RPMH_VREG("smps7", "smp%s7", &pmic4_ftsmps426
, "vdd-s7"),
656 RPMH_VREG("smps8", "smp%s8", &pmic4_ftsmps426
, "vdd-s8"),
657 RPMH_VREG("smps9", "smp%s9", &pmic4_ftsmps426
, "vdd-s9"),
658 RPMH_VREG("smps10", "smp%s10", &pmic4_ftsmps426
, "vdd-s10"),
659 RPMH_VREG("smps11", "smp%s11", &pmic4_ftsmps426
, "vdd-s11"),
660 RPMH_VREG("smps12", "smp%s12", &pmic4_ftsmps426
, "vdd-s12"),
661 RPMH_VREG("smps13", "smp%s13", &pmic4_ftsmps426
, "vdd-s13"),
662 RPMH_VREG("ldo1", "ldo%s1", &pmic4_nldo
, "vdd-l1-l27"),
663 RPMH_VREG("ldo2", "ldo%s2", &pmic4_nldo
, "vdd-l2-l8-l17"),
664 RPMH_VREG("ldo3", "ldo%s3", &pmic4_nldo
, "vdd-l3-l11"),
665 RPMH_VREG("ldo4", "ldo%s4", &pmic4_nldo
, "vdd-l4-l5"),
666 RPMH_VREG("ldo5", "ldo%s5", &pmic4_nldo
, "vdd-l4-l5"),
667 RPMH_VREG("ldo6", "ldo%s6", &pmic4_pldo
, "vdd-l6"),
668 RPMH_VREG("ldo7", "ldo%s7", &pmic4_pldo_lv
, "vdd-l7-l12-l14-l15"),
669 RPMH_VREG("ldo8", "ldo%s8", &pmic4_nldo
, "vdd-l2-l8-l17"),
670 RPMH_VREG("ldo9", "ldo%s9", &pmic4_pldo
, "vdd-l9"),
671 RPMH_VREG("ldo10", "ldo%s10", &pmic4_pldo
, "vdd-l10-l23-l25"),
672 RPMH_VREG("ldo11", "ldo%s11", &pmic4_nldo
, "vdd-l3-l11"),
673 RPMH_VREG("ldo12", "ldo%s12", &pmic4_pldo_lv
, "vdd-l7-l12-l14-l15"),
674 RPMH_VREG("ldo13", "ldo%s13", &pmic4_pldo
, "vdd-l13-l19-l21"),
675 RPMH_VREG("ldo14", "ldo%s14", &pmic4_pldo_lv
, "vdd-l7-l12-l14-l15"),
676 RPMH_VREG("ldo15", "ldo%s15", &pmic4_pldo_lv
, "vdd-l7-l12-l14-l15"),
677 RPMH_VREG("ldo16", "ldo%s16", &pmic4_pldo
, "vdd-l16-l28"),
678 RPMH_VREG("ldo17", "ldo%s17", &pmic4_nldo
, "vdd-l2-l8-l17"),
679 RPMH_VREG("ldo18", "ldo%s18", &pmic4_pldo
, "vdd-l18-l22"),
680 RPMH_VREG("ldo19", "ldo%s19", &pmic4_pldo
, "vdd-l13-l19-l21"),
681 RPMH_VREG("ldo20", "ldo%s20", &pmic4_pldo
, "vdd-l20-l24"),
682 RPMH_VREG("ldo21", "ldo%s21", &pmic4_pldo
, "vdd-l13-l19-l21"),
683 RPMH_VREG("ldo22", "ldo%s22", &pmic4_pldo
, "vdd-l18-l22"),
684 RPMH_VREG("ldo23", "ldo%s23", &pmic4_pldo
, "vdd-l10-l23-l25"),
685 RPMH_VREG("ldo24", "ldo%s24", &pmic4_pldo
, "vdd-l20-l24"),
686 RPMH_VREG("ldo25", "ldo%s25", &pmic4_pldo
, "vdd-l10-l23-l25"),
687 RPMH_VREG("ldo26", "ldo%s26", &pmic4_nldo
, "vdd-l26"),
688 RPMH_VREG("ldo27", "ldo%s27", &pmic4_nldo
, "vdd-l1-l27"),
689 RPMH_VREG("ldo28", "ldo%s28", &pmic4_pldo
, "vdd-l16-l28"),
690 RPMH_VREG("lvs1", "vs%s1", &pmic4_lvs
, "vin-lvs-1-2"),
691 RPMH_VREG("lvs2", "vs%s2", &pmic4_lvs
, "vin-lvs-1-2"),
695 static const struct rpmh_vreg_init_data pmi8998_vreg_data
[] = {
696 RPMH_VREG("bob", "bob%s1", &pmic4_bob
, "vdd-bob"),
700 static const struct rpmh_vreg_init_data pm8005_vreg_data
[] = {
701 RPMH_VREG("smps1", "smp%s1", &pmic4_ftsmps426
, "vdd-s1"),
702 RPMH_VREG("smps2", "smp%s2", &pmic4_ftsmps426
, "vdd-s2"),
703 RPMH_VREG("smps3", "smp%s3", &pmic4_ftsmps426
, "vdd-s3"),
704 RPMH_VREG("smps4", "smp%s4", &pmic4_ftsmps426
, "vdd-s4"),
708 static int rpmh_regulator_probe(struct platform_device
*pdev
)
710 struct device
*dev
= &pdev
->dev
;
711 const struct rpmh_vreg_init_data
*vreg_data
;
712 struct device_node
*node
;
713 struct rpmh_vreg
*vreg
;
717 vreg_data
= of_device_get_match_data(dev
);
721 ret
= of_property_read_string(dev
->of_node
, "qcom,pmic-id", &pmic_id
);
723 dev_err(dev
, "qcom,pmic-id missing in DT node\n");
727 for_each_available_child_of_node(dev
->of_node
, node
) {
728 vreg
= devm_kzalloc(dev
, sizeof(*vreg
), GFP_KERNEL
);
734 ret
= rpmh_regulator_init_vreg(vreg
, dev
, node
, pmic_id
,
745 static const struct of_device_id rpmh_regulator_match_table
[] = {
747 .compatible
= "qcom,pm8998-rpmh-regulators",
748 .data
= pm8998_vreg_data
,
751 .compatible
= "qcom,pmi8998-rpmh-regulators",
752 .data
= pmi8998_vreg_data
,
755 .compatible
= "qcom,pm8005-rpmh-regulators",
756 .data
= pm8005_vreg_data
,
760 MODULE_DEVICE_TABLE(of
, rpmh_regulator_match_table
);
762 static struct platform_driver rpmh_regulator_driver
= {
764 .name
= "qcom-rpmh-regulator",
765 .of_match_table
= of_match_ptr(rpmh_regulator_match_table
),
767 .probe
= rpmh_regulator_probe
,
769 module_platform_driver(rpmh_regulator_driver
);
771 MODULE_DESCRIPTION("Qualcomm RPMh regulator driver");
772 MODULE_LICENSE("GPL v2");