File Index
Files and directories
Sign in
FILE

mt2701-afe-pcm.c

File preview with syntax highlighting.

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