From d39088ad9c97fa612c480475b18759a3931c41fd Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Mon, 9 May 2022 00:29:33 -0500 Subject: reset: sunxi: Get the reset count from the CCU descriptor This allows all of the clock drivers to use a common bind function. Signed-off-by: Samuel Holland Reviewed-by: Andre Przywara [Andre: add F1C100s support] Signed-off-by: Andre Przywara --- drivers/reset/reset-sunxi.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'drivers/reset') diff --git a/drivers/reset/reset-sunxi.c b/drivers/reset/reset-sunxi.c index e2a9c2a142b..621912ad237 100644 --- a/drivers/reset/reset-sunxi.c +++ b/drivers/reset/reset-sunxi.c @@ -19,7 +19,6 @@ struct sunxi_reset_priv { void *base; - ulong count; const struct ccu_desc *desc; }; @@ -35,7 +34,7 @@ static int sunxi_reset_request(struct reset_ctl *reset_ctl) debug("%s: (RST#%ld)\n", __func__, reset_ctl->id); - if (reset_ctl->id >= priv->count) + if (reset_ctl->id >= priv->desc->num_resets) return -EINVAL; return 0; @@ -91,7 +90,7 @@ static int sunxi_reset_probe(struct udevice *dev) return 0; } -int sunxi_reset_bind(struct udevice *dev, ulong count) +int sunxi_reset_bind(struct udevice *dev) { struct udevice *rst_dev; struct sunxi_reset_priv *priv; @@ -104,7 +103,6 @@ int sunxi_reset_bind(struct udevice *dev, ulong count) return ret; } priv = malloc(sizeof(struct sunxi_reset_priv)); - priv->count = count; priv->desc = (const struct ccu_desc *)dev_get_driver_data(dev); dev_set_priv(rst_dev, priv); -- cgit v1.3.1 From 3fb1988aad29185409a9e05a1111b7e2b7e5f8fc Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Mon, 9 May 2022 00:29:36 -0500 Subject: reset: sunxi: Convert driver private data to platform data The reason here is the same as the reason for changing the clock driver: platform data can be provided when binding the driver. Signed-off-by: Samuel Holland Reviewed-by: Andre Przywara Signed-off-by: Andre Przywara --- drivers/reset/reset-sunxi.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'drivers/reset') diff --git a/drivers/reset/reset-sunxi.c b/drivers/reset/reset-sunxi.c index 621912ad237..f5c66dde43a 100644 --- a/drivers/reset/reset-sunxi.c +++ b/drivers/reset/reset-sunxi.c @@ -17,24 +17,24 @@ #include #include -struct sunxi_reset_priv { +struct sunxi_reset_plat { void *base; const struct ccu_desc *desc; }; -static const struct ccu_reset *priv_to_reset(struct sunxi_reset_priv *priv, +static const struct ccu_reset *plat_to_reset(struct sunxi_reset_plat *plat, unsigned long id) { - return &priv->desc->resets[id]; + return &plat->desc->resets[id]; } static int sunxi_reset_request(struct reset_ctl *reset_ctl) { - struct sunxi_reset_priv *priv = dev_get_priv(reset_ctl->dev); + struct sunxi_reset_plat *plat = dev_get_plat(reset_ctl->dev); debug("%s: (RST#%ld)\n", __func__, reset_ctl->id); - if (reset_ctl->id >= priv->desc->num_resets) + if (reset_ctl->id >= plat->desc->num_resets) return -EINVAL; return 0; @@ -42,8 +42,8 @@ static int sunxi_reset_request(struct reset_ctl *reset_ctl) static int sunxi_set_reset(struct reset_ctl *reset_ctl, bool on) { - struct sunxi_reset_priv *priv = dev_get_priv(reset_ctl->dev); - const struct ccu_reset *reset = priv_to_reset(priv, reset_ctl->id); + struct sunxi_reset_plat *plat = dev_get_plat(reset_ctl->dev); + const struct ccu_reset *reset = plat_to_reset(plat, reset_ctl->id); u32 reg; if (!(reset->flags & CCU_RST_F_IS_VALID)) { @@ -54,13 +54,13 @@ static int sunxi_set_reset(struct reset_ctl *reset_ctl, bool on) debug("%s: (RST#%ld) off#0x%x, BIT(%d)\n", __func__, reset_ctl->id, reset->off, ilog2(reset->bit)); - reg = readl(priv->base + reset->off); + reg = readl(plat->base + reset->off); if (on) reg |= reset->bit; else reg &= ~reset->bit; - writel(reg, priv->base + reset->off); + writel(reg, plat->base + reset->off); return 0; } @@ -81,11 +81,11 @@ struct reset_ops sunxi_reset_ops = { .rst_deassert = sunxi_reset_deassert, }; -static int sunxi_reset_probe(struct udevice *dev) +static int sunxi_reset_of_to_plat(struct udevice *dev) { - struct sunxi_reset_priv *priv = dev_get_priv(dev); + struct sunxi_reset_plat *plat = dev_get_plat(dev); - priv->base = dev_read_addr_ptr(dev); + plat->base = dev_read_addr_ptr(dev); return 0; } @@ -93,7 +93,7 @@ static int sunxi_reset_probe(struct udevice *dev) int sunxi_reset_bind(struct udevice *dev) { struct udevice *rst_dev; - struct sunxi_reset_priv *priv; + struct sunxi_reset_plat *plat; int ret; ret = device_bind_driver_to_node(dev, "sunxi_reset", "reset", @@ -102,9 +102,9 @@ int sunxi_reset_bind(struct udevice *dev) debug("failed to bind sunxi_reset driver (ret=%d)\n", ret); return ret; } - priv = malloc(sizeof(struct sunxi_reset_priv)); - priv->desc = (const struct ccu_desc *)dev_get_driver_data(dev); - dev_set_priv(rst_dev, priv); + plat = malloc(sizeof(struct sunxi_reset_plat)); + plat->desc = (const struct ccu_desc *)dev_get_driver_data(dev); + dev_set_plat(rst_dev, plat); return 0; } @@ -113,6 +113,6 @@ U_BOOT_DRIVER(sunxi_reset) = { .name = "sunxi_reset", .id = UCLASS_RESET, .ops = &sunxi_reset_ops, - .probe = sunxi_reset_probe, - .priv_auto = sizeof(struct sunxi_reset_priv), + .of_to_plat = sunxi_reset_of_to_plat, + .plat_auto = sizeof(struct sunxi_reset_plat), }; -- cgit v1.3.1 From 66391263f8484aae41cae80753f31c0edc6138af Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Mon, 9 May 2022 00:29:37 -0500 Subject: reset: sunxi: Reuse the platform data from the clock driver The clock and reset drivers use the exact same platform data. Simplify them by sharing the object. This is safe because the parent device (the clock device) always gets its driver model callbacks run first. Signed-off-by: Samuel Holland Acked-by: Andre Przywara Signed-off-by: Andre Przywara --- drivers/clk/sunxi/clk_sunxi.c | 7 ++++++- drivers/reset/reset-sunxi.c | 43 +++---------------------------------------- include/clk/sunxi.h | 8 -------- 3 files changed, 9 insertions(+), 49 deletions(-) (limited to 'drivers/reset') diff --git a/drivers/clk/sunxi/clk_sunxi.c b/drivers/clk/sunxi/clk_sunxi.c index 5b208c9b34b..ec02a2d0370 100644 --- a/drivers/clk/sunxi/clk_sunxi.c +++ b/drivers/clk/sunxi/clk_sunxi.c @@ -12,9 +12,12 @@ #include #include #include +#include #include #include +extern U_BOOT_DRIVER(sunxi_reset); + static const struct ccu_clk_gate *plat_to_gate(struct ccu_plat *plat, unsigned long id) { @@ -69,7 +72,9 @@ struct clk_ops sunxi_clk_ops = { static int sunxi_clk_bind(struct udevice *dev) { - return sunxi_reset_bind(dev); + /* Reuse the platform data for the reset driver. */ + return device_bind(dev, DM_DRIVER_REF(sunxi_reset), "reset", + dev_get_plat(dev), dev_ofnode(dev), NULL); } static int sunxi_clk_probe(struct udevice *dev) diff --git a/drivers/reset/reset-sunxi.c b/drivers/reset/reset-sunxi.c index f5c66dde43a..e484d1fff44 100644 --- a/drivers/reset/reset-sunxi.c +++ b/drivers/reset/reset-sunxi.c @@ -12,17 +12,10 @@ #include #include #include -#include -#include #include #include -struct sunxi_reset_plat { - void *base; - const struct ccu_desc *desc; -}; - -static const struct ccu_reset *plat_to_reset(struct sunxi_reset_plat *plat, +static const struct ccu_reset *plat_to_reset(struct ccu_plat *plat, unsigned long id) { return &plat->desc->resets[id]; @@ -30,7 +23,7 @@ static const struct ccu_reset *plat_to_reset(struct sunxi_reset_plat *plat, static int sunxi_reset_request(struct reset_ctl *reset_ctl) { - struct sunxi_reset_plat *plat = dev_get_plat(reset_ctl->dev); + struct ccu_plat *plat = dev_get_plat(reset_ctl->dev); debug("%s: (RST#%ld)\n", __func__, reset_ctl->id); @@ -42,7 +35,7 @@ static int sunxi_reset_request(struct reset_ctl *reset_ctl) static int sunxi_set_reset(struct reset_ctl *reset_ctl, bool on) { - struct sunxi_reset_plat *plat = dev_get_plat(reset_ctl->dev); + struct ccu_plat *plat = dev_get_plat(reset_ctl->dev); const struct ccu_reset *reset = plat_to_reset(plat, reset_ctl->id); u32 reg; @@ -81,38 +74,8 @@ struct reset_ops sunxi_reset_ops = { .rst_deassert = sunxi_reset_deassert, }; -static int sunxi_reset_of_to_plat(struct udevice *dev) -{ - struct sunxi_reset_plat *plat = dev_get_plat(dev); - - plat->base = dev_read_addr_ptr(dev); - - return 0; -} - -int sunxi_reset_bind(struct udevice *dev) -{ - struct udevice *rst_dev; - struct sunxi_reset_plat *plat; - int ret; - - ret = device_bind_driver_to_node(dev, "sunxi_reset", "reset", - dev_ofnode(dev), &rst_dev); - if (ret) { - debug("failed to bind sunxi_reset driver (ret=%d)\n", ret); - return ret; - } - plat = malloc(sizeof(struct sunxi_reset_plat)); - plat->desc = (const struct ccu_desc *)dev_get_driver_data(dev); - dev_set_plat(rst_dev, plat); - - return 0; -} - U_BOOT_DRIVER(sunxi_reset) = { .name = "sunxi_reset", .id = UCLASS_RESET, .ops = &sunxi_reset_ops, - .of_to_plat = sunxi_reset_of_to_plat, - .plat_auto = sizeof(struct sunxi_reset_plat), }; diff --git a/include/clk/sunxi.h b/include/clk/sunxi.h index 640b5cfc331..c298195c51e 100644 --- a/include/clk/sunxi.h +++ b/include/clk/sunxi.h @@ -87,12 +87,4 @@ struct ccu_plat { extern struct clk_ops sunxi_clk_ops; -/** - * sunxi_reset_bind() - reset binding - * - * @dev: reset device - * Return: 0 success, or error value - */ -int sunxi_reset_bind(struct udevice *dev); - #endif /* _CLK_SUNXI_H */ -- cgit v1.3.1