diff options
Diffstat (limited to 'drivers/spi/spi-rspi.c')
-rw-r--r-- | drivers/spi/spi-rspi.c | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 556870dcdf79..3be8fbe80b08 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
@@ -271,7 +271,8 @@ static int rspi_set_config_register(struct rspi_data *rspi, int access_size) | |||
271 | /* Sets parity, interrupt mask */ | 271 | /* Sets parity, interrupt mask */ |
272 | rspi_write8(rspi, 0x00, RSPI_SPCR2); | 272 | rspi_write8(rspi, 0x00, RSPI_SPCR2); |
273 | 273 | ||
274 | /* Sets SPCMD */ | 274 | /* Resets sequencer */ |
275 | rspi_write8(rspi, 0, RSPI_SPSCR); | ||
275 | rspi->spcmd |= SPCMD_SPB_8_TO_16(access_size); | 276 | rspi->spcmd |= SPCMD_SPB_8_TO_16(access_size); |
276 | rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0); | 277 | rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0); |
277 | 278 | ||
@@ -315,7 +316,8 @@ static int rspi_rz_set_config_register(struct rspi_data *rspi, int access_size) | |||
315 | rspi_write8(rspi, 0x00, RSPI_SSLND); | 316 | rspi_write8(rspi, 0x00, RSPI_SSLND); |
316 | rspi_write8(rspi, 0x00, RSPI_SPND); | 317 | rspi_write8(rspi, 0x00, RSPI_SPND); |
317 | 318 | ||
318 | /* Sets SPCMD */ | 319 | /* Resets sequencer */ |
320 | rspi_write8(rspi, 0, RSPI_SPSCR); | ||
319 | rspi->spcmd |= SPCMD_SPB_8_TO_16(access_size); | 321 | rspi->spcmd |= SPCMD_SPB_8_TO_16(access_size); |
320 | rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0); | 322 | rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0); |
321 | 323 | ||
@@ -366,7 +368,8 @@ static int qspi_set_config_register(struct rspi_data *rspi, int access_size) | |||
366 | /* Sets buffer to allow normal operation */ | 368 | /* Sets buffer to allow normal operation */ |
367 | rspi_write8(rspi, 0x00, QSPI_SPBFCR); | 369 | rspi_write8(rspi, 0x00, QSPI_SPBFCR); |
368 | 370 | ||
369 | /* Sets SPCMD */ | 371 | /* Resets sequencer */ |
372 | rspi_write8(rspi, 0, RSPI_SPSCR); | ||
370 | rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0); | 373 | rspi_write16(rspi, rspi->spcmd, RSPI_SPCMD0); |
371 | 374 | ||
372 | /* Sets RSPI mode */ | 375 | /* Sets RSPI mode */ |
@@ -868,28 +871,6 @@ static int qspi_transfer_one(struct spi_controller *ctlr, | |||
868 | } | 871 | } |
869 | } | 872 | } |
870 | 873 | ||
871 | static int rspi_setup(struct spi_device *spi) | ||
872 | { | ||
873 | struct rspi_data *rspi = spi_controller_get_devdata(spi->controller); | ||
874 | |||
875 | rspi->max_speed_hz = spi->max_speed_hz; | ||
876 | |||
877 | rspi->spcmd = SPCMD_SSLKP; | ||
878 | if (spi->mode & SPI_CPOL) | ||
879 | rspi->spcmd |= SPCMD_CPOL; | ||
880 | if (spi->mode & SPI_CPHA) | ||
881 | rspi->spcmd |= SPCMD_CPHA; | ||
882 | |||
883 | /* CMOS output mode and MOSI signal from previous transfer */ | ||
884 | rspi->sppcr = 0; | ||
885 | if (spi->mode & SPI_LOOP) | ||
886 | rspi->sppcr |= SPPCR_SPLP; | ||
887 | |||
888 | set_config_register(rspi, 8); | ||
889 | |||
890 | return 0; | ||
891 | } | ||
892 | |||
893 | static u16 qspi_transfer_mode(const struct spi_transfer *xfer) | 874 | static u16 qspi_transfer_mode(const struct spi_transfer *xfer) |
894 | { | 875 | { |
895 | if (xfer->tx_buf) | 876 | if (xfer->tx_buf) |
@@ -959,8 +940,24 @@ static int rspi_prepare_message(struct spi_controller *ctlr, | |||
959 | struct spi_message *msg) | 940 | struct spi_message *msg) |
960 | { | 941 | { |
961 | struct rspi_data *rspi = spi_controller_get_devdata(ctlr); | 942 | struct rspi_data *rspi = spi_controller_get_devdata(ctlr); |
943 | struct spi_device *spi = msg->spi; | ||
962 | int ret; | 944 | int ret; |
963 | 945 | ||
946 | rspi->max_speed_hz = spi->max_speed_hz; | ||
947 | |||
948 | rspi->spcmd = SPCMD_SSLKP; | ||
949 | if (spi->mode & SPI_CPOL) | ||
950 | rspi->spcmd |= SPCMD_CPOL; | ||
951 | if (spi->mode & SPI_CPHA) | ||
952 | rspi->spcmd |= SPCMD_CPHA; | ||
953 | |||
954 | /* CMOS output mode and MOSI signal from previous transfer */ | ||
955 | rspi->sppcr = 0; | ||
956 | if (spi->mode & SPI_LOOP) | ||
957 | rspi->sppcr |= SPPCR_SPLP; | ||
958 | |||
959 | set_config_register(rspi, 8); | ||
960 | |||
964 | if (msg->spi->mode & | 961 | if (msg->spi->mode & |
965 | (SPI_TX_DUAL | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD)) { | 962 | (SPI_TX_DUAL | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD)) { |
966 | /* Setup sequencer for messages with multiple transfer modes */ | 963 | /* Setup sequencer for messages with multiple transfer modes */ |
@@ -1267,7 +1264,6 @@ static int rspi_probe(struct platform_device *pdev) | |||
1267 | init_waitqueue_head(&rspi->wait); | 1264 | init_waitqueue_head(&rspi->wait); |
1268 | 1265 | ||
1269 | ctlr->bus_num = pdev->id; | 1266 | ctlr->bus_num = pdev->id; |
1270 | ctlr->setup = rspi_setup; | ||
1271 | ctlr->auto_runtime_pm = true; | 1267 | ctlr->auto_runtime_pm = true; |
1272 | ctlr->transfer_one = ops->transfer_one; | 1268 | ctlr->transfer_one = ops->transfer_one; |
1273 | ctlr->prepare_message = rspi_prepare_message; | 1269 | ctlr->prepare_message = rspi_prepare_message; |