linux/drivers/media/dvb/frontends/cx24116.c
<<
>>
Prefs
   1/*
   2    Conexant cx24116/cx24118 - DVBS/S2 Satellite demod/tuner driver
   3
   4    Copyright (C) 2006-2008 Steven Toth <stoth@hauppauge.com>
   5    Copyright (C) 2006-2007 Georg Acher
   6    Copyright (C) 2007-2008 Darron Broad
   7        March 2007
   8            Fixed some bugs.
   9            Added diseqc support.
  10            Added corrected signal strength support.
  11        August 2007
  12            Sync with legacy version.
  13            Some clean ups.
  14    Copyright (C) 2008 Igor Liplianin
  15        September, 9th 2008
  16            Fixed locking on high symbol rates (>30000).
  17            Implement MPEG initialization parameter.
  18        January, 17th 2009
  19            Fill set_voltage with actually control voltage code.
  20            Correct set tone to not affect voltage.
  21
  22    This program is free software; you can redistribute it and/or modify
  23    it under the terms of the GNU General Public License as published by
  24    the Free Software Foundation; either version 2 of the License, or
  25    (at your option) any later version.
  26
  27    This program is distributed in the hope that it will be useful,
  28    but WITHOUT ANY WARRANTY; without even the implied warranty of
  29    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  30    GNU General Public License for more details.
  31
  32    You should have received a copy of the GNU General Public License
  33    along with this program; if not, write to the Free Software
  34    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  35*/
  36
  37#include <linux/slab.h>
  38#include <linux/kernel.h>
  39#include <linux/module.h>
  40#include <linux/moduleparam.h>
  41#include <linux/init.h>
  42#include <linux/firmware.h>
  43
  44#include "dvb_frontend.h"
  45#include "cx24116.h"
  46
  47static int debug;
  48module_param(debug, int, 0644);
  49MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
  50
  51#define dprintk(args...) \
  52        do { \
  53                if (debug) \
  54                        printk(KERN_INFO "cx24116: " args); \
  55        } while (0)
  56
  57#define CX24116_DEFAULT_FIRMWARE "dvb-fe-cx24116.fw"
  58#define CX24116_SEARCH_RANGE_KHZ 5000
  59
  60/* known registers */
  61#define CX24116_REG_COMMAND (0x00)      /* command args 0x00..0x1e */
  62#define CX24116_REG_EXECUTE (0x1f)      /* execute command */
  63#define CX24116_REG_MAILBOX (0x96)      /* FW or multipurpose mailbox? */
  64#define CX24116_REG_RESET   (0x20)      /* reset status > 0     */
  65#define CX24116_REG_SIGNAL  (0x9e)      /* signal low           */
  66#define CX24116_REG_SSTATUS (0x9d)      /* signal high / status */
  67#define CX24116_REG_QUALITY8 (0xa3)
  68#define CX24116_REG_QSTATUS (0xbc)
  69#define CX24116_REG_QUALITY0 (0xd5)
  70#define CX24116_REG_BER0    (0xc9)
  71#define CX24116_REG_BER8    (0xc8)
  72#define CX24116_REG_BER16   (0xc7)
  73#define CX24116_REG_BER24   (0xc6)
  74#define CX24116_REG_UCB0    (0xcb)
  75#define CX24116_REG_UCB8    (0xca)
  76#define CX24116_REG_CLKDIV  (0xf3)
  77#define CX24116_REG_RATEDIV (0xf9)
  78
  79/* configured fec (not tuned) or actual FEC (tuned) 1=1/2 2=2/3 etc */
  80#define CX24116_REG_FECSTATUS (0x9c)
  81
  82/* FECSTATUS bits */
  83/* mask to determine configured fec (not tuned) or actual fec (tuned) */
  84#define CX24116_FEC_FECMASK   (0x1f)
  85
  86/* Select DVB-S demodulator, else DVB-S2 */
  87#define CX24116_FEC_DVBS      (0x20)
  88#define CX24116_FEC_UNKNOWN   (0x40)    /* Unknown/unused */
  89
  90/* Pilot mode requested when tuning else always reset when tuned */
  91#define CX24116_FEC_PILOT     (0x80)
  92
  93/* arg buffer size */
  94#define CX24116_ARGLEN (0x1e)
  95
  96/* rolloff */
  97#define CX24116_ROLLOFF_020 (0x00)
  98#define CX24116_ROLLOFF_025 (0x01)
  99#define CX24116_ROLLOFF_035 (0x02)
 100
 101/* pilot bit */
 102#define CX24116_PILOT_OFF (0x00)
 103#define CX24116_PILOT_ON (0x40)
 104
 105/* signal status */
 106#define CX24116_HAS_SIGNAL   (0x01)
 107#define CX24116_HAS_CARRIER  (0x02)
 108#define CX24116_HAS_VITERBI  (0x04)
 109#define CX24116_HAS_SYNCLOCK (0x08)
 110#define CX24116_HAS_UNKNOWN1 (0x10)
 111#define CX24116_HAS_UNKNOWN2 (0x20)
 112#define CX24116_STATUS_MASK  (0x0f)
 113#define CX24116_SIGNAL_MASK  (0xc0)
 114
 115#define CX24116_DISEQC_TONEOFF   (0)    /* toneburst never sent */
 116#define CX24116_DISEQC_TONECACHE (1)    /* toneburst cached     */
 117#define CX24116_DISEQC_MESGCACHE (2)    /* message cached       */
 118
 119/* arg offset for DiSEqC */
 120#define CX24116_DISEQC_BURST  (1)
 121#define CX24116_DISEQC_ARG2_2 (2)   /* unknown value=2 */
 122#define CX24116_DISEQC_ARG3_0 (3)   /* unknown value=0 */
 123#define CX24116_DISEQC_ARG4_0 (4)   /* unknown value=0 */
 124#define CX24116_DISEQC_MSGLEN (5)
 125#define CX24116_DISEQC_MSGOFS (6)
 126
 127/* DiSEqC burst */
 128#define CX24116_DISEQC_MINI_A (0)
 129#define CX24116_DISEQC_MINI_B (1)
 130
 131/* DiSEqC tone burst */
 132static int toneburst = 1;
 133module_param(toneburst, int, 0644);
 134MODULE_PARM_DESC(toneburst, "DiSEqC toneburst 0=OFF, 1=TONE CACHE, "\
 135        "2=MESSAGE CACHE (default:1)");
 136
 137/* SNR measurements */
 138static int esno_snr;
 139module_param(esno_snr, int, 0644);
 140MODULE_PARM_DESC(esno_snr, "SNR return units, 0=PERCENTAGE 0-100, "\
 141        "1=ESNO(db * 10) (default:0)");
 142
 143enum cmds {
 144        CMD_SET_VCO     = 0x10,
 145        CMD_TUNEREQUEST = 0x11,
 146        CMD_MPEGCONFIG  = 0x13,
 147        CMD_TUNERINIT   = 0x14,
 148        CMD_BANDWIDTH   = 0x15,
 149        CMD_GETAGC      = 0x19,
 150        CMD_LNBCONFIG   = 0x20,
 151        CMD_LNBSEND     = 0x21, /* Formerly CMD_SEND_DISEQC */
 152        CMD_LNBDCLEVEL  = 0x22,
 153        CMD_SET_TONE    = 0x23,
 154        CMD_UPDFWVERS   = 0x35,
 155        CMD_TUNERSLEEP  = 0x36,
 156        CMD_AGCCONTROL  = 0x3b, /* Unknown */
 157};
 158
 159/* The Demod/Tuner can't easily provide these, we cache them */
 160struct cx24116_tuning {
 161        u32 frequency;
 162        u32 symbol_rate;
 163        fe_spectral_inversion_t inversion;
 164        fe_code_rate_t fec;
 165
 166        fe_delivery_system_t delsys;
 167        fe_modulation_t modulation;
 168        fe_pilot_t pilot;
 169        fe_rolloff_t rolloff;
 170
 171        /* Demod values */
 172        u8 fec_val;
 173        u8 fec_mask;
 174        u8 inversion_val;
 175        u8 pilot_val;
 176        u8 rolloff_val;
 177};
 178
 179/* Basic commands that are sent to the firmware */
 180struct cx24116_cmd {
 181        u8 len;
 182        u8 args[CX24116_ARGLEN];
 183};
 184
 185struct cx24116_state {
 186        struct i2c_adapter *i2c;
 187        const struct cx24116_config *config;
 188
 189        struct dvb_frontend frontend;
 190
 191        struct cx24116_tuning dcur;
 192        struct cx24116_tuning dnxt;
 193
 194        u8 skip_fw_load;
 195        u8 burst;
 196        struct cx24116_cmd dsec_cmd;
 197};
 198
 199static int cx24116_writereg(struct cx24116_state *state, int reg, int data)
 200{
 201        u8 buf[] = { reg, data };
 202        struct i2c_msg msg = { .addr = state->config->demod_address,
 203                .flags = 0, .buf = buf, .len = 2 };
 204        int err;
 205
 206        if (debug > 1)
 207                printk("cx24116: %s: write reg 0x%02x, value 0x%02x\n",
 208                        __func__, reg, data);
 209
 210        err = i2c_transfer(state->i2c, &msg, 1);
 211        if (err != 1) {
 212                printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x,"
 213                         " value == 0x%02x)\n", __func__, err, reg, data);
 214                return -EREMOTEIO;
 215        }
 216
 217        return 0;
 218}
 219
 220/* Bulk byte writes to a single I2C address, for 32k firmware load */
 221static int cx24116_writeregN(struct cx24116_state *state, int reg,
 222                             const u8 *data, u16 len)
 223{
 224        int ret = -EREMOTEIO;
 225        struct i2c_msg msg;
 226        u8 *buf;
 227
 228        buf = kmalloc(len + 1, GFP_KERNEL);
 229        if (buf == NULL) {
 230                printk("Unable to kmalloc\n");
 231                ret = -ENOMEM;
 232                goto error;
 233        }
 234
 235        *(buf) = reg;
 236        memcpy(buf + 1, data, len);
 237
 238        msg.addr = state->config->demod_address;
 239        msg.flags = 0;
 240        msg.buf = buf;
 241        msg.len = len + 1;
 242
 243        if (debug > 1)
 244                printk(KERN_INFO "cx24116: %s:  write regN 0x%02x, len = %d\n",
 245                        __func__, reg, len);
 246
 247        ret = i2c_transfer(state->i2c, &msg, 1);
 248        if (ret != 1) {
 249                printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x\n",
 250                         __func__, ret, reg);
 251                ret = -EREMOTEIO;
 252        }
 253
 254error:
 255        kfree(buf);
 256
 257        return ret;
 258}
 259
 260static int cx24116_readreg(struct cx24116_state *state, u8 reg)
 261{
 262        int ret;
 263        u8 b0[] = { reg };
 264        u8 b1[] = { 0 };
 265        struct i2c_msg msg[] = {
 266                { .addr = state->config->demod_address, .flags = 0,
 267                        .buf = b0, .len = 1 },
 268                { .addr = state->config->demod_address, .flags = I2C_M_RD,
 269                        .buf = b1, .len = 1 }
 270        };
 271
 272        ret = i2c_transfer(state->i2c, msg, 2);
 273
 274        if (ret != 2) {
 275                printk(KERN_ERR "%s: reg=0x%x (error=%d)\n",
 276                        __func__, reg, ret);
 277                return ret;
 278        }
 279
 280        if (debug > 1)
 281                printk(KERN_INFO "cx24116: read reg 0x%02x, value 0x%02x\n",
 282                        reg, b1[0]);
 283
 284        return b1[0];
 285}
 286
 287static int cx24116_set_inversion(struct cx24116_state *state,
 288        fe_spectral_inversion_t inversion)
 289{
 290        dprintk("%s(%d)\n", __func__, inversion);
 291
 292        switch (inversion) {
 293        case INVERSION_OFF:
 294                state->dnxt.inversion_val = 0x00;
 295                break;
 296        case INVERSION_ON:
 297                state->dnxt.inversion_val = 0x04;
 298                break;
 299        case INVERSION_AUTO:
 300                state->dnxt.inversion_val = 0x0C;
 301                break;
 302        default:
 303                return -EINVAL;
 304        }
 305
 306        state->dnxt.inversion = inversion;
 307
 308        return 0;
 309}
 310
 311/*
 312 * modfec (modulation and FEC)
 313 * ===========================
 314 *
 315 * MOD          FEC             mask/val    standard
 316 * ----         --------        ----------- --------
 317 * QPSK         FEC_1_2         0x02 0x02+X DVB-S
 318 * QPSK         FEC_2_3         0x04 0x02+X DVB-S
 319 * QPSK         FEC_3_4         0x08 0x02+X DVB-S
 320 * QPSK         FEC_4_5         0x10 0x02+X DVB-S (?)
 321 * QPSK         FEC_5_6         0x20 0x02+X DVB-S
 322 * QPSK         FEC_6_7         0x40 0x02+X DVB-S
 323 * QPSK         FEC_7_8         0x80 0x02+X DVB-S
 324 * QPSK         FEC_8_9         0x01 0x02+X DVB-S (?) (NOT SUPPORTED?)
 325 * QPSK         AUTO            0xff 0x02+X DVB-S
 326 *
 327 * For DVB-S high byte probably represents FEC
 328 * and low byte selects the modulator. The high
 329 * byte is search range mask. Bit 5 may turn
 330 * on DVB-S and remaining bits represent some
 331 * kind of calibration (how/what i do not know).
 332 *
 333 * Eg.(2/3) szap "Zone Horror"
 334 *
 335 * mask/val = 0x04, 0x20
 336 * status 1f | signal c3c0 | snr a333 | ber 00000098 | unc 0 | FE_HAS_LOCK
 337 *
 338 * mask/val = 0x04, 0x30
 339 * status 1f | signal c3c0 | snr a333 | ber 00000000 | unc 0 | FE_HAS_LOCK
 340 *
 341 * After tuning FECSTATUS contains actual FEC
 342 * in use numbered 1 through to 8 for 1/2 .. 2/3 etc
 343 *
 344 * NBC=NOT/NON BACKWARD COMPATIBLE WITH DVB-S (DVB-S2 only)
 345 *
 346 * NBC-QPSK     FEC_1_2         0x00, 0x04      DVB-S2
 347 * NBC-QPSK     FEC_3_5         0x00, 0x05      DVB-S2
 348 * NBC-QPSK     FEC_2_3         0x00, 0x06      DVB-S2
 349 * NBC-QPSK     FEC_3_4         0x00, 0x07      DVB-S2
 350 * NBC-QPSK     FEC_4_5         0x00, 0x08      DVB-S2
 351 * NBC-QPSK     FEC_5_6         0x00, 0x09      DVB-S2
 352 * NBC-QPSK     FEC_8_9         0x00, 0x0a      DVB-S2
 353 * NBC-QPSK     FEC_9_10        0x00, 0x0b      DVB-S2
 354 *
 355 * NBC-8PSK     FEC_3_5         0x00, 0x0c      DVB-S2
 356 * NBC-8PSK     FEC_2_3         0x00, 0x0d      DVB-S2
 357 * NBC-8PSK     FEC_3_4         0x00, 0x0e      DVB-S2
 358 * NBC-8PSK     FEC_5_6         0x00, 0x0f      DVB-S2
 359 * NBC-8PSK     FEC_8_9         0x00, 0x10      DVB-S2
 360 * NBC-8PSK     FEC_9_10        0x00, 0x11      DVB-S2
 361 *
 362 * For DVB-S2 low bytes selects both modulator
 363 * and FEC. High byte is meaningless here. To
 364 * set pilot, bit 6 (0x40) is set. When inspecting
 365 * FECSTATUS bit 7 (0x80) represents the pilot
 366 * selection whilst not tuned. When tuned, actual FEC
 367 * in use is found in FECSTATUS as per above. Pilot
 368 * value is reset.
 369 */
 370
 371/* A table of modulation, fec and configuration bytes for the demod.
 372 * Not all S2 mmodulation schemes are support and not all rates with
 373 * a scheme are support. Especially, no auto detect when in S2 mode.
 374 */
 375static struct cx24116_modfec {
 376        fe_delivery_system_t delivery_system;
 377        fe_modulation_t modulation;
 378        fe_code_rate_t fec;
 379        u8 mask;        /* In DVBS mode this is used to autodetect */
 380        u8 val;         /* Passed to the firmware to indicate mode selection */
 381} CX24116_MODFEC_MODES[] = {
 382 /* QPSK. For unknown rates we set hardware to auto detect 0xfe 0x30 */
 383
 384 /*mod   fec       mask  val */
 385 { SYS_DVBS, QPSK, FEC_NONE, 0xfe, 0x30 },
 386 { SYS_DVBS, QPSK, FEC_1_2,  0x02, 0x2e }, /* 00000010 00101110 */
 387 { SYS_DVBS, QPSK, FEC_2_3,  0x04, 0x2f }, /* 00000100 00101111 */
 388 { SYS_DVBS, QPSK, FEC_3_4,  0x08, 0x30 }, /* 00001000 00110000 */
 389 { SYS_DVBS, QPSK, FEC_4_5,  0xfe, 0x30 }, /* 000?0000 ?        */
 390 { SYS_DVBS, QPSK, FEC_5_6,  0x20, 0x31 }, /* 00100000 00110001 */
 391 { SYS_DVBS, QPSK, FEC_6_7,  0xfe, 0x30 }, /* 0?000000 ?        */
 392 { SYS_DVBS, QPSK, FEC_7_8,  0x80, 0x32 }, /* 10000000 00110010 */
 393 { SYS_DVBS, QPSK, FEC_8_9,  0xfe, 0x30 }, /* 0000000? ?        */
 394 { SYS_DVBS, QPSK, FEC_AUTO, 0xfe, 0x30 },
 395 /* NBC-QPSK */
 396 { SYS_DVBS2, QPSK, FEC_1_2,  0x00, 0x04 },
 397 { SYS_DVBS2, QPSK, FEC_3_5,  0x00, 0x05 },
 398 { SYS_DVBS2, QPSK, FEC_2_3,  0x00, 0x06 },
 399 { SYS_DVBS2, QPSK, FEC_3_4,  0x00, 0x07 },
 400 { SYS_DVBS2, QPSK, FEC_4_5,  0x00, 0x08 },
 401 { SYS_DVBS2, QPSK, FEC_5_6,  0x00, 0x09 },
 402 { SYS_DVBS2, QPSK, FEC_8_9,  0x00, 0x0a },
 403 { SYS_DVBS2, QPSK, FEC_9_10, 0x00, 0x0b },
 404 /* 8PSK */
 405 { SYS_DVBS2, PSK_8, FEC_3_5,  0x00, 0x0c },
 406 { SYS_DVBS2, PSK_8, FEC_2_3,  0x00, 0x0d },
 407 { SYS_DVBS2, PSK_8, FEC_3_4,  0x00, 0x0e },
 408 { SYS_DVBS2, PSK_8, FEC_5_6,  0x00, 0x0f },
 409 { SYS_DVBS2, PSK_8, FEC_8_9,  0x00, 0x10 },
 410 { SYS_DVBS2, PSK_8, FEC_9_10, 0x00, 0x11 },
 411 /*
 412  * `val' can be found in the FECSTATUS register when tuning.
 413  * FECSTATUS will give the actual FEC in use if tuning was successful.
 414  */
 415};
 416
 417static int cx24116_lookup_fecmod(struct cx24116_state *state,
 418        fe_delivery_system_t d, fe_modulation_t m, fe_code_rate_t f)
 419{
 420        int i, ret = -EOPNOTSUPP;
 421
 422        dprintk("%s(0x%02x,0x%02x)\n", __func__, m, f);
 423
 424        for (i = 0; i < ARRAY_SIZE(CX24116_MODFEC_MODES); i++) {
 425                if ((d == CX24116_MODFEC_MODES[i].delivery_system) &&
 426                        (m == CX24116_MODFEC_MODES[i].modulation) &&
 427                        (f == CX24116_MODFEC_MODES[i].fec)) {
 428                                ret = i;
 429                                break;
 430                        }
 431        }
 432
 433        return ret;
 434}
 435
 436static int cx24116_set_fec(struct cx24116_state *state,
 437        fe_delivery_system_t delsys, fe_modulation_t mod, fe_code_rate_t fec)
 438{
 439        int ret = 0;
 440
 441        dprintk("%s(0x%02x,0x%02x)\n", __func__, mod, fec);
 442
 443        ret = cx24116_lookup_fecmod(state, delsys, mod, fec);
 444
 445        if (ret < 0)
 446                return ret;
 447
 448        state->dnxt.fec = fec;
 449        state->dnxt.fec_val = CX24116_MODFEC_MODES[ret].val;
 450        state->dnxt.fec_mask = CX24116_MODFEC_MODES[ret].mask;
 451        dprintk("%s() mask/val = 0x%02x/0x%02x\n", __func__,
 452                state->dnxt.fec_mask, state->dnxt.fec_val);
 453
 454        return 0;
 455}
 456
 457static int cx24116_set_symbolrate(struct cx24116_state *state, u32 rate)
 458{
 459        dprintk("%s(%d)\n", __func__, rate);
 460
 461        /*  check if symbol rate is within limits */
 462        if ((rate > state->frontend.ops.info.symbol_rate_max) ||
 463            (rate < state->frontend.ops.info.symbol_rate_min)) {
 464                dprintk("%s() unsupported symbol_rate = %d\n", __func__, rate);
 465                return -EOPNOTSUPP;
 466        }
 467
 468        state->dnxt.symbol_rate = rate;
 469        dprintk("%s() symbol_rate = %d\n", __func__, rate);
 470
 471        return 0;
 472}
 473
 474static int cx24116_load_firmware(struct dvb_frontend *fe,
 475        const struct firmware *fw);
 476
 477static int cx24116_firmware_ondemand(struct dvb_frontend *fe)
 478{
 479        struct cx24116_state *state = fe->demodulator_priv;
 480        const struct firmware *fw;
 481        int ret = 0;
 482
 483        dprintk("%s()\n", __func__);
 484
 485        if (cx24116_readreg(state, 0x20) > 0) {
 486
 487                if (state->skip_fw_load)
 488                        return 0;
 489
 490                /* Load firmware */
 491                /* request the firmware, this will block until loaded */
 492                printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n",
 493                        __func__, CX24116_DEFAULT_FIRMWARE);
 494                ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE,
 495                        state->i2c->dev.parent);
 496                printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n",
 497                        __func__);
 498                if (ret) {
 499                        printk(KERN_ERR "%s: No firmware uploaded "
 500                                "(timeout or file not found?)\n", __func__);
 501                        return ret;
 502                }
 503
 504                /* Make sure we don't recurse back through here
 505                 * during loading */
 506                state->skip_fw_load = 1;
 507
 508                ret = cx24116_load_firmware(fe, fw);
 509                if (ret)
 510                        printk(KERN_ERR "%s: Writing firmware to device failed\n",
 511                                __func__);
 512
 513                release_firmware(fw);
 514
 515                printk(KERN_INFO "%s: Firmware upload %s\n", __func__,
 516                        ret == 0 ? "complete" : "failed");
 517
 518                /* Ensure firmware is always loaded if required */
 519                state->skip_fw_load = 0;
 520        }
 521
 522        return ret;
 523}
 524
 525/* Take a basic firmware command structure, format it
 526 * and forward it for processing
 527 */
 528static int cx24116_cmd_execute(struct dvb_frontend *fe, struct cx24116_cmd *cmd)
 529{
 530        struct cx24116_state *state = fe->demodulator_priv;
 531        int i, ret;
 532
 533        dprintk("%s()\n", __func__);
 534
 535        /* Load the firmware if required */
 536        ret = cx24116_firmware_ondemand(fe);
 537        if (ret != 0) {
 538                printk(KERN_ERR "%s(): Unable initialise the firmware\n",
 539                        __func__);
 540                return ret;
 541        }
 542
 543        /* Write the command */
 544        for (i = 0; i < cmd->len ; i++) {
 545                dprintk("%s: 0x%02x == 0x%02x\n", __func__, i, cmd->args[i]);
 546                cx24116_writereg(state, i, cmd->args[i]);
 547        }
 548
 549        /* Start execution and wait for cmd to terminate */
 550        cx24116_writereg(state, CX24116_REG_EXECUTE, 0x01);
 551        while (cx24116_readreg(state, CX24116_REG_EXECUTE)) {
 552                msleep(10);
 553                if (i++ > 64) {
 554                        /* Avoid looping forever if the firmware does
 555                                not respond */
 556                        printk(KERN_WARNING "%s() Firmware not responding\n",
 557                                __func__);
 558                        return -EREMOTEIO;
 559                }
 560        }
 561        return 0;
 562}
 563
 564static int cx24116_load_firmware(struct dvb_frontend *fe,
 565        const struct firmware *fw)
 566{
 567        struct cx24116_state *state = fe->demodulator_priv;
 568        struct cx24116_cmd cmd;
 569        int i, ret, len, max, remaining;
 570        unsigned char vers[4];
 571
 572        dprintk("%s\n", __func__);
 573        dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
 574                        fw->size,
 575                        fw->data[0],
 576                        fw->data[1],
 577                        fw->data[fw->size-2],
 578                        fw->data[fw->size-1]);
 579
 580        /* Toggle 88x SRST pin to reset demod */
 581        if (state->config->reset_device)
 582                state->config->reset_device(fe);
 583
 584        /* Begin the firmware load process */
 585        /* Prepare the demod, load the firmware, cleanup after load */
 586
 587        /* Init PLL */
 588        cx24116_writereg(state, 0xE5, 0x00);
 589        cx24116_writereg(state, 0xF1, 0x08);
 590        cx24116_writereg(state, 0xF2, 0x13);
 591
 592        /* Start PLL */
 593        cx24116_writereg(state, 0xe0, 0x03);
 594        cx24116_writereg(state, 0xe0, 0x00);
 595
 596        /* Unknown */
 597        cx24116_writereg(state, CX24116_REG_CLKDIV, 0x46);
 598        cx24116_writereg(state, CX24116_REG_RATEDIV, 0x00);
 599
 600        /* Unknown */
 601        cx24116_writereg(state, 0xF0, 0x03);
 602        cx24116_writereg(state, 0xF4, 0x81);
 603        cx24116_writereg(state, 0xF5, 0x00);
 604        cx24116_writereg(state, 0xF6, 0x00);
 605
 606        /* Split firmware to the max I2C write len and write.
 607         * Writes whole firmware as one write when i2c_wr_max is set to 0. */
 608        if (state->config->i2c_wr_max)
 609                max = state->config->i2c_wr_max;
 610        else
 611                max = INT_MAX; /* enough for 32k firmware */
 612
 613        for (remaining = fw->size; remaining > 0; remaining -= max - 1) {
 614                len = remaining;
 615                if (len > max - 1)
 616                        len = max - 1;
 617
 618                cx24116_writeregN(state, 0xF7, &fw->data[fw->size - remaining],
 619                        len);
 620        }
 621
 622        cx24116_writereg(state, 0xF4, 0x10);
 623        cx24116_writereg(state, 0xF0, 0x00);
 624        cx24116_writereg(state, 0xF8, 0x06);
 625
 626        /* Firmware CMD 10: VCO config */
 627        cmd.args[0x00] = CMD_SET_VCO;
 628        cmd.args[0x01] = 0x05;
 629        cmd.args[0x02] = 0xdc;
 630        cmd.args[0x03] = 0xda;
 631        cmd.args[0x04] = 0xae;
 632        cmd.args[0x05] = 0xaa;
 633        cmd.args[0x06] = 0x04;
 634        cmd.args[0x07] = 0x9d;
 635        cmd.args[0x08] = 0xfc;
 636        cmd.args[0x09] = 0x06;
 637        cmd.len = 0x0a;
 638        ret = cx24116_cmd_execute(fe, &cmd);
 639        if (ret != 0)
 640                return ret;
 641
 642        cx24116_writereg(state, CX24116_REG_SSTATUS, 0x00);
 643
 644        /* Firmware CMD 14: Tuner config */
 645        cmd.args[0x00] = CMD_TUNERINIT;
 646        cmd.args[0x01] = 0x00;
 647        cmd.args[0x02] = 0x00;
 648        cmd.len = 0x03;
 649        ret = cx24116_cmd_execute(fe, &cmd);
 650        if (ret != 0)
 651                return ret;
 652
 653        cx24116_writereg(state, 0xe5, 0x00);
 654
 655        /* Firmware CMD 13: MPEG config */
 656        cmd.args[0x00] = CMD_MPEGCONFIG;
 657        cmd.args[0x01] = 0x01;
 658        cmd.args[0x02] = 0x75;
 659        cmd.args[0x03] = 0x00;
 660        if (state->config->mpg_clk_pos_pol)
 661                cmd.args[0x04] = state->config->mpg_clk_pos_pol;
 662        else
 663                cmd.args[0x04] = 0x02;
 664        cmd.args[0x05] = 0x00;
 665        cmd.len = 0x06;
 666        ret = cx24116_cmd_execute(fe, &cmd);
 667        if (ret != 0)
 668                return ret;
 669
 670        /* Firmware CMD 35: Get firmware version */
 671        cmd.args[0x00] = CMD_UPDFWVERS;
 672        cmd.len = 0x02;
 673        for (i = 0; i < 4; i++) {
 674                cmd.args[0x01] = i;
 675                ret = cx24116_cmd_execute(fe, &cmd);
 676                if (ret != 0)
 677                        return ret;
 678                vers[i] = cx24116_readreg(state, CX24116_REG_MAILBOX);
 679        }
 680        printk(KERN_INFO "%s: FW version %i.%i.%i.%i\n", __func__,
 681                vers[0], vers[1], vers[2], vers[3]);
 682
 683        return 0;
 684}
 685
 686static int cx24116_read_status(struct dvb_frontend *fe, fe_status_t *status)
 687{
 688        struct cx24116_state *state = fe->demodulator_priv;
 689
 690        int lock = cx24116_readreg(state, CX24116_REG_SSTATUS) &
 691                CX24116_STATUS_MASK;
 692
 693        dprintk("%s: status = 0x%02x\n", __func__, lock);
 694
 695        *status = 0;
 696
 697        if (lock & CX24116_HAS_SIGNAL)
 698                *status |= FE_HAS_SIGNAL;
 699        if (lock & CX24116_HAS_CARRIER)
 700                *status |= FE_HAS_CARRIER;
 701        if (lock & CX24116_HAS_VITERBI)
 702                *status |= FE_HAS_VITERBI;
 703        if (lock & CX24116_HAS_SYNCLOCK)
 704                *status |= FE_HAS_SYNC | FE_HAS_LOCK;
 705
 706        return 0;
 707}
 708
 709static int cx24116_read_ber(struct dvb_frontend *fe, u32 *ber)
 710{
 711        struct cx24116_state *state = fe->demodulator_priv;
 712
 713        dprintk("%s()\n", __func__);
 714
 715        *ber =  (cx24116_readreg(state, CX24116_REG_BER24) << 24) |
 716                (cx24116_readreg(state, CX24116_REG_BER16) << 16) |
 717                (cx24116_readreg(state, CX24116_REG_BER8)  << 8)  |
 718                 cx24116_readreg(state, CX24116_REG_BER0);
 719
 720        return 0;
 721}
 722
 723/* TODO Determine function and scale appropriately */
 724static int cx24116_read_signal_strength(struct dvb_frontend *fe,
 725        u16 *signal_strength)
 726{
 727        struct cx24116_state *state = fe->demodulator_priv;
 728        struct cx24116_cmd cmd;
 729        int ret;
 730        u16 sig_reading;
 731
 732        dprintk("%s()\n", __func__);
 733
 734        /* Firmware CMD 19: Get AGC */
 735        cmd.args[0x00] = CMD_GETAGC;
 736        cmd.len = 0x01;
 737        ret = cx24116_cmd_execute(fe, &cmd);
 738        if (ret != 0)
 739                return ret;
 740
 741        sig_reading =
 742                (cx24116_readreg(state,
 743                        CX24116_REG_SSTATUS) & CX24116_SIGNAL_MASK) |
 744                (cx24116_readreg(state, CX24116_REG_SIGNAL) << 6);
 745        *signal_strength = 0 - sig_reading;
 746
 747        dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n",
 748                __func__, sig_reading, *signal_strength);
 749
 750        return 0;
 751}
 752
 753/* SNR (0..100)% = (sig & 0xf0) * 10 + (sig & 0x0f) * 10 / 16 */
 754static int cx24116_read_snr_pct(struct dvb_frontend *fe, u16 *snr)
 755{
 756        struct cx24116_state *state = fe->demodulator_priv;
 757        u8 snr_reading;
 758        static const u32 snr_tab[] = { /* 10 x Table (rounded up) */
 759                0x00000, 0x0199A, 0x03333, 0x04ccD, 0x06667,
 760                0x08000, 0x0999A, 0x0b333, 0x0cccD, 0x0e667,
 761                0x10000, 0x1199A, 0x13333, 0x14ccD, 0x16667,
 762                0x18000 };
 763
 764        dprintk("%s()\n", __func__);
 765
 766        snr_reading = cx24116_readreg(state, CX24116_REG_QUALITY0);
 767
 768        if (snr_reading >= 0xa0 /* 100% */)
 769                *snr = 0xffff;
 770        else
 771                *snr = snr_tab[(snr_reading & 0xf0) >> 4] +
 772                        (snr_tab[(snr_reading & 0x0f)] >> 4);
 773
 774        dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
 775                snr_reading, *snr);
 776
 777        return 0;
 778}
 779
 780/* The reelbox patches show the value in the registers represents
 781 * ESNO, from 0->30db (values 0->300). We provide this value by
 782 * default.
 783 */
 784static int cx24116_read_snr_esno(struct dvb_frontend *fe, u16 *snr)
 785{
 786        struct cx24116_state *state = fe->demodulator_priv;
 787
 788        dprintk("%s()\n", __func__);
 789
 790        *snr = cx24116_readreg(state, CX24116_REG_QUALITY8) << 8 |
 791                cx24116_readreg(state, CX24116_REG_QUALITY0);
 792
 793        dprintk("%s: raw 0x%04x\n", __func__, *snr);
 794
 795        return 0;
 796}
 797
 798static int cx24116_read_snr(struct dvb_frontend *fe, u16 *snr)
 799{
 800        if (esno_snr == 1)
 801                return cx24116_read_snr_esno(fe, snr);
 802        else
 803                return cx24116_read_snr_pct(fe, snr);
 804}
 805
 806static int cx24116_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
 807{
 808        struct cx24116_state *state = fe->demodulator_priv;
 809
 810        dprintk("%s()\n", __func__);
 811
 812        *ucblocks = (cx24116_readreg(state, CX24116_REG_UCB8) << 8) |
 813                cx24116_readreg(state, CX24116_REG_UCB0);
 814
 815        return 0;
 816}
 817
 818/* Overwrite the current tuning params, we are about to tune */
 819static void cx24116_clone_params(struct dvb_frontend *fe)
 820{
 821        struct cx24116_state *state = fe->demodulator_priv;
 822        memcpy(&state->dcur, &state->dnxt, sizeof(state->dcur));
 823}
 824
 825/* Wait for LNB */
 826static int cx24116_wait_for_lnb(struct dvb_frontend *fe)
 827{
 828        struct cx24116_state *state = fe->demodulator_priv;
 829        int i;
 830
 831        dprintk("%s() qstatus = 0x%02x\n", __func__,
 832                cx24116_readreg(state, CX24116_REG_QSTATUS));
 833
 834        /* Wait for up to 300 ms */
 835        for (i = 0; i < 30 ; i++) {
 836                if (cx24116_readreg(state, CX24116_REG_QSTATUS) & 0x20)
 837                        return 0;
 838                msleep(10);
 839        }
 840
 841        dprintk("%s(): LNB not ready\n", __func__);
 842
 843        return -ETIMEDOUT; /* -EBUSY ? */
 844}
 845
 846static int cx24116_set_voltage(struct dvb_frontend *fe,
 847        fe_sec_voltage_t voltage)
 848{
 849        struct cx24116_cmd cmd;
 850        int ret;
 851
 852        dprintk("%s: %s\n", __func__,
 853                voltage == SEC_VOLTAGE_13 ? "SEC_VOLTAGE_13" :
 854                voltage == SEC_VOLTAGE_18 ? "SEC_VOLTAGE_18" : "??");
 855
 856        /* Wait for LNB ready */
 857        ret = cx24116_wait_for_lnb(fe);
 858        if (ret != 0)
 859                return ret;
 860
 861        /* Wait for voltage/min repeat delay */
 862        msleep(100);
 863
 864        cmd.args[0x00] = CMD_LNBDCLEVEL;
 865        cmd.args[0x01] = (voltage == SEC_VOLTAGE_18 ? 0x01 : 0x00);
 866        cmd.len = 0x02;
 867
 868        /* Min delay time before DiSEqC send */
 869        msleep(15);
 870
 871        return cx24116_cmd_execute(fe, &cmd);
 872}
 873
 874static int cx24116_set_tone(struct dvb_frontend *fe,
 875        fe_sec_tone_mode_t tone)
 876{
 877        struct cx24116_cmd cmd;
 878        int ret;
 879
 880        dprintk("%s(%d)\n", __func__, tone);
 881        if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) {
 882                printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone);
 883                return -EINVAL;
 884        }
 885
 886        /* Wait for LNB ready */
 887        ret = cx24116_wait_for_lnb(fe);
 888        if (ret != 0)
 889                return ret;
 890
 891        /* Min delay time after DiSEqC send */
 892        msleep(15); /* XXX determine is FW does this, see send_diseqc/burst */
 893
 894        /* Now we set the tone */
 895        cmd.args[0x00] = CMD_SET_TONE;
 896        cmd.args[0x01] = 0x00;
 897        cmd.args[0x02] = 0x00;
 898
 899        switch (tone) {
 900        case SEC_TONE_ON:
 901                dprintk("%s: setting tone on\n", __func__);
 902                cmd.args[0x03] = 0x01;
 903                break;
 904        case SEC_TONE_OFF:
 905                dprintk("%s: setting tone off\n", __func__);
 906                cmd.args[0x03] = 0x00;
 907                break;
 908        }
 909        cmd.len = 0x04;
 910
 911        /* Min delay time before DiSEqC send */
 912        msleep(15); /* XXX determine is FW does this, see send_diseqc/burst */
 913
 914        return cx24116_cmd_execute(fe, &cmd);
 915}
 916
 917/* Initialise DiSEqC */
 918static int cx24116_diseqc_init(struct dvb_frontend *fe)
 919{
 920        struct cx24116_state *state = fe->demodulator_priv;
 921        struct cx24116_cmd cmd;
 922        int ret;
 923
 924        /* Firmware CMD 20: LNB/DiSEqC config */
 925        cmd.args[0x00] = CMD_LNBCONFIG;
 926        cmd.args[0x01] = 0x00;
 927        cmd.args[0x02] = 0x10;
 928        cmd.args[0x03] = 0x00;
 929        cmd.args[0x04] = 0x8f;
 930        cmd.args[0x05] = 0x28;
 931        cmd.args[0x06] = (toneburst == CX24116_DISEQC_TONEOFF) ? 0x00 : 0x01;
 932        cmd.args[0x07] = 0x01;
 933        cmd.len = 0x08;
 934        ret = cx24116_cmd_execute(fe, &cmd);
 935        if (ret != 0)
 936                return ret;
 937
 938        /* Prepare a DiSEqC command */
 939        state->dsec_cmd.args[0x00] = CMD_LNBSEND;
 940
 941        /* DiSEqC burst */
 942        state->dsec_cmd.args[CX24116_DISEQC_BURST]  = CX24116_DISEQC_MINI_A;
 943
 944        /* Unknown */
 945        state->dsec_cmd.args[CX24116_DISEQC_ARG2_2] = 0x02;
 946        state->dsec_cmd.args[CX24116_DISEQC_ARG3_0] = 0x00;
 947        /* Continuation flag? */
 948        state->dsec_cmd.args[CX24116_DISEQC_ARG4_0] = 0x00;
 949
 950        /* DiSEqC message length */
 951        state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = 0x00;
 952
 953        /* Command length */
 954        state->dsec_cmd.len = CX24116_DISEQC_MSGOFS;
 955
 956        return 0;
 957}
 958
 959/* Send DiSEqC message with derived burst (hack) || previous burst */
 960static int cx24116_send_diseqc_msg(struct dvb_frontend *fe,
 961        struct dvb_diseqc_master_cmd *d)
 962{
 963        struct cx24116_state *state = fe->demodulator_priv;
 964        int i, ret;
 965
 966        /* Dump DiSEqC message */
 967        if (debug) {
 968                printk(KERN_INFO "cx24116: %s(", __func__);
 969                for (i = 0 ; i < d->msg_len ;) {
 970                        printk(KERN_INFO "0x%02x", d->msg[i]);
 971                        if (++i < d->msg_len)
 972                                printk(KERN_INFO ", ");
 973                }
 974                printk(") toneburst=%d\n", toneburst);
 975        }
 976
 977        /* Validate length */
 978        if (d->msg_len > (CX24116_ARGLEN - CX24116_DISEQC_MSGOFS))
 979                return -EINVAL;
 980
 981        /* DiSEqC message */
 982        for (i = 0; i < d->msg_len; i++)
 983                state->dsec_cmd.args[CX24116_DISEQC_MSGOFS + i] = d->msg[i];
 984
 985        /* DiSEqC message length */
 986        state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = d->msg_len;
 987
 988        /* Command length */
 989        state->dsec_cmd.len = CX24116_DISEQC_MSGOFS +
 990                state->dsec_cmd.args[CX24116_DISEQC_MSGLEN];
 991
 992        /* DiSEqC toneburst */
 993        if (toneburst == CX24116_DISEQC_MESGCACHE)
 994                /* Message is cached */
 995                return 0;
 996
 997        else if (toneburst == CX24116_DISEQC_TONEOFF)
 998                /* Message is sent without burst */
 999                state->dsec_cmd.args[CX24116_DISEQC_BURST] = 0;
1000
1001        else if (toneburst == CX24116_DISEQC_TONECACHE) {
1002                /*
1003                 * Message is sent with derived else cached burst
1004                 *
1005                 * WRITE PORT GROUP COMMAND 38
1006                 *
1007                 * 0/A/A: E0 10 38 F0..F3
1008                 * 1/B/B: E0 10 38 F4..F7
1009                 * 2/C/A: E0 10 38 F8..FB
1010                 * 3/D/B: E0 10 38 FC..FF
1011                 *
1012                 * databyte[3]= 8421:8421
1013                 *              ABCD:WXYZ
1014                 *              CLR :SET
1015                 *
1016                 *              WX= PORT SELECT 0..3    (X=TONEBURST)
1017                 *              Y = VOLTAGE             (0=13V, 1=18V)
1018                 *              Z = BAND                (0=LOW, 1=HIGH(22K))
1019                 */
1020                if (d->msg_len >= 4 && d->msg[2] == 0x38)
1021                        state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1022                                ((d->msg[3] & 4) >> 2);
1023                if (debug)
1024                        dprintk("%s burst=%d\n", __func__,
1025                                state->dsec_cmd.args[CX24116_DISEQC_BURST]);
1026        }
1027
1028        /* Wait for LNB ready */
1029        ret = cx24116_wait_for_lnb(fe);
1030        if (ret != 0)
1031                return ret;
1032
1033        /* Wait for voltage/min repeat delay */
1034        msleep(100);
1035
1036        /* Command */
1037        ret = cx24116_cmd_execute(fe, &state->dsec_cmd);
1038        if (ret != 0)
1039                return ret;
1040        /*
1041         * Wait for send
1042         *
1043         * Eutelsat spec:
1044         * >15ms delay          + (XXX determine if FW does this, see set_tone)
1045         *  13.5ms per byte     +
1046         * >15ms delay          +
1047         *  12.5ms burst        +
1048         * >15ms delay            (XXX determine if FW does this, see set_tone)
1049         */
1050        msleep((state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] << 4) +
1051                ((toneburst == CX24116_DISEQC_TONEOFF) ? 30 : 60));
1052
1053        return 0;
1054}
1055
1056/* Send DiSEqC burst */
1057static int cx24116_diseqc_send_burst(struct dvb_frontend *fe,
1058        fe_sec_mini_cmd_t burst)
1059{
1060        struct cx24116_state *state = fe->demodulator_priv;
1061        int ret;
1062
1063        dprintk("%s(%d) toneburst=%d\n", __func__, burst, toneburst);
1064
1065        /* DiSEqC burst */
1066        if (burst == SEC_MINI_A)
1067                state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1068                        CX24116_DISEQC_MINI_A;
1069        else if (burst == SEC_MINI_B)
1070                state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1071                        CX24116_DISEQC_MINI_B;
1072        else
1073                return -EINVAL;
1074
1075        /* DiSEqC toneburst */
1076        if (toneburst != CX24116_DISEQC_MESGCACHE)
1077                /* Burst is cached */
1078                return 0;
1079
1080        /* Burst is to be sent with cached message */
1081
1082        /* Wait for LNB ready */
1083        ret = cx24116_wait_for_lnb(fe);
1084        if (ret != 0)
1085                return ret;
1086
1087        /* Wait for voltage/min repeat delay */
1088        msleep(100);
1089
1090        /* Command */
1091        ret = cx24116_cmd_execute(fe, &state->dsec_cmd);
1092        if (ret != 0)
1093                return ret;
1094
1095        /*
1096         * Wait for send
1097         *
1098         * Eutelsat spec:
1099         * >15ms delay          + (XXX determine if FW does this, see set_tone)
1100         *  13.5ms per byte     +
1101         * >15ms delay          +
1102         *  12.5ms burst        +
1103         * >15ms delay            (XXX determine if FW does this, see set_tone)
1104         */
1105        msleep((state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] << 4) + 60);
1106
1107        return 0;
1108}
1109
1110static void cx24116_release(struct dvb_frontend *fe)
1111{
1112        struct cx24116_state *state = fe->demodulator_priv;
1113        dprintk("%s\n", __func__);
1114        kfree(state);
1115}
1116
1117static struct dvb_frontend_ops cx24116_ops;
1118
1119struct dvb_frontend *cx24116_attach(const struct cx24116_config *config,
1120        struct i2c_adapter *i2c)
1121{
1122        struct cx24116_state *state = NULL;
1123        int ret;
1124
1125        dprintk("%s\n", __func__);
1126
1127        /* allocate memory for the internal state */
1128        state = kzalloc(sizeof(struct cx24116_state), GFP_KERNEL);
1129        if (state == NULL)
1130                goto error1;
1131
1132        state->config = config;
1133        state->i2c = i2c;
1134
1135        /* check if the demod is present */
1136        ret = (cx24116_readreg(state, 0xFF) << 8) |
1137                cx24116_readreg(state, 0xFE);
1138        if (ret != 0x0501) {
1139                printk(KERN_INFO "Invalid probe, probably not a CX24116 device\n");
1140                goto error2;
1141        }
1142
1143        /* create dvb_frontend */
1144        memcpy(&state->frontend.ops, &cx24116_ops,
1145                sizeof(struct dvb_frontend_ops));
1146        state->frontend.demodulator_priv = state;
1147        return &state->frontend;
1148
1149error2: kfree(state);
1150error1: return NULL;
1151}
1152EXPORT_SYMBOL(cx24116_attach);
1153
1154/*
1155 * Initialise or wake up device
1156 *
1157 * Power config will reset and load initial firmware if required
1158 */
1159static int cx24116_initfe(struct dvb_frontend *fe)
1160{
1161        struct cx24116_state *state = fe->demodulator_priv;
1162        struct cx24116_cmd cmd;
1163        int ret;
1164
1165        dprintk("%s()\n", __func__);
1166
1167        /* Power on */
1168        cx24116_writereg(state, 0xe0, 0);
1169        cx24116_writereg(state, 0xe1, 0);
1170        cx24116_writereg(state, 0xea, 0);
1171
1172        /* Firmware CMD 36: Power config */
1173        cmd.args[0x00] = CMD_TUNERSLEEP;
1174        cmd.args[0x01] = 0;
1175        cmd.len = 0x02;
1176        ret = cx24116_cmd_execute(fe, &cmd);
1177        if (ret != 0)
1178                return ret;
1179
1180        ret = cx24116_diseqc_init(fe);
1181        if (ret != 0)
1182                return ret;
1183
1184        /* HVR-4000 needs this */
1185        return cx24116_set_voltage(fe, SEC_VOLTAGE_13);
1186}
1187
1188/*
1189 * Put device to sleep
1190 */
1191static int cx24116_sleep(struct dvb_frontend *fe)
1192{
1193        struct cx24116_state *state = fe->demodulator_priv;
1194        struct cx24116_cmd cmd;
1195        int ret;
1196
1197        dprintk("%s()\n", __func__);
1198
1199        /* Firmware CMD 36: Power config */
1200        cmd.args[0x00] = CMD_TUNERSLEEP;
1201        cmd.args[0x01] = 1;
1202        cmd.len = 0x02;
1203        ret = cx24116_cmd_execute(fe, &cmd);
1204        if (ret != 0)
1205                return ret;
1206
1207        /* Power off (Shutdown clocks) */
1208        cx24116_writereg(state, 0xea, 0xff);
1209        cx24116_writereg(state, 0xe1, 1);
1210        cx24116_writereg(state, 0xe0, 1);
1211
1212        return 0;
1213}
1214
1215static int cx24116_set_property(struct dvb_frontend *fe,
1216        struct dtv_property *tvp)
1217{
1218        dprintk("%s(..)\n", __func__);
1219        return 0;
1220}
1221
1222static int cx24116_get_property(struct dvb_frontend *fe,
1223        struct dtv_property *tvp)
1224{
1225        dprintk("%s(..)\n", __func__);
1226        return 0;
1227}
1228
1229/* dvb-core told us to tune, the tv property cache will be complete,
1230 * it's safe for is to pull values and use them for tuning purposes.
1231 */
1232static int cx24116_set_frontend(struct dvb_frontend *fe,
1233        struct dvb_frontend_parameters *p)
1234{
1235        struct cx24116_state *state = fe->demodulator_priv;
1236        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1237        struct cx24116_cmd cmd;
1238        fe_status_t tunerstat;
1239        int i, status, ret, retune = 1;
1240
1241        dprintk("%s()\n", __func__);
1242
1243        switch (c->delivery_system) {
1244        case SYS_DVBS:
1245                dprintk("%s: DVB-S delivery system selected\n", __func__);
1246
1247                /* Only QPSK is supported for DVB-S */
1248                if (c->modulation != QPSK) {
1249                        dprintk("%s: unsupported modulation selected (%d)\n",
1250                                __func__, c->modulation);
1251                        return -EOPNOTSUPP;
1252                }
1253
1254                /* Pilot doesn't exist in DVB-S, turn bit off */
1255                state->dnxt.pilot_val = CX24116_PILOT_OFF;
1256
1257                /* DVB-S only supports 0.35 */
1258                if (c->rolloff != ROLLOFF_35) {
1259                        dprintk("%s: unsupported rolloff selected (%d)\n",
1260                                __func__, c->rolloff);
1261                        return -EOPNOTSUPP;
1262                }
1263                state->dnxt.rolloff_val = CX24116_ROLLOFF_035;
1264                break;
1265
1266        case SYS_DVBS2:
1267                dprintk("%s: DVB-S2 delivery system selected\n", __func__);
1268
1269                /*
1270                 * NBC 8PSK/QPSK with DVB-S is supported for DVB-S2,
1271                 * but not hardware auto detection
1272                 */
1273                if (c->modulation != PSK_8 && c->modulation != QPSK) {
1274                        dprintk("%s: unsupported modulation selected (%d)\n",
1275                                __func__, c->modulation);
1276                        return -EOPNOTSUPP;
1277                }
1278
1279                switch (c->pilot) {
1280                case PILOT_AUTO:        /* Not supported but emulated */
1281                        state->dnxt.pilot_val = (c->modulation == QPSK)
1282                                ? CX24116_PILOT_OFF : CX24116_PILOT_ON;
1283                        retune++;
1284                        break;
1285                case PILOT_OFF:
1286                        state->dnxt.pilot_val = CX24116_PILOT_OFF;
1287                        break;
1288                case PILOT_ON:
1289                        state->dnxt.pilot_val = CX24116_PILOT_ON;
1290                        break;
1291                default:
1292                        dprintk("%s: unsupported pilot mode selected (%d)\n",
1293                                __func__, c->pilot);
1294                        return -EOPNOTSUPP;
1295                }
1296
1297                switch (c->rolloff) {
1298                case ROLLOFF_20:
1299                        state->dnxt.rolloff_val = CX24116_ROLLOFF_020;
1300                        break;
1301                case ROLLOFF_25:
1302                        state->dnxt.rolloff_val = CX24116_ROLLOFF_025;
1303                        break;
1304                case ROLLOFF_35:
1305                        state->dnxt.rolloff_val = CX24116_ROLLOFF_035;
1306                        break;
1307                case ROLLOFF_AUTO:      /* Rolloff must be explicit */
1308                default:
1309                        dprintk("%s: unsupported rolloff selected (%d)\n",
1310                                __func__, c->rolloff);
1311                        return -EOPNOTSUPP;
1312                }
1313                break;
1314
1315        default:
1316                dprintk("%s: unsupported delivery system selected (%d)\n",
1317                        __func__, c->delivery_system);
1318                return -EOPNOTSUPP;
1319        }
1320        state->dnxt.delsys = c->delivery_system;
1321        state->dnxt.modulation = c->modulation;
1322        state->dnxt.frequency = c->frequency;
1323        state->dnxt.pilot = c->pilot;
1324        state->dnxt.rolloff = c->rolloff;
1325
1326        ret = cx24116_set_inversion(state, c->inversion);
1327        if (ret !=  0)
1328                return ret;
1329
1330        /* FEC_NONE/AUTO for DVB-S2 is not supported and detected here */
1331        ret = cx24116_set_fec(state, c->delivery_system, c->modulation, c->fec_inner);
1332        if (ret !=  0)
1333                return ret;
1334
1335        ret = cx24116_set_symbolrate(state, c->symbol_rate);
1336        if (ret !=  0)
1337                return ret;
1338
1339        /* discard the 'current' tuning parameters and prepare to tune */
1340        cx24116_clone_params(fe);
1341
1342        dprintk("%s:   delsys      = %d\n", __func__, state->dcur.delsys);
1343        dprintk("%s:   modulation  = %d\n", __func__, state->dcur.modulation);
1344        dprintk("%s:   frequency   = %d\n", __func__, state->dcur.frequency);
1345        dprintk("%s:   pilot       = %d (val = 0x%02x)\n", __func__,
1346                state->dcur.pilot, state->dcur.pilot_val);
1347        dprintk("%s:   retune      = %d\n", __func__, retune);
1348        dprintk("%s:   rolloff     = %d (val = 0x%02x)\n", __func__,
1349                state->dcur.rolloff, state->dcur.rolloff_val);
1350        dprintk("%s:   symbol_rate = %d\n", __func__, state->dcur.symbol_rate);
1351        dprintk("%s:   FEC         = %d (mask/val = 0x%02x/0x%02x)\n", __func__,
1352                state->dcur.fec, state->dcur.fec_mask, state->dcur.fec_val);
1353        dprintk("%s:   Inversion   = %d (val = 0x%02x)\n", __func__,
1354                state->dcur.inversion, state->dcur.inversion_val);
1355
1356        /* This is also done in advise/acquire on HVR4000 but not on LITE */
1357        if (state->config->set_ts_params)
1358                state->config->set_ts_params(fe, 0);
1359
1360        /* Set/Reset B/W */
1361        cmd.args[0x00] = CMD_BANDWIDTH;
1362        cmd.args[0x01] = 0x01;
1363        cmd.len = 0x02;
1364        ret = cx24116_cmd_execute(fe, &cmd);
1365        if (ret != 0)
1366                return ret;
1367
1368        /* Prepare a tune request */
1369        cmd.args[0x00] = CMD_TUNEREQUEST;
1370
1371        /* Frequency */
1372        cmd.args[0x01] = (state->dcur.frequency & 0xff0000) >> 16;
1373        cmd.args[0x02] = (state->dcur.frequency & 0x00ff00) >> 8;
1374        cmd.args[0x03] = (state->dcur.frequency & 0x0000ff);
1375
1376        /* Symbol Rate */
1377        cmd.args[0x04] = ((state->dcur.symbol_rate / 1000) & 0xff00) >> 8;
1378        cmd.args[0x05] = ((state->dcur.symbol_rate / 1000) & 0x00ff);
1379
1380        /* Automatic Inversion */
1381        cmd.args[0x06] = state->dcur.inversion_val;
1382
1383        /* Modulation / FEC / Pilot */
1384        cmd.args[0x07] = state->dcur.fec_val | state->dcur.pilot_val;
1385
1386        cmd.args[0x08] = CX24116_SEARCH_RANGE_KHZ >> 8;
1387        cmd.args[0x09] = CX24116_SEARCH_RANGE_KHZ & 0xff;
1388        cmd.args[0x0a] = 0x00;
1389        cmd.args[0x0b] = 0x00;
1390        cmd.args[0x0c] = state->dcur.rolloff_val;
1391        cmd.args[0x0d] = state->dcur.fec_mask;
1392
1393        if (state->dcur.symbol_rate > 30000000) {
1394                cmd.args[0x0e] = 0x04;
1395                cmd.args[0x0f] = 0x00;
1396                cmd.args[0x10] = 0x01;
1397                cmd.args[0x11] = 0x77;
1398                cmd.args[0x12] = 0x36;
1399                cx24116_writereg(state, CX24116_REG_CLKDIV, 0x44);
1400                cx24116_writereg(state, CX24116_REG_RATEDIV, 0x01);
1401        } else {
1402                cmd.args[0x0e] = 0x06;
1403                cmd.args[0x0f] = 0x00;
1404                cmd.args[0x10] = 0x00;
1405                cmd.args[0x11] = 0xFA;
1406                cmd.args[0x12] = 0x24;
1407                cx24116_writereg(state, CX24116_REG_CLKDIV, 0x46);
1408                cx24116_writereg(state, CX24116_REG_RATEDIV, 0x00);
1409        }
1410
1411        cmd.len = 0x13;
1412
1413        /* We need to support pilot and non-pilot tuning in the
1414         * driver automatically. This is a workaround for because
1415         * the demod does not support autodetect.
1416         */
1417        do {
1418                /* Reset status register */
1419                status = cx24116_readreg(state, CX24116_REG_SSTATUS)
1420                        & CX24116_SIGNAL_MASK;
1421                cx24116_writereg(state, CX24116_REG_SSTATUS, status);
1422
1423                /* Tune */
1424                ret = cx24116_cmd_execute(fe, &cmd);
1425                if (ret != 0)
1426                        break;
1427
1428                /*
1429                 * Wait for up to 500 ms before retrying
1430                 *
1431                 * If we are able to tune then generally it occurs within 100ms.
1432                 * If it takes longer, try a different toneburst setting.
1433                 */
1434                for (i = 0; i < 50 ; i++) {
1435                        cx24116_read_status(fe, &tunerstat);
1436                        status = tunerstat & (FE_HAS_SIGNAL | FE_HAS_SYNC);
1437                        if (status == (FE_HAS_SIGNAL | FE_HAS_SYNC)) {
1438                                dprintk("%s: Tuned\n", __func__);
1439                                goto tuned;
1440                        }
1441                        msleep(10);
1442                }
1443
1444                dprintk("%s: Not tuned\n", __func__);
1445
1446                /* Toggle pilot bit when in auto-pilot */
1447                if (state->dcur.pilot == PILOT_AUTO)
1448                        cmd.args[0x07] ^= CX24116_PILOT_ON;
1449        } while (--retune);
1450
1451tuned:  /* Set/Reset B/W */
1452        cmd.args[0x00] = CMD_BANDWIDTH;
1453        cmd.args[0x01] = 0x00;
1454        cmd.len = 0x02;
1455        return cx24116_cmd_execute(fe, &cmd);
1456}
1457
1458static int cx24116_tune(struct dvb_frontend *fe, struct dvb_frontend_parameters *params,
1459        unsigned int mode_flags, unsigned int *delay, fe_status_t *status)
1460{
1461        *delay = HZ / 5;
1462        if (params) {
1463                int ret = cx24116_set_frontend(fe, params);
1464                if (ret)
1465                        return ret;
1466        }
1467        return cx24116_read_status(fe, status);
1468}
1469
1470static int cx24116_get_algo(struct dvb_frontend *fe)
1471{
1472        return DVBFE_ALGO_HW;
1473}
1474
1475static struct dvb_frontend_ops cx24116_ops = {
1476
1477        .info = {
1478                .name = "Conexant CX24116/CX24118",
1479                .type = FE_QPSK,
1480                .frequency_min = 950000,
1481                .frequency_max = 2150000,
1482                .frequency_stepsize = 1011, /* kHz for QPSK frontends */
1483                .frequency_tolerance = 5000,
1484                .symbol_rate_min = 1000000,
1485                .symbol_rate_max = 45000000,
1486                .caps = FE_CAN_INVERSION_AUTO |
1487                        FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
1488                        FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
1489                        FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
1490                        FE_CAN_2G_MODULATION |
1491                        FE_CAN_QPSK | FE_CAN_RECOVER
1492        },
1493
1494        .release = cx24116_release,
1495
1496        .init = cx24116_initfe,
1497        .sleep = cx24116_sleep,
1498        .read_status = cx24116_read_status,
1499        .read_ber = cx24116_read_ber,
1500        .read_signal_strength = cx24116_read_signal_strength,
1501        .read_snr = cx24116_read_snr,
1502        .read_ucblocks = cx24116_read_ucblocks,
1503        .set_tone = cx24116_set_tone,
1504        .set_voltage = cx24116_set_voltage,
1505        .diseqc_send_master_cmd = cx24116_send_diseqc_msg,
1506        .diseqc_send_burst = cx24116_diseqc_send_burst,
1507        .get_frontend_algo = cx24116_get_algo,
1508        .tune = cx24116_tune,
1509
1510        .set_property = cx24116_set_property,
1511        .get_property = cx24116_get_property,
1512        .set_frontend = cx24116_set_frontend,
1513};
1514
1515MODULE_DESCRIPTION("DVB Frontend module for Conexant cx24116/cx24118 hardware");
1516MODULE_AUTHOR("Steven Toth");
1517MODULE_LICENSE("GPL");
1518
1519