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
43b64af5
Commit
43b64af5
authored
Dec 12, 2016
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/rcar' into asoc-next
parents
52708d05
b99258a3
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
516 additions
and
249 deletions
+516
-249
sound/soc/sh/Kconfig
sound/soc/sh/Kconfig
+2
-1
sound/soc/sh/rcar/adg.c
sound/soc/sh/rcar/adg.c
+37
-24
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/core.c
+128
-47
sound/soc/sh/rcar/dma.c
sound/soc/sh/rcar/dma.c
+195
-100
sound/soc/sh/rcar/dvc.c
sound/soc/sh/rcar/dvc.c
+0
-2
sound/soc/sh/rcar/gen.c
sound/soc/sh/rcar/gen.c
+10
-2
sound/soc/sh/rcar/rsnd.h
sound/soc/sh/rcar/rsnd.h
+100
-56
sound/soc/sh/rcar/src.c
sound/soc/sh/rcar/src.c
+8
-5
sound/soc/sh/rcar/ssi.c
sound/soc/sh/rcar/ssi.c
+16
-12
sound/soc/sh/rcar/ssiu.c
sound/soc/sh/rcar/ssiu.c
+20
-0
No files found.
sound/soc/sh/Kconfig
View file @
43b64af5
menu "SoC Audio support for SuperH"
depends on SUPERH || ARCH_SHMOBILE
depends on SUPERH || ARCH_SHMOBILE
|| COMPILE_TEST
config SND_SOC_PCM_SH7760
tristate "SoC Audio support for Renesas SH7760"
...
...
@@ -37,6 +37,7 @@ config SND_SOC_SH4_SIU
config SND_SOC_RCAR
tristate "R-Car series SRU/SCU/SSIU/SSI support"
depends on COMMON_CLK
depends on OF || COMPILE_TEST
select SND_SIMPLE_CARD
select REGMAP_MMIO
help
...
...
sound/soc/sh/rcar/adg.c
View file @
43b64af5
...
...
@@ -34,6 +34,9 @@ struct rsnd_adg {
struct
clk_onecell_data
onecell
;
struct
rsnd_mod
mod
;
u32
flags
;
u32
ckr
;
u32
rbga
;
u32
rbgb
;
int
rbga_rate_for_441khz
;
/* RBGA */
int
rbgb_rate_for_48khz
;
/* RBGB */
...
...
@@ -316,9 +319,11 @@ int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate)
struct
rsnd_priv
*
priv
=
rsnd_mod_to_priv
(
ssi_mod
);
struct
rsnd_adg
*
adg
=
rsnd_priv_to_adg
(
priv
);
struct
device
*
dev
=
rsnd_priv_to_dev
(
priv
);
struct
rsnd_mod
*
adg_mod
=
rsnd_mod_get
(
adg
);
struct
clk
*
clk
;
int
i
;
u32
data
;
u32
ckr
=
0
;
int
sel_table
[]
=
{
[
CLKA
]
=
0x1
,
[
CLKB
]
=
0x2
,
...
...
@@ -360,15 +365,14 @@ int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate)
rsnd_adg_set_ssi_clk
(
ssi_mod
,
data
);
if
(
!
(
adg_mode_flags
(
adg
)
&
LRCLK_ASYNC
))
{
struct
rsnd_mod
*
adg_mod
=
rsnd_mod_get
(
adg
);
u32
ckr
=
0
;
if
(
0
==
(
rate
%
8000
))
ckr
=
0x80000000
;
rsnd_mod_bset
(
adg_mod
,
SSICKR
,
0x80000000
,
ckr
);
}
rsnd_mod_bset
(
adg_mod
,
BRGCKR
,
0x80FF0000
,
adg
->
ckr
|
ckr
);
rsnd_mod_write
(
adg_mod
,
BRRA
,
adg
->
rbga
);
rsnd_mod_write
(
adg_mod
,
BRRB
,
adg
->
rbgb
);
dev_dbg
(
dev
,
"ADG: %s[%d] selects 0x%x for %d
\n
"
,
rsnd_mod_name
(
ssi_mod
),
rsnd_mod_id
(
ssi_mod
),
data
,
rate
);
...
...
@@ -376,6 +380,25 @@ int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate)
return
0
;
}
void
rsnd_adg_clk_control
(
struct
rsnd_priv
*
priv
,
int
enable
)
{
struct
rsnd_adg
*
adg
=
rsnd_priv_to_adg
(
priv
);
struct
device
*
dev
=
rsnd_priv_to_dev
(
priv
);
struct
clk
*
clk
;
int
i
,
ret
;
for_each_rsnd_clk
(
clk
,
adg
,
i
)
{
ret
=
0
;
if
(
enable
)
ret
=
clk_prepare_enable
(
clk
);
else
clk_disable_unprepare
(
clk
);
if
(
ret
<
0
)
dev_warn
(
dev
,
"can't use clk %d
\n
"
,
i
);
}
}
static
void
rsnd_adg_get_clkin
(
struct
rsnd_priv
*
priv
,
struct
rsnd_adg
*
adg
)
{
...
...
@@ -387,27 +410,21 @@ static void rsnd_adg_get_clkin(struct rsnd_priv *priv,
[
CLKC
]
=
"clk_c"
,
[
CLKI
]
=
"clk_i"
,
};
int
i
,
ret
;
int
i
;
for
(
i
=
0
;
i
<
CLKMAX
;
i
++
)
{
clk
=
devm_clk_get
(
dev
,
clk_name
[
i
]);
adg
->
clk
[
i
]
=
IS_ERR
(
clk
)
?
NULL
:
clk
;
}
for_each_rsnd_clk
(
clk
,
adg
,
i
)
{
ret
=
clk_prepare_enable
(
clk
);
if
(
ret
<
0
)
dev_warn
(
dev
,
"can't use clk %d
\n
"
,
i
);
for_each_rsnd_clk
(
clk
,
adg
,
i
)
dev_dbg
(
dev
,
"clk %d : %p : %ld
\n
"
,
i
,
clk
,
clk_get_rate
(
clk
));
}
}
static
void
rsnd_adg_get_clkout
(
struct
rsnd_priv
*
priv
,
struct
rsnd_adg
*
adg
)
{
struct
clk
*
clk
;
struct
rsnd_mod
*
adg_mod
=
rsnd_mod_get
(
adg
);
struct
device
*
dev
=
rsnd_priv_to_dev
(
priv
);
struct
device_node
*
np
=
dev
->
of_node
;
u32
ckr
,
rbgx
,
rbga
,
rbgb
;
...
...
@@ -532,13 +549,13 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
}
}
rsnd_mod_bset
(
adg_mod
,
SSICKR
,
0x80FF0000
,
ckr
)
;
rsnd_mod_write
(
adg_mod
,
BRRA
,
rbga
)
;
rsnd_mod_write
(
adg_mod
,
BRRB
,
rbgb
)
;
adg
->
ckr
=
ckr
;
adg
->
rbga
=
rbga
;
adg
->
rbgb
=
rbgb
;
for_each_rsnd_clkout
(
clk
,
adg
,
i
)
dev_dbg
(
dev
,
"clkout %d : %p : %ld
\n
"
,
i
,
clk
,
clk_get_rate
(
clk
));
dev_dbg
(
dev
,
"
SSI
CKR = 0x%08x, BRRA/BRRB = 0x%x/0x%x
\n
"
,
dev_dbg
(
dev
,
"
BRG
CKR = 0x%08x, BRRA/BRRB = 0x%x/0x%x
\n
"
,
ckr
,
rbga
,
rbgb
);
}
...
...
@@ -565,16 +582,12 @@ int rsnd_adg_probe(struct rsnd_priv *priv)
priv
->
adg
=
adg
;
rsnd_adg_clk_enable
(
priv
);
return
0
;
}
void
rsnd_adg_remove
(
struct
rsnd_priv
*
priv
)
{
struct
rsnd_adg
*
adg
=
rsnd_priv_to_adg
(
priv
);
struct
clk
*
clk
;
int
i
;
for_each_rsnd_clk
(
clk
,
adg
,
i
)
{
clk_disable_unprepare
(
clk
);
}
rsnd_adg_clk_disable
(
priv
);
}
sound/soc/sh/rcar/core.c
View file @
43b64af5
...
...
@@ -306,7 +306,7 @@ u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
*/
u32
rsnd_get_dalign
(
struct
rsnd_mod
*
mod
,
struct
rsnd_dai_stream
*
io
)
{
struct
rsnd_mod
*
ssi
=
rsnd_io_to_mod_ssi
(
io
);
struct
rsnd_mod
*
ssi
u
=
rsnd_io_to_mod_ssiu
(
io
);
struct
rsnd_mod
*
target
;
struct
snd_pcm_runtime
*
runtime
=
rsnd_io_to_runtime
(
io
);
u32
val
=
0x76543210
;
...
...
@@ -315,11 +315,11 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
if
(
rsnd_io_is_play
(
io
))
{
struct
rsnd_mod
*
src
=
rsnd_io_to_mod_src
(
io
);
target
=
src
?
src
:
ssi
;
target
=
src
?
src
:
ssi
u
;
}
else
{
struct
rsnd_mod
*
cmd
=
rsnd_io_to_mod_cmd
(
io
);
target
=
cmd
?
cmd
:
ssi
;
target
=
cmd
?
cmd
:
ssi
u
;
}
mask
<<=
runtime
->
channels
*
4
;
...
...
@@ -348,32 +348,28 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
/*
* rsnd_dai functions
*/
#define rsnd_mod_call(idx, io, func, param...) \
({ \
struct rsnd_priv *priv = rsnd_mod_to_priv(mod); \
struct rsnd_mod *mod = (io)->mod[idx]; \
struct device *dev = rsnd_priv_to_dev(priv); \
u32 *status = mod->get_status(io, mod, idx); \
u32 mask = 0xF << __rsnd_mod_shift_##func; \
u8 val = (*status >> __rsnd_mod_shift_##func) & 0xF; \
u8 add = ((val + __rsnd_mod_add_##func) & 0xF); \
int ret = 0; \
int call = (val == __rsnd_mod_call_##func) && (mod)->ops->func; \
if (add == 0xF) \
call = 0; \
else \
*status = (*status & ~mask) + \
(add << __rsnd_mod_shift_##func); \
dev_dbg(dev, "%s[%d]\t0x%08x %s\n", \
rsnd_mod_name(mod), rsnd_mod_id(mod), \
*status, call ? #func : ""); \
if (call) \
ret = (mod)->ops->func(mod, io, param); \
if (ret) \
dev_dbg(dev, "%s[%d] : rsnd_mod_call error %d\n", \
rsnd_mod_name(mod), rsnd_mod_id(mod), ret); \
ret; \
})
struct
rsnd_mod
*
rsnd_mod_next
(
int
*
iterator
,
struct
rsnd_dai_stream
*
io
,
enum
rsnd_mod_type
*
array
,
int
array_size
)
{
struct
rsnd_mod
*
mod
;
enum
rsnd_mod_type
type
;
int
max
=
array
?
array_size
:
RSND_MOD_MAX
;
for
(;
*
iterator
<
max
;
(
*
iterator
)
++
)
{
type
=
(
array
)
?
array
[
*
iterator
]
:
*
iterator
;
mod
=
io
->
mod
[
type
];
if
(
!
mod
)
continue
;
(
*
iterator
)
++
;
return
mod
;
}
return
NULL
;
}
static
enum
rsnd_mod_type
rsnd_mod_sequence
[][
RSND_MOD_MAX
]
=
{
{
...
...
@@ -409,19 +405,49 @@ static enum rsnd_mod_type rsnd_mod_sequence[][RSND_MOD_MAX] = {
},
};
#define rsnd_dai_call(fn, io, param...) \
({ \
struct rsnd_mod *mod; \
int type, is_play = rsnd_io_is_play(io); \
int ret = 0, i; \
for (i = 0; i < RSND_MOD_MAX; i++) { \
type = rsnd_mod_sequence[is_play][i]; \
mod = (io)->mod[type]; \
if (!mod) \
continue; \
ret |= rsnd_mod_call(type, io, fn, param); \
} \
ret; \
static
int
rsnd_status_update
(
u32
*
status
,
int
shift
,
int
add
,
int
timing
)
{
u32
mask
=
0xF
<<
shift
;
u8
val
=
(
*
status
>>
shift
)
&
0xF
;
u8
next_val
=
(
val
+
add
)
&
0xF
;
int
func_call
=
(
val
==
timing
);
if
(
next_val
==
0xF
)
/* underflow case */
func_call
=
0
;
else
*
status
=
(
*
status
&
~
mask
)
+
(
next_val
<<
shift
);
return
func_call
;
}
#define rsnd_dai_call(fn, io, param...) \
({ \
struct rsnd_priv *priv = rsnd_io_to_priv(io); \
struct device *dev = rsnd_priv_to_dev(priv); \
struct rsnd_mod *mod; \
int is_play = rsnd_io_is_play(io); \
int ret = 0, i; \
enum rsnd_mod_type *types = rsnd_mod_sequence[is_play]; \
for_each_rsnd_mod_arrays(i, mod, io, types, RSND_MOD_MAX) { \
int tmp = 0; \
u32 *status = mod->get_status(io, mod, types[i]); \
int func_call = rsnd_status_update(status, \
__rsnd_mod_shift_##fn, \
__rsnd_mod_add_##fn, \
__rsnd_mod_call_##fn); \
dev_dbg(dev, "%s[%d]\t0x%08x %s\n", \
rsnd_mod_name(mod), rsnd_mod_id(mod), *status, \
(func_call && (mod)->ops->fn) ? #fn : ""); \
if (func_call && (mod)->ops->fn) \
tmp = (mod)->ops->fn(mod, io, param); \
if (tmp) \
dev_err(dev, "%s[%d] : %s error %d\n", \
rsnd_mod_name(mod), rsnd_mod_id(mod), \
#fn, tmp); \
ret |= tmp; \
} \
ret; \
})
int
rsnd_dai_connect
(
struct
rsnd_mod
*
mod
,
...
...
@@ -690,7 +716,33 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
return
0
;
}
static
int
rsnd_soc_dai_startup
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
{
struct
rsnd_dai
*
rdai
=
rsnd_dai_to_rdai
(
dai
);
struct
rsnd_dai_stream
*
io
=
rsnd_rdai_to_io
(
rdai
,
substream
);
/*
* call rsnd_dai_call without spinlock
*/
return
rsnd_dai_call
(
nolock_start
,
io
,
priv
);
}
static
void
rsnd_soc_dai_shutdown
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
{
struct
rsnd_dai
*
rdai
=
rsnd_dai_to_rdai
(
dai
);
struct
rsnd_dai_stream
*
io
=
rsnd_rdai_to_io
(
rdai
,
substream
);
/*
* call rsnd_dai_call without spinlock
*/
rsnd_dai_call
(
nolock_stop
,
io
,
priv
);
}
static
const
struct
snd_soc_dai_ops
rsnd_soc_dai_ops
=
{
.
startup
=
rsnd_soc_dai_startup
,
.
shutdown
=
rsnd_soc_dai_shutdown
,
.
trigger
=
rsnd_soc_dai_trigger
,
.
set_fmt
=
rsnd_soc_dai_set_fmt
,
.
set_tdm_slot
=
rsnd_soc_set_dai_tdm_slot
,
...
...
@@ -993,7 +1045,11 @@ static int __rsnd_kctrl_new(struct rsnd_mod *mod,
void
_rsnd_kctrl_remove
(
struct
rsnd_kctrl_cfg
*
cfg
)
{
snd_ctl_remove
(
cfg
->
card
,
cfg
->
kctrl
);
if
(
cfg
->
card
&&
cfg
->
kctrl
)
snd_ctl_remove
(
cfg
->
card
,
cfg
->
kctrl
);
cfg
->
card
=
NULL
;
cfg
->
kctrl
=
NULL
;
}
int
rsnd_kctrl_new_m
(
struct
rsnd_mod
*
mod
,
...
...
@@ -1070,8 +1126,8 @@ static int rsnd_pcm_new(struct snd_soc_pcm_runtime *rtd)
return
snd_pcm_lib_preallocate_pages_for_all
(
rtd
->
pcm
,
SNDRV_DMA_TYPE_
DEV
,
rtd
->
card
->
snd_card
->
dev
,
SNDRV_DMA_TYPE_
CONTINUOUS
,
snd_dma_continuous_data
(
GFP_KERNEL
)
,
PREALLOC_BUFFER
,
PREALLOC_BUFFER_MAX
);
}
...
...
@@ -1092,6 +1148,7 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
ret
=
rsnd_dai_call
(
probe
,
io
,
priv
);
if
(
ret
==
-
EAGAIN
)
{
struct
rsnd_mod
*
ssi_mod
=
rsnd_io_to_mod_ssi
(
io
);
struct
rsnd_mod
*
mod
;
int
i
;
/*
...
...
@@ -1111,8 +1168,8 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
* remove all mod from io
* and, re connect ssi
*/
for
(
i
=
0
;
i
<
RSND_MOD_MAX
;
i
++
)
rsnd_dai_disconnect
(
(
io
)
->
mod
[
i
]
,
io
,
i
);
for
_each_rsnd_mod
(
i
,
mod
,
io
)
rsnd_dai_disconnect
(
mod
,
io
,
i
);
rsnd_dai_connect
(
ssi_mod
,
io
,
RSND_MOD_SSI
);
/*
...
...
@@ -1251,9 +1308,33 @@ static int rsnd_remove(struct platform_device *pdev)
return
ret
;
}
static
int
rsnd_suspend
(
struct
device
*
dev
)
{
struct
rsnd_priv
*
priv
=
dev_get_drvdata
(
dev
);
rsnd_adg_clk_disable
(
priv
);
return
0
;
}
static
int
rsnd_resume
(
struct
device
*
dev
)
{
struct
rsnd_priv
*
priv
=
dev_get_drvdata
(
dev
);
rsnd_adg_clk_enable
(
priv
);
return
0
;
}
static
struct
dev_pm_ops
rsnd_pm_ops
=
{
.
suspend
=
rsnd_suspend
,
.
resume
=
rsnd_resume
,
};
static
struct
platform_driver
rsnd_driver
=
{
.
driver
=
{
.
name
=
"rcar_sound"
,
.
pm
=
&
rsnd_pm_ops
,
.
of_match_table
=
rsnd_of_match
,
},
.
probe
=
rsnd_probe
,
...
...
sound/soc/sh/rcar/dma.c
View file @
43b64af5
This diff is collapsed.
Click to expand it.
sound/soc/sh/rcar/dvc.c
View file @
43b64af5
...
...
@@ -48,8 +48,6 @@ struct rsnd_dvc {
#define rsnd_dvc_get(priv, id) ((struct rsnd_dvc *)(priv->dvc) + id)
#define rsnd_dvc_nr(priv) ((priv)->dvc_nr)
#define rsnd_dvc_of_node(priv) \
of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dvc")
#define rsnd_mod_to_dvc(_mod) \
container_of((_mod), struct rsnd_dvc, mod)
...
...
sound/soc/sh/rcar/gen.c
View file @
43b64af5
...
...
@@ -211,6 +211,14 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv)
RSND_GEN_S_REG
(
SSI_MODE1
,
0x804
),
RSND_GEN_S_REG
(
SSI_MODE2
,
0x808
),
RSND_GEN_S_REG
(
SSI_CONTROL
,
0x810
),
RSND_GEN_S_REG
(
SSI_SYS_STATUS0
,
0x840
),
RSND_GEN_S_REG
(
SSI_SYS_STATUS1
,
0x844
),
RSND_GEN_S_REG
(
SSI_SYS_STATUS2
,
0x848
),
RSND_GEN_S_REG
(
SSI_SYS_STATUS3
,
0x84c
),
RSND_GEN_S_REG
(
SSI_SYS_STATUS4
,
0x880
),
RSND_GEN_S_REG
(
SSI_SYS_STATUS5
,
0x884
),
RSND_GEN_S_REG
(
SSI_SYS_STATUS6
,
0x888
),
RSND_GEN_S_REG
(
SSI_SYS_STATUS7
,
0x88c
),
/* FIXME: it needs SSI_MODE2/3 in the future */
RSND_GEN_M_REG
(
SSI_BUSIF_MODE
,
0x0
,
0x80
),
...
...
@@ -311,7 +319,7 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv)
static
const
struct
rsnd_regmap_field_conf
conf_adg
[]
=
{
RSND_GEN_S_REG
(
BRRA
,
0x00
),
RSND_GEN_S_REG
(
BRRB
,
0x04
),
RSND_GEN_S_REG
(
SSI
CKR
,
0x08
),
RSND_GEN_S_REG
(
BRG
CKR
,
0x08
),
RSND_GEN_S_REG
(
AUDIO_CLK_SEL0
,
0x0c
),
RSND_GEN_S_REG
(
AUDIO_CLK_SEL1
,
0x10
),
RSND_GEN_S_REG
(
AUDIO_CLK_SEL2
,
0x14
),
...
...
@@ -362,7 +370,7 @@ static int rsnd_gen1_probe(struct rsnd_priv *priv)
static
const
struct
rsnd_regmap_field_conf
conf_adg
[]
=
{
RSND_GEN_S_REG
(
BRRA
,
0x00
),
RSND_GEN_S_REG
(
BRRB
,
0x04
),
RSND_GEN_S_REG
(
SSI
CKR
,
0x08
),
RSND_GEN_S_REG
(
BRG
CKR
,
0x08
),
RSND_GEN_S_REG
(
AUDIO_CLK_SEL0
,
0x0c
),
RSND_GEN_S_REG
(
AUDIO_CLK_SEL1
,
0x10
),
};
...
...
sound/soc/sh/rcar/rsnd.h
View file @
43b64af5
This diff is collapsed.
Click to expand it.
sound/soc/sh/rcar/src.c
View file @
43b64af5
...
...
@@ -189,6 +189,7 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
struct
rsnd_priv
*
priv
=
rsnd_mod_to_priv
(
mod
);
struct
device
*
dev
=
rsnd_priv_to_dev
(
priv
);
struct
snd_pcm_runtime
*
runtime
=
rsnd_io_to_runtime
(
io
);
int
use_src
=
0
;
u32
fin
,
fout
;
u32
ifscr
,
fsrate
,
adinr
;
u32
cr
,
route
;
...
...
@@ -214,6 +215,8 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
return
;
}
use_src
=
(
fin
!=
fout
)
|
rsnd_src_sync_is_enabled
(
mod
);
/*
* SRC_ADINR
*/
...
...
@@ -225,7 +228,7 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
*/
ifscr
=
0
;
fsrate
=
0
;
if
(
fin
!=
fout
)
{
if
(
use_src
)
{
u64
n
;
ifscr
=
1
;
...
...
@@ -239,7 +242,7 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
*/
cr
=
0x00011110
;
route
=
0x0
;
if
(
fin
!=
fout
)
{
if
(
use_src
)
{
route
=
0x1
;
if
(
rsnd_src_sync_is_enabled
(
mod
))
{
...
...
@@ -327,8 +330,8 @@ static void rsnd_src_status_clear(struct rsnd_mod *mod)
{
u32
val
=
OUF_SRC
(
rsnd_mod_id
(
mod
));
rsnd_mod_
bset
(
mod
,
SCU_SYS_STATUS0
,
val
,
val
);
rsnd_mod_
bset
(
mod
,
SCU_SYS_STATUS1
,
val
,
val
);
rsnd_mod_
write
(
mod
,
SCU_SYS_STATUS0
,
val
);
rsnd_mod_
write
(
mod
,
SCU_SYS_STATUS1
,
val
);
}
static
bool
rsnd_src_error_occurred
(
struct
rsnd_mod
*
mod
)
...
...
@@ -475,7 +478,7 @@ static int rsnd_src_probe_(struct rsnd_mod *mod,
return
ret
;
}
ret
=
rsnd_dma_attach
(
io
,
mod
,
&
src
->
dma
,
0
);
ret
=
rsnd_dma_attach
(
io
,
mod
,
&
src
->
dma
);
return
ret
;
}
...
...
sound/soc/sh/rcar/ssi.c
View file @
43b64af5
...
...
@@ -417,11 +417,14 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
int
chan
=
params_channels
(
params
);
/*
* Already working.
* It will happen if SSI has parent/child connection.
* snd_pcm_ops::hw_params will be called *before*
* snd_soc_dai_ops::trigger. Thus, ssi->usrcnt is 0
* in 1st call.
*/
if
(
ssi
->
usrcnt
>
1
)
{
if
(
ssi
->
usrcnt
)
{
/*
* Already working.
* It will happen if SSI has parent/child connection.
* it is error if child <-> parent SSI uses
* different channels.
*/
...
...
@@ -644,10 +647,14 @@ static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
if
(
ret
<
0
)
return
ret
;
ret
=
devm_request_irq
(
dev
,
ssi
->
irq
,
rsnd_ssi_interrupt
,
IRQF_SHARED
,
dev_name
(
dev
),
mod
);
/*
* SSI might be called again as PIO fallback
* It is easy to manual handling for IRQ request/free
*/
ret
=
request_irq
(
ssi
->
irq
,
rsnd_ssi_interrupt
,
IRQF_SHARED
,
dev_name
(
dev
),
mod
);
return
ret
;
}
...
...
@@ -669,7 +676,6 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
struct
rsnd_priv
*
priv
)
{
struct
rsnd_ssi
*
ssi
=
rsnd_mod_to_ssi
(
mod
);
int
dma_id
=
0
;
/* not needed */
int
ret
;
/*
...
...
@@ -684,7 +690,7 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
return
ret
;
/* SSI probe might be called many times in MUX multi path */
ret
=
rsnd_dma_attach
(
io
,
mod
,
&
ssi
->
dma
,
dma_id
);
ret
=
rsnd_dma_attach
(
io
,
mod
,
&
ssi
->
dma
);
return
ret
;
}
...
...
@@ -694,11 +700,9 @@ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
struct
rsnd_priv
*
priv
)
{
struct
rsnd_ssi
*
ssi
=
rsnd_mod_to_ssi
(
mod
);
struct
device
*
dev
=
rsnd_priv_to_dev
(
priv
);
int
irq
=
ssi
->
irq
;
/* PIO will request IRQ again */
devm_free_irq
(
dev
,
irq
,
mod
);
free_irq
(
ssi
->
irq
,
mod
);
return
0
;
}
...
...
sound/soc/sh/rcar/ssiu.c
View file @
43b64af5
...
...
@@ -33,6 +33,26 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod,
u32
mask1
,
val1
;
u32
mask2
,
val2
;
/* clear status */
switch
(
id
)
{
case
0
:
case
1
:
case
2
:
case
3
:
case
4
:
rsnd_mod_write
(
mod
,
SSI_SYS_STATUS0
,
0xf
<<
(
id
*
4
));
rsnd_mod_write
(
mod
,
SSI_SYS_STATUS2
,
0xf
<<
(
id
*
4
));
rsnd_mod_write
(
mod
,
SSI_SYS_STATUS4
,
0xf
<<
(
id
*
4
));
rsnd_mod_write
(
mod
,
SSI_SYS_STATUS6
,
0xf
<<
(
id
*
4
));
break
;
case
9
:
rsnd_mod_write
(
mod
,
SSI_SYS_STATUS1
,
0xf
<<
4
);
rsnd_mod_write
(
mod
,
SSI_SYS_STATUS3
,
0xf
<<
4
);
rsnd_mod_write
(
mod
,
SSI_SYS_STATUS5
,
0xf
<<
4
);
rsnd_mod_write
(
mod
,
SSI_SYS_STATUS7
,
0xf
<<
4
);
break
;
}
/*
* SSI_MODE0
*/
...
...
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