Lines Matching refs:rs

204 static inline void spi_enable_chip(struct rockchip_spi *rs, int enable)  in spi_enable_chip()  argument
206 writel_relaxed((enable ? 1 : 0), rs->regs + ROCKCHIP_SPI_SSIENR); in spi_enable_chip()
209 static inline void spi_set_clk(struct rockchip_spi *rs, u16 div) in spi_set_clk() argument
211 writel_relaxed(div, rs->regs + ROCKCHIP_SPI_BAUDR); in spi_set_clk()
214 static inline void flush_fifo(struct rockchip_spi *rs) in flush_fifo() argument
216 while (readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFLR)) in flush_fifo()
217 readl_relaxed(rs->regs + ROCKCHIP_SPI_RXDR); in flush_fifo()
220 static inline void wait_for_idle(struct rockchip_spi *rs) in wait_for_idle() argument
225 if (!(readl_relaxed(rs->regs + ROCKCHIP_SPI_SR) & SR_BUSY)) in wait_for_idle()
229 dev_warn(rs->dev, "spi controller is in busy state!\n"); in wait_for_idle()
232 static u32 get_fifo_len(struct rockchip_spi *rs) in get_fifo_len() argument
237 writel_relaxed(fifo, rs->regs + ROCKCHIP_SPI_TXFTLR); in get_fifo_len()
238 if (fifo != readl_relaxed(rs->regs + ROCKCHIP_SPI_TXFTLR)) in get_fifo_len()
242 writel_relaxed(0, rs->regs + ROCKCHIP_SPI_TXFTLR); in get_fifo_len()
247 static inline u32 tx_max(struct rockchip_spi *rs) in tx_max() argument
251 tx_left = (rs->tx_end - rs->tx) / rs->n_bytes; in tx_max()
252 tx_room = rs->fifo_len - readl_relaxed(rs->regs + ROCKCHIP_SPI_TXFLR); in tx_max()
257 static inline u32 rx_max(struct rockchip_spi *rs) in rx_max() argument
259 u32 rx_left = (rs->rx_end - rs->rx) / rs->n_bytes; in rx_max()
260 u32 rx_room = (u32)readl_relaxed(rs->regs + ROCKCHIP_SPI_RXFLR); in rx_max()
268 struct rockchip_spi *rs = spi_master_get_devdata(spi->master); in rockchip_spi_set_cs() local
270 ser = readl_relaxed(rs->regs + ROCKCHIP_SPI_SER) & SER_MASK; in rockchip_spi_set_cs()
292 writel_relaxed(ser, rs->regs + ROCKCHIP_SPI_SER); in rockchip_spi_set_cs()
298 struct rockchip_spi *rs = spi_master_get_devdata(master); in rockchip_spi_prepare_message() local
301 rs->mode = spi->mode; in rockchip_spi_prepare_message()
310 struct rockchip_spi *rs = spi_master_get_devdata(master); in rockchip_spi_handle_err() local
312 spin_lock_irqsave(&rs->lock, flags); in rockchip_spi_handle_err()
320 if (rs->use_dma) { in rockchip_spi_handle_err()
321 if (rs->state & RXBUSY) { in rockchip_spi_handle_err()
322 dmaengine_terminate_all(rs->dma_rx.ch); in rockchip_spi_handle_err()
323 flush_fifo(rs); in rockchip_spi_handle_err()
326 if (rs->state & TXBUSY) in rockchip_spi_handle_err()
327 dmaengine_terminate_all(rs->dma_tx.ch); in rockchip_spi_handle_err()
330 spin_unlock_irqrestore(&rs->lock, flags); in rockchip_spi_handle_err()
336 struct rockchip_spi *rs = spi_master_get_devdata(master); in rockchip_spi_unprepare_message() local
338 spi_enable_chip(rs, 0); in rockchip_spi_unprepare_message()
343 static void rockchip_spi_pio_writer(struct rockchip_spi *rs) in rockchip_spi_pio_writer() argument
345 u32 max = tx_max(rs); in rockchip_spi_pio_writer()
349 if (rs->n_bytes == 1) in rockchip_spi_pio_writer()
350 txw = *(u8 *)(rs->tx); in rockchip_spi_pio_writer()
352 txw = *(u16 *)(rs->tx); in rockchip_spi_pio_writer()
354 writel_relaxed(txw, rs->regs + ROCKCHIP_SPI_TXDR); in rockchip_spi_pio_writer()
355 rs->tx += rs->n_bytes; in rockchip_spi_pio_writer()
359 static void rockchip_spi_pio_reader(struct rockchip_spi *rs) in rockchip_spi_pio_reader() argument
361 u32 max = rx_max(rs); in rockchip_spi_pio_reader()
365 rxw = readl_relaxed(rs->regs + ROCKCHIP_SPI_RXDR); in rockchip_spi_pio_reader()
366 if (rs->n_bytes == 1) in rockchip_spi_pio_reader()
367 *(u8 *)(rs->rx) = (u8)rxw; in rockchip_spi_pio_reader()
369 *(u16 *)(rs->rx) = (u16)rxw; in rockchip_spi_pio_reader()
370 rs->rx += rs->n_bytes; in rockchip_spi_pio_reader()
374 static int rockchip_spi_pio_transfer(struct rockchip_spi *rs) in rockchip_spi_pio_transfer() argument
379 if (rs->tx) { in rockchip_spi_pio_transfer()
380 remain = rs->tx_end - rs->tx; in rockchip_spi_pio_transfer()
381 rockchip_spi_pio_writer(rs); in rockchip_spi_pio_transfer()
384 if (rs->rx) { in rockchip_spi_pio_transfer()
385 remain = rs->rx_end - rs->rx; in rockchip_spi_pio_transfer()
386 rockchip_spi_pio_reader(rs); in rockchip_spi_pio_transfer()
393 if (rs->tx) in rockchip_spi_pio_transfer()
394 wait_for_idle(rs); in rockchip_spi_pio_transfer()
396 spi_enable_chip(rs, 0); in rockchip_spi_pio_transfer()
404 struct rockchip_spi *rs = data; in rockchip_spi_dma_rxcb() local
406 spin_lock_irqsave(&rs->lock, flags); in rockchip_spi_dma_rxcb()
408 rs->state &= ~RXBUSY; in rockchip_spi_dma_rxcb()
409 if (!(rs->state & TXBUSY)) { in rockchip_spi_dma_rxcb()
410 spi_enable_chip(rs, 0); in rockchip_spi_dma_rxcb()
411 spi_finalize_current_transfer(rs->master); in rockchip_spi_dma_rxcb()
414 spin_unlock_irqrestore(&rs->lock, flags); in rockchip_spi_dma_rxcb()
420 struct rockchip_spi *rs = data; in rockchip_spi_dma_txcb() local
423 wait_for_idle(rs); in rockchip_spi_dma_txcb()
425 spin_lock_irqsave(&rs->lock, flags); in rockchip_spi_dma_txcb()
427 rs->state &= ~TXBUSY; in rockchip_spi_dma_txcb()
428 if (!(rs->state & RXBUSY)) { in rockchip_spi_dma_txcb()
429 spi_enable_chip(rs, 0); in rockchip_spi_dma_txcb()
430 spi_finalize_current_transfer(rs->master); in rockchip_spi_dma_txcb()
433 spin_unlock_irqrestore(&rs->lock, flags); in rockchip_spi_dma_txcb()
436 static void rockchip_spi_prepare_dma(struct rockchip_spi *rs) in rockchip_spi_prepare_dma() argument
442 spin_lock_irqsave(&rs->lock, flags); in rockchip_spi_prepare_dma()
443 rs->state &= ~RXBUSY; in rockchip_spi_prepare_dma()
444 rs->state &= ~TXBUSY; in rockchip_spi_prepare_dma()
445 spin_unlock_irqrestore(&rs->lock, flags); in rockchip_spi_prepare_dma()
448 if (rs->rx) { in rockchip_spi_prepare_dma()
449 rxconf.direction = rs->dma_rx.direction; in rockchip_spi_prepare_dma()
450 rxconf.src_addr = rs->dma_rx.addr; in rockchip_spi_prepare_dma()
451 rxconf.src_addr_width = rs->n_bytes; in rockchip_spi_prepare_dma()
452 rxconf.src_maxburst = rs->n_bytes; in rockchip_spi_prepare_dma()
453 dmaengine_slave_config(rs->dma_rx.ch, &rxconf); in rockchip_spi_prepare_dma()
456 rs->dma_rx.ch, in rockchip_spi_prepare_dma()
457 rs->rx_sg.sgl, rs->rx_sg.nents, in rockchip_spi_prepare_dma()
458 rs->dma_rx.direction, DMA_PREP_INTERRUPT); in rockchip_spi_prepare_dma()
461 rxdesc->callback_param = rs; in rockchip_spi_prepare_dma()
465 if (rs->tx) { in rockchip_spi_prepare_dma()
466 txconf.direction = rs->dma_tx.direction; in rockchip_spi_prepare_dma()
467 txconf.dst_addr = rs->dma_tx.addr; in rockchip_spi_prepare_dma()
468 txconf.dst_addr_width = rs->n_bytes; in rockchip_spi_prepare_dma()
469 txconf.dst_maxburst = rs->n_bytes; in rockchip_spi_prepare_dma()
470 dmaengine_slave_config(rs->dma_tx.ch, &txconf); in rockchip_spi_prepare_dma()
473 rs->dma_tx.ch, in rockchip_spi_prepare_dma()
474 rs->tx_sg.sgl, rs->tx_sg.nents, in rockchip_spi_prepare_dma()
475 rs->dma_tx.direction, DMA_PREP_INTERRUPT); in rockchip_spi_prepare_dma()
478 txdesc->callback_param = rs; in rockchip_spi_prepare_dma()
483 spin_lock_irqsave(&rs->lock, flags); in rockchip_spi_prepare_dma()
484 rs->state |= RXBUSY; in rockchip_spi_prepare_dma()
485 spin_unlock_irqrestore(&rs->lock, flags); in rockchip_spi_prepare_dma()
487 dma_async_issue_pending(rs->dma_rx.ch); in rockchip_spi_prepare_dma()
491 spin_lock_irqsave(&rs->lock, flags); in rockchip_spi_prepare_dma()
492 rs->state |= TXBUSY; in rockchip_spi_prepare_dma()
493 spin_unlock_irqrestore(&rs->lock, flags); in rockchip_spi_prepare_dma()
495 dma_async_issue_pending(rs->dma_tx.ch); in rockchip_spi_prepare_dma()
499 static void rockchip_spi_config(struct rockchip_spi *rs) in rockchip_spi_config() argument
508 cr0 |= (rs->n_bytes << CR0_DFS_OFFSET); in rockchip_spi_config()
509 cr0 |= ((rs->mode & 0x3) << CR0_SCPH_OFFSET); in rockchip_spi_config()
510 cr0 |= (rs->tmode << CR0_XFM_OFFSET); in rockchip_spi_config()
511 cr0 |= (rs->type << CR0_FRF_OFFSET); in rockchip_spi_config()
513 if (rs->use_dma) { in rockchip_spi_config()
514 if (rs->tx) in rockchip_spi_config()
516 if (rs->rx) in rockchip_spi_config()
520 if (WARN_ON(rs->speed > MAX_SCLK_OUT)) in rockchip_spi_config()
521 rs->speed = MAX_SCLK_OUT; in rockchip_spi_config()
524 if (rs->max_freq < 2 * rs->speed) { in rockchip_spi_config()
525 clk_set_rate(rs->spiclk, 2 * rs->speed); in rockchip_spi_config()
526 rs->max_freq = clk_get_rate(rs->spiclk); in rockchip_spi_config()
530 div = DIV_ROUND_UP(rs->max_freq, rs->speed); in rockchip_spi_config()
534 rsd = DIV_ROUND_CLOSEST(rs->rsd_nsecs * (rs->max_freq >> 8), in rockchip_spi_config()
536 if (!rsd && rs->rsd_nsecs) { in rockchip_spi_config()
538 rs->max_freq, rs->rsd_nsecs); in rockchip_spi_config()
542 rs->max_freq, rs->rsd_nsecs, in rockchip_spi_config()
543 rsd * 1000000000U / rs->max_freq); in rockchip_spi_config()
547 writel_relaxed(cr0, rs->regs + ROCKCHIP_SPI_CTRLR0); in rockchip_spi_config()
549 writel_relaxed(rs->len - 1, rs->regs + ROCKCHIP_SPI_CTRLR1); in rockchip_spi_config()
550 writel_relaxed(rs->fifo_len / 2 - 1, rs->regs + ROCKCHIP_SPI_TXFTLR); in rockchip_spi_config()
551 writel_relaxed(rs->fifo_len / 2 - 1, rs->regs + ROCKCHIP_SPI_RXFTLR); in rockchip_spi_config()
553 writel_relaxed(0, rs->regs + ROCKCHIP_SPI_DMATDLR); in rockchip_spi_config()
554 writel_relaxed(0, rs->regs + ROCKCHIP_SPI_DMARDLR); in rockchip_spi_config()
555 writel_relaxed(dmacr, rs->regs + ROCKCHIP_SPI_DMACR); in rockchip_spi_config()
557 spi_set_clk(rs, div); in rockchip_spi_config()
559 dev_dbg(rs->dev, "cr0 0x%x, div %d\n", cr0, div); in rockchip_spi_config()
568 struct rockchip_spi *rs = spi_master_get_devdata(master); in rockchip_spi_transfer_one() local
570 WARN_ON(readl_relaxed(rs->regs + ROCKCHIP_SPI_SSIENR) && in rockchip_spi_transfer_one()
571 (readl_relaxed(rs->regs + ROCKCHIP_SPI_SR) & SR_BUSY)); in rockchip_spi_transfer_one()
574 dev_err(rs->dev, "No buffer for transfer\n"); in rockchip_spi_transfer_one()
578 rs->speed = xfer->speed_hz; in rockchip_spi_transfer_one()
579 rs->bpw = xfer->bits_per_word; in rockchip_spi_transfer_one()
580 rs->n_bytes = rs->bpw >> 3; in rockchip_spi_transfer_one()
582 rs->tx = xfer->tx_buf; in rockchip_spi_transfer_one()
583 rs->tx_end = rs->tx + xfer->len; in rockchip_spi_transfer_one()
584 rs->rx = xfer->rx_buf; in rockchip_spi_transfer_one()
585 rs->rx_end = rs->rx + xfer->len; in rockchip_spi_transfer_one()
586 rs->len = xfer->len; in rockchip_spi_transfer_one()
588 rs->tx_sg = xfer->tx_sg; in rockchip_spi_transfer_one()
589 rs->rx_sg = xfer->rx_sg; in rockchip_spi_transfer_one()
591 if (rs->tx && rs->rx) in rockchip_spi_transfer_one()
592 rs->tmode = CR0_XFM_TR; in rockchip_spi_transfer_one()
593 else if (rs->tx) in rockchip_spi_transfer_one()
594 rs->tmode = CR0_XFM_TO; in rockchip_spi_transfer_one()
595 else if (rs->rx) in rockchip_spi_transfer_one()
596 rs->tmode = CR0_XFM_RO; in rockchip_spi_transfer_one()
600 rs->use_dma = 1; in rockchip_spi_transfer_one()
602 rs->use_dma = 0; in rockchip_spi_transfer_one()
604 rockchip_spi_config(rs); in rockchip_spi_transfer_one()
606 if (rs->use_dma) { in rockchip_spi_transfer_one()
607 if (rs->tmode == CR0_XFM_RO) { in rockchip_spi_transfer_one()
609 rockchip_spi_prepare_dma(rs); in rockchip_spi_transfer_one()
610 spi_enable_chip(rs, 1); in rockchip_spi_transfer_one()
613 spi_enable_chip(rs, 1); in rockchip_spi_transfer_one()
614 rockchip_spi_prepare_dma(rs); in rockchip_spi_transfer_one()
617 spi_enable_chip(rs, 1); in rockchip_spi_transfer_one()
618 ret = rockchip_spi_pio_transfer(rs); in rockchip_spi_transfer_one()
628 struct rockchip_spi *rs = spi_master_get_devdata(master); in rockchip_spi_can_dma() local
630 return (xfer->len > rs->fifo_len); in rockchip_spi_can_dma()
636 struct rockchip_spi *rs; in rockchip_spi_probe() local
647 rs = spi_master_get_devdata(master); in rockchip_spi_probe()
648 memset(rs, 0, sizeof(struct rockchip_spi)); in rockchip_spi_probe()
652 rs->regs = devm_ioremap_resource(&pdev->dev, mem); in rockchip_spi_probe()
653 if (IS_ERR(rs->regs)) { in rockchip_spi_probe()
654 ret = PTR_ERR(rs->regs); in rockchip_spi_probe()
658 rs->apb_pclk = devm_clk_get(&pdev->dev, "apb_pclk"); in rockchip_spi_probe()
659 if (IS_ERR(rs->apb_pclk)) { in rockchip_spi_probe()
661 ret = PTR_ERR(rs->apb_pclk); in rockchip_spi_probe()
665 rs->spiclk = devm_clk_get(&pdev->dev, "spiclk"); in rockchip_spi_probe()
666 if (IS_ERR(rs->spiclk)) { in rockchip_spi_probe()
668 ret = PTR_ERR(rs->spiclk); in rockchip_spi_probe()
672 ret = clk_prepare_enable(rs->apb_pclk); in rockchip_spi_probe()
678 ret = clk_prepare_enable(rs->spiclk); in rockchip_spi_probe()
684 spi_enable_chip(rs, 0); in rockchip_spi_probe()
686 rs->type = SSI_MOTO_SPI; in rockchip_spi_probe()
687 rs->master = master; in rockchip_spi_probe()
688 rs->dev = &pdev->dev; in rockchip_spi_probe()
689 rs->max_freq = clk_get_rate(rs->spiclk); in rockchip_spi_probe()
693 rs->rsd_nsecs = rsd_nsecs; in rockchip_spi_probe()
695 rs->fifo_len = get_fifo_len(rs); in rockchip_spi_probe()
696 if (!rs->fifo_len) { in rockchip_spi_probe()
702 spin_lock_init(&rs->lock); in rockchip_spi_probe()
720 rs->dma_tx.ch = dma_request_slave_channel(rs->dev, "tx"); in rockchip_spi_probe()
721 if (!rs->dma_tx.ch) in rockchip_spi_probe()
722 dev_warn(rs->dev, "Failed to request TX DMA channel\n"); in rockchip_spi_probe()
724 rs->dma_rx.ch = dma_request_slave_channel(rs->dev, "rx"); in rockchip_spi_probe()
725 if (!rs->dma_rx.ch) { in rockchip_spi_probe()
726 if (rs->dma_tx.ch) { in rockchip_spi_probe()
727 dma_release_channel(rs->dma_tx.ch); in rockchip_spi_probe()
728 rs->dma_tx.ch = NULL; in rockchip_spi_probe()
730 dev_warn(rs->dev, "Failed to request RX DMA channel\n"); in rockchip_spi_probe()
733 if (rs->dma_tx.ch && rs->dma_rx.ch) { in rockchip_spi_probe()
734 rs->dma_tx.addr = (dma_addr_t)(mem->start + ROCKCHIP_SPI_TXDR); in rockchip_spi_probe()
735 rs->dma_rx.addr = (dma_addr_t)(mem->start + ROCKCHIP_SPI_RXDR); in rockchip_spi_probe()
736 rs->dma_tx.direction = DMA_MEM_TO_DEV; in rockchip_spi_probe()
737 rs->dma_rx.direction = DMA_DEV_TO_MEM; in rockchip_spi_probe()
740 master->dma_tx = rs->dma_tx.ch; in rockchip_spi_probe()
741 master->dma_rx = rs->dma_rx.ch; in rockchip_spi_probe()
753 if (rs->dma_tx.ch) in rockchip_spi_probe()
754 dma_release_channel(rs->dma_tx.ch); in rockchip_spi_probe()
755 if (rs->dma_rx.ch) in rockchip_spi_probe()
756 dma_release_channel(rs->dma_rx.ch); in rockchip_spi_probe()
758 clk_disable_unprepare(rs->spiclk); in rockchip_spi_probe()
760 clk_disable_unprepare(rs->apb_pclk); in rockchip_spi_probe()
770 struct rockchip_spi *rs = spi_master_get_devdata(master); in rockchip_spi_remove() local
774 clk_disable_unprepare(rs->spiclk); in rockchip_spi_remove()
775 clk_disable_unprepare(rs->apb_pclk); in rockchip_spi_remove()
777 if (rs->dma_tx.ch) in rockchip_spi_remove()
778 dma_release_channel(rs->dma_tx.ch); in rockchip_spi_remove()
779 if (rs->dma_rx.ch) in rockchip_spi_remove()
780 dma_release_channel(rs->dma_rx.ch); in rockchip_spi_remove()
790 struct rockchip_spi *rs = spi_master_get_devdata(master); in rockchip_spi_suspend() local
792 ret = spi_master_suspend(rs->master); in rockchip_spi_suspend()
797 clk_disable_unprepare(rs->spiclk); in rockchip_spi_suspend()
798 clk_disable_unprepare(rs->apb_pclk); in rockchip_spi_suspend()
808 struct rockchip_spi *rs = spi_master_get_devdata(master); in rockchip_spi_resume() local
811 ret = clk_prepare_enable(rs->apb_pclk); in rockchip_spi_resume()
815 ret = clk_prepare_enable(rs->spiclk); in rockchip_spi_resume()
817 clk_disable_unprepare(rs->apb_pclk); in rockchip_spi_resume()
822 ret = spi_master_resume(rs->master); in rockchip_spi_resume()
824 clk_disable_unprepare(rs->spiclk); in rockchip_spi_resume()
825 clk_disable_unprepare(rs->apb_pclk); in rockchip_spi_resume()
836 struct rockchip_spi *rs = spi_master_get_devdata(master); in rockchip_spi_runtime_suspend() local
838 clk_disable_unprepare(rs->spiclk); in rockchip_spi_runtime_suspend()
839 clk_disable_unprepare(rs->apb_pclk); in rockchip_spi_runtime_suspend()
848 struct rockchip_spi *rs = spi_master_get_devdata(master); in rockchip_spi_runtime_resume() local
850 ret = clk_prepare_enable(rs->apb_pclk); in rockchip_spi_runtime_resume()
854 ret = clk_prepare_enable(rs->spiclk); in rockchip_spi_runtime_resume()
856 clk_disable_unprepare(rs->apb_pclk); in rockchip_spi_runtime_resume()