~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/soc/pxa/pxa2xx-pcm.c

Version: ~ [ linux-5.15-rc5 ] ~ [ linux-5.14.11 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.72 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.152 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.210 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.250 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.286 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.288 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * linux/sound/arm/pxa2xx-pcm.c -- ALSA PCM interface for the Intel PXA2xx chip
  3  *
  4  * Author:      Nicolas Pitre
  5  * Created:     Nov 30, 2004
  6  * Copyright:   (C) 2004 MontaVista Software, Inc.
  7  *
  8  * This program is free software; you can redistribute it and/or modify
  9  * it under the terms of the GNU General Public License version 2 as
 10  * published by the Free Software Foundation.
 11  */
 12 
 13 #include <linux/dma-mapping.h>
 14 #include <linux/module.h>
 15 
 16 #include <sound/core.h>
 17 #include <sound/soc.h>
 18 #include <sound/pxa2xx-lib.h>
 19 
 20 #include "../../arm/pxa2xx-pcm.h"
 21 
 22 static int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
 23         struct snd_pcm_hw_params *params)
 24 {
 25         struct snd_pcm_runtime *runtime = substream->runtime;
 26         struct pxa2xx_runtime_data *prtd = runtime->private_data;
 27         struct snd_soc_pcm_runtime *rtd = substream->private_data;
 28         struct pxa2xx_pcm_dma_params *dma;
 29         int ret;
 30 
 31         dma = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
 32 
 33         /* return if this is a bufferless transfer e.g.
 34          * codec <--> BT codec or GSM modem -- lg FIXME */
 35         if (!dma)
 36                 return 0;
 37 
 38         /* this may get called several times by oss emulation
 39          * with different params */
 40         if (prtd->params == NULL) {
 41                 prtd->params = dma;
 42                 ret = pxa_request_dma(prtd->params->name, DMA_PRIO_LOW,
 43                               pxa2xx_pcm_dma_irq, substream);
 44                 if (ret < 0)
 45                         return ret;
 46                 prtd->dma_ch = ret;
 47         } else if (prtd->params != dma) {
 48                 pxa_free_dma(prtd->dma_ch);
 49                 prtd->params = dma;
 50                 ret = pxa_request_dma(prtd->params->name, DMA_PRIO_LOW,
 51                               pxa2xx_pcm_dma_irq, substream);
 52                 if (ret < 0)
 53                         return ret;
 54                 prtd->dma_ch = ret;
 55         }
 56 
 57         return __pxa2xx_pcm_hw_params(substream, params);
 58 }
 59 
 60 static int pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream)
 61 {
 62         struct pxa2xx_runtime_data *prtd = substream->runtime->private_data;
 63 
 64         __pxa2xx_pcm_hw_free(substream);
 65 
 66         if (prtd->dma_ch >= 0) {
 67                 pxa_free_dma(prtd->dma_ch);
 68                 prtd->dma_ch = -1;
 69                 prtd->params = NULL;
 70         }
 71 
 72         return 0;
 73 }
 74 
 75 static struct snd_pcm_ops pxa2xx_pcm_ops = {
 76         .open           = __pxa2xx_pcm_open,
 77         .close          = __pxa2xx_pcm_close,
 78         .ioctl          = snd_pcm_lib_ioctl,
 79         .hw_params      = pxa2xx_pcm_hw_params,
 80         .hw_free        = pxa2xx_pcm_hw_free,
 81         .prepare        = __pxa2xx_pcm_prepare,
 82         .trigger        = pxa2xx_pcm_trigger,
 83         .pointer        = pxa2xx_pcm_pointer,
 84         .mmap           = pxa2xx_pcm_mmap,
 85 };
 86 
 87 static u64 pxa2xx_pcm_dmamask = DMA_BIT_MASK(32);
 88 
 89 static int pxa2xx_soc_pcm_new(struct snd_soc_pcm_runtime *rtd)
 90 {
 91         struct snd_card *card = rtd->card->snd_card;
 92         struct snd_pcm *pcm = rtd->pcm;
 93         int ret = 0;
 94 
 95         if (!card->dev->dma_mask)
 96                 card->dev->dma_mask = &pxa2xx_pcm_dmamask;
 97         if (!card->dev->coherent_dma_mask)
 98                 card->dev->coherent_dma_mask = DMA_BIT_MASK(32);
 99 
100         if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
101                 ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
102                         SNDRV_PCM_STREAM_PLAYBACK);
103                 if (ret)
104                         goto out;
105         }
106 
107         if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) {
108                 ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
109                         SNDRV_PCM_STREAM_CAPTURE);
110                 if (ret)
111                         goto out;
112         }
113  out:
114         return ret;
115 }
116 
117 static struct snd_soc_platform_driver pxa2xx_soc_platform = {
118         .ops    = &pxa2xx_pcm_ops,
119         .pcm_new        = pxa2xx_soc_pcm_new,
120         .pcm_free       = pxa2xx_pcm_free_dma_buffers,
121 };
122 
123 static int pxa2xx_soc_platform_probe(struct platform_device *pdev)
124 {
125         return snd_soc_register_platform(&pdev->dev, &pxa2xx_soc_platform);
126 }
127 
128 static int pxa2xx_soc_platform_remove(struct platform_device *pdev)
129 {
130         snd_soc_unregister_platform(&pdev->dev);
131         return 0;
132 }
133 
134 static struct platform_driver pxa_pcm_driver = {
135         .driver = {
136                         .name = "pxa-pcm-audio",
137                         .owner = THIS_MODULE,
138         },
139 
140         .probe = pxa2xx_soc_platform_probe,
141         .remove = pxa2xx_soc_platform_remove,
142 };
143 
144 module_platform_driver(pxa_pcm_driver);
145 
146 MODULE_AUTHOR("Nicolas Pitre");
147 MODULE_DESCRIPTION("Intel PXA2xx PCM DMA module");
148 MODULE_LICENSE("GPL");
149 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp