Lines Matching +full:left +full:- +full:shift

1 // SPDX-License-Identifier: GPL-2.0-or-later
37 idx, ak4531->regs[idx]);
46 #define AK4531_SINGLE(xname, xindex, reg, shift, mask, invert) \ argument
50 .private_value = reg | (shift << 16) | (mask << 24) | (invert << 22) }
51 #define AK4531_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \ argument
57 .private_value = reg | (shift << 16) | (mask << 24) | (invert << 22), \
62 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_ak4531_info_single()
64 uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_ak4531_info_single()
65 uinfo->count = 1; in snd_ak4531_info_single()
66 uinfo->value.integer.min = 0; in snd_ak4531_info_single()
67 uinfo->value.integer.max = mask; in snd_ak4531_info_single()
74 int reg = kcontrol->private_value & 0xff; in snd_ak4531_get_single()
75 int shift = (kcontrol->private_value >> 16) & 0x07; in snd_ak4531_get_single() local
76 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_ak4531_get_single()
77 int invert = (kcontrol->private_value >> 22) & 1; in snd_ak4531_get_single()
80 mutex_lock(&ak4531->reg_mutex); in snd_ak4531_get_single()
81 val = (ak4531->regs[reg] >> shift) & mask; in snd_ak4531_get_single()
82 mutex_unlock(&ak4531->reg_mutex); in snd_ak4531_get_single()
84 val = mask - val; in snd_ak4531_get_single()
86 ucontrol->value.integer.value[0] = val; in snd_ak4531_get_single()
93 int reg = kcontrol->private_value & 0xff; in snd_ak4531_put_single()
94 int shift = (kcontrol->private_value >> 16) & 0x07; in snd_ak4531_put_single() local
95 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_ak4531_put_single()
96 int invert = (kcontrol->private_value >> 22) & 1; in snd_ak4531_put_single()
100 val = ucontrol->value.integer.value[0] & mask; in snd_ak4531_put_single()
102 val = mask - val; in snd_ak4531_put_single()
104 val <<= shift; in snd_ak4531_put_single()
105 mutex_lock(&ak4531->reg_mutex); in snd_ak4531_put_single()
106 val = (ak4531->regs[reg] & ~(mask << shift)) | val; in snd_ak4531_put_single()
107 change = val != ak4531->regs[reg]; in snd_ak4531_put_single()
108 ak4531->write(ak4531, reg, ak4531->regs[reg] = val); in snd_ak4531_put_single()
109 mutex_unlock(&ak4531->reg_mutex); in snd_ak4531_put_single()
129 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_ak4531_info_double()
131 uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER; in snd_ak4531_info_double()
132 uinfo->count = 2; in snd_ak4531_info_double()
133 uinfo->value.integer.min = 0; in snd_ak4531_info_double()
134 uinfo->value.integer.max = mask; in snd_ak4531_info_double()
141 int left_reg = kcontrol->private_value & 0xff; in snd_ak4531_get_double()
142 int right_reg = (kcontrol->private_value >> 8) & 0xff; in snd_ak4531_get_double()
143 int left_shift = (kcontrol->private_value >> 16) & 0x07; in snd_ak4531_get_double()
144 int right_shift = (kcontrol->private_value >> 19) & 0x07; in snd_ak4531_get_double()
145 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_ak4531_get_double()
146 int invert = (kcontrol->private_value >> 22) & 1; in snd_ak4531_get_double()
147 int left, right; in snd_ak4531_get_double() local
149 mutex_lock(&ak4531->reg_mutex); in snd_ak4531_get_double()
150 left = (ak4531->regs[left_reg] >> left_shift) & mask; in snd_ak4531_get_double()
151 right = (ak4531->regs[right_reg] >> right_shift) & mask; in snd_ak4531_get_double()
152 mutex_unlock(&ak4531->reg_mutex); in snd_ak4531_get_double()
154 left = mask - left; in snd_ak4531_get_double()
155 right = mask - right; in snd_ak4531_get_double()
157 ucontrol->value.integer.value[0] = left; in snd_ak4531_get_double()
158 ucontrol->value.integer.value[1] = right; in snd_ak4531_get_double()
165 int left_reg = kcontrol->private_value & 0xff; in snd_ak4531_put_double()
166 int right_reg = (kcontrol->private_value >> 8) & 0xff; in snd_ak4531_put_double()
167 int left_shift = (kcontrol->private_value >> 16) & 0x07; in snd_ak4531_put_double()
168 int right_shift = (kcontrol->private_value >> 19) & 0x07; in snd_ak4531_put_double()
169 int mask = (kcontrol->private_value >> 24) & 0xff; in snd_ak4531_put_double()
170 int invert = (kcontrol->private_value >> 22) & 1; in snd_ak4531_put_double()
172 int left, right; in snd_ak4531_put_double() local
174 left = ucontrol->value.integer.value[0] & mask; in snd_ak4531_put_double()
175 right = ucontrol->value.integer.value[1] & mask; in snd_ak4531_put_double()
177 left = mask - left; in snd_ak4531_put_double()
178 right = mask - right; in snd_ak4531_put_double()
180 left <<= left_shift; in snd_ak4531_put_double()
182 mutex_lock(&ak4531->reg_mutex); in snd_ak4531_put_double()
184 left = (ak4531->regs[left_reg] & ~((mask << left_shift) | (mask << right_shift))) | left | right; in snd_ak4531_put_double()
185 change = left != ak4531->regs[left_reg]; in snd_ak4531_put_double()
186 ak4531->write(ak4531, left_reg, ak4531->regs[left_reg] = left); in snd_ak4531_put_double()
188 left = (ak4531->regs[left_reg] & ~(mask << left_shift)) | left; in snd_ak4531_put_double()
189 right = (ak4531->regs[right_reg] & ~(mask << right_shift)) | right; in snd_ak4531_put_double()
190 change = left != ak4531->regs[left_reg] || right != ak4531->regs[right_reg]; in snd_ak4531_put_double()
191 ak4531->write(ak4531, left_reg, ak4531->regs[left_reg] = left); in snd_ak4531_put_double()
192 ak4531->write(ak4531, right_reg, ak4531->regs[right_reg] = right); in snd_ak4531_put_double()
194 mutex_unlock(&ak4531->reg_mutex); in snd_ak4531_put_double()
206 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in snd_ak4531_info_input_sw()
207 uinfo->count = 4; in snd_ak4531_info_input_sw()
208 uinfo->value.integer.min = 0; in snd_ak4531_info_input_sw()
209 uinfo->value.integer.max = 1; in snd_ak4531_info_input_sw()
216 int reg1 = kcontrol->private_value & 0xff; in snd_ak4531_get_input_sw()
217 int reg2 = (kcontrol->private_value >> 8) & 0xff; in snd_ak4531_get_input_sw()
218 int left_shift = (kcontrol->private_value >> 16) & 0x0f; in snd_ak4531_get_input_sw()
219 int right_shift = (kcontrol->private_value >> 24) & 0x0f; in snd_ak4531_get_input_sw()
221 mutex_lock(&ak4531->reg_mutex); in snd_ak4531_get_input_sw()
222 ucontrol->value.integer.value[0] = (ak4531->regs[reg1] >> left_shift) & 1; in snd_ak4531_get_input_sw()
223 ucontrol->value.integer.value[1] = (ak4531->regs[reg2] >> left_shift) & 1; in snd_ak4531_get_input_sw()
224 ucontrol->value.integer.value[2] = (ak4531->regs[reg1] >> right_shift) & 1; in snd_ak4531_get_input_sw()
225 ucontrol->value.integer.value[3] = (ak4531->regs[reg2] >> right_shift) & 1; in snd_ak4531_get_input_sw()
226 mutex_unlock(&ak4531->reg_mutex); in snd_ak4531_get_input_sw()
233 int reg1 = kcontrol->private_value & 0xff; in snd_ak4531_put_input_sw()
234 int reg2 = (kcontrol->private_value >> 8) & 0xff; in snd_ak4531_put_input_sw()
235 int left_shift = (kcontrol->private_value >> 16) & 0x0f; in snd_ak4531_put_input_sw()
236 int right_shift = (kcontrol->private_value >> 24) & 0x0f; in snd_ak4531_put_input_sw()
240 mutex_lock(&ak4531->reg_mutex); in snd_ak4531_put_input_sw()
241 val1 = ak4531->regs[reg1] & ~((1 << left_shift) | (1 << right_shift)); in snd_ak4531_put_input_sw()
242 val2 = ak4531->regs[reg2] & ~((1 << left_shift) | (1 << right_shift)); in snd_ak4531_put_input_sw()
243 val1 |= (ucontrol->value.integer.value[0] & 1) << left_shift; in snd_ak4531_put_input_sw()
244 val2 |= (ucontrol->value.integer.value[1] & 1) << left_shift; in snd_ak4531_put_input_sw()
245 val1 |= (ucontrol->value.integer.value[2] & 1) << right_shift; in snd_ak4531_put_input_sw()
246 val2 |= (ucontrol->value.integer.value[3] & 1) << right_shift; in snd_ak4531_put_input_sw()
247 change = val1 != ak4531->regs[reg1] || val2 != ak4531->regs[reg2]; in snd_ak4531_put_input_sw()
248 ak4531->write(ak4531, reg1, ak4531->regs[reg1] = val1); in snd_ak4531_put_input_sw()
249 ak4531->write(ak4531, reg2, ak4531->regs[reg2] = val2); in snd_ak4531_put_input_sw()
250 mutex_unlock(&ak4531->reg_mutex); in snd_ak4531_put_input_sw()
254 static const DECLARE_TLV_DB_SCALE(db_scale_master, -6200, 200, 0);
255 static const DECLARE_TLV_DB_SCALE(db_scale_mono, -2800, 400, 0);
256 static const DECLARE_TLV_DB_SCALE(db_scale_input, -5000, 200, 0);
325 if (ak4531->private_free) in snd_ak4531_free()
326 ak4531->private_free(ak4531); in snd_ak4531_free()
334 struct snd_ak4531 *ak4531 = device->device_data; in snd_ak4531_dev_free()
354 0x87, /* 0f: Mono-out Volume */
379 return -EINVAL; in snd_ak4531_mixer()
384 return -ENOMEM; in snd_ak4531_mixer()
386 mutex_init(&ak4531->reg_mutex); in snd_ak4531_mixer()
392 strcpy(card->mixername, "Asahi Kasei AK4531"); in snd_ak4531_mixer()
393 ak4531->write(ak4531, AK4531_RESET, 0x03); /* no RST, PD */ in snd_ak4531_mixer()
395 …ak4531->write(ak4531, AK4531_CLOCK, 0x00); /* CODEC ADC and CODEC DAC use {LR,B}CLK2 and run off L… in snd_ak4531_mixer()
399 …ak4531->write(ak4531, idx, ak4531->regs[idx] = snd_ak4531_initial_map[idx]); /* recording source i… in snd_ak4531_mixer()
430 ak4531->write(ak4531, AK4531_LMASTER, 0x9f); in snd_ak4531_suspend()
431 ak4531->write(ak4531, AK4531_RMASTER, 0x9f); in snd_ak4531_suspend()
433 ak4531->write(ak4531, AK4531_RESET, 0x01); in snd_ak4531_suspend()
441 ak4531->write(ak4531, AK4531_RESET, 0x03); in snd_ak4531_resume()
443 ak4531->write(ak4531, AK4531_CLOCK, 0x00); in snd_ak4531_resume()
448 ak4531->write(ak4531, idx, ak4531->regs[idx]); in snd_ak4531_resume()
460 struct snd_ak4531 *ak4531 = entry->private_data; in snd_ak4531_proc_read()
465 ak4531->regs[AK4531_AD_IN] & 1 ? "external" : "mixer", in snd_ak4531_proc_read()
466 ak4531->regs[AK4531_MIC_GAIN] & 1 ? "+30dB" : "+0dB"); in snd_ak4531_proc_read()