Skip to content

Commit 6882654

Browse files
finley1226rkhuangtao
authored andcommitted
regulator: core: Add support to limit min_uV during system startup
Now a regulator device can supply multiple consumers at the same time, if a consumer starts and set a low voltage, another consumer doesn't start in kernel but has been set a high frequency in bootloader will abort. This patch Adds support to limit min_uV during kernel startup to make sure the voltage can suit the needs of all consumers. Change-Id: Ibd16a8e44916798021e2470c90a8e3488df206f4 Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
1 parent 859175c commit 6882654

5 files changed

Lines changed: 58 additions & 0 deletions

File tree

Documentation/devicetree/bindings/regulator/regulator.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ Optional properties:
55
- regulator-min-microvolt: smallest voltage consumers may set
66
- regulator-max-microvolt: largest voltage consumers may set
77
- regulator-microvolt-offset: Offset applied to voltages to compensate for voltage drops
8+
- regulator-early-min-microvolt: minimum voltage during system startup, make sure we
9+
select a voltage that suits the needs of all regulator consumers
810
- regulator-min-microamp: smallest current consumers may set
911
- regulator-max-microamp: largest current consumers may set
1012
- regulator-input-current-limit-microamp: maximum input current regulator allows

drivers/regulator/core.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ static DEFINE_MUTEX(regulator_list_mutex);
5656
static LIST_HEAD(regulator_map_list);
5757
static LIST_HEAD(regulator_ena_gpio_list);
5858
static LIST_HEAD(regulator_supply_alias_list);
59+
static LIST_HEAD(regulator_early_min_volt_list);
5960
static bool has_full_constraints;
6061

6162
static struct dentry *debugfs_root;
@@ -4224,6 +4225,26 @@ static inline void rdev_init_debugfs(struct regulator_dev *rdev)
42244225

42254226
#endif
42264227

4228+
static void rdev_init_early_min_volt(struct regulator_dev *rdev)
4229+
{
4230+
struct regulator *regulator;
4231+
4232+
if (!rdev->constraints->early_min_uV)
4233+
return;
4234+
4235+
regulator = regulator_get(NULL, rdev_get_name(rdev));
4236+
if (IS_ERR(regulator)) {
4237+
rdev_err(rdev, "regulator get failed, ret=%ld\n",
4238+
PTR_ERR(regulator));
4239+
return;
4240+
}
4241+
4242+
regulator->min_uV = rdev->constraints->early_min_uV;
4243+
regulator->max_uV = rdev->constraints->max_uV;
4244+
4245+
list_add(&regulator->early_min_list, &regulator_early_min_volt_list);
4246+
}
4247+
42274248
static int regulator_register_resolve_supply(struct device *dev, void *data)
42284249
{
42294250
struct regulator_dev *rdev = dev_to_rdev(dev);
@@ -4391,6 +4412,7 @@ regulator_register(const struct regulator_desc *regulator_desc,
43914412

43924413
dev_set_drvdata(&rdev->dev, rdev);
43934414
rdev_init_debugfs(rdev);
4415+
rdev_init_early_min_volt(rdev);
43944416

43954417
/* try to resolve regulators supply since a new one was registered */
43964418
class_for_each_device(&regulator_class, NULL, NULL,
@@ -4830,6 +4852,28 @@ static int __init regulator_late_cleanup(struct device *dev, void *data)
48304852
return 0;
48314853
}
48324854

4855+
static void __init regulator_release_early_min_volt(void)
4856+
{
4857+
struct regulator *regulator, *n;
4858+
struct regulator_dev *rdev;
4859+
4860+
if (list_empty(&regulator_early_min_volt_list))
4861+
return;
4862+
4863+
list_for_each_entry_safe(regulator, n, &regulator_early_min_volt_list,
4864+
early_min_list) {
4865+
rdev = regulator->rdev;
4866+
regulator->min_uV = 0;
4867+
regulator->max_uV = 0;
4868+
if (regulator_set_voltage(regulator, regulator->min_uV,
4869+
regulator->max_uV))
4870+
rdev_err(regulator->rdev, "set voltage(%d, %d) failed\n",
4871+
regulator->min_uV, regulator->max_uV);
4872+
list_del(&regulator->early_min_list);
4873+
regulator_put(regulator);
4874+
}
4875+
}
4876+
48334877
static int __init regulator_init_complete(void)
48344878
{
48354879
/*
@@ -4849,6 +4893,8 @@ static int __init regulator_init_complete(void)
48494893
class_for_each_device(&regulator_class, NULL, NULL,
48504894
regulator_late_cleanup);
48514895

4896+
regulator_release_early_min_volt();
4897+
48524898
return 0;
48534899
}
48544900
late_initcall_sync(regulator_init_complete);

drivers/regulator/internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
struct regulator {
2525
struct device *dev;
2626
struct list_head list;
27+
struct list_head early_min_list;
2728
unsigned int always_on:1;
2829
unsigned int bypass:1;
2930
int uA_load;

drivers/regulator/of_regulator.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ static void of_get_regulation_constraints(struct device_node *np,
4242
if (!of_property_read_u32(np, "regulator-max-microvolt", &pval))
4343
constraints->max_uV = pval;
4444

45+
if (!of_property_read_u32(np, "regulator-early-min-microvolt", &pval))
46+
constraints->early_min_uV = pval;
47+
4548
/* Voltage change possible? */
4649
if (constraints->min_uV != constraints->max_uV)
4750
constraints->valid_ops_mask |= REGULATOR_CHANGE_VOLTAGE;

include/linux/regulator/machine.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ struct regulator_state {
8080
* @uV_offset: Offset applied to voltages from consumer to compensate for
8181
* voltage drops.
8282
*
83+
* @early_min_uV: Minimum voltage during system startup, make sure we select
84+
* a voltage that suits the needs of all regulator consumers.
85+
*
8386
* @min_uA: Smallest current consumers may set.
8487
* @max_uA: Largest current consumers may set.
8588
* @ilim_uA: Maximum input current.
@@ -126,6 +129,9 @@ struct regulation_constraints {
126129
int min_uV;
127130
int max_uV;
128131

132+
/* Minimum voltage during system startup */
133+
int early_min_uV;
134+
129135
int uV_offset;
130136

131137
/* current output range (inclusive) - for current control */

0 commit comments

Comments
 (0)