To create an ac97 instance, first call snd_ac97_bus with an ac97_bus_ops_t record with callback functions.

  struct snd_ac97_bus *bus;
  static struct snd_ac97_bus_ops ops = {
        .write = snd_mychip_ac97_write,
        .read = snd_mychip_ac97_read,

  snd_ac97_bus(card, 0, &ops, NULL, &pbus);


The bus record is shared among all belonging ac97 instances.

And then call snd_ac97_mixer() with an struct snd_ac97_template record together with the bus pointer created above.

  struct snd_ac97_template ac97;
  int err;

  memset(&ac97, 0, sizeof(ac97));
  ac97.private_data = chip;
  snd_ac97_mixer(bus, &ac97, &chip->ac97);


where chip->ac97 is a pointer to a newly created ac97_t instance. In this case, the chip pointer is set as the private data, so that the read/write callback functions can refer to this chip instance. This instance is not necessarily stored in the chip record. If you need to change the register values from the driver, or need the suspend/resume of ac97 codecs, keep this pointer to pass to the corresponding functions.