2 * Mediatek ALSA SoC AFE platform driver for 2701
4 * Copyright (c) 2016 MediaTek Inc.
5 * Author: Garlic Tseng <garlic.tseng@mediatek.com>
6 * Ir Lian <ir.lian@mediatek.com>
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 and
10 * only version 2 as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 #include <linux/delay.h>
19 #include <linux/module.h>
21 #include <linux/of_address.h>
22 #include <linux/pm_runtime.h>
23 #include <sound/soc.h>
25 #include "mt2701-afe-common.h"
27 #include "mt2701-afe-clock-ctrl.h"
28 #include "../common/mtk-afe-platform-driver.h"
29 #include "../common/mtk-afe-fe-dai.h"
31 #define AFE_IRQ_STATUS_BITS 0xff
33 static const struct snd_pcm_hardware mt2701_afe_hardware
= {
34 .info
= SNDRV_PCM_INFO_MMAP
| SNDRV_PCM_INFO_INTERLEAVED
35 | SNDRV_PCM_INFO_RESUME
| SNDRV_PCM_INFO_MMAP_VALID
,
36 .formats
= SNDRV_PCM_FMTBIT_S16_LE
| SNDRV_PCM_FMTBIT_S24_LE
37 | SNDRV_PCM_FMTBIT_S32_LE
,
38 .period_bytes_min
= 1024,
39 .period_bytes_max
= 1024 * 256,
42 .buffer_bytes_max
= 1024 * 1024 * 16,
46 struct mt2701_afe_rate
{
48 unsigned int regvalue
;
51 static const struct mt2701_afe_rate mt2701_afe_i2s_rates
[] = {
52 { .rate
= 8000, .regvalue
= 0 },
53 { .rate
= 12000, .regvalue
= 1 },
54 { .rate
= 16000, .regvalue
= 2 },
55 { .rate
= 24000, .regvalue
= 3 },
56 { .rate
= 32000, .regvalue
= 4 },
57 { .rate
= 48000, .regvalue
= 5 },
58 { .rate
= 96000, .regvalue
= 6 },
59 { .rate
= 192000, .regvalue
= 7 },
60 { .rate
= 384000, .regvalue
= 8 },
61 { .rate
= 7350, .regvalue
= 16 },
62 { .rate
= 11025, .regvalue
= 17 },
63 { .rate
= 14700, .regvalue
= 18 },
64 { .rate
= 22050, .regvalue
= 19 },
65 { .rate
= 29400, .regvalue
= 20 },
66 { .rate
= 44100, .regvalue
= 21 },
67 { .rate
= 88200, .regvalue
= 22 },
68 { .rate
= 176400, .regvalue
= 23 },
69 { .rate
= 352800, .regvalue
= 24 },
72 static int mt2701_dai_num_to_i2s(struct mtk_base_afe
*afe
, int num
)
74 int val
= num
- MT2701_IO_I2S
;
76 if (val
< 0 || val
>= MT2701_I2S_NUM
) {
77 dev_err(afe
->dev
, "%s, num not available, num %d, val %d\n",
84 static int mt2701_afe_i2s_fs(unsigned int sample_rate
)
88 for (i
= 0; i
< ARRAY_SIZE(mt2701_afe_i2s_rates
); i
++)
89 if (mt2701_afe_i2s_rates
[i
].rate
== sample_rate
)
90 return mt2701_afe_i2s_rates
[i
].regvalue
;
95 static int mt2701_afe_i2s_startup(struct snd_pcm_substream
*substream
,
96 struct snd_soc_dai
*dai
)
98 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
99 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
100 struct mt2701_afe_private
*afe_priv
= afe
->platform_priv
;
101 int i2s_num
= mt2701_dai_num_to_i2s(afe
, dai
->id
);
102 int clk_num
= MT2701_AUD_AUD_I2S1_MCLK
+ i2s_num
;
109 ret
= clk_prepare_enable(afe_priv
->clocks
[clk_num
]);
111 dev_err(afe
->dev
, "Failed to enable mclk for I2S: %d\n",
117 static int mt2701_afe_i2s_path_shutdown(struct snd_pcm_substream
*substream
,
118 struct snd_soc_dai
*dai
,
121 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
122 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
123 struct mt2701_afe_private
*afe_priv
= afe
->platform_priv
;
124 int i2s_num
= mt2701_dai_num_to_i2s(afe
, dai
->id
);
125 struct mt2701_i2s_path
*i2s_path
;
126 const struct mt2701_i2s_data
*i2s_data
;
127 int stream_dir
= substream
->stream
;
132 i2s_path
= &afe_priv
->i2s_path
[i2s_num
];
135 if (stream_dir
== SNDRV_PCM_STREAM_PLAYBACK
)
136 stream_dir
= SNDRV_PCM_STREAM_CAPTURE
;
138 stream_dir
= SNDRV_PCM_STREAM_PLAYBACK
;
140 i2s_data
= i2s_path
->i2s_data
[stream_dir
];
142 i2s_path
->on
[stream_dir
]--;
143 if (i2s_path
->on
[stream_dir
] < 0) {
144 dev_warn(afe
->dev
, "i2s_path->on: %d, dir: %d\n",
145 i2s_path
->on
[stream_dir
], stream_dir
);
146 i2s_path
->on
[stream_dir
] = 0;
148 if (i2s_path
->on
[stream_dir
])
152 regmap_update_bits(afe
->regmap
, i2s_data
->i2s_ctrl_reg
,
153 ASYS_I2S_CON_I2S_EN
, 0);
154 regmap_update_bits(afe
->regmap
, AUDIO_TOP_CON4
,
155 1 << i2s_data
->i2s_pwn_shift
,
156 1 << i2s_data
->i2s_pwn_shift
);
160 static void mt2701_afe_i2s_shutdown(struct snd_pcm_substream
*substream
,
161 struct snd_soc_dai
*dai
)
163 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
164 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
165 struct mt2701_afe_private
*afe_priv
= afe
->platform_priv
;
166 int i2s_num
= mt2701_dai_num_to_i2s(afe
, dai
->id
);
167 struct mt2701_i2s_path
*i2s_path
;
168 int clk_num
= MT2701_AUD_AUD_I2S1_MCLK
+ i2s_num
;
173 i2s_path
= &afe_priv
->i2s_path
[i2s_num
];
175 if (i2s_path
->occupied
[substream
->stream
])
176 i2s_path
->occupied
[substream
->stream
] = 0;
180 mt2701_afe_i2s_path_shutdown(substream
, dai
, 0);
182 /* need to disable i2s-out path when disable i2s-in */
183 if (substream
->stream
== SNDRV_PCM_STREAM_CAPTURE
)
184 mt2701_afe_i2s_path_shutdown(substream
, dai
, 1);
188 clk_disable_unprepare(afe_priv
->clocks
[clk_num
]);
191 static int mt2701_i2s_path_prepare_enable(struct snd_pcm_substream
*substream
,
192 struct snd_soc_dai
*dai
,
195 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
196 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
197 struct mt2701_afe_private
*afe_priv
= afe
->platform_priv
;
198 int i2s_num
= mt2701_dai_num_to_i2s(afe
, dai
->id
);
199 struct mt2701_i2s_path
*i2s_path
;
200 const struct mt2701_i2s_data
*i2s_data
;
201 struct snd_pcm_runtime
* const runtime
= substream
->runtime
;
202 int reg
, fs
, w_len
= 1; /* now we support bck 64bits only */
203 int stream_dir
= substream
->stream
;
204 unsigned int mask
= 0, val
= 0;
209 i2s_path
= &afe_priv
->i2s_path
[i2s_num
];
212 if (stream_dir
== SNDRV_PCM_STREAM_PLAYBACK
)
213 stream_dir
= SNDRV_PCM_STREAM_CAPTURE
;
215 stream_dir
= SNDRV_PCM_STREAM_PLAYBACK
;
217 i2s_data
= i2s_path
->i2s_data
[stream_dir
];
219 /* no need to enable if already done */
220 i2s_path
->on
[stream_dir
]++;
222 if (i2s_path
->on
[stream_dir
] != 1)
225 fs
= mt2701_afe_i2s_fs(runtime
->rate
);
227 mask
= ASYS_I2S_CON_FS
|
228 ASYS_I2S_CON_I2S_COUPLE_MODE
| /* 0 */
229 ASYS_I2S_CON_I2S_MODE
|
230 ASYS_I2S_CON_WIDE_MODE
;
232 val
= ASYS_I2S_CON_FS_SET(fs
) |
233 ASYS_I2S_CON_I2S_MODE
|
234 ASYS_I2S_CON_WIDE_MODE_SET(w_len
);
236 if (stream_dir
== SNDRV_PCM_STREAM_CAPTURE
) {
237 mask
|= ASYS_I2S_IN_PHASE_FIX
;
238 val
|= ASYS_I2S_IN_PHASE_FIX
;
241 regmap_update_bits(afe
->regmap
, i2s_data
->i2s_ctrl_reg
, mask
, val
);
243 if (stream_dir
== SNDRV_PCM_STREAM_PLAYBACK
)
244 reg
= ASMO_TIMING_CON1
;
246 reg
= ASMI_TIMING_CON1
;
248 regmap_update_bits(afe
->regmap
, reg
,
249 i2s_data
->i2s_asrc_fs_mask
250 << i2s_data
->i2s_asrc_fs_shift
,
251 fs
<< i2s_data
->i2s_asrc_fs_shift
);
254 regmap_update_bits(afe
->regmap
, AUDIO_TOP_CON4
,
255 1 << i2s_data
->i2s_pwn_shift
,
256 0 << i2s_data
->i2s_pwn_shift
);
258 /* reset i2s hw status before enable */
259 regmap_update_bits(afe
->regmap
, i2s_data
->i2s_ctrl_reg
,
260 ASYS_I2S_CON_RESET
, ASYS_I2S_CON_RESET
);
262 regmap_update_bits(afe
->regmap
, i2s_data
->i2s_ctrl_reg
,
263 ASYS_I2S_CON_RESET
, 0);
265 regmap_update_bits(afe
->regmap
, i2s_data
->i2s_ctrl_reg
,
266 ASYS_I2S_CON_I2S_EN
, ASYS_I2S_CON_I2S_EN
);
270 static int mt2701_afe_i2s_prepare(struct snd_pcm_substream
*substream
,
271 struct snd_soc_dai
*dai
)
274 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
275 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
276 struct mt2701_afe_private
*afe_priv
= afe
->platform_priv
;
277 int i2s_num
= mt2701_dai_num_to_i2s(afe
, dai
->id
);
278 struct mt2701_i2s_path
*i2s_path
;
284 i2s_path
= &afe_priv
->i2s_path
[i2s_num
];
285 mclk_rate
= i2s_path
->mclk_rate
;
287 if (i2s_path
->occupied
[substream
->stream
])
289 i2s_path
->occupied
[substream
->stream
] = 1;
291 if (MT2701_PLL_DOMAIN_0_RATE
% mclk_rate
== 0) {
293 } else if (MT2701_PLL_DOMAIN_1_RATE
% mclk_rate
== 0) {
296 dev_err(dai
->dev
, "%s() bad mclk rate %d\n",
297 __func__
, mclk_rate
);
300 mt2701_mclk_configuration(afe
, i2s_num
, clk_domain
, mclk_rate
);
302 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
) {
303 mt2701_i2s_path_prepare_enable(substream
, dai
, 0);
305 /* need to enable i2s-out path when enable i2s-in */
306 /* prepare for another direction "out" */
307 mt2701_i2s_path_prepare_enable(substream
, dai
, 1);
308 /* prepare for "in" */
309 mt2701_i2s_path_prepare_enable(substream
, dai
, 0);
315 static int mt2701_afe_i2s_set_sysclk(struct snd_soc_dai
*dai
, int clk_id
,
316 unsigned int freq
, int dir
)
318 struct mtk_base_afe
*afe
= dev_get_drvdata(dai
->dev
);
319 struct mt2701_afe_private
*afe_priv
= afe
->platform_priv
;
320 int i2s_num
= mt2701_dai_num_to_i2s(afe
, dai
->id
);
326 if (dir
== SND_SOC_CLOCK_IN
) {
328 "%s() warning: mt2701 doesn't support mclk input\n",
332 afe_priv
->i2s_path
[i2s_num
].mclk_rate
= freq
;
336 static int mt2701_btmrg_startup(struct snd_pcm_substream
*substream
,
337 struct snd_soc_dai
*dai
)
339 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
340 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
341 struct mt2701_afe_private
*afe_priv
= afe
->platform_priv
;
343 regmap_update_bits(afe
->regmap
, AUDIO_TOP_CON4
,
344 AUDIO_TOP_CON4_PDN_MRGIF
, 0);
346 afe_priv
->mrg_enable
[substream
->stream
] = 1;
350 static int mt2701_btmrg_hw_params(struct snd_pcm_substream
*substream
,
351 struct snd_pcm_hw_params
*params
,
352 struct snd_soc_dai
*dai
)
354 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
355 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
359 stream_fs
= params_rate(params
);
361 if ((stream_fs
!= 8000) && (stream_fs
!= 16000)) {
362 dev_err(afe
->dev
, "%s() btmgr not supprt this stream_fs %d\n",
363 __func__
, stream_fs
);
367 regmap_update_bits(afe
->regmap
, AFE_MRGIF_CON
,
368 AFE_MRGIF_CON_I2S_MODE_MASK
,
369 AFE_MRGIF_CON_I2S_MODE_32K
);
371 val
= AFE_DAIBT_CON0_BT_FUNC_EN
| AFE_DAIBT_CON0_BT_FUNC_RDY
372 | AFE_DAIBT_CON0_MRG_USE
;
375 if (stream_fs
== 16000)
376 val
|= AFE_DAIBT_CON0_BT_WIDE_MODE_EN
;
378 msk
|= AFE_DAIBT_CON0_BT_WIDE_MODE_EN
;
380 regmap_update_bits(afe
->regmap
, AFE_DAIBT_CON0
, msk
, val
);
382 regmap_update_bits(afe
->regmap
, AFE_DAIBT_CON0
,
383 AFE_DAIBT_CON0_DAIBT_EN
,
384 AFE_DAIBT_CON0_DAIBT_EN
);
385 regmap_update_bits(afe
->regmap
, AFE_MRGIF_CON
,
386 AFE_MRGIF_CON_MRG_I2S_EN
,
387 AFE_MRGIF_CON_MRG_I2S_EN
);
388 regmap_update_bits(afe
->regmap
, AFE_MRGIF_CON
,
389 AFE_MRGIF_CON_MRG_EN
,
390 AFE_MRGIF_CON_MRG_EN
);
394 static void mt2701_btmrg_shutdown(struct snd_pcm_substream
*substream
,
395 struct snd_soc_dai
*dai
)
397 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
398 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
399 struct mt2701_afe_private
*afe_priv
= afe
->platform_priv
;
401 /* if the other direction stream is not occupied */
402 if (!afe_priv
->mrg_enable
[!substream
->stream
]) {
403 regmap_update_bits(afe
->regmap
, AFE_DAIBT_CON0
,
404 AFE_DAIBT_CON0_DAIBT_EN
, 0);
405 regmap_update_bits(afe
->regmap
, AFE_MRGIF_CON
,
406 AFE_MRGIF_CON_MRG_EN
, 0);
407 regmap_update_bits(afe
->regmap
, AFE_MRGIF_CON
,
408 AFE_MRGIF_CON_MRG_I2S_EN
, 0);
409 regmap_update_bits(afe
->regmap
, AUDIO_TOP_CON4
,
410 AUDIO_TOP_CON4_PDN_MRGIF
,
411 AUDIO_TOP_CON4_PDN_MRGIF
);
413 afe_priv
->mrg_enable
[substream
->stream
] = 0;
416 static int mt2701_simple_fe_startup(struct snd_pcm_substream
*substream
,
417 struct snd_soc_dai
*dai
)
419 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
420 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
421 int stream_dir
= substream
->stream
;
422 int memif_num
= rtd
->cpu_dai
->id
;
423 struct mtk_base_afe_memif
*memif_tmp
;
425 /* can't run single DL & DLM at the same time */
426 if (stream_dir
== SNDRV_PCM_STREAM_PLAYBACK
) {
427 memif_tmp
= &afe
->memif
[MT2701_MEMIF_DLM
];
428 if (memif_tmp
->substream
) {
429 dev_warn(afe
->dev
, "%s memif is not available, stream_dir %d, memif_num %d\n",
430 __func__
, stream_dir
, memif_num
);
434 return mtk_afe_fe_startup(substream
, dai
);
437 static int mt2701_simple_fe_hw_params(struct snd_pcm_substream
*substream
,
438 struct snd_pcm_hw_params
*params
,
439 struct snd_soc_dai
*dai
)
441 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
442 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
443 int stream_dir
= substream
->stream
;
445 /* single DL use PAIR_INTERLEAVE */
446 if (stream_dir
== SNDRV_PCM_STREAM_PLAYBACK
) {
447 regmap_update_bits(afe
->regmap
,
449 AFE_MEMIF_PBUF_SIZE_DLM_MASK
,
450 AFE_MEMIF_PBUF_SIZE_PAIR_INTERLEAVE
);
452 return mtk_afe_fe_hw_params(substream
, params
, dai
);
455 static int mt2701_dlm_fe_startup(struct snd_pcm_substream
*substream
,
456 struct snd_soc_dai
*dai
)
458 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
459 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
460 struct mtk_base_afe_memif
*memif_tmp
;
461 const struct mtk_base_memif_data
*memif_data
;
464 for (i
= MT2701_MEMIF_DL1
; i
< MT2701_MEMIF_DL_SINGLE_NUM
; ++i
) {
465 memif_tmp
= &afe
->memif
[i
];
466 if (memif_tmp
->substream
)
470 /* enable agent for all signal DL (due to hw design) */
471 for (i
= MT2701_MEMIF_DL1
; i
< MT2701_MEMIF_DL_SINGLE_NUM
; ++i
) {
472 memif_data
= afe
->memif
[i
].data
;
473 regmap_update_bits(afe
->regmap
,
474 memif_data
->agent_disable_reg
,
475 1 << memif_data
->agent_disable_shift
,
476 0 << memif_data
->agent_disable_shift
);
479 return mtk_afe_fe_startup(substream
, dai
);
482 static void mt2701_dlm_fe_shutdown(struct snd_pcm_substream
*substream
,
483 struct snd_soc_dai
*dai
)
485 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
486 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
487 const struct mtk_base_memif_data
*memif_data
;
490 for (i
= MT2701_MEMIF_DL1
; i
< MT2701_MEMIF_DL_SINGLE_NUM
; ++i
) {
491 memif_data
= afe
->memif
[i
].data
;
492 regmap_update_bits(afe
->regmap
,
493 memif_data
->agent_disable_reg
,
494 1 << memif_data
->agent_disable_shift
,
495 1 << memif_data
->agent_disable_shift
);
497 return mtk_afe_fe_shutdown(substream
, dai
);
500 static int mt2701_dlm_fe_hw_params(struct snd_pcm_substream
*substream
,
501 struct snd_pcm_hw_params
*params
,
502 struct snd_soc_dai
*dai
)
504 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
505 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
506 int channels
= params_channels(params
);
508 regmap_update_bits(afe
->regmap
,
510 AFE_MEMIF_PBUF_SIZE_DLM_MASK
,
511 AFE_MEMIF_PBUF_SIZE_FULL_INTERLEAVE
);
512 regmap_update_bits(afe
->regmap
,
514 AFE_MEMIF_PBUF_SIZE_DLM_BYTE_MASK
,
515 AFE_MEMIF_PBUF_SIZE_DLM_32BYTES
);
516 regmap_update_bits(afe
->regmap
,
518 AFE_MEMIF_PBUF_SIZE_DLM_CH_MASK
,
519 AFE_MEMIF_PBUF_SIZE_DLM_CH(channels
));
521 return mtk_afe_fe_hw_params(substream
, params
, dai
);
524 static int mt2701_dlm_fe_trigger(struct snd_pcm_substream
*substream
,
525 int cmd
, struct snd_soc_dai
*dai
)
527 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
528 struct mtk_base_afe
*afe
= snd_soc_platform_get_drvdata(rtd
->platform
);
529 struct mtk_base_afe_memif
*memif_tmp
= &afe
->memif
[MT2701_MEMIF_DL1
];
532 case SNDRV_PCM_TRIGGER_START
:
533 case SNDRV_PCM_TRIGGER_RESUME
:
534 regmap_update_bits(afe
->regmap
, memif_tmp
->data
->enable_reg
,
535 1 << memif_tmp
->data
->enable_shift
,
536 1 << memif_tmp
->data
->enable_shift
);
537 mtk_afe_fe_trigger(substream
, cmd
, dai
);
539 case SNDRV_PCM_TRIGGER_STOP
:
540 case SNDRV_PCM_TRIGGER_SUSPEND
:
541 mtk_afe_fe_trigger(substream
, cmd
, dai
);
542 regmap_update_bits(afe
->regmap
, memif_tmp
->data
->enable_reg
,
543 1 << memif_tmp
->data
->enable_shift
, 0);
551 static int mt2701_memif_fs(struct snd_pcm_substream
*substream
,
554 struct snd_soc_pcm_runtime
*rtd
= substream
->private_data
;
557 if (rtd
->cpu_dai
->id
!= MT2701_MEMIF_ULBT
)
558 fs
= mt2701_afe_i2s_fs(rate
);
560 fs
= (rate
== 16000 ? 1 : 0);
564 static int mt2701_irq_fs(struct snd_pcm_substream
*substream
, unsigned int rate
)
566 return mt2701_afe_i2s_fs(rate
);
570 static const struct snd_soc_dai_ops mt2701_single_memif_dai_ops
= {
571 .startup
= mt2701_simple_fe_startup
,
572 .shutdown
= mtk_afe_fe_shutdown
,
573 .hw_params
= mt2701_simple_fe_hw_params
,
574 .hw_free
= mtk_afe_fe_hw_free
,
575 .prepare
= mtk_afe_fe_prepare
,
576 .trigger
= mtk_afe_fe_trigger
,
580 static const struct snd_soc_dai_ops mt2701_dlm_memif_dai_ops
= {
581 .startup
= mt2701_dlm_fe_startup
,
582 .shutdown
= mt2701_dlm_fe_shutdown
,
583 .hw_params
= mt2701_dlm_fe_hw_params
,
584 .hw_free
= mtk_afe_fe_hw_free
,
585 .prepare
= mtk_afe_fe_prepare
,
586 .trigger
= mt2701_dlm_fe_trigger
,
590 static const struct snd_soc_dai_ops mt2701_afe_i2s_ops
= {
591 .startup
= mt2701_afe_i2s_startup
,
592 .shutdown
= mt2701_afe_i2s_shutdown
,
593 .prepare
= mt2701_afe_i2s_prepare
,
594 .set_sysclk
= mt2701_afe_i2s_set_sysclk
,
598 static const struct snd_soc_dai_ops mt2701_btmrg_ops
= {
599 .startup
= mt2701_btmrg_startup
,
600 .shutdown
= mt2701_btmrg_shutdown
,
601 .hw_params
= mt2701_btmrg_hw_params
,
604 static struct snd_soc_dai_driver mt2701_afe_pcm_dais
[] = {
605 /* FE DAIs: memory intefaces to CPU */
608 .id
= MT2701_MEMIF_DL1
,
609 .suspend
= mtk_afe_dai_suspend
,
610 .resume
= mtk_afe_dai_resume
,
612 .stream_name
= "DL1",
615 .rates
= SNDRV_PCM_RATE_8000_192000
,
616 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
617 | SNDRV_PCM_FMTBIT_S24_LE
618 | SNDRV_PCM_FMTBIT_S32_LE
)
620 .ops
= &mt2701_single_memif_dai_ops
,
624 .id
= MT2701_MEMIF_DLM
,
625 .suspend
= mtk_afe_dai_suspend
,
626 .resume
= mtk_afe_dai_resume
,
628 .stream_name
= "DLM",
631 .rates
= SNDRV_PCM_RATE_8000_192000
,
632 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
633 | SNDRV_PCM_FMTBIT_S24_LE
634 | SNDRV_PCM_FMTBIT_S32_LE
)
637 .ops
= &mt2701_dlm_memif_dai_ops
,
641 .id
= MT2701_MEMIF_UL1
,
642 .suspend
= mtk_afe_dai_suspend
,
643 .resume
= mtk_afe_dai_resume
,
645 .stream_name
= "UL1",
648 .rates
= SNDRV_PCM_RATE_8000_48000
,
649 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
650 | SNDRV_PCM_FMTBIT_S24_LE
651 | SNDRV_PCM_FMTBIT_S32_LE
)
653 .ops
= &mt2701_single_memif_dai_ops
,
657 .id
= MT2701_MEMIF_UL2
,
658 .suspend
= mtk_afe_dai_suspend
,
659 .resume
= mtk_afe_dai_resume
,
661 .stream_name
= "UL2",
664 .rates
= SNDRV_PCM_RATE_8000_192000
,
665 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
666 | SNDRV_PCM_FMTBIT_S24_LE
667 | SNDRV_PCM_FMTBIT_S32_LE
)
670 .ops
= &mt2701_single_memif_dai_ops
,
674 .id
= MT2701_MEMIF_DLBT
,
675 .suspend
= mtk_afe_dai_suspend
,
676 .resume
= mtk_afe_dai_resume
,
678 .stream_name
= "DLBT",
681 .rates
= (SNDRV_PCM_RATE_8000
682 | SNDRV_PCM_RATE_16000
),
683 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
685 .ops
= &mt2701_single_memif_dai_ops
,
689 .id
= MT2701_MEMIF_ULBT
,
690 .suspend
= mtk_afe_dai_suspend
,
691 .resume
= mtk_afe_dai_resume
,
693 .stream_name
= "ULBT",
696 .rates
= (SNDRV_PCM_RATE_8000
697 | SNDRV_PCM_RATE_16000
),
698 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
700 .ops
= &mt2701_single_memif_dai_ops
,
707 .stream_name
= "I2S0 Playback",
710 .rates
= SNDRV_PCM_RATE_8000_192000
,
711 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
712 | SNDRV_PCM_FMTBIT_S24_LE
713 | SNDRV_PCM_FMTBIT_S32_LE
)
717 .stream_name
= "I2S0 Capture",
720 .rates
= SNDRV_PCM_RATE_8000_192000
,
721 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
722 | SNDRV_PCM_FMTBIT_S24_LE
723 | SNDRV_PCM_FMTBIT_S32_LE
)
726 .ops
= &mt2701_afe_i2s_ops
,
727 .symmetric_rates
= 1,
731 .id
= MT2701_IO_2ND_I2S
,
733 .stream_name
= "I2S1 Playback",
736 .rates
= SNDRV_PCM_RATE_8000_192000
,
737 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
738 | SNDRV_PCM_FMTBIT_S24_LE
739 | SNDRV_PCM_FMTBIT_S32_LE
)
742 .stream_name
= "I2S1 Capture",
745 .rates
= SNDRV_PCM_RATE_8000_192000
,
746 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
747 | SNDRV_PCM_FMTBIT_S24_LE
748 | SNDRV_PCM_FMTBIT_S32_LE
)
750 .ops
= &mt2701_afe_i2s_ops
,
751 .symmetric_rates
= 1,
755 .id
= MT2701_IO_3RD_I2S
,
757 .stream_name
= "I2S2 Playback",
760 .rates
= SNDRV_PCM_RATE_8000_192000
,
761 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
762 | SNDRV_PCM_FMTBIT_S24_LE
763 | SNDRV_PCM_FMTBIT_S32_LE
)
766 .stream_name
= "I2S2 Capture",
769 .rates
= SNDRV_PCM_RATE_8000_192000
,
770 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
771 | SNDRV_PCM_FMTBIT_S24_LE
772 | SNDRV_PCM_FMTBIT_S32_LE
)
774 .ops
= &mt2701_afe_i2s_ops
,
775 .symmetric_rates
= 1,
779 .id
= MT2701_IO_4TH_I2S
,
781 .stream_name
= "I2S3 Playback",
784 .rates
= SNDRV_PCM_RATE_8000_192000
,
785 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
786 | SNDRV_PCM_FMTBIT_S24_LE
787 | SNDRV_PCM_FMTBIT_S32_LE
)
790 .stream_name
= "I2S3 Capture",
793 .rates
= SNDRV_PCM_RATE_8000_192000
,
794 .formats
= (SNDRV_PCM_FMTBIT_S16_LE
795 | SNDRV_PCM_FMTBIT_S24_LE
796 | SNDRV_PCM_FMTBIT_S32_LE
)
798 .ops
= &mt2701_afe_i2s_ops
,
799 .symmetric_rates
= 1,
805 .stream_name
= "BT Playback",
808 .rates
= (SNDRV_PCM_RATE_8000
809 | SNDRV_PCM_RATE_16000
),
810 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
813 .stream_name
= "BT Capture",
816 .rates
= (SNDRV_PCM_RATE_8000
817 | SNDRV_PCM_RATE_16000
),
818 .formats
= SNDRV_PCM_FMTBIT_S16_LE
,
820 .ops
= &mt2701_btmrg_ops
,
821 .symmetric_rates
= 1,
825 static const struct snd_kcontrol_new mt2701_afe_o00_mix
[] = {
826 SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN0
, 0, 1, 0),
829 static const struct snd_kcontrol_new mt2701_afe_o01_mix
[] = {
830 SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN1
, 1, 1, 0),
833 static const struct snd_kcontrol_new mt2701_afe_o02_mix
[] = {
834 SOC_DAPM_SINGLE_AUTODISABLE("I02 Switch", AFE_CONN2
, 2, 1, 0),
837 static const struct snd_kcontrol_new mt2701_afe_o03_mix
[] = {
838 SOC_DAPM_SINGLE_AUTODISABLE("I03 Switch", AFE_CONN3
, 3, 1, 0),
841 static const struct snd_kcontrol_new mt2701_afe_o14_mix
[] = {
842 SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN14
, 26, 1, 0),
845 static const struct snd_kcontrol_new mt2701_afe_o15_mix
[] = {
846 SOC_DAPM_SINGLE_AUTODISABLE("I12 Switch", AFE_CONN15
, 12, 1, 0),
849 static const struct snd_kcontrol_new mt2701_afe_o16_mix
[] = {
850 SOC_DAPM_SINGLE_AUTODISABLE("I13 Switch", AFE_CONN16
, 13, 1, 0),
853 static const struct snd_kcontrol_new mt2701_afe_o17_mix
[] = {
854 SOC_DAPM_SINGLE_AUTODISABLE("I14 Switch", AFE_CONN17
, 14, 1, 0),
857 static const struct snd_kcontrol_new mt2701_afe_o18_mix
[] = {
858 SOC_DAPM_SINGLE_AUTODISABLE("I15 Switch", AFE_CONN18
, 15, 1, 0),
861 static const struct snd_kcontrol_new mt2701_afe_o19_mix
[] = {
862 SOC_DAPM_SINGLE_AUTODISABLE("I16 Switch", AFE_CONN19
, 16, 1, 0),
865 static const struct snd_kcontrol_new mt2701_afe_o20_mix
[] = {
866 SOC_DAPM_SINGLE_AUTODISABLE("I17 Switch", AFE_CONN20
, 17, 1, 0),
869 static const struct snd_kcontrol_new mt2701_afe_o21_mix
[] = {
870 SOC_DAPM_SINGLE_AUTODISABLE("I18 Switch", AFE_CONN21
, 18, 1, 0),
873 static const struct snd_kcontrol_new mt2701_afe_o22_mix
[] = {
874 SOC_DAPM_SINGLE_AUTODISABLE("I19 Switch", AFE_CONN22
, 19, 1, 0),
877 static const struct snd_kcontrol_new mt2701_afe_o23_mix
[] = {
878 SOC_DAPM_SINGLE_AUTODISABLE("I20 Switch", AFE_CONN23
, 20, 1, 0),
881 static const struct snd_kcontrol_new mt2701_afe_o24_mix
[] = {
882 SOC_DAPM_SINGLE_AUTODISABLE("I21 Switch", AFE_CONN24
, 21, 1, 0),
885 static const struct snd_kcontrol_new mt2701_afe_o31_mix
[] = {
886 SOC_DAPM_SINGLE_AUTODISABLE("I35 Switch", AFE_CONN41
, 9, 1, 0),
889 static const struct snd_kcontrol_new mt2701_afe_i02_mix
[] = {
890 SOC_DAPM_SINGLE("I2S0 Switch", SND_SOC_NOPM
, 0, 1, 0),
893 static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_i2s0
[] = {
894 SOC_DAPM_SINGLE_AUTODISABLE("Multich I2S0 Out Switch",
895 ASYS_I2SO1_CON
, 26, 1, 0),
898 static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_i2s1
[] = {
899 SOC_DAPM_SINGLE_AUTODISABLE("Multich I2S1 Out Switch",
900 ASYS_I2SO2_CON
, 26, 1, 0),
903 static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_i2s2
[] = {
904 SOC_DAPM_SINGLE_AUTODISABLE("Multich I2S2 Out Switch",
905 PWR2_TOP_CON
, 17, 1, 0),
908 static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_i2s3
[] = {
909 SOC_DAPM_SINGLE_AUTODISABLE("Multich I2S3 Out Switch",
910 PWR2_TOP_CON
, 18, 1, 0),
913 static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_i2s4
[] = {
914 SOC_DAPM_SINGLE_AUTODISABLE("Multich I2S4 Out Switch",
915 PWR2_TOP_CON
, 19, 1, 0),
918 static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_asrc0
[] = {
919 SOC_DAPM_SINGLE_AUTODISABLE("Asrc0 out Switch", AUDIO_TOP_CON4
, 14, 1,
923 static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_asrc1
[] = {
924 SOC_DAPM_SINGLE_AUTODISABLE("Asrc1 out Switch", AUDIO_TOP_CON4
, 15, 1,
928 static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_asrc2
[] = {
929 SOC_DAPM_SINGLE_AUTODISABLE("Asrc2 out Switch", PWR2_TOP_CON
, 6, 1,
933 static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_asrc3
[] = {
934 SOC_DAPM_SINGLE_AUTODISABLE("Asrc3 out Switch", PWR2_TOP_CON
, 7, 1,
938 static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_asrc4
[] = {
939 SOC_DAPM_SINGLE_AUTODISABLE("Asrc4 out Switch", PWR2_TOP_CON
, 8, 1,
943 static const struct snd_soc_dapm_widget mt2701_afe_pcm_widgets
[] = {
944 /* inter-connections */
945 SND_SOC_DAPM_MIXER("I00", SND_SOC_NOPM
, 0, 0, NULL
, 0),
946 SND_SOC_DAPM_MIXER("I01", SND_SOC_NOPM
, 0, 0, NULL
, 0),
947 SND_SOC_DAPM_MIXER("I02", SND_SOC_NOPM
, 0, 0, mt2701_afe_i02_mix
,
948 ARRAY_SIZE(mt2701_afe_i02_mix
)),
949 SND_SOC_DAPM_MIXER("I03", SND_SOC_NOPM
, 0, 0, NULL
, 0),
950 SND_SOC_DAPM_MIXER("I12", SND_SOC_NOPM
, 0, 0, NULL
, 0),
951 SND_SOC_DAPM_MIXER("I13", SND_SOC_NOPM
, 0, 0, NULL
, 0),
952 SND_SOC_DAPM_MIXER("I14", SND_SOC_NOPM
, 0, 0, NULL
, 0),
953 SND_SOC_DAPM_MIXER("I15", SND_SOC_NOPM
, 0, 0, NULL
, 0),
954 SND_SOC_DAPM_MIXER("I16", SND_SOC_NOPM
, 0, 0, NULL
, 0),
955 SND_SOC_DAPM_MIXER("I17", SND_SOC_NOPM
, 0, 0, NULL
, 0),
956 SND_SOC_DAPM_MIXER("I18", SND_SOC_NOPM
, 0, 0, NULL
, 0),
957 SND_SOC_DAPM_MIXER("I19", SND_SOC_NOPM
, 0, 0, NULL
, 0),
958 SND_SOC_DAPM_MIXER("I26", SND_SOC_NOPM
, 0, 0, NULL
, 0),
959 SND_SOC_DAPM_MIXER("I35", SND_SOC_NOPM
, 0, 0, NULL
, 0),
961 SND_SOC_DAPM_MIXER("O00", SND_SOC_NOPM
, 0, 0, mt2701_afe_o00_mix
,
962 ARRAY_SIZE(mt2701_afe_o00_mix
)),
963 SND_SOC_DAPM_MIXER("O01", SND_SOC_NOPM
, 0, 0, mt2701_afe_o01_mix
,
964 ARRAY_SIZE(mt2701_afe_o01_mix
)),
965 SND_SOC_DAPM_MIXER("O02", SND_SOC_NOPM
, 0, 0, mt2701_afe_o02_mix
,
966 ARRAY_SIZE(mt2701_afe_o02_mix
)),
967 SND_SOC_DAPM_MIXER("O03", SND_SOC_NOPM
, 0, 0, mt2701_afe_o03_mix
,
968 ARRAY_SIZE(mt2701_afe_o03_mix
)),
969 SND_SOC_DAPM_MIXER("O14", SND_SOC_NOPM
, 0, 0, mt2701_afe_o14_mix
,
970 ARRAY_SIZE(mt2701_afe_o14_mix
)),
971 SND_SOC_DAPM_MIXER("O15", SND_SOC_NOPM
, 0, 0, mt2701_afe_o15_mix
,
972 ARRAY_SIZE(mt2701_afe_o15_mix
)),
973 SND_SOC_DAPM_MIXER("O16", SND_SOC_NOPM
, 0, 0, mt2701_afe_o16_mix
,
974 ARRAY_SIZE(mt2701_afe_o16_mix
)),
975 SND_SOC_DAPM_MIXER("O17", SND_SOC_NOPM
, 0, 0, mt2701_afe_o17_mix
,
976 ARRAY_SIZE(mt2701_afe_o17_mix
)),
977 SND_SOC_DAPM_MIXER("O18", SND_SOC_NOPM
, 0, 0, mt2701_afe_o18_mix
,
978 ARRAY_SIZE(mt2701_afe_o18_mix
)),
979 SND_SOC_DAPM_MIXER("O19", SND_SOC_NOPM
, 0, 0, mt2701_afe_o19_mix
,
980 ARRAY_SIZE(mt2701_afe_o19_mix
)),
981 SND_SOC_DAPM_MIXER("O20", SND_SOC_NOPM
, 0, 0, mt2701_afe_o20_mix
,
982 ARRAY_SIZE(mt2701_afe_o20_mix
)),
983 SND_SOC_DAPM_MIXER("O21", SND_SOC_NOPM
, 0, 0, mt2701_afe_o21_mix
,
984 ARRAY_SIZE(mt2701_afe_o21_mix
)),
985 SND_SOC_DAPM_MIXER("O22", SND_SOC_NOPM
, 0, 0, mt2701_afe_o22_mix
,
986 ARRAY_SIZE(mt2701_afe_o22_mix
)),
987 SND_SOC_DAPM_MIXER("O31", SND_SOC_NOPM
, 0, 0, mt2701_afe_o31_mix
,
988 ARRAY_SIZE(mt2701_afe_o31_mix
)),
990 SND_SOC_DAPM_MIXER("I12I13", SND_SOC_NOPM
, 0, 0,
991 mt2701_afe_multi_ch_out_i2s0
,
992 ARRAY_SIZE(mt2701_afe_multi_ch_out_i2s0
)),
993 SND_SOC_DAPM_MIXER("I14I15", SND_SOC_NOPM
, 0, 0,
994 mt2701_afe_multi_ch_out_i2s1
,
995 ARRAY_SIZE(mt2701_afe_multi_ch_out_i2s1
)),
996 SND_SOC_DAPM_MIXER("I16I17", SND_SOC_NOPM
, 0, 0,
997 mt2701_afe_multi_ch_out_i2s2
,
998 ARRAY_SIZE(mt2701_afe_multi_ch_out_i2s2
)),
999 SND_SOC_DAPM_MIXER("I18I19", SND_SOC_NOPM
, 0, 0,
1000 mt2701_afe_multi_ch_out_i2s3
,
1001 ARRAY_SIZE(mt2701_afe_multi_ch_out_i2s3
)),
1003 SND_SOC_DAPM_MIXER("ASRC_O0", SND_SOC_NOPM
, 0, 0,
1004 mt2701_afe_multi_ch_out_asrc0
,
1005 ARRAY_SIZE(mt2701_afe_multi_ch_out_asrc0
)),
1006 SND_SOC_DAPM_MIXER("ASRC_O1", SND_SOC_NOPM
, 0, 0,
1007 mt2701_afe_multi_ch_out_asrc1
,
1008 ARRAY_SIZE(mt2701_afe_multi_ch_out_asrc1
)),
1009 SND_SOC_DAPM_MIXER("ASRC_O2", SND_SOC_NOPM
, 0, 0,
1010 mt2701_afe_multi_ch_out_asrc2
,
1011 ARRAY_SIZE(mt2701_afe_multi_ch_out_asrc2
)),
1012 SND_SOC_DAPM_MIXER("ASRC_O3", SND_SOC_NOPM
, 0, 0,
1013 mt2701_afe_multi_ch_out_asrc3
,
1014 ARRAY_SIZE(mt2701_afe_multi_ch_out_asrc3
)),
1017 static const struct snd_soc_dapm_route mt2701_afe_pcm_routes
[] = {
1018 {"I12", NULL
, "DL1"},
1019 {"I13", NULL
, "DL1"},
1020 {"I35", NULL
, "DLBT"},
1022 {"I2S0 Playback", NULL
, "O15"},
1023 {"I2S0 Playback", NULL
, "O16"},
1025 {"I2S1 Playback", NULL
, "O17"},
1026 {"I2S1 Playback", NULL
, "O18"},
1027 {"I2S2 Playback", NULL
, "O19"},
1028 {"I2S2 Playback", NULL
, "O20"},
1029 {"I2S3 Playback", NULL
, "O21"},
1030 {"I2S3 Playback", NULL
, "O22"},
1031 {"BT Playback", NULL
, "O31"},
1033 {"UL1", NULL
, "O00"},
1034 {"UL1", NULL
, "O01"},
1035 {"UL2", NULL
, "O02"},
1036 {"UL2", NULL
, "O03"},
1037 {"ULBT", NULL
, "O14"},
1039 {"I00", NULL
, "I2S0 Capture"},
1040 {"I01", NULL
, "I2S0 Capture"},
1042 {"I02", NULL
, "I2S1 Capture"},
1043 {"I03", NULL
, "I2S1 Capture"},
1044 /* I02,03 link to UL2, also need to open I2S0 */
1045 {"I02", "I2S0 Switch", "I2S0 Capture"},
1047 {"I26", NULL
, "BT Capture"},
1049 {"ASRC_O0", "Asrc0 out Switch", "DLM"},
1050 {"ASRC_O1", "Asrc1 out Switch", "DLM"},
1051 {"ASRC_O2", "Asrc2 out Switch", "DLM"},
1052 {"ASRC_O3", "Asrc3 out Switch", "DLM"},
1054 {"I12I13", "Multich I2S0 Out Switch", "ASRC_O0"},
1055 {"I14I15", "Multich I2S1 Out Switch", "ASRC_O1"},
1056 {"I16I17", "Multich I2S2 Out Switch", "ASRC_O2"},
1057 {"I18I19", "Multich I2S3 Out Switch", "ASRC_O3"},
1059 { "I12", NULL
, "I12I13" },
1060 { "I13", NULL
, "I12I13" },
1061 { "I14", NULL
, "I14I15" },
1062 { "I15", NULL
, "I14I15" },
1063 { "I16", NULL
, "I16I17" },
1064 { "I17", NULL
, "I16I17" },
1065 { "I18", NULL
, "I18I19" },
1066 { "I19", NULL
, "I18I19" },
1068 { "O00", "I00 Switch", "I00" },
1069 { "O01", "I01 Switch", "I01" },
1070 { "O02", "I02 Switch", "I02" },
1071 { "O03", "I03 Switch", "I03" },
1072 { "O14", "I26 Switch", "I26" },
1073 { "O15", "I12 Switch", "I12" },
1074 { "O16", "I13 Switch", "I13" },
1075 { "O17", "I14 Switch", "I14" },
1076 { "O18", "I15 Switch", "I15" },
1077 { "O19", "I16 Switch", "I16" },
1078 { "O20", "I17 Switch", "I17" },
1079 { "O21", "I18 Switch", "I18" },
1080 { "O22", "I19 Switch", "I19" },
1081 { "O31", "I35 Switch", "I35" },
1085 static const struct snd_soc_component_driver mt2701_afe_pcm_dai_component
= {
1086 .name
= "mt2701-afe-pcm-dai",
1087 .dapm_widgets
= mt2701_afe_pcm_widgets
,
1088 .num_dapm_widgets
= ARRAY_SIZE(mt2701_afe_pcm_widgets
),
1089 .dapm_routes
= mt2701_afe_pcm_routes
,
1090 .num_dapm_routes
= ARRAY_SIZE(mt2701_afe_pcm_routes
),
1093 static const struct mtk_base_memif_data memif_data
[MT2701_MEMIF_NUM
] = {
1096 .id
= MT2701_MEMIF_DL1
,
1097 .reg_ofs_base
= AFE_DL1_BASE
,
1098 .reg_ofs_cur
= AFE_DL1_CUR
,
1099 .fs_reg
= AFE_DAC_CON1
,
1102 .mono_reg
= AFE_DAC_CON3
,
1104 .enable_reg
= AFE_DAC_CON0
,
1106 .hd_reg
= AFE_MEMIF_HD_CON0
,
1108 .agent_disable_reg
= AUDIO_TOP_CON5
,
1109 .agent_disable_shift
= 6,
1115 .id
= MT2701_MEMIF_DL2
,
1116 .reg_ofs_base
= AFE_DL2_BASE
,
1117 .reg_ofs_cur
= AFE_DL2_CUR
,
1118 .fs_reg
= AFE_DAC_CON1
,
1121 .mono_reg
= AFE_DAC_CON3
,
1123 .enable_reg
= AFE_DAC_CON0
,
1125 .hd_reg
= AFE_MEMIF_HD_CON0
,
1127 .agent_disable_reg
= AUDIO_TOP_CON5
,
1128 .agent_disable_shift
= 7,
1134 .id
= MT2701_MEMIF_DL3
,
1135 .reg_ofs_base
= AFE_DL3_BASE
,
1136 .reg_ofs_cur
= AFE_DL3_CUR
,
1137 .fs_reg
= AFE_DAC_CON1
,
1140 .mono_reg
= AFE_DAC_CON3
,
1142 .enable_reg
= AFE_DAC_CON0
,
1144 .hd_reg
= AFE_MEMIF_HD_CON0
,
1146 .agent_disable_reg
= AUDIO_TOP_CON5
,
1147 .agent_disable_shift
= 8,
1153 .id
= MT2701_MEMIF_DL4
,
1154 .reg_ofs_base
= AFE_DL4_BASE
,
1155 .reg_ofs_cur
= AFE_DL4_CUR
,
1156 .fs_reg
= AFE_DAC_CON1
,
1159 .mono_reg
= AFE_DAC_CON3
,
1161 .enable_reg
= AFE_DAC_CON0
,
1163 .hd_reg
= AFE_MEMIF_HD_CON0
,
1165 .agent_disable_reg
= AUDIO_TOP_CON5
,
1166 .agent_disable_shift
= 9,
1172 .id
= MT2701_MEMIF_DL5
,
1173 .reg_ofs_base
= AFE_DL5_BASE
,
1174 .reg_ofs_cur
= AFE_DL5_CUR
,
1175 .fs_reg
= AFE_DAC_CON1
,
1178 .mono_reg
= AFE_DAC_CON3
,
1180 .enable_reg
= AFE_DAC_CON0
,
1182 .hd_reg
= AFE_MEMIF_HD_CON0
,
1184 .agent_disable_reg
= AUDIO_TOP_CON5
,
1185 .agent_disable_shift
= 10,
1191 .id
= MT2701_MEMIF_DLM
,
1192 .reg_ofs_base
= AFE_DLMCH_BASE
,
1193 .reg_ofs_cur
= AFE_DLMCH_CUR
,
1194 .fs_reg
= AFE_DAC_CON1
,
1199 .enable_reg
= AFE_DAC_CON0
,
1201 .hd_reg
= AFE_MEMIF_PBUF_SIZE
,
1203 .agent_disable_reg
= AUDIO_TOP_CON5
,
1204 .agent_disable_shift
= 12,
1210 .id
= MT2701_MEMIF_UL1
,
1211 .reg_ofs_base
= AFE_VUL_BASE
,
1212 .reg_ofs_cur
= AFE_VUL_CUR
,
1213 .fs_reg
= AFE_DAC_CON2
,
1216 .mono_reg
= AFE_DAC_CON4
,
1218 .enable_reg
= AFE_DAC_CON0
,
1220 .hd_reg
= AFE_MEMIF_HD_CON1
,
1222 .agent_disable_reg
= AUDIO_TOP_CON5
,
1223 .agent_disable_shift
= 0,
1229 .id
= MT2701_MEMIF_UL2
,
1230 .reg_ofs_base
= AFE_UL2_BASE
,
1231 .reg_ofs_cur
= AFE_UL2_CUR
,
1232 .fs_reg
= AFE_DAC_CON2
,
1235 .mono_reg
= AFE_DAC_CON4
,
1237 .enable_reg
= AFE_DAC_CON0
,
1239 .hd_reg
= AFE_MEMIF_HD_CON1
,
1241 .agent_disable_reg
= AUDIO_TOP_CON5
,
1242 .agent_disable_shift
= 1,
1248 .id
= MT2701_MEMIF_UL3
,
1249 .reg_ofs_base
= AFE_UL3_BASE
,
1250 .reg_ofs_cur
= AFE_UL3_CUR
,
1251 .fs_reg
= AFE_DAC_CON2
,
1254 .mono_reg
= AFE_DAC_CON4
,
1256 .enable_reg
= AFE_DAC_CON0
,
1258 .hd_reg
= AFE_MEMIF_HD_CON0
,
1260 .agent_disable_reg
= AUDIO_TOP_CON5
,
1261 .agent_disable_shift
= 2,
1267 .id
= MT2701_MEMIF_UL4
,
1268 .reg_ofs_base
= AFE_UL4_BASE
,
1269 .reg_ofs_cur
= AFE_UL4_CUR
,
1270 .fs_reg
= AFE_DAC_CON2
,
1273 .mono_reg
= AFE_DAC_CON4
,
1275 .enable_reg
= AFE_DAC_CON0
,
1277 .hd_reg
= AFE_MEMIF_HD_CON0
,
1279 .agent_disable_reg
= AUDIO_TOP_CON5
,
1280 .agent_disable_shift
= 3,
1286 .id
= MT2701_MEMIF_UL5
,
1287 .reg_ofs_base
= AFE_UL5_BASE
,
1288 .reg_ofs_cur
= AFE_UL5_CUR
,
1289 .fs_reg
= AFE_DAC_CON2
,
1291 .mono_reg
= AFE_DAC_CON4
,
1294 .enable_reg
= AFE_DAC_CON0
,
1296 .hd_reg
= AFE_MEMIF_HD_CON0
,
1298 .agent_disable_reg
= AUDIO_TOP_CON5
,
1299 .agent_disable_shift
= 4,
1305 .id
= MT2701_MEMIF_DLBT
,
1306 .reg_ofs_base
= AFE_ARB1_BASE
,
1307 .reg_ofs_cur
= AFE_ARB1_CUR
,
1308 .fs_reg
= AFE_DAC_CON3
,
1311 .mono_reg
= AFE_DAC_CON3
,
1313 .enable_reg
= AFE_DAC_CON0
,
1315 .hd_reg
= AFE_MEMIF_HD_CON0
,
1317 .agent_disable_reg
= AUDIO_TOP_CON5
,
1318 .agent_disable_shift
= 13,
1324 .id
= MT2701_MEMIF_ULBT
,
1325 .reg_ofs_base
= AFE_DAI_BASE
,
1326 .reg_ofs_cur
= AFE_DAI_CUR
,
1327 .fs_reg
= AFE_DAC_CON2
,
1332 .enable_reg
= AFE_DAC_CON0
,
1334 .hd_reg
= AFE_MEMIF_HD_CON1
,
1336 .agent_disable_reg
= AUDIO_TOP_CON5
,
1337 .agent_disable_shift
= 16,
1343 static const struct mtk_base_irq_data irq_data
[MT2701_IRQ_ASYS_END
] = {
1345 .id
= MT2701_IRQ_ASYS_IRQ1
,
1346 .irq_cnt_reg
= ASYS_IRQ1_CON
,
1348 .irq_cnt_maskbit
= 0xffffff,
1349 .irq_fs_reg
= ASYS_IRQ1_CON
,
1351 .irq_fs_maskbit
= 0x1f,
1352 .irq_en_reg
= ASYS_IRQ1_CON
,
1354 .irq_clr_reg
= ASYS_IRQ_CLR
,
1358 .id
= MT2701_IRQ_ASYS_IRQ2
,
1359 .irq_cnt_reg
= ASYS_IRQ2_CON
,
1361 .irq_cnt_maskbit
= 0xffffff,
1362 .irq_fs_reg
= ASYS_IRQ2_CON
,
1364 .irq_fs_maskbit
= 0x1f,
1365 .irq_en_reg
= ASYS_IRQ2_CON
,
1367 .irq_clr_reg
= ASYS_IRQ_CLR
,
1371 .id
= MT2701_IRQ_ASYS_IRQ3
,
1372 .irq_cnt_reg
= ASYS_IRQ3_CON
,
1374 .irq_cnt_maskbit
= 0xffffff,
1375 .irq_fs_reg
= ASYS_IRQ3_CON
,
1377 .irq_fs_maskbit
= 0x1f,
1378 .irq_en_reg
= ASYS_IRQ3_CON
,
1380 .irq_clr_reg
= ASYS_IRQ_CLR
,
1385 static const struct mt2701_i2s_data mt2701_i2s_data
[MT2701_I2S_NUM
][2] = {
1388 .i2s_ctrl_reg
= ASYS_I2SO1_CON
,
1390 .i2s_asrc_fs_shift
= 0,
1391 .i2s_asrc_fs_mask
= 0x1f,
1395 .i2s_ctrl_reg
= ASYS_I2SIN1_CON
,
1397 .i2s_asrc_fs_shift
= 0,
1398 .i2s_asrc_fs_mask
= 0x1f,
1404 .i2s_ctrl_reg
= ASYS_I2SO2_CON
,
1406 .i2s_asrc_fs_shift
= 5,
1407 .i2s_asrc_fs_mask
= 0x1f,
1411 .i2s_ctrl_reg
= ASYS_I2SIN2_CON
,
1413 .i2s_asrc_fs_shift
= 5,
1414 .i2s_asrc_fs_mask
= 0x1f,
1420 .i2s_ctrl_reg
= ASYS_I2SO3_CON
,
1422 .i2s_asrc_fs_shift
= 10,
1423 .i2s_asrc_fs_mask
= 0x1f,
1427 .i2s_ctrl_reg
= ASYS_I2SIN3_CON
,
1429 .i2s_asrc_fs_shift
= 10,
1430 .i2s_asrc_fs_mask
= 0x1f,
1436 .i2s_ctrl_reg
= ASYS_I2SO4_CON
,
1438 .i2s_asrc_fs_shift
= 15,
1439 .i2s_asrc_fs_mask
= 0x1f,
1443 .i2s_ctrl_reg
= ASYS_I2SIN4_CON
,
1445 .i2s_asrc_fs_shift
= 15,
1446 .i2s_asrc_fs_mask
= 0x1f,
1452 static const struct regmap_config mt2701_afe_regmap_config
= {
1456 .max_register
= AFE_END_ADDR
,
1457 .cache_type
= REGCACHE_NONE
,
1460 static irqreturn_t
mt2701_asys_isr(int irq_id
, void *dev
)
1463 struct mtk_base_afe
*afe
= dev
;
1464 struct mtk_base_afe_memif
*memif
;
1465 struct mtk_base_afe_irq
*irq
;
1468 regmap_read(afe
->regmap
, ASYS_IRQ_STATUS
, &status
);
1469 regmap_write(afe
->regmap
, ASYS_IRQ_CLR
, status
);
1471 for (id
= 0; id
< MT2701_MEMIF_NUM
; ++id
) {
1472 memif
= &afe
->memif
[id
];
1473 if (memif
->irq_usage
< 0)
1475 irq
= &afe
->irqs
[memif
->irq_usage
];
1476 if (status
& 1 << (irq
->irq_data
->irq_clr_shift
))
1477 snd_pcm_period_elapsed(memif
->substream
);
1482 static int mt2701_afe_runtime_suspend(struct device
*dev
)
1484 struct mtk_base_afe
*afe
= dev_get_drvdata(dev
);
1486 mt2701_afe_disable_clock(afe
);
1490 static int mt2701_afe_runtime_resume(struct device
*dev
)
1492 struct mtk_base_afe
*afe
= dev_get_drvdata(dev
);
1494 return mt2701_afe_enable_clock(afe
);
1497 static int mt2701_afe_pcm_dev_probe(struct platform_device
*pdev
)
1499 struct mtk_base_afe
*afe
;
1500 struct mt2701_afe_private
*afe_priv
;
1501 struct resource
*res
;
1505 afe
= devm_kzalloc(&pdev
->dev
, sizeof(*afe
), GFP_KERNEL
);
1508 afe
->platform_priv
= devm_kzalloc(&pdev
->dev
, sizeof(*afe_priv
),
1510 if (!afe
->platform_priv
)
1512 afe_priv
= afe
->platform_priv
;
1514 afe
->dev
= &pdev
->dev
;
1517 irq_id
= platform_get_irq_byname(pdev
, "asys");
1519 dev_err(dev
, "unable to get ASYS IRQ\n");
1523 ret
= devm_request_irq(dev
, irq_id
, mt2701_asys_isr
,
1524 IRQF_TRIGGER_NONE
, "asys-isr", (void *)afe
);
1526 dev_err(dev
, "could not request_irq for asys-isr\n");
1530 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
1532 afe
->base_addr
= devm_ioremap_resource(&pdev
->dev
, res
);
1534 if (IS_ERR(afe
->base_addr
))
1535 return PTR_ERR(afe
->base_addr
);
1537 afe
->regmap
= devm_regmap_init_mmio(&pdev
->dev
, afe
->base_addr
,
1538 &mt2701_afe_regmap_config
);
1539 if (IS_ERR(afe
->regmap
))
1540 return PTR_ERR(afe
->regmap
);
1542 mutex_init(&afe
->irq_alloc_lock
);
1544 /* memif initialize */
1545 afe
->memif_size
= MT2701_MEMIF_NUM
;
1546 afe
->memif
= devm_kcalloc(dev
, afe
->memif_size
, sizeof(*afe
->memif
),
1552 for (i
= 0; i
< afe
->memif_size
; i
++) {
1553 afe
->memif
[i
].data
= &memif_data
[i
];
1554 afe
->memif
[i
].irq_usage
= -1;
1557 /* irq initialize */
1558 afe
->irqs_size
= MT2701_IRQ_ASYS_END
;
1559 afe
->irqs
= devm_kcalloc(dev
, afe
->irqs_size
, sizeof(*afe
->irqs
),
1565 for (i
= 0; i
< afe
->irqs_size
; i
++)
1566 afe
->irqs
[i
].irq_data
= &irq_data
[i
];
1568 /* I2S initialize */
1569 for (i
= 0; i
< MT2701_I2S_NUM
; i
++) {
1570 afe_priv
->i2s_path
[i
].i2s_data
[I2S_OUT
]
1571 = &mt2701_i2s_data
[i
][I2S_OUT
];
1572 afe_priv
->i2s_path
[i
].i2s_data
[I2S_IN
]
1573 = &mt2701_i2s_data
[i
][I2S_IN
];
1576 afe
->mtk_afe_hardware
= &mt2701_afe_hardware
;
1577 afe
->memif_fs
= mt2701_memif_fs
;
1578 afe
->irq_fs
= mt2701_irq_fs
;
1580 afe
->reg_back_up_list
= mt2701_afe_backup_list
;
1581 afe
->reg_back_up_list_num
= ARRAY_SIZE(mt2701_afe_backup_list
);
1582 afe
->runtime_resume
= mt2701_afe_runtime_resume
;
1583 afe
->runtime_suspend
= mt2701_afe_runtime_suspend
;
1585 /* initial audio related clock */
1586 ret
= mt2701_init_clock(afe
);
1588 dev_err(dev
, "init clock error\n");
1592 platform_set_drvdata(pdev
, afe
);
1593 pm_runtime_enable(&pdev
->dev
);
1594 if (!pm_runtime_enabled(&pdev
->dev
))
1595 goto err_pm_disable
;
1596 pm_runtime_get_sync(&pdev
->dev
);
1598 ret
= snd_soc_register_platform(&pdev
->dev
, &mtk_afe_pcm_platform
);
1600 dev_warn(dev
, "err_platform\n");
1604 ret
= snd_soc_register_component(&pdev
->dev
,
1605 &mt2701_afe_pcm_dai_component
,
1606 mt2701_afe_pcm_dais
,
1607 ARRAY_SIZE(mt2701_afe_pcm_dais
));
1609 dev_warn(dev
, "err_dai_component\n");
1610 goto err_dai_component
;
1613 mt2701_afe_runtime_resume(&pdev
->dev
);
1618 snd_soc_unregister_component(&pdev
->dev
);
1621 snd_soc_unregister_platform(&pdev
->dev
);
1624 pm_runtime_disable(&pdev
->dev
);
1629 static int mt2701_afe_pcm_dev_remove(struct platform_device
*pdev
)
1631 struct mtk_base_afe
*afe
= platform_get_drvdata(pdev
);
1633 pm_runtime_disable(&pdev
->dev
);
1634 if (!pm_runtime_status_suspended(&pdev
->dev
))
1635 mt2701_afe_runtime_suspend(&pdev
->dev
);
1636 pm_runtime_put_sync(&pdev
->dev
);
1638 snd_soc_unregister_component(&pdev
->dev
);
1639 snd_soc_unregister_platform(&pdev
->dev
);
1640 /* disable afe clock */
1641 mt2701_afe_disable_clock(afe
);
1645 static const struct of_device_id mt2701_afe_pcm_dt_match
[] = {
1646 { .compatible
= "mediatek,mt2701-audio", },
1649 MODULE_DEVICE_TABLE(of
, mt2701_afe_pcm_dt_match
);
1651 static const struct dev_pm_ops mt2701_afe_pm_ops
= {
1652 SET_RUNTIME_PM_OPS(mt2701_afe_runtime_suspend
,
1653 mt2701_afe_runtime_resume
, NULL
)
1656 static struct platform_driver mt2701_afe_pcm_driver
= {
1658 .name
= "mt2701-audio",
1659 .of_match_table
= mt2701_afe_pcm_dt_match
,
1661 .pm
= &mt2701_afe_pm_ops
,
1664 .probe
= mt2701_afe_pcm_dev_probe
,
1665 .remove
= mt2701_afe_pcm_dev_remove
,
1668 module_platform_driver(mt2701_afe_pcm_driver
);
1670 MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 2701");
1671 MODULE_AUTHOR("Garlic Tseng <garlic.tseng@mediatek.com>");
1672 MODULE_LICENSE("GPL v2");