Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 182801
b: refs/heads/master
c: 59c3b00
h: refs/heads/master
i:
  182799: 885d42c
v: v3
  • Loading branch information
Kuninori Morimoto authored and Mark Brown committed Dec 30, 2009
1 parent 2e748b8 commit 67aa747
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 142e8174b3c493f40469d3ecee0e404645e9c483
refs/heads/master: 59c3b003ddd3c815de1aa015920710a9e4bf195b
29 changes: 25 additions & 4 deletions trunk/sound/soc/sh/fsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
/* DOFF_ST */
#define ERR_OVER 0x00000010
#define ERR_UNDER 0x00000001
#define ST_ERR (ERR_OVER | ERR_UNDER)

/* CLK_RST */
#define B_CLK 0x00000010
Expand Down Expand Up @@ -375,11 +376,12 @@ static int fsi_data_push(struct fsi_priv *fsi)
{
struct snd_pcm_runtime *runtime;
struct snd_pcm_substream *substream = NULL;
u32 status;
int send;
int fifo_free;
int width;
u8 *start;
int i, over_period;
int i, ret, over_period;

if (!fsi ||
!fsi->substream ||
Expand Down Expand Up @@ -435,23 +437,33 @@ static int fsi_data_push(struct fsi_priv *fsi)

fsi->byte_offset += send * width;

ret = 0;
status = fsi_reg_read(fsi, DOFF_ST);
if (status & ERR_OVER) {
struct snd_soc_dai *dai = fsi_get_dai(substream);
dev_err(dai->dev, "over run error\n");
fsi_reg_write(fsi, DOFF_ST, status & ~ST_ERR);
ret = -EIO;
}

fsi_irq_enable(fsi, 1);

if (over_period)
snd_pcm_period_elapsed(substream);

return 0;
return ret;
}

static int fsi_data_pop(struct fsi_priv *fsi)
{
struct snd_pcm_runtime *runtime;
struct snd_pcm_substream *substream = NULL;
u32 status;
int free;
int fifo_fill;
int width;
u8 *start;
int i, over_period;
int i, ret, over_period;

if (!fsi ||
!fsi->substream ||
Expand Down Expand Up @@ -506,12 +518,21 @@ static int fsi_data_pop(struct fsi_priv *fsi)

fsi->byte_offset += fifo_fill * width;

ret = 0;
status = fsi_reg_read(fsi, DIFF_ST);
if (status & ERR_UNDER) {
struct snd_soc_dai *dai = fsi_get_dai(substream);
dev_err(dai->dev, "under run error\n");
fsi_reg_write(fsi, DIFF_ST, status & ~ST_ERR);
ret = -EIO;
}

fsi_irq_enable(fsi, 0);

if (over_period)
snd_pcm_period_elapsed(substream);

return 0;
return ret;
}

static irqreturn_t fsi_interrupt(int irq, void *data)
Expand Down

0 comments on commit 67aa747

Please sign in to comment.