diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-11-06 12:33:09 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2014-04-03 19:30:25 -0400 |
commit | c5ed98b6ae79545284b7855a07ded32934865a6d (patch) | |
tree | af89c9f8212b23e71d7b8f0be2d6fa601fb0fff9 | |
parent | 45da7b0451b1fe15e882b08c79be58458cbe7a2f (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.c | 102 |
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 | ||
173 | static void omap_dma_glbl_write(struct omap_dmadev *od, unsigned reg, unsigned val) | ||
174 | { | ||
175 | od->plat->dma_write(val, reg, 0); | ||
176 | } | ||
177 | |||
178 | static unsigned omap_dma_glbl_read(struct omap_dmadev *od, unsigned reg) | ||
179 | { | ||
180 | return od->plat->dma_read(reg, 0); | ||
181 | } | ||
182 | |||
183 | static 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 | |||
188 | static unsigned omap_dma_chan_read(struct omap_chan *c, unsigned reg) | ||
189 | { | ||
190 | return c->plat->dma_read(reg, c->dma_ch); | ||
191 | } | ||
192 | |||
173 | static void omap_dma_clear_csr(struct omap_chan *c) | 193 | static 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 | ||
181 | static void omap_dma_start(struct omap_chan *c, struct omap_desc *d) | 201 | static 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 | ||
199 | static void omap_dma_stop(struct omap_chan *c) | 219 | static 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 | } |