Lines Matching refs:pl022
379 struct pl022 { struct
466 static void internal_cs_control(struct pl022 *pl022, u32 command) in internal_cs_control() argument
470 tmp = readw(SSP_CSR(pl022->virtbase)); in internal_cs_control()
472 tmp &= ~BIT(pl022->cur_cs); in internal_cs_control()
474 tmp |= BIT(pl022->cur_cs); in internal_cs_control()
475 writew(tmp, SSP_CSR(pl022->virtbase)); in internal_cs_control()
478 static void pl022_cs_control(struct pl022 *pl022, u32 command) in pl022_cs_control() argument
480 if (pl022->vendor->internal_cs_ctrl) in pl022_cs_control()
481 internal_cs_control(pl022, command); in pl022_cs_control()
482 else if (gpio_is_valid(pl022->cur_cs)) in pl022_cs_control()
483 gpio_set_value(pl022->cur_cs, command); in pl022_cs_control()
485 pl022->cur_chip->cs_control(command); in pl022_cs_control()
494 static void giveback(struct pl022 *pl022) in giveback() argument
497 pl022->next_msg_cs_active = false; in giveback()
499 last_transfer = list_last_entry(&pl022->cur_msg->transfers, in giveback()
524 next_msg = spi_get_next_queued_message(pl022->master); in giveback()
530 if (next_msg && next_msg->spi != pl022->cur_msg->spi) in giveback()
532 if (!next_msg || pl022->cur_msg->state == STATE_ERROR) in giveback()
533 pl022_cs_control(pl022, SSP_CHIP_DESELECT); in giveback()
535 pl022->next_msg_cs_active = true; in giveback()
539 pl022->cur_msg = NULL; in giveback()
540 pl022->cur_transfer = NULL; in giveback()
541 pl022->cur_chip = NULL; in giveback()
544 writew((readw(SSP_CR1(pl022->virtbase)) & in giveback()
545 (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase)); in giveback()
547 spi_finalize_current_message(pl022->master); in giveback()
554 static int flush(struct pl022 *pl022) in flush() argument
558 dev_dbg(&pl022->adev->dev, "flush\n"); in flush()
560 while (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE) in flush()
561 readw(SSP_DR(pl022->virtbase)); in flush()
562 } while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_BSY) && limit--); in flush()
564 pl022->exp_fifo_level = 0; in flush()
573 static void restore_state(struct pl022 *pl022) in restore_state() argument
575 struct chip_data *chip = pl022->cur_chip; in restore_state()
577 if (pl022->vendor->extended_cr) in restore_state()
578 writel(chip->cr0, SSP_CR0(pl022->virtbase)); in restore_state()
580 writew(chip->cr0, SSP_CR0(pl022->virtbase)); in restore_state()
581 writew(chip->cr1, SSP_CR1(pl022->virtbase)); in restore_state()
582 writew(chip->dmacr, SSP_DMACR(pl022->virtbase)); in restore_state()
583 writew(chip->cpsr, SSP_CPSR(pl022->virtbase)); in restore_state()
584 writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase)); in restore_state()
585 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); in restore_state()
663 static void load_ssp_default_config(struct pl022 *pl022) in load_ssp_default_config() argument
665 if (pl022->vendor->pl023) { in load_ssp_default_config()
666 writel(DEFAULT_SSP_REG_CR0_ST_PL023, SSP_CR0(pl022->virtbase)); in load_ssp_default_config()
667 writew(DEFAULT_SSP_REG_CR1_ST_PL023, SSP_CR1(pl022->virtbase)); in load_ssp_default_config()
668 } else if (pl022->vendor->extended_cr) { in load_ssp_default_config()
669 writel(DEFAULT_SSP_REG_CR0_ST, SSP_CR0(pl022->virtbase)); in load_ssp_default_config()
670 writew(DEFAULT_SSP_REG_CR1_ST, SSP_CR1(pl022->virtbase)); in load_ssp_default_config()
672 writew(DEFAULT_SSP_REG_CR0, SSP_CR0(pl022->virtbase)); in load_ssp_default_config()
673 writew(DEFAULT_SSP_REG_CR1, SSP_CR1(pl022->virtbase)); in load_ssp_default_config()
675 writew(DEFAULT_SSP_REG_DMACR, SSP_DMACR(pl022->virtbase)); in load_ssp_default_config()
676 writew(DEFAULT_SSP_REG_CPSR, SSP_CPSR(pl022->virtbase)); in load_ssp_default_config()
677 writew(DISABLE_ALL_INTERRUPTS, SSP_IMSC(pl022->virtbase)); in load_ssp_default_config()
678 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); in load_ssp_default_config()
685 static void readwriter(struct pl022 *pl022) in readwriter() argument
698 dev_dbg(&pl022->adev->dev, in readwriter()
700 __func__, pl022->rx, pl022->rx_end, pl022->tx, pl022->tx_end); in readwriter()
703 while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE) in readwriter()
704 && (pl022->rx < pl022->rx_end)) { in readwriter()
705 switch (pl022->read) { in readwriter()
707 readw(SSP_DR(pl022->virtbase)); in readwriter()
710 *(u8 *) (pl022->rx) = in readwriter()
711 readw(SSP_DR(pl022->virtbase)) & 0xFFU; in readwriter()
714 *(u16 *) (pl022->rx) = in readwriter()
715 (u16) readw(SSP_DR(pl022->virtbase)); in readwriter()
718 *(u32 *) (pl022->rx) = in readwriter()
719 readl(SSP_DR(pl022->virtbase)); in readwriter()
722 pl022->rx += (pl022->cur_chip->n_bytes); in readwriter()
723 pl022->exp_fifo_level--; in readwriter()
728 while ((pl022->exp_fifo_level < pl022->vendor->fifodepth) in readwriter()
729 && (pl022->tx < pl022->tx_end)) { in readwriter()
730 switch (pl022->write) { in readwriter()
732 writew(0x0, SSP_DR(pl022->virtbase)); in readwriter()
735 writew(*(u8 *) (pl022->tx), SSP_DR(pl022->virtbase)); in readwriter()
738 writew((*(u16 *) (pl022->tx)), SSP_DR(pl022->virtbase)); in readwriter()
741 writel(*(u32 *) (pl022->tx), SSP_DR(pl022->virtbase)); in readwriter()
744 pl022->tx += (pl022->cur_chip->n_bytes); in readwriter()
745 pl022->exp_fifo_level++; in readwriter()
752 while ((readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RNE) in readwriter()
753 && (pl022->rx < pl022->rx_end)) { in readwriter()
754 switch (pl022->read) { in readwriter()
756 readw(SSP_DR(pl022->virtbase)); in readwriter()
759 *(u8 *) (pl022->rx) = in readwriter()
760 readw(SSP_DR(pl022->virtbase)) & 0xFFU; in readwriter()
763 *(u16 *) (pl022->rx) = in readwriter()
764 (u16) readw(SSP_DR(pl022->virtbase)); in readwriter()
767 *(u32 *) (pl022->rx) = in readwriter()
768 readl(SSP_DR(pl022->virtbase)); in readwriter()
771 pl022->rx += (pl022->cur_chip->n_bytes); in readwriter()
772 pl022->exp_fifo_level--; in readwriter()
790 static void *next_transfer(struct pl022 *pl022) in next_transfer() argument
792 struct spi_message *msg = pl022->cur_msg; in next_transfer()
793 struct spi_transfer *trans = pl022->cur_transfer; in next_transfer()
797 pl022->cur_transfer = in next_transfer()
810 static void unmap_free_dma_scatter(struct pl022 *pl022) in unmap_free_dma_scatter() argument
813 dma_unmap_sg(pl022->dma_tx_channel->device->dev, pl022->sgt_tx.sgl, in unmap_free_dma_scatter()
814 pl022->sgt_tx.nents, DMA_TO_DEVICE); in unmap_free_dma_scatter()
815 dma_unmap_sg(pl022->dma_rx_channel->device->dev, pl022->sgt_rx.sgl, in unmap_free_dma_scatter()
816 pl022->sgt_rx.nents, DMA_FROM_DEVICE); in unmap_free_dma_scatter()
817 sg_free_table(&pl022->sgt_rx); in unmap_free_dma_scatter()
818 sg_free_table(&pl022->sgt_tx); in unmap_free_dma_scatter()
823 struct pl022 *pl022 = data; in dma_callback() local
824 struct spi_message *msg = pl022->cur_msg; in dma_callback()
826 BUG_ON(!pl022->sgt_rx.sgl); in dma_callback()
839 dma_sync_sg_for_cpu(&pl022->adev->dev, in dma_callback()
840 pl022->sgt_rx.sgl, in dma_callback()
841 pl022->sgt_rx.nents, in dma_callback()
844 for_each_sg(pl022->sgt_rx.sgl, sg, pl022->sgt_rx.nents, i) { in dma_callback()
845 dev_dbg(&pl022->adev->dev, "SPI RX SG ENTRY: %d", i); in dma_callback()
854 for_each_sg(pl022->sgt_tx.sgl, sg, pl022->sgt_tx.nents, i) { in dma_callback()
855 dev_dbg(&pl022->adev->dev, "SPI TX SG ENTRY: %d", i); in dma_callback()
867 unmap_free_dma_scatter(pl022); in dma_callback()
870 msg->actual_length += pl022->cur_transfer->len; in dma_callback()
871 if (pl022->cur_transfer->cs_change) in dma_callback()
872 pl022_cs_control(pl022, SSP_CHIP_DESELECT); in dma_callback()
875 msg->state = next_transfer(pl022); in dma_callback()
876 tasklet_schedule(&pl022->pump_transfers); in dma_callback()
879 static void setup_dma_scatter(struct pl022 *pl022, in setup_dma_scatter() argument
906 dev_dbg(&pl022->adev->dev, in setup_dma_scatter()
917 sg_set_page(sg, virt_to_page(pl022->dummypage), in setup_dma_scatter()
920 dev_dbg(&pl022->adev->dev, in setup_dma_scatter()
933 static int configure_dma(struct pl022 *pl022) in configure_dma() argument
936 .src_addr = SSP_DR(pl022->phybase), in configure_dma()
941 .dst_addr = SSP_DR(pl022->phybase), in configure_dma()
948 struct dma_chan *rxchan = pl022->dma_rx_channel; in configure_dma()
949 struct dma_chan *txchan = pl022->dma_tx_channel; in configure_dma()
963 switch (pl022->rx_lev_trig) { in configure_dma()
980 rx_conf.src_maxburst = pl022->vendor->fifodepth >> 1; in configure_dma()
984 switch (pl022->tx_lev_trig) { in configure_dma()
1001 tx_conf.dst_maxburst = pl022->vendor->fifodepth >> 1; in configure_dma()
1005 switch (pl022->read) { in configure_dma()
1021 switch (pl022->write) { in configure_dma()
1048 pages = DIV_ROUND_UP(pl022->cur_transfer->len, PAGE_SIZE); in configure_dma()
1049 dev_dbg(&pl022->adev->dev, "using %d pages for transfer\n", pages); in configure_dma()
1051 ret = sg_alloc_table(&pl022->sgt_rx, pages, GFP_ATOMIC); in configure_dma()
1055 ret = sg_alloc_table(&pl022->sgt_tx, pages, GFP_ATOMIC); in configure_dma()
1060 setup_dma_scatter(pl022, pl022->rx, in configure_dma()
1061 pl022->cur_transfer->len, &pl022->sgt_rx); in configure_dma()
1062 setup_dma_scatter(pl022, pl022->tx, in configure_dma()
1063 pl022->cur_transfer->len, &pl022->sgt_tx); in configure_dma()
1066 rx_sglen = dma_map_sg(rxchan->device->dev, pl022->sgt_rx.sgl, in configure_dma()
1067 pl022->sgt_rx.nents, DMA_FROM_DEVICE); in configure_dma()
1071 tx_sglen = dma_map_sg(txchan->device->dev, pl022->sgt_tx.sgl, in configure_dma()
1072 pl022->sgt_tx.nents, DMA_TO_DEVICE); in configure_dma()
1078 pl022->sgt_rx.sgl, in configure_dma()
1086 pl022->sgt_tx.sgl, in configure_dma()
1095 rxdesc->callback_param = pl022; in configure_dma()
1102 pl022->dma_running = true; in configure_dma()
1110 dma_unmap_sg(txchan->device->dev, pl022->sgt_tx.sgl, in configure_dma()
1111 pl022->sgt_tx.nents, DMA_TO_DEVICE); in configure_dma()
1113 dma_unmap_sg(rxchan->device->dev, pl022->sgt_rx.sgl, in configure_dma()
1114 pl022->sgt_rx.nents, DMA_FROM_DEVICE); in configure_dma()
1116 sg_free_table(&pl022->sgt_tx); in configure_dma()
1118 sg_free_table(&pl022->sgt_rx); in configure_dma()
1123 static int pl022_dma_probe(struct pl022 *pl022) in pl022_dma_probe() argument
1134 pl022->dma_rx_channel = dma_request_channel(mask, in pl022_dma_probe()
1135 pl022->master_info->dma_filter, in pl022_dma_probe()
1136 pl022->master_info->dma_rx_param); in pl022_dma_probe()
1137 if (!pl022->dma_rx_channel) { in pl022_dma_probe()
1138 dev_dbg(&pl022->adev->dev, "no RX DMA channel!\n"); in pl022_dma_probe()
1142 pl022->dma_tx_channel = dma_request_channel(mask, in pl022_dma_probe()
1143 pl022->master_info->dma_filter, in pl022_dma_probe()
1144 pl022->master_info->dma_tx_param); in pl022_dma_probe()
1145 if (!pl022->dma_tx_channel) { in pl022_dma_probe()
1146 dev_dbg(&pl022->adev->dev, "no TX DMA channel!\n"); in pl022_dma_probe()
1150 pl022->dummypage = kmalloc(PAGE_SIZE, GFP_KERNEL); in pl022_dma_probe()
1151 if (!pl022->dummypage) in pl022_dma_probe()
1154 dev_info(&pl022->adev->dev, "setup for DMA on RX %s, TX %s\n", in pl022_dma_probe()
1155 dma_chan_name(pl022->dma_rx_channel), in pl022_dma_probe()
1156 dma_chan_name(pl022->dma_tx_channel)); in pl022_dma_probe()
1161 dma_release_channel(pl022->dma_tx_channel); in pl022_dma_probe()
1163 dma_release_channel(pl022->dma_rx_channel); in pl022_dma_probe()
1164 pl022->dma_rx_channel = NULL; in pl022_dma_probe()
1166 dev_err(&pl022->adev->dev, in pl022_dma_probe()
1171 static int pl022_dma_autoprobe(struct pl022 *pl022) in pl022_dma_autoprobe() argument
1173 struct device *dev = &pl022->adev->dev; in pl022_dma_autoprobe()
1176 pl022->dma_rx_channel = dma_request_slave_channel(dev, "rx"); in pl022_dma_autoprobe()
1177 if (!pl022->dma_rx_channel) in pl022_dma_autoprobe()
1180 pl022->dma_tx_channel = dma_request_slave_channel(dev, "tx"); in pl022_dma_autoprobe()
1181 if (!pl022->dma_tx_channel) in pl022_dma_autoprobe()
1184 pl022->dummypage = kmalloc(PAGE_SIZE, GFP_KERNEL); in pl022_dma_autoprobe()
1185 if (!pl022->dummypage) in pl022_dma_autoprobe()
1191 dma_release_channel(pl022->dma_tx_channel); in pl022_dma_autoprobe()
1192 pl022->dma_tx_channel = NULL; in pl022_dma_autoprobe()
1194 dma_release_channel(pl022->dma_rx_channel); in pl022_dma_autoprobe()
1195 pl022->dma_rx_channel = NULL; in pl022_dma_autoprobe()
1200 static void terminate_dma(struct pl022 *pl022) in terminate_dma() argument
1202 struct dma_chan *rxchan = pl022->dma_rx_channel; in terminate_dma()
1203 struct dma_chan *txchan = pl022->dma_tx_channel; in terminate_dma()
1207 unmap_free_dma_scatter(pl022); in terminate_dma()
1208 pl022->dma_running = false; in terminate_dma()
1211 static void pl022_dma_remove(struct pl022 *pl022) in pl022_dma_remove() argument
1213 if (pl022->dma_running) in pl022_dma_remove()
1214 terminate_dma(pl022); in pl022_dma_remove()
1215 if (pl022->dma_tx_channel) in pl022_dma_remove()
1216 dma_release_channel(pl022->dma_tx_channel); in pl022_dma_remove()
1217 if (pl022->dma_rx_channel) in pl022_dma_remove()
1218 dma_release_channel(pl022->dma_rx_channel); in pl022_dma_remove()
1219 kfree(pl022->dummypage); in pl022_dma_remove()
1223 static inline int configure_dma(struct pl022 *pl022) in configure_dma() argument
1228 static inline int pl022_dma_autoprobe(struct pl022 *pl022) in pl022_dma_autoprobe() argument
1233 static inline int pl022_dma_probe(struct pl022 *pl022) in pl022_dma_probe() argument
1238 static inline void pl022_dma_remove(struct pl022 *pl022) in pl022_dma_remove() argument
1256 struct pl022 *pl022 = dev_id; in pl022_interrupt_handler() local
1257 struct spi_message *msg = pl022->cur_msg; in pl022_interrupt_handler()
1261 dev_err(&pl022->adev->dev, in pl022_interrupt_handler()
1268 irq_status = readw(SSP_MIS(pl022->virtbase)); in pl022_interrupt_handler()
1283 dev_err(&pl022->adev->dev, "FIFO overrun\n"); in pl022_interrupt_handler()
1284 if (readw(SSP_SR(pl022->virtbase)) & SSP_SR_MASK_RFF) in pl022_interrupt_handler()
1285 dev_err(&pl022->adev->dev, in pl022_interrupt_handler()
1294 SSP_IMSC(pl022->virtbase)); in pl022_interrupt_handler()
1295 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); in pl022_interrupt_handler()
1296 writew((readw(SSP_CR1(pl022->virtbase)) & in pl022_interrupt_handler()
1297 (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase)); in pl022_interrupt_handler()
1301 tasklet_schedule(&pl022->pump_transfers); in pl022_interrupt_handler()
1305 readwriter(pl022); in pl022_interrupt_handler()
1307 if (pl022->tx == pl022->tx_end) { in pl022_interrupt_handler()
1309 writew((readw(SSP_IMSC(pl022->virtbase)) & in pl022_interrupt_handler()
1311 SSP_IMSC(pl022->virtbase)); in pl022_interrupt_handler()
1319 if (pl022->rx >= pl022->rx_end) { in pl022_interrupt_handler()
1321 SSP_IMSC(pl022->virtbase)); in pl022_interrupt_handler()
1322 writew(CLEAR_ALL_INTERRUPTS, SSP_ICR(pl022->virtbase)); in pl022_interrupt_handler()
1323 if (unlikely(pl022->rx > pl022->rx_end)) { in pl022_interrupt_handler()
1324 dev_warn(&pl022->adev->dev, "read %u surplus " in pl022_interrupt_handler()
1327 (u32) (pl022->rx - pl022->rx_end)); in pl022_interrupt_handler()
1330 msg->actual_length += pl022->cur_transfer->len; in pl022_interrupt_handler()
1331 if (pl022->cur_transfer->cs_change) in pl022_interrupt_handler()
1332 pl022_cs_control(pl022, SSP_CHIP_DESELECT); in pl022_interrupt_handler()
1334 msg->state = next_transfer(pl022); in pl022_interrupt_handler()
1335 tasklet_schedule(&pl022->pump_transfers); in pl022_interrupt_handler()
1346 static int set_up_next_transfer(struct pl022 *pl022, in set_up_next_transfer() argument
1352 residue = pl022->cur_transfer->len % pl022->cur_chip->n_bytes; in set_up_next_transfer()
1354 dev_err(&pl022->adev->dev, in set_up_next_transfer()
1357 pl022->cur_transfer->len, in set_up_next_transfer()
1358 pl022->cur_chip->n_bytes); in set_up_next_transfer()
1359 dev_err(&pl022->adev->dev, "skipping this message\n"); in set_up_next_transfer()
1362 pl022->tx = (void *)transfer->tx_buf; in set_up_next_transfer()
1363 pl022->tx_end = pl022->tx + pl022->cur_transfer->len; in set_up_next_transfer()
1364 pl022->rx = (void *)transfer->rx_buf; in set_up_next_transfer()
1365 pl022->rx_end = pl022->rx + pl022->cur_transfer->len; in set_up_next_transfer()
1366 pl022->write = in set_up_next_transfer()
1367 pl022->tx ? pl022->cur_chip->write : WRITING_NULL; in set_up_next_transfer()
1368 pl022->read = pl022->rx ? pl022->cur_chip->read : READING_NULL; in set_up_next_transfer()
1380 struct pl022 *pl022 = (struct pl022 *) data; in pump_transfers() local
1386 message = pl022->cur_msg; in pump_transfers()
1387 transfer = pl022->cur_transfer; in pump_transfers()
1392 giveback(pl022); in pump_transfers()
1399 giveback(pl022); in pump_transfers()
1417 pl022_cs_control(pl022, SSP_CHIP_SELECT); in pump_transfers()
1423 if (set_up_next_transfer(pl022, transfer)) { in pump_transfers()
1426 giveback(pl022); in pump_transfers()
1430 flush(pl022); in pump_transfers()
1432 if (pl022->cur_chip->enable_dma) { in pump_transfers()
1433 if (configure_dma(pl022)) { in pump_transfers()
1434 dev_dbg(&pl022->adev->dev, in pump_transfers()
1443 writew(ENABLE_ALL_INTERRUPTS & ~SSP_IMSC_MASK_RXIM, SSP_IMSC(pl022->virtbase)); in pump_transfers()
1446 static void do_interrupt_dma_transfer(struct pl022 *pl022) in do_interrupt_dma_transfer() argument
1455 if (!pl022->next_msg_cs_active) in do_interrupt_dma_transfer()
1456 pl022_cs_control(pl022, SSP_CHIP_SELECT); in do_interrupt_dma_transfer()
1458 if (set_up_next_transfer(pl022, pl022->cur_transfer)) { in do_interrupt_dma_transfer()
1460 pl022->cur_msg->state = STATE_ERROR; in do_interrupt_dma_transfer()
1461 pl022->cur_msg->status = -EIO; in do_interrupt_dma_transfer()
1462 giveback(pl022); in do_interrupt_dma_transfer()
1466 if (pl022->cur_chip->enable_dma) { in do_interrupt_dma_transfer()
1468 if (configure_dma(pl022)) { in do_interrupt_dma_transfer()
1469 dev_dbg(&pl022->adev->dev, in do_interrupt_dma_transfer()
1478 writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE), in do_interrupt_dma_transfer()
1479 SSP_CR1(pl022->virtbase)); in do_interrupt_dma_transfer()
1480 writew(irqflags, SSP_IMSC(pl022->virtbase)); in do_interrupt_dma_transfer()
1483 static void do_polling_transfer(struct pl022 *pl022) in do_polling_transfer() argument
1491 chip = pl022->cur_chip; in do_polling_transfer()
1492 message = pl022->cur_msg; in do_polling_transfer()
1498 transfer = pl022->cur_transfer; in do_polling_transfer()
1508 pl022_cs_control(pl022, SSP_CHIP_SELECT); in do_polling_transfer()
1512 if (!pl022->next_msg_cs_active) in do_polling_transfer()
1513 pl022_cs_control(pl022, SSP_CHIP_SELECT); in do_polling_transfer()
1517 if (set_up_next_transfer(pl022, transfer)) { in do_polling_transfer()
1523 flush(pl022); in do_polling_transfer()
1524 writew((readw(SSP_CR1(pl022->virtbase)) | SSP_CR1_MASK_SSE), in do_polling_transfer()
1525 SSP_CR1(pl022->virtbase)); in do_polling_transfer()
1527 dev_dbg(&pl022->adev->dev, "polling transfer ongoing ...\n"); in do_polling_transfer()
1530 while (pl022->tx < pl022->tx_end || pl022->rx < pl022->rx_end) { in do_polling_transfer()
1532 readwriter(pl022); in do_polling_transfer()
1534 dev_warn(&pl022->adev->dev, in do_polling_transfer()
1543 message->actual_length += pl022->cur_transfer->len; in do_polling_transfer()
1544 if (pl022->cur_transfer->cs_change) in do_polling_transfer()
1545 pl022_cs_control(pl022, SSP_CHIP_DESELECT); in do_polling_transfer()
1547 message->state = next_transfer(pl022); in do_polling_transfer()
1556 giveback(pl022); in do_polling_transfer()
1563 struct pl022 *pl022 = spi_master_get_devdata(master); in pl022_transfer_one_message() local
1566 pl022->cur_msg = msg; in pl022_transfer_one_message()
1569 pl022->cur_transfer = list_entry(msg->transfers.next, in pl022_transfer_one_message()
1573 pl022->cur_chip = spi_get_ctldata(msg->spi); in pl022_transfer_one_message()
1574 pl022->cur_cs = pl022->chipselects[msg->spi->chip_select]; in pl022_transfer_one_message()
1576 restore_state(pl022); in pl022_transfer_one_message()
1577 flush(pl022); in pl022_transfer_one_message()
1579 if (pl022->cur_chip->xfer_type == POLLING_TRANSFER) in pl022_transfer_one_message()
1580 do_polling_transfer(pl022); in pl022_transfer_one_message()
1582 do_interrupt_dma_transfer(pl022); in pl022_transfer_one_message()
1589 struct pl022 *pl022 = spi_master_get_devdata(master); in pl022_unprepare_transfer_hardware() local
1592 writew((readw(SSP_CR1(pl022->virtbase)) & in pl022_unprepare_transfer_hardware()
1593 (~SSP_CR1_MASK_SSE)), SSP_CR1(pl022->virtbase)); in pl022_unprepare_transfer_hardware()
1598 static int verify_controller_parameters(struct pl022 *pl022, in verify_controller_parameters() argument
1603 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1608 (!pl022->vendor->unidir)) { in verify_controller_parameters()
1609 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1616 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1623 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1634 if (pl022->vendor->fifodepth < 16) { in verify_controller_parameters()
1635 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1641 if (pl022->vendor->fifodepth < 32) { in verify_controller_parameters()
1642 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1648 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1659 if (pl022->vendor->fifodepth < 16) { in verify_controller_parameters()
1660 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1666 if (pl022->vendor->fifodepth < 32) { in verify_controller_parameters()
1667 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1673 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1680 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1686 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1691 if (pl022->vendor->extended_cr) { in verify_controller_parameters()
1696 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1702 dev_err(&pl022->adev->dev, in verify_controller_parameters()
1717 static int calculate_effective_freq(struct pl022 *pl022, int freq, struct in calculate_effective_freq() argument
1725 rate = clk_get_rate(pl022->clk); in calculate_effective_freq()
1732 dev_warn(&pl022->adev->dev, in calculate_effective_freq()
1737 dev_err(&pl022->adev->dev, in calculate_effective_freq()
1784 dev_dbg(&pl022->adev->dev, in calculate_effective_freq()
1787 dev_dbg(&pl022->adev->dev, "SSP cpsdvsr = %d, scr = %d\n", in calculate_effective_freq()
1829 struct pl022 *pl022 = spi_master_get_devdata(spi->master); in pl022_setup() local
1888 status = calculate_effective_freq(pl022, in pl022_setup()
1907 status = verify_controller_parameters(pl022, chip_info); in pl022_setup()
1913 pl022->rx_lev_trig = chip_info->rx_lev_trig; in pl022_setup()
1914 pl022->tx_lev_trig = chip_info->tx_lev_trig; in pl022_setup()
1920 if (!gpio_is_valid(pl022->chipselects[spi->chip_select])) in pl022_setup()
1927 if ((bits <= 3) || (bits > pl022->vendor->max_bpw)) { in pl022_setup()
1931 pl022->vendor->max_bpw); in pl022_setup()
1956 && ((pl022->master_info)->enable_dma)) { in pl022_setup()
1975 if (pl022->vendor->extended_cr) { in pl022_setup()
1978 if (pl022->vendor->pl023) { in pl022_setup()
2031 if (pl022->vendor->loopback) { in pl022_setup()
2100 struct pl022 *pl022 = NULL; /*Data for this driver */ in pl022_probe() local
2122 master = spi_alloc_master(dev, sizeof(struct pl022)); in pl022_probe()
2128 pl022 = spi_master_get_devdata(master); in pl022_probe()
2129 pl022->master = master; in pl022_probe()
2130 pl022->master_info = platform_info; in pl022_probe()
2131 pl022->adev = adev; in pl022_probe()
2132 pl022->vendor = id->data; in pl022_probe()
2133 pl022->chipselects = devm_kzalloc(dev, num_cs * sizeof(int), in pl022_probe()
2135 if (!pl022->chipselects) { in pl022_probe()
2156 pl022->chipselects[i] = platform_info->chipselects[i]; in pl022_probe()
2157 } else if (pl022->vendor->internal_cs_ctrl) { in pl022_probe()
2159 pl022->chipselects[i] = i; in pl022_probe()
2169 pl022->chipselects[i] = cs_gpio; in pl022_probe()
2189 if (pl022->vendor->extended_cr) in pl022_probe()
2198 pl022->phybase = adev->res.start; in pl022_probe()
2199 pl022->virtbase = devm_ioremap(dev, adev->res.start, in pl022_probe()
2201 if (pl022->virtbase == NULL) { in pl022_probe()
2206 &adev->res.start, pl022->virtbase); in pl022_probe()
2208 pl022->clk = devm_clk_get(&adev->dev, NULL); in pl022_probe()
2209 if (IS_ERR(pl022->clk)) { in pl022_probe()
2210 status = PTR_ERR(pl022->clk); in pl022_probe()
2215 status = clk_prepare_enable(pl022->clk); in pl022_probe()
2222 tasklet_init(&pl022->pump_transfers, pump_transfers, in pl022_probe()
2223 (unsigned long)pl022); in pl022_probe()
2226 writew((readw(SSP_CR1(pl022->virtbase)) & (~SSP_CR1_MASK_SSE)), in pl022_probe()
2227 SSP_CR1(pl022->virtbase)); in pl022_probe()
2228 load_ssp_default_config(pl022); in pl022_probe()
2231 0, "pl022", pl022); in pl022_probe()
2238 status = pl022_dma_autoprobe(pl022); in pl022_probe()
2244 status = pl022_dma_probe(pl022); in pl022_probe()
2250 amba_set_drvdata(adev, pl022); in pl022_probe()
2274 pl022_dma_remove(pl022); in pl022_probe()
2276 clk_disable_unprepare(pl022->clk); in pl022_probe()
2291 struct pl022 *pl022 = amba_get_drvdata(adev); in pl022_remove() local
2293 if (!pl022) in pl022_remove()
2302 load_ssp_default_config(pl022); in pl022_remove()
2303 if (pl022->master_info->enable_dma) in pl022_remove()
2304 pl022_dma_remove(pl022); in pl022_remove()
2306 clk_disable_unprepare(pl022->clk); in pl022_remove()
2308 tasklet_disable(&pl022->pump_transfers); in pl022_remove()
2315 struct pl022 *pl022 = dev_get_drvdata(dev); in pl022_suspend() local
2318 ret = spi_master_suspend(pl022->master); in pl022_suspend()
2326 spi_master_resume(pl022->master); in pl022_suspend()
2338 struct pl022 *pl022 = dev_get_drvdata(dev); in pl022_resume() local
2346 ret = spi_master_resume(pl022->master); in pl022_resume()
2359 struct pl022 *pl022 = dev_get_drvdata(dev); in pl022_runtime_suspend() local
2361 clk_disable_unprepare(pl022->clk); in pl022_runtime_suspend()
2369 struct pl022 *pl022 = dev_get_drvdata(dev); in pl022_runtime_resume() local
2372 clk_prepare_enable(pl022->clk); in pl022_runtime_resume()