[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: Pavel Hofman <dustin@seznam.cz>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Pavel Hofman 2008-03-17 08:45:33 +01:00 committed by Takashi Iwai
parent 5949d2443d
commit 841b23d4d7
6 changed files with 25 additions and 33 deletions

View File

@ -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);
}; };

View File

@ -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 */

View File

@ -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);
} }

View File

@ -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)
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)
/* 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)
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,
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;
} }

View File

@ -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)
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)
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)
}; };
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)
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)) {

View File

@ -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 */
} }