Path: blob/master/sound/soc/mediatek/mt8365/mt8365-afe-common.h
26488 views
/* SPDX-License-Identifier: GPL-2.01*2* MediaTek 8365 audio driver common definitions3*4* Copyright (c) 2024 MediaTek Inc.5* Authors: Jia Zeng <[email protected]>6* Alexandre Mergnat <[email protected]>7*/89#ifndef _MT8365_AFE_COMMON_H_10#define _MT8365_AFE_COMMON_H_1112#include <linux/clk.h>13#include <linux/list.h>14#include <linux/regmap.h>15#include <sound/soc.h>16#include <sound/asound.h>17#include "../common/mtk-base-afe.h"18#include "mt8365-reg.h"1920enum {21MT8365_AFE_MEMIF_DL1,22MT8365_AFE_MEMIF_DL2,23MT8365_AFE_MEMIF_TDM_OUT,24/*25* MT8365_AFE_MEMIF_SPDIF_OUT,26*/27MT8365_AFE_MEMIF_AWB,28MT8365_AFE_MEMIF_VUL,29MT8365_AFE_MEMIF_VUL2,30MT8365_AFE_MEMIF_VUL3,31MT8365_AFE_MEMIF_TDM_IN,32/*33* MT8365_AFE_MEMIF_SPDIF_IN,34*/35MT8365_AFE_MEMIF_NUM,36MT8365_AFE_BACKEND_BASE = MT8365_AFE_MEMIF_NUM,37MT8365_AFE_IO_TDM_OUT = MT8365_AFE_BACKEND_BASE,38MT8365_AFE_IO_TDM_IN,39MT8365_AFE_IO_I2S,40MT8365_AFE_IO_2ND_I2S,41MT8365_AFE_IO_PCM1,42MT8365_AFE_IO_VIRTUAL_DL_SRC,43MT8365_AFE_IO_VIRTUAL_TDM_OUT_SRC,44MT8365_AFE_IO_VIRTUAL_FM,45MT8365_AFE_IO_DMIC,46MT8365_AFE_IO_INT_ADDA,47MT8365_AFE_IO_GASRC1,48MT8365_AFE_IO_GASRC2,49MT8365_AFE_IO_TDM_ASRC,50MT8365_AFE_IO_HW_GAIN1,51MT8365_AFE_IO_HW_GAIN2,52MT8365_AFE_BACKEND_END,53MT8365_AFE_BACKEND_NUM = (MT8365_AFE_BACKEND_END -54MT8365_AFE_BACKEND_BASE),55};5657enum {58MT8365_AFE_IRQ1,59MT8365_AFE_IRQ2,60MT8365_AFE_IRQ3,61MT8365_AFE_IRQ4,62MT8365_AFE_IRQ5,63MT8365_AFE_IRQ6,64MT8365_AFE_IRQ7,65MT8365_AFE_IRQ8,66MT8365_AFE_IRQ9,67MT8365_AFE_IRQ10,68MT8365_AFE_IRQ_NUM,69};7071enum {72MT8365_TOP_CG_AFE,73MT8365_TOP_CG_I2S_IN,74MT8365_TOP_CG_22M,75MT8365_TOP_CG_24M,76MT8365_TOP_CG_INTDIR_CK,77MT8365_TOP_CG_APLL2_TUNER,78MT8365_TOP_CG_APLL_TUNER,79MT8365_TOP_CG_SPDIF,80MT8365_TOP_CG_TDM_OUT,81MT8365_TOP_CG_TDM_IN,82MT8365_TOP_CG_ADC,83MT8365_TOP_CG_DAC,84MT8365_TOP_CG_DAC_PREDIS,85MT8365_TOP_CG_TML,86MT8365_TOP_CG_I2S1_BCLK,87MT8365_TOP_CG_I2S2_BCLK,88MT8365_TOP_CG_I2S3_BCLK,89MT8365_TOP_CG_I2S4_BCLK,90MT8365_TOP_CG_DMIC0_ADC,91MT8365_TOP_CG_DMIC1_ADC,92MT8365_TOP_CG_DMIC2_ADC,93MT8365_TOP_CG_DMIC3_ADC,94MT8365_TOP_CG_CONNSYS_I2S_ASRC,95MT8365_TOP_CG_GENERAL1_ASRC,96MT8365_TOP_CG_GENERAL2_ASRC,97MT8365_TOP_CG_TDM_ASRC,98MT8365_TOP_CG_NUM99};100101enum {102MT8365_CLK_TOP_AUD_SEL,103MT8365_CLK_AUD_I2S0_M,104MT8365_CLK_AUD_I2S1_M,105MT8365_CLK_AUD_I2S2_M,106MT8365_CLK_AUD_I2S3_M,107MT8365_CLK_ENGEN1,108MT8365_CLK_ENGEN2,109MT8365_CLK_AUD1,110MT8365_CLK_AUD2,111MT8365_CLK_I2S0_M_SEL,112MT8365_CLK_I2S1_M_SEL,113MT8365_CLK_I2S2_M_SEL,114MT8365_CLK_I2S3_M_SEL,115MT8365_CLK_CLK26M,116MT8365_CLK_NUM117};118119enum {120MT8365_AFE_APLL1 = 0,121MT8365_AFE_APLL2,122MT8365_AFE_APLL_NUM,123};124125enum {126MT8365_AFE_1ST_I2S = 0,127MT8365_AFE_2ND_I2S,128MT8365_AFE_I2S_SETS,129};130131enum {132MT8365_AFE_I2S_SEPARATE_CLOCK = 0,133MT8365_AFE_I2S_SHARED_CLOCK,134};135136enum {137MT8365_AFE_TDM_OUT_I2S = 0,138MT8365_AFE_TDM_OUT_TDM,139MT8365_AFE_TDM_OUT_I2S_32BITS,140};141142enum mt8365_afe_tdm_ch_start {143AFE_TDM_CH_START_O28_O29 = 0,144AFE_TDM_CH_START_O30_O31,145AFE_TDM_CH_START_O32_O33,146AFE_TDM_CH_START_O34_O35,147AFE_TDM_CH_ZERO,148};149150enum {151MT8365_PCM_FORMAT_I2S = 0,152MT8365_PCM_FORMAT_EIAJ,153MT8365_PCM_FORMAT_PCMA,154MT8365_PCM_FORMAT_PCMB,155};156157enum {158MT8365_FS_8K = 0,159MT8365_FS_11D025K,160MT8365_FS_12K,161MT8365_FS_384K,162MT8365_FS_16K,163MT8365_FS_22D05K,164MT8365_FS_24K,165MT8365_FS_130K,166MT8365_FS_32K,167MT8365_FS_44D1K,168MT8365_FS_48K,169MT8365_FS_88D2K,170MT8365_FS_96K,171MT8365_FS_176D4K,172MT8365_FS_192K,173};174175enum {176FS_8000HZ = 0, /* 0000b */177FS_11025HZ = 1, /* 0001b */178FS_12000HZ = 2, /* 0010b */179FS_384000HZ = 3, /* 0011b */180FS_16000HZ = 4, /* 0100b */181FS_22050HZ = 5, /* 0101b */182FS_24000HZ = 6, /* 0110b */183FS_130000HZ = 7, /* 0111b */184FS_32000HZ = 8, /* 1000b */185FS_44100HZ = 9, /* 1001b */186FS_48000HZ = 10, /* 1010b */187FS_88200HZ = 11, /* 1011b */188FS_96000HZ = 12, /* 1100b */189FS_176400HZ = 13, /* 1101b */190FS_192000HZ = 14, /* 1110b */191FS_260000HZ = 15, /* 1111b */192};193194enum {195MT8365_AFE_DEBUGFS_AFE,196MT8365_AFE_DEBUGFS_MEMIF,197MT8365_AFE_DEBUGFS_IRQ,198MT8365_AFE_DEBUGFS_CONN,199MT8365_AFE_DEBUGFS_DBG,200MT8365_AFE_DEBUGFS_NUM,201};202203enum {204MT8365_AFE_IRQ_DIR_MCU = 0,205MT8365_AFE_IRQ_DIR_DSP,206MT8365_AFE_IRQ_DIR_BOTH,207};208209/* MCLK */210enum {211MT8365_I2S0_MCK = 0,212MT8365_I2S3_MCK,213MT8365_MCK_NUM,214};215216struct mt8365_fe_dai_data {217bool use_sram;218unsigned int sram_phy_addr;219void __iomem *sram_vir_addr;220unsigned int sram_size;221};222223struct mt8365_be_dai_data {224bool prepared[SNDRV_PCM_STREAM_LAST + 1];225unsigned int fmt_mode;226};227228#define MT8365_CLK_26M 26000000229#define MT8365_CLK_24M 24000000230#define MT8365_CLK_22M 22000000231#define MT8365_CM_UPDATA_CNT_SET 8232233enum mt8365_cm_num {234MT8365_CM1 = 0,235MT8365_CM2,236MT8365_CM_NUM,237};238239enum mt8365_cm2_mux_in {240MT8365_FROM_GASRC1 = 1,241MT8365_FROM_GASRC2,242MT8365_FROM_TDM_ASRC,243MT8365_CM_MUX_NUM,244};245246enum cm2_mux_conn_in {247GENERAL2_ASRC_OUT_LCH = 0,248GENERAL2_ASRC_OUT_RCH = 1,249TDM_IN_CH0 = 2,250TDM_IN_CH1 = 3,251TDM_IN_CH2 = 4,252TDM_IN_CH3 = 5,253TDM_IN_CH4 = 6,254TDM_IN_CH5 = 7,255TDM_IN_CH6 = 8,256TDM_IN_CH7 = 9,257GENERAL1_ASRC_OUT_LCH = 10,258GENERAL1_ASRC_OUT_RCH = 11,259TDM_OUT_ASRC_CH0 = 12,260TDM_OUT_ASRC_CH1 = 13,261TDM_OUT_ASRC_CH2 = 14,262TDM_OUT_ASRC_CH3 = 15,263TDM_OUT_ASRC_CH4 = 16,264TDM_OUT_ASRC_CH5 = 17,265TDM_OUT_ASRC_CH6 = 18,266TDM_OUT_ASRC_CH7 = 19267};268269struct mt8365_cm_ctrl_reg {270unsigned int con0;271unsigned int con1;272unsigned int con2;273unsigned int con3;274unsigned int con4;275};276277struct mt8365_control_data {278bool bypass_cm1;279bool bypass_cm2;280unsigned int loopback_type;281};282283enum dmic_input_mode {284DMIC_MODE_3P25M = 0,285DMIC_MODE_1P625M,286DMIC_MODE_812P5K,287DMIC_MODE_406P25K,288};289290enum iir_mode {291IIR_MODE0 = 0,292IIR_MODE1,293IIR_MODE2,294IIR_MODE3,295IIR_MODE4,296IIR_MODE5,297};298299enum {300MT8365_GASRC1 = 0,301MT8365_GASRC2,302MT8365_GASRC_NUM,303MT8365_TDM_ASRC1 = MT8365_GASRC_NUM,304MT8365_TDM_ASRC2,305MT8365_TDM_ASRC3,306MT8365_TDM_ASRC4,307MT8365_TDM_ASRC_NUM,308};309310struct mt8365_gasrc_ctrl_reg {311unsigned int con0;312unsigned int con2;313unsigned int con3;314unsigned int con4;315unsigned int con5;316unsigned int con6;317unsigned int con9;318unsigned int con10;319unsigned int con12;320unsigned int con13;321};322323struct mt8365_gasrc_data {324bool duplex;325bool tx_mode;326bool cali_on;327bool tdm_asrc_out_cm2;328bool iir_on;329};330331struct mt8365_afe_private {332struct clk *clocks[MT8365_CLK_NUM];333struct regmap *topckgen;334struct mt8365_fe_dai_data fe_data[MT8365_AFE_MEMIF_NUM];335struct mt8365_be_dai_data be_data[MT8365_AFE_BACKEND_NUM];336struct mt8365_control_data ctrl_data;337struct mt8365_gasrc_data gasrc_data[MT8365_TDM_ASRC_NUM];338int afe_on_ref_cnt;339int top_cg_ref_cnt[MT8365_TOP_CG_NUM];340void __iomem *afe_sram_vir_addr;341unsigned int afe_sram_phy_addr;342unsigned int afe_sram_size;343/* locks */344spinlock_t afe_ctrl_lock;345struct mutex afe_clk_mutex; /* Protect & sync APLL TUNER registers access*/346#ifdef CONFIG_DEBUG_FS347struct dentry *debugfs_dentry[MT8365_AFE_DEBUGFS_NUM];348#endif349int apll_tuner_ref_cnt[MT8365_AFE_APLL_NUM];350unsigned int tdm_out_mode;351unsigned int cm2_mux_input;352353/* dai */354bool dai_on[MT8365_AFE_BACKEND_END];355void *dai_priv[MT8365_AFE_BACKEND_END];356};357358static inline u32 rx_frequency_palette(unsigned int fs)359{360/* *361* A = (26M / fs) * 64362* B = 8125 / A363* return = DEC2HEX(B * 2^23)364*/365switch (fs) {366case FS_8000HZ: return 0x050000;367case FS_11025HZ: return 0x06E400;368case FS_12000HZ: return 0x078000;369case FS_16000HZ: return 0x0A0000;370case FS_22050HZ: return 0x0DC800;371case FS_24000HZ: return 0x0F0000;372case FS_32000HZ: return 0x140000;373case FS_44100HZ: return 0x1B9000;374case FS_48000HZ: return 0x1E0000;375case FS_88200HZ: return 0x372000;376case FS_96000HZ: return 0x3C0000;377case FS_176400HZ: return 0x6E4000;378case FS_192000HZ: return 0x780000;379default: return 0x0;380}381}382383static inline u32 AutoRstThHi(unsigned int fs)384{385switch (fs) {386case FS_8000HZ: return 0x36000;387case FS_11025HZ: return 0x27000;388case FS_12000HZ: return 0x24000;389case FS_16000HZ: return 0x1B000;390case FS_22050HZ: return 0x14000;391case FS_24000HZ: return 0x12000;392case FS_32000HZ: return 0x0D800;393case FS_44100HZ: return 0x09D00;394case FS_48000HZ: return 0x08E00;395case FS_88200HZ: return 0x04E00;396case FS_96000HZ: return 0x04800;397case FS_176400HZ: return 0x02700;398case FS_192000HZ: return 0x02400;399default: return 0x0;400}401}402403static inline u32 AutoRstThLo(unsigned int fs)404{405switch (fs) {406case FS_8000HZ: return 0x30000;407case FS_11025HZ: return 0x23000;408case FS_12000HZ: return 0x20000;409case FS_16000HZ: return 0x18000;410case FS_22050HZ: return 0x11000;411case FS_24000HZ: return 0x0FE00;412case FS_32000HZ: return 0x0BE00;413case FS_44100HZ: return 0x08A00;414case FS_48000HZ: return 0x07F00;415case FS_88200HZ: return 0x04500;416case FS_96000HZ: return 0x04000;417case FS_176400HZ: return 0x02300;418case FS_192000HZ: return 0x02000;419default: return 0x0;420}421}422423bool mt8365_afe_rate_supported(unsigned int rate, unsigned int id);424bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id);425426int mt8365_dai_i2s_register(struct mtk_base_afe *afe);427int mt8365_dai_set_priv(struct mtk_base_afe *afe,428int id,429int priv_size,430const void *priv_data);431432int mt8365_afe_fs_timing(unsigned int rate);433434void mt8365_afe_set_i2s_out_enable(struct mtk_base_afe *afe, bool enable);435int mt8365_afe_set_i2s_out(struct mtk_base_afe *afe, unsigned int rate, int bit_width);436437int mt8365_dai_adda_register(struct mtk_base_afe *afe);438int mt8365_dai_enable_adda_on(struct mtk_base_afe *afe);439int mt8365_dai_disable_adda_on(struct mtk_base_afe *afe);440441int mt8365_dai_dmic_register(struct mtk_base_afe *afe);442443int mt8365_dai_pcm_register(struct mtk_base_afe *afe);444445int mt8365_dai_tdm_register(struct mtk_base_afe *afe);446447#endif448449450