Commit e3d280fc authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Make snd_hda_bus_type public

Define the common hd-audio driver and device types to bind over
snd_hda_bus_type publicly.  This allows to implement other type of
device and driver code over hd-audio bus.

Now both struct hda_codec and struct hda_codec_driver inherit these
new struct hdac_device and struct hdac_driver, respectively.

The bus registration is done in subsys_initcall() to assure it
before any other driver registrations.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3372dbdd
/*
* HD-audio core stuff
*/
#ifndef __SOUND_HDAUDIO_H
#define __SOUND_HDAUDIO_H
#include <linux/device.h>
/*
* exported bus type
*/
extern struct bus_type snd_hda_bus_type;
/*
* HD-audio codec base device
*/
struct hdac_device {
struct device dev;
int type;
};
/* device/driver type used for matching */
enum {
HDA_DEV_CORE,
HDA_DEV_LEGACY,
};
#define dev_to_hdac_dev(_dev) container_of(_dev, struct hdac_device, dev)
/*
* HD-audio codec base driver
*/
struct hdac_driver {
struct device_driver driver;
int type;
int (*match)(struct hdac_device *dev, struct hdac_driver *drv);
};
#define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
#endif /* __SOUND_HDAUDIO_H */
...@@ -76,6 +76,8 @@ source "sound/isa/Kconfig" ...@@ -76,6 +76,8 @@ source "sound/isa/Kconfig"
source "sound/pci/Kconfig" source "sound/pci/Kconfig"
source "sound/hda/Kconfig"
source "sound/ppc/Kconfig" source "sound/ppc/Kconfig"
source "sound/aoa/Kconfig" source "sound/aoa/Kconfig"
......
...@@ -6,7 +6,7 @@ obj-$(CONFIG_SOUND_PRIME) += sound_firmware.o ...@@ -6,7 +6,7 @@ obj-$(CONFIG_SOUND_PRIME) += sound_firmware.o
obj-$(CONFIG_SOUND_PRIME) += oss/ obj-$(CONFIG_SOUND_PRIME) += oss/
obj-$(CONFIG_DMASOUND) += oss/ obj-$(CONFIG_DMASOUND) += oss/
obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \ obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ sh/ synth/ usb/ \
firewire/ sparc/ spi/ parisc/ pcmcia/ mips/ soc/ atmel/ firewire/ sparc/ spi/ parisc/ pcmcia/ mips/ soc/ atmel/ hda/
obj-$(CONFIG_SND_AOA) += aoa/ obj-$(CONFIG_SND_AOA) += aoa/
# This one must be compilable even if sound is configured out # This one must be compilable even if sound is configured out
......
config SND_HDA_CORE
tristate
snd-hda-core-objs := hda_bus_type.o
obj-$(CONFIG_SND_HDA_CORE) += snd-hda-core.o
/*
* HD-audio bus
*/
#include <linux/init.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/export.h>
#include <sound/hdaudio.h>
MODULE_DESCRIPTION("HD-audio bus");
MODULE_LICENSE("GPL");
static int hda_bus_match(struct device *dev, struct device_driver *drv)
{
struct hdac_device *hdev = dev_to_hdac_dev(dev);
struct hdac_driver *hdrv = drv_to_hdac_driver(drv);
if (hdev->type != hdrv->type)
return 0;
if (hdrv->match)
return hdrv->match(hdev, hdrv);
return 1;
}
struct bus_type snd_hda_bus_type = {
.name = "hdaudio",
.match = hda_bus_match,
};
EXPORT_SYMBOL_GPL(snd_hda_bus_type);
static int __init hda_bus_init(void)
{
return bus_register(&snd_hda_bus_type);
}
static void __exit hda_bus_exit(void)
{
bus_unregister(&snd_hda_bus_type);
}
subsys_initcall(hda_bus_init);
module_exit(hda_bus_exit);
...@@ -5,6 +5,7 @@ config SND_HDA ...@@ -5,6 +5,7 @@ config SND_HDA
select SND_PCM select SND_PCM
select SND_VMASTER select SND_VMASTER
select SND_KCTL_JACK select SND_KCTL_JACK
select SND_HDA_CORE
config SND_HDA_INTEL config SND_HDA_INTEL
tristate "HD Audio PCI" tristate "HD Audio PCI"
......
...@@ -47,11 +47,11 @@ static struct hda_vendor_id hda_vendor_ids[] = { ...@@ -47,11 +47,11 @@ static struct hda_vendor_id hda_vendor_ids[] = {
/* /*
* find a matching codec preset * find a matching codec preset
*/ */
static int hda_bus_match(struct device *dev, struct device_driver *drv) static int hda_codec_match(struct hdac_device *dev, struct hdac_driver *drv)
{ {
struct hda_codec *codec = container_of(dev, struct hda_codec, dev); struct hda_codec *codec = container_of(dev, struct hda_codec, core);
struct hda_codec_driver *driver = struct hda_codec_driver *driver =
container_of(drv, struct hda_codec_driver, driver); container_of(drv, struct hda_codec_driver, core);
const struct hda_codec_preset *preset; const struct hda_codec_preset *preset;
/* check probe_id instead of vendor_id if set */ /* check probe_id instead of vendor_id if set */
u32 id = codec->probe_id ? codec->probe_id : codec->vendor_id; u32 id = codec->probe_id ? codec->probe_id : codec->vendor_id;
...@@ -154,20 +154,22 @@ static void hda_codec_driver_shutdown(struct device *dev) ...@@ -154,20 +154,22 @@ static void hda_codec_driver_shutdown(struct device *dev)
int __hda_codec_driver_register(struct hda_codec_driver *drv, const char *name, int __hda_codec_driver_register(struct hda_codec_driver *drv, const char *name,
struct module *owner) struct module *owner)
{ {
drv->driver.name = name; drv->core.driver.name = name;
drv->driver.owner = owner; drv->core.driver.owner = owner;
drv->driver.bus = &snd_hda_bus_type; drv->core.driver.bus = &snd_hda_bus_type;
drv->driver.probe = hda_codec_driver_probe; drv->core.driver.probe = hda_codec_driver_probe;
drv->driver.remove = hda_codec_driver_remove; drv->core.driver.remove = hda_codec_driver_remove;
drv->driver.shutdown = hda_codec_driver_shutdown; drv->core.driver.shutdown = hda_codec_driver_shutdown;
drv->driver.pm = &hda_codec_driver_pm; drv->core.driver.pm = &hda_codec_driver_pm;
return driver_register(&drv->driver); drv->core.type = HDA_DEV_LEGACY;
drv->core.match = hda_codec_match;
return driver_register(&drv->core.driver);
} }
EXPORT_SYMBOL_GPL(__hda_codec_driver_register); EXPORT_SYMBOL_GPL(__hda_codec_driver_register);
void hda_codec_driver_unregister(struct hda_codec_driver *drv) void hda_codec_driver_unregister(struct hda_codec_driver *drv)
{ {
driver_unregister(&drv->driver); driver_unregister(&drv->core.driver);
} }
EXPORT_SYMBOL_GPL(hda_codec_driver_unregister); EXPORT_SYMBOL_GPL(hda_codec_driver_unregister);
...@@ -319,24 +321,3 @@ int snd_hda_codec_configure(struct hda_codec *codec) ...@@ -319,24 +321,3 @@ int snd_hda_codec_configure(struct hda_codec *codec)
return err; return err;
} }
EXPORT_SYMBOL_GPL(snd_hda_codec_configure); EXPORT_SYMBOL_GPL(snd_hda_codec_configure);
/*
* bus registration
*/
struct bus_type snd_hda_bus_type = {
.name = "hdaudio",
.match = hda_bus_match,
};
static int __init hda_codec_init(void)
{
return bus_register(&snd_hda_bus_type);
}
static void __exit hda_codec_exit(void)
{
bus_unregister(&snd_hda_bus_type);
}
module_init(hda_codec_init);
module_exit(hda_codec_exit);
...@@ -1294,6 +1294,7 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card, ...@@ -1294,6 +1294,7 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
dev_set_name(dev, "hdaudioC%dD%d", card->number, codec_addr); dev_set_name(dev, "hdaudioC%dD%d", card->number, codec_addr);
dev_set_drvdata(dev, codec); /* for sysfs */ dev_set_drvdata(dev, codec); /* for sysfs */
device_enable_async_suspend(dev); device_enable_async_suspend(dev);
codec->core.type = HDA_DEV_LEGACY;
codec->bus = bus; codec->bus = bus;
codec->card = card; codec->card = card;
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <sound/control.h> #include <sound/control.h>
#include <sound/pcm.h> #include <sound/pcm.h>
#include <sound/hwdep.h> #include <sound/hwdep.h>
#include <sound/hdaudio.h>
#include <sound/hda_verbs.h> #include <sound/hda_verbs.h>
/* /*
...@@ -172,7 +173,7 @@ struct hda_codec_preset { ...@@ -172,7 +173,7 @@ struct hda_codec_preset {
#define HDA_CODEC_ID_GENERIC 0x00000201 #define HDA_CODEC_ID_GENERIC 0x00000201
struct hda_codec_driver { struct hda_codec_driver {
struct device_driver driver; struct hdac_driver core;
const struct hda_codec_preset *preset; const struct hda_codec_preset *preset;
}; };
...@@ -276,7 +277,7 @@ struct hda_pcm { ...@@ -276,7 +277,7 @@ struct hda_pcm {
/* codec information */ /* codec information */
struct hda_codec { struct hda_codec {
struct device dev; struct hdac_device core;
struct hda_bus *bus; struct hda_bus *bus;
struct snd_card *card; struct snd_card *card;
unsigned int addr; /* codec addr*/ unsigned int addr; /* codec addr*/
...@@ -409,10 +410,8 @@ struct hda_codec { ...@@ -409,10 +410,8 @@ struct hda_codec {
struct snd_array verbs; struct snd_array verbs;
}; };
#define dev_to_hda_codec(_dev) container_of(_dev, struct hda_codec, dev) #define dev_to_hda_codec(_dev) container_of(_dev, struct hda_codec, core.dev)
#define hda_codec_dev(_dev) (&(_dev)->dev) #define hda_codec_dev(_dev) (&(_dev)->core.dev)
extern struct bus_type snd_hda_bus_type;
/* direction */ /* direction */
enum { enum {
......
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