Hardware-Dependent Devices
Prev | Chapter 10. Miscellaneous Devices | Next

## Hardware-Dependent Devices

Some chips need user-space access for special controls or for loading the micro code. In such a case, you can create a hwdep (hardware-dependent) device. The hwdep API is defined in `<sound/hwdep.h>`. You can find examples in opl3 driver or `isa/sb/sb16_csp.c`.

The creation of the hwdep instance is done via `snd_hwdep_new()`.

      struct snd_hwdep *hw;
      snd_hwdep_new(card, "My HWDEP", 0, &hw);

where the third argument is the index number.

You can then pass any pointer value to the `private_data`. If you assign a private data, you should define the destructor, too. The destructor function is set in the `private_free` field.

      struct mydata *p = kmalloc(sizeof(*p), GFP_KERNEL);
      hw->private_data = p;
      hw->private_free = mydata_free;

and the implementation of the destructor would be:

      static void mydata_free(struct snd_hwdep *hw)
      {
              struct mydata *p = hw->private_data;
              kfree(p);
      }

The arbitrary file operations can be defined for this instance. The file operators are defined in the `ops` table. For example, assume that this chip needs an ioctl.

      hw->ops.open = mydata_open;
      hw->ops.ioctl = mydata_ioctl;
      hw->ops.release = mydata_release;

And implement the callback functions as you like.

Prev | Up | Next
Chapter 10. Miscellaneous Devices | Home | IEC958 (S/PDIF)