mmc: pxamci: Simplify pxamci_probe() error handling using devm APIs
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
@@ -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
Quoted 141 lines · Rakuram Eswaran
This patch refactors
pxamci_probe()to use devm-managed resource allocation (e.g.devm_dma_request_chan()) anddev_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:709pxamci_probe()warn: passing zero to 'PTR_ERR'The warning occurred because a pointer was set to NULL before using
PTR_ERR(), leading toPTR_ERR(0)and an incorrect 0 return value. This refactor eliminates that condition while improving overall error handling robustness.Reported-by kernel test robot <[email protected]>Reported-by Dan Carpenter <[email protected]>Fixes 58c40f3faf742c ("mmc: pxamci: Use devm_mmc_alloc_host() helper")Suggested-by Uwe Kleine-König <[email protected]>Signed-off-by Rakuram Eswaran <[email protected]>---
Changes since v1:
Following Uwe Kleine-König’s suggestion:
- Replaceddma_request_chan()withdevm_dma_request_chan()to make DMA channel allocation devm-managed and avoid manual release paths.
- Useddev_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) usings390x-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.cdrivers/mmc/host/pxamci.c | 57 +++++++++++++++------------------------ 1 file changed, 21 insertions(+), 36 deletions(-)drivers/mmc/host/pxamci.c +21
-29@@ -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
Quoted 60 lines · Rakuram Eswaran
This patch refactors
pxamci_probe()to use devm-managed resource allocation (e.g.devm_dma_request_chan()) anddev_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:709pxamci_probe()warn: passing zero to 'PTR_ERR'The warning occurred because a pointer was set to NULL before using
PTR_ERR(), leading toPTR_ERR(0)and an incorrect 0 return value. This refactor eliminates that condition while improving overall error handling robustness.Reported-by kernel test robot <[email protected]>Reported-by Dan Carpenter <[email protected]>Fixes 58c40f3faf742c ("mmc: pxamci: Use devm_mmc_alloc_host() helper")Suggested-by Uwe Kleine-König <[email protected]>Signed-off-by Rakuram Eswaran <[email protected]>---
Changes since v1:
Following Uwe Kleine-König’s suggestion:
- Replaceddma_request_chan()withdevm_dma_request_chan()to make DMA channel allocation devm-managed and avoid manual release paths.
- Useddev_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) usings390x-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.cdrivers/mmc/host/pxamci.c | 57 +++++++++++++++------------------------ 1 file changed, 21 insertions(+), 36 deletions(-)drivers/mmc/host/pxamci.c +0
-2@@ -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
-0host->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.
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()) anddev_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:709pxamci_probe()warn: passing zero to 'PTR_ERR'The warning occurred because a pointer was set to NULL before using
PTR_ERR(), leading toPTR_ERR(0)and an incorrect 0 return value. This refactor eliminates that condition while improving overall error handling robustness.Reported-by kernel test robot <[email protected]>Reported-by Dan Carpenter <[email protected]>Fixes 58c40f3faf742c ("mmc: pxamci: Use devm_mmc_alloc_host() helper")Suggested-by Uwe Kleine-König <[email protected]>Signed-off-by Rakuram Eswaran <[email protected]>---
Changes since v1:
Following Uwe Kleine-König’s suggestion:
- Replaceddma_request_chan()withdevm_dma_request_chan()to make DMA channel allocation devm-managed and avoid manual release paths.
- Useddev_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) usings390x-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.cdrivers/mmc/host/pxamci.c | 57 +++++++++++++++------------------------
1 file changed, 21 insertions(+), 36 deletions(-)drivers/mmc/host/pxamci.c +3
-4@@ -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()inpxamci_remove(). For a proper patch this is required though.To continue the quest: Now that I looked at
pxamci_remove():mmcis 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
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()beforeclk_get_rate()? I can move theclk_get_rate()call afterclk_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 afterclk_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()inpxamci_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():mmcis always non-NULL, so the respective check can be dropped.Understood. Since
pxamci_remove()is only called after successful allocation and initialization inprobe(), 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 thedma_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 droppedclk_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
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()beforeclk_get_rate()? I can move theclk_get_rate()call afterclk_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 afterclk_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()inpxamci_remove(). For a proper patch this is required though.To continue the quest: Now that I looked at
pxamci_remove():mmcis 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 inprobe(), 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 thedma_release_channel()calls as well.Yes, I suggest to make restructuring .remote a separate patch. (But removing
dma_release_channelbelongs 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 droppedclk_get_rate()comment.static void
pxamci_remove(struct platform_device *pdev){
structmmc_host*mmc =platform_get_drvdata(pdev); structpxamci_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
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_channelbelongs 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 frompxamci_remove()can be handled in a separate cleanup patch, while removing redundantdma_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
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_channelbelongs 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 frompxamci_remove()can be handled in a separate cleanup patch, while removing redundantdma_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