Lines Matching refs:qspi

121 static inline unsigned long ti_qspi_read(struct ti_qspi *qspi,  in ti_qspi_read()  argument
124 return readl(qspi->base + reg); in ti_qspi_read()
127 static inline void ti_qspi_write(struct ti_qspi *qspi, in ti_qspi_write() argument
130 writel(val, qspi->base + reg); in ti_qspi_write()
135 struct ti_qspi *qspi = spi_master_get_devdata(spi->master); in ti_qspi_setup() local
136 struct ti_qspi_regs *ctx_reg = &qspi->ctx_reg; in ti_qspi_setup()
141 dev_dbg(qspi->dev, "master busy doing other trasnfers\n"); in ti_qspi_setup()
145 if (!qspi->spi_max_frequency) { in ti_qspi_setup()
146 dev_err(qspi->dev, "spi max frequency not defined\n"); in ti_qspi_setup()
150 clk_rate = clk_get_rate(qspi->fclk); in ti_qspi_setup()
152 clk_div = DIV_ROUND_UP(clk_rate, qspi->spi_max_frequency) - 1; in ti_qspi_setup()
155 dev_dbg(qspi->dev, "clock divider < 0, using /1 divider\n"); in ti_qspi_setup()
160 dev_dbg(qspi->dev, "clock divider >%d , using /%d divider\n", in ti_qspi_setup()
165 dev_dbg(qspi->dev, "hz: %d, clock divider %d\n", in ti_qspi_setup()
166 qspi->spi_max_frequency, clk_div); in ti_qspi_setup()
168 ret = pm_runtime_get_sync(qspi->dev); in ti_qspi_setup()
170 dev_err(qspi->dev, "pm_runtime_get_sync() failed\n"); in ti_qspi_setup()
174 clk_ctrl_reg = ti_qspi_read(qspi, QSPI_SPI_CLOCK_CNTRL_REG); in ti_qspi_setup()
179 ti_qspi_write(qspi, clk_ctrl_reg, QSPI_SPI_CLOCK_CNTRL_REG); in ti_qspi_setup()
183 ti_qspi_write(qspi, clk_mask, QSPI_SPI_CLOCK_CNTRL_REG); in ti_qspi_setup()
186 pm_runtime_mark_last_busy(qspi->dev); in ti_qspi_setup()
187 ret = pm_runtime_put_autosuspend(qspi->dev); in ti_qspi_setup()
189 dev_err(qspi->dev, "pm_runtime_put_autosuspend() failed\n"); in ti_qspi_setup()
196 static void ti_qspi_restore_ctx(struct ti_qspi *qspi) in ti_qspi_restore_ctx() argument
198 struct ti_qspi_regs *ctx_reg = &qspi->ctx_reg; in ti_qspi_restore_ctx()
200 ti_qspi_write(qspi, ctx_reg->clkctrl, QSPI_SPI_CLOCK_CNTRL_REG); in ti_qspi_restore_ctx()
203 static inline u32 qspi_is_busy(struct ti_qspi *qspi) in qspi_is_busy() argument
208 stat = ti_qspi_read(qspi, QSPI_SPI_STATUS_REG); in qspi_is_busy()
211 stat = ti_qspi_read(qspi, QSPI_SPI_STATUS_REG); in qspi_is_busy()
218 static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t) in qspi_write_msg() argument
225 cmd = qspi->cmd | QSPI_WR_SNGL; in qspi_write_msg()
230 if (qspi_is_busy(qspi)) in qspi_write_msg()
235 dev_dbg(qspi->dev, "tx cmd %08x dc %08x data %02x\n", in qspi_write_msg()
236 cmd, qspi->dc, *txbuf); in qspi_write_msg()
237 writeb(*txbuf, qspi->base + QSPI_SPI_DATA_REG); in qspi_write_msg()
240 dev_dbg(qspi->dev, "tx cmd %08x dc %08x data %04x\n", in qspi_write_msg()
241 cmd, qspi->dc, *txbuf); in qspi_write_msg()
242 writew(*((u16 *)txbuf), qspi->base + QSPI_SPI_DATA_REG); in qspi_write_msg()
245 dev_dbg(qspi->dev, "tx cmd %08x dc %08x data %08x\n", in qspi_write_msg()
246 cmd, qspi->dc, *txbuf); in qspi_write_msg()
247 writel(*((u32 *)txbuf), qspi->base + QSPI_SPI_DATA_REG); in qspi_write_msg()
251 ti_qspi_write(qspi, cmd, QSPI_SPI_CMD_REG); in qspi_write_msg()
252 if (!wait_for_completion_timeout(&qspi->transfer_complete, in qspi_write_msg()
254 dev_err(qspi->dev, "write timed out\n"); in qspi_write_msg()
264 static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t) in qspi_read_msg() argument
271 cmd = qspi->cmd; in qspi_read_msg()
287 dev_dbg(qspi->dev, "rx cmd %08x dc %08x\n", cmd, qspi->dc); in qspi_read_msg()
288 if (qspi_is_busy(qspi)) in qspi_read_msg()
291 ti_qspi_write(qspi, cmd, QSPI_SPI_CMD_REG); in qspi_read_msg()
292 if (!wait_for_completion_timeout(&qspi->transfer_complete, in qspi_read_msg()
294 dev_err(qspi->dev, "read timed out\n"); in qspi_read_msg()
299 *rxbuf = readb(qspi->base + QSPI_SPI_DATA_REG); in qspi_read_msg()
302 *((u16 *)rxbuf) = readw(qspi->base + QSPI_SPI_DATA_REG); in qspi_read_msg()
305 *((u32 *)rxbuf) = readl(qspi->base + QSPI_SPI_DATA_REG); in qspi_read_msg()
315 static int qspi_transfer_msg(struct ti_qspi *qspi, struct spi_transfer *t) in qspi_transfer_msg() argument
320 ret = qspi_write_msg(qspi, t); in qspi_transfer_msg()
322 dev_dbg(qspi->dev, "Error while writing\n"); in qspi_transfer_msg()
328 ret = qspi_read_msg(qspi, t); in qspi_transfer_msg()
330 dev_dbg(qspi->dev, "Error while reading\n"); in qspi_transfer_msg()
341 struct ti_qspi *qspi = spi_master_get_devdata(master); in ti_qspi_start_transfer_one() local
348 qspi->dc = 0; in ti_qspi_start_transfer_one()
351 qspi->dc |= QSPI_CKPHA(spi->chip_select); in ti_qspi_start_transfer_one()
353 qspi->dc |= QSPI_CKPOL(spi->chip_select); in ti_qspi_start_transfer_one()
355 qspi->dc |= QSPI_CSPOL(spi->chip_select); in ti_qspi_start_transfer_one()
362 qspi->cmd = 0; in ti_qspi_start_transfer_one()
363 qspi->cmd |= QSPI_EN_CS(spi->chip_select); in ti_qspi_start_transfer_one()
364 qspi->cmd |= QSPI_FLEN(frame_length); in ti_qspi_start_transfer_one()
365 qspi->cmd |= QSPI_WC_CMD_INT_EN; in ti_qspi_start_transfer_one()
367 ti_qspi_write(qspi, QSPI_WC_INT_EN, QSPI_INTR_ENABLE_SET_REG); in ti_qspi_start_transfer_one()
368 ti_qspi_write(qspi, qspi->dc, QSPI_SPI_DC_REG); in ti_qspi_start_transfer_one()
370 mutex_lock(&qspi->list_lock); in ti_qspi_start_transfer_one()
373 qspi->cmd |= QSPI_WLEN(t->bits_per_word); in ti_qspi_start_transfer_one()
375 ret = qspi_transfer_msg(qspi, t); in ti_qspi_start_transfer_one()
377 dev_dbg(qspi->dev, "transfer message failed\n"); in ti_qspi_start_transfer_one()
378 mutex_unlock(&qspi->list_lock); in ti_qspi_start_transfer_one()
385 mutex_unlock(&qspi->list_lock); in ti_qspi_start_transfer_one()
390 ti_qspi_write(qspi, qspi->cmd | QSPI_INVAL, QSPI_SPI_CMD_REG); in ti_qspi_start_transfer_one()
397 struct ti_qspi *qspi = dev_id; in ti_qspi_isr() local
403 int_stat = ti_qspi_read(qspi, QSPI_INTR_STATUS_ENABLED_CLEAR); in ti_qspi_isr()
404 stat = ti_qspi_read(qspi, QSPI_SPI_STATUS_REG); in ti_qspi_isr()
407 dev_dbg(qspi->dev, "No IRQ triggered\n"); in ti_qspi_isr()
412 ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, in ti_qspi_isr()
415 complete(&qspi->transfer_complete); in ti_qspi_isr()
422 struct ti_qspi *qspi; in ti_qspi_runtime_resume() local
424 qspi = dev_get_drvdata(dev); in ti_qspi_runtime_resume()
425 ti_qspi_restore_ctx(qspi); in ti_qspi_runtime_resume()
439 struct ti_qspi *qspi; in ti_qspi_probe() local
446 master = spi_alloc_master(&pdev->dev, sizeof(*qspi)); in ti_qspi_probe()
463 qspi = spi_master_get_devdata(master); in ti_qspi_probe()
464 qspi->master = master; in ti_qspi_probe()
465 qspi->dev = &pdev->dev; in ti_qspi_probe()
466 platform_set_drvdata(pdev, qspi); in ti_qspi_probe()
503 mutex_init(&qspi->list_lock); in ti_qspi_probe()
505 qspi->base = devm_ioremap_resource(&pdev->dev, r); in ti_qspi_probe()
506 if (IS_ERR(qspi->base)) { in ti_qspi_probe()
507 ret = PTR_ERR(qspi->base); in ti_qspi_probe()
512 qspi->ctrl_mod = true; in ti_qspi_probe()
513 qspi->ctrl_base = devm_ioremap_resource(&pdev->dev, res_ctrl); in ti_qspi_probe()
514 if (IS_ERR(qspi->ctrl_base)) { in ti_qspi_probe()
515 ret = PTR_ERR(qspi->ctrl_base); in ti_qspi_probe()
521 qspi->mmap_base = devm_ioremap_resource(&pdev->dev, res_mmap); in ti_qspi_probe()
522 if (IS_ERR(qspi->mmap_base)) { in ti_qspi_probe()
523 ret = PTR_ERR(qspi->mmap_base); in ti_qspi_probe()
529 dev_name(&pdev->dev), qspi); in ti_qspi_probe()
536 qspi->fclk = devm_clk_get(&pdev->dev, "fck"); in ti_qspi_probe()
537 if (IS_ERR(qspi->fclk)) { in ti_qspi_probe()
538 ret = PTR_ERR(qspi->fclk); in ti_qspi_probe()
542 init_completion(&qspi->transfer_complete); in ti_qspi_probe()
549 qspi->spi_max_frequency = max_freq; in ti_qspi_probe()
564 struct ti_qspi *qspi = platform_get_drvdata(pdev); in ti_qspi_remove() local
567 ret = pm_runtime_get_sync(qspi->dev); in ti_qspi_remove()
569 dev_err(qspi->dev, "pm_runtime_get_sync() failed\n"); in ti_qspi_remove()
573 ti_qspi_write(qspi, QSPI_WC_INT_DISABLE, QSPI_INTR_ENABLE_CLEAR_REG); in ti_qspi_remove()
575 pm_runtime_put(qspi->dev); in ti_qspi_remove()