lkml.org 
[lkml]   [2023]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 09/14] spi: bcm63xx-hsspi: Fix multi-bit mode setting
    Date
    Currently the driver always sets the controller to dual data bit mode
    for both tx and rx data in the profile mode control register even for
    single data bit transfer. Luckily the opcode is set correctly according
    to SPI transfer data bit width so it does not actually cause issues.

    This change fixes the problem by setting tx and rx data bit mode field
    correctly according to the actual SPI transfer tx and rx data bit width.

    Fixes: 142168eba9dc ("spi: bcm63xx-hsspi: add bcm63xx HSSPI driver")
    Signed-off-by: William Zhang <william.zhang@broadcom.com>
    ---

    (no changes since v1)

    drivers/spi/spi-bcm63xx-hsspi.c | 13 +++++++++----
    1 file changed, 9 insertions(+), 4 deletions(-)

    diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c
    index 696e14abba2d..8f0d31764f98 100644
    --- a/drivers/spi/spi-bcm63xx-hsspi.c
    +++ b/drivers/spi/spi-bcm63xx-hsspi.c
    @@ -215,7 +215,7 @@ static int bcm63xx_hsspi_do_txrx(struct spi_device *spi, struct spi_transfer *t)
    int step_size = HSSPI_BUFFER_LEN;
    const u8 *tx = t->tx_buf;
    u8 *rx = t->rx_buf;
    - u32 val;
    + u32 val = 0;
    unsigned long limit;

    bcm63xx_hsspi_set_clk(bs, spi, t->speed_hz);
    @@ -232,11 +232,16 @@ static int bcm63xx_hsspi_do_txrx(struct spi_device *spi, struct spi_transfer *t)
    step_size -= HSSPI_OPCODE_LEN;

    if ((opcode == HSSPI_OP_READ && t->rx_nbits == SPI_NBITS_DUAL) ||
    - (opcode == HSSPI_OP_WRITE && t->tx_nbits == SPI_NBITS_DUAL))
    + (opcode == HSSPI_OP_WRITE && t->tx_nbits == SPI_NBITS_DUAL)) {
    opcode |= HSSPI_OP_MULTIBIT;

    - __raw_writel(1 << MODE_CTRL_MULTIDATA_WR_SIZE_SHIFT |
    - 1 << MODE_CTRL_MULTIDATA_RD_SIZE_SHIFT | 0xff,
    + if (t->rx_nbits == SPI_NBITS_DUAL)
    + val |= 1 << MODE_CTRL_MULTIDATA_RD_SIZE_SHIFT;
    + if (t->tx_nbits == SPI_NBITS_DUAL)
    + val |= 1 << MODE_CTRL_MULTIDATA_WR_SIZE_SHIFT;
    + }
    +
    + __raw_writel(val | 0xff,
    bs->regs + HSSPI_PROFILE_MODE_CTRL_REG(chip_select));

    while (pending > 0) {
    --
    2.37.3
    \
     
     \ /
      Last update: 2023-03-26 23:54    [W:2.492 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site