Skip to content

Commit 7001cab

Browse files
ziswilerbroonie
authored andcommitted
spi: tegra20-slink: explicitly enable/disable clock
Depending on the SPI instance one may get an interrupt storm upon requesting resp. interrupt unless the clock is explicitly enabled beforehand. This has been observed trying to bring up instance 4 on T20. Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> Signed-off-by: Mark Brown <broonie@kernel.org> Cc: stable@vger.kernel.org
1 parent 5223c9c commit 7001cab

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

drivers/spi/spi-tegra20-slink.c

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,24 @@ static int tegra_slink_probe(struct platform_device *pdev)
10631063
goto exit_free_master;
10641064
}
10651065

1066+
/* disabled clock may cause interrupt storm upon request */
1067+
tspi->clk = devm_clk_get(&pdev->dev, NULL);
1068+
if (IS_ERR(tspi->clk)) {
1069+
ret = PTR_ERR(tspi->clk);
1070+
dev_err(&pdev->dev, "Can not get clock %d\n", ret);
1071+
goto exit_free_master;
1072+
}
1073+
ret = clk_prepare(tspi->clk);
1074+
if (ret < 0) {
1075+
dev_err(&pdev->dev, "Clock prepare failed %d\n", ret);
1076+
goto exit_free_master;
1077+
}
1078+
ret = clk_enable(tspi->clk);
1079+
if (ret < 0) {
1080+
dev_err(&pdev->dev, "Clock enable failed %d\n", ret);
1081+
goto exit_free_master;
1082+
}
1083+
10661084
spi_irq = platform_get_irq(pdev, 0);
10671085
tspi->irq = spi_irq;
10681086
ret = request_threaded_irq(tspi->irq, tegra_slink_isr,
@@ -1071,14 +1089,7 @@ static int tegra_slink_probe(struct platform_device *pdev)
10711089
if (ret < 0) {
10721090
dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
10731091
tspi->irq);
1074-
goto exit_free_master;
1075-
}
1076-
1077-
tspi->clk = devm_clk_get(&pdev->dev, NULL);
1078-
if (IS_ERR(tspi->clk)) {
1079-
dev_err(&pdev->dev, "can not get clock\n");
1080-
ret = PTR_ERR(tspi->clk);
1081-
goto exit_free_irq;
1092+
goto exit_clk_disable;
10821093
}
10831094

10841095
tspi->rst = devm_reset_control_get_exclusive(&pdev->dev, "spi");
@@ -1138,6 +1149,8 @@ static int tegra_slink_probe(struct platform_device *pdev)
11381149
tegra_slink_deinit_dma_param(tspi, true);
11391150
exit_free_irq:
11401151
free_irq(spi_irq, tspi);
1152+
exit_clk_disable:
1153+
clk_disable(tspi->clk);
11411154
exit_free_master:
11421155
spi_master_put(master);
11431156
return ret;
@@ -1150,6 +1163,8 @@ static int tegra_slink_remove(struct platform_device *pdev)
11501163

11511164
free_irq(tspi->irq, tspi);
11521165

1166+
clk_disable(tspi->clk);
1167+
11531168
if (tspi->tx_dma_chan)
11541169
tegra_slink_deinit_dma_param(tspi, false);
11551170

0 commit comments

Comments
 (0)