Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
0640f84f
Commit
0640f84f
authored
Dec 03, 2008
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/hda-modularize' into topic/hda
parents
8c2f767b
ff7a3267
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
543 additions
and
109 deletions
+543
-109
sound/pci/hda/Kconfig
sound/pci/hda/Kconfig
+50
-0
sound/pci/hda/Makefile
sound/pci/hda/Makefile
+57
-20
sound/pci/hda/hda_beep.c
sound/pci/hda/hda_beep.c
+2
-0
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+143
-44
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_codec.h
+26
-0
sound/pci/hda/hda_generic.c
sound/pci/hda/hda_generic.c
+1
-0
sound/pci/hda/hda_hwdep.c
sound/pci/hda/hda_hwdep.c
+1
-1
sound/pci/hda/hda_patch.h
sound/pci/hda/hda_patch.h
+0
-24
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_analog.c
+24
-2
sound/pci/hda/patch_atihdmi.c
sound/pci/hda/patch_atihdmi.c
+29
-2
sound/pci/hda/patch_cmedia.c
sound/pci/hda/patch_cmedia.c
+25
-2
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_conexant.c
+26
-2
sound/pci/hda/patch_intelhdmi.c
sound/pci/hda/patch_intelhdmi.c
+28
-2
sound/pci/hda/patch_nvhdmi.c
sound/pci/hda/patch_nvhdmi.c
+25
-2
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+24
-2
sound/pci/hda/patch_si3054.c
sound/pci/hda/patch_si3054.c
+33
-2
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_sigmatel.c
+25
-2
sound/pci/hda/patch_via.c
sound/pci/hda/patch_via.c
+24
-2
No files found.
sound/pci/hda/Kconfig
View file @
0640f84f
...
...
@@ -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
...
...
sound/pci/hda/Makefile
View file @
0640f84f
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
sound/pci/hda/hda_beep.c
View file @
0640f84f
...
...
@@ -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_HDA
(
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_HDA
(
snd_hda_detach_beep_device
);
sound/pci/hda/hda_codec.c
View file @
0640f84f
...
...
@@ -31,7 +31,6 @@
#include <sound/initval.h>
#include "hda_local.h"
#include <sound/hda_hwdep.h>
#include "hda_patch.h"
/* codec presets */
/*
* vendor / preset table
...
...
@@ -62,39 +61,26 @@ static struct hda_vendor_id hda_vendor_ids[] = {
{}
/* terminator */
};
static
const
struct
hda_codec_preset
*
hda_preset_tables
[]
=
{
#ifdef CONFIG_SND_HDA_CODEC_REALTEK
snd_hda_preset_realtek
,
#endif
#ifdef CONFIG_SND_HDA_CODEC_CMEDIA
snd_hda_preset_cmedia
,
#endif
#ifdef CONFIG_SND_HDA_CODEC_ANALOG
snd_hda_preset_analog
,
#endif
#ifdef CONFIG_SND_HDA_CODEC_SIGMATEL
snd_hda_preset_sigmatel
,
#endif
#ifdef CONFIG_SND_HDA_CODEC_SI3054
snd_hda_preset_si3054
,
#endif
#ifdef CONFIG_SND_HDA_CODEC_ATIHDMI
snd_hda_preset_atihdmi
,
#endif
#ifdef CONFIG_SND_HDA_CODEC_CONEXANT
snd_hda_preset_conexant
,
#endif
#ifdef CONFIG_SND_HDA_CODEC_VIA
snd_hda_preset_via
,
#endif
#ifdef CONFIG_SND_HDA_CODEC_NVHDMI
snd_hda_preset_nvhdmi
,
#endif
#ifdef CONFIG_SND_HDA_CODEC_INTELHDMI
snd_hda_preset_intelhdmi
,
#endif
NULL
};
static
DEFINE_MUTEX
(
preset_mutex
);
static
LIST_HEAD
(
hda_preset_tables
);
int
snd_hda_add_codec_preset
(
struct
hda_codec_preset_list
*
preset
)
{
mutex_lock
(
&
preset_mutex
);
list_add_tail
(
&
preset
->
list
,
&
hda_preset_tables
);
mutex_unlock
(
&
preset_mutex
);
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_add_codec_preset
);
int
snd_hda_delete_codec_preset
(
struct
hda_codec_preset_list
*
preset
)
{
mutex_lock
(
&
preset_mutex
);
list_del
(
&
preset
->
list
);
mutex_unlock
(
&
preset_mutex
);
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_delete_codec_preset
);
#ifdef CONFIG_SND_HDA_POWER_SAVE
static
void
hda_power_work
(
struct
work_struct
*
work
);
...
...
@@ -128,6 +114,7 @@ const char *snd_hda_get_jack_location(u32 cfg)
}
return
"UNKNOWN"
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_get_jack_location
);
const
char
*
snd_hda_get_jack_connectivity
(
u32
cfg
)
{
...
...
@@ -135,6 +122,7 @@ const char *snd_hda_get_jack_connectivity(u32 cfg)
return
jack_locations
[(
cfg
>>
(
AC_DEFCFG_LOCATION_SHIFT
+
4
))
&
3
];
}
EXPORT_SYMBOL_HDA
(
snd_hda_get_jack_connectivity
);
const
char
*
snd_hda_get_jack_type
(
u32
cfg
)
{
...
...
@@ -148,6 +136,7 @@ const char *snd_hda_get_jack_type(u32 cfg)
return
jack_types
[(
cfg
&
AC_DEFCFG_DEVICE
)
>>
AC_DEFCFG_DEVICE_SHIFT
];
}
EXPORT_SYMBOL_HDA
(
snd_hda_get_jack_type
);
/*
* Compose a 32bit command word to be sent to the HD-audio controller
...
...
@@ -196,6 +185,7 @@ unsigned int snd_hda_codec_read(struct hda_codec *codec, hda_nid_t nid,
snd_hda_power_down
(
codec
);
return
res
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_read
);
/**
* snd_hda_codec_write - send a single command without waiting for response
...
...
@@ -224,6 +214,7 @@ int snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int direct,
snd_hda_power_down
(
codec
);
return
err
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_write
);
/**
* snd_hda_sequence_write - sequence writes
...
...
@@ -238,6 +229,7 @@ void snd_hda_sequence_write(struct hda_codec *codec, const struct hda_verb *seq)
for
(;
seq
->
nid
;
seq
++
)
snd_hda_codec_write
(
codec
,
seq
->
nid
,
0
,
seq
->
verb
,
seq
->
param
);
}
EXPORT_SYMBOL_HDA
(
snd_hda_sequence_write
);
/**
* snd_hda_get_sub_nodes - get the range of sub nodes
...
...
@@ -259,6 +251,7 @@ int snd_hda_get_sub_nodes(struct hda_codec *codec, hda_nid_t nid,
*
start_id
=
(
parm
>>
16
)
&
0x7fff
;
return
(
int
)(
parm
&
0x7fff
);
}
EXPORT_SYMBOL_HDA
(
snd_hda_get_sub_nodes
);
/**
* snd_hda_get_connections - get connection list
...
...
@@ -347,6 +340,7 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
}
return
conns
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_get_connections
);
/**
...
...
@@ -381,6 +375,7 @@ int snd_hda_queue_unsol_event(struct hda_bus *bus, u32 res, u32 res_ex)
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_queue_unsol_event
);
/*
* process queued unsolicited events
...
...
@@ -482,7 +477,7 @@ static int snd_hda_bus_dev_register(struct snd_device *device)
*
* Returns 0 if successful, or a negative error code.
*/
int
__devinit
snd_hda_bus_new
(
struct
snd_card
*
card
,
int
/*__devinit*/
snd_hda_bus_new
(
struct
snd_card
*
card
,
const
struct
hda_bus_template
*
temp
,
struct
hda_bus
**
busp
)
{
...
...
@@ -526,6 +521,7 @@ int __devinit snd_hda_bus_new(struct snd_card *card,
*
busp
=
bus
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_bus_new
);
#ifdef CONFIG_SND_HDA_GENERIC
#define is_generic_config(codec) \
...
...
@@ -534,19 +530,33 @@ int __devinit snd_hda_bus_new(struct snd_card *card,
#define is_generic_config(codec) 0
#endif
#ifdef MODULE
#define HDA_MODREQ_MAX_COUNT 2
/* two request_modules()'s */
#else
#define HDA_MODREQ_MAX_COUNT 0
/* all presets are statically linked */
#endif
/*
* find a matching codec preset
*/
static
const
struct
hda_codec_preset
*
find_codec_preset
(
struct
hda_codec
*
codec
)
{
const
struct
hda_codec_preset
**
tbl
,
*
preset
;
struct
hda_codec_preset_list
*
tbl
;
const
struct
hda_codec_preset
*
preset
;
int
mod_requested
=
0
;
if
(
is_generic_config
(
codec
))
return
NULL
;
/* use the generic parser */
for
(
tbl
=
hda_preset_tables
;
*
tbl
;
tbl
++
)
{
for
(
preset
=
*
tbl
;
preset
->
id
;
preset
++
)
{
again:
mutex_lock
(
&
preset_mutex
);
list_for_each_entry
(
tbl
,
&
hda_preset_tables
,
list
)
{
if
(
!
try_module_get
(
tbl
->
owner
))
{
snd_printk
(
KERN_ERR
"hda_codec: cannot module_get
\n
"
);
continue
;
}
for
(
preset
=
tbl
->
preset
;
preset
->
id
;
preset
++
)
{
u32
mask
=
preset
->
mask
;
if
(
preset
->
afg
&&
preset
->
afg
!=
codec
->
afg
)
continue
;
...
...
@@ -556,9 +566,27 @@ find_codec_preset(struct hda_codec *codec)
mask
=
~
0
;
if
(
preset
->
id
==
(
codec
->
vendor_id
&
mask
)
&&
(
!
preset
->
rev
||
preset
->
rev
==
codec
->
revision_id
))
preset
->
rev
==
codec
->
revision_id
))
{
mutex_unlock
(
&
preset_mutex
);
codec
->
owner
=
tbl
->
owner
;
return
preset
;
}
}
module_put
(
tbl
->
owner
);
}
mutex_unlock
(
&
preset_mutex
);
if
(
mod_requested
<
HDA_MODREQ_MAX_COUNT
)
{
char
name
[
32
];
if
(
!
mod_requested
)
snprintf
(
name
,
sizeof
(
name
),
"snd-hda-codec-id:%08x"
,
codec
->
vendor_id
);
else
snprintf
(
name
,
sizeof
(
name
),
"snd-hda-codec-id:%04x*"
,
(
codec
->
vendor_id
>>
16
)
&
0xffff
);
request_module
(
name
);
mod_requested
++
;
goto
again
;
}
return
NULL
;
}
...
...
@@ -598,7 +626,7 @@ static int get_codec_name(struct hda_codec *codec)
/*
* look for an AFG and MFG nodes
*/
static
void
__devinit
setup_fg_nodes
(
struct
hda_codec
*
codec
)
static
void
/*__devinit*/
setup_fg_nodes
(
struct
hda_codec
*
codec
)
{
int
i
,
total_nodes
;
hda_nid_t
nid
;
...
...
@@ -661,6 +689,7 @@ static void snd_hda_codec_free(struct hda_codec *codec)
codec
->
bus
->
caddr_tbl
[
codec
->
addr
]
=
NULL
;
if
(
codec
->
patch_ops
.
free
)
codec
->
patch_ops
.
free
(
codec
);
module_put
(
codec
->
owner
);
free_hda_cache
(
&
codec
->
amp_cache
);
free_hda_cache
(
&
codec
->
cmd_cache
);
kfree
(
codec
->
name
);
...
...
@@ -677,7 +706,7 @@ static void snd_hda_codec_free(struct hda_codec *codec)
*
* Returns 0 if successful, or a negative error code.
*/
int
__devinit
snd_hda_codec_new
(
struct
hda_bus
*
bus
,
unsigned
int
codec_addr
,
int
/*__devinit*/
snd_hda_codec_new
(
struct
hda_bus
*
bus
,
unsigned
int
codec_addr
,
struct
hda_codec
**
codecp
)
{
struct
hda_codec
*
codec
;
...
...
@@ -779,6 +808,7 @@ int __devinit snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr,
*
codecp
=
codec
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_new
);
int
snd_hda_codec_configure
(
struct
hda_codec
*
codec
)
{
...
...
@@ -838,6 +868,7 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
msleep
(
1
);
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_STREAM_FORMAT
,
format
);
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_setup_stream
);
void
snd_hda_codec_cleanup_stream
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
...
...
@@ -851,6 +882,7 @@ void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid)
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0);
#endif
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_cleanup_stream
);
/*
* amp access functions
...
...
@@ -862,7 +894,7 @@ void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid)
#define INFO_AMP_VOL(ch) (1 << (1 + (ch)))
/* initialize the hash table */
static
void
__devinit
init_hda_cache
(
struct
hda_cache_rec
*
cache
,
static
void
/*__devinit*/
init_hda_cache
(
struct
hda_cache_rec
*
cache
,
unsigned
int
record_size
)
{
memset
(
cache
,
0
,
sizeof
(
*
cache
));
...
...
@@ -932,6 +964,7 @@ u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction)
}
return
info
->
amp_caps
;
}
EXPORT_SYMBOL_HDA
(
query_amp_caps
);
int
snd_hda_override_amp_caps
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
int
dir
,
unsigned
int
caps
)
...
...
@@ -945,6 +978,7 @@ int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
info
->
head
.
val
|=
INFO_AMP_CAPS
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_override_amp_caps
);
/*
* read the current volume to info
...
...
@@ -998,6 +1032,7 @@ int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch,
return
0
;
return
get_vol_mute
(
codec
,
info
,
nid
,
ch
,
direction
,
index
);
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_amp_read
);
/*
* update the AMP value, mask = bit mask to set, val = the value
...
...
@@ -1017,6 +1052,7 @@ int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid, int ch,
put_vol_mute
(
codec
,
info
,
nid
,
ch
,
direction
,
idx
,
val
);
return
1
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_amp_update
);
/*
* update the AMP stereo with the same mask and value
...
...
@@ -1030,6 +1066,7 @@ int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid,
idx
,
mask
,
val
);
return
ret
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_amp_stereo
);
#ifdef SND_HDA_NEEDS_RESUME
/* resume the all amp commands from the cache */
...
...
@@ -1055,6 +1092,7 @@ void snd_hda_codec_resume_amp(struct hda_codec *codec)
}
}
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_resume_amp
);
#endif
/* SND_HDA_NEEDS_RESUME */
/* volume */
...
...
@@ -1082,6 +1120,7 @@ int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol,
uinfo
->
value
.
integer
.
max
=
caps
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_amp_volume_info
);
int
snd_hda_mixer_amp_volume_get
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
...
...
@@ -1101,6 +1140,7 @@ int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol,
&
HDA_AMP_VOLMASK
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_amp_volume_get
);
int
snd_hda_mixer_amp_volume_put
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
...
...
@@ -1125,6 +1165,7 @@ int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol,
snd_hda_power_down
(
codec
);
return
change
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_amp_volume_put
);
int
snd_hda_mixer_amp_tlv
(
struct
snd_kcontrol
*
kcontrol
,
int
op_flag
,
unsigned
int
size
,
unsigned
int
__user
*
_tlv
)
...
...
@@ -1151,6 +1192,7 @@ int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag,
return
-
EFAULT
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_amp_tlv
);
/*
* set (static) TLV for virtual master volume; recalculated as max 0dB
...
...
@@ -1170,6 +1212,7 @@ void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir,
tlv
[
2
]
=
-
nums
*
step
;
tlv
[
3
]
=
step
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_set_vmaster_tlv
);
/* find a mixer control element with the given name */
static
struct
snd_kcontrol
*
...
...
@@ -1189,6 +1232,7 @@ struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec,
{
return
_snd_hda_find_mixer_ctl
(
codec
,
name
,
0
);
}
EXPORT_SYMBOL_HDA
(
snd_hda_find_mixer_ctl
);
/* Add a control element and assign to the codec */
int
snd_hda_ctl_add
(
struct
hda_codec
*
codec
,
struct
snd_kcontrol
*
kctl
)
...
...
@@ -1205,6 +1249,7 @@ int snd_hda_ctl_add(struct hda_codec *codec, struct snd_kcontrol *kctl)
*
knewp
=
kctl
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_ctl_add
);
#ifdef CONFIG_SND_HDA_RECONFIG
/* Clear all controls assigned to the given codec */
...
...
@@ -1244,6 +1289,8 @@ void snd_hda_codec_reset(struct hda_codec *codec)
codec
->
num_pcms
=
0
;
codec
->
pcm_info
=
NULL
;
codec
->
preset
=
NULL
;
module_put
(
codec
->
owner
);
codec
->
owner
=
NULL
;
}
#endif
/* CONFIG_SND_HDA_RECONFIG */
...
...
@@ -1282,6 +1329,7 @@ int snd_hda_add_vmaster(struct hda_codec *codec, char *name,
}
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_add_vmaster
);
/* switch */
int
snd_hda_mixer_amp_switch_info
(
struct
snd_kcontrol
*
kcontrol
,
...
...
@@ -1295,6 +1343,7 @@ int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol,
uinfo
->
value
.
integer
.
max
=
1
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_amp_switch_info
);
int
snd_hda_mixer_amp_switch_get
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
...
...
@@ -1314,6 +1363,7 @@ int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol,
HDA_AMP_MUTE
)
?
0
:
1
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_amp_switch_get
);
int
snd_hda_mixer_amp_switch_put
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
...
...
@@ -1344,6 +1394,7 @@ int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol,
snd_hda_power_down
(
codec
);
return
change
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_amp_switch_put
);
/*
* bound volume controls
...
...
@@ -1369,6 +1420,7 @@ int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol,
mutex_unlock
(
&
codec
->
spdif_mutex
);
return
err
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_switch_get
);
int
snd_hda_mixer_bind_switch_put
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
...
...
@@ -1392,6 +1444,7 @@ int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol,
mutex_unlock
(
&
codec
->
spdif_mutex
);
return
err
<
0
?
err
:
change
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_switch_put
);
/*
* generic bound volume/swtich controls
...
...
@@ -1411,6 +1464,7 @@ int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol,
mutex_unlock
(
&
codec
->
spdif_mutex
);
return
err
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_ctls_info
);
int
snd_hda_mixer_bind_ctls_get
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
...
...
@@ -1427,6 +1481,7 @@ int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol,
mutex_unlock
(
&
codec
->
spdif_mutex
);
return
err
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_ctls_get
);
int
snd_hda_mixer_bind_ctls_put
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
...
...
@@ -1449,6 +1504,7 @@ int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol,
mutex_unlock
(
&
codec
->
spdif_mutex
);
return
err
<
0
?
err
:
change
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_ctls_put
);
int
snd_hda_mixer_bind_tlv
(
struct
snd_kcontrol
*
kcontrol
,
int
op_flag
,
unsigned
int
size
,
unsigned
int
__user
*
tlv
)
...
...
@@ -1465,6 +1521,7 @@ int snd_hda_mixer_bind_tlv(struct snd_kcontrol *kcontrol, int op_flag,
mutex_unlock
(
&
codec
->
spdif_mutex
);
return
err
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_tlv
);
struct
hda_ctl_ops
snd_hda_bind_vol
=
{
.
info
=
snd_hda_mixer_amp_volume_info
,
...
...
@@ -1472,6 +1529,7 @@ struct hda_ctl_ops snd_hda_bind_vol = {
.
put
=
snd_hda_mixer_amp_volume_put
,
.
tlv
=
snd_hda_mixer_amp_tlv
};
EXPORT_SYMBOL_HDA
(
snd_hda_bind_vol
);
struct
hda_ctl_ops
snd_hda_bind_sw
=
{
.
info
=
snd_hda_mixer_amp_switch_info
,
...
...
@@ -1479,6 +1537,7 @@ struct hda_ctl_ops snd_hda_bind_sw = {
.
put
=
snd_hda_mixer_amp_switch_put
,
.
tlv
=
snd_hda_mixer_amp_tlv
};
EXPORT_SYMBOL_HDA
(
snd_hda_bind_sw
);
/*
* SPDIF out controls
...
...
@@ -1740,6 +1799,7 @@ int snd_hda_create_spdif_out_ctls(struct hda_codec *codec, hda_nid_t nid)
codec
->
spdif_status
=
convert_to_spdif_status
(
codec
->
spdif_ctls
);
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_create_spdif_out_ctls
);
/*
* SPDIF sharing with analog output
...
...
@@ -1777,6 +1837,7 @@ int snd_hda_create_spdif_share_sw(struct hda_codec *codec,
return
snd_hda_ctl_add
(
codec
,
snd_ctl_new1
(
&
spdif_share_sw
,
mout
));
}
EXPORT_SYMBOL_HDA
(
snd_hda_create_spdif_share_sw
);
/*
* SPDIF input
...
...
@@ -1886,6 +1947,7 @@ int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid)
AC_DIG1_ENABLE
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_create_spdif_in_ctls
);
#ifdef SND_HDA_NEEDS_RESUME
/*
...
...
@@ -1931,6 +1993,7 @@ int snd_hda_codec_write_cache(struct hda_codec *codec, hda_nid_t nid,
snd_hda_power_down
(
codec
);
return
err
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_write_cache
);
/* resume the all commands from the cache */
void
snd_hda_codec_resume_cache
(
struct
hda_codec
*
codec
)
...
...
@@ -1946,6 +2009,7 @@ void snd_hda_codec_resume_cache(struct hda_codec *codec)
get_cmd_cache_cmd
(
key
),
buffer
->
val
);
}
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_resume_cache
);
/**
* snd_hda_sequence_write_cache - sequence writes with caching
...
...
@@ -1963,6 +2027,7 @@ void snd_hda_sequence_write_cache(struct hda_codec *codec,
snd_hda_codec_write_cache
(
codec
,
seq
->
nid
,
0
,
seq
->
verb
,
seq
->
param
);
}
EXPORT_SYMBOL_HDA
(
snd_hda_sequence_write_cache
);
#endif
/* SND_HDA_NEEDS_RESUME */
/*
...
...
@@ -2081,7 +2146,7 @@ static void hda_call_codec_resume(struct hda_codec *codec)
*
* Returns 0 if successful, otherwise a negative error code.
*/
int
__devinit
snd_hda_build_controls
(
struct
hda_bus
*
bus
)
int
/*__devinit*/
snd_hda_build_controls
(
struct
hda_bus
*
bus
)
{
struct
hda_codec
*
codec
;
...
...
@@ -2092,6 +2157,7 @@ int __devinit snd_hda_build_controls(struct hda_bus *bus)
}
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_build_controls
);
int
snd_hda_codec_build_controls
(
struct
hda_codec
*
codec
)
{
...
...
@@ -2203,6 +2269,7 @@ unsigned int snd_hda_calc_stream_format(unsigned int rate,
return
val
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_calc_stream_format
);
/**
* snd_hda_query_supported_pcm - query the supported PCM rates and formats
...
...
@@ -2382,6 +2449,7 @@ int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid,
return
1
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_is_supported_format
);
/*
* PCM stuff
...
...
@@ -2579,6 +2647,7 @@ int __devinit snd_hda_build_pcms(struct hda_bus *bus)
}
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_build_pcms
);
/**
* snd_hda_check_board_config - compare the current codec with the config table
...
...
@@ -2634,6 +2703,7 @@ int snd_hda_check_board_config(struct hda_codec *codec,
}
return
-
1
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_check_board_config
);
/**
* snd_hda_add_new_ctls - create controls from the array
...
...
@@ -2669,6 +2739,7 @@ int snd_hda_add_new_ctls(struct hda_codec *codec, struct snd_kcontrol_new *knew)
}
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_add_new_ctls
);
#ifdef CONFIG_SND_HDA_POWER_SAVE
static
void
hda_set_power_state
(
struct
hda_codec
*
codec
,
hda_nid_t
fg
,
...
...
@@ -2711,6 +2782,10 @@ void snd_hda_power_up(struct hda_codec *codec)
cancel_delayed_work
(
&
codec
->
power_work
);
codec
->
power_transition
=
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_power_up
);
#define power_save(codec) \
((codec)->bus->power_save ? *(codec)->bus->power_save : 0)
#define power_save(codec) \
((codec)->bus->power_save ? *(codec)->bus->power_save : 0)
...
...
@@ -2726,6 +2801,7 @@ void snd_hda_power_down(struct hda_codec *codec)
msecs_to_jiffies
(
power_save
(
codec
)
*
1000
));
}
}
EXPORT_SYMBOL_HDA
(
snd_hda_power_down
);
int
snd_hda_check_amp_list_power
(
struct
hda_codec
*
codec
,
struct
hda_loopback_check
*
check
,
...
...
@@ -2762,6 +2838,7 @@ int snd_hda_check_amp_list_power(struct hda_codec *codec,
}
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_check_amp_list_power
);
#endif
/*
...
...
@@ -2781,6 +2858,7 @@ int snd_hda_ch_mode_info(struct hda_codec *codec,
chmode
[
uinfo
->
value
.
enumerated
.
item
].
channels
);
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_ch_mode_info
);
int
snd_hda_ch_mode_get
(
struct
hda_codec
*
codec
,
struct
snd_ctl_elem_value
*
ucontrol
,
...
...
@@ -2798,6 +2876,7 @@ int snd_hda_ch_mode_get(struct hda_codec *codec,
}
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_ch_mode_get
);
int
snd_hda_ch_mode_put
(
struct
hda_codec
*
codec
,
struct
snd_ctl_elem_value
*
ucontrol
,
...
...
@@ -2818,6 +2897,7 @@ int snd_hda_ch_mode_put(struct hda_codec *codec,
snd_hda_sequence_write_cache
(
codec
,
chmode
[
mode
].
sequence
);
return
1
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_ch_mode_put
);
/*
* input MUX helper
...
...
@@ -2838,6 +2918,7 @@ int snd_hda_input_mux_info(const struct hda_input_mux *imux,
strcpy
(
uinfo
->
value
.
enumerated
.
name
,
imux
->
items
[
index
].
label
);
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_input_mux_info
);
int
snd_hda_input_mux_put
(
struct
hda_codec
*
codec
,
const
struct
hda_input_mux
*
imux
,
...
...
@@ -2859,6 +2940,7 @@ int snd_hda_input_mux_put(struct hda_codec *codec,
*
cur_val
=
idx
;
return
1
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_input_mux_put
);
/*
...
...
@@ -2911,6 +2993,7 @@ int snd_hda_multi_out_dig_open(struct hda_codec *codec,
mutex_unlock
(
&
codec
->
spdif_mutex
);
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_multi_out_dig_open
);
int
snd_hda_multi_out_dig_prepare
(
struct
hda_codec
*
codec
,
struct
hda_multi_out
*
mout
,
...
...
@@ -2923,6 +3006,7 @@ int snd_hda_multi_out_dig_prepare(struct hda_codec *codec,
mutex_unlock
(
&
codec
->
spdif_mutex
);
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_multi_out_dig_prepare
);
/*
* release the digital out
...
...
@@ -2935,6 +3019,7 @@ int snd_hda_multi_out_dig_close(struct hda_codec *codec,
mutex_unlock
(
&
codec
->
spdif_mutex
);
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_multi_out_dig_close
);
/*
* set up more restrictions for analog out
...
...
@@ -2974,6 +3059,7 @@ int snd_hda_multi_out_analog_open(struct hda_codec *codec,
return
snd_pcm_hw_constraint_step
(
substream
->
runtime
,
0
,
SNDRV_PCM_HW_PARAM_CHANNELS
,
2
);
}
EXPORT_SYMBOL_HDA
(
snd_hda_multi_out_analog_open
);
/*
* set up the i/o for analog out
...
...
@@ -3032,6 +3118,7 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec,
}
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_multi_out_analog_prepare
);
/*
* clean up the setting for analog out
...
...
@@ -3058,6 +3145,7 @@ int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec,
mutex_unlock
(
&
codec
->
spdif_mutex
);
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_multi_out_analog_cleanup
);
/*
* Helper for automatic pin configuration
...
...
@@ -3343,11 +3431,13 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec,
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_parse_pin_def_config
);
/* labels for input pins */
const
char
*
auto_pin_cfg_labels
[
AUTO_PIN_LAST
]
=
{
"Mic"
,
"Front Mic"
,
"Line"
,
"Front Line"
,
"CD"
,
"Aux"
};
EXPORT_SYMBOL_HDA
(
auto_pin_cfg_labels
);
#ifdef CONFIG_PM
...
...
@@ -3375,6 +3465,7 @@ int snd_hda_suspend(struct hda_bus *bus, pm_message_t state)
}
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_suspend
);
/**
* snd_hda_resume - resume the codecs
...
...
@@ -3395,7 +3486,8 @@ int snd_hda_resume(struct hda_bus *bus)
}
return
0
;
}
#endif
EXPORT_SYMBOL_HDA
(
snd_hda_resume
);
#endif
/* CONFIG_PM */
/*
* generic arrays
...
...
@@ -3424,6 +3516,7 @@ void *snd_array_new(struct snd_array *array)
}
return
snd_array_elem
(
array
,
array
->
used
++
);
}
EXPORT_SYMBOL_HDA
(
snd_array_new
);
/* free the given array elements */
void
snd_array_free
(
struct
snd_array
*
array
)
...
...
@@ -3433,6 +3526,7 @@ void snd_array_free(struct snd_array *array)
array
->
alloced
=
0
;
array
->
list
=
NULL
;
}
EXPORT_SYMBOL_HDA
(
snd_array_free
);
/*
* used by hda_proc.c and hda_eld.c
...
...
@@ -3451,6 +3545,7 @@ void snd_print_pcm_rates(int pcm, char *buf, int buflen)
buf
[
j
]
=
'\0'
;
/* necessary when j == 0 */
}
EXPORT_SYMBOL_HDA
(
snd_print_pcm_rates
);
void
snd_print_pcm_bits
(
int
pcm
,
char
*
buf
,
int
buflen
)
{
...
...
@@ -3463,3 +3558,7 @@ void snd_print_pcm_bits(int pcm, char *buf, int buflen)
buf
[
j
]
=
'\0'
;
/* necessary when j == 0 */
}
EXPORT_SYMBOL_HDA
(
snd_print_pcm_bits
);
MODULE_DESCRIPTION
(
"HDA codec core"
);
MODULE_LICENSE
(
"GPL"
);
sound/pci/hda/hda_codec.h
View file @
0640f84f
...
...
@@ -640,6 +640,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
);
...
...
@@ -733,6 +743,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 */
...
...
@@ -896,4 +907,19 @@ static inline void snd_hda_power_down(struct hda_codec *codec) {}
#define snd_hda_codec_needs_resume(codec) 1
#endif
/*
* Codec modularization
*/
/* Export symbols only for communication with codec drivers;
* When built in kernel, all HD-audio drivers are supposed to be statically
* linked to the kernel. Thus, the symbols don't have to (or shouldn't) be
* exported unless it's built as a module.
*/
#ifdef MODULE
#define EXPORT_SYMBOL_HDA(sym) EXPORT_SYMBOL_GPL(sym)
#else
#define EXPORT_SYMBOL_HDA(sym)
#endif
#endif
/* __SOUND_HDA_CODEC_H */
sound/pci/hda/hda_generic.c
View file @
0640f84f
...
...
@@ -1101,3 +1101,4 @@ int snd_hda_parse_generic_codec(struct hda_codec *codec)
snd_hda_generic_free
(
codec
);
return
err
;
}
EXPORT_SYMBOL
(
snd_hda_parse_generic_codec
);
sound/pci/hda/hda_hwdep.c
View file @
0640f84f
...
...
@@ -116,7 +116,7 @@ static void hwdep_free(struct snd_hwdep *hwdep)
clear_hwdep_elements
(
hwdep
->
private_data
);
}
int
__devinit
snd_hda_create_hwdep
(
struct
hda_codec
*
codec
)
int
/*__devinit*/
snd_hda_create_hwdep
(
struct
hda_codec
*
codec
)
{
char
hwname
[
16
];
struct
snd_hwdep
*
hwdep
;
...
...
sound/pci/hda/hda_patch.h
deleted
100644 → 0
View file @
8c2f767b
/*
* HDA Patches - included by hda_codec.c
*/
/* Realtek codecs */
extern
struct
hda_codec_preset
snd_hda_preset_realtek
[];
/* C-Media codecs */
extern
struct
hda_codec_preset
snd_hda_preset_cmedia
[];
/* Analog Devices codecs */
extern
struct
hda_codec_preset
snd_hda_preset_analog
[];
/* SigmaTel codecs */
extern
struct
hda_codec_preset
snd_hda_preset_sigmatel
[];
/* SiLabs 3054/3055 modem codecs */
extern
struct
hda_codec_preset
snd_hda_preset_si3054
[];
/* ATI HDMI codecs */
extern
struct
hda_codec_preset
snd_hda_preset_atihdmi
[];
/* Conexant audio codec */
extern
struct
hda_codec_preset
snd_hda_preset_conexant
[];
/* VIA codecs */
extern
struct
hda_codec_preset
snd_hda_preset_via
[];
/* NVIDIA HDMI codecs */
extern
struct
hda_codec_preset
snd_hda_preset_nvhdmi
[];
/* INTEL HDMI codecs */
extern
struct
hda_codec_preset
snd_hda_preset_intelhdmi
[];
sound/pci/hda/patch_analog.c
View file @
0640f84f
...
...
@@ -27,7 +27,6 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_patch.h"
struct
ad198x_spec
{
struct
snd_kcontrol_new
*
mixers
[
5
];
...
...
@@ -4308,7 +4307,7 @@ static int patch_ad1882(struct hda_codec *codec)
/*
* patch entries
*/
struct
hda_codec_preset
snd_hda_preset_analog
[]
=
{
st
atic
st
ruct
hda_codec_preset
snd_hda_preset_analog
[]
=
{
{
.
id
=
0x11d4184a
,
.
name
=
"AD1884A"
,
.
patch
=
patch_ad1884a
},
{
.
id
=
0x11d41882
,
.
name
=
"AD1882"
,
.
patch
=
patch_ad1882
},
{
.
id
=
0x11d41883
,
.
name
=
"AD1883"
,
.
patch
=
patch_ad1884a
},
...
...
@@ -4326,3 +4325,26 @@ struct hda_codec_preset snd_hda_preset_analog[] = {
{
.
id
=
0x11d4989b
,
.
name
=
"AD1989B"
,
.
patch
=
patch_ad1988
},
{}
/* terminator */
};
MODULE_ALIAS
(
"snd-hda-codec-id:11d4*"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Analog Devices HD-audio codec"
);
static
struct
hda_codec_preset_list
analog_list
=
{
.
preset
=
snd_hda_preset_analog
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
patch_analog_init
(
void
)
{
return
snd_hda_add_codec_preset
(
&
analog_list
);
}
static
void
__exit
patch_analog_exit
(
void
)
{
snd_hda_delete_codec_preset
(
&
analog_list
);
}
module_init
(
patch_analog_init
)
module_exit
(
patch_analog_exit
)
sound/pci/hda/patch_atihdmi.c
View file @
0640f84f
...
...
@@ -27,7 +27,6 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_patch.h"
struct
atihdmi_spec
{
struct
hda_multi_out
multiout
;
...
...
@@ -187,7 +186,7 @@ static int patch_atihdmi(struct hda_codec *codec)
/*
* patch entries
*/
struct
hda_codec_preset
snd_hda_preset_atihdmi
[]
=
{
st
atic
st
ruct
hda_codec_preset
snd_hda_preset_atihdmi
[]
=
{
{
.
id
=
0x1002793c
,
.
name
=
"ATI RS600 HDMI"
,
.
patch
=
patch_atihdmi
},
{
.
id
=
0x10027919
,
.
name
=
"ATI RS600 HDMI"
,
.
patch
=
patch_atihdmi
},
{
.
id
=
0x1002791a
,
.
name
=
"ATI RS690/780 HDMI"
,
.
patch
=
patch_atihdmi
},
...
...
@@ -196,3 +195,31 @@ struct hda_codec_preset snd_hda_preset_atihdmi[] = {
{
.
id
=
0x17e80047
,
.
name
=
"Chrontel HDMI"
,
.
patch
=
patch_atihdmi
},
{}
/* terminator */
};
MODULE_ALIAS
(
"snd-hda-codec-id:1002793c"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10027919"
);
MODULE_ALIAS
(
"snd-hda-codec-id:1002791a"
);
MODULE_ALIAS
(
"snd-hda-codec-id:1002aa01"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10951390"
);
MODULE_ALIAS
(
"snd-hda-codec-id:17e80047"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"ATI HDMI HD-audio codec"
);
static
struct
hda_codec_preset_list
atihdmi_list
=
{
.
preset
=
snd_hda_preset_atihdmi
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
patch_atihdmi_init
(
void
)
{
return
snd_hda_add_codec_preset
(
&
atihdmi_list
);
}
static
void
__exit
patch_atihdmi_exit
(
void
)
{
snd_hda_delete_codec_preset
(
&
atihdmi_list
);
}
module_init
(
patch_atihdmi_init
)
module_exit
(
patch_atihdmi_exit
)
sound/pci/hda/patch_cmedia.c
View file @
0640f84f
...
...
@@ -28,7 +28,6 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_patch.h"
#define NUM_PINS 11
...
...
@@ -736,8 +735,32 @@ static int patch_cmi9880(struct hda_codec *codec)
/*
* patch entries
*/
struct
hda_codec_preset
snd_hda_preset_cmedia
[]
=
{
st
atic
st
ruct
hda_codec_preset
snd_hda_preset_cmedia
[]
=
{
{
.
id
=
0x13f69880
,
.
name
=
"CMI9880"
,
.
patch
=
patch_cmi9880
},
{
.
id
=
0x434d4980
,
.
name
=
"CMI9880"
,
.
patch
=
patch_cmi9880
},
{}
/* terminator */
};
MODULE_ALIAS
(
"snd-hda-codec-id:13f69880"
);
MODULE_ALIAS
(
"snd-hda-codec-id:434d4980"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"C-Media HD-audio codec"
);
static
struct
hda_codec_preset_list
cmedia_list
=
{
.
preset
=
snd_hda_preset_cmedia
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
patch_cmedia_init
(
void
)
{
return
snd_hda_add_codec_preset
(
&
cmedia_list
);
}
static
void
__exit
patch_cmedia_exit
(
void
)
{
snd_hda_delete_codec_preset
(
&
cmedia_list
);
}
module_init
(
patch_cmedia_init
)
module_exit
(
patch_cmedia_exit
)
sound/pci/hda/patch_conexant.c
View file @
0640f84f
...
...
@@ -27,7 +27,6 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_patch.h"
#define CXT_PIN_DIR_IN 0x00
#define CXT_PIN_DIR_OUT 0x01
...
...
@@ -1771,7 +1770,7 @@ static int patch_cxt5051(struct hda_codec *codec)
/*
*/
struct
hda_codec_preset
snd_hda_preset_conexant
[]
=
{
st
atic
st
ruct
hda_codec_preset
snd_hda_preset_conexant
[]
=
{
{
.
id
=
0x14f15045
,
.
name
=
"CX20549 (Venice)"
,
.
patch
=
patch_cxt5045
},
{
.
id
=
0x14f15047
,
.
name
=
"CX20551 (Waikiki)"
,
...
...
@@ -1780,3 +1779,28 @@ struct hda_codec_preset snd_hda_preset_conexant[] = {
.
patch
=
patch_cxt5051
},
{}
/* terminator */
};
MODULE_ALIAS
(
"snd-hda-codec-id:14f15045"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f15047"
);
MODULE_ALIAS
(
"snd-hda-codec-id:14f15051"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Conexant HD-audio codec"
);
static
struct
hda_codec_preset_list
conexant_list
=
{
.
preset
=
snd_hda_preset_conexant
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
patch_conexant_init
(
void
)
{
return
snd_hda_add_codec_preset
(
&
conexant_list
);
}
static
void
__exit
patch_conexant_exit
(
void
)
{
snd_hda_delete_codec_preset
(
&
conexant_list
);
}
module_init
(
patch_conexant_init
)
module_exit
(
patch_conexant_exit
)
sound/pci/hda/patch_intelhdmi.c
View file @
0640f84f
...
...
@@ -32,7 +32,6 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_patch.h"
#define CVT_NID 0x02
/* audio converter */
#define PIN_NID 0x03
/* HDMI output pin */
...
...
@@ -675,7 +674,7 @@ static int patch_intel_hdmi(struct hda_codec *codec)
return
0
;
}
struct
hda_codec_preset
snd_hda_preset_intelhdmi
[]
=
{
st
atic
st
ruct
hda_codec_preset
snd_hda_preset_intelhdmi
[]
=
{
{
.
id
=
0x808629fb
,
.
name
=
"INTEL G45 DEVCL"
,
.
patch
=
patch_intel_hdmi
},
{
.
id
=
0x80862801
,
.
name
=
"INTEL G45 DEVBLC"
,
.
patch
=
patch_intel_hdmi
},
{
.
id
=
0x80862802
,
.
name
=
"INTEL G45 DEVCTG"
,
.
patch
=
patch_intel_hdmi
},
...
...
@@ -683,3 +682,30 @@ struct hda_codec_preset snd_hda_preset_intelhdmi[] = {
{
.
id
=
0x10951392
,
.
name
=
"SiI1392 HDMI"
,
.
patch
=
patch_intel_hdmi
},
{}
/* terminator */
};
MODULE_ALIAS
(
"snd-hda-codec-id:808629fb"
);
MODULE_ALIAS
(
"snd-hda-codec-id:80862801"
);
MODULE_ALIAS
(
"snd-hda-codec-id:80862802"
);
MODULE_ALIAS
(
"snd-hda-codec-id:80862803"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10951392"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Intel HDMI HD-audio codec"
);
static
struct
hda_codec_preset_list
intel_list
=
{
.
preset
=
snd_hda_preset_intelhdmi
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
patch_intelhdmi_init
(
void
)
{
return
snd_hda_add_codec_preset
(
&
intel_list
);
}
static
void
__exit
patch_intelhdmi_exit
(
void
)
{
snd_hda_delete_codec_preset
(
&
intel_list
);
}
module_init
(
patch_intelhdmi_init
)
module_exit
(
patch_intelhdmi_exit
)
sound/pci/hda/patch_nvhdmi.c
View file @
0640f84f
...
...
@@ -28,7 +28,6 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_patch.h"
struct
nvhdmi_spec
{
struct
hda_multi_out
multiout
;
...
...
@@ -159,8 +158,32 @@ static int patch_nvhdmi(struct hda_codec *codec)
/*
* patch entries
*/
struct
hda_codec_preset
snd_hda_preset_nvhdmi
[]
=
{
st
atic
st
ruct
hda_codec_preset
snd_hda_preset_nvhdmi
[]
=
{
{
.
id
=
0x10de0002
,
.
name
=
"NVIDIA MCP78 HDMI"
,
.
patch
=
patch_nvhdmi
},
{
.
id
=
0x10de0007
,
.
name
=
"NVIDIA MCP7A HDMI"
,
.
patch
=
patch_nvhdmi
},
{}
/* terminator */
};
MODULE_ALIAS
(
"snd-hda-codec-id:10de0002"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10de0007"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Nvidia HDMI HD-audio codec"
);
static
struct
hda_codec_preset_list
nvhdmi_list
=
{
.
preset
=
snd_hda_preset_nvhdmi
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
patch_nvhdmi_init
(
void
)
{
return
snd_hda_add_codec_preset
(
&
nvhdmi_list
);
}
static
void
__exit
patch_nvhdmi_exit
(
void
)
{
snd_hda_delete_codec_preset
(
&
nvhdmi_list
);
}
module_init
(
patch_nvhdmi_init
)
module_exit
(
patch_nvhdmi_exit
)
sound/pci/hda/patch_realtek.c
View file @
0640f84f
...
...
@@ -30,7 +30,6 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_patch.h"
#define ALC880_FRONT_EVENT 0x01
#define ALC880_DCVOL_EVENT 0x02
...
...
@@ -16613,7 +16612,7 @@ static int patch_alc662(struct hda_codec *codec)
/*
* patch entries
*/
struct
hda_codec_preset
snd_hda_preset_realtek
[]
=
{
st
atic
st
ruct
hda_codec_preset
snd_hda_preset_realtek
[]
=
{
{
.
id
=
0x10ec0260
,
.
name
=
"ALC260"
,
.
patch
=
patch_alc260
},
{
.
id
=
0x10ec0262
,
.
name
=
"ALC262"
,
.
patch
=
patch_alc262
},
{
.
id
=
0x10ec0267
,
.
name
=
"ALC267"
,
.
patch
=
patch_alc268
},
...
...
@@ -16645,3 +16644,26 @@ struct hda_codec_preset snd_hda_preset_realtek[] = {
{
.
id
=
0x10ec0889
,
.
name
=
"ALC889"
,
.
patch
=
patch_alc883
},
{}
/* terminator */
};
MODULE_ALIAS
(
"snd-hda-codec-id:10ec*"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Realtek HD-audio codec"
);
static
struct
hda_codec_preset_list
realtek_list
=
{
.
preset
=
snd_hda_preset_realtek
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
patch_realtek_init
(
void
)
{
return
snd_hda_add_codec_preset
(
&
realtek_list
);
}
static
void
__exit
patch_realtek_exit
(
void
)
{
snd_hda_delete_codec_preset
(
&
realtek_list
);
}
module_init
(
patch_realtek_init
)
module_exit
(
patch_realtek_exit
)
sound/pci/hda/patch_si3054.c
View file @
0640f84f
...
...
@@ -28,7 +28,6 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_patch.h"
/* si3054 verbs */
#define SI3054_VERB_READ_NODE 0x900
...
...
@@ -283,7 +282,7 @@ static int patch_si3054(struct hda_codec *codec)
/*
* patch entries
*/
struct
hda_codec_preset
snd_hda_preset_si3054
[]
=
{
st
atic
st
ruct
hda_codec_preset
snd_hda_preset_si3054
[]
=
{
{
.
id
=
0x163c3055
,
.
name
=
"Si3054"
,
.
patch
=
patch_si3054
},
{
.
id
=
0x163c3155
,
.
name
=
"Si3054"
,
.
patch
=
patch_si3054
},
{
.
id
=
0x11c13026
,
.
name
=
"Si3054"
,
.
patch
=
patch_si3054
},
...
...
@@ -301,3 +300,35 @@ struct hda_codec_preset snd_hda_preset_si3054[] = {
{}
};
MODULE_ALIAS
(
"snd-hda-codec-id:163c3055"
);
MODULE_ALIAS
(
"snd-hda-codec-id:163c3155"
);
MODULE_ALIAS
(
"snd-hda-codec-id:11c13026"
);
MODULE_ALIAS
(
"snd-hda-codec-id:11c13055"
);
MODULE_ALIAS
(
"snd-hda-codec-id:11c13155"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10573055"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10573057"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10573155"
);
MODULE_ALIAS
(
"snd-hda-codec-id:11063288"
);
MODULE_ALIAS
(
"snd-hda-codec-id:15433155"
);
MODULE_ALIAS
(
"snd-hda-codec-id:18540018"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Si3054 HD-audio modem codec"
);
static
struct
hda_codec_preset_list
si3054_list
=
{
.
preset
=
snd_hda_preset_si3054
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
patch_si3054_init
(
void
)
{
return
snd_hda_add_codec_preset
(
&
si3054_list
);
}
static
void
__exit
patch_si3054_exit
(
void
)
{
snd_hda_delete_codec_preset
(
&
si3054_list
);
}
module_init
(
patch_si3054_init
)
module_exit
(
patch_si3054_exit
)
sound/pci/hda/patch_sigmatel.c
View file @
0640f84f
...
...
@@ -33,7 +33,6 @@
#include <sound/jack.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_patch.h"
#include "hda_beep.h"
enum
{
...
...
@@ -5461,7 +5460,7 @@ static int patch_stac9872(struct hda_codec *codec)
/*
* patch entries
*/
struct
hda_codec_preset
snd_hda_preset_sigmatel
[]
=
{
st
atic
st
ruct
hda_codec_preset
snd_hda_preset_sigmatel
[]
=
{
{
.
id
=
0x83847690
,
.
name
=
"STAC9200"
,
.
patch
=
patch_stac9200
},
{
.
id
=
0x83847882
,
.
name
=
"STAC9220 A1"
,
.
patch
=
patch_stac922x
},
{
.
id
=
0x83847680
,
.
name
=
"STAC9221 A1"
,
.
patch
=
patch_stac922x
},
...
...
@@ -5525,3 +5524,27 @@ struct hda_codec_preset snd_hda_preset_sigmatel[] = {
{
.
id
=
0x111d76b7
,
.
name
=
"92HD71B5X"
,
.
patch
=
patch_stac92hd71bxx
},
{}
/* terminator */
};
MODULE_ALIAS
(
"snd-hda-codec-id:8384*"
);
MODULE_ALIAS
(
"snd-hda-codec-id:111d*"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"IDT/Sigmatel HD-audio codec"
);
static
struct
hda_codec_preset_list
sigmatel_list
=
{
.
preset
=
snd_hda_preset_sigmatel
,
.
owner
=
THIS_MODULE
,
};
static
int
__init
patch_sigmatel_init
(
void
)
{
return
snd_hda_add_codec_preset
(
&
sigmatel_list
);
}
static
void
__exit
patch_sigmatel_exit
(
void
)
{
snd_hda_delete_codec_preset
(
&
sigmatel_list
);
}
module_init
(
patch_sigmatel_init
)
module_exit
(
patch_sigmatel_exit
)
sound/pci/hda/patch_via.c
View file @
0640f84f
...
...
@@ -47,7 +47,6 @@
#include <sound/asoundef.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_patch.h"
/* amp values */
#define AMP_VAL_IDX_SHIFT 19
...
...
@@ -3249,7 +3248,7 @@ static int patch_vt1702(struct hda_codec *codec)
/*
* patch entries
*/
struct
hda_codec_preset
snd_hda_preset_via
[]
=
{
st
atic
st
ruct
hda_codec_preset
snd_hda_preset_via
[]
=
{
{
.
id
=
0x11061708
,
.
name
=
"VIA VT1708"
,
.
patch
=
patch_vt1708
},
{
.
id
=
0x11061709
,
.
name
=
"VIA VT1708"
,
.
patch
=
patch_vt1708
},
{
.
id
=
0x1106170A
,
.
name
=
"VIA VT1708"
,
.
patch
=
patch_vt1708
},
...
...
@@ -3320,3 +3319,26 @@ struct hda_codec_preset snd_hda_preset_via[] = {
.
patch
=
patch_vt1702
},
{}
/* terminator */
};
MODULE_ALIAS
(
"snd-hda-codec-id:1106*"
);
static
struct
hda_codec_preset_list
via_list
=
{
.
preset
=
snd_hda_preset_via
,
.
owner
=
THIS_MODULE
,
};
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"VIA HD-audio codec"
);
static
int
__init
patch_via_init
(
void
)
{
return
snd_hda_add_codec_preset
(
&
via_list
);
}
static
void
__exit
patch_via_exit
(
void
)
{
snd_hda_delete_codec_preset
(
&
via_list
);
}
module_init
(
patch_via_init
)
module_exit
(
patch_via_exit
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment