diff mbox series

[7/7] reset: sunxi: Reuse the platform data from the clock driver

Message ID 20220509052937.42283-8-samuel@sholland.org
State Accepted
Commit 66391263f8484aae41cae80753f31c0edc6138af
Delegated to: Andre Przywara
Headers show
Series clk: sunxi: Out-of-bounds access fix and driver cleanup | expand

Commit Message

Samuel Holland May 9, 2022, 5:29 a.m. UTC
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 <samuel@sholland.org>
---

 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(-)

Comments

Andre Przywara June 27, 2022, 11:45 p.m. UTC | #1
On Mon,  9 May 2022 00:29:37 -0500
Samuel Holland <samuel@sholland.org> wrote:

Hi,

> 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 <samuel@sholland.org>

I am not too familiar with U-Boot's DM internals (device_bind()), but
the idea is certainly good, and it seems to work, so I am happy with
that.

Acked-by: Andre Przywara <andre.przywara@arm.com>

Cheers,
Andre


> ---
> 
>  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(-)
> 
> diff --git a/drivers/clk/sunxi/clk_sunxi.c b/drivers/clk/sunxi/clk_sunxi.c
> index cadfca767b..10c5d2f4b6 100644
> --- a/drivers/clk/sunxi/clk_sunxi.c
> +++ b/drivers/clk/sunxi/clk_sunxi.c
> @@ -12,9 +12,12 @@
>  #include <reset.h>
>  #include <asm/io.h>
>  #include <clk/sunxi.h>
> +#include <dm/device-internal.h>
>  #include <linux/bitops.h>
>  #include <linux/log2.h>
>  
> +extern U_BOOT_DRIVER(sunxi_reset);
> +
>  static const struct ccu_clk_gate *plat_to_gate(struct ccu_plat *plat,
>  					       unsigned long id)
>  {
> @@ -66,7 +69,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 b060d7f5ed..5d4b8dc92f 100644
> --- a/drivers/reset/reset-sunxi.c
> +++ b/drivers/reset/reset-sunxi.c
> @@ -12,17 +12,10 @@
>  #include <reset-uclass.h>
>  #include <asm/io.h>
>  #include <clk/sunxi.h>
> -#include <dm/device-internal.h>
> -#include <dm/lists.h>
>  #include <linux/bitops.h>
>  #include <linux/log2.h>
>  
> -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);
>  
> @@ -49,7 +42,7 @@ static int sunxi_reset_free(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;
>  
> @@ -89,38 +82,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 e90e078972..b9587050d9 100644
> --- a/include/clk/sunxi.h
> +++ b/include/clk/sunxi.h
> @@ -82,12 +82,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 */
diff mbox series

Patch

diff --git a/drivers/clk/sunxi/clk_sunxi.c b/drivers/clk/sunxi/clk_sunxi.c
index cadfca767b..10c5d2f4b6 100644
--- a/drivers/clk/sunxi/clk_sunxi.c
+++ b/drivers/clk/sunxi/clk_sunxi.c
@@ -12,9 +12,12 @@ 
 #include <reset.h>
 #include <asm/io.h>
 #include <clk/sunxi.h>
+#include <dm/device-internal.h>
 #include <linux/bitops.h>
 #include <linux/log2.h>
 
+extern U_BOOT_DRIVER(sunxi_reset);
+
 static const struct ccu_clk_gate *plat_to_gate(struct ccu_plat *plat,
 					       unsigned long id)
 {
@@ -66,7 +69,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 b060d7f5ed..5d4b8dc92f 100644
--- a/drivers/reset/reset-sunxi.c
+++ b/drivers/reset/reset-sunxi.c
@@ -12,17 +12,10 @@ 
 #include <reset-uclass.h>
 #include <asm/io.h>
 #include <clk/sunxi.h>
-#include <dm/device-internal.h>
-#include <dm/lists.h>
 #include <linux/bitops.h>
 #include <linux/log2.h>
 
-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);
 
@@ -49,7 +42,7 @@  static int sunxi_reset_free(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;
 
@@ -89,38 +82,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 e90e078972..b9587050d9 100644
--- a/include/clk/sunxi.h
+++ b/include/clk/sunxi.h
@@ -82,12 +82,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 */