[PATCH v2] iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()

Subsystems: iio subsystem and drivers, the rest

STALE2460d

8 messages, 4 authors, 2020-01-11 · open the first message on its own page

[PATCH v2] iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()

From: Peter Ujfalusi <hidden>
Date: 2020-01-07 11:45:15

dma_request_slave_channel() is a wrapper on top of dma_request_chan()
eating up the error code.

By using dma_request_chan() directly the driver can support deferred
probing against DMA.

Signed-off-by: Peter Ujfalusi <redacted>
---
Hi,

Changes since v1:
- Fall back to IRQ mode for ADC only in case of ENODEV

Regards,
Peter

 drivers/iio/adc/stm32-dfsdm-adc.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index e493242c266e..74a2211bdff4 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -1383,9 +1383,13 @@ static int stm32_dfsdm_dma_request(struct iio_dev *indio_dev)
 {
 	struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
 
-	adc->dma_chan = dma_request_slave_channel(&indio_dev->dev, "rx");
-	if (!adc->dma_chan)
-		return -EINVAL;
+	adc->dma_chan = dma_request_chan(&indio_dev->dev, "rx");
+	if (IS_ERR(adc->dma_chan)) {
+		int ret = PTR_ERR(adc->dma_chan);
+
+		adc->dma_chan = NULL;
+		return ret;
+	}
 
 	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
 					 DFSDM_DMA_BUFFER_SIZE,
@@ -1509,7 +1513,16 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
 	init_completion(&adc->completion);
 
 	/* Optionally request DMA */
-	if (stm32_dfsdm_dma_request(indio_dev)) {
+	ret = stm32_dfsdm_dma_request(indio_dev);
+	if (ret) {
+		if (ret != -ENODEV) {
+			if (ret != -EPROBE_DEFER)
+				dev_err(&indio_dev->dev,
+					"DMA channel request failed with %d\n",
+					ret);
+			return ret;
+		}
+
 		dev_dbg(&indio_dev->dev, "No DMA support\n");
 		return 0;
 	}
-- 
Peter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [Linux-stm32] [PATCH v2] iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()

From: Olivier MOYSAN <hidden>
Date: 2020-01-08 10:12:46

Acked-by: Olivier Moysan <redacted>

On 1/7/20 12:45 PM, Peter Ujfalusi wrote:
quoted hunk
dma_request_slave_channel() is a wrapper on top of dma_request_chan()
eating up the error code.

By using dma_request_chan() directly the driver can support deferred
probing against DMA.

Signed-off-by: Peter Ujfalusi <redacted>
---
Hi,

Changes since v1:
- Fall back to IRQ mode for ADC only in case of ENODEV

Regards,
Peter

  drivers/iio/adc/stm32-dfsdm-adc.c | 21 +++++++++++++++++----
  1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index e493242c266e..74a2211bdff4 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -1383,9 +1383,13 @@ static int stm32_dfsdm_dma_request(struct iio_dev *indio_dev)
  {
  	struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
  
-	adc->dma_chan = dma_request_slave_channel(&indio_dev->dev, "rx");
-	if (!adc->dma_chan)
-		return -EINVAL;
+	adc->dma_chan = dma_request_chan(&indio_dev->dev, "rx");
+	if (IS_ERR(adc->dma_chan)) {
+		int ret = PTR_ERR(adc->dma_chan);
+
+		adc->dma_chan = NULL;
+		return ret;
+	}
  
  	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
  					 DFSDM_DMA_BUFFER_SIZE,
@@ -1509,7 +1513,16 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
  	init_completion(&adc->completion);
  
  	/* Optionally request DMA */
-	if (stm32_dfsdm_dma_request(indio_dev)) {
+	ret = stm32_dfsdm_dma_request(indio_dev);
+	if (ret) {
+		if (ret != -ENODEV) {
+			if (ret != -EPROBE_DEFER)
+				dev_err(&indio_dev->dev,
+					"DMA channel request failed with %d\n",
+					ret);
+			return ret;
+		}
+
  		dev_dbg(&indio_dev->dev, "No DMA support\n");
  		return 0;
  	}
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH v2] iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()

From: Fabrice Gasnier <hidden>
Date: 2020-01-09 09:13:24

On 1/7/20 12:45 PM, Peter Ujfalusi wrote:
dma_request_slave_channel() is a wrapper on top of dma_request_chan()
eating up the error code.

By using dma_request_chan() directly the driver can support deferred
probing against DMA.

Signed-off-by: Peter Ujfalusi <redacted>
---
Hi,

Changes since v1:
- Fall back to IRQ mode for ADC only in case of ENODEV
Hi Peter,

Thanks for the patch,

Please find a minor comment here after. Apart from that, you can add my:

Acked-by: Fabrice Gasnier <redacted>

quoted hunk
Regards,
Peter

 drivers/iio/adc/stm32-dfsdm-adc.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index e493242c266e..74a2211bdff4 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -1383,9 +1383,13 @@ static int stm32_dfsdm_dma_request(struct iio_dev *indio_dev)
 {
 	struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
 
-	adc->dma_chan = dma_request_slave_channel(&indio_dev->dev, "rx");
-	if (!adc->dma_chan)
-		return -EINVAL;
+	adc->dma_chan = dma_request_chan(&indio_dev->dev, "rx");
+	if (IS_ERR(adc->dma_chan)) {
+		int ret = PTR_ERR(adc->dma_chan);
+
+		adc->dma_chan = NULL;
+		return ret;
You may "return PTR_ERR(adc->dma_chan);" directly here.

Best Regards,
Fabrice
quoted hunk
+	}
 
 	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
 					 DFSDM_DMA_BUFFER_SIZE,
@@ -1509,7 +1513,16 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
 	init_completion(&adc->completion);
 
 	/* Optionally request DMA */
-	if (stm32_dfsdm_dma_request(indio_dev)) {
+	ret = stm32_dfsdm_dma_request(indio_dev);
+	if (ret) {
+		if (ret != -ENODEV) {
+			if (ret != -EPROBE_DEFER)
+				dev_err(&indio_dev->dev,
+					"DMA channel request failed with %d\n",
+					ret);
+			return ret;
+		}
+
 		dev_dbg(&indio_dev->dev, "No DMA support\n");
 		return 0;
 	}
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH v2] iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()

From: Peter Ujfalusi <hidden>
Date: 2020-01-09 10:31:46


On 09/01/2020 11.13, Fabrice Gasnier wrote:
On 1/7/20 12:45 PM, Peter Ujfalusi wrote:
quoted
dma_request_slave_channel() is a wrapper on top of dma_request_chan()
eating up the error code.

By using dma_request_chan() directly the driver can support deferred
probing against DMA.

Signed-off-by: Peter Ujfalusi <redacted>
---
Hi,

Changes since v1:
- Fall back to IRQ mode for ADC only in case of ENODEV
Hi Peter,

Thanks for the patch,

Please find a minor comment here after. Apart from that, you can add my:

Acked-by: Fabrice Gasnier <redacted>

quoted
Regards,
Peter

 drivers/iio/adc/stm32-dfsdm-adc.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index e493242c266e..74a2211bdff4 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -1383,9 +1383,13 @@ static int stm32_dfsdm_dma_request(struct iio_dev *indio_dev)
 {
 	struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
 
-	adc->dma_chan = dma_request_slave_channel(&indio_dev->dev, "rx");
-	if (!adc->dma_chan)
-		return -EINVAL;
+	adc->dma_chan = dma_request_chan(&indio_dev->dev, "rx");
+	if (IS_ERR(adc->dma_chan)) {
+		int ret = PTR_ERR(adc->dma_chan);
+
+		adc->dma_chan = NULL;
+		return ret;
You may "return PTR_ERR(adc->dma_chan);" directly here.
I don't make decision here on behalf of the adc path on to go forward w/
or w/o DMA support and if we go ahead the stm32_dfsdm_dma_release()
needs the dma_chan to be NULL in case we don't use DMA.

It is much cleaner to set dma_chan to NULL here than doing it in other
paths.
Best Regards,
Fabrice
quoted
+	}
 
 	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
 					 DFSDM_DMA_BUFFER_SIZE,
@@ -1509,7 +1513,16 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
 	init_completion(&adc->completion);
 
 	/* Optionally request DMA */
-	if (stm32_dfsdm_dma_request(indio_dev)) {
+	ret = stm32_dfsdm_dma_request(indio_dev);
+	if (ret) {
+		if (ret != -ENODEV) {
+			if (ret != -EPROBE_DEFER)
+				dev_err(&indio_dev->dev,
+					"DMA channel request failed with %d\n",
+					ret);
+			return ret;
+		}
+
 		dev_dbg(&indio_dev->dev, "No DMA support\n");
 		return 0;
 	}
- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH v2] iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()

From: Fabrice Gasnier <hidden>
Date: 2020-01-09 11:29:19

On 1/9/20 11:32 AM, Peter Ujfalusi wrote:

On 09/01/2020 11.13, Fabrice Gasnier wrote:
quoted
On 1/7/20 12:45 PM, Peter Ujfalusi wrote:
quoted
dma_request_slave_channel() is a wrapper on top of dma_request_chan()
eating up the error code.

By using dma_request_chan() directly the driver can support deferred
probing against DMA.

Signed-off-by: Peter Ujfalusi <redacted>
---
Hi,

Changes since v1:
- Fall back to IRQ mode for ADC only in case of ENODEV
Hi Peter,

Thanks for the patch,

Please find a minor comment here after. Apart from that, you can add my:

Acked-by: Fabrice Gasnier <redacted>

quoted
Regards,
Peter

 drivers/iio/adc/stm32-dfsdm-adc.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index e493242c266e..74a2211bdff4 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -1383,9 +1383,13 @@ static int stm32_dfsdm_dma_request(struct iio_dev *indio_dev)
 {
 	struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
 
-	adc->dma_chan = dma_request_slave_channel(&indio_dev->dev, "rx");
-	if (!adc->dma_chan)
-		return -EINVAL;
+	adc->dma_chan = dma_request_chan(&indio_dev->dev, "rx");
+	if (IS_ERR(adc->dma_chan)) {
+		int ret = PTR_ERR(adc->dma_chan);
+
+		adc->dma_chan = NULL;
+		return ret;
You may "return PTR_ERR(adc->dma_chan);" directly here.
I don't make decision here on behalf of the adc path on to go forward w/
or w/o DMA support and if we go ahead the stm32_dfsdm_dma_release()
needs the dma_chan to be NULL in case we don't use DMA.

It is much cleaner to set dma_chan to NULL here than doing it in other
paths.
Hi Peter,

Sorry I wasn't clear enough. I agree with you. I was suggesting only,
talking about the 'ret' variable. It may be removed to spare a few lines
:-).
	if (IS_ERR(adc->dma_chan)) {
		adc->dma_chan = NULL;
		return PTR_ERR(adc->dma_chan);
	}
I'm okay both ways.
quoted
Best Regards,
Fabrice
quoted
+	}
 
 	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
 					 DFSDM_DMA_BUFFER_SIZE,
@@ -1509,7 +1513,16 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
 	init_completion(&adc->completion);
 
 	/* Optionally request DMA */
-	if (stm32_dfsdm_dma_request(indio_dev)) {
+	ret = stm32_dfsdm_dma_request(indio_dev);
+	if (ret) {
+		if (ret != -ENODEV) {
+			if (ret != -EPROBE_DEFER)
+				dev_err(&indio_dev->dev,
+					"DMA channel request failed with %d\n",
+					ret);
+			return ret;
+		}
+
 		dev_dbg(&indio_dev->dev, "No DMA support\n");
 		return 0;
 	}
- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH v2] iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()

From: Peter Ujfalusi <hidden>
Date: 2020-01-09 11:40:22


On 09/01/2020 13.29, Fabrice Gasnier wrote:
On 1/9/20 11:32 AM, Peter Ujfalusi wrote:
quoted

On 09/01/2020 11.13, Fabrice Gasnier wrote:
quoted
On 1/7/20 12:45 PM, Peter Ujfalusi wrote:
quoted
dma_request_slave_channel() is a wrapper on top of dma_request_chan()
eating up the error code.

By using dma_request_chan() directly the driver can support deferred
probing against DMA.

Signed-off-by: Peter Ujfalusi <redacted>
---
Hi,

Changes since v1:
- Fall back to IRQ mode for ADC only in case of ENODEV
Hi Peter,

Thanks for the patch,

Please find a minor comment here after. Apart from that, you can add my:

Acked-by: Fabrice Gasnier <redacted>

quoted
Regards,
Peter

 drivers/iio/adc/stm32-dfsdm-adc.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index e493242c266e..74a2211bdff4 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -1383,9 +1383,13 @@ static int stm32_dfsdm_dma_request(struct iio_dev *indio_dev)
 {
 	struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
 
-	adc->dma_chan = dma_request_slave_channel(&indio_dev->dev, "rx");
-	if (!adc->dma_chan)
-		return -EINVAL;
+	adc->dma_chan = dma_request_chan(&indio_dev->dev, "rx");
+	if (IS_ERR(adc->dma_chan)) {
+		int ret = PTR_ERR(adc->dma_chan);
+
+		adc->dma_chan = NULL;
+		return ret;
You may "return PTR_ERR(adc->dma_chan);" directly here.
I don't make decision here on behalf of the adc path on to go forward w/
or w/o DMA support and if we go ahead the stm32_dfsdm_dma_release()
needs the dma_chan to be NULL in case we don't use DMA.

It is much cleaner to set dma_chan to NULL here than doing it in other
paths.
Hi Peter,
Hi Fabrice,
Sorry I wasn't clear enough. I agree with you. I was suggesting only,
talking about the 'ret' variable. It may be removed to spare a few lines
:-).
	if (IS_ERR(adc->dma_chan)) {
		adc->dma_chan = NULL;
		return PTR_ERR(adc->dma_chan);
	}
I'm okay both ways.
PTR_ERR(NULL); will return 0
I need to retrieve the actual error code before NULLing dma_chan.
quoted
quoted
Best Regards,
Fabrice
quoted
+	}
 
 	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
 					 DFSDM_DMA_BUFFER_SIZE,
@@ -1509,7 +1513,16 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
 	init_completion(&adc->completion);
 
 	/* Optionally request DMA */
-	if (stm32_dfsdm_dma_request(indio_dev)) {
+	ret = stm32_dfsdm_dma_request(indio_dev);
+	if (ret) {
+		if (ret != -ENODEV) {
+			if (ret != -EPROBE_DEFER)
+				dev_err(&indio_dev->dev,
+					"DMA channel request failed with %d\n",
+					ret);
+			return ret;
+		}
+
 		dev_dbg(&indio_dev->dev, "No DMA support\n");
 		return 0;
 	}
- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH v2] iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()

From: Fabrice Gasnier <hidden>
Date: 2020-01-09 12:56:30

On 1/9/20 12:40 PM, Peter Ujfalusi wrote:

On 09/01/2020 13.29, Fabrice Gasnier wrote:
quoted
On 1/9/20 11:32 AM, Peter Ujfalusi wrote:
quoted

On 09/01/2020 11.13, Fabrice Gasnier wrote:
quoted
On 1/7/20 12:45 PM, Peter Ujfalusi wrote:
quoted
dma_request_slave_channel() is a wrapper on top of dma_request_chan()
eating up the error code.

By using dma_request_chan() directly the driver can support deferred
probing against DMA.

Signed-off-by: Peter Ujfalusi <redacted>
---
Hi,

Changes since v1:
- Fall back to IRQ mode for ADC only in case of ENODEV
Hi Peter,

Thanks for the patch,

Please find a minor comment here after. Apart from that, you can add my:

Acked-by: Fabrice Gasnier <redacted>

quoted
Regards,
Peter

 drivers/iio/adc/stm32-dfsdm-adc.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index e493242c266e..74a2211bdff4 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -1383,9 +1383,13 @@ static int stm32_dfsdm_dma_request(struct iio_dev *indio_dev)
 {
 	struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
 
-	adc->dma_chan = dma_request_slave_channel(&indio_dev->dev, "rx");
-	if (!adc->dma_chan)
-		return -EINVAL;
+	adc->dma_chan = dma_request_chan(&indio_dev->dev, "rx");
+	if (IS_ERR(adc->dma_chan)) {
+		int ret = PTR_ERR(adc->dma_chan);
+
+		adc->dma_chan = NULL;
+		return ret;
You may "return PTR_ERR(adc->dma_chan);" directly here.
I don't make decision here on behalf of the adc path on to go forward w/
or w/o DMA support and if we go ahead the stm32_dfsdm_dma_release()
needs the dma_chan to be NULL in case we don't use DMA.

It is much cleaner to set dma_chan to NULL here than doing it in other
paths.
Hi Peter,
Hi Fabrice,
quoted
Sorry I wasn't clear enough. I agree with you. I was suggesting only,
talking about the 'ret' variable. It may be removed to spare a few lines
:-).
	if (IS_ERR(adc->dma_chan)) {
		adc->dma_chan = NULL;
		return PTR_ERR(adc->dma_chan);
	}
I'm okay both ways.
PTR_ERR(NULL); will return 0
I need to retrieve the actual error code before NULLing dma_chan.
Oh yes, so please forget this.
Thanks,
Fabrice
quoted
quoted
quoted
Best Regards,
Fabrice
quoted
+	}
 
 	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
 					 DFSDM_DMA_BUFFER_SIZE,
@@ -1509,7 +1513,16 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
 	init_completion(&adc->completion);
 
 	/* Optionally request DMA */
-	if (stm32_dfsdm_dma_request(indio_dev)) {
+	ret = stm32_dfsdm_dma_request(indio_dev);
+	if (ret) {
+		if (ret != -ENODEV) {
+			if (ret != -EPROBE_DEFER)
+				dev_err(&indio_dev->dev,
+					"DMA channel request failed with %d\n",
+					ret);
+			return ret;
+		}
+
 		dev_dbg(&indio_dev->dev, "No DMA support\n");
 		return 0;
 	}
- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH v2] iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()

From: Jonathan Cameron <jic23@kernel.org>
Date: 2020-01-11 10:58:11

On Thu, 9 Jan 2020 13:56:14 +0100
Fabrice Gasnier [off-list ref] wrote:
On 1/9/20 12:40 PM, Peter Ujfalusi wrote:
quoted

On 09/01/2020 13.29, Fabrice Gasnier wrote:  
quoted
On 1/9/20 11:32 AM, Peter Ujfalusi wrote:  
quoted

On 09/01/2020 11.13, Fabrice Gasnier wrote:  
quoted
On 1/7/20 12:45 PM, Peter Ujfalusi wrote:  
quoted
dma_request_slave_channel() is a wrapper on top of dma_request_chan()
eating up the error code.

By using dma_request_chan() directly the driver can support deferred
probing against DMA.

Signed-off-by: Peter Ujfalusi <redacted>
---
Hi,

Changes since v1:
- Fall back to IRQ mode for ADC only in case of ENODEV  
Hi Peter,

Thanks for the patch,

Please find a minor comment here after. Apart from that, you can add my:

Acked-by: Fabrice Gasnier <redacted>

 
quoted
Regards,
Peter

 drivers/iio/adc/stm32-dfsdm-adc.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index e493242c266e..74a2211bdff4 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -1383,9 +1383,13 @@ static int stm32_dfsdm_dma_request(struct iio_dev *indio_dev)
 {
 	struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
 
-	adc->dma_chan = dma_request_slave_channel(&indio_dev->dev, "rx");
-	if (!adc->dma_chan)
-		return -EINVAL;
+	adc->dma_chan = dma_request_chan(&indio_dev->dev, "rx");
+	if (IS_ERR(adc->dma_chan)) {
+		int ret = PTR_ERR(adc->dma_chan);
+
+		adc->dma_chan = NULL;
+		return ret;  
You may "return PTR_ERR(adc->dma_chan);" directly here.  
I don't make decision here on behalf of the adc path on to go forward w/
or w/o DMA support and if we go ahead the stm32_dfsdm_dma_release()
needs the dma_chan to be NULL in case we don't use DMA.

It is much cleaner to set dma_chan to NULL here than doing it in other
paths.  
Hi Peter,  
Hi Fabrice,
  
quoted
Sorry I wasn't clear enough. I agree with you. I was suggesting only,
talking about the 'ret' variable. It may be removed to spare a few lines
:-).
	if (IS_ERR(adc->dma_chan)) {
		adc->dma_chan = NULL;
		return PTR_ERR(adc->dma_chan);
	}
I'm okay both ways.  
PTR_ERR(NULL); will return 0
I need to retrieve the actual error code before NULLing dma_chan.  
Oh yes, so please forget this.
Thanks,
Fabrice
Applied to the togreg branch of iio.git and pushed out as testing.
Note I'll need to rebase once Greg pushes out staging/staging-next
with the changes currently in staging/staging-testing.  Shouldn't
have an effect on this though!

Thanks,

Jonathan
quoted
  
quoted
 
quoted
 
quoted
Best Regards,
Fabrice
 
quoted
+	}
 
 	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
 					 DFSDM_DMA_BUFFER_SIZE,
@@ -1509,7 +1513,16 @@ static int stm32_dfsdm_adc_init(struct iio_dev *indio_dev)
 	init_completion(&adc->completion);
 
 	/* Optionally request DMA */
-	if (stm32_dfsdm_dma_request(indio_dev)) {
+	ret = stm32_dfsdm_dma_request(indio_dev);
+	if (ret) {
+		if (ret != -ENODEV) {
+			if (ret != -EPROBE_DEFER)
+				dev_err(&indio_dev->dev,
+					"DMA channel request failed with %d\n",
+					ret);
+			return ret;
+		}
+
 		dev_dbg(&indio_dev->dev, "No DMA support\n");
 		return 0;
 	}
 
- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
 
- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
  

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help