Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=dfc1c08aab447d49230dacb390d3f2263584d28f
Commit:     dfc1c08aab447d49230dacb390d3f2263584d28f
Parent:     387d447776484b6e1d08973337aa4c834ea7c6bc
Author:     Steven Toth <[EMAIL PROTECTED]>
AuthorDate: Tue Jan 15 21:35:22 2008 -0300
Committer:  Mauro Carvalho Chehab <[EMAIL PROTECTED]>
CommitDate: Fri Jan 25 19:05:05 2008 -0200

    V4L/DVB (7041): s5h1409: Bug fix for parallel support
    
    Parallel support was not working with the s5h1409 and the Pinnacle HD800i.
    This patch fixes the demodulator driver and ensures that all existing
    s5h1409 based products configure the demodulator correctly.
    
    Signed-off-by: Steven Toth <[EMAIL PROTECTED]>
    Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>
---
 drivers/media/dvb/frontends/s5h1409.c     |   51 +++++++++++++++++++++++++----
 drivers/media/dvb/frontends/s5h1409.h     |    7 ++++
 drivers/media/video/cx23885/cx23885-dvb.c |   15 ++++++---
 3 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/drivers/media/dvb/frontends/s5h1409.c 
b/drivers/media/dvb/frontends/s5h1409.c
index 3391777..8194334 100644
--- a/drivers/media/dvb/frontends/s5h1409.c
+++ b/drivers/media/dvb/frontends/s5h1409.c
@@ -98,7 +98,7 @@ static struct init_tab {
        { 0xac, 0x1003, },
        { 0xad, 0x103f, },
        { 0xe2, 0x0100, },
-       { 0xe3, 0x0000, },
+       { 0xe3, 0x1000, },
        { 0x28, 0x1010, },
        { 0xb1, 0x000e, },
 };
@@ -441,9 +441,11 @@ static int s5h1409_set_gpio(struct dvb_frontend* fe, int 
enable)
        dprintk("%s(%d)\n", __FUNCTION__, enable);
 
        if (enable)
-               return s5h1409_writereg(state, 0xe3, 0x1100);
+               return s5h1409_writereg(state, 0xe3,
+                       s5h1409_readreg(state, 0xe3) | 0x1100);
        else
-               return s5h1409_writereg(state, 0xe3, 0x1000);
+               return s5h1409_writereg(state, 0xe3,
+                       s5h1409_readreg(state, 0xe3) & 0xeeff);
 }
 
 static int s5h1409_sleep(struct dvb_frontend* fe, int enable)
@@ -513,13 +515,15 @@ static void s5h1409_set_qam_interleave_mode(struct 
dvb_frontend *fe)
                        s5h1409_writereg(state, 0x96, 0x20);
                        s5h1409_writereg(state, 0xad,
                                ( ((reg1 & 0xf000) >> 4) | (reg2 & 0xf0ff)) );
-                       s5h1409_writereg(state, 0xab, 0x1100);
+                       s5h1409_writereg(state, 0xab,
+                               s5h1409_readreg(state, 0xab) & 0xeffe);
                }
        } else {
                if (state->qam_state != 1) {
                        state->qam_state = 1;
                        s5h1409_writereg(state, 0x96, 0x08);
-                       s5h1409_writereg(state, 0xab, 0x1101);
+                       s5h1409_writereg(state, 0xab,
+                               s5h1409_readreg(state, 0xab) | 0x1001);
                }
        }
 }
@@ -556,6 +560,36 @@ static int s5h1409_set_frontend (struct dvb_frontend* fe,
        return 0;
 }
 
+static int s5h1409_set_mpeg_timing(struct dvb_frontend *fe, int mode)
+{
+       struct s5h1409_state *state = fe->demodulator_priv;
+       u16 val;
+
+       dprintk("%s(%d)\n", __FUNCTION__, mode);
+
+       val = s5h1409_readreg(state, 0xac) & 0xcfff;
+       switch (mode) {
+       case S5H1409_MPEGTIMING_CONTINOUS_INVERTING_CLOCK:
+               val |= 0x0000;
+               break;
+       case S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK:
+               dprintk("%s(%d) Mode1 or Defaulting\n", __FUNCTION__, mode);
+               val |= 0x1000;
+               break;
+       case S5H1409_MPEGTIMING_NONCONTINOUS_INVERTING_CLOCK:
+               val |= 0x2000;
+               break;
+       case S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK:
+               val |= 0x3000;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       /* Configure MPEG Signal Timing charactistics */
+       return s5h1409_writereg(state, 0xac, val);
+}
+
 /* Reset the demod hardware and reset all of the configuration registers
    to a default state. */
 static int s5h1409_init (struct dvb_frontend* fe)
@@ -575,13 +609,16 @@ static int s5h1409_init (struct dvb_frontend* fe)
        state->current_modulation = VSB_8;
 
        if (state->config->output_mode == S5H1409_SERIAL_OUTPUT)
-               s5h1409_writereg(state, 0xab, 0x100); /* Serial */
+               s5h1409_writereg(state, 0xab,
+                       s5h1409_readreg(state, 0xab) | 0x100); /* Serial */
        else
-               s5h1409_writereg(state, 0xab, 0x0); /* Parallel */
+               s5h1409_writereg(state, 0xab,
+                       s5h1409_readreg(state, 0xab) & 0xfeff); /* Parallel */
 
        s5h1409_set_spectralinversion(fe, state->config->inversion);
        s5h1409_set_if_freq(fe, state->if_freq);
        s5h1409_set_gpio(fe, state->config->gpio);
+       s5h1409_set_mpeg_timing(fe, state->config->mpeg_timing);
        s5h1409_softreset(fe);
 
        /* Note: Leaving the I2C gate closed. */
diff --git a/drivers/media/dvb/frontends/s5h1409.h 
b/drivers/media/dvb/frontends/s5h1409.h
index b1f4339..f0bb13f 100644
--- a/drivers/media/dvb/frontends/s5h1409.h
+++ b/drivers/media/dvb/frontends/s5h1409.h
@@ -51,6 +51,13 @@ struct s5h1409_config
 #define S5H1409_TUNERLOCKING 0
 #define S5H1409_DEMODLOCKING 1
        u8 status_mode;
+
+       /* MPEG signal timing */
+#define S5H1409_MPEGTIMING_CONTINOUS_INVERTING_CLOCK       0
+#define S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK    1
+#define S5H1409_MPEGTIMING_NONCONTINOUS_INVERTING_CLOCK    2
+#define S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK 3
+       u16 mpeg_timing;
 };
 
 #if defined(CONFIG_DVB_S5H1409) || (defined(CONFIG_DVB_S5H1409_MODULE) && 
defined(MODULE))
diff --git a/drivers/media/video/cx23885/cx23885-dvb.c 
b/drivers/media/video/cx23885/cx23885-dvb.c
index 3491036..21937d5 100644
--- a/drivers/media/video/cx23885/cx23885-dvb.c
+++ b/drivers/media/video/cx23885/cx23885-dvb.c
@@ -126,7 +126,8 @@ static struct s5h1409_config hauppauge_generic_config = {
        .gpio          = S5H1409_GPIO_ON,
        .qam_if        = 44000,
        .inversion     = S5H1409_INVERSION_OFF,
-       .status_mode   = S5H1409_DEMODLOCKING
+       .status_mode   = S5H1409_DEMODLOCKING,
+       .mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
 };
 
 static struct s5h1409_config hauppauge_ezqam_config = {
@@ -135,7 +136,8 @@ static struct s5h1409_config hauppauge_ezqam_config = {
        .gpio          = S5H1409_GPIO_OFF,
        .qam_if        = 4000,
        .inversion     = S5H1409_INVERSION_ON,
-       .status_mode   = S5H1409_DEMODLOCKING
+       .status_mode   = S5H1409_DEMODLOCKING,
+       .mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
 };
 
 static struct s5h1409_config hauppauge_hvr1800lp_config = {
@@ -144,7 +146,8 @@ static struct s5h1409_config hauppauge_hvr1800lp_config = {
        .gpio          = S5H1409_GPIO_OFF,
        .qam_if        = 44000,
        .inversion     = S5H1409_INVERSION_OFF,
-       .status_mode   = S5H1409_DEMODLOCKING
+       .status_mode   = S5H1409_DEMODLOCKING,
+       .mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
 };
 
 static struct s5h1409_config hauppauge_hvr1500_config = {
@@ -152,7 +155,8 @@ static struct s5h1409_config hauppauge_hvr1500_config = {
        .output_mode   = S5H1409_SERIAL_OUTPUT,
        .gpio          = S5H1409_GPIO_OFF,
        .inversion     = S5H1409_INVERSION_OFF,
-       .status_mode   = S5H1409_DEMODLOCKING
+       .status_mode   = S5H1409_DEMODLOCKING,
+       .mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
 };
 
 static struct mt2131_config hauppauge_generic_tunerconfig = {
@@ -171,7 +175,8 @@ static struct s5h1409_config hauppauge_hvr1500q_config = {
        .gpio          = S5H1409_GPIO_ON,
        .qam_if        = 44000,
        .inversion     = S5H1409_INVERSION_OFF,
-       .status_mode   = S5H1409_DEMODLOCKING
+       .status_mode   = S5H1409_DEMODLOCKING,
+       .mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
 };
 
 static struct xc5000_config hauppauge_hvr1500q_tunerconfig = {
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to