Lines Matching refs:dspi
136 static inline int is_double_byte_mode(struct fsl_dspi *dspi) in is_double_byte_mode() argument
140 regmap_read(dspi->regmap, SPI_CTAR(dspi->cs), &val); in is_double_byte_mode()
216 static int dspi_transfer_write(struct fsl_dspi *dspi) in dspi_transfer_write() argument
225 tx_word = is_double_byte_mode(dspi); in dspi_transfer_write()
231 if (tx_word && (dspi->len == 1)) { in dspi_transfer_write()
232 dspi->dataflags |= TRAN_STATE_WORD_ODD_NUM; in dspi_transfer_write()
233 regmap_update_bits(dspi->regmap, SPI_CTAR(dspi->cs), in dspi_transfer_write()
238 while (dspi->len && (tx_count < DSPI_FIFO_SIZE)) { in dspi_transfer_write()
240 if (dspi->len == 1) in dspi_transfer_write()
243 if (!(dspi->dataflags & TRAN_STATE_TX_VOID)) { in dspi_transfer_write()
244 d16 = *(u16 *)dspi->tx; in dspi_transfer_write()
245 dspi->tx += 2; in dspi_transfer_write()
247 d16 = dspi->void_write_data; in dspi_transfer_write()
251 SPI_PUSHR_PCS(dspi->cs) | in dspi_transfer_write()
252 SPI_PUSHR_CTAS(dspi->cs) | in dspi_transfer_write()
255 dspi->len -= 2; in dspi_transfer_write()
257 if (!(dspi->dataflags & TRAN_STATE_TX_VOID)) { in dspi_transfer_write()
259 d8 = *(u8 *)dspi->tx; in dspi_transfer_write()
260 dspi->tx++; in dspi_transfer_write()
262 d8 = (u8)dspi->void_write_data; in dspi_transfer_write()
266 SPI_PUSHR_PCS(dspi->cs) | in dspi_transfer_write()
267 SPI_PUSHR_CTAS(dspi->cs) | in dspi_transfer_write()
270 dspi->len--; in dspi_transfer_write()
273 if (dspi->len == 0 || tx_count == DSPI_FIFO_SIZE - 1) { in dspi_transfer_write()
276 if ((dspi->cs_change) && (!dspi->len)) in dspi_transfer_write()
278 } else if (tx_word && (dspi->len == 1)) in dspi_transfer_write()
286 regmap_write(dspi->regmap, SPI_PUSHR, dspi_pushr); in dspi_transfer_write()
294 static int dspi_transfer_read(struct fsl_dspi *dspi) in dspi_transfer_read() argument
297 int rx_word = is_double_byte_mode(dspi); in dspi_transfer_read()
300 while ((dspi->rx < dspi->rx_end) in dspi_transfer_read()
305 if ((dspi->rx_end - dspi->rx) == 1) in dspi_transfer_read()
308 regmap_read(dspi->regmap, SPI_POPR, &val); in dspi_transfer_read()
311 if (!(dspi->dataflags & TRAN_STATE_RX_VOID)) in dspi_transfer_read()
312 *(u16 *)dspi->rx = d; in dspi_transfer_read()
313 dspi->rx += 2; in dspi_transfer_read()
318 regmap_read(dspi->regmap, SPI_POPR, &val); in dspi_transfer_read()
320 if (!(dspi->dataflags & TRAN_STATE_RX_VOID)) in dspi_transfer_read()
321 *(u8 *)dspi->rx = d; in dspi_transfer_read()
322 dspi->rx++; in dspi_transfer_read()
333 struct fsl_dspi *dspi = spi_master_get_devdata(master); in dspi_transfer_one_message() local
340 dspi->cur_transfer = transfer; in dspi_transfer_one_message()
341 dspi->cur_msg = message; in dspi_transfer_one_message()
342 dspi->cur_chip = spi_get_ctldata(spi); in dspi_transfer_one_message()
343 dspi->cs = spi->chip_select; in dspi_transfer_one_message()
344 if (dspi->cur_transfer->transfer_list.next in dspi_transfer_one_message()
345 == &dspi->cur_msg->transfers) in dspi_transfer_one_message()
347 dspi->cs_change = transfer->cs_change; in dspi_transfer_one_message()
348 dspi->void_write_data = dspi->cur_chip->void_write_data; in dspi_transfer_one_message()
350 dspi->dataflags = 0; in dspi_transfer_one_message()
351 dspi->tx = (void *)transfer->tx_buf; in dspi_transfer_one_message()
352 dspi->tx_end = dspi->tx + transfer->len; in dspi_transfer_one_message()
353 dspi->rx = transfer->rx_buf; in dspi_transfer_one_message()
354 dspi->rx_end = dspi->rx + transfer->len; in dspi_transfer_one_message()
355 dspi->len = transfer->len; in dspi_transfer_one_message()
357 if (!dspi->rx) in dspi_transfer_one_message()
358 dspi->dataflags |= TRAN_STATE_RX_VOID; in dspi_transfer_one_message()
360 if (!dspi->tx) in dspi_transfer_one_message()
361 dspi->dataflags |= TRAN_STATE_TX_VOID; in dspi_transfer_one_message()
363 regmap_write(dspi->regmap, SPI_MCR, dspi->cur_chip->mcr_val); in dspi_transfer_one_message()
364 regmap_update_bits(dspi->regmap, SPI_MCR, in dspi_transfer_one_message()
367 regmap_write(dspi->regmap, SPI_CTAR(dspi->cs), in dspi_transfer_one_message()
368 dspi->cur_chip->ctar_val); in dspi_transfer_one_message()
370 regmap_write(dspi->regmap, SPI_CTAR(dspi->cs), in dspi_transfer_one_message()
371 dspi->cur_chip->ctar_val); in dspi_transfer_one_message()
373 regmap_write(dspi->regmap, SPI_RSER, SPI_RSER_EOQFE); in dspi_transfer_one_message()
374 message->actual_length += dspi_transfer_write(dspi); in dspi_transfer_one_message()
376 if (wait_event_interruptible(dspi->waitq, dspi->waitflags)) in dspi_transfer_one_message()
377 dev_err(&dspi->pdev->dev, "wait transfer complete fail!\n"); in dspi_transfer_one_message()
378 dspi->waitflags = 0; in dspi_transfer_one_message()
393 struct fsl_dspi *dspi = spi_master_get_devdata(spi->master); in dspi_setup() local
425 clkrate = clk_get_rate(dspi->clk); in dspi_setup()
462 struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; in dspi_interrupt() local
464 struct spi_message *msg = dspi->cur_msg; in dspi_interrupt()
466 regmap_write(dspi->regmap, SPI_SR, SPI_SR_EOQF); in dspi_interrupt()
467 dspi_transfer_read(dspi); in dspi_interrupt()
469 if (!dspi->len) { in dspi_interrupt()
470 if (dspi->dataflags & TRAN_STATE_WORD_ODD_NUM) in dspi_interrupt()
471 regmap_update_bits(dspi->regmap, SPI_CTAR(dspi->cs), in dspi_interrupt()
474 dspi->waitflags = 1; in dspi_interrupt()
475 wake_up_interruptible(&dspi->waitq); in dspi_interrupt()
477 msg->actual_length += dspi_transfer_write(dspi); in dspi_interrupt()
492 struct fsl_dspi *dspi = spi_master_get_devdata(master); in dspi_suspend() local
495 clk_disable_unprepare(dspi->clk); in dspi_suspend()
503 struct fsl_dspi *dspi = spi_master_get_devdata(master); in dspi_resume() local
505 clk_prepare_enable(dspi->clk); in dspi_resume()
525 struct fsl_dspi *dspi; in dspi_probe() local
534 dspi = spi_master_get_devdata(master); in dspi_probe()
535 dspi->pdev = pdev; in dspi_probe()
536 dspi->master = master; in dspi_probe()
569 dspi->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "dspi", base, in dspi_probe()
571 if (IS_ERR(dspi->regmap)) { in dspi_probe()
573 PTR_ERR(dspi->regmap)); in dspi_probe()
574 return PTR_ERR(dspi->regmap); in dspi_probe()
577 dspi->irq = platform_get_irq(pdev, 0); in dspi_probe()
578 if (dspi->irq < 0) { in dspi_probe()
580 ret = dspi->irq; in dspi_probe()
584 ret = devm_request_irq(&pdev->dev, dspi->irq, dspi_interrupt, 0, in dspi_probe()
585 pdev->name, dspi); in dspi_probe()
591 dspi->clk = devm_clk_get(&pdev->dev, "dspi"); in dspi_probe()
592 if (IS_ERR(dspi->clk)) { in dspi_probe()
593 ret = PTR_ERR(dspi->clk); in dspi_probe()
597 clk_prepare_enable(dspi->clk); in dspi_probe()
599 init_waitqueue_head(&dspi->waitq); in dspi_probe()
611 clk_disable_unprepare(dspi->clk); in dspi_probe()
621 struct fsl_dspi *dspi = spi_master_get_devdata(master); in dspi_remove() local
624 clk_disable_unprepare(dspi->clk); in dspi_remove()
625 spi_unregister_master(dspi->master); in dspi_remove()
626 spi_master_put(dspi->master); in dspi_remove()