Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: remove unused davinci support

The dm644x and dm3xx SoCs have been removed, as have the
da850_evm/da830_evm machines, the remaining machines all use the
DT based probing and do not use the vcif driver.

Acked-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+3 -553
-40
sound/soc/ti/Kconfig
··· 40 40 - Keystone devices 41 41 - K3 devices (am654, j721e) 42 42 43 - config SND_SOC_DAVINCI_VCIF 44 - tristate "daVinci Voice Interface (VCIF) support" 45 - depends on ARCH_DAVINCI || COMPILE_TEST 46 - select SND_SOC_TI_EDMA_PCM 47 - help 48 - Say Y or M here if you want audio support via daVinci VCIF. 49 - 50 43 config SND_SOC_OMAP_DMIC 51 44 tristate "Digital Microphone Module (DMIC) support" 52 45 depends on ARCH_OMAP4 || SOC_OMAP5 || COMPILE_TEST && COMMON_CLK ··· 170 177 config SND_SOC_DAVINCI_EVM 171 178 tristate "SoC Audio support for DaVinci EVMs" 172 179 depends on ARCH_DAVINCI && I2C 173 - select SND_SOC_DAVINCI_ASP if MACH_DAVINCI_DM355_EVM 174 - select SND_SOC_DAVINCI_ASP if SND_SOC_DM365_AIC3X_CODEC 175 - select SND_SOC_DAVINCI_VCIF if SND_SOC_DM365_VOICE_CODEC 176 - select SND_SOC_DAVINCI_ASP if MACH_DAVINCI_EVM # DM6446 177 - select SND_SOC_DAVINCI_MCASP if MACH_DAVINCI_DM6467_EVM 178 - select SND_SOC_SPDIF if MACH_DAVINCI_DM6467_EVM 179 - select SND_SOC_DAVINCI_MCASP if MACH_DAVINCI_DA830_EVM 180 - select SND_SOC_DAVINCI_MCASP if MACH_DAVINCI_DA850_EVM 181 180 select SND_SOC_TLV320AIC3X 182 181 help 183 182 Say Y if you want to add support for SoC audio on the following TI ··· 180 195 - DM6447 181 196 - DM830 182 197 - DM850 183 - 184 - choice 185 - prompt "DM365 codec select" 186 - depends on SND_SOC_DAVINCI_EVM 187 - depends on MACH_DAVINCI_DM365_EVM 188 - 189 - config SND_SOC_DM365_AIC3X_CODEC 190 - bool "Audio Codec - AIC3101" 191 - help 192 - Say Y if you want to add support for AIC3101 audio codec 193 - 194 - config SND_SOC_DM365_VOICE_CODEC 195 - bool "Voice Codec - CQ93VC" 196 - help 197 - Say Y if you want to add support for SoC On-chip voice codec 198 - endchoice 199 - 200 - config SND_SOC_DM365_SELECT_VOICE_CODECS 201 - def_tristate y 202 - depends on SND_SOC_DM365_VOICE_CODEC && SND_SOC 203 - select MFD_DAVINCI_VOICECODEC 204 - select SND_SOC_CQ0093VC 205 - help 206 - The is an internal symbol needed to ensure that the codec 207 - and MFD driver can be built as loadable modules if necessary. 208 198 209 199 config SND_SOC_J721E_EVM 210 200 tristate "SoC Audio support for j721e EVM"
-2
sound/soc/ti/Makefile
··· 12 12 # CPU DAI drivers 13 13 snd-soc-davinci-asp-objs := davinci-i2s.o 14 14 snd-soc-davinci-mcasp-objs := davinci-mcasp.o 15 - snd-soc-davinci-vcif-objs := davinci-vcif.o 16 15 snd-soc-omap-dmic-objs := omap-dmic.o 17 16 snd-soc-omap-mcbsp-objs := omap-mcbsp.o omap-mcbsp-st.o 18 17 snd-soc-omap-mcpdm-objs := omap-mcpdm.o 19 18 20 19 obj-$(CONFIG_SND_SOC_DAVINCI_ASP) += snd-soc-davinci-asp.o 21 20 obj-$(CONFIG_SND_SOC_DAVINCI_MCASP) += snd-soc-davinci-mcasp.o 22 - obj-$(CONFIG_SND_SOC_DAVINCI_VCIF) += snd-soc-davinci-vcif.o 23 21 obj-$(CONFIG_SND_SOC_OMAP_DMIC) += snd-soc-omap-dmic.o 24 22 obj-$(CONFIG_SND_SOC_OMAP_MCBSP) += snd-soc-omap-mcbsp.o 25 23 obj-$(CONFIG_SND_SOC_OMAP_MCPDM) += snd-soc-omap-mcpdm.o
+3 -264
sound/soc/ti/davinci-evm.c
··· 138 138 return 0; 139 139 } 140 140 141 - /* davinci-evm digital audio interface glue - connects codec <--> CPU */ 142 - SND_SOC_DAILINK_DEFS(dm6446, 143 - DAILINK_COMP_ARRAY(COMP_CPU("davinci-mcbsp")), 144 - DAILINK_COMP_ARRAY(COMP_CODEC("tlv320aic3x-codec.1-001b", 145 - "tlv320aic3x-hifi")), 146 - DAILINK_COMP_ARRAY(COMP_PLATFORM("davinci-mcbsp"))); 147 - 148 - static struct snd_soc_dai_link dm6446_evm_dai = { 149 - .name = "TLV320AIC3X", 150 - .stream_name = "AIC3X", 151 - .init = evm_aic3x_init, 152 - .ops = &evm_ops, 153 - .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_CBM_CFM | 154 - SND_SOC_DAIFMT_IB_NF, 155 - SND_SOC_DAILINK_REG(dm6446), 156 - }; 157 - 158 - SND_SOC_DAILINK_DEFS(dm355, 159 - DAILINK_COMP_ARRAY(COMP_CPU("davinci-mcbsp.1")), 160 - DAILINK_COMP_ARRAY(COMP_CODEC("tlv320aic3x-codec.1-001b", 161 - "tlv320aic3x-hifi")), 162 - DAILINK_COMP_ARRAY(COMP_PLATFORM("davinci-mcbsp.1"))); 163 - 164 - static struct snd_soc_dai_link dm355_evm_dai = { 165 - .name = "TLV320AIC3X", 166 - .stream_name = "AIC3X", 167 - .init = evm_aic3x_init, 168 - .ops = &evm_ops, 169 - .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_CBM_CFM | 170 - SND_SOC_DAIFMT_IB_NF, 171 - SND_SOC_DAILINK_REG(dm355), 172 - }; 173 - 174 - #ifdef CONFIG_SND_SOC_DM365_AIC3X_CODEC 175 - SND_SOC_DAILINK_DEFS(dm365, 176 - DAILINK_COMP_ARRAY(COMP_CPU("davinci-mcbsp")), 177 - DAILINK_COMP_ARRAY(COMP_CODEC("tlv320aic3x-codec.1-0018", 178 - "tlv320aic3x-hifi")), 179 - DAILINK_COMP_ARRAY(COMP_PLATFORM("davinci-mcbsp"))); 180 - #elif defined(CONFIG_SND_SOC_DM365_VOICE_CODEC) 181 - SND_SOC_DAILINK_DEFS(dm365, 182 - DAILINK_COMP_ARRAY(COMP_CPU("davinci-vcif")), 183 - DAILINK_COMP_ARRAY(COMP_CODEC("cq93vc-codec", "cq93vc-hifi")), 184 - DAILINK_COMP_ARRAY(COMP_PLATFORM("davinci-vcif"))); 185 - #endif 186 - 187 - static struct snd_soc_dai_link dm365_evm_dai = { 188 - #ifdef CONFIG_SND_SOC_DM365_AIC3X_CODEC 189 - .name = "TLV320AIC3X", 190 - .stream_name = "AIC3X", 191 - .init = evm_aic3x_init, 192 - .ops = &evm_ops, 193 - .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_CBM_CFM | 194 - SND_SOC_DAIFMT_IB_NF, 195 - SND_SOC_DAILINK_REG(dm365), 196 - #elif defined(CONFIG_SND_SOC_DM365_VOICE_CODEC) 197 - .name = "Voice Codec - CQ93VC", 198 - .stream_name = "CQ93", 199 - SND_SOC_DAILINK_REG(dm365), 200 - #endif 201 - }; 202 - 203 - SND_SOC_DAILINK_DEFS(dm6467_aic3x, 204 - DAILINK_COMP_ARRAY(COMP_CPU("davinci-mcasp.0")), 205 - DAILINK_COMP_ARRAY(COMP_CODEC("tlv320aic3x-codec.0-001a", 206 - "tlv320aic3x-hifi")), 207 - DAILINK_COMP_ARRAY(COMP_PLATFORM("davinci-mcasp.0"))); 208 - 209 - SND_SOC_DAILINK_DEFS(dm6467_spdif, 210 - DAILINK_COMP_ARRAY(COMP_CPU("davinci-mcasp.1")), 211 - DAILINK_COMP_ARRAY(COMP_CODEC("spdif_dit", "dit-hifi")), 212 - DAILINK_COMP_ARRAY(COMP_PLATFORM("davinci-mcasp.1"))); 213 - 214 - static struct snd_soc_dai_link dm6467_evm_dai[] = { 215 - { 216 - .name = "TLV320AIC3X", 217 - .stream_name = "AIC3X", 218 - .init = evm_aic3x_init, 219 - .ops = &evm_ops, 220 - .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_CBM_CFM | 221 - SND_SOC_DAIFMT_IB_NF, 222 - SND_SOC_DAILINK_REG(dm6467_aic3x), 223 - }, 224 - { 225 - .name = "McASP", 226 - .stream_name = "spdif", 227 - .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_CBM_CFM | 228 - SND_SOC_DAIFMT_IB_NF, 229 - SND_SOC_DAILINK_REG(dm6467_spdif), 230 - }, 231 - }; 232 - 233 - SND_SOC_DAILINK_DEFS(da830, 234 - DAILINK_COMP_ARRAY(COMP_CPU("davinci-mcasp.1")), 235 - DAILINK_COMP_ARRAY(COMP_CODEC("tlv320aic3x-codec.1-0018", 236 - "tlv320aic3x-hifi")), 237 - DAILINK_COMP_ARRAY(COMP_PLATFORM("davinci-mcasp.1"))); 238 - 239 - static struct snd_soc_dai_link da830_evm_dai = { 240 - .name = "TLV320AIC3X", 241 - .stream_name = "AIC3X", 242 - .init = evm_aic3x_init, 243 - .ops = &evm_ops, 244 - .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_CBM_CFM | 245 - SND_SOC_DAIFMT_IB_NF, 246 - SND_SOC_DAILINK_REG(da830), 247 - }; 248 - 249 - SND_SOC_DAILINK_DEFS(da850, 250 - DAILINK_COMP_ARRAY(COMP_CPU("davinci-mcasp.0")), 251 - DAILINK_COMP_ARRAY(COMP_CODEC("tlv320aic3x-codec.1-0018", 252 - "tlv320aic3x-hifi")), 253 - DAILINK_COMP_ARRAY(COMP_PLATFORM("davinci-mcasp.0"))); 254 - 255 - static struct snd_soc_dai_link da850_evm_dai = { 256 - .name = "TLV320AIC3X", 257 - .stream_name = "AIC3X", 258 - .init = evm_aic3x_init, 259 - .ops = &evm_ops, 260 - .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_CBM_CFM | 261 - SND_SOC_DAIFMT_IB_NF, 262 - SND_SOC_DAILINK_REG(da850), 263 - }; 264 - 265 - /* davinci dm6446 evm audio machine driver */ 266 - /* 267 - * ASP0 in DM6446 EVM is clocked by U55, as configured by 268 - * board-dm644x-evm.c using GPIOs from U18. There are six 269 - * options; here we "know" we use a 48 KHz sample rate. 270 - */ 271 - static struct snd_soc_card_drvdata_davinci dm6446_snd_soc_card_drvdata = { 272 - .sysclk = 12288000, 273 - }; 274 - 275 - static struct snd_soc_card dm6446_snd_soc_card_evm = { 276 - .name = "DaVinci DM6446 EVM", 277 - .owner = THIS_MODULE, 278 - .dai_link = &dm6446_evm_dai, 279 - .num_links = 1, 280 - .drvdata = &dm6446_snd_soc_card_drvdata, 281 - }; 282 - 283 - /* davinci dm355 evm audio machine driver */ 284 - /* ASP1 on DM355 EVM is clocked by an external oscillator */ 285 - static struct snd_soc_card_drvdata_davinci dm355_snd_soc_card_drvdata = { 286 - .sysclk = 27000000, 287 - }; 288 - 289 - static struct snd_soc_card dm355_snd_soc_card_evm = { 290 - .name = "DaVinci DM355 EVM", 291 - .owner = THIS_MODULE, 292 - .dai_link = &dm355_evm_dai, 293 - .num_links = 1, 294 - .drvdata = &dm355_snd_soc_card_drvdata, 295 - }; 296 - 297 - /* davinci dm365 evm audio machine driver */ 298 - static struct snd_soc_card_drvdata_davinci dm365_snd_soc_card_drvdata = { 299 - .sysclk = 27000000, 300 - }; 301 - 302 - static struct snd_soc_card dm365_snd_soc_card_evm = { 303 - .name = "DaVinci DM365 EVM", 304 - .owner = THIS_MODULE, 305 - .dai_link = &dm365_evm_dai, 306 - .num_links = 1, 307 - .drvdata = &dm365_snd_soc_card_drvdata, 308 - }; 309 - 310 - /* davinci dm6467 evm audio machine driver */ 311 - static struct snd_soc_card_drvdata_davinci dm6467_snd_soc_card_drvdata = { 312 - .sysclk = 27000000, 313 - }; 314 - 315 - static struct snd_soc_card dm6467_snd_soc_card_evm = { 316 - .name = "DaVinci DM6467 EVM", 317 - .owner = THIS_MODULE, 318 - .dai_link = dm6467_evm_dai, 319 - .num_links = ARRAY_SIZE(dm6467_evm_dai), 320 - .drvdata = &dm6467_snd_soc_card_drvdata, 321 - }; 322 - 323 - static struct snd_soc_card_drvdata_davinci da830_snd_soc_card_drvdata = { 324 - .sysclk = 24576000, 325 - }; 326 - 327 - static struct snd_soc_card da830_snd_soc_card = { 328 - .name = "DA830/OMAP-L137 EVM", 329 - .owner = THIS_MODULE, 330 - .dai_link = &da830_evm_dai, 331 - .num_links = 1, 332 - .drvdata = &da830_snd_soc_card_drvdata, 333 - }; 334 - 335 - static struct snd_soc_card_drvdata_davinci da850_snd_soc_card_drvdata = { 336 - .sysclk = 24576000, 337 - }; 338 - 339 - static struct snd_soc_card da850_snd_soc_card = { 340 - .name = "DA850/OMAP-L138 EVM", 341 - .owner = THIS_MODULE, 342 - .dai_link = &da850_evm_dai, 343 - .num_links = 1, 344 - .drvdata = &da850_snd_soc_card_drvdata, 345 - }; 346 - 347 - #if defined(CONFIG_OF) 348 - 349 141 /* 350 142 * The struct is used as place holder. It will be completely 351 143 * filled with data from dt node. ··· 253 461 .driver = { 254 462 .name = "davinci_evm", 255 463 .pm = &snd_soc_pm_ops, 256 - .of_match_table = of_match_ptr(davinci_evm_dt_ids), 464 + .of_match_table = davinci_evm_dt_ids, 257 465 }, 258 466 }; 259 - #endif 260 - 261 - static struct platform_device *evm_snd_device; 262 467 263 468 static int __init evm_init(void) 264 469 { 265 - struct snd_soc_card *evm_snd_dev_data; 266 - int index; 267 - int ret; 268 - 269 - /* 270 - * If dtb is there, the devices will be created dynamically. 271 - * Only register platfrom driver structure. 272 - */ 273 - #if defined(CONFIG_OF) 274 - if (of_have_populated_dt()) 275 - return platform_driver_register(&davinci_evm_driver); 276 - #endif 277 - 278 - if (machine_is_davinci_evm()) { 279 - evm_snd_dev_data = &dm6446_snd_soc_card_evm; 280 - index = 0; 281 - } else if (machine_is_davinci_dm355_evm()) { 282 - evm_snd_dev_data = &dm355_snd_soc_card_evm; 283 - index = 1; 284 - } else if (machine_is_davinci_dm365_evm()) { 285 - evm_snd_dev_data = &dm365_snd_soc_card_evm; 286 - index = 0; 287 - } else if (machine_is_davinci_dm6467_evm()) { 288 - evm_snd_dev_data = &dm6467_snd_soc_card_evm; 289 - index = 0; 290 - } else if (machine_is_davinci_da830_evm()) { 291 - evm_snd_dev_data = &da830_snd_soc_card; 292 - index = 1; 293 - } else if (machine_is_davinci_da850_evm()) { 294 - evm_snd_dev_data = &da850_snd_soc_card; 295 - index = 0; 296 - } else 297 - return -EINVAL; 298 - 299 - evm_snd_device = platform_device_alloc("soc-audio", index); 300 - if (!evm_snd_device) 301 - return -ENOMEM; 302 - 303 - platform_set_drvdata(evm_snd_device, evm_snd_dev_data); 304 - ret = platform_device_add(evm_snd_device); 305 - if (ret) 306 - platform_device_put(evm_snd_device); 307 - 308 - return ret; 470 + return platform_driver_register(&davinci_evm_driver); 309 471 } 310 472 311 473 static void __exit evm_exit(void) 312 474 { 313 - #if defined(CONFIG_OF) 314 - if (of_have_populated_dt()) { 315 - platform_driver_unregister(&davinci_evm_driver); 316 - return; 317 - } 318 - #endif 319 - 320 - platform_device_unregister(evm_snd_device); 475 + platform_driver_unregister(&davinci_evm_driver); 321 476 } 322 477 323 478 module_init(evm_init);
-247
sound/soc/ti/davinci-vcif.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* 3 - * ALSA SoC Voice Codec Interface for TI DAVINCI processor 4 - * 5 - * Copyright (C) 2010 Texas Instruments. 6 - * 7 - * Author: Miguel Aguilar <miguel.aguilar@ridgerun.com> 8 - */ 9 - 10 - #include <linux/init.h> 11 - #include <linux/module.h> 12 - #include <linux/device.h> 13 - #include <linux/delay.h> 14 - #include <linux/slab.h> 15 - #include <linux/io.h> 16 - #include <linux/mfd/davinci_voicecodec.h> 17 - 18 - #include <sound/core.h> 19 - #include <sound/pcm.h> 20 - #include <sound/pcm_params.h> 21 - #include <sound/initval.h> 22 - #include <sound/soc.h> 23 - #include <sound/dmaengine_pcm.h> 24 - 25 - #include "edma-pcm.h" 26 - #include "davinci-i2s.h" 27 - 28 - #define MOD_REG_BIT(val, mask, set) do { \ 29 - if (set) { \ 30 - val |= mask; \ 31 - } else { \ 32 - val &= ~mask; \ 33 - } \ 34 - } while (0) 35 - 36 - struct davinci_vcif_dev { 37 - struct davinci_vc *davinci_vc; 38 - struct snd_dmaengine_dai_dma_data dma_data[2]; 39 - int dma_request[2]; 40 - }; 41 - 42 - static void davinci_vcif_start(struct snd_pcm_substream *substream) 43 - { 44 - struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 45 - struct davinci_vcif_dev *davinci_vcif_dev = 46 - snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); 47 - struct davinci_vc *davinci_vc = davinci_vcif_dev->davinci_vc; 48 - u32 w; 49 - 50 - /* Start the sample generator and enable transmitter/receiver */ 51 - w = readl(davinci_vc->base + DAVINCI_VC_CTRL); 52 - 53 - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 54 - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTDAC, 0); 55 - else 56 - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTADC, 0); 57 - 58 - writel(w, davinci_vc->base + DAVINCI_VC_CTRL); 59 - } 60 - 61 - static void davinci_vcif_stop(struct snd_pcm_substream *substream) 62 - { 63 - struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); 64 - struct davinci_vcif_dev *davinci_vcif_dev = 65 - snd_soc_dai_get_drvdata(asoc_rtd_to_cpu(rtd, 0)); 66 - struct davinci_vc *davinci_vc = davinci_vcif_dev->davinci_vc; 67 - u32 w; 68 - 69 - /* Reset transmitter/receiver and sample rate/frame sync generators */ 70 - w = readl(davinci_vc->base + DAVINCI_VC_CTRL); 71 - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 72 - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTDAC, 1); 73 - else 74 - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RSTADC, 1); 75 - 76 - writel(w, davinci_vc->base + DAVINCI_VC_CTRL); 77 - } 78 - 79 - static int davinci_vcif_hw_params(struct snd_pcm_substream *substream, 80 - struct snd_pcm_hw_params *params, 81 - struct snd_soc_dai *dai) 82 - { 83 - struct davinci_vcif_dev *davinci_vcif_dev = snd_soc_dai_get_drvdata(dai); 84 - struct davinci_vc *davinci_vc = davinci_vcif_dev->davinci_vc; 85 - u32 w; 86 - 87 - /* Restart the codec before setup */ 88 - davinci_vcif_stop(substream); 89 - davinci_vcif_start(substream); 90 - 91 - /* General line settings */ 92 - writel(DAVINCI_VC_CTRL_MASK, davinci_vc->base + DAVINCI_VC_CTRL); 93 - 94 - writel(DAVINCI_VC_INT_MASK, davinci_vc->base + DAVINCI_VC_INTCLR); 95 - 96 - writel(DAVINCI_VC_INT_MASK, davinci_vc->base + DAVINCI_VC_INTEN); 97 - 98 - w = readl(davinci_vc->base + DAVINCI_VC_CTRL); 99 - 100 - /* Determine xfer data type */ 101 - switch (params_format(params)) { 102 - case SNDRV_PCM_FORMAT_U8: 103 - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RD_BITS_8 | 104 - DAVINCI_VC_CTRL_RD_UNSIGNED | 105 - DAVINCI_VC_CTRL_WD_BITS_8 | 106 - DAVINCI_VC_CTRL_WD_UNSIGNED, 1); 107 - break; 108 - case SNDRV_PCM_FORMAT_S8: 109 - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RD_BITS_8 | 110 - DAVINCI_VC_CTRL_WD_BITS_8, 1); 111 - 112 - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RD_UNSIGNED | 113 - DAVINCI_VC_CTRL_WD_UNSIGNED, 0); 114 - break; 115 - case SNDRV_PCM_FORMAT_S16_LE: 116 - MOD_REG_BIT(w, DAVINCI_VC_CTRL_RD_BITS_8 | 117 - DAVINCI_VC_CTRL_RD_UNSIGNED | 118 - DAVINCI_VC_CTRL_WD_BITS_8 | 119 - DAVINCI_VC_CTRL_WD_UNSIGNED, 0); 120 - break; 121 - default: 122 - printk(KERN_WARNING "davinci-vcif: unsupported PCM format"); 123 - return -EINVAL; 124 - } 125 - 126 - writel(w, davinci_vc->base + DAVINCI_VC_CTRL); 127 - 128 - return 0; 129 - } 130 - 131 - static int davinci_vcif_trigger(struct snd_pcm_substream *substream, int cmd, 132 - struct snd_soc_dai *dai) 133 - { 134 - int ret = 0; 135 - 136 - switch (cmd) { 137 - case SNDRV_PCM_TRIGGER_START: 138 - case SNDRV_PCM_TRIGGER_RESUME: 139 - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: 140 - davinci_vcif_start(substream); 141 - break; 142 - case SNDRV_PCM_TRIGGER_STOP: 143 - case SNDRV_PCM_TRIGGER_SUSPEND: 144 - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 145 - davinci_vcif_stop(substream); 146 - break; 147 - default: 148 - ret = -EINVAL; 149 - } 150 - 151 - return ret; 152 - } 153 - 154 - #define DAVINCI_VCIF_RATES SNDRV_PCM_RATE_8000_48000 155 - 156 - static const struct snd_soc_dai_ops davinci_vcif_dai_ops = { 157 - .trigger = davinci_vcif_trigger, 158 - .hw_params = davinci_vcif_hw_params, 159 - }; 160 - 161 - static int davinci_vcif_dai_probe(struct snd_soc_dai *dai) 162 - { 163 - struct davinci_vcif_dev *dev = snd_soc_dai_get_drvdata(dai); 164 - 165 - dai->playback_dma_data = &dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK]; 166 - dai->capture_dma_data = &dev->dma_data[SNDRV_PCM_STREAM_CAPTURE]; 167 - 168 - return 0; 169 - } 170 - 171 - static struct snd_soc_dai_driver davinci_vcif_dai = { 172 - .probe = davinci_vcif_dai_probe, 173 - .playback = { 174 - .channels_min = 1, 175 - .channels_max = 2, 176 - .rates = DAVINCI_VCIF_RATES, 177 - .formats = SNDRV_PCM_FMTBIT_S16_LE,}, 178 - .capture = { 179 - .channels_min = 1, 180 - .channels_max = 2, 181 - .rates = DAVINCI_VCIF_RATES, 182 - .formats = SNDRV_PCM_FMTBIT_S16_LE,}, 183 - .ops = &davinci_vcif_dai_ops, 184 - 185 - }; 186 - 187 - static const struct snd_soc_component_driver davinci_vcif_component = { 188 - .name = "davinci-vcif", 189 - .legacy_dai_naming = 1, 190 - }; 191 - 192 - static int davinci_vcif_probe(struct platform_device *pdev) 193 - { 194 - struct davinci_vc *davinci_vc = pdev->dev.platform_data; 195 - struct davinci_vcif_dev *davinci_vcif_dev; 196 - int ret; 197 - 198 - davinci_vcif_dev = devm_kzalloc(&pdev->dev, 199 - sizeof(struct davinci_vcif_dev), 200 - GFP_KERNEL); 201 - if (!davinci_vcif_dev) 202 - return -ENOMEM; 203 - 204 - /* DMA tx params */ 205 - davinci_vcif_dev->davinci_vc = davinci_vc; 206 - davinci_vcif_dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].filter_data = 207 - &davinci_vc->davinci_vcif.dma_tx_channel; 208 - davinci_vcif_dev->dma_data[SNDRV_PCM_STREAM_PLAYBACK].addr = 209 - davinci_vc->davinci_vcif.dma_tx_addr; 210 - 211 - /* DMA rx params */ 212 - davinci_vcif_dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].filter_data = 213 - &davinci_vc->davinci_vcif.dma_rx_channel; 214 - davinci_vcif_dev->dma_data[SNDRV_PCM_STREAM_CAPTURE].addr = 215 - davinci_vc->davinci_vcif.dma_rx_addr; 216 - 217 - dev_set_drvdata(&pdev->dev, davinci_vcif_dev); 218 - 219 - ret = devm_snd_soc_register_component(&pdev->dev, 220 - &davinci_vcif_component, 221 - &davinci_vcif_dai, 1); 222 - if (ret != 0) { 223 - dev_err(&pdev->dev, "could not register dai\n"); 224 - return ret; 225 - } 226 - 227 - ret = edma_pcm_platform_register(&pdev->dev); 228 - if (ret) { 229 - dev_err(&pdev->dev, "register PCM failed: %d\n", ret); 230 - return ret; 231 - } 232 - 233 - return 0; 234 - } 235 - 236 - static struct platform_driver davinci_vcif_driver = { 237 - .probe = davinci_vcif_probe, 238 - .driver = { 239 - .name = "davinci-vcif", 240 - }, 241 - }; 242 - 243 - module_platform_driver(davinci_vcif_driver); 244 - 245 - MODULE_AUTHOR("Miguel Aguilar"); 246 - MODULE_DESCRIPTION("Texas Instruments DaVinci ASoC Voice Codec Interface"); 247 - MODULE_LICENSE("GPL");