diff mbox series

i2c: qcom-geni: fix missing clk_disable_unprepare() and geni_se_resources_off()

Message ID 20231130014324.2483816-1-yangyingliang@huaweicloud.com
State New
Headers show
Series i2c: qcom-geni: fix missing clk_disable_unprepare() and geni_se_resources_off() | expand

Commit Message

Yang Yingliang Nov. 30, 2023, 1:43 a.m. UTC
From: Yang Yingliang <yangyingliang@huawei.com>

Add missing clk_disable_unprepare() and geni_se_resources_off() in the error
path in geni_i2c_probe().

Fixes: 14d02fbadb5d ("i2c: qcom-geni: add desc struct to prepare support for I2C Master Hub variant")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 drivers/i2c/busses/i2c-qcom-geni.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Andi Shyti Dec. 3, 2023, 10:13 p.m. UTC | #1
Hi Yang,

On Thu, Nov 30, 2023 at 09:43:24AM +0800, Yang Yingliang wrote:
> From: Yang Yingliang <yangyingliang@huawei.com>
> 
> Add missing clk_disable_unprepare() and geni_se_resources_off() in the error
> path in geni_i2c_probe().
> 
> Fixes: 14d02fbadb5d ("i2c: qcom-geni: add desc struct to prepare support for I2C Master Hub variant")
> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
> ---
>  drivers/i2c/busses/i2c-qcom-geni.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c
> index 6d829ed2f868..0d2e7171e3a6 100644
> --- a/drivers/i2c/busses/i2c-qcom-geni.c
> +++ b/drivers/i2c/busses/i2c-qcom-geni.c
> @@ -858,6 +858,7 @@ static int geni_i2c_probe(struct platform_device *pdev)
>  	ret = geni_se_resources_on(&gi2c->se);
>  	if (ret) {
>  		dev_err(dev, "Error turning on resources %d\n", ret);
> +		clk_disable_unprepare(gi2c->core_clk);
>  		return ret;
>  	}
>  	proto = geni_se_read_proto(&gi2c->se);
> @@ -877,8 +878,11 @@ static int geni_i2c_probe(struct platform_device *pdev)
>  		/* FIFO is disabled, so we can only use GPI DMA */
>  		gi2c->gpi_mode = true;
>  		ret = setup_gpi_dma(gi2c);
> -		if (ret)
> +		if (ret) {
> +			geni_se_resources_off(&gi2c->se);
> +			clk_disable_unprepare(gi2c->core_clk);
>  			return dev_err_probe(dev, ret, "Failed to setup GPI DMA mode\n");
> +		}
>  
>  		dev_dbg(dev, "Using GPI DMA mode for I2C\n");
>  	} else {
> @@ -891,6 +895,8 @@ static int geni_i2c_probe(struct platform_device *pdev)
>  
>  		if (!tx_depth) {
>  			dev_err(dev, "Invalid TX FIFO depth\n");
> +			geni_se_resources_off(&gi2c->se);
> +			clk_disable_unprepare(gi2c->core_clk);

The exit path of this probe is a complete mess... anyway, even
though I think there are better ways to deal with this, I
consider this patch as an improvement.

Reviewed-by: Andi Shyti <andi.shyti@kernel.org>

Thanks,
Andi

>  			return -EINVAL;
>  		}
>  
> -- 
> 2.25.1
>
Wolfram Sang Dec. 19, 2023, 5:15 p.m. UTC | #2
On Thu, Nov 30, 2023 at 09:43:24AM +0800, Yang Yingliang wrote:
> From: Yang Yingliang <yangyingliang@huawei.com>
> 
> Add missing clk_disable_unprepare() and geni_se_resources_off() in the error
> path in geni_i2c_probe().
> 
> Fixes: 14d02fbadb5d ("i2c: qcom-geni: add desc struct to prepare support for I2C Master Hub variant")
> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>

Applied to for-current, thanks!
diff mbox series

Patch

diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c
index 6d829ed2f868..0d2e7171e3a6 100644
--- a/drivers/i2c/busses/i2c-qcom-geni.c
+++ b/drivers/i2c/busses/i2c-qcom-geni.c
@@ -858,6 +858,7 @@  static int geni_i2c_probe(struct platform_device *pdev)
 	ret = geni_se_resources_on(&gi2c->se);
 	if (ret) {
 		dev_err(dev, "Error turning on resources %d\n", ret);
+		clk_disable_unprepare(gi2c->core_clk);
 		return ret;
 	}
 	proto = geni_se_read_proto(&gi2c->se);
@@ -877,8 +878,11 @@  static int geni_i2c_probe(struct platform_device *pdev)
 		/* FIFO is disabled, so we can only use GPI DMA */
 		gi2c->gpi_mode = true;
 		ret = setup_gpi_dma(gi2c);
-		if (ret)
+		if (ret) {
+			geni_se_resources_off(&gi2c->se);
+			clk_disable_unprepare(gi2c->core_clk);
 			return dev_err_probe(dev, ret, "Failed to setup GPI DMA mode\n");
+		}
 
 		dev_dbg(dev, "Using GPI DMA mode for I2C\n");
 	} else {
@@ -891,6 +895,8 @@  static int geni_i2c_probe(struct platform_device *pdev)
 
 		if (!tx_depth) {
 			dev_err(dev, "Invalid TX FIFO depth\n");
+			geni_se_resources_off(&gi2c->se);
+			clk_disable_unprepare(gi2c->core_clk);
 			return -EINVAL;
 		}