Lines Matching full:spi
29 #include <linux/spi/spi.h>
32 #include <linux/platform_data/spi-omap2-mcspi.h>
160 static inline void mcspi_write_cs_reg(const struct spi_device *spi, in mcspi_write_cs_reg() argument
163 struct omap2_mcspi_cs *cs = spi->controller_state; in mcspi_write_cs_reg()
168 static inline u32 mcspi_read_cs_reg(const struct spi_device *spi, int idx) in mcspi_read_cs_reg() argument
170 struct omap2_mcspi_cs *cs = spi->controller_state; in mcspi_read_cs_reg()
175 static inline u32 mcspi_cached_chconf0(const struct spi_device *spi) in mcspi_cached_chconf0() argument
177 struct omap2_mcspi_cs *cs = spi->controller_state; in mcspi_cached_chconf0()
182 static inline void mcspi_write_chconf0(const struct spi_device *spi, u32 val) in mcspi_write_chconf0() argument
184 struct omap2_mcspi_cs *cs = spi->controller_state; in mcspi_write_chconf0()
187 mcspi_write_cs_reg(spi, OMAP2_MCSPI_CHCONF0, val); in mcspi_write_chconf0()
188 mcspi_read_cs_reg(spi, OMAP2_MCSPI_CHCONF0); in mcspi_write_chconf0()
201 static void omap2_mcspi_set_dma_req(const struct spi_device *spi, in omap2_mcspi_set_dma_req() argument
206 l = mcspi_cached_chconf0(spi); in omap2_mcspi_set_dma_req()
218 mcspi_write_chconf0(spi, l); in omap2_mcspi_set_dma_req()
221 static void omap2_mcspi_set_enable(const struct spi_device *spi, int enable) in omap2_mcspi_set_enable() argument
223 struct omap2_mcspi_cs *cs = spi->controller_state; in omap2_mcspi_set_enable()
232 mcspi_write_cs_reg(spi, OMAP2_MCSPI_CHCTRL0, cs->chctrl0); in omap2_mcspi_set_enable()
234 mcspi_read_cs_reg(spi, OMAP2_MCSPI_CHCTRL0); in omap2_mcspi_set_enable()
237 static void omap2_mcspi_set_cs(struct spi_device *spi, bool enable) in omap2_mcspi_set_cs() argument
239 struct omap2_mcspi *mcspi = spi_master_get_devdata(spi->master); in omap2_mcspi_set_cs()
246 if (spi->mode & SPI_CS_HIGH) in omap2_mcspi_set_cs()
249 if (spi->controller_state) { in omap2_mcspi_set_cs()
257 l = mcspi_cached_chconf0(spi); in omap2_mcspi_set_cs()
264 mcspi_write_chconf0(spi, l); in omap2_mcspi_set_cs()
293 static void omap2_mcspi_set_fifo(const struct spi_device *spi, in omap2_mcspi_set_fifo() argument
296 struct spi_master *master = spi->master; in omap2_mcspi_set_fifo()
297 struct omap2_mcspi_cs *cs = spi->controller_state; in omap2_mcspi_set_fifo()
305 chconf = mcspi_cached_chconf0(spi); in omap2_mcspi_set_fifo()
332 mcspi_write_chconf0(spi, chconf); in omap2_mcspi_set_fifo()
345 mcspi_write_chconf0(spi, chconf); in omap2_mcspi_set_fifo()
372 struct spi_device *spi = data; in omap2_mcspi_rx_callback() local
373 struct omap2_mcspi *mcspi = spi_master_get_devdata(spi->master); in omap2_mcspi_rx_callback()
374 struct omap2_mcspi_dma *mcspi_dma = &mcspi->dma_channels[spi->chip_select]; in omap2_mcspi_rx_callback()
377 omap2_mcspi_set_dma_req(spi, 1, 0); in omap2_mcspi_rx_callback()
384 struct spi_device *spi = data; in omap2_mcspi_tx_callback() local
385 struct omap2_mcspi *mcspi = spi_master_get_devdata(spi->master); in omap2_mcspi_tx_callback()
386 struct omap2_mcspi_dma *mcspi_dma = &mcspi->dma_channels[spi->chip_select]; in omap2_mcspi_tx_callback()
389 omap2_mcspi_set_dma_req(spi, 0, 0); in omap2_mcspi_tx_callback()
394 static void omap2_mcspi_tx_dma(struct spi_device *spi, in omap2_mcspi_tx_dma() argument
401 mcspi = spi_master_get_devdata(spi->master); in omap2_mcspi_tx_dma()
402 mcspi_dma = &mcspi->dma_channels[spi->chip_select]; in omap2_mcspi_tx_dma()
415 tx->callback_param = spi; in omap2_mcspi_tx_dma()
422 omap2_mcspi_set_dma_req(spi, 0, 1); in omap2_mcspi_tx_dma()
427 omap2_mcspi_rx_dma(struct spi_device *spi, struct spi_transfer *xfer, in omap2_mcspi_rx_dma() argument
440 struct omap2_mcspi_cs *cs = spi->controller_state; in omap2_mcspi_rx_dma()
443 mcspi = spi_master_get_devdata(spi->master); in omap2_mcspi_rx_dma()
444 mcspi_dma = &mcspi->dma_channels[spi->chip_select]; in omap2_mcspi_rx_dma()
456 l = mcspi_cached_chconf0(spi); in omap2_mcspi_rx_dma()
498 dev_err(&spi->dev, "sg_split failed\n"); in omap2_mcspi_rx_dma()
509 tx->callback_param = spi; in omap2_mcspi_rx_dma()
517 omap2_mcspi_set_dma_req(spi, 1, 1); in omap2_mcspi_rx_dma()
522 omap2_mcspi_set_dma_req(spi, 1, 0); in omap2_mcspi_rx_dma()
536 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_rx_dma()
547 w = mcspi_read_cs_reg(spi, OMAP2_MCSPI_RX0); in omap2_mcspi_rx_dma()
556 dev_err(&spi->dev, "DMA RX penultimate word empty\n"); in omap2_mcspi_rx_dma()
558 omap2_mcspi_set_enable(spi, 1); in omap2_mcspi_rx_dma()
565 w = mcspi_read_cs_reg(spi, OMAP2_MCSPI_RX0); in omap2_mcspi_rx_dma()
573 dev_err(&spi->dev, "DMA RX last word empty\n"); in omap2_mcspi_rx_dma()
576 omap2_mcspi_set_enable(spi, 1); in omap2_mcspi_rx_dma()
581 omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer) in omap2_mcspi_txrx_dma() argument
584 struct omap2_mcspi_cs *cs = spi->controller_state; in omap2_mcspi_txrx_dma()
596 mcspi = spi_master_get_devdata(spi->master); in omap2_mcspi_txrx_dma()
597 mcspi_dma = &mcspi->dma_channels[spi->chip_select]; in omap2_mcspi_txrx_dma()
629 if (spi_controller_is_slave(spi->master)) in omap2_mcspi_txrx_dma()
630 mcspi_write_reg(spi->master, in omap2_mcspi_txrx_dma()
633 omap2_mcspi_tx_dma(spi, xfer, cfg); in omap2_mcspi_txrx_dma()
637 count = omap2_mcspi_rx_dma(spi, xfer, cfg, es); in omap2_mcspi_txrx_dma()
645 omap2_mcspi_set_dma_req(spi, 0, 0); in omap2_mcspi_txrx_dma()
660 dev_err(&spi->dev, "EOW timed out\n"); in omap2_mcspi_txrx_dma()
673 dev_err(&spi->dev, "TXFFE timed out\n"); in omap2_mcspi_txrx_dma()
678 dev_err(&spi->dev, "TXS timed out\n"); in omap2_mcspi_txrx_dma()
683 dev_err(&spi->dev, "EOT timed out\n"); in omap2_mcspi_txrx_dma()
690 omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer) in omap2_mcspi_txrx_pio() argument
692 struct omap2_mcspi_cs *cs = spi->controller_state; in omap2_mcspi_txrx_pio()
705 l = mcspi_cached_chconf0(spi); in omap2_mcspi_txrx_pio()
728 dev_err(&spi->dev, "TXS timed out\n"); in omap2_mcspi_txrx_pio()
731 dev_vdbg(&spi->dev, "write-%d %02x\n", in omap2_mcspi_txrx_pio()
738 dev_err(&spi->dev, "RXS timed out\n"); in omap2_mcspi_txrx_pio()
744 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_txrx_pio()
746 dev_vdbg(&spi->dev, "read-%d %02x\n", in omap2_mcspi_txrx_pio()
750 dev_err(&spi->dev, in omap2_mcspi_txrx_pio()
756 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_txrx_pio()
760 dev_vdbg(&spi->dev, "read-%d %02x\n", in omap2_mcspi_txrx_pio()
775 dev_err(&spi->dev, "TXS timed out\n"); in omap2_mcspi_txrx_pio()
778 dev_vdbg(&spi->dev, "write-%d %04x\n", in omap2_mcspi_txrx_pio()
785 dev_err(&spi->dev, "RXS timed out\n"); in omap2_mcspi_txrx_pio()
791 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_txrx_pio()
793 dev_vdbg(&spi->dev, "read-%d %04x\n", in omap2_mcspi_txrx_pio()
797 dev_err(&spi->dev, in omap2_mcspi_txrx_pio()
803 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_txrx_pio()
807 dev_vdbg(&spi->dev, "read-%d %04x\n", in omap2_mcspi_txrx_pio()
822 dev_err(&spi->dev, "TXS timed out\n"); in omap2_mcspi_txrx_pio()
825 dev_vdbg(&spi->dev, "write-%d %08x\n", in omap2_mcspi_txrx_pio()
832 dev_err(&spi->dev, "RXS timed out\n"); in omap2_mcspi_txrx_pio()
838 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_txrx_pio()
840 dev_vdbg(&spi->dev, "read-%d %08x\n", in omap2_mcspi_txrx_pio()
844 dev_err(&spi->dev, in omap2_mcspi_txrx_pio()
850 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_txrx_pio()
854 dev_vdbg(&spi->dev, "read-%d %08x\n", in omap2_mcspi_txrx_pio()
864 dev_err(&spi->dev, "TXS timed out\n"); in omap2_mcspi_txrx_pio()
867 dev_err(&spi->dev, "EOT timed out\n"); in omap2_mcspi_txrx_pio()
873 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_txrx_pio()
876 omap2_mcspi_set_enable(spi, 1); in omap2_mcspi_txrx_pio()
892 static int omap2_mcspi_setup_transfer(struct spi_device *spi, in omap2_mcspi_setup_transfer() argument
895 struct omap2_mcspi_cs *cs = spi->controller_state; in omap2_mcspi_setup_transfer()
898 u8 word_len = spi->bits_per_word; in omap2_mcspi_setup_transfer()
899 u32 speed_hz = spi->max_speed_hz; in omap2_mcspi_setup_transfer()
901 mcspi = spi_master_get_devdata(spi->master); in omap2_mcspi_setup_transfer()
924 l = mcspi_cached_chconf0(spi); in omap2_mcspi_setup_transfer()
944 if (!(spi->mode & SPI_CS_HIGH)) in omap2_mcspi_setup_transfer()
959 mcspi_write_cs_reg(spi, OMAP2_MCSPI_CHCTRL0, cs->chctrl0); in omap2_mcspi_setup_transfer()
962 /* set SPI mode 0..3 */ in omap2_mcspi_setup_transfer()
963 if (spi->mode & SPI_CPOL) in omap2_mcspi_setup_transfer()
967 if (spi->mode & SPI_CPHA) in omap2_mcspi_setup_transfer()
972 mcspi_write_chconf0(spi, l); in omap2_mcspi_setup_transfer()
974 cs->mode = spi->mode; in omap2_mcspi_setup_transfer()
976 dev_dbg(&spi->dev, "setup: speed %d, sample %s edge, clk %s\n", in omap2_mcspi_setup_transfer()
978 (spi->mode & SPI_CPHA) ? "trailing" : "leading", in omap2_mcspi_setup_transfer()
979 (spi->mode & SPI_CPOL) ? "inverted" : "normal"); in omap2_mcspi_setup_transfer()
988 static int omap2_mcspi_request_dma(struct spi_device *spi) in omap2_mcspi_request_dma() argument
990 struct spi_master *master = spi->master; in omap2_mcspi_request_dma()
996 mcspi_dma = mcspi->dma_channels + spi->chip_select; in omap2_mcspi_request_dma()
1022 static int omap2_mcspi_setup(struct spi_device *spi) in omap2_mcspi_setup() argument
1025 struct omap2_mcspi *mcspi = spi_master_get_devdata(spi->master); in omap2_mcspi_setup()
1028 struct omap2_mcspi_cs *cs = spi->controller_state; in omap2_mcspi_setup()
1030 mcspi_dma = &mcspi->dma_channels[spi->chip_select]; in omap2_mcspi_setup()
1036 cs->base = mcspi->base + spi->chip_select * 0x14; in omap2_mcspi_setup()
1037 cs->phys = mcspi->phys + spi->chip_select * 0x14; in omap2_mcspi_setup()
1041 spi->controller_state = cs; in omap2_mcspi_setup()
1045 if (gpio_is_valid(spi->cs_gpio)) { in omap2_mcspi_setup()
1046 ret = gpio_request(spi->cs_gpio, dev_name(&spi->dev)); in omap2_mcspi_setup()
1048 dev_err(&spi->dev, "failed to request gpio\n"); in omap2_mcspi_setup()
1051 gpio_direction_output(spi->cs_gpio, in omap2_mcspi_setup()
1052 !(spi->mode & SPI_CS_HIGH)); in omap2_mcspi_setup()
1057 ret = omap2_mcspi_request_dma(spi); in omap2_mcspi_setup()
1059 dev_warn(&spi->dev, "not using DMA for McSPI (%d)\n", in omap2_mcspi_setup()
1070 ret = omap2_mcspi_setup_transfer(spi, NULL); in omap2_mcspi_setup()
1077 static void omap2_mcspi_cleanup(struct spi_device *spi) in omap2_mcspi_cleanup() argument
1083 mcspi = spi_master_get_devdata(spi->master); in omap2_mcspi_cleanup()
1085 if (spi->controller_state) { in omap2_mcspi_cleanup()
1087 cs = spi->controller_state; in omap2_mcspi_cleanup()
1093 if (spi->chip_select < spi->master->num_chipselect) { in omap2_mcspi_cleanup()
1094 mcspi_dma = &mcspi->dma_channels[spi->chip_select]; in omap2_mcspi_cleanup()
1106 if (gpio_is_valid(spi->cs_gpio)) in omap2_mcspi_cleanup()
1107 gpio_free(spi->cs_gpio); in omap2_mcspi_cleanup()
1141 struct spi_device *spi, in omap2_mcspi_transfer_one() argument
1161 mcspi_dma = mcspi->dma_channels + spi->chip_select; in omap2_mcspi_transfer_one()
1162 cs = spi->controller_state; in omap2_mcspi_transfer_one()
1163 cd = spi->controller_data; in omap2_mcspi_transfer_one()
1166 * The slave driver could have changed spi->mode in which case in omap2_mcspi_transfer_one()
1172 if (spi->mode != cs->mode) in omap2_mcspi_transfer_one()
1175 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_transfer_one()
1177 if (gpio_is_valid(spi->cs_gpio)) in omap2_mcspi_transfer_one()
1178 omap2_mcspi_set_cs(spi, spi->mode & SPI_CS_HIGH); in omap2_mcspi_transfer_one()
1181 (t->speed_hz != spi->max_speed_hz) || in omap2_mcspi_transfer_one()
1182 (t->bits_per_word != spi->bits_per_word)) { in omap2_mcspi_transfer_one()
1184 status = omap2_mcspi_setup_transfer(spi, t); in omap2_mcspi_transfer_one()
1187 if (t->speed_hz == spi->max_speed_hz && in omap2_mcspi_transfer_one()
1188 t->bits_per_word == spi->bits_per_word) in omap2_mcspi_transfer_one()
1196 mcspi_read_cs_reg(spi, OMAP2_MCSPI_MODULCTRL); in omap2_mcspi_transfer_one()
1199 chconf = mcspi_cached_chconf0(spi); in omap2_mcspi_transfer_one()
1214 mcspi_write_chconf0(spi, chconf); in omap2_mcspi_transfer_one()
1221 master->can_dma(master, spi, t)) in omap2_mcspi_transfer_one()
1222 omap2_mcspi_set_fifo(spi, t, 1); in omap2_mcspi_transfer_one()
1224 omap2_mcspi_set_enable(spi, 1); in omap2_mcspi_transfer_one()
1233 master->can_dma(master, spi, t)) in omap2_mcspi_transfer_one()
1234 count = omap2_mcspi_txrx_dma(spi, t); in omap2_mcspi_transfer_one()
1236 count = omap2_mcspi_txrx_pio(spi, t); in omap2_mcspi_transfer_one()
1244 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_transfer_one()
1247 omap2_mcspi_set_fifo(spi, t, 0); in omap2_mcspi_transfer_one()
1253 status = omap2_mcspi_setup_transfer(spi, NULL); in omap2_mcspi_transfer_one()
1261 mcspi_read_cs_reg(spi, OMAP2_MCSPI_MODULCTRL); in omap2_mcspi_transfer_one()
1264 omap2_mcspi_set_enable(spi, 0); in omap2_mcspi_transfer_one()
1266 if (gpio_is_valid(spi->cs_gpio)) in omap2_mcspi_transfer_one()
1267 omap2_mcspi_set_cs(spi, !(spi->mode & SPI_CS_HIGH)); in omap2_mcspi_transfer_one()
1270 omap2_mcspi_set_fifo(spi, t, 0); in omap2_mcspi_transfer_one()
1288 if (msg->spi->controller_state == cs) in omap2_mcspi_prepare_message()
1303 struct spi_device *spi, in omap2_mcspi_can_dma() argument
1306 struct omap2_mcspi *mcspi = spi_master_get_devdata(spi->master); in omap2_mcspi_can_dma()
1308 &mcspi->dma_channels[spi->chip_select]; in omap2_mcspi_can_dma()
1343 * When SPI wake up from off-mode, CS is in activate state. If it was in
1411 if (of_property_read_bool(node, "spi-slave")) in omap2_mcspi_probe()
1418 /* the spi->mode bits understood by this driver: */ in omap2_mcspi_probe()
1443 of_property_read_u32(node, "ti,spi-num-cs", &num_cs); in omap2_mcspi_probe()