> On 27 Nov 2017, at 11:15, Kever Yang wrote: > > Philipp, > > > On 11/22/2017 06:55 AM, Philipp Tomsich wrote: >> >> >> On Fri, 3 Nov 2017, Kever Yang wrote: >> >>> From: Elaine Zhang >>> >>> all rockchip socs add device_bind_driver_to_node, >>> to bound device rockchip reset to clock-controller. >>> >>> Signed-off-by: Elaine Zhang >>> Signed-off-by: Kever Yang >>> Acked-by: Philipp Tomsich >> >> Reviewed-by: Philipp Tomsich >> >> 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; >>> }