Lines Matching refs:mdata
122 static void mtk_spi_reset(struct mtk_spi *mdata) in mtk_spi_reset() argument
127 reg_val = readl(mdata->base + SPI_CMD_REG); in mtk_spi_reset()
129 writel(reg_val, mdata->base + SPI_CMD_REG); in mtk_spi_reset()
131 reg_val = readl(mdata->base + SPI_CMD_REG); in mtk_spi_reset()
133 writel(reg_val, mdata->base + SPI_CMD_REG); in mtk_spi_reset()
143 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_prepare_message() local
148 reg_val = readl(mdata->base + SPI_CMD_REG); in mtk_spi_prepare_message()
157 writel(reg_val, mdata->base + SPI_CMD_REG); in mtk_spi_prepare_message()
159 reg_val = readl(mdata->base + SPI_CMD_REG); in mtk_spi_prepare_message()
189 writel(reg_val, mdata->base + SPI_CMD_REG); in mtk_spi_prepare_message()
192 if (mdata->dev_comp->need_pad_sel) in mtk_spi_prepare_message()
193 writel(mdata->pad_sel[spi->chip_select], in mtk_spi_prepare_message()
194 mdata->base + SPI_PAD_SEL_REG); in mtk_spi_prepare_message()
202 struct mtk_spi *mdata = spi_master_get_devdata(spi->master); in mtk_spi_set_cs() local
204 reg_val = readl(mdata->base + SPI_CMD_REG); in mtk_spi_set_cs()
207 writel(reg_val, mdata->base + SPI_CMD_REG); in mtk_spi_set_cs()
210 writel(reg_val, mdata->base + SPI_CMD_REG); in mtk_spi_set_cs()
211 mdata->state = MTK_SPI_IDLE; in mtk_spi_set_cs()
212 mtk_spi_reset(mdata); in mtk_spi_set_cs()
220 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_prepare_transfer() local
222 spi_clk_hz = clk_get_rate(mdata->spi_clk); in mtk_spi_prepare_transfer()
235 writel(reg_val, mdata->base + SPI_CFG0_REG); in mtk_spi_prepare_transfer()
237 reg_val = readl(mdata->base + SPI_CFG1_REG); in mtk_spi_prepare_transfer()
240 writel(reg_val, mdata->base + SPI_CFG1_REG); in mtk_spi_prepare_transfer()
246 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_setup_packet() local
248 packet_size = min_t(u32, mdata->xfer_len, MTK_SPI_PACKET_SIZE); in mtk_spi_setup_packet()
249 packet_loop = mdata->xfer_len / packet_size; in mtk_spi_setup_packet()
251 reg_val = readl(mdata->base + SPI_CFG1_REG); in mtk_spi_setup_packet()
255 writel(reg_val, mdata->base + SPI_CFG1_REG); in mtk_spi_setup_packet()
261 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_enable_transfer() local
263 cmd = readl(mdata->base + SPI_CMD_REG); in mtk_spi_enable_transfer()
264 if (mdata->state == MTK_SPI_IDLE) in mtk_spi_enable_transfer()
268 writel(cmd, mdata->base + SPI_CMD_REG); in mtk_spi_enable_transfer()
286 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_update_mdata_len() local
288 if (mdata->tx_sgl_len && mdata->rx_sgl_len) { in mtk_spi_update_mdata_len()
289 if (mdata->tx_sgl_len > mdata->rx_sgl_len) { in mtk_spi_update_mdata_len()
290 mult_delta = mtk_spi_get_mult_delta(mdata->rx_sgl_len); in mtk_spi_update_mdata_len()
291 mdata->xfer_len = mdata->rx_sgl_len - mult_delta; in mtk_spi_update_mdata_len()
292 mdata->rx_sgl_len = mult_delta; in mtk_spi_update_mdata_len()
293 mdata->tx_sgl_len -= mdata->xfer_len; in mtk_spi_update_mdata_len()
295 mult_delta = mtk_spi_get_mult_delta(mdata->tx_sgl_len); in mtk_spi_update_mdata_len()
296 mdata->xfer_len = mdata->tx_sgl_len - mult_delta; in mtk_spi_update_mdata_len()
297 mdata->tx_sgl_len = mult_delta; in mtk_spi_update_mdata_len()
298 mdata->rx_sgl_len -= mdata->xfer_len; in mtk_spi_update_mdata_len()
300 } else if (mdata->tx_sgl_len) { in mtk_spi_update_mdata_len()
301 mult_delta = mtk_spi_get_mult_delta(mdata->tx_sgl_len); in mtk_spi_update_mdata_len()
302 mdata->xfer_len = mdata->tx_sgl_len - mult_delta; in mtk_spi_update_mdata_len()
303 mdata->tx_sgl_len = mult_delta; in mtk_spi_update_mdata_len()
304 } else if (mdata->rx_sgl_len) { in mtk_spi_update_mdata_len()
305 mult_delta = mtk_spi_get_mult_delta(mdata->rx_sgl_len); in mtk_spi_update_mdata_len()
306 mdata->xfer_len = mdata->rx_sgl_len - mult_delta; in mtk_spi_update_mdata_len()
307 mdata->rx_sgl_len = mult_delta; in mtk_spi_update_mdata_len()
314 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_setup_dma_addr() local
316 if (mdata->tx_sgl) in mtk_spi_setup_dma_addr()
317 writel(xfer->tx_dma, mdata->base + SPI_TX_SRC_REG); in mtk_spi_setup_dma_addr()
318 if (mdata->rx_sgl) in mtk_spi_setup_dma_addr()
319 writel(xfer->rx_dma, mdata->base + SPI_RX_DST_REG); in mtk_spi_setup_dma_addr()
327 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_fifo_transfer() local
329 mdata->cur_transfer = xfer; in mtk_spi_fifo_transfer()
330 mdata->xfer_len = xfer->len; in mtk_spi_fifo_transfer()
338 iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt); in mtk_spi_fifo_transfer()
350 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_dma_transfer() local
352 mdata->tx_sgl = NULL; in mtk_spi_dma_transfer()
353 mdata->rx_sgl = NULL; in mtk_spi_dma_transfer()
354 mdata->tx_sgl_len = 0; in mtk_spi_dma_transfer()
355 mdata->rx_sgl_len = 0; in mtk_spi_dma_transfer()
356 mdata->cur_transfer = xfer; in mtk_spi_dma_transfer()
360 cmd = readl(mdata->base + SPI_CMD_REG); in mtk_spi_dma_transfer()
365 writel(cmd, mdata->base + SPI_CMD_REG); in mtk_spi_dma_transfer()
368 mdata->tx_sgl = xfer->tx_sg.sgl; in mtk_spi_dma_transfer()
370 mdata->rx_sgl = xfer->rx_sg.sgl; in mtk_spi_dma_transfer()
372 if (mdata->tx_sgl) { in mtk_spi_dma_transfer()
373 xfer->tx_dma = sg_dma_address(mdata->tx_sgl); in mtk_spi_dma_transfer()
374 mdata->tx_sgl_len = sg_dma_len(mdata->tx_sgl); in mtk_spi_dma_transfer()
376 if (mdata->rx_sgl) { in mtk_spi_dma_transfer()
377 xfer->rx_dma = sg_dma_address(mdata->rx_sgl); in mtk_spi_dma_transfer()
378 mdata->rx_sgl_len = sg_dma_len(mdata->rx_sgl); in mtk_spi_dma_transfer()
408 struct mtk_spi *mdata = spi_master_get_devdata(spi->master); in mtk_spi_setup() local
413 if (mdata->dev_comp->need_pad_sel && gpio_is_valid(spi->cs_gpio)) in mtk_spi_setup()
423 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_interrupt() local
424 struct spi_transfer *trans = mdata->cur_transfer; in mtk_spi_interrupt()
426 reg_val = readl(mdata->base + SPI_STATUS0_REG); in mtk_spi_interrupt()
428 mdata->state = MTK_SPI_PAUSED; in mtk_spi_interrupt()
430 mdata->state = MTK_SPI_IDLE; in mtk_spi_interrupt()
434 if (mdata->xfer_len % 4) in mtk_spi_interrupt()
435 cnt = mdata->xfer_len / 4 + 1; in mtk_spi_interrupt()
437 cnt = mdata->xfer_len / 4; in mtk_spi_interrupt()
438 ioread32_rep(mdata->base + SPI_RX_DATA_REG, in mtk_spi_interrupt()
445 if (mdata->tx_sgl) in mtk_spi_interrupt()
446 trans->tx_dma += mdata->xfer_len; in mtk_spi_interrupt()
447 if (mdata->rx_sgl) in mtk_spi_interrupt()
448 trans->rx_dma += mdata->xfer_len; in mtk_spi_interrupt()
450 if (mdata->tx_sgl && (mdata->tx_sgl_len == 0)) { in mtk_spi_interrupt()
451 mdata->tx_sgl = sg_next(mdata->tx_sgl); in mtk_spi_interrupt()
452 if (mdata->tx_sgl) { in mtk_spi_interrupt()
453 trans->tx_dma = sg_dma_address(mdata->tx_sgl); in mtk_spi_interrupt()
454 mdata->tx_sgl_len = sg_dma_len(mdata->tx_sgl); in mtk_spi_interrupt()
457 if (mdata->rx_sgl && (mdata->rx_sgl_len == 0)) { in mtk_spi_interrupt()
458 mdata->rx_sgl = sg_next(mdata->rx_sgl); in mtk_spi_interrupt()
459 if (mdata->rx_sgl) { in mtk_spi_interrupt()
460 trans->rx_dma = sg_dma_address(mdata->rx_sgl); in mtk_spi_interrupt()
461 mdata->rx_sgl_len = sg_dma_len(mdata->rx_sgl); in mtk_spi_interrupt()
465 if (!mdata->tx_sgl && !mdata->rx_sgl) { in mtk_spi_interrupt()
467 cmd = readl(mdata->base + SPI_CMD_REG); in mtk_spi_interrupt()
470 writel(cmd, mdata->base + SPI_CMD_REG); in mtk_spi_interrupt()
487 struct mtk_spi *mdata; in mtk_spi_probe() local
492 master = spi_alloc_master(&pdev->dev, sizeof(*mdata)); in mtk_spi_probe()
515 mdata = spi_master_get_devdata(master); in mtk_spi_probe()
516 mdata->dev_comp = of_id->data; in mtk_spi_probe()
517 if (mdata->dev_comp->must_tx) in mtk_spi_probe()
520 if (mdata->dev_comp->need_pad_sel) { in mtk_spi_probe()
521 mdata->pad_num = of_property_count_u32_elems( in mtk_spi_probe()
524 if (mdata->pad_num < 0) { in mtk_spi_probe()
531 mdata->pad_sel = devm_kmalloc_array(&pdev->dev, mdata->pad_num, in mtk_spi_probe()
533 if (!mdata->pad_sel) { in mtk_spi_probe()
538 for (i = 0; i < mdata->pad_num; i++) { in mtk_spi_probe()
541 i, &mdata->pad_sel[i]); in mtk_spi_probe()
542 if (mdata->pad_sel[i] > MT8173_SPI_MAX_PAD_SEL) { in mtk_spi_probe()
544 i, mdata->pad_sel[i]); in mtk_spi_probe()
560 mdata->base = devm_ioremap_resource(&pdev->dev, res); in mtk_spi_probe()
561 if (IS_ERR(mdata->base)) { in mtk_spi_probe()
562 ret = PTR_ERR(mdata->base); in mtk_spi_probe()
583 mdata->parent_clk = devm_clk_get(&pdev->dev, "parent-clk"); in mtk_spi_probe()
584 if (IS_ERR(mdata->parent_clk)) { in mtk_spi_probe()
585 ret = PTR_ERR(mdata->parent_clk); in mtk_spi_probe()
590 mdata->sel_clk = devm_clk_get(&pdev->dev, "sel-clk"); in mtk_spi_probe()
591 if (IS_ERR(mdata->sel_clk)) { in mtk_spi_probe()
592 ret = PTR_ERR(mdata->sel_clk); in mtk_spi_probe()
597 mdata->spi_clk = devm_clk_get(&pdev->dev, "spi-clk"); in mtk_spi_probe()
598 if (IS_ERR(mdata->spi_clk)) { in mtk_spi_probe()
599 ret = PTR_ERR(mdata->spi_clk); in mtk_spi_probe()
604 ret = clk_prepare_enable(mdata->spi_clk); in mtk_spi_probe()
610 ret = clk_set_parent(mdata->sel_clk, mdata->parent_clk); in mtk_spi_probe()
616 clk_disable_unprepare(mdata->spi_clk); in mtk_spi_probe()
626 if (mdata->dev_comp->need_pad_sel) { in mtk_spi_probe()
627 if (mdata->pad_num != master->num_chipselect) { in mtk_spi_probe()
630 mdata->pad_num, master->num_chipselect); in mtk_spi_probe()
659 clk_disable_unprepare(mdata->spi_clk); in mtk_spi_probe()
669 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_remove() local
673 mtk_spi_reset(mdata); in mtk_spi_remove()
684 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_suspend() local
691 clk_disable_unprepare(mdata->spi_clk); in mtk_spi_suspend()
700 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_resume() local
703 ret = clk_prepare_enable(mdata->spi_clk); in mtk_spi_resume()
712 clk_disable_unprepare(mdata->spi_clk); in mtk_spi_resume()
722 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_runtime_suspend() local
724 clk_disable_unprepare(mdata->spi_clk); in mtk_spi_runtime_suspend()
732 struct mtk_spi *mdata = spi_master_get_devdata(master); in mtk_spi_runtime_resume() local
735 ret = clk_prepare_enable(mdata->spi_clk); in mtk_spi_runtime_resume()