Lines Matching refs:spfi

104 static inline u32 spfi_readl(struct img_spfi *spfi, u32 reg)  in spfi_readl()  argument
106 return readl(spfi->regs + reg); in spfi_readl()
109 static inline void spfi_writel(struct img_spfi *spfi, u32 val, u32 reg) in spfi_writel() argument
111 writel(val, spfi->regs + reg); in spfi_writel()
114 static inline void spfi_start(struct img_spfi *spfi) in spfi_start() argument
118 val = spfi_readl(spfi, SPFI_CONTROL); in spfi_start()
120 spfi_writel(spfi, val, SPFI_CONTROL); in spfi_start()
123 static inline void spfi_reset(struct img_spfi *spfi) in spfi_reset() argument
125 spfi_writel(spfi, SPFI_CONTROL_SOFT_RESET, SPFI_CONTROL); in spfi_reset()
126 spfi_writel(spfi, 0, SPFI_CONTROL); in spfi_reset()
129 static int spfi_wait_all_done(struct img_spfi *spfi) in spfi_wait_all_done() argument
134 u32 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in spfi_wait_all_done()
137 spfi_writel(spfi, SPFI_INTERRUPT_ALLDONETRIG, in spfi_wait_all_done()
144 dev_err(spfi->dev, "Timed out waiting for transaction to complete\n"); in spfi_wait_all_done()
145 spfi_reset(spfi); in spfi_wait_all_done()
150 static unsigned int spfi_pio_write32(struct img_spfi *spfi, const u32 *buf, in spfi_pio_write32() argument
157 spfi_writel(spfi, SPFI_INTERRUPT_SDFUL, SPFI_INTERRUPT_CLEAR); in spfi_pio_write32()
158 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in spfi_pio_write32()
161 spfi_writel(spfi, buf[count], SPFI_TX_32BIT_VALID_DATA); in spfi_pio_write32()
168 static unsigned int spfi_pio_write8(struct img_spfi *spfi, const u8 *buf, in spfi_pio_write8() argument
175 spfi_writel(spfi, SPFI_INTERRUPT_SDFUL, SPFI_INTERRUPT_CLEAR); in spfi_pio_write8()
176 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in spfi_pio_write8()
179 spfi_writel(spfi, buf[count], SPFI_TX_8BIT_VALID_DATA); in spfi_pio_write8()
186 static unsigned int spfi_pio_read32(struct img_spfi *spfi, u32 *buf, in spfi_pio_read32() argument
193 spfi_writel(spfi, SPFI_INTERRUPT_GDEX32BIT, in spfi_pio_read32()
195 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in spfi_pio_read32()
198 buf[count] = spfi_readl(spfi, SPFI_RX_32BIT_VALID_DATA); in spfi_pio_read32()
205 static unsigned int spfi_pio_read8(struct img_spfi *spfi, u8 *buf, in spfi_pio_read8() argument
212 spfi_writel(spfi, SPFI_INTERRUPT_GDEX8BIT, in spfi_pio_read8()
214 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in spfi_pio_read8()
217 buf[count] = spfi_readl(spfi, SPFI_RX_8BIT_VALID_DATA); in spfi_pio_read8()
228 struct img_spfi *spfi = spi_master_get_devdata(spi->master); in img_spfi_start_pio() local
240 spfi_start(spfi); in img_spfi_start_pio()
249 tx_count = spfi_pio_write32(spfi, tx_buf, tx_bytes); in img_spfi_start_pio()
251 tx_count = spfi_pio_write8(spfi, tx_buf, tx_bytes); in img_spfi_start_pio()
254 rx_count = spfi_pio_read32(spfi, rx_buf, rx_bytes); in img_spfi_start_pio()
256 rx_count = spfi_pio_read8(spfi, rx_buf, rx_bytes); in img_spfi_start_pio()
267 dev_err(spfi->dev, "PIO transfer timed out\n"); in img_spfi_start_pio()
271 ret = spfi_wait_all_done(spfi); in img_spfi_start_pio()
280 struct img_spfi *spfi = data; in img_spfi_dma_rx_cb() local
283 spfi_wait_all_done(spfi); in img_spfi_dma_rx_cb()
285 spin_lock_irqsave(&spfi->lock, flags); in img_spfi_dma_rx_cb()
286 spfi->rx_dma_busy = false; in img_spfi_dma_rx_cb()
287 if (!spfi->tx_dma_busy) in img_spfi_dma_rx_cb()
288 spi_finalize_current_transfer(spfi->master); in img_spfi_dma_rx_cb()
289 spin_unlock_irqrestore(&spfi->lock, flags); in img_spfi_dma_rx_cb()
294 struct img_spfi *spfi = data; in img_spfi_dma_tx_cb() local
297 spfi_wait_all_done(spfi); in img_spfi_dma_tx_cb()
299 spin_lock_irqsave(&spfi->lock, flags); in img_spfi_dma_tx_cb()
300 spfi->tx_dma_busy = false; in img_spfi_dma_tx_cb()
301 if (!spfi->rx_dma_busy) in img_spfi_dma_tx_cb()
302 spi_finalize_current_transfer(spfi->master); in img_spfi_dma_tx_cb()
303 spin_unlock_irqrestore(&spfi->lock, flags); in img_spfi_dma_tx_cb()
310 struct img_spfi *spfi = spi_master_get_devdata(spi->master); in img_spfi_start_dma() local
314 spfi->rx_dma_busy = false; in img_spfi_start_dma()
315 spfi->tx_dma_busy = false; in img_spfi_start_dma()
320 rxconf.src_addr = spfi->phys + SPFI_RX_32BIT_VALID_DATA; in img_spfi_start_dma()
324 rxconf.src_addr = spfi->phys + SPFI_RX_8BIT_VALID_DATA; in img_spfi_start_dma()
328 dmaengine_slave_config(spfi->rx_ch, &rxconf); in img_spfi_start_dma()
330 rxdesc = dmaengine_prep_slave_sg(spfi->rx_ch, xfer->rx_sg.sgl, in img_spfi_start_dma()
338 rxdesc->callback_param = spfi; in img_spfi_start_dma()
344 txconf.dst_addr = spfi->phys + SPFI_TX_32BIT_VALID_DATA; in img_spfi_start_dma()
348 txconf.dst_addr = spfi->phys + SPFI_TX_8BIT_VALID_DATA; in img_spfi_start_dma()
352 dmaengine_slave_config(spfi->tx_ch, &txconf); in img_spfi_start_dma()
354 txdesc = dmaengine_prep_slave_sg(spfi->tx_ch, xfer->tx_sg.sgl, in img_spfi_start_dma()
362 txdesc->callback_param = spfi; in img_spfi_start_dma()
366 spfi->rx_dma_busy = true; in img_spfi_start_dma()
368 dma_async_issue_pending(spfi->rx_ch); in img_spfi_start_dma()
371 spfi_start(spfi); in img_spfi_start_dma()
374 spfi->tx_dma_busy = true; in img_spfi_start_dma()
376 dma_async_issue_pending(spfi->tx_ch); in img_spfi_start_dma()
382 dmaengine_terminate_all(spfi->rx_ch); in img_spfi_start_dma()
383 dmaengine_terminate_all(spfi->tx_ch); in img_spfi_start_dma()
390 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_handle_err() local
397 spin_lock_irqsave(&spfi->lock, flags); in img_spfi_handle_err()
398 if (spfi->tx_dma_busy || spfi->rx_dma_busy) { in img_spfi_handle_err()
399 spfi->tx_dma_busy = false; in img_spfi_handle_err()
400 spfi->rx_dma_busy = false; in img_spfi_handle_err()
402 dmaengine_terminate_all(spfi->tx_ch); in img_spfi_handle_err()
403 dmaengine_terminate_all(spfi->rx_ch); in img_spfi_handle_err()
405 spin_unlock_irqrestore(&spfi->lock, flags); in img_spfi_handle_err()
410 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_prepare() local
413 val = spfi_readl(spfi, SPFI_PORT_STATE); in img_spfi_prepare()
425 spfi_writel(spfi, val, SPFI_PORT_STATE); in img_spfi_prepare()
433 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_unprepare() local
435 spfi_reset(spfi); in img_spfi_unprepare()
443 struct img_spfi *spfi = spi_master_get_devdata(spi->master); in img_spfi_config() local
450 div = DIV_ROUND_UP(clk_get_rate(spfi->spfi_clk), xfer->speed_hz); in img_spfi_config()
453 val = spfi_readl(spfi, SPFI_DEVICE_PARAMETER(spi->chip_select)); in img_spfi_config()
457 spfi_writel(spfi, val, SPFI_DEVICE_PARAMETER(spi->chip_select)); in img_spfi_config()
459 spfi_writel(spfi, xfer->len << SPFI_TRANSACTION_TSIZE_SHIFT, in img_spfi_config()
462 val = spfi_readl(spfi, SPFI_CONTROL); in img_spfi_config()
476 spfi_writel(spfi, val, SPFI_CONTROL); in img_spfi_config()
483 struct img_spfi *spfi = spi_master_get_devdata(spi->master); in img_spfi_transfer_one() local
487 dev_err(spfi->dev, in img_spfi_transfer_one()
512 struct img_spfi *spfi = (struct img_spfi *)dev_id; in img_spfi_irq() local
515 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS); in img_spfi_irq()
517 spfi_writel(spfi, SPFI_INTERRUPT_IACCESS, SPFI_INTERRUPT_CLEAR); in img_spfi_irq()
518 dev_err(spfi->dev, "Illegal access interrupt"); in img_spfi_irq()
528 struct img_spfi *spfi; in img_spfi_probe() local
533 master = spi_alloc_master(&pdev->dev, sizeof(*spfi)); in img_spfi_probe()
538 spfi = spi_master_get_devdata(master); in img_spfi_probe()
539 spfi->dev = &pdev->dev; in img_spfi_probe()
540 spfi->master = master; in img_spfi_probe()
541 spin_lock_init(&spfi->lock); in img_spfi_probe()
544 spfi->regs = devm_ioremap_resource(spfi->dev, res); in img_spfi_probe()
545 if (IS_ERR(spfi->regs)) { in img_spfi_probe()
546 ret = PTR_ERR(spfi->regs); in img_spfi_probe()
549 spfi->phys = res->start; in img_spfi_probe()
551 spfi->irq = platform_get_irq(pdev, 0); in img_spfi_probe()
552 if (spfi->irq < 0) { in img_spfi_probe()
553 ret = spfi->irq; in img_spfi_probe()
556 ret = devm_request_irq(spfi->dev, spfi->irq, img_spfi_irq, in img_spfi_probe()
557 IRQ_TYPE_LEVEL_HIGH, dev_name(spfi->dev), spfi); in img_spfi_probe()
561 spfi->sys_clk = devm_clk_get(spfi->dev, "sys"); in img_spfi_probe()
562 if (IS_ERR(spfi->sys_clk)) { in img_spfi_probe()
563 ret = PTR_ERR(spfi->sys_clk); in img_spfi_probe()
566 spfi->spfi_clk = devm_clk_get(spfi->dev, "spfi"); in img_spfi_probe()
567 if (IS_ERR(spfi->spfi_clk)) { in img_spfi_probe()
568 ret = PTR_ERR(spfi->spfi_clk); in img_spfi_probe()
572 ret = clk_prepare_enable(spfi->sys_clk); in img_spfi_probe()
575 ret = clk_prepare_enable(spfi->spfi_clk); in img_spfi_probe()
579 spfi_reset(spfi); in img_spfi_probe()
584 spfi_writel(spfi, SPFI_INTERRUPT_IACCESS, SPFI_INTERRUPT_ENABLE); in img_spfi_probe()
589 if (of_property_read_bool(spfi->dev->of_node, "img,supports-quad-mode")) in img_spfi_probe()
593 master->max_speed_hz = clk_get_rate(spfi->spfi_clk) / 4; in img_spfi_probe()
594 master->min_speed_hz = clk_get_rate(spfi->spfi_clk) / 512; in img_spfi_probe()
603 if (!of_property_read_u32(spfi->dev->of_node, "spfi-max-frequency", in img_spfi_probe()
615 spfi->tx_ch = dma_request_chan(spfi->dev, "tx"); in img_spfi_probe()
616 if (IS_ERR(spfi->tx_ch)) { in img_spfi_probe()
617 ret = PTR_ERR(spfi->tx_ch); in img_spfi_probe()
618 spfi->tx_ch = NULL; in img_spfi_probe()
623 spfi->rx_ch = dma_request_chan(spfi->dev, "rx"); in img_spfi_probe()
624 if (IS_ERR(spfi->rx_ch)) { in img_spfi_probe()
625 ret = PTR_ERR(spfi->rx_ch); in img_spfi_probe()
626 spfi->rx_ch = NULL; in img_spfi_probe()
631 if (!spfi->tx_ch || !spfi->rx_ch) { in img_spfi_probe()
632 if (spfi->tx_ch) in img_spfi_probe()
633 dma_release_channel(spfi->tx_ch); in img_spfi_probe()
634 if (spfi->rx_ch) in img_spfi_probe()
635 dma_release_channel(spfi->rx_ch); in img_spfi_probe()
636 spfi->tx_ch = NULL; in img_spfi_probe()
637 spfi->rx_ch = NULL; in img_spfi_probe()
638 dev_warn(spfi->dev, "Failed to get DMA channels, falling back to PIO mode\n"); in img_spfi_probe()
640 master->dma_tx = spfi->tx_ch; in img_spfi_probe()
641 master->dma_rx = spfi->rx_ch; in img_spfi_probe()
645 pm_runtime_set_active(spfi->dev); in img_spfi_probe()
646 pm_runtime_enable(spfi->dev); in img_spfi_probe()
648 ret = devm_spi_register_master(spfi->dev, master); in img_spfi_probe()
655 pm_runtime_disable(spfi->dev); in img_spfi_probe()
656 if (spfi->rx_ch) in img_spfi_probe()
657 dma_release_channel(spfi->rx_ch); in img_spfi_probe()
658 if (spfi->tx_ch) in img_spfi_probe()
659 dma_release_channel(spfi->tx_ch); in img_spfi_probe()
660 clk_disable_unprepare(spfi->spfi_clk); in img_spfi_probe()
662 clk_disable_unprepare(spfi->sys_clk); in img_spfi_probe()
672 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_remove() local
674 if (spfi->tx_ch) in img_spfi_remove()
675 dma_release_channel(spfi->tx_ch); in img_spfi_remove()
676 if (spfi->rx_ch) in img_spfi_remove()
677 dma_release_channel(spfi->rx_ch); in img_spfi_remove()
679 pm_runtime_disable(spfi->dev); in img_spfi_remove()
680 if (!pm_runtime_status_suspended(spfi->dev)) { in img_spfi_remove()
681 clk_disable_unprepare(spfi->spfi_clk); in img_spfi_remove()
682 clk_disable_unprepare(spfi->sys_clk); in img_spfi_remove()
692 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_runtime_suspend() local
694 clk_disable_unprepare(spfi->spfi_clk); in img_spfi_runtime_suspend()
695 clk_disable_unprepare(spfi->sys_clk); in img_spfi_runtime_suspend()
703 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_runtime_resume() local
706 ret = clk_prepare_enable(spfi->sys_clk); in img_spfi_runtime_resume()
709 ret = clk_prepare_enable(spfi->spfi_clk); in img_spfi_runtime_resume()
711 clk_disable_unprepare(spfi->sys_clk); in img_spfi_runtime_resume()
730 struct img_spfi *spfi = spi_master_get_devdata(master); in img_spfi_resume() local
738 spfi_reset(spfi); in img_spfi_resume()