@@ -110,6 +110,35 @@ int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
110110}
111111EXPORT_SYMBOL_GPL (snd_soc_put_enum_double );
112112
113+ static int sdca_soc_q78_reg_to_ctl (struct soc_mixer_control * mc , unsigned int reg_val ,
114+ unsigned int mask , unsigned int shift , int max )
115+ {
116+ int val = reg_val ;
117+
118+ if (WARN_ON (!mc -> shift ))
119+ return - EINVAL ;
120+
121+ val = sign_extend32 (val , mc -> sign_bit );
122+ val = (((val * 100 ) >> 8 ) / (int )mc -> shift );
123+ val -= mc -> min ;
124+
125+ return val & mask ;
126+ }
127+
128+ static unsigned int sdca_soc_q78_ctl_to_reg (struct soc_mixer_control * mc , int val ,
129+ unsigned int mask , unsigned int shift , int max )
130+ {
131+ unsigned int reg_val , ret_val ;
132+
133+ if (WARN_ON (!mc -> shift ))
134+ return - EINVAL ;
135+
136+ reg_val = val + mc -> min ;
137+ ret_val = (((int )(((int )reg_val * (int )mc -> shift ) << 8 )) / 100 );
138+
139+ return ret_val & mask ;
140+ }
141+
113142static int soc_mixer_reg_to_ctl (struct soc_mixer_control * mc , unsigned int reg_val ,
114143 unsigned int mask , unsigned int shift , int max )
115144{
@@ -202,27 +231,35 @@ static int soc_put_volsw(struct snd_kcontrol *kcontrol,
202231 unsigned int val2 = 0 ;
203232 bool double_r = false;
204233 int ret ;
234+ unsigned int (* ctl_to_reg )(struct soc_mixer_control * , int , unsigned int , unsigned int , int );
235+
236+ if (mc -> sdca_q78 ) {
237+ ctl_to_reg = sdca_soc_q78_ctl_to_reg ;
238+ val_mask = mask ;
239+ } else {
240+ ctl_to_reg = soc_mixer_ctl_to_reg ;
241+ val_mask = mask << mc -> shift ;
242+ }
205243
206244 ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [0 ], max );
207245 if (ret )
208246 return ret ;
209247
210- val1 = soc_mixer_ctl_to_reg (mc , ucontrol -> value .integer .value [0 ],
248+ val1 = ctl_to_reg (mc , ucontrol -> value .integer .value [0 ],
211249 mask , mc -> shift , max );
212- val_mask = mask << mc -> shift ;
213250
214251 if (snd_soc_volsw_is_stereo (mc )) {
215252 ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [1 ], max );
216253 if (ret )
217254 return ret ;
218255
219256 if (mc -> reg == mc -> rreg ) {
220- val1 |= soc_mixer_ctl_to_reg (mc ,
257+ val1 |= ctl_to_reg (mc ,
221258 ucontrol -> value .integer .value [1 ],
222259 mask , mc -> rshift , max );
223260 val_mask |= mask << mc -> rshift ;
224261 } else {
225- val2 = soc_mixer_ctl_to_reg (mc ,
262+ val2 = ctl_to_reg (mc ,
226263 ucontrol -> value .integer .value [1 ],
227264 mask , mc -> shift , max );
228265 double_r = true;
@@ -251,18 +288,24 @@ static int soc_get_volsw(struct snd_kcontrol *kcontrol,
251288 struct snd_soc_component * component = snd_kcontrol_chip (kcontrol );
252289 unsigned int reg_val ;
253290 int val ;
291+ int (* reg_to_ctl )(struct soc_mixer_control * , unsigned int , unsigned int , unsigned int , int );
292+
293+ if (mc -> sdca_q78 )
294+ reg_to_ctl = sdca_soc_q78_reg_to_ctl ;
295+ else
296+ reg_to_ctl = soc_mixer_reg_to_ctl ;
254297
255298 reg_val = snd_soc_component_read (component , mc -> reg );
256- val = soc_mixer_reg_to_ctl (mc , reg_val , mask , mc -> shift , max );
299+ val = reg_to_ctl (mc , reg_val , mask , mc -> shift , max );
257300
258301 ucontrol -> value .integer .value [0 ] = val ;
259302
260303 if (snd_soc_volsw_is_stereo (mc )) {
261304 if (mc -> reg == mc -> rreg ) {
262- val = soc_mixer_reg_to_ctl (mc , reg_val , mask , mc -> rshift , max );
305+ val = reg_to_ctl (mc , reg_val , mask , mc -> rshift , max );
263306 } else {
264307 reg_val = snd_soc_component_read (component , mc -> rreg );
265- val = soc_mixer_reg_to_ctl (mc , reg_val , mask , mc -> shift , max );
308+ val = reg_to_ctl (mc , reg_val , mask , mc -> shift , max );
266309 }
267310
268311 ucontrol -> value .integer .value [1 ] = val ;
0 commit comments