All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [RESEND PATCH 1/2] drivers/reset: support rockchip reset drivers
@ 2017-11-03  7:43 Kever Yang
  2017-11-03  7:43 ` [U-Boot] [RESEND PATCH 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver Kever Yang
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Kever Yang @ 2017-11-03  7:43 UTC (permalink / raw)
  To: u-boot

From: Elaine Zhang <zhangqing@rock-chips.com>

Create driver to support all Rockchip SoCs soft reset.
Example of usage:
i2c driver:
	ret = reset_get_by_name(dev, "i2c", &reset_ctl);
	if (ret) {
		error("reset_get_by_name() failed: %d\n", ret);
	}

	reset_assert(&reset_ctl);
	udelay(50);
	reset_deassert(&reset_ctl);

i2c dts node:
resets = <&cru SRST_P_I2C1>, <&cru SRST_I2C1>;
reset-names = "p_i2c", "i2c";

Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
---

 drivers/reset/Kconfig          |   8 ++++
 drivers/reset/Makefile         |   1 +
 drivers/reset/reset-rockchip.c | 104 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 113 insertions(+)
 create mode 100644 drivers/reset/reset-rockchip.c

diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index ce46e27..c0d6d75 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -74,4 +74,12 @@ config AST2500_RESET
 	  resets that are supported by watchdog. The main limitation though
 	  is that some reset signals, like I2C or MISC reset multiple devices.
 
+config RESET_ROCKCHIP
+	bool "Reset controller driver for Rockchip SoCs"
+	depends on DM_RESET && CLK
+	default y
+	help
+	  Support for reset controller on rockchip SoC. The main limitation though
+	  is that some reset signals, like I2C or MISC reset multiple devices.
+
 endmenu
diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
index 252cefe..7d7e080 100644
--- a/drivers/reset/Makefile
+++ b/drivers/reset/Makefile
@@ -12,3 +12,4 @@ obj-$(CONFIG_TEGRA186_RESET) += tegra186-reset.o
 obj-$(CONFIG_RESET_BCM6345) += reset-bcm6345.o
 obj-$(CONFIG_RESET_UNIPHIER) += reset-uniphier.o
 obj-$(CONFIG_AST2500_RESET) += ast2500-reset.o
+obj-$(CONFIG_RESET_ROCKCHIP) += reset-rockchip.o
diff --git a/drivers/reset/reset-rockchip.c b/drivers/reset/reset-rockchip.c
new file mode 100644
index 0000000..322ac27
--- /dev/null
+++ b/drivers/reset/reset-rockchip.c
@@ -0,0 +1,104 @@
+/*
+ * (C) Copyright 2017 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier: GPL-2.0
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <reset-uclass.h>
+#include <linux/io.h>
+
+struct rockchip_reset_priv {
+	void __iomem *base;
+	unsigned int sf_reset_offset;
+	unsigned int sf_reset_num;
+};
+
+static int rockchip_reset_request(struct reset_ctl *reset_ctl)
+{
+	struct rockchip_reset_priv *priv = dev_get_priv(reset_ctl->dev);
+
+	debug("%s(reset_ctl=%p) (dev=%p, id=%lu) (sf_reset_num=%d)\n", __func__,
+	      reset_ctl, reset_ctl->dev, reset_ctl->id, priv->sf_reset_num);
+
+	if (reset_ctl->id / 16 >= priv->sf_reset_num)
+		return -EINVAL;
+
+	return 0;
+}
+
+static int rockchip_reset_free(struct reset_ctl *reset_ctl)
+{
+	debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
+	      reset_ctl->dev, reset_ctl->id);
+
+	return 0;
+}
+
+static int rockchip_reset_assert(struct reset_ctl *reset_ctl)
+{
+	struct rockchip_reset_priv *priv = dev_get_priv(reset_ctl->dev);
+	int bank =  reset_ctl->id / 16;
+	int offset =  reset_ctl->id % 16;
+
+	debug("%s(reset_ctl=%p) (dev=%p, id=%lu) (reg_addr=%p)\n", __func__,
+	      reset_ctl, reset_ctl->dev, reset_ctl->id,
+	      priv->base + (bank * 4));
+
+	writel(BIT(offset) | (BIT(offset) << 16), priv->base + (bank * 4));
+
+	return 0;
+}
+
+static int rockchip_reset_deassert(struct reset_ctl *reset_ctl)
+{
+	struct rockchip_reset_priv *priv = dev_get_priv(reset_ctl->dev);
+	int bank =  reset_ctl->id / 16;
+	int offset =  reset_ctl->id % 16;
+
+	debug("%s(reset_ctl=%p) (dev=%p, id=%lu) (reg_addr=%p)\n", __func__,
+	      reset_ctl, reset_ctl->dev, reset_ctl->id,
+	      priv->base + (bank * 4));
+
+	writel((BIT(offset) << 16), priv->base + (bank * 4));
+
+	return 0;
+}
+
+struct reset_ops rockchip_reset_ops = {
+	.request = rockchip_reset_request,
+	.free = rockchip_reset_free,
+	.rst_assert = rockchip_reset_assert,
+	.rst_deassert = rockchip_reset_deassert,
+};
+
+static int rockchip_reset_probe(struct udevice *dev)
+{
+	struct rockchip_reset_priv *priv = dev_get_priv(dev);
+	fdt_addr_t addr;
+	fdt_size_t size;
+
+	addr = devfdt_get_addr_size_index(dev, 0, &size);
+	if (addr == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	if ((priv->sf_reset_offset == 0) && (priv->sf_reset_num == 0))
+		return -EINVAL;
+
+	addr += priv->sf_reset_offset;
+	priv->base = ioremap(addr, size);
+
+	debug("%s(base=%p) (sf_reset_offset=%x, sf_reset_num=%d)\n", __func__,
+	      priv->base, priv->sf_reset_offset, priv->sf_reset_num);
+
+	return 0;
+}
+
+U_BOOT_DRIVER(rockchip_reset) = {
+	.name = "rockchip_reset",
+	.id = UCLASS_RESET,
+	.probe = rockchip_reset_probe,
+	.ops = &rockchip_reset_ops,
+	.priv_auto_alloc_size = sizeof(struct rockchip_reset_priv),
+};
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [U-Boot] [RESEND PATCH 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver
  2017-11-03  7:43 [U-Boot] [RESEND PATCH 1/2] drivers/reset: support rockchip reset drivers Kever Yang
@ 2017-11-03  7:43 ` Kever Yang
  2017-11-07 13:54   ` [U-Boot] [U-Boot, RESEND, " Philipp Tomsich
  2017-11-21 22:55   ` Philipp Tomsich
  2017-11-07 13:54 ` [U-Boot] [U-Boot, RESEND, 1/2] drivers/reset: support rockchip reset drivers Philipp Tomsich
  2017-11-21 22:52 ` Philipp Tomsich
  2 siblings, 2 replies; 9+ messages in thread
From: Kever Yang @ 2017-11-03  7:43 UTC (permalink / raw)
  To: u-boot

From: Elaine Zhang <zhangqing@rock-chips.com>

all rockchip socs add device_bind_driver_to_node,
to bound device rockchip reset to clock-controller.

Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
---

 arch/arm/include/asm/arch-rockchip/clock.h |  6 +++++
 drivers/clk/rockchip/clk_rk3036.c          | 15 ++++++++++++-
 drivers/clk/rockchip/clk_rk3128.c          | 15 ++++++++++++-
 drivers/clk/rockchip/clk_rk3188.c          | 15 ++++++++++++-
 drivers/clk/rockchip/clk_rk322x.c          | 15 ++++++++++++-
 drivers/clk/rockchip/clk_rk3288.c          | 15 ++++++++++++-
 drivers/clk/rockchip/clk_rk3328.c          | 15 ++++++++++++-
 drivers/clk/rockchip/clk_rk3368.c          | 15 ++++++++++++-
 drivers/clk/rockchip/clk_rk3399.c          | 36 +++++++++++++++++++++++++++++-
 drivers/clk/rockchip/clk_rv1108.c          | 15 ++++++++++++-
 10 files changed, 153 insertions(+), 9 deletions(-)

diff --git a/arch/arm/include/asm/arch-rockchip/clock.h b/arch/arm/include/asm/arch-rockchip/clock.h
index 736b260..b812977 100644
--- a/arch/arm/include/asm/arch-rockchip/clock.h
+++ b/arch/arm/include/asm/arch-rockchip/clock.h
@@ -44,6 +44,12 @@ struct sysreset_reg {
 	unsigned int glb_srst_snd_value;
 };
 
+struct softreset_reg {
+	void __iomem *base;
+	unsigned int sf_reset_offset;
+	unsigned int sf_reset_num;
+};
+
 /**
  * clk_get_divisor() - Calculate the required clock divisior
  *
diff --git a/drivers/clk/rockchip/clk_rk3036.c b/drivers/clk/rockchip/clk_rk3036.c
index 280ebb9..32b250f 100644
--- a/drivers/clk/rockchip/clk_rk3036.c
+++ b/drivers/clk/rockchip/clk_rk3036.c
@@ -330,8 +330,9 @@ static int rk3036_clk_probe(struct udevice *dev)
 static int rk3036_clk_bind(struct udevice *dev)
 {
 	int ret;
-	struct udevice *sys_child;
+	struct udevice *sys_child, *sf_child;
 	struct sysreset_reg *priv;
+	struct softreset_reg *sf_priv;
 
 	/* The reset driver does not have a device node, so bind it here */
 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
@@ -347,6 +348,18 @@ static int rk3036_clk_bind(struct udevice *dev)
 		sys_child->priv = priv;
 	}
 
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk3036_cru,
+						    cru_softrst_con[0]);
+		sf_priv->sf_reset_num = 9;
+		sf_child->priv = sf_priv;
+	}
+
 	return 0;
 }
 
diff --git a/drivers/clk/rockchip/clk_rk3128.c b/drivers/clk/rockchip/clk_rk3128.c
index c75cbf8..45e36a2 100644
--- a/drivers/clk/rockchip/clk_rk3128.c
+++ b/drivers/clk/rockchip/clk_rk3128.c
@@ -325,8 +325,9 @@ static int rk3128_clk_probe(struct udevice *dev)
 static int rk3128_clk_bind(struct udevice *dev)
 {
 	int ret;
-	struct udevice *sys_child;
+	struct udevice *sys_child, *sf_child;
 	struct sysreset_reg *priv;
+	struct softreset_reg *sf_priv;
 
 	/* The reset driver does not have a device node, so bind it here */
 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
@@ -342,6 +343,18 @@ static int rk3128_clk_bind(struct udevice *dev)
 		sys_child->priv = priv;
 	}
 
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk3128_cru,
+						    cru_softrst_con[0]);
+		sf_priv->sf_reset_num = 9;
+		sf_child->priv = sf_priv;
+	}
+
 	return 0;
 }
 
diff --git a/drivers/clk/rockchip/clk_rk3188.c b/drivers/clk/rockchip/clk_rk3188.c
index fca6899..9febf29 100644
--- a/drivers/clk/rockchip/clk_rk3188.c
+++ b/drivers/clk/rockchip/clk_rk3188.c
@@ -573,8 +573,9 @@ static int rk3188_clk_probe(struct udevice *dev)
 static int rk3188_clk_bind(struct udevice *dev)
 {
 	int ret;
-	struct udevice *sys_child;
+	struct udevice *sys_child, *sf_child;
 	struct sysreset_reg *priv;
+	struct softreset_reg *sf_priv;
 
 	/* The reset driver does not have a device node, so bind it here */
 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
@@ -590,6 +591,18 @@ static int rk3188_clk_bind(struct udevice *dev)
 		sys_child->priv = priv;
 	}
 
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk3188_cru,
+						    cru_softrst_con[0]);
+		sf_priv->sf_reset_num = 9;
+		sf_child->priv = sf_priv;
+	}
+
 	return 0;
 }
 
diff --git a/drivers/clk/rockchip/clk_rk322x.c b/drivers/clk/rockchip/clk_rk322x.c
index ff52b55..a5fcb9d 100644
--- a/drivers/clk/rockchip/clk_rk322x.c
+++ b/drivers/clk/rockchip/clk_rk322x.c
@@ -385,8 +385,9 @@ static int rk322x_clk_probe(struct udevice *dev)
 static int rk322x_clk_bind(struct udevice *dev)
 {
 	int ret;
-	struct udevice *sys_child;
+	struct udevice *sys_child, *sf_child;
 	struct sysreset_reg *priv;
+	struct softreset_reg *sf_priv;
 
 	/* The reset driver does not have a device node, so bind it here */
 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
@@ -402,6 +403,18 @@ static int rk322x_clk_bind(struct udevice *dev)
 		sys_child->priv = priv;
 	}
 
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk322x_cru,
+						    cru_softrst_con[0]);
+		sf_priv->sf_reset_num = 9;
+		sf_child->priv = sf_priv;
+	}
+
 	return 0;
 }
 
diff --git a/drivers/clk/rockchip/clk_rk3288.c b/drivers/clk/rockchip/clk_rk3288.c
index ac53239..ec33612 100644
--- a/drivers/clk/rockchip/clk_rk3288.c
+++ b/drivers/clk/rockchip/clk_rk3288.c
@@ -859,8 +859,9 @@ static int rk3288_clk_probe(struct udevice *dev)
 static int rk3288_clk_bind(struct udevice *dev)
 {
 	int ret;
-	struct udevice *sys_child;
+	struct udevice *sys_child, *sf_child;
 	struct sysreset_reg *priv;
+	struct softreset_reg *sf_priv;
 
 	/* The reset driver does not have a device node, so bind it here */
 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
@@ -876,6 +877,18 @@ static int rk3288_clk_bind(struct udevice *dev)
 		sys_child->priv = priv;
 	}
 
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk3288_cru,
+						    cru_softrst_con[0]);
+		sf_priv->sf_reset_num = 12;
+		sf_child->priv = sf_priv;
+	}
+
 	return 0;
 }
 
diff --git a/drivers/clk/rockchip/clk_rk3328.c b/drivers/clk/rockchip/clk_rk3328.c
index 4d522a7..1388b44 100644
--- a/drivers/clk/rockchip/clk_rk3328.c
+++ b/drivers/clk/rockchip/clk_rk3328.c
@@ -597,8 +597,9 @@ static int rk3328_clk_ofdata_to_platdata(struct udevice *dev)
 static int rk3328_clk_bind(struct udevice *dev)
 {
 	int ret;
-	struct udevice *sys_child;
+	struct udevice *sys_child, *sf_child;
 	struct sysreset_reg *priv;
+	struct softreset_reg *sf_priv;
 
 	/* The reset driver does not have a device node, so bind it here */
 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
@@ -614,6 +615,18 @@ static int rk3328_clk_bind(struct udevice *dev)
 		sys_child->priv = priv;
 	}
 
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk3328_cru,
+						    softrst_con[0]);
+		sf_priv->sf_reset_num = 12;
+		sf_child->priv = sf_priv;
+	}
+
 	return ret;
 }
 
diff --git a/drivers/clk/rockchip/clk_rk3368.c b/drivers/clk/rockchip/clk_rk3368.c
index bfeef39..5e4201d 100644
--- a/drivers/clk/rockchip/clk_rk3368.c
+++ b/drivers/clk/rockchip/clk_rk3368.c
@@ -526,8 +526,9 @@ static int rk3368_clk_ofdata_to_platdata(struct udevice *dev)
 static int rk3368_clk_bind(struct udevice *dev)
 {
 	int ret;
-	struct udevice *sys_child;
+	struct udevice *sys_child, *sf_child;
 	struct sysreset_reg *priv;
+	struct softreset_reg *sf_priv;
 
 	/* The reset driver does not have a device node, so bind it here */
 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
@@ -543,6 +544,18 @@ static int rk3368_clk_bind(struct udevice *dev)
 		sys_child->priv = priv;
 	}
 
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk3368_cru,
+						    softrst_con[0]);
+		sf_priv->sf_reset_num = 15;
+		sf_child->priv = sf_priv;
+	}
+
 	return ret;
 }
 
diff --git a/drivers/clk/rockchip/clk_rk3399.c b/drivers/clk/rockchip/clk_rk3399.c
index e21d056..2e26e92 100644
--- a/drivers/clk/rockchip/clk_rk3399.c
+++ b/drivers/clk/rockchip/clk_rk3399.c
@@ -1033,8 +1033,9 @@ static int rk3399_clk_ofdata_to_platdata(struct udevice *dev)
 static int rk3399_clk_bind(struct udevice *dev)
 {
 	int ret;
-	struct udevice *sys_child;
+	struct udevice *sys_child, *sf_child;
 	struct sysreset_reg *priv;
+	struct softreset_reg *sf_priv;
 
 	/* The reset driver does not have a device node, so bind it here */
 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
@@ -1050,6 +1051,18 @@ static int rk3399_clk_bind(struct udevice *dev)
 		sys_child->priv = priv;
 	}
 
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rk3399_cru,
+						    softrst_con[0]);
+		sf_priv->sf_reset_num = 21;
+		sf_child->priv = sf_priv;
+	}
+
 	return 0;
 }
 
@@ -1225,6 +1238,26 @@ static int rk3399_pmuclk_ofdata_to_platdata(struct udevice *dev)
 	return 0;
 }
 
+static int rk3399_pmuclk_bind(struct udevice *dev)
+{
+	int ret = 0;
+	struct udevice *sf_child;
+	struct softreset_reg *sf_priv = malloc(sizeof(struct softreset_reg));
+
+	ret = device_bind_driver_to_node(dev, "rockchip_reset",
+					 "reset", dev_ofnode(dev),
+					 &sf_child);
+	if (ret)
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+
+	sf_priv->sf_reset_offset = offsetof(struct rk3399_pmucru,
+					    pmucru_softrst_con[0]);
+	sf_priv->sf_reset_num = 2;
+	sf_child->priv = sf_priv;
+
+	return ret;
+}
+
 static const struct udevice_id rk3399_pmuclk_ids[] = {
 	{ .compatible = "rockchip,rk3399-pmucru" },
 	{ }
@@ -1238,6 +1271,7 @@ U_BOOT_DRIVER(rockchip_rk3399_pmuclk) = {
 	.ofdata_to_platdata = rk3399_pmuclk_ofdata_to_platdata,
 	.ops		= &rk3399_pmuclk_ops,
 	.probe		= rk3399_pmuclk_probe,
+	.bind		= rk3399_pmuclk_bind,
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
 	.platdata_auto_alloc_size = sizeof(struct rk3399_pmuclk_plat),
 #endif
diff --git a/drivers/clk/rockchip/clk_rv1108.c b/drivers/clk/rockchip/clk_rv1108.c
index a119548..a6c5c47 100644
--- a/drivers/clk/rockchip/clk_rv1108.c
+++ b/drivers/clk/rockchip/clk_rv1108.c
@@ -223,8 +223,9 @@ static int rv1108_clk_probe(struct udevice *dev)
 static int rv1108_clk_bind(struct udevice *dev)
 {
 	int ret;
-	struct udevice *sys_child;
+	struct udevice *sys_child, *sf_child;
 	struct sysreset_reg *priv;
+	struct softreset_reg *sf_priv;
 
 	/* The reset driver does not have a device node, so bind it here */
 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
@@ -240,6 +241,18 @@ static int rv1108_clk_bind(struct udevice *dev)
 		sys_child->priv = priv;
 	}
 
+	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
+					 dev_ofnode(dev), &sf_child);
+	if (ret) {
+		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
+	} else {
+		sf_priv = malloc(sizeof(struct softreset_reg));
+		sf_priv->sf_reset_offset = offsetof(struct rv1108_cru,
+						    softrst_con[0]);
+		sf_priv->sf_reset_num = 13;
+		sf_child->priv = sf_priv;
+	}
+
 	return 0;
 }
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [U-Boot] [U-Boot, RESEND, 1/2] drivers/reset: support rockchip reset drivers
  2017-11-03  7:43 [U-Boot] [RESEND PATCH 1/2] drivers/reset: support rockchip reset drivers Kever Yang
  2017-11-03  7:43 ` [U-Boot] [RESEND PATCH 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver Kever Yang
@ 2017-11-07 13:54 ` Philipp Tomsich
  2017-11-21 22:52 ` Philipp Tomsich
  2 siblings, 0 replies; 9+ messages in thread
From: Philipp Tomsich @ 2017-11-07 13:54 UTC (permalink / raw)
  To: u-boot

> From: Elaine Zhang <zhangqing@rock-chips.com>
> 
> Create driver to support all Rockchip SoCs soft reset.
> Example of usage:
> i2c driver:
> 	ret = reset_get_by_name(dev, "i2c", &reset_ctl);
> 	if (ret) {
> 		error("reset_get_by_name() failed: %d\n", ret);
> 	}
> 
> 	reset_assert(&reset_ctl);
> 	udelay(50);
> 	reset_deassert(&reset_ctl);
> 
> i2c dts node:
> resets = <&cru SRST_P_I2C1>, <&cru SRST_I2C1>;
> reset-names = "p_i2c", "i2c";
> 
> Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
> ---
> 
>  drivers/reset/Kconfig          |   8 ++++
>  drivers/reset/Makefile         |   1 +
>  drivers/reset/reset-rockchip.c | 104 +++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 113 insertions(+)
>  create mode 100644 drivers/reset/reset-rockchip.c
> 

Acked-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [U-Boot] [U-Boot, RESEND, 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver
  2017-11-03  7:43 ` [U-Boot] [RESEND PATCH 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver Kever Yang
@ 2017-11-07 13:54   ` Philipp Tomsich
  2017-11-21 22:55   ` Philipp Tomsich
  1 sibling, 0 replies; 9+ messages in thread
From: Philipp Tomsich @ 2017-11-07 13:54 UTC (permalink / raw)
  To: u-boot

> From: Elaine Zhang <zhangqing@rock-chips.com>
> 
> all rockchip socs add device_bind_driver_to_node,
> to bound device rockchip reset to clock-controller.
> 
> Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
> ---
> 
>  arch/arm/include/asm/arch-rockchip/clock.h |  6 +++++
>  drivers/clk/rockchip/clk_rk3036.c          | 15 ++++++++++++-
>  drivers/clk/rockchip/clk_rk3128.c          | 15 ++++++++++++-
>  drivers/clk/rockchip/clk_rk3188.c          | 15 ++++++++++++-
>  drivers/clk/rockchip/clk_rk322x.c          | 15 ++++++++++++-
>  drivers/clk/rockchip/clk_rk3288.c          | 15 ++++++++++++-
>  drivers/clk/rockchip/clk_rk3328.c          | 15 ++++++++++++-
>  drivers/clk/rockchip/clk_rk3368.c          | 15 ++++++++++++-
>  drivers/clk/rockchip/clk_rk3399.c          | 36 +++++++++++++++++++++++++++++-
>  drivers/clk/rockchip/clk_rv1108.c          | 15 ++++++++++++-
>  10 files changed, 153 insertions(+), 9 deletions(-)
> 

Acked-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [U-Boot] [U-Boot, RESEND, 1/2] drivers/reset: support rockchip reset drivers
  2017-11-03  7:43 [U-Boot] [RESEND PATCH 1/2] drivers/reset: support rockchip reset drivers Kever Yang
  2017-11-03  7:43 ` [U-Boot] [RESEND PATCH 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver Kever Yang
  2017-11-07 13:54 ` [U-Boot] [U-Boot, RESEND, 1/2] drivers/reset: support rockchip reset drivers Philipp Tomsich
@ 2017-11-21 22:52 ` Philipp Tomsich
  2017-11-27 10:26   ` Kever Yang
  2 siblings, 1 reply; 9+ messages in thread
From: Philipp Tomsich @ 2017-11-21 22:52 UTC (permalink / raw)
  To: u-boot



On Fri, 3 Nov 2017, Kever Yang wrote:

> From: Elaine Zhang <zhangqing@rock-chips.com>
>
> Create driver to support all Rockchip SoCs soft reset.
> Example of usage:
> i2c driver:
> 	ret = reset_get_by_name(dev, "i2c", &reset_ctl);
> 	if (ret) {
> 		error("reset_get_by_name() failed: %d\n", ret);
> 	}
>
> 	reset_assert(&reset_ctl);
> 	udelay(50);
> 	reset_deassert(&reset_ctl);
>
> i2c dts node:
> resets = <&cru SRST_P_I2C1>, <&cru SRST_I2C1>;
> reset-names = "p_i2c", "i2c";
>
> Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
> Acked-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>

Reviewed-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>

See below for requested changes.

> ---
>
> drivers/reset/Kconfig          |   8 ++++
> drivers/reset/Makefile         |   1 +
> drivers/reset/reset-rockchip.c | 104 +++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 113 insertions(+)
> create mode 100644 drivers/reset/reset-rockchip.c
>
> diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
> index ce46e27..c0d6d75 100644
> --- a/drivers/reset/Kconfig
> +++ b/drivers/reset/Kconfig
> @@ -74,4 +74,12 @@ config AST2500_RESET
> 	  resets that are supported by watchdog. The main limitation though
> 	  is that some reset signals, like I2C or MISC reset multiple devices.
>
> +config RESET_ROCKCHIP
> +	bool "Reset controller driver for Rockchip SoCs"
> +	depends on DM_RESET && CLK
> +	default y
> +	help
> +	  Support for reset controller on rockchip SoC. The main limitation though

This line is too long.

> +	  is that some reset signals, like I2C or MISC reset multiple devices.
> +
> endmenu
> diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
> index 252cefe..7d7e080 100644
> --- a/drivers/reset/Makefile
> +++ b/drivers/reset/Makefile
> @@ -12,3 +12,4 @@ obj-$(CONFIG_TEGRA186_RESET) += tegra186-reset.o
> obj-$(CONFIG_RESET_BCM6345) += reset-bcm6345.o
> obj-$(CONFIG_RESET_UNIPHIER) += reset-uniphier.o
> obj-$(CONFIG_AST2500_RESET) += ast2500-reset.o
> +obj-$(CONFIG_RESET_ROCKCHIP) += reset-rockchip.o
> diff --git a/drivers/reset/reset-rockchip.c b/drivers/reset/reset-rockchip.c
> new file mode 100644
> index 0000000..322ac27
> --- /dev/null
> +++ b/drivers/reset/reset-rockchip.c
> @@ -0,0 +1,104 @@
> +/*
> + * (C) Copyright 2017 Rockchip Electronics Co., Ltd
> + *
> + * SPDX-License-Identifier: GPL-2.0
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <reset-uclass.h>
> +#include <linux/io.h>
> +
> +struct rockchip_reset_priv {
> +	void __iomem *base;
> +	unsigned int sf_reset_offset;
> +	unsigned int sf_reset_num;
> +};
> +
> +static int rockchip_reset_request(struct reset_ctl *reset_ctl)
> +{
> +	struct rockchip_reset_priv *priv = dev_get_priv(reset_ctl->dev);
> +
> +	debug("%s(reset_ctl=%p) (dev=%p, id=%lu) (sf_reset_num=%d)\n", __func__,
> +	      reset_ctl, reset_ctl->dev, reset_ctl->id, priv->sf_reset_num);
> +
> +	if (reset_ctl->id / 16 >= priv->sf_reset_num)

Can you please write this in a more readable/maintainable way (and 
possibly also add a comment)?  E.g. in order to understand this, the 
reader needs to know that there will be exactly 16 resets per register and 
that these will be continuous (i.e. no holes), so this comparison only 
makes sense for the final register...

Also, I am not convinced that this code will not break in the future...

> +		return -EINVAL;
> +
> +	return 0;
> +}
> +
> +static int rockchip_reset_free(struct reset_ctl *reset_ctl)
> +{
> +	debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
> +	      reset_ctl->dev, reset_ctl->id);
> +
> +	return 0;
> +}
> +
> +static int rockchip_reset_assert(struct reset_ctl *reset_ctl)
> +{
> +	struct rockchip_reset_priv *priv = dev_get_priv(reset_ctl->dev);
> +	int bank =  reset_ctl->id / 16;
> +	int offset =  reset_ctl->id % 16;
> +
> +	debug("%s(reset_ctl=%p) (dev=%p, id=%lu) (reg_addr=%p)\n", __func__,
> +	      reset_ctl, reset_ctl->dev, reset_ctl->id,
> +	      priv->base + (bank * 4));
> +
> +	writel(BIT(offset) | (BIT(offset) << 16), priv->base + (bank * 4));

Again: it should be made clear to the reader why there's
 	1. (BIT | BIT << 16)
 	2. back is multiplied by 4

Also, if I am correct rk_setreg(...) should be used.

> +
> +	return 0;
> +}
> +
> +static int rockchip_reset_deassert(struct reset_ctl *reset_ctl)
> +{
> +	struct rockchip_reset_priv *priv = dev_get_priv(reset_ctl->dev);
> +	int bank =  reset_ctl->id / 16;
> +	int offset =  reset_ctl->id % 16;

Again, these computations are magic without clearer code and/or 
documentation.

> +
> +	debug("%s(reset_ctl=%p) (dev=%p, id=%lu) (reg_addr=%p)\n", __func__,
> +	      reset_ctl, reset_ctl->dev, reset_ctl->id,
> +	      priv->base + (bank * 4));
> +
> +	writel((BIT(offset) << 16), priv->base + (bank * 4));

See above. Also, this looks like a case for rk_clrreg(...).

> +
> +	return 0;
> +}
> +
> +struct reset_ops rockchip_reset_ops = {
> +	.request = rockchip_reset_request,
> +	.free = rockchip_reset_free,
> +	.rst_assert = rockchip_reset_assert,
> +	.rst_deassert = rockchip_reset_deassert,
> +};
> +
> +static int rockchip_reset_probe(struct udevice *dev)
> +{
> +	struct rockchip_reset_priv *priv = dev_get_priv(dev);
> +	fdt_addr_t addr;
> +	fdt_size_t size;
> +
> +	addr = devfdt_get_addr_size_index(dev, 0, &size);

Please use the dev_...() function family.

> +	if (addr == FDT_ADDR_T_NONE)
> +		return -EINVAL;
> +
> +	if ((priv->sf_reset_offset == 0) && (priv->sf_reset_num == 0))
> +		return -EINVAL;
> +
> +	addr += priv->sf_reset_offset;
> +	priv->base = ioremap(addr, size);
> +
> +	debug("%s(base=%p) (sf_reset_offset=%x, sf_reset_num=%d)\n", __func__,
> +	      priv->base, priv->sf_reset_offset, priv->sf_reset_num);
> +
> +	return 0;
> +}
> +
> +U_BOOT_DRIVER(rockchip_reset) = {
> +	.name = "rockchip_reset",
> +	.id = UCLASS_RESET,
> +	.probe = rockchip_reset_probe,
> +	.ops = &rockchip_reset_ops,
> +	.priv_auto_alloc_size = sizeof(struct rockchip_reset_priv),
> +};
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [U-Boot] [U-Boot, RESEND, 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver
  2017-11-03  7:43 ` [U-Boot] [RESEND PATCH 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver Kever Yang
  2017-11-07 13:54   ` [U-Boot] [U-Boot, RESEND, " Philipp Tomsich
@ 2017-11-21 22:55   ` Philipp Tomsich
  2017-11-27 10:15     ` Kever Yang
  1 sibling, 1 reply; 9+ messages in thread
From: Philipp Tomsich @ 2017-11-21 22:55 UTC (permalink / raw)
  To: u-boot



On Fri, 3 Nov 2017, Kever Yang wrote:

> From: Elaine Zhang <zhangqing@rock-chips.com>
>
> all rockchip socs add device_bind_driver_to_node,
> to bound device rockchip reset to clock-controller.
>
> Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
> Acked-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>

Reviewed-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>

See below for requested changes.

> ---
>
> arch/arm/include/asm/arch-rockchip/clock.h |  6 +++++
> drivers/clk/rockchip/clk_rk3036.c          | 15 ++++++++++++-
> drivers/clk/rockchip/clk_rk3128.c          | 15 ++++++++++++-
> drivers/clk/rockchip/clk_rk3188.c          | 15 ++++++++++++-
> drivers/clk/rockchip/clk_rk322x.c          | 15 ++++++++++++-
> drivers/clk/rockchip/clk_rk3288.c          | 15 ++++++++++++-
> drivers/clk/rockchip/clk_rk3328.c          | 15 ++++++++++++-
> drivers/clk/rockchip/clk_rk3368.c          | 15 ++++++++++++-
> drivers/clk/rockchip/clk_rk3399.c          | 36 +++++++++++++++++++++++++++++-
> drivers/clk/rockchip/clk_rv1108.c          | 15 ++++++++++++-
> 10 files changed, 153 insertions(+), 9 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-rockchip/clock.h b/arch/arm/include/asm/arch-rockchip/clock.h
> index 736b260..b812977 100644
> --- a/arch/arm/include/asm/arch-rockchip/clock.h
> +++ b/arch/arm/include/asm/arch-rockchip/clock.h
> @@ -44,6 +44,12 @@ struct sysreset_reg {
> 	unsigned int glb_srst_snd_value;
> };
>
> +struct softreset_reg {
> +	void __iomem *base;
> +	unsigned int sf_reset_offset;
> +	unsigned int sf_reset_num;
> +};
> +
> /**
>  * clk_get_divisor() - Calculate the required clock divisior
>  *
> diff --git a/drivers/clk/rockchip/clk_rk3036.c b/drivers/clk/rockchip/clk_rk3036.c
> index 280ebb9..32b250f 100644
> --- a/drivers/clk/rockchip/clk_rk3036.c
> +++ b/drivers/clk/rockchip/clk_rk3036.c
> @@ -330,8 +330,9 @@ static int rk3036_clk_probe(struct udevice *dev)
> static int rk3036_clk_bind(struct udevice *dev)
> {
> 	int ret;
> -	struct udevice *sys_child;
> +	struct udevice *sys_child, *sf_child;
> 	struct sysreset_reg *priv;
> +	struct softreset_reg *sf_priv;
>
> 	/* The reset driver does not have a device node, so bind it here */
> 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
> @@ -347,6 +348,18 @@ static int rk3036_clk_bind(struct udevice *dev)
> 		sys_child->priv = priv;
> 	}
>
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
> +					 dev_ofnode(dev), &sf_child);
> +	if (ret) {
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +	} else {
> +		sf_priv = malloc(sizeof(struct softreset_reg));
> +		sf_priv->sf_reset_offset = offsetof(struct rk3036_cru,
> +						    cru_softrst_con[0]);
> +		sf_priv->sf_reset_num = 9;
> +		sf_child->priv = sf_priv;
> +	}

This code is repeated throughout our code-base (see below for how often it 
appears).  Can you please factor this out into a helper function that is 
located with the reset-driver and that can be called?

E.g. something along the lines of
 	rockchip_sysreset_bind(sf_reset_offset, sf_reset_num)

> +
> 	return 0;
> }
>
> diff --git a/drivers/clk/rockchip/clk_rk3128.c b/drivers/clk/rockchip/clk_rk3128.c
> index c75cbf8..45e36a2 100644
> --- a/drivers/clk/rockchip/clk_rk3128.c
> +++ b/drivers/clk/rockchip/clk_rk3128.c
> @@ -325,8 +325,9 @@ static int rk3128_clk_probe(struct udevice *dev)
> static int rk3128_clk_bind(struct udevice *dev)
> {
> 	int ret;
> -	struct udevice *sys_child;
> +	struct udevice *sys_child, *sf_child;
> 	struct sysreset_reg *priv;
> +	struct softreset_reg *sf_priv;
>
> 	/* The reset driver does not have a device node, so bind it here */
> 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
> @@ -342,6 +343,18 @@ static int rk3128_clk_bind(struct udevice *dev)
> 		sys_child->priv = priv;
> 	}
>
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
> +					 dev_ofnode(dev), &sf_child);
> +	if (ret) {
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +	} else {
> +		sf_priv = malloc(sizeof(struct softreset_reg));
> +		sf_priv->sf_reset_offset = offsetof(struct rk3128_cru,
> +						    cru_softrst_con[0]);
> +		sf_priv->sf_reset_num = 9;
> +		sf_child->priv = sf_priv;
> +	}
> +
> 	return 0;
> }
>
> diff --git a/drivers/clk/rockchip/clk_rk3188.c b/drivers/clk/rockchip/clk_rk3188.c
> index fca6899..9febf29 100644
> --- a/drivers/clk/rockchip/clk_rk3188.c
> +++ b/drivers/clk/rockchip/clk_rk3188.c
> @@ -573,8 +573,9 @@ static int rk3188_clk_probe(struct udevice *dev)
> static int rk3188_clk_bind(struct udevice *dev)
> {
> 	int ret;
> -	struct udevice *sys_child;
> +	struct udevice *sys_child, *sf_child;
> 	struct sysreset_reg *priv;
> +	struct softreset_reg *sf_priv;
>
> 	/* The reset driver does not have a device node, so bind it here */
> 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
> @@ -590,6 +591,18 @@ static int rk3188_clk_bind(struct udevice *dev)
> 		sys_child->priv = priv;
> 	}
>
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
> +					 dev_ofnode(dev), &sf_child);
> +	if (ret) {
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +	} else {
> +		sf_priv = malloc(sizeof(struct softreset_reg));
> +		sf_priv->sf_reset_offset = offsetof(struct rk3188_cru,
> +						    cru_softrst_con[0]);
> +		sf_priv->sf_reset_num = 9;
> +		sf_child->priv = sf_priv;
> +	}
> +
> 	return 0;
> }
>
> diff --git a/drivers/clk/rockchip/clk_rk322x.c b/drivers/clk/rockchip/clk_rk322x.c
> index ff52b55..a5fcb9d 100644
> --- a/drivers/clk/rockchip/clk_rk322x.c
> +++ b/drivers/clk/rockchip/clk_rk322x.c
> @@ -385,8 +385,9 @@ static int rk322x_clk_probe(struct udevice *dev)
> static int rk322x_clk_bind(struct udevice *dev)
> {
> 	int ret;
> -	struct udevice *sys_child;
> +	struct udevice *sys_child, *sf_child;
> 	struct sysreset_reg *priv;
> +	struct softreset_reg *sf_priv;
>
> 	/* The reset driver does not have a device node, so bind it here */
> 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
> @@ -402,6 +403,18 @@ static int rk322x_clk_bind(struct udevice *dev)
> 		sys_child->priv = priv;
> 	}
>
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
> +					 dev_ofnode(dev), &sf_child);
> +	if (ret) {
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +	} else {
> +		sf_priv = malloc(sizeof(struct softreset_reg));
> +		sf_priv->sf_reset_offset = offsetof(struct rk322x_cru,
> +						    cru_softrst_con[0]);
> +		sf_priv->sf_reset_num = 9;
> +		sf_child->priv = sf_priv;
> +	}
> +
> 	return 0;
> }
>
> diff --git a/drivers/clk/rockchip/clk_rk3288.c b/drivers/clk/rockchip/clk_rk3288.c
> index ac53239..ec33612 100644
> --- a/drivers/clk/rockchip/clk_rk3288.c
> +++ b/drivers/clk/rockchip/clk_rk3288.c
> @@ -859,8 +859,9 @@ static int rk3288_clk_probe(struct udevice *dev)
> static int rk3288_clk_bind(struct udevice *dev)
> {
> 	int ret;
> -	struct udevice *sys_child;
> +	struct udevice *sys_child, *sf_child;
> 	struct sysreset_reg *priv;
> +	struct softreset_reg *sf_priv;
>
> 	/* The reset driver does not have a device node, so bind it here */
> 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
> @@ -876,6 +877,18 @@ static int rk3288_clk_bind(struct udevice *dev)
> 		sys_child->priv = priv;
> 	}
>
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
> +					 dev_ofnode(dev), &sf_child);
> +	if (ret) {
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +	} else {
> +		sf_priv = malloc(sizeof(struct softreset_reg));
> +		sf_priv->sf_reset_offset = offsetof(struct rk3288_cru,
> +						    cru_softrst_con[0]);
> +		sf_priv->sf_reset_num = 12;
> +		sf_child->priv = sf_priv;
> +	}
> +
> 	return 0;
> }
>
> diff --git a/drivers/clk/rockchip/clk_rk3328.c b/drivers/clk/rockchip/clk_rk3328.c
> index 4d522a7..1388b44 100644
> --- a/drivers/clk/rockchip/clk_rk3328.c
> +++ b/drivers/clk/rockchip/clk_rk3328.c
> @@ -597,8 +597,9 @@ static int rk3328_clk_ofdata_to_platdata(struct udevice *dev)
> static int rk3328_clk_bind(struct udevice *dev)
> {
> 	int ret;
> -	struct udevice *sys_child;
> +	struct udevice *sys_child, *sf_child;
> 	struct sysreset_reg *priv;
> +	struct softreset_reg *sf_priv;
>
> 	/* The reset driver does not have a device node, so bind it here */
> 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
> @@ -614,6 +615,18 @@ static int rk3328_clk_bind(struct udevice *dev)
> 		sys_child->priv = priv;
> 	}
>
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
> +					 dev_ofnode(dev), &sf_child);
> +	if (ret) {
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +	} else {
> +		sf_priv = malloc(sizeof(struct softreset_reg));
> +		sf_priv->sf_reset_offset = offsetof(struct rk3328_cru,
> +						    softrst_con[0]);
> +		sf_priv->sf_reset_num = 12;
> +		sf_child->priv = sf_priv;
> +	}
> +
> 	return ret;
> }
>
> diff --git a/drivers/clk/rockchip/clk_rk3368.c b/drivers/clk/rockchip/clk_rk3368.c
> index bfeef39..5e4201d 100644
> --- a/drivers/clk/rockchip/clk_rk3368.c
> +++ b/drivers/clk/rockchip/clk_rk3368.c
> @@ -526,8 +526,9 @@ static int rk3368_clk_ofdata_to_platdata(struct udevice *dev)
> static int rk3368_clk_bind(struct udevice *dev)
> {
> 	int ret;
> -	struct udevice *sys_child;
> +	struct udevice *sys_child, *sf_child;
> 	struct sysreset_reg *priv;
> +	struct softreset_reg *sf_priv;
>
> 	/* The reset driver does not have a device node, so bind it here */
> 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
> @@ -543,6 +544,18 @@ static int rk3368_clk_bind(struct udevice *dev)
> 		sys_child->priv = priv;
> 	}
>
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
> +					 dev_ofnode(dev), &sf_child);
> +	if (ret) {
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +	} else {
> +		sf_priv = malloc(sizeof(struct softreset_reg));
> +		sf_priv->sf_reset_offset = offsetof(struct rk3368_cru,
> +						    softrst_con[0]);
> +		sf_priv->sf_reset_num = 15;
> +		sf_child->priv = sf_priv;
> +	}
> +
> 	return ret;
> }
>
> diff --git a/drivers/clk/rockchip/clk_rk3399.c b/drivers/clk/rockchip/clk_rk3399.c
> index e21d056..2e26e92 100644
> --- a/drivers/clk/rockchip/clk_rk3399.c
> +++ b/drivers/clk/rockchip/clk_rk3399.c
> @@ -1033,8 +1033,9 @@ static int rk3399_clk_ofdata_to_platdata(struct udevice *dev)
> static int rk3399_clk_bind(struct udevice *dev)
> {
> 	int ret;
> -	struct udevice *sys_child;
> +	struct udevice *sys_child, *sf_child;
> 	struct sysreset_reg *priv;
> +	struct softreset_reg *sf_priv;
>
> 	/* The reset driver does not have a device node, so bind it here */
> 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
> @@ -1050,6 +1051,18 @@ static int rk3399_clk_bind(struct udevice *dev)
> 		sys_child->priv = priv;
> 	}
>
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
> +					 dev_ofnode(dev), &sf_child);
> +	if (ret) {
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +	} else {
> +		sf_priv = malloc(sizeof(struct softreset_reg));
> +		sf_priv->sf_reset_offset = offsetof(struct rk3399_cru,
> +						    softrst_con[0]);
> +		sf_priv->sf_reset_num = 21;
> +		sf_child->priv = sf_priv;
> +	}
> +
> 	return 0;
> }
>
> @@ -1225,6 +1238,26 @@ static int rk3399_pmuclk_ofdata_to_platdata(struct udevice *dev)
> 	return 0;
> }
>
> +static int rk3399_pmuclk_bind(struct udevice *dev)
> +{
> +	int ret = 0;
> +	struct udevice *sf_child;
> +	struct softreset_reg *sf_priv = malloc(sizeof(struct softreset_reg));
> +
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset",
> +					 "reset", dev_ofnode(dev),
> +					 &sf_child);
> +	if (ret)
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +
> +	sf_priv->sf_reset_offset = offsetof(struct rk3399_pmucru,
> +					    pmucru_softrst_con[0]);
> +	sf_priv->sf_reset_num = 2;
> +	sf_child->priv = sf_priv;
> +
> +	return ret;
> +}
> +
> static const struct udevice_id rk3399_pmuclk_ids[] = {
> 	{ .compatible = "rockchip,rk3399-pmucru" },
> 	{ }
> @@ -1238,6 +1271,7 @@ U_BOOT_DRIVER(rockchip_rk3399_pmuclk) = {
> 	.ofdata_to_platdata = rk3399_pmuclk_ofdata_to_platdata,
> 	.ops		= &rk3399_pmuclk_ops,
> 	.probe		= rk3399_pmuclk_probe,
> +	.bind		= rk3399_pmuclk_bind,
> #if CONFIG_IS_ENABLED(OF_PLATDATA)
> 	.platdata_auto_alloc_size = sizeof(struct rk3399_pmuclk_plat),
> #endif
> diff --git a/drivers/clk/rockchip/clk_rv1108.c b/drivers/clk/rockchip/clk_rv1108.c
> index a119548..a6c5c47 100644
> --- a/drivers/clk/rockchip/clk_rv1108.c
> +++ b/drivers/clk/rockchip/clk_rv1108.c
> @@ -223,8 +223,9 @@ static int rv1108_clk_probe(struct udevice *dev)
> static int rv1108_clk_bind(struct udevice *dev)
> {
> 	int ret;
> -	struct udevice *sys_child;
> +	struct udevice *sys_child, *sf_child;
> 	struct sysreset_reg *priv;
> +	struct softreset_reg *sf_priv;
>
> 	/* The reset driver does not have a device node, so bind it here */
> 	ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
> @@ -240,6 +241,18 @@ static int rv1108_clk_bind(struct udevice *dev)
> 		sys_child->priv = priv;
> 	}
>
> +	ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
> +					 dev_ofnode(dev), &sf_child);
> +	if (ret) {
> +		debug("Warning: No rockchip reset driver: ret=%d\n", ret);
> +	} else {
> +		sf_priv = malloc(sizeof(struct softreset_reg));
> +		sf_priv->sf_reset_offset = offsetof(struct rv1108_cru,
> +						    softrst_con[0]);
> +		sf_priv->sf_reset_num = 13;
> +		sf_child->priv = sf_priv;
> +	}
> +
> 	return 0;
> }
>
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [U-Boot] [U-Boot, RESEND, 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver
  2017-11-21 22:55   ` Philipp Tomsich
@ 2017-11-27 10:15     ` Kever Yang
  2017-11-27 14:50       ` Dr. Philipp Tomsich
  0 siblings, 1 reply; 9+ messages in thread
From: Kever Yang @ 2017-11-27 10:15 UTC (permalink / raw)
  To: u-boot

Philipp,


On 11/22/2017 06:55 AM, Philipp Tomsich wrote:
>
>
> On Fri, 3 Nov 2017, Kever Yang wrote:
>
>> From: Elaine Zhang <zhangqing@rock-chips.com>
>>
>> all rockchip socs add device_bind_driver_to_node,
>> to bound device rockchip reset to clock-controller.
>>
>> Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
>> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
>> Acked-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
>
> Reviewed-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
>
> See below for requested changes.
>
>> ---
>>
>> arch/arm/include/asm/arch-rockchip/clock.h |  6 +++++
>> drivers/clk/rockchip/clk_rk3036.c          | 15 ++++++++++++-
>> drivers/clk/rockchip/clk_rk3128.c          | 15 ++++++++++++-
>> drivers/clk/rockchip/clk_rk3188.c          | 15 ++++++++++++-
>> drivers/clk/rockchip/clk_rk322x.c          | 15 ++++++++++++-
>> drivers/clk/rockchip/clk_rk3288.c          | 15 ++++++++++++-
>> drivers/clk/rockchip/clk_rk3328.c          | 15 ++++++++++++-
>> drivers/clk/rockchip/clk_rk3368.c          | 15 ++++++++++++-
>> drivers/clk/rockchip/clk_rk3399.c          | 36 
>> +++++++++++++++++++++++++++++-
>> drivers/clk/rockchip/clk_rv1108.c          | 15 ++++++++++++-
>> 10 files changed, 153 insertions(+), 9 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/arch-rockchip/clock.h 
>> b/arch/arm/include/asm/arch-rockchip/clock.h
>> index 736b260..b812977 100644
>> --- a/arch/arm/include/asm/arch-rockchip/clock.h
>> +++ b/arch/arm/include/asm/arch-rockchip/clock.h
>> @@ -44,6 +44,12 @@ struct sysreset_reg {
>>     unsigned int glb_srst_snd_value;
>> };
>>
>> +struct softreset_reg {
>> +    void __iomem *base;
>> +    unsigned int sf_reset_offset;
>> +    unsigned int sf_reset_num;
>> +};
>> +
>> /**
>>  * clk_get_divisor() - Calculate the required clock divisior
>>  *
>> diff --git a/drivers/clk/rockchip/clk_rk3036.c 
>> b/drivers/clk/rockchip/clk_rk3036.c
>> index 280ebb9..32b250f 100644
>> --- a/drivers/clk/rockchip/clk_rk3036.c
>> +++ b/drivers/clk/rockchip/clk_rk3036.c
>> @@ -330,8 +330,9 @@ static int rk3036_clk_probe(struct udevice *dev)
>> static int rk3036_clk_bind(struct udevice *dev)
>> {
>>     int ret;
>> -    struct udevice *sys_child;
>> +    struct udevice *sys_child, *sf_child;
>>     struct sysreset_reg *priv;
>> +    struct softreset_reg *sf_priv;
>>
>>     /* The reset driver does not have a device node, so bind it here */
>>     ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>> @@ -347,6 +348,18 @@ static int rk3036_clk_bind(struct udevice *dev)
>>         sys_child->priv = priv;
>>     }
>>
>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>> +                     dev_ofnode(dev), &sf_child);
>> +    if (ret) {
>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>> +    } else {
>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>> +        sf_priv->sf_reset_offset = offsetof(struct rk3036_cru,
>> +                            cru_softrst_con[0]);
>> +        sf_priv->sf_reset_num = 9;
>> +        sf_child->priv = sf_priv;
>> +    }
>
> This code is repeated throughout our code-base (see below for how 
> often it appears).  Can you please factor this out into a helper 
> function that is located with the reset-driver and that can be called?
>
> E.g. something along the lines of
>     rockchip_sysreset_bind(sf_reset_offset, sf_reset_num)

I don't like them either, but each soc have different configure, we have to
assign reset_offset and reset_ num for each soc, maybe we can use an in-line
function which may save a few lines coding?

Thanks,
- Kever
>
>> +
>>     return 0;
>> }
>>
>> diff --git a/drivers/clk/rockchip/clk_rk3128.c 
>> b/drivers/clk/rockchip/clk_rk3128.c
>> index c75cbf8..45e36a2 100644
>> --- a/drivers/clk/rockchip/clk_rk3128.c
>> +++ b/drivers/clk/rockchip/clk_rk3128.c
>> @@ -325,8 +325,9 @@ static int rk3128_clk_probe(struct udevice *dev)
>> static int rk3128_clk_bind(struct udevice *dev)
>> {
>>     int ret;
>> -    struct udevice *sys_child;
>> +    struct udevice *sys_child, *sf_child;
>>     struct sysreset_reg *priv;
>> +    struct softreset_reg *sf_priv;
>>
>>     /* The reset driver does not have a device node, so bind it here */
>>     ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>> @@ -342,6 +343,18 @@ static int rk3128_clk_bind(struct udevice *dev)
>>         sys_child->priv = priv;
>>     }
>>
>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>> +                     dev_ofnode(dev), &sf_child);
>> +    if (ret) {
>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>> +    } else {
>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>> +        sf_priv->sf_reset_offset = offsetof(struct rk3128_cru,
>> +                            cru_softrst_con[0]);
>> +        sf_priv->sf_reset_num = 9;
>> +        sf_child->priv = sf_priv;
>> +    }
>> +
>>     return 0;
>> }
>>
>> diff --git a/drivers/clk/rockchip/clk_rk3188.c 
>> b/drivers/clk/rockchip/clk_rk3188.c
>> index fca6899..9febf29 100644
>> --- a/drivers/clk/rockchip/clk_rk3188.c
>> +++ b/drivers/clk/rockchip/clk_rk3188.c
>> @@ -573,8 +573,9 @@ static int rk3188_clk_probe(struct udevice *dev)
>> static int rk3188_clk_bind(struct udevice *dev)
>> {
>>     int ret;
>> -    struct udevice *sys_child;
>> +    struct udevice *sys_child, *sf_child;
>>     struct sysreset_reg *priv;
>> +    struct softreset_reg *sf_priv;
>>
>>     /* The reset driver does not have a device node, so bind it here */
>>     ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>> @@ -590,6 +591,18 @@ static int rk3188_clk_bind(struct udevice *dev)
>>         sys_child->priv = priv;
>>     }
>>
>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>> +                     dev_ofnode(dev), &sf_child);
>> +    if (ret) {
>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>> +    } else {
>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>> +        sf_priv->sf_reset_offset = offsetof(struct rk3188_cru,
>> +                            cru_softrst_con[0]);
>> +        sf_priv->sf_reset_num = 9;
>> +        sf_child->priv = sf_priv;
>> +    }
>> +
>>     return 0;
>> }
>>
>> diff --git a/drivers/clk/rockchip/clk_rk322x.c 
>> b/drivers/clk/rockchip/clk_rk322x.c
>> index ff52b55..a5fcb9d 100644
>> --- a/drivers/clk/rockchip/clk_rk322x.c
>> +++ b/drivers/clk/rockchip/clk_rk322x.c
>> @@ -385,8 +385,9 @@ static int rk322x_clk_probe(struct udevice *dev)
>> static int rk322x_clk_bind(struct udevice *dev)
>> {
>>     int ret;
>> -    struct udevice *sys_child;
>> +    struct udevice *sys_child, *sf_child;
>>     struct sysreset_reg *priv;
>> +    struct softreset_reg *sf_priv;
>>
>>     /* The reset driver does not have a device node, so bind it here */
>>     ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>> @@ -402,6 +403,18 @@ static int rk322x_clk_bind(struct udevice *dev)
>>         sys_child->priv = priv;
>>     }
>>
>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>> +                     dev_ofnode(dev), &sf_child);
>> +    if (ret) {
>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>> +    } else {
>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>> +        sf_priv->sf_reset_offset = offsetof(struct rk322x_cru,
>> +                            cru_softrst_con[0]);
>> +        sf_priv->sf_reset_num = 9;
>> +        sf_child->priv = sf_priv;
>> +    }
>> +
>>     return 0;
>> }
>>
>> diff --git a/drivers/clk/rockchip/clk_rk3288.c 
>> b/drivers/clk/rockchip/clk_rk3288.c
>> index ac53239..ec33612 100644
>> --- a/drivers/clk/rockchip/clk_rk3288.c
>> +++ b/drivers/clk/rockchip/clk_rk3288.c
>> @@ -859,8 +859,9 @@ static int rk3288_clk_probe(struct udevice *dev)
>> static int rk3288_clk_bind(struct udevice *dev)
>> {
>>     int ret;
>> -    struct udevice *sys_child;
>> +    struct udevice *sys_child, *sf_child;
>>     struct sysreset_reg *priv;
>> +    struct softreset_reg *sf_priv;
>>
>>     /* The reset driver does not have a device node, so bind it here */
>>     ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>> @@ -876,6 +877,18 @@ static int rk3288_clk_bind(struct udevice *dev)
>>         sys_child->priv = priv;
>>     }
>>
>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>> +                     dev_ofnode(dev), &sf_child);
>> +    if (ret) {
>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>> +    } else {
>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>> +        sf_priv->sf_reset_offset = offsetof(struct rk3288_cru,
>> +                            cru_softrst_con[0]);
>> +        sf_priv->sf_reset_num = 12;
>> +        sf_child->priv = sf_priv;
>> +    }
>> +
>>     return 0;
>> }
>>
>> diff --git a/drivers/clk/rockchip/clk_rk3328.c 
>> b/drivers/clk/rockchip/clk_rk3328.c
>> index 4d522a7..1388b44 100644
>> --- a/drivers/clk/rockchip/clk_rk3328.c
>> +++ b/drivers/clk/rockchip/clk_rk3328.c
>> @@ -597,8 +597,9 @@ static int rk3328_clk_ofdata_to_platdata(struct 
>> udevice *dev)
>> static int rk3328_clk_bind(struct udevice *dev)
>> {
>>     int ret;
>> -    struct udevice *sys_child;
>> +    struct udevice *sys_child, *sf_child;
>>     struct sysreset_reg *priv;
>> +    struct softreset_reg *sf_priv;
>>
>>     /* The reset driver does not have a device node, so bind it here */
>>     ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>> @@ -614,6 +615,18 @@ static int rk3328_clk_bind(struct udevice *dev)
>>         sys_child->priv = priv;
>>     }
>>
>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>> +                     dev_ofnode(dev), &sf_child);
>> +    if (ret) {
>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>> +    } else {
>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>> +        sf_priv->sf_reset_offset = offsetof(struct rk3328_cru,
>> +                            softrst_con[0]);
>> +        sf_priv->sf_reset_num = 12;
>> +        sf_child->priv = sf_priv;
>> +    }
>> +
>>     return ret;
>> }
>>
>> diff --git a/drivers/clk/rockchip/clk_rk3368.c 
>> b/drivers/clk/rockchip/clk_rk3368.c
>> index bfeef39..5e4201d 100644
>> --- a/drivers/clk/rockchip/clk_rk3368.c
>> +++ b/drivers/clk/rockchip/clk_rk3368.c
>> @@ -526,8 +526,9 @@ static int rk3368_clk_ofdata_to_platdata(struct 
>> udevice *dev)
>> static int rk3368_clk_bind(struct udevice *dev)
>> {
>>     int ret;
>> -    struct udevice *sys_child;
>> +    struct udevice *sys_child, *sf_child;
>>     struct sysreset_reg *priv;
>> +    struct softreset_reg *sf_priv;
>>
>>     /* The reset driver does not have a device node, so bind it here */
>>     ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>> @@ -543,6 +544,18 @@ static int rk3368_clk_bind(struct udevice *dev)
>>         sys_child->priv = priv;
>>     }
>>
>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>> +                     dev_ofnode(dev), &sf_child);
>> +    if (ret) {
>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>> +    } else {
>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>> +        sf_priv->sf_reset_offset = offsetof(struct rk3368_cru,
>> +                            softrst_con[0]);
>> +        sf_priv->sf_reset_num = 15;
>> +        sf_child->priv = sf_priv;
>> +    }
>> +
>>     return ret;
>> }
>>
>> diff --git a/drivers/clk/rockchip/clk_rk3399.c 
>> b/drivers/clk/rockchip/clk_rk3399.c
>> index e21d056..2e26e92 100644
>> --- a/drivers/clk/rockchip/clk_rk3399.c
>> +++ b/drivers/clk/rockchip/clk_rk3399.c
>> @@ -1033,8 +1033,9 @@ static int rk3399_clk_ofdata_to_platdata(struct 
>> udevice *dev)
>> static int rk3399_clk_bind(struct udevice *dev)
>> {
>>     int ret;
>> -    struct udevice *sys_child;
>> +    struct udevice *sys_child, *sf_child;
>>     struct sysreset_reg *priv;
>> +    struct softreset_reg *sf_priv;
>>
>>     /* The reset driver does not have a device node, so bind it here */
>>     ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>> @@ -1050,6 +1051,18 @@ static int rk3399_clk_bind(struct udevice *dev)
>>         sys_child->priv = priv;
>>     }
>>
>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>> +                     dev_ofnode(dev), &sf_child);
>> +    if (ret) {
>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>> +    } else {
>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>> +        sf_priv->sf_reset_offset = offsetof(struct rk3399_cru,
>> +                            softrst_con[0]);
>> +        sf_priv->sf_reset_num = 21;
>> +        sf_child->priv = sf_priv;
>> +    }
>> +
>>     return 0;
>> }
>>
>> @@ -1225,6 +1238,26 @@ static int 
>> rk3399_pmuclk_ofdata_to_platdata(struct udevice *dev)
>>     return 0;
>> }
>>
>> +static int rk3399_pmuclk_bind(struct udevice *dev)
>> +{
>> +    int ret = 0;
>> +    struct udevice *sf_child;
>> +    struct softreset_reg *sf_priv = malloc(sizeof(struct 
>> softreset_reg));
>> +
>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset",
>> +                     "reset", dev_ofnode(dev),
>> +                     &sf_child);
>> +    if (ret)
>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>> +
>> +    sf_priv->sf_reset_offset = offsetof(struct rk3399_pmucru,
>> +                        pmucru_softrst_con[0]);
>> +    sf_priv->sf_reset_num = 2;
>> +    sf_child->priv = sf_priv;
>> +
>> +    return ret;
>> +}
>> +
>> static const struct udevice_id rk3399_pmuclk_ids[] = {
>>     { .compatible = "rockchip,rk3399-pmucru" },
>>     { }
>> @@ -1238,6 +1271,7 @@ U_BOOT_DRIVER(rockchip_rk3399_pmuclk) = {
>>     .ofdata_to_platdata = rk3399_pmuclk_ofdata_to_platdata,
>>     .ops        = &rk3399_pmuclk_ops,
>>     .probe        = rk3399_pmuclk_probe,
>> +    .bind        = rk3399_pmuclk_bind,
>> #if CONFIG_IS_ENABLED(OF_PLATDATA)
>>     .platdata_auto_alloc_size = sizeof(struct rk3399_pmuclk_plat),
>> #endif
>> diff --git a/drivers/clk/rockchip/clk_rv1108.c 
>> b/drivers/clk/rockchip/clk_rv1108.c
>> index a119548..a6c5c47 100644
>> --- a/drivers/clk/rockchip/clk_rv1108.c
>> +++ b/drivers/clk/rockchip/clk_rv1108.c
>> @@ -223,8 +223,9 @@ static int rv1108_clk_probe(struct udevice *dev)
>> static int rv1108_clk_bind(struct udevice *dev)
>> {
>>     int ret;
>> -    struct udevice *sys_child;
>> +    struct udevice *sys_child, *sf_child;
>>     struct sysreset_reg *priv;
>> +    struct softreset_reg *sf_priv;
>>
>>     /* The reset driver does not have a device node, so bind it here */
>>     ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>> @@ -240,6 +241,18 @@ static int rv1108_clk_bind(struct udevice *dev)
>>         sys_child->priv = priv;
>>     }
>>
>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>> +                     dev_ofnode(dev), &sf_child);
>> +    if (ret) {
>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>> +    } else {
>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>> +        sf_priv->sf_reset_offset = offsetof(struct rv1108_cru,
>> +                            softrst_con[0]);
>> +        sf_priv->sf_reset_num = 13;
>> +        sf_child->priv = sf_priv;
>> +    }
>> +
>>     return 0;
>> }
>>
>>
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [U-Boot] [U-Boot, RESEND, 1/2] drivers/reset: support rockchip reset drivers
  2017-11-21 22:52 ` Philipp Tomsich
@ 2017-11-27 10:26   ` Kever Yang
  0 siblings, 0 replies; 9+ messages in thread
From: Kever Yang @ 2017-11-27 10:26 UTC (permalink / raw)
  To: u-boot

Philipp,


On 11/22/2017 06:52 AM, Philipp Tomsich wrote:
>
>
> On Fri, 3 Nov 2017, Kever Yang wrote:
>
>> From: Elaine Zhang <zhangqing@rock-chips.com>
>>
>> Create driver to support all Rockchip SoCs soft reset.
>> Example of usage:
>> i2c driver:
>>     ret = reset_get_by_name(dev, "i2c", &reset_ctl);
>>     if (ret) {
>>         error("reset_get_by_name() failed: %d\n", ret);
>>     }
>>
>>     reset_assert(&reset_ctl);
>>     udelay(50);
>>     reset_deassert(&reset_ctl);
>>
>> i2c dts node:
>> resets = <&cru SRST_P_I2C1>, <&cru SRST_I2C1>;
>> reset-names = "p_i2c", "i2c";
>>
>> Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
>> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
>> Acked-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
>
> Reviewed-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
>
> See below for requested changes.
>
>> ---
>>
>> drivers/reset/Kconfig          |   8 ++++
>> drivers/reset/Makefile         |   1 +
>> drivers/reset/reset-rockchip.c | 104 
>> +++++++++++++++++++++++++++++++++++++++++
>> 3 files changed, 113 insertions(+)
>> create mode 100644 drivers/reset/reset-rockchip.c
>>
>> diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
>> index ce46e27..c0d6d75 100644
>> --- a/drivers/reset/Kconfig
>> +++ b/drivers/reset/Kconfig
>> @@ -74,4 +74,12 @@ config AST2500_RESET
>>       resets that are supported by watchdog. The main limitation though
>>       is that some reset signals, like I2C or MISC reset multiple 
>> devices.
>>
>> +config RESET_ROCKCHIP
>> +    bool "Reset controller driver for Rockchip SoCs"
>> +    depends on DM_RESET && CLK
>> +    default y
>> +    help
>> +      Support for reset controller on rockchip SoC. The main 
>> limitation though
>
> This line is too long.

Will fix.
>
>> +      is that some reset signals, like I2C or MISC reset multiple 
>> devices.
>> +
>> endmenu
>> diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
>> index 252cefe..7d7e080 100644
>> --- a/drivers/reset/Makefile
>> +++ b/drivers/reset/Makefile
>> @@ -12,3 +12,4 @@ obj-$(CONFIG_TEGRA186_RESET) += tegra186-reset.o
>> obj-$(CONFIG_RESET_BCM6345) += reset-bcm6345.o
>> obj-$(CONFIG_RESET_UNIPHIER) += reset-uniphier.o
>> obj-$(CONFIG_AST2500_RESET) += ast2500-reset.o
>> +obj-$(CONFIG_RESET_ROCKCHIP) += reset-rockchip.o
>> diff --git a/drivers/reset/reset-rockchip.c 
>> b/drivers/reset/reset-rockchip.c
>> new file mode 100644
>> index 0000000..322ac27
>> --- /dev/null
>> +++ b/drivers/reset/reset-rockchip.c
>> @@ -0,0 +1,104 @@
>> +/*
>> + * (C) Copyright 2017 Rockchip Electronics Co., Ltd
>> + *
>> + * SPDX-License-Identifier: GPL-2.0
>> + */
>> +
>> +#include <common.h>
>> +#include <dm.h>
>> +#include <reset-uclass.h>
>> +#include <linux/io.h>
>> +
>> +struct rockchip_reset_priv {
>> +    void __iomem *base;
>> +    unsigned int sf_reset_offset;
>> +    unsigned int sf_reset_num;
>> +};
>> +
>> +static int rockchip_reset_request(struct reset_ctl *reset_ctl)
>> +{
>> +    struct rockchip_reset_priv *priv = dev_get_priv(reset_ctl->dev);
>> +
>> +    debug("%s(reset_ctl=%p) (dev=%p, id=%lu) (sf_reset_num=%d)\n", 
>> __func__,
>> +          reset_ctl, reset_ctl->dev, reset_ctl->id, 
>> priv->sf_reset_num);
>> +
>> +    if (reset_ctl->id / 16 >= priv->sf_reset_num)
>
> Can you please write this in a more readable/maintainable way (and 
> possibly also add a comment)?  E.g. in order to understand this, the 
> reader needs to know that there will be exactly 16 resets per register 
> and that these will be continuous (i.e. no holes), so this comparison 
> only makes sense for the final register...
>

Will add a comment, and a MAGIC MACRO will better than 16.

> Also, I am not convinced that this code will not break in the future...

There is only one commit in kernel for softreset since 2014 and it used 
for all rockchip SoCs.
drivers/clk/rockchip/softrst.c
>
>> +        return -EINVAL;
>> +
>> +    return 0;
>> +}
>> +
>> +static int rockchip_reset_free(struct reset_ctl *reset_ctl)
>> +{
>> +    debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
>> +          reset_ctl->dev, reset_ctl->id);
>> +
>> +    return 0;
>> +}
>> +
>> +static int rockchip_reset_assert(struct reset_ctl *reset_ctl)
>> +{
>> +    struct rockchip_reset_priv *priv = dev_get_priv(reset_ctl->dev);
>> +    int bank =  reset_ctl->id / 16;
>> +    int offset =  reset_ctl->id % 16;
>> +
>> +    debug("%s(reset_ctl=%p) (dev=%p, id=%lu) (reg_addr=%p)\n", 
>> __func__,
>> +          reset_ctl, reset_ctl->dev, reset_ctl->id,
>> +          priv->base + (bank * 4));
>> +
>> +    writel(BIT(offset) | (BIT(offset) << 16), priv->base + (bank * 4));
>
> Again: it should be made clear to the reader why there's
>     1. (BIT | BIT << 16)
>     2. back is multiplied by 4
>
> Also, if I am correct rk_setreg(...) should be used.
>

Yes, you are right, should use rk_setreg().
>> +
>> +    return 0;
>> +}
>> +
>> +static int rockchip_reset_deassert(struct reset_ctl *reset_ctl)
>> +{
>> +    struct rockchip_reset_priv *priv = dev_get_priv(reset_ctl->dev);
>> +    int bank =  reset_ctl->id / 16;
>> +    int offset =  reset_ctl->id % 16;
>
> Again, these computations are magic without clearer code and/or 
> documentation.
>
>> +
>> +    debug("%s(reset_ctl=%p) (dev=%p, id=%lu) (reg_addr=%p)\n", 
>> __func__,
>> +          reset_ctl, reset_ctl->dev, reset_ctl->id,
>> +          priv->base + (bank * 4));
>> +
>> +    writel((BIT(offset) << 16), priv->base + (bank * 4));
>
> See above. Also, this looks like a case for rk_clrreg(...).
>
>> +
>> +    return 0;
>> +}
>> +
>> +struct reset_ops rockchip_reset_ops = {
>> +    .request = rockchip_reset_request,
>> +    .free = rockchip_reset_free,
>> +    .rst_assert = rockchip_reset_assert,
>> +    .rst_deassert = rockchip_reset_deassert,
>> +};
>> +
>> +static int rockchip_reset_probe(struct udevice *dev)
>> +{
>> +    struct rockchip_reset_priv *priv = dev_get_priv(dev);
>> +    fdt_addr_t addr;
>> +    fdt_size_t size;
>> +
>> +    addr = devfdt_get_addr_size_index(dev, 0, &size);
>
> Please use the dev_...() function family.
Will fix.

Thanks,
- Kever
>
>> +    if (addr == FDT_ADDR_T_NONE)
>> +        return -EINVAL;
>> +
>> +    if ((priv->sf_reset_offset == 0) && (priv->sf_reset_num == 0))
>> +        return -EINVAL;
>> +
>> +    addr += priv->sf_reset_offset;
>> +    priv->base = ioremap(addr, size);
>> +
>> +    debug("%s(base=%p) (sf_reset_offset=%x, sf_reset_num=%d)\n", 
>> __func__,
>> +          priv->base, priv->sf_reset_offset, priv->sf_reset_num);
>> +
>> +    return 0;
>> +}
>> +
>> +U_BOOT_DRIVER(rockchip_reset) = {
>> +    .name = "rockchip_reset",
>> +    .id = UCLASS_RESET,
>> +    .probe = rockchip_reset_probe,
>> +    .ops = &rockchip_reset_ops,
>> +    .priv_auto_alloc_size = sizeof(struct rockchip_reset_priv),
>> +};
>>
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [U-Boot] [U-Boot, RESEND, 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver
  2017-11-27 10:15     ` Kever Yang
@ 2017-11-27 14:50       ` Dr. Philipp Tomsich
  0 siblings, 0 replies; 9+ messages in thread
From: Dr. Philipp Tomsich @ 2017-11-27 14:50 UTC (permalink / raw)
  To: u-boot

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="windows-1254", Size: 16064 bytes --]


> On 27 Nov 2017, at 11:15, Kever Yang <kever.yang@rock-chips.com> wrote:
> 
> Philipp,
> 
> 
> On 11/22/2017 06:55 AM, Philipp Tomsich wrote:
>> 
>> 
>> On Fri, 3 Nov 2017, Kever Yang wrote:
>> 
>>> From: Elaine Zhang <zhangqing@rock-chips.com>
>>> 
>>> all rockchip socs add device_bind_driver_to_node,
>>> to bound device rockchip reset to clock-controller.
>>> 
>>> Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
>>> Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
>>> Acked-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
>> 
>> Reviewed-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
>> 
>> See below for requested changes.
>> 
>>> ---
>>> 
>>> arch/arm/include/asm/arch-rockchip/clock.h |  6 +++++
>>> drivers/clk/rockchip/clk_rk3036.c          | 15 ++++++++++++-
>>> drivers/clk/rockchip/clk_rk3128.c          | 15 ++++++++++++-
>>> drivers/clk/rockchip/clk_rk3188.c          | 15 ++++++++++++-
>>> drivers/clk/rockchip/clk_rk322x.c          | 15 ++++++++++++-
>>> drivers/clk/rockchip/clk_rk3288.c          | 15 ++++++++++++-
>>> drivers/clk/rockchip/clk_rk3328.c          | 15 ++++++++++++-
>>> drivers/clk/rockchip/clk_rk3368.c          | 15 ++++++++++++-
>>> drivers/clk/rockchip/clk_rk3399.c          | 36 +++++++++++++++++++++++++++++-
>>> drivers/clk/rockchip/clk_rv1108.c          | 15 ++++++++++++-
>>> 10 files changed, 153 insertions(+), 9 deletions(-)
>>> 
>>> diff --git a/arch/arm/include/asm/arch-rockchip/clock.h b/arch/arm/include/asm/arch-rockchip/clock.h
>>> index 736b260..b812977 100644
>>> --- a/arch/arm/include/asm/arch-rockchip/clock.h
>>> +++ b/arch/arm/include/asm/arch-rockchip/clock.h
>>> @@ -44,6 +44,12 @@ struct sysreset_reg {
>>>    unsigned int glb_srst_snd_value;
>>> };
>>> 
>>> +struct softreset_reg {
>>> +    void __iomem *base;
>>> +    unsigned int sf_reset_offset;
>>> +    unsigned int sf_reset_num;
>>> +};
>>> +
>>> /**
>>> * clk_get_divisor() - Calculate the required clock divisior
>>> *
>>> diff --git a/drivers/clk/rockchip/clk_rk3036.c b/drivers/clk/rockchip/clk_rk3036.c
>>> index 280ebb9..32b250f 100644
>>> --- a/drivers/clk/rockchip/clk_rk3036.c
>>> +++ b/drivers/clk/rockchip/clk_rk3036.c
>>> @@ -330,8 +330,9 @@ static int rk3036_clk_probe(struct udevice *dev)
>>> static int rk3036_clk_bind(struct udevice *dev)
>>> {
>>>    int ret;
>>> -    struct udevice *sys_child;
>>> +    struct udevice *sys_child, *sf_child;
>>>    struct sysreset_reg *priv;
>>> +    struct softreset_reg *sf_priv;
>>> 
>>>    /* The reset driver does not have a device node, so bind it here */
>>>    ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>>> @@ -347,6 +348,18 @@ static int rk3036_clk_bind(struct udevice *dev)
>>>        sys_child->priv = priv;
>>>    }
>>> 
>>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>>> +                     dev_ofnode(dev), &sf_child);
>>> +    if (ret) {
>>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>>> +    } else {
>>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>>> +        sf_priv->sf_reset_offset = offsetof(struct rk3036_cru,
>>> +                            cru_softrst_con[0]);
>>> +        sf_priv->sf_reset_num = 9;
>>> +        sf_child->priv = sf_priv;
>>> +    }
>> 
>> This code is repeated throughout our code-base (see below for how often it appears).  Can you please factor this out into a helper function that is located with the reset-driver and that can be called?
>> 
>> E.g. something along the lines of
>>    rockchip_sysreset_bind(sf_reset_offset, sf_reset_num)
> 
> I don't like them either, but each soc have different configure, we have to
> assign reset_offset and reset_ num for each soc, maybe we can use an in-line
> function which may save a few lines coding?

This should not be time-critical, so even a regular function (in sysreset_rockchip.c)
should work. As I said: "rockchip_sysreset_bind(sf_reset_offset, sf_reset_num)”
looks like a possible function call name/signature.

> Thanks,
> - Kever
>> 
>>> +
>>>    return 0;
>>> }
>>> 
>>> diff --git a/drivers/clk/rockchip/clk_rk3128.c b/drivers/clk/rockchip/clk_rk3128.c
>>> index c75cbf8..45e36a2 100644
>>> --- a/drivers/clk/rockchip/clk_rk3128.c
>>> +++ b/drivers/clk/rockchip/clk_rk3128.c
>>> @@ -325,8 +325,9 @@ static int rk3128_clk_probe(struct udevice *dev)
>>> static int rk3128_clk_bind(struct udevice *dev)
>>> {
>>>    int ret;
>>> -    struct udevice *sys_child;
>>> +    struct udevice *sys_child, *sf_child;
>>>    struct sysreset_reg *priv;
>>> +    struct softreset_reg *sf_priv;
>>> 
>>>    /* The reset driver does not have a device node, so bind it here */
>>>    ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>>> @@ -342,6 +343,18 @@ static int rk3128_clk_bind(struct udevice *dev)
>>>        sys_child->priv = priv;
>>>    }
>>> 
>>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>>> +                     dev_ofnode(dev), &sf_child);
>>> +    if (ret) {
>>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>>> +    } else {
>>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>>> +        sf_priv->sf_reset_offset = offsetof(struct rk3128_cru,
>>> +                            cru_softrst_con[0]);
>>> +        sf_priv->sf_reset_num = 9;
>>> +        sf_child->priv = sf_priv;
>>> +    }
>>> +
>>>    return 0;
>>> }
>>> 
>>> diff --git a/drivers/clk/rockchip/clk_rk3188.c b/drivers/clk/rockchip/clk_rk3188.c
>>> index fca6899..9febf29 100644
>>> --- a/drivers/clk/rockchip/clk_rk3188.c
>>> +++ b/drivers/clk/rockchip/clk_rk3188.c
>>> @@ -573,8 +573,9 @@ static int rk3188_clk_probe(struct udevice *dev)
>>> static int rk3188_clk_bind(struct udevice *dev)
>>> {
>>>    int ret;
>>> -    struct udevice *sys_child;
>>> +    struct udevice *sys_child, *sf_child;
>>>    struct sysreset_reg *priv;
>>> +    struct softreset_reg *sf_priv;
>>> 
>>>    /* The reset driver does not have a device node, so bind it here */
>>>    ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>>> @@ -590,6 +591,18 @@ static int rk3188_clk_bind(struct udevice *dev)
>>>        sys_child->priv = priv;
>>>    }
>>> 
>>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>>> +                     dev_ofnode(dev), &sf_child);
>>> +    if (ret) {
>>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>>> +    } else {
>>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>>> +        sf_priv->sf_reset_offset = offsetof(struct rk3188_cru,
>>> +                            cru_softrst_con[0]);
>>> +        sf_priv->sf_reset_num = 9;
>>> +        sf_child->priv = sf_priv;
>>> +    }
>>> +
>>>    return 0;
>>> }
>>> 
>>> diff --git a/drivers/clk/rockchip/clk_rk322x.c b/drivers/clk/rockchip/clk_rk322x.c
>>> index ff52b55..a5fcb9d 100644
>>> --- a/drivers/clk/rockchip/clk_rk322x.c
>>> +++ b/drivers/clk/rockchip/clk_rk322x.c
>>> @@ -385,8 +385,9 @@ static int rk322x_clk_probe(struct udevice *dev)
>>> static int rk322x_clk_bind(struct udevice *dev)
>>> {
>>>    int ret;
>>> -    struct udevice *sys_child;
>>> +    struct udevice *sys_child, *sf_child;
>>>    struct sysreset_reg *priv;
>>> +    struct softreset_reg *sf_priv;
>>> 
>>>    /* The reset driver does not have a device node, so bind it here */
>>>    ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>>> @@ -402,6 +403,18 @@ static int rk322x_clk_bind(struct udevice *dev)
>>>        sys_child->priv = priv;
>>>    }
>>> 
>>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>>> +                     dev_ofnode(dev), &sf_child);
>>> +    if (ret) {
>>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>>> +    } else {
>>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>>> +        sf_priv->sf_reset_offset = offsetof(struct rk322x_cru,
>>> +                            cru_softrst_con[0]);
>>> +        sf_priv->sf_reset_num = 9;
>>> +        sf_child->priv = sf_priv;
>>> +    }
>>> +
>>>    return 0;
>>> }
>>> 
>>> diff --git a/drivers/clk/rockchip/clk_rk3288.c b/drivers/clk/rockchip/clk_rk3288.c
>>> index ac53239..ec33612 100644
>>> --- a/drivers/clk/rockchip/clk_rk3288.c
>>> +++ b/drivers/clk/rockchip/clk_rk3288.c
>>> @@ -859,8 +859,9 @@ static int rk3288_clk_probe(struct udevice *dev)
>>> static int rk3288_clk_bind(struct udevice *dev)
>>> {
>>>    int ret;
>>> -    struct udevice *sys_child;
>>> +    struct udevice *sys_child, *sf_child;
>>>    struct sysreset_reg *priv;
>>> +    struct softreset_reg *sf_priv;
>>> 
>>>    /* The reset driver does not have a device node, so bind it here */
>>>    ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>>> @@ -876,6 +877,18 @@ static int rk3288_clk_bind(struct udevice *dev)
>>>        sys_child->priv = priv;
>>>    }
>>> 
>>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>>> +                     dev_ofnode(dev), &sf_child);
>>> +    if (ret) {
>>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>>> +    } else {
>>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>>> +        sf_priv->sf_reset_offset = offsetof(struct rk3288_cru,
>>> +                            cru_softrst_con[0]);
>>> +        sf_priv->sf_reset_num = 12;
>>> +        sf_child->priv = sf_priv;
>>> +    }
>>> +
>>>    return 0;
>>> }
>>> 
>>> diff --git a/drivers/clk/rockchip/clk_rk3328.c b/drivers/clk/rockchip/clk_rk3328.c
>>> index 4d522a7..1388b44 100644
>>> --- a/drivers/clk/rockchip/clk_rk3328.c
>>> +++ b/drivers/clk/rockchip/clk_rk3328.c
>>> @@ -597,8 +597,9 @@ static int rk3328_clk_ofdata_to_platdata(struct udevice *dev)
>>> static int rk3328_clk_bind(struct udevice *dev)
>>> {
>>>    int ret;
>>> -    struct udevice *sys_child;
>>> +    struct udevice *sys_child, *sf_child;
>>>    struct sysreset_reg *priv;
>>> +    struct softreset_reg *sf_priv;
>>> 
>>>    /* The reset driver does not have a device node, so bind it here */
>>>    ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>>> @@ -614,6 +615,18 @@ static int rk3328_clk_bind(struct udevice *dev)
>>>        sys_child->priv = priv;
>>>    }
>>> 
>>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>>> +                     dev_ofnode(dev), &sf_child);
>>> +    if (ret) {
>>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>>> +    } else {
>>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>>> +        sf_priv->sf_reset_offset = offsetof(struct rk3328_cru,
>>> +                            softrst_con[0]);
>>> +        sf_priv->sf_reset_num = 12;
>>> +        sf_child->priv = sf_priv;
>>> +    }
>>> +
>>>    return ret;
>>> }
>>> 
>>> diff --git a/drivers/clk/rockchip/clk_rk3368.c b/drivers/clk/rockchip/clk_rk3368.c
>>> index bfeef39..5e4201d 100644
>>> --- a/drivers/clk/rockchip/clk_rk3368.c
>>> +++ b/drivers/clk/rockchip/clk_rk3368.c
>>> @@ -526,8 +526,9 @@ static int rk3368_clk_ofdata_to_platdata(struct udevice *dev)
>>> static int rk3368_clk_bind(struct udevice *dev)
>>> {
>>>    int ret;
>>> -    struct udevice *sys_child;
>>> +    struct udevice *sys_child, *sf_child;
>>>    struct sysreset_reg *priv;
>>> +    struct softreset_reg *sf_priv;
>>> 
>>>    /* The reset driver does not have a device node, so bind it here */
>>>    ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>>> @@ -543,6 +544,18 @@ static int rk3368_clk_bind(struct udevice *dev)
>>>        sys_child->priv = priv;
>>>    }
>>> 
>>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>>> +                     dev_ofnode(dev), &sf_child);
>>> +    if (ret) {
>>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>>> +    } else {
>>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>>> +        sf_priv->sf_reset_offset = offsetof(struct rk3368_cru,
>>> +                            softrst_con[0]);
>>> +        sf_priv->sf_reset_num = 15;
>>> +        sf_child->priv = sf_priv;
>>> +    }
>>> +
>>>    return ret;
>>> }
>>> 
>>> diff --git a/drivers/clk/rockchip/clk_rk3399.c b/drivers/clk/rockchip/clk_rk3399.c
>>> index e21d056..2e26e92 100644
>>> --- a/drivers/clk/rockchip/clk_rk3399.c
>>> +++ b/drivers/clk/rockchip/clk_rk3399.c
>>> @@ -1033,8 +1033,9 @@ static int rk3399_clk_ofdata_to_platdata(struct udevice *dev)
>>> static int rk3399_clk_bind(struct udevice *dev)
>>> {
>>>    int ret;
>>> -    struct udevice *sys_child;
>>> +    struct udevice *sys_child, *sf_child;
>>>    struct sysreset_reg *priv;
>>> +    struct softreset_reg *sf_priv;
>>> 
>>>    /* The reset driver does not have a device node, so bind it here */
>>>    ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>>> @@ -1050,6 +1051,18 @@ static int rk3399_clk_bind(struct udevice *dev)
>>>        sys_child->priv = priv;
>>>    }
>>> 
>>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>>> +                     dev_ofnode(dev), &sf_child);
>>> +    if (ret) {
>>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>>> +    } else {
>>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>>> +        sf_priv->sf_reset_offset = offsetof(struct rk3399_cru,
>>> +                            softrst_con[0]);
>>> +        sf_priv->sf_reset_num = 21;
>>> +        sf_child->priv = sf_priv;
>>> +    }
>>> +
>>>    return 0;
>>> }
>>> 
>>> @@ -1225,6 +1238,26 @@ static int rk3399_pmuclk_ofdata_to_platdata(struct udevice *dev)
>>>    return 0;
>>> }
>>> 
>>> +static int rk3399_pmuclk_bind(struct udevice *dev)
>>> +{
>>> +    int ret = 0;
>>> +    struct udevice *sf_child;
>>> +    struct softreset_reg *sf_priv = malloc(sizeof(struct softreset_reg));
>>> +
>>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset",
>>> +                     "reset", dev_ofnode(dev),
>>> +                     &sf_child);
>>> +    if (ret)
>>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>>> +
>>> +    sf_priv->sf_reset_offset = offsetof(struct rk3399_pmucru,
>>> +                        pmucru_softrst_con[0]);
>>> +    sf_priv->sf_reset_num = 2;
>>> +    sf_child->priv = sf_priv;
>>> +
>>> +    return ret;
>>> +}
>>> +
>>> static const struct udevice_id rk3399_pmuclk_ids[] = {
>>>    { .compatible = "rockchip,rk3399-pmucru" },
>>>    { }
>>> @@ -1238,6 +1271,7 @@ U_BOOT_DRIVER(rockchip_rk3399_pmuclk) = {
>>>    .ofdata_to_platdata = rk3399_pmuclk_ofdata_to_platdata,
>>>    .ops        = &rk3399_pmuclk_ops,
>>>    .probe        = rk3399_pmuclk_probe,
>>> +    .bind        = rk3399_pmuclk_bind,
>>> #if CONFIG_IS_ENABLED(OF_PLATDATA)
>>>    .platdata_auto_alloc_size = sizeof(struct rk3399_pmuclk_plat),
>>> #endif
>>> diff --git a/drivers/clk/rockchip/clk_rv1108.c b/drivers/clk/rockchip/clk_rv1108.c
>>> index a119548..a6c5c47 100644
>>> --- a/drivers/clk/rockchip/clk_rv1108.c
>>> +++ b/drivers/clk/rockchip/clk_rv1108.c
>>> @@ -223,8 +223,9 @@ static int rv1108_clk_probe(struct udevice *dev)
>>> static int rv1108_clk_bind(struct udevice *dev)
>>> {
>>>    int ret;
>>> -    struct udevice *sys_child;
>>> +    struct udevice *sys_child, *sf_child;
>>>    struct sysreset_reg *priv;
>>> +    struct softreset_reg *sf_priv;
>>> 
>>>    /* The reset driver does not have a device node, so bind it here */
>>>    ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset",
>>> @@ -240,6 +241,18 @@ static int rv1108_clk_bind(struct udevice *dev)
>>>        sys_child->priv = priv;
>>>    }
>>> 
>>> +    ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset",
>>> +                     dev_ofnode(dev), &sf_child);
>>> +    if (ret) {
>>> +        debug("Warning: No rockchip reset driver: ret=%d\n", ret);
>>> +    } else {
>>> +        sf_priv = malloc(sizeof(struct softreset_reg));
>>> +        sf_priv->sf_reset_offset = offsetof(struct rv1108_cru,
>>> +                            softrst_con[0]);
>>> +        sf_priv->sf_reset_num = 13;
>>> +        sf_child->priv = sf_priv;
>>> +    }
>>> +
>>>    return 0;
>>> }


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2017-11-27 14:50 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-03  7:43 [U-Boot] [RESEND PATCH 1/2] drivers/reset: support rockchip reset drivers Kever Yang
2017-11-03  7:43 ` [U-Boot] [RESEND PATCH 2/2] rockchip: clk: add device_bind_driver_to_node for reset driver Kever Yang
2017-11-07 13:54   ` [U-Boot] [U-Boot, RESEND, " Philipp Tomsich
2017-11-21 22:55   ` Philipp Tomsich
2017-11-27 10:15     ` Kever Yang
2017-11-27 14:50       ` Dr. Philipp Tomsich
2017-11-07 13:54 ` [U-Boot] [U-Boot, RESEND, 1/2] drivers/reset: support rockchip reset drivers Philipp Tomsich
2017-11-21 22:52 ` Philipp Tomsich
2017-11-27 10:26   ` Kever Yang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.