Message ID | 20200709074037.v2.1.I0b701fc23eca911a5bde4ae4fa7f97543d7f960e@changeid (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] spi: spi-geni-qcom: Set the clock properly at runtime resume | expand |
On 7/9/2020 8:10 PM, Douglas Anderson wrote: > In the patch ("spi: spi-geni-qcom: Avoid clock setting if not needed") > we avoid a whole pile of clock code. As part of that, we should have > restored the clock at runtime resume. Do that. > > It turns out that, at least with today's configurations, this doesn't > actually matter. That's because none of the current device trees have > an OPP table for geni SPI yet. That makes dev_pm_opp_set_rate(dev, 0) > a no-op. This is why it wasn't noticed in the testing of the original > patch. It's still a good idea to fix, though. > > Signed-off-by: Douglas Anderson <dianders@chromium.org> > Acked-by: Mark Brown <broonie@kernel.org> Reviewed-by: Rajendra Nayak <rnayak@codeaurora.org> > --- > Sending this as a separate patch even though I think the patch it's > fixing [1] hasn't landed yet. I'd be happy if this was squashed into > that patch when landing if that suits everyone, but it could land on > its own too. > > Like the patch it's fixing, this needs to target the Qualcomm tree in > order to avoid merge conflicts. > > [1] https://lore.kernel.org/r/20200701174506.1.Icfdcee14649fc0a6c38e87477b28523d4e60bab3@changeid > > Changes in v2: > - Return error from runtime resume if dev_pm_opp_set_rate() fails. > > drivers/spi/spi-geni-qcom.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/drivers/spi/spi-geni-qcom.c b/drivers/spi/spi-geni-qcom.c > index 97fac5ea6afd..0e11a90490ff 100644 > --- a/drivers/spi/spi-geni-qcom.c > +++ b/drivers/spi/spi-geni-qcom.c > @@ -79,6 +79,7 @@ struct spi_geni_master { > u32 tx_wm; > u32 last_mode; > unsigned long cur_speed_hz; > + unsigned long cur_sclk_hz; > unsigned int cur_bits_per_word; > unsigned int tx_rem_bytes; > unsigned int rx_rem_bytes; > @@ -116,6 +117,9 @@ static int get_spi_clk_cfg(unsigned int speed_hz, > ret = dev_pm_opp_set_rate(mas->dev, sclk_freq); > if (ret) > dev_err(mas->dev, "dev_pm_opp_set_rate failed %d\n", ret); > + else > + mas->cur_sclk_hz = sclk_freq; > + > return ret; > } > > @@ -670,7 +674,11 @@ static int __maybe_unused spi_geni_runtime_resume(struct device *dev) > if (ret) > return ret; > > - return geni_se_resources_on(&mas->se); > + ret = geni_se_resources_on(&mas->se); > + if (ret) > + return ret; > + > + return dev_pm_opp_set_rate(mas->dev, mas->cur_sclk_hz); > } > > static int __maybe_unused spi_geni_suspend(struct device *dev) >
On 7/9/2020 8:10 PM, Douglas Anderson wrote: > In the patch ("spi: spi-geni-qcom: Avoid clock setting if not needed") > we avoid a whole pile of clock code. As part of that, we should have > restored the clock at runtime resume. Do that. > > It turns out that, at least with today's configurations, this doesn't > actually matter. That's because none of the current device trees have > an OPP table for geni SPI yet. That makes dev_pm_opp_set_rate(dev, 0) > a no-op. This is why it wasn't noticed in the testing of the original > patch. It's still a good idea to fix, though. Reviewed-by: Akash Asthana <akashast@codeaurora.org>
diff --git a/drivers/spi/spi-geni-qcom.c b/drivers/spi/spi-geni-qcom.c index 97fac5ea6afd..0e11a90490ff 100644 --- a/drivers/spi/spi-geni-qcom.c +++ b/drivers/spi/spi-geni-qcom.c @@ -79,6 +79,7 @@ struct spi_geni_master { u32 tx_wm; u32 last_mode; unsigned long cur_speed_hz; + unsigned long cur_sclk_hz; unsigned int cur_bits_per_word; unsigned int tx_rem_bytes; unsigned int rx_rem_bytes; @@ -116,6 +117,9 @@ static int get_spi_clk_cfg(unsigned int speed_hz, ret = dev_pm_opp_set_rate(mas->dev, sclk_freq); if (ret) dev_err(mas->dev, "dev_pm_opp_set_rate failed %d\n", ret); + else + mas->cur_sclk_hz = sclk_freq; + return ret; } @@ -670,7 +674,11 @@ static int __maybe_unused spi_geni_runtime_resume(struct device *dev) if (ret) return ret; - return geni_se_resources_on(&mas->se); + ret = geni_se_resources_on(&mas->se); + if (ret) + return ret; + + return dev_pm_opp_set_rate(mas->dev, mas->cur_sclk_hz); } static int __maybe_unused spi_geni_suspend(struct device *dev)