@@ -110,6 +110,36 @@ 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 ret_val ;
132+ int reg_val ;
133+
134+ if (WARN_ON (!mc -> shift ))
135+ return - EINVAL ;
136+
137+ reg_val = val + mc -> min ;
138+ ret_val = (int )((reg_val * mc -> shift ) << 8 ) / 100 ;
139+
140+ return ret_val & mask ;
141+ }
142+
113143static int soc_mixer_reg_to_ctl (struct soc_mixer_control * mc , unsigned int reg_val ,
114144 unsigned int mask , unsigned int shift , int max )
115145{
@@ -202,29 +232,33 @@ static int soc_put_volsw(struct snd_kcontrol *kcontrol,
202232 unsigned int val2 = 0 ;
203233 bool double_r = false;
204234 int ret ;
235+ unsigned int (* ctl_to_reg )(struct soc_mixer_control * , int , unsigned int , unsigned int , int );
236+
237+ if (mc -> sdca_q78 ) {
238+ ctl_to_reg = sdca_soc_q78_ctl_to_reg ;
239+ val_mask = mask ;
240+ } else {
241+ ctl_to_reg = soc_mixer_ctl_to_reg ;
242+ val_mask = mask << mc -> shift ;
243+ }
205244
206245 ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [0 ], max );
207246 if (ret )
208247 return ret ;
209248
210- val1 = soc_mixer_ctl_to_reg (mc , ucontrol -> value .integer .value [0 ],
249+ val1 = ctl_to_reg (mc , ucontrol -> value .integer .value [0 ],
211250 mask , mc -> shift , max );
212- val_mask = mask << mc -> shift ;
213251
214252 if (snd_soc_volsw_is_stereo (mc )) {
215253 ret = soc_mixer_valid_ctl (mc , ucontrol -> value .integer .value [1 ], max );
216254 if (ret )
217255 return ret ;
218256
219257 if (mc -> reg == mc -> rreg ) {
220- val1 |= soc_mixer_ctl_to_reg (mc ,
221- ucontrol -> value .integer .value [1 ],
222- mask , mc -> rshift , max );
258+ val1 |= ctl_to_reg (mc , ucontrol -> value .integer .value [1 ], mask , mc -> rshift , max );
223259 val_mask |= mask << mc -> rshift ;
224260 } else {
225- val2 = soc_mixer_ctl_to_reg (mc ,
226- ucontrol -> value .integer .value [1 ],
227- mask , mc -> shift , max );
261+ val2 = ctl_to_reg (mc , ucontrol -> value .integer .value [1 ], mask , mc -> shift , max );
228262 double_r = true;
229263 }
230264 }
@@ -251,18 +285,24 @@ static int soc_get_volsw(struct snd_kcontrol *kcontrol,
251285 struct snd_soc_component * component = snd_kcontrol_chip (kcontrol );
252286 unsigned int reg_val ;
253287 int val ;
288+ int (* reg_to_ctl )(struct soc_mixer_control * , unsigned int , unsigned int , unsigned int , int );
289+
290+ if (mc -> sdca_q78 )
291+ reg_to_ctl = sdca_soc_q78_reg_to_ctl ;
292+ else
293+ reg_to_ctl = soc_mixer_reg_to_ctl ;
254294
255295 reg_val = snd_soc_component_read (component , mc -> reg );
256- val = soc_mixer_reg_to_ctl (mc , reg_val , mask , mc -> shift , max );
296+ val = reg_to_ctl (mc , reg_val , mask , mc -> shift , max );
257297
258298 ucontrol -> value .integer .value [0 ] = val ;
259299
260300 if (snd_soc_volsw_is_stereo (mc )) {
261301 if (mc -> reg == mc -> rreg ) {
262- val = soc_mixer_reg_to_ctl (mc , reg_val , mask , mc -> rshift , max );
302+ val = reg_to_ctl (mc , reg_val , mask , mc -> rshift , max );
263303 } else {
264304 reg_val = snd_soc_component_read (component , mc -> rreg );
265- val = soc_mixer_reg_to_ctl (mc , reg_val , mask , mc -> shift , max );
305+ val = reg_to_ctl (mc , reg_val , mask , mc -> shift , max );
266306 }
267307
268308 ucontrol -> value .integer .value [1 ] = val ;
0 commit comments