UPSTREAM: power: extend prefix match to regulator-name property
This patch extends pmic_bind_children prefix matching. In addition to the node name the property regulator-name is used while trying to match prefixes. This allows assigning different drivers to regulator nodes named regulator@1 and regulator@10 for example. I have discarded the idea of using other properties then regulator-name as I do not see any benefit in using property compatible or even regulator-compatible. Of course I am open to change this if there are good reasons to do so. Change-Id: Ifedf2c0a51cb725ddb290ee9dfd54a3fea45df70 Signed-off-by: Felix Brack <fb@ltec.ch> Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Kever Yang <kever.yang@rock-chips.com> (cherry picked from commit bf802f5d544f85c03b4097ab23d078be43c61855)
This commit is contained in:
parent
13e1d84013
commit
29b6917330
|
|
@ -75,4 +75,10 @@
|
||||||
regulator-min-microvolt = <3300000>;
|
regulator-min-microvolt = <3300000>;
|
||||||
regulator-max-microvolt = <3300000>;
|
regulator-max-microvolt = <3300000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
no_match_by_nodename {
|
||||||
|
regulator-name = "buck_SUPPLY_1.5V";
|
||||||
|
regulator-min-microvolt = <1500000>;
|
||||||
|
regulator-max-microvolt = <1500000>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,8 @@ Voltage/Current regulator
|
||||||
|
|
||||||
Binding:
|
Binding:
|
||||||
The regulator devices don't use the "compatible" property. The binding is done
|
The regulator devices don't use the "compatible" property. The binding is done
|
||||||
by the prefix of regulator node's name. Usually the pmic I/O driver will provide
|
by the prefix of regulator node's name, or, if this fails, by the prefix of the
|
||||||
|
regulator's "regulator-name" property. Usually the pmic I/O driver will provide
|
||||||
the array of 'struct pmic_child_info' with the prefixes and compatible drivers.
|
the array of 'struct pmic_child_info' with the prefixes and compatible drivers.
|
||||||
The bind is done by calling function: pmic_bind_childs().
|
The bind is done by calling function: pmic_bind_childs().
|
||||||
Example drivers:
|
Example drivers:
|
||||||
|
|
@ -15,8 +16,19 @@ For the node name e.g.: "prefix[:alpha:]num { ... }":
|
||||||
|
|
||||||
Example the prefix "ldo" will pass for: "ldo1", "ldo@1", "ldoreg@1, ...
|
Example the prefix "ldo" will pass for: "ldo1", "ldo@1", "ldoreg@1, ...
|
||||||
|
|
||||||
|
Binding by means of the node's name is preferred. However if the node names
|
||||||
|
would produce ambiguous prefixes (like "regulator@1" and "regualtor@11") and you
|
||||||
|
can't or do not want to change them then binding against the "regulator-name"
|
||||||
|
property is possible. The syntax for the prefix of the "regulator-name" property
|
||||||
|
is the same as the one for the regulator's node name.
|
||||||
|
Use case: a regulator named "regulator@1" to be bound to a driver named
|
||||||
|
"LDO_DRV" and a regulator named "regualator@11" to be bound to an other driver
|
||||||
|
named "BOOST_DRV". Using prefix "regualtor@1" for driver matching would load
|
||||||
|
the same driver for both regulators, hence the prefix is ambiguous.
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
- regulator-name: a string, required by the regulator uclass
|
- regulator-name: a string, required by the regulator uclass, used for driver
|
||||||
|
binding if binding by node's name prefix fails
|
||||||
- regulator-min-microvolt: a minimum allowed Voltage value
|
- regulator-min-microvolt: a minimum allowed Voltage value
|
||||||
- regulator-max-microvolt: a maximum allowed Voltage value
|
- regulator-max-microvolt: a maximum allowed Voltage value
|
||||||
- regulator-min-microamp: a minimum allowed Current value
|
- regulator-min-microamp: a minimum allowed Current value
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ int pmic_bind_children(struct udevice *pmic, ofnode parent,
|
||||||
struct driver *drv;
|
struct driver *drv;
|
||||||
struct udevice *child;
|
struct udevice *child;
|
||||||
const char *node_name;
|
const char *node_name;
|
||||||
|
const char *reg_name;
|
||||||
int bind_count = 0;
|
int bind_count = 0;
|
||||||
ofnode node;
|
ofnode node;
|
||||||
int prefix_len;
|
int prefix_len;
|
||||||
|
|
@ -44,8 +45,14 @@ int pmic_bind_children(struct udevice *pmic, ofnode parent,
|
||||||
debug(" - compatible prefix: '%s'\n", info->prefix);
|
debug(" - compatible prefix: '%s'\n", info->prefix);
|
||||||
|
|
||||||
prefix_len = strlen(info->prefix);
|
prefix_len = strlen(info->prefix);
|
||||||
if (strncmp(info->prefix, node_name, prefix_len))
|
if (strncmp(info->prefix, node_name, prefix_len)) {
|
||||||
continue;
|
reg_name = ofnode_read_string(node,
|
||||||
|
"regulator-name");
|
||||||
|
if (!reg_name)
|
||||||
|
continue;
|
||||||
|
if (strncmp(info->prefix, reg_name, prefix_len))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
drv = lists_driver_lookup_name(info->driver);
|
drv = lists_driver_lookup_name(info->driver);
|
||||||
if (!drv) {
|
if (!drv) {
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
#define SANDBOX_BUCK_DRIVER "sandbox_buck"
|
#define SANDBOX_BUCK_DRIVER "sandbox_buck"
|
||||||
#define SANDBOX_OF_BUCK_PREFIX "buck"
|
#define SANDBOX_OF_BUCK_PREFIX "buck"
|
||||||
|
|
||||||
#define SANDBOX_BUCK_COUNT 2
|
#define SANDBOX_BUCK_COUNT 3
|
||||||
#define SANDBOX_LDO_COUNT 2
|
#define SANDBOX_LDO_COUNT 2
|
||||||
/*
|
/*
|
||||||
* Sandbox PMIC registers:
|
* Sandbox PMIC registers:
|
||||||
|
|
@ -109,6 +109,9 @@ enum {
|
||||||
#define SANDBOX_BUCK1_PLATNAME "SUPPLY_1.2V"
|
#define SANDBOX_BUCK1_PLATNAME "SUPPLY_1.2V"
|
||||||
#define SANDBOX_BUCK2_DEVNAME "buck2"
|
#define SANDBOX_BUCK2_DEVNAME "buck2"
|
||||||
#define SANDBOX_BUCK2_PLATNAME "SUPPLY_3.3V"
|
#define SANDBOX_BUCK2_PLATNAME "SUPPLY_3.3V"
|
||||||
|
/* BUCK3: for testing fallback regulator prefix matching during bind */
|
||||||
|
#define SANDBOX_BUCK3_DEVNAME "no_match_by_nodename"
|
||||||
|
#define SANDBOX_BUCK3_PLATNAME "buck_SUPPLY_1.5V"
|
||||||
/* LDO names */
|
/* LDO names */
|
||||||
#define SANDBOX_LDO1_DEVNAME "ldo1"
|
#define SANDBOX_LDO1_DEVNAME "ldo1"
|
||||||
#define SANDBOX_LDO1_PLATNAME "VDD_EMMC_1.8V"
|
#define SANDBOX_LDO1_PLATNAME "VDD_EMMC_1.8V"
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
enum {
|
enum {
|
||||||
BUCK1,
|
BUCK1,
|
||||||
BUCK2,
|
BUCK2,
|
||||||
|
BUCK3,
|
||||||
LDO1,
|
LDO1,
|
||||||
LDO2,
|
LDO2,
|
||||||
OUTPUT_COUNT,
|
OUTPUT_COUNT,
|
||||||
|
|
@ -42,6 +43,7 @@ static const char *regulator_names[OUTPUT_COUNT][OUTPUT_NAME_COUNT] = {
|
||||||
/* devname, platname */
|
/* devname, platname */
|
||||||
{ SANDBOX_BUCK1_DEVNAME, SANDBOX_BUCK1_PLATNAME },
|
{ SANDBOX_BUCK1_DEVNAME, SANDBOX_BUCK1_PLATNAME },
|
||||||
{ SANDBOX_BUCK2_DEVNAME, SANDBOX_BUCK2_PLATNAME },
|
{ SANDBOX_BUCK2_DEVNAME, SANDBOX_BUCK2_PLATNAME },
|
||||||
|
{ SANDBOX_BUCK3_DEVNAME, SANDBOX_BUCK3_PLATNAME },
|
||||||
{ SANDBOX_LDO1_DEVNAME, SANDBOX_LDO1_PLATNAME},
|
{ SANDBOX_LDO1_DEVNAME, SANDBOX_LDO1_PLATNAME},
|
||||||
{ SANDBOX_LDO2_DEVNAME, SANDBOX_LDO2_PLATNAME},
|
{ SANDBOX_LDO2_DEVNAME, SANDBOX_LDO2_PLATNAME},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue