On 20.10.2017 15:34, Jaehoon Chung wrote: > On 10/18/2017 06:39 PM, Felix Brack wrote: >> 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. >> >> Signed-off-by: Felix Brack <f...@ltec.ch> >> --- >> >> Changes in v2: >> - add documentation >> - add a regulator to the sandbox for testing >> - extend the test for the new sandbox regulator >> >> arch/sandbox/dts/sandbox_pmic.dtsi | 6 ++++++ >> doc/device-tree-bindings/regulator/regulator.txt | 16 ++++++++++++++-- >> drivers/power/pmic/pmic-uclass.c | 15 +++++++++++++-- >> include/power/sandbox_pmic.h | 5 ++++- >> test/dm/regulator.c | 2 ++ >> 5 files changed, 39 insertions(+), 5 deletions(-) >> >> diff --git a/arch/sandbox/dts/sandbox_pmic.dtsi >> b/arch/sandbox/dts/sandbox_pmic.dtsi >> index ce261b9..acb4799 100644 >> --- a/arch/sandbox/dts/sandbox_pmic.dtsi >> +++ b/arch/sandbox/dts/sandbox_pmic.dtsi >> @@ -75,4 +75,10 @@ >> regulator-min-microvolt = <3300000>; >> regulator-max-microvolt = <3300000>; >> }; >> + >> + no_match_by_nodename { >> + regulator-name = "buck_SUPPLY_1.5V"; >> + regulator-min-microvolt = <1500000>; >> + regulator-max-microvolt = <1500000>; >> + }; >> }; >> diff --git a/doc/device-tree-bindings/regulator/regulator.txt >> b/doc/device-tree-bindings/regulator/regulator.txt >> index 918711e..65b69c4 100644 >> --- a/doc/device-tree-bindings/regulator/regulator.txt >> +++ b/doc/device-tree-bindings/regulator/regulator.txt >> @@ -2,7 +2,8 @@ Voltage/Current regulator >> >> Binding: >> 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 bind is done by calling function: pmic_bind_childs(). >> 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, ... >> >> +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: >> -- 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-max-microvolt: a maximum allowed Voltage value >> - regulator-min-microamp: a minimum allowed Current value >> diff --git a/drivers/power/pmic/pmic-uclass.c >> b/drivers/power/pmic/pmic-uclass.c >> index 64964e4..5a034f0 100644 >> --- a/drivers/power/pmic/pmic-uclass.c >> +++ b/drivers/power/pmic/pmic-uclass.c >> @@ -26,6 +26,7 @@ int pmic_bind_children(struct udevice *pmic, ofnode parent, >> struct driver *drv; >> struct udevice *child; >> const char *node_name; >> + const char *reg_name; >> int bind_count = 0; >> ofnode node; >> int prefix_len; >> @@ -44,8 +45,18 @@ int pmic_bind_children(struct udevice *pmic, ofnode >> parent, >> debug(" - compatible prefix: '%s'\n", info->prefix); >> >> prefix_len = strlen(info->prefix); >> - if (strncmp(info->prefix, node_name, prefix_len)) >> - continue; >> + if (strncmp(info->prefix, node_name, prefix_len)) { >> + reg_name = ofnode_read_string(node, >> + "regulator-name"); >> + if (reg_name) { >> + if (strncmp(info->prefix, reg_name, >> + prefix_len)) { >> + continue; >> + } >> + } else { >> + continue; >> + }The below code is more readable? > > if (!reg_name) > continue; > > if (strncmp()) > continue; > > ... > > how about? > Agreed. Looks much better and is simpler to read. If somebody insists on this modification that's fine with me and I will present a v3 patch.
> >> + } >> >> drv = lists_driver_lookup_name(info->driver); >> if (!drv) { >> diff --git a/include/power/sandbox_pmic.h b/include/power/sandbox_pmic.h >> index 7fdbfb9..da2c296 100644 >> --- a/include/power/sandbox_pmic.h >> +++ b/include/power/sandbox_pmic.h >> @@ -13,7 +13,7 @@ >> #define SANDBOX_BUCK_DRIVER "sandbox_buck" >> #define SANDBOX_OF_BUCK_PREFIX "buck" >> >> -#define SANDBOX_BUCK_COUNT 2 >> +#define SANDBOX_BUCK_COUNT 3 >> #define SANDBOX_LDO_COUNT 2 >> /* >> * Sandbox PMIC registers: >> @@ -114,6 +114,9 @@ enum { >> #define SANDBOX_LDO1_PLATNAME "VDD_EMMC_1.8V" >> #define SANDBOX_LDO2_DEVNAME "ldo2" >> #define SANDBOX_LDO2_PLATNAME "VDD_LCD_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" > > These defined might be located on above point. (SANDBOX_BUCK2_xxxx) > Yes of course. But the idea of putting them here is to emphasize the special name due to binding against regulator-name property, kind of separating this BUCK regulator from 'normal' BUCK regulators. > Best Regards, > Jaehoon Chung > >> >> /* >> * Expected regulators setup after call of: >> diff --git a/test/dm/regulator.c b/test/dm/regulator.c >> index 3d0056f..395381d 100644 >> --- a/test/dm/regulator.c >> +++ b/test/dm/regulator.c >> @@ -27,6 +27,7 @@ DECLARE_GLOBAL_DATA_PTR; >> enum { >> BUCK1, >> BUCK2, >> + BUCK3, >> LDO1, >> LDO2, >> OUTPUT_COUNT, >> @@ -42,6 +43,7 @@ static const char >> *regulator_names[OUTPUT_COUNT][OUTPUT_NAME_COUNT] = { >> /* devname, platname */ >> { SANDBOX_BUCK1_DEVNAME, SANDBOX_BUCK1_PLATNAME }, >> { SANDBOX_BUCK2_DEVNAME, SANDBOX_BUCK2_PLATNAME }, >> + { SANDBOX_BUCK3_DEVNAME, SANDBOX_BUCK3_PLATNAME }, >> { SANDBOX_LDO1_DEVNAME, SANDBOX_LDO1_PLATNAME}, >> { SANDBOX_LDO2_DEVNAME, SANDBOX_LDO2_PLATNAME}, >> }; >> > regards, Felix _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot