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
a24ba44c
Commit
a24ba44c
authored
Jan 12, 2009
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/hda' into for-linus
parents
9229f43f
6acaed38
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
52 additions
and
30 deletions
+52
-30
sound/pci/hda/hda_beep.c
sound/pci/hda/hda_beep.c
+0
-1
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+30
-18
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_codec.h
+2
-0
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_intel.c
+3
-3
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_analog.c
+3
-2
sound/pci/hda/patch_nvhdmi.c
sound/pci/hda/patch_nvhdmi.c
+2
-0
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+12
-6
No files found.
sound/pci/hda/hda_beep.c
View file @
a24ba44c
...
...
@@ -135,7 +135,6 @@ void snd_hda_detach_beep_device(struct hda_codec *codec)
struct
hda_beep
*
beep
=
codec
->
beep
;
if
(
beep
)
{
cancel_work_sync
(
&
beep
->
beep_work
);
flush_scheduled_work
();
input_unregister_device
(
beep
->
dev
);
kfree
(
beep
);
...
...
sound/pci/hda/hda_codec.c
View file @
a24ba44c
...
...
@@ -373,7 +373,7 @@ int snd_hda_queue_unsol_event(struct hda_bus *bus, u32 res, u32 res_ex)
unsol
->
queue
[
wp
]
=
res
;
unsol
->
queue
[
wp
+
1
]
=
res_ex
;
schedule_work
(
&
unsol
->
work
);
queue_work
(
bus
->
workq
,
&
unsol
->
work
);
return
0
;
}
...
...
@@ -437,15 +437,17 @@ static int snd_hda_bus_free(struct hda_bus *bus)
if
(
!
bus
)
return
0
;
if
(
bus
->
unsol
)
{
flush_scheduled_work
();
if
(
bus
->
workq
)
flush_workqueue
(
bus
->
workq
);
if
(
bus
->
unsol
)
kfree
(
bus
->
unsol
);
}
list_for_each_entry_safe
(
codec
,
n
,
&
bus
->
codec_list
,
list
)
{
snd_hda_codec_free
(
codec
);
}
if
(
bus
->
ops
.
private_free
)
bus
->
ops
.
private_free
(
bus
);
if
(
bus
->
workq
)
destroy_workqueue
(
bus
->
workq
);
kfree
(
bus
);
return
0
;
}
...
...
@@ -485,6 +487,7 @@ int /*__devinit*/ snd_hda_bus_new(struct snd_card *card,
{
struct
hda_bus
*
bus
;
int
err
;
char
qname
[
8
];
static
struct
snd_device_ops
dev_ops
=
{
.
dev_register
=
snd_hda_bus_dev_register
,
.
dev_free
=
snd_hda_bus_dev_free
,
...
...
@@ -514,6 +517,14 @@ int /*__devinit*/ snd_hda_bus_new(struct snd_card *card,
mutex_init
(
&
bus
->
cmd_mutex
);
INIT_LIST_HEAD
(
&
bus
->
codec_list
);
snprintf
(
qname
,
sizeof
(
qname
),
"hda%d"
,
card
->
number
);
bus
->
workq
=
create_workqueue
(
qname
);
if
(
!
bus
->
workq
)
{
snd_printk
(
KERN_ERR
"cannot create workqueue %s
\n
"
,
qname
);
kfree
(
bus
);
return
-
ENOMEM
;
}
err
=
snd_device_new
(
card
,
SNDRV_DEV_BUS
,
bus
,
&
dev_ops
);
if
(
err
<
0
)
{
snd_hda_bus_free
(
bus
);
...
...
@@ -684,7 +695,7 @@ static void snd_hda_codec_free(struct hda_codec *codec)
return
;
#ifdef CONFIG_SND_HDA_POWER_SAVE
cancel_delayed_work
(
&
codec
->
power_work
);
flush_
scheduled_work
(
);
flush_
workqueue
(
codec
->
bus
->
workq
);
#endif
list_del
(
&
codec
->
list
);
snd_array_free
(
&
codec
->
mixers
);
...
...
@@ -735,6 +746,7 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr
codec
->
bus
=
bus
;
codec
->
addr
=
codec_addr
;
mutex_init
(
&
codec
->
spdif_mutex
);
mutex_init
(
&
codec
->
control_mutex
);
init_hda_cache
(
&
codec
->
amp_cache
,
sizeof
(
struct
hda_amp_info
));
init_hda_cache
(
&
codec
->
cmd_cache
,
sizeof
(
struct
hda_cache_head
));
snd_array_init
(
&
codec
->
mixers
,
sizeof
(
struct
snd_kcontrol
*
),
32
);
...
...
@@ -1272,7 +1284,7 @@ void snd_hda_codec_reset(struct hda_codec *codec)
#ifdef CONFIG_SND_HDA_POWER_SAVE
cancel_delayed_work
(
&
codec
->
power_work
);
flush_
scheduled_work
(
);
flush_
workqueue
(
codec
->
bus
->
workq
);
#endif
snd_hda_ctls_clear
(
codec
);
/* relase PCMs */
...
...
@@ -1418,12 +1430,12 @@ int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol,
unsigned
long
pval
;
int
err
;
mutex_lock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_lock
(
&
codec
->
control_mutex
);
pval
=
kcontrol
->
private_value
;
kcontrol
->
private_value
=
pval
&
~
AMP_VAL_IDX_MASK
;
/* index 0 */
err
=
snd_hda_mixer_amp_switch_get
(
kcontrol
,
ucontrol
);
kcontrol
->
private_value
=
pval
;
mutex_unlock
(
&
codec
->
spdif
_mutex
);
mutex_unlock
(
&
codec
->
control
_mutex
);
return
err
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_switch_get
);
...
...
@@ -1435,7 +1447,7 @@ int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol,
unsigned
long
pval
;
int
i
,
indices
,
err
=
0
,
change
=
0
;
mutex_lock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_lock
(
&
codec
->
control_mutex
);
pval
=
kcontrol
->
private_value
;
indices
=
(
pval
&
AMP_VAL_IDX_MASK
)
>>
AMP_VAL_IDX_SHIFT
;
for
(
i
=
0
;
i
<
indices
;
i
++
)
{
...
...
@@ -1447,7 +1459,7 @@ int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol,
change
|=
err
;
}
kcontrol
->
private_value
=
pval
;
mutex_unlock
(
&
codec
->
spdif
_mutex
);
mutex_unlock
(
&
codec
->
control
_mutex
);
return
err
<
0
?
err
:
change
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_switch_put
);
...
...
@@ -1462,12 +1474,12 @@ int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol,
struct
hda_bind_ctls
*
c
;
int
err
;
mutex_lock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_lock
(
&
codec
->
control_mutex
);
c
=
(
struct
hda_bind_ctls
*
)
kcontrol
->
private_value
;
kcontrol
->
private_value
=
*
c
->
values
;
err
=
c
->
ops
->
info
(
kcontrol
,
uinfo
);
kcontrol
->
private_value
=
(
long
)
c
;
mutex_unlock
(
&
codec
->
spdif
_mutex
);
mutex_unlock
(
&
codec
->
control
_mutex
);
return
err
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_ctls_info
);
...
...
@@ -1479,12 +1491,12 @@ int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol,
struct
hda_bind_ctls
*
c
;
int
err
;
mutex_lock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_lock
(
&
codec
->
control_mutex
);
c
=
(
struct
hda_bind_ctls
*
)
kcontrol
->
private_value
;
kcontrol
->
private_value
=
*
c
->
values
;
err
=
c
->
ops
->
get
(
kcontrol
,
ucontrol
);
kcontrol
->
private_value
=
(
long
)
c
;
mutex_unlock
(
&
codec
->
spdif
_mutex
);
mutex_unlock
(
&
codec
->
control
_mutex
);
return
err
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_ctls_get
);
...
...
@@ -1497,7 +1509,7 @@ int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol,
unsigned
long
*
vals
;
int
err
=
0
,
change
=
0
;
mutex_lock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_lock
(
&
codec
->
control_mutex
);
c
=
(
struct
hda_bind_ctls
*
)
kcontrol
->
private_value
;
for
(
vals
=
c
->
values
;
*
vals
;
vals
++
)
{
kcontrol
->
private_value
=
*
vals
;
...
...
@@ -1507,7 +1519,7 @@ int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol,
change
|=
err
;
}
kcontrol
->
private_value
=
(
long
)
c
;
mutex_unlock
(
&
codec
->
spdif
_mutex
);
mutex_unlock
(
&
codec
->
control
_mutex
);
return
err
<
0
?
err
:
change
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_ctls_put
);
...
...
@@ -1519,12 +1531,12 @@ int snd_hda_mixer_bind_tlv(struct snd_kcontrol *kcontrol, int op_flag,
struct
hda_bind_ctls
*
c
;
int
err
;
mutex_lock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_lock
(
&
codec
->
control_mutex
);
c
=
(
struct
hda_bind_ctls
*
)
kcontrol
->
private_value
;
kcontrol
->
private_value
=
*
c
->
values
;
err
=
c
->
ops
->
tlv
(
kcontrol
,
op_flag
,
size
,
tlv
);
kcontrol
->
private_value
=
(
long
)
c
;
mutex_unlock
(
&
codec
->
spdif
_mutex
);
mutex_unlock
(
&
codec
->
control
_mutex
);
return
err
;
}
EXPORT_SYMBOL_HDA
(
snd_hda_mixer_bind_tlv
);
...
...
sound/pci/hda/hda_codec.h
View file @
a24ba44c
...
...
@@ -614,6 +614,7 @@ struct hda_bus {
/* unsolicited event queue */
struct
hda_bus_unsolicited
*
unsol
;
struct
workqueue_struct
*
workq
;
/* common workqueue for codecs */
/* assigned PCMs */
DECLARE_BITMAP
(
pcm_dev_bits
,
SNDRV_PCM_DEVICES
);
...
...
@@ -771,6 +772,7 @@ struct hda_codec {
struct
hda_cache_rec
cmd_cache
;
/* cache for other commands */
struct
mutex
spdif_mutex
;
struct
mutex
control_mutex
;
unsigned
int
spdif_status
;
/* IEC958 status bits */
unsigned
short
spdif_ctls
;
/* SPDIF control bits */
unsigned
int
spdif_in_enable
;
/* SPDIF input enable? */
...
...
sound/pci/hda/hda_intel.c
View file @
a24ba44c
...
...
@@ -996,10 +996,11 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id)
spin_unlock
(
&
chip
->
reg_lock
);
snd_pcm_period_elapsed
(
azx_dev
->
substream
);
spin_lock
(
&
chip
->
reg_lock
);
}
else
{
}
else
if
(
chip
->
bus
&&
chip
->
bus
->
workq
)
{
/* bogus IRQ, process it later */
azx_dev
->
irq_pending
=
1
;
schedule_work
(
&
chip
->
irq_pending_work
);
queue_work
(
chip
->
bus
->
workq
,
&
chip
->
irq_pending_work
);
}
}
}
...
...
@@ -1741,7 +1742,6 @@ static void azx_clear_irq_pending(struct azx *chip)
for
(
i
=
0
;
i
<
chip
->
num_streams
;
i
++
)
chip
->
azx_dev
[
i
].
irq_pending
=
0
;
spin_unlock_irq
(
&
chip
->
reg_lock
);
flush_scheduled_work
();
}
static
struct
snd_pcm_ops
azx_pcm_ops
=
{
...
...
sound/pci/hda/patch_analog.c
View file @
a24ba44c
...
...
@@ -3900,6 +3900,7 @@ static const char *ad1884a_models[AD1884A_MODELS] = {
static
struct
snd_pci_quirk
ad1884a_cfg_tbl
[]
=
{
SND_PCI_QUIRK
(
0x103c
,
0x3030
,
"HP"
,
AD1884A_MOBILE
),
SND_PCI_QUIRK
(
0x103c
,
0x3037
,
"HP 2230s"
,
AD1884A_LAPTOP
),
SND_PCI_QUIRK
(
0x103c
,
0x3056
,
"HP"
,
AD1884A_MOBILE
),
SND_PCI_QUIRK
(
0x103c
,
0x30e6
,
"HP 6730b"
,
AD1884A_LAPTOP
),
SND_PCI_QUIRK
(
0x103c
,
0x30e7
,
"HP EliteBook 8530p"
,
AD1884A_LAPTOP
),
...
...
@@ -4262,13 +4263,13 @@ static int patch_ad1882(struct hda_codec *codec)
spec
->
num_adc_nids
=
ARRAY_SIZE
(
ad1882_adc_nids
);
spec
->
adc_nids
=
ad1882_adc_nids
;
spec
->
capsrc_nids
=
ad1882_capsrc_nids
;
if
(
codec
->
vendor_id
==
0x11d1882
)
if
(
codec
->
vendor_id
==
0x11d
4
1882
)
spec
->
input_mux
=
&
ad1882_capture_source
;
else
spec
->
input_mux
=
&
ad1882a_capture_source
;
spec
->
num_mixers
=
2
;
spec
->
mixers
[
0
]
=
ad1882_base_mixers
;
if
(
codec
->
vendor_id
==
0x11d1882
)
if
(
codec
->
vendor_id
==
0x11d
4
1882
)
spec
->
mixers
[
1
]
=
ad1882_loopback_mixers
;
else
spec
->
mixers
[
1
]
=
ad1882a_loopback_mixers
;
...
...
sound/pci/hda/patch_nvhdmi.c
View file @
a24ba44c
...
...
@@ -162,12 +162,14 @@ static struct hda_codec_preset snd_hda_preset_nvhdmi[] = {
{
.
id
=
0x10de0002
,
.
name
=
"MCP78 HDMI"
,
.
patch
=
patch_nvhdmi
},
{
.
id
=
0x10de0007
,
.
name
=
"MCP7A HDMI"
,
.
patch
=
patch_nvhdmi
},
{
.
id
=
0x10de0067
,
.
name
=
"MCP67 HDMI"
,
.
patch
=
patch_nvhdmi
},
{
.
id
=
0x10de8001
,
.
name
=
"MCP73 HDMI"
,
.
patch
=
patch_nvhdmi
},
{}
/* terminator */
};
MODULE_ALIAS
(
"snd-hda-codec-id:10de0002"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10de0007"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10de0067"
);
MODULE_ALIAS
(
"snd-hda-codec-id:10de8001"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Nvidia HDMI HD-audio codec"
);
...
...
sound/pci/hda/patch_realtek.c
View file @
a24ba44c
...
...
@@ -1502,11 +1502,11 @@ static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
struct
alc_spec
*
spec
=
codec
->
spec
;
int
err
;
mutex_lock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_lock
(
&
codec
->
control_mutex
);
kcontrol
->
private_value
=
HDA_COMPOSE_AMP_VAL
(
spec
->
adc_nids
[
0
],
3
,
0
,
HDA_INPUT
);
err
=
snd_hda_mixer_amp_volume_info
(
kcontrol
,
uinfo
);
mutex_unlock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_unlock
(
&
codec
->
control_mutex
);
return
err
;
}
...
...
@@ -1517,11 +1517,11 @@ static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
struct
alc_spec
*
spec
=
codec
->
spec
;
int
err
;
mutex_lock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_lock
(
&
codec
->
control_mutex
);
kcontrol
->
private_value
=
HDA_COMPOSE_AMP_VAL
(
spec
->
adc_nids
[
0
],
3
,
0
,
HDA_INPUT
);
err
=
snd_hda_mixer_amp_tlv
(
kcontrol
,
op_flag
,
size
,
tlv
);
mutex_unlock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_unlock
(
&
codec
->
control_mutex
);
return
err
;
}
...
...
@@ -1537,11 +1537,11 @@ static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
unsigned
int
adc_idx
=
snd_ctl_get_ioffidx
(
kcontrol
,
&
ucontrol
->
id
);
int
err
;
mutex_lock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_lock
(
&
codec
->
control_mutex
);
kcontrol
->
private_value
=
HDA_COMPOSE_AMP_VAL
(
spec
->
adc_nids
[
adc_idx
],
3
,
0
,
HDA_INPUT
);
err
=
func
(
kcontrol
,
ucontrol
);
mutex_unlock
(
&
codec
->
spdif_mutex
);
/* reuse spdif_mutex */
mutex_unlock
(
&
codec
->
control_mutex
);
return
err
;
}
...
...
@@ -8461,6 +8461,10 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
SND_PCI_QUIRK
(
0x1025
,
0x0121
,
"Acer Aspire 5920G"
,
ALC883_ACER_ASPIRE
),
SND_PCI_QUIRK
(
0x1025
,
0x013e
,
"Acer Aspire 4930G"
,
ALC888_ACER_ASPIRE_4930G
),
SND_PCI_QUIRK
(
0x1025
,
0x013f
,
"Acer Aspire 5930G"
,
ALC888_ACER_ASPIRE_4930G
),
SND_PCI_QUIRK
(
0x1025
,
0x015e
,
"Acer Aspire 6930G"
,
ALC888_ACER_ASPIRE_4930G
),
SND_PCI_QUIRK
(
0x1025
,
0
,
"Acer laptop"
,
ALC883_ACER
),
/* default Acer */
SND_PCI_QUIRK
(
0x1028
,
0x020d
,
"Dell Inspiron 530"
,
ALC888_6ST_DELL
),
SND_PCI_QUIRK
(
0x103c
,
0x2a3d
,
"HP Pavillion"
,
ALC883_6ST_DIG
),
...
...
@@ -8522,6 +8526,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
SND_PCI_QUIRK
(
0x1991
,
0x5625
,
"Haier W66"
,
ALC883_HAIER_W66
),
SND_PCI_QUIRK
(
0x8086
,
0x0001
,
"DG33BUC"
,
ALC883_3ST_6ch_INTEL
),
SND_PCI_QUIRK
(
0x8086
,
0x0002
,
"DG33FBC"
,
ALC883_3ST_6ch_INTEL
),
SND_PCI_QUIRK
(
0x8086
,
0x0022
,
"DX58SO"
,
ALC883_3ST_6ch_INTEL
),
SND_PCI_QUIRK
(
0x8086
,
0xd601
,
"D102GGC"
,
ALC883_3ST_6ch
),
{}
};
...
...
@@ -11689,6 +11694,7 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
SND_PCI_QUIRK
(
0x1025
,
0x015b
,
"Acer Aspire One"
,
ALC268_ACER_ASPIRE_ONE
),
SND_PCI_QUIRK
(
0x1028
,
0x0253
,
"Dell OEM"
,
ALC268_DELL
),
SND_PCI_QUIRK
(
0x1028
,
0x02b0
,
"Dell Inspiron Mini9"
,
ALC268_DELL
),
SND_PCI_QUIRK
(
0x103c
,
0x30cc
,
"TOSHIBA"
,
ALC268_TOSHIBA
),
SND_PCI_QUIRK
(
0x1043
,
0x1205
,
"ASUS W7J"
,
ALC268_3ST
),
SND_PCI_QUIRK
(
0x1179
,
0xff10
,
"TOSHIBA A205"
,
ALC268_TOSHIBA
),
...
...
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