• Home
  • Raw
  • Download

Lines Matching +full:tx +full:- +full:threshold

2  * omap-mcpdm.c  --  OMAP ALSA SoC DAI driver using McPDM port
4 * Copyright (C) 2009 - 2011 Texas Instruments
23 * 02110-1301 USA
44 #include "omap-mcpdm.h"
45 #include "sdma-pcm.h"
49 u32 threshold; /* FIFO threshold */ member
83 writel_relaxed(val, mcpdm->io_base + reg); in omap_mcpdm_write()
88 return readl_relaxed(mcpdm->io_base + reg); in omap_mcpdm_read()
94 dev_dbg(mcpdm->dev, "***********************\n"); in omap_mcpdm_reg_dump()
95 dev_dbg(mcpdm->dev, "IRQSTATUS_RAW: 0x%04x\n", in omap_mcpdm_reg_dump()
97 dev_dbg(mcpdm->dev, "IRQSTATUS: 0x%04x\n", in omap_mcpdm_reg_dump()
99 dev_dbg(mcpdm->dev, "IRQENABLE_SET: 0x%04x\n", in omap_mcpdm_reg_dump()
101 dev_dbg(mcpdm->dev, "IRQENABLE_CLR: 0x%04x\n", in omap_mcpdm_reg_dump()
103 dev_dbg(mcpdm->dev, "IRQWAKE_EN: 0x%04x\n", in omap_mcpdm_reg_dump()
105 dev_dbg(mcpdm->dev, "DMAENABLE_SET: 0x%04x\n", in omap_mcpdm_reg_dump()
107 dev_dbg(mcpdm->dev, "DMAENABLE_CLR: 0x%04x\n", in omap_mcpdm_reg_dump()
109 dev_dbg(mcpdm->dev, "DMAWAKEEN: 0x%04x\n", in omap_mcpdm_reg_dump()
111 dev_dbg(mcpdm->dev, "CTRL: 0x%04x\n", in omap_mcpdm_reg_dump()
113 dev_dbg(mcpdm->dev, "DN_DATA: 0x%04x\n", in omap_mcpdm_reg_dump()
115 dev_dbg(mcpdm->dev, "UP_DATA: 0x%04x\n", in omap_mcpdm_reg_dump()
117 dev_dbg(mcpdm->dev, "FIFO_CTRL_DN: 0x%04x\n", in omap_mcpdm_reg_dump()
119 dev_dbg(mcpdm->dev, "FIFO_CTRL_UP: 0x%04x\n", in omap_mcpdm_reg_dump()
121 dev_dbg(mcpdm->dev, "***********************\n"); in omap_mcpdm_reg_dump()
134 u32 link_mask = mcpdm->config[0].link_mask | mcpdm->config[1].link_mask; in omap_mcpdm_start()
190 if (mcpdm->dn_rx_offset) { in omap_mcpdm_open_streams()
191 u32 dn_offset = mcpdm->dn_rx_offset; in omap_mcpdm_open_streams()
199 mcpdm->config[SNDRV_PCM_STREAM_PLAYBACK].threshold); in omap_mcpdm_open_streams()
201 mcpdm->config[SNDRV_PCM_STREAM_CAPTURE].threshold); in omap_mcpdm_open_streams()
228 if (mcpdm->dn_rx_offset) in omap_mcpdm_close_streams()
243 dev_dbg(mcpdm->dev, "DN (playback) FIFO Full\n"); in omap_mcpdm_irq_handler()
246 dev_dbg(mcpdm->dev, "DN (playback) FIFO Empty\n"); in omap_mcpdm_irq_handler()
249 dev_dbg(mcpdm->dev, "DN (playback) write request\n"); in omap_mcpdm_irq_handler()
252 dev_dbg(mcpdm->dev, "UP (capture) FIFO Full\n"); in omap_mcpdm_irq_handler()
255 dev_dbg(mcpdm->dev, "UP (capture) FIFO Empty\n"); in omap_mcpdm_irq_handler()
258 dev_dbg(mcpdm->dev, "UP (capture) write request\n"); in omap_mcpdm_irq_handler()
268 mutex_lock(&mcpdm->mutex); in omap_mcpdm_dai_startup()
270 if (!dai->active) in omap_mcpdm_dai_startup()
273 mutex_unlock(&mcpdm->mutex); in omap_mcpdm_dai_startup()
282 int tx = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); in omap_mcpdm_dai_shutdown() local
283 int stream1 = tx ? SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE; in omap_mcpdm_dai_shutdown()
284 int stream2 = tx ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; in omap_mcpdm_dai_shutdown()
286 mutex_lock(&mcpdm->mutex); in omap_mcpdm_dai_shutdown()
288 if (!dai->active) { in omap_mcpdm_dai_shutdown()
292 mcpdm->config[0].link_mask = 0; in omap_mcpdm_dai_shutdown()
293 mcpdm->config[1].link_mask = 0; in omap_mcpdm_dai_shutdown()
297 if (mcpdm->latency[stream2]) in omap_mcpdm_dai_shutdown()
298 pm_qos_update_request(&mcpdm->pm_qos_req, in omap_mcpdm_dai_shutdown()
299 mcpdm->latency[stream2]); in omap_mcpdm_dai_shutdown()
300 else if (mcpdm->latency[stream1]) in omap_mcpdm_dai_shutdown()
301 pm_qos_remove_request(&mcpdm->pm_qos_req); in omap_mcpdm_dai_shutdown()
303 mcpdm->latency[stream1] = 0; in omap_mcpdm_dai_shutdown()
305 mutex_unlock(&mcpdm->mutex); in omap_mcpdm_dai_shutdown()
313 int stream = substream->stream; in omap_mcpdm_dai_hw_params()
315 u32 threshold; in omap_mcpdm_dai_hw_params() local
324 return -EINVAL; in omap_mcpdm_dai_hw_params()
330 return -EINVAL; in omap_mcpdm_dai_hw_params()
344 return -EINVAL; in omap_mcpdm_dai_hw_params()
349 threshold = mcpdm->config[stream].threshold; in omap_mcpdm_dai_hw_params()
355 if (!mcpdm->config[!stream].link_mask) in omap_mcpdm_dai_hw_params()
356 mcpdm->config[!stream].link_mask = 0x3; in omap_mcpdm_dai_hw_params()
358 dma_data->maxburst = in omap_mcpdm_dai_hw_params()
359 (MCPDM_DN_THRES_MAX - threshold) * channels; in omap_mcpdm_dai_hw_params()
360 latency = threshold; in omap_mcpdm_dai_hw_params()
363 if (!mcpdm->config[!stream].link_mask) in omap_mcpdm_dai_hw_params()
364 mcpdm->config[!stream].link_mask = (0x3 << 3); in omap_mcpdm_dai_hw_params()
366 dma_data->maxburst = threshold * channels; in omap_mcpdm_dai_hw_params()
367 latency = (MCPDM_DN_THRES_MAX - threshold); in omap_mcpdm_dai_hw_params()
374 mcpdm->latency[stream] = latency * USEC_PER_SEC / params_rate(params); in omap_mcpdm_dai_hw_params()
376 if (!mcpdm->latency[stream]) in omap_mcpdm_dai_hw_params()
377 mcpdm->latency[stream] = 10; in omap_mcpdm_dai_hw_params()
380 if (mcpdm->config[stream].link_mask && in omap_mcpdm_dai_hw_params()
381 mcpdm->config[stream].link_mask != link_mask) in omap_mcpdm_dai_hw_params()
382 mcpdm->restart = true; in omap_mcpdm_dai_hw_params()
384 mcpdm->config[stream].link_mask = link_mask; in omap_mcpdm_dai_hw_params()
393 struct pm_qos_request *pm_qos_req = &mcpdm->pm_qos_req; in omap_mcpdm_prepare()
394 int tx = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK); in omap_mcpdm_prepare() local
395 int stream1 = tx ? SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE; in omap_mcpdm_prepare()
396 int stream2 = tx ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; in omap_mcpdm_prepare()
397 int latency = mcpdm->latency[stream2]; in omap_mcpdm_prepare()
400 if (!latency || mcpdm->latency[stream1] < latency) in omap_mcpdm_prepare()
401 latency = mcpdm->latency[stream1]; in omap_mcpdm_prepare()
411 } else if (mcpdm->restart) { in omap_mcpdm_prepare()
414 mcpdm->restart = false; in omap_mcpdm_prepare()
433 pm_runtime_enable(mcpdm->dev); in omap_mcpdm_probe()
436 pm_runtime_get_sync(mcpdm->dev); in omap_mcpdm_probe()
439 ret = request_irq(mcpdm->irq, omap_mcpdm_irq_handler, 0, "McPDM", in omap_mcpdm_probe()
442 pm_runtime_put_sync(mcpdm->dev); in omap_mcpdm_probe()
445 dev_err(mcpdm->dev, "Request for IRQ failed\n"); in omap_mcpdm_probe()
446 pm_runtime_disable(mcpdm->dev); in omap_mcpdm_probe()
449 /* Configure McPDM threshold values */ in omap_mcpdm_probe()
450 mcpdm->config[SNDRV_PCM_STREAM_PLAYBACK].threshold = 2; in omap_mcpdm_probe()
451 mcpdm->config[SNDRV_PCM_STREAM_CAPTURE].threshold = in omap_mcpdm_probe()
452 MCPDM_UP_THRES_MAX - 3; in omap_mcpdm_probe()
455 &mcpdm->dma_data[SNDRV_PCM_STREAM_PLAYBACK], in omap_mcpdm_probe()
456 &mcpdm->dma_data[SNDRV_PCM_STREAM_CAPTURE]); in omap_mcpdm_probe()
465 free_irq(mcpdm->irq, (void *)mcpdm); in omap_mcpdm_remove()
466 pm_runtime_disable(mcpdm->dev); in omap_mcpdm_remove()
468 if (pm_qos_request_active(&mcpdm->pm_qos_req)) in omap_mcpdm_remove()
469 pm_qos_remove_request(&mcpdm->pm_qos_req); in omap_mcpdm_remove()
479 if (dai->active) { in omap_mcpdm_suspend()
484 mcpdm->pm_active_count = 0; in omap_mcpdm_suspend()
485 while (pm_runtime_active(mcpdm->dev)) { in omap_mcpdm_suspend()
486 pm_runtime_put_sync(mcpdm->dev); in omap_mcpdm_suspend()
487 mcpdm->pm_active_count++; in omap_mcpdm_suspend()
497 if (mcpdm->pm_active_count) { in omap_mcpdm_resume()
498 while (mcpdm->pm_active_count--) in omap_mcpdm_resume()
499 pm_runtime_get_sync(mcpdm->dev); in omap_mcpdm_resume()
501 if (dai->active) { in omap_mcpdm_resume()
543 .name = "omap-mcpdm",
549 struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(rtd->cpu_dai); in omap_mcpdm_configure_dn_offsets()
551 mcpdm->dn_rx_offset = MCPDM_DNOFST_RX1(rx1) | MCPDM_DNOFST_RX2(rx2); in omap_mcpdm_configure_dn_offsets()
561 mcpdm = devm_kzalloc(&pdev->dev, sizeof(struct omap_mcpdm), GFP_KERNEL); in asoc_mcpdm_probe()
563 return -ENOMEM; in asoc_mcpdm_probe()
567 mutex_init(&mcpdm->mutex); in asoc_mcpdm_probe()
571 return -ENOMEM; in asoc_mcpdm_probe()
573 mcpdm->dma_data[0].addr = res->start + MCPDM_REG_DN_DATA; in asoc_mcpdm_probe()
574 mcpdm->dma_data[1].addr = res->start + MCPDM_REG_UP_DATA; in asoc_mcpdm_probe()
576 mcpdm->dma_data[0].filter_data = "dn_link"; in asoc_mcpdm_probe()
577 mcpdm->dma_data[1].filter_data = "up_link"; in asoc_mcpdm_probe()
580 mcpdm->io_base = devm_ioremap_resource(&pdev->dev, res); in asoc_mcpdm_probe()
581 if (IS_ERR(mcpdm->io_base)) in asoc_mcpdm_probe()
582 return PTR_ERR(mcpdm->io_base); in asoc_mcpdm_probe()
584 mcpdm->irq = platform_get_irq(pdev, 0); in asoc_mcpdm_probe()
585 if (mcpdm->irq < 0) in asoc_mcpdm_probe()
586 return mcpdm->irq; in asoc_mcpdm_probe()
588 mcpdm->dev = &pdev->dev; in asoc_mcpdm_probe()
590 ret = devm_snd_soc_register_component(&pdev->dev, in asoc_mcpdm_probe()
596 return sdma_pcm_platform_register(&pdev->dev, "dn_link", "up_link"); in asoc_mcpdm_probe()
600 { .compatible = "ti,omap4-mcpdm", },
607 .name = "omap-mcpdm",
616 MODULE_ALIAS("platform:omap-mcpdm");