aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2013-11-06 12:33:09 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2014-04-03 19:30:25 -0400
commitc5ed98b6ae79545284b7855a07ded32934865a6d (patch)
treeaf89c9f8212b23e71d7b8f0be2d6fa601fb0fff9
parent45da7b0451b1fe15e882b08c79be58458cbe7a2f (diff)
dmaengine: omap-dma: provide register read/write functions
Provide a pair of channel register accessors, and a pair of global accessors for non-channel specific registers. Acked-by: Tony Lindgren <tony@atomide.com> Acked-by: Vinod Koul <vinod.koul@intel.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--drivers/dma/omap-dma.c102
1 files changed, 61 insertions, 41 deletions
diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c
index b270aedf1d15..a1baada7dcd4 100644
--- a/drivers/dma/omap-dma.c
+++ b/drivers/dma/omap-dma.c
@@ -170,12 +170,32 @@ static void omap_dma_desc_free(struct virt_dma_desc *vd)
170 kfree(container_of(vd, struct omap_desc, vd)); 170 kfree(container_of(vd, struct omap_desc, vd));
171} 171}
172 172
173static void omap_dma_glbl_write(struct omap_dmadev *od, unsigned reg, unsigned val)
174{
175 od->plat->dma_write(val, reg, 0);
176}
177
178static unsigned omap_dma_glbl_read(struct omap_dmadev *od, unsigned reg)
179{
180 return od->plat->dma_read(reg, 0);
181}
182
183static void omap_dma_chan_write(struct omap_chan *c, unsigned reg, unsigned val)
184{
185 c->plat->dma_write(val, reg, c->dma_ch);
186}
187
188static unsigned omap_dma_chan_read(struct omap_chan *c, unsigned reg)
189{
190 return c->plat->dma_read(reg, c->dma_ch);
191}
192
173static void omap_dma_clear_csr(struct omap_chan *c) 193static void omap_dma_clear_csr(struct omap_chan *c)
174{ 194{
175 if (dma_omap1()) 195 if (dma_omap1())
176 c->plat->dma_read(CSR, c->dma_ch); 196 omap_dma_chan_read(c, CSR);
177 else 197 else
178 c->plat->dma_write(~0, CSR, c->dma_ch); 198 omap_dma_chan_write(c, CSR, ~0);
179} 199}
180 200
181static void omap_dma_start(struct omap_chan *c, struct omap_desc *d) 201static void omap_dma_start(struct omap_chan *c, struct omap_desc *d)
@@ -183,17 +203,17 @@ static void omap_dma_start(struct omap_chan *c, struct omap_desc *d)
183 struct omap_dmadev *od = to_omap_dma_dev(c->vc.chan.device); 203 struct omap_dmadev *od = to_omap_dma_dev(c->vc.chan.device);
184 204
185 if (__dma_omap15xx(od->plat->dma_attr)) 205 if (__dma_omap15xx(od->plat->dma_attr))
186 c->plat->dma_write(0, CPC, c->dma_ch); 206 omap_dma_chan_write(c, CPC, 0);
187 else 207 else
188 c->plat->dma_write(0, CDAC, c->dma_ch); 208 omap_dma_chan_write(c, CDAC, 0);
189 209
190 omap_dma_clear_csr(c); 210 omap_dma_clear_csr(c);
191 211
192 /* Enable interrupts */ 212 /* Enable interrupts */
193 c->plat->dma_write(d->cicr, CICR, c->dma_ch); 213 omap_dma_chan_write(c, CICR, d->cicr);
194 214
195 /* Enable channel */ 215 /* Enable channel */
196 c->plat->dma_write(d->ccr | CCR_ENABLE, CCR, c->dma_ch); 216 omap_dma_chan_write(c, CCR, d->ccr | CCR_ENABLE);
197} 217}
198 218
199static void omap_dma_stop(struct omap_chan *c) 219static void omap_dma_stop(struct omap_chan *c)
@@ -202,27 +222,27 @@ static void omap_dma_stop(struct omap_chan *c)
202 uint32_t val; 222 uint32_t val;
203 223
204 /* disable irq */ 224 /* disable irq */
205 c->plat->dma_write(0, CICR, c->dma_ch); 225 omap_dma_chan_write(c, CICR, 0);
206 226
207 omap_dma_clear_csr(c); 227 omap_dma_clear_csr(c);
208 228
209 val = c->plat->dma_read(CCR, c->dma_ch); 229 val = omap_dma_chan_read(c, CCR);
210 if (od->plat->errata & DMA_ERRATA_i541 && val & CCR_TRIGGER_SRC) { 230 if (od->plat->errata & DMA_ERRATA_i541 && val & CCR_TRIGGER_SRC) {
211 uint32_t sysconfig; 231 uint32_t sysconfig;
212 unsigned i; 232 unsigned i;
213 233
214 sysconfig = c->plat->dma_read(OCP_SYSCONFIG, c->dma_ch); 234 sysconfig = omap_dma_glbl_read(od, OCP_SYSCONFIG);
215 val = sysconfig & ~DMA_SYSCONFIG_MIDLEMODE_MASK; 235 val = sysconfig & ~DMA_SYSCONFIG_MIDLEMODE_MASK;
216 val |= DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_NO_IDLE); 236 val |= DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_NO_IDLE);
217 c->plat->dma_write(val, OCP_SYSCONFIG, c->dma_ch); 237 omap_dma_glbl_write(od, OCP_SYSCONFIG, val);
218 238
219 val = c->plat->dma_read(CCR, c->dma_ch); 239 val = omap_dma_chan_read(c, CCR);
220 val &= ~CCR_ENABLE; 240 val &= ~CCR_ENABLE;
221 c->plat->dma_write(val, CCR, c->dma_ch); 241 omap_dma_chan_write(c, CCR, val);
222 242
223 /* Wait for sDMA FIFO to drain */ 243 /* Wait for sDMA FIFO to drain */
224 for (i = 0; ; i++) { 244 for (i = 0; ; i++) {
225 val = c->plat->dma_read(CCR, c->dma_ch); 245 val = omap_dma_chan_read(c, CCR);
226 if (!(val & (CCR_RD_ACTIVE | CCR_WR_ACTIVE))) 246 if (!(val & (CCR_RD_ACTIVE | CCR_WR_ACTIVE)))
227 break; 247 break;
228 248
@@ -237,23 +257,23 @@ static void omap_dma_stop(struct omap_chan *c)
237 "DMA drain did not complete on lch %d\n", 257 "DMA drain did not complete on lch %d\n",
238 c->dma_ch); 258 c->dma_ch);
239 259
240 c->plat->dma_write(sysconfig, OCP_SYSCONFIG, c->dma_ch); 260 omap_dma_glbl_write(od, OCP_SYSCONFIG, sysconfig);
241 } else { 261 } else {
242 val &= ~CCR_ENABLE; 262 val &= ~CCR_ENABLE;
243 c->plat->dma_write(val, CCR, c->dma_ch); 263 omap_dma_chan_write(c, CCR, val);
244 } 264 }
245 265
246 mb(); 266 mb();
247 267
248 if (!__dma_omap15xx(od->plat->dma_attr) && c->cyclic) { 268 if (!__dma_omap15xx(od->plat->dma_attr) && c->cyclic) {
249 val = c->plat->dma_read(CLNK_CTRL, c->dma_ch); 269 val = omap_dma_chan_read(c, CLNK_CTRL);
250 270
251 if (dma_omap1()) 271 if (dma_omap1())
252 val |= 1 << 14; /* set the STOP_LNK bit */ 272 val |= 1 << 14; /* set the STOP_LNK bit */
253 else 273 else
254 val &= ~CLNK_CTRL_ENABLE_LNK; 274 val &= ~CLNK_CTRL_ENABLE_LNK;
255 275
256 c->plat->dma_write(val, CLNK_CTRL, c->dma_ch); 276 omap_dma_chan_write(c, CLNK_CTRL, val);
257 } 277 }
258} 278}
259 279
@@ -273,11 +293,11 @@ static void omap_dma_start_sg(struct omap_chan *c, struct omap_desc *d,
273 cxfi = CSFI; 293 cxfi = CSFI;
274 } 294 }
275 295
276 c->plat->dma_write(sg->addr, cxsa, c->dma_ch); 296 omap_dma_chan_write(c, cxsa, sg->addr);
277 c->plat->dma_write(0, cxei, c->dma_ch); 297 omap_dma_chan_write(c, cxei, 0);
278 c->plat->dma_write(0, cxfi, c->dma_ch); 298 omap_dma_chan_write(c, cxfi, 0);
279 c->plat->dma_write(sg->en, CEN, c->dma_ch); 299 omap_dma_chan_write(c, CEN, sg->en);
280 c->plat->dma_write(sg->fn, CFN, c->dma_ch); 300 omap_dma_chan_write(c, CFN, sg->fn);
281 301
282 omap_dma_start(c, d); 302 omap_dma_start(c, d);
283} 303}
@@ -305,9 +325,9 @@ static void omap_dma_start_desc(struct omap_chan *c)
305 */ 325 */
306 mb(); 326 mb();
307 327
308 c->plat->dma_write(d->ccr, CCR, c->dma_ch); 328 omap_dma_chan_write(c, CCR, d->ccr);
309 if (dma_omap1()) 329 if (dma_omap1())
310 c->plat->dma_write(d->ccr >> 16, CCR2, c->dma_ch); 330 omap_dma_chan_write(c, CCR2, d->ccr >> 16);
311 331
312 if (d->dir == DMA_DEV_TO_MEM) { 332 if (d->dir == DMA_DEV_TO_MEM) {
313 cxsa = CSSA; 333 cxsa = CSSA;
@@ -319,11 +339,11 @@ static void omap_dma_start_desc(struct omap_chan *c)
319 cxfi = CDFI; 339 cxfi = CDFI;
320 } 340 }
321 341
322 c->plat->dma_write(d->dev_addr, cxsa, c->dma_ch); 342 omap_dma_chan_write(c, cxsa, d->dev_addr);
323 c->plat->dma_write(0, cxei, c->dma_ch); 343 omap_dma_chan_write(c, cxei, 0);
324 c->plat->dma_write(d->fi, cxfi, c->dma_ch); 344 omap_dma_chan_write(c, cxfi, d->fi);
325 c->plat->dma_write(d->csdp, CSDP, c->dma_ch); 345 omap_dma_chan_write(c, CSDP, d->csdp);
326 c->plat->dma_write(d->clnk_ctrl, CLNK_CTRL, c->dma_ch); 346 omap_dma_chan_write(c, CLNK_CTRL, d->clnk_ctrl);
327 347
328 omap_dma_start_sg(c, d, 0); 348 omap_dma_start_sg(c, d, 0);
329} 349}
@@ -437,12 +457,12 @@ static dma_addr_t omap_dma_get_src_pos(struct omap_chan *c)
437 dma_addr_t addr; 457 dma_addr_t addr;
438 458
439 if (__dma_omap15xx(od->plat->dma_attr)) 459 if (__dma_omap15xx(od->plat->dma_attr))
440 addr = c->plat->dma_read(CPC, c->dma_ch); 460 addr = omap_dma_chan_read(c, CPC);
441 else 461 else
442 addr = c->plat->dma_read(CSAC, c->dma_ch); 462 addr = omap_dma_chan_read(c, CSAC);
443 463
444 if (od->plat->errata & DMA_ERRATA_3_3 && addr == 0) 464 if (od->plat->errata & DMA_ERRATA_3_3 && addr == 0)
445 addr = c->plat->dma_read(CSAC, c->dma_ch); 465 addr = omap_dma_chan_read(c, CSAC);
446 466
447 if (!__dma_omap15xx(od->plat->dma_attr)) { 467 if (!__dma_omap15xx(od->plat->dma_attr)) {
448 /* 468 /*
@@ -450,14 +470,14 @@ static dma_addr_t omap_dma_get_src_pos(struct omap_chan *c)
450 * not been started (no data has been transferred so far). 470 * not been started (no data has been transferred so far).
451 * Return the programmed source start address in this case. 471 * Return the programmed source start address in this case.
452 */ 472 */
453 if (c->plat->dma_read(CDAC, c->dma_ch)) 473 if (omap_dma_chan_read(c, CDAC))
454 addr = c->plat->dma_read(CSAC, c->dma_ch); 474 addr = omap_dma_chan_read(c, CSAC);
455 else 475 else
456 addr = c->plat->dma_read(CSSA, c->dma_ch); 476 addr = omap_dma_chan_read(c, CSSA);
457 } 477 }
458 478
459 if (dma_omap1()) 479 if (dma_omap1())
460 addr |= c->plat->dma_read(CSSA, c->dma_ch) & 0xffff0000; 480 addr |= omap_dma_chan_read(c, CSSA) & 0xffff0000;
461 481
462 return addr; 482 return addr;
463} 483}
@@ -468,27 +488,27 @@ static dma_addr_t omap_dma_get_dst_pos(struct omap_chan *c)
468 dma_addr_t addr; 488 dma_addr_t addr;
469 489
470 if (__dma_omap15xx(od->plat->dma_attr)) 490 if (__dma_omap15xx(od->plat->dma_attr))
471 addr = c->plat->dma_read(CPC, c->dma_ch); 491 addr = omap_dma_chan_read(c, CPC);
472 else 492 else
473 addr = c->plat->dma_read(CDAC, c->dma_ch); 493 addr = omap_dma_chan_read(c, CDAC);
474 494
475 /* 495 /*
476 * omap 3.2/3.3 erratum: sometimes 0 is returned if CSAC/CDAC is 496 * omap 3.2/3.3 erratum: sometimes 0 is returned if CSAC/CDAC is
477 * read before the DMA controller finished disabling the channel. 497 * read before the DMA controller finished disabling the channel.
478 */ 498 */
479 if (!__dma_omap15xx(od->plat->dma_attr) && addr == 0) { 499 if (!__dma_omap15xx(od->plat->dma_attr) && addr == 0) {
480 addr = c->plat->dma_read(CDAC, c->dma_ch); 500 addr = omap_dma_chan_read(c, CDAC);
481 /* 501 /*
482 * CDAC == 0 indicates that the DMA transfer on the channel has 502 * CDAC == 0 indicates that the DMA transfer on the channel has
483 * not been started (no data has been transferred so far). 503 * not been started (no data has been transferred so far).
484 * Return the programmed destination start address in this case. 504 * Return the programmed destination start address in this case.
485 */ 505 */
486 if (addr == 0) 506 if (addr == 0)
487 addr = c->plat->dma_read(CDSA, c->dma_ch); 507 addr = omap_dma_chan_read(c, CDSA);
488 } 508 }
489 509
490 if (dma_omap1()) 510 if (dma_omap1())
491 addr |= c->plat->dma_read(CDSA, c->dma_ch) & 0xffff0000; 511 addr |= omap_dma_chan_read(c, CDSA) & 0xffff0000;
492 512
493 return addr; 513 return addr;
494} 514}