aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Figa <tomasz.figa@gmail.com>2013-08-11 13:59:18 -0400
committerVinod Koul <vinod.koul@intel.com>2013-09-02 02:19:56 -0400
commit5110e51d127221c93f331841e601612b187b60f4 (patch)
tree7f8d34539615b1ab00bdef3413171eab4c59c5e0
parentda1b6c05b8b5bd9af060acb319360604a0890c2e (diff)
dmaengine: PL08x: Add support for different maximum transfer size
PL080S has separate register to store transfer size in, allowing single transfer to be much larger than in standard PL080. This patch makes the amba-pl08x driver aware of this and removes writing transfer size to reserved bits of CH_CONTROL register on PL080S, which was not a problem witn transfer sizes fitting the original bitfield of PL080, but now would overwrite other fields. Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r--drivers/dma/amba-pl08x.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c
index 75915be252f5..4e4c3df7f151 100644
--- a/drivers/dma/amba-pl08x.c
+++ b/drivers/dma/amba-pl08x.c
@@ -115,6 +115,7 @@ struct vendor_data {
115 bool dualmaster; 115 bool dualmaster;
116 bool nomadik; 116 bool nomadik;
117 bool pl080s; 117 bool pl080s;
118 u32 max_transfer_size;
118}; 119};
119 120
120/** 121/**
@@ -783,6 +784,7 @@ static inline u32 pl08x_cctl_bits(u32 cctl, u8 srcwidth, u8 dstwidth,
783 break; 784 break;
784 } 785 }
785 786
787 tsize &= PL080_CONTROL_TRANSFER_SIZE_MASK;
786 retbits |= tsize << PL080_CONTROL_TRANSFER_SIZE_SHIFT; 788 retbits |= tsize << PL080_CONTROL_TRANSFER_SIZE_SHIFT;
787 return retbits; 789 return retbits;
788} 790}
@@ -1050,7 +1052,7 @@ static int pl08x_fill_llis_for_desc(struct pl08x_driver_data *pl08x,
1050 * MIN(buswidths) 1052 * MIN(buswidths)
1051 */ 1053 */
1052 max_bytes_per_lli = bd.srcbus.buswidth * 1054 max_bytes_per_lli = bd.srcbus.buswidth *
1053 PL080_CONTROL_TRANSFER_SIZE_MASK; 1055 pl08x->vd->max_transfer_size;
1054 dev_vdbg(&pl08x->adev->dev, 1056 dev_vdbg(&pl08x->adev->dev,
1055 "%s max bytes per lli = %zu\n", 1057 "%s max bytes per lli = %zu\n",
1056 __func__, max_bytes_per_lli); 1058 __func__, max_bytes_per_lli);
@@ -2152,6 +2154,7 @@ static struct vendor_data vendor_pl080 = {
2152 .config_offset = PL080_CH_CONFIG, 2154 .config_offset = PL080_CH_CONFIG,
2153 .channels = 8, 2155 .channels = 8,
2154 .dualmaster = true, 2156 .dualmaster = true,
2157 .max_transfer_size = PL080_CONTROL_TRANSFER_SIZE_MASK,
2155}; 2158};
2156 2159
2157static struct vendor_data vendor_nomadik = { 2160static struct vendor_data vendor_nomadik = {
@@ -2159,18 +2162,21 @@ static struct vendor_data vendor_nomadik = {
2159 .channels = 8, 2162 .channels = 8,
2160 .dualmaster = true, 2163 .dualmaster = true,
2161 .nomadik = true, 2164 .nomadik = true,
2165 .max_transfer_size = PL080_CONTROL_TRANSFER_SIZE_MASK,
2162}; 2166};
2163 2167
2164static struct vendor_data vendor_pl080s = { 2168static struct vendor_data vendor_pl080s = {
2165 .config_offset = PL080S_CH_CONFIG, 2169 .config_offset = PL080S_CH_CONFIG,
2166 .channels = 8, 2170 .channels = 8,
2167 .pl080s = true, 2171 .pl080s = true,
2172 .max_transfer_size = PL080S_CONTROL_TRANSFER_SIZE_MASK,
2168}; 2173};
2169 2174
2170static struct vendor_data vendor_pl081 = { 2175static struct vendor_data vendor_pl081 = {
2171 .config_offset = PL080_CH_CONFIG, 2176 .config_offset = PL080_CH_CONFIG,
2172 .channels = 2, 2177 .channels = 2,
2173 .dualmaster = false, 2178 .dualmaster = false,
2179 .max_transfer_size = PL080_CONTROL_TRANSFER_SIZE_MASK,
2174}; 2180};
2175 2181
2176static struct amba_id pl08x_ids[] = { 2182static struct amba_id pl08x_ids[] = {