aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/omap-dma.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-10-08 18:07:14 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-10-08 18:07:14 -0400
commitf5a246eab9a268f51ba8189ea5b098a1bfff200e (patch)
treea6ff7169e0bcaca498d9aec8b0624de1b74eaecb /drivers/dma/omap-dma.c
parentd5bbd43d5f450c3fca058f5b85f3dfb4e8cc88c9 (diff)
parent7ff34ad80b7080fafaac8efa9ef0061708eddd51 (diff)
Merge tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound updates from Takashi Iwai: "This contains pretty many small commits covering fairly large range of files in sound/ directory. Partly because of additional API support and partly because of constantly developed ASoC and ARM stuff. Some highlights: - Introduced the helper function and documentation for exposing the channel map via control API, as discussed in Plumbers; most of PCI drivers are covered, will follow more drivers later - Most of drivers have been replaced with the new PM callbacks (if the bus is supported) - HD-audio controller got the support of runtime PM and the support of D3 clock-stop. Also changing the power_save option in sysfs kicks off immediately to enable / disable the power-save mode. - Another significant code change in HD-audio is the rewrite of firmware loading code. Other than that, most of changes in HD-audio are continued cleanups and standardization for the generic auto parser and bug fixes (HBR, device-specific fixups), in addition to the support of channel-map API. - Addition of ASoC bindings for the compressed API, used by the mid-x86 drivers. - Lots of cleanups and API refreshes for ASoC codec drivers and DaVinci. - Conversion of OMAP to dmaengine. - New machine driver for Wolfson Microelectronics Bells. - New CODEC driver for Wolfson Microelectronics WM0010. - Enhancements to the ux500 and wm2000 drivers - A new driver for DA9055 and the support for regulator bypass mode." Fix up various arm soc header file reorg conflicts. * tag 'sound-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (339 commits) ALSA: hda - Add new codec ALC283 ALC290 support ALSA: hda - avoid unneccesary indices on "Headphone Jack" controls ALSA: hda - fix indices on boost volume on Conexant ALSA: aloop - add locking to timer access ALSA: hda - Fix hang caused by race during suspend. sound: Remove unnecessary semicolon ALSA: hda/realtek - Fix detection of ALC271X codec ALSA: hda - Add inverted internal mic quirk for Lenovo IdeaPad U310 ALSA: hda - make Realtek/Sigmatel/Conexant use the generic unsol event ALSA: hda - make a generic unsol event handler ASoC: codecs: Add DA9055 codec driver ASoC: eukrea-tlv320: Convert it to platform driver ALSA: ASoC: add DT bindings for CS4271 ASoC: wm_hubs: Ensure volume updates are handled during class W startup ASoC: wm5110: Adding missing volume update bits ASoC: wm5110: Add OUT3R support ASoC: wm5110: Add AEC loopback support ASoC: wm5110: Rename EPOUT to HPOUT3 ASoC: arizona: Add more clock rates ASoC: arizona: Add more DSP options for mixer input muxes ...
Diffstat (limited to 'drivers/dma/omap-dma.c')
-rw-r--r--drivers/dma/omap-dma.c45
1 files changed, 36 insertions, 9 deletions
diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c
index 2e1662777661..bb2d8e7029eb 100644
--- a/drivers/dma/omap-dma.c
+++ b/drivers/dma/omap-dma.c
@@ -36,6 +36,7 @@ struct omap_chan {
36 struct dma_slave_config cfg; 36 struct dma_slave_config cfg;
37 unsigned dma_sig; 37 unsigned dma_sig;
38 bool cyclic; 38 bool cyclic;
39 bool paused;
39 40
40 int dma_ch; 41 int dma_ch;
41 struct omap_desc *desc; 42 struct omap_desc *desc;
@@ -367,7 +368,8 @@ static struct dma_async_tx_descriptor *omap_dma_prep_slave_sg(
367 368
368static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic( 369static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
369 struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, 370 struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
370 size_t period_len, enum dma_transfer_direction dir, void *context) 371 size_t period_len, enum dma_transfer_direction dir, unsigned long flags,
372 void *context)
371{ 373{
372 struct omap_chan *c = to_omap_dma_chan(chan); 374 struct omap_chan *c = to_omap_dma_chan(chan);
373 enum dma_slave_buswidth dev_width; 375 enum dma_slave_buswidth dev_width;
@@ -415,7 +417,10 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
415 d->dev_addr = dev_addr; 417 d->dev_addr = dev_addr;
416 d->fi = burst; 418 d->fi = burst;
417 d->es = es; 419 d->es = es;
418 d->sync_mode = OMAP_DMA_SYNC_PACKET; 420 if (burst)
421 d->sync_mode = OMAP_DMA_SYNC_PACKET;
422 else
423 d->sync_mode = OMAP_DMA_SYNC_ELEMENT;
419 d->sync_type = sync_type; 424 d->sync_type = sync_type;
420 d->periph_port = OMAP_DMA_PORT_MPUI; 425 d->periph_port = OMAP_DMA_PORT_MPUI;
421 d->sg[0].addr = buf_addr; 426 d->sg[0].addr = buf_addr;
@@ -426,7 +431,10 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
426 if (!c->cyclic) { 431 if (!c->cyclic) {
427 c->cyclic = true; 432 c->cyclic = true;
428 omap_dma_link_lch(c->dma_ch, c->dma_ch); 433 omap_dma_link_lch(c->dma_ch, c->dma_ch);
429 omap_enable_dma_irq(c->dma_ch, OMAP_DMA_FRAME_IRQ); 434
435 if (flags & DMA_PREP_INTERRUPT)
436 omap_enable_dma_irq(c->dma_ch, OMAP_DMA_FRAME_IRQ);
437
430 omap_disable_dma_irq(c->dma_ch, OMAP_DMA_BLOCK_IRQ); 438 omap_disable_dma_irq(c->dma_ch, OMAP_DMA_BLOCK_IRQ);
431 } 439 }
432 440
@@ -435,7 +443,7 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
435 omap_set_dma_dest_burst_mode(c->dma_ch, OMAP_DMA_DATA_BURST_16); 443 omap_set_dma_dest_burst_mode(c->dma_ch, OMAP_DMA_DATA_BURST_16);
436 } 444 }
437 445
438 return vchan_tx_prep(&c->vc, &d->vd, DMA_CTRL_ACK | DMA_PREP_INTERRUPT); 446 return vchan_tx_prep(&c->vc, &d->vd, flags);
439} 447}
440 448
441static int omap_dma_slave_config(struct omap_chan *c, struct dma_slave_config *cfg) 449static int omap_dma_slave_config(struct omap_chan *c, struct dma_slave_config *cfg)
@@ -469,11 +477,14 @@ static int omap_dma_terminate_all(struct omap_chan *c)
469 */ 477 */
470 if (c->desc) { 478 if (c->desc) {
471 c->desc = NULL; 479 c->desc = NULL;
472 omap_stop_dma(c->dma_ch); 480 /* Avoid stopping the dma twice */
481 if (!c->paused)
482 omap_stop_dma(c->dma_ch);
473 } 483 }
474 484
475 if (c->cyclic) { 485 if (c->cyclic) {
476 c->cyclic = false; 486 c->cyclic = false;
487 c->paused = false;
477 omap_dma_unlink_lch(c->dma_ch, c->dma_ch); 488 omap_dma_unlink_lch(c->dma_ch, c->dma_ch);
478 } 489 }
479 490
@@ -486,14 +497,30 @@ static int omap_dma_terminate_all(struct omap_chan *c)
486 497
487static int omap_dma_pause(struct omap_chan *c) 498static int omap_dma_pause(struct omap_chan *c)
488{ 499{
489 /* FIXME: not supported by platform private API */ 500 /* Pause/Resume only allowed with cyclic mode */
490 return -EINVAL; 501 if (!c->cyclic)
502 return -EINVAL;
503
504 if (!c->paused) {
505 omap_stop_dma(c->dma_ch);
506 c->paused = true;
507 }
508
509 return 0;
491} 510}
492 511
493static int omap_dma_resume(struct omap_chan *c) 512static int omap_dma_resume(struct omap_chan *c)
494{ 513{
495 /* FIXME: not supported by platform private API */ 514 /* Pause/Resume only allowed with cyclic mode */
496 return -EINVAL; 515 if (!c->cyclic)
516 return -EINVAL;
517
518 if (c->paused) {
519 omap_start_dma(c->dma_ch);
520 c->paused = false;
521 }
522
523 return 0;
497} 524}
498 525
499static int omap_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, 526static int omap_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,