Patch "spi: stm32: fix stm32_spi_prepare_mbr() that halves spi clk for every run" has been added to the 5.15-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: stm32: fix stm32_spi_prepare_mbr() that halves spi clk for every run

to the 5.15-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-stm32-fix-stm32_spi_prepare_mbr-that-halves-spi-.patch
and it can be found in the queue-5.15 subdirectory.

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



commit f8e8311c96dcf5d08dd6bb7d54fca81bce837ee2
Author: Sean Nyekjaer <sean@xxxxxxxxxx>
Date:   Thu Nov 3 09:00:42 2022 +0100

    spi: stm32: fix stm32_spi_prepare_mbr() that halves spi clk for every run
    
    [ Upstream commit 62aa1a344b0904549f6de7af958e8a1136fd5228 ]
    
    When this driver is used with a driver that uses preallocated spi_transfer
    structs. The speed_hz is halved by every run. This results in:
    
    spi_stm32 44004000.spi: SPI transfer setup failed
    ads7846 spi0.0: SPI transfer failed: -22
    
    Example when running with DIV_ROUND_UP():
    - First run; speed_hz = 1000000, spi->clk_rate 125000000
      div 125 -> mbrdiv = 7, cur_speed = 976562
    - Second run; speed_hz = 976562
      div 128,00007 (roundup to 129) -> mbrdiv = 8, cur_speed = 488281
    - Third run; speed_hz = 488281
      div 256,000131072067109 (roundup to 257) and then -EINVAL is returned.
    
    Use DIV_ROUND_CLOSEST to allow to round down and allow us to keep the
    set speed.
    
    Signed-off-by: Sean Nyekjaer <sean@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20221103080043.3033414-1-sean@xxxxxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c
index 96a73f9e2677..3c6f201b5dd8 100644
--- a/drivers/spi/spi-stm32.c
+++ b/drivers/spi/spi-stm32.c
@@ -434,7 +434,7 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz,
 	u32 div, mbrdiv;
 
 	/* Ensure spi->clk_rate is even */
-	div = DIV_ROUND_UP(spi->clk_rate & ~0x1, speed_hz);
+	div = DIV_ROUND_CLOSEST(spi->clk_rate & ~0x1, speed_hz);
 
 	/*
 	 * SPI framework set xfer->speed_hz to master->max_speed_hz if



[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