Lines Matching full:xspi

131 static inline u32 cdns_spi_read(struct cdns_spi *xspi, u32 offset)  in cdns_spi_read()  argument
133 return readl_relaxed(xspi->regs + offset); in cdns_spi_read()
136 static inline void cdns_spi_write(struct cdns_spi *xspi, u32 offset, u32 val) in cdns_spi_write() argument
138 writel_relaxed(val, xspi->regs + offset); in cdns_spi_write()
143 * @xspi: Pointer to the cdns_spi structure
153 static void cdns_spi_init_hw(struct cdns_spi *xspi, bool is_target) in cdns_spi_init_hw() argument
160 if (xspi->is_decoded_cs) in cdns_spi_init_hw()
163 cdns_spi_write(xspi, CDNS_SPI_ER, CDNS_SPI_ER_DISABLE); in cdns_spi_init_hw()
164 cdns_spi_write(xspi, CDNS_SPI_IDR, CDNS_SPI_IXR_ALL); in cdns_spi_init_hw()
167 while (cdns_spi_read(xspi, CDNS_SPI_ISR) & CDNS_SPI_IXR_RXNEMTY) in cdns_spi_init_hw()
168 cdns_spi_read(xspi, CDNS_SPI_RXD); in cdns_spi_init_hw()
170 cdns_spi_write(xspi, CDNS_SPI_ISR, CDNS_SPI_IXR_ALL); in cdns_spi_init_hw()
171 cdns_spi_write(xspi, CDNS_SPI_CR, ctrl_reg); in cdns_spi_init_hw()
172 cdns_spi_write(xspi, CDNS_SPI_ER, CDNS_SPI_ER_ENABLE); in cdns_spi_init_hw()
182 struct cdns_spi *xspi = spi_controller_get_devdata(spi->controller); in cdns_spi_chipselect() local
185 ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR); in cdns_spi_chipselect()
193 if (!(xspi->is_decoded_cs)) in cdns_spi_chipselect()
202 cdns_spi_write(xspi, CDNS_SPI_CR, ctrl_reg); in cdns_spi_chipselect()
213 struct cdns_spi *xspi = spi_controller_get_devdata(spi->controller); in cdns_spi_config_clock_mode() local
216 new_ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR); in cdns_spi_config_clock_mode()
233 cdns_spi_write(xspi, CDNS_SPI_ER, CDNS_SPI_ER_DISABLE); in cdns_spi_config_clock_mode()
234 cdns_spi_write(xspi, CDNS_SPI_CR, new_ctrl_reg); in cdns_spi_config_clock_mode()
235 cdns_spi_write(xspi, CDNS_SPI_ER, CDNS_SPI_ER_ENABLE); in cdns_spi_config_clock_mode()
256 struct cdns_spi *xspi = spi_controller_get_devdata(spi->controller); in cdns_spi_config_clock_freq() local
260 frequency = xspi->clk_rate; in cdns_spi_config_clock_freq()
262 ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR); in cdns_spi_config_clock_freq()
265 if (xspi->speed_hz != transfer->speed_hz) { in cdns_spi_config_clock_freq()
275 xspi->speed_hz = frequency / (2 << baud_rate_val); in cdns_spi_config_clock_freq()
277 cdns_spi_write(xspi, CDNS_SPI_CR, ctrl_reg); in cdns_spi_config_clock_freq()
294 struct cdns_spi *xspi = spi_controller_get_devdata(spi->controller); in cdns_spi_setup_transfer() local
300 xspi->speed_hz); in cdns_spi_setup_transfer()
307 * @xspi: Pointer to the cdns_spi structure
311 static void cdns_spi_process_fifo(struct cdns_spi *xspi, int ntx, int nrx) in cdns_spi_process_fifo() argument
313 ntx = clamp(ntx, 0, xspi->tx_bytes); in cdns_spi_process_fifo()
314 nrx = clamp(nrx, 0, xspi->rx_bytes); in cdns_spi_process_fifo()
316 xspi->tx_bytes -= ntx; in cdns_spi_process_fifo()
317 xspi->rx_bytes -= nrx; in cdns_spi_process_fifo()
321 u8 data = cdns_spi_read(xspi, CDNS_SPI_RXD); in cdns_spi_process_fifo()
323 if (xspi->rxbuf) in cdns_spi_process_fifo()
324 *xspi->rxbuf++ = data; in cdns_spi_process_fifo()
330 if (xspi->txbuf) in cdns_spi_process_fifo()
331 cdns_spi_write(xspi, CDNS_SPI_TXD, *xspi->txbuf++); in cdns_spi_process_fifo()
333 cdns_spi_write(xspi, CDNS_SPI_TXD, 0); in cdns_spi_process_fifo()
344 * @dev_id: Pointer to the xspi structure
358 struct cdns_spi *xspi = spi_controller_get_devdata(ctlr); in cdns_spi_irq() local
363 intr_status = cdns_spi_read(xspi, CDNS_SPI_ISR); in cdns_spi_irq()
364 cdns_spi_write(xspi, CDNS_SPI_ISR, intr_status); in cdns_spi_irq()
371 cdns_spi_write(xspi, CDNS_SPI_IDR, CDNS_SPI_IXR_DEFAULT); in cdns_spi_irq()
375 int threshold = cdns_spi_read(xspi, CDNS_SPI_THLD); in cdns_spi_irq()
376 int trans_cnt = xspi->rx_bytes - xspi->tx_bytes; in cdns_spi_irq()
384 if (xspi->tx_bytes < xspi->tx_fifo_depth >> 1) in cdns_spi_irq()
385 cdns_spi_write(xspi, CDNS_SPI_THLD, 1); in cdns_spi_irq()
387 if (xspi->tx_bytes) { in cdns_spi_irq()
388 cdns_spi_process_fifo(xspi, trans_cnt, trans_cnt); in cdns_spi_irq()
395 cdns_spi_process_fifo(xspi, 0, trans_cnt); in cdns_spi_irq()
396 cdns_spi_write(xspi, CDNS_SPI_IDR, in cdns_spi_irq()
431 struct cdns_spi *xspi = spi_controller_get_devdata(ctlr); in cdns_transfer_one() local
433 xspi->txbuf = transfer->tx_buf; in cdns_transfer_one()
434 xspi->rxbuf = transfer->rx_buf; in cdns_transfer_one()
435 xspi->tx_bytes = transfer->len; in cdns_transfer_one()
436 xspi->rx_bytes = transfer->len; in cdns_transfer_one()
444 if (xspi->tx_bytes > xspi->tx_fifo_depth) in cdns_transfer_one()
445 cdns_spi_write(xspi, CDNS_SPI_THLD, xspi->tx_fifo_depth >> 1); in cdns_transfer_one()
448 /* When xspi in busy condition, bytes may send failed, in cdns_transfer_one()
451 if (cdns_spi_read(xspi, CDNS_SPI_ISR) & CDNS_SPI_IXR_TXFULL) in cdns_transfer_one()
454 cdns_spi_process_fifo(xspi, xspi->tx_fifo_depth, 0); in cdns_transfer_one()
456 cdns_spi_write(xspi, CDNS_SPI_IER, CDNS_SPI_IXR_DEFAULT); in cdns_transfer_one()
471 struct cdns_spi *xspi = spi_controller_get_devdata(ctlr); in cdns_prepare_transfer_hardware() local
473 cdns_spi_write(xspi, CDNS_SPI_ER, CDNS_SPI_ER_ENABLE); in cdns_prepare_transfer_hardware()
490 struct cdns_spi *xspi = spi_controller_get_devdata(ctlr); in cdns_unprepare_transfer_hardware() local
492 unsigned int cnt = xspi->tx_fifo_depth; in cdns_unprepare_transfer_hardware()
496 cdns_spi_read(xspi, CDNS_SPI_RXD); in cdns_unprepare_transfer_hardware()
500 ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR); in cdns_unprepare_transfer_hardware()
503 cdns_spi_write(xspi, CDNS_SPI_ER, CDNS_SPI_ER_DISABLE); in cdns_unprepare_transfer_hardware()
506 cdns_spi_write(xspi, CDNS_SPI_THLD, 0x1); in cdns_unprepare_transfer_hardware()
512 * @xspi: Pointer to the cdns_spi structure
518 static void cdns_spi_detect_fifo_depth(struct cdns_spi *xspi) in cdns_spi_detect_fifo_depth() argument
521 cdns_spi_write(xspi, CDNS_SPI_THLD, 0xffff); in cdns_spi_detect_fifo_depth()
522 xspi->tx_fifo_depth = cdns_spi_read(xspi, CDNS_SPI_THLD) + 1; in cdns_spi_detect_fifo_depth()
525 cdns_spi_write(xspi, CDNS_SPI_THLD, 0x1); in cdns_spi_detect_fifo_depth()
538 struct cdns_spi *xspi = spi_controller_get_devdata(ctlr); in cdns_target_abort() local
541 intr_status = cdns_spi_read(xspi, CDNS_SPI_ISR); in cdns_target_abort()
542 cdns_spi_write(xspi, CDNS_SPI_ISR, intr_status); in cdns_target_abort()
543 cdns_spi_write(xspi, CDNS_SPI_IDR, (CDNS_SPI_IXR_MODF | CDNS_SPI_IXR_RXNEMTY)); in cdns_target_abort()
561 struct cdns_spi *xspi; in cdns_spi_probe() local
567 ctlr = spi_alloc_target(&pdev->dev, sizeof(*xspi)); in cdns_spi_probe()
569 ctlr = spi_alloc_host(&pdev->dev, sizeof(*xspi)); in cdns_spi_probe()
574 xspi = spi_controller_get_devdata(ctlr); in cdns_spi_probe()
578 xspi->regs = devm_platform_ioremap_resource(pdev, 0); in cdns_spi_probe()
579 if (IS_ERR(xspi->regs)) { in cdns_spi_probe()
580 ret = PTR_ERR(xspi->regs); in cdns_spi_probe()
584 xspi->pclk = devm_clk_get_enabled(&pdev->dev, "pclk"); in cdns_spi_probe()
585 if (IS_ERR(xspi->pclk)) { in cdns_spi_probe()
587 ret = PTR_ERR(xspi->pclk); in cdns_spi_probe()
592 xspi->ref_clk = devm_clk_get_enabled(&pdev->dev, "ref_clk"); in cdns_spi_probe()
593 if (IS_ERR(xspi->ref_clk)) { in cdns_spi_probe()
595 ret = PTR_ERR(xspi->ref_clk); in cdns_spi_probe()
612 &xspi->is_decoded_cs); in cdns_spi_probe()
614 xspi->is_decoded_cs = 0; in cdns_spi_probe()
617 cdns_spi_detect_fifo_depth(xspi); in cdns_spi_probe()
620 cdns_spi_init_hw(xspi, spi_controller_is_target(ctlr)); in cdns_spi_probe()
648 xspi->clk_rate = clk_get_rate(xspi->ref_clk); in cdns_spi_probe()
650 ctlr->max_speed_hz = xspi->clk_rate / 4; in cdns_spi_probe()
651 xspi->speed_hz = ctlr->max_speed_hz; in cdns_spi_probe()
687 struct cdns_spi *xspi = spi_controller_get_devdata(ctlr); in cdns_spi_remove() local
689 cdns_spi_write(xspi, CDNS_SPI_ER, CDNS_SPI_ER_DISABLE); in cdns_spi_remove()
724 struct cdns_spi *xspi = spi_controller_get_devdata(ctlr); in cdns_spi_resume() local
726 cdns_spi_init_hw(xspi, spi_controller_is_target(ctlr)); in cdns_spi_resume()
741 struct cdns_spi *xspi = spi_controller_get_devdata(ctlr); in cdns_spi_runtime_resume() local
744 ret = clk_prepare_enable(xspi->pclk); in cdns_spi_runtime_resume()
750 ret = clk_prepare_enable(xspi->ref_clk); in cdns_spi_runtime_resume()
753 clk_disable_unprepare(xspi->pclk); in cdns_spi_runtime_resume()
770 struct cdns_spi *xspi = spi_controller_get_devdata(ctlr); in cdns_spi_runtime_suspend() local
772 clk_disable_unprepare(xspi->ref_clk); in cdns_spi_runtime_suspend()
773 clk_disable_unprepare(xspi->pclk); in cdns_spi_runtime_suspend()