Re: [U-Boot] [PATCH v4 03/11] syscon: dm: Add a new method to get a regmap from DTS

2018-05-04 Thread Simon Glass
On 12 April 2018 at 02:41, Jean-Jacques Hiblot  wrote:
> syscon_regmap_lookup_by_phandle() can be used to get the regmap of a
syscon
> device from a reference in the DTS. It operates similarly to the linux
> version of the namesake function.
>
> Signed-off-by: Jean-Jacques Hiblot 
>
> ---
>
> Changes in v4:
> - Fix word missing in commit log
>
> Changes in v3:
> - in syscon_regmap_lookup_by_phandle(), use dev_dbg() instead of printf()
> - added unit test for syscon_regmap_lookup_by_phandle()
>
> Changes in v2: None
>
>  arch/sandbox/dts/test.dts|  6 --
>  drivers/core/syscon-uclass.c | 23 +++
>  include/syscon.h | 13 +
>  test/dm/syscon.c | 29 +
>  4 files changed, 69 insertions(+), 2 deletions(-)

Reviewed-by: Simon Glass 
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


[U-Boot] [PATCH v4 03/11] syscon: dm: Add a new method to get a regmap from DTS

2018-04-12 Thread Jean-Jacques Hiblot
syscon_regmap_lookup_by_phandle() can be used to get the regmap of a syscon
device from a reference in the DTS. It operates similarly to the linux
version of the namesake function.

Signed-off-by: Jean-Jacques Hiblot 

---

Changes in v4:
- Fix word missing in commit log

Changes in v3:
- in syscon_regmap_lookup_by_phandle(), use dev_dbg() instead of printf()
- added unit test for syscon_regmap_lookup_by_phandle()

Changes in v2: None

 arch/sandbox/dts/test.dts|  6 --
 drivers/core/syscon-uclass.c | 23 +++
 include/syscon.h | 13 +
 test/dm/syscon.c | 29 +
 4 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index 06d0e8c..369002e 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -311,6 +311,8 @@
 
test4 {
compatible = "denx,u-boot-probe-test";
+   first-syscon = <&syscon0>;
+   second-sys-ctrl = <&another_system_controller>;
};
};
 
@@ -380,12 +382,12 @@
};
};
 
-   syscon@0 {
+   syscon0: syscon@0 {
compatible = "sandbox,syscon0";
reg = <0x10 4>;
};
 
-   syscon@1 {
+   another_system_controller: syscon@1 {
compatible = "sandbox,syscon1";
reg = <0x20 5
0x28 6
diff --git a/drivers/core/syscon-uclass.c b/drivers/core/syscon-uclass.c
index a69937e..739fddd 100644
--- a/drivers/core/syscon-uclass.c
+++ b/drivers/core/syscon-uclass.c
@@ -45,6 +45,29 @@ static int syscon_pre_probe(struct udevice *dev)
 #endif
 }
 
+struct regmap *syscon_regmap_lookup_by_phandle(struct udevice *dev,
+  const char *name)
+{
+   struct udevice *syscon;
+   struct regmap *r;
+   int err;
+
+   err = uclass_get_device_by_phandle(UCLASS_SYSCON, dev,
+  name, &syscon);
+   if (err) {
+   dev_dbg(dev, "unable to find syscon device\n");
+   return ERR_PTR(err);
+   }
+
+   r = syscon_get_regmap(syscon);
+   if (!r) {
+   dev_dbg(dev, "unable to find regmap\n");
+   return ERR_PTR(-ENODEV);
+   }
+
+   return r;
+}
+
 int syscon_get_by_driver_data(ulong driver_data, struct udevice **devp)
 {
struct udevice *dev;
diff --git a/include/syscon.h b/include/syscon.h
index 5d52b1c..23d257a 100644
--- a/include/syscon.h
+++ b/include/syscon.h
@@ -74,6 +74,19 @@ int syscon_get_by_driver_data(ulong driver_data, struct 
udevice **devp);
 struct regmap *syscon_get_regmap_by_driver_data(ulong driver_data);
 
 /**
+ * syscon_regmap_lookup_by_phandle() - Look up a controller by a phandle
+ *
+ * This operates by looking up the given name in the device (device
+ * tree property) of the device using the system controller.
+ *
+ * @dev:   Device using the system controller
+ * @name:  Name of property referring to the system controller
+ * @return A pointer to the regmap if found, ERR_PTR(-ve) on error
+ */
+struct regmap *syscon_regmap_lookup_by_phandle(struct udevice *dev,
+  const char *name);
+
+/**
  * syscon_get_first_range() - get the first memory range from a syscon regmap
  *
  * @driver_data:   Driver data value to look up
diff --git a/test/dm/syscon.c b/test/dm/syscon.c
index c40f5fc..6f93e63 100644
--- a/test/dm/syscon.c
+++ b/test/dm/syscon.c
@@ -7,6 +7,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -46,3 +47,31 @@ static int dm_test_syscon_by_driver_data(struct 
unit_test_state *uts)
return 0;
 }
 DM_TEST(dm_test_syscon_by_driver_data, DM_TESTF_SCAN_PDATA | 
DM_TESTF_SCAN_FDT);
+
+/* Test system controller by phandle */
+static int dm_test_syscon_by_phandle(struct unit_test_state *uts)
+{
+   struct udevice *dev;
+   struct regmap *map;
+
+   ut_assertok(uclass_get_device_by_name(UCLASS_TEST_PROBE, "test4",
+ &dev));
+   if (!dev || IS_ERR(dev))
+   return -ENODEV;
+
+   ut_assertok_ptr(syscon_regmap_lookup_by_phandle(dev, "first-syscon"));
+   map = syscon_regmap_lookup_by_phandle(dev, "first-syscon");
+   if (map && !IS_ERR(map))
+   ut_asserteq(1, map->range_count);
+
+   ut_assertok_ptr(syscon_regmap_lookup_by_phandle(dev,
+   "second-sys-ctrl"));
+   map = syscon_regmap_lookup_by_phandle(dev, "second-sys-controller");
+   if (map && !IS_ERR(map))
+   ut_asserteq(4, map->range_count);
+
+   ut_assert(IS_ERR(syscon_regmap_lookup_by_phandle(dev, "not-present")));
+
+   return 0;
+}
+DM_TEST(dm_test_syscon_by_phandle, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
-- 
2.7.4