Lines Matching full:pl022
3 * A driver for the ARM PL022 PrimeCell SSP/SPI bus master.
12 * Initial adoption to PL022 by:
27 #include <linux/amba/pl022.h>
313 * for PL022 derivates
333 * struct pl022 - This is the private SSP driver data structure
364 struct pl022 { struct
439 pr_debug("pl022: dummy chip select control, CS=0x%x\n", command); in null_cs_control()
444 * @pl022: SSP driver private data structure
451 static void internal_cs_control(struct pl022 *pl022, u32 command) in internal_cs_control() argument
455 tmp = readw(SSP_CSR(pl022->virtbase)); in internal_cs_control()
457 tmp &= ~BIT(pl022->cur_cs); in internal_cs_control()
459 tmp |= BIT(pl022->cur_cs); in internal_cs_control()
460 writew(tmp, SSP_CSR(pl022->virtbase)); in internal_cs_control()
463 static void pl022_cs_control(struct pl022 *pl022, u32 command) in pl022_cs_control() argument
465 if (pl022->vendor->internal_cs_ctrl) in pl022_cs_control()
466 internal_cs_control(pl022, command); in pl022_cs_control()
467 else if (gpio_is_valid(pl022->cur_cs)) in pl022_cs_control()
468 gpio_set_value(pl022->cur_cs, command); in pl022_cs_control()
470 pl022->cur_chip->cs_control(command); in pl022_cs_control()
477 * @pl022: SSP driver private data structure
479 static void giveback(struct pl022 *pl022) in giveback() argument
482 pl022->next_msg_cs_active = false; in giveback()
484 last_transfer = list_last_entry(&pl022->cur_msg->transfers, in giveback()
509 next_msg = spi_get_next_queued_message(pl022->master); in giveback()
515 if (next_msg && next_msg->spi != pl022->cur_msg->spi) in giveback()
517 if (!next_msg || pl022->cur_msg->state == STATE_ERROR) in giveback()
518 pl022_cs_control(pl022, SSP_CHIP_DESELECT); in giveback()
520 pl022->next_msg_cs_active = true; in giveback()
524 pl022->cur_msg = NULL; in giveback()
525 pl022->cur_transfer = NULL; in giveback()
526 pl022->cur_chip = NULL; in giveback()
529 writew((readw(SSP_CR1(pl022->virtbase)) & in giveback()
530 (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase)); in giveback()
532 spi_finalize_current_message(pl022->master); in giveback()
537 * @pl022: SSP driver private data structure
539 static int flush(struct pl022 *pl022) in flush() argument
543 dev_dbg(&pl022->adev->dev, "flush\n"); in flush()
545 while (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE) in flush()
546 readw(SSP_DR(pl022->virtbase)); in flush()
547 } while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_BSY) && limit--); in flush()
549 pl022->exp_fifo_level = 0; in flush()
556 * @pl022: SSP driver private data structure
558 static void restore_state(struct pl022 *pl022) in restore_state() argument
560 struct chip_data *chip = pl022->cur_chip; in restore_state()
562 if (pl022->vendor->extended_cr) in restore_state()
563 writel(chip->cr0, SSP_CR0(pl022->virtbase)); in restore_state()
565 writew(chip->cr0, SSP_CR0(pl022->virtbase)); in restore_state()
566 writew(chip->cr1, SSP_CR1(pl022->virtbase)); in restore_state()
567 writew(chip->dmacr, SSP_DMACR(pl022->virtbase)); in restore_state()
568 writew(chip->cpsr, SSP_CPSR(pl022->virtbase)); in restore_state()
569 writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase)); in restore_state()
570 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); in restore_state()
646 * @pl022: SSP driver private data structure
648 static void load_ssp_default_config(struct pl022 *pl022) in load_ssp_default_config() argument
650 if (pl022->vendor->pl023) { in load_ssp_default_config()
651 writel(DEFAULT_SSP_REG_CR0_ST_PL023, SSP_CR0(pl022->virtbase)); in load_ssp_default_config()
652 writew(DEFAULT_SSP_REG_CR1_ST_PL023, SSP_CR1(pl022->virtbase)); in load_ssp_default_config()
653 } else if (pl022->vendor->extended_cr) { in load_ssp_default_config()
654 writel(DEFAULT_SSP_REG_CR0_ST, SSP_CR0(pl022->virtbase)); in load_ssp_default_config()
655 writew(DEFAULT_SSP_REG_CR1_ST, SSP_CR1(pl022->virtbase)); in load_ssp_default_config()
657 writew(DEFAULT_SSP_REG_CR0, SSP_CR0(pl022->virtbase)); in load_ssp_default_config()
658 writew(DEFAULT_SSP_REG_CR1, SSP_CR1(pl022->virtbase)); in load_ssp_default_config()
660 writew(DEFAULT_SSP_REG_DMACR, SSP_DMACR(pl022->virtbase)); in load_ssp_default_config()
661 writew(DEFAULT_SSP_REG_CPSR, SSP_CPSR(pl022->virtbase)); in load_ssp_default_config()
662 writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase)); in load_ssp_default_config()
663 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); in load_ssp_default_config()
668 * set in pl022.
670 static void readwriter(struct pl022 *pl022) in readwriter() argument
683 dev_dbg(&pl022->adev->dev, in readwriter()
685 __func__, pl022->rx, pl022->rx_end, pl022->tx, pl022->tx_end); in readwriter()
688 while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE) in readwriter()
689 && (pl022->rx < pl022->rx_end)) { in readwriter()
690 switch (pl022->read) { in readwriter()
692 readw(SSP_DR(pl022->virtbase)); in readwriter()
695 *(u8 *) (pl022->rx) = in readwriter()
696 readw(SSP_DR(pl022->virtbase)) & 0xFFU; in readwriter()
699 *(u16 *) (pl022->rx) = in readwriter()
700 (u16) readw(SSP_DR(pl022->virtbase)); in readwriter()
703 *(u32 *) (pl022->rx) = in readwriter()
704 readl(SSP_DR(pl022->virtbase)); in readwriter()
707 pl022->rx += (pl022->cur_chip->n_bytes); in readwriter()
708 pl022->exp_fifo_level--; in readwriter()
713 while ((pl022->exp_fifo_level < pl022->vendor->fifodepth) in readwriter()
714 && (pl022->tx < pl022->tx_end)) { in readwriter()
715 switch (pl022->write) { in readwriter()
717 writew(0x0, SSP_DR(pl022->virtbase)); in readwriter()
720 writew(*(u8 *) (pl022->tx), SSP_DR(pl022->virtbase)); in readwriter()
723 writew((*(u16 *) (pl022->tx)), SSP_DR(pl022->virtbase)); in readwriter()
726 writel(*(u32 *) (pl022->tx), SSP_DR(pl022->virtbase)); in readwriter()
729 pl022->tx += (pl022->cur_chip->n_bytes); in readwriter()
730 pl022->exp_fifo_level++; in readwriter()
737 while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE) in readwriter()
738 && (pl022->rx < pl022->rx_end)) { in readwriter()
739 switch (pl022->read) { in readwriter()
741 readw(SSP_DR(pl022->virtbase)); in readwriter()
744 *(u8 *) (pl022->rx) = in readwriter()
745 readw(SSP_DR(pl022->virtbase)) & 0xFFU; in readwriter()
748 *(u16 *) (pl022->rx) = in readwriter()
749 (u16) readw(SSP_DR(pl022->virtbase)); in readwriter()
752 *(u32 *) (pl022->rx) = in readwriter()
753 readl(SSP_DR(pl022->virtbase)); in readwriter()
756 pl022->rx += (pl022->cur_chip->n_bytes); in readwriter()
757 pl022->exp_fifo_level--; in readwriter()
768 * @pl022: SSP driver private data structure
775 static void *next_transfer(struct pl022 *pl022) in next_transfer() argument
777 struct spi_message *msg = pl022->cur_msg; in next_transfer()
778 struct spi_transfer *trans = pl022->cur_transfer; in next_transfer()
782 pl022->cur_transfer = in next_transfer()
795 static void unmap_free_dma_scatter(struct pl022 *pl022) in unmap_free_dma_scatter() argument
798 dma_unmap_sg(pl022->dma_tx_channel->device->dev, pl022->sgt_tx.sgl, in unmap_free_dma_scatter()
799 pl022->sgt_tx.nents, DMA_TO_DEVICE); in unmap_free_dma_scatter()
800 dma_unmap_sg(pl022->dma_rx_channel->device->dev, pl022->sgt_rx.sgl, in unmap_free_dma_scatter()
801 pl022->sgt_rx.nents, DMA_FROM_DEVICE); in unmap_free_dma_scatter()
802 sg_free_table(&pl022->sgt_rx); in unmap_free_dma_scatter()
803 sg_free_table(&pl022->sgt_tx); in unmap_free_dma_scatter()
808 struct pl022 *pl022 = data; in dma_callback() local
809 struct spi_message *msg = pl022->cur_msg; in dma_callback()
811 BUG_ON(!pl022->sgt_rx.sgl); in dma_callback()
824 dma_sync_sg_for_cpu(&pl022->adev->dev, in dma_callback()
825 pl022->sgt_rx.sgl, in dma_callback()
826 pl022->sgt_rx.nents, in dma_callback()
829 for_each_sg(pl022->sgt_rx.sgl, sg, pl022->sgt_rx.nents, i) { in dma_callback()
830 dev_dbg(&pl022->adev->dev, "SPI RX SG ENTRY: %d", i); in dma_callback()
839 for_each_sg(pl022->sgt_tx.sgl, sg, pl022->sgt_tx.nents, i) { in dma_callback()
840 dev_dbg(&pl022->adev->dev, "SPI TX SG ENTRY: %d", i); in dma_callback()
852 unmap_free_dma_scatter(pl022); in dma_callback()
855 msg->actual_length += pl022->cur_transfer->len; in dma_callback()
857 msg->state = next_transfer(pl022); in dma_callback()
858 if (msg->state != STATE_DONE && pl022->cur_transfer->cs_change) in dma_callback()
859 pl022_cs_control(pl022, SSP_CHIP_DESELECT); in dma_callback()
860 tasklet_schedule(&pl022->pump_transfers); in dma_callback()
863 static void setup_dma_scatter(struct pl022 *pl022, in setup_dma_scatter() argument
890 dev_dbg(&pl022->adev->dev, in setup_dma_scatter()
901 sg_set_page(sg, virt_to_page(pl022->dummypage), in setup_dma_scatter()
904 dev_dbg(&pl022->adev->dev, in setup_dma_scatter()
915 * @pl022: SSP driver's private data structure
917 static int configure_dma(struct pl022 *pl022) in configure_dma() argument
920 .src_addr = SSP_DR(pl022->phybase), in configure_dma()
925 .dst_addr = SSP_DR(pl022->phybase), in configure_dma()
932 struct dma_chan *rxchan = pl022->dma_rx_channel; in configure_dma()
933 struct dma_chan *txchan = pl022->dma_tx_channel; in configure_dma()
947 switch (pl022->rx_lev_trig) { in configure_dma()
964 rx_conf.src_maxburst = pl022->vendor->fifodepth >> 1; in configure_dma()
968 switch (pl022->tx_lev_trig) { in configure_dma()
985 tx_conf.dst_maxburst = pl022->vendor->fifodepth >> 1; in configure_dma()
989 switch (pl022->read) { in configure_dma()
1005 switch (pl022->write) { in configure_dma()
1032 pages = DIV_ROUND_UP(pl022->cur_transfer->len, PAGE_SIZE); in configure_dma()
1033 dev_dbg(&pl022->adev->dev, "using %d pages for transfer\n", pages); in configure_dma()
1035 ret = sg_alloc_table(&pl022->sgt_rx, pages, GFP_ATOMIC); in configure_dma()
1039 ret = sg_alloc_table(&pl022->sgt_tx, pages, GFP_ATOMIC); in configure_dma()
1044 setup_dma_scatter(pl022, pl022->rx, in configure_dma()
1045 pl022->cur_transfer->len, &pl022->sgt_rx); in configure_dma()
1046 setup_dma_scatter(pl022, pl022->tx, in configure_dma()
1047 pl022->cur_transfer->len, &pl022->sgt_tx); in configure_dma()
1050 rx_sglen = dma_map_sg(rxchan->device->dev, pl022->sgt_rx.sgl, in configure_dma()
1051 pl022->sgt_rx.nents, DMA_FROM_DEVICE); in configure_dma()
1055 tx_sglen = dma_map_sg(txchan->device->dev, pl022->sgt_tx.sgl, in configure_dma()
1056 pl022->sgt_tx.nents, DMA_TO_DEVICE); in configure_dma()
1062 pl022->sgt_rx.sgl, in configure_dma()
1070 pl022->sgt_tx.sgl, in configure_dma()
1079 rxdesc->callback_param = pl022; in configure_dma()
1086 pl022->dma_running = true; in configure_dma()
1094 dma_unmap_sg(txchan->device->dev, pl022->sgt_tx.sgl, in configure_dma()
1095 pl022->sgt_tx.nents, DMA_TO_DEVICE); in configure_dma()
1097 dma_unmap_sg(rxchan->device->dev, pl022->sgt_rx.sgl, in configure_dma()
1098 pl022->sgt_rx.nents, DMA_FROM_DEVICE); in configure_dma()
1100 sg_free_table(&pl022->sgt_tx); in configure_dma()
1102 sg_free_table(&pl022->sgt_rx); in configure_dma()
1107 static int pl022_dma_probe(struct pl022 *pl022) in pl022_dma_probe() argument
1118 pl022->dma_rx_channel = dma_request_channel(mask, in pl022_dma_probe()
1119 pl022->master_info->dma_filter, in pl022_dma_probe()
1120 pl022->master_info->dma_rx_param); in pl022_dma_probe()
1121 if (!pl022->dma_rx_channel) { in pl022_dma_probe()
1122 dev_dbg(&pl022->adev->dev, "no RX DMA channel!\n"); in pl022_dma_probe()
1126 pl022->dma_tx_channel = dma_request_channel(mask, in pl022_dma_probe()
1127 pl022->master_info->dma_filter, in pl022_dma_probe()
1128 pl022->master_info->dma_tx_param); in pl022_dma_probe()
1129 if (!pl022->dma_tx_channel) { in pl022_dma_probe()
1130 dev_dbg(&pl022->adev->dev, "no TX DMA channel!\n"); in pl022_dma_probe()
1134 pl022->dummypage = kmalloc(PAGE_SIZE, GFP_KERNEL); in pl022_dma_probe()
1135 if (!pl022->dummypage) in pl022_dma_probe()
1138 dev_info(&pl022->adev->dev, "setup for DMA on RX %s, TX %s\n", in pl022_dma_probe()
1139 dma_chan_name(pl022->dma_rx_channel), in pl022_dma_probe()
1140 dma_chan_name(pl022->dma_tx_channel)); in pl022_dma_probe()
1145 dma_release_channel(pl022->dma_tx_channel); in pl022_dma_probe()
1147 dma_release_channel(pl022->dma_rx_channel); in pl022_dma_probe()
1148 pl022->dma_rx_channel = NULL; in pl022_dma_probe()
1150 dev_err(&pl022->adev->dev, in pl022_dma_probe()
1155 static int pl022_dma_autoprobe(struct pl022 *pl022) in pl022_dma_autoprobe() argument
1157 struct device *dev = &pl022->adev->dev; in pl022_dma_autoprobe()
1168 pl022->dma_rx_channel = chan; in pl022_dma_autoprobe()
1176 pl022->dma_tx_channel = chan; in pl022_dma_autoprobe()
1178 pl022->dummypage = kmalloc(PAGE_SIZE, GFP_KERNEL); in pl022_dma_autoprobe()
1179 if (!pl022->dummypage) { in pl022_dma_autoprobe()
1187 dma_release_channel(pl022->dma_tx_channel); in pl022_dma_autoprobe()
1188 pl022->dma_tx_channel = NULL; in pl022_dma_autoprobe()
1190 dma_release_channel(pl022->dma_rx_channel); in pl022_dma_autoprobe()
1191 pl022->dma_rx_channel = NULL; in pl022_dma_autoprobe()
1196 static void terminate_dma(struct pl022 *pl022) in terminate_dma() argument
1198 struct dma_chan *rxchan = pl022->dma_rx_channel; in terminate_dma()
1199 struct dma_chan *txchan = pl022->dma_tx_channel; in terminate_dma()
1203 unmap_free_dma_scatter(pl022); in terminate_dma()
1204 pl022->dma_running = false; in terminate_dma()
1207 static void pl022_dma_remove(struct pl022 *pl022) in pl022_dma_remove() argument
1209 if (pl022->dma_running) in pl022_dma_remove()
1210 terminate_dma(pl022); in pl022_dma_remove()
1211 if (pl022->dma_tx_channel) in pl022_dma_remove()
1212 dma_release_channel(pl022->dma_tx_channel); in pl022_dma_remove()
1213 if (pl022->dma_rx_channel) in pl022_dma_remove()
1214 dma_release_channel(pl022->dma_rx_channel); in pl022_dma_remove()
1215 kfree(pl022->dummypage); in pl022_dma_remove()
1219 static inline int configure_dma(struct pl022 *pl022) in configure_dma() argument
1224 static inline int pl022_dma_autoprobe(struct pl022 *pl022) in pl022_dma_autoprobe() argument
1229 static inline int pl022_dma_probe(struct pl022 *pl022) in pl022_dma_probe() argument
1234 static inline void pl022_dma_remove(struct pl022 *pl022) in pl022_dma_remove() argument
1252 struct pl022 *pl022 = dev_id; in pl022_interrupt_handler() local
1253 struct spi_message *msg = pl022->cur_msg; in pl022_interrupt_handler()
1257 dev_err(&pl022->adev->dev, in pl022_interrupt_handler()
1264 irq_status = readw(SSP_MIS(pl022->virtbase)); in pl022_interrupt_handler()
1279 dev_err(&pl022->adev->dev, "FIFO overrun\n"); in pl022_interrupt_handler()
1280 if (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RFF) in pl022_interrupt_handler()
1281 dev_err(&pl022->adev->dev, in pl022_interrupt_handler()
1290 SSP_IMSC(pl022->virtbase)); in pl022_interrupt_handler()
1291 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); in pl022_interrupt_handler()
1292 writew((readw(SSP_CR1(pl022->virtbase)) & in pl022_interrupt_handler()
1293 (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase)); in pl022_interrupt_handler()
1297 tasklet_schedule(&pl022->pump_transfers); in pl022_interrupt_handler()
1301 readwriter(pl022); in pl022_interrupt_handler()
1303 if (pl022->tx == pl022->tx_end) { in pl022_interrupt_handler()
1305 writew((readw(SSP_IMSC(pl022->virtbase)) & in pl022_interrupt_handler()
1307 SSP_IMSC(pl022->virtbase)); in pl022_interrupt_handler()
1315 if (pl022->rx >= pl022->rx_end) { in pl022_interrupt_handler()
1317 SSP_IMSC(pl022->virtbase)); in pl022_interrupt_handler()
1318 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); in pl022_interrupt_handler()
1319 if (unlikely(pl022->rx > pl022->rx_end)) { in pl022_interrupt_handler()
1320 dev_warn(&pl022->adev->dev, "read %u surplus " in pl022_interrupt_handler()
1323 (u32) (pl022->rx - pl022->rx_end)); in pl022_interrupt_handler()
1326 msg->actual_length += pl022->cur_transfer->len; in pl022_interrupt_handler()
1328 msg->state = next_transfer(pl022); in pl022_interrupt_handler()
1329 if (msg->state != STATE_DONE && pl022->cur_transfer->cs_change) in pl022_interrupt_handler()
1330 pl022_cs_control(pl022, SSP_CHIP_DESELECT); in pl022_interrupt_handler()
1331 tasklet_schedule(&pl022->pump_transfers); in pl022_interrupt_handler()
1342 static int set_up_next_transfer(struct pl022 *pl022, in set_up_next_transfer() argument
1348 residue = pl022->cur_transfer->len % pl022->cur_chip->n_bytes; in set_up_next_transfer()
1350 dev_err(&pl022->adev->dev, in set_up_next_transfer()
1353 pl022->cur_transfer->len, in set_up_next_transfer()
1354 pl022->cur_chip->n_bytes); in set_up_next_transfer()
1355 dev_err(&pl022->adev->dev, "skipping this message\n"); in set_up_next_transfer()
1358 pl022->tx = (void *)transfer->tx_buf; in set_up_next_transfer()
1359 pl022->tx_end = pl022->tx + pl022->cur_transfer->len; in set_up_next_transfer()
1360 pl022->rx = (void *)transfer->rx_buf; in set_up_next_transfer()
1361 pl022->rx_end = pl022->rx + pl022->cur_transfer->len; in set_up_next_transfer()
1362 pl022->write = in set_up_next_transfer()
1363 pl022->tx ? pl022->cur_chip->write : WRITING_NULL; in set_up_next_transfer()
1364 pl022->read = pl022->rx ? pl022->cur_chip->read : READING_NULL; in set_up_next_transfer()
1376 struct pl022 *pl022 = (struct pl022 *) data; in pump_transfers() local
1382 message = pl022->cur_msg; in pump_transfers()
1383 transfer = pl022->cur_transfer; in pump_transfers()
1388 giveback(pl022); in pump_transfers()
1395 giveback(pl022); in pump_transfers()
1413 pl022_cs_control(pl022, SSP_CHIP_SELECT); in pump_transfers()
1419 if (set_up_next_transfer(pl022, transfer)) { in pump_transfers()
1422 giveback(pl022); in pump_transfers()
1426 flush(pl022); in pump_transfers()
1428 if (pl022->cur_chip->enable_dma) { in pump_transfers()
1429 if (configure_dma(pl022)) { in pump_transfers()
1430 dev_dbg(&pl022->adev->dev, in pump_transfers()
1439 writew(ENABLE_ALL_INTERRUPTS & ~SSP_IMSC_MASK_RXIM, SSP_IMSC(pl022->virtbase)); in pump_transfers()
1442 static void do_interrupt_dma_transfer(struct pl022 *pl022) in do_interrupt_dma_transfer() argument
1451 if (!pl022->next_msg_cs_active) in do_interrupt_dma_transfer()
1452 pl022_cs_control(pl022, SSP_CHIP_SELECT); in do_interrupt_dma_transfer()
1454 if (set_up_next_transfer(pl022, pl022->cur_transfer)) { in do_interrupt_dma_transfer()
1456 pl022->cur_msg->state = STATE_ERROR; in do_interrupt_dma_transfer()
1457 pl022->cur_msg->status = -EIO; in do_interrupt_dma_transfer()
1458 giveback(pl022); in do_interrupt_dma_transfer()
1462 if (pl022->cur_chip->enable_dma) { in do_interrupt_dma_transfer()
1464 if (configure_dma(pl022)) { in do_interrupt_dma_transfer()
1465 dev_dbg(&pl022->adev->dev, in do_interrupt_dma_transfer()
1474 writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE), in do_interrupt_dma_transfer()
1475 SSP_CR1(pl022->virtbase)); in do_interrupt_dma_transfer()
1476 writew(irqflags, SSP_IMSC(pl022->virtbase)); in do_interrupt_dma_transfer()
1479 static void print_current_status(struct pl022 *pl022) in print_current_status() argument
1484 if (pl022->vendor->extended_cr) in print_current_status()
1485 read_cr0 = readl(SSP_CR0(pl022->virtbase)); in print_current_status()
1487 read_cr0 = readw(SSP_CR0(pl022->virtbase)); in print_current_status()
1488 read_cr1 = readw(SSP_CR1(pl022->virtbase)); in print_current_status()
1489 read_dmacr = readw(SSP_DMACR(pl022->virtbase)); in print_current_status()
1490 read_sr = readw(SSP_SR(pl022->virtbase)); in print_current_status()
1492 dev_warn(&pl022->adev->dev, "spi-pl022 CR0: %x\n", read_cr0); in print_current_status()
1493 dev_warn(&pl022->adev->dev, "spi-pl022 CR1: %x\n", read_cr1); in print_current_status()
1494 dev_warn(&pl022->adev->dev, "spi-pl022 DMACR: %x\n", read_dmacr); in print_current_status()
1495 dev_warn(&pl022->adev->dev, "spi-pl022 SR: %x\n", read_sr); in print_current_status()
1496 dev_warn(&pl022->adev->dev, in print_current_status()
1497 "spi-pl022 exp_fifo_level/fifodepth: %u/%d\n", in print_current_status()
1498 pl022->exp_fifo_level, in print_current_status()
1499 pl022->vendor->fifodepth); in print_current_status()
1503 static void do_polling_transfer(struct pl022 *pl022) in do_polling_transfer() argument
1510 message = pl022->cur_msg; in do_polling_transfer()
1516 transfer = pl022->cur_transfer; in do_polling_transfer()
1526 pl022_cs_control(pl022, SSP_CHIP_SELECT); in do_polling_transfer()
1530 if (!pl022->next_msg_cs_active) in do_polling_transfer()
1531 pl022_cs_control(pl022, SSP_CHIP_SELECT); in do_polling_transfer()
1535 if (set_up_next_transfer(pl022, transfer)) { in do_polling_transfer()
1541 flush(pl022); in do_polling_transfer()
1542 writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE), in do_polling_transfer()
1543 SSP_CR1(pl022->virtbase)); in do_polling_transfer()
1545 dev_dbg(&pl022->adev->dev, "polling transfer ongoing ...\n"); in do_polling_transfer()
1548 while (pl022->tx < pl022->tx_end || pl022->rx < pl022->rx_end) { in do_polling_transfer()
1550 readwriter(pl022); in do_polling_transfer()
1552 dev_warn(&pl022->adev->dev, in do_polling_transfer()
1555 print_current_status(pl022); in do_polling_transfer()
1562 message->actual_length += pl022->cur_transfer->len; in do_polling_transfer()
1564 message->state = next_transfer(pl022); in do_polling_transfer()
1566 && pl022->cur_transfer->cs_change) in do_polling_transfer()
1567 pl022_cs_control(pl022, SSP_CHIP_DESELECT); in do_polling_transfer()
1578 giveback(pl022); in do_polling_transfer()
1585 struct pl022 *pl022 = spi_master_get_devdata(master); in pl022_transfer_one_message() local
1588 pl022->cur_msg = msg; in pl022_transfer_one_message()
1591 pl022->cur_transfer = list_entry(msg->transfers.next, in pl022_transfer_one_message()
1595 pl022->cur_chip = spi_get_ctldata(msg->spi); in pl022_transfer_one_message()
1596 pl022->cur_cs = pl022->chipselects[msg->spi->chip_select]; in pl022_transfer_one_message()
1598 restore_state(pl022); in pl022_transfer_one_message()
1599 flush(pl022); in pl022_transfer_one_message()
1601 if (pl022->cur_chip->xfer_type == POLLING_TRANSFER) in pl022_transfer_one_message()
1602 do_polling_transfer(pl022); in pl022_transfer_one_message()
1604 do_interrupt_dma_transfer(pl022); in pl022_transfer_one_message()
1611 struct pl022 *pl022 = spi_master_get_devdata(master); in pl022_unprepare_transfer_hardware() local
1614 writew((readw(SSP_CR1(pl022->virtbase)) & in pl022_unprepare_transfer_hardware()
1615 (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase)); in pl022_unprepare_transfer_hardware()
1620 static int verify_controller_parameters(struct pl022 *pl022, in verify_controller_parameters() argument
1625 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1630 (!pl022->vendor->unidir)) { in verify_controller_parameters()
1631 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1638 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1645 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1656 if (pl022->vendor->fifodepth < 16) { in verify_controller_parameters()
1657 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1663 if (pl022->vendor->fifodepth < 32) { in verify_controller_parameters()
1664 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1670 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1681 if (pl022->vendor->fifodepth < 16) { in verify_controller_parameters()
1682 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1688 if (pl022->vendor->fifodepth < 32) { in verify_controller_parameters()
1689 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1695 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1702 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1708 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1713 if (pl022->vendor->extended_cr) { in verify_controller_parameters()
1718 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1724 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1727 " ST version of PL022\n"); in verify_controller_parameters()
1739 static int calculate_effective_freq(struct pl022 *pl022, int freq, struct in calculate_effective_freq() argument
1747 rate = clk_get_rate(pl022->clk); in calculate_effective_freq()
1754 dev_warn(&pl022->adev->dev, in calculate_effective_freq()
1759 dev_err(&pl022->adev->dev, in calculate_effective_freq()
1801 WARN(!best_freq, "pl022: Matching cpsdvsr and scr not found for %d Hz rate \n", in calculate_effective_freq()
1806 dev_dbg(&pl022->adev->dev, in calculate_effective_freq()
1809 dev_dbg(&pl022->adev->dev, "SSP cpsdvsr = %d, scr = %d\n", in calculate_effective_freq()
1851 struct pl022 *pl022 = spi_master_get_devdata(spi->master); in pl022_setup() local
1878 of_property_read_u32(np, "pl022,interface", in pl022_setup()
1880 of_property_read_u32(np, "pl022,com-mode", in pl022_setup()
1882 of_property_read_u32(np, "pl022,rx-level-trig", in pl022_setup()
1884 of_property_read_u32(np, "pl022,tx-level-trig", in pl022_setup()
1886 of_property_read_u32(np, "pl022,ctrl-len", in pl022_setup()
1888 of_property_read_u32(np, "pl022,wait-state", in pl022_setup()
1890 of_property_read_u32(np, "pl022,duplex", in pl022_setup()
1910 status = calculate_effective_freq(pl022, in pl022_setup()
1929 status = verify_controller_parameters(pl022, chip_info); in pl022_setup()
1935 pl022->rx_lev_trig = chip_info->rx_lev_trig; in pl022_setup()
1936 pl022->tx_lev_trig = chip_info->tx_lev_trig; in pl022_setup()
1942 if (!gpio_is_valid(pl022->chipselects[spi->chip_select])) in pl022_setup()
1949 if ((bits <= 3) || (bits > pl022->vendor->max_bpw)) { in pl022_setup()
1953 pl022->vendor->max_bpw); in pl022_setup()
1978 && ((pl022->master_info)->enable_dma)) { in pl022_setup()
1997 if (pl022->vendor->extended_cr) { in pl022_setup()
2000 if (pl022->vendor->pl023) { in pl022_setup()
2005 /* These bits are in the PL022 but not PL023 */ in pl022_setup()
2053 if (pl022->vendor->loopback) { in pl022_setup()
2109 of_property_read_u32(np, "pl022,autosuspend-delay", in pl022_platform_data_dt_get()
2111 pd->rt = of_property_read_bool(np, "pl022,rt"); in pl022_platform_data_dt_get()
2122 struct pl022 *pl022 = NULL; /*Data for this driver */ in pl022_probe() local
2127 "ARM PL022 driver, device ID: 0x%08x\n", adev->periphid); in pl022_probe()
2144 master = spi_alloc_master(dev, sizeof(struct pl022)); in pl022_probe()
2150 pl022 = spi_master_get_devdata(master); in pl022_probe()
2151 pl022->master = master; in pl022_probe()
2152 pl022->master_info = platform_info; in pl022_probe()
2153 pl022->adev = adev; in pl022_probe()
2154 pl022->vendor = id->data; in pl022_probe()
2155 pl022->chipselects = devm_kcalloc(dev, num_cs, sizeof(int), in pl022_probe()
2157 if (!pl022->chipselects) { in pl022_probe()
2178 pl022->chipselects[i] = platform_info->chipselects[i]; in pl022_probe()
2179 } else if (pl022->vendor->internal_cs_ctrl) { in pl022_probe()
2181 pl022->chipselects[i] = i; in pl022_probe()
2191 pl022->chipselects[i] = cs_gpio; in pl022_probe()
2194 if (devm_gpio_request(dev, cs_gpio, "ssp-pl022")) in pl022_probe()
2208 * always MS bit first on the original pl022. in pl022_probe()
2211 if (pl022->vendor->extended_cr) in pl022_probe()
2220 pl022->phybase = adev->res.start; in pl022_probe()
2221 pl022->virtbase = devm_ioremap(dev, adev->res.start, in pl022_probe()
2223 if (pl022->virtbase == NULL) { in pl022_probe()
2228 &adev->res.start, pl022->virtbase); in pl022_probe()
2230 pl022->clk = devm_clk_get(&adev->dev, NULL); in pl022_probe()
2231 if (IS_ERR(pl022->clk)) { in pl022_probe()
2232 status = PTR_ERR(pl022->clk); in pl022_probe()
2237 status = clk_prepare_enable(pl022->clk); in pl022_probe()
2244 tasklet_init(&pl022->pump_transfers, pump_transfers, in pl022_probe()
2245 (unsigned long)pl022); in pl022_probe()
2248 writew((readw(SSP_CR1(pl022->virtbase)) & (~SSP_CR1_MASK_SSE)), in pl022_probe()
2249 SSP_CR1(pl022->virtbase)); in pl022_probe()
2250 load_ssp_default_config(pl022); in pl022_probe()
2253 0, "pl022", pl022); in pl022_probe()
2260 status = pl022_dma_autoprobe(pl022); in pl022_probe()
2270 status = pl022_dma_probe(pl022); in pl022_probe()
2276 amba_set_drvdata(adev, pl022); in pl022_probe()
2300 pl022_dma_remove(pl022); in pl022_probe()
2302 clk_disable_unprepare(pl022->clk); in pl022_probe()
2317 struct pl022 *pl022 = amba_get_drvdata(adev); in pl022_remove() local
2319 if (!pl022) in pl022_remove()
2328 load_ssp_default_config(pl022); in pl022_remove()
2329 if (pl022->master_info->enable_dma) in pl022_remove()
2330 pl022_dma_remove(pl022); in pl022_remove()
2332 clk_disable_unprepare(pl022->clk); in pl022_remove()
2334 tasklet_disable(&pl022->pump_transfers); in pl022_remove()
2341 struct pl022 *pl022 = dev_get_drvdata(dev); in pl022_suspend() local
2344 ret = spi_master_suspend(pl022->master); in pl022_suspend()
2350 spi_master_resume(pl022->master); in pl022_suspend()
2362 struct pl022 *pl022 = dev_get_drvdata(dev); in pl022_resume() local
2370 ret = spi_master_resume(pl022->master); in pl022_resume()
2381 struct pl022 *pl022 = dev_get_drvdata(dev); in pl022_runtime_suspend() local
2383 clk_disable_unprepare(pl022->clk); in pl022_runtime_suspend()
2391 struct pl022 *pl022 = dev_get_drvdata(dev); in pl022_runtime_resume() local
2394 clk_prepare_enable(pl022->clk); in pl022_runtime_resume()
2448 * ARM PL022 variant, this has a 16bit wide
2467 * an official ARM number), this is a PL022 SSP block
2478 * PL022 variant that has a chip select control register whih
2492 .name = "ssp-pl022",
2513 MODULE_DESCRIPTION("PL022 SSP Controller Driver");