tspi 227 drivers/spi/spi-tegra114.c static inline u32 tegra_spi_readl(struct tegra_spi_data *tspi, tspi 230 drivers/spi/spi-tegra114.c return readl(tspi->base + reg); tspi 233 drivers/spi/spi-tegra114.c static inline void tegra_spi_writel(struct tegra_spi_data *tspi, tspi 236 drivers/spi/spi-tegra114.c writel(val, tspi->base + reg); tspi 240 drivers/spi/spi-tegra114.c readl(tspi->base + SPI_COMMAND1); tspi 243 drivers/spi/spi-tegra114.c static void tegra_spi_clear_status(struct tegra_spi_data *tspi) tspi 248 drivers/spi/spi-tegra114.c val = tegra_spi_readl(tspi, SPI_TRANS_STATUS); tspi 249 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, val, SPI_TRANS_STATUS); tspi 252 drivers/spi/spi-tegra114.c val = tegra_spi_readl(tspi, SPI_FIFO_STATUS); tspi 254 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, SPI_ERR | SPI_FIFO_ERROR, tspi 259 drivers/spi/spi-tegra114.c struct spi_device *spi, struct tegra_spi_data *tspi, tspi 262 drivers/spi/spi-tegra114.c unsigned remain_len = t->len - tspi->cur_pos; tspi 268 drivers/spi/spi-tegra114.c tspi->bytes_per_word = DIV_ROUND_UP(bits_per_word, 8); tspi 272 drivers/spi/spi-tegra114.c tspi->is_packed = 1; tspi 273 drivers/spi/spi-tegra114.c tspi->words_per_32bit = 32/bits_per_word; tspi 275 drivers/spi/spi-tegra114.c tspi->is_packed = 0; tspi 276 drivers/spi/spi-tegra114.c tspi->words_per_32bit = 1; tspi 279 drivers/spi/spi-tegra114.c if (tspi->is_packed) { tspi 280 drivers/spi/spi-tegra114.c max_len = min(remain_len, tspi->max_buf_size); tspi 281 drivers/spi/spi-tegra114.c tspi->curr_dma_words = max_len/tspi->bytes_per_word; tspi 284 drivers/spi/spi-tegra114.c max_word = (remain_len - 1) / tspi->bytes_per_word + 1; tspi 285 drivers/spi/spi-tegra114.c max_word = min(max_word, tspi->max_buf_size/4); tspi 286 drivers/spi/spi-tegra114.c tspi->curr_dma_words = max_word; tspi 293 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi, struct spi_transfer *t) tspi 302 drivers/spi/spi-tegra114.c u8 *tx_buf = (u8 *)t->tx_buf + tspi->cur_tx_pos; tspi 304 drivers/spi/spi-tegra114.c fifo_status = tegra_spi_readl(tspi, SPI_FIFO_STATUS); tspi 307 drivers/spi/spi-tegra114.c if (tspi->is_packed) { tspi 308 drivers/spi/spi-tegra114.c fifo_words_left = tx_empty_count * tspi->words_per_32bit; tspi 309 drivers/spi/spi-tegra114.c written_words = min(fifo_words_left, tspi->curr_dma_words); tspi 310 drivers/spi/spi-tegra114.c nbytes = written_words * tspi->bytes_per_word; tspi 317 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, x, SPI_TX_FIFO); tspi 320 drivers/spi/spi-tegra114.c tspi->cur_tx_pos += written_words * tspi->bytes_per_word; tspi 323 drivers/spi/spi-tegra114.c max_n_32bit = min(tspi->curr_dma_words, tx_empty_count); tspi 325 drivers/spi/spi-tegra114.c nbytes = written_words * tspi->bytes_per_word; tspi 326 drivers/spi/spi-tegra114.c if (nbytes > t->len - tspi->cur_pos) tspi 327 drivers/spi/spi-tegra114.c nbytes = t->len - tspi->cur_pos; tspi 332 drivers/spi/spi-tegra114.c for (i = 0; nbytes && (i < tspi->bytes_per_word); tspi 335 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, x, SPI_TX_FIFO); tspi 338 drivers/spi/spi-tegra114.c tspi->cur_tx_pos += write_bytes; tspi 345 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi, struct spi_transfer *t) tspi 352 drivers/spi/spi-tegra114.c u8 *rx_buf = (u8 *)t->rx_buf + tspi->cur_rx_pos; tspi 354 drivers/spi/spi-tegra114.c fifo_status = tegra_spi_readl(tspi, SPI_FIFO_STATUS); tspi 356 drivers/spi/spi-tegra114.c if (tspi->is_packed) { tspi 357 drivers/spi/spi-tegra114.c len = tspi->curr_dma_words * tspi->bytes_per_word; tspi 359 drivers/spi/spi-tegra114.c u32 x = tegra_spi_readl(tspi, SPI_RX_FIFO); tspi 364 drivers/spi/spi-tegra114.c read_words += tspi->curr_dma_words; tspi 365 drivers/spi/spi-tegra114.c tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; tspi 368 drivers/spi/spi-tegra114.c u8 bytes_per_word = tspi->bytes_per_word; tspi 372 drivers/spi/spi-tegra114.c if (len > t->len - tspi->cur_pos) tspi 373 drivers/spi/spi-tegra114.c len = t->len - tspi->cur_pos; tspi 376 drivers/spi/spi-tegra114.c u32 x = tegra_spi_readl(tspi, SPI_RX_FIFO) & rx_mask; tspi 382 drivers/spi/spi-tegra114.c tspi->cur_rx_pos += read_bytes; tspi 389 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi, struct spi_transfer *t) tspi 392 drivers/spi/spi-tegra114.c dma_sync_single_for_cpu(tspi->dev, tspi->tx_dma_phys, tspi 393 drivers/spi/spi-tegra114.c tspi->dma_buf_size, DMA_TO_DEVICE); tspi 395 drivers/spi/spi-tegra114.c if (tspi->is_packed) { tspi 396 drivers/spi/spi-tegra114.c unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; tspi 398 drivers/spi/spi-tegra114.c memcpy(tspi->tx_dma_buf, t->tx_buf + tspi->cur_pos, len); tspi 399 drivers/spi/spi-tegra114.c tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; tspi 403 drivers/spi/spi-tegra114.c u8 *tx_buf = (u8 *)t->tx_buf + tspi->cur_tx_pos; tspi 404 drivers/spi/spi-tegra114.c unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; tspi 407 drivers/spi/spi-tegra114.c if (consume > t->len - tspi->cur_pos) tspi 408 drivers/spi/spi-tegra114.c consume = t->len - tspi->cur_pos; tspi 410 drivers/spi/spi-tegra114.c for (count = 0; count < tspi->curr_dma_words; count++) { tspi 413 drivers/spi/spi-tegra114.c for (i = 0; consume && (i < tspi->bytes_per_word); tspi 416 drivers/spi/spi-tegra114.c tspi->tx_dma_buf[count] = x; tspi 419 drivers/spi/spi-tegra114.c tspi->cur_tx_pos += write_bytes; tspi 423 drivers/spi/spi-tegra114.c dma_sync_single_for_device(tspi->dev, tspi->tx_dma_phys, tspi 424 drivers/spi/spi-tegra114.c tspi->dma_buf_size, DMA_TO_DEVICE); tspi 428 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi, struct spi_transfer *t) tspi 431 drivers/spi/spi-tegra114.c dma_sync_single_for_cpu(tspi->dev, tspi->rx_dma_phys, tspi 432 drivers/spi/spi-tegra114.c tspi->dma_buf_size, DMA_FROM_DEVICE); tspi 434 drivers/spi/spi-tegra114.c if (tspi->is_packed) { tspi 435 drivers/spi/spi-tegra114.c unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; tspi 437 drivers/spi/spi-tegra114.c memcpy(t->rx_buf + tspi->cur_rx_pos, tspi->rx_dma_buf, len); tspi 438 drivers/spi/spi-tegra114.c tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; tspi 442 drivers/spi/spi-tegra114.c unsigned char *rx_buf = t->rx_buf + tspi->cur_rx_pos; tspi 444 drivers/spi/spi-tegra114.c unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; tspi 447 drivers/spi/spi-tegra114.c if (consume > t->len - tspi->cur_pos) tspi 448 drivers/spi/spi-tegra114.c consume = t->len - tspi->cur_pos; tspi 450 drivers/spi/spi-tegra114.c for (count = 0; count < tspi->curr_dma_words; count++) { tspi 451 drivers/spi/spi-tegra114.c u32 x = tspi->rx_dma_buf[count] & rx_mask; tspi 453 drivers/spi/spi-tegra114.c for (i = 0; consume && (i < tspi->bytes_per_word); tspi 458 drivers/spi/spi-tegra114.c tspi->cur_rx_pos += read_bytes; tspi 462 drivers/spi/spi-tegra114.c dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, tspi 463 drivers/spi/spi-tegra114.c tspi->dma_buf_size, DMA_FROM_DEVICE); tspi 473 drivers/spi/spi-tegra114.c static int tegra_spi_start_tx_dma(struct tegra_spi_data *tspi, int len) tspi 475 drivers/spi/spi-tegra114.c reinit_completion(&tspi->tx_dma_complete); tspi 476 drivers/spi/spi-tegra114.c tspi->tx_dma_desc = dmaengine_prep_slave_single(tspi->tx_dma_chan, tspi 477 drivers/spi/spi-tegra114.c tspi->tx_dma_phys, len, DMA_MEM_TO_DEV, tspi 479 drivers/spi/spi-tegra114.c if (!tspi->tx_dma_desc) { tspi 480 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "Not able to get desc for Tx\n"); tspi 484 drivers/spi/spi-tegra114.c tspi->tx_dma_desc->callback = tegra_spi_dma_complete; tspi 485 drivers/spi/spi-tegra114.c tspi->tx_dma_desc->callback_param = &tspi->tx_dma_complete; tspi 487 drivers/spi/spi-tegra114.c dmaengine_submit(tspi->tx_dma_desc); tspi 488 drivers/spi/spi-tegra114.c dma_async_issue_pending(tspi->tx_dma_chan); tspi 492 drivers/spi/spi-tegra114.c static int tegra_spi_start_rx_dma(struct tegra_spi_data *tspi, int len) tspi 494 drivers/spi/spi-tegra114.c reinit_completion(&tspi->rx_dma_complete); tspi 495 drivers/spi/spi-tegra114.c tspi->rx_dma_desc = dmaengine_prep_slave_single(tspi->rx_dma_chan, tspi 496 drivers/spi/spi-tegra114.c tspi->rx_dma_phys, len, DMA_DEV_TO_MEM, tspi 498 drivers/spi/spi-tegra114.c if (!tspi->rx_dma_desc) { tspi 499 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "Not able to get desc for Rx\n"); tspi 503 drivers/spi/spi-tegra114.c tspi->rx_dma_desc->callback = tegra_spi_dma_complete; tspi 504 drivers/spi/spi-tegra114.c tspi->rx_dma_desc->callback_param = &tspi->rx_dma_complete; tspi 506 drivers/spi/spi-tegra114.c dmaengine_submit(tspi->rx_dma_desc); tspi 507 drivers/spi/spi-tegra114.c dma_async_issue_pending(tspi->rx_dma_chan); tspi 511 drivers/spi/spi-tegra114.c static int tegra_spi_flush_fifos(struct tegra_spi_data *tspi) tspi 516 drivers/spi/spi-tegra114.c status = tegra_spi_readl(tspi, SPI_FIFO_STATUS); tspi 519 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, status, SPI_FIFO_STATUS); tspi 521 drivers/spi/spi-tegra114.c status = tegra_spi_readl(tspi, SPI_FIFO_STATUS); tspi 523 drivers/spi/spi-tegra114.c dev_err(tspi->dev, tspi 536 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi, struct spi_transfer *t) tspi 544 drivers/spi/spi-tegra114.c val = SPI_DMA_BLK_SET(tspi->curr_dma_words - 1); tspi 545 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, val, SPI_DMA_BLK); tspi 547 drivers/spi/spi-tegra114.c if (tspi->is_packed) tspi 548 drivers/spi/spi-tegra114.c len = DIV_ROUND_UP(tspi->curr_dma_words * tspi->bytes_per_word, tspi 551 drivers/spi/spi-tegra114.c len = tspi->curr_dma_words * 4; tspi 565 drivers/spi/spi-tegra114.c if (!tspi->soc_data->has_intr_mask_reg) { tspi 566 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_TX) tspi 569 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_RX) tspi 573 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, val, SPI_DMA_CTL); tspi 574 drivers/spi/spi-tegra114.c tspi->dma_control_reg = val; tspi 577 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_TX) { tspi 578 drivers/spi/spi-tegra114.c dma_sconfig.dst_addr = tspi->phys + SPI_TX_FIFO; tspi 581 drivers/spi/spi-tegra114.c ret = dmaengine_slave_config(tspi->tx_dma_chan, &dma_sconfig); tspi 583 drivers/spi/spi-tegra114.c dev_err(tspi->dev, tspi 588 drivers/spi/spi-tegra114.c tegra_spi_copy_client_txbuf_to_spi_txbuf(tspi, t); tspi 589 drivers/spi/spi-tegra114.c ret = tegra_spi_start_tx_dma(tspi, len); tspi 591 drivers/spi/spi-tegra114.c dev_err(tspi->dev, tspi 597 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_RX) { tspi 598 drivers/spi/spi-tegra114.c dma_sconfig.src_addr = tspi->phys + SPI_RX_FIFO; tspi 601 drivers/spi/spi-tegra114.c ret = dmaengine_slave_config(tspi->rx_dma_chan, &dma_sconfig); tspi 603 drivers/spi/spi-tegra114.c dev_err(tspi->dev, tspi 609 drivers/spi/spi-tegra114.c dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, tspi 610 drivers/spi/spi-tegra114.c tspi->dma_buf_size, DMA_FROM_DEVICE); tspi 612 drivers/spi/spi-tegra114.c ret = tegra_spi_start_rx_dma(tspi, len); tspi 614 drivers/spi/spi-tegra114.c dev_err(tspi->dev, tspi 616 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_TX) tspi 617 drivers/spi/spi-tegra114.c dmaengine_terminate_all(tspi->tx_dma_chan); tspi 621 drivers/spi/spi-tegra114.c tspi->is_curr_dma_xfer = true; tspi 622 drivers/spi/spi-tegra114.c tspi->dma_control_reg = val; tspi 625 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, val, SPI_DMA_CTL); tspi 630 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi, struct spi_transfer *t) tspi 635 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_TX) tspi 636 drivers/spi/spi-tegra114.c cur_words = tegra_spi_fill_tx_fifo_from_client_txbuf(tspi, t); tspi 638 drivers/spi/spi-tegra114.c cur_words = tspi->curr_dma_words; tspi 641 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, val, SPI_DMA_BLK); tspi 644 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_TX) tspi 647 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_RX) tspi 650 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, val, SPI_DMA_CTL); tspi 651 drivers/spi/spi-tegra114.c tspi->dma_control_reg = val; tspi 653 drivers/spi/spi-tegra114.c tspi->is_curr_dma_xfer = false; tspi 655 drivers/spi/spi-tegra114.c val = tspi->command1_reg; tspi 657 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, val, SPI_COMMAND1); tspi 661 drivers/spi/spi-tegra114.c static int tegra_spi_init_dma_param(struct tegra_spi_data *tspi, tspi 669 drivers/spi/spi-tegra114.c dma_chan = dma_request_slave_channel_reason(tspi->dev, tspi 674 drivers/spi/spi-tegra114.c dev_err(tspi->dev, tspi 679 drivers/spi/spi-tegra114.c dma_buf = dma_alloc_coherent(tspi->dev, tspi->dma_buf_size, tspi 682 drivers/spi/spi-tegra114.c dev_err(tspi->dev, " Not able to allocate the dma buffer\n"); tspi 688 drivers/spi/spi-tegra114.c tspi->rx_dma_chan = dma_chan; tspi 689 drivers/spi/spi-tegra114.c tspi->rx_dma_buf = dma_buf; tspi 690 drivers/spi/spi-tegra114.c tspi->rx_dma_phys = dma_phys; tspi 692 drivers/spi/spi-tegra114.c tspi->tx_dma_chan = dma_chan; tspi 693 drivers/spi/spi-tegra114.c tspi->tx_dma_buf = dma_buf; tspi 694 drivers/spi/spi-tegra114.c tspi->tx_dma_phys = dma_phys; tspi 699 drivers/spi/spi-tegra114.c static void tegra_spi_deinit_dma_param(struct tegra_spi_data *tspi, tspi 707 drivers/spi/spi-tegra114.c dma_buf = tspi->rx_dma_buf; tspi 708 drivers/spi/spi-tegra114.c dma_chan = tspi->rx_dma_chan; tspi 709 drivers/spi/spi-tegra114.c dma_phys = tspi->rx_dma_phys; tspi 710 drivers/spi/spi-tegra114.c tspi->rx_dma_chan = NULL; tspi 711 drivers/spi/spi-tegra114.c tspi->rx_dma_buf = NULL; tspi 713 drivers/spi/spi-tegra114.c dma_buf = tspi->tx_dma_buf; tspi 714 drivers/spi/spi-tegra114.c dma_chan = tspi->tx_dma_chan; tspi 715 drivers/spi/spi-tegra114.c dma_phys = tspi->tx_dma_phys; tspi 716 drivers/spi/spi-tegra114.c tspi->tx_dma_buf = NULL; tspi 717 drivers/spi/spi-tegra114.c tspi->tx_dma_chan = NULL; tspi 722 drivers/spi/spi-tegra114.c dma_free_coherent(tspi->dev, tspi->dma_buf_size, dma_buf, dma_phys); tspi 729 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = spi_master_get_devdata(spi->master); tspi 739 drivers/spi/spi-tegra114.c spi_cs_timing = SPI_CS_SETUP_HOLD(tspi->spi_cs_timing1, tspi 742 drivers/spi/spi-tegra114.c if (tspi->spi_cs_timing1 != spi_cs_timing) { tspi 743 drivers/spi/spi-tegra114.c tspi->spi_cs_timing1 = spi_cs_timing; tspi 744 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, spi_cs_timing, SPI_CS_TIMING1); tspi 752 drivers/spi/spi-tegra114.c spi_cs_timing = tspi->spi_cs_timing2; tspi 757 drivers/spi/spi-tegra114.c if (tspi->spi_cs_timing2 != spi_cs_timing) { tspi 758 drivers/spi/spi-tegra114.c tspi->spi_cs_timing2 = spi_cs_timing; tspi 759 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, spi_cs_timing, SPI_CS_TIMING2); tspi 768 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = spi_master_get_devdata(spi->master); tspi 776 drivers/spi/spi-tegra114.c if (speed != tspi->cur_speed) { tspi 777 drivers/spi/spi-tegra114.c clk_set_rate(tspi->clk, speed); tspi 778 drivers/spi/spi-tegra114.c tspi->cur_speed = speed; tspi 781 drivers/spi/spi-tegra114.c tspi->cur_spi = spi; tspi 782 drivers/spi/spi-tegra114.c tspi->cur_pos = 0; tspi 783 drivers/spi/spi-tegra114.c tspi->cur_rx_pos = 0; tspi 784 drivers/spi/spi-tegra114.c tspi->cur_tx_pos = 0; tspi 785 drivers/spi/spi-tegra114.c tspi->curr_xfer = t; tspi 788 drivers/spi/spi-tegra114.c tegra_spi_clear_status(tspi); tspi 790 drivers/spi/spi-tegra114.c command1 = tspi->def_command1_reg; tspi 814 drivers/spi/spi-tegra114.c if (tspi->cs_control) { tspi 815 drivers/spi/spi-tegra114.c if (tspi->cs_control != spi) tspi 816 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, command1, SPI_COMMAND1); tspi 817 drivers/spi/spi-tegra114.c tspi->cs_control = NULL; tspi 819 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, command1, SPI_COMMAND1); tspi 826 drivers/spi/spi-tegra114.c tspi->use_hw_based_cs = true; tspi 829 drivers/spi/spi-tegra114.c tspi->use_hw_based_cs = false; tspi 837 drivers/spi/spi-tegra114.c if (tspi->last_used_cs != spi->chip_select) { tspi 844 drivers/spi/spi-tegra114.c if (command2 != tspi->def_command2_reg) tspi 845 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, command2, SPI_COMMAND2); tspi 846 drivers/spi/spi-tegra114.c tspi->last_used_cs = spi->chip_select; tspi 850 drivers/spi/spi-tegra114.c command1 = tspi->command1_reg; tspi 861 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = spi_master_get_devdata(spi->master); tspi 865 drivers/spi/spi-tegra114.c total_fifo_words = tegra_spi_calculate_curr_xfer_param(spi, tspi, t); tspi 872 drivers/spi/spi-tegra114.c if (tspi->is_packed) tspi 878 drivers/spi/spi-tegra114.c tspi->cur_direction = 0; tspi 881 drivers/spi/spi-tegra114.c tspi->cur_direction |= DATA_DIR_RX; tspi 885 drivers/spi/spi-tegra114.c tspi->cur_direction |= DATA_DIR_TX; tspi 888 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, command1, SPI_COMMAND1); tspi 889 drivers/spi/spi-tegra114.c tspi->command1_reg = command1; tspi 891 drivers/spi/spi-tegra114.c dev_dbg(tspi->dev, "The def 0x%x and written 0x%x\n", tspi 892 drivers/spi/spi-tegra114.c tspi->def_command1_reg, (unsigned)command1); tspi 894 drivers/spi/spi-tegra114.c ret = tegra_spi_flush_fifos(tspi); tspi 898 drivers/spi/spi-tegra114.c ret = tegra_spi_start_dma_based_transfer(tspi, t); tspi 900 drivers/spi/spi-tegra114.c ret = tegra_spi_start_cpu_based_transfer(tspi, t); tspi 938 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = spi_master_get_devdata(spi->master); tspi 955 drivers/spi/spi-tegra114.c ret = pm_runtime_get_sync(tspi->dev); tspi 957 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "pm runtime failed, e = %d\n", ret); tspi 963 drivers/spi/spi-tegra114.c if (tspi->soc_data->has_intr_mask_reg) { tspi 964 drivers/spi/spi-tegra114.c val = tegra_spi_readl(tspi, SPI_INTR_MASK); tspi 966 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, val, SPI_INTR_MASK); tspi 969 drivers/spi/spi-tegra114.c spin_lock_irqsave(&tspi->lock, flags); tspi 974 drivers/spi/spi-tegra114.c val = tspi->def_command1_reg; tspi 979 drivers/spi/spi-tegra114.c tspi->def_command1_reg = val; tspi 980 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, tspi->def_command1_reg, SPI_COMMAND1); tspi 981 drivers/spi/spi-tegra114.c spin_unlock_irqrestore(&tspi->lock, flags); tspi 983 drivers/spi/spi-tegra114.c pm_runtime_put(tspi->dev); tspi 1000 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = spi_master_get_devdata(spi->master); tspi 1007 drivers/spi/spi-tegra114.c if (!tspi->use_hw_based_cs) { tspi 1009 drivers/spi/spi-tegra114.c tspi->command1_reg |= SPI_CS_SW_VAL; tspi 1011 drivers/spi/spi-tegra114.c tspi->command1_reg &= ~SPI_CS_SW_VAL; tspi 1012 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, tspi->command1_reg, SPI_COMMAND1); tspi 1015 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, tspi->def_command1_reg, SPI_COMMAND1); tspi 1018 drivers/spi/spi-tegra114.c static void tegra_spi_dump_regs(struct tegra_spi_data *tspi) tspi 1020 drivers/spi/spi-tegra114.c dev_dbg(tspi->dev, "============ SPI REGISTER DUMP ============\n"); tspi 1021 drivers/spi/spi-tegra114.c dev_dbg(tspi->dev, "Command1: 0x%08x | Command2: 0x%08x\n", tspi 1022 drivers/spi/spi-tegra114.c tegra_spi_readl(tspi, SPI_COMMAND1), tspi 1023 drivers/spi/spi-tegra114.c tegra_spi_readl(tspi, SPI_COMMAND2)); tspi 1024 drivers/spi/spi-tegra114.c dev_dbg(tspi->dev, "DMA_CTL: 0x%08x | DMA_BLK: 0x%08x\n", tspi 1025 drivers/spi/spi-tegra114.c tegra_spi_readl(tspi, SPI_DMA_CTL), tspi 1026 drivers/spi/spi-tegra114.c tegra_spi_readl(tspi, SPI_DMA_BLK)); tspi 1027 drivers/spi/spi-tegra114.c dev_dbg(tspi->dev, "TRANS_STAT: 0x%08x | FIFO_STATUS: 0x%08x\n", tspi 1028 drivers/spi/spi-tegra114.c tegra_spi_readl(tspi, SPI_TRANS_STATUS), tspi 1029 drivers/spi/spi-tegra114.c tegra_spi_readl(tspi, SPI_FIFO_STATUS)); tspi 1036 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = spi_master_get_devdata(master); tspi 1050 drivers/spi/spi-tegra114.c reinit_completion(&tspi->xfer_completion); tspi 1063 drivers/spi/spi-tegra114.c dev_err(tspi->dev, tspi 1069 drivers/spi/spi-tegra114.c ret = wait_for_completion_timeout(&tspi->xfer_completion, tspi 1072 drivers/spi/spi-tegra114.c dev_err(tspi->dev, tspi 1074 drivers/spi/spi-tegra114.c if (tspi->is_curr_dma_xfer && tspi 1075 drivers/spi/spi-tegra114.c (tspi->cur_direction & DATA_DIR_TX)) tspi 1076 drivers/spi/spi-tegra114.c dmaengine_terminate_all(tspi->tx_dma_chan); tspi 1077 drivers/spi/spi-tegra114.c if (tspi->is_curr_dma_xfer && tspi 1078 drivers/spi/spi-tegra114.c (tspi->cur_direction & DATA_DIR_RX)) tspi 1079 drivers/spi/spi-tegra114.c dmaengine_terminate_all(tspi->rx_dma_chan); tspi 1081 drivers/spi/spi-tegra114.c tegra_spi_dump_regs(tspi); tspi 1082 drivers/spi/spi-tegra114.c tegra_spi_flush_fifos(tspi); tspi 1083 drivers/spi/spi-tegra114.c reset_control_assert(tspi->rst); tspi 1085 drivers/spi/spi-tegra114.c reset_control_deassert(tspi->rst); tspi 1086 drivers/spi/spi-tegra114.c tspi->last_used_cs = master->num_chipselect + 1; tspi 1090 drivers/spi/spi-tegra114.c if (tspi->tx_status || tspi->rx_status) { tspi 1091 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "Error in Transfer\n"); tspi 1093 drivers/spi/spi-tegra114.c tegra_spi_dump_regs(tspi); tspi 1106 drivers/spi/spi-tegra114.c tspi->cs_control = spi; tspi 1124 drivers/spi/spi-tegra114.c static irqreturn_t handle_cpu_based_xfer(struct tegra_spi_data *tspi) tspi 1126 drivers/spi/spi-tegra114.c struct spi_transfer *t = tspi->curr_xfer; tspi 1129 drivers/spi/spi-tegra114.c spin_lock_irqsave(&tspi->lock, flags); tspi 1130 drivers/spi/spi-tegra114.c if (tspi->tx_status || tspi->rx_status) { tspi 1131 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "CpuXfer ERROR bit set 0x%x\n", tspi 1132 drivers/spi/spi-tegra114.c tspi->status_reg); tspi 1133 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "CpuXfer 0x%08x:0x%08x\n", tspi 1134 drivers/spi/spi-tegra114.c tspi->command1_reg, tspi->dma_control_reg); tspi 1135 drivers/spi/spi-tegra114.c tegra_spi_dump_regs(tspi); tspi 1136 drivers/spi/spi-tegra114.c tegra_spi_flush_fifos(tspi); tspi 1137 drivers/spi/spi-tegra114.c complete(&tspi->xfer_completion); tspi 1138 drivers/spi/spi-tegra114.c spin_unlock_irqrestore(&tspi->lock, flags); tspi 1139 drivers/spi/spi-tegra114.c reset_control_assert(tspi->rst); tspi 1141 drivers/spi/spi-tegra114.c reset_control_deassert(tspi->rst); tspi 1145 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_RX) tspi 1146 drivers/spi/spi-tegra114.c tegra_spi_read_rx_fifo_to_client_rxbuf(tspi, t); tspi 1148 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_TX) tspi 1149 drivers/spi/spi-tegra114.c tspi->cur_pos = tspi->cur_tx_pos; tspi 1151 drivers/spi/spi-tegra114.c tspi->cur_pos = tspi->cur_rx_pos; tspi 1153 drivers/spi/spi-tegra114.c if (tspi->cur_pos == t->len) { tspi 1154 drivers/spi/spi-tegra114.c complete(&tspi->xfer_completion); tspi 1158 drivers/spi/spi-tegra114.c tegra_spi_calculate_curr_xfer_param(tspi->cur_spi, tspi, t); tspi 1159 drivers/spi/spi-tegra114.c tegra_spi_start_cpu_based_transfer(tspi, t); tspi 1161 drivers/spi/spi-tegra114.c spin_unlock_irqrestore(&tspi->lock, flags); tspi 1165 drivers/spi/spi-tegra114.c static irqreturn_t handle_dma_based_xfer(struct tegra_spi_data *tspi) tspi 1167 drivers/spi/spi-tegra114.c struct spi_transfer *t = tspi->curr_xfer; tspi 1174 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_TX) { tspi 1175 drivers/spi/spi-tegra114.c if (tspi->tx_status) { tspi 1176 drivers/spi/spi-tegra114.c dmaengine_terminate_all(tspi->tx_dma_chan); tspi 1180 drivers/spi/spi-tegra114.c &tspi->tx_dma_complete, SPI_DMA_TIMEOUT); tspi 1182 drivers/spi/spi-tegra114.c dmaengine_terminate_all(tspi->tx_dma_chan); tspi 1183 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "TxDma Xfer failed\n"); tspi 1189 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_RX) { tspi 1190 drivers/spi/spi-tegra114.c if (tspi->rx_status) { tspi 1191 drivers/spi/spi-tegra114.c dmaengine_terminate_all(tspi->rx_dma_chan); tspi 1195 drivers/spi/spi-tegra114.c &tspi->rx_dma_complete, SPI_DMA_TIMEOUT); tspi 1197 drivers/spi/spi-tegra114.c dmaengine_terminate_all(tspi->rx_dma_chan); tspi 1198 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "RxDma Xfer failed\n"); tspi 1204 drivers/spi/spi-tegra114.c spin_lock_irqsave(&tspi->lock, flags); tspi 1206 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "DmaXfer: ERROR bit set 0x%x\n", tspi 1207 drivers/spi/spi-tegra114.c tspi->status_reg); tspi 1208 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "DmaXfer 0x%08x:0x%08x\n", tspi 1209 drivers/spi/spi-tegra114.c tspi->command1_reg, tspi->dma_control_reg); tspi 1210 drivers/spi/spi-tegra114.c tegra_spi_dump_regs(tspi); tspi 1211 drivers/spi/spi-tegra114.c tegra_spi_flush_fifos(tspi); tspi 1212 drivers/spi/spi-tegra114.c complete(&tspi->xfer_completion); tspi 1213 drivers/spi/spi-tegra114.c spin_unlock_irqrestore(&tspi->lock, flags); tspi 1214 drivers/spi/spi-tegra114.c reset_control_assert(tspi->rst); tspi 1216 drivers/spi/spi-tegra114.c reset_control_deassert(tspi->rst); tspi 1220 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_RX) tspi 1221 drivers/spi/spi-tegra114.c tegra_spi_copy_spi_rxbuf_to_client_rxbuf(tspi, t); tspi 1223 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_TX) tspi 1224 drivers/spi/spi-tegra114.c tspi->cur_pos = tspi->cur_tx_pos; tspi 1226 drivers/spi/spi-tegra114.c tspi->cur_pos = tspi->cur_rx_pos; tspi 1228 drivers/spi/spi-tegra114.c if (tspi->cur_pos == t->len) { tspi 1229 drivers/spi/spi-tegra114.c complete(&tspi->xfer_completion); tspi 1234 drivers/spi/spi-tegra114.c total_fifo_words = tegra_spi_calculate_curr_xfer_param(tspi->cur_spi, tspi 1235 drivers/spi/spi-tegra114.c tspi, t); tspi 1237 drivers/spi/spi-tegra114.c err = tegra_spi_start_dma_based_transfer(tspi, t); tspi 1239 drivers/spi/spi-tegra114.c err = tegra_spi_start_cpu_based_transfer(tspi, t); tspi 1242 drivers/spi/spi-tegra114.c spin_unlock_irqrestore(&tspi->lock, flags); tspi 1248 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = context_data; tspi 1250 drivers/spi/spi-tegra114.c if (!tspi->is_curr_dma_xfer) tspi 1251 drivers/spi/spi-tegra114.c return handle_cpu_based_xfer(tspi); tspi 1252 drivers/spi/spi-tegra114.c return handle_dma_based_xfer(tspi); tspi 1257 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = context_data; tspi 1259 drivers/spi/spi-tegra114.c tspi->status_reg = tegra_spi_readl(tspi, SPI_FIFO_STATUS); tspi 1260 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_TX) tspi 1261 drivers/spi/spi-tegra114.c tspi->tx_status = tspi->status_reg & tspi 1264 drivers/spi/spi-tegra114.c if (tspi->cur_direction & DATA_DIR_RX) tspi 1265 drivers/spi/spi-tegra114.c tspi->rx_status = tspi->status_reg & tspi 1267 drivers/spi/spi-tegra114.c tegra_spi_clear_status(tspi); tspi 1302 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi; tspi 1307 drivers/spi/spi-tegra114.c master = spi_alloc_master(&pdev->dev, sizeof(*tspi)); tspi 1313 drivers/spi/spi-tegra114.c tspi = spi_master_get_devdata(master); tspi 1334 drivers/spi/spi-tegra114.c tspi->master = master; tspi 1335 drivers/spi/spi-tegra114.c tspi->dev = &pdev->dev; tspi 1336 drivers/spi/spi-tegra114.c spin_lock_init(&tspi->lock); tspi 1338 drivers/spi/spi-tegra114.c tspi->soc_data = of_device_get_match_data(&pdev->dev); tspi 1339 drivers/spi/spi-tegra114.c if (!tspi->soc_data) { tspi 1346 drivers/spi/spi-tegra114.c tspi->base = devm_ioremap_resource(&pdev->dev, r); tspi 1347 drivers/spi/spi-tegra114.c if (IS_ERR(tspi->base)) { tspi 1348 drivers/spi/spi-tegra114.c ret = PTR_ERR(tspi->base); tspi 1351 drivers/spi/spi-tegra114.c tspi->phys = r->start; tspi 1354 drivers/spi/spi-tegra114.c tspi->irq = spi_irq; tspi 1356 drivers/spi/spi-tegra114.c tspi->clk = devm_clk_get(&pdev->dev, "spi"); tspi 1357 drivers/spi/spi-tegra114.c if (IS_ERR(tspi->clk)) { tspi 1359 drivers/spi/spi-tegra114.c ret = PTR_ERR(tspi->clk); tspi 1363 drivers/spi/spi-tegra114.c tspi->rst = devm_reset_control_get_exclusive(&pdev->dev, "spi"); tspi 1364 drivers/spi/spi-tegra114.c if (IS_ERR(tspi->rst)) { tspi 1366 drivers/spi/spi-tegra114.c ret = PTR_ERR(tspi->rst); tspi 1370 drivers/spi/spi-tegra114.c tspi->max_buf_size = SPI_FIFO_DEPTH << 2; tspi 1371 drivers/spi/spi-tegra114.c tspi->dma_buf_size = DEFAULT_SPI_DMA_BUF_LEN; tspi 1373 drivers/spi/spi-tegra114.c ret = tegra_spi_init_dma_param(tspi, true); tspi 1376 drivers/spi/spi-tegra114.c ret = tegra_spi_init_dma_param(tspi, false); tspi 1379 drivers/spi/spi-tegra114.c tspi->max_buf_size = tspi->dma_buf_size; tspi 1380 drivers/spi/spi-tegra114.c init_completion(&tspi->tx_dma_complete); tspi 1381 drivers/spi/spi-tegra114.c init_completion(&tspi->rx_dma_complete); tspi 1383 drivers/spi/spi-tegra114.c init_completion(&tspi->xfer_completion); tspi 1398 drivers/spi/spi-tegra114.c reset_control_assert(tspi->rst); tspi 1400 drivers/spi/spi-tegra114.c reset_control_deassert(tspi->rst); tspi 1401 drivers/spi/spi-tegra114.c tspi->def_command1_reg = SPI_M_S; tspi 1402 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, tspi->def_command1_reg, SPI_COMMAND1); tspi 1403 drivers/spi/spi-tegra114.c tspi->spi_cs_timing1 = tegra_spi_readl(tspi, SPI_CS_TIMING1); tspi 1404 drivers/spi/spi-tegra114.c tspi->spi_cs_timing2 = tegra_spi_readl(tspi, SPI_CS_TIMING2); tspi 1405 drivers/spi/spi-tegra114.c tspi->def_command2_reg = tegra_spi_readl(tspi, SPI_COMMAND2); tspi 1406 drivers/spi/spi-tegra114.c tspi->last_used_cs = master->num_chipselect + 1; tspi 1408 drivers/spi/spi-tegra114.c ret = request_threaded_irq(tspi->irq, tegra_spi_isr, tspi 1410 drivers/spi/spi-tegra114.c dev_name(&pdev->dev), tspi); tspi 1413 drivers/spi/spi-tegra114.c tspi->irq); tspi 1426 drivers/spi/spi-tegra114.c free_irq(spi_irq, tspi); tspi 1431 drivers/spi/spi-tegra114.c tegra_spi_deinit_dma_param(tspi, false); tspi 1433 drivers/spi/spi-tegra114.c tegra_spi_deinit_dma_param(tspi, true); tspi 1442 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = spi_master_get_devdata(master); tspi 1444 drivers/spi/spi-tegra114.c free_irq(tspi->irq, tspi); tspi 1446 drivers/spi/spi-tegra114.c if (tspi->tx_dma_chan) tspi 1447 drivers/spi/spi-tegra114.c tegra_spi_deinit_dma_param(tspi, false); tspi 1449 drivers/spi/spi-tegra114.c if (tspi->rx_dma_chan) tspi 1450 drivers/spi/spi-tegra114.c tegra_spi_deinit_dma_param(tspi, true); tspi 1470 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = spi_master_get_devdata(master); tspi 1478 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, tspi->command1_reg, SPI_COMMAND1); tspi 1479 drivers/spi/spi-tegra114.c tegra_spi_writel(tspi, tspi->def_command2_reg, SPI_COMMAND2); tspi 1480 drivers/spi/spi-tegra114.c tspi->last_used_cs = master->num_chipselect + 1; tspi 1490 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = spi_master_get_devdata(master); tspi 1493 drivers/spi/spi-tegra114.c tegra_spi_readl(tspi, SPI_COMMAND1); tspi 1495 drivers/spi/spi-tegra114.c clk_disable_unprepare(tspi->clk); tspi 1502 drivers/spi/spi-tegra114.c struct tegra_spi_data *tspi = spi_master_get_devdata(master); tspi 1505 drivers/spi/spi-tegra114.c ret = clk_prepare_enable(tspi->clk); tspi 1507 drivers/spi/spi-tegra114.c dev_err(tspi->dev, "clk_prepare failed: %d\n", ret); tspi 210 drivers/spi/spi-tegra20-slink.c static inline u32 tegra_slink_readl(struct tegra_slink_data *tspi, tspi 213 drivers/spi/spi-tegra20-slink.c return readl(tspi->base + reg); tspi 216 drivers/spi/spi-tegra20-slink.c static inline void tegra_slink_writel(struct tegra_slink_data *tspi, tspi 219 drivers/spi/spi-tegra20-slink.c writel(val, tspi->base + reg); tspi 223 drivers/spi/spi-tegra20-slink.c readl(tspi->base + SLINK_MAS_DATA); tspi 226 drivers/spi/spi-tegra20-slink.c static void tegra_slink_clear_status(struct tegra_slink_data *tspi) tspi 230 drivers/spi/spi-tegra20-slink.c tegra_slink_readl(tspi, SLINK_STATUS); tspi 234 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, val_write, SLINK_STATUS); tspi 237 drivers/spi/spi-tegra20-slink.c static u32 tegra_slink_get_packed_size(struct tegra_slink_data *tspi, tspi 240 drivers/spi/spi-tegra20-slink.c switch (tspi->bytes_per_word) { tspi 255 drivers/spi/spi-tegra20-slink.c struct spi_device *spi, struct tegra_slink_data *tspi, tspi 258 drivers/spi/spi-tegra20-slink.c unsigned remain_len = t->len - tspi->cur_pos; tspi 265 drivers/spi/spi-tegra20-slink.c tspi->bytes_per_word = DIV_ROUND_UP(bits_per_word, 8); tspi 268 drivers/spi/spi-tegra20-slink.c tspi->is_packed = true; tspi 269 drivers/spi/spi-tegra20-slink.c tspi->words_per_32bit = 32/bits_per_word; tspi 271 drivers/spi/spi-tegra20-slink.c tspi->is_packed = false; tspi 272 drivers/spi/spi-tegra20-slink.c tspi->words_per_32bit = 1; tspi 274 drivers/spi/spi-tegra20-slink.c tspi->packed_size = tegra_slink_get_packed_size(tspi, t); tspi 276 drivers/spi/spi-tegra20-slink.c if (tspi->is_packed) { tspi 277 drivers/spi/spi-tegra20-slink.c max_len = min(remain_len, tspi->max_buf_size); tspi 278 drivers/spi/spi-tegra20-slink.c tspi->curr_dma_words = max_len/tspi->bytes_per_word; tspi 281 drivers/spi/spi-tegra20-slink.c max_word = (remain_len - 1) / tspi->bytes_per_word + 1; tspi 282 drivers/spi/spi-tegra20-slink.c max_word = min(max_word, tspi->max_buf_size/4); tspi 283 drivers/spi/spi-tegra20-slink.c tspi->curr_dma_words = max_word; tspi 290 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi, struct spi_transfer *t) tspi 299 drivers/spi/spi-tegra20-slink.c u8 *tx_buf = (u8 *)t->tx_buf + tspi->cur_tx_pos; tspi 301 drivers/spi/spi-tegra20-slink.c fifo_status = tegra_slink_readl(tspi, SLINK_STATUS2); tspi 304 drivers/spi/spi-tegra20-slink.c if (tspi->is_packed) { tspi 305 drivers/spi/spi-tegra20-slink.c fifo_words_left = tx_empty_count * tspi->words_per_32bit; tspi 306 drivers/spi/spi-tegra20-slink.c written_words = min(fifo_words_left, tspi->curr_dma_words); tspi 307 drivers/spi/spi-tegra20-slink.c nbytes = written_words * tspi->bytes_per_word; tspi 313 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, x, SLINK_TX_FIFO); tspi 316 drivers/spi/spi-tegra20-slink.c max_n_32bit = min(tspi->curr_dma_words, tx_empty_count); tspi 318 drivers/spi/spi-tegra20-slink.c nbytes = written_words * tspi->bytes_per_word; tspi 321 drivers/spi/spi-tegra20-slink.c for (i = 0; nbytes && (i < tspi->bytes_per_word); tspi 324 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, x, SLINK_TX_FIFO); tspi 327 drivers/spi/spi-tegra20-slink.c tspi->cur_tx_pos += written_words * tspi->bytes_per_word; tspi 332 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi, struct spi_transfer *t) tspi 339 drivers/spi/spi-tegra20-slink.c u8 *rx_buf = (u8 *)t->rx_buf + tspi->cur_rx_pos; tspi 341 drivers/spi/spi-tegra20-slink.c fifo_status = tegra_slink_readl(tspi, SLINK_STATUS2); tspi 343 drivers/spi/spi-tegra20-slink.c if (tspi->is_packed) { tspi 344 drivers/spi/spi-tegra20-slink.c len = tspi->curr_dma_words * tspi->bytes_per_word; tspi 346 drivers/spi/spi-tegra20-slink.c u32 x = tegra_slink_readl(tspi, SLINK_RX_FIFO); tspi 350 drivers/spi/spi-tegra20-slink.c tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; tspi 351 drivers/spi/spi-tegra20-slink.c read_words += tspi->curr_dma_words; tspi 354 drivers/spi/spi-tegra20-slink.c u32 x = tegra_slink_readl(tspi, SLINK_RX_FIFO); tspi 355 drivers/spi/spi-tegra20-slink.c for (i = 0; (i < tspi->bytes_per_word); i++) tspi 358 drivers/spi/spi-tegra20-slink.c tspi->cur_rx_pos += rx_full_count * tspi->bytes_per_word; tspi 365 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi, struct spi_transfer *t) tspi 368 drivers/spi/spi-tegra20-slink.c dma_sync_single_for_cpu(tspi->dev, tspi->tx_dma_phys, tspi 369 drivers/spi/spi-tegra20-slink.c tspi->dma_buf_size, DMA_TO_DEVICE); tspi 371 drivers/spi/spi-tegra20-slink.c if (tspi->is_packed) { tspi 372 drivers/spi/spi-tegra20-slink.c unsigned len = tspi->curr_dma_words * tspi->bytes_per_word; tspi 373 drivers/spi/spi-tegra20-slink.c memcpy(tspi->tx_dma_buf, t->tx_buf + tspi->cur_pos, len); tspi 377 drivers/spi/spi-tegra20-slink.c u8 *tx_buf = (u8 *)t->tx_buf + tspi->cur_tx_pos; tspi 378 drivers/spi/spi-tegra20-slink.c unsigned consume = tspi->curr_dma_words * tspi->bytes_per_word; tspi 380 drivers/spi/spi-tegra20-slink.c for (count = 0; count < tspi->curr_dma_words; count++) { tspi 382 drivers/spi/spi-tegra20-slink.c for (i = 0; consume && (i < tspi->bytes_per_word); tspi 385 drivers/spi/spi-tegra20-slink.c tspi->tx_dma_buf[count] = x; tspi 388 drivers/spi/spi-tegra20-slink.c tspi->cur_tx_pos += tspi->curr_dma_words * tspi->bytes_per_word; tspi 391 drivers/spi/spi-tegra20-slink.c dma_sync_single_for_device(tspi->dev, tspi->tx_dma_phys, tspi 392 drivers/spi/spi-tegra20-slink.c tspi->dma_buf_size, DMA_TO_DEVICE); tspi 396 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi, struct spi_transfer *t) tspi 401 drivers/spi/spi-tegra20-slink.c dma_sync_single_for_cpu(tspi->dev, tspi->rx_dma_phys, tspi 402 drivers/spi/spi-tegra20-slink.c tspi->dma_buf_size, DMA_FROM_DEVICE); tspi 404 drivers/spi/spi-tegra20-slink.c if (tspi->is_packed) { tspi 405 drivers/spi/spi-tegra20-slink.c len = tspi->curr_dma_words * tspi->bytes_per_word; tspi 406 drivers/spi/spi-tegra20-slink.c memcpy(t->rx_buf + tspi->cur_rx_pos, tspi->rx_dma_buf, len); tspi 410 drivers/spi/spi-tegra20-slink.c unsigned char *rx_buf = t->rx_buf + tspi->cur_rx_pos; tspi 413 drivers/spi/spi-tegra20-slink.c for (count = 0; count < tspi->curr_dma_words; count++) { tspi 414 drivers/spi/spi-tegra20-slink.c u32 x = tspi->rx_dma_buf[count] & rx_mask; tspi 415 drivers/spi/spi-tegra20-slink.c for (i = 0; (i < tspi->bytes_per_word); i++) tspi 419 drivers/spi/spi-tegra20-slink.c tspi->cur_rx_pos += tspi->curr_dma_words * tspi->bytes_per_word; tspi 422 drivers/spi/spi-tegra20-slink.c dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, tspi 423 drivers/spi/spi-tegra20-slink.c tspi->dma_buf_size, DMA_FROM_DEVICE); tspi 433 drivers/spi/spi-tegra20-slink.c static int tegra_slink_start_tx_dma(struct tegra_slink_data *tspi, int len) tspi 435 drivers/spi/spi-tegra20-slink.c reinit_completion(&tspi->tx_dma_complete); tspi 436 drivers/spi/spi-tegra20-slink.c tspi->tx_dma_desc = dmaengine_prep_slave_single(tspi->tx_dma_chan, tspi 437 drivers/spi/spi-tegra20-slink.c tspi->tx_dma_phys, len, DMA_MEM_TO_DEV, tspi 439 drivers/spi/spi-tegra20-slink.c if (!tspi->tx_dma_desc) { tspi 440 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, "Not able to get desc for Tx\n"); tspi 444 drivers/spi/spi-tegra20-slink.c tspi->tx_dma_desc->callback = tegra_slink_dma_complete; tspi 445 drivers/spi/spi-tegra20-slink.c tspi->tx_dma_desc->callback_param = &tspi->tx_dma_complete; tspi 447 drivers/spi/spi-tegra20-slink.c dmaengine_submit(tspi->tx_dma_desc); tspi 448 drivers/spi/spi-tegra20-slink.c dma_async_issue_pending(tspi->tx_dma_chan); tspi 452 drivers/spi/spi-tegra20-slink.c static int tegra_slink_start_rx_dma(struct tegra_slink_data *tspi, int len) tspi 454 drivers/spi/spi-tegra20-slink.c reinit_completion(&tspi->rx_dma_complete); tspi 455 drivers/spi/spi-tegra20-slink.c tspi->rx_dma_desc = dmaengine_prep_slave_single(tspi->rx_dma_chan, tspi 456 drivers/spi/spi-tegra20-slink.c tspi->rx_dma_phys, len, DMA_DEV_TO_MEM, tspi 458 drivers/spi/spi-tegra20-slink.c if (!tspi->rx_dma_desc) { tspi 459 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, "Not able to get desc for Rx\n"); tspi 463 drivers/spi/spi-tegra20-slink.c tspi->rx_dma_desc->callback = tegra_slink_dma_complete; tspi 464 drivers/spi/spi-tegra20-slink.c tspi->rx_dma_desc->callback_param = &tspi->rx_dma_complete; tspi 466 drivers/spi/spi-tegra20-slink.c dmaengine_submit(tspi->rx_dma_desc); tspi 467 drivers/spi/spi-tegra20-slink.c dma_async_issue_pending(tspi->rx_dma_chan); tspi 472 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi, struct spi_transfer *t) tspi 480 drivers/spi/spi-tegra20-slink.c status = tegra_slink_readl(tspi, SLINK_STATUS); tspi 482 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, "Rx/Tx fifo are not empty status 0x%08x\n", tspi 487 drivers/spi/spi-tegra20-slink.c val = SLINK_DMA_BLOCK_SIZE(tspi->curr_dma_words - 1); tspi 488 drivers/spi/spi-tegra20-slink.c val |= tspi->packed_size; tspi 489 drivers/spi/spi-tegra20-slink.c if (tspi->is_packed) tspi 490 drivers/spi/spi-tegra20-slink.c len = DIV_ROUND_UP(tspi->curr_dma_words * tspi->bytes_per_word, tspi 493 drivers/spi/spi-tegra20-slink.c len = tspi->curr_dma_words * 4; tspi 503 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_TX) tspi 506 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_RX) tspi 509 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, val, SLINK_DMA_CTL); tspi 510 drivers/spi/spi-tegra20-slink.c tspi->dma_control_reg = val; tspi 512 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_TX) { tspi 513 drivers/spi/spi-tegra20-slink.c tegra_slink_copy_client_txbuf_to_spi_txbuf(tspi, t); tspi 515 drivers/spi/spi-tegra20-slink.c ret = tegra_slink_start_tx_dma(tspi, len); tspi 517 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, tspi 523 drivers/spi/spi-tegra20-slink.c status = tegra_slink_readl(tspi, SLINK_STATUS); tspi 525 drivers/spi/spi-tegra20-slink.c status = tegra_slink_readl(tspi, SLINK_STATUS); tspi 528 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_RX) { tspi 530 drivers/spi/spi-tegra20-slink.c dma_sync_single_for_device(tspi->dev, tspi->rx_dma_phys, tspi 531 drivers/spi/spi-tegra20-slink.c tspi->dma_buf_size, DMA_FROM_DEVICE); tspi 533 drivers/spi/spi-tegra20-slink.c ret = tegra_slink_start_rx_dma(tspi, len); tspi 535 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, tspi 537 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_TX) tspi 538 drivers/spi/spi-tegra20-slink.c dmaengine_terminate_all(tspi->tx_dma_chan); tspi 542 drivers/spi/spi-tegra20-slink.c tspi->is_curr_dma_xfer = true; tspi 543 drivers/spi/spi-tegra20-slink.c if (tspi->is_packed) { tspi 545 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, val, SLINK_DMA_CTL); tspi 549 drivers/spi/spi-tegra20-slink.c tspi->dma_control_reg = val; tspi 552 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, val, SLINK_DMA_CTL); tspi 557 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi, struct spi_transfer *t) tspi 562 drivers/spi/spi-tegra20-slink.c val = tspi->packed_size; tspi 563 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_TX) tspi 566 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_RX) tspi 569 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, val, SLINK_DMA_CTL); tspi 570 drivers/spi/spi-tegra20-slink.c tspi->dma_control_reg = val; tspi 572 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_TX) tspi 573 drivers/spi/spi-tegra20-slink.c cur_words = tegra_slink_fill_tx_fifo_from_client_txbuf(tspi, t); tspi 575 drivers/spi/spi-tegra20-slink.c cur_words = tspi->curr_dma_words; tspi 577 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, val, SLINK_DMA_CTL); tspi 578 drivers/spi/spi-tegra20-slink.c tspi->dma_control_reg = val; tspi 580 drivers/spi/spi-tegra20-slink.c tspi->is_curr_dma_xfer = false; tspi 581 drivers/spi/spi-tegra20-slink.c if (tspi->is_packed) { tspi 583 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, val, SLINK_DMA_CTL); tspi 587 drivers/spi/spi-tegra20-slink.c tspi->dma_control_reg = val; tspi 589 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, val, SLINK_DMA_CTL); tspi 593 drivers/spi/spi-tegra20-slink.c static int tegra_slink_init_dma_param(struct tegra_slink_data *tspi, tspi 602 drivers/spi/spi-tegra20-slink.c dma_chan = dma_request_slave_channel_reason(tspi->dev, tspi 607 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, tspi 612 drivers/spi/spi-tegra20-slink.c dma_buf = dma_alloc_coherent(tspi->dev, tspi->dma_buf_size, tspi 615 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, " Not able to allocate the dma buffer\n"); tspi 621 drivers/spi/spi-tegra20-slink.c dma_sconfig.src_addr = tspi->phys + SLINK_RX_FIFO; tspi 625 drivers/spi/spi-tegra20-slink.c dma_sconfig.dst_addr = tspi->phys + SLINK_TX_FIFO; tspi 634 drivers/spi/spi-tegra20-slink.c tspi->rx_dma_chan = dma_chan; tspi 635 drivers/spi/spi-tegra20-slink.c tspi->rx_dma_buf = dma_buf; tspi 636 drivers/spi/spi-tegra20-slink.c tspi->rx_dma_phys = dma_phys; tspi 638 drivers/spi/spi-tegra20-slink.c tspi->tx_dma_chan = dma_chan; tspi 639 drivers/spi/spi-tegra20-slink.c tspi->tx_dma_buf = dma_buf; tspi 640 drivers/spi/spi-tegra20-slink.c tspi->tx_dma_phys = dma_phys; tspi 645 drivers/spi/spi-tegra20-slink.c dma_free_coherent(tspi->dev, tspi->dma_buf_size, dma_buf, dma_phys); tspi 650 drivers/spi/spi-tegra20-slink.c static void tegra_slink_deinit_dma_param(struct tegra_slink_data *tspi, tspi 658 drivers/spi/spi-tegra20-slink.c dma_buf = tspi->rx_dma_buf; tspi 659 drivers/spi/spi-tegra20-slink.c dma_chan = tspi->rx_dma_chan; tspi 660 drivers/spi/spi-tegra20-slink.c dma_phys = tspi->rx_dma_phys; tspi 661 drivers/spi/spi-tegra20-slink.c tspi->rx_dma_chan = NULL; tspi 662 drivers/spi/spi-tegra20-slink.c tspi->rx_dma_buf = NULL; tspi 664 drivers/spi/spi-tegra20-slink.c dma_buf = tspi->tx_dma_buf; tspi 665 drivers/spi/spi-tegra20-slink.c dma_chan = tspi->tx_dma_chan; tspi 666 drivers/spi/spi-tegra20-slink.c dma_phys = tspi->tx_dma_phys; tspi 667 drivers/spi/spi-tegra20-slink.c tspi->tx_dma_buf = NULL; tspi 668 drivers/spi/spi-tegra20-slink.c tspi->tx_dma_chan = NULL; tspi 673 drivers/spi/spi-tegra20-slink.c dma_free_coherent(tspi->dev, tspi->dma_buf_size, dma_buf, dma_phys); tspi 680 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = spi_master_get_devdata(spi->master); tspi 690 drivers/spi/spi-tegra20-slink.c if (speed != tspi->cur_speed) { tspi 691 drivers/spi/spi-tegra20-slink.c clk_set_rate(tspi->clk, speed * 4); tspi 692 drivers/spi/spi-tegra20-slink.c tspi->cur_speed = speed; tspi 695 drivers/spi/spi-tegra20-slink.c tspi->cur_spi = spi; tspi 696 drivers/spi/spi-tegra20-slink.c tspi->cur_pos = 0; tspi 697 drivers/spi/spi-tegra20-slink.c tspi->cur_rx_pos = 0; tspi 698 drivers/spi/spi-tegra20-slink.c tspi->cur_tx_pos = 0; tspi 699 drivers/spi/spi-tegra20-slink.c tspi->curr_xfer = t; tspi 700 drivers/spi/spi-tegra20-slink.c total_fifo_words = tegra_slink_calculate_curr_xfer_param(spi, tspi, t); tspi 702 drivers/spi/spi-tegra20-slink.c command = tspi->command_reg; tspi 706 drivers/spi/spi-tegra20-slink.c command2 = tspi->command2_reg; tspi 709 drivers/spi/spi-tegra20-slink.c tspi->cur_direction = 0; tspi 712 drivers/spi/spi-tegra20-slink.c tspi->cur_direction |= DATA_DIR_RX; tspi 716 drivers/spi/spi-tegra20-slink.c tspi->cur_direction |= DATA_DIR_TX; tspi 724 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, command2, SLINK_COMMAND2); tspi 725 drivers/spi/spi-tegra20-slink.c tspi->command2_reg = command2; tspi 727 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, command, SLINK_COMMAND); tspi 728 drivers/spi/spi-tegra20-slink.c tspi->command_reg = command; tspi 731 drivers/spi/spi-tegra20-slink.c ret = tegra_slink_start_dma_based_transfer(tspi, t); tspi 733 drivers/spi/spi-tegra20-slink.c ret = tegra_slink_start_cpu_based_transfer(tspi, t); tspi 746 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = spi_master_get_devdata(spi->master); tspi 757 drivers/spi/spi-tegra20-slink.c ret = pm_runtime_get_sync(tspi->dev); tspi 759 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, "pm runtime failed, e = %d\n", ret); tspi 763 drivers/spi/spi-tegra20-slink.c spin_lock_irqsave(&tspi->lock, flags); tspi 764 drivers/spi/spi-tegra20-slink.c val = tspi->def_command_reg; tspi 769 drivers/spi/spi-tegra20-slink.c tspi->def_command_reg = val; tspi 770 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND); tspi 771 drivers/spi/spi-tegra20-slink.c spin_unlock_irqrestore(&tspi->lock, flags); tspi 773 drivers/spi/spi-tegra20-slink.c pm_runtime_put(tspi->dev); tspi 780 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = spi_master_get_devdata(master); tspi 783 drivers/spi/spi-tegra20-slink.c tegra_slink_clear_status(tspi); tspi 785 drivers/spi/spi-tegra20-slink.c tspi->command_reg = tspi->def_command_reg; tspi 786 drivers/spi/spi-tegra20-slink.c tspi->command_reg |= SLINK_CS_SW | SLINK_CS_VALUE; tspi 788 drivers/spi/spi-tegra20-slink.c tspi->command2_reg = tspi->def_command2_reg; tspi 789 drivers/spi/spi-tegra20-slink.c tspi->command2_reg |= SLINK_SS_EN_CS(spi->chip_select); tspi 791 drivers/spi/spi-tegra20-slink.c tspi->command_reg &= ~SLINK_MODES; tspi 793 drivers/spi/spi-tegra20-slink.c tspi->command_reg |= SLINK_CK_SDA; tspi 796 drivers/spi/spi-tegra20-slink.c tspi->command_reg |= SLINK_IDLE_SCLK_DRIVE_HIGH; tspi 798 drivers/spi/spi-tegra20-slink.c tspi->command_reg |= SLINK_IDLE_SCLK_DRIVE_LOW; tspi 807 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = spi_master_get_devdata(master); tspi 810 drivers/spi/spi-tegra20-slink.c reinit_completion(&tspi->xfer_completion); tspi 813 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, tspi 818 drivers/spi/spi-tegra20-slink.c ret = wait_for_completion_timeout(&tspi->xfer_completion, tspi 821 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, tspi 826 drivers/spi/spi-tegra20-slink.c if (tspi->tx_status) tspi 827 drivers/spi/spi-tegra20-slink.c return tspi->tx_status; tspi 828 drivers/spi/spi-tegra20-slink.c if (tspi->rx_status) tspi 829 drivers/spi/spi-tegra20-slink.c return tspi->rx_status; tspi 837 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = spi_master_get_devdata(master); tspi 839 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND); tspi 840 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, tspi->def_command2_reg, SLINK_COMMAND2); tspi 845 drivers/spi/spi-tegra20-slink.c static irqreturn_t handle_cpu_based_xfer(struct tegra_slink_data *tspi) tspi 847 drivers/spi/spi-tegra20-slink.c struct spi_transfer *t = tspi->curr_xfer; tspi 850 drivers/spi/spi-tegra20-slink.c spin_lock_irqsave(&tspi->lock, flags); tspi 851 drivers/spi/spi-tegra20-slink.c if (tspi->tx_status || tspi->rx_status || tspi 852 drivers/spi/spi-tegra20-slink.c (tspi->status_reg & SLINK_BSY)) { tspi 853 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, tspi 854 drivers/spi/spi-tegra20-slink.c "CpuXfer ERROR bit set 0x%x\n", tspi->status_reg); tspi 855 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, tspi 856 drivers/spi/spi-tegra20-slink.c "CpuXfer 0x%08x:0x%08x:0x%08x\n", tspi->command_reg, tspi 857 drivers/spi/spi-tegra20-slink.c tspi->command2_reg, tspi->dma_control_reg); tspi 858 drivers/spi/spi-tegra20-slink.c reset_control_assert(tspi->rst); tspi 860 drivers/spi/spi-tegra20-slink.c reset_control_deassert(tspi->rst); tspi 861 drivers/spi/spi-tegra20-slink.c complete(&tspi->xfer_completion); tspi 865 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_RX) tspi 866 drivers/spi/spi-tegra20-slink.c tegra_slink_read_rx_fifo_to_client_rxbuf(tspi, t); tspi 868 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_TX) tspi 869 drivers/spi/spi-tegra20-slink.c tspi->cur_pos = tspi->cur_tx_pos; tspi 871 drivers/spi/spi-tegra20-slink.c tspi->cur_pos = tspi->cur_rx_pos; tspi 873 drivers/spi/spi-tegra20-slink.c if (tspi->cur_pos == t->len) { tspi 874 drivers/spi/spi-tegra20-slink.c complete(&tspi->xfer_completion); tspi 878 drivers/spi/spi-tegra20-slink.c tegra_slink_calculate_curr_xfer_param(tspi->cur_spi, tspi, t); tspi 879 drivers/spi/spi-tegra20-slink.c tegra_slink_start_cpu_based_transfer(tspi, t); tspi 881 drivers/spi/spi-tegra20-slink.c spin_unlock_irqrestore(&tspi->lock, flags); tspi 885 drivers/spi/spi-tegra20-slink.c static irqreturn_t handle_dma_based_xfer(struct tegra_slink_data *tspi) tspi 887 drivers/spi/spi-tegra20-slink.c struct spi_transfer *t = tspi->curr_xfer; tspi 894 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_TX) { tspi 895 drivers/spi/spi-tegra20-slink.c if (tspi->tx_status) { tspi 896 drivers/spi/spi-tegra20-slink.c dmaengine_terminate_all(tspi->tx_dma_chan); tspi 900 drivers/spi/spi-tegra20-slink.c &tspi->tx_dma_complete, SLINK_DMA_TIMEOUT); tspi 902 drivers/spi/spi-tegra20-slink.c dmaengine_terminate_all(tspi->tx_dma_chan); tspi 903 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, "TxDma Xfer failed\n"); tspi 909 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_RX) { tspi 910 drivers/spi/spi-tegra20-slink.c if (tspi->rx_status) { tspi 911 drivers/spi/spi-tegra20-slink.c dmaengine_terminate_all(tspi->rx_dma_chan); tspi 915 drivers/spi/spi-tegra20-slink.c &tspi->rx_dma_complete, SLINK_DMA_TIMEOUT); tspi 917 drivers/spi/spi-tegra20-slink.c dmaengine_terminate_all(tspi->rx_dma_chan); tspi 918 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, "RxDma Xfer failed\n"); tspi 924 drivers/spi/spi-tegra20-slink.c spin_lock_irqsave(&tspi->lock, flags); tspi 926 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, tspi 927 drivers/spi/spi-tegra20-slink.c "DmaXfer: ERROR bit set 0x%x\n", tspi->status_reg); tspi 928 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, tspi 929 drivers/spi/spi-tegra20-slink.c "DmaXfer 0x%08x:0x%08x:0x%08x\n", tspi->command_reg, tspi 930 drivers/spi/spi-tegra20-slink.c tspi->command2_reg, tspi->dma_control_reg); tspi 931 drivers/spi/spi-tegra20-slink.c reset_control_assert(tspi->rst); tspi 933 drivers/spi/spi-tegra20-slink.c reset_control_assert(tspi->rst); tspi 934 drivers/spi/spi-tegra20-slink.c complete(&tspi->xfer_completion); tspi 935 drivers/spi/spi-tegra20-slink.c spin_unlock_irqrestore(&tspi->lock, flags); tspi 939 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_RX) tspi 940 drivers/spi/spi-tegra20-slink.c tegra_slink_copy_spi_rxbuf_to_client_rxbuf(tspi, t); tspi 942 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_TX) tspi 943 drivers/spi/spi-tegra20-slink.c tspi->cur_pos = tspi->cur_tx_pos; tspi 945 drivers/spi/spi-tegra20-slink.c tspi->cur_pos = tspi->cur_rx_pos; tspi 947 drivers/spi/spi-tegra20-slink.c if (tspi->cur_pos == t->len) { tspi 948 drivers/spi/spi-tegra20-slink.c complete(&tspi->xfer_completion); tspi 953 drivers/spi/spi-tegra20-slink.c total_fifo_words = tegra_slink_calculate_curr_xfer_param(tspi->cur_spi, tspi 954 drivers/spi/spi-tegra20-slink.c tspi, t); tspi 956 drivers/spi/spi-tegra20-slink.c err = tegra_slink_start_dma_based_transfer(tspi, t); tspi 958 drivers/spi/spi-tegra20-slink.c err = tegra_slink_start_cpu_based_transfer(tspi, t); tspi 961 drivers/spi/spi-tegra20-slink.c spin_unlock_irqrestore(&tspi->lock, flags); tspi 967 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = context_data; tspi 969 drivers/spi/spi-tegra20-slink.c if (!tspi->is_curr_dma_xfer) tspi 970 drivers/spi/spi-tegra20-slink.c return handle_cpu_based_xfer(tspi); tspi 971 drivers/spi/spi-tegra20-slink.c return handle_dma_based_xfer(tspi); tspi 976 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = context_data; tspi 978 drivers/spi/spi-tegra20-slink.c tspi->status_reg = tegra_slink_readl(tspi, SLINK_STATUS); tspi 979 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_TX) tspi 980 drivers/spi/spi-tegra20-slink.c tspi->tx_status = tspi->status_reg & tspi 983 drivers/spi/spi-tegra20-slink.c if (tspi->cur_direction & DATA_DIR_RX) tspi 984 drivers/spi/spi-tegra20-slink.c tspi->rx_status = tspi->status_reg & tspi 986 drivers/spi/spi-tegra20-slink.c tegra_slink_clear_status(tspi); tspi 1009 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi; tspi 1022 drivers/spi/spi-tegra20-slink.c master = spi_alloc_master(&pdev->dev, sizeof(*tspi)); tspi 1038 drivers/spi/spi-tegra20-slink.c tspi = spi_master_get_devdata(master); tspi 1039 drivers/spi/spi-tegra20-slink.c tspi->master = master; tspi 1040 drivers/spi/spi-tegra20-slink.c tspi->dev = &pdev->dev; tspi 1041 drivers/spi/spi-tegra20-slink.c tspi->chip_data = cdata; tspi 1042 drivers/spi/spi-tegra20-slink.c spin_lock_init(&tspi->lock); tspi 1044 drivers/spi/spi-tegra20-slink.c if (of_property_read_u32(tspi->dev->of_node, "spi-max-frequency", tspi 1054 drivers/spi/spi-tegra20-slink.c tspi->phys = r->start; tspi 1055 drivers/spi/spi-tegra20-slink.c tspi->base = devm_ioremap_resource(&pdev->dev, r); tspi 1056 drivers/spi/spi-tegra20-slink.c if (IS_ERR(tspi->base)) { tspi 1057 drivers/spi/spi-tegra20-slink.c ret = PTR_ERR(tspi->base); tspi 1062 drivers/spi/spi-tegra20-slink.c tspi->clk = devm_clk_get(&pdev->dev, NULL); tspi 1063 drivers/spi/spi-tegra20-slink.c if (IS_ERR(tspi->clk)) { tspi 1064 drivers/spi/spi-tegra20-slink.c ret = PTR_ERR(tspi->clk); tspi 1068 drivers/spi/spi-tegra20-slink.c ret = clk_prepare(tspi->clk); tspi 1073 drivers/spi/spi-tegra20-slink.c ret = clk_enable(tspi->clk); tspi 1080 drivers/spi/spi-tegra20-slink.c tspi->irq = spi_irq; tspi 1081 drivers/spi/spi-tegra20-slink.c ret = request_threaded_irq(tspi->irq, tegra_slink_isr, tspi 1083 drivers/spi/spi-tegra20-slink.c dev_name(&pdev->dev), tspi); tspi 1086 drivers/spi/spi-tegra20-slink.c tspi->irq); tspi 1090 drivers/spi/spi-tegra20-slink.c tspi->rst = devm_reset_control_get_exclusive(&pdev->dev, "spi"); tspi 1091 drivers/spi/spi-tegra20-slink.c if (IS_ERR(tspi->rst)) { tspi 1093 drivers/spi/spi-tegra20-slink.c ret = PTR_ERR(tspi->rst); tspi 1097 drivers/spi/spi-tegra20-slink.c tspi->max_buf_size = SLINK_FIFO_DEPTH << 2; tspi 1098 drivers/spi/spi-tegra20-slink.c tspi->dma_buf_size = DEFAULT_SPI_DMA_BUF_LEN; tspi 1100 drivers/spi/spi-tegra20-slink.c ret = tegra_slink_init_dma_param(tspi, true); tspi 1103 drivers/spi/spi-tegra20-slink.c ret = tegra_slink_init_dma_param(tspi, false); tspi 1106 drivers/spi/spi-tegra20-slink.c tspi->max_buf_size = tspi->dma_buf_size; tspi 1107 drivers/spi/spi-tegra20-slink.c init_completion(&tspi->tx_dma_complete); tspi 1108 drivers/spi/spi-tegra20-slink.c init_completion(&tspi->rx_dma_complete); tspi 1110 drivers/spi/spi-tegra20-slink.c init_completion(&tspi->xfer_completion); tspi 1124 drivers/spi/spi-tegra20-slink.c tspi->def_command_reg = SLINK_M_S; tspi 1125 drivers/spi/spi-tegra20-slink.c tspi->def_command2_reg = SLINK_CS_ACTIVE_BETWEEN; tspi 1126 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND); tspi 1127 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, tspi->def_command2_reg, SLINK_COMMAND2); tspi 1142 drivers/spi/spi-tegra20-slink.c tegra_slink_deinit_dma_param(tspi, false); tspi 1144 drivers/spi/spi-tegra20-slink.c tegra_slink_deinit_dma_param(tspi, true); tspi 1146 drivers/spi/spi-tegra20-slink.c free_irq(spi_irq, tspi); tspi 1148 drivers/spi/spi-tegra20-slink.c clk_disable(tspi->clk); tspi 1150 drivers/spi/spi-tegra20-slink.c clk_unprepare(tspi->clk); tspi 1159 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = spi_master_get_devdata(master); tspi 1161 drivers/spi/spi-tegra20-slink.c free_irq(tspi->irq, tspi); tspi 1163 drivers/spi/spi-tegra20-slink.c clk_disable(tspi->clk); tspi 1164 drivers/spi/spi-tegra20-slink.c clk_unprepare(tspi->clk); tspi 1166 drivers/spi/spi-tegra20-slink.c if (tspi->tx_dma_chan) tspi 1167 drivers/spi/spi-tegra20-slink.c tegra_slink_deinit_dma_param(tspi, false); tspi 1169 drivers/spi/spi-tegra20-slink.c if (tspi->rx_dma_chan) tspi 1170 drivers/spi/spi-tegra20-slink.c tegra_slink_deinit_dma_param(tspi, true); tspi 1190 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = spi_master_get_devdata(master); tspi 1198 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, tspi->command_reg, SLINK_COMMAND); tspi 1199 drivers/spi/spi-tegra20-slink.c tegra_slink_writel(tspi, tspi->command2_reg, SLINK_COMMAND2); tspi 1209 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = spi_master_get_devdata(master); tspi 1212 drivers/spi/spi-tegra20-slink.c tegra_slink_readl(tspi, SLINK_MAS_DATA); tspi 1214 drivers/spi/spi-tegra20-slink.c clk_disable_unprepare(tspi->clk); tspi 1221 drivers/spi/spi-tegra20-slink.c struct tegra_slink_data *tspi = spi_master_get_devdata(master); tspi 1224 drivers/spi/spi-tegra20-slink.c ret = clk_prepare_enable(tspi->clk); tspi 1226 drivers/spi/spi-tegra20-slink.c dev_err(tspi->dev, "clk_prepare failed: %d\n", ret);