diff --git a/sound/soc/codecs/rk_dsm.c b/sound/soc/codecs/rk_dsm.c index 25f70d8b5cc5..9a189b7fcea3 100644 --- a/sound/soc/codecs/rk_dsm.c +++ b/sound/soc/codecs/rk_dsm.c @@ -331,13 +331,9 @@ static int rk_dsm_set_dai_fmt(struct snd_soc_dai *dai, snd_soc_component_get_drvdata(dai->component); unsigned int mask = 0, val = 0; - /* master mode only */ - regmap_update_bits(rd->regmap, I2S_CKR1, - DSM_I2S_CKR1_MSS_MASK, - DSM_I2S_CKR1_MSS_MASTER); - mask = DSM_I2S_CKR1_CKP_MASK | - DSM_I2S_CKR1_RLP_MASK; + DSM_I2S_CKR1_RLP_MASK | + DSM_I2S_CKR1_MSS_MASK; switch (fmt & SND_SOC_DAIFMT_INV_MASK) { case SND_SOC_DAIFMT_NB_NF: @@ -360,6 +356,17 @@ static int rk_dsm_set_dai_fmt(struct snd_soc_dai *dai, return -EINVAL; } + switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { + case SND_SOC_DAIFMT_CBS_CFS: + val |= DSM_I2S_CKR1_MSS_SLAVE; + break; + case SND_SOC_DAIFMT_CBM_CFM: + val |= DSM_I2S_CKR1_MSS_MASTER; + break; + default: + return -EINVAL; + } + regmap_update_bits(rd->regmap, I2S_CKR1, mask, val); return 0; diff --git a/sound/soc/codecs/rk_dsm.h b/sound/soc/codecs/rk_dsm.h index 51886804ec69..d9e1e9cf24fb 100644 --- a/sound/soc/codecs/rk_dsm.h +++ b/sound/soc/codecs/rk_dsm.h @@ -156,6 +156,7 @@ #define DSM_I2S_CKR1_CKP_INVERTED BIT(2) #define DSM_I2S_CKR1_CKP_NORMAL 0 #define DSM_I2S_CKR1_MSS_MASK BIT(3) +#define DSM_I2S_CKR1_MSS_SLAVE BIT(3) #define DSM_I2S_CKR1_MSS_MASTER 0 /* I2S_XFER */ #define DSM_I2S_XFER_RXS_MASK BIT(1)