Lines Matching refs:xspi
118 static void xilinx_spi_tx(struct xilinx_spi *xspi) in xilinx_spi_tx() argument
122 if (!xspi->tx_ptr) { in xilinx_spi_tx()
123 xspi->write_fn(0, xspi->regs + XSPI_TXD_OFFSET); in xilinx_spi_tx()
127 switch (xspi->bytes_per_word) { in xilinx_spi_tx()
129 data = *(u8 *)(xspi->tx_ptr); in xilinx_spi_tx()
132 data = *(u16 *)(xspi->tx_ptr); in xilinx_spi_tx()
135 data = *(u32 *)(xspi->tx_ptr); in xilinx_spi_tx()
139 xspi->write_fn(data, xspi->regs + XSPI_TXD_OFFSET); in xilinx_spi_tx()
140 xspi->tx_ptr += xspi->bytes_per_word; in xilinx_spi_tx()
143 static void xilinx_spi_rx(struct xilinx_spi *xspi) in xilinx_spi_rx() argument
145 u32 data = xspi->read_fn(xspi->regs + XSPI_RXD_OFFSET); in xilinx_spi_rx()
147 if (!xspi->rx_ptr) in xilinx_spi_rx()
150 switch (xspi->bytes_per_word) { in xilinx_spi_rx()
152 *(u8 *)(xspi->rx_ptr) = data; in xilinx_spi_rx()
155 *(u16 *)(xspi->rx_ptr) = data; in xilinx_spi_rx()
158 *(u32 *)(xspi->rx_ptr) = data; in xilinx_spi_rx()
162 xspi->rx_ptr += xspi->bytes_per_word; in xilinx_spi_rx()
165 static void xspi_init_hw(struct xilinx_spi *xspi) in xspi_init_hw() argument
167 void __iomem *regs_base = xspi->regs; in xspi_init_hw()
170 xspi->write_fn(XIPIF_V123B_RESET_MASK, in xspi_init_hw()
175 xspi->write_fn(XSPI_INTR_TX_EMPTY, in xspi_init_hw()
178 xspi->write_fn(0, regs_base + XIPIF_V123B_DGIER_OFFSET); in xspi_init_hw()
180 xspi->write_fn(0xffff, regs_base + XSPI_SSR_OFFSET); in xspi_init_hw()
183 xspi->write_fn(XSPI_CR_MANUAL_SSELECT | XSPI_CR_MASTER_MODE | in xspi_init_hw()
190 struct xilinx_spi *xspi = spi_master_get_devdata(spi->master); in xilinx_spi_chipselect() local
196 xspi->write_fn(xspi->cs_inactive, xspi->regs + XSPI_SSR_OFFSET); in xilinx_spi_chipselect()
201 cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET) & ~XSPI_CR_MODE_MASK; in xilinx_spi_chipselect()
210 xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET); in xilinx_spi_chipselect()
217 cs = xspi->cs_inactive; in xilinx_spi_chipselect()
221 xspi->write_fn(cs, xspi->regs + XSPI_SSR_OFFSET); in xilinx_spi_chipselect()
230 struct xilinx_spi *xspi = spi_master_get_devdata(spi->master); in xilinx_spi_setup_transfer() local
233 xspi->cs_inactive &= ~BIT(spi->chip_select); in xilinx_spi_setup_transfer()
235 xspi->cs_inactive |= BIT(spi->chip_select); in xilinx_spi_setup_transfer()
242 struct xilinx_spi *xspi = spi_master_get_devdata(spi->master); in xilinx_spi_txrx_bufs() local
249 xspi->tx_ptr = t->tx_buf; in xilinx_spi_txrx_bufs()
250 xspi->rx_ptr = t->rx_buf; in xilinx_spi_txrx_bufs()
251 remaining_words = t->len / xspi->bytes_per_word; in xilinx_spi_txrx_bufs()
253 if (xspi->irq >= 0 && remaining_words > xspi->buffer_size) { in xilinx_spi_txrx_bufs()
257 cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET); in xilinx_spi_txrx_bufs()
258 xspi->write_fn(cr | XSPI_CR_TRANS_INHIBIT, in xilinx_spi_txrx_bufs()
259 xspi->regs + XSPI_CR_OFFSET); in xilinx_spi_txrx_bufs()
261 isr = xspi->read_fn(xspi->regs + XIPIF_V123B_IISR_OFFSET); in xilinx_spi_txrx_bufs()
263 xspi->write_fn(isr, in xilinx_spi_txrx_bufs()
264 xspi->regs + XIPIF_V123B_IISR_OFFSET); in xilinx_spi_txrx_bufs()
266 xspi->write_fn(XIPIF_V123B_GINTR_ENABLE, in xilinx_spi_txrx_bufs()
267 xspi->regs + XIPIF_V123B_DGIER_OFFSET); in xilinx_spi_txrx_bufs()
268 reinit_completion(&xspi->done); in xilinx_spi_txrx_bufs()
275 n_words = min(remaining_words, xspi->buffer_size); in xilinx_spi_txrx_bufs()
279 xilinx_spi_tx(xspi); in xilinx_spi_txrx_bufs()
286 xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET); in xilinx_spi_txrx_bufs()
287 wait_for_completion(&xspi->done); in xilinx_spi_txrx_bufs()
294 xspi->write_fn(cr | XSPI_CR_TRANS_INHIBIT, in xilinx_spi_txrx_bufs()
295 xspi->regs + XSPI_CR_OFFSET); in xilinx_spi_txrx_bufs()
298 sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET); in xilinx_spi_txrx_bufs()
304 xilinx_spi_rx(xspi); in xilinx_spi_txrx_bufs()
309 sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET); in xilinx_spi_txrx_bufs()
311 xilinx_spi_rx(xspi); in xilinx_spi_txrx_bufs()
320 xspi->write_fn(0, xspi->regs + XIPIF_V123B_DGIER_OFFSET); in xilinx_spi_txrx_bufs()
321 xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET); in xilinx_spi_txrx_bufs()
335 struct xilinx_spi *xspi = dev_id; in xilinx_spi_irq() local
339 ipif_isr = xspi->read_fn(xspi->regs + XIPIF_V123B_IISR_OFFSET); in xilinx_spi_irq()
340 xspi->write_fn(ipif_isr, xspi->regs + XIPIF_V123B_IISR_OFFSET); in xilinx_spi_irq()
343 complete(&xspi->done); in xilinx_spi_irq()
349 static int xilinx_spi_find_buffer_size(struct xilinx_spi *xspi) in xilinx_spi_find_buffer_size() argument
358 xspi->write_fn(XIPIF_V123B_RESET_MASK, in xilinx_spi_find_buffer_size()
359 xspi->regs + XIPIF_V123B_RESETR_OFFSET); in xilinx_spi_find_buffer_size()
363 xspi->write_fn(0, xspi->regs + XSPI_TXD_OFFSET); in xilinx_spi_find_buffer_size()
364 sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET); in xilinx_spi_find_buffer_size()
380 struct xilinx_spi *xspi; in xilinx_spi_probe() local
416 xspi = spi_master_get_devdata(master); in xilinx_spi_probe()
417 xspi->cs_inactive = 0xffffffff; in xilinx_spi_probe()
418 xspi->bitbang.master = master; in xilinx_spi_probe()
419 xspi->bitbang.chipselect = xilinx_spi_chipselect; in xilinx_spi_probe()
420 xspi->bitbang.setup_transfer = xilinx_spi_setup_transfer; in xilinx_spi_probe()
421 xspi->bitbang.txrx_bufs = xilinx_spi_txrx_bufs; in xilinx_spi_probe()
422 init_completion(&xspi->done); in xilinx_spi_probe()
425 xspi->regs = devm_ioremap_resource(&pdev->dev, res); in xilinx_spi_probe()
426 if (IS_ERR(xspi->regs)) { in xilinx_spi_probe()
427 ret = PTR_ERR(xspi->regs); in xilinx_spi_probe()
442 xspi->read_fn = xspi_read32; in xilinx_spi_probe()
443 xspi->write_fn = xspi_write32; in xilinx_spi_probe()
445 xspi->write_fn(XSPI_CR_LOOP, xspi->regs + XSPI_CR_OFFSET); in xilinx_spi_probe()
446 tmp = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET); in xilinx_spi_probe()
449 xspi->read_fn = xspi_read32_be; in xilinx_spi_probe()
450 xspi->write_fn = xspi_write32_be; in xilinx_spi_probe()
454 xspi->bytes_per_word = bits_per_word / 8; in xilinx_spi_probe()
455 xspi->buffer_size = xilinx_spi_find_buffer_size(xspi); in xilinx_spi_probe()
457 xspi->irq = platform_get_irq(pdev, 0); in xilinx_spi_probe()
458 if (xspi->irq >= 0) { in xilinx_spi_probe()
460 ret = devm_request_irq(&pdev->dev, xspi->irq, xilinx_spi_irq, 0, in xilinx_spi_probe()
461 dev_name(&pdev->dev), xspi); in xilinx_spi_probe()
467 xspi_init_hw(xspi); in xilinx_spi_probe()
469 ret = spi_bitbang_start(&xspi->bitbang); in xilinx_spi_probe()
476 (unsigned long long)res->start, xspi->regs, xspi->irq); in xilinx_spi_probe()
495 struct xilinx_spi *xspi = spi_master_get_devdata(master); in xilinx_spi_remove() local
496 void __iomem *regs_base = xspi->regs; in xilinx_spi_remove()
498 spi_bitbang_stop(&xspi->bitbang); in xilinx_spi_remove()
501 xspi->write_fn(0, regs_base + XIPIF_V123B_IIER_OFFSET); in xilinx_spi_remove()
503 xspi->write_fn(0, regs_base + XIPIF_V123B_DGIER_OFFSET); in xilinx_spi_remove()
505 spi_master_put(xspi->bitbang.master); in xilinx_spi_remove()