• Home
  • Raw
  • Download

Lines Matching refs:spfi

109 static inline u32 spfi_readl(struct img_spfi *spfi, u32 reg)  in spfi_readl()  argument
111 return readl(spfi->regs + reg); in spfi_readl()
114 static inline void spfi_writel(struct img_spfi *spfi, u32 val, u32 reg) in spfi_writel() argument
116 writel(val, spfi->regs + reg); in spfi_writel()
119 static inline void spfi_start(struct img_spfi *spfi) in spfi_start() argument
123 val = spfi_readl(spfi, SPFI_CONTROL); in spfi_start()
125 spfi_writel(spfi, val, SPFI_CONTROL); in spfi_start()
128 static inline void spfi_reset(struct img_spfi *spfi) in spfi_reset() argument
130 spfi_writel(spfi, SPFI_CONTROL_SOFT_RESET, SPFI_CONTROL); in spfi_reset()
131 spfi_writel(spfi, 0, SPFI_CONTROL); in spfi_reset()
134 static int spfi_wait_all_done(struct img_spfi *spfi) in spfi_wait_all_done() argument
139 u32 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in spfi_wait_all_done()
142 spfi_writel(spfi, SPFI_INTERRUPT_ALLDONETRIG, in spfi_wait_all_done()
149 dev_err(spfi->dev, "Timed out waiting for transaction to complete\n"); in spfi_wait_all_done()
150 spfi_reset(spfi); in spfi_wait_all_done()
155 static unsigned int spfi_pio_write32(struct img_spfi *spfi, const u32 *buf, in spfi_pio_write32() argument
162 spfi_writel(spfi, SPFI_INTERRUPT_SDFUL, SPFI_INTERRUPT_CLEAR); in spfi_pio_write32()
163 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in spfi_pio_write32()
166 spfi_writel(spfi, buf[count], SPFI_TX_32BIT_VALID_DATA); in spfi_pio_write32()
173 static unsigned int spfi_pio_write8(struct img_spfi *spfi, const u8 *buf, in spfi_pio_write8() argument
180 spfi_writel(spfi, SPFI_INTERRUPT_SDFUL, SPFI_INTERRUPT_CLEAR); in spfi_pio_write8()
181 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in spfi_pio_write8()
184 spfi_writel(spfi, buf[count], SPFI_TX_8BIT_VALID_DATA); in spfi_pio_write8()
191 static unsigned int spfi_pio_read32(struct img_spfi *spfi, u32 *buf, in spfi_pio_read32() argument
198 spfi_writel(spfi, SPFI_INTERRUPT_GDEX32BIT, in spfi_pio_read32()
200 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in spfi_pio_read32()
203 buf[count] = spfi_readl(spfi, SPFI_RX_32BIT_VALID_DATA); in spfi_pio_read32()
210 static unsigned int spfi_pio_read8(struct img_spfi *spfi, u8 *buf, in spfi_pio_read8() argument
217 spfi_writel(spfi, SPFI_INTERRUPT_GDEX8BIT, in spfi_pio_read8()
219 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in spfi_pio_read8()
222 buf[count] = spfi_readl(spfi, SPFI_RX_8BIT_VALID_DATA); in spfi_pio_read8()
233 struct img_spfi *spfi = spi_master_get_devdata(spi->master); in img_spfi_start_pio() local
245 spfi_start(spfi); in img_spfi_start_pio()
254 tx_count = spfi_pio_write32(spfi, tx_buf, tx_bytes); in img_spfi_start_pio()
256 tx_count = spfi_pio_write8(spfi, tx_buf, tx_bytes); in img_spfi_start_pio()
259 rx_count = spfi_pio_read32(spfi, rx_buf, rx_bytes); in img_spfi_start_pio()
261 rx_count = spfi_pio_read8(spfi, rx_buf, rx_bytes); in img_spfi_start_pio()
272 dev_err(spfi->dev, "PIO transfer timed out\n"); in img_spfi_start_pio()
276 ret = spfi_wait_all_done(spfi); in img_spfi_start_pio()
285 struct img_spfi *spfi = data; in img_spfi_dma_rx_cb() local
288 spfi_wait_all_done(spfi); in img_spfi_dma_rx_cb()
290 spin_lock_irqsave(&spfi->lock, flags); in img_spfi_dma_rx_cb()
291 spfi->rx_dma_busy = false; in img_spfi_dma_rx_cb()
292 if (!spfi->tx_dma_busy) in img_spfi_dma_rx_cb()
293 spi_finalize_current_transfer(spfi->master); in img_spfi_dma_rx_cb()
294 spin_unlock_irqrestore(&spfi->lock, flags); in img_spfi_dma_rx_cb()
299 struct img_spfi *spfi = data; in img_spfi_dma_tx_cb() local
302 spfi_wait_all_done(spfi); in img_spfi_dma_tx_cb()
304 spin_lock_irqsave(&spfi->lock, flags); in img_spfi_dma_tx_cb()
305 spfi->tx_dma_busy = false; in img_spfi_dma_tx_cb()
306 if (!spfi->rx_dma_busy) in img_spfi_dma_tx_cb()
307 spi_finalize_current_transfer(spfi->master); in img_spfi_dma_tx_cb()
308 spin_unlock_irqrestore(&spfi->lock, flags); in img_spfi_dma_tx_cb()
315 struct img_spfi *spfi = spi_master_get_devdata(spi->master); in img_spfi_start_dma() local
319 spfi->rx_dma_busy = false; in img_spfi_start_dma()
320 spfi->tx_dma_busy = false; in img_spfi_start_dma()
325 rxconf.src_addr = spfi->phys + SPFI_RX_32BIT_VALID_DATA; in img_spfi_start_dma()
329 rxconf.src_addr = spfi->phys + SPFI_RX_8BIT_VALID_DATA; in img_spfi_start_dma()
333 dmaengine_slave_config(spfi->rx_ch, &rxconf); in img_spfi_start_dma()
335 rxdesc = dmaengine_prep_slave_sg(spfi->rx_ch, xfer->rx_sg.sgl, in img_spfi_start_dma()
343 rxdesc->callback_param = spfi; in img_spfi_start_dma()
349 txconf.dst_addr = spfi->phys + SPFI_TX_32BIT_VALID_DATA; in img_spfi_start_dma()
353 txconf.dst_addr = spfi->phys + SPFI_TX_8BIT_VALID_DATA; in img_spfi_start_dma()
357 dmaengine_slave_config(spfi->tx_ch, &txconf); in img_spfi_start_dma()
359 txdesc = dmaengine_prep_slave_sg(spfi->tx_ch, xfer->tx_sg.sgl, in img_spfi_start_dma()
367 txdesc->callback_param = spfi; in img_spfi_start_dma()
371 spfi->rx_dma_busy = true; in img_spfi_start_dma()
373 dma_async_issue_pending(spfi->rx_ch); in img_spfi_start_dma()
376 spfi_start(spfi); in img_spfi_start_dma()
379 spfi->tx_dma_busy = true; in img_spfi_start_dma()
381 dma_async_issue_pending(spfi->tx_ch); in img_spfi_start_dma()
387 dmaengine_terminate_all(spfi->rx_ch); in img_spfi_start_dma()
388 dmaengine_terminate_all(spfi->tx_ch); in img_spfi_start_dma()
395 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_handle_err() local
402 spin_lock_irqsave(&spfi->lock, flags); in img_spfi_handle_err()
403 if (spfi->tx_dma_busy || spfi->rx_dma_busy) { in img_spfi_handle_err()
404 spfi->tx_dma_busy = false; in img_spfi_handle_err()
405 spfi->rx_dma_busy = false; in img_spfi_handle_err()
407 dmaengine_terminate_all(spfi->tx_ch); in img_spfi_handle_err()
408 dmaengine_terminate_all(spfi->rx_ch); in img_spfi_handle_err()
410 spin_unlock_irqrestore(&spfi->lock, flags); in img_spfi_handle_err()
415 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_prepare() local
418 val = spfi_readl(spfi, SPFI_PORT_STATE); in img_spfi_prepare()
430 spfi_writel(spfi, val, SPFI_PORT_STATE); in img_spfi_prepare()
438 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_unprepare() local
440 spfi_reset(spfi); in img_spfi_unprepare()
496 struct img_spfi *spfi = spi_master_get_devdata(spi->master); in img_spfi_config() local
503 div = DIV_ROUND_UP(clk_get_rate(spfi->spfi_clk), xfer->speed_hz); in img_spfi_config()
506 val = spfi_readl(spfi, SPFI_DEVICE_PARAMETER(spi->chip_select)); in img_spfi_config()
510 spfi_writel(spfi, val, SPFI_DEVICE_PARAMETER(spi->chip_select)); in img_spfi_config()
512 spfi_writel(spfi, xfer->len << SPFI_TRANSACTION_TSIZE_SHIFT, in img_spfi_config()
515 val = spfi_readl(spfi, SPFI_CONTROL); in img_spfi_config()
529 spfi_writel(spfi, val, SPFI_CONTROL); in img_spfi_config()
536 struct img_spfi *spfi = spi_master_get_devdata(spi->master); in img_spfi_transfer_one() local
540 dev_err(spfi->dev, in img_spfi_transfer_one()
565 struct img_spfi *spfi = (struct img_spfi *)dev_id; in img_spfi_irq() local
568 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in img_spfi_irq()
570 spfi_writel(spfi, SPFI_INTERRUPT_IACCESS, SPFI_INTERRUPT_CLEAR); in img_spfi_irq()
571 dev_err(spfi->dev, "Illegal access interrupt"); in img_spfi_irq()
581 struct img_spfi *spfi; in img_spfi_probe() local
586 master = spi_alloc_master(&pdev->dev, sizeof(*spfi)); in img_spfi_probe()
591 spfi = spi_master_get_devdata(master); in img_spfi_probe()
592 spfi->dev = &pdev->dev; in img_spfi_probe()
593 spfi->master = master; in img_spfi_probe()
594 spin_lock_init(&spfi->lock); in img_spfi_probe()
597 spfi->regs = devm_ioremap_resource(spfi->dev, res); in img_spfi_probe()
598 if (IS_ERR(spfi->regs)) { in img_spfi_probe()
599 ret = PTR_ERR(spfi->regs); in img_spfi_probe()
602 spfi->phys = res->start; in img_spfi_probe()
604 spfi->irq = platform_get_irq(pdev, 0); in img_spfi_probe()
605 if (spfi->irq < 0) { in img_spfi_probe()
606 ret = spfi->irq; in img_spfi_probe()
609 ret = devm_request_irq(spfi->dev, spfi->irq, img_spfi_irq, in img_spfi_probe()
610 IRQ_TYPE_LEVEL_HIGH, dev_name(spfi->dev), spfi); in img_spfi_probe()
614 spfi->sys_clk = devm_clk_get(spfi->dev, "sys"); in img_spfi_probe()
615 if (IS_ERR(spfi->sys_clk)) { in img_spfi_probe()
616 ret = PTR_ERR(spfi->sys_clk); in img_spfi_probe()
619 spfi->spfi_clk = devm_clk_get(spfi->dev, "spfi"); in img_spfi_probe()
620 if (IS_ERR(spfi->spfi_clk)) { in img_spfi_probe()
621 ret = PTR_ERR(spfi->spfi_clk); in img_spfi_probe()
625 ret = clk_prepare_enable(spfi->sys_clk); in img_spfi_probe()
628 ret = clk_prepare_enable(spfi->spfi_clk); in img_spfi_probe()
632 spfi_reset(spfi); in img_spfi_probe()
637 spfi_writel(spfi, SPFI_INTERRUPT_IACCESS, SPFI_INTERRUPT_ENABLE); in img_spfi_probe()
642 if (of_property_read_bool(spfi->dev->of_node, "img,supports-quad-mode")) in img_spfi_probe()
646 master->max_speed_hz = clk_get_rate(spfi->spfi_clk) / 4; in img_spfi_probe()
647 master->min_speed_hz = clk_get_rate(spfi->spfi_clk) / 512; in img_spfi_probe()
656 if (!of_property_read_u32(spfi->dev->of_node, "spfi-max-frequency", in img_spfi_probe()
669 spfi->tx_ch = dma_request_slave_channel(spfi->dev, "tx"); in img_spfi_probe()
670 spfi->rx_ch = dma_request_slave_channel(spfi->dev, "rx"); in img_spfi_probe()
671 if (!spfi->tx_ch || !spfi->rx_ch) { in img_spfi_probe()
672 if (spfi->tx_ch) in img_spfi_probe()
673 dma_release_channel(spfi->tx_ch); in img_spfi_probe()
674 if (spfi->rx_ch) in img_spfi_probe()
675 dma_release_channel(spfi->rx_ch); in img_spfi_probe()
676 spfi->tx_ch = NULL; in img_spfi_probe()
677 spfi->rx_ch = NULL; in img_spfi_probe()
678 dev_warn(spfi->dev, "Failed to get DMA channels, falling back to PIO mode\n"); in img_spfi_probe()
680 master->dma_tx = spfi->tx_ch; in img_spfi_probe()
681 master->dma_rx = spfi->rx_ch; in img_spfi_probe()
685 pm_runtime_set_active(spfi->dev); in img_spfi_probe()
686 pm_runtime_enable(spfi->dev); in img_spfi_probe()
688 ret = devm_spi_register_master(spfi->dev, master); in img_spfi_probe()
695 pm_runtime_disable(spfi->dev); in img_spfi_probe()
696 if (spfi->rx_ch) in img_spfi_probe()
697 dma_release_channel(spfi->rx_ch); in img_spfi_probe()
698 if (spfi->tx_ch) in img_spfi_probe()
699 dma_release_channel(spfi->tx_ch); in img_spfi_probe()
700 clk_disable_unprepare(spfi->spfi_clk); in img_spfi_probe()
702 clk_disable_unprepare(spfi->sys_clk); in img_spfi_probe()
712 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_remove() local
714 if (spfi->tx_ch) in img_spfi_remove()
715 dma_release_channel(spfi->tx_ch); in img_spfi_remove()
716 if (spfi->rx_ch) in img_spfi_remove()
717 dma_release_channel(spfi->rx_ch); in img_spfi_remove()
719 pm_runtime_disable(spfi->dev); in img_spfi_remove()
720 if (!pm_runtime_status_suspended(spfi->dev)) { in img_spfi_remove()
721 clk_disable_unprepare(spfi->spfi_clk); in img_spfi_remove()
722 clk_disable_unprepare(spfi->sys_clk); in img_spfi_remove()
732 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_runtime_suspend() local
734 clk_disable_unprepare(spfi->spfi_clk); in img_spfi_runtime_suspend()
735 clk_disable_unprepare(spfi->sys_clk); in img_spfi_runtime_suspend()
743 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_runtime_resume() local
746 ret = clk_prepare_enable(spfi->sys_clk); in img_spfi_runtime_resume()
749 ret = clk_prepare_enable(spfi->spfi_clk); in img_spfi_runtime_resume()
751 clk_disable_unprepare(spfi->sys_clk); in img_spfi_runtime_resume()
770 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_resume() local
776 spfi_reset(spfi); in img_spfi_resume()