forked from Minki/linux
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: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Message-Id: <87v974lwy9.wl-kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
b43b8ae87c
commit
83b220cf8e
@ -810,6 +810,7 @@ void rsnd_parse_connect_ssiu(struct rsnd_dai *rdai,
|
||||
struct device_node *playback,
|
||||
struct device_node *capture);
|
||||
#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
|
||||
|
@ -357,96 +357,6 @@ static void rsnd_ssi_master_clk_stop(struct rsnd_mod *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,
|
||||
struct rsnd_dai_stream *io)
|
||||
{
|
||||
@ -534,9 +444,6 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod,
|
||||
cr_mode = DIEN; /* PIO : enable Data interrupt */
|
||||
}
|
||||
|
||||
/* enable busif buffer over/under run interrupt. */
|
||||
rsnd_ssi_busif_err_irq_enable(mod);
|
||||
|
||||
init_end:
|
||||
ssi->cr_own = cr_own;
|
||||
ssi->cr_mode = cr_mode;
|
||||
@ -612,9 +519,6 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
|
||||
ssi->wsr = 0;
|
||||
}
|
||||
|
||||
/* disable busif buffer over/under run interrupt. */
|
||||
rsnd_ssi_busif_err_irq_disable(mod);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -788,7 +692,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
|
||||
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_interrupt_out:
|
||||
|
@ -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 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,
|
||||
struct rsnd_dai_stream *io,
|
||||
enum rsnd_mod_type type)
|
||||
@ -65,23 +151,9 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod,
|
||||
int id = rsnd_mod_id(mod);
|
||||
int is_clk_master = rsnd_rdai_is_clk_master(rdai);
|
||||
u32 val1, val2;
|
||||
int i;
|
||||
|
||||
/* clear status */
|
||||
switch (id) {
|
||||
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;
|
||||
}
|
||||
rsnd_ssiu_busif_err_status_clear(mod);
|
||||
|
||||
/*
|
||||
* SSI_MODE0
|
||||
@ -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_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;
|
||||
}
|
||||
|
||||
static struct rsnd_mod_ops rsnd_ssiu_ops_gen1 = {
|
||||
.name = SSIU_NAME,
|
||||
.init = rsnd_ssiu_init,
|
||||
.quit = rsnd_ssiu_quit,
|
||||
.get_status = rsnd_ssiu_get_status,
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user