/* * vx_reset_codec - reset and initialize the codecs */ void vx_reset_codec(struct vx_core *chip, int cold_reset) { unsigned int i; int port = chip->type >= VX_TYPE_VXPOCKET ? 0x75 : 0x65; chip->ops->reset_codec(chip); /* AKM codecs should be initialized in reset_codec callback */ if (! chip->ops->akm_write) { /* initialize old codecs */ for (i = 0; i < chip->hw->num_codecs; i++) { /* DAC control register (change level when zero crossing + mute) */ vx_set_codec_reg(chip, i, XX_CODEC_DAC_CONTROL_REGISTER, DAC_ATTEN_MAX); /* ADC control register */ vx_set_codec_reg(chip, i, XX_CODEC_ADC_CONTROL_REGISTER, 0x00); /* Port mode register */ vx_set_codec_reg(chip, i, XX_CODEC_PORT_MODE_REGISTER, port); /* Clock control register */ vx_set_codec_reg(chip, i, XX_CODEC_CLOCK_CONTROL_REGISTER, 0x00); } } /* mute analog output */ for (i = 0; i < chip->hw->num_codecs; i++) { chip->output_level[i][0] = 0; chip->output_level[i][1] = 0; vx_set_analog_output_level(chip, i, 0, 0); } }
static int vx_output_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct vx_core *chip = snd_kcontrol_chip(kcontrol); int codec = kcontrol->id.index; mutex_lock(&chip->mixer_mutex); if (ucontrol->value.integer.value[0] != chip->output_level[codec][0] || ucontrol->value.integer.value[1] != chip->output_level[codec][1]) { vx_set_analog_output_level(chip, codec, ucontrol->value.integer.value[0], ucontrol->value.integer.value[1]); chip->output_level[codec][0] = ucontrol->value.integer.value[0]; chip->output_level[codec][1] = ucontrol->value.integer.value[1]; mutex_unlock(&chip->mixer_mutex); return 1; } mutex_unlock(&chip->mixer_mutex); return 0; }
static int vx_output_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct vx_core *chip = snd_kcontrol_chip(kcontrol); int codec = kcontrol->id.index; unsigned int val[2], vmax; vmax = chip->hw->output_level_max; val[0] = ucontrol->value.integer.value[0]; val[1] = ucontrol->value.integer.value[1]; if (val[0] > vmax || val[1] > vmax) return -EINVAL; mutex_lock(&chip->mixer_mutex); if (val[0] != chip->output_level[codec][0] || val[1] != chip->output_level[codec][1]) { vx_set_analog_output_level(chip, codec, val[0], val[1]); chip->output_level[codec][0] = val[0]; chip->output_level[codec][1] = val[1]; mutex_unlock(&chip->mixer_mutex); return 1; } mutex_unlock(&chip->mixer_mutex); return 0; }