2424#define LOONGSON_I2S_TX_ENABLE (I2S_CTRL_TX_EN | I2S_CTRL_TX_DMA_EN)
2525#define LOONGSON_I2S_RX_ENABLE (I2S_CTRL_RX_EN | I2S_CTRL_RX_DMA_EN)
2626
27+ #define LOONGSON_I2S_DEF_DELAY 10
28+ #define LOONGSON_I2S_DEF_TIMEOUT 500000
29+
2730static int loongson_i2s_trigger (struct snd_pcm_substream * substream , int cmd ,
2831 struct snd_soc_dai * dai )
2932{
@@ -119,10 +122,40 @@ static int loongson_i2s_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id,
119122 return 0 ;
120123}
121124
125+ static int loongson_i2s_enable_mclk (struct loongson_i2s * i2s )
126+ {
127+ u32 val ;
128+
129+ if (i2s -> rev_id == 0 )
130+ return 0 ;
131+
132+ regmap_update_bits (i2s -> regmap , LS_I2S_CTRL ,
133+ I2S_CTRL_MCLK_EN , I2S_CTRL_MCLK_EN );
134+
135+ return regmap_read_poll_timeout_atomic (i2s -> regmap ,
136+ LS_I2S_CTRL , val ,
137+ val & I2S_CTRL_MCLK_READY ,
138+ LOONGSON_I2S_DEF_DELAY ,
139+ LOONGSON_I2S_DEF_TIMEOUT );
140+ }
141+
142+ static int loongson_i2s_enable_bclk (struct loongson_i2s * i2s )
143+ {
144+ u32 val ;
145+
146+ if (i2s -> rev_id == 0 )
147+ return 0 ;
148+
149+ return regmap_read_poll_timeout_atomic (i2s -> regmap ,
150+ LS_I2S_CTRL , val ,
151+ val & I2S_CTRL_CLK_READY ,
152+ LOONGSON_I2S_DEF_DELAY ,
153+ LOONGSON_I2S_DEF_TIMEOUT );
154+ }
155+
122156static int loongson_i2s_set_fmt (struct snd_soc_dai * dai , unsigned int fmt )
123157{
124158 struct loongson_i2s * i2s = snd_soc_dai_get_drvdata (dai );
125- u32 val ;
126159 int ret ;
127160
128161 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK ) {
@@ -144,54 +177,29 @@ static int loongson_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
144177 /* Enable master mode */
145178 regmap_update_bits (i2s -> regmap , LS_I2S_CTRL , I2S_CTRL_MASTER ,
146179 I2S_CTRL_MASTER );
147- if (i2s -> rev_id == 1 ) {
148- ret = regmap_read_poll_timeout_atomic (i2s -> regmap ,
149- LS_I2S_CTRL , val ,
150- val & I2S_CTRL_CLK_READY ,
151- 10 , 500000 );
152- if (ret < 0 )
153- dev_warn (dai -> dev , "wait BCLK ready timeout\n" );
154- }
180+ ret = loongson_i2s_enable_bclk (i2s );
181+ if (ret < 0 )
182+ dev_warn (dai -> dev , "wait BCLK ready timeout\n" );
155183 break ;
156184 case SND_SOC_DAIFMT_BC_FP :
157185 /* Enable MCLK */
158- if (i2s -> rev_id == 1 ) {
159- regmap_update_bits (i2s -> regmap , LS_I2S_CTRL ,
160- I2S_CTRL_MCLK_EN ,
161- I2S_CTRL_MCLK_EN );
162- ret = regmap_read_poll_timeout_atomic (i2s -> regmap ,
163- LS_I2S_CTRL , val ,
164- val & I2S_CTRL_MCLK_READY ,
165- 10 , 500000 );
166- if (ret < 0 )
167- dev_warn (dai -> dev , "wait MCLK ready timeout\n" );
168- }
186+ ret = loongson_i2s_enable_mclk (i2s );
187+ if (ret < 0 )
188+ dev_warn (dai -> dev , "wait MCLK ready timeout\n" );
169189 break ;
170190 case SND_SOC_DAIFMT_BP_FP :
171191 /* Enable MCLK */
172- if (i2s -> rev_id == 1 ) {
173- regmap_update_bits (i2s -> regmap , LS_I2S_CTRL ,
174- I2S_CTRL_MCLK_EN ,
175- I2S_CTRL_MCLK_EN );
176- ret = regmap_read_poll_timeout_atomic (i2s -> regmap ,
177- LS_I2S_CTRL , val ,
178- val & I2S_CTRL_MCLK_READY ,
179- 10 , 500000 );
180- if (ret < 0 )
181- dev_warn (dai -> dev , "wait MCLK ready timeout\n" );
182- }
192+ ret = loongson_i2s_enable_mclk (i2s );
193+ if (ret < 0 )
194+ dev_warn (dai -> dev , "wait MCLK ready timeout\n" );
183195
184196 /* Enable master mode */
185197 regmap_update_bits (i2s -> regmap , LS_I2S_CTRL , I2S_CTRL_MASTER ,
186198 I2S_CTRL_MASTER );
187- if (i2s -> rev_id == 1 ) {
188- ret = regmap_read_poll_timeout_atomic (i2s -> regmap ,
189- LS_I2S_CTRL , val ,
190- val & I2S_CTRL_CLK_READY ,
191- 10 , 500000 );
192- if (ret < 0 )
193- dev_warn (dai -> dev , "wait BCLK ready timeout\n" );
194- }
199+
200+ ret = loongson_i2s_enable_bclk (i2s );
201+ if (ret < 0 )
202+ dev_warn (dai -> dev , "wait BCLK ready timeout\n" );
195203 break ;
196204 default :
197205 return - EINVAL ;
0 commit comments