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
209b1403
Commit
209b1403
authored
Feb 23, 2009
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'test/hda-pincfg' into topic/hda
parents
13c989be
39c2871e
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
332 additions
and
291 deletions
+332
-291
Documentation/sound/alsa/HD-Audio.txt
Documentation/sound/alsa/HD-Audio.txt
+22
-1
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+151
-11
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_codec.h
+15
-0
sound/pci/hda/hda_generic.c
sound/pci/hda/hda_generic.c
+1
-1
sound/pci/hda/hda_hwdep.c
sound/pci/hda/hda_hwdep.c
+66
-0
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_analog.c
+1
-2
sound/pci/hda/patch_cmedia.c
sound/pci/hda/patch_cmedia.c
+6
-6
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+3
-75
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_sigmatel.c
+65
-190
sound/pci/hda/patch_via.c
sound/pci/hda/patch_via.c
+2
-5
No files found.
Documentation/sound/alsa/HD-Audio.txt
View file @
209b1403
...
@@ -365,10 +365,23 @@ modelname::
...
@@ -365,10 +365,23 @@ modelname::
to this file.
to this file.
init_verbs::
init_verbs::
The extra verbs to execute at initialization. You can add a verb by
The extra verbs to execute at initialization. You can add a verb by
writing to this file. Pass t
ree numbers,
nid, verb and parameter.
writing to this file. Pass t
hree numbers:
nid, verb and parameter.
hints::
hints::
Shows hint strings for codec parsers for any use. Right now it's
Shows hint strings for codec parsers for any use. Right now it's
not used.
not used.
init_pin_configs::
Shows the initial pin default config values set by BIOS.
driver_pin_configs::
Shows the pin default values set by the codec parser explicitly.
This doesn't show all pin values but only the changed values by
the parser. That is, if the parser doesn't change the pin default
config values by itself, this will contain nothing.
user_pin_configs::
Shows the pin default config values to override the BIOS setup.
Writing this (with two numbers, NID and value) appends the new
value. The given will be used instead of the initial BIOS value at
the next reconfiguration time. Note that this config will override
even the driver pin configs, too.
reconfig::
reconfig::
Triggers the codec re-configuration. When any value is written to
Triggers the codec re-configuration. When any value is written to
this file, the driver re-initialize and parses the codec tree
this file, the driver re-initialize and parses the codec tree
...
@@ -378,6 +391,14 @@ clear::
...
@@ -378,6 +391,14 @@ clear::
Resets the codec, removes the mixer elements and PCM stuff of the
Resets the codec, removes the mixer elements and PCM stuff of the
specified codec, and clear all init verbs and hints.
specified codec, and clear all init verbs and hints.
For example, when you want to change the pin default configuration
value of the pin widget 0x14 to 0x9993013f, and let the driver
re-configure based on that state, run like below:
------------------------------------------------------------------------
# echo 0x14 0x9993013f > /sys/class/sound/hwC0D0/user_pin_configs
# echo 1 > /sys/class/sound/hwC0D0/reconfig
------------------------------------------------------------------------
Power-Saving
Power-Saving
~~~~~~~~~~~~
~~~~~~~~~~~~
...
...
sound/pci/hda/hda_codec.c
View file @
209b1403
...
@@ -682,11 +682,140 @@ static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node)
...
@@ -682,11 +682,140 @@ static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node)
return
0
;
return
0
;
}
}
/* read all pin default configurations and save codec->init_pins */
static
int
read_pin_defaults
(
struct
hda_codec
*
codec
)
{
int
i
;
hda_nid_t
nid
=
codec
->
start_nid
;
for
(
i
=
0
;
i
<
codec
->
num_nodes
;
i
++
,
nid
++
)
{
struct
hda_pincfg
*
pin
;
unsigned
int
wcaps
=
get_wcaps
(
codec
,
nid
);
unsigned
int
wid_type
=
(
wcaps
&
AC_WCAP_TYPE
)
>>
AC_WCAP_TYPE_SHIFT
;
if
(
wid_type
!=
AC_WID_PIN
)
continue
;
pin
=
snd_array_new
(
&
codec
->
init_pins
);
if
(
!
pin
)
return
-
ENOMEM
;
pin
->
nid
=
nid
;
pin
->
cfg
=
snd_hda_codec_read
(
codec
,
nid
,
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
}
return
0
;
}
/* look up the given pin config list and return the item matching with NID */
static
struct
hda_pincfg
*
look_up_pincfg
(
struct
hda_codec
*
codec
,
struct
snd_array
*
array
,
hda_nid_t
nid
)
{
int
i
;
for
(
i
=
0
;
i
<
array
->
used
;
i
++
)
{
struct
hda_pincfg
*
pin
=
snd_array_elem
(
array
,
i
);
if
(
pin
->
nid
==
nid
)
return
pin
;
}
return
NULL
;
}
/* write a config value for the given NID */
static
void
set_pincfg
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
unsigned
int
cfg
)
{
int
i
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_CONFIG_DEFAULT_BYTES_0
+
i
,
cfg
&
0xff
);
cfg
>>=
8
;
}
}
/* set the current pin config value for the given NID.
* the value is cached, and read via snd_hda_codec_get_pincfg()
*/
int
snd_hda_add_pincfg
(
struct
hda_codec
*
codec
,
struct
snd_array
*
list
,
hda_nid_t
nid
,
unsigned
int
cfg
)
{
struct
hda_pincfg
*
pin
;
unsigned
int
oldcfg
;
oldcfg
=
snd_hda_codec_get_pincfg
(
codec
,
nid
);
pin
=
look_up_pincfg
(
codec
,
list
,
nid
);
if
(
!
pin
)
{
pin
=
snd_array_new
(
list
);
if
(
!
pin
)
return
-
ENOMEM
;
pin
->
nid
=
nid
;
}
pin
->
cfg
=
cfg
;
/* change only when needed; e.g. if the pincfg is already present
* in user_pins[], don't write it
*/
cfg
=
snd_hda_codec_get_pincfg
(
codec
,
nid
);
if
(
oldcfg
!=
cfg
)
set_pincfg
(
codec
,
nid
,
cfg
);
return
0
;
}
int
snd_hda_codec_set_pincfg
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
unsigned
int
cfg
)
{
return
snd_hda_add_pincfg
(
codec
,
&
codec
->
driver_pins
,
nid
,
cfg
);
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_set_pincfg
);
/* get the current pin config value of the given pin NID */
unsigned
int
snd_hda_codec_get_pincfg
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
struct
hda_pincfg
*
pin
;
#ifdef CONFIG_SND_HDA_HWDEP
pin
=
look_up_pincfg
(
codec
,
&
codec
->
user_pins
,
nid
);
if
(
pin
)
return
pin
->
cfg
;
#endif
pin
=
look_up_pincfg
(
codec
,
&
codec
->
driver_pins
,
nid
);
if
(
pin
)
return
pin
->
cfg
;
pin
=
look_up_pincfg
(
codec
,
&
codec
->
init_pins
,
nid
);
if
(
pin
)
return
pin
->
cfg
;
return
0
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_get_pincfg
);
/* restore all current pin configs */
static
void
restore_pincfgs
(
struct
hda_codec
*
codec
)
{
int
i
;
for
(
i
=
0
;
i
<
codec
->
init_pins
.
used
;
i
++
)
{
struct
hda_pincfg
*
pin
=
snd_array_elem
(
&
codec
->
init_pins
,
i
);
set_pincfg
(
codec
,
pin
->
nid
,
snd_hda_codec_get_pincfg
(
codec
,
pin
->
nid
));
}
}
static
void
init_hda_cache
(
struct
hda_cache_rec
*
cache
,
static
void
init_hda_cache
(
struct
hda_cache_rec
*
cache
,
unsigned
int
record_size
);
unsigned
int
record_size
);
static
void
free_hda_cache
(
struct
hda_cache_rec
*
cache
);
static
void
free_hda_cache
(
struct
hda_cache_rec
*
cache
);
/* restore the initial pin cfgs and release all pincfg lists */
static
void
restore_init_pincfgs
(
struct
hda_codec
*
codec
)
{
/* first free driver_pins and user_pins, then call restore_pincfg
* so that only the values in init_pins are restored
*/
snd_array_free
(
&
codec
->
driver_pins
);
#ifdef CONFIG_SND_HDA_HWDEP
snd_array_free
(
&
codec
->
user_pins
);
#endif
restore_pincfgs
(
codec
);
snd_array_free
(
&
codec
->
init_pins
);
}
/*
/*
* codec destructor
* codec destructor
*/
*/
...
@@ -694,6 +823,7 @@ static void snd_hda_codec_free(struct hda_codec *codec)
...
@@ -694,6 +823,7 @@ static void snd_hda_codec_free(struct hda_codec *codec)
{
{
if
(
!
codec
)
if
(
!
codec
)
return
;
return
;
restore_init_pincfgs
(
codec
);
#ifdef CONFIG_SND_HDA_POWER_SAVE
#ifdef CONFIG_SND_HDA_POWER_SAVE
cancel_delayed_work
(
&
codec
->
power_work
);
cancel_delayed_work
(
&
codec
->
power_work
);
flush_workqueue
(
codec
->
bus
->
workq
);
flush_workqueue
(
codec
->
bus
->
workq
);
...
@@ -751,6 +881,8 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
...
@@ -751,6 +881,8 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
init_hda_cache
(
&
codec
->
amp_cache
,
sizeof
(
struct
hda_amp_info
));
init_hda_cache
(
&
codec
->
amp_cache
,
sizeof
(
struct
hda_amp_info
));
init_hda_cache
(
&
codec
->
cmd_cache
,
sizeof
(
struct
hda_cache_head
));
init_hda_cache
(
&
codec
->
cmd_cache
,
sizeof
(
struct
hda_cache_head
));
snd_array_init
(
&
codec
->
mixers
,
sizeof
(
struct
snd_kcontrol
*
),
32
);
snd_array_init
(
&
codec
->
mixers
,
sizeof
(
struct
snd_kcontrol
*
),
32
);
snd_array_init
(
&
codec
->
init_pins
,
sizeof
(
struct
hda_pincfg
),
16
);
snd_array_init
(
&
codec
->
driver_pins
,
sizeof
(
struct
hda_pincfg
),
16
);
if
(
codec
->
bus
->
modelname
)
{
if
(
codec
->
bus
->
modelname
)
{
codec
->
modelname
=
kstrdup
(
codec
->
bus
->
modelname
,
GFP_KERNEL
);
codec
->
modelname
=
kstrdup
(
codec
->
bus
->
modelname
,
GFP_KERNEL
);
if
(
!
codec
->
modelname
)
{
if
(
!
codec
->
modelname
)
{
...
@@ -787,15 +919,18 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
...
@@ -787,15 +919,18 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
setup_fg_nodes
(
codec
);
setup_fg_nodes
(
codec
);
if
(
!
codec
->
afg
&&
!
codec
->
mfg
)
{
if
(
!
codec
->
afg
&&
!
codec
->
mfg
)
{
snd_printdd
(
"hda_codec: no AFG or MFG node found
\n
"
);
snd_printdd
(
"hda_codec: no AFG or MFG node found
\n
"
);
snd_hda_codec_free
(
codec
)
;
err
=
-
ENODEV
;
return
-
ENODEV
;
goto
error
;
}
}
if
(
read_widget_caps
(
codec
,
codec
->
afg
?
codec
->
afg
:
codec
->
mfg
)
<
0
)
{
err
=
read_widget_caps
(
codec
,
codec
->
afg
?
codec
->
afg
:
codec
->
mfg
);
if
(
err
<
0
)
{
snd_printk
(
KERN_ERR
"hda_codec: cannot malloc
\n
"
);
snd_printk
(
KERN_ERR
"hda_codec: cannot malloc
\n
"
);
snd_hda_codec_free
(
codec
);
goto
error
;
return
-
ENOMEM
;
}
}
err
=
read_pin_defaults
(
codec
);
if
(
err
<
0
)
goto
error
;
if
(
!
codec
->
subsystem_id
)
{
if
(
!
codec
->
subsystem_id
)
{
hda_nid_t
nid
=
codec
->
afg
?
codec
->
afg
:
codec
->
mfg
;
hda_nid_t
nid
=
codec
->
afg
?
codec
->
afg
:
codec
->
mfg
;
...
@@ -808,10 +943,8 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
...
@@ -808,10 +943,8 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
if
(
do_init
)
{
if
(
do_init
)
{
err
=
snd_hda_codec_configure
(
codec
);
err
=
snd_hda_codec_configure
(
codec
);
if
(
err
<
0
)
{
if
(
err
<
0
)
snd_hda_codec_free
(
codec
);
goto
error
;
return
err
;
}
}
}
snd_hda_codec_proc_new
(
codec
);
snd_hda_codec_proc_new
(
codec
);
...
@@ -824,6 +957,10 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
...
@@ -824,6 +957,10 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
if
(
codecp
)
if
(
codecp
)
*
codecp
=
codec
;
*
codecp
=
codec
;
return
0
;
return
0
;
error:
snd_hda_codec_free
(
codec
);
return
err
;
}
}
EXPORT_SYMBOL_HDA
(
snd_hda_codec_new
);
EXPORT_SYMBOL_HDA
(
snd_hda_codec_new
);
...
@@ -1334,6 +1471,9 @@ void snd_hda_codec_reset(struct hda_codec *codec)
...
@@ -1334,6 +1471,9 @@ void snd_hda_codec_reset(struct hda_codec *codec)
free_hda_cache
(
&
codec
->
cmd_cache
);
free_hda_cache
(
&
codec
->
cmd_cache
);
init_hda_cache
(
&
codec
->
amp_cache
,
sizeof
(
struct
hda_amp_info
));
init_hda_cache
(
&
codec
->
amp_cache
,
sizeof
(
struct
hda_amp_info
));
init_hda_cache
(
&
codec
->
cmd_cache
,
sizeof
(
struct
hda_cache_head
));
init_hda_cache
(
&
codec
->
cmd_cache
,
sizeof
(
struct
hda_cache_head
));
/* free only driver_pins so that init_pins + user_pins are restored */
snd_array_free
(
&
codec
->
driver_pins
);
restore_pincfgs
(
codec
);
codec
->
num_pcms
=
0
;
codec
->
num_pcms
=
0
;
codec
->
pcm_info
=
NULL
;
codec
->
pcm_info
=
NULL
;
codec
->
preset
=
NULL
;
codec
->
preset
=
NULL
;
...
@@ -2175,6 +2315,7 @@ static void hda_call_codec_resume(struct hda_codec *codec)
...
@@ -2175,6 +2315,7 @@ static void hda_call_codec_resume(struct hda_codec *codec)
hda_set_power_state
(
codec
,
hda_set_power_state
(
codec
,
codec
->
afg
?
codec
->
afg
:
codec
->
mfg
,
codec
->
afg
?
codec
->
afg
:
codec
->
mfg
,
AC_PWRST_D0
);
AC_PWRST_D0
);
restore_pincfgs
(
codec
);
/* restore all current pin configs */
hda_exec_init_verbs
(
codec
);
hda_exec_init_verbs
(
codec
);
if
(
codec
->
patch_ops
.
resume
)
if
(
codec
->
patch_ops
.
resume
)
codec
->
patch_ops
.
resume
(
codec
);
codec
->
patch_ops
.
resume
(
codec
);
...
@@ -3355,8 +3496,7 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec,
...
@@ -3355,8 +3496,7 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec,
if
(
ignore_nids
&&
is_in_nid_list
(
nid
,
ignore_nids
))
if
(
ignore_nids
&&
is_in_nid_list
(
nid
,
ignore_nids
))
continue
;
continue
;
def_conf
=
snd_hda_codec_read
(
codec
,
nid
,
0
,
def_conf
=
snd_hda_codec_get_pincfg
(
codec
,
nid
);
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
if
(
get_defcfg_connect
(
def_conf
)
==
AC_JACK_PORT_NONE
)
if
(
get_defcfg_connect
(
def_conf
)
==
AC_JACK_PORT_NONE
)
continue
;
continue
;
loc
=
get_defcfg_location
(
def_conf
);
loc
=
get_defcfg_location
(
def_conf
);
...
...
sound/pci/hda/hda_codec.h
View file @
209b1403
...
@@ -778,11 +778,14 @@ struct hda_codec {
...
@@ -778,11 +778,14 @@ struct hda_codec {
unsigned
short
spdif_ctls
;
/* SPDIF control bits */
unsigned
short
spdif_ctls
;
/* SPDIF control bits */
unsigned
int
spdif_in_enable
;
/* SPDIF input enable? */
unsigned
int
spdif_in_enable
;
/* SPDIF input enable? */
hda_nid_t
*
slave_dig_outs
;
/* optional digital out slave widgets */
hda_nid_t
*
slave_dig_outs
;
/* optional digital out slave widgets */
struct
snd_array
init_pins
;
/* initial (BIOS) pin configurations */
struct
snd_array
driver_pins
;
/* pin configs set by codec parser */
#ifdef CONFIG_SND_HDA_HWDEP
#ifdef CONFIG_SND_HDA_HWDEP
struct
snd_hwdep
*
hwdep
;
/* assigned hwdep device */
struct
snd_hwdep
*
hwdep
;
/* assigned hwdep device */
struct
snd_array
init_verbs
;
/* additional init verbs */
struct
snd_array
init_verbs
;
/* additional init verbs */
struct
snd_array
hints
;
/* additional hints */
struct
snd_array
hints
;
/* additional hints */
struct
snd_array
user_pins
;
/* default pin configs to override */
#endif
#endif
/* misc flags */
/* misc flags */
...
@@ -855,6 +858,18 @@ void snd_hda_codec_resume_cache(struct hda_codec *codec);
...
@@ -855,6 +858,18 @@ void snd_hda_codec_resume_cache(struct hda_codec *codec);
#define snd_hda_sequence_write_cache snd_hda_sequence_write
#define snd_hda_sequence_write_cache snd_hda_sequence_write
#endif
#endif
/* the struct for codec->pin_configs */
struct
hda_pincfg
{
hda_nid_t
nid
;
unsigned
int
cfg
;
};
unsigned
int
snd_hda_codec_get_pincfg
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
);
int
snd_hda_codec_set_pincfg
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
unsigned
int
cfg
);
int
snd_hda_add_pincfg
(
struct
hda_codec
*
codec
,
struct
snd_array
*
list
,
hda_nid_t
nid
,
unsigned
int
cfg
);
/* for hwdep */
/*
/*
* Mixer
* Mixer
*/
*/
...
...
sound/pci/hda/hda_generic.c
View file @
209b1403
...
@@ -146,7 +146,7 @@ static int add_new_node(struct hda_codec *codec, struct hda_gspec *spec, hda_nid
...
@@ -146,7 +146,7 @@ static int add_new_node(struct hda_codec *codec, struct hda_gspec *spec, hda_nid
if
(
node
->
type
==
AC_WID_PIN
)
{
if
(
node
->
type
==
AC_WID_PIN
)
{
node
->
pin_caps
=
snd_hda_param_read
(
codec
,
node
->
nid
,
AC_PAR_PIN_CAP
);
node
->
pin_caps
=
snd_hda_param_read
(
codec
,
node
->
nid
,
AC_PAR_PIN_CAP
);
node
->
pin_ctl
=
snd_hda_codec_read
(
codec
,
node
->
nid
,
0
,
AC_VERB_GET_PIN_WIDGET_CONTROL
,
0
);
node
->
pin_ctl
=
snd_hda_codec_read
(
codec
,
node
->
nid
,
0
,
AC_VERB_GET_PIN_WIDGET_CONTROL
,
0
);
node
->
def_cfg
=
snd_hda_codec_
read
(
codec
,
node
->
nid
,
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
node
->
def_cfg
=
snd_hda_codec_
get_pincfg
(
codec
,
node
->
nid
);
}
}
if
(
node
->
wid_caps
&
AC_WCAP_OUT_AMP
)
{
if
(
node
->
wid_caps
&
AC_WCAP_OUT_AMP
)
{
...
...
sound/pci/hda/hda_hwdep.c
View file @
209b1403
...
@@ -109,6 +109,7 @@ static void clear_hwdep_elements(struct hda_codec *codec)
...
@@ -109,6 +109,7 @@ static void clear_hwdep_elements(struct hda_codec *codec)
for
(
i
=
0
;
i
<
codec
->
hints
.
used
;
i
++
,
head
++
)
for
(
i
=
0
;
i
<
codec
->
hints
.
used
;
i
++
,
head
++
)
kfree
(
*
head
);
kfree
(
*
head
);
snd_array_free
(
&
codec
->
hints
);
snd_array_free
(
&
codec
->
hints
);
snd_array_free
(
&
codec
->
user_pins
);
}
}
static
void
hwdep_free
(
struct
snd_hwdep
*
hwdep
)
static
void
hwdep_free
(
struct
snd_hwdep
*
hwdep
)
...
@@ -141,6 +142,7 @@ int /*__devinit*/ snd_hda_create_hwdep(struct hda_codec *codec)
...
@@ -141,6 +142,7 @@ int /*__devinit*/ snd_hda_create_hwdep(struct hda_codec *codec)
snd_array_init
(
&
codec
->
init_verbs
,
sizeof
(
struct
hda_verb
),
32
);
snd_array_init
(
&
codec
->
init_verbs
,
sizeof
(
struct
hda_verb
),
32
);
snd_array_init
(
&
codec
->
hints
,
sizeof
(
char
*
),
32
);
snd_array_init
(
&
codec
->
hints
,
sizeof
(
char
*
),
32
);
snd_array_init
(
&
codec
->
user_pins
,
sizeof
(
struct
hda_pincfg
),
16
);
return
0
;
return
0
;
}
}
...
@@ -316,6 +318,67 @@ static ssize_t hints_store(struct device *dev,
...
@@ -316,6 +318,67 @@ static ssize_t hints_store(struct device *dev,
return
count
;
return
count
;
}
}
static
ssize_t
pin_configs_show
(
struct
hda_codec
*
codec
,
struct
snd_array
*
list
,
char
*
buf
)
{
int
i
,
len
=
0
;
for
(
i
=
0
;
i
<
list
->
used
;
i
++
)
{
struct
hda_pincfg
*
pin
=
snd_array_elem
(
list
,
i
);
len
+=
sprintf
(
buf
+
len
,
"0x%02x 0x%08x
\n
"
,
pin
->
nid
,
pin
->
cfg
);
}
return
len
;
}
static
ssize_t
init_pin_configs_show
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
struct
snd_hwdep
*
hwdep
=
dev_get_drvdata
(
dev
);
struct
hda_codec
*
codec
=
hwdep
->
private_data
;
return
pin_configs_show
(
codec
,
&
codec
->
init_pins
,
buf
);
}
static
ssize_t
user_pin_configs_show
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
struct
snd_hwdep
*
hwdep
=
dev_get_drvdata
(
dev
);
struct
hda_codec
*
codec
=
hwdep
->
private_data
;
return
pin_configs_show
(
codec
,
&
codec
->
user_pins
,
buf
);
}
static
ssize_t
driver_pin_configs_show
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
struct
snd_hwdep
*
hwdep
=
dev_get_drvdata
(
dev
);
struct
hda_codec
*
codec
=
hwdep
->
private_data
;
return
pin_configs_show
(
codec
,
&
codec
->
driver_pins
,
buf
);
}
#define MAX_PIN_CONFIGS 32
static
ssize_t
user_pin_configs_store
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
struct
snd_hwdep
*
hwdep
=
dev_get_drvdata
(
dev
);
struct
hda_codec
*
codec
=
hwdep
->
private_data
;
int
nid
,
cfg
;
int
err
;
if
(
sscanf
(
buf
,
"%i %i"
,
&
nid
,
&
cfg
)
!=
2
)
return
-
EINVAL
;
if
(
!
nid
)
return
-
EINVAL
;
err
=
snd_hda_add_pincfg
(
codec
,
&
codec
->
user_pins
,
nid
,
cfg
);
if
(
err
<
0
)
return
err
;
return
count
;
}
#define CODEC_ATTR_RW(type) \
#define CODEC_ATTR_RW(type) \
__ATTR(type, 0644, type##_show, type##_store)
__ATTR(type, 0644, type##_show, type##_store)
#define CODEC_ATTR_RO(type) \
#define CODEC_ATTR_RO(type) \
...
@@ -333,6 +396,9 @@ static struct device_attribute codec_attrs[] = {
...
@@ -333,6 +396,9 @@ static struct device_attribute codec_attrs[] = {
CODEC_ATTR_RW
(
modelname
),
CODEC_ATTR_RW
(
modelname
),
CODEC_ATTR_WO
(
init_verbs
),
CODEC_ATTR_WO
(
init_verbs
),
CODEC_ATTR_WO
(
hints
),
CODEC_ATTR_WO
(
hints
),
CODEC_ATTR_RO
(
init_pin_configs
),
CODEC_ATTR_RW
(
user_pin_configs
),
CODEC_ATTR_RO
(
driver_pin_configs
),
CODEC_ATTR_WO
(
reconfig
),
CODEC_ATTR_WO
(
reconfig
),
CODEC_ATTR_WO
(
clear
),
CODEC_ATTR_WO
(
clear
),
};
};
...
...
sound/pci/hda/patch_analog.c
View file @
209b1403
...
@@ -1047,8 +1047,7 @@ static struct hda_amp_list ad1986a_loopbacks[] = {
...
@@ -1047,8 +1047,7 @@ static struct hda_amp_list ad1986a_loopbacks[] = {
static
int
is_jack_available
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
static
int
is_jack_available
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
{
unsigned
int
conf
=
snd_hda_codec_read
(
codec
,
nid
,
0
,
unsigned
int
conf
=
snd_hda_codec_get_pincfg
(
codec
,
nid
);
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
return
get_defcfg_connect
(
conf
)
!=
AC_JACK_PORT_NONE
;
return
get_defcfg_connect
(
conf
)
!=
AC_JACK_PORT_NONE
;
}
}
...
...
sound/pci/hda/patch_cmedia.c
View file @
209b1403
...
@@ -680,13 +680,13 @@ static int patch_cmi9880(struct hda_codec *codec)
...
@@ -680,13 +680,13 @@ static int patch_cmi9880(struct hda_codec *codec)
struct
auto_pin_cfg
cfg
;
struct
auto_pin_cfg
cfg
;
/* collect pin default configuration */
/* collect pin default configuration */
port_e
=
snd_hda_codec_
read
(
codec
,
0x0f
,
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
port_e
=
snd_hda_codec_
get_pincfg
(
codec
,
0x0f
);
port_f
=
snd_hda_codec_
read
(
codec
,
0x10
,
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
port_f
=
snd_hda_codec_
get_pincfg
(
codec
,
0x1
0
);
spec
->
front_panel
=
1
;
spec
->
front_panel
=
1
;
if
(
get_defcfg_connect
(
port_e
)
==
AC_JACK_PORT_NONE
||
if
(
get_defcfg_connect
(
port_e
)
==
AC_JACK_PORT_NONE
||
get_defcfg_connect
(
port_f
)
==
AC_JACK_PORT_NONE
)
{
get_defcfg_connect
(
port_f
)
==
AC_JACK_PORT_NONE
)
{
port_g
=
snd_hda_codec_
read
(
codec
,
0x1f
,
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
port_g
=
snd_hda_codec_
get_pincfg
(
codec
,
0x1f
);
port_h
=
snd_hda_codec_
read
(
codec
,
0x20
,
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
port_h
=
snd_hda_codec_
get_pincfg
(
codec
,
0x2
0
);
spec
->
channel_modes
=
cmi9880_channel_modes
;
spec
->
channel_modes
=
cmi9880_channel_modes
;
/* no front panel */
/* no front panel */
if
(
get_defcfg_connect
(
port_g
)
==
AC_JACK_PORT_NONE
||
if
(
get_defcfg_connect
(
port_g
)
==
AC_JACK_PORT_NONE
||
...
@@ -703,8 +703,8 @@ static int patch_cmi9880(struct hda_codec *codec)
...
@@ -703,8 +703,8 @@ static int patch_cmi9880(struct hda_codec *codec)
spec
->
multiout
.
max_channels
=
cmi9880_channel_modes
[
0
].
channels
;
spec
->
multiout
.
max_channels
=
cmi9880_channel_modes
[
0
].
channels
;
}
else
{
}
else
{
spec
->
input_mux
=
&
cmi9880_basic_mux
;
spec
->
input_mux
=
&
cmi9880_basic_mux
;
port_spdifi
=
snd_hda_codec_
read
(
codec
,
0x13
,
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
port_spdifi
=
snd_hda_codec_
get_pincfg
(
codec
,
0x13
);
port_spdifo
=
snd_hda_codec_
read
(
codec
,
0x12
,
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
port_spdifo
=
snd_hda_codec_
get_pincfg
(
codec
,
0x12
);
if
(
get_defcfg_connect
(
port_spdifo
)
!=
AC_JACK_PORT_NONE
)
if
(
get_defcfg_connect
(
port_spdifo
)
!=
AC_JACK_PORT_NONE
)
spec
->
multiout
.
dig_out_nid
=
CMI_DIG_OUT_NID
;
spec
->
multiout
.
dig_out_nid
=
CMI_DIG_OUT_NID
;
if
(
get_defcfg_connect
(
port_spdifi
)
!=
AC_JACK_PORT_NONE
)
if
(
get_defcfg_connect
(
port_spdifi
)
!=
AC_JACK_PORT_NONE
)
...
...
sound/pci/hda/patch_realtek.c
View file @
209b1403
...
@@ -330,13 +330,6 @@ struct alc_spec {
...
@@ -330,13 +330,6 @@ struct alc_spec {
/* for PLL fix */
/* for PLL fix */
hda_nid_t
pll_nid
;
hda_nid_t
pll_nid
;
unsigned
int
pll_coef_idx
,
pll_coef_bit
;
unsigned
int
pll_coef_idx
,
pll_coef_bit
;
#ifdef SND_HDA_NEEDS_RESUME
#define ALC_MAX_PINS 16
unsigned
int
num_pins
;
hda_nid_t
pin_nids
[
ALC_MAX_PINS
];
unsigned
int
pin_cfgs
[
ALC_MAX_PINS
];
#endif
};
};
/*
/*
...
@@ -1010,8 +1003,7 @@ static void alc_subsystem_id(struct hda_codec *codec,
...
@@ -1010,8 +1003,7 @@ static void alc_subsystem_id(struct hda_codec *codec,
nid
=
0x1d
;
nid
=
0x1d
;
if
(
codec
->
vendor_id
==
0x10ec0260
)
if
(
codec
->
vendor_id
==
0x10ec0260
)
nid
=
0x17
;
nid
=
0x17
;
ass
=
snd_hda_codec_read
(
codec
,
nid
,
0
,
ass
=
snd_hda_codec_get_pincfg
(
codec
,
nid
);
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
if
(
!
(
ass
&
1
)
&&
!
(
ass
&
0x100000
))
if
(
!
(
ass
&
1
)
&&
!
(
ass
&
0x100000
))
return
;
return
;
if
((
ass
>>
30
)
!=
1
)
/* no physical connection */
if
((
ass
>>
30
)
!=
1
)
/* no physical connection */
...
@@ -1185,16 +1177,8 @@ static void alc_fix_pincfg(struct hda_codec *codec,
...
@@ -1185,16 +1177,8 @@ static void alc_fix_pincfg(struct hda_codec *codec,
return
;
return
;
cfg
=
pinfix
[
quirk
->
value
];
cfg
=
pinfix
[
quirk
->
value
];
for
(;
cfg
->
nid
;
cfg
++
)
{
for
(;
cfg
->
nid
;
cfg
++
)
int
i
;
snd_hda_codec_set_pincfg
(
codec
,
cfg
->
nid
,
cfg
->
val
);
u32
val
=
cfg
->
val
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
snd_hda_codec_write
(
codec
,
cfg
->
nid
,
0
,
AC_VERB_SET_CONFIG_DEFAULT_BYTES_0
+
i
,
val
&
0xff
);
val
>>=
8
;
}
}
}
}
/*
/*
...
@@ -3216,61 +3200,13 @@ static void alc_free(struct hda_codec *codec)
...
@@ -3216,61 +3200,13 @@ static void alc_free(struct hda_codec *codec)
}
}
#ifdef SND_HDA_NEEDS_RESUME
#ifdef SND_HDA_NEEDS_RESUME
static
void
store_pin_configs
(
struct
hda_codec
*
codec
)
{
struct
alc_spec
*
spec
=
codec
->
spec
;
hda_nid_t
nid
,
end_nid
;
end_nid
=
codec
->
start_nid
+
codec
->
num_nodes
;
for
(
nid
=
codec
->
start_nid
;
nid
<
end_nid
;
nid
++
)
{
unsigned
int
wid_caps
=
get_wcaps
(
codec
,
nid
);
unsigned
int
wid_type
=
(
wid_caps
&
AC_WCAP_TYPE
)
>>
AC_WCAP_TYPE_SHIFT
;
if
(
wid_type
!=
AC_WID_PIN
)
continue
;
if
(
spec
->
num_pins
>=
ARRAY_SIZE
(
spec
->
pin_nids
))
break
;
spec
->
pin_nids
[
spec
->
num_pins
]
=
nid
;
spec
->
pin_cfgs
[
spec
->
num_pins
]
=
snd_hda_codec_read
(
codec
,
nid
,
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
spec
->
num_pins
++
;
}
}
static
void
resume_pin_configs
(
struct
hda_codec
*
codec
)
{
struct
alc_spec
*
spec
=
codec
->
spec
;
int
i
;
for
(
i
=
0
;
i
<
spec
->
num_pins
;
i
++
)
{
hda_nid_t
pin_nid
=
spec
->
pin_nids
[
i
];
unsigned
int
pin_config
=
spec
->
pin_cfgs
[
i
];
snd_hda_codec_write
(
codec
,
pin_nid
,
0
,
AC_VERB_SET_CONFIG_DEFAULT_BYTES_0
,
pin_config
&
0x000000ff
);
snd_hda_codec_write
(
codec
,
pin_nid
,
0
,
AC_VERB_SET_CONFIG_DEFAULT_BYTES_1
,
(
pin_config
&
0x0000ff00
)
>>
8
);
snd_hda_codec_write
(
codec
,
pin_nid
,
0
,
AC_VERB_SET_CONFIG_DEFAULT_BYTES_2
,
(
pin_config
&
0x00ff0000
)
>>
16
);
snd_hda_codec_write
(
codec
,
pin_nid
,
0
,
AC_VERB_SET_CONFIG_DEFAULT_BYTES_3
,
pin_config
>>
24
);
}
}
static
int
alc_resume
(
struct
hda_codec
*
codec
)
static
int
alc_resume
(
struct
hda_codec
*
codec
)
{
{
resume_pin_configs
(
codec
);
codec
->
patch_ops
.
init
(
codec
);
codec
->
patch_ops
.
init
(
codec
);
snd_hda_codec_resume_amp
(
codec
);
snd_hda_codec_resume_amp
(
codec
);
snd_hda_codec_resume_cache
(
codec
);
snd_hda_codec_resume_cache
(
codec
);
return
0
;
return
0
;
}
}
#else
#define store_pin_configs(codec)
#endif
#endif
/*
/*
...
@@ -4330,7 +4266,6 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
...
@@ -4330,7 +4266,6 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
spec
->
num_mux_defs
=
1
;
spec
->
num_mux_defs
=
1
;
spec
->
input_mux
=
&
spec
->
private_imux
[
0
];
spec
->
input_mux
=
&
spec
->
private_imux
[
0
];
store_pin_configs
(
codec
);
return
1
;
return
1
;
}
}
...
@@ -5809,7 +5744,6 @@ static int alc260_parse_auto_config(struct hda_codec *codec)
...
@@ -5809,7 +5744,6 @@ static int alc260_parse_auto_config(struct hda_codec *codec)
spec
->
num_mux_defs
=
1
;
spec
->
num_mux_defs
=
1
;
spec
->
input_mux
=
&
spec
->
private_imux
[
0
];
spec
->
input_mux
=
&
spec
->
private_imux
[
0
];
store_pin_configs
(
codec
);
return
1
;
return
1
;
}
}
...
@@ -10821,7 +10755,6 @@ static int alc262_parse_auto_config(struct hda_codec *codec)
...
@@ -10821,7 +10755,6 @@ static int alc262_parse_auto_config(struct hda_codec *codec)
if
(
err
<
0
)
if
(
err
<
0
)
return
err
;
return
err
;
store_pin_configs
(
codec
);
return
1
;
return
1
;
}
}
...
@@ -11994,7 +11927,6 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
...
@@ -11994,7 +11927,6 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
if
(
err
<
0
)
if
(
err
<
0
)
return
err
;
return
err
;
store_pin_configs
(
codec
);
return
1
;
return
1
;
}
}
...
@@ -12907,7 +12839,6 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
...
@@ -12907,7 +12839,6 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
if
(
!
spec
->
cap_mixer
&&
!
spec
->
no_analog
)
if
(
!
spec
->
cap_mixer
&&
!
spec
->
no_analog
)
set_capture_mixer
(
spec
);
set_capture_mixer
(
spec
);
store_pin_configs
(
codec
);
return
1
;
return
1
;
}
}
...
@@ -13958,7 +13889,6 @@ static int alc861_parse_auto_config(struct hda_codec *codec)
...
@@ -13958,7 +13889,6 @@ static int alc861_parse_auto_config(struct hda_codec *codec)
spec
->
num_adc_nids
=
ARRAY_SIZE
(
alc861_adc_nids
);
spec
->
num_adc_nids
=
ARRAY_SIZE
(
alc861_adc_nids
);
set_capture_mixer
(
spec
);
set_capture_mixer
(
spec
);
store_pin_configs
(
codec
);
return
1
;
return
1
;
}
}
...
@@ -15060,7 +14990,6 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec)
...
@@ -15060,7 +14990,6 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec)
if
(
err
<
0
)
if
(
err
<
0
)
return
err
;
return
err
;
store_pin_configs
(
codec
);
return
1
;
return
1
;
}
}
...
@@ -16870,7 +16799,6 @@ static int alc662_parse_auto_config(struct hda_codec *codec)
...
@@ -16870,7 +16799,6 @@ static int alc662_parse_auto_config(struct hda_codec *codec)
if
(
err
<
0
)
if
(
err
<
0
)
return
err
;
return
err
;
store_pin_configs
(
codec
);
return
1
;
return
1
;
}
}
...
...
sound/pci/hda/patch_sigmatel.c
View file @
209b1403
This diff is collapsed.
Click to expand it.
sound/pci/hda/patch_via.c
View file @
209b1403
...
@@ -1308,16 +1308,13 @@ static void vt1708_set_pinconfig_connect(struct hda_codec *codec, hda_nid_t nid)
...
@@ -1308,16 +1308,13 @@ static void vt1708_set_pinconfig_connect(struct hda_codec *codec, hda_nid_t nid)
unsigned
int
def_conf
;
unsigned
int
def_conf
;
unsigned
char
seqassoc
;
unsigned
char
seqassoc
;
def_conf
=
snd_hda_codec_read
(
codec
,
nid
,
0
,
def_conf
=
snd_hda_codec_get_pincfg
(
codec
,
nid
);
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
seqassoc
=
(
unsigned
char
)
get_defcfg_association
(
def_conf
);
seqassoc
=
(
unsigned
char
)
get_defcfg_association
(
def_conf
);
seqassoc
=
(
seqassoc
<<
4
)
|
get_defcfg_sequence
(
def_conf
);
seqassoc
=
(
seqassoc
<<
4
)
|
get_defcfg_sequence
(
def_conf
);
if
(
get_defcfg_connect
(
def_conf
)
==
AC_JACK_PORT_NONE
)
{
if
(
get_defcfg_connect
(
def_conf
)
==
AC_JACK_PORT_NONE
)
{
if
(
seqassoc
==
0xff
)
{
if
(
seqassoc
==
0xff
)
{
def_conf
=
def_conf
&
(
~
(
AC_JACK_PORT_BOTH
<<
30
));
def_conf
=
def_conf
&
(
~
(
AC_JACK_PORT_BOTH
<<
30
));
snd_hda_codec_write
(
codec
,
nid
,
0
,
snd_hda_codec_set_pincfg
(
codec
,
nid
,
def_conf
);
AC_VERB_SET_CONFIG_DEFAULT_BYTES_3
,
def_conf
>>
24
);
}
}
}
}
...
...
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