Path: blob/master/sound/soc/mediatek/mt8192/mt8192-afe-pcm.c
26488 views
// SPDX-License-Identifier: GPL-2.01//2// Mediatek ALSA SoC AFE platform driver for 81923//4// Copyright (c) 2020 MediaTek Inc.5// Author: Shane Chien <[email protected]>6//78#include <linux/delay.h>9#include <linux/dma-mapping.h>10#include <linux/module.h>11#include <linux/mfd/syscon.h>12#include <linux/of.h>13#include <linux/of_address.h>14#include <linux/of_reserved_mem.h>15#include <linux/pm_runtime.h>16#include <linux/reset.h>17#include <sound/soc.h>1819#include "../common/mtk-afe-fe-dai.h"20#include "../common/mtk-afe-platform-driver.h"2122#include "mt8192-afe-common.h"23#include "mt8192-afe-clk.h"24#include "mt8192-afe-gpio.h"25#include "mt8192-interconnection.h"2627static const struct snd_pcm_hardware mt8192_afe_hardware = {28.info = (SNDRV_PCM_INFO_MMAP |29SNDRV_PCM_INFO_INTERLEAVED |30SNDRV_PCM_INFO_MMAP_VALID),31.formats = (SNDRV_PCM_FMTBIT_S16_LE |32SNDRV_PCM_FMTBIT_S24_LE |33SNDRV_PCM_FMTBIT_S32_LE),34.period_bytes_min = 96,35.period_bytes_max = 4 * 48 * 1024,36.periods_min = 2,37.periods_max = 256,38.buffer_bytes_max = 4 * 48 * 1024,39.fifo_size = 0,40};4142static int mt8192_memif_fs(struct snd_pcm_substream *substream,43unsigned int rate)44{45struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);46struct snd_soc_component *component =47snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);48struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);49int id = snd_soc_rtd_to_cpu(rtd, 0)->id;5051return mt8192_rate_transform(afe->dev, rate, id);52}5354static int mt8192_get_dai_fs(struct mtk_base_afe *afe,55int dai_id, unsigned int rate)56{57return mt8192_rate_transform(afe->dev, rate, dai_id);58}5960static int mt8192_irq_fs(struct snd_pcm_substream *substream, unsigned int rate)61{62struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);63struct snd_soc_component *component =64snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);65struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);6667return mt8192_general_rate_transform(afe->dev, rate);68}6970static int mt8192_get_memif_pbuf_size(struct snd_pcm_substream *substream)71{72struct snd_pcm_runtime *runtime = substream->runtime;7374if ((runtime->period_size * 1000) / runtime->rate > 10)75return MT8192_MEMIF_PBUF_SIZE_256_BYTES;76else77return MT8192_MEMIF_PBUF_SIZE_32_BYTES;78}7980#define MTK_PCM_RATES (SNDRV_PCM_RATE_8000_48000 |\81SNDRV_PCM_RATE_88200 |\82SNDRV_PCM_RATE_96000 |\83SNDRV_PCM_RATE_176400 |\84SNDRV_PCM_RATE_192000)8586#define MTK_PCM_DAI_RATES (SNDRV_PCM_RATE_8000 |\87SNDRV_PCM_RATE_16000 |\88SNDRV_PCM_RATE_32000 |\89SNDRV_PCM_RATE_48000)9091#define MTK_PCM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\92SNDRV_PCM_FMTBIT_S24_LE |\93SNDRV_PCM_FMTBIT_S32_LE)9495static struct snd_soc_dai_driver mt8192_memif_dai_driver[] = {96/* FE DAIs: memory intefaces to CPU */97{98.name = "DL1",99.id = MT8192_MEMIF_DL1,100.playback = {101.stream_name = "DL1",102.channels_min = 1,103.channels_max = 2,104.rates = MTK_PCM_RATES,105.formats = MTK_PCM_FORMATS,106},107.ops = &mtk_afe_fe_ops,108},109{110.name = "DL12",111.id = MT8192_MEMIF_DL12,112.playback = {113.stream_name = "DL12",114.channels_min = 1,115.channels_max = 2,116.rates = MTK_PCM_RATES,117.formats = MTK_PCM_FORMATS,118},119.ops = &mtk_afe_fe_ops,120},121{122.name = "DL2",123.id = MT8192_MEMIF_DL2,124.playback = {125.stream_name = "DL2",126.channels_min = 1,127.channels_max = 2,128.rates = MTK_PCM_RATES,129.formats = MTK_PCM_FORMATS,130},131.ops = &mtk_afe_fe_ops,132},133{134.name = "DL3",135.id = MT8192_MEMIF_DL3,136.playback = {137.stream_name = "DL3",138.channels_min = 1,139.channels_max = 2,140.rates = MTK_PCM_RATES,141.formats = MTK_PCM_FORMATS,142},143.ops = &mtk_afe_fe_ops,144},145{146.name = "DL4",147.id = MT8192_MEMIF_DL4,148.playback = {149.stream_name = "DL4",150.channels_min = 1,151.channels_max = 2,152.rates = MTK_PCM_RATES,153.formats = MTK_PCM_FORMATS,154},155.ops = &mtk_afe_fe_ops,156},157{158.name = "DL5",159.id = MT8192_MEMIF_DL5,160.playback = {161.stream_name = "DL5",162.channels_min = 1,163.channels_max = 2,164.rates = MTK_PCM_RATES,165.formats = MTK_PCM_FORMATS,166},167.ops = &mtk_afe_fe_ops,168},169{170.name = "DL6",171.id = MT8192_MEMIF_DL6,172.playback = {173.stream_name = "DL6",174.channels_min = 1,175.channels_max = 2,176.rates = MTK_PCM_RATES,177.formats = MTK_PCM_FORMATS,178},179.ops = &mtk_afe_fe_ops,180},181{182.name = "DL7",183.id = MT8192_MEMIF_DL7,184.playback = {185.stream_name = "DL7",186.channels_min = 1,187.channels_max = 2,188.rates = MTK_PCM_RATES,189.formats = MTK_PCM_FORMATS,190},191.ops = &mtk_afe_fe_ops,192},193{194.name = "DL8",195.id = MT8192_MEMIF_DL8,196.playback = {197.stream_name = "DL8",198.channels_min = 1,199.channels_max = 2,200.rates = MTK_PCM_RATES,201.formats = MTK_PCM_FORMATS,202},203.ops = &mtk_afe_fe_ops,204},205{206.name = "DL9",207.id = MT8192_MEMIF_DL9,208.playback = {209.stream_name = "DL9",210.channels_min = 1,211.channels_max = 2,212.rates = MTK_PCM_RATES,213.formats = MTK_PCM_FORMATS,214},215.ops = &mtk_afe_fe_ops,216},217{218.name = "UL1",219.id = MT8192_MEMIF_VUL12,220.capture = {221.stream_name = "UL1",222.channels_min = 1,223.channels_max = 4,224.rates = MTK_PCM_RATES,225.formats = MTK_PCM_FORMATS,226},227.ops = &mtk_afe_fe_ops,228},229{230.name = "UL2",231.id = MT8192_MEMIF_AWB,232.capture = {233.stream_name = "UL2",234.channels_min = 1,235.channels_max = 2,236.rates = MTK_PCM_RATES,237.formats = MTK_PCM_FORMATS,238},239.ops = &mtk_afe_fe_ops,240},241{242.name = "UL3",243.id = MT8192_MEMIF_VUL2,244.capture = {245.stream_name = "UL3",246.channels_min = 1,247.channels_max = 2,248.rates = MTK_PCM_RATES,249.formats = MTK_PCM_FORMATS,250},251.ops = &mtk_afe_fe_ops,252},253{254.name = "UL4",255.id = MT8192_MEMIF_AWB2,256.capture = {257.stream_name = "UL4",258.channels_min = 1,259.channels_max = 2,260.rates = MTK_PCM_RATES,261.formats = MTK_PCM_FORMATS,262},263.ops = &mtk_afe_fe_ops,264},265{266.name = "UL5",267.id = MT8192_MEMIF_VUL3,268.capture = {269.stream_name = "UL5",270.channels_min = 1,271.channels_max = 2,272.rates = MTK_PCM_RATES,273.formats = MTK_PCM_FORMATS,274},275.ops = &mtk_afe_fe_ops,276},277{278.name = "UL6",279.id = MT8192_MEMIF_VUL4,280.capture = {281.stream_name = "UL6",282.channels_min = 1,283.channels_max = 2,284.rates = MTK_PCM_RATES,285.formats = MTK_PCM_FORMATS,286},287.ops = &mtk_afe_fe_ops,288},289{290.name = "UL7",291.id = MT8192_MEMIF_VUL5,292.capture = {293.stream_name = "UL7",294.channels_min = 1,295.channels_max = 2,296.rates = MTK_PCM_RATES,297.formats = MTK_PCM_FORMATS,298},299.ops = &mtk_afe_fe_ops,300},301{302.name = "UL8",303.id = MT8192_MEMIF_VUL6,304.capture = {305.stream_name = "UL8",306.channels_min = 1,307.channels_max = 2,308.rates = MTK_PCM_RATES,309.formats = MTK_PCM_FORMATS,310},311.ops = &mtk_afe_fe_ops,312},313{314.name = "UL_MONO_1",315.id = MT8192_MEMIF_MOD_DAI,316.capture = {317.stream_name = "UL_MONO_1",318.channels_min = 1,319.channels_max = 2,320.rates = MTK_PCM_DAI_RATES,321.formats = MTK_PCM_FORMATS,322},323.ops = &mtk_afe_fe_ops,324},325{326.name = "UL_MONO_2",327.id = MT8192_MEMIF_DAI,328.capture = {329.stream_name = "UL_MONO_2",330.channels_min = 1,331.channels_max = 2,332.rates = MTK_PCM_DAI_RATES,333.formats = MTK_PCM_FORMATS,334},335.ops = &mtk_afe_fe_ops,336},337{338.name = "UL_MONO_3",339.id = MT8192_MEMIF_DAI2,340.capture = {341.stream_name = "UL_MONO_3",342.channels_min = 1,343.channels_max = 2,344.rates = MTK_PCM_DAI_RATES,345.formats = MTK_PCM_FORMATS,346},347.ops = &mtk_afe_fe_ops,348},349{350.name = "HDMI",351.id = MT8192_MEMIF_HDMI,352.playback = {353.stream_name = "HDMI",354.channels_min = 2,355.channels_max = 8,356.rates = MTK_PCM_RATES,357.formats = MTK_PCM_FORMATS,358},359.ops = &mtk_afe_fe_ops,360},361};362363static int ul_tinyconn_event(struct snd_soc_dapm_widget *w,364struct snd_kcontrol *kcontrol,365int event)366{367struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);368struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);369unsigned int reg_shift;370unsigned int reg_mask_shift;371372dev_dbg(afe->dev, "%s(), event 0x%x\n", __func__, event);373374if (strstr(w->name, "UL1")) {375reg_shift = VUL1_USE_TINY_SFT;376reg_mask_shift = VUL1_USE_TINY_MASK_SFT;377} else if (strstr(w->name, "UL2")) {378reg_shift = VUL2_USE_TINY_SFT;379reg_mask_shift = VUL2_USE_TINY_MASK_SFT;380} else if (strstr(w->name, "UL3")) {381reg_shift = VUL12_USE_TINY_SFT;382reg_mask_shift = VUL12_USE_TINY_MASK_SFT;383} else if (strstr(w->name, "UL4")) {384reg_shift = AWB2_USE_TINY_SFT;385reg_mask_shift = AWB2_USE_TINY_MASK_SFT;386} else {387reg_shift = AWB2_USE_TINY_SFT;388reg_mask_shift = AWB2_USE_TINY_MASK_SFT;389dev_warn(afe->dev, "%s(), err widget name %s, default use UL4",390__func__, w->name);391}392393switch (event) {394case SND_SOC_DAPM_PRE_PMU:395regmap_update_bits(afe->regmap, AFE_MEMIF_CONN, reg_mask_shift,3960x1 << reg_shift);397break;398case SND_SOC_DAPM_PRE_PMD:399regmap_update_bits(afe->regmap, AFE_MEMIF_CONN, reg_mask_shift,4000x0 << reg_shift);401break;402default:403break;404}405406return 0;407}408409/* dma widget & routes*/410static const struct snd_kcontrol_new memif_ul1_ch1_mix[] = {411SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN21,412I_ADDA_UL_CH1, 1, 0),413SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN21,414I_ADDA_UL_CH2, 1, 0),415SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN21,416I_ADDA_UL_CH3, 1, 0),417};418419static const struct snd_kcontrol_new memif_ul1_ch2_mix[] = {420SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN22,421I_ADDA_UL_CH1, 1, 0),422SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN22,423I_ADDA_UL_CH2, 1, 0),424SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN22,425I_ADDA_UL_CH3, 1, 0),426SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN22,427I_ADDA_UL_CH4, 1, 0),428};429430static const struct snd_kcontrol_new memif_ul1_ch3_mix[] = {431SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN9,432I_ADDA_UL_CH1, 1, 0),433SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN9,434I_ADDA_UL_CH2, 1, 0),435SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN9,436I_ADDA_UL_CH3, 1, 0),437};438439static const struct snd_kcontrol_new memif_ul1_ch4_mix[] = {440SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN10,441I_ADDA_UL_CH1, 1, 0),442SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN10,443I_ADDA_UL_CH2, 1, 0),444SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN10,445I_ADDA_UL_CH3, 1, 0),446SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH4", AFE_CONN10,447I_ADDA_UL_CH4, 1, 0),448};449450static const struct snd_kcontrol_new memif_ul2_ch1_mix[] = {451SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1", AFE_CONN5,452I_I2S0_CH1, 1, 0),453SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN5,454I_DL1_CH1, 1, 0),455SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN5,456I_DL12_CH1, 1, 0),457SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN5,458I_DL2_CH1, 1, 0),459SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN5,460I_DL3_CH1, 1, 0),461SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN5_1,462I_DL4_CH1, 1, 0),463SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN5_1,464I_DL5_CH1, 1, 0),465SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN5_1,466I_DL6_CH1, 1, 0),467SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN5,468I_PCM_1_CAP_CH1, 1, 0),469SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN5,470I_PCM_2_CAP_CH1, 1, 0),471SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH1", AFE_CONN5,472I_I2S2_CH1, 1, 0),473SOC_DAPM_SINGLE_AUTODISABLE("I2S6_CH1", AFE_CONN5_1,474I_I2S6_CH1, 1, 0),475SOC_DAPM_SINGLE_AUTODISABLE("I2S8_CH1", AFE_CONN5_1,476I_I2S8_CH1, 1, 0),477SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1", AFE_CONN5_1,478I_CONNSYS_I2S_CH1, 1, 0),479SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1", AFE_CONN5_1,480I_SRC_1_OUT_CH1, 1, 0),481};482483static const struct snd_kcontrol_new memif_ul2_ch2_mix[] = {484SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2", AFE_CONN6,485I_I2S0_CH2, 1, 0),486SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN6,487I_DL1_CH2, 1, 0),488SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN6,489I_DL12_CH2, 1, 0),490SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN6,491I_DL2_CH2, 1, 0),492SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN6,493I_DL3_CH2, 1, 0),494SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN6_1,495I_DL4_CH2, 1, 0),496SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN6_1,497I_DL5_CH2, 1, 0),498SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN6_1,499I_DL6_CH2, 1, 0),500SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN6,501I_PCM_1_CAP_CH1, 1, 0),502SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN6,503I_PCM_2_CAP_CH1, 1, 0),504SOC_DAPM_SINGLE_AUTODISABLE("I2S2_CH2", AFE_CONN6,505I_I2S2_CH2, 1, 0),506SOC_DAPM_SINGLE_AUTODISABLE("I2S6_CH2", AFE_CONN6_1,507I_I2S6_CH2, 1, 0),508SOC_DAPM_SINGLE_AUTODISABLE("I2S8_CH2", AFE_CONN6_1,509I_I2S8_CH2, 1, 0),510SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2", AFE_CONN6_1,511I_CONNSYS_I2S_CH2, 1, 0),512SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2", AFE_CONN6_1,513I_SRC_1_OUT_CH2, 1, 0),514};515516static const struct snd_kcontrol_new memif_ul3_ch1_mix[] = {517SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1", AFE_CONN32_1,518I_CONNSYS_I2S_CH1, 1, 0),519SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN32,520I_DL1_CH1, 1, 0),521SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN32,522I_DL2_CH1, 1, 0),523};524525static const struct snd_kcontrol_new memif_ul3_ch2_mix[] = {526SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2", AFE_CONN33_1,527I_CONNSYS_I2S_CH2, 1, 0),528};529530static const struct snd_kcontrol_new memif_ul4_ch1_mix[] = {531SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN38,532I_ADDA_UL_CH1, 1, 0),533SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH1", AFE_CONN38,534I_I2S0_CH1, 1, 0),535};536537static const struct snd_kcontrol_new memif_ul4_ch2_mix[] = {538SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN39,539I_ADDA_UL_CH2, 1, 0),540SOC_DAPM_SINGLE_AUTODISABLE("I2S0_CH2", AFE_CONN39,541I_I2S0_CH2, 1, 0),542};543544static const struct snd_kcontrol_new memif_ul5_ch1_mix[] = {545SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN44,546I_ADDA_UL_CH1, 1, 0),547};548549static const struct snd_kcontrol_new memif_ul5_ch2_mix[] = {550SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN45,551I_ADDA_UL_CH2, 1, 0),552};553554static const struct snd_kcontrol_new memif_ul6_ch1_mix[] = {555SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN46,556I_ADDA_UL_CH1, 1, 0),557SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN46,558I_DL1_CH1, 1, 0),559SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN46,560I_DL12_CH1, 1, 0),561SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN46_1,562I_DL6_CH1, 1, 0),563SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN46,564I_DL2_CH1, 1, 0),565SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN46,566I_DL3_CH1, 1, 0),567SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN46_1,568I_DL4_CH1, 1, 0),569SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN46,570I_PCM_1_CAP_CH1, 1, 0),571SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN46,572I_PCM_2_CAP_CH1, 1, 0),573};574575static const struct snd_kcontrol_new memif_ul6_ch2_mix[] = {576SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN47,577I_ADDA_UL_CH2, 1, 0),578SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN47,579I_DL1_CH2, 1, 0),580SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN47,581I_DL12_CH2, 1, 0),582SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN47_1,583I_DL6_CH2, 1, 0),584SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN47,585I_DL2_CH2, 1, 0),586SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN47,587I_DL3_CH2, 1, 0),588SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN47_1,589I_DL4_CH2, 1, 0),590SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN47,591I_PCM_1_CAP_CH1, 1, 0),592SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN47,593I_PCM_2_CAP_CH1, 1, 0),594};595596static const struct snd_kcontrol_new memif_ul7_ch1_mix[] = {597SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN48,598I_ADDA_UL_CH1, 1, 0),599};600601static const struct snd_kcontrol_new memif_ul7_ch2_mix[] = {602SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN49,603I_ADDA_UL_CH2, 1, 0),604};605606static const struct snd_kcontrol_new memif_ul8_ch1_mix[] = {607SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN50,608I_ADDA_UL_CH1, 1, 0),609};610611static const struct snd_kcontrol_new memif_ul8_ch2_mix[] = {612SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN51,613I_ADDA_UL_CH2, 1, 0),614};615616static const struct snd_kcontrol_new memif_ul_mono_1_mix[] = {617SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN12,618I_PCM_1_CAP_CH1, 1, 0),619SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN12,620I_PCM_2_CAP_CH1, 1, 0),621};622623static const struct snd_kcontrol_new memif_ul_mono_2_mix[] = {624SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN11,625I_ADDA_UL_CH1, 1, 0),626};627628static const struct snd_kcontrol_new memif_ul_mono_3_mix[] = {629SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN35,630I_ADDA_UL_CH1, 1, 0),631};632633/* TINYCONN MUX */634enum {635TINYCONN_CH1_MUX_I2S0 = 0x14,636TINYCONN_CH2_MUX_I2S0 = 0x15,637TINYCONN_CH1_MUX_I2S6 = 0x1a,638TINYCONN_CH2_MUX_I2S6 = 0x1b,639TINYCONN_CH1_MUX_I2S8 = 0x1c,640TINYCONN_CH2_MUX_I2S8 = 0x1d,641TINYCONN_MUX_NONE = 0x1f,642};643644static const char * const tinyconn_mux_map[] = {645"NONE",646"I2S0_CH1",647"I2S0_CH2",648"I2S6_CH1",649"I2S6_CH2",650"I2S8_CH1",651"I2S8_CH2",652};653654static int tinyconn_mux_map_value[] = {655TINYCONN_MUX_NONE,656TINYCONN_CH1_MUX_I2S0,657TINYCONN_CH2_MUX_I2S0,658TINYCONN_CH1_MUX_I2S6,659TINYCONN_CH2_MUX_I2S6,660TINYCONN_CH1_MUX_I2S8,661TINYCONN_CH2_MUX_I2S8,662};663664static SOC_VALUE_ENUM_SINGLE_DECL(ul4_tinyconn_ch1_mux_map_enum,665AFE_TINY_CONN0,666O_2_CFG_SFT,667O_2_CFG_MASK,668tinyconn_mux_map,669tinyconn_mux_map_value);670static SOC_VALUE_ENUM_SINGLE_DECL(ul4_tinyconn_ch2_mux_map_enum,671AFE_TINY_CONN0,672O_3_CFG_SFT,673O_3_CFG_MASK,674tinyconn_mux_map,675tinyconn_mux_map_value);676677static const struct snd_kcontrol_new ul4_tinyconn_ch1_mux_control =678SOC_DAPM_ENUM("UL4_TINYCONN_CH1_MUX", ul4_tinyconn_ch1_mux_map_enum);679static const struct snd_kcontrol_new ul4_tinyconn_ch2_mux_control =680SOC_DAPM_ENUM("UL4_TINYCONN_CH2_MUX", ul4_tinyconn_ch2_mux_map_enum);681682static const struct snd_soc_dapm_widget mt8192_memif_widgets[] = {683/* inter-connections */684SND_SOC_DAPM_MIXER("UL1_CH1", SND_SOC_NOPM, 0, 0,685memif_ul1_ch1_mix, ARRAY_SIZE(memif_ul1_ch1_mix)),686SND_SOC_DAPM_MIXER("UL1_CH2", SND_SOC_NOPM, 0, 0,687memif_ul1_ch2_mix, ARRAY_SIZE(memif_ul1_ch2_mix)),688SND_SOC_DAPM_MIXER("UL1_CH3", SND_SOC_NOPM, 0, 0,689memif_ul1_ch3_mix, ARRAY_SIZE(memif_ul1_ch3_mix)),690SND_SOC_DAPM_MIXER("UL1_CH4", SND_SOC_NOPM, 0, 0,691memif_ul1_ch4_mix, ARRAY_SIZE(memif_ul1_ch4_mix)),692693SND_SOC_DAPM_MIXER("UL2_CH1", SND_SOC_NOPM, 0, 0,694memif_ul2_ch1_mix, ARRAY_SIZE(memif_ul2_ch1_mix)),695SND_SOC_DAPM_MIXER("UL2_CH2", SND_SOC_NOPM, 0, 0,696memif_ul2_ch2_mix, ARRAY_SIZE(memif_ul2_ch2_mix)),697698SND_SOC_DAPM_MIXER("UL3_CH1", SND_SOC_NOPM, 0, 0,699memif_ul3_ch1_mix, ARRAY_SIZE(memif_ul3_ch1_mix)),700SND_SOC_DAPM_MIXER("UL3_CH2", SND_SOC_NOPM, 0, 0,701memif_ul3_ch2_mix, ARRAY_SIZE(memif_ul3_ch2_mix)),702703SND_SOC_DAPM_MIXER("UL4_CH1", SND_SOC_NOPM, 0, 0,704memif_ul4_ch1_mix, ARRAY_SIZE(memif_ul4_ch1_mix)),705SND_SOC_DAPM_MIXER("UL4_CH2", SND_SOC_NOPM, 0, 0,706memif_ul4_ch2_mix, ARRAY_SIZE(memif_ul4_ch2_mix)),707SND_SOC_DAPM_MUX_E("UL4_TINYCONN_CH1_MUX", SND_SOC_NOPM, 0, 0,708&ul4_tinyconn_ch1_mux_control,709ul_tinyconn_event,710SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),711SND_SOC_DAPM_MUX_E("UL4_TINYCONN_CH2_MUX", SND_SOC_NOPM, 0, 0,712&ul4_tinyconn_ch2_mux_control,713ul_tinyconn_event,714SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),715716SND_SOC_DAPM_MIXER("UL5_CH1", SND_SOC_NOPM, 0, 0,717memif_ul5_ch1_mix, ARRAY_SIZE(memif_ul5_ch1_mix)),718SND_SOC_DAPM_MIXER("UL5_CH2", SND_SOC_NOPM, 0, 0,719memif_ul5_ch2_mix, ARRAY_SIZE(memif_ul5_ch2_mix)),720721SND_SOC_DAPM_MIXER("UL6_CH1", SND_SOC_NOPM, 0, 0,722memif_ul6_ch1_mix, ARRAY_SIZE(memif_ul6_ch1_mix)),723SND_SOC_DAPM_MIXER("UL6_CH2", SND_SOC_NOPM, 0, 0,724memif_ul6_ch2_mix, ARRAY_SIZE(memif_ul6_ch2_mix)),725726SND_SOC_DAPM_MIXER("UL7_CH1", SND_SOC_NOPM, 0, 0,727memif_ul7_ch1_mix, ARRAY_SIZE(memif_ul7_ch1_mix)),728SND_SOC_DAPM_MIXER("UL7_CH2", SND_SOC_NOPM, 0, 0,729memif_ul7_ch2_mix, ARRAY_SIZE(memif_ul7_ch2_mix)),730731SND_SOC_DAPM_MIXER("UL8_CH1", SND_SOC_NOPM, 0, 0,732memif_ul8_ch1_mix, ARRAY_SIZE(memif_ul8_ch1_mix)),733SND_SOC_DAPM_MIXER("UL8_CH2", SND_SOC_NOPM, 0, 0,734memif_ul8_ch2_mix, ARRAY_SIZE(memif_ul8_ch2_mix)),735736SND_SOC_DAPM_MIXER("UL_MONO_1_CH1", SND_SOC_NOPM, 0, 0,737memif_ul_mono_1_mix,738ARRAY_SIZE(memif_ul_mono_1_mix)),739740SND_SOC_DAPM_MIXER("UL_MONO_2_CH1", SND_SOC_NOPM, 0, 0,741memif_ul_mono_2_mix,742ARRAY_SIZE(memif_ul_mono_2_mix)),743744SND_SOC_DAPM_MIXER("UL_MONO_3_CH1", SND_SOC_NOPM, 0, 0,745memif_ul_mono_3_mix,746ARRAY_SIZE(memif_ul_mono_3_mix)),747748SND_SOC_DAPM_INPUT("UL1_VIRTUAL_INPUT"),749SND_SOC_DAPM_INPUT("UL2_VIRTUAL_INPUT"),750SND_SOC_DAPM_INPUT("UL6_VIRTUAL_INPUT"),751};752753static const struct snd_soc_dapm_route mt8192_memif_routes[] = {754{"UL1", NULL, "UL1_CH1"},755{"UL1", NULL, "UL1_CH2"},756{"UL1", NULL, "UL1_CH3"},757{"UL1", NULL, "UL1_CH4"},758{"UL1_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},759{"UL1_CH1", "ADDA_UL_CH2", "ADDA_UL_Mux"},760{"UL1_CH1", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},761{"UL1_CH2", "ADDA_UL_CH1", "ADDA_UL_Mux"},762{"UL1_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},763{"UL1_CH2", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},764{"UL1_CH2", "ADDA_UL_CH4", "ADDA_CH34_UL_Mux"},765{"UL1_CH3", "ADDA_UL_CH1", "ADDA_UL_Mux"},766{"UL1_CH3", "ADDA_UL_CH2", "ADDA_UL_Mux"},767{"UL1_CH3", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},768{"UL1_CH4", "ADDA_UL_CH1", "ADDA_UL_Mux"},769{"UL1_CH4", "ADDA_UL_CH2", "ADDA_UL_Mux"},770{"UL1_CH4", "ADDA_UL_CH3", "ADDA_CH34_UL_Mux"},771{"UL1_CH4", "ADDA_UL_CH4", "ADDA_CH34_UL_Mux"},772773{"UL2", NULL, "UL2_CH1"},774{"UL2", NULL, "UL2_CH2"},775{"UL2_CH1", "I2S0_CH1", "I2S0"},776{"UL2_CH2", "I2S0_CH2", "I2S0"},777{"UL2_CH1", "I2S2_CH1", "I2S2"},778{"UL2_CH2", "I2S2_CH2", "I2S2"},779{"UL2_CH1", "I2S6_CH1", "I2S6"},780{"UL2_CH2", "I2S6_CH2", "I2S6"},781{"UL2_CH1", "I2S8_CH1", "I2S8"},782{"UL2_CH2", "I2S8_CH2", "I2S8"},783784{"UL2_CH1", "PCM_1_CAP_CH1", "PCM 1 Capture"},785{"UL2_CH2", "PCM_1_CAP_CH1", "PCM 1 Capture"},786{"UL2_CH1", "PCM_2_CAP_CH1", "PCM 2 Capture"},787{"UL2_CH2", "PCM_2_CAP_CH1", "PCM 2 Capture"},788789{"UL_MONO_1", NULL, "UL_MONO_1_CH1"},790{"UL_MONO_1_CH1", "PCM_1_CAP_CH1", "PCM 1 Capture"},791{"UL_MONO_1_CH1", "PCM_2_CAP_CH1", "PCM 2 Capture"},792793{"UL_MONO_2", NULL, "UL_MONO_2_CH1"},794{"UL_MONO_2_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},795796{"UL_MONO_3", NULL, "UL_MONO_3_CH1"},797{"UL_MONO_3_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},798799{"UL2_CH1", "CONNSYS_I2S_CH1", "Connsys I2S"},800{"UL2_CH2", "CONNSYS_I2S_CH2", "Connsys I2S"},801802{"UL3", NULL, "UL3_CH1"},803{"UL3", NULL, "UL3_CH2"},804{"UL3_CH1", "CONNSYS_I2S_CH1", "Connsys I2S"},805{"UL3_CH2", "CONNSYS_I2S_CH2", "Connsys I2S"},806807{"UL4", NULL, "UL4_CH1"},808{"UL4", NULL, "UL4_CH2"},809{"UL4", NULL, "UL4_TINYCONN_CH1_MUX"},810{"UL4", NULL, "UL4_TINYCONN_CH2_MUX"},811{"UL4_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},812{"UL4_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},813{"UL4_CH1", "I2S0_CH1", "I2S0"},814{"UL4_CH2", "I2S0_CH2", "I2S0"},815{"UL4_TINYCONN_CH1_MUX", "I2S0_CH1", "I2S0"},816{"UL4_TINYCONN_CH2_MUX", "I2S0_CH2", "I2S0"},817818{"UL5", NULL, "UL5_CH1"},819{"UL5", NULL, "UL5_CH2"},820{"UL5_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},821{"UL5_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},822823{"UL6", NULL, "UL6_CH1"},824{"UL6", NULL, "UL6_CH2"},825826{"UL6_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},827{"UL6_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},828{"UL6_CH1", "PCM_1_CAP_CH1", "PCM 1 Capture"},829{"UL6_CH2", "PCM_1_CAP_CH1", "PCM 1 Capture"},830{"UL6_CH1", "PCM_2_CAP_CH1", "PCM 2 Capture"},831{"UL6_CH2", "PCM_2_CAP_CH1", "PCM 2 Capture"},832833{"UL7", NULL, "UL7_CH1"},834{"UL7", NULL, "UL7_CH2"},835{"UL7_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},836{"UL7_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},837838{"UL8", NULL, "UL8_CH1"},839{"UL8", NULL, "UL8_CH2"},840{"UL8_CH1", "ADDA_UL_CH1", "ADDA_UL_Mux"},841{"UL8_CH2", "ADDA_UL_CH2", "ADDA_UL_Mux"},842};843844static const struct mtk_base_memif_data memif_data[MT8192_MEMIF_NUM] = {845[MT8192_MEMIF_DL1] = {846.name = "DL1",847.id = MT8192_MEMIF_DL1,848.reg_ofs_base = AFE_DL1_BASE,849.reg_ofs_cur = AFE_DL1_CUR,850.reg_ofs_end = AFE_DL1_END,851.reg_ofs_base_msb = AFE_DL1_BASE_MSB,852.reg_ofs_cur_msb = AFE_DL1_CUR_MSB,853.reg_ofs_end_msb = AFE_DL1_END_MSB,854.fs_reg = AFE_DL1_CON0,855.fs_shift = DL1_MODE_SFT,856.fs_maskbit = DL1_MODE_MASK,857.mono_reg = AFE_DL1_CON0,858.mono_shift = DL1_MONO_SFT,859.enable_reg = AFE_DAC_CON0,860.enable_shift = DL1_ON_SFT,861.hd_reg = AFE_DL1_CON0,862.hd_shift = DL1_HD_MODE_SFT,863.hd_align_reg = AFE_DL1_CON0,864.hd_align_mshift = DL1_HALIGN_SFT,865.pbuf_reg = AFE_DL1_CON0,866.pbuf_shift = DL1_PBUF_SIZE_SFT,867.minlen_reg = AFE_DL1_CON0,868.minlen_shift = DL1_MINLEN_SFT,869},870[MT8192_MEMIF_DL12] = {871.name = "DL12",872.id = MT8192_MEMIF_DL12,873.reg_ofs_base = AFE_DL12_BASE,874.reg_ofs_cur = AFE_DL12_CUR,875.reg_ofs_end = AFE_DL12_END,876.reg_ofs_base_msb = AFE_DL12_BASE_MSB,877.reg_ofs_cur_msb = AFE_DL12_CUR_MSB,878.reg_ofs_end_msb = AFE_DL12_END_MSB,879.fs_reg = AFE_DL12_CON0,880.fs_shift = DL12_MODE_SFT,881.fs_maskbit = DL12_MODE_MASK,882.mono_reg = AFE_DL12_CON0,883.mono_shift = DL12_MONO_SFT,884.enable_reg = AFE_DAC_CON0,885.enable_shift = DL12_ON_SFT,886.hd_reg = AFE_DL12_CON0,887.hd_shift = DL12_HD_MODE_SFT,888.hd_align_reg = AFE_DL12_CON0,889.hd_align_mshift = DL12_HALIGN_SFT,890.pbuf_reg = AFE_DL12_CON0,891.pbuf_shift = DL12_PBUF_SIZE_SFT,892.minlen_reg = AFE_DL12_CON0,893.minlen_shift = DL12_MINLEN_SFT,894},895[MT8192_MEMIF_DL2] = {896.name = "DL2",897.id = MT8192_MEMIF_DL2,898.reg_ofs_base = AFE_DL2_BASE,899.reg_ofs_cur = AFE_DL2_CUR,900.reg_ofs_end = AFE_DL2_END,901.reg_ofs_base_msb = AFE_DL2_BASE_MSB,902.reg_ofs_cur_msb = AFE_DL2_CUR_MSB,903.reg_ofs_end_msb = AFE_DL2_END_MSB,904.fs_reg = AFE_DL2_CON0,905.fs_shift = DL2_MODE_SFT,906.fs_maskbit = DL2_MODE_MASK,907.mono_reg = AFE_DL2_CON0,908.mono_shift = DL2_MONO_SFT,909.enable_reg = AFE_DAC_CON0,910.enable_shift = DL2_ON_SFT,911.hd_reg = AFE_DL2_CON0,912.hd_shift = DL2_HD_MODE_SFT,913.hd_align_reg = AFE_DL2_CON0,914.hd_align_mshift = DL2_HALIGN_SFT,915.pbuf_reg = AFE_DL2_CON0,916.pbuf_shift = DL2_PBUF_SIZE_SFT,917.minlen_reg = AFE_DL2_CON0,918.minlen_shift = DL2_MINLEN_SFT,919},920[MT8192_MEMIF_DL3] = {921.name = "DL3",922.id = MT8192_MEMIF_DL3,923.reg_ofs_base = AFE_DL3_BASE,924.reg_ofs_cur = AFE_DL3_CUR,925.reg_ofs_end = AFE_DL3_END,926.reg_ofs_base_msb = AFE_DL3_BASE_MSB,927.reg_ofs_cur_msb = AFE_DL3_CUR_MSB,928.reg_ofs_end_msb = AFE_DL3_END_MSB,929.fs_reg = AFE_DL3_CON0,930.fs_shift = DL3_MODE_SFT,931.fs_maskbit = DL3_MODE_MASK,932.mono_reg = AFE_DL3_CON0,933.mono_shift = DL3_MONO_SFT,934.enable_reg = AFE_DAC_CON0,935.enable_shift = DL3_ON_SFT,936.hd_reg = AFE_DL3_CON0,937.hd_shift = DL3_HD_MODE_SFT,938.hd_align_reg = AFE_DL3_CON0,939.hd_align_mshift = DL3_HALIGN_SFT,940.pbuf_reg = AFE_DL3_CON0,941.pbuf_shift = DL3_PBUF_SIZE_SFT,942.minlen_reg = AFE_DL3_CON0,943.minlen_shift = DL3_MINLEN_SFT,944},945[MT8192_MEMIF_DL4] = {946.name = "DL4",947.id = MT8192_MEMIF_DL4,948.reg_ofs_base = AFE_DL4_BASE,949.reg_ofs_cur = AFE_DL4_CUR,950.reg_ofs_end = AFE_DL4_END,951.reg_ofs_base_msb = AFE_DL4_BASE_MSB,952.reg_ofs_cur_msb = AFE_DL4_CUR_MSB,953.reg_ofs_end_msb = AFE_DL4_END_MSB,954.fs_reg = AFE_DL4_CON0,955.fs_shift = DL4_MODE_SFT,956.fs_maskbit = DL4_MODE_MASK,957.mono_reg = AFE_DL4_CON0,958.mono_shift = DL4_MONO_SFT,959.enable_reg = AFE_DAC_CON0,960.enable_shift = DL4_ON_SFT,961.hd_reg = AFE_DL4_CON0,962.hd_shift = DL4_HD_MODE_SFT,963.hd_align_reg = AFE_DL4_CON0,964.hd_align_mshift = DL4_HALIGN_SFT,965.pbuf_reg = AFE_DL4_CON0,966.pbuf_shift = DL4_PBUF_SIZE_SFT,967.minlen_reg = AFE_DL4_CON0,968.minlen_shift = DL4_MINLEN_SFT,969},970[MT8192_MEMIF_DL5] = {971.name = "DL5",972.id = MT8192_MEMIF_DL5,973.reg_ofs_base = AFE_DL5_BASE,974.reg_ofs_cur = AFE_DL5_CUR,975.reg_ofs_end = AFE_DL5_END,976.reg_ofs_base_msb = AFE_DL5_BASE_MSB,977.reg_ofs_cur_msb = AFE_DL5_CUR_MSB,978.reg_ofs_end_msb = AFE_DL5_END_MSB,979.fs_reg = AFE_DL5_CON0,980.fs_shift = DL5_MODE_SFT,981.fs_maskbit = DL5_MODE_MASK,982.mono_reg = AFE_DL5_CON0,983.mono_shift = DL5_MONO_SFT,984.enable_reg = AFE_DAC_CON0,985.enable_shift = DL5_ON_SFT,986.hd_reg = AFE_DL5_CON0,987.hd_shift = DL5_HD_MODE_SFT,988.hd_align_reg = AFE_DL5_CON0,989.hd_align_mshift = DL5_HALIGN_SFT,990.pbuf_reg = AFE_DL5_CON0,991.pbuf_shift = DL5_PBUF_SIZE_SFT,992.minlen_reg = AFE_DL5_CON0,993.minlen_shift = DL5_MINLEN_SFT,994},995[MT8192_MEMIF_DL6] = {996.name = "DL6",997.id = MT8192_MEMIF_DL6,998.reg_ofs_base = AFE_DL6_BASE,999.reg_ofs_cur = AFE_DL6_CUR,1000.reg_ofs_end = AFE_DL6_END,1001.reg_ofs_base_msb = AFE_DL6_BASE_MSB,1002.reg_ofs_cur_msb = AFE_DL6_CUR_MSB,1003.reg_ofs_end_msb = AFE_DL6_END_MSB,1004.fs_reg = AFE_DL6_CON0,1005.fs_shift = DL6_MODE_SFT,1006.fs_maskbit = DL6_MODE_MASK,1007.mono_reg = AFE_DL6_CON0,1008.mono_shift = DL6_MONO_SFT,1009.enable_reg = AFE_DAC_CON0,1010.enable_shift = DL6_ON_SFT,1011.hd_reg = AFE_DL6_CON0,1012.hd_shift = DL6_HD_MODE_SFT,1013.hd_align_reg = AFE_DL6_CON0,1014.hd_align_mshift = DL6_HALIGN_SFT,1015.pbuf_reg = AFE_DL6_CON0,1016.pbuf_shift = DL6_PBUF_SIZE_SFT,1017.minlen_reg = AFE_DL6_CON0,1018.minlen_shift = DL6_MINLEN_SFT,1019},1020[MT8192_MEMIF_DL7] = {1021.name = "DL7",1022.id = MT8192_MEMIF_DL7,1023.reg_ofs_base = AFE_DL7_BASE,1024.reg_ofs_cur = AFE_DL7_CUR,1025.reg_ofs_end = AFE_DL7_END,1026.reg_ofs_base_msb = AFE_DL7_BASE_MSB,1027.reg_ofs_cur_msb = AFE_DL7_CUR_MSB,1028.reg_ofs_end_msb = AFE_DL7_END_MSB,1029.fs_reg = AFE_DL7_CON0,1030.fs_shift = DL7_MODE_SFT,1031.fs_maskbit = DL7_MODE_MASK,1032.mono_reg = AFE_DL7_CON0,1033.mono_shift = DL7_MONO_SFT,1034.enable_reg = AFE_DAC_CON0,1035.enable_shift = DL7_ON_SFT,1036.hd_reg = AFE_DL7_CON0,1037.hd_shift = DL7_HD_MODE_SFT,1038.hd_align_reg = AFE_DL7_CON0,1039.hd_align_mshift = DL7_HALIGN_SFT,1040.pbuf_reg = AFE_DL7_CON0,1041.pbuf_shift = DL7_PBUF_SIZE_SFT,1042.minlen_reg = AFE_DL7_CON0,1043.minlen_shift = DL7_MINLEN_SFT,1044},1045[MT8192_MEMIF_DL8] = {1046.name = "DL8",1047.id = MT8192_MEMIF_DL8,1048.reg_ofs_base = AFE_DL8_BASE,1049.reg_ofs_cur = AFE_DL8_CUR,1050.reg_ofs_end = AFE_DL8_END,1051.reg_ofs_base_msb = AFE_DL8_BASE_MSB,1052.reg_ofs_cur_msb = AFE_DL8_CUR_MSB,1053.reg_ofs_end_msb = AFE_DL8_END_MSB,1054.fs_reg = AFE_DL8_CON0,1055.fs_shift = DL8_MODE_SFT,1056.fs_maskbit = DL8_MODE_MASK,1057.mono_reg = AFE_DL8_CON0,1058.mono_shift = DL8_MONO_SFT,1059.enable_reg = AFE_DAC_CON0,1060.enable_shift = DL8_ON_SFT,1061.hd_reg = AFE_DL8_CON0,1062.hd_shift = DL8_HD_MODE_SFT,1063.hd_align_reg = AFE_DL8_CON0,1064.hd_align_mshift = DL8_HALIGN_SFT,1065.pbuf_reg = AFE_DL8_CON0,1066.pbuf_shift = DL8_PBUF_SIZE_SFT,1067.minlen_reg = AFE_DL8_CON0,1068.minlen_shift = DL8_MINLEN_SFT,1069},1070[MT8192_MEMIF_DL9] = {1071.name = "DL9",1072.id = MT8192_MEMIF_DL9,1073.reg_ofs_base = AFE_DL9_BASE,1074.reg_ofs_cur = AFE_DL9_CUR,1075.reg_ofs_end = AFE_DL9_END,1076.reg_ofs_base_msb = AFE_DL9_BASE_MSB,1077.reg_ofs_cur_msb = AFE_DL9_CUR_MSB,1078.reg_ofs_end_msb = AFE_DL9_END_MSB,1079.fs_reg = AFE_DL9_CON0,1080.fs_shift = DL9_MODE_SFT,1081.fs_maskbit = DL9_MODE_MASK,1082.mono_reg = AFE_DL9_CON0,1083.mono_shift = DL9_MONO_SFT,1084.enable_reg = AFE_DAC_CON0,1085.enable_shift = DL9_ON_SFT,1086.hd_reg = AFE_DL9_CON0,1087.hd_shift = DL9_HD_MODE_SFT,1088.hd_align_reg = AFE_DL9_CON0,1089.hd_align_mshift = DL9_HALIGN_SFT,1090.pbuf_reg = AFE_DL9_CON0,1091.pbuf_shift = DL9_PBUF_SIZE_SFT,1092.minlen_reg = AFE_DL9_CON0,1093.minlen_shift = DL9_MINLEN_SFT,1094},1095[MT8192_MEMIF_DAI] = {1096.name = "DAI",1097.id = MT8192_MEMIF_DAI,1098.reg_ofs_base = AFE_DAI_BASE,1099.reg_ofs_cur = AFE_DAI_CUR,1100.reg_ofs_end = AFE_DAI_END,1101.reg_ofs_base_msb = AFE_DAI_BASE_MSB,1102.reg_ofs_cur_msb = AFE_DAI_CUR_MSB,1103.reg_ofs_end_msb = AFE_DAI_END_MSB,1104.fs_reg = AFE_DAI_CON0,1105.fs_shift = DAI_MODE_SFT,1106.fs_maskbit = DAI_MODE_MASK,1107.mono_reg = AFE_DAI_CON0,1108.mono_shift = DAI_DUPLICATE_WR_SFT,1109.mono_invert = 1,1110.enable_reg = AFE_DAC_CON0,1111.enable_shift = DAI_ON_SFT,1112.hd_reg = AFE_DAI_CON0,1113.hd_shift = DAI_HD_MODE_SFT,1114.hd_align_reg = AFE_DAI_CON0,1115.hd_align_mshift = DAI_HALIGN_SFT,1116},1117[MT8192_MEMIF_MOD_DAI] = {1118.name = "MOD_DAI",1119.id = MT8192_MEMIF_MOD_DAI,1120.reg_ofs_base = AFE_MOD_DAI_BASE,1121.reg_ofs_cur = AFE_MOD_DAI_CUR,1122.reg_ofs_end = AFE_MOD_DAI_END,1123.reg_ofs_base_msb = AFE_MOD_DAI_BASE_MSB,1124.reg_ofs_cur_msb = AFE_MOD_DAI_CUR_MSB,1125.reg_ofs_end_msb = AFE_MOD_DAI_END_MSB,1126.fs_reg = AFE_MOD_DAI_CON0,1127.fs_shift = MOD_DAI_MODE_SFT,1128.fs_maskbit = MOD_DAI_MODE_MASK,1129.mono_reg = AFE_MOD_DAI_CON0,1130.mono_shift = MOD_DAI_DUPLICATE_WR_SFT,1131.mono_invert = 1,1132.enable_reg = AFE_DAC_CON0,1133.enable_shift = MOD_DAI_ON_SFT,1134.hd_reg = AFE_MOD_DAI_CON0,1135.hd_shift = MOD_DAI_HD_MODE_SFT,1136.hd_align_reg = AFE_MOD_DAI_CON0,1137.hd_align_mshift = MOD_DAI_HALIGN_SFT,1138},1139[MT8192_MEMIF_DAI2] = {1140.name = "DAI2",1141.id = MT8192_MEMIF_DAI2,1142.reg_ofs_base = AFE_DAI2_BASE,1143.reg_ofs_cur = AFE_DAI2_CUR,1144.reg_ofs_end = AFE_DAI2_END,1145.reg_ofs_base_msb = AFE_DAI2_BASE_MSB,1146.reg_ofs_cur_msb = AFE_DAI2_CUR_MSB,1147.reg_ofs_end_msb = AFE_DAI2_END_MSB,1148.fs_reg = AFE_DAI2_CON0,1149.fs_shift = DAI2_MODE_SFT,1150.fs_maskbit = DAI2_MODE_MASK,1151.mono_reg = AFE_DAI2_CON0,1152.mono_shift = DAI2_DUPLICATE_WR_SFT,1153.mono_invert = 1,1154.enable_reg = AFE_DAC_CON0,1155.enable_shift = DAI2_ON_SFT,1156.hd_reg = AFE_DAI2_CON0,1157.hd_shift = DAI2_HD_MODE_SFT,1158.hd_align_reg = AFE_DAI2_CON0,1159.hd_align_mshift = DAI2_HALIGN_SFT,1160},1161[MT8192_MEMIF_VUL12] = {1162.name = "VUL12",1163.id = MT8192_MEMIF_VUL12,1164.reg_ofs_base = AFE_VUL12_BASE,1165.reg_ofs_cur = AFE_VUL12_CUR,1166.reg_ofs_end = AFE_VUL12_END,1167.reg_ofs_base_msb = AFE_VUL12_BASE_MSB,1168.reg_ofs_cur_msb = AFE_VUL12_CUR_MSB,1169.reg_ofs_end_msb = AFE_VUL12_END_MSB,1170.fs_reg = AFE_VUL12_CON0,1171.fs_shift = VUL12_MODE_SFT,1172.fs_maskbit = VUL12_MODE_MASK,1173.mono_reg = AFE_VUL12_CON0,1174.mono_shift = VUL12_MONO_SFT,1175.quad_ch_reg = AFE_VUL12_CON0,1176.quad_ch_shift = VUL12_4CH_EN_SFT,1177.quad_ch_mask = VUL12_4CH_EN_MASK,1178.enable_reg = AFE_DAC_CON0,1179.enable_shift = VUL12_ON_SFT,1180.hd_reg = AFE_VUL12_CON0,1181.hd_shift = VUL12_HD_MODE_SFT,1182.hd_align_reg = AFE_VUL12_CON0,1183.hd_align_mshift = VUL12_HALIGN_SFT,1184},1185[MT8192_MEMIF_VUL2] = {1186.name = "VUL2",1187.id = MT8192_MEMIF_VUL2,1188.reg_ofs_base = AFE_VUL2_BASE,1189.reg_ofs_cur = AFE_VUL2_CUR,1190.reg_ofs_end = AFE_VUL2_END,1191.reg_ofs_base_msb = AFE_VUL2_BASE_MSB,1192.reg_ofs_cur_msb = AFE_VUL2_CUR_MSB,1193.reg_ofs_end_msb = AFE_VUL2_END_MSB,1194.fs_reg = AFE_VUL2_CON0,1195.fs_shift = VUL2_MODE_SFT,1196.fs_maskbit = VUL2_MODE_MASK,1197.mono_reg = AFE_VUL2_CON0,1198.mono_shift = VUL2_MONO_SFT,1199.enable_reg = AFE_DAC_CON0,1200.enable_shift = VUL2_ON_SFT,1201.hd_reg = AFE_VUL2_CON0,1202.hd_shift = VUL2_HD_MODE_SFT,1203.hd_align_reg = AFE_VUL2_CON0,1204.hd_align_mshift = VUL2_HALIGN_SFT,1205},1206[MT8192_MEMIF_AWB] = {1207.name = "AWB",1208.id = MT8192_MEMIF_AWB,1209.reg_ofs_base = AFE_AWB_BASE,1210.reg_ofs_cur = AFE_AWB_CUR,1211.reg_ofs_end = AFE_AWB_END,1212.reg_ofs_base_msb = AFE_AWB_BASE_MSB,1213.reg_ofs_cur_msb = AFE_AWB_CUR_MSB,1214.reg_ofs_end_msb = AFE_AWB_END_MSB,1215.fs_reg = AFE_AWB_CON0,1216.fs_shift = AWB_MODE_SFT,1217.fs_maskbit = AWB_MODE_MASK,1218.mono_reg = AFE_AWB_CON0,1219.mono_shift = AWB_MONO_SFT,1220.enable_reg = AFE_DAC_CON0,1221.enable_shift = AWB_ON_SFT,1222.hd_reg = AFE_AWB_CON0,1223.hd_shift = AWB_HD_MODE_SFT,1224.hd_align_reg = AFE_AWB_CON0,1225.hd_align_mshift = AWB_HALIGN_SFT,1226},1227[MT8192_MEMIF_AWB2] = {1228.name = "AWB2",1229.id = MT8192_MEMIF_AWB2,1230.reg_ofs_base = AFE_AWB2_BASE,1231.reg_ofs_cur = AFE_AWB2_CUR,1232.reg_ofs_end = AFE_AWB2_END,1233.reg_ofs_base_msb = AFE_AWB2_BASE_MSB,1234.reg_ofs_cur_msb = AFE_AWB2_CUR_MSB,1235.reg_ofs_end_msb = AFE_AWB2_END_MSB,1236.fs_reg = AFE_AWB2_CON0,1237.fs_shift = AWB2_MODE_SFT,1238.fs_maskbit = AWB2_MODE_MASK,1239.mono_reg = AFE_AWB2_CON0,1240.mono_shift = AWB2_MONO_SFT,1241.enable_reg = AFE_DAC_CON0,1242.enable_shift = AWB2_ON_SFT,1243.hd_reg = AFE_AWB2_CON0,1244.hd_shift = AWB2_HD_MODE_SFT,1245.hd_align_reg = AFE_AWB2_CON0,1246.hd_align_mshift = AWB2_HALIGN_SFT,1247},1248[MT8192_MEMIF_VUL3] = {1249.name = "VUL3",1250.id = MT8192_MEMIF_VUL3,1251.reg_ofs_base = AFE_VUL3_BASE,1252.reg_ofs_cur = AFE_VUL3_CUR,1253.reg_ofs_end = AFE_VUL3_END,1254.reg_ofs_base_msb = AFE_VUL3_BASE_MSB,1255.reg_ofs_cur_msb = AFE_VUL3_CUR_MSB,1256.reg_ofs_end_msb = AFE_VUL3_END_MSB,1257.fs_reg = AFE_VUL3_CON0,1258.fs_shift = VUL3_MODE_SFT,1259.fs_maskbit = VUL3_MODE_MASK,1260.mono_reg = AFE_VUL3_CON0,1261.mono_shift = VUL3_MONO_SFT,1262.enable_reg = AFE_DAC_CON0,1263.enable_shift = VUL3_ON_SFT,1264.hd_reg = AFE_VUL3_CON0,1265.hd_shift = VUL3_HD_MODE_SFT,1266.hd_align_reg = AFE_VUL3_CON0,1267.hd_align_mshift = VUL3_HALIGN_SFT,1268},1269[MT8192_MEMIF_VUL4] = {1270.name = "VUL4",1271.id = MT8192_MEMIF_VUL4,1272.reg_ofs_base = AFE_VUL4_BASE,1273.reg_ofs_cur = AFE_VUL4_CUR,1274.reg_ofs_end = AFE_VUL4_END,1275.reg_ofs_base_msb = AFE_VUL4_BASE_MSB,1276.reg_ofs_cur_msb = AFE_VUL4_CUR_MSB,1277.reg_ofs_end_msb = AFE_VUL4_END_MSB,1278.fs_reg = AFE_VUL4_CON0,1279.fs_shift = VUL4_MODE_SFT,1280.fs_maskbit = VUL4_MODE_MASK,1281.mono_reg = AFE_VUL4_CON0,1282.mono_shift = VUL4_MONO_SFT,1283.enable_reg = AFE_DAC_CON0,1284.enable_shift = VUL4_ON_SFT,1285.hd_reg = AFE_VUL4_CON0,1286.hd_shift = VUL4_HD_MODE_SFT,1287.hd_align_reg = AFE_VUL4_CON0,1288.hd_align_mshift = VUL4_HALIGN_SFT,1289},1290[MT8192_MEMIF_VUL5] = {1291.name = "VUL5",1292.id = MT8192_MEMIF_VUL5,1293.reg_ofs_base = AFE_VUL5_BASE,1294.reg_ofs_cur = AFE_VUL5_CUR,1295.reg_ofs_end = AFE_VUL5_END,1296.reg_ofs_base_msb = AFE_VUL5_BASE_MSB,1297.reg_ofs_cur_msb = AFE_VUL5_CUR_MSB,1298.reg_ofs_end_msb = AFE_VUL5_END_MSB,1299.fs_reg = AFE_VUL5_CON0,1300.fs_shift = VUL5_MODE_SFT,1301.fs_maskbit = VUL5_MODE_MASK,1302.mono_reg = AFE_VUL5_CON0,1303.mono_shift = VUL5_MONO_SFT,1304.enable_reg = AFE_DAC_CON0,1305.enable_shift = VUL5_ON_SFT,1306.hd_reg = AFE_VUL5_CON0,1307.hd_shift = VUL5_HD_MODE_SFT,1308.hd_align_reg = AFE_VUL5_CON0,1309.hd_align_mshift = VUL5_HALIGN_SFT,1310},1311[MT8192_MEMIF_VUL6] = {1312.name = "VUL6",1313.id = MT8192_MEMIF_VUL6,1314.reg_ofs_base = AFE_VUL6_BASE,1315.reg_ofs_cur = AFE_VUL6_CUR,1316.reg_ofs_end = AFE_VUL6_END,1317.reg_ofs_base_msb = AFE_VUL6_BASE_MSB,1318.reg_ofs_cur_msb = AFE_VUL6_CUR_MSB,1319.reg_ofs_end_msb = AFE_VUL6_END_MSB,1320.fs_reg = AFE_VUL6_CON0,1321.fs_shift = VUL6_MODE_SFT,1322.fs_maskbit = VUL6_MODE_MASK,1323.mono_reg = AFE_VUL6_CON0,1324.mono_shift = VUL6_MONO_SFT,1325.enable_reg = AFE_DAC_CON0,1326.enable_shift = VUL6_ON_SFT,1327.hd_reg = AFE_VUL6_CON0,1328.hd_shift = VUL6_HD_MODE_SFT,1329.hd_align_reg = AFE_VUL6_CON0,1330.hd_align_mshift = VUL6_HALIGN_SFT,1331},1332[MT8192_MEMIF_HDMI] = {1333.name = "HDMI",1334.id = MT8192_MEMIF_HDMI,1335.reg_ofs_base = AFE_HDMI_OUT_BASE,1336.reg_ofs_cur = AFE_HDMI_OUT_CUR,1337.reg_ofs_end = AFE_HDMI_OUT_END,1338.reg_ofs_base_msb = AFE_HDMI_OUT_BASE_MSB,1339.reg_ofs_cur_msb = AFE_HDMI_OUT_CUR_MSB,1340.reg_ofs_end_msb = AFE_HDMI_OUT_END_MSB,1341.fs_reg = -1,1342.fs_shift = -1,1343.fs_maskbit = -1,1344.mono_reg = -1,1345.mono_shift = -1,1346.enable_reg = AFE_DAC_CON0,1347.enable_shift = HDMI_OUT_ON_SFT,1348.hd_reg = AFE_HDMI_OUT_CON0,1349.hd_shift = HDMI_OUT_HD_MODE_SFT,1350.hd_align_reg = AFE_HDMI_OUT_CON0,1351.hd_align_mshift = HDMI_OUT_HALIGN_SFT,1352.pbuf_reg = AFE_HDMI_OUT_CON0,1353.minlen_reg = AFE_HDMI_OUT_CON0,1354.minlen_shift = HDMI_OUT_MINLEN_SFT,1355},1356};13571358static const struct mtk_base_irq_data irq_data[MT8192_IRQ_NUM] = {1359[MT8192_IRQ_0] = {1360.id = MT8192_IRQ_0,1361.irq_cnt_reg = AFE_IRQ_MCU_CNT0,1362.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1363.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1364.irq_fs_reg = AFE_IRQ_MCU_CON1,1365.irq_fs_shift = IRQ0_MCU_MODE_SFT,1366.irq_fs_maskbit = IRQ0_MCU_MODE_MASK,1367.irq_en_reg = AFE_IRQ_MCU_CON0,1368.irq_en_shift = IRQ0_MCU_ON_SFT,1369.irq_clr_reg = AFE_IRQ_MCU_CLR,1370.irq_clr_shift = IRQ0_MCU_CLR_SFT,1371},1372[MT8192_IRQ_1] = {1373.id = MT8192_IRQ_1,1374.irq_cnt_reg = AFE_IRQ_MCU_CNT1,1375.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1376.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1377.irq_fs_reg = AFE_IRQ_MCU_CON1,1378.irq_fs_shift = IRQ1_MCU_MODE_SFT,1379.irq_fs_maskbit = IRQ1_MCU_MODE_MASK,1380.irq_en_reg = AFE_IRQ_MCU_CON0,1381.irq_en_shift = IRQ1_MCU_ON_SFT,1382.irq_clr_reg = AFE_IRQ_MCU_CLR,1383.irq_clr_shift = IRQ1_MCU_CLR_SFT,1384},1385[MT8192_IRQ_2] = {1386.id = MT8192_IRQ_2,1387.irq_cnt_reg = AFE_IRQ_MCU_CNT2,1388.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1389.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1390.irq_fs_reg = AFE_IRQ_MCU_CON1,1391.irq_fs_shift = IRQ2_MCU_MODE_SFT,1392.irq_fs_maskbit = IRQ2_MCU_MODE_MASK,1393.irq_en_reg = AFE_IRQ_MCU_CON0,1394.irq_en_shift = IRQ2_MCU_ON_SFT,1395.irq_clr_reg = AFE_IRQ_MCU_CLR,1396.irq_clr_shift = IRQ2_MCU_CLR_SFT,1397},1398[MT8192_IRQ_3] = {1399.id = MT8192_IRQ_3,1400.irq_cnt_reg = AFE_IRQ_MCU_CNT3,1401.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1402.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1403.irq_fs_reg = AFE_IRQ_MCU_CON1,1404.irq_fs_shift = IRQ3_MCU_MODE_SFT,1405.irq_fs_maskbit = IRQ3_MCU_MODE_MASK,1406.irq_en_reg = AFE_IRQ_MCU_CON0,1407.irq_en_shift = IRQ3_MCU_ON_SFT,1408.irq_clr_reg = AFE_IRQ_MCU_CLR,1409.irq_clr_shift = IRQ3_MCU_CLR_SFT,1410},1411[MT8192_IRQ_4] = {1412.id = MT8192_IRQ_4,1413.irq_cnt_reg = AFE_IRQ_MCU_CNT4,1414.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1415.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1416.irq_fs_reg = AFE_IRQ_MCU_CON1,1417.irq_fs_shift = IRQ4_MCU_MODE_SFT,1418.irq_fs_maskbit = IRQ4_MCU_MODE_MASK,1419.irq_en_reg = AFE_IRQ_MCU_CON0,1420.irq_en_shift = IRQ4_MCU_ON_SFT,1421.irq_clr_reg = AFE_IRQ_MCU_CLR,1422.irq_clr_shift = IRQ4_MCU_CLR_SFT,1423},1424[MT8192_IRQ_5] = {1425.id = MT8192_IRQ_5,1426.irq_cnt_reg = AFE_IRQ_MCU_CNT5,1427.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1428.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1429.irq_fs_reg = AFE_IRQ_MCU_CON1,1430.irq_fs_shift = IRQ5_MCU_MODE_SFT,1431.irq_fs_maskbit = IRQ5_MCU_MODE_MASK,1432.irq_en_reg = AFE_IRQ_MCU_CON0,1433.irq_en_shift = IRQ5_MCU_ON_SFT,1434.irq_clr_reg = AFE_IRQ_MCU_CLR,1435.irq_clr_shift = IRQ5_MCU_CLR_SFT,1436},1437[MT8192_IRQ_6] = {1438.id = MT8192_IRQ_6,1439.irq_cnt_reg = AFE_IRQ_MCU_CNT6,1440.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1441.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1442.irq_fs_reg = AFE_IRQ_MCU_CON1,1443.irq_fs_shift = IRQ6_MCU_MODE_SFT,1444.irq_fs_maskbit = IRQ6_MCU_MODE_MASK,1445.irq_en_reg = AFE_IRQ_MCU_CON0,1446.irq_en_shift = IRQ6_MCU_ON_SFT,1447.irq_clr_reg = AFE_IRQ_MCU_CLR,1448.irq_clr_shift = IRQ6_MCU_CLR_SFT,1449},1450[MT8192_IRQ_7] = {1451.id = MT8192_IRQ_7,1452.irq_cnt_reg = AFE_IRQ_MCU_CNT7,1453.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1454.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1455.irq_fs_reg = AFE_IRQ_MCU_CON1,1456.irq_fs_shift = IRQ7_MCU_MODE_SFT,1457.irq_fs_maskbit = IRQ7_MCU_MODE_MASK,1458.irq_en_reg = AFE_IRQ_MCU_CON0,1459.irq_en_shift = IRQ7_MCU_ON_SFT,1460.irq_clr_reg = AFE_IRQ_MCU_CLR,1461.irq_clr_shift = IRQ7_MCU_CLR_SFT,1462},1463[MT8192_IRQ_8] = {1464.id = MT8192_IRQ_8,1465.irq_cnt_reg = AFE_IRQ_MCU_CNT8,1466.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1467.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1468.irq_fs_reg = AFE_IRQ_MCU_CON2,1469.irq_fs_shift = IRQ8_MCU_MODE_SFT,1470.irq_fs_maskbit = IRQ8_MCU_MODE_MASK,1471.irq_en_reg = AFE_IRQ_MCU_CON0,1472.irq_en_shift = IRQ8_MCU_ON_SFT,1473.irq_clr_reg = AFE_IRQ_MCU_CLR,1474.irq_clr_shift = IRQ8_MCU_CLR_SFT,1475},1476[MT8192_IRQ_9] = {1477.id = MT8192_IRQ_9,1478.irq_cnt_reg = AFE_IRQ_MCU_CNT9,1479.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1480.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1481.irq_fs_reg = AFE_IRQ_MCU_CON2,1482.irq_fs_shift = IRQ9_MCU_MODE_SFT,1483.irq_fs_maskbit = IRQ9_MCU_MODE_MASK,1484.irq_en_reg = AFE_IRQ_MCU_CON0,1485.irq_en_shift = IRQ9_MCU_ON_SFT,1486.irq_clr_reg = AFE_IRQ_MCU_CLR,1487.irq_clr_shift = IRQ9_MCU_CLR_SFT,1488},1489[MT8192_IRQ_10] = {1490.id = MT8192_IRQ_10,1491.irq_cnt_reg = AFE_IRQ_MCU_CNT10,1492.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1493.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1494.irq_fs_reg = AFE_IRQ_MCU_CON2,1495.irq_fs_shift = IRQ10_MCU_MODE_SFT,1496.irq_fs_maskbit = IRQ10_MCU_MODE_MASK,1497.irq_en_reg = AFE_IRQ_MCU_CON0,1498.irq_en_shift = IRQ10_MCU_ON_SFT,1499.irq_clr_reg = AFE_IRQ_MCU_CLR,1500.irq_clr_shift = IRQ10_MCU_CLR_SFT,1501},1502[MT8192_IRQ_11] = {1503.id = MT8192_IRQ_11,1504.irq_cnt_reg = AFE_IRQ_MCU_CNT11,1505.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1506.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1507.irq_fs_reg = AFE_IRQ_MCU_CON2,1508.irq_fs_shift = IRQ11_MCU_MODE_SFT,1509.irq_fs_maskbit = IRQ11_MCU_MODE_MASK,1510.irq_en_reg = AFE_IRQ_MCU_CON0,1511.irq_en_shift = IRQ11_MCU_ON_SFT,1512.irq_clr_reg = AFE_IRQ_MCU_CLR,1513.irq_clr_shift = IRQ11_MCU_CLR_SFT,1514},1515[MT8192_IRQ_12] = {1516.id = MT8192_IRQ_12,1517.irq_cnt_reg = AFE_IRQ_MCU_CNT12,1518.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1519.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1520.irq_fs_reg = AFE_IRQ_MCU_CON2,1521.irq_fs_shift = IRQ12_MCU_MODE_SFT,1522.irq_fs_maskbit = IRQ12_MCU_MODE_MASK,1523.irq_en_reg = AFE_IRQ_MCU_CON0,1524.irq_en_shift = IRQ12_MCU_ON_SFT,1525.irq_clr_reg = AFE_IRQ_MCU_CLR,1526.irq_clr_shift = IRQ12_MCU_CLR_SFT,1527},1528[MT8192_IRQ_13] = {1529.id = MT8192_IRQ_13,1530.irq_cnt_reg = AFE_IRQ_MCU_CNT13,1531.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1532.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1533.irq_fs_reg = AFE_IRQ_MCU_CON2,1534.irq_fs_shift = IRQ13_MCU_MODE_SFT,1535.irq_fs_maskbit = IRQ13_MCU_MODE_MASK,1536.irq_en_reg = AFE_IRQ_MCU_CON0,1537.irq_en_shift = IRQ13_MCU_ON_SFT,1538.irq_clr_reg = AFE_IRQ_MCU_CLR,1539.irq_clr_shift = IRQ13_MCU_CLR_SFT,1540},1541[MT8192_IRQ_14] = {1542.id = MT8192_IRQ_14,1543.irq_cnt_reg = AFE_IRQ_MCU_CNT14,1544.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1545.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1546.irq_fs_reg = AFE_IRQ_MCU_CON2,1547.irq_fs_shift = IRQ14_MCU_MODE_SFT,1548.irq_fs_maskbit = IRQ14_MCU_MODE_MASK,1549.irq_en_reg = AFE_IRQ_MCU_CON0,1550.irq_en_shift = IRQ14_MCU_ON_SFT,1551.irq_clr_reg = AFE_IRQ_MCU_CLR,1552.irq_clr_shift = IRQ14_MCU_CLR_SFT,1553},1554[MT8192_IRQ_15] = {1555.id = MT8192_IRQ_15,1556.irq_cnt_reg = AFE_IRQ_MCU_CNT15,1557.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1558.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1559.irq_fs_reg = AFE_IRQ_MCU_CON2,1560.irq_fs_shift = IRQ15_MCU_MODE_SFT,1561.irq_fs_maskbit = IRQ15_MCU_MODE_MASK,1562.irq_en_reg = AFE_IRQ_MCU_CON0,1563.irq_en_shift = IRQ15_MCU_ON_SFT,1564.irq_clr_reg = AFE_IRQ_MCU_CLR,1565.irq_clr_shift = IRQ15_MCU_CLR_SFT,1566},1567[MT8192_IRQ_16] = {1568.id = MT8192_IRQ_16,1569.irq_cnt_reg = AFE_IRQ_MCU_CNT16,1570.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1571.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1572.irq_fs_reg = AFE_IRQ_MCU_CON3,1573.irq_fs_shift = IRQ16_MCU_MODE_SFT,1574.irq_fs_maskbit = IRQ16_MCU_MODE_MASK,1575.irq_en_reg = AFE_IRQ_MCU_CON0,1576.irq_en_shift = IRQ16_MCU_ON_SFT,1577.irq_clr_reg = AFE_IRQ_MCU_CLR,1578.irq_clr_shift = IRQ16_MCU_CLR_SFT,1579},1580[MT8192_IRQ_17] = {1581.id = MT8192_IRQ_17,1582.irq_cnt_reg = AFE_IRQ_MCU_CNT17,1583.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1584.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1585.irq_fs_reg = AFE_IRQ_MCU_CON3,1586.irq_fs_shift = IRQ17_MCU_MODE_SFT,1587.irq_fs_maskbit = IRQ17_MCU_MODE_MASK,1588.irq_en_reg = AFE_IRQ_MCU_CON0,1589.irq_en_shift = IRQ17_MCU_ON_SFT,1590.irq_clr_reg = AFE_IRQ_MCU_CLR,1591.irq_clr_shift = IRQ17_MCU_CLR_SFT,1592},1593[MT8192_IRQ_18] = {1594.id = MT8192_IRQ_18,1595.irq_cnt_reg = AFE_IRQ_MCU_CNT18,1596.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1597.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1598.irq_fs_reg = AFE_IRQ_MCU_CON3,1599.irq_fs_shift = IRQ18_MCU_MODE_SFT,1600.irq_fs_maskbit = IRQ18_MCU_MODE_MASK,1601.irq_en_reg = AFE_IRQ_MCU_CON0,1602.irq_en_shift = IRQ18_MCU_ON_SFT,1603.irq_clr_reg = AFE_IRQ_MCU_CLR,1604.irq_clr_shift = IRQ18_MCU_CLR_SFT,1605},1606[MT8192_IRQ_19] = {1607.id = MT8192_IRQ_19,1608.irq_cnt_reg = AFE_IRQ_MCU_CNT19,1609.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1610.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1611.irq_fs_reg = AFE_IRQ_MCU_CON3,1612.irq_fs_shift = IRQ19_MCU_MODE_SFT,1613.irq_fs_maskbit = IRQ19_MCU_MODE_MASK,1614.irq_en_reg = AFE_IRQ_MCU_CON0,1615.irq_en_shift = IRQ19_MCU_ON_SFT,1616.irq_clr_reg = AFE_IRQ_MCU_CLR,1617.irq_clr_shift = IRQ19_MCU_CLR_SFT,1618},1619[MT8192_IRQ_20] = {1620.id = MT8192_IRQ_20,1621.irq_cnt_reg = AFE_IRQ_MCU_CNT20,1622.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1623.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1624.irq_fs_reg = AFE_IRQ_MCU_CON3,1625.irq_fs_shift = IRQ20_MCU_MODE_SFT,1626.irq_fs_maskbit = IRQ20_MCU_MODE_MASK,1627.irq_en_reg = AFE_IRQ_MCU_CON0,1628.irq_en_shift = IRQ20_MCU_ON_SFT,1629.irq_clr_reg = AFE_IRQ_MCU_CLR,1630.irq_clr_shift = IRQ20_MCU_CLR_SFT,1631},1632[MT8192_IRQ_21] = {1633.id = MT8192_IRQ_21,1634.irq_cnt_reg = AFE_IRQ_MCU_CNT21,1635.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1636.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1637.irq_fs_reg = AFE_IRQ_MCU_CON3,1638.irq_fs_shift = IRQ21_MCU_MODE_SFT,1639.irq_fs_maskbit = IRQ21_MCU_MODE_MASK,1640.irq_en_reg = AFE_IRQ_MCU_CON0,1641.irq_en_shift = IRQ21_MCU_ON_SFT,1642.irq_clr_reg = AFE_IRQ_MCU_CLR,1643.irq_clr_shift = IRQ21_MCU_CLR_SFT,1644},1645[MT8192_IRQ_22] = {1646.id = MT8192_IRQ_22,1647.irq_cnt_reg = AFE_IRQ_MCU_CNT22,1648.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1649.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1650.irq_fs_reg = AFE_IRQ_MCU_CON3,1651.irq_fs_shift = IRQ22_MCU_MODE_SFT,1652.irq_fs_maskbit = IRQ22_MCU_MODE_MASK,1653.irq_en_reg = AFE_IRQ_MCU_CON0,1654.irq_en_shift = IRQ22_MCU_ON_SFT,1655.irq_clr_reg = AFE_IRQ_MCU_CLR,1656.irq_clr_shift = IRQ22_MCU_CLR_SFT,1657},1658[MT8192_IRQ_23] = {1659.id = MT8192_IRQ_23,1660.irq_cnt_reg = AFE_IRQ_MCU_CNT23,1661.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1662.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1663.irq_fs_reg = AFE_IRQ_MCU_CON3,1664.irq_fs_shift = IRQ23_MCU_MODE_SFT,1665.irq_fs_maskbit = IRQ23_MCU_MODE_MASK,1666.irq_en_reg = AFE_IRQ_MCU_CON0,1667.irq_en_shift = IRQ23_MCU_ON_SFT,1668.irq_clr_reg = AFE_IRQ_MCU_CLR,1669.irq_clr_shift = IRQ23_MCU_CLR_SFT,1670},1671[MT8192_IRQ_24] = {1672.id = MT8192_IRQ_24,1673.irq_cnt_reg = AFE_IRQ_MCU_CNT24,1674.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1675.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1676.irq_fs_reg = AFE_IRQ_MCU_CON4,1677.irq_fs_shift = IRQ24_MCU_MODE_SFT,1678.irq_fs_maskbit = IRQ24_MCU_MODE_MASK,1679.irq_en_reg = AFE_IRQ_MCU_CON0,1680.irq_en_shift = IRQ24_MCU_ON_SFT,1681.irq_clr_reg = AFE_IRQ_MCU_CLR,1682.irq_clr_shift = IRQ24_MCU_CLR_SFT,1683},1684[MT8192_IRQ_25] = {1685.id = MT8192_IRQ_25,1686.irq_cnt_reg = AFE_IRQ_MCU_CNT25,1687.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1688.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1689.irq_fs_reg = AFE_IRQ_MCU_CON4,1690.irq_fs_shift = IRQ25_MCU_MODE_SFT,1691.irq_fs_maskbit = IRQ25_MCU_MODE_MASK,1692.irq_en_reg = AFE_IRQ_MCU_CON0,1693.irq_en_shift = IRQ25_MCU_ON_SFT,1694.irq_clr_reg = AFE_IRQ_MCU_CLR,1695.irq_clr_shift = IRQ25_MCU_CLR_SFT,1696},1697[MT8192_IRQ_26] = {1698.id = MT8192_IRQ_26,1699.irq_cnt_reg = AFE_IRQ_MCU_CNT26,1700.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1701.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1702.irq_fs_reg = AFE_IRQ_MCU_CON4,1703.irq_fs_shift = IRQ26_MCU_MODE_SFT,1704.irq_fs_maskbit = IRQ26_MCU_MODE_MASK,1705.irq_en_reg = AFE_IRQ_MCU_CON0,1706.irq_en_shift = IRQ26_MCU_ON_SFT,1707.irq_clr_reg = AFE_IRQ_MCU_CLR,1708.irq_clr_shift = IRQ26_MCU_CLR_SFT,1709},1710[MT8192_IRQ_31] = {1711.id = MT8192_IRQ_31,1712.irq_cnt_reg = AFE_IRQ_MCU_CNT31,1713.irq_cnt_shift = AFE_IRQ_CNT_SHIFT,1714.irq_cnt_maskbit = AFE_IRQ_CNT_MASK,1715.irq_fs_reg = -1,1716.irq_fs_shift = -1,1717.irq_fs_maskbit = -1,1718.irq_en_reg = AFE_IRQ_MCU_CON0,1719.irq_en_shift = IRQ31_MCU_ON_SFT,1720.irq_clr_reg = AFE_IRQ_MCU_CLR,1721.irq_clr_shift = IRQ31_MCU_CLR_SFT,1722},1723};17241725static const int memif_irq_usage[MT8192_MEMIF_NUM] = {1726[MT8192_MEMIF_DL1] = MT8192_IRQ_0,1727[MT8192_MEMIF_DL2] = MT8192_IRQ_1,1728[MT8192_MEMIF_DL3] = MT8192_IRQ_2,1729[MT8192_MEMIF_DL4] = MT8192_IRQ_3,1730[MT8192_MEMIF_DL5] = MT8192_IRQ_4,1731[MT8192_MEMIF_DL6] = MT8192_IRQ_5,1732[MT8192_MEMIF_DL7] = MT8192_IRQ_6,1733[MT8192_MEMIF_DL8] = MT8192_IRQ_7,1734[MT8192_MEMIF_DL9] = MT8192_IRQ_8,1735[MT8192_MEMIF_DL12] = MT8192_IRQ_9,1736[MT8192_MEMIF_DAI] = MT8192_IRQ_10,1737[MT8192_MEMIF_MOD_DAI] = MT8192_IRQ_11,1738[MT8192_MEMIF_DAI2] = MT8192_IRQ_12,1739[MT8192_MEMIF_VUL12] = MT8192_IRQ_13,1740[MT8192_MEMIF_VUL2] = MT8192_IRQ_14,1741[MT8192_MEMIF_AWB] = MT8192_IRQ_15,1742[MT8192_MEMIF_AWB2] = MT8192_IRQ_16,1743[MT8192_MEMIF_VUL3] = MT8192_IRQ_17,1744[MT8192_MEMIF_VUL4] = MT8192_IRQ_18,1745[MT8192_MEMIF_VUL5] = MT8192_IRQ_19,1746[MT8192_MEMIF_VUL6] = MT8192_IRQ_20,1747[MT8192_MEMIF_HDMI] = MT8192_IRQ_31,1748};17491750static bool mt8192_is_volatile_reg(struct device *dev, unsigned int reg)1751{1752/* these auto-gen reg has read-only bit, so put it as volatile */1753/* volatile reg cannot be cached, so cannot be set when power off */1754switch (reg) {1755case AUDIO_TOP_CON0: /* reg bit controlled by CCF */1756case AUDIO_TOP_CON1: /* reg bit controlled by CCF */1757case AUDIO_TOP_CON2:1758case AUDIO_TOP_CON3:1759case AFE_DL1_CUR_MSB:1760case AFE_DL1_CUR:1761case AFE_DL1_END:1762case AFE_DL2_CUR_MSB:1763case AFE_DL2_CUR:1764case AFE_DL2_END:1765case AFE_DL3_CUR_MSB:1766case AFE_DL3_CUR:1767case AFE_DL3_END:1768case AFE_DL4_CUR_MSB:1769case AFE_DL4_CUR:1770case AFE_DL4_END:1771case AFE_DL12_CUR_MSB:1772case AFE_DL12_CUR:1773case AFE_DL12_END:1774case AFE_ADDA_SRC_DEBUG_MON0:1775case AFE_ADDA_SRC_DEBUG_MON1:1776case AFE_ADDA_UL_SRC_MON0:1777case AFE_ADDA_UL_SRC_MON1:1778case AFE_SECURE_CON0:1779case AFE_SRAM_BOUND:1780case AFE_SECURE_CON1:1781case AFE_VUL_CUR_MSB:1782case AFE_VUL_CUR:1783case AFE_VUL_END:1784case AFE_ADDA_3RD_DAC_DL_SDM_FIFO_MON:1785case AFE_ADDA_3RD_DAC_DL_SRC_LCH_MON:1786case AFE_ADDA_3RD_DAC_DL_SRC_RCH_MON:1787case AFE_ADDA_3RD_DAC_DL_SDM_OUT_MON:1788case AFE_SIDETONE_MON:1789case AFE_SIDETONE_CON0:1790case AFE_SIDETONE_COEFF:1791case AFE_VUL2_CUR_MSB:1792case AFE_VUL2_CUR:1793case AFE_VUL2_END:1794case AFE_VUL3_CUR_MSB:1795case AFE_VUL3_CUR:1796case AFE_VUL3_END:1797case AFE_I2S_MON:1798case AFE_DAC_MON:1799case AFE_IRQ0_MCU_CNT_MON:1800case AFE_IRQ6_MCU_CNT_MON:1801case AFE_VUL4_CUR_MSB:1802case AFE_VUL4_CUR:1803case AFE_VUL4_END:1804case AFE_VUL12_CUR_MSB:1805case AFE_VUL12_CUR:1806case AFE_VUL12_END:1807case AFE_IRQ3_MCU_CNT_MON:1808case AFE_IRQ4_MCU_CNT_MON:1809case AFE_IRQ_MCU_STATUS:1810case AFE_IRQ_MCU_CLR:1811case AFE_IRQ_MCU_MON2:1812case AFE_IRQ1_MCU_CNT_MON:1813case AFE_IRQ2_MCU_CNT_MON:1814case AFE_IRQ5_MCU_CNT_MON:1815case AFE_IRQ7_MCU_CNT_MON:1816case AFE_IRQ_MCU_MISS_CLR:1817case AFE_GAIN1_CUR:1818case AFE_GAIN2_CUR:1819case AFE_SRAM_DELSEL_CON1:1820case PCM_INTF_CON2:1821case FPGA_CFG0:1822case FPGA_CFG1:1823case FPGA_CFG2:1824case FPGA_CFG3:1825case AUDIO_TOP_DBG_MON0:1826case AUDIO_TOP_DBG_MON1:1827case AFE_IRQ8_MCU_CNT_MON:1828case AFE_IRQ11_MCU_CNT_MON:1829case AFE_IRQ12_MCU_CNT_MON:1830case AFE_IRQ9_MCU_CNT_MON:1831case AFE_IRQ10_MCU_CNT_MON:1832case AFE_IRQ13_MCU_CNT_MON:1833case AFE_IRQ14_MCU_CNT_MON:1834case AFE_IRQ15_MCU_CNT_MON:1835case AFE_IRQ16_MCU_CNT_MON:1836case AFE_IRQ17_MCU_CNT_MON:1837case AFE_IRQ18_MCU_CNT_MON:1838case AFE_IRQ19_MCU_CNT_MON:1839case AFE_IRQ20_MCU_CNT_MON:1840case AFE_IRQ21_MCU_CNT_MON:1841case AFE_IRQ22_MCU_CNT_MON:1842case AFE_IRQ23_MCU_CNT_MON:1843case AFE_IRQ24_MCU_CNT_MON:1844case AFE_IRQ25_MCU_CNT_MON:1845case AFE_IRQ26_MCU_CNT_MON:1846case AFE_IRQ31_MCU_CNT_MON:1847case AFE_CBIP_MON0:1848case AFE_CBIP_SLV_MUX_MON0:1849case AFE_CBIP_SLV_DECODER_MON0:1850case AFE_ADDA6_MTKAIF_MON0:1851case AFE_ADDA6_MTKAIF_MON1:1852case AFE_AWB_CUR_MSB:1853case AFE_AWB_CUR:1854case AFE_AWB_END:1855case AFE_AWB2_CUR_MSB:1856case AFE_AWB2_CUR:1857case AFE_AWB2_END:1858case AFE_DAI_CUR_MSB:1859case AFE_DAI_CUR:1860case AFE_DAI_END:1861case AFE_DAI2_CUR_MSB:1862case AFE_DAI2_CUR:1863case AFE_DAI2_END:1864case AFE_ADDA6_SRC_DEBUG_MON0:1865case AFE_ADD6A_UL_SRC_MON0:1866case AFE_ADDA6_UL_SRC_MON1:1867case AFE_MOD_DAI_CUR_MSB:1868case AFE_MOD_DAI_CUR:1869case AFE_MOD_DAI_END:1870case AFE_HDMI_OUT_CUR_MSB:1871case AFE_HDMI_OUT_CUR:1872case AFE_HDMI_OUT_END:1873case AFE_AWB_RCH_MON:1874case AFE_AWB_LCH_MON:1875case AFE_VUL_RCH_MON:1876case AFE_VUL_LCH_MON:1877case AFE_VUL12_RCH_MON:1878case AFE_VUL12_LCH_MON:1879case AFE_VUL2_RCH_MON:1880case AFE_VUL2_LCH_MON:1881case AFE_DAI_DATA_MON:1882case AFE_MOD_DAI_DATA_MON:1883case AFE_DAI2_DATA_MON:1884case AFE_AWB2_RCH_MON:1885case AFE_AWB2_LCH_MON:1886case AFE_VUL3_RCH_MON:1887case AFE_VUL3_LCH_MON:1888case AFE_VUL4_RCH_MON:1889case AFE_VUL4_LCH_MON:1890case AFE_VUL5_RCH_MON:1891case AFE_VUL5_LCH_MON:1892case AFE_VUL6_RCH_MON:1893case AFE_VUL6_LCH_MON:1894case AFE_DL1_RCH_MON:1895case AFE_DL1_LCH_MON:1896case AFE_DL2_RCH_MON:1897case AFE_DL2_LCH_MON:1898case AFE_DL12_RCH1_MON:1899case AFE_DL12_LCH1_MON:1900case AFE_DL12_RCH2_MON:1901case AFE_DL12_LCH2_MON:1902case AFE_DL3_RCH_MON:1903case AFE_DL3_LCH_MON:1904case AFE_DL4_RCH_MON:1905case AFE_DL4_LCH_MON:1906case AFE_DL5_RCH_MON:1907case AFE_DL5_LCH_MON:1908case AFE_DL6_RCH_MON:1909case AFE_DL6_LCH_MON:1910case AFE_DL7_RCH_MON:1911case AFE_DL7_LCH_MON:1912case AFE_DL8_RCH_MON:1913case AFE_DL8_LCH_MON:1914case AFE_VUL5_CUR_MSB:1915case AFE_VUL5_CUR:1916case AFE_VUL5_END:1917case AFE_VUL6_CUR_MSB:1918case AFE_VUL6_CUR:1919case AFE_VUL6_END:1920case AFE_ADDA_DL_SDM_FIFO_MON:1921case AFE_ADDA_DL_SRC_LCH_MON:1922case AFE_ADDA_DL_SRC_RCH_MON:1923case AFE_ADDA_DL_SDM_OUT_MON:1924case AFE_CONNSYS_I2S_MON:1925case AFE_ASRC_2CH_CON0:1926case AFE_ASRC_2CH_CON2:1927case AFE_ASRC_2CH_CON3:1928case AFE_ASRC_2CH_CON4:1929case AFE_ASRC_2CH_CON5:1930case AFE_ASRC_2CH_CON7:1931case AFE_ASRC_2CH_CON8:1932case AFE_ASRC_2CH_CON12:1933case AFE_ASRC_2CH_CON13:1934case AFE_DL9_CUR_MSB:1935case AFE_DL9_CUR:1936case AFE_DL9_END:1937case AFE_ADDA_MTKAIF_MON0:1938case AFE_ADDA_MTKAIF_MON1:1939case AFE_DL_NLE_R_MON0:1940case AFE_DL_NLE_R_MON1:1941case AFE_DL_NLE_R_MON2:1942case AFE_DL_NLE_L_MON0:1943case AFE_DL_NLE_L_MON1:1944case AFE_DL_NLE_L_MON2:1945case AFE_GENERAL1_ASRC_2CH_CON0:1946case AFE_GENERAL1_ASRC_2CH_CON2:1947case AFE_GENERAL1_ASRC_2CH_CON3:1948case AFE_GENERAL1_ASRC_2CH_CON4:1949case AFE_GENERAL1_ASRC_2CH_CON5:1950case AFE_GENERAL1_ASRC_2CH_CON7:1951case AFE_GENERAL1_ASRC_2CH_CON8:1952case AFE_GENERAL1_ASRC_2CH_CON12:1953case AFE_GENERAL1_ASRC_2CH_CON13:1954case AFE_GENERAL2_ASRC_2CH_CON0:1955case AFE_GENERAL2_ASRC_2CH_CON2:1956case AFE_GENERAL2_ASRC_2CH_CON3:1957case AFE_GENERAL2_ASRC_2CH_CON4:1958case AFE_GENERAL2_ASRC_2CH_CON5:1959case AFE_GENERAL2_ASRC_2CH_CON7:1960case AFE_GENERAL2_ASRC_2CH_CON8:1961case AFE_GENERAL2_ASRC_2CH_CON12:1962case AFE_GENERAL2_ASRC_2CH_CON13:1963case AFE_DL9_RCH_MON:1964case AFE_DL9_LCH_MON:1965case AFE_DL5_CUR_MSB:1966case AFE_DL5_CUR:1967case AFE_DL5_END:1968case AFE_DL6_CUR_MSB:1969case AFE_DL6_CUR:1970case AFE_DL6_END:1971case AFE_DL7_CUR_MSB:1972case AFE_DL7_CUR:1973case AFE_DL7_END:1974case AFE_DL8_CUR_MSB:1975case AFE_DL8_CUR:1976case AFE_DL8_END:1977case AFE_PROT_SIDEBAND_MON:1978case AFE_DOMAIN_SIDEBAND0_MON:1979case AFE_DOMAIN_SIDEBAND1_MON:1980case AFE_DOMAIN_SIDEBAND2_MON:1981case AFE_DOMAIN_SIDEBAND3_MON:1982case AFE_APLL1_TUNER_CFG: /* [20:31] is monitor */1983case AFE_APLL2_TUNER_CFG: /* [20:31] is monitor */1984case AFE_DAC_CON0:1985case AFE_IRQ_MCU_CON0:1986case AFE_IRQ_MCU_EN:1987return true;1988default:1989return false;1990};1991}19921993static const struct regmap_config mt8192_afe_regmap_config = {1994.reg_bits = 32,1995.reg_stride = 4,1996.val_bits = 32,1997.volatile_reg = mt8192_is_volatile_reg,1998.max_register = AFE_MAX_REGISTER,1999.num_reg_defaults_raw = AFE_MAX_REGISTER,2000.cache_type = REGCACHE_FLAT,2001};20022003static irqreturn_t mt8192_afe_irq_handler(int irq_id, void *dev)2004{2005struct mtk_base_afe *afe = dev;2006struct mtk_base_afe_irq *irq;2007unsigned int status;2008unsigned int status_mcu;2009unsigned int mcu_en;2010int ret;2011int i;20122013/* get irq that is sent to MCU */2014regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_en);20152016ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &status);2017/* only care IRQ which is sent to MCU */2018status_mcu = status & mcu_en & AFE_IRQ_STATUS_BITS;20192020if (ret || status_mcu == 0) {2021dev_err(afe->dev, "%s(), irq status err, ret %d, status 0x%x, mcu_en 0x%x\n",2022__func__, ret, status, mcu_en);20232024goto err_irq;2025}20262027for (i = 0; i < MT8192_MEMIF_NUM; i++) {2028struct mtk_base_afe_memif *memif = &afe->memif[i];20292030if (!memif->substream)2031continue;20322033if (memif->irq_usage < 0)2034continue;20352036irq = &afe->irqs[memif->irq_usage];20372038if (status_mcu & (1 << irq->irq_data->irq_en_shift))2039snd_pcm_period_elapsed(memif->substream);2040}20412042err_irq:2043/* clear irq */2044regmap_write(afe->regmap,2045AFE_IRQ_MCU_CLR,2046status_mcu);20472048return IRQ_HANDLED;2049}20502051static int mt8192_afe_runtime_suspend(struct device *dev)2052{2053struct mtk_base_afe *afe = dev_get_drvdata(dev);2054struct mt8192_afe_private *afe_priv = afe->platform_priv;2055unsigned int value;2056int ret;20572058if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)2059goto skip_regmap;20602061/* disable AFE */2062regmap_update_bits(afe->regmap, AFE_DAC_CON0, AFE_ON_MASK_SFT, 0x0);20632064ret = regmap_read_poll_timeout(afe->regmap,2065AFE_DAC_MON,2066value,2067(value & AFE_ON_RETM_MASK_SFT) == 0,206820,20691 * 1000 * 1000);2070if (ret)2071dev_warn(afe->dev, "%s(), ret %d\n", __func__, ret);20722073/* make sure all irq status are cleared */2074regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 0xffffffff);2075regmap_write(afe->regmap, AFE_IRQ_MCU_CLR, 0xffffffff);20762077/* reset sgen */2078regmap_write(afe->regmap, AFE_SINEGEN_CON0, 0x0);2079regmap_update_bits(afe->regmap, AFE_SINEGEN_CON2,2080INNER_LOOP_BACK_MODE_MASK_SFT,20810x3f << INNER_LOOP_BACK_MODE_SFT);20822083/* cache only */2084regcache_cache_only(afe->regmap, true);2085regcache_mark_dirty(afe->regmap);20862087skip_regmap:2088mt8192_afe_disable_clock(afe);2089return 0;2090}20912092static int mt8192_afe_runtime_resume(struct device *dev)2093{2094struct mtk_base_afe *afe = dev_get_drvdata(dev);2095struct mt8192_afe_private *afe_priv = afe->platform_priv;2096int ret;20972098ret = mt8192_afe_enable_clock(afe);2099if (ret)2100return ret;21012102if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl)2103goto skip_regmap;21042105regcache_cache_only(afe->regmap, false);2106regcache_sync(afe->regmap);21072108/* enable audio sys DCM for power saving */2109regmap_update_bits(afe_priv->infracfg,2110PERI_BUS_DCM_CTRL, 0x1 << 29, 0x1 << 29);2111regmap_update_bits(afe->regmap, AUDIO_TOP_CON0, 0x1 << 29, 0x1 << 29);21122113/* force cpu use 8_24 format when writing 32bit data */2114regmap_update_bits(afe->regmap, AFE_MEMIF_CON0,2115CPU_HD_ALIGN_MASK_SFT, 0 << CPU_HD_ALIGN_SFT);21162117/* set all output port to 24bit */2118regmap_write(afe->regmap, AFE_CONN_24BIT, 0xffffffff);2119regmap_write(afe->regmap, AFE_CONN_24BIT_1, 0xffffffff);21202121/* enable AFE */2122regmap_update_bits(afe->regmap, AFE_DAC_CON0, AFE_ON_MASK_SFT, 0x1);21232124skip_regmap:2125return 0;2126}21272128static int mt8192_dai_memif_register(struct mtk_base_afe *afe)2129{2130struct mtk_base_afe_dai *dai;21312132dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);2133if (!dai)2134return -ENOMEM;21352136list_add(&dai->list, &afe->sub_dais);21372138dai->dai_drivers = mt8192_memif_dai_driver;2139dai->num_dai_drivers = ARRAY_SIZE(mt8192_memif_dai_driver);21402141dai->dapm_widgets = mt8192_memif_widgets;2142dai->num_dapm_widgets = ARRAY_SIZE(mt8192_memif_widgets);2143dai->dapm_routes = mt8192_memif_routes;2144dai->num_dapm_routes = ARRAY_SIZE(mt8192_memif_routes);2145return 0;2146}21472148typedef int (*dai_register_cb)(struct mtk_base_afe *);2149static const dai_register_cb dai_register_cbs[] = {2150mt8192_dai_adda_register,2151mt8192_dai_i2s_register,2152mt8192_dai_pcm_register,2153mt8192_dai_tdm_register,2154mt8192_dai_memif_register,2155};21562157static int mt8192_afe_pcm_dev_probe(struct platform_device *pdev)2158{2159struct mtk_base_afe *afe;2160struct mt8192_afe_private *afe_priv;2161struct device *dev = &pdev->dev;2162struct reset_control *rstc;2163int i, ret, irq_id;21642165ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(34));2166if (ret)2167return ret;21682169afe = devm_kzalloc(dev, sizeof(*afe), GFP_KERNEL);2170if (!afe)2171return -ENOMEM;2172platform_set_drvdata(pdev, afe);21732174afe->platform_priv = devm_kzalloc(dev, sizeof(*afe_priv),2175GFP_KERNEL);2176if (!afe->platform_priv)2177return -ENOMEM;2178afe_priv = afe->platform_priv;21792180afe->dev = dev;21812182ret = of_reserved_mem_device_init(dev);2183if (ret) {2184dev_info(dev, "no reserved memory found, pre-allocating buffers instead\n");2185afe->preallocate_buffers = true;2186}21872188/* init audio related clock */2189ret = mt8192_init_clock(afe);2190if (ret) {2191dev_err(dev, "init clock error\n");2192return ret;2193}21942195/* reset controller to reset audio regs before regmap cache */2196rstc = devm_reset_control_get_exclusive(dev, "audiosys");2197if (IS_ERR(rstc))2198return dev_err_probe(dev, PTR_ERR(rstc), "could not get audiosys reset\n");21992200ret = reset_control_reset(rstc);2201if (ret)2202return dev_err_probe(dev, ret, "failed to trigger audio reset\n");22032204ret = devm_pm_runtime_enable(dev);2205if (ret)2206return ret;22072208/* regmap init */2209afe->regmap = syscon_node_to_regmap(dev->parent->of_node);2210if (IS_ERR(afe->regmap))2211return dev_err_probe(dev, PTR_ERR(afe->regmap),2212"could not get regmap from parent");22132214ret = regmap_attach_dev(dev, afe->regmap, &mt8192_afe_regmap_config);2215if (ret)2216return dev_err_probe(dev, ret, "regmap_attach_dev fail\n");22172218/* enable clock for regcache get default value from hw */2219afe_priv->pm_runtime_bypass_reg_ctl = true;2220pm_runtime_get_sync(dev);22212222ret = regmap_reinit_cache(afe->regmap, &mt8192_afe_regmap_config);2223if (ret)2224return dev_err_probe(dev, ret, "regmap_reinit_cache fail\n");22252226pm_runtime_put_sync(dev);2227afe_priv->pm_runtime_bypass_reg_ctl = false;22282229regcache_cache_only(afe->regmap, true);2230regcache_mark_dirty(afe->regmap);22312232/* init memif */2233afe->memif_size = MT8192_MEMIF_NUM;2234afe->memif = devm_kcalloc(dev, afe->memif_size, sizeof(*afe->memif),2235GFP_KERNEL);2236if (!afe->memif)2237return -ENOMEM;22382239for (i = 0; i < afe->memif_size; i++) {2240afe->memif[i].data = &memif_data[i];2241afe->memif[i].irq_usage = memif_irq_usage[i];2242afe->memif[i].const_irq = 1;2243}22442245mutex_init(&afe->irq_alloc_lock); /* needed when dynamic irq */22462247/* init irq */2248afe->irqs_size = MT8192_IRQ_NUM;2249afe->irqs = devm_kcalloc(dev, afe->irqs_size, sizeof(*afe->irqs),2250GFP_KERNEL);2251if (!afe->irqs)2252return -ENOMEM;22532254for (i = 0; i < afe->irqs_size; i++)2255afe->irqs[i].irq_data = &irq_data[i];22562257/* request irq */2258irq_id = platform_get_irq(pdev, 0);2259if (irq_id < 0)2260return irq_id;22612262ret = devm_request_irq(dev, irq_id, mt8192_afe_irq_handler,2263IRQF_TRIGGER_NONE, "asys-isr", (void *)afe);2264if (ret)2265return dev_err_probe(dev, ret, "could not request_irq for Afe_ISR_Handle\n");22662267/* init sub_dais */2268INIT_LIST_HEAD(&afe->sub_dais);22692270for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {2271ret = dai_register_cbs[i](afe);2272if (ret)2273return dev_err_probe(afe->dev, ret, "dai %d register fail", i);2274}22752276/* init dai_driver and component_driver */2277ret = mtk_afe_combine_sub_dai(afe);2278if (ret)2279return dev_err_probe(afe->dev, ret, "mtk_afe_combine_sub_dai fail\n");22802281/* others */2282afe->mtk_afe_hardware = &mt8192_afe_hardware;2283afe->memif_fs = mt8192_memif_fs;2284afe->irq_fs = mt8192_irq_fs;2285afe->get_dai_fs = mt8192_get_dai_fs;2286afe->get_memif_pbuf_size = mt8192_get_memif_pbuf_size;2287afe->memif_32bit_supported = 1;22882289afe->runtime_resume = mt8192_afe_runtime_resume;2290afe->runtime_suspend = mt8192_afe_runtime_suspend;22912292/* register platform */2293ret = devm_snd_soc_register_component(dev,2294&mtk_afe_pcm_platform,2295afe->dai_drivers,2296afe->num_dai_drivers);2297if (ret)2298return dev_err_probe(dev, ret, "Couldn't register AFE component\n");22992300return 0;2301}23022303static void mt8192_afe_pcm_dev_remove(struct platform_device *pdev)2304{2305struct mtk_base_afe *afe = platform_get_drvdata(pdev);23062307pm_runtime_disable(&pdev->dev);2308if (!pm_runtime_status_suspended(&pdev->dev))2309mt8192_afe_runtime_suspend(&pdev->dev);23102311/* disable afe clock */2312mt8192_afe_disable_clock(afe);2313}23142315static const struct of_device_id mt8192_afe_pcm_dt_match[] = {2316{ .compatible = "mediatek,mt8192-audio", },2317{},2318};2319MODULE_DEVICE_TABLE(of, mt8192_afe_pcm_dt_match);23202321static const struct dev_pm_ops mt8192_afe_pm_ops = {2322RUNTIME_PM_OPS(mt8192_afe_runtime_suspend,2323mt8192_afe_runtime_resume, NULL)2324};23252326static struct platform_driver mt8192_afe_pcm_driver = {2327.driver = {2328.name = "mt8192-audio",2329.of_match_table = mt8192_afe_pcm_dt_match,2330.pm = pm_ptr(&mt8192_afe_pm_ops),2331},2332.probe = mt8192_afe_pcm_dev_probe,2333.remove = mt8192_afe_pcm_dev_remove,2334};23352336module_platform_driver(mt8192_afe_pcm_driver);23372338MODULE_DESCRIPTION("Mediatek ALSA SoC AFE platform driver for 8192");2339MODULE_AUTHOR("Shane Chien <[email protected]>");2340MODULE_LICENSE("GPL v2");234123422343