Commit d568121c authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela

[PATCH] Assign device pointer to OSS devices

Add register_sound_special_device() function to allow assignment of
device pointer to a specific OSS device for HAL.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 68c339d9
...@@ -29,7 +29,9 @@ ...@@ -29,7 +29,9 @@
* Sound core interface functions * Sound core interface functions
*/ */
struct device;
extern int register_sound_special(struct file_operations *fops, int unit); extern int register_sound_special(struct file_operations *fops, int unit);
extern int register_sound_special_device(struct file_operations *fops, int unit, struct device *dev);
extern int register_sound_mixer(struct file_operations *fops, int dev); extern int register_sound_mixer(struct file_operations *fops, int dev);
extern int register_sound_midi(struct file_operations *fops, int dev); extern int register_sound_midi(struct file_operations *fops, int dev);
extern int register_sound_dsp(struct file_operations *fops, int dev); extern int register_sound_dsp(struct file_operations *fops, int dev);
......
...@@ -98,6 +98,7 @@ int snd_register_oss_device(int type, snd_card_t * card, int dev, snd_minor_t * ...@@ -98,6 +98,7 @@ int snd_register_oss_device(int type, snd_card_t * card, int dev, snd_minor_t *
int cidx = SNDRV_MINOR_OSS_CARD(minor); int cidx = SNDRV_MINOR_OSS_CARD(minor);
int track2 = -1; int track2 = -1;
int register1 = -1, register2 = -1; int register1 = -1, register2 = -1;
struct device *carddev = NULL;
if (minor < 0) if (minor < 0)
return minor; return minor;
...@@ -121,11 +122,13 @@ int snd_register_oss_device(int type, snd_card_t * card, int dev, snd_minor_t * ...@@ -121,11 +122,13 @@ int snd_register_oss_device(int type, snd_card_t * card, int dev, snd_minor_t *
track2 = SNDRV_MINOR_OSS(cidx, SNDRV_MINOR_OSS_DMMIDI1); track2 = SNDRV_MINOR_OSS(cidx, SNDRV_MINOR_OSS_DMMIDI1);
break; break;
} }
register1 = register_sound_special(reg->f_ops, minor); if (card)
carddev = card->dev;
register1 = register_sound_special_device(reg->f_ops, minor, carddev);
if (register1 != minor) if (register1 != minor)
goto __end; goto __end;
if (track2 >= 0) { if (track2 >= 0) {
register2 = register_sound_special(reg->f_ops, track2); register2 = register_sound_special_device(reg->f_ops, track2, carddev);
if (register2 != track2) if (register2 != track2)
goto __end; goto __end;
} }
......
...@@ -153,7 +153,7 @@ static DEFINE_SPINLOCK(sound_loader_lock); ...@@ -153,7 +153,7 @@ static DEFINE_SPINLOCK(sound_loader_lock);
* list. Acquires locks as needed * list. Acquires locks as needed
*/ */
static int sound_insert_unit(struct sound_unit **list, struct file_operations *fops, int index, int low, int top, const char *name, umode_t mode) static int sound_insert_unit(struct sound_unit **list, struct file_operations *fops, int index, int low, int top, const char *name, umode_t mode, struct device *dev)
{ {
struct sound_unit *s = kmalloc(sizeof(*s), GFP_KERNEL); struct sound_unit *s = kmalloc(sizeof(*s), GFP_KERNEL);
int r; int r;
...@@ -175,7 +175,7 @@ static int sound_insert_unit(struct sound_unit **list, struct file_operations *f ...@@ -175,7 +175,7 @@ static int sound_insert_unit(struct sound_unit **list, struct file_operations *f
devfs_mk_cdev(MKDEV(SOUND_MAJOR, s->unit_minor), devfs_mk_cdev(MKDEV(SOUND_MAJOR, s->unit_minor),
S_IFCHR | mode, s->name); S_IFCHR | mode, s->name);
class_device_create(sound_class, MKDEV(SOUND_MAJOR, s->unit_minor), class_device_create(sound_class, MKDEV(SOUND_MAJOR, s->unit_minor),
NULL, s->name+6); dev, s->name+6);
return r; return r;
fail: fail:
...@@ -227,16 +227,18 @@ static void sound_remove_unit(struct sound_unit **list, int unit) ...@@ -227,16 +227,18 @@ static void sound_remove_unit(struct sound_unit **list, int unit)
static struct sound_unit *chains[SOUND_STEP]; static struct sound_unit *chains[SOUND_STEP];
/** /**
* register_sound_special - register a special sound node * register_sound_special_device - register a special sound node
* @fops: File operations for the driver * @fops: File operations for the driver
* @unit: Unit number to allocate * @unit: Unit number to allocate
* @dev: device pointer
* *
* Allocate a special sound device by minor number from the sound * Allocate a special sound device by minor number from the sound
* subsystem. The allocated number is returned on succes. On failure * subsystem. The allocated number is returned on succes. On failure
* a negative error code is returned. * a negative error code is returned.
*/ */
int register_sound_special(struct file_operations *fops, int unit) int register_sound_special_device(struct file_operations *fops, int unit,
struct device *dev)
{ {
const int chain = unit % SOUND_STEP; const int chain = unit % SOUND_STEP;
int max_unit = 128 + chain; int max_unit = 128 + chain;
...@@ -294,9 +296,16 @@ int register_sound_special(struct file_operations *fops, int unit) ...@@ -294,9 +296,16 @@ int register_sound_special(struct file_operations *fops, int unit)
break; break;
} }
return sound_insert_unit(&chains[chain], fops, -1, unit, max_unit, return sound_insert_unit(&chains[chain], fops, -1, unit, max_unit,
name, S_IRUSR | S_IWUSR); name, S_IRUSR | S_IWUSR, dev);
} }
EXPORT_SYMBOL(register_sound_special_device);
int register_sound_special(struct file_operations *fops, int unit)
{
return register_sound_special_device(fops, unit, NULL);
}
EXPORT_SYMBOL(register_sound_special); EXPORT_SYMBOL(register_sound_special);
/** /**
...@@ -312,7 +321,7 @@ EXPORT_SYMBOL(register_sound_special); ...@@ -312,7 +321,7 @@ EXPORT_SYMBOL(register_sound_special);
int register_sound_mixer(struct file_operations *fops, int dev) int register_sound_mixer(struct file_operations *fops, int dev)
{ {
return sound_insert_unit(&chains[0], fops, dev, 0, 128, return sound_insert_unit(&chains[0], fops, dev, 0, 128,
"mixer", S_IRUSR | S_IWUSR); "mixer", S_IRUSR | S_IWUSR, NULL);
} }
EXPORT_SYMBOL(register_sound_mixer); EXPORT_SYMBOL(register_sound_mixer);
...@@ -330,7 +339,7 @@ EXPORT_SYMBOL(register_sound_mixer); ...@@ -330,7 +339,7 @@ EXPORT_SYMBOL(register_sound_mixer);
int register_sound_midi(struct file_operations *fops, int dev) int register_sound_midi(struct file_operations *fops, int dev)
{ {
return sound_insert_unit(&chains[2], fops, dev, 2, 130, return sound_insert_unit(&chains[2], fops, dev, 2, 130,
"midi", S_IRUSR | S_IWUSR); "midi", S_IRUSR | S_IWUSR, NULL);
} }
EXPORT_SYMBOL(register_sound_midi); EXPORT_SYMBOL(register_sound_midi);
...@@ -356,7 +365,7 @@ EXPORT_SYMBOL(register_sound_midi); ...@@ -356,7 +365,7 @@ EXPORT_SYMBOL(register_sound_midi);
int register_sound_dsp(struct file_operations *fops, int dev) int register_sound_dsp(struct file_operations *fops, int dev)
{ {
return sound_insert_unit(&chains[3], fops, dev, 3, 131, return sound_insert_unit(&chains[3], fops, dev, 3, 131,
"dsp", S_IWUSR | S_IRUSR); "dsp", S_IWUSR | S_IRUSR, NULL);
} }
EXPORT_SYMBOL(register_sound_dsp); EXPORT_SYMBOL(register_sound_dsp);
...@@ -375,7 +384,7 @@ EXPORT_SYMBOL(register_sound_dsp); ...@@ -375,7 +384,7 @@ EXPORT_SYMBOL(register_sound_dsp);
int register_sound_synth(struct file_operations *fops, int dev) int register_sound_synth(struct file_operations *fops, int dev)
{ {
return sound_insert_unit(&chains[9], fops, dev, 9, 137, return sound_insert_unit(&chains[9], fops, dev, 9, 137,
"synth", S_IRUSR | S_IWUSR); "synth", S_IRUSR | S_IWUSR, NULL);
} }
EXPORT_SYMBOL(register_sound_synth); EXPORT_SYMBOL(register_sound_synth);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment