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
Kirill Smelkov
linux
Commits
6de15b2a
Commit
6de15b2a
authored
May 21, 2012
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/hda' into for-linus
parents
775b2449
8a390576
Changes
19
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
1612 additions
and
1387 deletions
+1612
-1387
sound/pci/hda/Makefile
sound/pci/hda/Makefile
+1
-1
sound/pci/hda/hda_auto_parser.c
sound/pci/hda/hda_auto_parser.c
+760
-0
sound/pci/hda/hda_auto_parser.h
sound/pci/hda/hda_auto_parser.h
+160
-0
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+282
-745
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_codec.h
+8
-7
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_intel.c
+23
-17
sound/pci/hda/hda_jack.c
sound/pci/hda/hda_jack.c
+1
-0
sound/pci/hda/hda_jack.h
sound/pci/hda/hda_jack.h
+2
-0
sound/pci/hda/hda_local.h
sound/pci/hda/hda_local.h
+43
-79
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_analog.c
+8
-6
sound/pci/hda/patch_ca0110.c
sound/pci/hda/patch_ca0110.c
+4
-4
sound/pci/hda/patch_ca0132.c
sound/pci/hda/patch_ca0132.c
+4
-5
sound/pci/hda/patch_cirrus.c
sound/pci/hda/patch_cirrus.c
+10
-20
sound/pci/hda/patch_cmedia.c
sound/pci/hda/patch_cmedia.c
+1
-0
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_conexant.c
+116
-70
sound/pci/hda/patch_hdmi.c
sound/pci/hda/patch_hdmi.c
+2
-2
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+130
-335
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_sigmatel.c
+44
-76
sound/pci/hda/patch_via.c
sound/pci/hda/patch_via.c
+13
-20
No files found.
sound/pci/hda/Makefile
View file @
6de15b2a
snd-hda-intel-objs
:=
hda_intel.o
snd-hda-codec-y
:=
hda_codec.o hda_jack.o
snd-hda-codec-y
:=
hda_codec.o hda_jack.o
hda_auto_parser.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_HWDEP)
+=
hda_hwdep.o
...
...
sound/pci/hda/hda_auto_parser.c
0 → 100644
View file @
6de15b2a
This diff is collapsed.
Click to expand it.
sound/pci/hda/hda_auto_parser.h
0 → 100644
View file @
6de15b2a
/*
* BIOS auto-parser helper functions for HD-audio
*
* Copyright (c) 2012 Takashi Iwai <tiwai@suse.de>
*
* This driver is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#ifndef __SOUND_HDA_AUTO_PARSER_H
#define __SOUND_HDA_AUTO_PARSER_H
/*
* Helper for automatic pin configuration
*/
enum
{
AUTO_PIN_MIC
,
AUTO_PIN_LINE_IN
,
AUTO_PIN_CD
,
AUTO_PIN_AUX
,
AUTO_PIN_LAST
};
enum
{
AUTO_PIN_LINE_OUT
,
AUTO_PIN_SPEAKER_OUT
,
AUTO_PIN_HP_OUT
};
#define AUTO_CFG_MAX_OUTS HDA_MAX_OUTS
#define AUTO_CFG_MAX_INS 8
struct
auto_pin_cfg_item
{
hda_nid_t
pin
;
int
type
;
};
struct
auto_pin_cfg
;
const
char
*
hda_get_autocfg_input_label
(
struct
hda_codec
*
codec
,
const
struct
auto_pin_cfg
*
cfg
,
int
input
);
int
snd_hda_get_pin_label
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
const
struct
auto_pin_cfg
*
cfg
,
char
*
label
,
int
maxlen
,
int
*
indexp
);
enum
{
INPUT_PIN_ATTR_UNUSED
,
/* pin not connected */
INPUT_PIN_ATTR_INT
,
/* internal mic/line-in */
INPUT_PIN_ATTR_DOCK
,
/* docking mic/line-in */
INPUT_PIN_ATTR_NORMAL
,
/* mic/line-in jack */
INPUT_PIN_ATTR_FRONT
,
/* mic/line-in jack in front */
INPUT_PIN_ATTR_REAR
,
/* mic/line-in jack in rear */
};
int
snd_hda_get_input_pin_attr
(
unsigned
int
def_conf
);
struct
auto_pin_cfg
{
int
line_outs
;
/* sorted in the order of Front/Surr/CLFE/Side */
hda_nid_t
line_out_pins
[
AUTO_CFG_MAX_OUTS
];
int
speaker_outs
;
hda_nid_t
speaker_pins
[
AUTO_CFG_MAX_OUTS
];
int
hp_outs
;
int
line_out_type
;
/* AUTO_PIN_XXX_OUT */
hda_nid_t
hp_pins
[
AUTO_CFG_MAX_OUTS
];
int
num_inputs
;
struct
auto_pin_cfg_item
inputs
[
AUTO_CFG_MAX_INS
];
int
dig_outs
;
hda_nid_t
dig_out_pins
[
2
];
hda_nid_t
dig_in_pin
;
hda_nid_t
mono_out_pin
;
int
dig_out_type
[
2
];
/* HDA_PCM_TYPE_XXX */
int
dig_in_type
;
/* HDA_PCM_TYPE_XXX */
};
/* bit-flags for snd_hda_parse_pin_def_config() behavior */
#define HDA_PINCFG_NO_HP_FIXUP (1 << 0)
/* no HP-split */
#define HDA_PINCFG_NO_LO_FIXUP (1 << 1)
/* don't take other outs as LO */
int
snd_hda_parse_pin_defcfg
(
struct
hda_codec
*
codec
,
struct
auto_pin_cfg
*
cfg
,
const
hda_nid_t
*
ignore_nids
,
unsigned
int
cond_flags
);
/* older function */
#define snd_hda_parse_pin_def_config(codec, cfg, ignore) \
snd_hda_parse_pin_defcfg(codec, cfg, ignore, 0)
/*
*/
struct
hda_gen_spec
{
/* fix-up list */
int
fixup_id
;
const
struct
hda_fixup
*
fixup_list
;
const
char
*
fixup_name
;
/* additional init verbs */
struct
snd_array
verbs
;
};
/*
* Fix-up pin default configurations and add default verbs
*/
struct
hda_pintbl
{
hda_nid_t
nid
;
u32
val
;
};
struct
hda_model_fixup
{
const
int
id
;
const
char
*
name
;
};
struct
hda_fixup
{
int
type
;
bool
chained
;
int
chain_id
;
union
{
const
struct
hda_pintbl
*
pins
;
const
struct
hda_verb
*
verbs
;
void
(
*
func
)(
struct
hda_codec
*
codec
,
const
struct
hda_fixup
*
fix
,
int
action
);
}
v
;
};
/* fixup types */
enum
{
HDA_FIXUP_INVALID
,
HDA_FIXUP_PINS
,
HDA_FIXUP_VERBS
,
HDA_FIXUP_FUNC
,
};
/* fixup action definitions */
enum
{
HDA_FIXUP_ACT_PRE_PROBE
,
HDA_FIXUP_ACT_PROBE
,
HDA_FIXUP_ACT_INIT
,
HDA_FIXUP_ACT_BUILD
,
};
int
snd_hda_gen_add_verbs
(
struct
hda_gen_spec
*
spec
,
const
struct
hda_verb
*
list
);
void
snd_hda_gen_apply_verbs
(
struct
hda_codec
*
codec
);
void
snd_hda_apply_pincfgs
(
struct
hda_codec
*
codec
,
const
struct
hda_pintbl
*
cfg
);
void
snd_hda_apply_fixup
(
struct
hda_codec
*
codec
,
int
action
);
void
snd_hda_pick_fixup
(
struct
hda_codec
*
codec
,
const
struct
hda_model_fixup
*
models
,
const
struct
snd_pci_quirk
*
quirk
,
const
struct
hda_fixup
*
fixlist
);
#endif
/* __SOUND_HDA_AUTO_PARSER_H */
sound/pci/hda/hda_codec.c
View file @
6de15b2a
This diff is collapsed.
Click to expand it.
sound/pci/hda/hda_codec.h
View file @
6de15b2a
...
...
@@ -704,8 +704,6 @@ struct hda_codec_ops {
unsigned
int
power_state
);
#ifdef CONFIG_PM
int
(
*
suspend
)(
struct
hda_codec
*
codec
,
pm_message_t
state
);
int
(
*
post_suspend
)(
struct
hda_codec
*
codec
);
int
(
*
pre_resume
)(
struct
hda_codec
*
codec
);
int
(
*
resume
)(
struct
hda_codec
*
codec
);
#endif
#ifdef CONFIG_SND_HDA_POWER_SAVE
...
...
@@ -829,6 +827,7 @@ struct hda_codec {
struct
mutex
spdif_mutex
;
struct
mutex
control_mutex
;
struct
mutex
hash_mutex
;
struct
snd_array
spdif_out
;
unsigned
int
spdif_in_enable
;
/* SPDIF input enable? */
const
hda_nid_t
*
slave_dig_outs
;
/* optional digital out slave widgets */
...
...
@@ -861,12 +860,13 @@ struct hda_codec {
unsigned
int
no_jack_detect
:
1
;
/* Machine has no jack-detection */
#ifdef CONFIG_SND_HDA_POWER_SAVE
unsigned
int
power_on
:
1
;
/* current (global) power-state */
unsigned
int
power_transition
:
1
;
/* power-state in transition */
int
power_transition
;
/* power-state in transition */
int
power_count
;
/* current (global) power refcount */
struct
delayed_work
power_work
;
/* delayed task for powerdown */
unsigned
long
power_on_acct
;
unsigned
long
power_off_acct
;
unsigned
long
power_jiffies
;
spinlock_t
power_lock
;
#endif
/* codec-specific additional proc output */
...
...
@@ -911,10 +911,13 @@ int snd_hda_get_sub_nodes(struct hda_codec *codec, hda_nid_t nid,
hda_nid_t
*
start_id
);
int
snd_hda_get_connections
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
hda_nid_t
*
conn_list
,
int
max_conns
);
static
inline
int
snd_hda_get_num_conns
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
return
snd_hda_get_connections
(
codec
,
nid
,
NULL
,
0
);
}
int
snd_hda_get_raw_connections
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
hda_nid_t
*
conn_list
,
int
max_conns
);
int
snd_hda_get_conn_list
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
const
hda_nid_t
**
listp
);
int
snd_hda_override_conn_list
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
int
nums
,
const
hda_nid_t
*
list
);
int
snd_hda_get_conn_index
(
struct
hda_codec
*
codec
,
hda_nid_t
mux
,
...
...
@@ -1051,12 +1054,10 @@ const char *snd_hda_get_jack_location(u32 cfg);
#ifdef CONFIG_SND_HDA_POWER_SAVE
void
snd_hda_power_up
(
struct
hda_codec
*
codec
);
void
snd_hda_power_down
(
struct
hda_codec
*
codec
);
#define snd_hda_codec_needs_resume(codec) codec->power_count
void
snd_hda_update_power_acct
(
struct
hda_codec
*
codec
);
#else
static
inline
void
snd_hda_power_up
(
struct
hda_codec
*
codec
)
{}
static
inline
void
snd_hda_power_down
(
struct
hda_codec
*
codec
)
{}
#define snd_hda_codec_needs_resume(codec) 1
#endif
#ifdef CONFIG_SND_HDA_PATCH_LOADER
...
...
sound/pci/hda/hda_intel.c
View file @
6de15b2a
...
...
@@ -497,6 +497,7 @@ enum {
AZX_DRIVER_NVIDIA
,
AZX_DRIVER_TERA
,
AZX_DRIVER_CTX
,
AZX_DRIVER_CTHDA
,
AZX_DRIVER_GENERIC
,
AZX_NUM_DRIVERS
,
/* keep this as last entry */
};
...
...
@@ -518,6 +519,7 @@ enum {
#define AZX_DCAPS_OLD_SSYNC (1 << 20)
/* Old SSYNC reg for ICH */
#define AZX_DCAPS_BUFSIZE (1 << 21)
/* no buffer size alignment */
#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22)
/* buffer size alignment */
#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23)
/* BDLE in 4k boundary */
/* quirks for ATI SB / AMD Hudson */
#define AZX_DCAPS_PRESET_ATI_SB \
...
...
@@ -533,6 +535,9 @@ enum {
(AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
AZX_DCAPS_ALIGN_BUFSIZE)
#define AZX_DCAPS_PRESET_CTHDA \
(AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
static
char
*
driver_short_names
[]
__devinitdata
=
{
[
AZX_DRIVER_ICH
]
=
"HDA Intel"
,
[
AZX_DRIVER_PCH
]
=
"HDA Intel PCH"
,
...
...
@@ -546,6 +551,7 @@ static char *driver_short_names[] __devinitdata = {
[
AZX_DRIVER_NVIDIA
]
=
"HDA NVidia"
,
[
AZX_DRIVER_TERA
]
=
"HDA Teradici"
,
[
AZX_DRIVER_CTX
]
=
"HDA Creative"
,
[
AZX_DRIVER_CTHDA
]
=
"HDA Creative"
,
[
AZX_DRIVER_GENERIC
]
=
"HD-Audio Generic"
,
};
...
...
@@ -1285,7 +1291,8 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id)
/*
* set up a BDL entry
*/
static
int
setup_bdle
(
struct
snd_pcm_substream
*
substream
,
static
int
setup_bdle
(
struct
azx
*
chip
,
struct
snd_pcm_substream
*
substream
,
struct
azx_dev
*
azx_dev
,
u32
**
bdlp
,
int
ofs
,
int
size
,
int
with_ioc
)
{
...
...
@@ -1304,6 +1311,12 @@ static int setup_bdle(struct snd_pcm_substream *substream,
bdl
[
1
]
=
cpu_to_le32
(
upper_32_bits
(
addr
));
/* program the size field of the BDL entry */
chunk
=
snd_pcm_sgbuf_get_chunk_size
(
substream
,
ofs
,
size
);
/* one BDLE cannot cross 4K boundary on CTHDA chips */
if
(
chip
->
driver_caps
&
AZX_DCAPS_4K_BDLE_BOUNDARY
)
{
u32
remain
=
0x1000
-
(
ofs
&
0xfff
);
if
(
chunk
>
remain
)
chunk
=
remain
;
}
bdl
[
2
]
=
cpu_to_le32
(
chunk
);
/* program the IOC to enable interrupt
* only when the whole fragment is processed
...
...
@@ -1356,7 +1369,7 @@ static int azx_setup_periods(struct azx *chip,
bdl_pos_adj
[
chip
->
dev_index
]);
pos_adj
=
0
;
}
else
{
ofs
=
setup_bdle
(
substream
,
azx_dev
,
ofs
=
setup_bdle
(
chip
,
substream
,
azx_dev
,
&
bdl
,
ofs
,
pos_adj
,
!
substream
->
runtime
->
no_period_wakeup
);
if
(
ofs
<
0
)
...
...
@@ -1366,10 +1379,10 @@ static int azx_setup_periods(struct azx *chip,
pos_adj
=
0
;
for
(
i
=
0
;
i
<
periods
;
i
++
)
{
if
(
i
==
periods
-
1
&&
pos_adj
)
ofs
=
setup_bdle
(
substream
,
azx_dev
,
&
bdl
,
ofs
,
ofs
=
setup_bdle
(
chip
,
substream
,
azx_dev
,
&
bdl
,
ofs
,
period_bytes
-
pos_adj
,
0
);
else
ofs
=
setup_bdle
(
substream
,
azx_dev
,
&
bdl
,
ofs
,
ofs
=
setup_bdle
(
chip
,
substream
,
azx_dev
,
&
bdl
,
ofs
,
period_bytes
,
!
substream
->
runtime
->
no_period_wakeup
);
if
(
ofs
<
0
)
...
...
@@ -2353,17 +2366,6 @@ static void azx_power_notify(struct hda_bus *bus)
* power management
*/
static
int
snd_hda_codecs_inuse
(
struct
hda_bus
*
bus
)
{
struct
hda_codec
*
codec
;
list_for_each_entry
(
codec
,
&
bus
->
codec_list
,
list
)
{
if
(
snd_hda_codec_needs_resume
(
codec
))
return
1
;
}
return
0
;
}
static
int
azx_suspend
(
struct
pci_dev
*
pci
,
pm_message_t
state
)
{
struct
snd_card
*
card
=
pci_get_drvdata
(
pci
);
...
...
@@ -2410,8 +2412,7 @@ static int azx_resume(struct pci_dev *pci)
return
-
EIO
;
azx_init_pci
(
chip
);
if
(
snd_hda_codecs_inuse
(
chip
->
bus
))
azx_init_chip
(
chip
,
1
);
azx_init_chip
(
chip
,
1
);
snd_hda_resume
(
chip
->
bus
);
snd_power_change_state
(
card
,
SNDRV_CTL_POWER_D0
);
...
...
@@ -3130,6 +3131,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
.
driver_data
=
AZX_DRIVER_CTX
|
AZX_DCAPS_CTX_WORKAROUND
|
AZX_DCAPS_RIRB_PRE_DELAY
|
AZX_DCAPS_POSFIX_LPIB
},
#endif
/* CTHDA chips */
{
PCI_DEVICE
(
0x1102
,
0x0010
),
.
driver_data
=
AZX_DRIVER_CTHDA
|
AZX_DCAPS_PRESET_CTHDA
},
{
PCI_DEVICE
(
0x1102
,
0x0012
),
.
driver_data
=
AZX_DRIVER_CTHDA
|
AZX_DCAPS_PRESET_CTHDA
},
/* Vortex86MX */
{
PCI_DEVICE
(
0x17f3
,
0x3010
),
.
driver_data
=
AZX_DRIVER_GENERIC
},
/* VMware HDAudio */
...
...
sound/pci/hda/hda_jack.c
View file @
6de15b2a
...
...
@@ -17,6 +17,7 @@
#include <sound/jack.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_jack.h"
bool
is_jack_detectable
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
...
...
sound/pci/hda/hda_jack.h
View file @
6de15b2a
...
...
@@ -12,6 +12,8 @@
#ifndef __SOUND_HDA_JACK_H
#define __SOUND_HDA_JACK_H
struct
auto_pin_cfg
;
struct
hda_jack_tbl
{
hda_nid_t
nid
;
unsigned
char
action
;
/* event action (0 = none) */
...
...
sound/pci/hda/hda_local.h
View file @
6de15b2a
...
...
@@ -262,6 +262,8 @@ int snd_hda_input_mux_put(struct hda_codec *codec,
const
struct
hda_input_mux
*
imux
,
struct
snd_ctl_elem_value
*
ucontrol
,
hda_nid_t
nid
,
unsigned
int
*
cur_val
);
int
snd_hda_add_imux_item
(
struct
hda_input_mux
*
imux
,
const
char
*
label
,
int
index
,
int
*
type_index_ret
);
/*
* Channel mode helper
...
...
@@ -393,72 +395,7 @@ struct hda_bus_unsolicited {
struct
hda_bus
*
bus
;
};
/*
* Helper for automatic pin configuration
*/
enum
{
AUTO_PIN_MIC
,
AUTO_PIN_LINE_IN
,
AUTO_PIN_CD
,
AUTO_PIN_AUX
,
AUTO_PIN_LAST
};
enum
{
AUTO_PIN_LINE_OUT
,
AUTO_PIN_SPEAKER_OUT
,
AUTO_PIN_HP_OUT
};
#define AUTO_CFG_MAX_OUTS HDA_MAX_OUTS
#define AUTO_CFG_MAX_INS 8
struct
auto_pin_cfg_item
{
hda_nid_t
pin
;
int
type
;
};
struct
auto_pin_cfg
;
const
char
*
hda_get_autocfg_input_label
(
struct
hda_codec
*
codec
,
const
struct
auto_pin_cfg
*
cfg
,
int
input
);
int
snd_hda_get_pin_label
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
const
struct
auto_pin_cfg
*
cfg
,
char
*
label
,
int
maxlen
,
int
*
indexp
);
int
snd_hda_add_imux_item
(
struct
hda_input_mux
*
imux
,
const
char
*
label
,
int
index
,
int
*
type_index_ret
);
enum
{
INPUT_PIN_ATTR_UNUSED
,
/* pin not connected */
INPUT_PIN_ATTR_INT
,
/* internal mic/line-in */
INPUT_PIN_ATTR_DOCK
,
/* docking mic/line-in */
INPUT_PIN_ATTR_NORMAL
,
/* mic/line-in jack */
INPUT_PIN_ATTR_FRONT
,
/* mic/line-in jack in front */
INPUT_PIN_ATTR_REAR
,
/* mic/line-in jack in rear */
};
int
snd_hda_get_input_pin_attr
(
unsigned
int
def_conf
);
struct
auto_pin_cfg
{
int
line_outs
;
/* sorted in the order of Front/Surr/CLFE/Side */
hda_nid_t
line_out_pins
[
AUTO_CFG_MAX_OUTS
];
int
speaker_outs
;
hda_nid_t
speaker_pins
[
AUTO_CFG_MAX_OUTS
];
int
hp_outs
;
int
line_out_type
;
/* AUTO_PIN_XXX_OUT */
hda_nid_t
hp_pins
[
AUTO_CFG_MAX_OUTS
];
int
num_inputs
;
struct
auto_pin_cfg_item
inputs
[
AUTO_CFG_MAX_INS
];
int
dig_outs
;
hda_nid_t
dig_out_pins
[
2
];
hda_nid_t
dig_in_pin
;
hda_nid_t
mono_out_pin
;
int
dig_out_type
[
2
];
/* HDA_PCM_TYPE_XXX */
int
dig_in_type
;
/* HDA_PCM_TYPE_XXX */
};
/* helper macros to retrieve pin default-config values */
#define get_defcfg_connect(cfg) \
((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT)
#define get_defcfg_association(cfg) \
...
...
@@ -472,19 +409,6 @@ struct auto_pin_cfg {
#define get_defcfg_misc(cfg) \
((cfg & AC_DEFCFG_MISC) >> AC_DEFCFG_MISC_SHIFT)
/* bit-flags for snd_hda_parse_pin_def_config() behavior */
#define HDA_PINCFG_NO_HP_FIXUP (1 << 0)
/* no HP-split */
#define HDA_PINCFG_NO_LO_FIXUP (1 << 1)
/* don't take other outs as LO */
int
snd_hda_parse_pin_defcfg
(
struct
hda_codec
*
codec
,
struct
auto_pin_cfg
*
cfg
,
const
hda_nid_t
*
ignore_nids
,
unsigned
int
cond_flags
);
/* older function */
#define snd_hda_parse_pin_def_config(codec, cfg, ignore) \
snd_hda_parse_pin_defcfg(codec, cfg, ignore, 0)
/* amp values */
#define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8))
#define AMP_IN_UNMUTE(idx) (0x7000 | ((idx)<<8))
...
...
@@ -502,6 +426,46 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,
#define PIN_HP (AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN)
#define PIN_HP_AMP (AC_PINCTL_HP_EN)
unsigned
int
snd_hda_get_default_vref
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
);
int
_snd_hda_set_pin_ctl
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
unsigned
int
val
,
bool
cached
);
/**
* _snd_hda_set_pin_ctl - Set a pin-control value safely
* @codec: the codec instance
* @pin: the pin NID to set the control
* @val: the pin-control value (AC_PINCTL_* bits)
*
* This function sets the pin-control value to the given pin, but
* filters out the invalid pin-control bits when the pin has no such
* capabilities. For example, when PIN_HP is passed but the pin has no
* HP-drive capability, the HP bit is omitted.
*
* The function doesn't check the input VREF capability bits, though.
* Use snd_hda_get_default_vref() to guess the right value.
* Also, this function is only for analog pins, not for HDMI pins.
*/
static
inline
int
snd_hda_set_pin_ctl
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
unsigned
int
val
)
{
return
_snd_hda_set_pin_ctl
(
codec
,
pin
,
val
,
false
);
}
/**
* snd_hda_set_pin_ctl_cache - Set a pin-control value safely
* @codec: the codec instance
* @pin: the pin NID to set the control
* @val: the pin-control value (AC_PINCTL_* bits)
*
* Just like snd_hda_set_pin_ctl() but write to cache as well.
*/
static
inline
int
snd_hda_set_pin_ctl_cache
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
unsigned
int
val
)
{
return
_snd_hda_set_pin_ctl
(
codec
,
pin
,
val
,
true
);
}
/*
* get widget capabilities
*/
...
...
sound/pci/hda/patch_analog.c
View file @
6de15b2a
...
...
@@ -28,6 +28,7 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_beep.h"
#include "hda_jack.h"
...
...
@@ -1742,9 +1743,7 @@ static int ad1981_hp_master_sw_put(struct snd_kcontrol *kcontrol,
if
(
!
ad198x_eapd_put
(
kcontrol
,
ucontrol
))
return
0
;
/* change speaker pin appropriately */
snd_hda_codec_write
(
codec
,
0x05
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
spec
->
cur_eapd
?
PIN_OUT
:
0
);
snd_hda_set_pin_ctl
(
codec
,
0x05
,
spec
->
cur_eapd
?
PIN_OUT
:
0
);
/* toggle HP mute appropriately */
snd_hda_codec_amp_stereo
(
codec
,
0x06
,
HDA_OUTPUT
,
0
,
HDA_AMP_MUTE
,
...
...
@@ -3103,7 +3102,7 @@ static void ad1988_auto_set_output_and_unmute(struct hda_codec *codec,
int
dac_idx
)
{
/* set as output */
snd_hda_
codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pin_type
);
snd_hda_
set_pin_ctl
(
codec
,
nid
,
pin_type
);
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_UNMUTE
);
switch
(
nid
)
{
case
0x11
:
/* port-A - DAC 03 */
...
...
@@ -3157,6 +3156,7 @@ static void ad1988_auto_init_analog_input(struct hda_codec *codec)
for
(
i
=
0
;
i
<
cfg
->
num_inputs
;
i
++
)
{
hda_nid_t
nid
=
cfg
->
inputs
[
i
].
pin
;
int
type
=
cfg
->
inputs
[
i
].
type
;
int
val
;
switch
(
nid
)
{
case
0x15
:
/* port-C */
snd_hda_codec_write
(
codec
,
0x33
,
0
,
AC_VERB_SET_CONNECT_SEL
,
0x0
);
...
...
@@ -3165,8 +3165,10 @@ static void ad1988_auto_init_analog_input(struct hda_codec *codec)
snd_hda_codec_write
(
codec
,
0x34
,
0
,
AC_VERB_SET_CONNECT_SEL
,
0x0
);
break
;
}
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
type
==
AUTO_PIN_MIC
?
PIN_VREF80
:
PIN_IN
);
val
=
PIN_IN
;
if
(
type
==
AUTO_PIN_MIC
)
val
|=
snd_hda_get_default_vref
(
codec
,
nid
);
snd_hda_set_pin_ctl
(
codec
,
nid
,
val
);
if
(
nid
!=
AD1988_PIN_CD_NID
)
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_MUTE
);
...
...
sound/pci/hda/patch_ca0110.c
View file @
6de15b2a
...
...
@@ -26,6 +26,7 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
/*
*/
...
...
@@ -341,8 +342,7 @@ static int ca0110_build_pcms(struct hda_codec *codec)
static
void
init_output
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
hda_nid_t
dac
)
{
if
(
pin
)
{
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
PIN_HP
);
if
(
get_wcaps
(
codec
,
pin
)
&
AC_WCAP_OUT_AMP
)
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
...
...
@@ -356,8 +356,8 @@ static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
static
void
init_input
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
hda_nid_t
adc
)
{
if
(
pin
)
{
snd_hda_
codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
);
snd_hda_
set_pin_ctl
(
codec
,
pin
,
PIN_IN
|
snd_hda_get_default_vref
(
codec
,
pin
)
);
if
(
get_wcaps
(
codec
,
pin
)
&
AC_WCAP_IN_AMP
)
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
...
...
sound/pci/hda/patch_ca0132.c
View file @
6de15b2a
...
...
@@ -30,6 +30,7 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#define WIDGET_CHIP_CTRL 0x15
#define WIDGET_DSP_CTRL 0x16
...
...
@@ -239,8 +240,7 @@ enum get_set {
static
void
init_output
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
hda_nid_t
dac
)
{
if
(
pin
)
{
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
PIN_HP
);
if
(
get_wcaps
(
codec
,
pin
)
&
AC_WCAP_OUT_AMP
)
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
...
...
@@ -254,9 +254,8 @@ static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
static
void
init_input
(
struct
hda_codec
*
codec
,
hda_nid_t
pin
,
hda_nid_t
adc
)
{
if
(
pin
)
{
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
PIN_IN
|
snd_hda_get_default_vref
(
codec
,
pin
));
if
(
get_wcaps
(
codec
,
pin
)
&
AC_WCAP_IN_AMP
)
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
...
...
sound/pci/hda/patch_cirrus.c
View file @
6de15b2a
...
...
@@ -26,6 +26,7 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_jack.h"
#include <sound/tlv.h>
...
...
@@ -933,8 +934,7 @@ static void cs_automute(struct hda_codec *codec)
pin_ctl
=
0
;
nid
=
cfg
->
speaker_pins
[
i
];
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pin_ctl
);
snd_hda_set_pin_ctl
(
codec
,
nid
,
pin_ctl
);
}
if
(
spec
->
gpio_eapd_hp
)
{
unsigned
int
gpio
=
hp_present
?
...
...
@@ -948,16 +948,14 @@ static void cs_automute(struct hda_codec *codec)
/* mute HPs if spdif jack (SENSE_B) is present */
for
(
i
=
0
;
i
<
cfg
->
hp_outs
;
i
++
)
{
nid
=
cfg
->
hp_pins
[
i
];
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
snd_hda_set_pin_ctl
(
codec
,
nid
,
(
spdif_present
&&
spec
->
sense_b
)
?
0
:
PIN_HP
);
}
/* SPDIF TX on/off */
if
(
cfg
->
dig_outs
)
{
nid
=
cfg
->
dig_out_pins
[
0
];
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
snd_hda_set_pin_ctl
(
codec
,
nid
,
spdif_present
?
PIN_OUT
:
0
);
}
...
...
@@ -1024,13 +1022,11 @@ static void init_output(struct hda_codec *codec)
/* set appropriate pin controls */
for
(
i
=
0
;
i
<
cfg
->
line_outs
;
i
++
)
snd_hda_codec_write
(
codec
,
cfg
->
line_out_pins
[
i
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
);
snd_hda_set_pin_ctl
(
codec
,
cfg
->
line_out_pins
[
i
],
PIN_OUT
);
/* HP */
for
(
i
=
0
;
i
<
cfg
->
hp_outs
;
i
++
)
{
hda_nid_t
nid
=
cfg
->
hp_pins
[
i
];
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_HP
);
snd_hda_set_pin_ctl
(
codec
,
nid
,
PIN_HP
);
if
(
!
cfg
->
speaker_outs
)
continue
;
if
(
get_wcaps
(
codec
,
nid
)
&
AC_WCAP_UNSOL_CAP
)
{
...
...
@@ -1041,8 +1037,7 @@ static void init_output(struct hda_codec *codec)
/* Speaker */
for
(
i
=
0
;
i
<
cfg
->
speaker_outs
;
i
++
)
snd_hda_codec_write
(
codec
,
cfg
->
speaker_pins
[
i
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
);
snd_hda_set_pin_ctl
(
codec
,
cfg
->
speaker_pins
[
i
],
PIN_OUT
);
/* SPDIF is enabled on presence detect for CS421x */
if
(
spec
->
hp_detect
||
spec
->
spdif_detect
)
...
...
@@ -1063,14 +1058,9 @@ static void init_input(struct hda_codec *codec)
continue
;
/* set appropriate pin control and mute first */
ctl
=
PIN_IN
;
if
(
cfg
->
inputs
[
i
].
type
==
AUTO_PIN_MIC
)
{
unsigned
int
caps
=
snd_hda_query_pin_caps
(
codec
,
pin
);
caps
>>=
AC_PINCAP_VREF_SHIFT
;
if
(
caps
&
AC_PINCAP_VREF_80
)
ctl
=
PIN_VREF80
;
}
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
ctl
);
if
(
cfg
->
inputs
[
i
].
type
==
AUTO_PIN_MIC
)
ctl
|=
snd_hda_get_default_vref
(
codec
,
pin
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
ctl
);
snd_hda_codec_write
(
codec
,
spec
->
adc_nid
[
i
],
0
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
spec
->
adc_idx
[
i
]));
...
...
sound/pci/hda/patch_cmedia.c
View file @
6de15b2a
...
...
@@ -29,6 +29,7 @@
#include <sound/core.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#define NUM_PINS 11
...
...
sound/pci/hda/patch_conexant.c
View file @
6de15b2a
This diff is collapsed.
Click to expand it.
sound/pci/hda/patch_hdmi.c
View file @
6de15b2a
...
...
@@ -1592,10 +1592,10 @@ static int nvhdmi_8ch_7x_pcm_prepare(struct hda_pcm_stream *hinfo,
unsigned
int
dataDCC2
,
channel_id
;
int
i
;
struct
hdmi_spec
*
spec
=
codec
->
spec
;
struct
hda_spdif_out
*
spdif
=
snd_hda_spdif_out_of_nid
(
codec
,
spec
->
cvts
[
0
].
cvt_nid
);
struct
hda_spdif_out
*
spdif
;
mutex_lock
(
&
codec
->
spdif_mutex
);
spdif
=
snd_hda_spdif_out_of_nid
(
codec
,
spec
->
cvts
[
0
].
cvt_nid
);
chs
=
substream
->
runtime
->
channels
;
...
...
sound/pci/hda/patch_realtek.c
View file @
6de15b2a
This diff is collapsed.
Click to expand it.
sound/pci/hda/patch_sigmatel.c
View file @
6de15b2a
This diff is collapsed.
Click to expand it.
sound/pci/hda/patch_via.c
View file @
6de15b2a
...
...
@@ -54,6 +54,7 @@
#include <sound/asoundef.h>
#include "hda_codec.h"
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_jack.h"
/* Pin Widget NID */
...
...
@@ -484,7 +485,7 @@ static void activate_output_mix(struct hda_codec *codec, struct nid_path *path,
if
(
!
path
)
return
;
num
=
snd_hda_get_
conn_list
(
codec
,
mix_nid
,
NULL
);
num
=
snd_hda_get_
num_conns
(
codec
,
mix_nid
);
for
(
i
=
0
;
i
<
num
;
i
++
)
{
if
(
i
==
idx
)
val
=
AMP_IN_UNMUTE
(
i
);
...
...
@@ -532,8 +533,7 @@ static void init_output_pin(struct hda_codec *codec, hda_nid_t pin,
{
if
(
!
pin
)
return
;
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
pin_type
);
snd_hda_set_pin_ctl
(
codec
,
pin
,
pin_type
);
if
(
snd_hda_query_pin_caps
(
codec
,
pin
)
&
AC_PINCAP_EAPD
)
snd_hda_codec_write
(
codec
,
pin
,
0
,
AC_VERB_SET_EAPD_BTLENABLE
,
0x02
);
...
...
@@ -662,12 +662,12 @@ static void via_auto_init_analog_input(struct hda_codec *codec)
hda_nid_t
nid
=
cfg
->
inputs
[
i
].
pin
;
if
(
spec
->
smart51_enabled
&&
is_smart51_pins
(
codec
,
nid
))
ctl
=
PIN_OUT
;
else
if
(
cfg
->
inputs
[
i
].
type
==
AUTO_PIN_MIC
)
ctl
=
PIN_VREF50
;
else
else
{
ctl
=
PIN_IN
;
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
ctl
);
if
(
cfg
->
inputs
[
i
].
type
==
AUTO_PIN_MIC
)
ctl
|=
snd_hda_get_default_vref
(
codec
,
nid
);
}
snd_hda_set_pin_ctl
(
codec
,
nid
,
ctl
);
}
/* init input-src */
...
...
@@ -1006,9 +1006,7 @@ static int via_smart51_put(struct snd_kcontrol *kcontrol,
AC_VERB_GET_PIN_WIDGET_CONTROL
,
0
);
parm
&=
~
(
AC_PINCTL_IN_EN
|
AC_PINCTL_OUT_EN
);
parm
|=
out_in
;
snd_hda_codec_write
(
codec
,
nid
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
parm
);
snd_hda_set_pin_ctl
(
codec
,
nid
,
parm
);
if
(
out_in
==
AC_PINCTL_OUT_EN
)
{
mute_aa_path
(
codec
,
1
);
notify_aa_path_ctls
(
codec
);
...
...
@@ -1647,8 +1645,7 @@ static void toggle_output_mutes(struct hda_codec *codec, int num_pins,
parm
&=
~
AC_PINCTL_OUT_EN
;
else
parm
|=
AC_PINCTL_OUT_EN
;
snd_hda_codec_write
(
codec
,
pins
[
i
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
parm
);
snd_hda_set_pin_ctl
(
codec
,
pins
[
i
],
parm
);
}
}
...
...
@@ -1709,8 +1706,7 @@ static void via_gpio_control(struct hda_codec *codec)
if
(
gpio_data
==
0x02
)
{
/* unmute line out */
snd_hda_codec_write
(
codec
,
spec
->
autocfg
.
line_out_pins
[
0
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
snd_hda_set_pin_ctl
(
codec
,
spec
->
autocfg
.
line_out_pins
[
0
],
PIN_OUT
);
if
(
vol_counter
&
0x20
)
{
/* decrease volume */
...
...
@@ -1728,9 +1724,7 @@ static void via_gpio_control(struct hda_codec *codec)
}
}
else
if
(
!
(
gpio_data
&
0x02
))
{
/* mute line out */
snd_hda_codec_write
(
codec
,
spec
->
autocfg
.
line_out_pins
[
0
],
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
0
);
snd_hda_set_pin_ctl
(
codec
,
spec
->
autocfg
.
line_out_pins
[
0
],
0
);
}
}
...
...
@@ -2757,8 +2751,7 @@ static void via_auto_init_dig_in(struct hda_codec *codec)
struct
via_spec
*
spec
=
codec
->
spec
;
if
(
!
spec
->
dig_in_nid
)
return
;
snd_hda_codec_write
(
codec
,
spec
->
autocfg
.
dig_in_pin
,
0
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_IN
);
snd_hda_set_pin_ctl
(
codec
,
spec
->
autocfg
.
dig_in_pin
,
PIN_IN
);
}
/* initialize the unsolicited events */
...
...
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