Commit 83b220cf authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown

ASoC: rsnd: implement BUSIF related code in ssiu.c

BUSIF is SSIU feature, but its related code is
implemented at ssi.c today.
This patch moves it to ssiu.c
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Message-Id: <87v974lwy9.wl-kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b43b8ae8
...@@ -810,6 +810,7 @@ void rsnd_parse_connect_ssiu(struct rsnd_dai *rdai, ...@@ -810,6 +810,7 @@ void rsnd_parse_connect_ssiu(struct rsnd_dai *rdai,
struct device_node *playback, struct device_node *playback,
struct device_node *capture); struct device_node *capture);
#define rsnd_ssiu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSIU) #define rsnd_ssiu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSIU)
bool rsnd_ssiu_busif_err_status_clear(struct rsnd_mod *mod);
/* /*
* R-Car SRC * R-Car SRC
......
...@@ -357,96 +357,6 @@ static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod, ...@@ -357,96 +357,6 @@ static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod,
rsnd_adg_ssi_clk_stop(mod); rsnd_adg_ssi_clk_stop(mod);
} }
/* enable busif buffer over/under run interrupt. */
#define rsnd_ssi_busif_err_irq_enable(mod) rsnd_ssi_busif_err_irq_ctrl(mod, 1)
#define rsnd_ssi_busif_err_irq_disable(mod) rsnd_ssi_busif_err_irq_ctrl(mod, 0)
static void rsnd_ssi_busif_err_irq_ctrl(struct rsnd_mod *mod, int enable)
{
u32 sys_int_enable = 0;
int id = rsnd_mod_id(mod);
int i;
switch (id) {
case 0:
case 1:
case 2:
case 3:
case 4:
for (i = 0; i < 4; i++) {
sys_int_enable = rsnd_mod_read(mod, SSI_SYS_INT_ENABLE(i * 2));
if (enable)
sys_int_enable |= 0xf << (id * 4);
else
sys_int_enable &= ~(0xf << (id * 4));
rsnd_mod_write(mod,
SSI_SYS_INT_ENABLE(i * 2),
sys_int_enable);
}
break;
case 9:
for (i = 0; i < 4; i++) {
sys_int_enable = rsnd_mod_read(mod, SSI_SYS_INT_ENABLE((i * 2) + 1));
if (enable)
sys_int_enable |= 0xf << 4;
else
sys_int_enable &= ~(0xf << 4);
rsnd_mod_write(mod,
SSI_SYS_INT_ENABLE((i * 2) + 1),
sys_int_enable);
}
break;
}
}
static bool rsnd_ssi_busif_err_status_clear(struct rsnd_mod *mod)
{
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
struct device *dev = rsnd_priv_to_dev(priv);
u32 status;
bool stop = false;
int id = rsnd_mod_id(mod);
int i;
switch (id) {
case 0:
case 1:
case 2:
case 3:
case 4:
for (i = 0; i < 4; i++) {
status = rsnd_mod_read(mod, SSI_SYS_STATUS(i * 2));
status &= 0xf << (id * 4);
if (status) {
rsnd_print_irq_status(dev, "%s err status : 0x%08x\n",
rsnd_mod_name(mod), status);
rsnd_mod_write(mod,
SSI_SYS_STATUS(i * 2),
0xf << (id * 4));
stop = true;
}
}
break;
case 9:
for (i = 0; i < 4; i++) {
status = rsnd_mod_read(mod, SSI_SYS_STATUS((i * 2) + 1));
status &= 0xf << 4;
if (status) {
rsnd_print_irq_status(dev, "%s err status : 0x%08x\n",
rsnd_mod_name(mod), status);
rsnd_mod_write(mod,
SSI_SYS_STATUS((i * 2) + 1),
0xf << 4);
stop = true;
}
}
break;
}
return stop;
}
static void rsnd_ssi_config_init(struct rsnd_mod *mod, static void rsnd_ssi_config_init(struct rsnd_mod *mod,
struct rsnd_dai_stream *io) struct rsnd_dai_stream *io)
{ {
...@@ -534,9 +444,6 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod, ...@@ -534,9 +444,6 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod,
cr_mode = DIEN; /* PIO : enable Data interrupt */ cr_mode = DIEN; /* PIO : enable Data interrupt */
} }
/* enable busif buffer over/under run interrupt. */
rsnd_ssi_busif_err_irq_enable(mod);
init_end: init_end:
ssi->cr_own = cr_own; ssi->cr_own = cr_own;
ssi->cr_mode = cr_mode; ssi->cr_mode = cr_mode;
...@@ -612,9 +519,6 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod, ...@@ -612,9 +519,6 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
ssi->wsr = 0; ssi->wsr = 0;
} }
/* disable busif buffer over/under run interrupt. */
rsnd_ssi_busif_err_irq_disable(mod);
return 0; return 0;
} }
...@@ -788,7 +692,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, ...@@ -788,7 +692,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
stop = true; stop = true;
} }
stop |= rsnd_ssi_busif_err_status_clear(mod); stop |= rsnd_ssiu_busif_err_status_clear(mod);
rsnd_ssi_status_clear(mod); rsnd_ssi_status_clear(mod);
rsnd_ssi_interrupt_out: rsnd_ssi_interrupt_out:
......
...@@ -45,6 +45,92 @@ struct rsnd_ssiu { ...@@ -45,6 +45,92 @@ struct rsnd_ssiu {
static const int gen2_id[] = { 0, 4, 8, 12, 13, 14, 15, 16, 17, 18 }; static const int gen2_id[] = { 0, 4, 8, 12, 13, 14, 15, 16, 17, 18 };
static const int gen3_id[] = { 0, 8, 16, 24, 32, 40, 41, 42, 43, 44 }; static const int gen3_id[] = { 0, 8, 16, 24, 32, 40, 41, 42, 43, 44 };
/* enable busif buffer over/under run interrupt. */
#define rsnd_ssiu_busif_err_irq_enable(mod) rsnd_ssiu_busif_err_irq_ctrl(mod, 1)
#define rsnd_ssiu_busif_err_irq_disable(mod) rsnd_ssiu_busif_err_irq_ctrl(mod, 0)
static void rsnd_ssiu_busif_err_irq_ctrl(struct rsnd_mod *mod, int enable)
{
u32 sys_int_enable = 0;
int id = rsnd_mod_id(mod);
int i;
switch (id) {
case 0:
case 1:
case 2:
case 3:
case 4:
for (i = 0; i < 4; i++) {
sys_int_enable = rsnd_mod_read(mod, SSI_SYS_INT_ENABLE(i * 2));
if (enable)
sys_int_enable |= 0xf << (id * 4);
else
sys_int_enable &= ~(0xf << (id * 4));
rsnd_mod_write(mod,
SSI_SYS_INT_ENABLE(i * 2),
sys_int_enable);
}
break;
case 9:
for (i = 0; i < 4; i++) {
sys_int_enable = rsnd_mod_read(mod, SSI_SYS_INT_ENABLE((i * 2) + 1));
if (enable)
sys_int_enable |= 0xf << 4;
else
sys_int_enable &= ~(0xf << 4);
rsnd_mod_write(mod,
SSI_SYS_INT_ENABLE((i * 2) + 1),
sys_int_enable);
}
break;
}
}
bool rsnd_ssiu_busif_err_status_clear(struct rsnd_mod *mod)
{
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
struct device *dev = rsnd_priv_to_dev(priv);
u32 status;
bool error = false;
int id = rsnd_mod_id(mod);
int i;
switch (id) {
case 0:
case 1:
case 2:
case 3:
case 4:
for (i = 0; i < 4; i++) {
status = rsnd_mod_read(mod, SSI_SYS_STATUS(i * 2));
status &= 0xf << (id * 4);
if (status) {
rsnd_print_irq_status(dev, "%s err status : 0x%08x\n",
rsnd_mod_name(mod), status);
error = true;
}
rsnd_mod_write(mod, SSI_SYS_STATUS(i * 2), 0xf << (id * 4));
}
break;
case 9:
for (i = 0; i < 4; i++) {
status = rsnd_mod_read(mod, SSI_SYS_STATUS((i * 2) + 1));
status &= 0xf << 4;
if (status) {
rsnd_print_irq_status(dev, "%s err status : 0x%08x\n",
rsnd_mod_name(mod), status);
error = true;
}
rsnd_mod_write(mod, SSI_SYS_STATUS((i * 2) + 1), 0xf << 4);
}
break;
}
return error;
}
static u32 *rsnd_ssiu_get_status(struct rsnd_mod *mod, static u32 *rsnd_ssiu_get_status(struct rsnd_mod *mod,
struct rsnd_dai_stream *io, struct rsnd_dai_stream *io,
enum rsnd_mod_type type) enum rsnd_mod_type type)
...@@ -65,23 +151,9 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod, ...@@ -65,23 +151,9 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod,
int id = rsnd_mod_id(mod); int id = rsnd_mod_id(mod);
int is_clk_master = rsnd_rdai_is_clk_master(rdai); int is_clk_master = rsnd_rdai_is_clk_master(rdai);
u32 val1, val2; u32 val1, val2;
int i;
/* clear status */ /* clear status */
switch (id) { rsnd_ssiu_busif_err_status_clear(mod);
case 0:
case 1:
case 2:
case 3:
case 4:
for (i = 0; i < 4; i++)
rsnd_mod_write(mod, SSI_SYS_STATUS(i * 2), 0xf << (id * 4));
break;
case 9:
for (i = 0; i < 4; i++)
rsnd_mod_write(mod, SSI_SYS_STATUS((i * 2) + 1), 0xf << 4);
break;
}
/* /*
* SSI_MODE0 * SSI_MODE0
...@@ -137,12 +209,31 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod, ...@@ -137,12 +209,31 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod,
rsnd_mod_bset(mod, SSI_MODE1, 0x0013001f, val1); rsnd_mod_bset(mod, SSI_MODE1, 0x0013001f, val1);
rsnd_mod_bset(mod, SSI_MODE2, 0x00000017, val2); rsnd_mod_bset(mod, SSI_MODE2, 0x00000017, val2);
/*
* Enable busif buffer over/under run interrupt.
* It will be handled from ssi.c
* see
* __rsnd_ssi_interrupt()
*/
rsnd_ssiu_busif_err_irq_enable(mod);
return 0;
}
static int rsnd_ssiu_quit(struct rsnd_mod *mod,
struct rsnd_dai_stream *io,
struct rsnd_priv *priv)
{
/* disable busif buffer over/under run interrupt. */
rsnd_ssiu_busif_err_irq_disable(mod);
return 0; return 0;
} }
static struct rsnd_mod_ops rsnd_ssiu_ops_gen1 = { static struct rsnd_mod_ops rsnd_ssiu_ops_gen1 = {
.name = SSIU_NAME, .name = SSIU_NAME,
.init = rsnd_ssiu_init, .init = rsnd_ssiu_init,
.quit = rsnd_ssiu_quit,
.get_status = rsnd_ssiu_get_status, .get_status = rsnd_ssiu_get_status,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment