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:
Felix Brack 2017-11-27 09:14:16 +01:00 committed by Kever Yang
parent 13e1d84013
commit 29b6917330
5 changed files with 35 additions and 5 deletions

View File

@ -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>;
};
}; };

View File

@ -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

View File

@ -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)) {
reg_name = ofnode_read_string(node,
"regulator-name");
if (!reg_name)
continue; 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) {

View File

@ -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"

View File

@ -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},
}; };