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.