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
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