Message ID | 1509694983-9007-2-git-send-email-kever.yang@rock-chips.com |
---|---|
State | Changes Requested |
Delegated to: | Philipp Tomsich |
Headers | show |
Series | [U-Boot,RESEND,1/2] drivers/reset: support rockchip reset drivers | expand |
> 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>
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; > } > >
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; >> } >> >> >
> 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; >>> }
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; }