Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[linux-2.6.git] / drivers / media / dvb / frontends / mb86a20s.c
index a67d7ef..7fa3e47 100644 (file)
@@ -61,244 +61,111 @@ static struct regdata mb86a20s_init[] = {
        { 0x70, 0xff },
        { 0x08, 0x01 },
        { 0x09, 0x3e },
-       { 0x50, 0xd1 },
-       { 0x51, 0x22 },
+       { 0x50, 0xd1 }, { 0x51, 0x22 },
        { 0x39, 0x01 },
        { 0x71, 0x00 },
-       { 0x28, 0x2a },
-       { 0x29, 0x00 },
-       { 0x2a, 0xff },
-       { 0x2b, 0x80 },
-       { 0x28, 0x20 },
-       { 0x29, 0x33 },
-       { 0x2a, 0xdf },
-       { 0x2b, 0xa9 },
+       { 0x28, 0x2a }, { 0x29, 0x00 }, { 0x2a, 0xff }, { 0x2b, 0x80 },
+       { 0x28, 0x20 }, { 0x29, 0x33 }, { 0x2a, 0xdf }, { 0x2b, 0xa9 },
+       { 0x28, 0x22 }, { 0x29, 0x00 }, { 0x2a, 0x1f }, { 0x2b, 0xf0 },
        { 0x3b, 0x21 },
        { 0x3c, 0x3a },
        { 0x01, 0x0d },
-       { 0x04, 0x08 },
-       { 0x05, 0x05 },
-       { 0x04, 0x0e },
-       { 0x05, 0x00 },
-       { 0x04, 0x0f },
-       { 0x05, 0x14 },
-       { 0x04, 0x0b },
-       { 0x05, 0x8c },
-       { 0x04, 0x00 },
-       { 0x05, 0x00 },
-       { 0x04, 0x01 },
-       { 0x05, 0x07 },
-       { 0x04, 0x02 },
-       { 0x05, 0x0f },
-       { 0x04, 0x03 },
-       { 0x05, 0xa0 },
-       { 0x04, 0x09 },
-       { 0x05, 0x00 },
-       { 0x04, 0x0a },
-       { 0x05, 0xff },
-       { 0x04, 0x27 },
-       { 0x05, 0x64 },
-       { 0x04, 0x28 },
-       { 0x05, 0x00 },
-       { 0x04, 0x1e },
-       { 0x05, 0xff },
-       { 0x04, 0x29 },
-       { 0x05, 0x0a },
-       { 0x04, 0x32 },
-       { 0x05, 0x0a },
-       { 0x04, 0x14 },
-       { 0x05, 0x02 },
-       { 0x04, 0x04 },
-       { 0x05, 0x00 },
-       { 0x04, 0x05 },
-       { 0x05, 0x22 },
-       { 0x04, 0x06 },
-       { 0x05, 0x0e },
-       { 0x04, 0x07 },
-       { 0x05, 0xd8 },
-       { 0x04, 0x12 },
-       { 0x05, 0x00 },
-       { 0x04, 0x13 },
-       { 0x05, 0xff },
+       { 0x04, 0x08 }, { 0x05, 0x05 },
+       { 0x04, 0x0e }, { 0x05, 0x00 },
+       { 0x04, 0x0f }, { 0x05, 0x14 },
+       { 0x04, 0x0b }, { 0x05, 0x8c },
+       { 0x04, 0x00 }, { 0x05, 0x00 },
+       { 0x04, 0x01 }, { 0x05, 0x07 },
+       { 0x04, 0x02 }, { 0x05, 0x0f },
+       { 0x04, 0x03 }, { 0x05, 0xa0 },
+       { 0x04, 0x09 }, { 0x05, 0x00 },
+       { 0x04, 0x0a }, { 0x05, 0xff },
+       { 0x04, 0x27 }, { 0x05, 0x64 },
+       { 0x04, 0x28 }, { 0x05, 0x00 },
+       { 0x04, 0x1e }, { 0x05, 0xff },
+       { 0x04, 0x29 }, { 0x05, 0x0a },
+       { 0x04, 0x32 }, { 0x05, 0x0a },
+       { 0x04, 0x14 }, { 0x05, 0x02 },
+       { 0x04, 0x04 }, { 0x05, 0x00 },
+       { 0x04, 0x05 }, { 0x05, 0x22 },
+       { 0x04, 0x06 }, { 0x05, 0x0e },
+       { 0x04, 0x07 }, { 0x05, 0xd8 },
+       { 0x04, 0x12 }, { 0x05, 0x00 },
+       { 0x04, 0x13 }, { 0x05, 0xff },
+       { 0x04, 0x15 }, { 0x05, 0x4e },
+       { 0x04, 0x16 }, { 0x05, 0x20 },
        { 0x52, 0x01 },
-       { 0x50, 0xa7 },
-       { 0x51, 0x00 },
-       { 0x50, 0xa8 },
-       { 0x51, 0xff },
-       { 0x50, 0xa9 },
-       { 0x51, 0xff },
-       { 0x50, 0xaa },
-       { 0x51, 0x00 },
-       { 0x50, 0xab },
-       { 0x51, 0xff },
-       { 0x50, 0xac },
-       { 0x51, 0xff },
-       { 0x50, 0xad },
-       { 0x51, 0x00 },
-       { 0x50, 0xae },
-       { 0x51, 0xff },
-       { 0x50, 0xaf },
-       { 0x51, 0xff },
+       { 0x50, 0xa7 }, { 0x51, 0xff },
+       { 0x50, 0xa8 }, { 0x51, 0xff },
+       { 0x50, 0xa9 }, { 0x51, 0xff },
+       { 0x50, 0xaa }, { 0x51, 0xff },
+       { 0x50, 0xab }, { 0x51, 0xff },
+       { 0x50, 0xac }, { 0x51, 0xff },
+       { 0x50, 0xad }, { 0x51, 0xff },
+       { 0x50, 0xae }, { 0x51, 0xff },
+       { 0x50, 0xaf }, { 0x51, 0xff },
        { 0x5e, 0x07 },
-       { 0x50, 0xdc },
-       { 0x51, 0x01 },
-       { 0x50, 0xdd },
-       { 0x51, 0xf4 },
-       { 0x50, 0xde },
-       { 0x51, 0x01 },
-       { 0x50, 0xdf },
-       { 0x51, 0xf4 },
-       { 0x50, 0xe0 },
-       { 0x51, 0x01 },
-       { 0x50, 0xe1 },
-       { 0x51, 0xf4 },
-       { 0x50, 0xb0 },
-       { 0x51, 0x07 },
-       { 0x50, 0xb2 },
-       { 0x51, 0xff },
-       { 0x50, 0xb3 },
-       { 0x51, 0xff },
-       { 0x50, 0xb4 },
-       { 0x51, 0xff },
-       { 0x50, 0xb5 },
-       { 0x51, 0xff },
-       { 0x50, 0xb6 },
-       { 0x51, 0xff },
-       { 0x50, 0xb7 },
-       { 0x51, 0xff },
-       { 0x50, 0x50 },
-       { 0x51, 0x02 },
-       { 0x50, 0x51 },
-       { 0x51, 0x04 },
+       { 0x50, 0xdc }, { 0x51, 0x01 },
+       { 0x50, 0xdd }, { 0x51, 0xf4 },
+       { 0x50, 0xde }, { 0x51, 0x01 },
+       { 0x50, 0xdf }, { 0x51, 0xf4 },
+       { 0x50, 0xe0 }, { 0x51, 0x01 },
+       { 0x50, 0xe1 }, { 0x51, 0xf4 },
+       { 0x50, 0xb0 }, { 0x51, 0x07 },
+       { 0x50, 0xb2 }, { 0x51, 0xff },
+       { 0x50, 0xb3 }, { 0x51, 0xff },
+       { 0x50, 0xb4 }, { 0x51, 0xff },
+       { 0x50, 0xb5 }, { 0x51, 0xff },
+       { 0x50, 0xb6 }, { 0x51, 0xff },
+       { 0x50, 0xb7 }, { 0x51, 0xff },
+       { 0x50, 0x50 }, { 0x51, 0x02 },
+       { 0x50, 0x51 }, { 0x51, 0x04 },
        { 0x45, 0x04 },
        { 0x48, 0x04 },
-       { 0x50, 0xd5 },
-       { 0x51, 0x01 },         /* Serial */
-       { 0x50, 0xd6 },
-       { 0x51, 0x1f },
-       { 0x50, 0xd2 },
-       { 0x51, 0x03 },
-       { 0x50, 0xd7 },
-       { 0x51, 0x3f },
+       { 0x50, 0xd5 }, { 0x51, 0x01 },         /* Serial */
+       { 0x50, 0xd6 }, { 0x51, 0x1f },
+       { 0x50, 0xd2 }, { 0x51, 0x03 },
+       { 0x50, 0xd7 }, { 0x51, 0x3f },
+       { 0x28, 0x74 }, { 0x29, 0x00 }, { 0x28, 0x74 }, { 0x29, 0x40 },
+       { 0x28, 0x46 }, { 0x29, 0x2c }, { 0x28, 0x46 }, { 0x29, 0x0c },
+       { 0x04, 0x40 }, { 0x05, 0x01 },
+       { 0x28, 0x00 }, { 0x29, 0x10 },
+       { 0x28, 0x05 }, { 0x29, 0x02 },
        { 0x1c, 0x01 },
-       { 0x28, 0x06 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x03 },
-       { 0x28, 0x07 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x0d },
-       { 0x28, 0x08 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x02 },
-       { 0x28, 0x09 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x01 },
-       { 0x28, 0x0a },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x21 },
-       { 0x28, 0x0b },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x29 },
-       { 0x28, 0x0c },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x16 },
-       { 0x28, 0x0d },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x31 },
-       { 0x28, 0x0e },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x0e },
-       { 0x28, 0x0f },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x4e },
-       { 0x28, 0x10 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x46 },
-       { 0x28, 0x11 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x0f },
-       { 0x28, 0x12 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x56 },
-       { 0x28, 0x13 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x35 },
-       { 0x28, 0x14 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x01 },
-       { 0x2b, 0xbe },
-       { 0x28, 0x15 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x01 },
-       { 0x2b, 0x84 },
-       { 0x28, 0x16 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x03 },
-       { 0x2b, 0xee },
-       { 0x28, 0x17 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x98 },
-       { 0x28, 0x18 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x00 },
-       { 0x2b, 0x9f },
-       { 0x28, 0x19 },
-       { 0x29, 0x00 },
-       { 0x2a, 0x07 },
-       { 0x2b, 0xb2 },
-       { 0x28, 0x1a },
-       { 0x29, 0x00 },
-       { 0x2a, 0x06 },
-       { 0x2b, 0xc2 },
-       { 0x28, 0x1b },
-       { 0x29, 0x00 },
-       { 0x2a, 0x07 },
-       { 0x2b, 0x4a },
-       { 0x28, 0x1c },
-       { 0x29, 0x00 },
-       { 0x2a, 0x01 },
-       { 0x2b, 0xbc },
-       { 0x28, 0x1d },
-       { 0x29, 0x00 },
-       { 0x2a, 0x04 },
-       { 0x2b, 0xba },
-       { 0x28, 0x1e },
-       { 0x29, 0x00 },
-       { 0x2a, 0x06 },
-       { 0x2b, 0x14 },
-       { 0x50, 0x1e },
-       { 0x51, 0x5d },
-       { 0x50, 0x22 },
-       { 0x51, 0x00 },
-       { 0x50, 0x23 },
-       { 0x51, 0xc8 },
-       { 0x50, 0x24 },
-       { 0x51, 0x00 },
-       { 0x50, 0x25 },
-       { 0x51, 0xf0 },
-       { 0x50, 0x26 },
-       { 0x51, 0x00 },
-       { 0x50, 0x27 },
-       { 0x51, 0xc3 },
-       { 0x50, 0x39 },
-       { 0x51, 0x02 },
-       { 0x50, 0xd5 },
-       { 0x51, 0x01 },
+       { 0x28, 0x06 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x03 },
+       { 0x28, 0x07 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x0d },
+       { 0x28, 0x08 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x02 },
+       { 0x28, 0x09 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x01 },
+       { 0x28, 0x0a }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x21 },
+       { 0x28, 0x0b }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x29 },
+       { 0x28, 0x0c }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x16 },
+       { 0x28, 0x0d }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x31 },
+       { 0x28, 0x0e }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x0e },
+       { 0x28, 0x0f }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x4e },
+       { 0x28, 0x10 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x46 },
+       { 0x28, 0x11 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x0f },
+       { 0x28, 0x12 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x56 },
+       { 0x28, 0x13 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x35 },
+       { 0x28, 0x14 }, { 0x29, 0x00 }, { 0x2a, 0x01 }, { 0x2b, 0xbe },
+       { 0x28, 0x15 }, { 0x29, 0x00 }, { 0x2a, 0x01 }, { 0x2b, 0x84 },
+       { 0x28, 0x16 }, { 0x29, 0x00 }, { 0x2a, 0x03 }, { 0x2b, 0xee },
+       { 0x28, 0x17 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x98 },
+       { 0x28, 0x18 }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x9f },
+       { 0x28, 0x19 }, { 0x29, 0x00 }, { 0x2a, 0x07 }, { 0x2b, 0xb2 },
+       { 0x28, 0x1a }, { 0x29, 0x00 }, { 0x2a, 0x06 }, { 0x2b, 0xc2 },
+       { 0x28, 0x1b }, { 0x29, 0x00 }, { 0x2a, 0x07 }, { 0x2b, 0x4a },
+       { 0x28, 0x1c }, { 0x29, 0x00 }, { 0x2a, 0x01 }, { 0x2b, 0xbc },
+       { 0x28, 0x1d }, { 0x29, 0x00 }, { 0x2a, 0x04 }, { 0x2b, 0xba },
+       { 0x28, 0x1e }, { 0x29, 0x00 }, { 0x2a, 0x06 }, { 0x2b, 0x14 },
+       { 0x50, 0x1e }, { 0x51, 0x5d },
+       { 0x50, 0x22 }, { 0x51, 0x00 },
+       { 0x50, 0x23 }, { 0x51, 0xc8 },
+       { 0x50, 0x24 }, { 0x51, 0x00 },
+       { 0x50, 0x25 }, { 0x51, 0xf0 },
+       { 0x50, 0x26 }, { 0x51, 0x00 },
+       { 0x50, 0x27 }, { 0x51, 0xc3 },
+       { 0x50, 0x39 }, { 0x51, 0x02 },
+       { 0x28, 0x6a }, { 0x29, 0x00 }, { 0x2a, 0x00 }, { 0x2b, 0x00 },
        { 0xd0, 0x00 },
 };
 
@@ -525,22 +392,212 @@ static int mb86a20s_set_frontend(struct dvb_frontend *fe)
        return rc;
 }
 
-static int mb86a20s_get_frontend(struct dvb_frontend *fe,
-                                struct dtv_frontend_properties *p)
+static int mb86a20s_get_modulation(struct mb86a20s_state *state,
+                                  unsigned layer)
 {
+       int rc;
+       static unsigned char reg[] = {
+               [0] = 0x86,     /* Layer A */
+               [1] = 0x8a,     /* Layer B */
+               [2] = 0x8e,     /* Layer C */
+       };
+
+       if (layer > ARRAY_SIZE(reg))
+               return -EINVAL;
+       rc = mb86a20s_writereg(state, 0x6d, reg[layer]);
+       if (rc < 0)
+               return rc;
+       rc = mb86a20s_readreg(state, 0x6e);
+       if (rc < 0)
+               return rc;
+       switch ((rc & 0x70) >> 4) {
+       case 0:
+               return DQPSK;
+       case 1:
+               return QPSK;
+       case 2:
+               return QAM_16;
+       case 3:
+               return QAM_64;
+       default:
+               return QAM_AUTO;
+       }
+}
+
+static int mb86a20s_get_fec(struct mb86a20s_state *state,
+                           unsigned layer)
+{
+       int rc;
+
+       static unsigned char reg[] = {
+               [0] = 0x87,     /* Layer A */
+               [1] = 0x8b,     /* Layer B */
+               [2] = 0x8f,     /* Layer C */
+       };
+
+       if (layer > ARRAY_SIZE(reg))
+               return -EINVAL;
+       rc = mb86a20s_writereg(state, 0x6d, reg[layer]);
+       if (rc < 0)
+               return rc;
+       rc = mb86a20s_readreg(state, 0x6e);
+       if (rc < 0)
+               return rc;
+       switch (rc) {
+       case 0:
+               return FEC_1_2;
+       case 1:
+               return FEC_2_3;
+       case 2:
+               return FEC_3_4;
+       case 3:
+               return FEC_5_6;
+       case 4:
+               return FEC_7_8;
+       default:
+               return FEC_AUTO;
+       }
+}
+
+static int mb86a20s_get_interleaving(struct mb86a20s_state *state,
+                                    unsigned layer)
+{
+       int rc;
+
+       static unsigned char reg[] = {
+               [0] = 0x88,     /* Layer A */
+               [1] = 0x8c,     /* Layer B */
+               [2] = 0x90,     /* Layer C */
+       };
+
+       if (layer > ARRAY_SIZE(reg))
+               return -EINVAL;
+       rc = mb86a20s_writereg(state, 0x6d, reg[layer]);
+       if (rc < 0)
+               return rc;
+       rc = mb86a20s_readreg(state, 0x6e);
+       if (rc < 0)
+               return rc;
+       if (rc > 3)
+               return -EINVAL; /* Not used */
+       return rc;
+}
+
+static int mb86a20s_get_segment_count(struct mb86a20s_state *state,
+                                     unsigned layer)
+{
+       int rc, count;
+
+       static unsigned char reg[] = {
+               [0] = 0x89,     /* Layer A */
+               [1] = 0x8d,     /* Layer B */
+               [2] = 0x91,     /* Layer C */
+       };
 
-       /* FIXME: For now, it does nothing */
+       if (layer > ARRAY_SIZE(reg))
+               return -EINVAL;
+       rc = mb86a20s_writereg(state, 0x6d, reg[layer]);
+       if (rc < 0)
+               return rc;
+       rc = mb86a20s_readreg(state, 0x6e);
+       if (rc < 0)
+               return rc;
+       count = (rc >> 4) & 0x0f;
+
+       return count;
+}
+
+static int mb86a20s_get_frontend(struct dvb_frontend *fe)
+{
+       struct mb86a20s_state *state = fe->demodulator_priv;
+       struct dtv_frontend_properties *p = &fe->dtv_property_cache;
+       int i, rc;
 
+       /* Fixed parameters */
+       p->delivery_system = SYS_ISDBT;
        p->bandwidth_hz = 6000000;
+
+       if (fe->ops.i2c_gate_ctrl)
+               fe->ops.i2c_gate_ctrl(fe, 0);
+
+       /* Check for partial reception */
+       rc = mb86a20s_writereg(state, 0x6d, 0x85);
+       if (rc >= 0)
+               rc = mb86a20s_readreg(state, 0x6e);
+       if (rc >= 0)
+               p->isdbt_partial_reception = (rc & 0x10) ? 1 : 0;
+
+       /* Get per-layer data */
+       p->isdbt_layer_enabled = 0;
+       for (i = 0; i < 3; i++) {
+               rc = mb86a20s_get_segment_count(state, i);
+                       if (rc >= 0 && rc < 14)
+                               p->layer[i].segment_count = rc;
+               if (rc == 0x0f)
+                       continue;
+               p->isdbt_layer_enabled |= 1 << i;
+               rc = mb86a20s_get_modulation(state, i);
+                       if (rc >= 0)
+                               p->layer[i].modulation = rc;
+               rc = mb86a20s_get_fec(state, i);
+                       if (rc >= 0)
+                               p->layer[i].fec = rc;
+               rc = mb86a20s_get_interleaving(state, i);
+                       if (rc >= 0)
+                               p->layer[i].interleaving = rc;
+       }
+
+       p->isdbt_sb_mode = 0;
+       rc = mb86a20s_writereg(state, 0x6d, 0x84);
+       if ((rc >= 0) && ((rc & 0x60) == 0x20)) {
+               p->isdbt_sb_mode = 1;
+               /* At least, one segment should exist */
+               if (!p->isdbt_sb_segment_count)
+                       p->isdbt_sb_segment_count = 1;
+       } else
+               p->isdbt_sb_segment_count = 0;
+
+       /* Get transmission mode and guard interval */
        p->transmission_mode = TRANSMISSION_MODE_AUTO;
        p->guard_interval = GUARD_INTERVAL_AUTO;
-       p->isdbt_partial_reception = 0;
+       rc = mb86a20s_readreg(state, 0x07);
+       if (rc >= 0) {
+               if ((rc & 0x60) == 0x20) {
+                       switch (rc & 0x0c >> 2) {
+                       case 0:
+                               p->transmission_mode = TRANSMISSION_MODE_2K;
+                               break;
+                       case 1:
+                               p->transmission_mode = TRANSMISSION_MODE_4K;
+                               break;
+                       case 2:
+                               p->transmission_mode = TRANSMISSION_MODE_8K;
+                               break;
+                       }
+               }
+               if (!(rc & 0x10)) {
+                       switch (rc & 0x3) {
+                       case 0:
+                               p->guard_interval = GUARD_INTERVAL_1_4;
+                               break;
+                       case 1:
+                               p->guard_interval = GUARD_INTERVAL_1_8;
+                               break;
+                       case 2:
+                               p->guard_interval = GUARD_INTERVAL_1_16;
+                               break;
+                       }
+               }
+       }
+
+       if (fe->ops.i2c_gate_ctrl)
+               fe->ops.i2c_gate_ctrl(fe, 1);
 
        return 0;
 }
 
 static int mb86a20s_tune(struct dvb_frontend *fe,
-                       struct dvb_frontend_parameters *params,
+                       bool re_tune,
                        unsigned int mode_flags,
                        unsigned int *delay,
                        fe_status_t *status)
@@ -549,7 +606,7 @@ static int mb86a20s_tune(struct dvb_frontend *fe,
 
        dprintk("\n");
 
-       if (params != NULL)
+       if (re_tune)
                rc = mb86a20s_set_frontend(fe);
 
        if (!(mode_flags & FE_TUNE_MODE_ONESHOT))
@@ -617,7 +674,6 @@ static struct dvb_frontend_ops mb86a20s_ops = {
        /* Use dib8000 values per default */
        .info = {
                .name = "Fujitsu mb86A20s",
-               .type = FE_OFDM,
                .caps = FE_CAN_INVERSION_AUTO | FE_CAN_RECOVER |
                        FE_CAN_FEC_1_2  | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
                        FE_CAN_FEC_5_6  | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |