linux/drivers/media/dvb-frontends/lgdt330x.c
<<
>>
Prefs
   1/*
   2 *    Support for LGDT3302 and LGDT3303 - VSB/QAM
   3 *
   4 *    Copyright (C) 2005 Wilson Michaels <wilsonmichaels@earthlink.net>
   5 *
   6 *    This program is free software; you can redistribute it and/or modify
   7 *    it under the terms of the GNU General Public License as published by
   8 *    the Free Software Foundation; either version 2 of the License, or
   9 *    (at your option) any later version.
  10 *
  11 *    This program is distributed in the hope that it will be useful,
  12 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 *    GNU General Public License for more details.
  15 *
  16 *    You should have received a copy of the GNU General Public License
  17 *    along with this program; if not, write to the Free Software
  18 *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19 *
  20 */
  21
  22/*
  23 *                      NOTES ABOUT THIS DRIVER
  24 *
  25 * This Linux driver supports:
  26 *   DViCO FusionHDTV 3 Gold-Q
  27 *   DViCO FusionHDTV 3 Gold-T
  28 *   DViCO FusionHDTV 5 Gold
  29 *   DViCO FusionHDTV 5 Lite
  30 *   DViCO FusionHDTV 5 USB Gold
  31 *   Air2PC/AirStar 2 ATSC 3rd generation (HD5000)
  32 *   pcHDTV HD5500
  33 *
  34 */
  35
  36#include <linux/kernel.h>
  37#include <linux/module.h>
  38#include <linux/init.h>
  39#include <linux/delay.h>
  40#include <linux/string.h>
  41#include <linux/slab.h>
  42#include <asm/byteorder.h>
  43
  44#include "dvb_frontend.h"
  45#include "dvb_math.h"
  46#include "lgdt330x_priv.h"
  47#include "lgdt330x.h"
  48
  49/* Use Equalizer Mean Squared Error instead of Phaser Tracker MSE */
  50/* #define USE_EQMSE */
  51
  52static int debug;
  53module_param(debug, int, 0644);
  54MODULE_PARM_DESC(debug,"Turn on/off lgdt330x frontend debugging (default:off).");
  55#define dprintk(args...) \
  56do { \
  57if (debug) printk(KERN_DEBUG "lgdt330x: " args); \
  58} while (0)
  59
  60struct lgdt330x_state
  61{
  62        struct i2c_adapter* i2c;
  63
  64        /* Configuration settings */
  65        const struct lgdt330x_config* config;
  66
  67        struct dvb_frontend frontend;
  68
  69        /* Demodulator private data */
  70        fe_modulation_t current_modulation;
  71        u32 snr; /* Result of last SNR calculation */
  72
  73        /* Tuner private data */
  74        u32 current_frequency;
  75};
  76
  77static int i2c_write_demod_bytes (struct lgdt330x_state* state,
  78                                  u8 *buf, /* data bytes to send */
  79                                  int len  /* number of bytes to send */ )
  80{
  81        struct i2c_msg msg =
  82                { .addr = state->config->demod_address,
  83                  .flags = 0,
  84                  .buf = buf,
  85                  .len = 2 };
  86        int i;
  87        int err;
  88
  89        for (i=0; i<len-1; i+=2){
  90                if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
  91                        printk(KERN_WARNING "lgdt330x: %s error (addr %02x <- %02x, err = %i)\n", __func__, msg.buf[0], msg.buf[1], err);
  92                        if (err < 0)
  93                                return err;
  94                        else
  95                                return -EREMOTEIO;
  96                }
  97                msg.buf += 2;
  98        }
  99        return 0;
 100}
 101
 102/*
 103 * This routine writes the register (reg) to the demod bus
 104 * then reads the data returned for (len) bytes.
 105 */
 106
 107static int i2c_read_demod_bytes(struct lgdt330x_state *state,
 108                                enum I2C_REG reg, u8 *buf, int len)
 109{
 110        u8 wr [] = { reg };
 111        struct i2c_msg msg [] = {
 112                { .addr = state->config->demod_address,
 113                  .flags = 0, .buf = wr,  .len = 1 },
 114                { .addr = state->config->demod_address,
 115                  .flags = I2C_M_RD, .buf = buf, .len = len },
 116        };
 117        int ret;
 118        ret = i2c_transfer(state->i2c, msg, 2);
 119        if (ret != 2) {
 120                printk(KERN_WARNING "lgdt330x: %s: addr 0x%02x select 0x%02x error (ret == %i)\n", __func__, state->config->demod_address, reg, ret);
 121                if (ret >= 0)
 122                        ret = -EIO;
 123        } else {
 124                ret = 0;
 125        }
 126        return ret;
 127}
 128
 129/* Software reset */
 130static int lgdt3302_SwReset(struct lgdt330x_state* state)
 131{
 132        u8 ret;
 133        u8 reset[] = {
 134                IRQ_MASK,
 135                0x00 /* bit 6 is active low software reset
 136                      * bits 5-0 are 1 to mask interrupts */
 137        };
 138
 139        ret = i2c_write_demod_bytes(state,
 140                                    reset, sizeof(reset));
 141        if (ret == 0) {
 142
 143                /* force reset high (inactive) and unmask interrupts */
 144                reset[1] = 0x7f;
 145                ret = i2c_write_demod_bytes(state,
 146                                            reset, sizeof(reset));
 147        }
 148        return ret;
 149}
 150
 151static int lgdt3303_SwReset(struct lgdt330x_state* state)
 152{
 153        u8 ret;
 154        u8 reset[] = {
 155                0x02,
 156                0x00 /* bit 0 is active low software reset */
 157        };
 158
 159        ret = i2c_write_demod_bytes(state,
 160                                    reset, sizeof(reset));
 161        if (ret == 0) {
 162
 163                /* force reset high (inactive) */
 164                reset[1] = 0x01;
 165                ret = i2c_write_demod_bytes(state,
 166                                            reset, sizeof(reset));
 167        }
 168        return ret;
 169}
 170
 171static int lgdt330x_SwReset(struct lgdt330x_state* state)
 172{
 173        switch (state->config->demod_chip) {
 174        case LGDT3302:
 175                return lgdt3302_SwReset(state);
 176        case LGDT3303:
 177                return lgdt3303_SwReset(state);
 178        default:
 179                return -ENODEV;
 180        }
 181}
 182
 183static int lgdt330x_init(struct dvb_frontend* fe)
 184{
 185        /* Hardware reset is done using gpio[0] of cx23880x chip.
 186         * I'd like to do it here, but don't know how to find chip address.
 187         * cx88-cards.c arranges for the reset bit to be inactive (high).
 188         * Maybe there needs to be a callable function in cx88-core or
 189         * the caller of this function needs to do it. */
 190
 191        /*
 192         * Array of byte pairs <address, value>
 193         * to initialize each different chip
 194         */
 195        static u8 lgdt3302_init_data[] = {
 196                /* Use 50MHz parameter values from spec sheet since xtal is 50 */
 197                /* Change the value of NCOCTFV[25:0] of carrier
 198                   recovery center frequency register */
 199                VSB_CARRIER_FREQ0, 0x00,
 200                VSB_CARRIER_FREQ1, 0x87,
 201                VSB_CARRIER_FREQ2, 0x8e,
 202                VSB_CARRIER_FREQ3, 0x01,
 203                /* Change the TPCLK pin polarity
 204                   data is valid on falling clock */
 205                DEMUX_CONTROL, 0xfb,
 206                /* Change the value of IFBW[11:0] of
 207                   AGC IF/RF loop filter bandwidth register */
 208                AGC_RF_BANDWIDTH0, 0x40,
 209                AGC_RF_BANDWIDTH1, 0x93,
 210                AGC_RF_BANDWIDTH2, 0x00,
 211                /* Change the value of bit 6, 'nINAGCBY' and
 212                   'NSSEL[1:0] of ACG function control register 2 */
 213                AGC_FUNC_CTRL2, 0xc6,
 214                /* Change the value of bit 6 'RFFIX'
 215                   of AGC function control register 3 */
 216                AGC_FUNC_CTRL3, 0x40,
 217                /* Set the value of 'INLVTHD' register 0x2a/0x2c
 218                   to 0x7fe */
 219                AGC_DELAY0, 0x07,
 220                AGC_DELAY2, 0xfe,
 221                /* Change the value of IAGCBW[15:8]
 222                   of inner AGC loop filter bandwidth */
 223                AGC_LOOP_BANDWIDTH0, 0x08,
 224                AGC_LOOP_BANDWIDTH1, 0x9a
 225        };
 226
 227        static u8 lgdt3303_init_data[] = {
 228                0x4c, 0x14
 229        };
 230
 231        static u8 flip_1_lgdt3303_init_data[] = {
 232                0x4c, 0x14,
 233                0x87, 0xf3
 234        };
 235
 236        static u8 flip_2_lgdt3303_init_data[] = {
 237                0x4c, 0x14,
 238                0x87, 0xda
 239        };
 240
 241        struct lgdt330x_state* state = fe->demodulator_priv;
 242        char  *chip_name;
 243        int    err;
 244
 245        switch (state->config->demod_chip) {
 246        case LGDT3302:
 247                chip_name = "LGDT3302";
 248                err = i2c_write_demod_bytes(state, lgdt3302_init_data,
 249                                            sizeof(lgdt3302_init_data));
 250                break;
 251        case LGDT3303:
 252                chip_name = "LGDT3303";
 253                switch (state->config->clock_polarity_flip) {
 254                case 2:
 255                        err = i2c_write_demod_bytes(state,
 256                                        flip_2_lgdt3303_init_data,
 257                                        sizeof(flip_2_lgdt3303_init_data));
 258                        break;
 259                case 1:
 260                        err = i2c_write_demod_bytes(state,
 261                                        flip_1_lgdt3303_init_data,
 262                                        sizeof(flip_1_lgdt3303_init_data));
 263                        break;
 264                case 0:
 265                default:
 266                        err = i2c_write_demod_bytes(state, lgdt3303_init_data,
 267                                                    sizeof(lgdt3303_init_data));
 268                }
 269                break;
 270        default:
 271                chip_name = "undefined";
 272                printk (KERN_WARNING "Only LGDT3302 and LGDT3303 are supported chips.\n");
 273                err = -ENODEV;
 274        }
 275        dprintk("%s entered as %s\n", __func__, chip_name);
 276        if (err < 0)
 277                return err;
 278        return lgdt330x_SwReset(state);
 279}
 280
 281static int lgdt330x_read_ber(struct dvb_frontend* fe, u32* ber)
 282{
 283        *ber = 0; /* Not supplied by the demod chips */
 284        return 0;
 285}
 286
 287static int lgdt330x_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 288{
 289        struct lgdt330x_state* state = fe->demodulator_priv;
 290        int err;
 291        u8 buf[2];
 292
 293        *ucblocks = 0;
 294
 295        switch (state->config->demod_chip) {
 296        case LGDT3302:
 297                err = i2c_read_demod_bytes(state, LGDT3302_PACKET_ERR_COUNTER1,
 298                                           buf, sizeof(buf));
 299                break;
 300        case LGDT3303:
 301                err = i2c_read_demod_bytes(state, LGDT3303_PACKET_ERR_COUNTER1,
 302                                           buf, sizeof(buf));
 303                break;
 304        default:
 305                printk(KERN_WARNING
 306                       "Only LGDT3302 and LGDT3303 are supported chips.\n");
 307                err = -ENODEV;
 308        }
 309        if (err < 0)
 310                return err;
 311
 312        *ucblocks = (buf[0] << 8) | buf[1];
 313        return 0;
 314}
 315
 316static int lgdt330x_set_parameters(struct dvb_frontend *fe)
 317{
 318        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
 319        /*
 320         * Array of byte pairs <address, value>
 321         * to initialize 8VSB for lgdt3303 chip 50 MHz IF
 322         */
 323        static u8 lgdt3303_8vsb_44_data[] = {
 324                0x04, 0x00,
 325                0x0d, 0x40,
 326                0x0e, 0x87,
 327                0x0f, 0x8e,
 328                0x10, 0x01,
 329                0x47, 0x8b };
 330
 331        /*
 332         * Array of byte pairs <address, value>
 333         * to initialize QAM for lgdt3303 chip
 334         */
 335        static u8 lgdt3303_qam_data[] = {
 336                0x04, 0x00,
 337                0x0d, 0x00,
 338                0x0e, 0x00,
 339                0x0f, 0x00,
 340                0x10, 0x00,
 341                0x51, 0x63,
 342                0x47, 0x66,
 343                0x48, 0x66,
 344                0x4d, 0x1a,
 345                0x49, 0x08,
 346                0x4a, 0x9b };
 347
 348        struct lgdt330x_state* state = fe->demodulator_priv;
 349
 350        static u8 top_ctrl_cfg[]   = { TOP_CONTROL, 0x03 };
 351
 352        int err = 0;
 353        /* Change only if we are actually changing the modulation */
 354        if (state->current_modulation != p->modulation) {
 355                switch (p->modulation) {
 356                case VSB_8:
 357                        dprintk("%s: VSB_8 MODE\n", __func__);
 358
 359                        /* Select VSB mode */
 360                        top_ctrl_cfg[1] = 0x03;
 361
 362                        /* Select ANT connector if supported by card */
 363                        if (state->config->pll_rf_set)
 364                                state->config->pll_rf_set(fe, 1);
 365
 366                        if (state->config->demod_chip == LGDT3303) {
 367                                err = i2c_write_demod_bytes(state, lgdt3303_8vsb_44_data,
 368                                                            sizeof(lgdt3303_8vsb_44_data));
 369                        }
 370                        break;
 371
 372                case QAM_64:
 373                        dprintk("%s: QAM_64 MODE\n", __func__);
 374
 375                        /* Select QAM_64 mode */
 376                        top_ctrl_cfg[1] = 0x00;
 377
 378                        /* Select CABLE connector if supported by card */
 379                        if (state->config->pll_rf_set)
 380                                state->config->pll_rf_set(fe, 0);
 381
 382                        if (state->config->demod_chip == LGDT3303) {
 383                                err = i2c_write_demod_bytes(state, lgdt3303_qam_data,
 384                                                                                        sizeof(lgdt3303_qam_data));
 385                        }
 386                        break;
 387
 388                case QAM_256:
 389                        dprintk("%s: QAM_256 MODE\n", __func__);
 390
 391                        /* Select QAM_256 mode */
 392                        top_ctrl_cfg[1] = 0x01;
 393
 394                        /* Select CABLE connector if supported by card */
 395                        if (state->config->pll_rf_set)
 396                                state->config->pll_rf_set(fe, 0);
 397
 398                        if (state->config->demod_chip == LGDT3303) {
 399                                err = i2c_write_demod_bytes(state, lgdt3303_qam_data,
 400                                                                                        sizeof(lgdt3303_qam_data));
 401                        }
 402                        break;
 403                default:
 404                        printk(KERN_WARNING "lgdt330x: %s: Modulation type(%d) UNSUPPORTED\n", __func__, p->modulation);
 405                        return -1;
 406                }
 407                if (err < 0)
 408                        printk(KERN_WARNING "lgdt330x: %s: error blasting "
 409                               "bytes to lgdt3303 for modulation type(%d)\n",
 410                               __func__, p->modulation);
 411
 412                /*
 413                 * select serial or parallel MPEG harware interface
 414                 * Serial:   0x04 for LGDT3302 or 0x40 for LGDT3303
 415                 * Parallel: 0x00
 416                 */
 417                top_ctrl_cfg[1] |= state->config->serial_mpeg;
 418
 419                /* Select the requested mode */
 420                i2c_write_demod_bytes(state, top_ctrl_cfg,
 421                                      sizeof(top_ctrl_cfg));
 422                if (state->config->set_ts_params)
 423                        state->config->set_ts_params(fe, 0);
 424                state->current_modulation = p->modulation;
 425        }
 426
 427        /* Tune to the specified frequency */
 428        if (fe->ops.tuner_ops.set_params) {
 429                fe->ops.tuner_ops.set_params(fe);
 430                if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
 431        }
 432
 433        /* Keep track of the new frequency */
 434        /* FIXME this is the wrong way to do this...           */
 435        /* The tuner is shared with the video4linux analog API */
 436        state->current_frequency = p->frequency;
 437
 438        lgdt330x_SwReset(state);
 439        return 0;
 440}
 441
 442static int lgdt330x_get_frontend(struct dvb_frontend *fe)
 443{
 444        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
 445        struct lgdt330x_state *state = fe->demodulator_priv;
 446        p->frequency = state->current_frequency;
 447        return 0;
 448}
 449
 450static int lgdt3302_read_status(struct dvb_frontend* fe, fe_status_t* status)
 451{
 452        struct lgdt330x_state* state = fe->demodulator_priv;
 453        u8 buf[3];
 454
 455        *status = 0; /* Reset status result */
 456
 457        /* AGC status register */
 458        i2c_read_demod_bytes(state, AGC_STATUS, buf, 1);
 459        dprintk("%s: AGC_STATUS = 0x%02x\n", __func__, buf[0]);
 460        if ((buf[0] & 0x0c) == 0x8){
 461                /* Test signal does not exist flag */
 462                /* as well as the AGC lock flag.   */
 463                *status |= FE_HAS_SIGNAL;
 464        }
 465
 466        /*
 467         * You must set the Mask bits to 1 in the IRQ_MASK in order
 468         * to see that status bit in the IRQ_STATUS register.
 469         * This is done in SwReset();
 470         */
 471        /* signal status */
 472        i2c_read_demod_bytes(state, TOP_CONTROL, buf, sizeof(buf));
 473        dprintk("%s: TOP_CONTROL = 0x%02x, IRO_MASK = 0x%02x, IRQ_STATUS = 0x%02x\n", __func__, buf[0], buf[1], buf[2]);
 474
 475
 476        /* sync status */
 477        if ((buf[2] & 0x03) == 0x01) {
 478                *status |= FE_HAS_SYNC;
 479        }
 480
 481        /* FEC error status */
 482        if ((buf[2] & 0x0c) == 0x08) {
 483                *status |= FE_HAS_LOCK;
 484                *status |= FE_HAS_VITERBI;
 485        }
 486
 487        /* Carrier Recovery Lock Status Register */
 488        i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
 489        dprintk("%s: CARRIER_LOCK = 0x%02x\n", __func__, buf[0]);
 490        switch (state->current_modulation) {
 491        case QAM_256:
 492        case QAM_64:
 493                /* Need to understand why there are 3 lock levels here */
 494                if ((buf[0] & 0x07) == 0x07)
 495                        *status |= FE_HAS_CARRIER;
 496                break;
 497        case VSB_8:
 498                if ((buf[0] & 0x80) == 0x80)
 499                        *status |= FE_HAS_CARRIER;
 500                break;
 501        default:
 502                printk(KERN_WARNING "lgdt330x: %s: Modulation set to unsupported value\n", __func__);
 503        }
 504
 505        return 0;
 506}
 507
 508static int lgdt3303_read_status(struct dvb_frontend* fe, fe_status_t* status)
 509{
 510        struct lgdt330x_state* state = fe->demodulator_priv;
 511        int err;
 512        u8 buf[3];
 513
 514        *status = 0; /* Reset status result */
 515
 516        /* lgdt3303 AGC status register */
 517        err = i2c_read_demod_bytes(state, 0x58, buf, 1);
 518        if (err < 0)
 519                return err;
 520
 521        dprintk("%s: AGC_STATUS = 0x%02x\n", __func__, buf[0]);
 522        if ((buf[0] & 0x21) == 0x01){
 523                /* Test input signal does not exist flag */
 524                /* as well as the AGC lock flag.   */
 525                *status |= FE_HAS_SIGNAL;
 526        }
 527
 528        /* Carrier Recovery Lock Status Register */
 529        i2c_read_demod_bytes(state, CARRIER_LOCK, buf, 1);
 530        dprintk("%s: CARRIER_LOCK = 0x%02x\n", __func__, buf[0]);
 531        switch (state->current_modulation) {
 532        case QAM_256:
 533        case QAM_64:
 534                /* Need to understand why there are 3 lock levels here */
 535                if ((buf[0] & 0x07) == 0x07)
 536                        *status |= FE_HAS_CARRIER;
 537                else
 538                        break;
 539                i2c_read_demod_bytes(state, 0x8a, buf, 1);
 540                if ((buf[0] & 0x04) == 0x04)
 541                        *status |= FE_HAS_SYNC;
 542                if ((buf[0] & 0x01) == 0x01)
 543                        *status |= FE_HAS_LOCK;
 544                if ((buf[0] & 0x08) == 0x08)
 545                        *status |= FE_HAS_VITERBI;
 546                break;
 547        case VSB_8:
 548                if ((buf[0] & 0x80) == 0x80)
 549                        *status |= FE_HAS_CARRIER;
 550                else
 551                        break;
 552                i2c_read_demod_bytes(state, 0x38, buf, 1);
 553                if ((buf[0] & 0x02) == 0x00)
 554                        *status |= FE_HAS_SYNC;
 555                if ((buf[0] & 0x01) == 0x01) {
 556                        *status |= FE_HAS_LOCK;
 557                        *status |= FE_HAS_VITERBI;
 558                }
 559                break;
 560        default:
 561                printk(KERN_WARNING "lgdt330x: %s: Modulation set to unsupported value\n", __func__);
 562        }
 563        return 0;
 564}
 565
 566/* Calculate SNR estimation (scaled by 2^24)
 567
 568   8-VSB SNR equations from LGDT3302 and LGDT3303 datasheets, QAM
 569   equations from LGDT3303 datasheet.  VSB is the same between the '02
 570   and '03, so maybe QAM is too?  Perhaps someone with a newer datasheet
 571   that has QAM information could verify?
 572
 573   For 8-VSB: (two ways, take your pick)
 574   LGDT3302:
 575     SNR_EQ = 10 * log10(25 * 24^2 / EQ_MSE)
 576   LGDT3303:
 577     SNR_EQ = 10 * log10(25 * 32^2 / EQ_MSE)
 578   LGDT3302 & LGDT3303:
 579     SNR_PT = 10 * log10(25 * 32^2 / PT_MSE)  (we use this one)
 580   For 64-QAM:
 581     SNR    = 10 * log10( 688128   / MSEQAM)
 582   For 256-QAM:
 583     SNR    = 10 * log10( 696320   / MSEQAM)
 584
 585   We re-write the snr equation as:
 586     SNR * 2^24 = 10*(c - intlog10(MSE))
 587   Where for 256-QAM, c = log10(696320) * 2^24, and so on. */
 588
 589static u32 calculate_snr(u32 mse, u32 c)
 590{
 591        if (mse == 0) /* No signal */
 592                return 0;
 593
 594        mse = intlog10(mse);
 595        if (mse > c) {
 596                /* Negative SNR, which is possible, but realisticly the
 597                demod will lose lock before the signal gets this bad.  The
 598                API only allows for unsigned values, so just return 0 */
 599                return 0;
 600        }
 601        return 10*(c - mse);
 602}
 603
 604static int lgdt3302_read_snr(struct dvb_frontend* fe, u16* snr)
 605{
 606        struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
 607        u8 buf[5];      /* read data buffer */
 608        u32 noise;      /* noise value */
 609        u32 c;          /* per-modulation SNR calculation constant */
 610
 611        switch(state->current_modulation) {
 612        case VSB_8:
 613                i2c_read_demod_bytes(state, LGDT3302_EQPH_ERR0, buf, 5);
 614#ifdef USE_EQMSE
 615                /* Use Equalizer Mean-Square Error Register */
 616                /* SNR for ranges from -15.61 to +41.58 */
 617                noise = ((buf[0] & 7) << 16) | (buf[1] << 8) | buf[2];
 618                c = 69765745; /* log10(25*24^2)*2^24 */
 619#else
 620                /* Use Phase Tracker Mean-Square Error Register */
 621                /* SNR for ranges from -13.11 to +44.08 */
 622                noise = ((buf[0] & 7<<3) << 13) | (buf[3] << 8) | buf[4];
 623                c = 73957994; /* log10(25*32^2)*2^24 */
 624#endif
 625                break;
 626        case QAM_64:
 627        case QAM_256:
 628                i2c_read_demod_bytes(state, CARRIER_MSEQAM1, buf, 2);
 629                noise = ((buf[0] & 3) << 8) | buf[1];
 630                c = state->current_modulation == QAM_64 ? 97939837 : 98026066;
 631                /* log10(688128)*2^24 and log10(696320)*2^24 */
 632                break;
 633        default:
 634                printk(KERN_ERR "lgdt330x: %s: Modulation set to unsupported value\n",
 635                       __func__);
 636                return -EREMOTEIO; /* return -EDRIVER_IS_GIBBERED; */
 637        }
 638
 639        state->snr = calculate_snr(noise, c);
 640        *snr = (state->snr) >> 16; /* Convert from 8.24 fixed-point to 8.8 */
 641
 642        dprintk("%s: noise = 0x%08x, snr = %d.%02d dB\n", __func__, noise,
 643                state->snr >> 24, (((state->snr>>8) & 0xffff) * 100) >> 16);
 644
 645        return 0;
 646}
 647
 648static int lgdt3303_read_snr(struct dvb_frontend* fe, u16* snr)
 649{
 650        struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
 651        u8 buf[5];      /* read data buffer */
 652        u32 noise;      /* noise value */
 653        u32 c;          /* per-modulation SNR calculation constant */
 654
 655        switch(state->current_modulation) {
 656        case VSB_8:
 657                i2c_read_demod_bytes(state, LGDT3303_EQPH_ERR0, buf, 5);
 658#ifdef USE_EQMSE
 659                /* Use Equalizer Mean-Square Error Register */
 660                /* SNR for ranges from -16.12 to +44.08 */
 661                noise = ((buf[0] & 0x78) << 13) | (buf[1] << 8) | buf[2];
 662                c = 73957994; /* log10(25*32^2)*2^24 */
 663#else
 664                /* Use Phase Tracker Mean-Square Error Register */
 665                /* SNR for ranges from -13.11 to +44.08 */
 666                noise = ((buf[0] & 7) << 16) | (buf[3] << 8) | buf[4];
 667                c = 73957994; /* log10(25*32^2)*2^24 */
 668#endif
 669                break;
 670        case QAM_64:
 671        case QAM_256:
 672                i2c_read_demod_bytes(state, CARRIER_MSEQAM1, buf, 2);
 673                noise = (buf[0] << 8) | buf[1];
 674                c = state->current_modulation == QAM_64 ? 97939837 : 98026066;
 675                /* log10(688128)*2^24 and log10(696320)*2^24 */
 676                break;
 677        default:
 678                printk(KERN_ERR "lgdt330x: %s: Modulation set to unsupported value\n",
 679                       __func__);
 680                return -EREMOTEIO; /* return -EDRIVER_IS_GIBBERED; */
 681        }
 682
 683        state->snr = calculate_snr(noise, c);
 684        *snr = (state->snr) >> 16; /* Convert from 8.24 fixed-point to 8.8 */
 685
 686        dprintk("%s: noise = 0x%08x, snr = %d.%02d dB\n", __func__, noise,
 687                state->snr >> 24, (((state->snr >> 8) & 0xffff) * 100) >> 16);
 688
 689        return 0;
 690}
 691
 692static int lgdt330x_read_signal_strength(struct dvb_frontend* fe, u16* strength)
 693{
 694        /* Calculate Strength from SNR up to 35dB */
 695        /* Even though the SNR can go higher than 35dB, there is some comfort */
 696        /* factor in having a range of strong signals that can show at 100%   */
 697        struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
 698        u16 snr;
 699        int ret;
 700
 701        ret = fe->ops.read_snr(fe, &snr);
 702        if (ret != 0)
 703                return ret;
 704        /* Rather than use the 8.8 value snr, use state->snr which is 8.24 */
 705        /* scale the range 0 - 35*2^24 into 0 - 65535 */
 706        if (state->snr >= 8960 * 0x10000)
 707                *strength = 0xffff;
 708        else
 709                *strength = state->snr / 8960;
 710
 711        return 0;
 712}
 713
 714static int lgdt330x_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fe_tune_settings)
 715{
 716        /* I have no idea about this - it may not be needed */
 717        fe_tune_settings->min_delay_ms = 500;
 718        fe_tune_settings->step_size = 0;
 719        fe_tune_settings->max_drift = 0;
 720        return 0;
 721}
 722
 723static void lgdt330x_release(struct dvb_frontend* fe)
 724{
 725        struct lgdt330x_state* state = (struct lgdt330x_state*) fe->demodulator_priv;
 726        kfree(state);
 727}
 728
 729static struct dvb_frontend_ops lgdt3302_ops;
 730static struct dvb_frontend_ops lgdt3303_ops;
 731
 732struct dvb_frontend* lgdt330x_attach(const struct lgdt330x_config* config,
 733                                     struct i2c_adapter* i2c)
 734{
 735        struct lgdt330x_state* state = NULL;
 736        u8 buf[1];
 737
 738        /* Allocate memory for the internal state */
 739        state = kzalloc(sizeof(struct lgdt330x_state), GFP_KERNEL);
 740        if (state == NULL)
 741                goto error;
 742
 743        /* Setup the state */
 744        state->config = config;
 745        state->i2c = i2c;
 746
 747        /* Create dvb_frontend */
 748        switch (config->demod_chip) {
 749        case LGDT3302:
 750                memcpy(&state->frontend.ops, &lgdt3302_ops, sizeof(struct dvb_frontend_ops));
 751                break;
 752        case LGDT3303:
 753                memcpy(&state->frontend.ops, &lgdt3303_ops, sizeof(struct dvb_frontend_ops));
 754                break;
 755        default:
 756                goto error;
 757        }
 758        state->frontend.demodulator_priv = state;
 759
 760        /* Verify communication with demod chip */
 761        if (i2c_read_demod_bytes(state, 2, buf, 1))
 762                goto error;
 763
 764        state->current_frequency = -1;
 765        state->current_modulation = -1;
 766
 767        return &state->frontend;
 768
 769error:
 770        kfree(state);
 771        dprintk("%s: ERROR\n",__func__);
 772        return NULL;
 773}
 774
 775static struct dvb_frontend_ops lgdt3302_ops = {
 776        .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
 777        .info = {
 778                .name= "LG Electronics LGDT3302 VSB/QAM Frontend",
 779                .frequency_min= 54000000,
 780                .frequency_max= 858000000,
 781                .frequency_stepsize= 62500,
 782                .symbol_rate_min    = 5056941,  /* QAM 64 */
 783                .symbol_rate_max    = 10762000, /* VSB 8  */
 784                .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
 785        },
 786        .init                 = lgdt330x_init,
 787        .set_frontend         = lgdt330x_set_parameters,
 788        .get_frontend         = lgdt330x_get_frontend,
 789        .get_tune_settings    = lgdt330x_get_tune_settings,
 790        .read_status          = lgdt3302_read_status,
 791        .read_ber             = lgdt330x_read_ber,
 792        .read_signal_strength = lgdt330x_read_signal_strength,
 793        .read_snr             = lgdt3302_read_snr,
 794        .read_ucblocks        = lgdt330x_read_ucblocks,
 795        .release              = lgdt330x_release,
 796};
 797
 798static struct dvb_frontend_ops lgdt3303_ops = {
 799        .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
 800        .info = {
 801                .name= "LG Electronics LGDT3303 VSB/QAM Frontend",
 802                .frequency_min= 54000000,
 803                .frequency_max= 858000000,
 804                .frequency_stepsize= 62500,
 805                .symbol_rate_min    = 5056941,  /* QAM 64 */
 806                .symbol_rate_max    = 10762000, /* VSB 8  */
 807                .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
 808        },
 809        .init                 = lgdt330x_init,
 810        .set_frontend         = lgdt330x_set_parameters,
 811        .get_frontend         = lgdt330x_get_frontend,
 812        .get_tune_settings    = lgdt330x_get_tune_settings,
 813        .read_status          = lgdt3303_read_status,
 814        .read_ber             = lgdt330x_read_ber,
 815        .read_signal_strength = lgdt330x_read_signal_strength,
 816        .read_snr             = lgdt3303_read_snr,
 817        .read_ucblocks        = lgdt330x_read_ucblocks,
 818        .release              = lgdt330x_release,
 819};
 820
 821MODULE_DESCRIPTION("LGDT330X (ATSC 8VSB & ITU-T J.83 AnnexB 64/256 QAM) Demodulator Driver");
 822MODULE_AUTHOR("Wilson Michaels");
 823MODULE_LICENSE("GPL");
 824
 825EXPORT_SYMBOL(lgdt330x_attach);
 826
 827/*
 828 * Local variables:
 829 * c-basic-offset: 8
 830 * End:
 831 */
 832