示例#1
0
文件: vx_mixer.c 项目: yogesum/linux
/*
 * 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);
    }
}
示例#2
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;
}
示例#3
0
文件: vx_mixer.c 项目: yogesum/linux
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;
}