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
1a34ec4a
Commit
1a34ec4a
authored
Sep 01, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/fix/rcar' into asoc-linus
parents
c8b24e23
e0936c34
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
44 additions
and
16 deletions
+44
-16
sound/soc/sh/rcar/adg.c
sound/soc/sh/rcar/adg.c
+7
-0
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/core.c
+3
-4
sound/soc/sh/rcar/ssi.c
sound/soc/sh/rcar/ssi.c
+34
-12
No files found.
sound/soc/sh/rcar/adg.c
View file @
1a34ec4a
...
@@ -610,6 +610,13 @@ void rsnd_adg_remove(struct rsnd_priv *priv)
...
@@ -610,6 +610,13 @@ void rsnd_adg_remove(struct rsnd_priv *priv)
{
{
struct
device
*
dev
=
rsnd_priv_to_dev
(
priv
);
struct
device
*
dev
=
rsnd_priv_to_dev
(
priv
);
struct
device_node
*
np
=
dev
->
of_node
;
struct
device_node
*
np
=
dev
->
of_node
;
struct
rsnd_adg
*
adg
=
priv
->
adg
;
struct
clk
*
clk
;
int
i
;
for_each_rsnd_clkout
(
clk
,
adg
,
i
)
if
(
adg
->
clkout
[
i
])
clk_unregister_fixed_rate
(
adg
->
clkout
[
i
]);
of_clk_del_provider
(
np
);
of_clk_del_provider
(
np
);
...
...
sound/soc/sh/rcar/core.c
View file @
1a34ec4a
...
@@ -726,7 +726,6 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
...
@@ -726,7 +726,6 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
case
2
:
case
2
:
case
6
:
case
6
:
case
8
:
case
8
:
case
16
:
/* TDM Extend Mode */
/* TDM Extend Mode */
rsnd_rdai_channels_set
(
rdai
,
slots
);
rsnd_rdai_channels_set
(
rdai
,
slots
);
rsnd_rdai_ssi_lane_set
(
rdai
,
1
);
rsnd_rdai_ssi_lane_set
(
rdai
,
1
);
...
@@ -740,7 +739,7 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
...
@@ -740,7 +739,7 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
}
}
static
unsigned
int
rsnd_soc_hw_channels_list
[]
=
{
static
unsigned
int
rsnd_soc_hw_channels_list
[]
=
{
2
,
6
,
8
,
16
,
2
,
6
,
8
,
};
};
static
unsigned
int
rsnd_soc_hw_rate_list
[]
=
{
static
unsigned
int
rsnd_soc_hw_rate_list
[]
=
{
...
@@ -1017,7 +1016,7 @@ static void __rsnd_dai_probe(struct rsnd_priv *priv,
...
@@ -1017,7 +1016,7 @@ static void __rsnd_dai_probe(struct rsnd_priv *priv,
drv
->
playback
.
rates
=
RSND_RATES
;
drv
->
playback
.
rates
=
RSND_RATES
;
drv
->
playback
.
formats
=
RSND_FMTS
;
drv
->
playback
.
formats
=
RSND_FMTS
;
drv
->
playback
.
channels_min
=
2
;
drv
->
playback
.
channels_min
=
2
;
drv
->
playback
.
channels_max
=
16
;
drv
->
playback
.
channels_max
=
8
;
drv
->
playback
.
stream_name
=
rdai
->
playback
.
name
;
drv
->
playback
.
stream_name
=
rdai
->
playback
.
name
;
snprintf
(
rdai
->
capture
.
name
,
RSND_DAI_NAME_SIZE
,
snprintf
(
rdai
->
capture
.
name
,
RSND_DAI_NAME_SIZE
,
...
@@ -1025,7 +1024,7 @@ static void __rsnd_dai_probe(struct rsnd_priv *priv,
...
@@ -1025,7 +1024,7 @@ static void __rsnd_dai_probe(struct rsnd_priv *priv,
drv
->
capture
.
rates
=
RSND_RATES
;
drv
->
capture
.
rates
=
RSND_RATES
;
drv
->
capture
.
formats
=
RSND_FMTS
;
drv
->
capture
.
formats
=
RSND_FMTS
;
drv
->
capture
.
channels_min
=
2
;
drv
->
capture
.
channels_min
=
2
;
drv
->
capture
.
channels_max
=
16
;
drv
->
capture
.
channels_max
=
8
;
drv
->
capture
.
stream_name
=
rdai
->
capture
.
name
;
drv
->
capture
.
stream_name
=
rdai
->
capture
.
name
;
rdai
->
playback
.
rdai
=
rdai
;
rdai
->
playback
.
rdai
=
rdai
;
...
...
sound/soc/sh/rcar/ssi.c
View file @
1a34ec4a
...
@@ -72,6 +72,7 @@ struct rsnd_ssi {
...
@@ -72,6 +72,7 @@ struct rsnd_ssi {
u32
cr_own
;
u32
cr_own
;
u32
cr_clk
;
u32
cr_clk
;
u32
cr_mode
;
u32
cr_mode
;
u32
cr_en
;
u32
wsr
;
u32
wsr
;
int
chan
;
int
chan
;
int
rate
;
int
rate
;
...
@@ -291,6 +292,16 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
...
@@ -291,6 +292,16 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
/*
* SSI clock will be output contiguously
* by below settings.
* This means, rsnd_ssi_master_clk_start()
* and rsnd_ssi_register_setup() are necessary
* for SSI parent
*
* SSICR : FORCE, SCKD, SWSD
* SSIWSR : CONT
*/
ssi
->
cr_clk
=
FORCE
|
SWL_32
|
SCKD
|
SWSD
|
CKDV
(
idx
);
ssi
->
cr_clk
=
FORCE
|
SWL_32
|
SCKD
|
SWSD
|
CKDV
(
idx
);
ssi
->
wsr
=
CONT
;
ssi
->
wsr
=
CONT
;
ssi
->
rate
=
rate
;
ssi
->
rate
=
rate
;
...
@@ -393,7 +404,8 @@ static void rsnd_ssi_register_setup(struct rsnd_mod *mod)
...
@@ -393,7 +404,8 @@ static void rsnd_ssi_register_setup(struct rsnd_mod *mod)
rsnd_mod_write
(
mod
,
SSIWSR
,
ssi
->
wsr
);
rsnd_mod_write
(
mod
,
SSIWSR
,
ssi
->
wsr
);
rsnd_mod_write
(
mod
,
SSICR
,
ssi
->
cr_own
|
rsnd_mod_write
(
mod
,
SSICR
,
ssi
->
cr_own
|
ssi
->
cr_clk
|
ssi
->
cr_clk
|
ssi
->
cr_mode
);
/* without EN */
ssi
->
cr_mode
|
ssi
->
cr_en
);
}
}
static
void
rsnd_ssi_pointer_init
(
struct
rsnd_mod
*
mod
,
static
void
rsnd_ssi_pointer_init
(
struct
rsnd_mod
*
mod
,
...
@@ -544,6 +556,8 @@ static int rsnd_ssi_start(struct rsnd_mod *mod,
...
@@ -544,6 +556,8 @@ static int rsnd_ssi_start(struct rsnd_mod *mod,
struct
rsnd_dai_stream
*
io
,
struct
rsnd_dai_stream
*
io
,
struct
rsnd_priv
*
priv
)
struct
rsnd_priv
*
priv
)
{
{
struct
rsnd_ssi
*
ssi
=
rsnd_mod_to_ssi
(
mod
);
if
(
!
rsnd_ssi_is_run_mods
(
mod
,
io
))
if
(
!
rsnd_ssi_is_run_mods
(
mod
,
io
))
return
0
;
return
0
;
...
@@ -554,7 +568,19 @@ static int rsnd_ssi_start(struct rsnd_mod *mod,
...
@@ -554,7 +568,19 @@ static int rsnd_ssi_start(struct rsnd_mod *mod,
if
(
rsnd_ssi_multi_slaves_runtime
(
io
))
if
(
rsnd_ssi_multi_slaves_runtime
(
io
))
return
0
;
return
0
;
rsnd_mod_bset
(
mod
,
SSICR
,
EN
,
EN
);
/*
* EN is for data output.
* SSI parent EN is not needed.
*/
if
(
rsnd_ssi_is_parent
(
mod
,
io
))
return
0
;
ssi
->
cr_en
=
EN
;
rsnd_mod_write
(
mod
,
SSICR
,
ssi
->
cr_own
|
ssi
->
cr_clk
|
ssi
->
cr_mode
|
ssi
->
cr_en
);
return
0
;
return
0
;
}
}
...
@@ -569,13 +595,7 @@ static int rsnd_ssi_stop(struct rsnd_mod *mod,
...
@@ -569,13 +595,7 @@ static int rsnd_ssi_stop(struct rsnd_mod *mod,
if
(
!
rsnd_ssi_is_run_mods
(
mod
,
io
))
if
(
!
rsnd_ssi_is_run_mods
(
mod
,
io
))
return
0
;
return
0
;
/*
if
(
rsnd_ssi_is_parent
(
mod
,
io
))
* don't stop if not last user
* see also
* rsnd_ssi_start
* rsnd_ssi_interrupt
*/
if
(
ssi
->
usrcnt
>
1
)
return
0
;
return
0
;
/*
/*
...
@@ -595,6 +615,8 @@ static int rsnd_ssi_stop(struct rsnd_mod *mod,
...
@@ -595,6 +615,8 @@ static int rsnd_ssi_stop(struct rsnd_mod *mod,
rsnd_mod_write
(
mod
,
SSICR
,
cr
);
/* disabled all */
rsnd_mod_write
(
mod
,
SSICR
,
cr
);
/* disabled all */
rsnd_ssi_status_check
(
mod
,
IIRQ
);
rsnd_ssi_status_check
(
mod
,
IIRQ
);
ssi
->
cr_en
=
0
;
return
0
;
return
0
;
}
}
...
@@ -823,10 +845,10 @@ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
...
@@ -823,10 +845,10 @@ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
struct
rsnd_priv
*
priv
)
struct
rsnd_priv
*
priv
)
{
{
struct
rsnd_ssi
*
ssi
=
rsnd_mod_to_ssi
(
mod
);
struct
rsnd_ssi
*
ssi
=
rsnd_mod_to_ssi
(
mod
);
struct
rsnd_mod
*
ssi_parent_mod
=
rsnd_io_to_mod_ssip
(
io
);
struct
rsnd_mod
*
pure_ssi_mod
=
rsnd_io_to_mod_ssi
(
io
);
/* Do nothing
for SSI parent
mod */
/* Do nothing
if non SSI (= SSI parent, multi SSI)
mod */
if
(
ssi_parent_mod
=
=
mod
)
if
(
pure_ssi_mod
!
=
mod
)
return
0
;
return
0
;
/* PIO will request IRQ again */
/* PIO will request IRQ again */
...
...
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