mirror of
https://github.com/fail0verflow/switch-linux.git
synced 2025-05-04 02:34:21 -04:00
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: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
3372dbdd8c
commit
e3d280fc6d
10 changed files with 113 additions and 40 deletions
42
include/sound/hdaudio.h
Normal file
42
include/sound/hdaudio.h
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* 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"
|
||||||
|
|
||||||
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
|
||||||
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
|
||||||
|
|
2
sound/hda/Kconfig
Normal file
2
sound/hda/Kconfig
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
config SND_HDA_CORE
|
||||||
|
tristate
|
3
sound/hda/Makefile
Normal file
3
sound/hda/Makefile
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
snd-hda-core-objs := hda_bus_type.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_SND_HDA_CORE) += snd-hda-core.o
|
42
sound/hda/hda_bus_type.c
Normal file
42
sound/hda/hda_bus_type.c
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
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[] = {
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
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)
|
||||||
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,
|
||||||
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 @@
|
||||||
#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 {
|
||||||
#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 {
|
||||||
|
|
||||||
/* 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 {
|
||||||
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 {
|
||||||
|
|
Loading…
Add table
Reference in a new issue