diff options
author | Jose Abreu <Jose.Abreu@synopsys.com> | 2016-12-13 11:03:49 +0000 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-12-14 14:38:10 +0000 |
commit | 6fce983f9b3ef51d47e647b2cff15049ef803781 (patch) | |
tree | f96b8e3c51cad5fe29f7aed5f91d688cea61daed /sound | |
parent | a5de5b74a50113564a1e0850e2da96c37c35e55d (diff) | |
download | op-kernel-dev-6fce983f9b3ef51d47e647b2cff15049ef803781.zip op-kernel-dev-6fce983f9b3ef51d47e647b2cff15049ef803781.tar.gz |
ASoC: dwc: Fix PIO mode initialization
We can no longer rely on the return value of
devm_snd_dmaengine_pcm_register(...) to check if the DMA
handle is declared in the DT.
Previously this check activated PIO mode but currently
dma_request_chan returns either a valid channel or -EPROBE_DEFER.
In order to activate PIO mode check instead if the interrupt
line is declared. This reflects better what is documented in
the DT bindings (see Documentation/devicetree/bindings/sound/
designware-i2s.txt).
Also, initialize use_pio variable which was never being set
causing PIO mode to never work.
Signed-off-by: Jose Abreu <joabreu@synopsys.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/dwc/designware_i2s.c | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/sound/soc/dwc/designware_i2s.c b/sound/soc/dwc/designware_i2s.c index 2998954a..bdf8398 100644 --- a/sound/soc/dwc/designware_i2s.c +++ b/sound/soc/dwc/designware_i2s.c @@ -681,22 +681,19 @@ static int dw_i2s_probe(struct platform_device *pdev) } if (!pdata) { - ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); - if (ret == -EPROBE_DEFER) { - dev_err(&pdev->dev, - "failed to register PCM, deferring probe\n"); - return ret; - } else if (ret) { - dev_err(&pdev->dev, - "Could not register DMA PCM: %d\n" - "falling back to PIO mode\n", ret); + if (irq >= 0) { ret = dw_pcm_register(pdev); - if (ret) { - dev_err(&pdev->dev, - "Could not register PIO PCM: %d\n", + dev->use_pio = true; + } else { + ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, + 0); + dev->use_pio = false; + } + + if (ret) { + dev_err(&pdev->dev, "could not register pcm: %d\n", ret); - goto err_clk_disable; - } + goto err_clk_disable; } } |