OSDN Git Service

can: tcan4x5x: add support for half-duplex controllers
authorMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 15 Dec 2020 23:17:46 +0000 (00:17 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 6 Jan 2021 14:15:41 +0000 (15:15 +0100)
This patch adds back support for half-duplex controllers, which was removed in
the last patch.

Reviewed-by: Dan Murphy <dmurphy@ti.com>
Tested-by: Sean Nyekjaer <sean@geanix.com>
Link: https://lore.kernel.org/r/20201215231746.1132907-17-mkl@pengutronix.de
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/m_can/tcan4x5x-regmap.c

index 660e9d8..ca80dba 100644 (file)
@@ -51,7 +51,7 @@ static int tcan4x5x_regmap_read(void *context,
        struct tcan4x5x_priv *priv = spi_get_drvdata(spi);
        struct tcan4x5x_map_buf *buf_rx = &priv->map_buf_rx;
        struct tcan4x5x_map_buf *buf_tx = &priv->map_buf_tx;
-       struct spi_transfer xfer[] = {
+       struct spi_transfer xfer[2] = {
                {
                        .tx_buf = buf_tx,
                }
@@ -66,17 +66,26 @@ static int tcan4x5x_regmap_read(void *context,
               sizeof(buf_tx->cmd.addr));
        tcan4x5x_spi_cmd_set_len(&buf_tx->cmd, val_len);
 
-       xfer[0].rx_buf = buf_rx;
-       xfer[0].len = sizeof(buf_tx->cmd) + val_len;
+       if (spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX) {
+               xfer[0].len = sizeof(buf_tx->cmd);
+
+               xfer[1].rx_buf = val_buf;
+               xfer[1].len = val_len;
+               spi_message_add_tail(&xfer[1], &msg);
+       } else {
+               xfer[0].rx_buf = buf_rx;
+               xfer[0].len = sizeof(buf_tx->cmd) + val_len;
 
-       if (TCAN4X5X_SANITIZE_SPI)
-               memset(buf_tx->data, 0x0, val_len);
+               if (TCAN4X5X_SANITIZE_SPI)
+                       memset(buf_tx->data, 0x0, val_len);
+       }
 
        err = spi_sync(spi, &msg);
        if (err)
                return err;
 
-       memcpy(val_buf, buf_rx->data, val_len);
+       if (!(spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX))
+               memcpy(val_buf, buf_rx->data, val_len);
 
        return 0;
 }