|
62 | 62 | #define SPI_SR_TFIWF BIT(18)
|
63 | 63 | #define SPI_SR_RFDF BIT(17)
|
64 | 64 | #define SPI_SR_CMDFFF BIT(16)
|
| 65 | +#define SPI_SR_TXRXS BIT(30) |
65 | 66 | #define SPI_SR_CLEAR (SPI_SR_TCFQF | \
|
66 | 67 | SPI_SR_TFUF | SPI_SR_TFFF | \
|
67 | 68 | SPI_SR_CMDTCF | SPI_SR_SPEF | \
|
@@ -921,9 +922,20 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
|
921 | 922 | struct spi_transfer *transfer;
|
922 | 923 | bool cs = false;
|
923 | 924 | int status = 0;
|
| 925 | + u32 val = 0; |
| 926 | + bool cs_change = false; |
924 | 927 |
|
925 | 928 | message->actual_length = 0;
|
926 | 929 |
|
| 930 | + /* Put DSPI in running mode if halted. */ |
| 931 | + regmap_read(dspi->regmap, SPI_MCR, &val); |
| 932 | + if (val & SPI_MCR_HALT) { |
| 933 | + regmap_update_bits(dspi->regmap, SPI_MCR, SPI_MCR_HALT, 0); |
| 934 | + while (regmap_read(dspi->regmap, SPI_SR, &val) >= 0 && |
| 935 | + !(val & SPI_SR_TXRXS)) |
| 936 | + ; |
| 937 | + } |
| 938 | + |
927 | 939 | list_for_each_entry(transfer, &message->transfers, transfer_list) {
|
928 | 940 | dspi->cur_transfer = transfer;
|
929 | 941 | dspi->cur_msg = message;
|
@@ -953,6 +965,7 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
|
953 | 965 | dspi->tx_cmd |= SPI_PUSHR_CMD_CONT;
|
954 | 966 | }
|
955 | 967 |
|
| 968 | + cs_change = transfer->cs_change; |
956 | 969 | dspi->tx = transfer->tx_buf;
|
957 | 970 | dspi->rx = transfer->rx_buf;
|
958 | 971 | dspi->len = transfer->len;
|
@@ -988,6 +1001,15 @@ static int dspi_transfer_one_message(struct spi_controller *ctlr,
|
988 | 1001 | dspi_deassert_cs(spi, &cs);
|
989 | 1002 | }
|
990 | 1003 |
|
| 1004 | + if (status || !cs_change) { |
| 1005 | + /* Put DSPI in stop mode */ |
| 1006 | + regmap_update_bits(dspi->regmap, SPI_MCR, |
| 1007 | + SPI_MCR_HALT, SPI_MCR_HALT); |
| 1008 | + while (regmap_read(dspi->regmap, SPI_SR, &val) >= 0 && |
| 1009 | + val & SPI_SR_TXRXS) |
| 1010 | + ; |
| 1011 | + } |
| 1012 | + |
991 | 1013 | message->status = status;
|
992 | 1014 | spi_finalize_current_message(ctlr);
|
993 | 1015 |
|
@@ -1245,6 +1267,8 @@ static int dspi_init(struct fsl_dspi *dspi)
|
1245 | 1267 | if (!spi_controller_is_target(dspi->ctlr))
|
1246 | 1268 | mcr |= SPI_MCR_HOST;
|
1247 | 1269 |
|
| 1270 | + mcr |= SPI_MCR_HALT; |
| 1271 | + |
1248 | 1272 | regmap_write(dspi->regmap, SPI_MCR, mcr);
|
1249 | 1273 | regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR);
|
1250 | 1274 |
|
|
0 commit comments