Skip to contentSkip to conversation

mmc: atmel-mci: remove useless DMA stuff for non-dt devices

PATCH Superseded Ludovic Desroches 2 participants 8 messages Nov 20, 2014

Subsystems (3)

v1 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/3 mmc: atmel-mci: remove useless DMA stuff for non-dt devices

All devices with a DMA controller are DT compliant and legacy support has been removed. For those reasons, some DMA stuff is useless.

---
 drivers/mmc/host/atmel-mci.c | 8 --------
 1 file changed, 8 deletions(-)
drivers/mmc/host/atmel-mci.c +0 -8
index ba38f94..b9226b3 100644
@@ -2267,17 +2267,9 @@ static void atmci_cleanup_slot(struct atmel_mci_slot *slot,
 
 static bool atmci_configure_dma(struct atmel_mci *host)
 {
-	struct mci_platform_data	*pdata;
-	dma_cap_mask_t mask;
-
 	if (host == NULL)
 		return false;
 
-	pdata = host->pdev->dev.platform_data;
-
-	dma_cap_zero(mask);
-	dma_cap_set(DMA_SLAVE, mask);
-
 	host->dma.chan = dma_request_slave_channel(&host->pdev->dev, "rxtx");
 	if (!host->dma.chan) {
 		dev_warn(&host->pdev->dev, "no DMA channel available\n");
Signature · 1 line
2.0.3
#1 lore raw

PATCH 2/3 mmc: atmel-mci: stop using specific initcall

No more use late initcall to manage probing order. Use probe deferring if needed. Then use module_platform_driver and clean init/exit attributes.

---
 drivers/mmc/host/atmel-mci.c | 23 ++++++-----------------
 1 file changed, 6 insertions(+), 17 deletions(-)
drivers/mmc/host/atmel-mci.c +6 -17
index b9226b3..9b85c4e 100644
@@ -2137,7 +2137,7 @@ static irqreturn_t atmci_detect_interrupt(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
-static int __init atmci_init_slot(struct atmel_mci *host,
+static int atmci_init_slot(struct atmel_mci *host,
 		struct mci_slot_pdata *slot_data, unsigned int id,
 		u32 sdc_reg, u32 sdio_irq)
 {
@@ -2344,7 +2344,7 @@ static void __init atmci_get_cap(struct atmel_mci *host)
 	}
 }
 
-static int __init atmci_probe(struct platform_device *pdev)
+static int atmci_probe(struct platform_device *pdev)
 {
 	struct mci_platform_data	*pdata;
 	struct atmel_mci		*host;
@@ -2480,7 +2480,7 @@ err_init_slot:
 	return ret;
 }
 
-static int __exit atmci_remove(struct platform_device *pdev)
+static int atmci_remove(struct platform_device *pdev)
 {
 	struct atmel_mci	*host = platform_get_drvdata(pdev);
 	unsigned int		i;
@@ -2510,25 +2510,14 @@ static int __exit atmci_remove(struct platform_device *pdev)
 }
 
 static struct platform_driver atmci_driver = {
-	.remove		= __exit_p(atmci_remove),
+	.probe		= atmci_probe,
+	.remove		= atmci_remove,
 	.driver		= {
 		.name		= "atmel_mci",
 		.of_match_table	= of_match_ptr(atmci_dt_ids),
 	},
 };
-
-static int __init atmci_init(void)
-{
-	return platform_driver_probe(&atmci_driver, atmci_probe);
-}
-
-static void __exit atmci_exit(void)
-{
-	platform_driver_unregister(&atmci_driver);
-}
-
-late_initcall(atmci_init); /* try to load after dma driver when built-in */
-module_exit(atmci_exit);
+module_platform_driver(atmci_driver);
 
 MODULE_DESCRIPTION("Atmel Multimedia Card Interface driver");
 MODULE_AUTHOR("Haavard Skinnemoen (Atmel)");
Signature · 1 line
2.0.3
#2 lore raw

PATCH 2/3 mmc: atmel-mci: stop using specific initcall

Quoted 6 lines · On Thursday 20 November 2014 11:07:54 Ludovic Desroches wrote:

No more use late initcall to manage probing order. Use probe deferring if needed. Then use module_platform_driver and clean init/exit attributes.

Do we need this backported into stable kernels? It seems that the __init/__exit annotations will break things if you ever tried to unbind the device or run into deferred probing on earlier kernels.

Arnd

#3 lore raw

PATCH 2/3 mmc: atmel-mci: stop using specific initcall

Quoted 5 lines · Arnd Bergmann
Quoted 4 lines · On Thursday 20 November 2014 11:07:54 Ludovic Desroches wrote:

No more use late initcall to manage probing order. Use probe deferring if needed. Then use module_platform_driver and clean init/exit attributes.

Quoted 7 lines
Quoted 2 lines

Do we need this backported into stable kernels? It seems that the __init/__exit annotations will break things if you ever tried to unbind the device or run into deferred probing on earlier kernels.

Well, it is a bit complicated, if we backport it, then the mci driver could be probed before the dma controller. Requesting dma chan will fail and it will switch to pio mode.

So it has to be backported with the probe deferring. The issue is that probe deferring patch is based on other patches removing non-dt support which become useless only ine 3.19.

Ludovic

#4 lore raw

PATCH 2/3 mmc: atmel-mci: stop using specific initcall

Quoted 14 lines · On Thursday 20 November 2014 15:01:25 Ludovic Desroches wrote:
Quoted 5 lines · Arnd Bergmann
Quoted 4 lines · On Thursday 20 November 2014 11:07:54 Ludovic Desroches wrote:

No more use late initcall to manage probing order. Use probe deferring if needed. Then use module_platform_driver and clean init/exit attributes.

Quoted 7 lines
Quoted 2 lines

Do we need this backported into stable kernels? It seems that the __init/__exit annotations will break things if you ever tried to unbind the device or run into deferred probing on earlier kernels.

Quoted 8 lines

Well, it is a bit complicated, if we backport it, then the mci driver could be probed before the dma controller. Requesting dma chan will fail and it will switch to pio mode.

So it has to be backported with the probe deferring. The issue is that probe deferring patch is based on other patches removing non-dt support which become useless only ine 3.19.

Should we just have the __init/__exit removal in backports then?

Arnd

#5 lore raw

PATCH 2/3 mmc: atmel-mci: stop using specific initcall

Quoted 19 lines · Arnd Bergmann
Quoted 18 lines · On Thursday 20 November 2014 15:01:25 Ludovic Desroches wrote:
Quoted 5 lines · Arnd Bergmann
Quoted 4 lines · On Thursday 20 November 2014 11:07:54 Ludovic Desroches wrote:

No more use late initcall to manage probing order. Use probe deferring if needed. Then use module_platform_driver and clean init/exit attributes.

Quoted 7 lines
Quoted 2 lines

Do we need this backported into stable kernels? It seems that the __init/__exit annotations will break things if you ever tried to unbind the device or run into deferred probing on earlier kernels.

Well, it is a bit complicated, if we backport it, then the mci driver could be probed before the dma controller. Requesting dma chan will fail and it will switch to pio mode.

Quoted 6 lines
Quoted 4 lines

So it has to be backported with the probe deferring. The issue is that probe deferring patch is based on other patches removing non-dt support which become useless only ine 3.19.

Should we just have the __init/__exit removal in backports then?

Yes. Do you want me to split this patch in order to have ony one for __init/__exit removal and another one for late_initcall removal?

Ludovic

#6 lore raw

PATCH 2/3 mmc: atmel-mci: stop using specific initcall

Quoted 25 lines · On Thursday 20 November 2014 15:18:55 Ludovic Desroches wrote:
Quoted 24 lines · Arnd Bergmann
Quoted 22 lines · On Thursday 20 November 2014 15:01:25 Ludovic Desroches wrote:
Quoted 5 lines · Arnd Bergmann
Quoted 4 lines · On Thursday 20 November 2014 11:07:54 Ludovic Desroches wrote:

No more use late initcall to manage probing order. Use probe deferring if needed. Then use module_platform_driver and clean init/exit attributes.

Quoted 7 lines
Quoted 2 lines

Do we need this backported into stable kernels? It seems that the __init/__exit annotations will break things if you ever tried to unbind the device or run into deferred probing on earlier kernels.

Well, it is a bit complicated, if we backport it, then the mci driver could be probed before the dma controller. Requesting dma chan will fail and it will switch to pio mode.

So it has to be backported with the probe deferring. The issue is that probe deferring patch is based on other patches removing non-dt support which become useless only ine 3.19.

Quoted 6 lines
Quoted 1 line

Should we just have the __init/__exit removal in backports then?

Yes. Do you want me to split this patch in order to have ony one for __init/__exit removal and another one for late_initcall removal?

Yes, I think that would be best.

Arnd

#7 lore raw

PATCH 3/3 mmc: atmel-mci: use probe deferring if dma controller is not ready yet

In reply to Ludovic Desroches

Return probe defer if requesting a dma channel without a dma controller probed.

---
 drivers/mmc/host/atmel-mci.c | 46 ++++++++++++++++++++++++--------------------
 1 file changed, 25 insertions(+), 21 deletions(-)
drivers/mmc/host/atmel-mci.c +25 -21
index 9b85c4e..29bfd5e 100644
@@ -2265,29 +2265,29 @@ static void atmci_cleanup_slot(struct atmel_mci_slot *slot,
 	mmc_free_host(slot->mmc);
 }
 
-static bool atmci_configure_dma(struct atmel_mci *host)
+static int atmci_configure_dma(struct atmel_mci *host)
 {
-	if (host == NULL)
-		return false;
+	int ret = 0;
 
-	host->dma.chan = dma_request_slave_channel(&host->pdev->dev, "rxtx");
-	if (!host->dma.chan) {
-		dev_warn(&host->pdev->dev, "no DMA channel available\n");
-		return false;
-	} else {
-		dev_info(&host->pdev->dev,
-					"using %s for DMA transfers\n",
-					dma_chan_name(host->dma.chan));
-
-		host->dma_conf.src_addr = host->mapbase + ATMCI_RDR;
-		host->dma_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-		host->dma_conf.src_maxburst = 1;
-		host->dma_conf.dst_addr = host->mapbase + ATMCI_TDR;
-		host->dma_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-		host->dma_conf.dst_maxburst = 1;
-		host->dma_conf.device_fc = false;
-		return true;
+	host->dma.chan = dma_request_slave_channel_reason(&host->pdev->dev, "rxtx");
+	if (IS_ERR(host->dma.chan)) {
+		ret = PTR_ERR(host->dma.chan);
+		host->dma.chan = NULL;
+		return ret;
 	}
+
+	dev_info(&host->pdev->dev, "using %s for DMA transfers\n",
+		 dma_chan_name(host->dma.chan));
+
+	host->dma_conf.src_addr = host->mapbase + ATMCI_RDR;
+	host->dma_conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+	host->dma_conf.src_maxburst = 1;
+	host->dma_conf.dst_addr = host->mapbase + ATMCI_TDR;
+	host->dma_conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
+	host->dma_conf.dst_maxburst = 1;
+	host->dma_conf.device_fc = false;
+
+	return ret;
 }
 
 /*
@@ -2403,7 +2403,10 @@ static int atmci_probe(struct platform_device *pdev)
 
 	/* Get MCI capabilities and set operations according to it */
 	atmci_get_cap(host);
-	if (atmci_configure_dma(host)) {
+	ret = atmci_configure_dma(host);
+	if (ret == -EPROBE_DEFER)
+		goto err_dma_probe_defer;
+	if (ret == 0) {
 		host->prepare_data = &atmci_prepare_data_dma;
 		host->submit_data = &atmci_submit_data_dma;
 		host->stop_transfer = &atmci_stop_transfer_dma;
@@ -2476,6 +2479,7 @@ err_init_slot:
 	del_timer_sync(&host->timer);
 	if (host->dma.chan)
 		dma_release_channel(host->dma.chan);
+err_dma_probe_defer:
 	free_irq(irq, host);
 	return ret;
 }
Signature · 1 line
2.0.3