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
66f89906
Commit
66f89906
authored
Dec 12, 2016
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/component' into asoc-next
parents
1e570a83
9178feb4
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
85 additions
and
54 deletions
+85
-54
include/sound/soc.h
include/sound/soc.h
+9
-8
sound/soc/intel/boards/broadwell.c
sound/soc/intel/boards/broadwell.c
+10
-6
sound/soc/intel/boards/cht_bsw_rt5672.c
sound/soc/intel/boards/cht_bsw_rt5672.c
+10
-6
sound/soc/soc-core.c
sound/soc/soc-core.c
+56
-34
No files found.
include/sound/soc.h
View file @
66f89906
...
...
@@ -782,6 +782,8 @@ struct snd_soc_component_driver {
int
(
*
probe
)(
struct
snd_soc_component
*
);
void
(
*
remove
)(
struct
snd_soc_component
*
);
int
(
*
suspend
)(
struct
snd_soc_component
*
);
int
(
*
resume
)(
struct
snd_soc_component
*
);
/* DT */
int
(
*
of_xlate_dai_name
)(
struct
snd_soc_component
*
component
,
...
...
@@ -807,9 +809,11 @@ struct snd_soc_component {
unsigned
int
ignore_pmdown_time
:
1
;
/* pmdown_time is ignored at stop */
unsigned
int
registered_as_component
:
1
;
unsigned
int
auxiliary
:
1
;
/* for auxiliary component of the card */
unsigned
int
suspended
:
1
;
/* is in suspend PM state */
struct
list_head
list
;
struct
list_head
list_aux
;
/* for auxiliary component of the card */
struct
list_head
card_list
;
struct
snd_soc_dai_driver
*
dai_drv
;
int
num_dai
;
...
...
@@ -852,6 +856,8 @@ struct snd_soc_component {
int
(
*
probe
)(
struct
snd_soc_component
*
);
void
(
*
remove
)(
struct
snd_soc_component
*
);
int
(
*
suspend
)(
struct
snd_soc_component
*
);
int
(
*
resume
)(
struct
snd_soc_component
*
);
/* machine specific init */
int
(
*
init
)(
struct
snd_soc_component
*
component
);
...
...
@@ -868,11 +874,9 @@ struct snd_soc_codec {
const
struct
snd_soc_codec_driver
*
driver
;
struct
list_head
list
;
struct
list_head
card_list
;
/* runtime */
unsigned
int
cache_bypass
:
1
;
/* Suppress access to the cache */
unsigned
int
suspended
:
1
;
/* Codec is in suspend PM state */
unsigned
int
cache_init
:
1
;
/* codec cache has been initialized */
/* codec IO */
...
...
@@ -1148,7 +1152,6 @@ struct snd_soc_card {
*/
struct
snd_soc_aux_dev
*
aux_dev
;
int
num_aux_devs
;
struct
list_head
aux_comp_list
;
const
struct
snd_kcontrol_new
*
controls
;
int
num_controls
;
...
...
@@ -1170,7 +1173,7 @@ struct snd_soc_card {
struct
work_struct
deferred_resume_work
;
/* lists of probed devices belonging to this card */
struct
list_head
co
dec
_dev_list
;
struct
list_head
co
mponent
_dev_list
;
struct
list_head
widgets
;
struct
list_head
paths
;
...
...
@@ -1219,7 +1222,6 @@ struct snd_soc_pcm_runtime {
struct
snd_soc_platform
*
platform
;
struct
snd_soc_dai
*
codec_dai
;
struct
snd_soc_dai
*
cpu_dai
;
struct
snd_soc_component
*
component
;
/* Only valid for AUX dev rtds */
struct
snd_soc_dai
**
codec_dais
;
unsigned
int
num_codecs
;
...
...
@@ -1541,11 +1543,10 @@ static inline void *snd_soc_platform_get_drvdata(struct snd_soc_platform *platfo
static
inline
void
snd_soc_initialize_card_lists
(
struct
snd_soc_card
*
card
)
{
INIT_LIST_HEAD
(
&
card
->
codec_dev_list
);
INIT_LIST_HEAD
(
&
card
->
widgets
);
INIT_LIST_HEAD
(
&
card
->
paths
);
INIT_LIST_HEAD
(
&
card
->
dapm_list
);
INIT_LIST_HEAD
(
&
card
->
aux_comp
_list
);
INIT_LIST_HEAD
(
&
card
->
component_dev
_list
);
}
static
inline
bool
snd_soc_volsw_is_stereo
(
struct
soc_mixer_control
*
mc
)
...
...
sound/soc/intel/boards/broadwell.c
View file @
66f89906
...
...
@@ -220,10 +220,12 @@ static struct snd_soc_dai_link broadwell_rt286_dais[] = {
};
static
int
broadwell_suspend
(
struct
snd_soc_card
*
card
){
struct
snd_soc_codec
*
codec
;
struct
snd_soc_component
*
component
;
list_for_each_entry
(
component
,
&
card
->
component_dev_list
,
card_list
)
{
if
(
!
strcmp
(
component
->
name
,
"i2c-INT343A:00"
))
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
list_for_each_entry
(
codec
,
&
card
->
codec_dev_list
,
card_list
)
{
if
(
!
strcmp
(
codec
->
component
.
name
,
"i2c-INT343A:00"
))
{
dev_dbg
(
codec
->
dev
,
"disabling jack detect before going to suspend.
\n
"
);
rt286_mic_detect
(
codec
,
NULL
);
break
;
...
...
@@ -233,10 +235,12 @@ static int broadwell_suspend(struct snd_soc_card *card){
}
static
int
broadwell_resume
(
struct
snd_soc_card
*
card
){
struct
snd_soc_codec
*
codec
;
struct
snd_soc_component
*
component
;
list_for_each_entry
(
component
,
&
card
->
component_dev_list
,
card_list
)
{
if
(
!
strcmp
(
component
->
name
,
"i2c-INT343A:00"
))
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
list_for_each_entry
(
codec
,
&
card
->
codec_dev_list
,
card_list
)
{
if
(
!
strcmp
(
codec
->
component
.
name
,
"i2c-INT343A:00"
))
{
dev_dbg
(
codec
->
dev
,
"enabling jack detect for resume.
\n
"
);
rt286_mic_detect
(
codec
,
&
broadwell_headset
);
break
;
...
...
sound/soc/intel/boards/cht_bsw_rt5672.c
View file @
66f89906
...
...
@@ -292,10 +292,12 @@ static struct snd_soc_dai_link cht_dailink[] = {
static
int
cht_suspend_pre
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_codec
*
codec
;
struct
snd_soc_component
*
component
;
list_for_each_entry
(
component
,
&
card
->
component_dev_list
,
card_list
)
{
if
(
!
strcmp
(
component
->
name
,
"i2c-10EC5670:00"
))
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
list_for_each_entry
(
codec
,
&
card
->
codec_dev_list
,
card_list
)
{
if
(
!
strcmp
(
codec
->
component
.
name
,
"i2c-10EC5670:00"
))
{
dev_dbg
(
codec
->
dev
,
"disabling jack detect before going to suspend.
\n
"
);
rt5670_jack_suspend
(
codec
);
break
;
...
...
@@ -306,10 +308,12 @@ static int cht_suspend_pre(struct snd_soc_card *card)
static
int
cht_resume_post
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_codec
*
codec
;
struct
snd_soc_component
*
component
;
list_for_each_entry
(
component
,
&
card
->
component_dev_list
,
card_list
)
{
if
(
!
strcmp
(
component
->
name
,
"i2c-10EC5670:00"
))
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
list_for_each_entry
(
codec
,
&
card
->
codec_dev_list
,
card_list
)
{
if
(
!
strcmp
(
codec
->
component
.
name
,
"i2c-10EC5670:00"
))
{
dev_dbg
(
codec
->
dev
,
"enabling jack detect for resume.
\n
"
);
rt5670_jack_resume
(
codec
);
break
;
...
...
sound/soc/soc-core.c
View file @
66f89906
...
...
@@ -626,7 +626,7 @@ static void codec2codec_close_delayed_work(struct work_struct *work)
int
snd_soc_suspend
(
struct
device
*
dev
)
{
struct
snd_soc_card
*
card
=
dev_get_drvdata
(
dev
);
struct
snd_soc_co
dec
*
codec
;
struct
snd_soc_co
mponent
*
component
;
struct
snd_soc_pcm_runtime
*
rtd
;
int
i
;
...
...
@@ -702,39 +702,39 @@ int snd_soc_suspend(struct device *dev)
dapm_mark_endpoints_dirty
(
card
);
snd_soc_dapm_sync
(
&
card
->
dapm
);
/* suspend all CO
DEC
s */
list_for_each_entry
(
co
dec
,
&
card
->
codec
_dev_list
,
card_list
)
{
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_co
dec_get_dapm
(
codec
);
/* suspend all CO
MPONENT
s */
list_for_each_entry
(
co
mponent
,
&
card
->
component
_dev_list
,
card_list
)
{
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_co
mponent_get_dapm
(
component
);
/* If there are paths active then the CO
DEC
will be held with
/* If there are paths active then the CO
MPONENT
will be held with
* bias _ON and should not be suspended. */
if
(
!
co
dec
->
suspended
)
{
if
(
!
co
mponent
->
suspended
)
{
switch
(
snd_soc_dapm_get_bias_level
(
dapm
))
{
case
SND_SOC_BIAS_STANDBY
:
/*
* If the CO
DEC
is capable of idle
* If the CO
MPONENT
is capable of idle
* bias off then being in STANDBY
* means it's doing something,
* otherwise fall through.
*/
if
(
dapm
->
idle_bias_off
)
{
dev_dbg
(
co
dec
->
dev
,
dev_dbg
(
co
mponent
->
dev
,
"ASoC: idle_bias_off CODEC on over suspend
\n
"
);
break
;
}
case
SND_SOC_BIAS_OFF
:
if
(
co
dec
->
driver
->
suspend
)
co
dec
->
driver
->
suspend
(
codec
);
co
dec
->
suspended
=
1
;
if
(
co
dec
->
component
.
regmap
)
regcache_mark_dirty
(
co
dec
->
component
.
regmap
);
if
(
co
mponent
->
suspend
)
co
mponent
->
suspend
(
component
);
co
mponent
->
suspended
=
1
;
if
(
co
mponent
->
regmap
)
regcache_mark_dirty
(
co
mponent
->
regmap
);
/* deactivate pins to sleep state */
pinctrl_pm_select_sleep_state
(
co
dec
->
dev
);
pinctrl_pm_select_sleep_state
(
co
mponent
->
dev
);
break
;
default:
dev_dbg
(
co
dec
->
dev
,
"ASoC: CO
DEC
is on over suspend
\n
"
);
dev_dbg
(
co
mponent
->
dev
,
"ASoC: CO
MPONENT
is on over suspend
\n
"
);
break
;
}
}
...
...
@@ -768,7 +768,7 @@ static void soc_resume_deferred(struct work_struct *work)
struct
snd_soc_card
*
card
=
container_of
(
work
,
struct
snd_soc_card
,
deferred_resume_work
);
struct
snd_soc_pcm_runtime
*
rtd
;
struct
snd_soc_co
dec
*
codec
;
struct
snd_soc_co
mponent
*
component
;
int
i
;
/* our power state is still SNDRV_CTL_POWER_D3hot from suspend time,
...
...
@@ -794,11 +794,11 @@ static void soc_resume_deferred(struct work_struct *work)
cpu_dai
->
driver
->
resume
(
cpu_dai
);
}
list_for_each_entry
(
co
dec
,
&
card
->
codec
_dev_list
,
card_list
)
{
if
(
co
dec
->
suspended
)
{
if
(
co
dec
->
driver
->
resume
)
co
dec
->
driver
->
resume
(
codec
);
co
dec
->
suspended
=
0
;
list_for_each_entry
(
co
mponent
,
&
card
->
component
_dev_list
,
card_list
)
{
if
(
co
mponent
->
suspended
)
{
if
(
co
mponent
->
resume
)
co
mponent
->
resume
(
component
);
co
mponent
->
suspended
=
0
;
}
}
...
...
@@ -1072,9 +1072,7 @@ static void soc_remove_component(struct snd_soc_component *component)
if
(
!
component
->
card
)
return
;
/* This is a HACK and will be removed soon */
if
(
component
->
codec
)
list_del
(
&
component
->
codec
->
card_list
);
list_del
(
&
component
->
card_list
);
if
(
component
->
remove
)
component
->
remove
(
component
);
...
...
@@ -1443,10 +1441,7 @@ static int soc_probe_component(struct snd_soc_card *card,
component
->
num_dapm_routes
);
list_add
(
&
dapm
->
list
,
&
card
->
dapm_list
);
/* This is a HACK and will be removed soon */
if
(
component
->
codec
)
list_add
(
&
component
->
codec
->
card_list
,
&
card
->
codec_dev_list
);
list_add
(
&
component
->
card_list
,
&
card
->
component_dev_list
);
return
0
;
...
...
@@ -1706,7 +1701,8 @@ static int soc_bind_aux_dev(struct snd_soc_card *card, int num)
}
component
->
init
=
aux_dev
->
init
;
list_add
(
&
component
->
list_aux
,
&
card
->
aux_comp_list
);
component
->
auxiliary
=
1
;
return
0
;
err_defer:
...
...
@@ -1722,7 +1718,10 @@ static int soc_probe_aux_devices(struct snd_soc_card *card)
for
(
order
=
SND_SOC_COMP_ORDER_FIRST
;
order
<=
SND_SOC_COMP_ORDER_LAST
;
order
++
)
{
list_for_each_entry
(
comp
,
&
card
->
aux_comp_list
,
list_aux
)
{
list_for_each_entry
(
comp
,
&
card
->
component_dev_list
,
card_list
)
{
if
(
!
comp
->
auxiliary
)
continue
;
if
(
comp
->
driver
->
probe_order
==
order
)
{
ret
=
soc_probe_component
(
card
,
comp
);
if
(
ret
<
0
)
{
...
...
@@ -1746,11 +1745,14 @@ static void soc_remove_aux_devices(struct snd_soc_card *card)
for
(
order
=
SND_SOC_COMP_ORDER_FIRST
;
order
<=
SND_SOC_COMP_ORDER_LAST
;
order
++
)
{
list_for_each_entry_safe
(
comp
,
_comp
,
&
card
->
aux_comp_list
,
list_aux
)
{
&
card
->
component_dev_list
,
card_list
)
{
if
(
!
comp
->
auxiliary
)
continue
;
if
(
comp
->
driver
->
remove_order
==
order
)
{
soc_remove_component
(
comp
);
/* remove it from the card's aux_comp_list */
list_del
(
&
comp
->
list_aux
);
comp
->
auxiliary
=
0
;
}
}
}
...
...
@@ -2926,6 +2928,8 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
component
->
driver
=
driver
;
component
->
probe
=
component
->
driver
->
probe
;
component
->
remove
=
component
->
driver
->
remove
;
component
->
suspend
=
component
->
driver
->
suspend
;
component
->
resume
=
component
->
driver
->
resume
;
dapm
=
&
component
->
dapm
;
dapm
->
dev
=
dev
;
...
...
@@ -3275,6 +3279,20 @@ static void snd_soc_codec_drv_remove(struct snd_soc_component *component)
codec
->
driver
->
remove
(
codec
);
}
static
int
snd_soc_codec_drv_suspend
(
struct
snd_soc_component
*
component
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
return
codec
->
driver
->
suspend
(
codec
);
}
static
int
snd_soc_codec_drv_resume
(
struct
snd_soc_component
*
component
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
return
codec
->
driver
->
resume
(
codec
);
}
static
int
snd_soc_codec_drv_write
(
struct
snd_soc_component
*
component
,
unsigned
int
reg
,
unsigned
int
val
)
{
...
...
@@ -3336,6 +3354,10 @@ int snd_soc_register_codec(struct device *dev,
codec
->
component
.
probe
=
snd_soc_codec_drv_probe
;
if
(
codec_drv
->
remove
)
codec
->
component
.
remove
=
snd_soc_codec_drv_remove
;
if
(
codec_drv
->
suspend
)
codec
->
component
.
suspend
=
snd_soc_codec_drv_suspend
;
if
(
codec_drv
->
resume
)
codec
->
component
.
resume
=
snd_soc_codec_drv_resume
;
if
(
codec_drv
->
write
)
codec
->
component
.
write
=
snd_soc_codec_drv_write
;
if
(
codec_drv
->
read
)
...
...
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