of: property: Make it easy to add device links from DT properties
authorSaravana Kannan <saravanak@google.com>
Tue, 5 Nov 2019 06:49:59 +0000 (22:49 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 7 Nov 2019 08:42:04 +0000 (09:42 +0100)
Add a DEFINE_SIMPLE_PROP macro to make it easy to add support for simple
properties with fixed names that just list phandles and phandle args.

Add a DEFINE_SUFFIX_PROP macro to make it easy to add support for
properties with fixes suffix that just list phandles and phandle args.

Signed-off-by: Saravana Kannan <saravanak@google.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20191105065000.50407-3-saravanak@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/of/property.c

index fbc201330ba04a286ba5d8b41996e64a1487dfc9..812b69a029d187d8234869f518b40aadf4bc2a7d 100644 (file)
@@ -1101,17 +1101,11 @@ static struct device_node *parse_prop_cells(struct device_node *np,
        return sup_args.np;
 }
 
-static struct device_node *parse_clocks(struct device_node *np,
-                                       const char *prop_name, int index)
-{
-       return parse_prop_cells(np, prop_name, index, "clocks", "#clock-cells");
-}
-
-static struct device_node *parse_interconnects(struct device_node *np,
-                                              const char *prop_name, int index)
-{
-       return parse_prop_cells(np, prop_name, index, "interconnects",
-                               "#interconnect-cells");
+#define DEFINE_SIMPLE_PROP(fname, name, cells)                           \
+static struct device_node *parse_##fname(struct device_node *np,         \
+                                       const char *prop_name, int index) \
+{                                                                        \
+       return parse_prop_cells(np, prop_name, index, name, cells);       \
 }
 
 static int strcmp_suffix(const char *str, const char *suffix)
@@ -1125,13 +1119,47 @@ static int strcmp_suffix(const char *str, const char *suffix)
        return strcmp(str + len - suffix_len, suffix);
 }
 
-static struct device_node *parse_regulators(struct device_node *np,
-                                           const char *prop_name, int index)
+/**
+ * parse_suffix_prop_cells - Suffix property parsing function for suppliers
+ *
+ * @np:                Pointer to device tree node containing a list
+ * @prop_name: Name of property to be parsed. Expected to hold phandle values
+ * @index:     For properties holding a list of phandles, this is the index
+ *             into the list.
+ * @suffix:    Property suffix that is known to contain list of phandle(s) to
+ *             supplier(s)
+ * @cells_name:        property name that specifies phandles' arguments count
+ *
+ * This is a helper function to parse properties that have a known fixed suffix
+ * and are a list of phandles and phandle arguments.
+ *
+ * Returns:
+ * - phandle node pointer with refcount incremented. Caller must of_node_put()
+ *   on it when done.
+ * - NULL if no phandle found at index
+ */
+static struct device_node *parse_suffix_prop_cells(struct device_node *np,
+                                           const char *prop_name, int index,
+                                           const char *suffix,
+                                           const char *cells_name)
 {
-       if (index || strcmp_suffix(prop_name, "-supply"))
+       struct of_phandle_args sup_args;
+
+       if (strcmp_suffix(prop_name, suffix))
                return NULL;
 
-       return of_parse_phandle(np, prop_name, 0);
+       if (of_parse_phandle_with_args(np, prop_name, cells_name, index,
+                                      &sup_args))
+               return NULL;
+
+       return sup_args.np;
+}
+
+#define DEFINE_SUFFIX_PROP(fname, suffix, cells)                            \
+static struct device_node *parse_##fname(struct device_node *np,            \
+                                       const char *prop_name, int index)    \
+{                                                                           \
+       return parse_suffix_prop_cells(np, prop_name, index, suffix, cells); \
 }
 
 /**
@@ -1155,6 +1183,10 @@ struct supplier_bindings {
                                          const char *prop_name, int index);
 };
 
+DEFINE_SIMPLE_PROP(clocks, "clocks", "#clock-cells")
+DEFINE_SIMPLE_PROP(interconnects, "interconnects", "#interconnect-cells")
+DEFINE_SUFFIX_PROP(regulators, "-supply", NULL)
+
 static const struct supplier_bindings of_supplier_bindings[] = {
        { .parse_prop = parse_clocks, },
        { .parse_prop = parse_interconnects, },