Lines Matching refs:chip

31 static int lola_init_pin(struct lola *chip, struct lola_pin *pin,  in lola_init_pin()  argument
38 err = lola_read_param(chip, nid, LOLA_PAR_AUDIO_WIDGET_CAP, &val); in lola_init_pin()
40 dev_err(chip->card->dev, "Can't read wcaps for 0x%x\n", nid); in lola_init_pin()
51 dev_err(chip->card->dev, "Invalid wcaps 0x%x for 0x%x\n", val, nid); in lola_init_pin()
61 err = lola_read_param(chip, nid, LOLA_PAR_AMP_OUT_CAP, &val); in lola_init_pin()
63 err = lola_read_param(chip, nid, LOLA_PAR_AMP_IN_CAP, &val); in lola_init_pin()
65 dev_err(chip->card->dev, "Can't read AMP-caps for 0x%x\n", nid); in lola_init_pin()
79 err = lola_codec_read(chip, nid, LOLA_VERB_GET_MAX_LEVEL, 0, 0, &val, in lola_init_pin()
82 dev_err(chip->card->dev, "Can't get MAX_LEVEL 0x%x\n", nid); in lola_init_pin()
94 int lola_init_pins(struct lola *chip, int dir, int *nidp) in lola_init_pins() argument
98 for (i = 0; i < chip->pin[dir].num_pins; i++, nid++) { in lola_init_pins()
99 err = lola_init_pin(chip, &chip->pin[dir].pins[i], dir, nid); in lola_init_pins()
102 if (chip->pin[dir].pins[i].is_analog) in lola_init_pins()
103 chip->pin[dir].num_analog_pins++; in lola_init_pins()
109 void lola_free_mixer(struct lola *chip) in lola_free_mixer() argument
111 vfree(chip->mixer.array_saved); in lola_free_mixer()
114 int lola_init_mixer_widget(struct lola *chip, int nid) in lola_init_mixer_widget() argument
119 err = lola_read_param(chip, nid, LOLA_PAR_AUDIO_WIDGET_CAP, &val); in lola_init_mixer_widget()
121 dev_err(chip->card->dev, "Can't read wcaps for 0x%x\n", nid); in lola_init_mixer_widget()
126 dev_dbg(chip->card->dev, "No valid mixer widget\n"); in lola_init_mixer_widget()
130 chip->mixer.nid = nid; in lola_init_mixer_widget()
131 chip->mixer.caps = val; in lola_init_mixer_widget()
132 chip->mixer.array = (struct lola_mixer_array __iomem *) in lola_init_mixer_widget()
133 (chip->bar[BAR1].remap_addr + LOLA_BAR1_SOURCE_GAIN_ENABLE); in lola_init_mixer_widget()
136 chip->mixer.array_saved = vmalloc(sizeof(struct lola_mixer_array)); in lola_init_mixer_widget()
139 chip->mixer.src_stream_outs = chip->pcm[PLAY].num_streams; in lola_init_mixer_widget()
140 chip->mixer.src_phys_ins = chip->pin[CAPT].num_pins; in lola_init_mixer_widget()
143 chip->mixer.dest_stream_ins = chip->pcm[CAPT].num_streams; in lola_init_mixer_widget()
144 chip->mixer.dest_phys_outs = chip->pin[PLAY].num_pins; in lola_init_mixer_widget()
149 chip->mixer.src_stream_out_ofs = chip->mixer.src_phys_ins + in lola_init_mixer_widget()
151 chip->mixer.dest_phys_out_ofs = chip->mixer.dest_stream_ins + in lola_init_mixer_widget()
202 if (chip->mixer.src_stream_out_ofs > MAX_AUDIO_INOUT_COUNT || in lola_init_mixer_widget()
203 chip->mixer.dest_phys_out_ofs > MAX_STREAM_IN_COUNT) { in lola_init_mixer_widget()
204 dev_err(chip->card->dev, "Invalid mixer widget size\n"); in lola_init_mixer_widget()
208 chip->mixer.src_mask = ((1U << chip->mixer.src_phys_ins) - 1) | in lola_init_mixer_widget()
209 (((1U << chip->mixer.src_stream_outs) - 1) in lola_init_mixer_widget()
210 << chip->mixer.src_stream_out_ofs); in lola_init_mixer_widget()
211 chip->mixer.dest_mask = ((1U << chip->mixer.dest_stream_ins) - 1) | in lola_init_mixer_widget()
212 (((1U << chip->mixer.dest_phys_outs) - 1) in lola_init_mixer_widget()
213 << chip->mixer.dest_phys_out_ofs); in lola_init_mixer_widget()
215 dev_dbg(chip->card->dev, "Mixer src_mask=%x, dest_mask=%x\n", in lola_init_mixer_widget()
216 chip->mixer.src_mask, chip->mixer.dest_mask); in lola_init_mixer_widget()
221 static int lola_mixer_set_src_gain(struct lola *chip, unsigned int id, in lola_mixer_set_src_gain() argument
226 if (!(chip->mixer.src_mask & (1 << id))) in lola_mixer_set_src_gain()
228 oldval = val = readl(&chip->mixer.array->src_gain_enable); in lola_mixer_set_src_gain()
235 (gain == readw(&chip->mixer.array->src_gain[id]))) in lola_mixer_set_src_gain()
238 dev_dbg(chip->card->dev, in lola_mixer_set_src_gain()
241 writew(gain, &chip->mixer.array->src_gain[id]); in lola_mixer_set_src_gain()
242 writel(val, &chip->mixer.array->src_gain_enable); in lola_mixer_set_src_gain()
243 lola_codec_flush(chip); in lola_mixer_set_src_gain()
245 return lola_codec_write(chip, chip->mixer.nid, in lola_mixer_set_src_gain()
250 static int lola_mixer_set_src_gains(struct lola *chip, unsigned int mask,
255 if ((chip->mixer.src_mask & mask) != mask)
259 writew(*gains, &chip->mixer.array->src_gain[i]);
263 writel(mask, &chip->mixer.array->src_gain_enable);
264 lola_codec_flush(chip);
265 if (chip->mixer.caps & LOLA_PEAK_METER_CAN_AGC_MASK) {
267 return lola_codec_write(chip, chip->mixer.nid,
273 lola_codec_write(chip, chip->mixer.nid,
281 static int lola_mixer_set_mapping_gain(struct lola *chip, in lola_mixer_set_mapping_gain() argument
287 if (!(chip->mixer.src_mask & (1 << src)) || in lola_mixer_set_mapping_gain()
288 !(chip->mixer.dest_mask & (1 << dest))) in lola_mixer_set_mapping_gain()
291 writew(gain, &chip->mixer.array->dest_mix_gain[dest][src]); in lola_mixer_set_mapping_gain()
292 val = readl(&chip->mixer.array->dest_mix_gain_enable[dest]); in lola_mixer_set_mapping_gain()
297 writel(val, &chip->mixer.array->dest_mix_gain_enable[dest]); in lola_mixer_set_mapping_gain()
298 lola_codec_flush(chip); in lola_mixer_set_mapping_gain()
299 return lola_codec_write(chip, chip->mixer.nid, LOLA_VERB_SET_MIX_GAIN, in lola_mixer_set_mapping_gain()
304 static int lola_mixer_set_dest_gains(struct lola *chip, unsigned int id,
309 if (!(chip->mixer.dest_mask & (1 << id)) ||
310 (chip->mixer.src_mask & mask) != mask)
314 writew(*gains, &chip->mixer.array->dest_mix_gain[id][i]);
318 writel(mask, &chip->mixer.array->dest_mix_gain_enable[id]);
319 lola_codec_flush(chip);
321 return lola_codec_write(chip, chip->mixer.nid,
329 static int set_analog_volume(struct lola *chip, int dir,
333 int lola_setup_all_analog_gains(struct lola *chip, int dir, bool mute) in lola_setup_all_analog_gains() argument
338 pin = chip->pin[dir].pins; in lola_setup_all_analog_gains()
339 max_idx = chip->pin[dir].num_pins; in lola_setup_all_analog_gains()
344 set_analog_volume(chip, dir, idx, val, false); in lola_setup_all_analog_gains()
347 return lola_codec_flush(chip); in lola_setup_all_analog_gains()
350 void lola_save_mixer(struct lola *chip) in lola_save_mixer() argument
353 if (chip->mixer.array_saved) { in lola_save_mixer()
355 memcpy_fromio(chip->mixer.array_saved, chip->mixer.array, in lola_save_mixer()
356 sizeof(*chip->mixer.array)); in lola_save_mixer()
358 lola_setup_all_analog_gains(chip, PLAY, true); /* output mute */ in lola_save_mixer()
361 void lola_restore_mixer(struct lola *chip) in lola_restore_mixer() argument
366 if (chip->mixer.array_saved) { in lola_restore_mixer()
368 memcpy_toio(chip->mixer.array, chip->mixer.array_saved, in lola_restore_mixer()
369 sizeof(*chip->mixer.array)); in lola_restore_mixer()
373 for (i = 0; i < chip->mixer.src_phys_ins; i++) in lola_restore_mixer()
374 lola_codec_write(chip, chip->mixer.nid, in lola_restore_mixer()
377 for (i = 0; i < chip->mixer.src_stream_outs; i++) in lola_restore_mixer()
378 lola_codec_write(chip, chip->mixer.nid, in lola_restore_mixer()
380 chip->mixer.src_stream_out_ofs + i, 0); in lola_restore_mixer()
381 for (i = 0; i < chip->mixer.dest_stream_ins; i++) in lola_restore_mixer()
382 lola_codec_write(chip, chip->mixer.nid, in lola_restore_mixer()
385 for (i = 0; i < chip->mixer.dest_phys_outs; i++) in lola_restore_mixer()
386 lola_codec_write(chip, chip->mixer.nid, in lola_restore_mixer()
388 chip->mixer.dest_phys_out_ofs + i, 0); in lola_restore_mixer()
389 lola_codec_flush(chip); in lola_restore_mixer()
396 static int set_analog_volume(struct lola *chip, int dir, in set_analog_volume() argument
403 if (idx >= chip->pin[dir].num_pins) in set_analog_volume()
405 pin = &chip->pin[dir].pins[idx]; in set_analog_volume()
411 lola_codec_flush(chip); in set_analog_volume()
412 dev_dbg(chip->card->dev, in set_analog_volume()
415 err = lola_codec_write(chip, pin->nid, in set_analog_volume()
424 int lola_set_src_config(struct lola *chip, unsigned int src_mask, bool update) in lola_set_src_config() argument
431 if ((chip->input_src_caps_mask & src_mask) != src_mask) in lola_set_src_config()
434 for (n = 0; n < chip->pin[CAPT].num_pins; n += 2) { in lola_set_src_config()
437 if (!(chip->input_src_caps_mask & mask)) in lola_set_src_config()
442 src_state = (chip->input_src_mask & mask) != 0; in lola_set_src_config()
446 err = lola_codec_write(chip, chip->pcm[CAPT].streams[n].nid, in lola_set_src_config()
454 ret = lola_codec_flush(chip); in lola_set_src_config()
456 chip->input_src_mask = src_mask; in lola_set_src_config()
462 static int init_mixer_values(struct lola *chip) in init_mixer_values() argument
467 lola_set_src_config(chip, (1 << chip->pin[CAPT].num_pins) - 1, false); in init_mixer_values()
470 memset_io(chip->mixer.array, 0, sizeof(*chip->mixer.array)); in init_mixer_values()
472 for (i = 0; i < chip->mixer.dest_stream_ins; i++) in init_mixer_values()
473 lola_codec_write(chip, chip->mixer.nid, in init_mixer_values()
477 for (i = 0; i < chip->mixer.dest_phys_outs; i++) in init_mixer_values()
478 lola_codec_write(chip, chip->mixer.nid, in init_mixer_values()
480 chip->mixer.dest_phys_out_ofs + i, 0); in init_mixer_values()
483 for (i = 0; i < chip->mixer.src_phys_ins; i++) in init_mixer_values()
484 lola_mixer_set_src_gain(chip, i, 336, true); /* 0dB */ in init_mixer_values()
487 for (i = 0; i < chip->mixer.src_stream_outs; i++) in init_mixer_values()
488 lola_mixer_set_src_gain(chip, in init_mixer_values()
489 i + chip->mixer.src_stream_out_ofs, in init_mixer_values()
492 for (i = 0; i < chip->mixer.dest_stream_ins; i++) { in init_mixer_values()
493 int src = i % chip->mixer.src_phys_ins; in init_mixer_values()
494 lola_mixer_set_mapping_gain(chip, src, i, 336, true); in init_mixer_values()
500 for (i = 0; i < chip->mixer.src_stream_outs; i++) { in init_mixer_values()
501 int src = chip->mixer.src_stream_out_ofs + i; in init_mixer_values()
502 int dst = chip->mixer.dest_phys_out_ofs + in init_mixer_values()
503 i % chip->mixer.dest_phys_outs; in init_mixer_values()
504 lola_mixer_set_mapping_gain(chip, src, dst, 336, true); in init_mixer_values()
515 struct lola *chip = snd_kcontrol_chip(kcontrol); in lola_analog_vol_info() local
519 uinfo->count = chip->pin[dir].num_pins; in lola_analog_vol_info()
521 uinfo->value.integer.max = chip->pin[dir].pins[0].amp_num_steps; in lola_analog_vol_info()
528 struct lola *chip = snd_kcontrol_chip(kcontrol); in lola_analog_vol_get() local
532 for (i = 0; i < chip->pin[dir].num_pins; i++) in lola_analog_vol_get()
534 chip->pin[dir].pins[i].cur_gain_step; in lola_analog_vol_get()
541 struct lola *chip = snd_kcontrol_chip(kcontrol); in lola_analog_vol_put() local
545 for (i = 0; i < chip->pin[dir].num_pins; i++) { in lola_analog_vol_put()
546 err = set_analog_volume(chip, dir, i, in lola_analog_vol_put()
558 struct lola *chip = snd_kcontrol_chip(kcontrol); in lola_analog_vol_tlv() local
565 pin = &chip->pin[dir].pins[0]; in lola_analog_vol_tlv()
594 static int create_analog_mixer(struct lola *chip, int dir, char *name) in create_analog_mixer() argument
596 if (!chip->pin[dir].num_pins) in create_analog_mixer()
599 if (chip->pin[dir].num_pins != chip->pin[dir].num_analog_pins) in create_analog_mixer()
603 return snd_ctl_add(chip->card, in create_analog_mixer()
604 snd_ctl_new1(&lola_analog_mixer, chip)); in create_analog_mixer()
613 struct lola *chip = snd_kcontrol_chip(kcontrol); in lola_input_src_info() local
616 uinfo->count = chip->pin[CAPT].num_pins; in lola_input_src_info()
625 struct lola *chip = snd_kcontrol_chip(kcontrol); in lola_input_src_get() local
628 for (i = 0; i < chip->pin[CAPT].num_pins; i++) in lola_input_src_get()
630 !!(chip->input_src_mask & (1 << i)); in lola_input_src_get()
637 struct lola *chip = snd_kcontrol_chip(kcontrol); in lola_input_src_put() local
642 for (i = 0; i < chip->pin[CAPT].num_pins; i++) in lola_input_src_put()
645 return lola_set_src_config(chip, mask, true); in lola_input_src_put()
660 static int create_input_src_mixer(struct lola *chip) in create_input_src_mixer() argument
662 if (!chip->input_src_caps_mask) in create_input_src_mixer()
665 return snd_ctl_add(chip->card, in create_input_src_mixer()
666 snd_ctl_new1(&lola_input_src_mixer, chip)); in create_input_src_mixer()
687 struct lola *chip = snd_kcontrol_chip(kcontrol); in lola_src_gain_get() local
692 mask = readl(&chip->mixer.array->src_gain_enable); in lola_src_gain_get()
696 if (!(chip->mixer.src_mask & (1 << idx))) in lola_src_gain_get()
699 val = readw(&chip->mixer.array->src_gain[idx]) + 1; in lola_src_gain_get()
710 struct lola *chip = snd_kcontrol_chip(kcontrol); in lola_src_gain_put() local
720 err = lola_mixer_set_src_gain(chip, idx, val, !!val); in lola_src_gain_put()
740 static int create_src_gain_mixer(struct lola *chip, in create_src_gain_mixer() argument
745 return snd_ctl_add(chip->card, in create_src_gain_mixer()
746 snd_ctl_new1(&lola_src_gain_mixer, chip)); in create_src_gain_mixer()
768 struct lola *chip = snd_kcontrol_chip(kcontrol);
775 mask = readl(&chip->mixer.array->dest_mix_gain_enable[dst]);
779 if (!(chip->mixer.src_mask & (1 << src)))
782 val = readw(&chip->mixer.array->dest_mix_gain[dst][src]) + 1;
793 struct lola *chip = snd_kcontrol_chip(kcontrol);
812 return lola_mixer_set_dest_gains(chip, dst, mask, gains);
827 static int create_dest_gain_mixer(struct lola *chip,
835 return snd_ctl_add(chip->card,
836 snd_ctl_new1(&lola_dest_gain_mixer, chip));
842 int lola_create_mixer(struct lola *chip) in lola_create_mixer() argument
846 err = create_analog_mixer(chip, PLAY, "Analog Playback Volume"); in lola_create_mixer()
849 err = create_analog_mixer(chip, CAPT, "Analog Capture Volume"); in lola_create_mixer()
852 err = create_input_src_mixer(chip); in lola_create_mixer()
855 err = create_src_gain_mixer(chip, chip->mixer.src_phys_ins, 0, in lola_create_mixer()
859 err = create_src_gain_mixer(chip, chip->mixer.src_stream_outs, in lola_create_mixer()
860 chip->mixer.src_stream_out_ofs, in lola_create_mixer()
866 err = create_dest_gain_mixer(chip, in lola_create_mixer()
867 chip->mixer.src_phys_ins, 0, in lola_create_mixer()
868 chip->mixer.dest_stream_ins, 0, in lola_create_mixer()
872 err = create_dest_gain_mixer(chip, in lola_create_mixer()
873 chip->mixer.src_stream_outs, in lola_create_mixer()
874 chip->mixer.src_stream_out_ofs, in lola_create_mixer()
875 chip->mixer.dest_stream_ins, 0, in lola_create_mixer()
879 err = create_dest_gain_mixer(chip, in lola_create_mixer()
880 chip->mixer.src_phys_ins, 0, in lola_create_mixer()
881 chip->mixer.dest_phys_outs, in lola_create_mixer()
882 chip->mixer.dest_phys_out_ofs, in lola_create_mixer()
886 err = create_dest_gain_mixer(chip, in lola_create_mixer()
887 chip->mixer.src_stream_outs, in lola_create_mixer()
888 chip->mixer.src_stream_out_ofs, in lola_create_mixer()
889 chip->mixer.dest_phys_outs, in lola_create_mixer()
890 chip->mixer.dest_phys_out_ofs, in lola_create_mixer()
895 return init_mixer_values(chip); in lola_create_mixer()