• Home
  • Raw
  • Download

Lines Matching +full:stm32f469 +full:- +full:qspi

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) STMicroelectronics 2018 - All Rights Reserved
9 #include <linux/dma-mapping.h>
23 #include <linux/spi/spi-mem.h>
91 #define STM32_AUTOSUSPEND_DELAY -1
94 struct stm32_qspi *qspi; member
128 struct stm32_qspi *qspi = (struct stm32_qspi *)dev_id; in stm32_qspi_irq() local
131 sr = readl_relaxed(qspi->io_base + QSPI_SR); in stm32_qspi_irq()
135 cr = readl_relaxed(qspi->io_base + QSPI_CR); in stm32_qspi_irq()
137 writel_relaxed(cr, qspi->io_base + QSPI_CR); in stm32_qspi_irq()
138 complete(&qspi->data_completion); in stm32_qspi_irq()
154 static int stm32_qspi_tx_poll(struct stm32_qspi *qspi, in stm32_qspi_tx_poll() argument
158 u32 len = op->data.nbytes, sr; in stm32_qspi_tx_poll()
162 if (op->data.dir == SPI_MEM_DATA_IN) { in stm32_qspi_tx_poll()
164 buf = op->data.buf.in; in stm32_qspi_tx_poll()
168 buf = (u8 *)op->data.buf.out; in stm32_qspi_tx_poll()
171 while (len--) { in stm32_qspi_tx_poll()
172 ret = readl_relaxed_poll_timeout_atomic(qspi->io_base + QSPI_SR, in stm32_qspi_tx_poll()
176 dev_err(qspi->dev, "fifo timeout (len:%d stat:%#x)\n", in stm32_qspi_tx_poll()
180 tx_fifo(buf++, qspi->io_base + QSPI_DR); in stm32_qspi_tx_poll()
186 static int stm32_qspi_tx_mm(struct stm32_qspi *qspi, in stm32_qspi_tx_mm() argument
189 memcpy_fromio(op->data.buf.in, qspi->mm_base + op->addr.val, in stm32_qspi_tx_mm()
190 op->data.nbytes); in stm32_qspi_tx_mm()
201 static int stm32_qspi_tx_dma(struct stm32_qspi *qspi, in stm32_qspi_tx_dma() argument
212 if (op->data.dir == SPI_MEM_DATA_IN) { in stm32_qspi_tx_dma()
214 dma_ch = qspi->dma_chrx; in stm32_qspi_tx_dma()
217 dma_ch = qspi->dma_chtx; in stm32_qspi_tx_dma()
221 * spi_map_buf return -EINVAL if the buffer is not DMA-able in stm32_qspi_tx_dma()
222 * (DMA-able: in vmalloc | kmap | virt_addr_valid) in stm32_qspi_tx_dma()
224 err = spi_controller_dma_map_mem_op_data(qspi->ctrl, op, &sgt); in stm32_qspi_tx_dma()
231 err = -ENOMEM; in stm32_qspi_tx_dma()
235 cr = readl_relaxed(qspi->io_base + QSPI_CR); in stm32_qspi_tx_dma()
237 reinit_completion(&qspi->dma_completion); in stm32_qspi_tx_dma()
238 desc->callback = stm32_qspi_dma_callback; in stm32_qspi_tx_dma()
239 desc->callback_param = &qspi->dma_completion; in stm32_qspi_tx_dma()
247 writel_relaxed(cr | CR_DMAEN, qspi->io_base + QSPI_CR); in stm32_qspi_tx_dma()
250 if (!wait_for_completion_timeout(&qspi->dma_completion, in stm32_qspi_tx_dma()
252 err = -ETIMEDOUT; in stm32_qspi_tx_dma()
258 writel_relaxed(cr & ~CR_DMAEN, qspi->io_base + QSPI_CR); in stm32_qspi_tx_dma()
260 spi_controller_dma_unmap_mem_op_data(qspi->ctrl, op, &sgt); in stm32_qspi_tx_dma()
265 static int stm32_qspi_tx(struct stm32_qspi *qspi, const struct spi_mem_op *op) in stm32_qspi_tx() argument
267 if (!op->data.nbytes) in stm32_qspi_tx()
270 if (qspi->fmode == CCR_FMODE_MM) in stm32_qspi_tx()
271 return stm32_qspi_tx_mm(qspi, op); in stm32_qspi_tx()
272 else if ((op->data.dir == SPI_MEM_DATA_IN && qspi->dma_chrx) || in stm32_qspi_tx()
273 (op->data.dir == SPI_MEM_DATA_OUT && qspi->dma_chtx)) in stm32_qspi_tx()
274 if (!stm32_qspi_tx_dma(qspi, op)) in stm32_qspi_tx()
277 return stm32_qspi_tx_poll(qspi, op); in stm32_qspi_tx()
280 static int stm32_qspi_wait_nobusy(struct stm32_qspi *qspi) in stm32_qspi_wait_nobusy() argument
284 return readl_relaxed_poll_timeout_atomic(qspi->io_base + QSPI_SR, sr, in stm32_qspi_wait_nobusy()
289 static int stm32_qspi_wait_cmd(struct stm32_qspi *qspi, in stm32_qspi_wait_cmd() argument
295 if (!op->data.nbytes) in stm32_qspi_wait_cmd()
298 if ((readl_relaxed(qspi->io_base + QSPI_SR) & SR_TCF) || in stm32_qspi_wait_cmd()
299 qspi->fmode == CCR_FMODE_APM) in stm32_qspi_wait_cmd()
302 reinit_completion(&qspi->data_completion); in stm32_qspi_wait_cmd()
303 cr = readl_relaxed(qspi->io_base + QSPI_CR); in stm32_qspi_wait_cmd()
304 writel_relaxed(cr | CR_TCIE | CR_TEIE, qspi->io_base + QSPI_CR); in stm32_qspi_wait_cmd()
306 if (!wait_for_completion_timeout(&qspi->data_completion, in stm32_qspi_wait_cmd()
308 err = -ETIMEDOUT; in stm32_qspi_wait_cmd()
310 sr = readl_relaxed(qspi->io_base + QSPI_SR); in stm32_qspi_wait_cmd()
312 err = -EIO; in stm32_qspi_wait_cmd()
317 writel_relaxed(FCR_CTCF | FCR_CTEF, qspi->io_base + QSPI_FCR); in stm32_qspi_wait_cmd()
320 err = stm32_qspi_wait_nobusy(qspi); in stm32_qspi_wait_cmd()
325 static int stm32_qspi_get_mode(struct stm32_qspi *qspi, u8 buswidth) in stm32_qspi_get_mode() argument
335 struct stm32_qspi *qspi = spi_controller_get_devdata(mem->spi->master); in stm32_qspi_send() local
336 struct stm32_qspi_flash *flash = &qspi->flash[mem->spi->chip_select]; in stm32_qspi_send()
340 dev_dbg(qspi->dev, "cmd:%#x mode:%d.%d.%d.%d addr:%#llx len:%#x\n", in stm32_qspi_send()
341 op->cmd.opcode, op->cmd.buswidth, op->addr.buswidth, in stm32_qspi_send()
342 op->dummy.buswidth, op->data.buswidth, in stm32_qspi_send()
343 op->addr.val, op->data.nbytes); in stm32_qspi_send()
345 err = stm32_qspi_wait_nobusy(qspi); in stm32_qspi_send()
349 addr_max = op->addr.val + op->data.nbytes + 1; in stm32_qspi_send()
351 if (op->data.dir == SPI_MEM_DATA_IN) { in stm32_qspi_send()
352 if (addr_max < qspi->mm_size && in stm32_qspi_send()
353 op->addr.buswidth) in stm32_qspi_send()
354 qspi->fmode = CCR_FMODE_MM; in stm32_qspi_send()
356 qspi->fmode = CCR_FMODE_INDR; in stm32_qspi_send()
358 qspi->fmode = CCR_FMODE_INDW; in stm32_qspi_send()
361 cr = readl_relaxed(qspi->io_base + QSPI_CR); in stm32_qspi_send()
363 cr |= FIELD_PREP(CR_PRESC_MASK, flash->presc); in stm32_qspi_send()
364 cr |= FIELD_PREP(CR_FSEL, flash->cs); in stm32_qspi_send()
365 writel_relaxed(cr, qspi->io_base + QSPI_CR); in stm32_qspi_send()
367 if (op->data.nbytes) in stm32_qspi_send()
368 writel_relaxed(op->data.nbytes - 1, in stm32_qspi_send()
369 qspi->io_base + QSPI_DLR); in stm32_qspi_send()
371 qspi->fmode = CCR_FMODE_INDW; in stm32_qspi_send()
373 ccr = qspi->fmode; in stm32_qspi_send()
374 ccr |= FIELD_PREP(CCR_INST_MASK, op->cmd.opcode); in stm32_qspi_send()
376 stm32_qspi_get_mode(qspi, op->cmd.buswidth)); in stm32_qspi_send()
378 if (op->addr.nbytes) { in stm32_qspi_send()
380 stm32_qspi_get_mode(qspi, op->addr.buswidth)); in stm32_qspi_send()
381 ccr |= FIELD_PREP(CCR_ADSIZE_MASK, op->addr.nbytes - 1); in stm32_qspi_send()
384 if (op->dummy.buswidth && op->dummy.nbytes) in stm32_qspi_send()
386 op->dummy.nbytes * 8 / op->dummy.buswidth); in stm32_qspi_send()
388 if (op->data.nbytes) { in stm32_qspi_send()
390 stm32_qspi_get_mode(qspi, op->data.buswidth)); in stm32_qspi_send()
393 writel_relaxed(ccr, qspi->io_base + QSPI_CCR); in stm32_qspi_send()
395 if (op->addr.nbytes && qspi->fmode != CCR_FMODE_MM) in stm32_qspi_send()
396 writel_relaxed(op->addr.val, qspi->io_base + QSPI_AR); in stm32_qspi_send()
398 err = stm32_qspi_tx(qspi, op); in stm32_qspi_send()
402 * -error case in stm32_qspi_send()
403 * -read memory map: prefetching must be stopped if we read the last in stm32_qspi_send()
404 * byte of device (device size - fifo size). like device size is not in stm32_qspi_send()
407 if (err || qspi->fmode == CCR_FMODE_MM) in stm32_qspi_send()
411 err = stm32_qspi_wait_cmd(qspi, op); in stm32_qspi_send()
418 cr = readl_relaxed(qspi->io_base + QSPI_CR) | CR_ABORT; in stm32_qspi_send()
419 writel_relaxed(cr, qspi->io_base + QSPI_CR); in stm32_qspi_send()
422 timeout = readl_relaxed_poll_timeout_atomic(qspi->io_base + QSPI_CR, in stm32_qspi_send()
426 writel_relaxed(FCR_CTCF, qspi->io_base + QSPI_FCR); in stm32_qspi_send()
429 dev_err(qspi->dev, "%s err:%d abort timeout:%d\n", in stm32_qspi_send()
437 struct stm32_qspi *qspi = spi_controller_get_devdata(mem->spi->master); in stm32_qspi_exec_op() local
440 ret = pm_runtime_get_sync(qspi->dev); in stm32_qspi_exec_op()
442 pm_runtime_put_noidle(qspi->dev); in stm32_qspi_exec_op()
446 mutex_lock(&qspi->lock); in stm32_qspi_exec_op()
448 mutex_unlock(&qspi->lock); in stm32_qspi_exec_op()
450 pm_runtime_mark_last_busy(qspi->dev); in stm32_qspi_exec_op()
451 pm_runtime_put_autosuspend(qspi->dev); in stm32_qspi_exec_op()
458 struct spi_controller *ctrl = spi->master; in stm32_qspi_setup()
459 struct stm32_qspi *qspi = spi_controller_get_devdata(ctrl); in stm32_qspi_setup() local
464 if (ctrl->busy) in stm32_qspi_setup()
465 return -EBUSY; in stm32_qspi_setup()
467 if (!spi->max_speed_hz) in stm32_qspi_setup()
468 return -EINVAL; in stm32_qspi_setup()
470 ret = pm_runtime_get_sync(qspi->dev); in stm32_qspi_setup()
472 pm_runtime_put_noidle(qspi->dev); in stm32_qspi_setup()
476 presc = DIV_ROUND_UP(qspi->clk_rate, spi->max_speed_hz) - 1; in stm32_qspi_setup()
478 flash = &qspi->flash[spi->chip_select]; in stm32_qspi_setup()
479 flash->qspi = qspi; in stm32_qspi_setup()
480 flash->cs = spi->chip_select; in stm32_qspi_setup()
481 flash->presc = presc; in stm32_qspi_setup()
483 mutex_lock(&qspi->lock); in stm32_qspi_setup()
484 qspi->cr_reg = 3 << CR_FTHRES_SHIFT | CR_SSHIFT | CR_EN; in stm32_qspi_setup()
485 writel_relaxed(qspi->cr_reg, qspi->io_base + QSPI_CR); in stm32_qspi_setup()
488 qspi->dcr_reg = DCR_FSIZE_MASK; in stm32_qspi_setup()
489 writel_relaxed(qspi->dcr_reg, qspi->io_base + QSPI_DCR); in stm32_qspi_setup()
490 mutex_unlock(&qspi->lock); in stm32_qspi_setup()
492 pm_runtime_mark_last_busy(qspi->dev); in stm32_qspi_setup()
493 pm_runtime_put_autosuspend(qspi->dev); in stm32_qspi_setup()
498 static int stm32_qspi_dma_setup(struct stm32_qspi *qspi) in stm32_qspi_dma_setup() argument
501 struct device *dev = qspi->dev; in stm32_qspi_dma_setup()
508 dma_cfg.src_addr = qspi->phys_base + QSPI_DR; in stm32_qspi_dma_setup()
509 dma_cfg.dst_addr = qspi->phys_base + QSPI_DR; in stm32_qspi_dma_setup()
513 qspi->dma_chrx = dma_request_chan(dev, "rx"); in stm32_qspi_dma_setup()
514 if (IS_ERR(qspi->dma_chrx)) { in stm32_qspi_dma_setup()
515 ret = PTR_ERR(qspi->dma_chrx); in stm32_qspi_dma_setup()
516 qspi->dma_chrx = NULL; in stm32_qspi_dma_setup()
517 if (ret == -EPROBE_DEFER) in stm32_qspi_dma_setup()
520 if (dmaengine_slave_config(qspi->dma_chrx, &dma_cfg)) { in stm32_qspi_dma_setup()
522 dma_release_channel(qspi->dma_chrx); in stm32_qspi_dma_setup()
523 qspi->dma_chrx = NULL; in stm32_qspi_dma_setup()
527 qspi->dma_chtx = dma_request_chan(dev, "tx"); in stm32_qspi_dma_setup()
528 if (IS_ERR(qspi->dma_chtx)) { in stm32_qspi_dma_setup()
529 ret = PTR_ERR(qspi->dma_chtx); in stm32_qspi_dma_setup()
530 qspi->dma_chtx = NULL; in stm32_qspi_dma_setup()
532 if (dmaengine_slave_config(qspi->dma_chtx, &dma_cfg)) { in stm32_qspi_dma_setup()
534 dma_release_channel(qspi->dma_chtx); in stm32_qspi_dma_setup()
535 qspi->dma_chtx = NULL; in stm32_qspi_dma_setup()
540 init_completion(&qspi->dma_completion); in stm32_qspi_dma_setup()
542 if (ret != -EPROBE_DEFER) in stm32_qspi_dma_setup()
548 static void stm32_qspi_dma_free(struct stm32_qspi *qspi) in stm32_qspi_dma_free() argument
550 if (qspi->dma_chtx) in stm32_qspi_dma_free()
551 dma_release_channel(qspi->dma_chtx); in stm32_qspi_dma_free()
552 if (qspi->dma_chrx) in stm32_qspi_dma_free()
553 dma_release_channel(qspi->dma_chrx); in stm32_qspi_dma_free()
566 struct device *dev = &pdev->dev; in stm32_qspi_probe()
569 struct stm32_qspi *qspi; in stm32_qspi_probe() local
573 ctrl = spi_alloc_master(dev, sizeof(*qspi)); in stm32_qspi_probe()
575 return -ENOMEM; in stm32_qspi_probe()
577 qspi = spi_controller_get_devdata(ctrl); in stm32_qspi_probe()
578 qspi->ctrl = ctrl; in stm32_qspi_probe()
580 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi"); in stm32_qspi_probe()
581 qspi->io_base = devm_ioremap_resource(dev, res); in stm32_qspi_probe()
582 if (IS_ERR(qspi->io_base)) { in stm32_qspi_probe()
583 ret = PTR_ERR(qspi->io_base); in stm32_qspi_probe()
587 qspi->phys_base = res->start; in stm32_qspi_probe()
590 qspi->mm_base = devm_ioremap_resource(dev, res); in stm32_qspi_probe()
591 if (IS_ERR(qspi->mm_base)) { in stm32_qspi_probe()
592 ret = PTR_ERR(qspi->mm_base); in stm32_qspi_probe()
596 qspi->mm_size = resource_size(res); in stm32_qspi_probe()
597 if (qspi->mm_size > STM32_QSPI_MAX_MMAP_SZ) { in stm32_qspi_probe()
598 ret = -EINVAL; in stm32_qspi_probe()
609 dev_name(dev), qspi); in stm32_qspi_probe()
615 init_completion(&qspi->data_completion); in stm32_qspi_probe()
617 qspi->clk = devm_clk_get(dev, NULL); in stm32_qspi_probe()
618 if (IS_ERR(qspi->clk)) { in stm32_qspi_probe()
619 ret = PTR_ERR(qspi->clk); in stm32_qspi_probe()
623 qspi->clk_rate = clk_get_rate(qspi->clk); in stm32_qspi_probe()
624 if (!qspi->clk_rate) { in stm32_qspi_probe()
625 ret = -EINVAL; in stm32_qspi_probe()
629 ret = clk_prepare_enable(qspi->clk); in stm32_qspi_probe()
638 if (ret == -EPROBE_DEFER) in stm32_qspi_probe()
646 qspi->dev = dev; in stm32_qspi_probe()
647 platform_set_drvdata(pdev, qspi); in stm32_qspi_probe()
648 ret = stm32_qspi_dma_setup(qspi); in stm32_qspi_probe()
652 mutex_init(&qspi->lock); in stm32_qspi_probe()
654 ctrl->mode_bits = SPI_RX_DUAL | SPI_RX_QUAD in stm32_qspi_probe()
656 ctrl->setup = stm32_qspi_setup; in stm32_qspi_probe()
657 ctrl->bus_num = -1; in stm32_qspi_probe()
658 ctrl->mem_ops = &stm32_qspi_mem_ops; in stm32_qspi_probe()
659 ctrl->num_chipselect = STM32_QSPI_MAX_NORCHIP; in stm32_qspi_probe()
660 ctrl->dev.of_node = dev->of_node; in stm32_qspi_probe()
678 pm_runtime_get_sync(qspi->dev); in stm32_qspi_probe()
679 /* disable qspi */ in stm32_qspi_probe()
680 writel_relaxed(0, qspi->io_base + QSPI_CR); in stm32_qspi_probe()
681 mutex_destroy(&qspi->lock); in stm32_qspi_probe()
682 pm_runtime_put_noidle(qspi->dev); in stm32_qspi_probe()
683 pm_runtime_disable(qspi->dev); in stm32_qspi_probe()
684 pm_runtime_set_suspended(qspi->dev); in stm32_qspi_probe()
685 pm_runtime_dont_use_autosuspend(qspi->dev); in stm32_qspi_probe()
687 stm32_qspi_dma_free(qspi); in stm32_qspi_probe()
689 clk_disable_unprepare(qspi->clk); in stm32_qspi_probe()
691 spi_master_put(qspi->ctrl); in stm32_qspi_probe()
698 struct stm32_qspi *qspi = platform_get_drvdata(pdev); in stm32_qspi_remove() local
700 pm_runtime_get_sync(qspi->dev); in stm32_qspi_remove()
701 /* disable qspi */ in stm32_qspi_remove()
702 writel_relaxed(0, qspi->io_base + QSPI_CR); in stm32_qspi_remove()
703 stm32_qspi_dma_free(qspi); in stm32_qspi_remove()
704 mutex_destroy(&qspi->lock); in stm32_qspi_remove()
705 pm_runtime_put_noidle(qspi->dev); in stm32_qspi_remove()
706 pm_runtime_disable(qspi->dev); in stm32_qspi_remove()
707 pm_runtime_set_suspended(qspi->dev); in stm32_qspi_remove()
708 pm_runtime_dont_use_autosuspend(qspi->dev); in stm32_qspi_remove()
709 clk_disable_unprepare(qspi->clk); in stm32_qspi_remove()
716 struct stm32_qspi *qspi = dev_get_drvdata(dev); in stm32_qspi_runtime_suspend() local
718 clk_disable_unprepare(qspi->clk); in stm32_qspi_runtime_suspend()
725 struct stm32_qspi *qspi = dev_get_drvdata(dev); in stm32_qspi_runtime_resume() local
727 return clk_prepare_enable(qspi->clk); in stm32_qspi_runtime_resume()
739 struct stm32_qspi *qspi = dev_get_drvdata(dev); in stm32_qspi_resume() local
754 writel_relaxed(qspi->cr_reg, qspi->io_base + QSPI_CR); in stm32_qspi_resume()
755 writel_relaxed(qspi->dcr_reg, qspi->io_base + QSPI_DCR); in stm32_qspi_resume()
770 {.compatible = "st,stm32f469-qspi"},
779 .name = "stm32-qspi",