{ .rate = 352800, .reg_value = 21, },
};
+static bool mt8195_afe_etdm_is_valid(int id)
+{
+ switch (id) {
+ case MT8195_AFE_IO_ETDM1_IN:
+ fallthrough;
+ case MT8195_AFE_IO_ETDM2_IN:
+ fallthrough;
+ case MT8195_AFE_IO_ETDM1_OUT:
+ fallthrough;
+ case MT8195_AFE_IO_ETDM2_OUT:
+ fallthrough;
+ case MT8195_AFE_IO_DPTX:
+ fallthrough;
+ case MT8195_AFE_IO_ETDM3_OUT:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static bool mt8195_afe_hdmitx_dptx_is_valid(int id)
+{
+ switch (id) {
+ case MT8195_AFE_IO_DPTX:
+ fallthrough;
+ case MT8195_AFE_IO_ETDM3_OUT:
+ return true;
+ default:
+ return false;
+ }
+}
+
static int get_etdm_fs_timing(unsigned int rate)
{
int i;
{
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
+ struct mtk_dai_etdm_priv *etdm_data;
+ if (!mt8195_afe_etdm_is_valid(dai->id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai->id];
return (etdm_data->cowork_slv_count > 0 ||
etdm_data->cowork_source_id != COWORK_ETDM_NONE);
}
{
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
- int dai_id = etdm_data->cowork_source_id;
+ struct mtk_dai_etdm_priv *etdm_data;
+ int dai_id;
+
+ if (!mt8195_afe_etdm_is_valid(dai->id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai->id];
+ dai_id = etdm_data->cowork_source_id;
if (dai_id == COWORK_ETDM_NONE)
dai_id = dai->id;
int ret = 0;
struct etdm_con_reg etdm_reg;
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
+ struct mtk_dai_etdm_priv *etdm_data;
unsigned long flags;
+ if (!mt8195_afe_etdm_is_valid(dai_id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai_id];
spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
etdm_data->en_ref_cnt++;
if (etdm_data->en_ref_cnt == 1) {
int ret = 0;
struct etdm_con_reg etdm_reg;
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
+ struct mtk_dai_etdm_priv *etdm_data;
unsigned long flags;
+ if (!mt8195_afe_etdm_is_valid(dai_id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai_id];
spin_lock_irqsave(&afe_priv->afe_ctrl_lock, flags);
if (etdm_data->en_ref_cnt > 0) {
etdm_data->en_ref_cnt--;
static int mt8195_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id)
{
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
+ struct mtk_dai_etdm_priv *etdm_data;
unsigned int reg = 0;
unsigned int mask;
unsigned int val;
int cowork_source_sel;
+ if (!mt8195_afe_etdm_is_valid(dai_id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai_id];
if (etdm_data->cowork_source_id == COWORK_ETDM_NONE)
return 0;
if (is_cowork_mode(dai)) {
mst_dai_id = get_etdm_cowork_master_id(dai);
- mtk_dai_etdm_enable_mclk(afe, mst_dai_id);
+ if (!mt8195_afe_etdm_is_valid(mst_dai_id))
+ return -EINVAL;
+ mtk_dai_etdm_enable_mclk(afe, mst_dai_id);
cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);
if (cg_id >= 0)
mt8195_afe_enable_clk(afe, afe_priv->clk[cg_id]);
if (is_cowork_mode(dai)) {
mst_dai_id = get_etdm_cowork_master_id(dai);
+ if (!mt8195_afe_etdm_is_valid(mst_dai_id))
+ return;
+
cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(mst_dai_id);
if (cg_id >= 0)
mt8195_afe_disable_clk(afe, afe_priv->clk[cg_id]);
int dai_id)
{
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
+ struct mtk_dai_etdm_priv *etdm_data;
struct etdm_con_reg etdm_reg;
- bool slave_mode = etdm_data->slave_mode;
- unsigned int data_mode = etdm_data->data_mode;
- unsigned int lrck_width = etdm_data->lrck_width;
+ bool slave_mode;
+ unsigned int data_mode;
+ unsigned int lrck_width;
unsigned int val = 0;
unsigned int mask = 0;
int i;
int ret;
+ if (!mt8195_afe_etdm_is_valid(dai_id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai_id];
+ slave_mode = etdm_data->slave_mode;
+ data_mode = etdm_data->data_mode;
+ lrck_width = etdm_data->lrck_width;
+
dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",
__func__, rate, channels, dai_id);
int dai_id)
{
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
+ struct mtk_dai_etdm_priv *etdm_data;
struct etdm_con_reg etdm_reg;
- bool slave_mode = etdm_data->slave_mode;
- unsigned int lrck_width = etdm_data->lrck_width;
+ bool slave_mode;
+ unsigned int lrck_width;
unsigned int val = 0;
unsigned int mask = 0;
int ret;
int fs = 0;
+ if (!mt8195_afe_etdm_is_valid(dai_id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai_id];
+ slave_mode = etdm_data->slave_mode;
+ lrck_width = etdm_data->lrck_width;
+
dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",
__func__, rate, channels, dai_id);
static int mtk_dai_etdm_mclk_configure(struct mtk_base_afe *afe, int dai_id)
{
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
+ struct mtk_dai_etdm_priv *etdm_data;
int clk_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);
int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
int apll;
if (clk_id < 0 || clkdiv_id < 0)
return 0;
+ if (!mt8195_afe_etdm_is_valid(dai_id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai_id];
ret = get_etdm_reg(dai_id, &etdm_reg);
if (ret < 0)
return ret;
int dai_id)
{
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
+ struct mtk_dai_etdm_priv *etdm_data;
struct etdm_con_reg etdm_reg;
- bool slave_mode = etdm_data->slave_mode;
+ bool slave_mode;
unsigned int etdm_channels;
unsigned int val = 0;
unsigned int mask = 0;
unsigned int wlen = get_etdm_wlen(bit_width);
int ret;
+ if (!mt8195_afe_etdm_is_valid(dai_id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai_id];
+ slave_mode = etdm_data->slave_mode;
ret = get_etdm_reg(dai_id, &etdm_reg);
if (ret < 0)
return ret;
if (is_cowork_mode(dai)) {
mst_dai_id = get_etdm_cowork_master_id(dai);
+ if (!mt8195_afe_etdm_is_valid(mst_dai_id))
+ return -EINVAL;
ret = mtk_dai_etdm_mclk_configure(afe, mst_dai_id);
if (ret)
case SNDRV_PCM_TRIGGER_RESUME:
if (is_cowork_mode(dai)) {
mst_dai_id = get_etdm_cowork_master_id(dai);
+ if (!mt8195_afe_etdm_is_valid(mst_dai_id))
+ return -EINVAL;
+
mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
//open master first
case SNDRV_PCM_TRIGGER_SUSPEND:
if (is_cowork_mode(dai)) {
mst_dai_id = get_etdm_cowork_master_id(dai);
+ if (!mt8195_afe_etdm_is_valid(mst_dai_id))
+ return -EINVAL;
+
mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id)
{
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai_id];
+ struct mtk_dai_etdm_priv *etdm_data;
int apll;
int apll_rate;
+ if (!mt8195_afe_etdm_is_valid(dai_id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai_id];
if (freq == 0) {
etdm_data->mclk_freq = freq;
return 0;
else
dai_id = dai->id;
+ if (!mt8195_afe_etdm_is_valid(dai_id))
+ return -EINVAL;
+
etdm_data = afe_priv->dai_priv[dai_id];
etdm_data->mclk_dir = dir;
return mtk_dai_etdm_cal_mclk(afe, freq, dai_id);
{
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
+ struct mtk_dai_etdm_priv *etdm_data;
+
+ if (!mt8195_afe_etdm_is_valid(dai->id))
+ return -EINVAL;
+ etdm_data = afe_priv->dai_priv[dai->id];
dev_dbg(dai->dev, "%s id %d slot_width %d\n",
__func__, dai->id, slot_width);
{
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
+ struct mtk_dai_etdm_priv *etdm_data;
+
+ if (!mt8195_afe_etdm_is_valid(dai->id))
+ return -EINVAL;
+ etdm_data = afe_priv->dai_priv[dai->id];
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_I2S:
etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S;
{
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
+ struct mtk_dai_etdm_priv *etdm_data;
unsigned int rate = params_rate(params);
unsigned int channels = params_channels(params);
snd_pcm_format_t format = params_format(params);
int width = snd_pcm_format_physical_width(format);
int ret = 0;
+ if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai->id];
+
/* dptx configure */
if (dai->id == MT8195_AFE_IO_DPTX) {
regmap_update_bits(afe->regmap, AFE_DPTX_CON,
{
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
+ struct mtk_dai_etdm_priv *etdm_data;
+
+ if (!mt8195_afe_hdmitx_dptx_is_valid(dai->id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai->id];
dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",
__func__, dai->id, freq, dir);
{
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
struct mt8195_afe_private *afe_priv = afe->platform_priv;
- struct mtk_dai_etdm_priv *etdm_data = afe_priv->dai_priv[dai->id];
+ struct mtk_dai_etdm_priv *etdm_data;
dev_dbg(dai->dev, "%s id %d\n", __func__, dai->id);
+ if (!mt8195_afe_etdm_is_valid(dai->id))
+ return -EINVAL;
+
+ etdm_data = afe_priv->dai_priv[dai->id];
if (etdm_data->mclk_freq) {
dev_dbg(afe->dev, "MCLK always on, rate %d\n",
etdm_data->mclk_freq);
etdm_data = afe_priv->dai_priv[i];
if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) {
mst_dai_id = etdm_data->cowork_source_id;
+ if (!mt8195_afe_etdm_is_valid(mst_dai_id)) {
+ dev_err(afe->dev, "%s invalid dai id %d\n",
+ __func__, mst_dai_id);
+ return;
+ }
mst_data = afe_priv->dai_priv[mst_dai_id];
if (mst_data->cowork_source_id != COWORK_ETDM_NONE)
dev_info(afe->dev, "%s [%d] wrong sync source\n"
for (i = 0; i < MT8195_AFE_IO_ETDM_NUM; i++) {
dai_id = ETDM_TO_DAI_ID(i);
+ if (!mt8195_afe_etdm_is_valid(dai_id)) {
+ dev_err(afe->dev, "%s invalid dai id %d\n",
+ __func__, dai_id);
+ return;
+ }
+
etdm_data = afe_priv->dai_priv[dai_id];
ret = snprintf(prop, sizeof(prop),