Patch "spi: spi-fsl-lpspi: Fix scldiv calculation" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    spi: spi-fsl-lpspi: Fix scldiv calculation

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     spi-spi-fsl-lpspi-fix-scldiv-calculation.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit adfc9e20a1fbd6c5157d847d2a7fb26ee1ff2a67
Author: Stefan Wahren <wahrenst@xxxxxxx>
Date:   Sun Aug 4 13:36:11 2024 +0200

    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: 5314987de5e5 ("spi: imx: add lpspi bus driver")
    Signed-off-by: Stefan Wahren <wahrenst@xxxxxxx>
    Link: https://patch.msgid.link/20240804113611.83613-1-wahrenst@xxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c
index 079035db7dd85..3c0f7dc9614d1 100644
--- a/drivers/spi/spi-fsl-lpspi.c
+++ b/drivers/spi/spi-fsl-lpspi.c
@@ -296,7 +296,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)
 {
 	struct lpspi_config config = fsl_lpspi->config;
-	unsigned int perclk_rate, scldiv;
+	unsigned int perclk_rate, scldiv, div;
 	u8 prescale;
 
 	perclk_rate = clk_get_rate(fsl_lpspi->clk_per);
@@ -313,8 +313,10 @@ static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi)
 		return -EINVAL;
 	}
 
+	div = DIV_ROUND_UP(perclk_rate, config.speed_hz);
+
 	for (prescale = 0; prescale < 8; prescale++) {
-		scldiv = perclk_rate / config.speed_hz / (1 << prescale) - 2;
+		scldiv = div / (1 << prescale) - 2;
 		if (scldiv < 256) {
 			fsl_lpspi->config.prescale = prescale;
 			break;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux