Skip to content

Commit 9f16a87

Browse files
krzkgregkh
authored andcommitted
spi: spi-fsl-dspi: Fix imprecise abort on VF500 during probe
commit d8ffee2 upstream. Registers of DSPI should not be accessed before enabling its clock. On Toradex Colibri VF50 on Iris carrier board this could be seen during bootup as imprecise abort: Unhandled fault: imprecise external abort (0x1c06) at 0x00000000 Internal error: : 1c06 [#1] ARM Modules linked in: CPU: 0 PID: 1 Comm: swapper Not tainted 4.14.39-dirty #97 Hardware name: Freescale Vybrid VF5xx/VF6xx (Device Tree) Backtrace: [<804166a8>] (regmap_write) from [<80466b5c>] (dspi_probe+0x1f0/0x8dc) [<8046696c>] (dspi_probe) from [<8040107c>] (platform_drv_probe+0x54/0xb8) [<80401028>] (platform_drv_probe) from [<803ff53c>] (driver_probe_device+0x280/0x2f8) [<803ff2bc>] (driver_probe_device) from [<803ff674>] (__driver_attach+0xc0/0xc4) [<803ff5b4>] (__driver_attach) from [<803fd818>] (bus_for_each_dev+0x70/0xa4) [<803fd7a8>] (bus_for_each_dev) from [<803fee74>] (driver_attach+0x24/0x28) [<803fee50>] (driver_attach) from [<803fe980>] (bus_add_driver+0x1a0/0x218) [<803fe7e0>] (bus_add_driver) from [<803fffe8>] (driver_register+0x80/0x100) [<803fff68>] (driver_register) from [<80400fdc>] (__platform_driver_register+0x48/0x50) [<80400f94>] (__platform_driver_register) from [<8091cf7c>] (fsl_dspi_driver_init+0x1c/0x20) [<8091cf60>] (fsl_dspi_driver_init) from [<8010195c>] (do_one_initcall+0x4c/0x174) [<80101910>] (do_one_initcall) from [<80900e8c>] (kernel_init_freeable+0x144/0x1d8) [<80900d48>] (kernel_init_freeable) from [<805ff6a8>] (kernel_init+0x10/0x114) [<805ff698>] (kernel_init) from [<80107be8>] (ret_from_fork+0x14/0x2c) Cc: <stable@vger.kernel.org> Fixes: 5ee67b5 ("spi: dspi: clear SPI_SR before enable interrupt") Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org> Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent ae8f22e commit 9f16a87

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

drivers/spi/spi-fsl-dspi.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -715,30 +715,30 @@ static int dspi_probe(struct platform_device *pdev)
715715
return PTR_ERR(dspi->regmap);
716716
}
717717

718+
dspi->clk = devm_clk_get(&pdev->dev, "dspi");
719+
if (IS_ERR(dspi->clk)) {
720+
ret = PTR_ERR(dspi->clk);
721+
dev_err(&pdev->dev, "unable to get clock\n");
722+
goto out_master_put;
723+
}
724+
ret = clk_prepare_enable(dspi->clk);
725+
if (ret)
726+
goto out_master_put;
727+
718728
dspi_init(dspi);
719729
dspi->irq = platform_get_irq(pdev, 0);
720730
if (dspi->irq < 0) {
721731
dev_err(&pdev->dev, "can't get platform irq\n");
722732
ret = dspi->irq;
723-
goto out_master_put;
733+
goto out_clk_put;
724734
}
725735

726736
ret = devm_request_irq(&pdev->dev, dspi->irq, dspi_interrupt, 0,
727737
pdev->name, dspi);
728738
if (ret < 0) {
729739
dev_err(&pdev->dev, "Unable to attach DSPI interrupt\n");
730-
goto out_master_put;
731-
}
732-
733-
dspi->clk = devm_clk_get(&pdev->dev, "dspi");
734-
if (IS_ERR(dspi->clk)) {
735-
ret = PTR_ERR(dspi->clk);
736-
dev_err(&pdev->dev, "unable to get clock\n");
737-
goto out_master_put;
740+
goto out_clk_put;
738741
}
739-
ret = clk_prepare_enable(dspi->clk);
740-
if (ret)
741-
goto out_master_put;
742742

743743
master->max_speed_hz =
744744
clk_get_rate(dspi->clk) / dspi->devtype_data->max_clock_factor;

0 commit comments

Comments
 (0)