FreeBSD Architecture Handbook
Prev | Chapter 15 Sound subsystem | Next

# 15.3 Probing, attaching, etc.

Sound drivers probe and attach in almost the same way as any hardware driver module. You might want to look at the ISA or PCI specific sections of the handbook for more information.

However, sound drivers differ in some ways:

- They declare themselves as `pcm` class devices, with a `struct snddev_info` device private structure:

                static driver_t xxx_driver = {
                    "pcm",
                    xxx_methods,
                    sizeof(struct snddev_info)
                };

                DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0);
                MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);

  Most sound drivers need to store additional private information about their device. A private data structure is usually allocated in the attach routine. Its address is passed to `pcm` by the calls to `pcm_register()` and `mixer_init()`. `pcm` later passes back this address as a parameter in calls to the sound driver interfaces.

- The sound driver attach routine should declare its MIXER or AC97 interface to `pcm` by calling `mixer_init()`. For a MIXER interface, this causes in turn a call to `xxxmixer_init()`.

- The sound driver attach routine declares its general CHANNEL configuration to `pcm` by calling `pcm_register(dev, sc, nplay, nrec)`, where `sc` is the address for the device data structure, used in further calls from `pcm`, and `nplay` and `nrec` are the number of play and record channels.

- The sound driver attach routine declares each of its channel objects by calls to `pcm_addchan()`. This sets up the channel glue in `pcm` and causes in turn a call to `xxxchannel_init()`.

- The sound driver detach routine should call `pcm_unregister()` before releasing its resources.

There are two possible methods to handle non-PnP devices:

- Use a `device_identify()` method (example: `sound/isa/es1888.c`). The `device_identify()` method probes for the hardware at known addresses and, if it finds a supported device, creates a new pcm device which is then passed to probe/attach.

- Use a custom kernel configuration with appropriate hints for pcm devices (example: `sound/isa/mss.c`).

`pcm` drivers should implement `device_suspend`, `device_resume` and `device_shutdown` routines, so that power management and module unloading function correctly.

Prev | Home | Next
Files | Up | Interfaces