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
0e19e7d2
Commit
0e19e7d2
authored
Nov 25, 2008
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/fix/hda' into topic/hda
Conflicts: sound/pci/hda/patch_sigmatel.c
parents
82894b6f
f73d3585
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
55 additions
and
27 deletions
+55
-27
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+2
-2
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_sigmatel.c
+53
-25
No files found.
sound/pci/hda/hda_codec.c
View file @
0e19e7d2
...
...
@@ -1586,12 +1586,12 @@ static void set_dig_out(struct hda_codec *codec, hda_nid_t nid,
{
hda_nid_t
*
d
;
snd_hda_codec_write
(
codec
,
nid
,
0
,
verb
,
val
);
snd_hda_codec_write
_cache
(
codec
,
nid
,
0
,
verb
,
val
);
d
=
codec
->
slave_dig_outs
;
if
(
!
d
)
return
;
for
(;
*
d
;
d
++
)
snd_hda_codec_write
(
codec
,
*
d
,
0
,
verb
,
val
);
snd_hda_codec_write
_cache
(
codec
,
*
d
,
0
,
verb
,
val
);
}
static
inline
void
set_dig_out_convert
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
...
...
sound/pci/hda/patch_sigmatel.c
View file @
0e19e7d2
...
...
@@ -3829,10 +3829,14 @@ static void stac92xx_power_down(struct hda_codec *codec)
AC_VERB_SET_POWER_STATE
,
AC_PWRST_D3
);
}
static
void
stac_toggle_power_map
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
int
enable
);
static
int
stac92xx_init
(
struct
hda_codec
*
codec
)
{
struct
sigmatel_spec
*
spec
=
codec
->
spec
;
struct
auto_pin_cfg
*
cfg
=
&
spec
->
autocfg
;
unsigned
int
gpio
;
int
i
;
snd_hda_sequence_write
(
codec
,
spec
->
init
);
...
...
@@ -3843,6 +3847,16 @@ static int stac92xx_init(struct hda_codec *codec)
snd_hda_codec_write_cache
(
codec
,
spec
->
adc_nids
[
i
],
0
,
AC_VERB_SET_POWER_STATE
,
AC_PWRST_D3
);
/* set up GPIO */
gpio
=
spec
->
gpio_data
;
/* turn on EAPD statically when spec->eapd_switch isn't set.
* otherwise, unsol event will turn it on/off dynamically
*/
if
(
!
spec
->
eapd_switch
)
gpio
|=
spec
->
eapd_mask
;
stac_gpio_set
(
codec
,
spec
->
gpio_mask
,
spec
->
gpio_dir
,
gpio
);
/* set up pins */
if
(
spec
->
hp_detect
)
{
/* Enable unsolicited responses on the HP widget */
...
...
@@ -3884,39 +3898,43 @@ static int stac92xx_init(struct hda_codec *codec)
for
(
i
=
0
;
i
<
spec
->
num_dmics
;
i
++
)
stac92xx_auto_set_pinctl
(
codec
,
spec
->
dmic_nids
[
i
],
AC_PINCTL_IN_EN
);
if
(
cfg
->
dig_out_pin
)
stac92xx_auto_set_pinctl
(
codec
,
cfg
->
dig_out_pin
,
AC_PINCTL_OUT_EN
);
if
(
cfg
->
dig_in_pin
)
stac92xx_auto_set_pinctl
(
codec
,
cfg
->
dig_in_pin
,
AC_PINCTL_IN_EN
);
for
(
i
=
0
;
i
<
spec
->
num_pwrs
;
i
++
)
{
int
event
=
is_nid_hp_pin
(
cfg
,
spec
->
pwr_nids
[
i
])
?
STAC_HP_EVENT
:
STAC_PWR_EVENT
;
int
pinctl
=
snd_hda_codec_read
(
codec
,
spec
->
pwr_nids
[
i
],
0
,
AC_VERB_GET_PIN_WIDGET_CONTROL
,
0
);
int
def_conf
=
snd_hda_codec_read
(
codec
,
spec
->
pwr_nids
[
i
],
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
def_conf
=
get_defcfg_connect
(
def_conf
);
hda_nid_t
nid
=
spec
->
pwr_nids
[
i
];
int
pinctl
,
def_conf
;
int
event
=
STAC_PWR_EVENT
;
if
(
is_nid_hp_pin
(
cfg
,
nid
)
&&
spec
->
hp_detect
)
continue
;
/* already has an unsol event */
pinctl
=
snd_hda_codec_read
(
codec
,
nid
,
0
,
AC_VERB_GET_PIN_WIDGET_CONTROL
,
0
);
/* outputs are only ports capable of power management
* any attempts on powering down a input port cause the
* referenced VREF to act quirky.
*/
if
(
pinctl
&
AC_PINCTL_IN_EN
)
continue
;
def_conf
=
snd_hda_codec_read
(
codec
,
nid
,
0
,
AC_VERB_GET_CONFIG_DEFAULT
,
0
);
def_conf
=
get_defcfg_connect
(
def_conf
);
/* skip any ports that don't have jacks since presence
* detection is useless */
if
(
def_conf
&&
def_conf
!=
AC_JACK_PORT_FIXED
)
if
(
def_conf
!=
AC_JACK_PORT_COMPLEX
)
{
if
(
def_conf
!=
AC_JACK_PORT_NONE
)
stac_toggle_power_map
(
codec
,
nid
,
1
);
continue
;
}
enable_pin_detect
(
codec
,
spec
->
pwr_nids
[
i
],
event
|
i
);
codec
->
patch_ops
.
unsol_event
(
codec
,
(
event
|
i
)
<<
26
);
}
if
(
spec
->
dac_list
)
stac92xx_power_down
(
codec
);
if
(
cfg
->
dig_out_pin
)
stac92xx_auto_set_pinctl
(
codec
,
cfg
->
dig_out_pin
,
AC_PINCTL_OUT_EN
);
if
(
cfg
->
dig_in_pin
)
stac92xx_auto_set_pinctl
(
codec
,
cfg
->
dig_in_pin
,
AC_PINCTL_IN_EN
);
stac_gpio_set
(
codec
,
spec
->
gpio_mask
,
spec
->
gpio_dir
,
spec
->
gpio_data
);
return
0
;
}
...
...
@@ -4103,14 +4121,18 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
}
}
static
void
stac92xx_pin_sense
(
struct
hda_codec
*
codec
,
int
idx
)
static
void
stac_toggle_power_map
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
,
int
enable
)
{
struct
sigmatel_spec
*
spec
=
codec
->
spec
;
hda_nid_t
nid
=
spec
->
pwr_nids
[
idx
];
int
presence
,
val
;
val
=
snd_hda_codec_read
(
codec
,
codec
->
afg
,
0
,
0x0fec
,
0x0
)
&
0x000000ff
;
presence
=
get_hp_pin_presence
(
codec
,
nid
);
unsigned
int
idx
,
val
;
for
(
idx
=
0
;
idx
<
spec
->
num_pwrs
;
idx
++
)
{
if
(
spec
->
pwr_nids
[
idx
]
==
nid
)
break
;
}
if
(
idx
>=
spec
->
num_pwrs
)
return
;
/* several codecs have two power down bits */
if
(
spec
->
pwr_mapping
)
...
...
@@ -4118,7 +4140,8 @@ static void stac92xx_pin_sense(struct hda_codec *codec, int idx)
else
idx
=
1
<<
idx
;
if
(
presence
)
val
=
snd_hda_codec_read
(
codec
,
codec
->
afg
,
0
,
0x0fec
,
0x0
)
&
0xff
;
if
(
enable
)
val
&=
~
idx
;
else
val
|=
idx
;
...
...
@@ -4127,6 +4150,11 @@ static void stac92xx_pin_sense(struct hda_codec *codec, int idx)
snd_hda_codec_write
(
codec
,
codec
->
afg
,
0
,
0x7ec
,
val
);
}
static
void
stac92xx_pin_sense
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
stac_toggle_power_map
(
codec
,
nid
,
get_hp_pin_presence
(
codec
,
nid
));
}
static
void
stac92xx_report_jack
(
struct
hda_codec
*
codec
,
hda_nid_t
nid
)
{
struct
sigmatel_spec
*
spec
=
codec
->
spec
;
...
...
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