Commit 867bc6cc authored by Hartmut Hackmann's avatar Hartmut Hackmann Committed by Mauro Carvalho Chehab

V4L/DVB (7390): saa7134: clear audio DSP interface after access error

In the case of an access error to the high latency registers of
the audio DSP, the interface needs to be cleared, otherwise a cascade
of errors occurs.

This patch is closely modeled after a proposal by Mirek Slugen
Signed-off-by: default avatarHartmut Hackmann <hartmut.hackmann@t-online.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent c1e6393e
...@@ -365,6 +365,9 @@ ...@@ -365,6 +365,9 @@
#define SAA7135_DSP_RWSTATE_RDB (1 << 1) #define SAA7135_DSP_RWSTATE_RDB (1 << 1)
#define SAA7135_DSP_RWSTATE_WRR (1 << 0) #define SAA7135_DSP_RWSTATE_WRR (1 << 0)
#define SAA7135_DSP_RWCLEAR 0x586
#define SAA7135_DSP_RWCLEAR_RERR 1
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
/* /*
* Local variables: * Local variables:
......
...@@ -653,6 +653,17 @@ static char *stdres[0x20] = { ...@@ -653,6 +653,17 @@ static char *stdres[0x20] = {
#define DSP_RETRY 32 #define DSP_RETRY 32
#define DSP_DELAY 16 #define DSP_DELAY 16
#define SAA7135_DSP_RWCLEAR_RERR 1
static inline int saa_dsp_reset_error_bit(struct saa7134_dev *dev)
{
int state = saa_readb(SAA7135_DSP_RWSTATE);
if (unlikely(state & SAA7135_DSP_RWSTATE_ERR)) {
d2printk("%s: resetting error bit\n", dev->name);
saa_writeb(SAA7135_DSP_RWCLEAR, SAA7135_DSP_RWCLEAR_RERR);
}
return 0;
}
static inline int saa_dsp_wait_bit(struct saa7134_dev *dev, int bit) static inline int saa_dsp_wait_bit(struct saa7134_dev *dev, int bit)
{ {
...@@ -660,8 +671,8 @@ static inline int saa_dsp_wait_bit(struct saa7134_dev *dev, int bit) ...@@ -660,8 +671,8 @@ static inline int saa_dsp_wait_bit(struct saa7134_dev *dev, int bit)
state = saa_readb(SAA7135_DSP_RWSTATE); state = saa_readb(SAA7135_DSP_RWSTATE);
if (unlikely(state & SAA7135_DSP_RWSTATE_ERR)) { if (unlikely(state & SAA7135_DSP_RWSTATE_ERR)) {
printk("%s: dsp access error\n",dev->name); printk(KERN_WARNING "%s: dsp access error\n", dev->name);
/* FIXME: send ack ... */ saa_dsp_reset_error_bit(dev);
return -EIO; return -EIO;
} }
while (0 == (state & bit)) { while (0 == (state & bit)) {
......
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