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