spi: spi-fsl-lpspi: Fix scldiv calculation
[ Upstream commit 730bbfaf7d4890bd99e637db7767dc68cfeb24e7 ]
The effective SPI clock frequency should never exceed speed_hz
otherwise this might result in undefined behavior of the SPI device.
Currently the scldiv calculation could violate this constraint.
For the example parameters perclk_rate = 24 MHz and speed_hz = 7 MHz,
the function fsl_lpspi_set_bitrate will determine perscale = 0 and
scldiv = 1, which is a effective SPI clock of 8 MHz.
So fix this by rounding up the quotient of perclk_rate and speed_hz.
While this never change within the loop, we can pull this out.
Fixes: 5314987de5
("spi: imx: add lpspi bus driver")
Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
Link: https://patch.msgid.link/20240804113611.83613-1-wahrenst@gmx.net
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Родитель
4b316da441
Коммит
4f8c8edede
|
@ -297,7 +297,7 @@ static void fsl_lpspi_set_watermark(struct fsl_lpspi_data *fsl_lpspi)
|
||||||
static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi)
|
static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi)
|
||||||
{
|
{
|
||||||
struct lpspi_config config = fsl_lpspi->config;
|
struct lpspi_config config = fsl_lpspi->config;
|
||||||
unsigned int perclk_rate, scldiv;
|
unsigned int perclk_rate, scldiv, div;
|
||||||
u8 prescale;
|
u8 prescale;
|
||||||
|
|
||||||
perclk_rate = clk_get_rate(fsl_lpspi->clk_per);
|
perclk_rate = clk_get_rate(fsl_lpspi->clk_per);
|
||||||
|
@ -308,8 +308,10 @@ static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div = DIV_ROUND_UP(perclk_rate, config.speed_hz);
|
||||||
|
|
||||||
for (prescale = 0; prescale < 8; prescale++) {
|
for (prescale = 0; prescale < 8; prescale++) {
|
||||||
scldiv = perclk_rate / config.speed_hz / (1 << prescale) - 2;
|
scldiv = div / (1 << prescale) - 2;
|
||||||
if (scldiv < 256) {
|
if (scldiv < 256) {
|
||||||
fsl_lpspi->config.prescale = prescale;
|
fsl_lpspi->config.prescale = prescale;
|
||||||
break;
|
break;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче