| b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | From 097cc81ee5c15913ad330baffff2e3dea09bdad0 Mon Sep 17 00:00:00 2001 |
| 2 | From: Tim Harvey <tharvey@gateworks.com> |
| 3 | Date: Thu, 30 Aug 2018 15:16:08 -0700 |
| 4 | Subject: [PATCH] can: mcp251x: convert driver to half-duplex SPI |
| 5 | |
| 6 | Some SPI host controllers such as the Cavium Thunder TX do not support |
| 7 | full-duplex SPI. Using half-duplex transfers allows the driver to work |
| 8 | with those host controllers. |
| 9 | |
| 10 | Signed-off-by: Tim Harvey <tharvey@gateworks.com> |
| 11 | --- |
| 12 | drivers/net/can/spi/mcp251x.c | 15 ++++++++------- |
| 13 | 1 file changed, 8 insertions(+), 7 deletions(-) |
| 14 | |
| 15 | --- a/drivers/net/can/spi/mcp251x.c |
| 16 | +++ b/drivers/net/can/spi/mcp251x.c |
| 17 | @@ -291,23 +291,23 @@ static u8 mcp251x_read_reg(struct spi_de |
| 18 | priv->spi_tx_buf[0] = INSTRUCTION_READ; |
| 19 | priv->spi_tx_buf[1] = reg; |
| 20 | |
| 21 | - mcp251x_spi_trans(spi, 3); |
| 22 | - val = priv->spi_rx_buf[2]; |
| 23 | + spi_write_then_read(spi, priv->spi_tx_buf, 2, &val, 1); |
| 24 | |
| 25 | return val; |
| 26 | } |
| 27 | |
| 28 | static void mcp251x_read_2regs(struct spi_device *spi, u8 reg, u8 *v1, u8 *v2) |
| 29 | { |
| 30 | + u8 val[4] = {0}; |
| 31 | struct mcp251x_priv *priv = spi_get_drvdata(spi); |
| 32 | |
| 33 | priv->spi_tx_buf[0] = INSTRUCTION_READ; |
| 34 | priv->spi_tx_buf[1] = reg; |
| 35 | |
| 36 | - mcp251x_spi_trans(spi, 4); |
| 37 | + spi_write_then_read(spi, priv->spi_tx_buf, 2, val, 2); |
| 38 | |
| 39 | - *v1 = priv->spi_rx_buf[2]; |
| 40 | - *v2 = priv->spi_rx_buf[3]; |
| 41 | + *v1 = val[0]; |
| 42 | + *v2 = val[1]; |
| 43 | } |
| 44 | |
| 45 | static void mcp251x_write_reg(struct spi_device *spi, u8 reg, u8 val) |
| 46 | @@ -398,8 +398,9 @@ static void mcp251x_hw_rx_frame(struct s |
| 47 | buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i); |
| 48 | } else { |
| 49 | priv->spi_tx_buf[RXBCTRL_OFF] = INSTRUCTION_READ_RXB(buf_idx); |
| 50 | - mcp251x_spi_trans(spi, SPI_TRANSFER_BUF_LEN); |
| 51 | - memcpy(buf, priv->spi_rx_buf, SPI_TRANSFER_BUF_LEN); |
| 52 | + spi_write_then_read(spi, priv->spi_tx_buf, 1, priv->spi_rx_buf, |
| 53 | + SPI_TRANSFER_BUF_LEN); |
| 54 | + memcpy(buf + 1, priv->spi_rx_buf, SPI_TRANSFER_BUF_LEN - 1); |
| 55 | } |
| 56 | } |
| 57 | |