]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - queue-4.4/spi-tegra114-reset-controller-on-probe.patch
drop rdma-cma-consider-scope_id-while-binding-to-ipv6-ll-.patch from 4.4, 4.9, and...
[thirdparty/kernel/stable-queue.git] / queue-4.4 / spi-tegra114-reset-controller-on-probe.patch
CommitLineData
1143c684
SL
1From fce4bd58064922a22d90c2872caad547af4451c7 Mon Sep 17 00:00:00 2001
2From: Sowjanya Komatineni <skomatineni@nvidia.com>
3Date: Tue, 26 Mar 2019 22:56:32 -0700
4Subject: spi: tegra114: reset controller on probe
5
6[ Upstream commit 019194933339b3e9b486639c8cb3692020844d65 ]
7
8Fixes: SPI driver can be built as module so perform SPI controller reset
9on probe to make sure it is in valid state before initiating transfer.
10
11Signed-off-by: Sowjanya Komatineni <skomatineni@nvidia.com>
12Signed-off-by: Mark Brown <broonie@kernel.org>
13Signed-off-by: Sasha Levin <sashal@kernel.org>
14---
15 drivers/spi/spi-tegra114.c | 32 ++++++++++++++++++--------------
16 1 file changed, 18 insertions(+), 14 deletions(-)
17
18diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c
19index 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)
23
24 spi_irq = platform_get_irq(pdev, 0);
25 tspi->irq = spi_irq;
26- ret = request_threaded_irq(tspi->irq, tegra_spi_isr,
27- tegra_spi_isr_thread, IRQF_ONESHOT,
28- dev_name(&pdev->dev), tspi);
29- if (ret < 0) {
30- dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
31- tspi->irq);
32- goto exit_free_master;
33- }
34
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);
39- goto exit_free_irq;
40+ goto exit_free_master;
41 }
42
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);
47- goto exit_free_irq;
48+ goto exit_free_master;
49 }
50
51 tspi->max_buf_size = SPI_FIFO_DEPTH << 2;
52@@ -1095,7 +1087,7 @@ static int tegra_spi_probe(struct platform_device *pdev)
53
54 ret = tegra_spi_init_dma_param(tspi, true);
55 if (ret < 0)
56- goto exit_free_irq;
57+ goto exit_free_master;
58 ret = tegra_spi_init_dma_param(tspi, false);
59 if (ret < 0)
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);
63 goto exit_pm_disable;
64 }
65+
66+ reset_control_assert(tspi->rst);
67+ udelay(2);
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);
75+ if (ret < 0) {
76+ dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
77+ tspi->irq);
78+ goto exit_pm_disable;
79+ }
80
81 master->dev.of_node = pdev->dev.of_node;
82 ret = devm_spi_register_master(&pdev->dev, master);
83 if (ret < 0) {
84 dev_err(&pdev->dev, "can not register to master err %d\n", ret);
85- goto exit_pm_disable;
86+ goto exit_free_irq;
87 }
88 return ret;
89
90+exit_free_irq:
91+ free_irq(spi_irq, tspi);
92 exit_pm_disable:
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);
97 exit_rx_dma_free:
98 tegra_spi_deinit_dma_param(tspi, true);
99-exit_free_irq:
100- free_irq(spi_irq, tspi);
101 exit_free_master:
102 spi_master_put(master);
103 return ret;
104--
1052.20.1
106