diff mbox series

[1/2] clk: versal: Add support for CLK_AUTO_ID

Message ID 647f1d2c7d274c1106558a655386ef92e0baf2c8.1762778011.git.michal.simek@amd.com
State New
Delegated to: Michal Simek
Headers show
Series [1/2] clk: versal: Add support for CLK_AUTO_ID | expand

Commit Message

Michal Simek Nov. 10, 2025, 12:33 p.m. UTC
When CLK_AUTO_ID is enabled 8 higher bits of clk->id is unique clock
identifier in clk uclass that's why it is necessary to mask lower bits
which are clock ID.
Also check that ID not bigger then maximum supported clock.

Signed-off-by: Michal Simek <michal.simek@amd.com>
---

 drivers/clk/clk_versal.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

Comments

Michal Simek Nov. 26, 2025, 8:09 a.m. UTC | #1
On 11/10/25 13:33, Michal Simek wrote:
> When CLK_AUTO_ID is enabled 8 higher bits of clk->id is unique clock
> identifier in clk uclass that's why it is necessary to mask lower bits
> which are clock ID.
> Also check that ID not bigger then maximum supported clock.
> 
> Signed-off-by: Michal Simek <michal.simek@amd.com>
> ---
> 
>   drivers/clk/clk_versal.c | 16 +++++++++++++---
>   1 file changed, 13 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/clk/clk_versal.c b/drivers/clk/clk_versal.c
> index 339676f1e4f4..139f429d609b 100644
> --- a/drivers/clk/clk_versal.c
> +++ b/drivers/clk/clk_versal.c
> @@ -731,10 +731,13 @@ static int versal_clk_probe(struct udevice *dev)
>   static ulong versal_clk_get_rate(struct clk *clk)
>   {
>   	struct versal_clk_priv *priv = dev_get_priv(clk->dev);
> -	u32 id = clk->id;
> +	u32 id = clk_get_id(clk);
>   	u32 clk_id;
>   	u64 clk_rate = 0;
>   
> +	if (id >= clock_max_idx)
> +		return -ENODEV;
> +
>   	debug("%s\n", __func__);
>   
>   	clk_id = priv->clk[id].clk_id;
> @@ -747,7 +750,7 @@ static ulong versal_clk_get_rate(struct clk *clk)
>   static ulong versal_clk_set_rate(struct clk *clk, ulong rate)
>   {
>   	struct versal_clk_priv *priv = dev_get_priv(clk->dev);
> -	u32 id = clk->id;
> +	u32 id = clk_get_id(clk);
>   	u32 clk_id;
>   	u64 clk_rate = 0;
>   	u32 div;
> @@ -755,6 +758,9 @@ static ulong versal_clk_set_rate(struct clk *clk, ulong rate)
>   
>   	debug("%s\n", __func__);
>   
> +	if (id >= clock_max_idx)
> +		return -ENODEV;
> +
>   	clk_id = priv->clk[id].clk_id;
>   
>   	ret = versal_clock_get_rate(clk_id, &clk_rate);
> @@ -785,9 +791,13 @@ static ulong versal_clk_set_rate(struct clk *clk, ulong rate)
>   static int versal_clk_enable(struct clk *clk)
>   {
>   	struct versal_clk_priv *priv = dev_get_priv(clk->dev);
> +	u32 id = clk_get_id(clk);
>   	u32 clk_id;
>   
> -	clk_id = priv->clk[clk->id].clk_id;
> +	if (id >= clock_max_idx)
> +		return -ENODEV;
> +
> +	clk_id = priv->clk[id].clk_id;
>   
>   	if (versal_clock_gate(clk_id)) {
>   		return xilinx_pm_request(PM_CLOCK_ENABLE, clk_id, 0, 0, 0,

Applied.
M
diff mbox series

Patch

diff --git a/drivers/clk/clk_versal.c b/drivers/clk/clk_versal.c
index 339676f1e4f4..139f429d609b 100644
--- a/drivers/clk/clk_versal.c
+++ b/drivers/clk/clk_versal.c
@@ -731,10 +731,13 @@  static int versal_clk_probe(struct udevice *dev)
 static ulong versal_clk_get_rate(struct clk *clk)
 {
 	struct versal_clk_priv *priv = dev_get_priv(clk->dev);
-	u32 id = clk->id;
+	u32 id = clk_get_id(clk);
 	u32 clk_id;
 	u64 clk_rate = 0;
 
+	if (id >= clock_max_idx)
+		return -ENODEV;
+
 	debug("%s\n", __func__);
 
 	clk_id = priv->clk[id].clk_id;
@@ -747,7 +750,7 @@  static ulong versal_clk_get_rate(struct clk *clk)
 static ulong versal_clk_set_rate(struct clk *clk, ulong rate)
 {
 	struct versal_clk_priv *priv = dev_get_priv(clk->dev);
-	u32 id = clk->id;
+	u32 id = clk_get_id(clk);
 	u32 clk_id;
 	u64 clk_rate = 0;
 	u32 div;
@@ -755,6 +758,9 @@  static ulong versal_clk_set_rate(struct clk *clk, ulong rate)
 
 	debug("%s\n", __func__);
 
+	if (id >= clock_max_idx)
+		return -ENODEV;
+
 	clk_id = priv->clk[id].clk_id;
 
 	ret = versal_clock_get_rate(clk_id, &clk_rate);
@@ -785,9 +791,13 @@  static ulong versal_clk_set_rate(struct clk *clk, ulong rate)
 static int versal_clk_enable(struct clk *clk)
 {
 	struct versal_clk_priv *priv = dev_get_priv(clk->dev);
+	u32 id = clk_get_id(clk);
 	u32 clk_id;
 
-	clk_id = priv->clk[clk->id].clk_id;
+	if (id >= clock_max_idx)
+		return -ENODEV;
+
+	clk_id = priv->clk[id].clk_id;
 
 	if (versal_clock_gate(clk_id)) {
 		return xilinx_pm_request(PM_CLOCK_ENABLE, clk_id, 0, 0, 0,