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
566d4eef
Commit
566d4eef
authored
May 22, 2014
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/dt' into asoc-next
parents
8e8fbd8f
6b0a0b3b
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
55 additions
and
27 deletions
+55
-27
include/sound/soc.h
include/sound/soc.h
+12
-1
sound/soc/soc-core.c
sound/soc/soc-core.c
+43
-26
No files found.
include/sound/soc.h
View file @
566d4eef
...
...
@@ -931,7 +931,12 @@ struct snd_soc_dai_link {
};
struct
snd_soc_codec_conf
{
/*
* specify device either by device name, or by
* DT/OF node, but not both.
*/
const
char
*
dev_name
;
const
struct
device_node
*
of_node
;
/*
* optional map of kcontrol, widget and path name prefixes that are
...
...
@@ -942,7 +947,13 @@ struct snd_soc_codec_conf {
struct
snd_soc_aux_dev
{
const
char
*
name
;
/* Codec name */
const
char
*
codec_name
;
/* for multi-codec */
/*
* specify multi-codec either by device name, or by
* DT/OF node, but not both.
*/
const
char
*
codec_name
;
const
struct
device_node
*
codec_of_node
;
/* codec/machine specific init - e.g. add machine controls */
int
(
*
init
)(
struct
snd_soc_dapm_context
*
dapm
);
...
...
sound/soc/soc-core.c
View file @
566d4eef
...
...
@@ -1117,11 +1117,13 @@ static void soc_set_name_prefix(struct snd_soc_card *card,
for
(
i
=
0
;
i
<
card
->
num_configs
;
i
++
)
{
struct
snd_soc_codec_conf
*
map
=
&
card
->
codec_conf
[
i
];
if
(
map
->
dev_name
&&
!
strcmp
(
codec
->
name
,
map
->
dev_name
))
{
if
(
map
->
of_node
&&
codec
->
dev
->
of_node
!=
map
->
of_node
)
continue
;
if
(
map
->
dev_name
&&
strcmp
(
codec
->
name
,
map
->
dev_name
))
continue
;
codec
->
name_prefix
=
map
->
name_prefix
;
break
;
}
}
}
static
int
soc_probe_codec
(
struct
snd_soc_card
*
card
,
...
...
@@ -1596,52 +1598,67 @@ static void soc_unregister_ac97_dai_link(struct snd_soc_pcm_runtime *rtd)
}
#endif
static
int
soc_check_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
static
struct
snd_soc_codec
*
soc_find_matching_codec
(
struct
snd_soc_card
*
card
,
int
num
)
{
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
struct
snd_soc_codec
*
codec
;
/* find CODEC from registered CODECs*/
/* find CODEC from registered CODECs
*/
list_for_each_entry
(
codec
,
&
codec_list
,
list
)
{
if
(
!
strcmp
(
codec
->
name
,
aux_dev
->
codec_name
))
return
0
;
if
(
aux_dev
->
codec_of_node
&&
(
codec
->
dev
->
of_node
!=
aux_dev
->
codec_of_node
))
continue
;
if
(
aux_dev
->
codec_name
&&
strcmp
(
codec
->
name
,
aux_dev
->
codec_name
))
continue
;
return
codec
;
}
dev_err
(
card
->
dev
,
"ASoC: %s not registered
\n
"
,
aux_dev
->
codec_name
);
return
NULL
;
}
static
int
soc_check_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
{
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
const
char
*
codecname
=
aux_dev
->
codec_name
;
struct
snd_soc_codec
*
codec
=
soc_find_matching_codec
(
card
,
num
);
if
(
codec
)
return
0
;
if
(
aux_dev
->
codec_of_node
)
codecname
=
of_node_full_name
(
aux_dev
->
codec_of_node
);
dev_err
(
card
->
dev
,
"ASoC: %s not registered
\n
"
,
codecname
);
return
-
EPROBE_DEFER
;
}
static
int
soc_probe_aux_dev
(
struct
snd_soc_card
*
card
,
int
num
)
{
struct
snd_soc_aux_dev
*
aux_dev
=
&
card
->
aux_dev
[
num
];
struct
snd_soc_codec
*
codec
;
const
char
*
codecname
=
aux_dev
->
codec_name
;
int
ret
=
-
ENODEV
;
struct
snd_soc_codec
*
codec
=
soc_find_matching_codec
(
card
,
num
);
if
(
!
codec
)
{
if
(
aux_dev
->
codec_of_node
)
codecname
=
of_node_full_name
(
aux_dev
->
codec_of_node
);
/* find CODEC from registered CODECs*/
list_for_each_entry
(
codec
,
&
codec_list
,
list
)
{
if
(
!
strcmp
(
codec
->
name
,
aux_dev
->
codec_name
))
{
if
(
codec
->
probed
)
{
dev_err
(
codec
->
dev
,
"ASoC: codec already probed"
);
ret
=
-
EBUSY
;
goto
out
;
}
goto
found
;
}
}
/* codec not found */
dev_err
(
card
->
dev
,
"ASoC: codec %s not found"
,
aux_dev
->
codec_
name
);
dev_err
(
card
->
dev
,
"ASoC: codec %s not found"
,
codec
name
);
return
-
EPROBE_DEFER
;
}
if
(
codec
->
probed
)
{
dev_err
(
codec
->
dev
,
"ASoC: codec already probed"
);
return
-
EBUSY
;
}
found:
ret
=
soc_probe_codec
(
card
,
codec
);
if
(
ret
<
0
)
return
ret
;
ret
=
soc_post_component_init
(
card
,
codec
,
num
,
1
);
out:
return
ret
;
}
...
...
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