V4L/DVB (13329): s5h1409: provide HVR-1600 specific optimizations
authorDevin Heitmueller <dheitmueller@kernellabs.com>
Wed, 28 Oct 2009 02:33:21 +0000 (23:33 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 5 Dec 2009 20:41:22 +0000 (18:41 -0200)
Perform some optimization of the register configuration based on a trace
of the HVR-1600 Windows i2c traffic (and consultation with Steven Toth).
Note that some of these values may be able to be moved into the common driver,
but I am holding off on that until they can be tested with other boards.

This work was sponsored by ONELAN Limited.

Cc: Steven Toth <stoth@kernellabs.com>
Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/frontends/s5h1409.c
drivers/media/dvb/frontends/s5h1409.h
drivers/media/video/cx18/cx18-dvb.c

index fb30115184270e38883ebee422c5f54582d58884..85fba581c5ab112e378af02edde300d19460fe1a 100644 (file)
@@ -614,6 +614,21 @@ static int s5h1409_init(struct dvb_frontend *fe)
        /* The datasheet says that after initialisation, VSB is default */
        state->current_modulation = VSB_8;
 
+       /* Optimize for the HVR-1600 if appropriate.  Note that some of these
+          may get folded into the generic case after testing with other
+          devices */
+       if (state->config->hvr1600_opt == S5H1409_HVR1600_OPTIMIZE) {
+               /* VSB AGC REF */
+               s5h1409_writereg(state, 0x09, 0x0050);
+
+               /* Unknown but Windows driver does it... */
+               s5h1409_writereg(state, 0x21, 0x0001);
+               s5h1409_writereg(state, 0x50, 0x030e);
+
+               /* QAM AGC REF */
+               s5h1409_writereg(state, 0x82, 0x0800);
+       }
+
        if (state->config->output_mode == S5H1409_SERIAL_OUTPUT)
                s5h1409_writereg(state, 0xab,
                        s5h1409_readreg(state, 0xab) | 0x100); /* Serial */
index 070d9743e330ca3da4d99a5e843a592a5e7e6a53..91f2ebd1a534e8b7c501e59fd274fd3d175f0df1 100644 (file)
@@ -57,6 +57,13 @@ struct s5h1409_config {
 #define S5H1409_MPEGTIMING_NONCONTINOUS_INVERTING_CLOCK    2
 #define S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK 3
        u16 mpeg_timing;
+
+       /* HVR-1600 optimizations (to better work with MXL5005s)
+          Note: some of these are likely to be folded into the generic driver
+          after being regression tested with other boards */
+#define S5H1409_HVR1600_NOOPTIMIZE 0
+#define S5H1409_HVR1600_OPTIMIZE   1
+       u8 hvr1600_opt;
 };
 
 #if defined(CONFIG_DVB_S5H1409) || (defined(CONFIG_DVB_S5H1409_MODULE) \
index 51a0c33b25b7fc84de53cce923672ee260ed8021..f402e798e3235e9e6e38fd828a3dc9004ee691d7 100644 (file)
@@ -71,7 +71,8 @@ static struct s5h1409_config hauppauge_hvr1600_config = {
        .qam_if        = 44000,
        .inversion     = S5H1409_INVERSION_OFF,
        .status_mode   = S5H1409_DEMODLOCKING,
-       .mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK
+       .mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
+       .hvr1600_opt   = S5H1409_HVR1600_OPTIMIZE
 };
 
 /*