cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mt2701-afe-pcm.c (40057B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Mediatek ALSA SoC AFE platform driver for 2701
      4 *
      5 * Copyright (c) 2016 MediaTek Inc.
      6 * Author: Garlic Tseng <garlic.tseng@mediatek.com>
      7 *	   Ir Lian <ir.lian@mediatek.com>
      8 *	   Ryder Lee <ryder.lee@mediatek.com>
      9 */
     10
     11#include <linux/delay.h>
     12#include <linux/module.h>
     13#include <linux/mfd/syscon.h>
     14#include <linux/of.h>
     15#include <linux/of_address.h>
     16#include <linux/of_device.h>
     17#include <linux/pm_runtime.h>
     18
     19#include "mt2701-afe-common.h"
     20#include "mt2701-afe-clock-ctrl.h"
     21#include "../common/mtk-afe-platform-driver.h"
     22#include "../common/mtk-afe-fe-dai.h"
     23
     24static const struct snd_pcm_hardware mt2701_afe_hardware = {
     25	.info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED
     26		| SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_MMAP_VALID,
     27	.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE
     28		   | SNDRV_PCM_FMTBIT_S32_LE,
     29	.period_bytes_min = 1024,
     30	.period_bytes_max = 1024 * 256,
     31	.periods_min = 4,
     32	.periods_max = 1024,
     33	.buffer_bytes_max = 1024 * 1024,
     34	.fifo_size = 0,
     35};
     36
     37struct mt2701_afe_rate {
     38	unsigned int rate;
     39	unsigned int regvalue;
     40};
     41
     42static const struct mt2701_afe_rate mt2701_afe_i2s_rates[] = {
     43	{ .rate = 8000, .regvalue = 0 },
     44	{ .rate = 12000, .regvalue = 1 },
     45	{ .rate = 16000, .regvalue = 2 },
     46	{ .rate = 24000, .regvalue = 3 },
     47	{ .rate = 32000, .regvalue = 4 },
     48	{ .rate = 48000, .regvalue = 5 },
     49	{ .rate = 96000, .regvalue = 6 },
     50	{ .rate = 192000, .regvalue = 7 },
     51	{ .rate = 384000, .regvalue = 8 },
     52	{ .rate = 7350, .regvalue = 16 },
     53	{ .rate = 11025, .regvalue = 17 },
     54	{ .rate = 14700, .regvalue = 18 },
     55	{ .rate = 22050, .regvalue = 19 },
     56	{ .rate = 29400, .regvalue = 20 },
     57	{ .rate = 44100, .regvalue = 21 },
     58	{ .rate = 88200, .regvalue = 22 },
     59	{ .rate = 176400, .regvalue = 23 },
     60	{ .rate = 352800, .regvalue = 24 },
     61};
     62
     63static const unsigned int mt2701_afe_backup_list[] = {
     64	AUDIO_TOP_CON0,
     65	AUDIO_TOP_CON4,
     66	AUDIO_TOP_CON5,
     67	ASYS_TOP_CON,
     68	AFE_CONN0,
     69	AFE_CONN1,
     70	AFE_CONN2,
     71	AFE_CONN3,
     72	AFE_CONN15,
     73	AFE_CONN16,
     74	AFE_CONN17,
     75	AFE_CONN18,
     76	AFE_CONN19,
     77	AFE_CONN20,
     78	AFE_CONN21,
     79	AFE_CONN22,
     80	AFE_DAC_CON0,
     81	AFE_MEMIF_PBUF_SIZE,
     82};
     83
     84static int mt2701_dai_num_to_i2s(struct mtk_base_afe *afe, int num)
     85{
     86	struct mt2701_afe_private *afe_priv = afe->platform_priv;
     87	int val = num - MT2701_IO_I2S;
     88
     89	if (val < 0 || val >= afe_priv->soc->i2s_num) {
     90		dev_err(afe->dev, "%s, num not available, num %d, val %d\n",
     91			__func__, num, val);
     92		return -EINVAL;
     93	}
     94	return val;
     95}
     96
     97static int mt2701_afe_i2s_fs(unsigned int sample_rate)
     98{
     99	int i;
    100
    101	for (i = 0; i < ARRAY_SIZE(mt2701_afe_i2s_rates); i++)
    102		if (mt2701_afe_i2s_rates[i].rate == sample_rate)
    103			return mt2701_afe_i2s_rates[i].regvalue;
    104
    105	return -EINVAL;
    106}
    107
    108static int mt2701_afe_i2s_startup(struct snd_pcm_substream *substream,
    109				  struct snd_soc_dai *dai)
    110{
    111	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    112	struct mt2701_afe_private *afe_priv = afe->platform_priv;
    113	int i2s_num = mt2701_dai_num_to_i2s(afe, dai->id);
    114	bool mode = afe_priv->soc->has_one_heart_mode;
    115
    116	if (i2s_num < 0)
    117		return i2s_num;
    118
    119	return mt2701_afe_enable_mclk(afe, mode ? 1 : i2s_num);
    120}
    121
    122static int mt2701_afe_i2s_path_disable(struct mtk_base_afe *afe,
    123				       struct mt2701_i2s_path *i2s_path,
    124				       int stream_dir)
    125{
    126	const struct mt2701_i2s_data *i2s_data = i2s_path->i2s_data[stream_dir];
    127
    128	if (--i2s_path->on[stream_dir] < 0)
    129		i2s_path->on[stream_dir] = 0;
    130
    131	if (i2s_path->on[stream_dir])
    132		return 0;
    133
    134	/* disable i2s */
    135	regmap_update_bits(afe->regmap, i2s_data->i2s_ctrl_reg,
    136			   ASYS_I2S_CON_I2S_EN, 0);
    137
    138	mt2701_afe_disable_i2s(afe, i2s_path, stream_dir);
    139
    140	return 0;
    141}
    142
    143static void mt2701_afe_i2s_shutdown(struct snd_pcm_substream *substream,
    144				    struct snd_soc_dai *dai)
    145{
    146	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    147	struct mt2701_afe_private *afe_priv = afe->platform_priv;
    148	int i2s_num = mt2701_dai_num_to_i2s(afe, dai->id);
    149	struct mt2701_i2s_path *i2s_path;
    150	bool mode = afe_priv->soc->has_one_heart_mode;
    151
    152	if (i2s_num < 0)
    153		return;
    154
    155	i2s_path = &afe_priv->i2s_path[i2s_num];
    156
    157	if (i2s_path->occupied[substream->stream])
    158		i2s_path->occupied[substream->stream] = 0;
    159	else
    160		goto exit;
    161
    162	mt2701_afe_i2s_path_disable(afe, i2s_path, substream->stream);
    163
    164	/* need to disable i2s-out path when disable i2s-in */
    165	if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
    166		mt2701_afe_i2s_path_disable(afe, i2s_path, !substream->stream);
    167
    168exit:
    169	/* disable mclk */
    170	mt2701_afe_disable_mclk(afe, mode ? 1 : i2s_num);
    171}
    172
    173static int mt2701_i2s_path_enable(struct mtk_base_afe *afe,
    174				  struct mt2701_i2s_path *i2s_path,
    175				  int stream_dir, int rate)
    176{
    177	const struct mt2701_i2s_data *i2s_data = i2s_path->i2s_data[stream_dir];
    178	struct mt2701_afe_private *afe_priv = afe->platform_priv;
    179	int reg, fs, w_len = 1; /* now we support bck 64bits only */
    180	unsigned int mask, val;
    181
    182	/* no need to enable if already done */
    183	if (++i2s_path->on[stream_dir] != 1)
    184		return 0;
    185
    186	fs = mt2701_afe_i2s_fs(rate);
    187
    188	mask = ASYS_I2S_CON_FS |
    189	       ASYS_I2S_CON_I2S_COUPLE_MODE | /* 0 */
    190	       ASYS_I2S_CON_I2S_MODE |
    191	       ASYS_I2S_CON_WIDE_MODE;
    192
    193	val = ASYS_I2S_CON_FS_SET(fs) |
    194	      ASYS_I2S_CON_I2S_MODE |
    195	      ASYS_I2S_CON_WIDE_MODE_SET(w_len);
    196
    197	if (stream_dir == SNDRV_PCM_STREAM_CAPTURE) {
    198		mask |= ASYS_I2S_IN_PHASE_FIX;
    199		val |= ASYS_I2S_IN_PHASE_FIX;
    200		reg = ASMI_TIMING_CON1;
    201	} else {
    202		if (afe_priv->soc->has_one_heart_mode) {
    203			mask |= ASYS_I2S_CON_ONE_HEART_MODE;
    204			val |= ASYS_I2S_CON_ONE_HEART_MODE;
    205		}
    206		reg = ASMO_TIMING_CON1;
    207	}
    208
    209	regmap_update_bits(afe->regmap, i2s_data->i2s_ctrl_reg, mask, val);
    210
    211	regmap_update_bits(afe->regmap, reg,
    212			   i2s_data->i2s_asrc_fs_mask
    213			   << i2s_data->i2s_asrc_fs_shift,
    214			   fs << i2s_data->i2s_asrc_fs_shift);
    215
    216	/* enable i2s */
    217	mt2701_afe_enable_i2s(afe, i2s_path, stream_dir);
    218
    219	/* reset i2s hw status before enable */
    220	regmap_update_bits(afe->regmap, i2s_data->i2s_ctrl_reg,
    221			   ASYS_I2S_CON_RESET, ASYS_I2S_CON_RESET);
    222	udelay(1);
    223	regmap_update_bits(afe->regmap, i2s_data->i2s_ctrl_reg,
    224			   ASYS_I2S_CON_RESET, 0);
    225	udelay(1);
    226	regmap_update_bits(afe->regmap, i2s_data->i2s_ctrl_reg,
    227			   ASYS_I2S_CON_I2S_EN, ASYS_I2S_CON_I2S_EN);
    228	return 0;
    229}
    230
    231static int mt2701_afe_i2s_prepare(struct snd_pcm_substream *substream,
    232				  struct snd_soc_dai *dai)
    233{
    234	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    235	struct mt2701_afe_private *afe_priv = afe->platform_priv;
    236	int ret, i2s_num = mt2701_dai_num_to_i2s(afe, dai->id);
    237	struct mt2701_i2s_path *i2s_path;
    238	bool mode = afe_priv->soc->has_one_heart_mode;
    239
    240	if (i2s_num < 0)
    241		return i2s_num;
    242
    243	i2s_path = &afe_priv->i2s_path[i2s_num];
    244
    245	if (i2s_path->occupied[substream->stream])
    246		return -EBUSY;
    247
    248	ret = mt2701_mclk_configuration(afe, mode ? 1 : i2s_num);
    249	if (ret)
    250		return ret;
    251
    252	i2s_path->occupied[substream->stream] = 1;
    253
    254	/* need to enable i2s-out path when enable i2s-in */
    255	if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
    256		mt2701_i2s_path_enable(afe, i2s_path, !substream->stream,
    257				       substream->runtime->rate);
    258
    259	mt2701_i2s_path_enable(afe, i2s_path, substream->stream,
    260			       substream->runtime->rate);
    261
    262	return 0;
    263}
    264
    265static int mt2701_afe_i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id,
    266				     unsigned int freq, int dir)
    267{
    268	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    269	struct mt2701_afe_private *afe_priv = afe->platform_priv;
    270	int i2s_num = mt2701_dai_num_to_i2s(afe, dai->id);
    271	bool mode = afe_priv->soc->has_one_heart_mode;
    272
    273	if (i2s_num < 0)
    274		return i2s_num;
    275
    276	/* mclk */
    277	if (dir == SND_SOC_CLOCK_IN) {
    278		dev_warn(dai->dev, "The SoCs doesn't support mclk input\n");
    279		return -EINVAL;
    280	}
    281
    282	afe_priv->i2s_path[mode ? 1 : i2s_num].mclk_rate = freq;
    283
    284	return 0;
    285}
    286
    287static int mt2701_btmrg_startup(struct snd_pcm_substream *substream,
    288				struct snd_soc_dai *dai)
    289{
    290	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    291	struct mt2701_afe_private *afe_priv = afe->platform_priv;
    292	int ret;
    293
    294	ret = mt2701_enable_btmrg_clk(afe);
    295	if (ret)
    296		return ret;
    297
    298	afe_priv->mrg_enable[substream->stream] = 1;
    299
    300	return 0;
    301}
    302
    303static int mt2701_btmrg_hw_params(struct snd_pcm_substream *substream,
    304				  struct snd_pcm_hw_params *params,
    305				  struct snd_soc_dai *dai)
    306{
    307	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    308	int stream_fs;
    309	u32 val, msk;
    310
    311	stream_fs = params_rate(params);
    312
    313	if (stream_fs != 8000 && stream_fs != 16000) {
    314		dev_err(afe->dev, "unsupported rate %d\n", stream_fs);
    315		return -EINVAL;
    316	}
    317
    318	regmap_update_bits(afe->regmap, AFE_MRGIF_CON,
    319			   AFE_MRGIF_CON_I2S_MODE_MASK,
    320			   AFE_MRGIF_CON_I2S_MODE_32K);
    321
    322	val = AFE_DAIBT_CON0_BT_FUNC_EN | AFE_DAIBT_CON0_BT_FUNC_RDY
    323	      | AFE_DAIBT_CON0_MRG_USE;
    324	msk = val;
    325
    326	if (stream_fs == 16000)
    327		val |= AFE_DAIBT_CON0_BT_WIDE_MODE_EN;
    328
    329	msk |= AFE_DAIBT_CON0_BT_WIDE_MODE_EN;
    330
    331	regmap_update_bits(afe->regmap, AFE_DAIBT_CON0, msk, val);
    332
    333	regmap_update_bits(afe->regmap, AFE_DAIBT_CON0,
    334			   AFE_DAIBT_CON0_DAIBT_EN,
    335			   AFE_DAIBT_CON0_DAIBT_EN);
    336	regmap_update_bits(afe->regmap, AFE_MRGIF_CON,
    337			   AFE_MRGIF_CON_MRG_I2S_EN,
    338			   AFE_MRGIF_CON_MRG_I2S_EN);
    339	regmap_update_bits(afe->regmap, AFE_MRGIF_CON,
    340			   AFE_MRGIF_CON_MRG_EN,
    341			   AFE_MRGIF_CON_MRG_EN);
    342	return 0;
    343}
    344
    345static void mt2701_btmrg_shutdown(struct snd_pcm_substream *substream,
    346				  struct snd_soc_dai *dai)
    347{
    348	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    349	struct mt2701_afe_private *afe_priv = afe->platform_priv;
    350
    351	/* if the other direction stream is not occupied */
    352	if (!afe_priv->mrg_enable[!substream->stream]) {
    353		regmap_update_bits(afe->regmap, AFE_DAIBT_CON0,
    354				   AFE_DAIBT_CON0_DAIBT_EN, 0);
    355		regmap_update_bits(afe->regmap, AFE_MRGIF_CON,
    356				   AFE_MRGIF_CON_MRG_EN, 0);
    357		regmap_update_bits(afe->regmap, AFE_MRGIF_CON,
    358				   AFE_MRGIF_CON_MRG_I2S_EN, 0);
    359		mt2701_disable_btmrg_clk(afe);
    360	}
    361
    362	afe_priv->mrg_enable[substream->stream] = 0;
    363}
    364
    365static int mt2701_simple_fe_startup(struct snd_pcm_substream *substream,
    366				    struct snd_soc_dai *dai)
    367{
    368	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    369	struct mtk_base_afe_memif *memif_tmp;
    370	int stream_dir = substream->stream;
    371
    372	/* can't run single DL & DLM at the same time */
    373	if (stream_dir == SNDRV_PCM_STREAM_PLAYBACK) {
    374		memif_tmp = &afe->memif[MT2701_MEMIF_DLM];
    375		if (memif_tmp->substream) {
    376			dev_warn(afe->dev, "memif is not available");
    377			return -EBUSY;
    378		}
    379	}
    380
    381	return mtk_afe_fe_startup(substream, dai);
    382}
    383
    384static int mt2701_simple_fe_hw_params(struct snd_pcm_substream *substream,
    385				      struct snd_pcm_hw_params *params,
    386				      struct snd_soc_dai *dai)
    387{
    388	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    389	int stream_dir = substream->stream;
    390
    391	/* single DL use PAIR_INTERLEAVE */
    392	if (stream_dir == SNDRV_PCM_STREAM_PLAYBACK)
    393		regmap_update_bits(afe->regmap,
    394				   AFE_MEMIF_PBUF_SIZE,
    395				   AFE_MEMIF_PBUF_SIZE_DLM_MASK,
    396				   AFE_MEMIF_PBUF_SIZE_PAIR_INTERLEAVE);
    397
    398	return mtk_afe_fe_hw_params(substream, params, dai);
    399}
    400
    401static int mt2701_dlm_fe_startup(struct snd_pcm_substream *substream,
    402				 struct snd_soc_dai *dai)
    403{
    404	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    405	struct mtk_base_afe_memif *memif_tmp;
    406	const struct mtk_base_memif_data *memif_data;
    407	int i;
    408
    409	for (i = MT2701_MEMIF_DL1; i < MT2701_MEMIF_DL_SINGLE_NUM; ++i) {
    410		memif_tmp = &afe->memif[i];
    411		if (memif_tmp->substream)
    412			return -EBUSY;
    413	}
    414
    415	/* enable agent for all signal DL (due to hw design) */
    416	for (i = MT2701_MEMIF_DL1; i < MT2701_MEMIF_DL_SINGLE_NUM; ++i) {
    417		memif_data = afe->memif[i].data;
    418		regmap_update_bits(afe->regmap,
    419				   memif_data->agent_disable_reg,
    420				   1 << memif_data->agent_disable_shift,
    421				   0 << memif_data->agent_disable_shift);
    422	}
    423
    424	return mtk_afe_fe_startup(substream, dai);
    425}
    426
    427static void mt2701_dlm_fe_shutdown(struct snd_pcm_substream *substream,
    428				   struct snd_soc_dai *dai)
    429{
    430	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    431	const struct mtk_base_memif_data *memif_data;
    432	int i;
    433
    434	for (i = MT2701_MEMIF_DL1; i < MT2701_MEMIF_DL_SINGLE_NUM; ++i) {
    435		memif_data = afe->memif[i].data;
    436		regmap_update_bits(afe->regmap,
    437				   memif_data->agent_disable_reg,
    438				   1 << memif_data->agent_disable_shift,
    439				   1 << memif_data->agent_disable_shift);
    440	}
    441
    442	return mtk_afe_fe_shutdown(substream, dai);
    443}
    444
    445static int mt2701_dlm_fe_hw_params(struct snd_pcm_substream *substream,
    446				   struct snd_pcm_hw_params *params,
    447				   struct snd_soc_dai *dai)
    448{
    449	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    450	int channels = params_channels(params);
    451
    452	regmap_update_bits(afe->regmap,
    453			   AFE_MEMIF_PBUF_SIZE,
    454			   AFE_MEMIF_PBUF_SIZE_DLM_MASK,
    455			   AFE_MEMIF_PBUF_SIZE_FULL_INTERLEAVE);
    456	regmap_update_bits(afe->regmap,
    457			   AFE_MEMIF_PBUF_SIZE,
    458			   AFE_MEMIF_PBUF_SIZE_DLM_BYTE_MASK,
    459			   AFE_MEMIF_PBUF_SIZE_DLM_32BYTES);
    460	regmap_update_bits(afe->regmap,
    461			   AFE_MEMIF_PBUF_SIZE,
    462			   AFE_MEMIF_PBUF_SIZE_DLM_CH_MASK,
    463			   AFE_MEMIF_PBUF_SIZE_DLM_CH(channels));
    464
    465	return mtk_afe_fe_hw_params(substream, params, dai);
    466}
    467
    468static int mt2701_dlm_fe_trigger(struct snd_pcm_substream *substream,
    469				 int cmd, struct snd_soc_dai *dai)
    470{
    471	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
    472	struct mtk_base_afe_memif *memif_tmp = &afe->memif[MT2701_MEMIF_DL1];
    473
    474	switch (cmd) {
    475	case SNDRV_PCM_TRIGGER_START:
    476	case SNDRV_PCM_TRIGGER_RESUME:
    477		regmap_update_bits(afe->regmap, memif_tmp->data->enable_reg,
    478				   1 << memif_tmp->data->enable_shift,
    479				   1 << memif_tmp->data->enable_shift);
    480		mtk_afe_fe_trigger(substream, cmd, dai);
    481		return 0;
    482	case SNDRV_PCM_TRIGGER_STOP:
    483	case SNDRV_PCM_TRIGGER_SUSPEND:
    484		mtk_afe_fe_trigger(substream, cmd, dai);
    485		regmap_update_bits(afe->regmap, memif_tmp->data->enable_reg,
    486				   1 << memif_tmp->data->enable_shift, 0);
    487
    488		return 0;
    489	default:
    490		return -EINVAL;
    491	}
    492}
    493
    494static int mt2701_memif_fs(struct snd_pcm_substream *substream,
    495			   unsigned int rate)
    496{
    497	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
    498	int fs;
    499
    500	if (asoc_rtd_to_cpu(rtd, 0)->id != MT2701_MEMIF_ULBT)
    501		fs = mt2701_afe_i2s_fs(rate);
    502	else
    503		fs = (rate == 16000 ? 1 : 0);
    504
    505	return fs;
    506}
    507
    508static int mt2701_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)
    509{
    510	return mt2701_afe_i2s_fs(rate);
    511}
    512
    513/* FE DAIs */
    514static const struct snd_soc_dai_ops mt2701_single_memif_dai_ops = {
    515	.startup	= mt2701_simple_fe_startup,
    516	.shutdown	= mtk_afe_fe_shutdown,
    517	.hw_params	= mt2701_simple_fe_hw_params,
    518	.hw_free	= mtk_afe_fe_hw_free,
    519	.prepare	= mtk_afe_fe_prepare,
    520	.trigger	= mtk_afe_fe_trigger,
    521};
    522
    523static const struct snd_soc_dai_ops mt2701_dlm_memif_dai_ops = {
    524	.startup	= mt2701_dlm_fe_startup,
    525	.shutdown	= mt2701_dlm_fe_shutdown,
    526	.hw_params	= mt2701_dlm_fe_hw_params,
    527	.hw_free	= mtk_afe_fe_hw_free,
    528	.prepare	= mtk_afe_fe_prepare,
    529	.trigger	= mt2701_dlm_fe_trigger,
    530};
    531
    532/* I2S BE DAIs */
    533static const struct snd_soc_dai_ops mt2701_afe_i2s_ops = {
    534	.startup	= mt2701_afe_i2s_startup,
    535	.shutdown	= mt2701_afe_i2s_shutdown,
    536	.prepare	= mt2701_afe_i2s_prepare,
    537	.set_sysclk	= mt2701_afe_i2s_set_sysclk,
    538};
    539
    540/* MRG BE DAIs */
    541static const struct snd_soc_dai_ops mt2701_btmrg_ops = {
    542	.startup = mt2701_btmrg_startup,
    543	.shutdown = mt2701_btmrg_shutdown,
    544	.hw_params = mt2701_btmrg_hw_params,
    545};
    546
    547static struct snd_soc_dai_driver mt2701_afe_pcm_dais[] = {
    548	/* FE DAIs: memory intefaces to CPU */
    549	{
    550		.name = "PCMO0",
    551		.id = MT2701_MEMIF_DL1,
    552		.playback = {
    553			.stream_name = "DL1",
    554			.channels_min = 1,
    555			.channels_max = 2,
    556			.rates = SNDRV_PCM_RATE_8000_192000,
    557			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    558				| SNDRV_PCM_FMTBIT_S24_LE
    559				| SNDRV_PCM_FMTBIT_S32_LE)
    560		},
    561		.ops = &mt2701_single_memif_dai_ops,
    562	},
    563	{
    564		.name = "PCM_multi",
    565		.id = MT2701_MEMIF_DLM,
    566		.playback = {
    567			.stream_name = "DLM",
    568			.channels_min = 1,
    569			.channels_max = 8,
    570			.rates = SNDRV_PCM_RATE_8000_192000,
    571			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    572				| SNDRV_PCM_FMTBIT_S24_LE
    573				| SNDRV_PCM_FMTBIT_S32_LE)
    574
    575		},
    576		.ops = &mt2701_dlm_memif_dai_ops,
    577	},
    578	{
    579		.name = "PCM0",
    580		.id = MT2701_MEMIF_UL1,
    581		.capture = {
    582			.stream_name = "UL1",
    583			.channels_min = 1,
    584			.channels_max = 2,
    585			.rates = SNDRV_PCM_RATE_8000_48000,
    586			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    587				| SNDRV_PCM_FMTBIT_S24_LE
    588				| SNDRV_PCM_FMTBIT_S32_LE)
    589		},
    590		.ops = &mt2701_single_memif_dai_ops,
    591	},
    592	{
    593		.name = "PCM1",
    594		.id = MT2701_MEMIF_UL2,
    595		.capture = {
    596			.stream_name = "UL2",
    597			.channels_min = 1,
    598			.channels_max = 2,
    599			.rates = SNDRV_PCM_RATE_8000_192000,
    600			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    601				| SNDRV_PCM_FMTBIT_S24_LE
    602				| SNDRV_PCM_FMTBIT_S32_LE)
    603
    604		},
    605		.ops = &mt2701_single_memif_dai_ops,
    606	},
    607	{
    608		.name = "PCM_BT_DL",
    609		.id = MT2701_MEMIF_DLBT,
    610		.playback = {
    611			.stream_name = "DLBT",
    612			.channels_min = 1,
    613			.channels_max = 1,
    614			.rates = (SNDRV_PCM_RATE_8000
    615				| SNDRV_PCM_RATE_16000),
    616			.formats = SNDRV_PCM_FMTBIT_S16_LE,
    617		},
    618		.ops = &mt2701_single_memif_dai_ops,
    619	},
    620	{
    621		.name = "PCM_BT_UL",
    622		.id = MT2701_MEMIF_ULBT,
    623		.capture = {
    624			.stream_name = "ULBT",
    625			.channels_min = 1,
    626			.channels_max = 1,
    627			.rates = (SNDRV_PCM_RATE_8000
    628				| SNDRV_PCM_RATE_16000),
    629			.formats = SNDRV_PCM_FMTBIT_S16_LE,
    630		},
    631		.ops = &mt2701_single_memif_dai_ops,
    632	},
    633	/* BE DAIs */
    634	{
    635		.name = "I2S0",
    636		.id = MT2701_IO_I2S,
    637		.playback = {
    638			.stream_name = "I2S0 Playback",
    639			.channels_min = 1,
    640			.channels_max = 2,
    641			.rates = SNDRV_PCM_RATE_8000_192000,
    642			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    643				| SNDRV_PCM_FMTBIT_S24_LE
    644				| SNDRV_PCM_FMTBIT_S32_LE)
    645
    646		},
    647		.capture = {
    648			.stream_name = "I2S0 Capture",
    649			.channels_min = 1,
    650			.channels_max = 2,
    651			.rates = SNDRV_PCM_RATE_8000_192000,
    652			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    653				| SNDRV_PCM_FMTBIT_S24_LE
    654				| SNDRV_PCM_FMTBIT_S32_LE)
    655
    656		},
    657		.ops = &mt2701_afe_i2s_ops,
    658		.symmetric_rate = 1,
    659	},
    660	{
    661		.name = "I2S1",
    662		.id = MT2701_IO_2ND_I2S,
    663		.playback = {
    664			.stream_name = "I2S1 Playback",
    665			.channels_min = 1,
    666			.channels_max = 2,
    667			.rates = SNDRV_PCM_RATE_8000_192000,
    668			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    669				| SNDRV_PCM_FMTBIT_S24_LE
    670				| SNDRV_PCM_FMTBIT_S32_LE)
    671			},
    672		.capture = {
    673			.stream_name = "I2S1 Capture",
    674			.channels_min = 1,
    675			.channels_max = 2,
    676			.rates = SNDRV_PCM_RATE_8000_192000,
    677			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    678				| SNDRV_PCM_FMTBIT_S24_LE
    679				| SNDRV_PCM_FMTBIT_S32_LE)
    680			},
    681		.ops = &mt2701_afe_i2s_ops,
    682		.symmetric_rate = 1,
    683	},
    684	{
    685		.name = "I2S2",
    686		.id = MT2701_IO_3RD_I2S,
    687		.playback = {
    688			.stream_name = "I2S2 Playback",
    689			.channels_min = 1,
    690			.channels_max = 2,
    691			.rates = SNDRV_PCM_RATE_8000_192000,
    692			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    693				| SNDRV_PCM_FMTBIT_S24_LE
    694				| SNDRV_PCM_FMTBIT_S32_LE)
    695			},
    696		.capture = {
    697			.stream_name = "I2S2 Capture",
    698			.channels_min = 1,
    699			.channels_max = 2,
    700			.rates = SNDRV_PCM_RATE_8000_192000,
    701			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    702				| SNDRV_PCM_FMTBIT_S24_LE
    703				| SNDRV_PCM_FMTBIT_S32_LE)
    704			},
    705		.ops = &mt2701_afe_i2s_ops,
    706		.symmetric_rate = 1,
    707	},
    708	{
    709		.name = "I2S3",
    710		.id = MT2701_IO_4TH_I2S,
    711		.playback = {
    712			.stream_name = "I2S3 Playback",
    713			.channels_min = 1,
    714			.channels_max = 2,
    715			.rates = SNDRV_PCM_RATE_8000_192000,
    716			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    717				| SNDRV_PCM_FMTBIT_S24_LE
    718				| SNDRV_PCM_FMTBIT_S32_LE)
    719			},
    720		.capture = {
    721			.stream_name = "I2S3 Capture",
    722			.channels_min = 1,
    723			.channels_max = 2,
    724			.rates = SNDRV_PCM_RATE_8000_192000,
    725			.formats = (SNDRV_PCM_FMTBIT_S16_LE
    726				| SNDRV_PCM_FMTBIT_S24_LE
    727				| SNDRV_PCM_FMTBIT_S32_LE)
    728			},
    729		.ops = &mt2701_afe_i2s_ops,
    730		.symmetric_rate = 1,
    731	},
    732	{
    733		.name = "MRG BT",
    734		.id = MT2701_IO_MRG,
    735		.playback = {
    736			.stream_name = "BT Playback",
    737			.channels_min = 1,
    738			.channels_max = 1,
    739			.rates = (SNDRV_PCM_RATE_8000
    740				| SNDRV_PCM_RATE_16000),
    741			.formats = SNDRV_PCM_FMTBIT_S16_LE,
    742		},
    743		.capture = {
    744			.stream_name = "BT Capture",
    745			.channels_min = 1,
    746			.channels_max = 1,
    747			.rates = (SNDRV_PCM_RATE_8000
    748				| SNDRV_PCM_RATE_16000),
    749			.formats = SNDRV_PCM_FMTBIT_S16_LE,
    750		},
    751		.ops = &mt2701_btmrg_ops,
    752		.symmetric_rate = 1,
    753	}
    754};
    755
    756static const struct snd_kcontrol_new mt2701_afe_o00_mix[] = {
    757	SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN0, 0, 1, 0),
    758};
    759
    760static const struct snd_kcontrol_new mt2701_afe_o01_mix[] = {
    761	SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN1, 1, 1, 0),
    762};
    763
    764static const struct snd_kcontrol_new mt2701_afe_o02_mix[] = {
    765	SOC_DAPM_SINGLE_AUTODISABLE("I02 Switch", AFE_CONN2, 2, 1, 0),
    766};
    767
    768static const struct snd_kcontrol_new mt2701_afe_o03_mix[] = {
    769	SOC_DAPM_SINGLE_AUTODISABLE("I03 Switch", AFE_CONN3, 3, 1, 0),
    770};
    771
    772static const struct snd_kcontrol_new mt2701_afe_o14_mix[] = {
    773	SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN14, 26, 1, 0),
    774};
    775
    776static const struct snd_kcontrol_new mt2701_afe_o15_mix[] = {
    777	SOC_DAPM_SINGLE_AUTODISABLE("I12 Switch", AFE_CONN15, 12, 1, 0),
    778};
    779
    780static const struct snd_kcontrol_new mt2701_afe_o16_mix[] = {
    781	SOC_DAPM_SINGLE_AUTODISABLE("I13 Switch", AFE_CONN16, 13, 1, 0),
    782};
    783
    784static const struct snd_kcontrol_new mt2701_afe_o17_mix[] = {
    785	SOC_DAPM_SINGLE_AUTODISABLE("I14 Switch", AFE_CONN17, 14, 1, 0),
    786};
    787
    788static const struct snd_kcontrol_new mt2701_afe_o18_mix[] = {
    789	SOC_DAPM_SINGLE_AUTODISABLE("I15 Switch", AFE_CONN18, 15, 1, 0),
    790};
    791
    792static const struct snd_kcontrol_new mt2701_afe_o19_mix[] = {
    793	SOC_DAPM_SINGLE_AUTODISABLE("I16 Switch", AFE_CONN19, 16, 1, 0),
    794};
    795
    796static const struct snd_kcontrol_new mt2701_afe_o20_mix[] = {
    797	SOC_DAPM_SINGLE_AUTODISABLE("I17 Switch", AFE_CONN20, 17, 1, 0),
    798};
    799
    800static const struct snd_kcontrol_new mt2701_afe_o21_mix[] = {
    801	SOC_DAPM_SINGLE_AUTODISABLE("I18 Switch", AFE_CONN21, 18, 1, 0),
    802};
    803
    804static const struct snd_kcontrol_new mt2701_afe_o22_mix[] = {
    805	SOC_DAPM_SINGLE_AUTODISABLE("I19 Switch", AFE_CONN22, 19, 1, 0),
    806};
    807
    808static const struct snd_kcontrol_new mt2701_afe_o31_mix[] = {
    809	SOC_DAPM_SINGLE_AUTODISABLE("I35 Switch", AFE_CONN41, 9, 1, 0),
    810};
    811
    812static const struct snd_kcontrol_new mt2701_afe_i02_mix[] = {
    813	SOC_DAPM_SINGLE("I2S0 Switch", SND_SOC_NOPM, 0, 1, 0),
    814};
    815
    816static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_i2s0[] = {
    817	SOC_DAPM_SINGLE_AUTODISABLE("Multich I2S0 Out Switch",
    818				    ASYS_I2SO1_CON, 26, 1, 0),
    819};
    820
    821static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_i2s1[] = {
    822	SOC_DAPM_SINGLE_AUTODISABLE("Multich I2S1 Out Switch",
    823				    ASYS_I2SO2_CON, 26, 1, 0),
    824};
    825
    826static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_i2s2[] = {
    827	SOC_DAPM_SINGLE_AUTODISABLE("Multich I2S2 Out Switch",
    828				    PWR2_TOP_CON, 17, 1, 0),
    829};
    830
    831static const struct snd_kcontrol_new mt2701_afe_multi_ch_out_i2s3[] = {
    832	SOC_DAPM_SINGLE_AUTODISABLE("Multich I2S3 Out Switch",
    833				    PWR2_TOP_CON, 18, 1, 0),
    834};
    835
    836static const struct snd_soc_dapm_widget mt2701_afe_pcm_widgets[] = {
    837	/* inter-connections */
    838	SND_SOC_DAPM_MIXER("I00", SND_SOC_NOPM, 0, 0, NULL, 0),
    839	SND_SOC_DAPM_MIXER("I01", SND_SOC_NOPM, 0, 0, NULL, 0),
    840	SND_SOC_DAPM_MIXER("I02", SND_SOC_NOPM, 0, 0, mt2701_afe_i02_mix,
    841			   ARRAY_SIZE(mt2701_afe_i02_mix)),
    842	SND_SOC_DAPM_MIXER("I03", SND_SOC_NOPM, 0, 0, NULL, 0),
    843	SND_SOC_DAPM_MIXER("I12", SND_SOC_NOPM, 0, 0, NULL, 0),
    844	SND_SOC_DAPM_MIXER("I13", SND_SOC_NOPM, 0, 0, NULL, 0),
    845	SND_SOC_DAPM_MIXER("I14", SND_SOC_NOPM, 0, 0, NULL, 0),
    846	SND_SOC_DAPM_MIXER("I15", SND_SOC_NOPM, 0, 0, NULL, 0),
    847	SND_SOC_DAPM_MIXER("I16", SND_SOC_NOPM, 0, 0, NULL, 0),
    848	SND_SOC_DAPM_MIXER("I17", SND_SOC_NOPM, 0, 0, NULL, 0),
    849	SND_SOC_DAPM_MIXER("I18", SND_SOC_NOPM, 0, 0, NULL, 0),
    850	SND_SOC_DAPM_MIXER("I19", SND_SOC_NOPM, 0, 0, NULL, 0),
    851	SND_SOC_DAPM_MIXER("I26", SND_SOC_NOPM, 0, 0, NULL, 0),
    852	SND_SOC_DAPM_MIXER("I35", SND_SOC_NOPM, 0, 0, NULL, 0),
    853
    854	SND_SOC_DAPM_MIXER("O00", SND_SOC_NOPM, 0, 0, mt2701_afe_o00_mix,
    855			   ARRAY_SIZE(mt2701_afe_o00_mix)),
    856	SND_SOC_DAPM_MIXER("O01", SND_SOC_NOPM, 0, 0, mt2701_afe_o01_mix,
    857			   ARRAY_SIZE(mt2701_afe_o01_mix)),
    858	SND_SOC_DAPM_MIXER("O02", SND_SOC_NOPM, 0, 0, mt2701_afe_o02_mix,
    859			   ARRAY_SIZE(mt2701_afe_o02_mix)),
    860	SND_SOC_DAPM_MIXER("O03", SND_SOC_NOPM, 0, 0, mt2701_afe_o03_mix,
    861			   ARRAY_SIZE(mt2701_afe_o03_mix)),
    862	SND_SOC_DAPM_MIXER("O14", SND_SOC_NOPM, 0, 0, mt2701_afe_o14_mix,
    863			   ARRAY_SIZE(mt2701_afe_o14_mix)),
    864	SND_SOC_DAPM_MIXER("O15", SND_SOC_NOPM, 0, 0, mt2701_afe_o15_mix,
    865			   ARRAY_SIZE(mt2701_afe_o15_mix)),
    866	SND_SOC_DAPM_MIXER("O16", SND_SOC_NOPM, 0, 0, mt2701_afe_o16_mix,
    867			   ARRAY_SIZE(mt2701_afe_o16_mix)),
    868	SND_SOC_DAPM_MIXER("O17", SND_SOC_NOPM, 0, 0, mt2701_afe_o17_mix,
    869			   ARRAY_SIZE(mt2701_afe_o17_mix)),
    870	SND_SOC_DAPM_MIXER("O18", SND_SOC_NOPM, 0, 0, mt2701_afe_o18_mix,
    871			   ARRAY_SIZE(mt2701_afe_o18_mix)),
    872	SND_SOC_DAPM_MIXER("O19", SND_SOC_NOPM, 0, 0, mt2701_afe_o19_mix,
    873			   ARRAY_SIZE(mt2701_afe_o19_mix)),
    874	SND_SOC_DAPM_MIXER("O20", SND_SOC_NOPM, 0, 0, mt2701_afe_o20_mix,
    875			   ARRAY_SIZE(mt2701_afe_o20_mix)),
    876	SND_SOC_DAPM_MIXER("O21", SND_SOC_NOPM, 0, 0, mt2701_afe_o21_mix,
    877			   ARRAY_SIZE(mt2701_afe_o21_mix)),
    878	SND_SOC_DAPM_MIXER("O22", SND_SOC_NOPM, 0, 0, mt2701_afe_o22_mix,
    879			   ARRAY_SIZE(mt2701_afe_o22_mix)),
    880	SND_SOC_DAPM_MIXER("O31", SND_SOC_NOPM, 0, 0, mt2701_afe_o31_mix,
    881			   ARRAY_SIZE(mt2701_afe_o31_mix)),
    882
    883	SND_SOC_DAPM_MIXER("I12I13", SND_SOC_NOPM, 0, 0,
    884			   mt2701_afe_multi_ch_out_i2s0,
    885			   ARRAY_SIZE(mt2701_afe_multi_ch_out_i2s0)),
    886	SND_SOC_DAPM_MIXER("I14I15", SND_SOC_NOPM, 0, 0,
    887			   mt2701_afe_multi_ch_out_i2s1,
    888			   ARRAY_SIZE(mt2701_afe_multi_ch_out_i2s1)),
    889	SND_SOC_DAPM_MIXER("I16I17", SND_SOC_NOPM, 0, 0,
    890			   mt2701_afe_multi_ch_out_i2s2,
    891			   ARRAY_SIZE(mt2701_afe_multi_ch_out_i2s2)),
    892	SND_SOC_DAPM_MIXER("I18I19", SND_SOC_NOPM, 0, 0,
    893			   mt2701_afe_multi_ch_out_i2s3,
    894			   ARRAY_SIZE(mt2701_afe_multi_ch_out_i2s3)),
    895};
    896
    897static const struct snd_soc_dapm_route mt2701_afe_pcm_routes[] = {
    898	{"I12", NULL, "DL1"},
    899	{"I13", NULL, "DL1"},
    900	{"I35", NULL, "DLBT"},
    901
    902	{"I2S0 Playback", NULL, "O15"},
    903	{"I2S0 Playback", NULL, "O16"},
    904	{"I2S1 Playback", NULL, "O17"},
    905	{"I2S1 Playback", NULL, "O18"},
    906	{"I2S2 Playback", NULL, "O19"},
    907	{"I2S2 Playback", NULL, "O20"},
    908	{"I2S3 Playback", NULL, "O21"},
    909	{"I2S3 Playback", NULL, "O22"},
    910	{"BT Playback", NULL, "O31"},
    911
    912	{"UL1", NULL, "O00"},
    913	{"UL1", NULL, "O01"},
    914	{"UL2", NULL, "O02"},
    915	{"UL2", NULL, "O03"},
    916	{"ULBT", NULL, "O14"},
    917
    918	{"I00", NULL, "I2S0 Capture"},
    919	{"I01", NULL, "I2S0 Capture"},
    920	{"I02", NULL, "I2S1 Capture"},
    921	{"I03", NULL, "I2S1 Capture"},
    922	/* I02,03 link to UL2, also need to open I2S0 */
    923	{"I02", "I2S0 Switch", "I2S0 Capture"},
    924
    925	{"I26", NULL, "BT Capture"},
    926
    927	{"I12I13", "Multich I2S0 Out Switch", "DLM"},
    928	{"I14I15", "Multich I2S1 Out Switch", "DLM"},
    929	{"I16I17", "Multich I2S2 Out Switch", "DLM"},
    930	{"I18I19", "Multich I2S3 Out Switch", "DLM"},
    931
    932	{ "I12", NULL, "I12I13" },
    933	{ "I13", NULL, "I12I13" },
    934	{ "I14", NULL, "I14I15" },
    935	{ "I15", NULL, "I14I15" },
    936	{ "I16", NULL, "I16I17" },
    937	{ "I17", NULL, "I16I17" },
    938	{ "I18", NULL, "I18I19" },
    939	{ "I19", NULL, "I18I19" },
    940
    941	{ "O00", "I00 Switch", "I00" },
    942	{ "O01", "I01 Switch", "I01" },
    943	{ "O02", "I02 Switch", "I02" },
    944	{ "O03", "I03 Switch", "I03" },
    945	{ "O14", "I26 Switch", "I26" },
    946	{ "O15", "I12 Switch", "I12" },
    947	{ "O16", "I13 Switch", "I13" },
    948	{ "O17", "I14 Switch", "I14" },
    949	{ "O18", "I15 Switch", "I15" },
    950	{ "O19", "I16 Switch", "I16" },
    951	{ "O20", "I17 Switch", "I17" },
    952	{ "O21", "I18 Switch", "I18" },
    953	{ "O22", "I19 Switch", "I19" },
    954	{ "O31", "I35 Switch", "I35" },
    955};
    956
    957static int mt2701_afe_pcm_probe(struct snd_soc_component *component)
    958{
    959	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
    960
    961	snd_soc_component_init_regmap(component, afe->regmap);
    962
    963	return 0;
    964}
    965
    966static const struct snd_soc_component_driver mt2701_afe_pcm_dai_component = {
    967	.probe = mt2701_afe_pcm_probe,
    968	.name = "mt2701-afe-pcm-dai",
    969	.dapm_widgets = mt2701_afe_pcm_widgets,
    970	.num_dapm_widgets = ARRAY_SIZE(mt2701_afe_pcm_widgets),
    971	.dapm_routes = mt2701_afe_pcm_routes,
    972	.num_dapm_routes = ARRAY_SIZE(mt2701_afe_pcm_routes),
    973	.suspend = mtk_afe_suspend,
    974	.resume = mtk_afe_resume,
    975};
    976
    977static const struct mtk_base_memif_data memif_data_array[MT2701_MEMIF_NUM] = {
    978	{
    979		.name = "DL1",
    980		.id = MT2701_MEMIF_DL1,
    981		.reg_ofs_base = AFE_DL1_BASE,
    982		.reg_ofs_cur = AFE_DL1_CUR,
    983		.fs_reg = AFE_DAC_CON1,
    984		.fs_shift = 0,
    985		.fs_maskbit = 0x1f,
    986		.mono_reg = AFE_DAC_CON3,
    987		.mono_shift = 16,
    988		.enable_reg = AFE_DAC_CON0,
    989		.enable_shift = 1,
    990		.hd_reg = AFE_MEMIF_HD_CON0,
    991		.hd_shift = 0,
    992		.agent_disable_reg = AUDIO_TOP_CON5,
    993		.agent_disable_shift = 6,
    994		.msb_reg = -1,
    995	},
    996	{
    997		.name = "DL2",
    998		.id = MT2701_MEMIF_DL2,
    999		.reg_ofs_base = AFE_DL2_BASE,
   1000		.reg_ofs_cur = AFE_DL2_CUR,
   1001		.fs_reg = AFE_DAC_CON1,
   1002		.fs_shift = 5,
   1003		.fs_maskbit = 0x1f,
   1004		.mono_reg = AFE_DAC_CON3,
   1005		.mono_shift = 17,
   1006		.enable_reg = AFE_DAC_CON0,
   1007		.enable_shift = 2,
   1008		.hd_reg = AFE_MEMIF_HD_CON0,
   1009		.hd_shift = 2,
   1010		.agent_disable_reg = AUDIO_TOP_CON5,
   1011		.agent_disable_shift = 7,
   1012		.msb_reg = -1,
   1013	},
   1014	{
   1015		.name = "DL3",
   1016		.id = MT2701_MEMIF_DL3,
   1017		.reg_ofs_base = AFE_DL3_BASE,
   1018		.reg_ofs_cur = AFE_DL3_CUR,
   1019		.fs_reg = AFE_DAC_CON1,
   1020		.fs_shift = 10,
   1021		.fs_maskbit = 0x1f,
   1022		.mono_reg = AFE_DAC_CON3,
   1023		.mono_shift = 18,
   1024		.enable_reg = AFE_DAC_CON0,
   1025		.enable_shift = 3,
   1026		.hd_reg = AFE_MEMIF_HD_CON0,
   1027		.hd_shift = 4,
   1028		.agent_disable_reg = AUDIO_TOP_CON5,
   1029		.agent_disable_shift = 8,
   1030		.msb_reg = -1,
   1031	},
   1032	{
   1033		.name = "DL4",
   1034		.id = MT2701_MEMIF_DL4,
   1035		.reg_ofs_base = AFE_DL4_BASE,
   1036		.reg_ofs_cur = AFE_DL4_CUR,
   1037		.fs_reg = AFE_DAC_CON1,
   1038		.fs_shift = 15,
   1039		.fs_maskbit = 0x1f,
   1040		.mono_reg = AFE_DAC_CON3,
   1041		.mono_shift = 19,
   1042		.enable_reg = AFE_DAC_CON0,
   1043		.enable_shift = 4,
   1044		.hd_reg = AFE_MEMIF_HD_CON0,
   1045		.hd_shift = 6,
   1046		.agent_disable_reg = AUDIO_TOP_CON5,
   1047		.agent_disable_shift = 9,
   1048		.msb_reg = -1,
   1049	},
   1050	{
   1051		.name = "DL5",
   1052		.id = MT2701_MEMIF_DL5,
   1053		.reg_ofs_base = AFE_DL5_BASE,
   1054		.reg_ofs_cur = AFE_DL5_CUR,
   1055		.fs_reg = AFE_DAC_CON1,
   1056		.fs_shift = 20,
   1057		.fs_maskbit = 0x1f,
   1058		.mono_reg = AFE_DAC_CON3,
   1059		.mono_shift = 20,
   1060		.enable_reg = AFE_DAC_CON0,
   1061		.enable_shift = 5,
   1062		.hd_reg = AFE_MEMIF_HD_CON0,
   1063		.hd_shift = 8,
   1064		.agent_disable_reg = AUDIO_TOP_CON5,
   1065		.agent_disable_shift = 10,
   1066		.msb_reg = -1,
   1067	},
   1068	{
   1069		.name = "DLM",
   1070		.id = MT2701_MEMIF_DLM,
   1071		.reg_ofs_base = AFE_DLMCH_BASE,
   1072		.reg_ofs_cur = AFE_DLMCH_CUR,
   1073		.fs_reg = AFE_DAC_CON1,
   1074		.fs_shift = 0,
   1075		.fs_maskbit = 0x1f,
   1076		.mono_reg = -1,
   1077		.mono_shift = -1,
   1078		.enable_reg = AFE_DAC_CON0,
   1079		.enable_shift = 7,
   1080		.hd_reg = AFE_MEMIF_PBUF_SIZE,
   1081		.hd_shift = 28,
   1082		.agent_disable_reg = AUDIO_TOP_CON5,
   1083		.agent_disable_shift = 12,
   1084		.msb_reg = -1,
   1085	},
   1086	{
   1087		.name = "UL1",
   1088		.id = MT2701_MEMIF_UL1,
   1089		.reg_ofs_base = AFE_VUL_BASE,
   1090		.reg_ofs_cur = AFE_VUL_CUR,
   1091		.fs_reg = AFE_DAC_CON2,
   1092		.fs_shift = 0,
   1093		.fs_maskbit = 0x1f,
   1094		.mono_reg = AFE_DAC_CON4,
   1095		.mono_shift = 0,
   1096		.enable_reg = AFE_DAC_CON0,
   1097		.enable_shift = 10,
   1098		.hd_reg = AFE_MEMIF_HD_CON1,
   1099		.hd_shift = 0,
   1100		.agent_disable_reg = AUDIO_TOP_CON5,
   1101		.agent_disable_shift = 0,
   1102		.msb_reg = -1,
   1103	},
   1104	{
   1105		.name = "UL2",
   1106		.id = MT2701_MEMIF_UL2,
   1107		.reg_ofs_base = AFE_UL2_BASE,
   1108		.reg_ofs_cur = AFE_UL2_CUR,
   1109		.fs_reg = AFE_DAC_CON2,
   1110		.fs_shift = 5,
   1111		.fs_maskbit = 0x1f,
   1112		.mono_reg = AFE_DAC_CON4,
   1113		.mono_shift = 2,
   1114		.enable_reg = AFE_DAC_CON0,
   1115		.enable_shift = 11,
   1116		.hd_reg = AFE_MEMIF_HD_CON1,
   1117		.hd_shift = 2,
   1118		.agent_disable_reg = AUDIO_TOP_CON5,
   1119		.agent_disable_shift = 1,
   1120		.msb_reg = -1,
   1121	},
   1122	{
   1123		.name = "UL3",
   1124		.id = MT2701_MEMIF_UL3,
   1125		.reg_ofs_base = AFE_UL3_BASE,
   1126		.reg_ofs_cur = AFE_UL3_CUR,
   1127		.fs_reg = AFE_DAC_CON2,
   1128		.fs_shift = 10,
   1129		.fs_maskbit = 0x1f,
   1130		.mono_reg = AFE_DAC_CON4,
   1131		.mono_shift = 4,
   1132		.enable_reg = AFE_DAC_CON0,
   1133		.enable_shift = 12,
   1134		.hd_reg = AFE_MEMIF_HD_CON0,
   1135		.hd_shift = 0,
   1136		.agent_disable_reg = AUDIO_TOP_CON5,
   1137		.agent_disable_shift = 2,
   1138		.msb_reg = -1,
   1139	},
   1140	{
   1141		.name = "UL4",
   1142		.id = MT2701_MEMIF_UL4,
   1143		.reg_ofs_base = AFE_UL4_BASE,
   1144		.reg_ofs_cur = AFE_UL4_CUR,
   1145		.fs_reg = AFE_DAC_CON2,
   1146		.fs_shift = 15,
   1147		.fs_maskbit = 0x1f,
   1148		.mono_reg = AFE_DAC_CON4,
   1149		.mono_shift = 6,
   1150		.enable_reg = AFE_DAC_CON0,
   1151		.enable_shift = 13,
   1152		.hd_reg = AFE_MEMIF_HD_CON0,
   1153		.hd_shift = 6,
   1154		.agent_disable_reg = AUDIO_TOP_CON5,
   1155		.agent_disable_shift = 3,
   1156		.msb_reg = -1,
   1157	},
   1158	{
   1159		.name = "UL5",
   1160		.id = MT2701_MEMIF_UL5,
   1161		.reg_ofs_base = AFE_UL5_BASE,
   1162		.reg_ofs_cur = AFE_UL5_CUR,
   1163		.fs_reg = AFE_DAC_CON2,
   1164		.fs_shift = 20,
   1165		.mono_reg = AFE_DAC_CON4,
   1166		.mono_shift = 8,
   1167		.fs_maskbit = 0x1f,
   1168		.enable_reg = AFE_DAC_CON0,
   1169		.enable_shift = 14,
   1170		.hd_reg = AFE_MEMIF_HD_CON0,
   1171		.hd_shift = 8,
   1172		.agent_disable_reg = AUDIO_TOP_CON5,
   1173		.agent_disable_shift = 4,
   1174		.msb_reg = -1,
   1175	},
   1176	{
   1177		.name = "DLBT",
   1178		.id = MT2701_MEMIF_DLBT,
   1179		.reg_ofs_base = AFE_ARB1_BASE,
   1180		.reg_ofs_cur = AFE_ARB1_CUR,
   1181		.fs_reg = AFE_DAC_CON3,
   1182		.fs_shift = 10,
   1183		.fs_maskbit = 0x1f,
   1184		.mono_reg = AFE_DAC_CON3,
   1185		.mono_shift = 22,
   1186		.enable_reg = AFE_DAC_CON0,
   1187		.enable_shift = 8,
   1188		.hd_reg = AFE_MEMIF_HD_CON0,
   1189		.hd_shift = 14,
   1190		.agent_disable_reg = AUDIO_TOP_CON5,
   1191		.agent_disable_shift = 13,
   1192		.msb_reg = -1,
   1193	},
   1194	{
   1195		.name = "ULBT",
   1196		.id = MT2701_MEMIF_ULBT,
   1197		.reg_ofs_base = AFE_DAI_BASE,
   1198		.reg_ofs_cur = AFE_DAI_CUR,
   1199		.fs_reg = AFE_DAC_CON2,
   1200		.fs_shift = 30,
   1201		.fs_maskbit = 0x1,
   1202		.mono_reg = -1,
   1203		.mono_shift = -1,
   1204		.enable_reg = AFE_DAC_CON0,
   1205		.enable_shift = 17,
   1206		.hd_reg = AFE_MEMIF_HD_CON1,
   1207		.hd_shift = 20,
   1208		.agent_disable_reg = AUDIO_TOP_CON5,
   1209		.agent_disable_shift = 16,
   1210		.msb_reg = -1,
   1211	},
   1212};
   1213
   1214static const struct mtk_base_irq_data irq_data[MT2701_IRQ_ASYS_END] = {
   1215	{
   1216		.id = MT2701_IRQ_ASYS_IRQ1,
   1217		.irq_cnt_reg = ASYS_IRQ1_CON,
   1218		.irq_cnt_shift = 0,
   1219		.irq_cnt_maskbit = 0xffffff,
   1220		.irq_fs_reg = ASYS_IRQ1_CON,
   1221		.irq_fs_shift = 24,
   1222		.irq_fs_maskbit = 0x1f,
   1223		.irq_en_reg = ASYS_IRQ1_CON,
   1224		.irq_en_shift = 31,
   1225		.irq_clr_reg = ASYS_IRQ_CLR,
   1226		.irq_clr_shift = 0,
   1227	},
   1228	{
   1229		.id = MT2701_IRQ_ASYS_IRQ2,
   1230		.irq_cnt_reg = ASYS_IRQ2_CON,
   1231		.irq_cnt_shift = 0,
   1232		.irq_cnt_maskbit = 0xffffff,
   1233		.irq_fs_reg = ASYS_IRQ2_CON,
   1234		.irq_fs_shift = 24,
   1235		.irq_fs_maskbit = 0x1f,
   1236		.irq_en_reg = ASYS_IRQ2_CON,
   1237		.irq_en_shift = 31,
   1238		.irq_clr_reg = ASYS_IRQ_CLR,
   1239		.irq_clr_shift = 1,
   1240	},
   1241	{
   1242		.id = MT2701_IRQ_ASYS_IRQ3,
   1243		.irq_cnt_reg = ASYS_IRQ3_CON,
   1244		.irq_cnt_shift = 0,
   1245		.irq_cnt_maskbit = 0xffffff,
   1246		.irq_fs_reg = ASYS_IRQ3_CON,
   1247		.irq_fs_shift = 24,
   1248		.irq_fs_maskbit = 0x1f,
   1249		.irq_en_reg = ASYS_IRQ3_CON,
   1250		.irq_en_shift = 31,
   1251		.irq_clr_reg = ASYS_IRQ_CLR,
   1252		.irq_clr_shift = 2,
   1253	}
   1254};
   1255
   1256static const struct mt2701_i2s_data mt2701_i2s_data[][2] = {
   1257	{
   1258		{ ASYS_I2SO1_CON, 0, 0x1f },
   1259		{ ASYS_I2SIN1_CON, 0, 0x1f },
   1260	},
   1261	{
   1262		{ ASYS_I2SO2_CON, 5, 0x1f },
   1263		{ ASYS_I2SIN2_CON, 5, 0x1f },
   1264	},
   1265	{
   1266		{ ASYS_I2SO3_CON, 10, 0x1f },
   1267		{ ASYS_I2SIN3_CON, 10, 0x1f },
   1268	},
   1269	{
   1270		{ ASYS_I2SO4_CON, 15, 0x1f },
   1271		{ ASYS_I2SIN4_CON, 15, 0x1f },
   1272	},
   1273	/* TODO - extend control registers supported by newer SoCs */
   1274};
   1275
   1276static irqreturn_t mt2701_asys_isr(int irq_id, void *dev)
   1277{
   1278	int id;
   1279	struct mtk_base_afe *afe = dev;
   1280	struct mtk_base_afe_memif *memif;
   1281	struct mtk_base_afe_irq *irq;
   1282	u32 status;
   1283
   1284	regmap_read(afe->regmap, ASYS_IRQ_STATUS, &status);
   1285	regmap_write(afe->regmap, ASYS_IRQ_CLR, status);
   1286
   1287	for (id = 0; id < MT2701_MEMIF_NUM; ++id) {
   1288		memif = &afe->memif[id];
   1289		if (memif->irq_usage < 0)
   1290			continue;
   1291
   1292		irq = &afe->irqs[memif->irq_usage];
   1293		if (status & 1 << irq->irq_data->irq_clr_shift)
   1294			snd_pcm_period_elapsed(memif->substream);
   1295	}
   1296
   1297	return IRQ_HANDLED;
   1298}
   1299
   1300static int mt2701_afe_runtime_suspend(struct device *dev)
   1301{
   1302	struct mtk_base_afe *afe = dev_get_drvdata(dev);
   1303
   1304	return mt2701_afe_disable_clock(afe);
   1305}
   1306
   1307static int mt2701_afe_runtime_resume(struct device *dev)
   1308{
   1309	struct mtk_base_afe *afe = dev_get_drvdata(dev);
   1310
   1311	return mt2701_afe_enable_clock(afe);
   1312}
   1313
   1314static int mt2701_afe_pcm_dev_probe(struct platform_device *pdev)
   1315{
   1316	struct mtk_base_afe *afe;
   1317	struct mt2701_afe_private *afe_priv;
   1318	struct device *dev;
   1319	int i, irq_id, ret;
   1320
   1321	afe = devm_kzalloc(&pdev->dev, sizeof(*afe), GFP_KERNEL);
   1322	if (!afe)
   1323		return -ENOMEM;
   1324
   1325	afe->platform_priv = devm_kzalloc(&pdev->dev, sizeof(*afe_priv),
   1326					  GFP_KERNEL);
   1327	if (!afe->platform_priv)
   1328		return -ENOMEM;
   1329
   1330	afe_priv = afe->platform_priv;
   1331	afe_priv->soc = of_device_get_match_data(&pdev->dev);
   1332	afe->dev = &pdev->dev;
   1333	dev = afe->dev;
   1334
   1335	afe_priv->i2s_path = devm_kcalloc(dev,
   1336					  afe_priv->soc->i2s_num,
   1337					  sizeof(struct mt2701_i2s_path),
   1338					  GFP_KERNEL);
   1339	if (!afe_priv->i2s_path)
   1340		return -ENOMEM;
   1341
   1342	irq_id = platform_get_irq_byname(pdev, "asys");
   1343	if (irq_id < 0)
   1344		return irq_id;
   1345
   1346	ret = devm_request_irq(dev, irq_id, mt2701_asys_isr,
   1347			       IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);
   1348	if (ret) {
   1349		dev_err(dev, "could not request_irq for asys-isr\n");
   1350		return ret;
   1351	}
   1352
   1353	afe->regmap = syscon_node_to_regmap(dev->parent->of_node);
   1354	if (IS_ERR(afe->regmap)) {
   1355		dev_err(dev, "could not get regmap from parent\n");
   1356		return PTR_ERR(afe->regmap);
   1357	}
   1358
   1359	mutex_init(&afe->irq_alloc_lock);
   1360
   1361	/* memif initialize */
   1362	afe->memif_size = MT2701_MEMIF_NUM;
   1363	afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),
   1364				  GFP_KERNEL);
   1365	if (!afe->memif)
   1366		return -ENOMEM;
   1367
   1368	for (i = 0; i < afe->memif_size; i++) {
   1369		afe->memif[i].data = &memif_data_array[i];
   1370		afe->memif[i].irq_usage = -1;
   1371	}
   1372
   1373	/* irq initialize */
   1374	afe->irqs_size = MT2701_IRQ_ASYS_END;
   1375	afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),
   1376				 GFP_KERNEL);
   1377	if (!afe->irqs)
   1378		return -ENOMEM;
   1379
   1380	for (i = 0; i < afe->irqs_size; i++)
   1381		afe->irqs[i].irq_data = &irq_data[i];
   1382
   1383	/* I2S initialize */
   1384	for (i = 0; i < afe_priv->soc->i2s_num; i++) {
   1385		afe_priv->i2s_path[i].i2s_data[SNDRV_PCM_STREAM_PLAYBACK] =
   1386			&mt2701_i2s_data[i][SNDRV_PCM_STREAM_PLAYBACK];
   1387		afe_priv->i2s_path[i].i2s_data[SNDRV_PCM_STREAM_CAPTURE] =
   1388			&mt2701_i2s_data[i][SNDRV_PCM_STREAM_CAPTURE];
   1389	}
   1390
   1391	afe->mtk_afe_hardware = &mt2701_afe_hardware;
   1392	afe->memif_fs = mt2701_memif_fs;
   1393	afe->irq_fs = mt2701_irq_fs;
   1394	afe->reg_back_up_list = mt2701_afe_backup_list;
   1395	afe->reg_back_up_list_num = ARRAY_SIZE(mt2701_afe_backup_list);
   1396	afe->runtime_resume = mt2701_afe_runtime_resume;
   1397	afe->runtime_suspend = mt2701_afe_runtime_suspend;
   1398
   1399	/* initial audio related clock */
   1400	ret = mt2701_init_clock(afe);
   1401	if (ret) {
   1402		dev_err(dev, "init clock error\n");
   1403		return ret;
   1404	}
   1405
   1406	platform_set_drvdata(pdev, afe);
   1407
   1408	pm_runtime_enable(dev);
   1409	if (!pm_runtime_enabled(dev)) {
   1410		ret = mt2701_afe_runtime_resume(dev);
   1411		if (ret)
   1412			goto err_pm_disable;
   1413	}
   1414	pm_runtime_get_sync(dev);
   1415
   1416	ret = devm_snd_soc_register_component(&pdev->dev, &mtk_afe_pcm_platform,
   1417					      NULL, 0);
   1418	if (ret) {
   1419		dev_warn(dev, "err_platform\n");
   1420		goto err_platform;
   1421	}
   1422
   1423	ret = devm_snd_soc_register_component(&pdev->dev,
   1424					 &mt2701_afe_pcm_dai_component,
   1425					 mt2701_afe_pcm_dais,
   1426					 ARRAY_SIZE(mt2701_afe_pcm_dais));
   1427	if (ret) {
   1428		dev_warn(dev, "err_dai_component\n");
   1429		goto err_platform;
   1430	}
   1431
   1432	return 0;
   1433
   1434err_platform:
   1435	pm_runtime_put_sync(dev);
   1436err_pm_disable:
   1437	pm_runtime_disable(dev);
   1438
   1439	return ret;
   1440}
   1441
   1442static int mt2701_afe_pcm_dev_remove(struct platform_device *pdev)
   1443{
   1444	pm_runtime_put_sync(&pdev->dev);
   1445	pm_runtime_disable(&pdev->dev);
   1446	if (!pm_runtime_status_suspended(&pdev->dev))
   1447		mt2701_afe_runtime_suspend(&pdev->dev);
   1448
   1449	return 0;
   1450}
   1451
   1452static const struct mt2701_soc_variants mt2701_soc_v1 = {
   1453	.i2s_num = 4,
   1454};
   1455
   1456static const struct mt2701_soc_variants mt2701_soc_v2 = {
   1457	.has_one_heart_mode = true,
   1458	.i2s_num = 4,
   1459};
   1460
   1461static const struct of_device_id mt2701_afe_pcm_dt_match[] = {
   1462	{ .compatible = "mediatek,mt2701-audio", .data = &mt2701_soc_v1 },
   1463	{ .compatible = "mediatek,mt7622-audio", .data = &mt2701_soc_v2 },
   1464	{},
   1465};
   1466MODULE_DEVICE_TABLE(of, mt2701_afe_pcm_dt_match);
   1467
   1468static const struct dev_pm_ops mt2701_afe_pm_ops = {
   1469	SET_RUNTIME_PM_OPS(mt2701_afe_runtime_suspend,
   1470			   mt2701_afe_runtime_resume, NULL)
   1471};
   1472
   1473static struct platform_driver mt2701_afe_pcm_driver = {
   1474	.driver = {
   1475		   .name = "mt2701-audio",
   1476		   .of_match_table = mt2701_afe_pcm_dt_match,
   1477		   .pm = &mt2701_afe_pm_ops,
   1478	},
   1479	.probe = mt2701_afe_pcm_dev_probe,
   1480	.remove = mt2701_afe_pcm_dev_remove,
   1481};
   1482
   1483module_platform_driver(mt2701_afe_pcm_driver);
   1484
   1485MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 2701");
   1486MODULE_AUTHOR("Garlic Tseng <garlic.tseng@mediatek.com>");
   1487MODULE_LICENSE("GPL v2");