iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()

Message ID 20191217075221.23895-1-peter.ujfalusi@ti.com
State Accepted
Commit a9ab624edd9186fbad734cfe5d606a6da3ca34db
Headers show
Series
  • iio: adc: stm32-dfsdm: Use dma_request_chan() instead dma_request_slave_channel()
Related show

Commit Message

Peter Ujfalusi Dec. 17, 2019, 7:52 a.m.
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 <peter.ujfalusi@ti.com>

---
 drivers/iio/adc/stm32-dfsdm-adc.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

-- 
Peter

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

Comments

Jonathan Cameron Dec. 23, 2019, 3:45 p.m. | #1
On Tue, 17 Dec 2019 09:52:21 +0200
Peter Ujfalusi <peter.ujfalusi@ti.com> 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 <peter.ujfalusi@ti.com>

I don't think this one goes far enough.  

One of the paths does:

	/* Optionally request DMA */
	if (stm32_dfsdm_dma_request(indio_dev)) {
		dev_dbg(&indio_dev->dev, "No DMA support\n");
		return 0;
	}

That needs specific handling for deferred probing.

> ---

>  drivers/iio/adc/stm32-dfsdm-adc.c | 6 +++---

>  1 file changed, 3 insertions(+), 3 deletions(-)

> 

> diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c

> index e493242c266e..3aac1a21f9d0 100644

> --- a/drivers/iio/adc/stm32-dfsdm-adc.c

> +++ b/drivers/iio/adc/stm32-dfsdm-adc.c

> @@ -1383,9 +1383,9 @@ 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))

> +		return PTR_ERR(adc->dma_chan);

>  

>  	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,

>  					 DFSDM_DMA_BUFFER_SIZE,
Peter Ujfalusi Dec. 23, 2019, 10 p.m. | #2
Hi Jonathan,

On 12/23/19 5:45 PM, Jonathan Cameron wrote:
> On Tue, 17 Dec 2019 09:52:21 +0200

> Peter Ujfalusi <peter.ujfalusi@ti.com> 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 <peter.ujfalusi@ti.com>

> I don't think this one goes far enough.  

> 

> One of the paths does:

> 

> 	/* Optionally request DMA */

> 	if (stm32_dfsdm_dma_request(indio_dev)) {

> 		dev_dbg(&indio_dev->dev, "No DMA support\n");

> 		return 0;

> 	}

> 

> That needs specific handling for deferred probing.


Right, I have checked the stm32_dfsdm_audio_init() path, via that the
error is propagated correctly.

I'll send an update next year ;)

> 

>> ---

>>  drivers/iio/adc/stm32-dfsdm-adc.c | 6 +++---

>>  1 file changed, 3 insertions(+), 3 deletions(-)

>>

>> diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c

>> index e493242c266e..3aac1a21f9d0 100644

>> --- a/drivers/iio/adc/stm32-dfsdm-adc.c

>> +++ b/drivers/iio/adc/stm32-dfsdm-adc.c

>> @@ -1383,9 +1383,9 @@ 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))

>> +		return PTR_ERR(adc->dma_chan);

>>  

>>  	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,

>>  					 DFSDM_DMA_BUFFER_SIZE,

> 


- Peter

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

Patch

diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c
index e493242c266e..3aac1a21f9d0 100644
--- a/drivers/iio/adc/stm32-dfsdm-adc.c
+++ b/drivers/iio/adc/stm32-dfsdm-adc.c
@@ -1383,9 +1383,9 @@  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))
+		return PTR_ERR(adc->dma_chan);
 
 	adc->rx_buf = dma_alloc_coherent(adc->dma_chan->device->dev,
 					 DFSDM_DMA_BUFFER_SIZE,