Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1289e9e8 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: hda - Modularize HD-audio driver



Split the monolithc HD-audio driver into several pieces:
 - snd-hda-intel   HD-audio PCI controller driver; loaded via udev
 - snd-hda-codec   HD-audio codec bus driver
 - snd-hda-codec-* Specific HD-audio codec drivers

When built as modules, snd-hda-codec (that is invoked by snd-hda-intel)
looks up the codec vendor ID and loads the corresponding codec module
automatically via request_module().

When built in a kernel, each codec drivers are statically hooked up
before probing the PCI.

This patch adds appropriate EXPORT_SYMBOL_GPL()'s and the module
information for each driver, and driver-linking codes between
codec-bus and codec drivers.

TODO:
  - Avoid EXPORT_SYMBOL*() when built-in kernel
  - Restore __devinit appropriately depending on the condition

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 30d72e9f
Loading
Loading
Loading
Loading
+50 −0
Original line number Diff line number Diff line
@@ -46,6 +46,11 @@ config SND_HDA_CODEC_REALTEK
	  Say Y here to include Realtek HD-audio codec support in
	  snd-hda-intel driver, such as ALC880.

	  When the HD-audio driver is built as a module, the codec
	  support code is also built as another module,
	  snd-hda-codec-realtek.
	  This module is automatically loaded at probing.

config SND_HDA_CODEC_ANALOG
	bool "Build Analog Device HD-audio codec support"
	default y
@@ -53,6 +58,11 @@ config SND_HDA_CODEC_ANALOG
	  Say Y here to include Analog Device HD-audio codec support in
	  snd-hda-intel driver, such as AD1986A.

	  When the HD-audio driver is built as a module, the codec
	  support code is also built as another module,
	  snd-hda-codec-analog.
	  This module is automatically loaded at probing.

config SND_HDA_CODEC_SIGMATEL
	bool "Build IDT/Sigmatel HD-audio codec support"
	default y
@@ -60,6 +70,11 @@ config SND_HDA_CODEC_SIGMATEL
	  Say Y here to include IDT (Sigmatel) HD-audio codec support in
	  snd-hda-intel driver, such as STAC9200.

	  When the HD-audio driver is built as a module, the codec
	  support code is also built as another module,
	  snd-hda-codec-idt.
	  This module is automatically loaded at probing.

config SND_HDA_CODEC_VIA
	bool "Build VIA HD-audio codec support"
	default y
@@ -67,6 +82,11 @@ config SND_HDA_CODEC_VIA
	  Say Y here to include VIA HD-audio codec support in
	  snd-hda-intel driver, such as VT1708.

	  When the HD-audio driver is built as a module, the codec
	  support code is also built as another module,
	  snd-hda-codec-via.
	  This module is automatically loaded at probing.

config SND_HDA_CODEC_ATIHDMI
	bool "Build ATI HDMI HD-audio codec support"
	default y
@@ -74,6 +94,11 @@ config SND_HDA_CODEC_ATIHDMI
	  Say Y here to include ATI HDMI HD-audio codec support in
	  snd-hda-intel driver, such as ATI RS600 HDMI.

	  When the HD-audio driver is built as a module, the codec
	  support code is also built as another module,
	  snd-hda-codec-atihdmi.
	  This module is automatically loaded at probing.

config SND_HDA_CODEC_NVHDMI
	bool "Build NVIDIA HDMI HD-audio codec support"
	default y
@@ -81,6 +106,11 @@ config SND_HDA_CODEC_NVHDMI
	  Say Y here to include NVIDIA HDMI HD-audio codec support in
	  snd-hda-intel driver, such as NVIDIA MCP78 HDMI.

	  When the HD-audio driver is built as a module, the codec
	  support code is also built as another module,
	  snd-hda-codec-nvhdmi.
	  This module is automatically loaded at probing.

config SND_HDA_CODEC_INTELHDMI
	bool "Build INTEL HDMI HD-audio codec support"
	default y
@@ -88,6 +118,11 @@ config SND_HDA_CODEC_INTELHDMI
	  Say Y here to include INTEL HDMI HD-audio codec support in
	  snd-hda-intel driver, such as Eaglelake integrated HDMI.

	  When the HD-audio driver is built as a module, the codec
	  support code is also built as another module,
	  snd-hda-codec-intelhdmi.
	  This module is automatically loaded at probing.

config SND_HDA_ELD
	def_bool y
	depends on SND_HDA_CODEC_INTELHDMI
@@ -99,6 +134,11 @@ config SND_HDA_CODEC_CONEXANT
	  Say Y here to include Conexant HD-audio codec support in
	  snd-hda-intel driver, such as CX20549.

	  When the HD-audio driver is built as a module, the codec
	  support code is also built as another module,
	  snd-hda-codec-conexant.
	  This module is automatically loaded at probing.

config SND_HDA_CODEC_CMEDIA
	bool "Build C-Media HD-audio codec support"
	default y
@@ -106,6 +146,11 @@ config SND_HDA_CODEC_CMEDIA
	  Say Y here to include C-Media HD-audio codec support in
	  snd-hda-intel driver, such as CMI9880.

	  When the HD-audio driver is built as a module, the codec
	  support code is also built as another module,
	  snd-hda-codec-cmedia.
	  This module is automatically loaded at probing.

config SND_HDA_CODEC_SI3054
	bool "Build Silicon Labs 3054 HD-modem codec support"
	default y
@@ -113,6 +158,11 @@ config SND_HDA_CODEC_SI3054
	  Say Y here to include Silicon Labs 3054 HD-modem codec
	  (and compatibles) support in snd-hda-intel driver.

	  When the HD-audio driver is built as a module, the codec
	  support code is also built as another module,
	  snd-hda-codec-si3054.
	  This module is automatically loaded at probing.

config SND_HDA_GENERIC
	bool "Enable generic HD-audio codec parser"
	default y
+57 −20
Original line number Diff line number Diff line
snd-hda-intel-y := hda_intel.o
# since snd-hda-intel is the only driver using hda-codec,
# merge it into a single module although it was originally
# designed to be individual modules
snd-hda-intel-y += hda_codec.o
snd-hda-intel-$(CONFIG_PROC_FS) += hda_proc.o
snd-hda-intel-$(CONFIG_SND_HDA_ELD) += hda_eld.o
snd-hda-intel-$(CONFIG_SND_HDA_HWDEP) += hda_hwdep.o
snd-hda-intel-$(CONFIG_SND_HDA_INPUT_BEEP) += hda_beep.o
snd-hda-intel-$(CONFIG_SND_HDA_GENERIC) += hda_generic.o
snd-hda-intel-$(CONFIG_SND_HDA_CODEC_REALTEK) += patch_realtek.o
snd-hda-intel-$(CONFIG_SND_HDA_CODEC_CMEDIA) += patch_cmedia.o
snd-hda-intel-$(CONFIG_SND_HDA_CODEC_ANALOG) += patch_analog.o
snd-hda-intel-$(CONFIG_SND_HDA_CODEC_SIGMATEL) += patch_sigmatel.o
snd-hda-intel-$(CONFIG_SND_HDA_CODEC_SI3054) += patch_si3054.o
snd-hda-intel-$(CONFIG_SND_HDA_CODEC_ATIHDMI) += patch_atihdmi.o
snd-hda-intel-$(CONFIG_SND_HDA_CODEC_CONEXANT) += patch_conexant.o
snd-hda-intel-$(CONFIG_SND_HDA_CODEC_VIA) += patch_via.o
snd-hda-intel-$(CONFIG_SND_HDA_CODEC_NVHDMI) += patch_nvhdmi.o
snd-hda-intel-$(CONFIG_SND_HDA_CODEC_INTELHDMI) += patch_intelhdmi.o
snd-hda-intel-objs := hda_intel.o

snd-hda-codec-y := hda_codec.o
snd-hda-codec-$(CONFIG_SND_HDA_GENERIC) += hda_generic.o
snd-hda-codec-$(CONFIG_PROC_FS) += hda_proc.o
# snd-hda-codec-$(CONFIG_SND_HDA_ELD) += hda_eld.o
snd-hda-codec-$(CONFIG_SND_HDA_HWDEP) += hda_hwdep.o
snd-hda-codec-$(CONFIG_SND_HDA_INPUT_BEEP) += hda_beep.o

snd-hda-codec-realtek-objs :=	patch_realtek.o
snd-hda-codec-cmedia-objs :=	patch_cmedia.o
snd-hda-codec-analog-objs :=	patch_analog.o
snd-hda-codec-idt-objs :=	patch_sigmatel.o
snd-hda-codec-si3054-objs :=	patch_si3054.o
snd-hda-codec-atihdmi-objs :=	patch_atihdmi.o
snd-hda-codec-conexant-objs :=	patch_conexant.o
snd-hda-codec-via-objs :=	patch_via.o
snd-hda-codec-nvhdmi-objs :=	patch_nvhdmi.o
snd-hda-codec-intelhdmi-objs :=	patch_intelhdmi.o hda_eld.o

# common driver
obj-$(CONFIG_SND_HDA_INTEL) := snd-hda-codec.o

# codec drivers (note: CONFIG_SND_HDA_CODEC_XXX are booleans)
ifdef CONFIG_SND_HDA_CODEC_REALTEK
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-codec-realtek.o
endif
ifdef CONFIG_SND_HDA_CODEC_CMEDIA
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-codec-cmedia.o
endif
ifdef CONFIG_SND_HDA_CODEC_ANALOG
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-codec-analog.o
endif
ifdef CONFIG_SND_HDA_CODEC_SIGMATEL
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-codec-idt.o
endif
ifdef CONFIG_SND_HDA_CODEC_SI3054
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-codec-si3054.o
endif
ifdef CONFIG_SND_HDA_CODEC_ATIHDMI
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-codec-atihdmi.o
endif
ifdef CONFIG_SND_HDA_CODEC_CONEXANT
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-codec-conexant.o
endif
ifdef CONFIG_SND_HDA_CODEC_VIA
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-codec-via.o
endif
ifdef CONFIG_SND_HDA_CODEC_NVHDMI
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-codec-nvhdmi.o
endif
ifdef CONFIG_SND_HDA_CODEC_INTELHDMI
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-codec-intelhdmi.o
endif

# this must be the last entry after codec drivers;
# otherwise the codec patches won't be hooked before the PCI probe
# when built in kernel
obj-$(CONFIG_SND_HDA_INTEL) += snd-hda-intel.o
+2 −0
Original line number Diff line number Diff line
@@ -128,6 +128,7 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid)
	INIT_WORK(&beep->beep_work, &snd_hda_generate_beep);
	return 0;
}
EXPORT_SYMBOL_GPL(snd_hda_attach_beep_device);

void snd_hda_detach_beep_device(struct hda_codec *codec)
{
@@ -140,3 +141,4 @@ void snd_hda_detach_beep_device(struct hda_codec *codec)
		kfree(beep);
	}
}
EXPORT_SYMBOL_GPL(snd_hda_detach_beep_device);
+143 −44

File changed.

Preview size limit exceeded, changes collapsed.

+11 −0
Original line number Diff line number Diff line
@@ -642,6 +642,16 @@ struct hda_codec_preset {
	int (*patch)(struct hda_codec *codec);
};
	
struct hda_codec_preset_list {
	const struct hda_codec_preset *preset;
	struct module *owner;
	struct list_head list;
};

/* initial hook */
int snd_hda_add_codec_preset(struct hda_codec_preset_list *preset);
int snd_hda_delete_codec_preset(struct hda_codec_preset_list *preset);

/* ops set by the preset patch */
struct hda_codec_ops {
	int (*build_controls)(struct hda_codec *codec);
@@ -735,6 +745,7 @@ struct hda_codec {

	/* detected preset */
	const struct hda_codec_preset *preset;
	struct module *owner;
	const char *name;	/* codec name */
	const char *modelname;	/* model name for preset */

Loading