On Fri, Mar 17, 2017 at 09:25:31AM +0000, Jon Hunter wrote: > It is common for SD/MMC host controllers to set the parent clock that > drives the SD/MMC interface in order to support various operating > speeds. Typically, this is performed by calling common clock framework > APIs such as clk_set_rate(). The problem is that these APIs may sleep > and must not be called from within atomic sections and therefore, these > functions cannot be called within the existing 'set_clock' SDHCI > operator because they are called from within the context of a spinlock. > Add a new 'set_parent_clock' operator for the SDHCI driver that is > called early during the SDHCI 'set_ios' before the spinlock is aquired > to give the platform driver the opportunity to set the parent clock > rate. > > Please note that the Tegra and MSM SDHCI drivers currently appear to > mis-use the 'set_clock' operator by calling clk_set_rate(). In the case > of Tegra, occasionally but not always, 'scheduling while atomic' errors > are reported (so most of the time we are getting lucky). In the of the > MSM SDHCI driver, it is releasing and re-acquiring the spinlock which is > bad. > > Signed-off-by: Jon Hunter <jonathanh@xxxxxxxxxx> > --- > > Changes since V1: > - Fixed idiotic copy-paste error and testing thoroughly! > > drivers/mmc/host/sdhci.c | 3 +++ > drivers/mmc/host/sdhci.h | 2 ++ > 2 files changed, 5 insertions(+) Reviewed-by: Thierry Reding <treding@xxxxxxxxxx>
Attachment:
signature.asc
Description: PGP signature