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