]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/media/common/tuners/tda827x.c
V4L/DVB (11236): tda827x: fix locking issues with DVB-C
[linux-2.6-omap-h63xx.git] / drivers / media / common / tuners / tda827x.c
index 8cd55a83b381aeefa036a14ebbd143dbbe08d6b4..36a7bc7585ab6c12473033a12ceeb72cb12e4861 100644 (file)
@@ -351,7 +351,7 @@ struct tda827xa_data {
        u8  gc3;
 };
 
-static const struct tda827xa_data tda827xa_dvbt[] = {
+static struct tda827xa_data tda827xa_dvbt[] = {
        { .lomax =  56875000, .svco = 3, .spd = 4, .scr = 0, .sbs = 0, .gc3 = 1},
        { .lomax =  67250000, .svco = 0, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1},
        { .lomax =  81250000, .svco = 1, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1},
@@ -381,6 +381,36 @@ static const struct tda827xa_data tda827xa_dvbt[] = {
        { .lomax =         0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0}
 };
 
+static struct tda827xa_data tda827xa_dvbc[] = {
+       { .lomax =  50125000, .svco = 2, .spd = 4, .scr = 2, .sbs = 0, .gc3 = 3},
+       { .lomax =  58500000, .svco = 3, .spd = 4, .scr = 2, .sbs = 0, .gc3 = 3},
+       { .lomax =  69250000, .svco = 0, .spd = 3, .scr = 2, .sbs = 0, .gc3 = 3},
+       { .lomax =  83625000, .svco = 1, .spd = 3, .scr = 2, .sbs = 0, .gc3 = 3},
+       { .lomax =  97500000, .svco = 2, .spd = 3, .scr = 2, .sbs = 0, .gc3 = 3},
+       { .lomax = 100250000, .svco = 2, .spd = 3, .scr = 2, .sbs = 1, .gc3 = 1},
+       { .lomax = 117000000, .svco = 3, .spd = 3, .scr = 2, .sbs = 1, .gc3 = 1},
+       { .lomax = 138500000, .svco = 0, .spd = 2, .scr = 2, .sbs = 1, .gc3 = 1},
+       { .lomax = 167250000, .svco = 1, .spd = 2, .scr = 2, .sbs = 1, .gc3 = 1},
+       { .lomax = 187000000, .svco = 2, .spd = 2, .scr = 2, .sbs = 1, .gc3 = 1},
+       { .lomax = 200500000, .svco = 2, .spd = 2, .scr = 2, .sbs = 2, .gc3 = 1},
+       { .lomax = 234000000, .svco = 3, .spd = 2, .scr = 2, .sbs = 2, .gc3 = 3},
+       { .lomax = 277000000, .svco = 0, .spd = 1, .scr = 2, .sbs = 2, .gc3 = 3},
+       { .lomax = 325000000, .svco = 1, .spd = 1, .scr = 2, .sbs = 2, .gc3 = 1},
+       { .lomax = 334500000, .svco = 1, .spd = 1, .scr = 2, .sbs = 3, .gc3 = 3},
+       { .lomax = 401000000, .svco = 2, .spd = 1, .scr = 2, .sbs = 3, .gc3 = 3},
+       { .lomax = 468000000, .svco = 3, .spd = 1, .scr = 2, .sbs = 3, .gc3 = 1},
+       { .lomax = 535000000, .svco = 0, .spd = 0, .scr = 1, .sbs = 3, .gc3 = 1},
+       { .lomax = 554000000, .svco = 0, .spd = 0, .scr = 2, .sbs = 3, .gc3 = 1},
+       { .lomax = 638000000, .svco = 1, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 1},
+       { .lomax = 669000000, .svco = 1, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 1},
+       { .lomax = 720000000, .svco = 2, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 1},
+       { .lomax = 802000000, .svco = 2, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 1},
+       { .lomax = 835000000, .svco = 3, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 1},
+       { .lomax = 885000000, .svco = 3, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 1},
+       { .lomax = 911000000, .svco = 3, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 1},
+       { .lomax =         0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0}
+};
+
 static struct tda827xa_data tda827xa_analog[] = {
        { .lomax =  56875000, .svco = 3, .spd = 4, .scr = 0, .sbs = 0, .gc3 = 3},
        { .lomax =  67250000, .svco = 0, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 3},
@@ -484,6 +514,7 @@ static int tda827xa_set_params(struct dvb_frontend *fe,
                               struct dvb_frontend_parameters *params)
 {
        struct tda827x_priv *priv = fe->tuner_priv;
+       struct tda827xa_data *frequency_map = tda827xa_dvbt;
        u8 buf[11];
 
        struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
@@ -510,22 +541,27 @@ static int tda827xa_set_params(struct dvb_frontend *fe,
        }
        tuner_freq = params->frequency + if_freq;
 
+       if (fe->ops.info.type == FE_QAM) {
+               dprintk("%s select tda827xa_dvbc\n", __func__);
+               frequency_map = tda827xa_dvbc;
+       }
+
        i = 0;
-       while (tda827xa_dvbt[i].lomax < tuner_freq) {
-               if(tda827xa_dvbt[i + 1].lomax == 0)
+       while (frequency_map[i].lomax < tuner_freq) {
+               if (frequency_map[i + 1].lomax == 0)
                        break;
                i++;
        }
 
-       N = ((tuner_freq + 31250) / 62500) << tda827xa_dvbt[i].spd;
+       N = ((tuner_freq + 31250) / 62500) << frequency_map[i].spd;
        buf[0] = 0;            // subaddress
        buf[1] = N >> 8;
        buf[2] = N & 0xff;
        buf[3] = 0;
        buf[4] = 0x16;
-       buf[5] = (tda827xa_dvbt[i].spd << 5) + (tda827xa_dvbt[i].svco << 3) +
-                       tda827xa_dvbt[i].sbs;
-       buf[6] = 0x4b + (tda827xa_dvbt[i].gc3 << 4);
+       buf[5] = (frequency_map[i].spd << 5) + (frequency_map[i].svco << 3) +
+                       frequency_map[i].sbs;
+       buf[6] = 0x4b + (frequency_map[i].gc3 << 4);
        buf[7] = 0x1c;
        buf[8] = 0x06;
        buf[9] = 0x24;
@@ -584,7 +620,7 @@ static int tda827xa_set_params(struct dvb_frontend *fe,
 
        /* correct CP value */
        buf[0] = 0x30;
-       buf[1] = 0x10 + tda827xa_dvbt[i].scr;
+       buf[1] = 0x10 + frequency_map[i].scr;
        rc = tuner_transfer(fe, &msg, 1);
        if (rc < 0)
                goto err;
@@ -599,7 +635,7 @@ static int tda827xa_set_params(struct dvb_frontend *fe,
        msleep(3);
        /* freeze AGC1 */
        buf[0] = 0x50;
-       buf[1] = 0x4f + (tda827xa_dvbt[i].gc3 << 4);
+       buf[1] = 0x4f + (frequency_map[i].gc3 << 4);
        rc = tuner_transfer(fe, &msg, 1);
        if (rc < 0)
                goto err;