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:
committed by
Mark Brown
parent
b43b8ae87c
commit
83b220cf8e
@@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 {
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user