Lines Matching defs:ospi

122 static void f_ospi_clear_irq(struct f_ospi *ospi)
125 ospi->base + OSPI_IRQ);
128 static void f_ospi_enable_irq_status(struct f_ospi *ospi, u32 irq_bits)
132 val = readl(ospi->base + OSPI_IRQ_STAT_EN);
134 writel(val, ospi->base + OSPI_IRQ_STAT_EN);
137 static void f_ospi_disable_irq_status(struct f_ospi *ospi, u32 irq_bits)
141 val = readl(ospi->base + OSPI_IRQ_STAT_EN);
143 writel(val, ospi->base + OSPI_IRQ_STAT_EN);
146 static void f_ospi_disable_irq_output(struct f_ospi *ospi, u32 irq_bits)
150 val = readl(ospi->base + OSPI_IRQ_SIG_EN);
152 writel(val, ospi->base + OSPI_IRQ_SIG_EN);
155 static int f_ospi_prepare_config(struct f_ospi *ospi)
160 val = readl(ospi->base + OSPI_CLK_CTL);
162 writel(val, ospi->base + OSPI_CLK_CTL);
168 return readl_poll_timeout(ospi->base + OSPI_STAT,
173 static int f_ospi_unprepare_config(struct f_ospi *ospi)
178 val = readl(ospi->base + OSPI_CLK_CTL);
180 writel(val, ospi->base + OSPI_CLK_CTL);
183 return readl_poll_timeout(ospi->base + OSPI_STAT,
188 static void f_ospi_config_clk(struct f_ospi *ospi, u32 device_hz)
190 long rate_hz = clk_get_rate(ospi->clk);
196 dev_warn(ospi->dev, "Device frequency too large: %d\n",
209 dev_warn(ospi->dev, "Device frequency too small: %d\n",
220 val = readl(ospi->base + OSPI_CLK_CTL);
226 writel(val, ospi->base + OSPI_CLK_CTL);
229 static void f_ospi_config_dll(struct f_ospi *ospi)
234 static u8 f_ospi_get_mode(struct f_ospi *ospi, int width, int data_size)
253 dev_err(ospi->dev, "Invalid buswidth: %d\n", width);
260 static void f_ospi_config_indir_protocol(struct f_ospi *ospi,
270 writel(BIT(spi_get_chipselect(spi, 0)), ospi->base + OSPI_SSEL);
272 mode = f_ospi_get_mode(ospi, op->cmd.buswidth, 1);
275 mode = f_ospi_get_mode(ospi, op->addr.buswidth, op->addr.nbytes);
278 mode = f_ospi_get_mode(ospi, op->data.buswidth, op->data.nbytes);
324 dev_warn(ospi->dev, "Unsupported direction");
331 writel(prot, ospi->base + OSPI_PROT_CTL_INDIR);
332 writel(val, ospi->base + OSPI_DAT_SIZE_INDIR);
335 static int f_ospi_indir_prepare_op(struct f_ospi *ospi, struct spi_mem *mem,
342 ret = f_ospi_prepare_config(ospi);
346 f_ospi_config_clk(ospi, spi->max_speed_hz);
348 f_ospi_config_indir_protocol(ospi, mem, op);
350 writel(f_ospi_get_dummy_cycle(op), ospi->base + OSPI_DMY_INDIR);
351 writel(op->addr.val, ospi->base + OSPI_ADDR);
352 writel(op->cmd.opcode, ospi->base + OSPI_CMD_IDX_INDIR);
354 f_ospi_clear_irq(ospi);
370 dev_warn(ospi->dev, "Unsupported direction");
374 f_ospi_disable_irq_status(ospi, ~irq_stat_en);
375 f_ospi_enable_irq_status(ospi, irq_stat_en);
377 return f_ospi_unprepare_config(ospi);
380 static void f_ospi_indir_start_xfer(struct f_ospi *ospi)
383 writel(OSPI_TRANS_CTL_START_REQ, ospi->base + OSPI_TRANS_CTL);
386 static void f_ospi_indir_stop_xfer(struct f_ospi *ospi)
389 writel(OSPI_TRANS_CTL_STOP_REQ, ospi->base + OSPI_TRANS_CTL);
392 static int f_ospi_indir_wait_xfer_complete(struct f_ospi *ospi)
396 return readl_poll_timeout(ospi->base + OSPI_IRQ, val,
401 static int f_ospi_indir_read(struct f_ospi *ospi, struct spi_mem *mem,
408 mutex_lock(&ospi->mlock);
411 ret = f_ospi_indir_prepare_op(ospi, mem, op);
415 f_ospi_indir_start_xfer(ospi);
419 ret = readl_poll_timeout(ospi->base + OSPI_IRQ, val,
425 buf[i] = readl(ospi->base + OSPI_DAT) & 0xFF;
429 if (!(readl(ospi->base + OSPI_DAT_SIZE_INDIR) & OSPI_DAT_SIZE_EN))
430 f_ospi_indir_stop_xfer(ospi);
433 ret = f_ospi_indir_wait_xfer_complete(ospi);
437 writel(OSPI_IRQ_CS_TRANS_COMP, ospi->base + OSPI_IRQ);
440 if (readl(ospi->base + OSPI_DAT_SIZE_INDIR) & OSPI_DAT_SIZE_EN)
444 writel(OSPI_SWRST_INDIR_READ_FIFO, ospi->base + OSPI_SWRST);
446 ret = readl_poll_timeout(ospi->base + OSPI_SWRST, val,
450 mutex_unlock(&ospi->mlock);
455 static int f_ospi_indir_write(struct f_ospi *ospi, struct spi_mem *mem,
462 mutex_lock(&ospi->mlock);
465 ret = f_ospi_indir_prepare_op(ospi, mem, op);
469 f_ospi_indir_start_xfer(ospi);
471 if (!(readl(ospi->base + OSPI_PROT_CTL_INDIR) & OSPI_PROT_DATA_EN))
476 ret = readl_poll_timeout(ospi->base + OSPI_IRQ, val,
482 writel(buf[i], ospi->base + OSPI_DAT);
486 if (!(readl(ospi->base + OSPI_DAT_SIZE_INDIR) & OSPI_DAT_SIZE_EN))
487 f_ospi_indir_stop_xfer(ospi);
491 ret = f_ospi_indir_wait_xfer_complete(ospi);
495 writel(OSPI_IRQ_CS_TRANS_COMP, ospi->base + OSPI_IRQ);
497 mutex_unlock(&ospi->mlock);
504 struct f_ospi *ospi = spi_controller_get_devdata(mem->spi->controller);
509 err = f_ospi_indir_read(ospi, mem, op);
515 err = f_ospi_indir_write(ospi, mem, op);
519 dev_warn(ospi->dev, "Unsupported direction");
580 static int f_ospi_init(struct f_ospi *ospi)
584 ret = f_ospi_prepare_config(ospi);
589 writel(OSPI_ACC_MODE_BOOT_DISABLE, ospi->base + OSPI_ACC_MODE);
591 f_ospi_config_dll(ospi);
594 f_ospi_clear_irq(ospi);
595 f_ospi_disable_irq_status(ospi, OSPI_IRQ_ALL);
596 f_ospi_disable_irq_output(ospi, OSPI_IRQ_ALL);
598 return f_ospi_unprepare_config(ospi);
605 struct f_ospi *ospi;
609 ctlr = spi_alloc_host(dev, sizeof(*ospi));
626 ospi = spi_controller_get_devdata(ctlr);
627 ospi->dev = dev;
629 platform_set_drvdata(pdev, ospi);
631 ospi->base = devm_platform_ioremap_resource(pdev, 0);
632 if (IS_ERR(ospi->base)) {
633 ret = PTR_ERR(ospi->base);
637 ospi->clk = devm_clk_get_enabled(dev, NULL);
638 if (IS_ERR(ospi->clk)) {
639 ret = PTR_ERR(ospi->clk);
643 mutex_init(&ospi->mlock);
645 ret = f_ospi_init(ospi);
656 mutex_destroy(&ospi->mlock);
666 struct f_ospi *ospi = platform_get_drvdata(pdev);
668 mutex_destroy(&ospi->mlock);
672 { .compatible = "socionext,f-ospi" },
679 .name = "socionext,f-ospi",