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

mt6797-afe-pcm.c (23748B)


      1// SPDX-License-Identifier: GPL-2.0
      2//
      3// Mediatek ALSA SoC AFE platform driver for 6797
      4//
      5// Copyright (c) 2018 MediaTek Inc.
      6// Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
      7
      8#include <linux/delay.h>
      9#include <linux/module.h>
     10#include <linux/mfd/syscon.h>
     11#include <linux/of.h>
     12#include <linux/of_address.h>
     13#include <linux/pm_runtime.h>
     14
     15#include "mt6797-afe-common.h"
     16#include "mt6797-afe-clk.h"
     17#include "mt6797-interconnection.h"
     18#include "mt6797-reg.h"
     19#include "../common/mtk-afe-platform-driver.h"
     20#include "../common/mtk-afe-fe-dai.h"
     21
     22enum {
     23	MTK_AFE_RATE_8K = 0,
     24	MTK_AFE_RATE_11K = 1,
     25	MTK_AFE_RATE_12K = 2,
     26	MTK_AFE_RATE_384K = 3,
     27	MTK_AFE_RATE_16K = 4,
     28	MTK_AFE_RATE_22K = 5,
     29	MTK_AFE_RATE_24K = 6,
     30	MTK_AFE_RATE_130K = 7,
     31	MTK_AFE_RATE_32K = 8,
     32	MTK_AFE_RATE_44K = 9,
     33	MTK_AFE_RATE_48K = 10,
     34	MTK_AFE_RATE_88K = 11,
     35	MTK_AFE_RATE_96K = 12,
     36	MTK_AFE_RATE_174K = 13,
     37	MTK_AFE_RATE_192K = 14,
     38	MTK_AFE_RATE_260K = 15,
     39};
     40
     41enum {
     42	MTK_AFE_DAI_MEMIF_RATE_8K = 0,
     43	MTK_AFE_DAI_MEMIF_RATE_16K = 1,
     44	MTK_AFE_DAI_MEMIF_RATE_32K = 2,
     45};
     46
     47enum {
     48	MTK_AFE_PCM_RATE_8K = 0,
     49	MTK_AFE_PCM_RATE_16K = 1,
     50	MTK_AFE_PCM_RATE_32K = 2,
     51	MTK_AFE_PCM_RATE_48K = 3,
     52};
     53
     54unsigned int mt6797_general_rate_transform(struct device *dev,
     55					   unsigned int rate)
     56{
     57	switch (rate) {
     58	case 8000:
     59		return MTK_AFE_RATE_8K;
     60	case 11025:
     61		return MTK_AFE_RATE_11K;
     62	case 12000:
     63		return MTK_AFE_RATE_12K;
     64	case 16000:
     65		return MTK_AFE_RATE_16K;
     66	case 22050:
     67		return MTK_AFE_RATE_22K;
     68	case 24000:
     69		return MTK_AFE_RATE_24K;
     70	case 32000:
     71		return MTK_AFE_RATE_32K;
     72	case 44100:
     73		return MTK_AFE_RATE_44K;
     74	case 48000:
     75		return MTK_AFE_RATE_48K;
     76	case 88200:
     77		return MTK_AFE_RATE_88K;
     78	case 96000:
     79		return MTK_AFE_RATE_96K;
     80	case 130000:
     81		return MTK_AFE_RATE_130K;
     82	case 176400:
     83		return MTK_AFE_RATE_174K;
     84	case 192000:
     85		return MTK_AFE_RATE_192K;
     86	case 260000:
     87		return MTK_AFE_RATE_260K;
     88	default:
     89		dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
     90			 __func__, rate, MTK_AFE_RATE_48K);
     91		return MTK_AFE_RATE_48K;
     92	}
     93}
     94
     95static unsigned int dai_memif_rate_transform(struct device *dev,
     96					     unsigned int rate)
     97{
     98	switch (rate) {
     99	case 8000:
    100		return MTK_AFE_DAI_MEMIF_RATE_8K;
    101	case 16000:
    102		return MTK_AFE_DAI_MEMIF_RATE_16K;
    103	case 32000:
    104		return MTK_AFE_DAI_MEMIF_RATE_32K;
    105	default:
    106		dev_warn(dev, "%s(), rate %u invalid, use %d!!!\n",
    107			 __func__, rate, MTK_AFE_DAI_MEMIF_RATE_16K);
    108		return MTK_AFE_DAI_MEMIF_RATE_16K;
    109	}
    110}
    111
    112unsigned int mt6797_rate_transform(struct device *dev,
    113				   unsigned int rate, int aud_blk)
    114{
    115	switch (aud_blk) {
    116	case MT6797_MEMIF_DAI:
    117	case MT6797_MEMIF_MOD_DAI:
    118		return dai_memif_rate_transform(dev, rate);
    119	default:
    120		return mt6797_general_rate_transform(dev, rate);
    121	}
    122}
    123
    124static const struct snd_pcm_hardware mt6797_afe_hardware = {
    125	.info = SNDRV_PCM_INFO_MMAP |
    126		SNDRV_PCM_INFO_INTERLEAVED |
    127		SNDRV_PCM_INFO_MMAP_VALID,
    128	.formats = SNDRV_PCM_FMTBIT_S16_LE |
    129		   SNDRV_PCM_FMTBIT_S24_LE |
    130		   SNDRV_PCM_FMTBIT_S32_LE,
    131	.period_bytes_min = 256,
    132	.period_bytes_max = 4 * 48 * 1024,
    133	.periods_min = 2,
    134	.periods_max = 256,
    135	.buffer_bytes_max = 8 * 48 * 1024,
    136	.fifo_size = 0,
    137};
    138
    139static int mt6797_memif_fs(struct snd_pcm_substream *substream,
    140			   unsigned int rate)
    141{
    142	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
    143	struct snd_soc_component *component =
    144		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
    145	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
    146	int id = asoc_rtd_to_cpu(rtd, 0)->id;
    147
    148	return mt6797_rate_transform(afe->dev, rate, id);
    149}
    150
    151static int mt6797_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)
    152{
    153	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
    154	struct snd_soc_component *component =
    155		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
    156	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
    157
    158	return mt6797_general_rate_transform(afe->dev, rate);
    159}
    160
    161#define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\
    162		       SNDRV_PCM_RATE_88200 |\
    163		       SNDRV_PCM_RATE_96000 |\
    164		       SNDRV_PCM_RATE_176400 |\
    165		       SNDRV_PCM_RATE_192000)
    166
    167#define MTK_PCM_DAI_RATES (SNDRV_PCM_RATE_8000 |\
    168			   SNDRV_PCM_RATE_16000 |\
    169			   SNDRV_PCM_RATE_32000)
    170
    171#define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
    172			 SNDRV_PCM_FMTBIT_S24_LE |\
    173			 SNDRV_PCM_FMTBIT_S32_LE)
    174
    175static struct snd_soc_dai_driver mt6797_memif_dai_driver[] = {
    176	/* FE DAIs: memory intefaces to CPU */
    177	{
    178		.name = "DL1",
    179		.id = MT6797_MEMIF_DL1,
    180		.playback = {
    181			.stream_name = "DL1",
    182			.channels_min = 1,
    183			.channels_max = 2,
    184			.rates = MTK_PCM_RATES,
    185			.formats = MTK_PCM_FORMATS,
    186		},
    187		.ops = &mtk_afe_fe_ops,
    188	},
    189	{
    190		.name = "DL2",
    191		.id = MT6797_MEMIF_DL2,
    192		.playback = {
    193			.stream_name = "DL2",
    194			.channels_min = 1,
    195			.channels_max = 2,
    196			.rates = MTK_PCM_RATES,
    197			.formats = MTK_PCM_FORMATS,
    198		},
    199		.ops = &mtk_afe_fe_ops,
    200	},
    201	{
    202		.name = "DL3",
    203		.id = MT6797_MEMIF_DL3,
    204		.playback = {
    205			.stream_name = "DL3",
    206			.channels_min = 1,
    207			.channels_max = 2,
    208			.rates = MTK_PCM_RATES,
    209			.formats = MTK_PCM_FORMATS,
    210		},
    211		.ops = &mtk_afe_fe_ops,
    212	},
    213	{
    214		.name = "UL1",
    215		.id = MT6797_MEMIF_VUL12,
    216		.capture = {
    217			.stream_name = "UL1",
    218			.channels_min = 1,
    219			.channels_max = 2,
    220			.rates = MTK_PCM_RATES,
    221			.formats = MTK_PCM_FORMATS,
    222		},
    223		.ops = &mtk_afe_fe_ops,
    224	},
    225	{
    226		.name = "UL2",
    227		.id = MT6797_MEMIF_AWB,
    228		.capture = {
    229			.stream_name = "UL2",
    230			.channels_min = 1,
    231			.channels_max = 2,
    232			.rates = MTK_PCM_RATES,
    233			.formats = MTK_PCM_FORMATS,
    234		},
    235		.ops = &mtk_afe_fe_ops,
    236	},
    237	{
    238		.name = "UL3",
    239		.id = MT6797_MEMIF_VUL,
    240		.capture = {
    241			.stream_name = "UL3",
    242			.channels_min = 1,
    243			.channels_max = 2,
    244			.rates = MTK_PCM_RATES,
    245			.formats = MTK_PCM_FORMATS,
    246		},
    247		.ops = &mtk_afe_fe_ops,
    248	},
    249	{
    250		.name = "UL_MONO_1",
    251		.id = MT6797_MEMIF_MOD_DAI,
    252		.capture = {
    253			.stream_name = "UL_MONO_1",
    254			.channels_min = 1,
    255			.channels_max = 1,
    256			.rates = MTK_PCM_DAI_RATES,
    257			.formats = MTK_PCM_FORMATS,
    258		},
    259		.ops = &mtk_afe_fe_ops,
    260	},
    261	{
    262		.name = "UL_MONO_2",
    263		.id = MT6797_MEMIF_DAI,
    264		.capture = {
    265			.stream_name = "UL_MONO_2",
    266			.channels_min = 1,
    267			.channels_max = 1,
    268			.rates = MTK_PCM_DAI_RATES,
    269			.formats = MTK_PCM_FORMATS,
    270		},
    271		.ops = &mtk_afe_fe_ops,
    272	},
    273};
    274
    275/* dma widget & routes*/
    276static const struct snd_kcontrol_new memif_ul1_ch1_mix[] = {
    277	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN21,
    278				    I_ADDA_UL_CH1, 1, 0),
    279};
    280
    281static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = {
    282	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN22,
    283				    I_ADDA_UL_CH2, 1, 0),
    284};
    285
    286static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = {
    287	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN5,
    288				    I_ADDA_UL_CH1, 1, 0),
    289	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN5,
    290				    I_DL1_CH1, 1, 0),
    291	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN5,
    292				    I_DL2_CH1, 1, 0),
    293	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN5,
    294				    I_DL3_CH1, 1, 0),
    295};
    296
    297static const struct snd_kcontrol_new memif_ul2_ch2_mix[] = {
    298	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN6,
    299				    I_ADDA_UL_CH2, 1, 0),
    300	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN6,
    301				    I_DL1_CH2, 1, 0),
    302	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN6,
    303				    I_DL2_CH2, 1, 0),
    304	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN6,
    305				    I_DL3_CH2, 1, 0),
    306};
    307
    308static const struct snd_kcontrol_new memif_ul3_ch1_mix[] = {
    309	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN9,
    310				    I_ADDA_UL_CH1, 1, 0),
    311};
    312
    313static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = {
    314	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN10,
    315				    I_ADDA_UL_CH2, 1, 0),
    316};
    317
    318static const struct snd_kcontrol_new memif_ul_mono_1_mix[] = {
    319	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN12,
    320				    I_ADDA_UL_CH1, 1, 0),
    321	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN12,
    322				    I_ADDA_UL_CH2, 1, 0),
    323};
    324
    325static const struct snd_kcontrol_new memif_ul_mono_2_mix[] = {
    326	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN11,
    327				    I_ADDA_UL_CH1, 1, 0),
    328	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN11,
    329				    I_ADDA_UL_CH2, 1, 0),
    330};
    331
    332static const struct snd_soc_dapm_widget mt6797_memif_widgets[] = {
    333	/* memif */
    334	SND_SOC_DAPM_MIXER("UL1_CH1", SND_SOC_NOPM, 0, 0,
    335			   memif_ul1_ch1_mix, ARRAY_SIZE(memif_ul1_ch1_mix)),
    336	SND_SOC_DAPM_MIXER("UL1_CH2", SND_SOC_NOPM, 0, 0,
    337			   memif_ul1_ch2_mix, ARRAY_SIZE(memif_ul1_ch2_mix)),
    338
    339	SND_SOC_DAPM_MIXER("UL2_CH1", SND_SOC_NOPM, 0, 0,
    340			   memif_ul2_ch1_mix, ARRAY_SIZE(memif_ul2_ch1_mix)),
    341	SND_SOC_DAPM_MIXER("UL2_CH2", SND_SOC_NOPM, 0, 0,
    342			   memif_ul2_ch2_mix, ARRAY_SIZE(memif_ul2_ch2_mix)),
    343
    344	SND_SOC_DAPM_MIXER("UL3_CH1", SND_SOC_NOPM, 0, 0,
    345			   memif_ul3_ch1_mix, ARRAY_SIZE(memif_ul3_ch1_mix)),
    346	SND_SOC_DAPM_MIXER("UL3_CH2", SND_SOC_NOPM, 0, 0,
    347			   memif_ul3_ch2_mix, ARRAY_SIZE(memif_ul3_ch2_mix)),
    348
    349	SND_SOC_DAPM_MIXER("UL_MONO_1_CH1", SND_SOC_NOPM, 0, 0,
    350			   memif_ul_mono_1_mix,
    351			   ARRAY_SIZE(memif_ul_mono_1_mix)),
    352
    353	SND_SOC_DAPM_MIXER("UL_MONO_2_CH1", SND_SOC_NOPM, 0, 0,
    354			   memif_ul_mono_2_mix,
    355			   ARRAY_SIZE(memif_ul_mono_2_mix)),
    356};
    357
    358static const struct snd_soc_dapm_route mt6797_memif_routes[] = {
    359	/* capture */
    360	{"UL1", NULL, "UL1_CH1"},
    361	{"UL1", NULL, "UL1_CH2"},
    362	{"UL1_CH1", "ADDA_UL_CH1", "ADDA Capture"},
    363	{"UL1_CH2", "ADDA_UL_CH2", "ADDA Capture"},
    364
    365	{"UL2", NULL, "UL2_CH1"},
    366	{"UL2", NULL, "UL2_CH2"},
    367	{"UL2_CH1", "ADDA_UL_CH1", "ADDA Capture"},
    368	{"UL2_CH2", "ADDA_UL_CH2", "ADDA Capture"},
    369
    370	{"UL3", NULL, "UL3_CH1"},
    371	{"UL3", NULL, "UL3_CH2"},
    372	{"UL3_CH1", "ADDA_UL_CH1", "ADDA Capture"},
    373	{"UL3_CH2", "ADDA_UL_CH2", "ADDA Capture"},
    374
    375	{"UL_MONO_1", NULL, "UL_MONO_1_CH1"},
    376	{"UL_MONO_1_CH1", "ADDA_UL_CH1", "ADDA Capture"},
    377	{"UL_MONO_1_CH1", "ADDA_UL_CH2", "ADDA Capture"},
    378
    379	{"UL_MONO_2", NULL, "UL_MONO_2_CH1"},
    380	{"UL_MONO_2_CH1", "ADDA_UL_CH1", "ADDA Capture"},
    381	{"UL_MONO_2_CH1", "ADDA_UL_CH2", "ADDA Capture"},
    382};
    383
    384static const struct snd_soc_component_driver mt6797_afe_pcm_dai_component = {
    385	.name = "mt6797-afe-pcm-dai",
    386};
    387
    388static const struct mtk_base_memif_data memif_data[MT6797_MEMIF_NUM] = {
    389	[MT6797_MEMIF_DL1] = {
    390		.name = "DL1",
    391		.id = MT6797_MEMIF_DL1,
    392		.reg_ofs_base = AFE_DL1_BASE,
    393		.reg_ofs_cur = AFE_DL1_CUR,
    394		.fs_reg = AFE_DAC_CON1,
    395		.fs_shift = DL1_MODE_SFT,
    396		.fs_maskbit = DL1_MODE_MASK,
    397		.mono_reg = AFE_DAC_CON1,
    398		.mono_shift = DL1_DATA_SFT,
    399		.enable_reg = AFE_DAC_CON0,
    400		.enable_shift = DL1_ON_SFT,
    401		.hd_reg = AFE_MEMIF_HD_MODE,
    402		.hd_shift = DL1_HD_SFT,
    403		.agent_disable_reg = -1,
    404		.msb_reg = -1,
    405	},
    406	[MT6797_MEMIF_DL2] = {
    407		.name = "DL2",
    408		.id = MT6797_MEMIF_DL2,
    409		.reg_ofs_base = AFE_DL2_BASE,
    410		.reg_ofs_cur = AFE_DL2_CUR,
    411		.fs_reg = AFE_DAC_CON1,
    412		.fs_shift = DL2_MODE_SFT,
    413		.fs_maskbit = DL2_MODE_MASK,
    414		.mono_reg = AFE_DAC_CON1,
    415		.mono_shift = DL2_DATA_SFT,
    416		.enable_reg = AFE_DAC_CON0,
    417		.enable_shift = DL2_ON_SFT,
    418		.hd_reg = AFE_MEMIF_HD_MODE,
    419		.hd_shift = DL2_HD_SFT,
    420		.agent_disable_reg = -1,
    421		.msb_reg = -1,
    422	},
    423	[MT6797_MEMIF_DL3] = {
    424		.name = "DL3",
    425		.id = MT6797_MEMIF_DL3,
    426		.reg_ofs_base = AFE_DL3_BASE,
    427		.reg_ofs_cur = AFE_DL3_CUR,
    428		.fs_reg = AFE_DAC_CON0,
    429		.fs_shift = DL3_MODE_SFT,
    430		.fs_maskbit = DL3_MODE_MASK,
    431		.mono_reg = AFE_DAC_CON1,
    432		.mono_shift = DL3_DATA_SFT,
    433		.enable_reg = AFE_DAC_CON0,
    434		.enable_shift = DL3_ON_SFT,
    435		.hd_reg = AFE_MEMIF_HD_MODE,
    436		.hd_shift = DL3_HD_SFT,
    437		.agent_disable_reg = -1,
    438		.msb_reg = -1,
    439	},
    440	[MT6797_MEMIF_VUL] = {
    441		.name = "VUL",
    442		.id = MT6797_MEMIF_VUL,
    443		.reg_ofs_base = AFE_VUL_BASE,
    444		.reg_ofs_cur = AFE_VUL_CUR,
    445		.fs_reg = AFE_DAC_CON1,
    446		.fs_shift = VUL_MODE_SFT,
    447		.fs_maskbit = VUL_MODE_MASK,
    448		.mono_reg = AFE_DAC_CON1,
    449		.mono_shift = VUL_DATA_SFT,
    450		.enable_reg = AFE_DAC_CON0,
    451		.enable_shift = VUL_ON_SFT,
    452		.hd_reg = AFE_MEMIF_HD_MODE,
    453		.hd_shift = VUL_HD_SFT,
    454		.agent_disable_reg = -1,
    455		.msb_reg = -1,
    456	},
    457	[MT6797_MEMIF_AWB] = {
    458		.name = "AWB",
    459		.id = MT6797_MEMIF_AWB,
    460		.reg_ofs_base = AFE_AWB_BASE,
    461		.reg_ofs_cur = AFE_AWB_CUR,
    462		.fs_reg = AFE_DAC_CON1,
    463		.fs_shift = AWB_MODE_SFT,
    464		.fs_maskbit = AWB_MODE_MASK,
    465		.mono_reg = AFE_DAC_CON1,
    466		.mono_shift = AWB_DATA_SFT,
    467		.enable_reg = AFE_DAC_CON0,
    468		.enable_shift = AWB_ON_SFT,
    469		.hd_reg = AFE_MEMIF_HD_MODE,
    470		.hd_shift = AWB_HD_SFT,
    471		.agent_disable_reg = -1,
    472		.msb_reg = -1,
    473	},
    474	[MT6797_MEMIF_VUL12] = {
    475		.name = "VUL12",
    476		.id = MT6797_MEMIF_VUL12,
    477		.reg_ofs_base = AFE_VUL_D2_BASE,
    478		.reg_ofs_cur = AFE_VUL_D2_CUR,
    479		.fs_reg = AFE_DAC_CON0,
    480		.fs_shift = VUL_DATA2_MODE_SFT,
    481		.fs_maskbit = VUL_DATA2_MODE_MASK,
    482		.mono_reg = AFE_DAC_CON0,
    483		.mono_shift = VUL_DATA2_DATA_SFT,
    484		.enable_reg = AFE_DAC_CON0,
    485		.enable_shift = VUL_DATA2_ON_SFT,
    486		.hd_reg = AFE_MEMIF_HD_MODE,
    487		.hd_shift = VUL_DATA2_HD_SFT,
    488		.agent_disable_reg = -1,
    489		.msb_reg = -1,
    490	},
    491	[MT6797_MEMIF_DAI] = {
    492		.name = "DAI",
    493		.id = MT6797_MEMIF_DAI,
    494		.reg_ofs_base = AFE_DAI_BASE,
    495		.reg_ofs_cur = AFE_DAI_CUR,
    496		.fs_reg = AFE_DAC_CON0,
    497		.fs_shift = DAI_MODE_SFT,
    498		.fs_maskbit = DAI_MODE_MASK,
    499		.mono_reg = -1,
    500		.mono_shift = 0,
    501		.enable_reg = AFE_DAC_CON0,
    502		.enable_shift = DAI_ON_SFT,
    503		.hd_reg = AFE_MEMIF_HD_MODE,
    504		.hd_shift = DAI_HD_SFT,
    505		.agent_disable_reg = -1,
    506		.msb_reg = -1,
    507	},
    508	[MT6797_MEMIF_MOD_DAI] = {
    509		.name = "MOD_DAI",
    510		.id = MT6797_MEMIF_MOD_DAI,
    511		.reg_ofs_base = AFE_MOD_DAI_BASE,
    512		.reg_ofs_cur = AFE_MOD_DAI_CUR,
    513		.fs_reg = AFE_DAC_CON1,
    514		.fs_shift = MOD_DAI_MODE_SFT,
    515		.fs_maskbit = MOD_DAI_MODE_MASK,
    516		.mono_reg = -1,
    517		.mono_shift = 0,
    518		.enable_reg = AFE_DAC_CON0,
    519		.enable_shift = MOD_DAI_ON_SFT,
    520		.hd_reg = AFE_MEMIF_HD_MODE,
    521		.hd_shift = MOD_DAI_HD_SFT,
    522		.agent_disable_reg = -1,
    523		.msb_reg = -1,
    524	},
    525};
    526
    527static const struct mtk_base_irq_data irq_data[MT6797_IRQ_NUM] = {
    528	[MT6797_IRQ_1] = {
    529		.id = MT6797_IRQ_1,
    530		.irq_cnt_reg = AFE_IRQ_MCU_CNT1,
    531		.irq_cnt_shift = AFE_IRQ_MCU_CNT1_SFT,
    532		.irq_cnt_maskbit = AFE_IRQ_MCU_CNT1_MASK,
    533		.irq_fs_reg = AFE_IRQ_MCU_CON,
    534		.irq_fs_shift = IRQ1_MCU_MODE_SFT,
    535		.irq_fs_maskbit = IRQ1_MCU_MODE_MASK,
    536		.irq_en_reg = AFE_IRQ_MCU_CON,
    537		.irq_en_shift = IRQ1_MCU_ON_SFT,
    538		.irq_clr_reg = AFE_IRQ_MCU_CLR,
    539		.irq_clr_shift = IRQ1_MCU_CLR_SFT,
    540	},
    541	[MT6797_IRQ_2] = {
    542		.id = MT6797_IRQ_2,
    543		.irq_cnt_reg = AFE_IRQ_MCU_CNT2,
    544		.irq_cnt_shift = AFE_IRQ_MCU_CNT2_SFT,
    545		.irq_cnt_maskbit = AFE_IRQ_MCU_CNT2_MASK,
    546		.irq_fs_reg = AFE_IRQ_MCU_CON,
    547		.irq_fs_shift = IRQ2_MCU_MODE_SFT,
    548		.irq_fs_maskbit = IRQ2_MCU_MODE_MASK,
    549		.irq_en_reg = AFE_IRQ_MCU_CON,
    550		.irq_en_shift = IRQ2_MCU_ON_SFT,
    551		.irq_clr_reg = AFE_IRQ_MCU_CLR,
    552		.irq_clr_shift = IRQ2_MCU_CLR_SFT,
    553	},
    554	[MT6797_IRQ_3] = {
    555		.id = MT6797_IRQ_3,
    556		.irq_cnt_reg = AFE_IRQ_MCU_CNT3,
    557		.irq_cnt_shift = AFE_IRQ_MCU_CNT3_SFT,
    558		.irq_cnt_maskbit = AFE_IRQ_MCU_CNT3_MASK,
    559		.irq_fs_reg = AFE_IRQ_MCU_CON,
    560		.irq_fs_shift = IRQ3_MCU_MODE_SFT,
    561		.irq_fs_maskbit = IRQ3_MCU_MODE_MASK,
    562		.irq_en_reg = AFE_IRQ_MCU_CON,
    563		.irq_en_shift = IRQ3_MCU_ON_SFT,
    564		.irq_clr_reg = AFE_IRQ_MCU_CLR,
    565		.irq_clr_shift = IRQ3_MCU_CLR_SFT,
    566	},
    567	[MT6797_IRQ_4] = {
    568		.id = MT6797_IRQ_4,
    569		.irq_cnt_reg = AFE_IRQ_MCU_CNT4,
    570		.irq_cnt_shift = AFE_IRQ_MCU_CNT4_SFT,
    571		.irq_cnt_maskbit = AFE_IRQ_MCU_CNT4_MASK,
    572		.irq_fs_reg = AFE_IRQ_MCU_CON,
    573		.irq_fs_shift = IRQ4_MCU_MODE_SFT,
    574		.irq_fs_maskbit = IRQ4_MCU_MODE_MASK,
    575		.irq_en_reg = AFE_IRQ_MCU_CON,
    576		.irq_en_shift = IRQ4_MCU_ON_SFT,
    577		.irq_clr_reg = AFE_IRQ_MCU_CLR,
    578		.irq_clr_shift = IRQ4_MCU_CLR_SFT,
    579	},
    580	[MT6797_IRQ_7] = {
    581		.id = MT6797_IRQ_7,
    582		.irq_cnt_reg = AFE_IRQ_MCU_CNT7,
    583		.irq_cnt_shift = AFE_IRQ_MCU_CNT7_SFT,
    584		.irq_cnt_maskbit = AFE_IRQ_MCU_CNT7_MASK,
    585		.irq_fs_reg = AFE_IRQ_MCU_CON,
    586		.irq_fs_shift = IRQ7_MCU_MODE_SFT,
    587		.irq_fs_maskbit = IRQ7_MCU_MODE_MASK,
    588		.irq_en_reg = AFE_IRQ_MCU_CON,
    589		.irq_en_shift = IRQ7_MCU_ON_SFT,
    590		.irq_clr_reg = AFE_IRQ_MCU_CLR,
    591		.irq_clr_shift = IRQ7_MCU_CLR_SFT,
    592	},
    593};
    594
    595static const struct regmap_config mt6797_afe_regmap_config = {
    596	.reg_bits = 32,
    597	.reg_stride = 4,
    598	.val_bits = 32,
    599	.max_register = AFE_MAX_REGISTER,
    600};
    601
    602static irqreturn_t mt6797_afe_irq_handler(int irq_id, void *dev)
    603{
    604	struct mtk_base_afe *afe = dev;
    605	struct mtk_base_afe_irq *irq;
    606	unsigned int status;
    607	unsigned int mcu_en;
    608	int ret;
    609	int i;
    610	irqreturn_t irq_ret = IRQ_HANDLED;
    611
    612	/* get irq that is sent to MCU */
    613	regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_en);
    614
    615	ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &status);
    616	if (ret || (status & mcu_en) == 0) {
    617		dev_err(afe->dev, "%s(), irq status err, ret %d, status 0x%x, mcu_en 0x%x\n",
    618			__func__, ret, status, mcu_en);
    619
    620		/* only clear IRQ which is sent to MCU */
    621		status = mcu_en & AFE_IRQ_STATUS_BITS;
    622
    623		irq_ret = IRQ_NONE;
    624		goto err_irq;
    625	}
    626
    627	for (i = 0; i < MT6797_MEMIF_NUM; i++) {
    628		struct mtk_base_afe_memif *memif = &afe->memif[i];
    629
    630		if (!memif->substream)
    631			continue;
    632
    633		irq = &afe->irqs[memif->irq_usage];
    634
    635		if (status & (1 << irq->irq_data->irq_en_shift))
    636			snd_pcm_period_elapsed(memif->substream);
    637	}
    638
    639err_irq:
    640	/* clear irq */
    641	regmap_write(afe->regmap,
    642		     AFE_IRQ_MCU_CLR,
    643		     status & AFE_IRQ_STATUS_BITS);
    644
    645	return irq_ret;
    646}
    647
    648static int mt6797_afe_runtime_suspend(struct device *dev)
    649{
    650	struct mtk_base_afe *afe = dev_get_drvdata(dev);
    651	unsigned int afe_on_retm;
    652	int retry = 0;
    653
    654	/* disable AFE */
    655	regmap_update_bits(afe->regmap, AFE_DAC_CON0, AFE_ON_MASK_SFT, 0x0);
    656	do {
    657		regmap_read(afe->regmap, AFE_DAC_CON0, &afe_on_retm);
    658		if ((afe_on_retm & AFE_ON_RETM_MASK_SFT) == 0)
    659			break;
    660
    661		udelay(10);
    662	} while (++retry < 100000);
    663
    664	if (retry)
    665		dev_warn(afe->dev, "%s(), retry %d\n", __func__, retry);
    666
    667	/* make sure all irq status are cleared */
    668	regmap_update_bits(afe->regmap, AFE_IRQ_MCU_CLR, 0xffff, 0xffff);
    669
    670	return mt6797_afe_disable_clock(afe);
    671}
    672
    673static int mt6797_afe_runtime_resume(struct device *dev)
    674{
    675	struct mtk_base_afe *afe = dev_get_drvdata(dev);
    676	int ret;
    677
    678	ret = mt6797_afe_enable_clock(afe);
    679	if (ret)
    680		return ret;
    681
    682	/* irq signal to mcu only */
    683	regmap_write(afe->regmap, AFE_IRQ_MCU_EN, AFE_IRQ_MCU_EN_MASK_SFT);
    684
    685	/* force all memif use normal mode */
    686	regmap_update_bits(afe->regmap, AFE_MEMIF_HDALIGN,
    687			   0x7ff << 16, 0x7ff << 16);
    688	/* force cpu use normal mode when access sram data */
    689	regmap_update_bits(afe->regmap, AFE_MEMIF_MSB,
    690			   CPU_COMPACT_MODE_MASK_SFT, 0);
    691	/* force cpu use 8_24 format when writing 32bit data */
    692	regmap_update_bits(afe->regmap, AFE_MEMIF_MSB,
    693			   CPU_HD_ALIGN_MASK_SFT, 0);
    694
    695	/* set all output port to 24bit */
    696	regmap_update_bits(afe->regmap, AFE_CONN_24BIT,
    697			   0x3fffffff, 0x3fffffff);
    698
    699	/* enable AFE */
    700	regmap_update_bits(afe->regmap, AFE_DAC_CON0,
    701			   AFE_ON_MASK_SFT,
    702			   0x1 << AFE_ON_SFT);
    703
    704	return 0;
    705}
    706
    707static int mt6797_afe_component_probe(struct snd_soc_component *component)
    708{
    709	return mtk_afe_add_sub_dai_control(component);
    710}
    711
    712static const struct snd_soc_component_driver mt6797_afe_component = {
    713	.name		= AFE_PCM_NAME,
    714	.probe		= mt6797_afe_component_probe,
    715	.pointer	= mtk_afe_pcm_pointer,
    716	.pcm_construct	= mtk_afe_pcm_new,
    717};
    718
    719static int mt6797_dai_memif_register(struct mtk_base_afe *afe)
    720{
    721	struct mtk_base_afe_dai *dai;
    722
    723	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
    724	if (!dai)
    725		return -ENOMEM;
    726
    727	list_add(&dai->list, &afe->sub_dais);
    728
    729	dai->dai_drivers = mt6797_memif_dai_driver;
    730	dai->num_dai_drivers = ARRAY_SIZE(mt6797_memif_dai_driver);
    731
    732	dai->dapm_widgets = mt6797_memif_widgets;
    733	dai->num_dapm_widgets = ARRAY_SIZE(mt6797_memif_widgets);
    734	dai->dapm_routes = mt6797_memif_routes;
    735	dai->num_dapm_routes = ARRAY_SIZE(mt6797_memif_routes);
    736	return 0;
    737}
    738
    739typedef int (*dai_register_cb)(struct mtk_base_afe *);
    740static const dai_register_cb dai_register_cbs[] = {
    741	mt6797_dai_adda_register,
    742	mt6797_dai_pcm_register,
    743	mt6797_dai_hostless_register,
    744	mt6797_dai_memif_register,
    745};
    746
    747static int mt6797_afe_pcm_dev_probe(struct platform_device *pdev)
    748{
    749	struct mtk_base_afe *afe;
    750	struct mt6797_afe_private *afe_priv;
    751	struct device *dev;
    752	int i, irq_id, ret;
    753
    754	afe = devm_kzalloc(&pdev->dev, sizeof(*afe), GFP_KERNEL);
    755	if (!afe)
    756		return -ENOMEM;
    757
    758	afe->platform_priv = devm_kzalloc(&pdev->dev, sizeof(*afe_priv),
    759					  GFP_KERNEL);
    760	if (!afe->platform_priv)
    761		return -ENOMEM;
    762
    763	afe_priv = afe->platform_priv;
    764	afe->dev = &pdev->dev;
    765	dev = afe->dev;
    766
    767	/* initial audio related clock */
    768	ret = mt6797_init_clock(afe);
    769	if (ret) {
    770		dev_err(dev, "init clock error\n");
    771		return ret;
    772	}
    773
    774	/* regmap init */
    775	afe->base_addr = devm_platform_ioremap_resource(pdev, 0);
    776	if (IS_ERR(afe->base_addr))
    777		return PTR_ERR(afe->base_addr);
    778
    779	afe->regmap = devm_regmap_init_mmio(&pdev->dev, afe->base_addr,
    780					    &mt6797_afe_regmap_config);
    781	if (IS_ERR(afe->regmap))
    782		return PTR_ERR(afe->regmap);
    783
    784	/* init memif */
    785	afe->memif_size = MT6797_MEMIF_NUM;
    786	afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),
    787				  GFP_KERNEL);
    788	if (!afe->memif)
    789		return -ENOMEM;
    790
    791	for (i = 0; i < afe->memif_size; i++) {
    792		afe->memif[i].data = &memif_data[i];
    793		afe->memif[i].irq_usage = -1;
    794	}
    795
    796	mutex_init(&afe->irq_alloc_lock);
    797
    798	/* irq initialize */
    799	afe->irqs_size = MT6797_IRQ_NUM;
    800	afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),
    801				 GFP_KERNEL);
    802	if (!afe->irqs)
    803		return -ENOMEM;
    804
    805	for (i = 0; i < afe->irqs_size; i++)
    806		afe->irqs[i].irq_data = &irq_data[i];
    807
    808	/* request irq */
    809	irq_id = platform_get_irq(pdev, 0);
    810	if (irq_id < 0)
    811		return irq_id;
    812
    813	ret = devm_request_irq(dev, irq_id, mt6797_afe_irq_handler,
    814			       IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);
    815	if (ret) {
    816		dev_err(dev, "could not request_irq for asys-isr\n");
    817		return ret;
    818	}
    819
    820	/* init sub_dais */
    821	INIT_LIST_HEAD(&afe->sub_dais);
    822
    823	for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {
    824		ret = dai_register_cbs[i](afe);
    825		if (ret) {
    826			dev_warn(afe->dev, "dai register i %d fail, ret %d\n",
    827				 i, ret);
    828			return ret;
    829		}
    830	}
    831
    832	/* init dai_driver and component_driver */
    833	ret = mtk_afe_combine_sub_dai(afe);
    834	if (ret) {
    835		dev_warn(afe->dev, "mtk_afe_combine_sub_dai fail, ret %d\n",
    836			 ret);
    837		return ret;
    838	}
    839
    840	afe->mtk_afe_hardware = &mt6797_afe_hardware;
    841	afe->memif_fs = mt6797_memif_fs;
    842	afe->irq_fs = mt6797_irq_fs;
    843
    844	afe->runtime_resume = mt6797_afe_runtime_resume;
    845	afe->runtime_suspend = mt6797_afe_runtime_suspend;
    846
    847	platform_set_drvdata(pdev, afe);
    848
    849	pm_runtime_enable(dev);
    850	if (!pm_runtime_enabled(dev))
    851		goto err_pm_disable;
    852	pm_runtime_get_sync(&pdev->dev);
    853
    854	/* register component */
    855	ret = devm_snd_soc_register_component(dev, &mt6797_afe_component,
    856					      NULL, 0);
    857	if (ret) {
    858		dev_warn(dev, "err_platform\n");
    859		goto err_pm_disable;
    860	}
    861
    862	ret = devm_snd_soc_register_component(afe->dev,
    863				     &mt6797_afe_pcm_dai_component,
    864				     afe->dai_drivers,
    865				     afe->num_dai_drivers);
    866	if (ret) {
    867		dev_warn(dev, "err_dai_component\n");
    868		goto err_pm_disable;
    869	}
    870
    871	return 0;
    872
    873err_pm_disable:
    874	pm_runtime_disable(dev);
    875
    876	return ret;
    877}
    878
    879static int mt6797_afe_pcm_dev_remove(struct platform_device *pdev)
    880{
    881	pm_runtime_disable(&pdev->dev);
    882	if (!pm_runtime_status_suspended(&pdev->dev))
    883		mt6797_afe_runtime_suspend(&pdev->dev);
    884	pm_runtime_put_sync(&pdev->dev);
    885
    886	return 0;
    887}
    888
    889static const struct of_device_id mt6797_afe_pcm_dt_match[] = {
    890	{ .compatible = "mediatek,mt6797-audio", },
    891	{},
    892};
    893MODULE_DEVICE_TABLE(of, mt6797_afe_pcm_dt_match);
    894
    895static const struct dev_pm_ops mt6797_afe_pm_ops = {
    896	SET_RUNTIME_PM_OPS(mt6797_afe_runtime_suspend,
    897			   mt6797_afe_runtime_resume, NULL)
    898};
    899
    900static struct platform_driver mt6797_afe_pcm_driver = {
    901	.driver = {
    902		   .name = "mt6797-audio",
    903		   .of_match_table = mt6797_afe_pcm_dt_match,
    904		   .pm = &mt6797_afe_pm_ops,
    905	},
    906	.probe = mt6797_afe_pcm_dev_probe,
    907	.remove = mt6797_afe_pcm_dev_remove,
    908};
    909
    910module_platform_driver(mt6797_afe_pcm_driver);
    911
    912MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 6797");
    913MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
    914MODULE_LICENSE("GPL v2");