1 From fce4bd58064922a22d90c2872caad547af4451c7 Mon Sep 17 00:00:00 2001
2 From: Sowjanya Komatineni <skomatineni@nvidia.com>
3 Date: Tue, 26 Mar 2019 22:56:32 -0700
4 Subject: spi: tegra114: reset controller on probe
6 [ Upstream commit 019194933339b3e9b486639c8cb3692020844d65 ]
8 Fixes: SPI driver can be built as module so perform SPI controller reset
9 on probe to make sure it is in valid state before initiating transfer.
11 Signed-off-by: Sowjanya Komatineni <skomatineni@nvidia.com>
12 Signed-off-by: Mark Brown <broonie@kernel.org>
13 Signed-off-by: Sasha Levin <sashal@kernel.org>
15 drivers/spi/spi-tegra114.c | 32 ++++++++++++++++++--------------
16 1 file changed, 18 insertions(+), 14 deletions(-)
18 diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c
19 index 73779cecc3bbc..705f515863d4f 100644
20 --- a/drivers/spi/spi-tegra114.c
21 +++ b/drivers/spi/spi-tegra114.c
22 @@ -1067,27 +1067,19 @@ static int tegra_spi_probe(struct platform_device *pdev)
24 spi_irq = platform_get_irq(pdev, 0);
26 - ret = request_threaded_irq(tspi->irq, tegra_spi_isr,
27 - tegra_spi_isr_thread, IRQF_ONESHOT,
28 - dev_name(&pdev->dev), tspi);
30 - dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
32 - goto exit_free_master;
35 tspi->clk = devm_clk_get(&pdev->dev, "spi");
36 if (IS_ERR(tspi->clk)) {
37 dev_err(&pdev->dev, "can not get clock\n");
38 ret = PTR_ERR(tspi->clk);
40 + goto exit_free_master;
43 tspi->rst = devm_reset_control_get(&pdev->dev, "spi");
44 if (IS_ERR(tspi->rst)) {
45 dev_err(&pdev->dev, "can not get reset\n");
46 ret = PTR_ERR(tspi->rst);
48 + goto exit_free_master;
51 tspi->max_buf_size = SPI_FIFO_DEPTH << 2;
52 @@ -1095,7 +1087,7 @@ static int tegra_spi_probe(struct platform_device *pdev)
54 ret = tegra_spi_init_dma_param(tspi, true);
57 + goto exit_free_master;
58 ret = tegra_spi_init_dma_param(tspi, false);
60 goto exit_rx_dma_free;
61 @@ -1117,18 +1109,32 @@ static int tegra_spi_probe(struct platform_device *pdev)
62 dev_err(&pdev->dev, "pm runtime get failed, e = %d\n", ret);
66 + reset_control_assert(tspi->rst);
68 + reset_control_deassert(tspi->rst);
69 tspi->def_command1_reg = SPI_M_S;
70 tegra_spi_writel(tspi, tspi->def_command1_reg, SPI_COMMAND1);
71 pm_runtime_put(&pdev->dev);
72 + ret = request_threaded_irq(tspi->irq, tegra_spi_isr,
73 + tegra_spi_isr_thread, IRQF_ONESHOT,
74 + dev_name(&pdev->dev), tspi);
76 + dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
78 + goto exit_pm_disable;
81 master->dev.of_node = pdev->dev.of_node;
82 ret = devm_spi_register_master(&pdev->dev, master);
84 dev_err(&pdev->dev, "can not register to master err %d\n", ret);
85 - goto exit_pm_disable;
91 + free_irq(spi_irq, tspi);
93 pm_runtime_disable(&pdev->dev);
94 if (!pm_runtime_status_suspended(&pdev->dev))
95 @@ -1136,8 +1142,6 @@ static int tegra_spi_probe(struct platform_device *pdev)
96 tegra_spi_deinit_dma_param(tspi, false);
98 tegra_spi_deinit_dma_param(tspi, true);
100 - free_irq(spi_irq, tspi);
102 spi_master_put(master);