Patch "spi: spi-imx: imx51: revert burst length calculation back to bits_per_word" 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-imx: imx51: revert burst length calculation back to bits_per_word

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-imx-imx51-revert-burst-length-calculation-ba.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 8aa29cab1a5dde0cb47e2b88a58be336105651e0
Author: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx>
Date:   Tue Jun 18 19:34:18 2024 +0200

    spi: spi-imx: imx51: revert burst length calculation back to bits_per_word
    
    [ Upstream commit df75470b317b46affbe1f5f8f006b34175be9789 ]
    
    The patch 15a6af94a277 ("spi: Increase imx51 ecspi burst length based
    on transfer length") increased the burst length calculation in
    mx51_ecspi_prepare_transfer() to be based on the transfer length.
    
    This breaks HW CS + SPI_CS_WORD support which was added in
    6e95b23a5b2d ("spi: imx: Implement support for CS_WORD") and transfers
    with bits-per-word != 8, 16, 32.
    
    SPI_CS_WORD means the CS should be toggled after each word. The
    implementation in the imx-spi driver relies on the fact that the HW CS
    is toggled automatically by the controller after each burst length
    number of bits. Setting the burst length to the number of bits of the
    _whole_ message breaks this use case.
    
    Further the patch 15a6af94a277 ("spi: Increase imx51 ecspi burst
    length based on transfer length") claims to optimize the transfers.
    But even without this patch, on modern spi-imx controllers with
    "dynamic_burst = true" (imx51, imx6 and newer), the transfers are
    already optimized, i.e. the burst length is dynamically adjusted in
    spi_imx_push() to avoid the pause between the SPI bursts. This has
    been confirmed by a scope measurement on an imx6d.
    
    Subsequent Patches tried to fix these and other problems:
    
    - 5f66db08cbd3 ("spi: imx: Take in account bits per word instead of assuming 8-bits")
    - e9b220aeacf1 ("spi: spi-imx: correctly configure burst length when using dma")
    - c712c05e46c8 ("spi: imx: fix the burst length at DMA mode and CPU mode")
    - cf6d79a0f576 ("spi: spi-imx: fix off-by-one in mx51 CPU mode burst length")
    
    but the HW CS + SPI_CS_WORD use case is still broken.
    
    To fix the problems revert the burst size calculation in
    mx51_ecspi_prepare_transfer() back to the original form, before
    15a6af94a277 ("spi: Increase imx51 ecspi burst length based on
    transfer length") was applied.
    
    Cc: Stefan Moring <stefan.moring@xxxxxxxxxxxxxxx>
    Cc: Stefan Bigler <linux@xxxxxxxxx>
    Cc: Clark Wang <xiaoning.wang@xxxxxxx>
    Cc: Carlos Song <carlos.song@xxxxxxx>
    Cc: Sebastian Reichel <sre@xxxxxxxxxx>
    Cc: Thorsten Scherer <T.Scherer@xxxxxxxxxxxx>
    Fixes: 15a6af94a277 ("spi: Increase imx51 ecspi burst length based on transfer length")
    Fixes: 5f66db08cbd3 ("spi: imx: Take in account bits per word instead of assuming 8-bits")
    Fixes: e9b220aeacf1 ("spi: spi-imx: correctly configure burst length when using dma")
    Fixes: c712c05e46c8 ("spi: imx: fix the burst length at DMA mode and CPU mode")
    Fixes: cf6d79a0f576 ("spi: spi-imx: fix off-by-one in mx51 CPU mode burst length")
    Link: https://lore.kernel.org/all/20240618-oxpecker-of-ideal-mastery-db59f8-mkl@xxxxxxxxxxxxxx
    Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx>
    Tested-by: Thorsten Scherer <t.scherer@xxxxxxxxxxxx>
    Link: https://msgid.link/r/20240618-spi-imx-fix-bustlength-v1-1-2053dd5fdf87@xxxxxxxxxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 0e479c5406217..d323b37723929 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -660,18 +660,8 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
 		ctrl |= (spi_imx->target_burst * 8 - 1)
 			<< MX51_ECSPI_CTRL_BL_OFFSET;
 	else {
-		if (spi_imx->usedma) {
-			ctrl |= (spi_imx->bits_per_word - 1)
-				<< MX51_ECSPI_CTRL_BL_OFFSET;
-		} else {
-			if (spi_imx->count >= MX51_ECSPI_CTRL_MAX_BURST)
-				ctrl |= (MX51_ECSPI_CTRL_MAX_BURST * BITS_PER_BYTE - 1)
-						<< MX51_ECSPI_CTRL_BL_OFFSET;
-			else
-				ctrl |= (spi_imx->count / DIV_ROUND_UP(spi_imx->bits_per_word,
-						BITS_PER_BYTE) * spi_imx->bits_per_word - 1)
-						<< MX51_ECSPI_CTRL_BL_OFFSET;
-		}
+		ctrl |= (spi_imx->bits_per_word - 1)
+			<< MX51_ECSPI_CTRL_BL_OFFSET;
 	}
 
 	/* set clock speed */




[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