diff options
Diffstat (limited to 'drivers/spi/spi-fsl-lpspi.c')
-rw-r--r-- | drivers/spi/spi-fsl-lpspi.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c index 39870bc38e40..f608f89f45cd 100644 --- a/drivers/spi/spi-fsl-lpspi.c +++ b/drivers/spi/spi-fsl-lpspi.c @@ -888,12 +888,6 @@ static int fsl_lpspi_probe(struct platform_device *pdev) controller->bus_num = pdev->id; controller->slave_abort = fsl_lpspi_slave_abort; - ret = devm_spi_register_controller(&pdev->dev, controller); - if (ret < 0) { - dev_err(&pdev->dev, "spi_register_controller error.\n"); - goto out_controller_put; - } - if (!fsl_lpspi->is_slave) { controller->cs_gpios = devm_kzalloc(&controller->dev, sizeof(int) * controller->num_chipselect, GFP_KERNEL); @@ -901,6 +895,11 @@ static int fsl_lpspi_probe(struct platform_device *pdev) for (i = 0; i < controller->num_chipselect; i++) { int cs_gpio = of_get_named_gpio(np, "cs-gpios", i); + if (cs_gpio == -EPROBE_DEFER) { + ret = -EPROBE_DEFER; + goto out_controller_put; + } + if (!gpio_is_valid(cs_gpio) && lpspi_platform_info) cs_gpio = lpspi_platform_info->chipselect[i]; @@ -971,13 +970,30 @@ static int fsl_lpspi_probe(struct platform_device *pdev) ret = fsl_lpspi_dma_init(&pdev->dev, fsl_lpspi, controller); if (ret == -EPROBE_DEFER) - goto out_controller_put; - + goto err_disable_runtime_pm; if (ret < 0) dev_err(&pdev->dev, "dma setup error %d, use pio\n", ret); + else + /* disable LPSPI module IRQ when enable DMA mode successfully, + * to prevent the unexpected LPSPI module IRQ events*/ + disable_irq(irq); + + ret = devm_spi_register_controller(&pdev->dev, controller); + if (ret < 0) { + dev_err(&pdev->dev, "spi_register_controller error.\n"); + goto err_disable_runtime_pm; + } + + pm_runtime_mark_last_busy(fsl_lpspi->dev); + pm_runtime_put_autosuspend(fsl_lpspi->dev); return 0; +err_disable_runtime_pm: + pm_runtime_dont_use_autosuspend(fsl_lpspi->dev); + pm_runtime_put_sync(fsl_lpspi->dev); + pm_runtime_disable(fsl_lpspi->dev); + out_controller_put: spi_controller_put(controller); |