提交 feb58cff 编写于 作者: K Kuninori Morimoto 提交者: Mark Brown

ASoC: fsi: ensures process inside master lock

Bit operation for fsi_master should be done inside master lock.
But soft-reset/interrupt operation were outside of it.
This patch modify this problem.
It still allow to INT_ST outside-operation on fsi_interrupt,
but it is not problem.
Because this register doesn't need the bit operation.
Signed-off-by: NKuninori Morimoto <morimoto.kuninori@renesas.com>
Acked-by: NLiam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
上级 1ad747ca
...@@ -79,6 +79,12 @@ ...@@ -79,6 +79,12 @@
#define INT_A_IN (1 << 4) #define INT_A_IN (1 << 4)
#define INT_A_OUT (1 << 0) #define INT_A_OUT (1 << 0)
/* SOFT_RST */
#define PBSR (1 << 12) /* Port B Software Reset */
#define PASR (1 << 8) /* Port A Software Reset */
#define IR (1 << 4) /* Interrupt Reset */
#define FSISR (1 << 0) /* Software Reset */
#define FSI_RATES SNDRV_PCM_RATE_8000_96000 #define FSI_RATES SNDRV_PCM_RATE_8000_96000
#define FSI_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE) #define FSI_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
...@@ -372,18 +378,13 @@ static void fsi_irq_init(struct fsi_priv *fsi, int is_play) ...@@ -372,18 +378,13 @@ static void fsi_irq_init(struct fsi_priv *fsi, int is_play)
static void fsi_soft_all_reset(struct fsi_master *master) static void fsi_soft_all_reset(struct fsi_master *master)
{ {
u32 status = fsi_master_read(master, SOFT_RST);
/* port AB reset */ /* port AB reset */
status &= 0x000000ff; fsi_master_mask_set(master, SOFT_RST, PASR | PBSR, 0);
fsi_master_write(master, SOFT_RST, status);
mdelay(10); mdelay(10);
/* soft reset */ /* soft reset */
status &= 0x000000f0; fsi_master_mask_set(master, SOFT_RST, FSISR, 0);
fsi_master_write(master, SOFT_RST, status); fsi_master_mask_set(master, SOFT_RST, FSISR, FSISR);
status |= 0x00000001;
fsi_master_write(master, SOFT_RST, status);
mdelay(10); mdelay(10);
} }
...@@ -558,12 +559,11 @@ static int fsi_data_pop(struct fsi_priv *fsi, int startup) ...@@ -558,12 +559,11 @@ static int fsi_data_pop(struct fsi_priv *fsi, int startup)
static irqreturn_t fsi_interrupt(int irq, void *data) static irqreturn_t fsi_interrupt(int irq, void *data)
{ {
struct fsi_master *master = data; struct fsi_master *master = data;
u32 status = fsi_master_read(master, SOFT_RST) & ~0x00000010;
u32 int_st = fsi_master_read(master, INT_ST); u32 int_st = fsi_master_read(master, INT_ST);
/* clear irq status */ /* clear irq status */
fsi_master_write(master, SOFT_RST, status); fsi_master_mask_set(master, SOFT_RST, IR, 0);
fsi_master_write(master, SOFT_RST, status | 0x00000010); fsi_master_mask_set(master, SOFT_RST, IR, IR);
if (int_st & INT_A_OUT) if (int_st & INT_A_OUT)
fsi_data_push(&master->fsia, 0); fsi_data_push(&master->fsia, 0);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册