]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-4.4/spi-tegra114-reset-controller-on-probe.patch
drop drm-rockchip-shutdown-drm-subsystem-on-shutdown.patch from 4.4.y and 4.9.y
[thirdparty/kernel/stable-queue.git] / queue-4.4 / spi-tegra114-reset-controller-on-probe.patch
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
5
6 [ Upstream commit 019194933339b3e9b486639c8cb3692020844d65 ]
7
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.
10
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>
14 ---
15 drivers/spi/spi-tegra114.c | 32 ++++++++++++++++++--------------
16 1 file changed, 18 insertions(+), 14 deletions(-)
17
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)
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 --
105 2.20.1
106