diff options
| author | Uwe Kleine-König <u.kleine-koenig@baylibre.com> | 2025-12-09 13:38:43 +0100 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2025-12-14 11:08:09 +0100 |
| commit | a89f7f08182954f51fcec1c8c65dec0c6cfc778e (patch) | |
| tree | bc355b371a0dc35ebd0963cabb79c01cdf53c419 | |
| parent | 8f0b4cce4481fb22653697cced8d0d04027cb1e8 (diff) | |
ALSA: seq: Use bus specific probe and remove
Introduce a bus specific probe and remove function. For now this only
allows to get rid of a cast of the generic device to an snd_seq device
in the drivers and changes the remove prototype to return void---a
non-zero return value is ignored anyhow.
The objective is to get rid of users of struct device callbacks
.probe(), .remove() and .shutdown() to eventually remove these. Until
all snd_seq drivers are converted this results in a runtime warning
about the drivers needing an update because there is a bus probe
function and a driver probe function.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/f36b01b297fc5cbb6d0ed4959143add0c13eec99.1765283601.git.u.kleine-koenig@baylibre.com
| -rw-r--r-- | include/sound/seq_device.h | 2 | ||||
| -rw-r--r-- | sound/core/seq_device.c | 47 |
2 files changed, 49 insertions, 0 deletions
diff --git a/include/sound/seq_device.h b/include/sound/seq_device.h index dead74b022f4..a72380c202e9 100644 --- a/include/sound/seq_device.h +++ b/include/sound/seq_device.h @@ -43,6 +43,8 @@ struct snd_seq_device { * Typically, call snd_device_free(dev->card, dev->driver_data) */ struct snd_seq_driver { + int (*probe)(struct snd_seq_device *dev); + void (*remove)(struct snd_seq_device *dev); struct device_driver driver; char *id; int argsize; diff --git a/sound/core/seq_device.c b/sound/core/seq_device.c index bac9f8603734..01def5b739a6 100644 --- a/sound/core/seq_device.c +++ b/sound/core/seq_device.c @@ -49,9 +49,31 @@ static int snd_seq_bus_match(struct device *dev, const struct device_driver *drv sdrv->argsize == sdev->argsize; } +static int snd_seq_bus_probe(struct device *dev) +{ + struct snd_seq_device *sdev = to_seq_dev(dev); + const struct snd_seq_driver *sdrv = to_seq_drv(dev->driver); + + if (sdrv->probe) + return sdrv->probe(sdev); + else + return 0; +} + +static void snd_seq_bus_remove(struct device *dev) +{ + struct snd_seq_device *sdev = to_seq_dev(dev); + const struct snd_seq_driver *sdrv = to_seq_drv(dev->driver); + + if (sdrv->remove) + sdrv->remove(sdev); +} + static const struct bus_type snd_seq_bus_type = { .name = "snd_seq", .match = snd_seq_bus_match, + .probe = snd_seq_bus_probe, + .remove = snd_seq_bus_remove, }; /* @@ -242,6 +264,25 @@ int snd_seq_device_new(struct snd_card *card, int device, const char *id, } EXPORT_SYMBOL(snd_seq_device_new); +static int snd_seq_driver_legacy_probe(struct snd_seq_device *sdev) +{ + struct device *dev = &sdev->dev; + struct device_driver *driver = dev->driver; + + return driver->probe(dev); +} + +static void snd_seq_driver_legacy_remove(struct snd_seq_device *sdev) +{ + struct device *dev = &sdev->dev; + struct device_driver *driver = dev->driver; + int ret; + + ret = driver->remove(dev); + if (unlikely(ret)) + dev_warn(dev, "Ignoring return value of remove callback (%pe)\n", ERR_PTR(ret)); +} + /* * driver registration */ @@ -251,6 +292,12 @@ int __snd_seq_driver_register(struct snd_seq_driver *drv, struct module *mod) return -EINVAL; drv->driver.bus = &snd_seq_bus_type; drv->driver.owner = mod; + + if (!drv->probe && drv->driver.probe) + drv->probe = snd_seq_driver_legacy_probe; + if (!drv->remove && drv->driver.remove) + drv->remove = snd_seq_driver_legacy_remove; + return driver_register(&drv->driver); } EXPORT_SYMBOL_GPL(__snd_seq_driver_register); |
