static void set_ak4396_params(struct oxygen *chip, struct snd_pcm_hw_params *params) { struct generic_data *data = chip->model_data; unsigned int i; u8 value; value = data->ak4396_ctl2 & ~AK4396_DFS_MASK; if (params_rate(params) <= 54000) value |= AK4396_DFS_NORMAL; else if (params_rate(params) <= 108000) value |= AK4396_DFS_DOUBLE; else value |= AK4396_DFS_QUAD; data->ak4396_ctl2 = value; msleep(1); /* wait for the new MCLK to become stable */ for (i = 0; i < 4; ++i) { ak4396_write(chip, i, AK4396_CONTROL_1, AK4396_DIF_24_MSB); ak4396_write(chip, i, AK4396_CONTROL_2, value); ak4396_write(chip, i, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); } }
static void update_ak4396_volume(struct oxygen *chip) { unsigned int i; for (i = 0; i < 4; ++i) { ak4396_write(chip, i, AK4396_LCH_ATT, chip->dac_volume[i * 2]); ak4396_write(chip, i, AK4396_RCH_ATT, chip->dac_volume[i * 2 + 1]); } }
static void ak4396_registers_init(struct oxygen *chip) { struct generic_data *data = chip->model_data; unsigned int i; for (i = 0; i < 4; ++i) { ak4396_write(chip, i, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); ak4396_write(chip, i, AK4396_CONTROL_2, data->ak4396_ctl2); ak4396_write(chip, i, AK4396_CONTROL_3, AK4396_PCM); } update_ak4396_volume(chip); }
static void ak4396_write_cached(struct oxygen *chip, unsigned int codec, u8 reg, u8 value) { struct generic_data *data = chip->model_data; if (value != data->ak4396_regs[codec][reg]) ak4396_write(chip, codec, reg, value); }
static void ak4396_registers_init(struct oxygen *chip) { struct generic_data *data = chip->model_data; unsigned int i; for (i = 0; i < data->dacs; ++i) { ak4396_write(chip, i, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); ak4396_write(chip, i, AK4396_CONTROL_2, data->ak4396_regs[0][AK4396_CONTROL_2]); ak4396_write(chip, i, AK4396_CONTROL_3, AK4396_PCM); ak4396_write(chip, i, AK4396_LCH_ATT, chip->dac_volume[i * 2]); ak4396_write(chip, i, AK4396_RCH_ATT, chip->dac_volume[i * 2 + 1]); } }
static void ak4396_init(struct oxygen *chip) { struct generic_data *data = chip->model_data; unsigned int i; data->ak4396_ctl2 = AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL; for (i = 0; i < 4; ++i) { ak4396_write(chip, i, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); ak4396_write(chip, i, AK4396_CONTROL_2, data->ak4396_ctl2); ak4396_write(chip, i, AK4396_CONTROL_3, AK4396_PCM); ak4396_write(chip, i, AK4396_LCH_ATT, 0); ak4396_write(chip, i, AK4396_RCH_ATT, 0); } snd_component_add(chip->card, "AK4396"); }
/* * initialize the chip */ void ProdigyHD2_Init(struct CardData *card) { static unsigned short ak4396_inits[] = { AK4396_CTRL1, 0x87, /* I2S Normal Mode, 24 bit */ AK4396_CTRL2, 0x02, AK4396_CTRL3, 0x00, AK4396_LCH_ATT, 0xFF, AK4396_RCH_ATT, 0xFF, }; int i; /* initialize ak4396 codec */ /* reset codec */ ak4396_write(card, AK4396_CTRL1, 0x86); MicroDelay(100); ak4396_write(card, AK4396_CTRL1, 0x87); for (i = 0; i < 10; i += 2) ak4396_write(card, ak4396_inits[i], ak4396_inits[i+1]); }
static int prodigy_hd2_resume(struct snd_ice1712 *ice) { struct prodigy_hifi_spec *spec = ice->spec; int i; mutex_lock(&ice->gpio_mutex); ak4396_init(ice); for (i = 0; i < 2; i++) ak4396_write(ice, AK4396_LCH_ATT + i, spec->vol[i] & 0xff); mutex_unlock(&ice->gpio_mutex); return 0; }
static void ak4396_init(struct snd_ice1712 *ice) { static unsigned short ak4396_inits[] = { AK4396_CTRL1, 0x87, AK4396_CTRL2, 0x02, AK4396_CTRL3, 0x00, AK4396_LCH_ATT, 0x00, AK4396_RCH_ATT, 0x00, }; unsigned int i; ak4396_write(ice, AK4396_CTRL1, 0x86); msleep(100); ak4396_write(ice, AK4396_CTRL1, 0x87); for (i = 0; i < ARRAY_SIZE(ak4396_inits); i += 2) ak4396_write(ice, ak4396_inits[i], ak4396_inits[i+1]); }
static void update_ak4396_mute(struct oxygen *chip) { struct generic_data *data = chip->model_data; unsigned int i; u8 value; value = data->ak4396_ctl2 & ~AK4396_SMUTE; if (chip->dac_mute) value |= AK4396_SMUTE; data->ak4396_ctl2 = value; for (i = 0; i < 4; ++i) ak4396_write(chip, i, AK4396_CONTROL_2, value); }
static int ak4396_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); struct prodigy_hifi_spec *spec = ice->spec; int i; int change = 0; mutex_lock(&ice->gpio_mutex); for (i = 0; i < 2; i++) { if (ucontrol->value.integer.value[i] != spec->vol[i]) { spec->vol[i] = ucontrol->value.integer.value[i]; ak4396_write(ice, AK4396_LCH_ATT + i, spec->vol[i] & 0xff); change = 1; } } mutex_unlock(&ice->gpio_mutex); return change; }
static int rolloff_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) { struct oxygen *chip = ctl->private_data; struct generic_data *data = chip->model_data; unsigned int i; int changed; u8 reg; mutex_lock(&chip->mutex); reg = data->ak4396_regs[0][AK4396_CONTROL_2]; if (value->value.enumerated.item[0]) reg |= AK4396_SLOW; else reg &= ~AK4396_SLOW; changed = reg != data->ak4396_regs[0][AK4396_CONTROL_2]; if (changed) { for (i = 0; i < data->dacs; ++i) ak4396_write(chip, i, AK4396_CONTROL_2, reg); } mutex_unlock(&chip->mutex); return changed; }