Lines Matching refs:mixer
98 vfree(chip->mixer.array_saved);
113 dev_dbg(chip->card->dev, "No valid mixer widget\n");
117 chip->mixer.nid = nid;
118 chip->mixer.caps = val;
119 chip->mixer.array = (struct lola_mixer_array __iomem *)
122 /* reserve memory to copy mixer data for sleep mode transitions */
123 chip->mixer.array_saved = vmalloc(sizeof(struct lola_mixer_array));
125 /* mixer matrix sources are physical input data and play streams */
126 chip->mixer.src_stream_outs = chip->pcm[PLAY].num_streams;
127 chip->mixer.src_phys_ins = chip->pin[CAPT].num_pins;
129 /* mixer matrix destinations are record streams and physical output */
130 chip->mixer.dest_stream_ins = chip->pcm[CAPT].num_streams;
131 chip->mixer.dest_phys_outs = chip->pin[PLAY].num_pins;
133 /* mixer matrix may have unused areas between PhysIn and
136 chip->mixer.src_stream_out_ofs = chip->mixer.src_phys_ins +
138 chip->mixer.dest_phys_out_ofs = chip->mixer.dest_stream_ins +
189 if (chip->mixer.src_stream_out_ofs > MAX_AUDIO_INOUT_COUNT ||
190 chip->mixer.dest_phys_out_ofs > MAX_STREAM_IN_COUNT) {
191 dev_err(chip->card->dev, "Invalid mixer widget size\n");
195 chip->mixer.src_mask = ((1U << chip->mixer.src_phys_ins) - 1) |
196 (((1U << chip->mixer.src_stream_outs) - 1)
197 << chip->mixer.src_stream_out_ofs);
198 chip->mixer.dest_mask = ((1U << chip->mixer.dest_stream_ins) - 1) |
199 (((1U << chip->mixer.dest_phys_outs) - 1)
200 << chip->mixer.dest_phys_out_ofs);
203 chip->mixer.src_mask, chip->mixer.dest_mask);
213 if (!(chip->mixer.src_mask & (1 << id)))
215 oldval = val = readl(&chip->mixer.array->src_gain_enable);
222 (gain == readw(&chip->mixer.array->src_gain[id])))
228 writew(gain, &chip->mixer.array->src_gain[id]);
229 writel(val, &chip->mixer.array->src_gain_enable);
232 return lola_codec_write(chip, chip->mixer.nid,
242 if ((chip->mixer.src_mask & mask) != mask)
246 writew(*gains, &chip->mixer.array->src_gain[i]);
250 writel(mask, &chip->mixer.array->src_gain_enable);
252 if (chip->mixer.caps & LOLA_PEAK_METER_CAN_AGC_MASK) {
254 return lola_codec_write(chip, chip->mixer.nid,
260 lola_codec_write(chip, chip->mixer.nid,
274 if (!(chip->mixer.src_mask & (1 << src)) ||
275 !(chip->mixer.dest_mask & (1 << dest)))
278 writew(gain, &chip->mixer.array->dest_mix_gain[dest][src]);
279 val = readl(&chip->mixer.array->dest_mix_gain_enable[dest]);
284 writel(val, &chip->mixer.array->dest_mix_gain_enable[dest]);
286 return lola_codec_write(chip, chip->mixer.nid, LOLA_VERB_SET_MIX_GAIN,
296 if (!(chip->mixer.dest_mask & (1 << id)) ||
297 (chip->mixer.src_mask & mask) != mask)
301 writew(*gains, &chip->mixer.array->dest_mix_gain[id][i]);
305 writel(mask, &chip->mixer.array->dest_mix_gain_enable[id]);
308 return lola_codec_write(chip, chip->mixer.nid,
340 if (chip->mixer.array_saved) {
341 /* store contents of mixer array */
342 memcpy_fromio(chip->mixer.array_saved, chip->mixer.array,
343 sizeof(*chip->mixer.array));
353 if (chip->mixer.array_saved) {
354 /* restore contents of mixer array */
355 memcpy_toio(chip->mixer.array, chip->mixer.array_saved,
356 sizeof(*chip->mixer.array));
360 for (i = 0; i < chip->mixer.src_phys_ins; i++)
361 lola_codec_write(chip, chip->mixer.nid,
364 for (i = 0; i < chip->mixer.src_stream_outs; i++)
365 lola_codec_write(chip, chip->mixer.nid,
367 chip->mixer.src_stream_out_ofs + i, 0);
368 for (i = 0; i < chip->mixer.dest_stream_ins; i++)
369 lola_codec_write(chip, chip->mixer.nid,
372 for (i = 0; i < chip->mixer.dest_phys_outs; i++)
373 lola_codec_write(chip, chip->mixer.nid,
375 chip->mixer.dest_phys_out_ofs + i, 0);
456 /* clear all mixer matrix settings */
457 memset_io(chip->mixer.array, 0, sizeof(*chip->mixer.array));
459 for (i = 0; i < chip->mixer.dest_stream_ins; i++)
460 lola_codec_write(chip, chip->mixer.nid,
464 for (i = 0; i < chip->mixer.dest_phys_outs; i++)
465 lola_codec_write(chip, chip->mixer.nid,
467 chip->mixer.dest_phys_out_ofs + i, 0);
470 for (i = 0; i < chip->mixer.src_phys_ins; i++)
474 for (i = 0; i < chip->mixer.src_stream_outs; i++)
476 i + chip->mixer.src_stream_out_ofs,
479 for (i = 0; i < chip->mixer.dest_stream_ins; i++) {
480 int src = i % chip->mixer.src_phys_ins;
487 for (i = 0; i < chip->mixer.src_stream_outs; i++) {
488 int src = chip->mixer.src_stream_out_ofs + i;
489 int dst = chip->mixer.dest_phys_out_ofs +
490 i % chip->mixer.dest_phys_outs;
497 * analog mixer control element
657 * src gain mixer
679 mask = readl(&chip->mixer.array->src_gain_enable);
683 if (!(chip->mixer.src_mask & (1 << idx)))
686 val = readw(&chip->mixer.array->src_gain[idx]) + 1;
738 * destination gain (matrix-like) mixer
762 mask = readl(&chip->mixer.array->dest_mix_gain_enable[dst]);
766 if (!(chip->mixer.src_mask & (1 << src)))
769 val = readw(&chip->mixer.array->dest_mix_gain[dst][src]) + 1;
842 err = create_src_gain_mixer(chip, chip->mixer.src_phys_ins, 0,
846 err = create_src_gain_mixer(chip, chip->mixer.src_stream_outs,
847 chip->mixer.src_stream_out_ofs,
852 /* FIXME: buggy mixer matrix handling */
854 chip->mixer.src_phys_ins, 0,
855 chip->mixer.dest_stream_ins, 0,
860 chip->mixer.src_stream_outs,
861 chip->mixer.src_stream_out_ofs,
862 chip->mixer.dest_stream_ins, 0,
867 chip->mixer.src_phys_ins, 0,
868 chip->mixer.dest_phys_outs,
869 chip->mixer.dest_phys_out_ofs,
874 chip->mixer.src_stream_outs,
875 chip->mixer.src_stream_out_ofs,
876 chip->mixer.dest_phys_outs,
877 chip->mixer.dest_phys_out_ofs,