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
6bf88ab2
Commit
6bf88ab2
authored
May 22, 2014
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/dapm' into asoc-next
parents
1450da3c
94986198
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
58 additions
and
119 deletions
+58
-119
include/sound/soc-dapm.h
include/sound/soc-dapm.h
+2
-5
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+56
-114
No files found.
include/sound/soc-dapm.h
View file @
6bf88ab2
...
...
@@ -256,9 +256,8 @@ struct device;
/* generic widgets */
#define SND_SOC_DAPM_REG(wid, wname, wreg, wshift, wmask, won_val, woff_val) \
{ .id = wid, .name = wname, .kcontrol_news = NULL, .num_kcontrols = 0, \
.reg = -((wreg) + 1), .shift = wshift, .mask = wmask, \
.on_val = won_val, .off_val = woff_val, .event = dapm_reg_event, \
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}
.reg = wreg, .shift = wshift, .mask = wmask, \
.on_val = won_val, .off_val = woff_val, }
#define SND_SOC_DAPM_SUPPLY(wname, wreg, wshift, winvert, wevent, wflags) \
{ .id = snd_soc_dapm_supply, .name = wname, \
SND_SOC_DAPM_INIT_REG_VAL(wreg, wshift, winvert), \
...
...
@@ -362,8 +361,6 @@ struct regulator;
struct
snd_soc_dapm_widget_list
;
struct
snd_soc_dapm_update
;
int
dapm_reg_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
);
int
dapm_regulator_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
);
int
dapm_clock_event
(
struct
snd_soc_dapm_widget
*
w
,
...
...
sound/soc/soc-dapm.c
View file @
6bf88ab2
...
...
@@ -1057,26 +1057,6 @@ int snd_soc_dapm_dai_get_connected_widgets(struct snd_soc_dai *dai, int stream,
return
paths
;
}
/*
* Handler for generic register modifier widget.
*/
int
dapm_reg_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
unsigned
int
val
;
if
(
SND_SOC_DAPM_EVENT_ON
(
event
))
val
=
w
->
on_val
;
else
val
=
w
->
off_val
;
soc_widget_update_bits
(
w
,
-
(
w
->
reg
+
1
),
w
->
mask
<<
w
->
shift
,
val
<<
w
->
shift
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
dapm_reg_event
);
/*
* Handler for regulator supply widget.
*/
...
...
@@ -2383,8 +2363,7 @@ static int snd_soc_dapm_add_path(struct snd_soc_dapm_context *dapm,
}
static
int
snd_soc_dapm_add_route
(
struct
snd_soc_dapm_context
*
dapm
,
const
struct
snd_soc_dapm_route
*
route
,
unsigned
int
is_prefixed
)
const
struct
snd_soc_dapm_route
*
route
)
{
struct
snd_soc_dapm_widget
*
wsource
=
NULL
,
*
wsink
=
NULL
,
*
w
;
struct
snd_soc_dapm_widget
*
wtsource
=
NULL
,
*
wtsink
=
NULL
;
...
...
@@ -2394,7 +2373,7 @@ static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
char
prefixed_source
[
80
];
int
ret
;
if
(
dapm
->
codec
&&
dapm
->
codec
->
name_prefix
&&
!
is_prefixed
)
{
if
(
dapm
->
codec
&&
dapm
->
codec
->
name_prefix
)
{
snprintf
(
prefixed_sink
,
sizeof
(
prefixed_sink
),
"%s %s"
,
dapm
->
codec
->
name_prefix
,
route
->
sink
);
sink
=
prefixed_sink
;
...
...
@@ -2522,7 +2501,7 @@ int snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,
mutex_lock_nested
(
&
dapm
->
card
->
dapm_mutex
,
SND_SOC_DAPM_CLASS_INIT
);
for
(
i
=
0
;
i
<
num
;
i
++
)
{
r
=
snd_soc_dapm_add_route
(
dapm
,
route
,
false
);
r
=
snd_soc_dapm_add_route
(
dapm
,
route
);
if
(
r
<
0
)
{
dev_err
(
dapm
->
dev
,
"ASoC: Failed to add route %s -> %s -> %s
\n
"
,
route
->
source
,
...
...
@@ -2794,22 +2773,19 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
mutex_lock_nested
(
&
card
->
dapm_mutex
,
SND_SOC_DAPM_CLASS_RUNTIME
);
change
=
dapm_kcontrol_set_value
(
kcontrol
,
val
);
if
(
reg
!=
SND_SOC_NOPM
)
{
mask
=
mask
<<
shift
;
val
=
val
<<
shift
;
change
=
snd_soc_test_bits
(
codec
,
reg
,
mask
,
val
);
}
if
(
change
)
{
if
(
reg
!=
SND_SOC_NOPM
)
{
update
.
kcontrol
=
kcontrol
;
update
.
reg
=
reg
;
update
.
mask
=
mask
;
update
.
val
=
val
;
mask
=
mask
<<
shift
;
val
=
val
<<
shift
;
if
(
snd_soc_test_bits
(
codec
,
reg
,
mask
,
val
))
{
update
.
kcontrol
=
kcontrol
;
update
.
reg
=
reg
;
update
.
mask
=
mask
;
update
.
val
=
val
;
card
->
update
=
&
update
;
}
card
->
update
=
&
update
;
}
ret
=
soc_dapm_mixer_update_power
(
card
,
kcontrol
,
connect
);
...
...
@@ -3248,11 +3224,11 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
struct
snd_soc_dapm_widget
*
source
,
struct
snd_soc_dapm_widget
*
sink
)
{
struct
snd_soc_dapm_route
routes
[
2
];
struct
snd_soc_dapm_widget
template
;
struct
snd_soc_dapm_widget
*
w
;
size_t
len
;
char
*
link_name
;
int
ret
;
len
=
strlen
(
source
->
name
)
+
strlen
(
sink
->
name
)
+
2
;
link_name
=
devm_kzalloc
(
card
->
dev
,
len
,
GFP_KERNEL
);
...
...
@@ -3279,15 +3255,10 @@ int snd_soc_dapm_new_pcm(struct snd_soc_card *card,
w
->
params
=
params
;
memset
(
&
routes
,
0
,
sizeof
(
routes
));
routes
[
0
].
source
=
source
->
name
;
routes
[
0
].
sink
=
link_name
;
routes
[
1
].
source
=
link_name
;
routes
[
1
].
sink
=
sink
->
name
;
return
snd_soc_dapm_add_routes
(
&
card
->
dapm
,
routes
,
ARRAY_SIZE
(
routes
));
ret
=
snd_soc_dapm_add_path
(
&
card
->
dapm
,
source
,
w
,
NULL
,
NULL
);
if
(
ret
)
return
ret
;
return
snd_soc_dapm_add_path
(
&
card
->
dapm
,
w
,
sink
,
NULL
,
NULL
);
}
int
snd_soc_dapm_new_dai_widgets
(
struct
snd_soc_dapm_context
*
dapm
,
...
...
@@ -3345,6 +3316,7 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm,
int
snd_soc_dapm_link_dai_widgets
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_dapm_widget
*
dai_w
,
*
w
;
struct
snd_soc_dapm_widget
*
src
,
*
sink
;
struct
snd_soc_dai
*
dai
;
/* For each DAI widget... */
...
...
@@ -3375,25 +3347,15 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card)
if
(
!
w
->
sname
||
!
strstr
(
w
->
sname
,
dai_w
->
name
))
continue
;
if
(
dai
->
driver
->
playback
.
stream_name
&&
strstr
(
w
->
sname
,
dai
->
driver
->
playback
.
stream_name
))
{
dev_dbg
(
dai
->
dev
,
"%s -> %s
\n
"
,
dai
->
playback_widget
->
name
,
w
->
name
);
snd_soc_dapm_add_path
(
w
->
dapm
,
dai
->
playback_widget
,
w
,
NULL
,
NULL
);
}
if
(
dai
->
driver
->
capture
.
stream_name
&&
strstr
(
w
->
sname
,
dai
->
driver
->
capture
.
stream_name
))
{
dev_dbg
(
dai
->
dev
,
"%s -> %s
\n
"
,
w
->
name
,
dai
->
capture_widget
->
name
);
snd_soc_dapm_add_path
(
w
->
dapm
,
w
,
dai
->
capture_widget
,
NULL
,
NULL
);
if
(
dai_w
->
id
==
snd_soc_dapm_dai_in
)
{
src
=
dai_w
;
sink
=
w
;
}
else
{
src
=
w
;
sink
=
dai_w
;
}
dev_dbg
(
dai
->
dev
,
"%s -> %s
\n
"
,
src
->
name
,
sink
->
name
);
snd_soc_dapm_add_path
(
w
->
dapm
,
src
,
sink
,
NULL
,
NULL
);
}
}
...
...
@@ -3403,12 +3365,10 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card)
void
snd_soc_dapm_connect_dai_link_widgets
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
card
->
rtd
;
struct
snd_soc_dapm_widget
*
sink
,
*
source
;
struct
snd_soc_dai
*
cpu_dai
,
*
codec_dai
;
struct
snd_soc_dapm_route
r
;
int
i
;
memset
(
&
r
,
0
,
sizeof
(
r
));
/* for each BE DAI link... */
for
(
i
=
0
;
i
<
card
->
num_rtd
;
i
++
)
{
rtd
=
&
card
->
rtd
[
i
];
...
...
@@ -3429,55 +3389,49 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
/* connect BE DAI playback if widgets are valid */
if
(
codec_dai
->
playback_widget
&&
cpu_dai
->
playback_widget
)
{
r
.
source
=
cpu_dai
->
playback_widget
->
name
;
r
.
sink
=
codec_dai
->
playback_widget
->
name
;
source
=
cpu_dai
->
playback_widget
;
sink
=
codec_dai
->
playback_widget
;
dev_dbg
(
rtd
->
dev
,
"connected DAI link %s:%s -> %s:%s
\n
"
,
cpu_dai
->
codec
->
name
,
r
.
sourc
e
,
codec_dai
->
platform
->
name
,
r
.
sink
);
cpu_dai
->
codec
->
name
,
source
->
nam
e
,
codec_dai
->
platform
->
name
,
sink
->
name
);
snd_soc_dapm_add_route
(
&
card
->
dapm
,
&
r
,
true
);
snd_soc_dapm_add_path
(
&
card
->
dapm
,
source
,
sink
,
NULL
,
NULL
);
}
/* connect BE DAI capture if widgets are valid */
if
(
codec_dai
->
capture_widget
&&
cpu_dai
->
capture_widget
)
{
r
.
source
=
codec_dai
->
capture_widget
->
name
;
r
.
sink
=
cpu_dai
->
capture_widget
->
name
;
source
=
codec_dai
->
capture_widget
;
sink
=
cpu_dai
->
capture_widget
;
dev_dbg
(
rtd
->
dev
,
"connected DAI link %s:%s -> %s:%s
\n
"
,
codec_dai
->
codec
->
name
,
r
.
sourc
e
,
cpu_dai
->
platform
->
name
,
r
.
sink
);
codec_dai
->
codec
->
name
,
source
->
nam
e
,
cpu_dai
->
platform
->
name
,
sink
->
name
);
snd_soc_dapm_add_route
(
&
card
->
dapm
,
&
r
,
true
);
snd_soc_dapm_add_path
(
&
card
->
dapm
,
source
,
sink
,
NULL
,
NULL
);
}
}
}
static
void
soc_dapm_
stream_event
(
struct
snd_soc_pcm_runtime
*
rtd
,
int
stream
,
static
void
soc_dapm_
dai_stream_event
(
struct
snd_soc_dai
*
dai
,
int
stream
,
int
event
)
{
struct
snd_soc_dapm_widget
*
w
;
struct
snd_soc_dapm_widget
*
w_cpu
,
*
w_codec
;
struct
snd_soc_dai
*
cpu_dai
=
rtd
->
cpu_dai
;
struct
snd_soc_dai
*
codec_dai
=
rtd
->
codec_dai
;
if
(
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
w_cpu
=
cpu_dai
->
playback_widget
;
w_codec
=
codec_dai
->
playback_widget
;
}
else
{
w_cpu
=
cpu_dai
->
capture_widget
;
w_codec
=
codec_dai
->
capture_widget
;
}
if
(
w_cpu
)
{
if
(
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
w
=
dai
->
playback_widget
;
else
w
=
dai
->
capture_widget
;
dapm_mark_dirty
(
w_cpu
,
"stream event"
);
if
(
w
)
{
dapm_mark_dirty
(
w
,
"stream event"
);
switch
(
event
)
{
case
SND_SOC_DAPM_STREAM_START
:
w
_cpu
->
active
=
1
;
w
->
active
=
1
;
break
;
case
SND_SOC_DAPM_STREAM_STOP
:
w
_cpu
->
active
=
0
;
w
->
active
=
0
;
break
;
case
SND_SOC_DAPM_STREAM_SUSPEND
:
case
SND_SOC_DAPM_STREAM_RESUME
:
...
...
@@ -3486,25 +3440,13 @@ static void soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
break
;
}
}
}
if
(
w_codec
)
{
dapm_mark_dirty
(
w_codec
,
"stream event"
);
switch
(
event
)
{
case
SND_SOC_DAPM_STREAM_START
:
w_codec
->
active
=
1
;
break
;
case
SND_SOC_DAPM_STREAM_STOP
:
w_codec
->
active
=
0
;
break
;
case
SND_SOC_DAPM_STREAM_SUSPEND
:
case
SND_SOC_DAPM_STREAM_RESUME
:
case
SND_SOC_DAPM_STREAM_PAUSE_PUSH
:
case
SND_SOC_DAPM_STREAM_PAUSE_RELEASE
:
break
;
}
}
static
void
soc_dapm_stream_event
(
struct
snd_soc_pcm_runtime
*
rtd
,
int
stream
,
int
event
)
{
soc_dapm_dai_stream_event
(
rtd
->
cpu_dai
,
stream
,
event
);
soc_dapm_dai_stream_event
(
rtd
->
codec_dai
,
stream
,
event
);
dapm_power_widgets
(
rtd
->
card
,
event
);
}
...
...
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