unsigned short num; /* number of codec: 0 = primary, 1 = secondary */
unsigned short addr; /* physical address of codec [0-3] */
unsigned int scaps; /* driver capabilities */
- unsigned int limited_regs; /* allow limited registers only */
- DECLARE_BITMAP(reg_accessed, 0x80); /* bit flags */
const struct snd_ac97_res_table *res_table; /* static resolution */
};
unsigned int rates[6]; /* see AC97_RATES_* defines */
unsigned int spdif_status;
unsigned short regs[0x80]; /* register cache */
- unsigned int limited_regs; /* allow limited registers only */
DECLARE_BITMAP(reg_accessed, 0x80); /* bit flags */
union { /* vendor specific code */
struct {
static int snd_ac97_valid_reg(struct snd_ac97 *ac97, unsigned short reg)
{
- if (ac97->limited_regs && ! test_bit(reg, ac97->reg_accessed))
- return 0;
-
/* filter some registers for buggy codecs */
switch (ac97->id) {
case AC97_ID_AK4540:
break;
}
- if (ac97->limited_regs && test_bit(reg, ac97->reg_accessed))
- return 1; /* allow without check */
-
val = snd_ac97_read(ac97, reg);
if (!(val & mask)) {
/* nothing seems to be here - mute flag is not set */
ac97->num = template->num;
ac97->addr = template->addr;
ac97->scaps = template->scaps;
- ac97->limited_regs = template->limited_regs;
- memcpy(ac97->reg_accessed, template->reg_accessed, sizeof(ac97->reg_accessed));
ac97->res_table = template->res_table;
bus->codec[ac97->num] = ac97;
mutex_init(&ac97->reg_mutex);