power: extend prefix match to regulator-name property
authorFelix Brack <fb@ltec.ch>
Mon, 27 Nov 2017 08:14:16 +0000 (09:14 +0100)
committerSimon Glass <sjg@chromium.org>
Wed, 13 Dec 2017 02:53:45 +0000 (19:53 -0700)
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 <fb@ltec.ch>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/sandbox/dts/sandbox_pmic.dtsi
doc/device-tree-bindings/regulator/regulator.txt
drivers/power/pmic/pmic-uclass.c
include/power/sandbox_pmic.h
test/dm/regulator.c

index ce261b930e13abe4f8b7903e22319b09c3a39d2d..acb479939645913f6df90f59a70e5cd8097176b8 100644 (file)
                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>;
+       };
 };
index 918711eb4d86881f49abbf12f5872e227ad971c1..65b69c427899e582568538a942c2eb71a61b60bd 100644 (file)
@@ -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
index 64964e4e963ddb6291499f272d907331a88cc5c1..9347b4068897e8fca645f8974dc70f7a1b39b7f2 100644 (file)
@@ -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,14 @@ 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)
+                                       continue;
+                               if (strncmp(info->prefix, reg_name, prefix_len))
+                                       continue;
+                       }
 
                        drv = lists_driver_lookup_name(info->driver);
                        if (!drv) {
index 7fdbfb9fc6f978ac9e58f26824b42044f6a42bf5..c5e6fda2ea0f9c509c7148b08fe66490870b996d 100644 (file)
@@ -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:
@@ -109,6 +109,9 @@ enum {
 #define SANDBOX_BUCK1_PLATNAME "SUPPLY_1.2V"
 #define SANDBOX_BUCK2_DEVNAME  "buck2"
 #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 */
 #define SANDBOX_LDO1_DEVNAME   "ldo1"
 #define SANDBOX_LDO1_PLATNAME  "VDD_EMMC_1.8V"
index 3d0056f2dc7bf13049d4d2c13e711bedf9aa8f77..395381d4bd2f2b0902766ac47c7fd425d13b6e35 100644 (file)
@@ -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},
 };