提交 841b23d4 编写于 作者: P Pavel Hofman 提交者: Takashi Iwai

[ALSA] some fixes and cleanup for ICE1724 cards

* removing the hack with NON_AKM ak4xxx type
* support for card-specific flags in ak4114_stats
* definition of the flags for corresponding cards
Signed-off-by: NPavel Hofman <dustin@seznam.cz>
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 5949d244
...@@ -182,6 +182,7 @@ struct ak4114 { ...@@ -182,6 +182,7 @@ struct ak4114 {
unsigned char rcs0; unsigned char rcs0;
unsigned char rcs1; unsigned char rcs1;
struct delayed_work work; struct delayed_work work;
unsigned int check_flags;
void *change_callback_private; void *change_callback_private;
void (*change_callback)(struct ak4114 *ak4114, unsigned char c0, unsigned char c1); void (*change_callback)(struct ak4114 *ak4114, unsigned char c0, unsigned char c1);
}; };
......
...@@ -68,7 +68,7 @@ struct snd_akm4xxx { ...@@ -68,7 +68,7 @@ struct snd_akm4xxx {
enum { enum {
SND_AK4524, SND_AK4528, SND_AK4529, SND_AK4524, SND_AK4528, SND_AK4529,
SND_AK4355, SND_AK4358, SND_AK4381, SND_AK4355, SND_AK4358, SND_AK4381,
SND_AK5365, NON_AKM SND_AK5365
} type; } type;
/* (array) information of combined codecs */ /* (array) information of combined codecs */
......
...@@ -612,7 +612,7 @@ static void ak4114_stats(struct work_struct *work) ...@@ -612,7 +612,7 @@ static void ak4114_stats(struct work_struct *work)
struct ak4114 *chip = container_of(work, struct ak4114, work.work); struct ak4114 *chip = container_of(work, struct ak4114, work.work);
if (!chip->init) if (!chip->init)
snd_ak4114_check_rate_and_errors(chip, 0); snd_ak4114_check_rate_and_errors(chip, chip->check_flags);
schedule_delayed_work(&chip->work, HZ / 10); schedule_delayed_work(&chip->work, HZ / 10);
} }
......
...@@ -70,7 +70,8 @@ static void ak4524_reset(struct snd_akm4xxx *ak, int state) ...@@ -70,7 +70,8 @@ static void ak4524_reset(struct snd_akm4xxx *ak, int state)
} }
/* reset procedure for AK4355 and AK4358 */ /* reset procedure for AK4355 and AK4358 */
static void ak4355_reset(struct snd_akm4xxx *ak, int state) static void ak435X_reset(struct snd_akm4xxx *ak, int state,
unsigned char total_regs)
{ {
unsigned char reg; unsigned char reg;
...@@ -78,7 +79,7 @@ static void ak4355_reset(struct snd_akm4xxx *ak, int state) ...@@ -78,7 +79,7 @@ static void ak4355_reset(struct snd_akm4xxx *ak, int state)
snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */ snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */
return; return;
} }
for (reg = 0x00; reg < 0x0b; reg++) for (reg = 0x00; reg < total_regs; reg++)
if (reg != 0x01) if (reg != 0x01)
snd_akm4xxx_write(ak, 0, reg, snd_akm4xxx_write(ak, 0, reg,
snd_akm4xxx_get(ak, 0, reg)); snd_akm4xxx_get(ak, 0, reg));
...@@ -118,8 +119,10 @@ void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state) ...@@ -118,8 +119,10 @@ void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state)
/* FIXME: needed for ak4529? */ /* FIXME: needed for ak4529? */
break; break;
case SND_AK4355: case SND_AK4355:
ak435X_reset(ak, state, 0x0b);
break;
case SND_AK4358: case SND_AK4358:
ak4355_reset(ak, state); ak435X_reset(ak, state, 0x10);
break; break;
case SND_AK4381: case SND_AK4381:
ak4381_reset(ak, state); ak4381_reset(ak, state);
...@@ -292,11 +295,6 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak) ...@@ -292,11 +295,6 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak)
case SND_AK5365: case SND_AK5365:
/* FIXME: any init sequence? */ /* FIXME: any init sequence? */
return; return;
case NON_AKM:
/* fake value for non-akm codecs using akm infrastructure
* (e.g. of ice1724) - certainly FIXME
*/
return;
default: default:
snd_BUG(); snd_BUG();
return; return;
...@@ -374,6 +372,8 @@ static int put_ak_reg(struct snd_kcontrol *kcontrol, int addr, ...@@ -374,6 +372,8 @@ static int put_ak_reg(struct snd_kcontrol *kcontrol, int addr,
nval = mask - nval; nval = mask - nval;
if (AK_GET_NEEDSMSB(kcontrol->private_value)) if (AK_GET_NEEDSMSB(kcontrol->private_value))
nval |= 0x80; nval |= 0x80;
/* printk(KERN_DEBUG "DEBUG - AK writing reg: chip %x addr %x,
nval %x\n", chip, addr, nval); */
snd_akm4xxx_write(ak, chip, addr, nval); snd_akm4xxx_write(ak, chip, addr, nval);
return 1; return 1;
} }
......
...@@ -319,12 +319,11 @@ static int stac9460_mic_sw_put(struct snd_kcontrol *kcontrol, ...@@ -319,12 +319,11 @@ static int stac9460_mic_sw_put(struct snd_kcontrol *kcontrol,
/* /*
* Handler for setting correct codec rate - called when rate change is detected * Handler for setting correct codec rate - called when rate change is detected
*/ */
static void stac9460_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate) static void stac9460_set_rate_val(struct snd_ice1712 *ice, unsigned int rate)
{ {
unsigned char old, new; unsigned char old, new;
int idx; int idx;
unsigned char changed[7]; unsigned char changed[7];
struct snd_ice1712 *ice = ak->private_data[0];
struct prodigy192_spec *spec = ice->spec; struct prodigy192_spec *spec = ice->spec;
if (rate == 0) /* no hint - S/PDIF input is master, simply return */ if (rate == 0) /* no hint - S/PDIF input is master, simply return */
...@@ -357,16 +356,6 @@ static void stac9460_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate) ...@@ -357,16 +356,6 @@ static void stac9460_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate)
mutex_unlock(&spec->mute_mutex); mutex_unlock(&spec->mute_mutex);
} }
/* using akm infrastructure for setting rate of the codec */
static struct snd_akm4xxx akmlike_stac9460 __devinitdata = {
.type = NON_AKM, /* special value */
.num_adcs = 6, /* not used in any way, just for completeness */
.num_dacs = 2,
.ops = {
.set_rate_val = stac9460_set_rate_val
}
};
static const DECLARE_TLV_DB_SCALE(db_scale_dac, -19125, 75, 0); static const DECLARE_TLV_DB_SCALE(db_scale_dac, -19125, 75, 0);
static const DECLARE_TLV_DB_SCALE(db_scale_adc, 0, 150, 0); static const DECLARE_TLV_DB_SCALE(db_scale_adc, 0, 150, 0);
...@@ -642,12 +631,19 @@ static int prodigy192_ak4114_init(struct snd_ice1712 *ice) ...@@ -642,12 +631,19 @@ static int prodigy192_ak4114_init(struct snd_ice1712 *ice)
0x41, 0x02, 0x2c, 0x00, 0x00 0x41, 0x02, 0x2c, 0x00, 0x00
}; };
struct prodigy192_spec *spec = ice->spec; struct prodigy192_spec *spec = ice->spec;
int err;
return snd_ak4114_create(ice->card, err = snd_ak4114_create(ice->card,
prodigy192_ak4114_read, prodigy192_ak4114_read,
prodigy192_ak4114_write, prodigy192_ak4114_write,
ak4114_init_vals, ak4114_init_txcsb, ak4114_init_vals, ak4114_init_txcsb,
ice, &spec->ak4114); ice, &spec->ak4114);
if (err < 0)
return err;
/* AK4114 in Prodigy192 cannot detect external rate correctly.
* No reason to stop capture stream due to incorrect checks */
spec->ak4114->check_flags = AK4114_CHECK_NO_RATE;
return 0;
} }
static void stac9460_proc_regs_read(struct snd_info_entry *entry, static void stac9460_proc_regs_read(struct snd_info_entry *entry,
...@@ -743,7 +739,6 @@ static int __devinit prodigy192_init(struct snd_ice1712 *ice) ...@@ -743,7 +739,6 @@ static int __devinit prodigy192_init(struct snd_ice1712 *ice)
}; };
const unsigned short *p; const unsigned short *p;
int err = 0; int err = 0;
struct snd_akm4xxx *ak;
struct prodigy192_spec *spec; struct prodigy192_spec *spec;
/* prodigy 192 */ /* prodigy 192 */
...@@ -761,15 +756,7 @@ static int __devinit prodigy192_init(struct snd_ice1712 *ice) ...@@ -761,15 +756,7 @@ static int __devinit prodigy192_init(struct snd_ice1712 *ice)
p = stac_inits_prodigy; p = stac_inits_prodigy;
for (; *p != (unsigned short)-1; p += 2) for (; *p != (unsigned short)-1; p += 2)
stac9460_put(ice, p[0], p[1]); stac9460_put(ice, p[0], p[1]);
/* reusing the akm codecs infrastructure, ice->gpio.set_pro_rate = stac9460_set_rate_val;
* for setting rate on stac9460 */
ak = ice->akm = kmalloc(sizeof(struct snd_akm4xxx), GFP_KERNEL);
if (!ak)
return -ENOMEM;
ice->akm_codecs = 1;
err = snd_ice1712_akm4xxx_init(ak, &akmlike_stac9460, NULL, ice);
if (err < 0)
return err;
/* MI/ODI/O add on card with AK4114 */ /* MI/ODI/O add on card with AK4114 */
if (prodigy192_miodio_exists(ice)) { if (prodigy192_miodio_exists(ice)) {
......
...@@ -488,6 +488,10 @@ static int __devinit ap192_ak4114_init(struct snd_ice1712 *ice) ...@@ -488,6 +488,10 @@ static int __devinit ap192_ak4114_init(struct snd_ice1712 *ice)
ap192_ak4114_write, ap192_ak4114_write,
ak4114_init_vals, ak4114_init_txcsb, ak4114_init_vals, ak4114_init_txcsb,
ice, &ak); ice, &ak);
/* AK4114 in Revo cannot detect external rate correctly.
* No reason to stop capture stream due to incorrect checks */
ak->check_flags = AK4114_CHECK_NO_RATE;
return 0; /* error ignored; it's no fatal error */ return 0; /* error ignored; it's no fatal error */
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册