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
e090d5b6
Commit
e090d5b6
authored
Mar 23, 2014
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branches 'asoc/topic/simple' and 'asoc/topic/sirf' into asoc-next
parents
ca9e54c6
46c39cae
bfe723f6
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
62 additions
and
33 deletions
+62
-33
Documentation/devicetree/bindings/sound/simple-card.txt
Documentation/devicetree/bindings/sound/simple-card.txt
+6
-0
sound/soc/codecs/sirf-audio-codec.c
sound/soc/codecs/sirf-audio-codec.c
+0
-9
sound/soc/generic/simple-card.c
sound/soc/generic/simple-card.c
+56
-24
No files found.
Documentation/devicetree/bindings/sound/simple-card.txt
View file @
e090d5b6
...
...
@@ -43,6 +43,12 @@ Optional CPU/CODEC subnodes properties:
clock node (= common clock), or "system-clock-frequency"
(if system doens't support common clock)
Note:
* For 'format', 'frame-master', 'bitclock-master', 'bitclock-inversion' and
'frame-inversion', the simple card will use the settings of CODEC for both
CPU and CODEC sides as we need to keep the settings identical for both ends
of the link.
Example:
sound {
...
...
sound/soc/codecs/sirf-audio-codec.c
View file @
e090d5b6
...
...
@@ -337,18 +337,9 @@ struct snd_soc_dai_driver sirf_audio_codec_dai = {
static
int
sirf_audio_codec_probe
(
struct
snd_soc_codec
*
codec
)
{
int
ret
;
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
struct
sirf_audio_codec
*
sirf_audio_codec
=
snd_soc_codec_get_drvdata
(
codec
);
pm_runtime_enable
(
codec
->
dev
);
codec
->
control_data
=
sirf_audio_codec
->
regmap
;
ret
=
snd_soc_codec_set_cache_io
(
codec
,
0
,
0
,
SND_SOC_REGMAP
);
if
(
ret
!=
0
)
{
dev_err
(
codec
->
dev
,
"Failed to set cache I/O: %d
\n
"
,
ret
);
return
ret
;
}
if
(
of_device_is_compatible
(
codec
->
dev
->
of_node
,
"sirf,prima2-audio-codec"
))
{
snd_soc_dapm_new_controls
(
dapm
,
...
...
sound/soc/generic/simple-card.c
View file @
e090d5b6
...
...
@@ -20,7 +20,6 @@
struct
simple_card_data
{
struct
snd_soc_card
snd_card
;
unsigned
int
daifmt
;
struct
asoc_simple_dai
cpu_dai
;
struct
asoc_simple_dai
codec_dai
;
struct
snd_soc_dai_link
snd_link
;
...
...
@@ -105,12 +104,12 @@ asoc_simple_card_sub_parse_of(struct device_node *np,
/* get dai->name */
ret
=
snd_soc_of_get_dai_name
(
np
,
name
);
if
(
ret
<
0
)
goto
parse_error
;
return
ret
;
/* parse TDM slot */
ret
=
snd_soc_of_parse_tdm_slot
(
np
,
&
dai
->
slots
,
&
dai
->
slot_width
);
if
(
ret
)
goto
parse_error
;
return
ret
;
/*
* bitclock-inversion, frame-inversion
...
...
@@ -130,7 +129,7 @@ asoc_simple_card_sub_parse_of(struct device_node *np,
clk
=
of_clk_get
(
np
,
0
);
if
(
IS_ERR
(
clk
))
{
ret
=
PTR_ERR
(
clk
);
goto
parse_error
;
return
ret
;
}
dai
->
sysclk
=
clk_get_rate
(
clk
);
...
...
@@ -144,12 +143,7 @@ asoc_simple_card_sub_parse_of(struct device_node *np,
dai
->
sysclk
=
clk_get_rate
(
clk
);
}
ret
=
0
;
parse_error:
of_node_put
(
node
);
return
ret
;
return
0
;
}
static
int
asoc_simple_card_parse_of
(
struct
device_node
*
node
,
...
...
@@ -157,15 +151,18 @@ static int asoc_simple_card_parse_of(struct device_node *node,
struct
device
*
dev
)
{
struct
snd_soc_dai_link
*
dai_link
=
priv
->
snd_card
.
dai_link
;
struct
asoc_simple_dai
*
codec_dai
=
&
priv
->
codec_dai
;
struct
asoc_simple_dai
*
cpu_dai
=
&
priv
->
cpu_dai
;
struct
device_node
*
np
;
char
*
name
;
unsigned
int
daifmt
;
int
ret
;
/* parsing the card name from DT */
snd_soc_of_parse_card_name
(
&
priv
->
snd_card
,
"simple-audio-card,name"
);
/* get CPU/CODEC common format via simple-audio-card,format */
priv
->
daifmt
=
snd_soc_of_parse_daifmt
(
node
,
"simple-audio-card,"
)
&
daifmt
=
snd_soc_of_parse_daifmt
(
node
,
"simple-audio-card,"
)
&
(
SND_SOC_DAIFMT_FORMAT_MASK
|
SND_SOC_DAIFMT_INV_MASK
);
/* off-codec widgets */
...
...
@@ -187,25 +184,35 @@ static int asoc_simple_card_parse_of(struct device_node *node,
/* CPU sub-node */
ret
=
-
EINVAL
;
np
=
of_get_child_by_name
(
node
,
"simple-audio-card,cpu"
);
if
(
np
)
ret
=
asoc_simple_card_sub_parse_of
(
np
,
priv
->
daifmt
,
&
priv
->
cpu_dai
,
if
(
np
)
{
ret
=
asoc_simple_card_sub_parse_of
(
np
,
daifmt
,
cpu_dai
,
&
dai_link
->
cpu_of_node
,
&
dai_link
->
cpu_dai_name
);
of_node_put
(
np
);
}
if
(
ret
<
0
)
return
ret
;
/* CODEC sub-node */
ret
=
-
EINVAL
;
np
=
of_get_child_by_name
(
node
,
"simple-audio-card,codec"
);
if
(
np
)
ret
=
asoc_simple_card_sub_parse_of
(
np
,
priv
->
daifmt
,
&
priv
->
codec_dai
,
if
(
np
)
{
ret
=
asoc_simple_card_sub_parse_of
(
np
,
daifmt
,
codec_dai
,
&
dai_link
->
codec_of_node
,
&
dai_link
->
codec_dai_name
);
of_node_put
(
np
);
}
if
(
ret
<
0
)
return
ret
;
/*
* overwrite cpu_dai->fmt as its DAIFMT_MASTER bit is based on CODEC
* while the other bits should be identical unless buggy SW/HW design.
*/
cpu_dai
->
fmt
=
codec_dai
->
fmt
;
if
(
!
dai_link
->
cpu_dai_name
||
!
dai_link
->
codec_dai_name
)
return
-
EINVAL
;
...
...
@@ -224,15 +231,15 @@ static int asoc_simple_card_parse_of(struct device_node *node,
dai_link
->
platform_of_node
=
dai_link
->
cpu_of_node
;
dev_dbg
(
dev
,
"card-name : %s
\n
"
,
name
);
dev_dbg
(
dev
,
"platform : %04x
\n
"
,
priv
->
daifmt
);
dev_dbg
(
dev
,
"platform : %04x
\n
"
,
daifmt
);
dev_dbg
(
dev
,
"cpu : %s / %04x / %d
\n
"
,
dai_link
->
cpu_dai_name
,
priv
->
cpu_dai
.
fmt
,
priv
->
cpu_dai
.
sysclk
);
cpu_dai
->
fmt
,
cpu_dai
->
sysclk
);
dev_dbg
(
dev
,
"codec : %s / %04x / %d
\n
"
,
dai_link
->
codec_dai_name
,
priv
->
codec_dai
.
fmt
,
priv
->
codec_dai
.
sysclk
);
codec_dai
->
fmt
,
codec_dai
->
sysclk
);
/*
* soc_bind_dai_link() will check cpu name
...
...
@@ -248,6 +255,27 @@ static int asoc_simple_card_parse_of(struct device_node *node,
return
0
;
}
/* update the reference count of the devices nodes at end of probe */
static
int
asoc_simple_card_unref
(
struct
platform_device
*
pdev
)
{
struct
snd_soc_card
*
card
=
platform_get_drvdata
(
pdev
);
struct
snd_soc_dai_link
*
dai_link
;
struct
device_node
*
np
;
int
num_links
;
for
(
num_links
=
0
,
dai_link
=
card
->
dai_link
;
num_links
<
card
->
num_links
;
num_links
++
,
dai_link
++
)
{
np
=
(
struct
device_node
*
)
dai_link
->
cpu_of_node
;
if
(
np
)
of_node_put
(
np
);
np
=
(
struct
device_node
*
)
dai_link
->
codec_of_node
;
if
(
np
)
of_node_put
(
np
);
}
return
0
;
}
static
int
asoc_simple_card_probe
(
struct
platform_device
*
pdev
)
{
struct
simple_card_data
*
priv
;
...
...
@@ -275,7 +303,7 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
if
(
ret
<
0
)
{
if
(
ret
!=
-
EPROBE_DEFER
)
dev_err
(
dev
,
"parse error %d
\n
"
,
ret
);
return
ret
;
goto
err
;
}
}
else
{
struct
asoc_simple_card_info
*
cinfo
;
...
...
@@ -318,7 +346,11 @@ static int asoc_simple_card_probe(struct platform_device *pdev)
snd_soc_card_set_drvdata
(
&
priv
->
snd_card
,
priv
);
return
devm_snd_soc_register_card
(
&
pdev
->
dev
,
&
priv
->
snd_card
);
ret
=
devm_snd_soc_register_card
(
&
pdev
->
dev
,
&
priv
->
snd_card
);
err:
asoc_simple_card_unref
(
pdev
);
return
ret
;
}
static
const
struct
of_device_id
asoc_simple_of_match
[]
=
{
...
...
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