Updating Registers in The Driver

If you need to access to the codec from the driver, you can call the following functions: snd_ac97_write(), snd_ac97_read(), snd_ac97_update() and snd_ac97_update_bits().

Both snd_ac97_write() and snd_ac97_update() functions are used to set a value to the given register (AC97_XXX). The difference between them is that snd_ac97_update() doesn't write a value if the given value has been already set, while snd_ac97_write() always rewrites the value.

  snd_ac97_write(ac97, AC97_MASTER, 0x8080);
  snd_ac97_update(ac97, AC97_MASTER, 0x8080);


snd_ac97_read() is used to read the value of the given register. For example,

  value = snd_ac97_read(ac97, AC97_MASTER);


snd_ac97_update_bits() is used to update some bits in the given register.

  snd_ac97_update_bits(ac97, reg, mask, value);


Also, there is a function to change the sample rate (of a given register such as AC97_PCM_FRONT_DAC_RATE) when VRA or DRA is supported by the codec: snd_ac97_set_rate().

  snd_ac97_set_rate(ac97, AC97_PCM_FRONT_DAC_RATE, 44100);


The following registers are available to set the rate: AC97_PCM_MIC_ADC_RATE, AC97_PCM_FRONT_DAC_RATE, AC97_PCM_LR_ADC_RATE, AC97_SPDIF. When AC97_SPDIF is specified, the register is not really changed but the corresponding IEC958 status bits will be updated.