summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Hunter <jonathanh@nvidia.com>2019-05-16 11:53:53 -0400
committerVinod Koul <vkoul@kernel.org>2019-05-21 04:56:00 -0400
commit9ab59bf5dd6380a56e2897c92c5cd920ae4b0f8b (patch)
treea56b8a30778db3f6ffc509e4b331cbd1c917792b
parentb53611fb1ce9b1786bd18205473e0c1d6bfa8934 (diff)
dmaengine: tegra210-adma: Fix channel FIFO configuration
Commit ded1f3db4cd6 ("dmaengine: tegra210-adma: prepare for supporting newer Tegra chips") removed the default settings DMA channel RX and TX FIFO sizes and this is breaking DMA transfers. The intention was to move the default settings to the chip specific data structure because this commit was preparing for adding support for Tegra186 where the fields for the FIFO CTRL register are slightly different. Fix the configuration of the FIFO sizes by adding default values for the FIFO CTRL register for both Tegra210 and Tegra186 and store the values in the chip specific structure. Fixes: ded1f3db4cd6 ("dmaengine: tegra210-adma: prepare for supporting newer Tegra chips") Signed-off-by: Jon Hunter <jonathanh@nvidia.com> Signed-off-by: Vinod Koul <vkoul@kernel.org>
-rw-r--r--drivers/dma/tegra210-adma.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/dma/tegra210-adma.c b/drivers/dma/tegra210-adma.c
index 3ec3d71acd25..3f50fd11c380 100644
--- a/drivers/dma/tegra210-adma.c
+++ b/drivers/dma/tegra210-adma.c
@@ -53,10 +53,14 @@
53#define ADMA_CH_CONFIG_MAX_BUFS 8 53#define ADMA_CH_CONFIG_MAX_BUFS 8
54 54
55#define ADMA_CH_FIFO_CTRL 0x2c 55#define ADMA_CH_FIFO_CTRL 0x2c
56#define ADMA_CH_FIFO_CTRL_OVRFW_THRES(val) (((val) & 0xf) << 24) 56#define TEGRA210_ADMA_CH_FIFO_CTRL_OFLWTHRES(val) (((val) & 0xf) << 24)
57#define ADMA_CH_FIFO_CTRL_STARV_THRES(val) (((val) & 0xf) << 16) 57#define TEGRA210_ADMA_CH_FIFO_CTRL_STRVTHRES(val) (((val) & 0xf) << 16)
58#define ADMA_CH_FIFO_CTRL_TX_FIFO_SIZE_SHIFT 8 58#define TEGRA210_ADMA_CH_FIFO_CTRL_TXSIZE(val) (((val) & 0xf) << 8)
59#define ADMA_CH_FIFO_CTRL_RX_FIFO_SIZE_SHIFT 0 59#define TEGRA210_ADMA_CH_FIFO_CTRL_RXSIZE(val) ((val) & 0xf)
60#define TEGRA186_ADMA_CH_FIFO_CTRL_OFLWTHRES(val) (((val) & 0x1f) << 24)
61#define TEGRA186_ADMA_CH_FIFO_CTRL_STRVTHRES(val) (((val) & 0x1f) << 16)
62#define TEGRA186_ADMA_CH_FIFO_CTRL_TXSIZE(val) (((val) & 0x1f) << 8)
63#define TEGRA186_ADMA_CH_FIFO_CTRL_RXSIZE(val) ((val) & 0x1f)
60 64
61#define ADMA_CH_LOWER_SRC_ADDR 0x34 65#define ADMA_CH_LOWER_SRC_ADDR 0x34
62#define ADMA_CH_LOWER_TRG_ADDR 0x3c 66#define ADMA_CH_LOWER_TRG_ADDR 0x3c
@@ -71,8 +75,15 @@
71 75
72#define TEGRA_ADMA_BURST_COMPLETE_TIME 20 76#define TEGRA_ADMA_BURST_COMPLETE_TIME 20
73 77
74#define ADMA_CH_FIFO_CTRL_DEFAULT (ADMA_CH_FIFO_CTRL_OVRFW_THRES(1) | \ 78#define TEGRA210_FIFO_CTRL_DEFAULT (TEGRA210_ADMA_CH_FIFO_CTRL_OFLWTHRES(1) | \
75 ADMA_CH_FIFO_CTRL_STARV_THRES(1)) 79 TEGRA210_ADMA_CH_FIFO_CTRL_STRVTHRES(1) | \
80 TEGRA210_ADMA_CH_FIFO_CTRL_TXSIZE(3) | \
81 TEGRA210_ADMA_CH_FIFO_CTRL_RXSIZE(3))
82
83#define TEGRA186_FIFO_CTRL_DEFAULT (TEGRA186_ADMA_CH_FIFO_CTRL_OFLWTHRES(1) | \
84 TEGRA186_ADMA_CH_FIFO_CTRL_STRVTHRES(1) | \
85 TEGRA186_ADMA_CH_FIFO_CTRL_TXSIZE(3) | \
86 TEGRA186_ADMA_CH_FIFO_CTRL_RXSIZE(3))
76 87
77#define ADMA_CH_REG_FIELD_VAL(val, mask, shift) (((val) & mask) << shift) 88#define ADMA_CH_REG_FIELD_VAL(val, mask, shift) (((val) & mask) << shift)
78 89
@@ -85,6 +96,7 @@ struct tegra_adma;
85 * @ch_req_tx_shift: Register offset for AHUB transmit channel select. 96 * @ch_req_tx_shift: Register offset for AHUB transmit channel select.
86 * @ch_req_rx_shift: Register offset for AHUB receive channel select. 97 * @ch_req_rx_shift: Register offset for AHUB receive channel select.
87 * @ch_base_offset: Reister offset of DMA channel registers. 98 * @ch_base_offset: Reister offset of DMA channel registers.
99 * @ch_fifo_ctrl: Default value for channel FIFO CTRL register.
88 * @ch_req_mask: Mask for Tx or Rx channel select. 100 * @ch_req_mask: Mask for Tx or Rx channel select.
89 * @ch_req_max: Maximum number of Tx or Rx channels available. 101 * @ch_req_max: Maximum number of Tx or Rx channels available.
90 * @ch_reg_size: Size of DMA channel register space. 102 * @ch_reg_size: Size of DMA channel register space.
@@ -97,6 +109,7 @@ struct tegra_adma_chip_data {
97 unsigned int ch_req_tx_shift; 109 unsigned int ch_req_tx_shift;
98 unsigned int ch_req_rx_shift; 110 unsigned int ch_req_rx_shift;
99 unsigned int ch_base_offset; 111 unsigned int ch_base_offset;
112 unsigned int ch_fifo_ctrl;
100 unsigned int ch_req_mask; 113 unsigned int ch_req_mask;
101 unsigned int ch_req_max; 114 unsigned int ch_req_max;
102 unsigned int ch_reg_size; 115 unsigned int ch_reg_size;
@@ -600,7 +613,7 @@ static int tegra_adma_set_xfer_params(struct tegra_adma_chan *tdc,
600 ADMA_CH_CTRL_FLOWCTRL_EN; 613 ADMA_CH_CTRL_FLOWCTRL_EN;
601 ch_regs->config |= cdata->adma_get_burst_config(burst_size); 614 ch_regs->config |= cdata->adma_get_burst_config(burst_size);
602 ch_regs->config |= ADMA_CH_CONFIG_WEIGHT_FOR_WRR(1); 615 ch_regs->config |= ADMA_CH_CONFIG_WEIGHT_FOR_WRR(1);
603 ch_regs->fifo_ctrl = ADMA_CH_FIFO_CTRL_DEFAULT; 616 ch_regs->fifo_ctrl = cdata->ch_fifo_ctrl;
604 ch_regs->tc = desc->period_len & ADMA_CH_TC_COUNT_MASK; 617 ch_regs->tc = desc->period_len & ADMA_CH_TC_COUNT_MASK;
605 618
606 return tegra_adma_request_alloc(tdc, direction); 619 return tegra_adma_request_alloc(tdc, direction);
@@ -784,6 +797,7 @@ static const struct tegra_adma_chip_data tegra210_chip_data = {
784 .ch_req_tx_shift = 28, 797 .ch_req_tx_shift = 28,
785 .ch_req_rx_shift = 24, 798 .ch_req_rx_shift = 24,
786 .ch_base_offset = 0, 799 .ch_base_offset = 0,
800 .ch_fifo_ctrl = TEGRA210_FIFO_CTRL_DEFAULT,
787 .ch_req_mask = 0xf, 801 .ch_req_mask = 0xf,
788 .ch_req_max = 10, 802 .ch_req_max = 10,
789 .ch_reg_size = 0x80, 803 .ch_reg_size = 0x80,
@@ -797,6 +811,7 @@ static const struct tegra_adma_chip_data tegra186_chip_data = {
797 .ch_req_tx_shift = 27, 811 .ch_req_tx_shift = 27,
798 .ch_req_rx_shift = 22, 812 .ch_req_rx_shift = 22,
799 .ch_base_offset = 0x10000, 813 .ch_base_offset = 0x10000,
814 .ch_fifo_ctrl = TEGRA186_FIFO_CTRL_DEFAULT,
800 .ch_req_mask = 0x1f, 815 .ch_req_mask = 0x1f,
801 .ch_req_max = 20, 816 .ch_req_max = 20,
802 .ch_reg_size = 0x100, 817 .ch_reg_size = 0x100,