forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ALSA: seq: Define driver object in each driver
This patch moves the driver object initialization and allocation to each driver's module init/exit code like other normal drivers. The snd_seq_driver struct is now published in seq_device.h, and each driver is responsible to define it with proper driver attributes (name, probe and remove) with snd_seq_driver specific attributes as id and argsize fields. The helper functions snd_seq_driver_register(), snd_seq_driver_unregister() and module_snd_seq_driver() are used for simplifying codes. Signed-off-by: Takashi Iwai <[email protected]>
- Loading branch information
Showing
10 changed files
with
124 additions
and
191 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -52,16 +52,6 @@ MODULE_AUTHOR("Takashi Iwai <[email protected]>"); | |
MODULE_DESCRIPTION("ALSA sequencer device management"); | ||
MODULE_LICENSE("GPL"); | ||
|
||
struct snd_seq_driver { | ||
struct device_driver driver; | ||
const char *id; | ||
int argsize; | ||
struct snd_seq_dev_ops ops; | ||
}; | ||
|
||
#define to_seq_drv(_drv) \ | ||
container_of(_drv, struct snd_seq_driver, driver) | ||
|
||
/* | ||
* bus definition | ||
*/ | ||
|
@@ -263,86 +253,23 @@ int snd_seq_device_new(struct snd_card *card, int device, const char *id, | |
EXPORT_SYMBOL(snd_seq_device_new); | ||
|
||
/* | ||
* driver binding - just pass to each driver callback | ||
* driver registration | ||
*/ | ||
static int snd_seq_drv_probe(struct device *dev) | ||
int __snd_seq_driver_register(struct snd_seq_driver *drv, struct module *mod) | ||
{ | ||
struct snd_seq_driver *sdrv = to_seq_drv(dev->driver); | ||
struct snd_seq_device *sdev = to_seq_dev(dev); | ||
|
||
return sdrv->ops.init_device(sdev); | ||
} | ||
|
||
static int snd_seq_drv_remove(struct device *dev) | ||
{ | ||
struct snd_seq_driver *sdrv = to_seq_drv(dev->driver); | ||
struct snd_seq_device *sdev = to_seq_dev(dev); | ||
|
||
return sdrv->ops.free_device(sdev); | ||
} | ||
|
||
/* | ||
* register device driver | ||
* id = driver id | ||
* entry = driver operators - duplicated to each instance | ||
*/ | ||
int snd_seq_device_register_driver(const char *id, | ||
struct snd_seq_dev_ops *entry, int argsize) | ||
{ | ||
struct snd_seq_driver *sdrv; | ||
int err; | ||
|
||
if (id == NULL || entry == NULL || | ||
entry->init_device == NULL || entry->free_device == NULL) | ||
if (WARN_ON(!drv->driver.name || !drv->id)) | ||
return -EINVAL; | ||
|
||
sdrv = kzalloc(sizeof(*sdrv), GFP_KERNEL); | ||
if (!sdrv) | ||
return -ENOMEM; | ||
|
||
sdrv->driver.name = id; | ||
sdrv->driver.bus = &snd_seq_bus_type; | ||
sdrv->driver.probe = snd_seq_drv_probe; | ||
sdrv->driver.remove = snd_seq_drv_remove; | ||
sdrv->id = id; | ||
sdrv->argsize = argsize; | ||
sdrv->ops = *entry; | ||
|
||
err = driver_register(&sdrv->driver); | ||
if (err < 0) | ||
kfree(sdrv); | ||
return err; | ||
} | ||
EXPORT_SYMBOL(snd_seq_device_register_driver); | ||
|
||
/* callback to find a specific driver; data is a pointer to the id string ptr. | ||
* when the id matches, store the driver pointer in return and break the loop. | ||
*/ | ||
static int find_drv(struct device_driver *drv, void *data) | ||
{ | ||
struct snd_seq_driver *sdrv = to_seq_drv(drv); | ||
void **ptr = (void **)data; | ||
|
||
if (strcmp(sdrv->id, *ptr)) | ||
return 0; /* id don't match, continue the loop */ | ||
*ptr = sdrv; | ||
return 1; /* break the loop */ | ||
drv->driver.bus = &snd_seq_bus_type; | ||
drv->driver.owner = mod; | ||
return driver_register(&drv->driver); | ||
} | ||
EXPORT_SYMBOL_GPL(__snd_seq_driver_register); | ||
|
||
/* | ||
* unregister the specified driver | ||
*/ | ||
int snd_seq_device_unregister_driver(const char *id) | ||
void snd_seq_driver_unregister(struct snd_seq_driver *drv) | ||
{ | ||
struct snd_seq_driver *sdrv = (struct snd_seq_driver *)id; | ||
|
||
if (!bus_for_each_drv(&snd_seq_bus_type, NULL, &sdrv, find_drv)) | ||
return -ENXIO; | ||
driver_unregister(&sdrv->driver); | ||
kfree(sdrv); | ||
return 0; | ||
driver_unregister(&drv->driver); | ||
} | ||
EXPORT_SYMBOL(snd_seq_device_unregister_driver); | ||
EXPORT_SYMBOL_GPL(snd_seq_driver_unregister); | ||
|
||
/* | ||
* module part | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.