diff mbox series

spi: tegra20-slink: Ensure SPI controller reset is deasserted

Message ID 20210608071518.93037-1-jonathanh@nvidia.com
State Accepted
Headers show
Series spi: tegra20-slink: Ensure SPI controller reset is deasserted | expand

Commit Message

Jon Hunter June 8, 2021, 7:15 a.m. UTC
Commit 4782c0a5dd88 ("clk: tegra: Don't deassert reset on enabling
clocks") removed some legacy code for handling resets on Tegra from
within the Tegra clock code. This exposed an issue in the Tegra20 slink
driver where the SPI controller reset was not being deasserted as needed
during probe. This is causing the Tegra30 Cardhu platform to hang on
boot. Fix this by ensuring the SPI controller reset is deasserted during
probe.

Fixes: 4782c0a5dd88 ("clk: tegra: Don't deassert reset on enabling clocks")
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
---
 drivers/spi/spi-tegra20-slink.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Thierry Reding June 8, 2021, 12:10 p.m. UTC | #1
On Tue, Jun 08, 2021 at 08:15:18AM +0100, Jon Hunter wrote:
> Commit 4782c0a5dd88 ("clk: tegra: Don't deassert reset on enabling
> clocks") removed some legacy code for handling resets on Tegra from
> within the Tegra clock code. This exposed an issue in the Tegra20 slink
> driver where the SPI controller reset was not being deasserted as needed
> during probe. This is causing the Tegra30 Cardhu platform to hang on
> boot. Fix this by ensuring the SPI controller reset is deasserted during
> probe.
> 
> Fixes: 4782c0a5dd88 ("clk: tegra: Don't deassert reset on enabling clocks")

While it technically fixes an issue uncovered by that patch, I would
argue that the underlying issue has been present forever. So I think
this should be applied regardless of the above patch.

It also makes me wonder if we shouldn't drop the clock patch for now to
unbreak things and avoid having to model complicated dependencies to
make sure everything continues to work in v5.14-rc1.

Unless perhaps if Mark applies this for v5.13, then we can merge the
clock patch for v5.14-rc1 since SPI is the only IP that seems to be
broken by that change.

> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
> ---
>  drivers/spi/spi-tegra20-slink.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c
> index f7c832fd4003..6a726c95ac7a 100644
> --- a/drivers/spi/spi-tegra20-slink.c
> +++ b/drivers/spi/spi-tegra20-slink.c
> @@ -1118,6 +1118,11 @@ static int tegra_slink_probe(struct platform_device *pdev)
>  		pm_runtime_put_noidle(&pdev->dev);
>  		goto exit_pm_disable;
>  	}
> +
> +	reset_control_assert(tspi->rst);
> +	udelay(2);
> +	reset_control_deassert(tspi->rst);
> +

I wonder if this doesn't break now again on suspend/resume. Should we
perhaps move this into tegra_slink_runtime_resume()? Or better yet, move
the reset_control_assert() into tegra_slink_runtime_suspend() and the
reset_control_deassert() into tegra_slink_runtime_resume(). That should
ensure the device's reset is always deasserted when runtime resumed.

Thierry
Jon Hunter June 8, 2021, 12:35 p.m. UTC | #2
On 08/06/2021 13:10, Thierry Reding wrote:
> On Tue, Jun 08, 2021 at 08:15:18AM +0100, Jon Hunter wrote:
>> Commit 4782c0a5dd88 ("clk: tegra: Don't deassert reset on enabling
>> clocks") removed some legacy code for handling resets on Tegra from
>> within the Tegra clock code. This exposed an issue in the Tegra20 slink
>> driver where the SPI controller reset was not being deasserted as needed
>> during probe. This is causing the Tegra30 Cardhu platform to hang on
>> boot. Fix this by ensuring the SPI controller reset is deasserted during
>> probe.
>>
>> Fixes: 4782c0a5dd88 ("clk: tegra: Don't deassert reset on enabling clocks")
> 
> While it technically fixes an issue uncovered by that patch, I would
> argue that the underlying issue has been present forever. So I think
> this should be applied regardless of the above patch.

Yes that is true and there is no dependency per-se but wanted to
highlight that up until that patch there were no issues.

> It also makes me wonder if we shouldn't drop the clock patch for now to
> unbreak things and avoid having to model complicated dependencies to
> make sure everything continues to work in v5.14-rc1.

Yes but I guess we will need to revert that one now as it is part of the
pull request you sent. However, that is fine with me.

> Unless perhaps if Mark applies this for v5.13, then we can merge the
> clock patch for v5.14-rc1 since SPI is the only IP that seems to be
> broken by that change.

Yes that works too.

>> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
>> ---
>>  drivers/spi/spi-tegra20-slink.c | 5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c
>> index f7c832fd4003..6a726c95ac7a 100644
>> --- a/drivers/spi/spi-tegra20-slink.c
>> +++ b/drivers/spi/spi-tegra20-slink.c
>> @@ -1118,6 +1118,11 @@ static int tegra_slink_probe(struct platform_device *pdev)
>>  		pm_runtime_put_noidle(&pdev->dev);
>>  		goto exit_pm_disable;
>>  	}
>> +
>> +	reset_control_assert(tspi->rst);
>> +	udelay(2);
>> +	reset_control_deassert(tspi->rst);
>> +
> 
> I wonder if this doesn't break now again on suspend/resume. Should we
> perhaps move this into tegra_slink_runtime_resume()? Or better yet, move
> the reset_control_assert() into tegra_slink_runtime_suspend() and the
> reset_control_deassert() into tegra_slink_runtime_resume(). That should
> ensure the device's reset is always deasserted when runtime resumed.

So we do test suspend/resume on Cardhu and I have seen no issues with
this applied. At first I did put this in the runtime_suspend/resume
handlers, but then looking at what is done in spi-tegra114.c it appears
we just do this on probe. See ...

commit 019194933339b3e9b486639c8cb3692020844d65
Author: Sowjanya Komatineni <skomatineni@nvidia.com>
Date:   Tue Mar 26 22:56:32 2019 -0700

    spi: tegra114: reset controller on probe

I guess moving it to the runtime_suspend/resume handlers would be more
consistent with the previous code. What do you think?

Jon
Thierry Reding June 8, 2021, 1:16 p.m. UTC | #3
On Tue, Jun 08, 2021 at 01:35:11PM +0100, Jon Hunter wrote:
> 
> On 08/06/2021 13:10, Thierry Reding wrote:
> > On Tue, Jun 08, 2021 at 08:15:18AM +0100, Jon Hunter wrote:
> >> Commit 4782c0a5dd88 ("clk: tegra: Don't deassert reset on enabling
> >> clocks") removed some legacy code for handling resets on Tegra from
> >> within the Tegra clock code. This exposed an issue in the Tegra20 slink
> >> driver where the SPI controller reset was not being deasserted as needed
> >> during probe. This is causing the Tegra30 Cardhu platform to hang on
> >> boot. Fix this by ensuring the SPI controller reset is deasserted during
> >> probe.
> >>
> >> Fixes: 4782c0a5dd88 ("clk: tegra: Don't deassert reset on enabling clocks")
> > 
> > While it technically fixes an issue uncovered by that patch, I would
> > argue that the underlying issue has been present forever. So I think
> > this should be applied regardless of the above patch.
> 
> Yes that is true and there is no dependency per-se but wanted to
> highlight that up until that patch there were no issues.
> 
> > It also makes me wonder if we shouldn't drop the clock patch for now to
> > unbreak things and avoid having to model complicated dependencies to
> > make sure everything continues to work in v5.14-rc1.
> 
> Yes but I guess we will need to revert that one now as it is part of the
> pull request you sent. However, that is fine with me.
> 
> > Unless perhaps if Mark applies this for v5.13, then we can merge the
> > clock patch for v5.14-rc1 since SPI is the only IP that seems to be
> > broken by that change.
> 
> Yes that works too.
> 
> >> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
> >> ---
> >>  drivers/spi/spi-tegra20-slink.c | 5 +++++
> >>  1 file changed, 5 insertions(+)
> >>
> >> diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c
> >> index f7c832fd4003..6a726c95ac7a 100644
> >> --- a/drivers/spi/spi-tegra20-slink.c
> >> +++ b/drivers/spi/spi-tegra20-slink.c
> >> @@ -1118,6 +1118,11 @@ static int tegra_slink_probe(struct platform_device *pdev)
> >>  		pm_runtime_put_noidle(&pdev->dev);
> >>  		goto exit_pm_disable;
> >>  	}
> >> +
> >> +	reset_control_assert(tspi->rst);
> >> +	udelay(2);
> >> +	reset_control_deassert(tspi->rst);
> >> +
> > 
> > I wonder if this doesn't break now again on suspend/resume. Should we
> > perhaps move this into tegra_slink_runtime_resume()? Or better yet, move
> > the reset_control_assert() into tegra_slink_runtime_suspend() and the
> > reset_control_deassert() into tegra_slink_runtime_resume(). That should
> > ensure the device's reset is always deasserted when runtime resumed.
> 
> So we do test suspend/resume on Cardhu and I have seen no issues with
> this applied. At first I did put this in the runtime_suspend/resume
> handlers, but then looking at what is done in spi-tegra114.c it appears
> we just do this on probe. See ...
> 
> commit 019194933339b3e9b486639c8cb3692020844d65
> Author: Sowjanya Komatineni <skomatineni@nvidia.com>
> Date:   Tue Mar 26 22:56:32 2019 -0700
> 
>     spi: tegra114: reset controller on probe
> 
> I guess moving it to the runtime_suspend/resume handlers would be more
> consistent with the previous code. What do you think?

Do we test that SPI is still functional after suspend/resume? If it is,
I have no objection to this patch. I think making this part of runtime
suspend/resume would be a bit more correct or robust, but it's also a
bit more complicated and might introduce other problems. For example,
I suspect that if we reset on runtime suspend/resume, we would likely
need to reprogram the SLINK_COMMAND* registers as well.

Thierry
Dmitry Osipenko June 8, 2021, 3:16 p.m. UTC | #4
08.06.2021 16:16, Thierry Reding пишет:
>>> Unless perhaps if Mark applies this for v5.13, then we can merge the
>>> clock patch for v5.14-rc1 since SPI is the only IP that seems to be
>>> broken by that change.
>> Yes that works too.

Will be great if this SPI fix could be merged into 5.13. It took two
kernel releases to fix the audio resets, so I prefer not to postpone the
clk patch again.

>>>> Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
>>>> ---
>>>>  drivers/spi/spi-tegra20-slink.c | 5 +++++
>>>>  1 file changed, 5 insertions(+)
>>>>
>>>> diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c
>>>> index f7c832fd4003..6a726c95ac7a 100644
>>>> --- a/drivers/spi/spi-tegra20-slink.c
>>>> +++ b/drivers/spi/spi-tegra20-slink.c
>>>> @@ -1118,6 +1118,11 @@ static int tegra_slink_probe(struct platform_device *pdev)
>>>>  		pm_runtime_put_noidle(&pdev->dev);
>>>>  		goto exit_pm_disable;
>>>>  	}
>>>> +
>>>> +	reset_control_assert(tspi->rst);
>>>> +	udelay(2);
>>>> +	reset_control_deassert(tspi->rst);
>>>> +
>>> I wonder if this doesn't break now again on suspend/resume. Should we
>>> perhaps move this into tegra_slink_runtime_resume()? Or better yet, move
>>> the reset_control_assert() into tegra_slink_runtime_suspend() and the
>>> reset_control_deassert() into tegra_slink_runtime_resume(). That should
>>> ensure the device's reset is always deasserted when runtime resumed.
>> So we do test suspend/resume on Cardhu and I have seen no issues with
>> this applied. At first I did put this in the runtime_suspend/resume
>> handlers, but then looking at what is done in spi-tegra114.c it appears
>> we just do this on probe. See ...
>>
>> commit 019194933339b3e9b486639c8cb3692020844d65
>> Author: Sowjanya Komatineni <skomatineni@nvidia.com>
>> Date:   Tue Mar 26 22:56:32 2019 -0700
>>
>>     spi: tegra114: reset controller on probe
>>
>> I guess moving it to the runtime_suspend/resume handlers would be more
>> consistent with the previous code. What do you think?
> Do we test that SPI is still functional after suspend/resume? If it is,
> I have no objection to this patch. I think making this part of runtime
> suspend/resume would be a bit more correct or robust, but it's also a
> bit more complicated and might introduce other problems. For example,
> I suspect that if we reset on runtime suspend/resume, we would likely
> need to reprogram the SLINK_COMMAND* registers as well.

We don't support LP0 suspend state for older Tegra SoCs where hardware
state is lost after suspending. Lot's of device drivers don't do
suspend/resume properly. Fixing suspend/resume should be a separate
patch, IMO.
Mark Brown June 8, 2021, 4:06 p.m. UTC | #5
On Tue, 8 Jun 2021 08:15:18 +0100, Jon Hunter wrote:
> Commit 4782c0a5dd88 ("clk: tegra: Don't deassert reset on enabling
> clocks") removed some legacy code for handling resets on Tegra from
> within the Tegra clock code. This exposed an issue in the Tegra20 slink
> driver where the SPI controller reset was not being deasserted as needed
> during probe. This is causing the Tegra30 Cardhu platform to hang on
> boot. Fix this by ensuring the SPI controller reset is deasserted during
> probe.

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-next

Thanks!

[1/1] spi: tegra20-slink: Ensure SPI controller reset is deasserted
      commit: aceda401e84115bf9121454828f9da63c2a94482

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark
diff mbox series

Patch

diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c
index f7c832fd4003..6a726c95ac7a 100644
--- a/drivers/spi/spi-tegra20-slink.c
+++ b/drivers/spi/spi-tegra20-slink.c
@@ -1118,6 +1118,11 @@  static int tegra_slink_probe(struct platform_device *pdev)
 		pm_runtime_put_noidle(&pdev->dev);
 		goto exit_pm_disable;
 	}
+
+	reset_control_assert(tspi->rst);
+	udelay(2);
+	reset_control_deassert(tspi->rst);
+
 	tspi->def_command_reg  = SLINK_M_S;
 	tspi->def_command2_reg = SLINK_CS_ACTIVE_BETWEEN;
 	tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND);