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);