]>
Commit | Line | Data |
---|---|---|
1143c684 SL |
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 |