2 * Copyright (C) 2007 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 /*******************************************************************************
34 *------------------------------------------------------------------------------
40 *******************************************************************************/
43 /*****************************************************************************
44 * C O M P I L E R F L A G S
45 *****************************************************************************/
48 /*****************************************************************************
49 * E X T E R N A L R E F E R E N C E S
50 *****************************************************************************/
52 #include <linux/dma-mapping.h>
53 #include <linux/init.h>
54 #include <linux/module.h>
55 #include <linux/device.h>
56 #include <linux/platform_device.h>
57 #include <sound/core.h>
58 #include <sound/pcm.h>
59 #include <sound/soc.h>
61 #include "AudDrv_Common.h"
62 #include "AudDrv_Def.h"
63 #include "AudDrv_Afe.h"
64 #include "AudDrv_Ana.h"
65 #include "AudDrv_Clk.h"
66 #include "mt_soc_pcm_common.h"
69 /* Conventional and unconventional sample rate supported */
70 static unsigned int audio_ap_supported_high_sample_rates
[] =
72 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000,
76 static struct snd_pcm_hw_constraint_list constraints_sample_rates
=
78 .count
= ARRAY_SIZE(audio_ap_supported_high_sample_rates
),
79 .list
= audio_ap_supported_high_sample_rates
,
84 static int multimedia_startup(struct snd_pcm_substream
*substream
,
85 struct snd_soc_dai
*dai
)
87 snd_pcm_hw_constraint_list(substream
->runtime
, 0,
88 SNDRV_PCM_HW_PARAM_RATE
,
89 &constraints_sample_rates
);
93 static struct snd_soc_dai_ops mtk_dai_stub_ops
=
95 .startup
= multimedia_startup
,
98 static struct snd_soc_dai_driver mtk_dai_stub_dai
[] =
102 .stream_name
= MT_SOC_DL1_STREAM_NAME
,
103 .rates
= SNDRV_PCM_RATE_8000_192000
,
104 .formats
= SND_SOC_ADV_MT_FMTS
,
110 .name
= MT_SOC_DL1DAI_NAME
,
111 .ops
= &mtk_dai_stub_ops
,
115 .stream_name
= MT_SOC_UL1_STREAM_NAME
,
116 .rates
= SNDRV_PCM_RATE_8000_192000
,
117 .formats
= SND_SOC_ADV_MT_FMTS
,
123 .name
= MT_SOC_UL1DAI_NAME
,
124 .ops
= &mtk_dai_stub_ops
,
128 .stream_name
= MT_SOC_TDM_CAPTURE_STREAM_NAME
,
129 .rates
= SNDRV_PCM_RATE_8000_48000
,
130 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
136 .name
= MT_SOC_TDMRX_NAME
,
137 .ops
= &mtk_dai_stub_ops
,
141 .stream_name
= MT_SOC_HDMI_STREAM_NAME
,
142 .rates
= SNDRV_PCM_RATE_8000_192000
,
143 .formats
= SND_SOC_ADV_MT_FMTS
,
150 .stream_name
= MT_SOC_HDMI_STREAM_NAME
,
151 .rates
= SNDRV_PCM_RATE_8000_192000
,
152 .formats
= SND_SOC_ADV_MT_FMTS
,
158 .name
= MT_SOC_HDMI_NAME
,
159 .ops
= &mtk_dai_stub_ops
,
163 .stream_name
= MT_SOC_VOICE_MD1_BT_STREAM_NAME
,
164 .rates
= SNDRV_PCM_RATE_8000_48000
,
165 .formats
= SND_SOC_ADV_MT_FMTS
,
171 .name
= MT_SOC_VOICE_MD1_BT_NAME
,
172 .ops
= &mtk_dai_stub_ops
,
177 .stream_name
= MT_SOC_VOICE_MD2_BT_STREAM_NAME
,
178 .rates
= SNDRV_PCM_RATE_8000_48000
,
179 .formats
= SND_SOC_ADV_MT_FMTS
,
185 .name
= MT_SOC_VOICE_MD2_BT_NAME
,
186 .ops
= &mtk_dai_stub_ops
,
190 .stream_name
= MT_SOC_VOIP_BT_OUT_STREAM_NAME
,
191 .rates
= SNDRV_PCM_RATE_8000_48000
,
192 .formats
= SND_SOC_ADV_MT_FMTS
,
198 .name
= MT_SOC_VOIP_CALL_BT_OUT_NAME
,
199 .ops
= &mtk_dai_stub_ops
,
203 .stream_name
= MT_SOC_VOIP_BT_IN_STREAM_NAME
,
204 .rates
= SNDRV_PCM_RATE_8000_48000
,
205 .formats
= SND_SOC_ADV_MT_FMTS
,
211 .name
= MT_SOC_VOIP_CALL_BT_IN_NAME
,
212 .ops
= &mtk_dai_stub_ops
,
216 .stream_name
= MT_SOC_FM_I2S2_STREAM_NAME
,
217 .rates
= SNDRV_PCM_RATE_8000_48000
,
218 .formats
= SND_SOC_ADV_MT_FMTS
,
224 .name
= "FM_I2S2_OUT",
225 .ops
= &mtk_dai_stub_ops
,
229 .stream_name
= MT_SOC_FM_I2S2_RECORD_STREAM_NAME
,
230 .rates
= SNDRV_PCM_RATE_8000_48000
,
231 .formats
= SND_SOC_ADV_MT_FMTS
,
237 .name
= "FM_I2S2_IN",
238 .ops
= &mtk_dai_stub_ops
,
242 .stream_name
= MT_SOC_VOICE_MD1_STREAM_NAME
,
243 .rates
= SNDRV_PCM_RATE_8000_48000
,
244 .formats
= SND_SOC_STD_MT_FMTS
,
251 .stream_name
= MT_SOC_VOICE_MD1_STREAM_NAME
,
252 .rates
= SNDRV_PCM_RATE_8000_48000
,
253 .formats
= SND_SOC_STD_MT_FMTS
,
259 .name
= MT_SOC_VOICE_MD1_NAME
,
260 .ops
= &mtk_dai_stub_ops
,
264 .stream_name
= MT_SOC_VOICE_MD2_STREAM_NAME
,
265 .rates
= SNDRV_PCM_RATE_8000_48000
,
266 .formats
= SND_SOC_STD_MT_FMTS
,
273 .stream_name
= MT_SOC_VOICE_MD2_STREAM_NAME
,
274 .rates
= SNDRV_PCM_RATE_8000_48000
,
275 .formats
= SND_SOC_STD_MT_FMTS
,
281 .name
= MT_SOC_VOICE_MD2_NAME
,
282 .ops
= &mtk_dai_stub_ops
,
286 .stream_name
= MT_SOC_ULDLLOOPBACK_STREAM_NAME
,
287 .rates
= SNDRV_PCM_RATE_8000_48000
,
288 .formats
= SND_SOC_ADV_MT_FMTS
,
295 .stream_name
= MT_SOC_ULDLLOOPBACK_STREAM_NAME
,
296 .rates
= SNDRV_PCM_RATE_8000_48000
,
297 .formats
= SND_SOC_ADV_MT_FMTS
,
303 .name
= MT_SOC_ULDLLOOPBACK_NAME
,
304 .ops
= &mtk_dai_stub_ops
,
308 .stream_name
= MT_SOC_I2S0_STREAM_NAME
,
309 .rates
= SNDRV_PCM_RATE_8000_192000
,
310 .formats
= SND_SOC_ADV_MT_FMTS
,
317 .stream_name
= MT_SOC_I2S0_STREAM_NAME
,
318 .rates
= SNDRV_PCM_RATE_8000_192000
,
319 .formats
= SND_SOC_ADV_MT_FMTS
,
325 .name
= MT_SOC_I2S0_NAME
,
326 .ops
= &mtk_dai_stub_ops
,
330 .stream_name
= MT_SOC_I2SDL1_STREAM_NAME
,
331 .rates
= SNDRV_PCM_RATE_8000_192000
,
332 .formats
= SND_SOC_ADV_MT_FMTS
,
338 .name
= MT_SOC_I2S0DL1_NAME
,
339 .ops
= &mtk_dai_stub_ops
,
343 .stream_name
= MT_SOC_DL1_AWB_RECORD_STREAM_NAME
,
344 .rates
= SNDRV_PCM_RATE_8000_192000
,
345 .formats
= SND_SOC_ADV_MT_FMTS
,
351 .name
= MT_SOC_DL1AWB_NAME
,
352 .ops
= &mtk_dai_stub_ops
,
356 .stream_name
= MT_SOC_MRGRX_STREAM_NAME
,
357 .rates
= SNDRV_PCM_RATE_8000_48000
,
358 .formats
= SND_SOC_ADV_MT_FMTS
,
365 .stream_name
= MT_SOC_MRGRX_STREAM_NAME
,
366 .rates
= SNDRV_PCM_RATE_8000_48000
,
367 .formats
= SND_SOC_ADV_MT_FMTS
,
373 .name
= MT_SOC_MRGRX_NAME
,
374 .ops
= &mtk_dai_stub_ops
,
378 .stream_name
= MT_SOC_MRGRX_CAPTURE_STREAM_NAME
,
379 .rates
= SNDRV_PCM_RATE_8000_48000
,
380 .formats
= SND_SOC_ADV_MT_FMTS
,
387 .stream_name
= MT_SOC_MRGRX_CAPTURE_STREAM_NAME
,
388 .rates
= SNDRV_PCM_RATE_8000_48000
,
389 .formats
= SND_SOC_ADV_MT_FMTS
,
395 .name
= MT_SOC_MRGRXCAPTURE_NAME
,
396 .ops
= &mtk_dai_stub_ops
,
400 .stream_name
= MT_SOC_FM_MRGTX_STREAM_NAME
,
401 .rates
= SNDRV_PCM_RATE_44100
,
402 .formats
= SND_SOC_ADV_MT_FMTS
,
408 .name
= MT_SOC_FM_MRGTX_NAME
,
409 .ops
= &mtk_dai_stub_ops
,
413 .stream_name
= MT_SOC_UL1DATA2_STREAM_NAME
,
414 .rates
= SNDRV_PCM_RATE_8000_48000
,
415 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
421 .name
= MT_SOC_UL2DAI_NAME
,
422 .ops
= &mtk_dai_stub_ops
,
426 .stream_name
= MT_SOC_I2S0AWB_STREAM_NAME
,
427 .rates
= SNDRV_PCM_RATE_8000_48000
,
428 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
434 .name
= MT_SOC_I2S0AWBDAI_NAME
,
435 .ops
= &mtk_dai_stub_ops
,
440 .stream_name
= MT_SOC_MODADCI2S_STREAM_NAME
,
441 .rates
= SNDRV_PCM_RATE_8000_48000
,
442 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
448 .name
= MT_SOC_MODADCI2SDAI_NAME
,
449 .ops
= &mtk_dai_stub_ops
,
454 .stream_name
= MT_SOC_ADC2AWB_STREAM_NAME
,
455 .rates
= SNDRV_PCM_RATE_8000_192000
,
456 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
462 .name
= MT_SOC_ADC2AWBDAI_NAME
,
463 .ops
= &mtk_dai_stub_ops
,
467 .stream_name
= MT_SOC_IO2DAI_STREAM_NAME
,
468 .rates
= SNDRV_PCM_RATE_8000_48000
,
469 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
475 .name
= MT_SOC_IO2DAIDAI_NAME
,
476 .ops
= &mtk_dai_stub_ops
,
480 .stream_name
= MT_SOC_HP_IMPEDANCE_STREAM_NAME
,
481 .rates
= SNDRV_PCM_RATE_8000_48000
,
482 .formats
= SND_SOC_ADV_MT_FMTS
,
488 .name
= MT_SOC_HP_IMPEDANCE_NAME
,
489 .ops
= &mtk_dai_stub_ops
,
493 .stream_name
= MT_SOC_FM_I2S_PLAYBACK_STREAM_NAME
,
494 .rates
= SNDRV_PCM_RATE_8000_48000
,
495 .formats
= SND_SOC_ADV_MT_FMTS
,
502 .stream_name
= MT_SOC_FM_I2S_PLAYBACK_STREAM_NAME
,
503 .rates
= SNDRV_PCM_RATE_8000_48000
,
504 .formats
= SND_SOC_ADV_MT_FMTS
,
510 .name
= MT_SOC_FM_I2S_NAME
,
511 .ops
= &mtk_dai_stub_ops
,
515 .stream_name
= MT_SOC_FM_I2S_CAPTURE_STREAM_NAME
,
516 .rates
= SNDRV_PCM_RATE_8000_48000
,
517 .formats
= SND_SOC_ADV_MT_FMTS
,
524 .stream_name
= MT_SOC_FM_I2S_CAPTURE_STREAM_NAME
,
525 .rates
= SNDRV_PCM_RATE_8000_48000
,
526 .formats
= SND_SOC_ADV_MT_FMTS
,
532 .name
= MT_SOC_FM_I2S_CAPTURE_NAME
,
533 .ops
= &mtk_dai_stub_ops
,
538 static const struct snd_soc_component_driver mt_dai_component
=
540 .name
= MT_SOC_DAI_NAME
,
543 static int mtk_dai_stub_dev_probe(struct platform_device
*pdev
)
547 printk("mtk_dai_stub_dev_probe name %s\n", dev_name(&pdev
->dev
));
549 pdev
->dev
.coherent_dma_mask
= DMA_BIT_MASK(64);
550 if (pdev
->dev
.dma_mask
== NULL
)
552 pdev
->dev
.dma_mask
= &pdev
->dev
.coherent_dma_mask
;
555 if (pdev
->dev
.of_node
)
557 dev_set_name(&pdev
->dev
, "%s", MT_SOC_DAI_NAME
);
559 printk("%s: dev name %s\n", __func__
, dev_name(&pdev
->dev
));
561 rc
= snd_soc_register_component(&pdev
->dev
, &mt_dai_component
,
562 mtk_dai_stub_dai
, ARRAY_SIZE(mtk_dai_stub_dai
));
564 printk("%s: rc = %d\n", __func__
, rc
);
568 static int mtk_dai_stub_dev_remove(struct platform_device
*pdev
)
570 printk("%s:\n", __func__
);
572 snd_soc_unregister_component(&pdev
->dev
);
578 static const struct of_device_id mt_soc_dai_stub_of_ids
[] =
580 { .compatible
= "mediatek,mt_soc_dai_stub", },
585 static struct platform_driver mtk_dai_stub_driver
=
587 .probe
= mtk_dai_stub_dev_probe
,
588 .remove
= mtk_dai_stub_dev_remove
,
590 .name
= MT_SOC_DAI_NAME
,
591 .owner
= THIS_MODULE
,
593 .of_match_table
= mt_soc_dai_stub_of_ids
,
599 static struct platform_device
*soc_mtk_dai_dev
;
602 static int __init
mtk_dai_stub_init(void)
604 printk("%s:\n", __func__
);
607 soc_mtk_dai_dev
= platform_device_alloc(MT_SOC_DAI_NAME
, -1);
608 if (!soc_mtk_dai_dev
)
612 ret
= platform_device_add(soc_mtk_dai_dev
);
615 platform_device_put(soc_mtk_dai_dev
);
619 return platform_driver_register(&mtk_dai_stub_driver
);
622 static void __exit
mtk_dai_stub_exit(void)
624 printk("%s:\n", __func__
);
626 platform_driver_unregister(&mtk_dai_stub_driver
);
629 module_init(mtk_dai_stub_init
);
630 module_exit(mtk_dai_stub_exit
);
632 /* Module information */
633 MODULE_DESCRIPTION("MTK SOC DAI driver");
634 MODULE_LICENSE("GPL v2");