Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: cadence: cache reference clock rate during probe

The issue is that using SPI from a callback under the CCF lock will
deadlock, since this code uses clk_get_rate().

Fixes: c474b38665463 ("spi: Add driver for Cadence SPI controller")
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Link: https://lore.kernel.org/r/20210114154217.51996-1-alexandru.ardelean@analog.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Michael Hennerich and committed by
Mark Brown
4d163ad7 7a2da5d7

+4 -2
+4 -2
drivers/spi/spi-cadence.c
··· 115 115 void __iomem *regs; 116 116 struct clk *ref_clk; 117 117 struct clk *pclk; 118 + unsigned int clk_rate; 118 119 u32 speed_hz; 119 120 const u8 *txbuf; 120 121 u8 *rxbuf; ··· 251 250 u32 ctrl_reg, baud_rate_val; 252 251 unsigned long frequency; 253 252 254 - frequency = clk_get_rate(xspi->ref_clk); 253 + frequency = xspi->clk_rate; 255 254 256 255 ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR); 257 256 ··· 559 558 master->auto_runtime_pm = true; 560 559 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; 561 560 561 + xspi->clk_rate = clk_get_rate(xspi->ref_clk); 562 562 /* Set to default valid value */ 563 - master->max_speed_hz = clk_get_rate(xspi->ref_clk) / 4; 563 + master->max_speed_hz = xspi->clk_rate / 4; 564 564 xspi->speed_hz = master->max_speed_hz; 565 565 566 566 master->bits_per_word_mask = SPI_BPW_MASK(8);