Skip to contentSkip to conversation

mmc: pxamci: Simplify pxamci_probe() error handling using devm APIs

PATCH Superseded Rakuram Eswaran 3 participants 8 messages Oct 14, 2025 – Oct 23, 2025 2 messages not in the archive MMC, SD and SDIO

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 mmc: pxamci: Simplify pxamci_probe() error handling using devm APIs

This patch refactors pxamci_probe() to use devm-managed resource allocation (e.g. devm_dma_request_chan()) and dev_err_probe() for improved readability and automatic cleanup on probe failure.

This eliminates redundant NULL assignments and manual release logic.

This issue was originally reported by Smatch:
drivers/mmc/host/pxamci.c:709 pxamci_probe() warn: passing zero to 'PTR_ERR'

The warning occurred because a pointer was set to NULL before using PTR_ERR(), leading to PTR_ERR(0) and an incorrect 0 return value. This refactor eliminates that condition while improving overall error handling robustness.

---

Changes since v1:
Following Uwe Kleine-König’s suggestion:
- Replaced dma_request_chan() with devm_dma_request_chan() to make DMA channel allocation devm-managed and avoid manual release paths.
- Used dev_err_probe() for improved error reporting and consistent probe failure handling.
- Removed redundant NULL assignments and obsolete goto-based cleanup logic.
- Updated commit message to better describe the intent of the change.

Testing note:
I do not have access to appropriate hardware for runtime testing. Any help verifying on actual hardware would be appreciated.

Build and Analysis:
This patch was compiled against the configuration file reported by 0day CI in the above link (config: s390-randconfig-r071-20251004) using s390x-linux-gnu-gcc (Ubuntu 14.2.0-19ubuntu2) 14.2.0.

Static analysis was performed with Smatch to ensure the reported warning no longer reproduces after applying this fix.

Command used for verification:
ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- \
~/project/smatch/smatch_scripts/kchecker ./drivers/mmc/host/pxamci.c

 drivers/mmc/host/pxamci.c | 57 +++++++++++++++------------------------
 1 file changed, 21 insertions(+), 36 deletions(-)
drivers/mmc/host/pxamci.c +21 -36
index 26d03352af63..d03388f64934 100644
@@ -652,11 +652,14 @@ static int pxamci_probe(struct platform_device *pdev)
 	host->clkrt = CLKRT_OFF;
 
 	host->clk = devm_clk_get(dev, NULL);
-	if (IS_ERR(host->clk)) {
-		host->clk = NULL;
-		return PTR_ERR(host->clk);
-	}
+	if (IS_ERR(host->clk))
+		return dev_err_probe(dev, PTR_ERR(host->clk),
+				     "Failed to acquire clock\n");
 
+	/*
+	 * Note that the return value of clk_get_rate() is only valid
+	 * if the clock is enabled.
+	 */
 	host->clkrate = clk_get_rate(host->clk);
 
 	/*
@@ -703,46 +706,36 @@ static int pxamci_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, mmc);
 
-	host->dma_chan_rx = dma_request_chan(dev, "rx");
-	if (IS_ERR(host->dma_chan_rx)) {
-		host->dma_chan_rx = NULL;
+	host->dma_chan_rx = devm_dma_request_chan(dev, "rx");
+	if (IS_ERR(host->dma_chan_rx))
 		return dev_err_probe(dev, PTR_ERR(host->dma_chan_rx),
 				     "unable to request rx dma channel\n");
-	}
 
-	host->dma_chan_tx = dma_request_chan(dev, "tx");
-	if (IS_ERR(host->dma_chan_tx)) {
-		dev_err(dev, "unable to request tx dma channel\n");
-		ret = PTR_ERR(host->dma_chan_tx);
-		host->dma_chan_tx = NULL;
-		goto out;
-	}
+	host->dma_chan_tx = devm_dma_request_chan(dev, "tx");
+	if (IS_ERR(host->dma_chan_tx))
+		return dev_err_probe(dev, PTR_ERR(host->dma_chan_tx),
+				     "unable to request tx dma channel\n");
 
 	if (host->pdata) {
 		host->detect_delay_ms = host->pdata->detect_delay_ms;
 
 		host->power = devm_gpiod_get_optional(dev, "power", GPIOD_OUT_LOW);
-		if (IS_ERR(host->power)) {
-			ret = PTR_ERR(host->power);
-			dev_err(dev, "Failed requesting gpio_power\n");
-			goto out;
-		}
+		if (IS_ERR(host->power))
+			return dev_err_probe(dev, PTR_ERR(host->power),
+						"Failed requesting gpio_power\n");
 
 		/* FIXME: should we pass detection delay to debounce? */
 		ret = mmc_gpiod_request_cd(mmc, "cd", 0, false, 0);
-		if (ret && ret != -ENOENT) {
-			dev_err(dev, "Failed requesting gpio_cd\n");
-			goto out;
-		}
+		if (ret && ret != -ENOENT)
+			return dev_err_probe(dev, ret, "Failed requesting gpio_cd\n");
 
 		if (!host->pdata->gpio_card_ro_invert)
 			mmc->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
 
 		ret = mmc_gpiod_request_ro(mmc, "wp", 0, 0);
-		if (ret && ret != -ENOENT) {
-			dev_err(dev, "Failed requesting gpio_ro\n");
-			goto out;
-		}
+		if (ret && ret != -ENOENT)
+			return dev_err_probe(dev, ret, "Failed requesting gpio_ro\n");
+
 		if (!ret)
 			host->use_ro_gpio = true;
 
@@ -759,16 +752,8 @@ static int pxamci_probe(struct platform_device *pdev)
 	if (ret) {
 		if (host->pdata && host->pdata->exit)
 			host->pdata->exit(dev, mmc);
-		goto out;
 	}
 
-	return 0;
-
-out:
-	if (host->dma_chan_rx)
-		dma_release_channel(host->dma_chan_rx);
-	if (host->dma_chan_tx)
-		dma_release_channel(host->dma_chan_tx);
 	return ret;
 }
 
Signature · 1 line
2.48.1
Reviewed-by on v2 1/1
#1 lore raw
Quoted 141 lines · Rakuram Eswaran

This patch refactors pxamci_probe() to use devm-managed resource allocation (e.g. devm_dma_request_chan()) and dev_err_probe() for improved readability and automatic cleanup on probe failure.

This eliminates redundant NULL assignments and manual release logic.

This issue was originally reported by Smatch:
drivers/mmc/host/pxamci.c:709 pxamci_probe() warn: passing zero to 'PTR_ERR'

The warning occurred because a pointer was set to NULL before using PTR_ERR(), leading to PTR_ERR(0) and an incorrect 0 return value. This refactor eliminates that condition while improving overall error handling robustness.

---

Changes since v1:
Following Uwe Kleine-König’s suggestion:
- Replaced dma_request_chan() with devm_dma_request_chan() to make DMA channel allocation devm-managed and avoid manual release paths.
- Used dev_err_probe() for improved error reporting and consistent probe failure handling.
- Removed redundant NULL assignments and obsolete goto-based cleanup logic.
- Updated commit message to better describe the intent of the change.

Testing note:
I do not have access to appropriate hardware for runtime testing. Any help verifying on actual hardware would be appreciated.

Build and Analysis:
This patch was compiled against the configuration file reported by 0day CI in the above link (config: s390-randconfig-r071-20251004) using s390x-linux-gnu-gcc (Ubuntu 14.2.0-19ubuntu2) 14.2.0.

Static analysis was performed with Smatch to ensure the reported warning no longer reproduces after applying this fix.

Command used for verification:

   ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- \
   ~/project/smatch/smatch_scripts/kchecker ./drivers/mmc/host/pxamci.c
  drivers/mmc/host/pxamci.c | 57 +++++++++++++++------------------------
  1 file changed, 21 insertions(+), 36 deletions(-)
drivers/mmc/host/pxamci.c +21 -29
index 26d03352af63..d03388f64934 100644
@@ -652,11 +652,14 @@ static int pxamci_probe(struct platform_device *pdev)
  	host->clkrt = CLKRT_OFF;
 
  	host->clk = devm_clk_get(dev, NULL);
-	if (IS_ERR(host->clk)) {
-		host->clk = NULL;
-		return PTR_ERR(host->clk);
-	}
+	if (IS_ERR(host->clk))
+		return dev_err_probe(dev, PTR_ERR(host->clk),
+				     "Failed to acquire clock\n");
 
+	/*
+	 * Note that the return value of clk_get_rate() is only valid
+	 * if the clock is enabled.
+	 */
  	host->clkrate = clk_get_rate(host->clk);
 
  	/*
@@ -703,46 +706,36 @@ static int pxamci_probe(struct platform_device *pdev)
 
  	platform_set_drvdata(pdev, mmc);
 
-	host->dma_chan_rx = dma_request_chan(dev, "rx");
-	if (IS_ERR(host->dma_chan_rx)) {
-		host->dma_chan_rx = NULL;
+	host->dma_chan_rx = devm_dma_request_chan(dev, "rx");
+	if (IS_ERR(host->dma_chan_rx))
  		return dev_err_probe(dev, PTR_ERR(host->dma_chan_rx),
  				     "unable to request rx dma channel\n");
-	}
 
-	host->dma_chan_tx = dma_request_chan(dev, "tx");
-	if (IS_ERR(host->dma_chan_tx)) {
-		dev_err(dev, "unable to request tx dma channel\n");
-		ret = PTR_ERR(host->dma_chan_tx);
-		host->dma_chan_tx = NULL;
-		goto out;
-	}
+	host->dma_chan_tx = devm_dma_request_chan(dev, "tx");
+	if (IS_ERR(host->dma_chan_tx))
+		return dev_err_probe(dev, PTR_ERR(host->dma_chan_tx),
+				     "unable to request tx dma channel\n");
 
  	if (host->pdata) {
  		host->detect_delay_ms = host->pdata->detect_delay_ms;
 
  		host->power = devm_gpiod_get_optional(dev, "power", GPIOD_OUT_LOW);
-		if (IS_ERR(host->power)) {
-			ret = PTR_ERR(host->power);
-			dev_err(dev, "Failed requesting gpio_power\n");
-			goto out;
-		}
+		if (IS_ERR(host->power))
+			return dev_err_probe(dev, PTR_ERR(host->power),
+						"Failed requesting gpio_power\n");
 
  		/* FIXME: should we pass detection delay to debounce? */
  		ret = mmc_gpiod_request_cd(mmc, "cd", 0, false, 0);
-		if (ret && ret != -ENOENT) {
-			dev_err(dev, "Failed requesting gpio_cd\n");
-			goto out;
-		}
+		if (ret && ret != -ENOENT)
+			return dev_err_probe(dev, ret, "Failed requesting gpio_cd\n");
 
  		if (!host->pdata->gpio_card_ro_invert)
  			mmc->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
 
  		ret = mmc_gpiod_request_ro(mmc, "wp", 0, 0);
-		if (ret && ret != -ENOENT) {
-			dev_err(dev, "Failed requesting gpio_ro\n");
-			goto out;
-		}
+		if (ret && ret != -ENOENT)
+			return dev_err_probe(dev, ret, "Failed requesting gpio_ro\n");
+
  		if (!ret)
  			host->use_ro_gpio = true;
 
@@ -759,16 +752,8 @@ static int pxamci_probe(struct platform_device *pdev)
  	if (ret) {
  		if (host->pdata && host->pdata->exit)
  			host->pdata->exit(dev, mmc);
-		goto out;
  	}
 

drivers/mmc/host/pxamci.c static int pxamci_probe(struct platform_device *pdev) · line 759

Quoted 10 lines
drivers/mmc/host/pxamci.c +0 -7
-	return 0;
-
-out:
-	if (host->dma_chan_rx)
-		dma_release_channel(host->dma_chan_rx);
-	if (host->dma_chan_tx)
-		dma_release_channel(host->dma_chan_tx);
  	return ret;
  }
 

This looks good now.

--
Khalid

#2 lore raw
In reply to Rakuram Eswaran
Quoted 60 lines · Rakuram Eswaran

This patch refactors pxamci_probe() to use devm-managed resource allocation (e.g. devm_dma_request_chan()) and dev_err_probe() for improved readability and automatic cleanup on probe failure.

This eliminates redundant NULL assignments and manual release logic.

This issue was originally reported by Smatch:
drivers/mmc/host/pxamci.c:709 pxamci_probe() warn: passing zero to 'PTR_ERR'

The warning occurred because a pointer was set to NULL before using PTR_ERR(), leading to PTR_ERR(0) and an incorrect 0 return value. This refactor eliminates that condition while improving overall error handling robustness.

---

Changes since v1:
Following Uwe Kleine-König’s suggestion:
- Replaced dma_request_chan() with devm_dma_request_chan() to make DMA channel allocation devm-managed and avoid manual release paths.
- Used dev_err_probe() for improved error reporting and consistent probe failure handling.
- Removed redundant NULL assignments and obsolete goto-based cleanup logic.
- Updated commit message to better describe the intent of the change.

Testing note:
I do not have access to appropriate hardware for runtime testing. Any help verifying on actual hardware would be appreciated.

Build and Analysis:
This patch was compiled against the configuration file reported by 0day CI in the above link (config: s390-randconfig-r071-20251004) using s390x-linux-gnu-gcc (Ubuntu 14.2.0-19ubuntu2) 14.2.0.

Static analysis was performed with Smatch to ensure the reported warning no longer reproduces after applying this fix.

Command used for verification:
ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- \
~/project/smatch/smatch_scripts/kchecker ./drivers/mmc/host/pxamci.c

 drivers/mmc/host/pxamci.c | 57 +++++++++++++++------------------------
 1 file changed, 21 insertions(+), 36 deletions(-)
drivers/mmc/host/pxamci.c +0 -2
index 26d03352af63..d03388f64934 100644
@@ -652,11 +652,14 @@ static int pxamci_probe(struct platform_device *pdev)
 	host->clkrt = CLKRT_OFF;
 
 	host->clk = devm_clk_get(dev, NULL);
-	if (IS_ERR(host->clk)) {
-		host->clk = NULL;

drivers/mmc/host/pxamci.c static int pxamci_probe(struct platform_device *pdev) · line 662

Quoted 10 lines
drivers/mmc/host/pxamci.c +7 -2
-		return PTR_ERR(host->clk);
-	}
+	if (IS_ERR(host->clk))
+		return dev_err_probe(dev, PTR_ERR(host->clk),
+				     "Failed to acquire clock\n");
 
+	/*
+	 * Note that the return value of clk_get_rate() is only valid
+	 * if the clock is enabled.
+	 */

The intention of this comment in my WIP suggestion was to point out another thing to fix as the precondition for calling clk_get_rate() isn't asserted. If you don't want to address this (which is fine), drop the comment (or improve my wording to make it more obvious that there is something to fix).

Quoted 8 lines
drivers/mmc/host/pxamci.c +0 -0
 	host->clkrate = clk_get_rate(host->clk);
 
 	/*
[...]
@@ -759,16 +752,8 @@ static int pxamci_probe(struct platform_device *pdev)
 	if (ret) {
 		if (host->pdata && host->pdata->exit)
 			host->pdata->exit(dev, mmc);

drivers/mmc/host/pxamci.c static int pxamci_probe(struct platform_device *pdev) · line 771

Quoted 10 lines
drivers/mmc/host/pxamci.c +0 -8
-		goto out;
 	}
 
-	return 0;
-
-out:
-	if (host->dma_chan_rx)
-		dma_release_channel(host->dma_chan_rx);
-	if (host->dma_chan_tx)
-		dma_release_channel(host->dma_chan_tx);

I was lazy in my prototype patch and didn't drop the calls to dma_release_channel() in pxamci_remove(). For a proper patch this is required though.

To continue the quest: Now that I looked at pxamci_remove(): mmc is always non-NULL, so the respective check can be dropped.

#3 lore raw
Quoted 68 lines · Uwe Kleine-König
Quoted 66 lines · Rakuram Eswaran

This patch refactors pxamci_probe() to use devm-managed resource allocation (e.g. devm_dma_request_chan()) and dev_err_probe() for improved readability and automatic cleanup on probe failure.

This eliminates redundant NULL assignments and manual release logic.

This issue was originally reported by Smatch:
drivers/mmc/host/pxamci.c:709 pxamci_probe() warn: passing zero to 'PTR_ERR'

The warning occurred because a pointer was set to NULL before using PTR_ERR(), leading to PTR_ERR(0) and an incorrect 0 return value. This refactor eliminates that condition while improving overall error handling robustness.

---

Changes since v1:
Following Uwe Kleine-König’s suggestion:
- Replaced dma_request_chan() with devm_dma_request_chan() to make DMA channel allocation devm-managed and avoid manual release paths.
- Used dev_err_probe() for improved error reporting and consistent probe failure handling.
- Removed redundant NULL assignments and obsolete goto-based cleanup logic.
- Updated commit message to better describe the intent of the change.

Testing note:
I do not have access to appropriate hardware for runtime testing. Any help verifying on actual hardware would be appreciated.

Build and Analysis:
This patch was compiled against the configuration file reported by 0day CI in the above link (config: s390-randconfig-r071-20251004) using s390x-linux-gnu-gcc (Ubuntu 14.2.0-19ubuntu2) 14.2.0.

Static analysis was performed with Smatch to ensure the reported warning no longer reproduces after applying this fix.

Command used for verification:
  ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- \
  ~/project/smatch/smatch_scripts/kchecker ./drivers/mmc/host/pxamci.c

 drivers/mmc/host/pxamci.c | 57 +++++++++++++++------------------------

 1 file changed, 21 insertions(+), 36 deletions(-)
drivers/mmc/host/pxamci.c +3 -4
index 26d03352af63..d03388f64934 100644
@@ -652,11 +652,14 @@ static int pxamci_probe(struct platform_device *pdev)
       host->clkrt = CLKRT_OFF;
 
       host->clk = devm_clk_get(dev, NULL);
-     if (IS_ERR(host->clk)) {
-             host->clk = NULL;
-             return PTR_ERR(host->clk);
-     }
+     if (IS_ERR(host->clk))
+             return dev_err_probe(dev, PTR_ERR(host->clk),
+                                  "Failed to acquire clock\n");
 
Quoted 11 lines

drivers/mmc/host/pxamci.c static int pxamci_probe(struct platform_device *pdev) · line 662

Quoted 4 lines
drivers/mmc/host/pxamci.c +4 -0
+     /*
+      * Note that the return value of clk_get_rate() is only valid
+      * if the clock is enabled.
+      */

The intention of this comment in my WIP suggestion was to point out another thing to fix as the precondition for calling clk_get_rate() isn't asserted. If you don't want to address this (which is fine), drop the comment (or improve my wording to make it more obvious that there is something to fix).

Hi Uwe,

Sorry for the delayed reply as I was in vacation.

Ah, got it — I’ll drop the clk_get_rate() comment since it was only a reminder from your WIP suggestion.

Just to confirm, are you referring to adding a call to clk_prepare_enable() before clk_get_rate()? I can move the clk_get_rate() call after clk_prepare_enable(), or drop the comment entirely.

If my understanding is correct, I’ll keep v3 focused on the current set of fixes and handle the clk_get_rate() precondition (by moving it after clk_prepare_enable()) in a follow-up patch. That should keep the scope of each change clean and review-friendly.

Quoted 6 lines

drivers/mmc/host/pxamci.c static int pxamci_probe(struct platform_device *pdev) · line 771

Quoted 5 lines
drivers/mmc/host/pxamci.c +0 -5
-out:
-     if (host->dma_chan_rx)
-             dma_release_channel(host->dma_chan_rx);
-     if (host->dma_chan_tx)
-             dma_release_channel(host->dma_chan_tx);
Quoted 7 lines

I was lazy in my prototype patch and didn't drop the calls to dma_release_channel() in pxamci_remove(). For a proper patch this is required though.

To continue the quest: Now that I looked at pxamci_remove(): mmc is always non-NULL, so the respective check can be dropped.

Understood. Since pxamci_remove() is only called after successful allocation and initialization in probe(), mmc will always be a valid pointer. I’ll drop the if (mmc) check in v3 as it can never be NULL in normal operation, and remove the dma_release_channel() calls as well.

I’ve prepared a preview of the v3 patch incorporating your previous comments. Before sending it out formally, I wanted to share it with you to confirm that the updates look good — especially the cleanup changes in pxamci_remove() and the dropped clk_get_rate() comment.

static void pxamci_remove(struct platform_device *pdev)

{
	struct mmc_host *mmc = platform_get_drvdata(pdev);
	struct pxamci_host *host = mmc_priv(mmc);

	mmc_remove_host(mmc);

	if (host->pdata && host->pdata->exit)
		host->pdata->exit(&pdev->dev, mmc);

	pxamci_stop_clock(host);
	writel(TXFIFO_WR_REQ|RXFIFO_RD_REQ|CLK_IS_OFF|STOP_CMD|
			END_CMD_RES|PRG_DONE|DATA_TRAN_DONE,
			host->base + MMC_I_MASK);

	dmaengine_terminate_all(host->dma_chan_rx);
	dmaengine_terminate_all(host->dma_chan_tx);
}

Please let me know if anything still needs adjustment before v3.

Best Regards,
Rakuram

#4 lore raw

Hello Rakuram,

Quoted 3 lines · Rakuram Eswaran
Quoted 1 line · Uwe Kleine-König

On Wed, Oct 15, 2025 at 12:16:57AM +0530, Rakuram Eswaran wrote:

Sorry for the delayed reply as I was in vacation.

I didn't hold my breath :-O

Quoted 22 lines

Ah, got it — I’ll drop the clk_get_rate() comment since it was only a reminder from your WIP suggestion.

Just to confirm, are you referring to adding a call to clk_prepare_enable() before clk_get_rate()? I can move the clk_get_rate() call after clk_prepare_enable(), or drop the comment entirely.

If my understanding is correct, I’ll keep v3 focused on the current set of fixes and handle the clk_get_rate() precondition (by moving it after clk_prepare_enable()) in a follow-up patch. That should keep the scope of each change clean and review-friendly.

Quoted 10 lines

drivers/mmc/host/pxamci.c static int pxamci_probe(struct platform_device *pdev) · line 771

Quoted 5 lines
drivers/mmc/host/pxamci.c +0 -5
-out:
-     if (host->dma_chan_rx)
-             dma_release_channel(host->dma_chan_rx);
-     if (host->dma_chan_tx)
-             dma_release_channel(host->dma_chan_tx);

I was lazy in my prototype patch and didn't drop the calls to dma_release_channel() in pxamci_remove(). For a proper patch this is required though.

Quoted 8 lines
Quoted 3 lines

To continue the quest: Now that I looked at pxamci_remove(): mmc is always non-NULL, so the respective check can be dropped.

Understood. Since pxamci_remove() is only called after successful allocation and initialization in probe(), mmc will always be a valid pointer. I’ll drop the if (mmc) check in v3 as it can never be NULL in normal operation, and remove the dma_release_channel() calls as well.

Yes, I suggest to make restructuring .remote a separate patch. (But removing dma_release_channel belongs into the patch that introduces devm to allocate the dma channels.)

Quoted 15 lines

I’ve prepared a preview of the v3 patch incorporating your previous comments. Before sending it out formally, I wanted to share it with you to confirm that the updates look good — especially the cleanup changes in pxamci_remove() and the dropped clk_get_rate() comment.

static void pxamci_remove(struct platform_device *pdev)

{
	struct mmc_host *mmc = platform_get_drvdata(pdev);
	struct pxamci_host *host = mmc_priv(mmc);

	mmc_remove_host(mmc);

	if (host->pdata && host->pdata->exit)
		host->pdata->exit(&pdev->dev, mmc);
Quoted 8 lines
	pxamci_stop_clock(host);
	writel(TXFIFO_WR_REQ|RXFIFO_RD_REQ|CLK_IS_OFF|STOP_CMD|
			END_CMD_RES|PRG_DONE|DATA_TRAN_DONE,
			host->base + MMC_I_MASK);

	dmaengine_terminate_all(host->dma_chan_rx);
	dmaengine_terminate_all(host->dma_chan_tx);
}

Looks right.

Best regards
Uwe

A message that is not in the archive (sent off-list or not yet received): opvid2ycmgbkbmegnnzwl4hyev6e2smusxk5olkuqxfwxzykz2e@jlvolirolrxl

#6 lore raw
Quoted 36 lines · Uwe Kleine-König

Hello Rakuram,

Quoted 3 lines · Rakuram Eswaran
Quoted 1 line · Uwe Kleine-König

On Wed, Oct 15, 2025 at 12:16:57AM +0530, Rakuram Eswaran wrote:

Sorry for the delayed reply as I was in vacation.

I didn't hold my breath :-O

Quoted 26 lines

Ah, got it — I’ll drop the clk_get_rate() comment since it was only a reminder from your WIP suggestion.

Just to confirm, are you referring to adding a call to clk_prepare_enable() before clk_get_rate()? I can move the clk_get_rate() call after clk_prepare_enable(), or drop the comment entirely.

If my understanding is correct, I’ll keep v3 focused on the current set of fixes and handle the clk_get_rate() precondition (by moving it after clk_prepare_enable()) in a follow-up patch. That should keep the scope of each change clean and review-friendly.

Quoted 13 lines
Quoted 5 lines

-out:
-     if (host->dma_chan_rx)
-             dma_release_channel(host->dma_chan_rx);
-     if (host->dma_chan_tx)
-             dma_release_channel(host->dma_chan_tx);

I was lazy in my prototype patch and didn't drop the calls to dma_release_channel() in pxamci_remove(). For a proper patch this is required though.

To continue the quest: Now that I looked at pxamci_remove(): mmc is always non-NULL, so the respective check can be dropped.

Quoted 9 lines
Quoted 4 lines

Understood. Since pxamci_remove() is only called after successful allocation and initialization in probe(), mmc will always be a valid pointer. I’ll drop the if (mmc) check in v3 as it can never be NULL in normal operation, and remove the dma_release_channel() calls as well.

Yes, I suggest to make restructuring .remote a separate patch. (But removing dma_release_channel belongs into the patch that introduces devm to allocate the dma channels.)

I believe ".remote" is a typo and you're referring to the _remove() function. Removing if(mmc) condition check from pxamci_remove() can be handled in a separate cleanup patch, while removing redundant dma_release_channel() will be included in v3.

Is my above understanding correct?

Quoted 20 lines
Quoted 20 lines

I’ve prepared a preview of the v3 patch incorporating your previous comments. Before sending it out formally, I wanted to share it with you to confirm that the updates look good — especially the cleanup changes in pxamci_remove() and the dropped clk_get_rate() comment.

static void pxamci_remove(struct platform_device *pdev) {
      struct mmc_host *mmc = platform_get_drvdata(pdev); struct pxamci_host *host = mmc_priv(mmc);

      mmc_remove_host(mmc);

      if (host->pdata && host->pdata->exit)
              host->pdata->exit(&pdev->dev, mmc);

      pxamci_stop_clock(host); writel(TXFIFO_WR_REQ|RXFIFO_RD_REQ|CLK_IS_OFF|STOP_CMD| END_CMD_RES|PRG_DONE|DATA_TRAN_DONE, host->base + MMC_I_MASK);

Quoted 6 lines
Quoted 3 lines

      dmaengine_terminate_all(host->dma_chan_rx);
      dmaengine_terminate_all(host->dma_chan_tx);
}

Looks right.

Thank you for the feedback.

Best Regards,
Rakuram

#7 lore raw

Hello Rakuram,

Quoted 11 lines · Rakuram Eswaran
Quoted 3 lines · Uwe Kleine-König

Yes, I suggest to make restructuring .remote a separate patch. (But removing dma_release_channel belongs into the patch that introduces devm to allocate the dma channels.)

I believe ".remote" is a typo and you're referring to the _remove() function. Removing if(mmc) condition check from pxamci_remove() can be handled in a separate cleanup patch, while removing redundant dma_release_channel() will be included in v3.

Is my above understanding correct?

ack. remote vs. remove is one of my most-committed typos :-D

Best regards
Uwe

A message that is not in the archive (sent off-list or not yet received): itxfh366j3yhshvp5abji6xussdk2fc7zrtvc3zzk27y5ouwpb@fvvxnpg3keu

#9 lore raw
Quoted 9 lines · Uwe Kleine-König

Hello Rakuram,

Quoted 5 lines · Rakuram Eswaran
Quoted 3 lines · Uwe Kleine-König

Yes, I suggest to make restructuring .remote a separate patch. (But removing dma_release_channel belongs into the patch that introduces devm to allocate the dma channels.)

Quoted 9 lines
Quoted 6 lines

I believe ".remote" is a typo and you're referring to the _remove() function. Removing if(mmc) condition check from pxamci_remove() can be handled in a separate cleanup patch, while removing redundant dma_release_channel() will be included in v3.

Is my above understanding correct?

ack. remote vs. remove is one of my most-committed typos :-D

Understood, thank you for confirming.

I've just sent the v3 patch. You can find it here:
https://lore.kernel.org/linux-mmc/[email protected]/T/#u

Best Regards,
Rakuram