Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
e44d4e4c
Commit
e44d4e4c
authored
Aug 03, 2009
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'fix/hda' into topic/hda
parents
559059b2
4b35d2ca
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
88 additions
and
36 deletions
+88
-36
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+1
-1
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_codec.h
+1
-1
sound/pci/hda/hda_intel.c
sound/pci/hda/hda_intel.c
+74
-29
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+4
-4
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_sigmatel.c
+8
-1
No files found.
sound/pci/hda/hda_codec.c
View file @
e44d4e4c
...
...
@@ -185,7 +185,7 @@ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd,
mutex_lock
(
&
bus
->
cmd_mutex
);
err
=
bus
->
ops
.
command
(
bus
,
cmd
);
if
(
!
err
&&
res
)
*
res
=
bus
->
ops
.
get_response
(
bus
);
*
res
=
bus
->
ops
.
get_response
(
bus
,
codec
->
addr
);
mutex_unlock
(
&
bus
->
cmd_mutex
);
snd_hda_power_down
(
codec
);
if
(
res
&&
*
res
==
-
1
&&
bus
->
rirb_error
)
{
...
...
sound/pci/hda/hda_codec.h
View file @
e44d4e4c
...
...
@@ -568,7 +568,7 @@ struct hda_bus_ops {
/* send a single command */
int
(
*
command
)(
struct
hda_bus
*
bus
,
unsigned
int
cmd
);
/* get a response from the last command */
unsigned
int
(
*
get_response
)(
struct
hda_bus
*
bus
);
unsigned
int
(
*
get_response
)(
struct
hda_bus
*
bus
,
unsigned
int
addr
);
/* free the private data */
void
(
*
private_free
)(
struct
hda_bus
*
);
/* attach a PCM stream */
...
...
sound/pci/hda/hda_intel.c
View file @
e44d4e4c
...
...
@@ -260,7 +260,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
/* STATESTS int mask: S3,SD2,SD1,SD0 */
#define AZX_MAX_CODECS 4
#define STATESTS_INT_MASK
0x0f
#define STATESTS_INT_MASK
((1 << AZX_MAX_CODECS) - 1)
/* SD_CTL bits */
#define SD_CTL_STREAM_RESET 0x01
/* stream reset bit */
...
...
@@ -368,8 +368,8 @@ struct azx_rb {
dma_addr_t
addr
;
/* physical address of CORB/RIRB buffer */
/* for RIRB */
unsigned
short
rp
,
wp
;
/* read/write pointers */
int
cmds
;
/* number of pending requests */
u32
res
;
/* last read value */
int
cmds
[
AZX_MAX_CODECS
];
/* number of pending requests */
u32
res
[
AZX_MAX_CODECS
];
/* last read value */
};
struct
azx
{
...
...
@@ -425,7 +425,7 @@ struct azx {
unsigned
int
probing
:
1
;
/* codec probing phase */
/* for debugging */
unsigned
int
last_cmd
;
/* last issued command (to sync) */
unsigned
int
last_cmd
[
AZX_MAX_CODECS
];
/* for pending irqs */
struct
work_struct
irq_pending_work
;
...
...
@@ -520,6 +520,7 @@ static int azx_alloc_cmd_io(struct azx *chip)
static
void
azx_init_cmd_io
(
struct
azx
*
chip
)
{
spin_lock_irq
(
&
chip
->
reg_lock
);
/* CORB set up */
chip
->
corb
.
addr
=
chip
->
rb
.
addr
;
chip
->
corb
.
buf
=
(
u32
*
)
chip
->
rb
.
area
;
...
...
@@ -538,7 +539,8 @@ static void azx_init_cmd_io(struct azx *chip)
/* RIRB set up */
chip
->
rirb
.
addr
=
chip
->
rb
.
addr
+
2048
;
chip
->
rirb
.
buf
=
(
u32
*
)(
chip
->
rb
.
area
+
2048
);
chip
->
rirb
.
wp
=
chip
->
rirb
.
rp
=
chip
->
rirb
.
cmds
=
0
;
chip
->
rirb
.
wp
=
chip
->
rirb
.
rp
=
0
;
memset
(
chip
->
rirb
.
cmds
,
0
,
sizeof
(
chip
->
rirb
.
cmds
));
azx_writel
(
chip
,
RIRBLBASE
,
(
u32
)
chip
->
rirb
.
addr
);
azx_writel
(
chip
,
RIRBUBASE
,
upper_32_bits
(
chip
->
rirb
.
addr
));
...
...
@@ -550,30 +552,60 @@ static void azx_init_cmd_io(struct azx *chip)
azx_writew
(
chip
,
RINTCNT
,
1
);
/* enable rirb dma and response irq */
azx_writeb
(
chip
,
RIRBCTL
,
ICH6_RBCTL_DMA_EN
|
ICH6_RBCTL_IRQ_EN
);
spin_unlock_irq
(
&
chip
->
reg_lock
);
}
static
void
azx_free_cmd_io
(
struct
azx
*
chip
)
{
spin_lock_irq
(
&
chip
->
reg_lock
);
/* disable ringbuffer DMAs */
azx_writeb
(
chip
,
RIRBCTL
,
0
);
azx_writeb
(
chip
,
CORBCTL
,
0
);
spin_unlock_irq
(
&
chip
->
reg_lock
);
}
static
unsigned
int
azx_command_addr
(
u32
cmd
)
{
unsigned
int
addr
=
cmd
>>
28
;
if
(
addr
>=
AZX_MAX_CODECS
)
{
snd_BUG
();
addr
=
0
;
}
return
addr
;
}
static
unsigned
int
azx_response_addr
(
u32
res
)
{
unsigned
int
addr
=
res
&
0xf
;
if
(
addr
>=
AZX_MAX_CODECS
)
{
snd_BUG
();
addr
=
0
;
}
return
addr
;
}
/* send a command */
static
int
azx_corb_send_cmd
(
struct
hda_bus
*
bus
,
u32
val
)
{
struct
azx
*
chip
=
bus
->
private_data
;
unsigned
int
addr
=
azx_command_addr
(
val
);
unsigned
int
wp
;
spin_lock_irq
(
&
chip
->
reg_lock
);
/* add command to corb */
wp
=
azx_readb
(
chip
,
CORBWP
);
wp
++
;
wp
%=
ICH6_MAX_CORB_ENTRIES
;
spin_lock_irq
(
&
chip
->
reg_lock
);
chip
->
rirb
.
cmds
++
;
chip
->
rirb
.
cmds
[
addr
]
++
;
chip
->
corb
.
buf
[
wp
]
=
cpu_to_le32
(
val
);
azx_writel
(
chip
,
CORBWP
,
wp
);
spin_unlock_irq
(
&
chip
->
reg_lock
);
return
0
;
...
...
@@ -585,13 +617,14 @@ static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
static
void
azx_update_rirb
(
struct
azx
*
chip
)
{
unsigned
int
rp
,
wp
;
unsigned
int
addr
;
u32
res
,
res_ex
;
wp
=
azx_readb
(
chip
,
RIRBWP
);
if
(
wp
==
chip
->
rirb
.
wp
)
return
;
chip
->
rirb
.
wp
=
wp
;
while
(
chip
->
rirb
.
rp
!=
wp
)
{
chip
->
rirb
.
rp
++
;
chip
->
rirb
.
rp
%=
ICH6_MAX_RIRB_ENTRIES
;
...
...
@@ -599,18 +632,24 @@ static void azx_update_rirb(struct azx *chip)
rp
=
chip
->
rirb
.
rp
<<
1
;
/* an RIRB entry is 8-bytes */
res_ex
=
le32_to_cpu
(
chip
->
rirb
.
buf
[
rp
+
1
]);
res
=
le32_to_cpu
(
chip
->
rirb
.
buf
[
rp
]);
addr
=
azx_response_addr
(
res_ex
);
if
(
res_ex
&
ICH6_RIRB_EX_UNSOL_EV
)
snd_hda_queue_unsol_event
(
chip
->
bus
,
res
,
res_ex
);
else
if
(
chip
->
rirb
.
cmds
)
{
chip
->
rirb
.
res
=
res
;
else
if
(
chip
->
rirb
.
cmds
[
addr
]
)
{
chip
->
rirb
.
res
[
addr
]
=
res
;
smp_wmb
();
chip
->
rirb
.
cmds
--
;
}
chip
->
rirb
.
cmds
[
addr
]
--
;
}
else
snd_printk
(
KERN_ERR
SFX
"spurious response %#x:%#x, "
"last cmd=%#08x
\n
"
,
res
,
res_ex
,
chip
->
last_cmd
[
addr
]);
}
}
/* receive a response */
static
unsigned
int
azx_rirb_get_response
(
struct
hda_bus
*
bus
)
static
unsigned
int
azx_rirb_get_response
(
struct
hda_bus
*
bus
,
unsigned
int
addr
)
{
struct
azx
*
chip
=
bus
->
private_data
;
unsigned
long
timeout
;
...
...
@@ -623,10 +662,10 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
azx_update_rirb
(
chip
);
spin_unlock_irq
(
&
chip
->
reg_lock
);
}
if
(
!
chip
->
rirb
.
cmds
)
{
if
(
!
chip
->
rirb
.
cmds
[
addr
]
)
{
smp_rmb
();
bus
->
rirb_error
=
0
;
return
chip
->
rirb
.
res
;
/* the last value */
return
chip
->
rirb
.
res
[
addr
]
;
/* the last value */
}
if
(
time_after
(
jiffies
,
timeout
))
break
;
...
...
@@ -640,7 +679,8 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
if
(
chip
->
msi
)
{
snd_printk
(
KERN_WARNING
SFX
"No response from codec, "
"disabling MSI: last cmd=0x%08x
\n
"
,
chip
->
last_cmd
);
"disabling MSI: last cmd=0x%08x
\n
"
,
chip
->
last_cmd
[
addr
]);
free_irq
(
chip
->
irq
,
chip
);
chip
->
irq
=
-
1
;
pci_disable_msi
(
chip
->
pci
);
...
...
@@ -655,7 +695,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
if
(
!
chip
->
polling_mode
)
{
snd_printk
(
KERN_WARNING
SFX
"azx_get_response timeout, "
"switching to polling mode: last cmd=0x%08x
\n
"
,
chip
->
last_cmd
);
chip
->
last_cmd
[
addr
]
);
chip
->
polling_mode
=
1
;
goto
again
;
}
...
...
@@ -679,7 +719,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
snd_printk
(
KERN_ERR
"hda_intel: azx_get_response timeout, "
"switching to single_cmd mode: last cmd=0x%08x
\n
"
,
chip
->
last_cmd
);
chip
->
last_cmd
[
addr
]
);
chip
->
single_cmd
=
1
;
bus
->
response_reset
=
0
;
/* re-initialize CORB/RIRB */
...
...
@@ -699,7 +739,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
*/
/* receive a response */
static
int
azx_single_wait_for_response
(
struct
azx
*
chip
)
static
int
azx_single_wait_for_response
(
struct
azx
*
chip
,
unsigned
int
addr
)
{
int
timeout
=
50
;
...
...
@@ -707,7 +747,7 @@ static int azx_single_wait_for_response(struct azx *chip)
/* check IRV busy bit */
if
(
azx_readw
(
chip
,
IRS
)
&
ICH6_IRS_VALID
)
{
/* reuse rirb.res as the response return value */
chip
->
rirb
.
res
=
azx_readl
(
chip
,
IR
);
chip
->
rirb
.
res
[
addr
]
=
azx_readl
(
chip
,
IR
);
return
0
;
}
udelay
(
1
);
...
...
@@ -715,7 +755,7 @@ static int azx_single_wait_for_response(struct azx *chip)
if
(
printk_ratelimit
())
snd_printd
(
SFX
"get_response timeout: IRS=0x%x
\n
"
,
azx_readw
(
chip
,
IRS
));
chip
->
rirb
.
res
=
-
1
;
chip
->
rirb
.
res
[
addr
]
=
-
1
;
return
-
EIO
;
}
...
...
@@ -723,6 +763,7 @@ static int azx_single_wait_for_response(struct azx *chip)
static
int
azx_single_send_cmd
(
struct
hda_bus
*
bus
,
u32
val
)
{
struct
azx
*
chip
=
bus
->
private_data
;
unsigned
int
addr
=
azx_command_addr
(
val
);
int
timeout
=
50
;
bus
->
rirb_error
=
0
;
...
...
@@ -735,7 +776,7 @@ static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
azx_writel
(
chip
,
IC
,
val
);
azx_writew
(
chip
,
IRS
,
azx_readw
(
chip
,
IRS
)
|
ICH6_IRS_BUSY
);
return
azx_single_wait_for_response
(
chip
);
return
azx_single_wait_for_response
(
chip
,
addr
);
}
udelay
(
1
);
}
...
...
@@ -746,10 +787,11 @@ static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
}
/* receive a response */
static
unsigned
int
azx_single_get_response
(
struct
hda_bus
*
bus
)
static
unsigned
int
azx_single_get_response
(
struct
hda_bus
*
bus
,
unsigned
int
addr
)
{
struct
azx
*
chip
=
bus
->
private_data
;
return
chip
->
rirb
.
res
;
return
chip
->
rirb
.
res
[
addr
]
;
}
/*
...
...
@@ -764,7 +806,7 @@ static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
{
struct
azx
*
chip
=
bus
->
private_data
;
chip
->
last_cmd
=
val
;
chip
->
last_cmd
[
azx_command_addr
(
val
)]
=
val
;
if
(
chip
->
single_cmd
)
return
azx_single_send_cmd
(
bus
,
val
);
else
...
...
@@ -772,13 +814,14 @@ static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
}
/* get a response */
static
unsigned
int
azx_get_response
(
struct
hda_bus
*
bus
)
static
unsigned
int
azx_get_response
(
struct
hda_bus
*
bus
,
unsigned
int
addr
)
{
struct
azx
*
chip
=
bus
->
private_data
;
if
(
chip
->
single_cmd
)
return
azx_single_get_response
(
bus
);
return
azx_single_get_response
(
bus
,
addr
);
else
return
azx_rirb_get_response
(
bus
);
return
azx_rirb_get_response
(
bus
,
addr
);
}
#ifdef CONFIG_SND_HDA_POWER_SAVE
...
...
@@ -1250,10 +1293,12 @@ static int probe_codec(struct azx *chip, int addr)
(
AC_VERB_PARAMETERS
<<
8
)
|
AC_PAR_VENDOR_ID
;
unsigned
int
res
;
mutex_lock
(
&
chip
->
bus
->
cmd_mutex
);
chip
->
probing
=
1
;
azx_send_cmd
(
chip
->
bus
,
cmd
);
res
=
azx_get_response
(
chip
->
bus
);
res
=
azx_get_response
(
chip
->
bus
,
addr
);
chip
->
probing
=
0
;
mutex_unlock
(
&
chip
->
bus
->
cmd_mutex
);
if
(
res
==
-
1
)
return
-
EIO
;
snd_printdd
(
SFX
"codec #%d probed OK
\n
"
,
addr
);
...
...
sound/pci/hda/patch_realtek.c
View file @
e44d4e4c
...
...
@@ -271,13 +271,13 @@ struct alc_spec {
*/
unsigned
int
num_init_verbs
;
char
stream_name_analog
[
16
];
/* analog PCM stream */
char
stream_name_analog
[
32
];
/* analog PCM stream */
struct
hda_pcm_stream
*
stream_analog_playback
;
struct
hda_pcm_stream
*
stream_analog_capture
;
struct
hda_pcm_stream
*
stream_analog_alt_playback
;
struct
hda_pcm_stream
*
stream_analog_alt_capture
;
char
stream_name_digital
[
16
];
/* digital PCM stream */
char
stream_name_digital
[
32
];
/* digital PCM stream */
struct
hda_pcm_stream
*
stream_digital_playback
;
struct
hda_pcm_stream
*
stream_digital_capture
;
...
...
@@ -557,7 +557,7 @@ static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
/* Find enumerated value for current pinctl setting */
i
=
alc_pin_mode_min
(
dir
);
while
(
alc_pin_mode_values
[
i
]
!=
pinctl
&&
i
<=
alc_pin_mode_max
(
dir
)
)
while
(
i
<=
alc_pin_mode_max
(
dir
)
&&
alc_pin_mode_values
[
i
]
!=
pinctl
)
i
++
;
*
valp
=
i
<=
alc_pin_mode_max
(
dir
)
?
i
:
alc_pin_mode_min
(
dir
);
return
0
;
...
...
@@ -15018,7 +15018,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
SND_PCI_QUIRK
(
0x10de
,
0x03f0
,
"Realtek ALC660 demo"
,
ALC660VD_3ST
),
SND_PCI_QUIRK
(
0x1179
,
0xff00
,
"Toshiba A135"
,
ALC861VD_LENOVO
),
/*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/
/*lenovo*/
SND_PCI_QUIRK
(
0x1179
,
0xff01
,
"
DALLAS"
,
ALC861VD_DALLAS
),
SND_PCI_QUIRK
(
0x1179
,
0xff01
,
"
Toshiba A135"
,
ALC861VD_LENOVO
),
SND_PCI_QUIRK
(
0x1179
,
0xff03
,
"Toshiba P205"
,
ALC861VD_LENOVO
),
SND_PCI_QUIRK
(
0x1179
,
0xff31
,
"Toshiba L30-149"
,
ALC861VD_DALLAS
),
SND_PCI_QUIRK
(
0x1565
,
0x820d
,
"Biostar NF61S SE"
,
ALC861VD_6ST_DIG
),
...
...
sound/pci/hda/patch_sigmatel.c
View file @
e44d4e4c
...
...
@@ -2251,7 +2251,7 @@ static struct snd_pci_quirk stac927x_cfg_tbl[] = {
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x01f3
,
"Dell Inspiron 1420"
,
STAC_DELL_BIOS
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x0227
,
"Dell Vostro 1400 "
,
STAC_DELL_BIOS
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x022e
,
"Dell "
,
STAC_DELL_BIOS
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x022f
,
"Dell Inspiron 1525"
,
STAC_DELL_
3ST
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x022f
,
"Dell Inspiron 1525"
,
STAC_DELL_
BIOS
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x0242
,
"Dell "
,
STAC_DELL_BIOS
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x0243
,
"Dell "
,
STAC_DELL_BIOS
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x02ff
,
"Dell "
,
STAC_DELL_BIOS
),
...
...
@@ -5870,6 +5870,13 @@ static int patch_stac927x(struct hda_codec *codec)
/* GPIO2 High = Enable EAPD */
spec
->
eapd_mask
=
spec
->
gpio_mask
=
spec
->
gpio_dir
=
0x04
;
spec
->
gpio_data
=
0x04
;
switch
(
codec
->
subsystem_id
)
{
case
0x1028022f
:
/* correct EAPD to be GPIO0 */
spec
->
eapd_mask
=
spec
->
gpio_mask
=
0x01
;
spec
->
gpio_dir
=
spec
->
gpio_data
=
0x01
;
break
;
};
spec
->
dmic_nids
=
stac927x_dmic_nids
;
spec
->
num_dmics
=
STAC927X_NUM_DMICS
;
...
...
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