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        enum fe_spectral_inversion inversion;
 164        enum fe_code_rate fec;
 165
 166        enum fe_delivery_system delsys;
 167        enum fe_modulation modulation;
 168        enum fe_pilot pilot;
 169        enum fe_rolloff 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, value == 0x%02x)\n",
 213                       __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        enum fe_spectral_inversion 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        enum fe_delivery_system delivery_system;
 377        enum fe_modulation modulation;
 378        enum fe_code_rate 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        enum fe_delivery_system d, enum fe_modulation m, enum fe_code_rate 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                           enum fe_delivery_system delsys,
 438                           enum fe_modulation mod,
 439                           enum fe_code_rate fec)
 440{
 441        int ret = 0;
 442
 443        dprintk("%s(0x%02x,0x%02x)\n", __func__, mod, fec);
 444
 445        ret = cx24116_lookup_fecmod(state, delsys, mod, fec);
 446
 447        if (ret < 0)
 448                return ret;
 449
 450        state->dnxt.fec = fec;
 451        state->dnxt.fec_val = CX24116_MODFEC_MODES[ret].val;
 452        state->dnxt.fec_mask = CX24116_MODFEC_MODES[ret].mask;
 453        dprintk("%s() mask/val = 0x%02x/0x%02x\n", __func__,
 454                state->dnxt.fec_mask, state->dnxt.fec_val);
 455
 456        return 0;
 457}
 458
 459static int cx24116_set_symbolrate(struct cx24116_state *state, u32 rate)
 460{
 461        dprintk("%s(%d)\n", __func__, rate);
 462
 463        /*  check if symbol rate is within limits */
 464        if ((rate > state->frontend.ops.info.symbol_rate_max) ||
 465            (rate < state->frontend.ops.info.symbol_rate_min)) {
 466                dprintk("%s() unsupported symbol_rate = %d\n", __func__, rate);
 467                return -EOPNOTSUPP;
 468        }
 469
 470        state->dnxt.symbol_rate = rate;
 471        dprintk("%s() symbol_rate = %d\n", __func__, rate);
 472
 473        return 0;
 474}
 475
 476static int cx24116_load_firmware(struct dvb_frontend *fe,
 477        const struct firmware *fw);
 478
 479static int cx24116_firmware_ondemand(struct dvb_frontend *fe)
 480{
 481        struct cx24116_state *state = fe->demodulator_priv;
 482        const struct firmware *fw;
 483        int ret = 0;
 484
 485        dprintk("%s()\n", __func__);
 486
 487        if (cx24116_readreg(state, 0x20) > 0) {
 488
 489                if (state->skip_fw_load)
 490                        return 0;
 491
 492                /* Load firmware */
 493                /* request the firmware, this will block until loaded */
 494                printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n",
 495                        __func__, CX24116_DEFAULT_FIRMWARE);
 496                ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE,
 497                        state->i2c->dev.parent);
 498                printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n",
 499                        __func__);
 500                if (ret) {
 501                        printk(KERN_ERR "%s: No firmware uploaded (timeout or file not found?)\n",
 502                               __func__);
 503                        return ret;
 504                }
 505
 506                /* Make sure we don't recurse back through here
 507                 * during loading */
 508                state->skip_fw_load = 1;
 509
 510                ret = cx24116_load_firmware(fe, fw);
 511                if (ret)
 512                        printk(KERN_ERR "%s: Writing firmware to device failed\n",
 513                                __func__);
 514
 515                release_firmware(fw);
 516
 517                printk(KERN_INFO "%s: Firmware upload %s\n", __func__,
 518                        ret == 0 ? "complete" : "failed");
 519
 520                /* Ensure firmware is always loaded if required */
 521                state->skip_fw_load = 0;
 522        }
 523
 524        return ret;
 525}
 526
 527/* Take a basic firmware command structure, format it
 528 * and forward it for processing
 529 */
 530static int cx24116_cmd_execute(struct dvb_frontend *fe, struct cx24116_cmd *cmd)
 531{
 532        struct cx24116_state *state = fe->demodulator_priv;
 533        int i, ret;
 534
 535        dprintk("%s()\n", __func__);
 536
 537        /* Load the firmware if required */
 538        ret = cx24116_firmware_ondemand(fe);
 539        if (ret != 0) {
 540                printk(KERN_ERR "%s(): Unable initialise the firmware\n",
 541                        __func__);
 542                return ret;
 543        }
 544
 545        /* Write the command */
 546        for (i = 0; i < cmd->len ; i++) {
 547                dprintk("%s: 0x%02x == 0x%02x\n", __func__, i, cmd->args[i]);
 548                cx24116_writereg(state, i, cmd->args[i]);
 549        }
 550
 551        /* Start execution and wait for cmd to terminate */
 552        cx24116_writereg(state, CX24116_REG_EXECUTE, 0x01);
 553        while (cx24116_readreg(state, CX24116_REG_EXECUTE)) {
 554                msleep(10);
 555                if (i++ > 64) {
 556                        /* Avoid looping forever if the firmware does
 557                                not respond */
 558                        printk(KERN_WARNING "%s() Firmware not responding\n",
 559                                __func__);
 560                        return -EREMOTEIO;
 561                }
 562        }
 563        return 0;
 564}
 565
 566static int cx24116_load_firmware(struct dvb_frontend *fe,
 567        const struct firmware *fw)
 568{
 569        struct cx24116_state *state = fe->demodulator_priv;
 570        struct cx24116_cmd cmd;
 571        int i, ret, len, max, remaining;
 572        unsigned char vers[4];
 573
 574        dprintk("%s\n", __func__);
 575        dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
 576                        fw->size,
 577                        fw->data[0],
 578                        fw->data[1],
 579                        fw->data[fw->size-2],
 580                        fw->data[fw->size-1]);
 581
 582        /* Toggle 88x SRST pin to reset demod */
 583        if (state->config->reset_device)
 584                state->config->reset_device(fe);
 585
 586        /* Begin the firmware load process */
 587        /* Prepare the demod, load the firmware, cleanup after load */
 588
 589        /* Init PLL */
 590        cx24116_writereg(state, 0xE5, 0x00);
 591        cx24116_writereg(state, 0xF1, 0x08);
 592        cx24116_writereg(state, 0xF2, 0x13);
 593
 594        /* Start PLL */
 595        cx24116_writereg(state, 0xe0, 0x03);
 596        cx24116_writereg(state, 0xe0, 0x00);
 597
 598        /* Unknown */
 599        cx24116_writereg(state, CX24116_REG_CLKDIV, 0x46);
 600        cx24116_writereg(state, CX24116_REG_RATEDIV, 0x00);
 601
 602        /* Unknown */
 603        cx24116_writereg(state, 0xF0, 0x03);
 604        cx24116_writereg(state, 0xF4, 0x81);
 605        cx24116_writereg(state, 0xF5, 0x00);
 606        cx24116_writereg(state, 0xF6, 0x00);
 607
 608        /* Split firmware to the max I2C write len and write.
 609         * Writes whole firmware as one write when i2c_wr_max is set to 0. */
 610        if (state->config->i2c_wr_max)
 611                max = state->config->i2c_wr_max;
 612        else
 613                max = INT_MAX; /* enough for 32k firmware */
 614
 615        for (remaining = fw->size; remaining > 0; remaining -= max - 1) {
 616                len = remaining;
 617                if (len > max - 1)
 618                        len = max - 1;
 619
 620                cx24116_writeregN(state, 0xF7, &fw->data[fw->size - remaining],
 621                        len);
 622        }
 623
 624        cx24116_writereg(state, 0xF4, 0x10);
 625        cx24116_writereg(state, 0xF0, 0x00);
 626        cx24116_writereg(state, 0xF8, 0x06);
 627
 628        /* Firmware CMD 10: VCO config */
 629        cmd.args[0x00] = CMD_SET_VCO;
 630        cmd.args[0x01] = 0x05;
 631        cmd.args[0x02] = 0xdc;
 632        cmd.args[0x03] = 0xda;
 633        cmd.args[0x04] = 0xae;
 634        cmd.args[0x05] = 0xaa;
 635        cmd.args[0x06] = 0x04;
 636        cmd.args[0x07] = 0x9d;
 637        cmd.args[0x08] = 0xfc;
 638        cmd.args[0x09] = 0x06;
 639        cmd.len = 0x0a;
 640        ret = cx24116_cmd_execute(fe, &cmd);
 641        if (ret != 0)
 642                return ret;
 643
 644        cx24116_writereg(state, CX24116_REG_SSTATUS, 0x00);
 645
 646        /* Firmware CMD 14: Tuner config */
 647        cmd.args[0x00] = CMD_TUNERINIT;
 648        cmd.args[0x01] = 0x00;
 649        cmd.args[0x02] = 0x00;
 650        cmd.len = 0x03;
 651        ret = cx24116_cmd_execute(fe, &cmd);
 652        if (ret != 0)
 653                return ret;
 654
 655        cx24116_writereg(state, 0xe5, 0x00);
 656
 657        /* Firmware CMD 13: MPEG config */
 658        cmd.args[0x00] = CMD_MPEGCONFIG;
 659        cmd.args[0x01] = 0x01;
 660        cmd.args[0x02] = 0x75;
 661        cmd.args[0x03] = 0x00;
 662        if (state->config->mpg_clk_pos_pol)
 663                cmd.args[0x04] = state->config->mpg_clk_pos_pol;
 664        else
 665                cmd.args[0x04] = 0x02;
 666        cmd.args[0x05] = 0x00;
 667        cmd.len = 0x06;
 668        ret = cx24116_cmd_execute(fe, &cmd);
 669        if (ret != 0)
 670                return ret;
 671
 672        /* Firmware CMD 35: Get firmware version */
 673        cmd.args[0x00] = CMD_UPDFWVERS;
 674        cmd.len = 0x02;
 675        for (i = 0; i < 4; i++) {
 676                cmd.args[0x01] = i;
 677                ret = cx24116_cmd_execute(fe, &cmd);
 678                if (ret != 0)
 679                        return ret;
 680                vers[i] = cx24116_readreg(state, CX24116_REG_MAILBOX);
 681        }
 682        printk(KERN_INFO "%s: FW version %i.%i.%i.%i\n", __func__,
 683                vers[0], vers[1], vers[2], vers[3]);
 684
 685        return 0;
 686}
 687
 688static int cx24116_read_status(struct dvb_frontend *fe, enum fe_status *status)
 689{
 690        struct cx24116_state *state = fe->demodulator_priv;
 691
 692        int lock = cx24116_readreg(state, CX24116_REG_SSTATUS) &
 693                CX24116_STATUS_MASK;
 694
 695        dprintk("%s: status = 0x%02x\n", __func__, lock);
 696
 697        *status = 0;
 698
 699        if (lock & CX24116_HAS_SIGNAL)
 700                *status |= FE_HAS_SIGNAL;
 701        if (lock & CX24116_HAS_CARRIER)
 702                *status |= FE_HAS_CARRIER;
 703        if (lock & CX24116_HAS_VITERBI)
 704                *status |= FE_HAS_VITERBI;
 705        if (lock & CX24116_HAS_SYNCLOCK)
 706                *status |= FE_HAS_SYNC | FE_HAS_LOCK;
 707
 708        return 0;
 709}
 710
 711static int cx24116_read_ber(struct dvb_frontend *fe, u32 *ber)
 712{
 713        struct cx24116_state *state = fe->demodulator_priv;
 714
 715        dprintk("%s()\n", __func__);
 716
 717        *ber =  (cx24116_readreg(state, CX24116_REG_BER24) << 24) |
 718                (cx24116_readreg(state, CX24116_REG_BER16) << 16) |
 719                (cx24116_readreg(state, CX24116_REG_BER8)  << 8)  |
 720                 cx24116_readreg(state, CX24116_REG_BER0);
 721
 722        return 0;
 723}
 724
 725/* TODO Determine function and scale appropriately */
 726static int cx24116_read_signal_strength(struct dvb_frontend *fe,
 727        u16 *signal_strength)
 728{
 729        struct cx24116_state *state = fe->demodulator_priv;
 730        struct cx24116_cmd cmd;
 731        int ret;
 732        u16 sig_reading;
 733
 734        dprintk("%s()\n", __func__);
 735
 736        /* Firmware CMD 19: Get AGC */
 737        cmd.args[0x00] = CMD_GETAGC;
 738        cmd.len = 0x01;
 739        ret = cx24116_cmd_execute(fe, &cmd);
 740        if (ret != 0)
 741                return ret;
 742
 743        sig_reading =
 744                (cx24116_readreg(state,
 745                        CX24116_REG_SSTATUS) & CX24116_SIGNAL_MASK) |
 746                (cx24116_readreg(state, CX24116_REG_SIGNAL) << 6);
 747        *signal_strength = 0 - sig_reading;
 748
 749        dprintk("%s: raw / cooked = 0x%04x / 0x%04x\n",
 750                __func__, sig_reading, *signal_strength);
 751
 752        return 0;
 753}
 754
 755/* SNR (0..100)% = (sig & 0xf0) * 10 + (sig & 0x0f) * 10 / 16 */
 756static int cx24116_read_snr_pct(struct dvb_frontend *fe, u16 *snr)
 757{
 758        struct cx24116_state *state = fe->demodulator_priv;
 759        u8 snr_reading;
 760        static const u32 snr_tab[] = { /* 10 x Table (rounded up) */
 761                0x00000, 0x0199A, 0x03333, 0x04ccD, 0x06667,
 762                0x08000, 0x0999A, 0x0b333, 0x0cccD, 0x0e667,
 763                0x10000, 0x1199A, 0x13333, 0x14ccD, 0x16667,
 764                0x18000 };
 765
 766        dprintk("%s()\n", __func__);
 767
 768        snr_reading = cx24116_readreg(state, CX24116_REG_QUALITY0);
 769
 770        if (snr_reading >= 0xa0 /* 100% */)
 771                *snr = 0xffff;
 772        else
 773                *snr = snr_tab[(snr_reading & 0xf0) >> 4] +
 774                        (snr_tab[(snr_reading & 0x0f)] >> 4);
 775
 776        dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
 777                snr_reading, *snr);
 778
 779        return 0;
 780}
 781
 782/* The reelbox patches show the value in the registers represents
 783 * ESNO, from 0->30db (values 0->300). We provide this value by
 784 * default.
 785 */
 786static int cx24116_read_snr_esno(struct dvb_frontend *fe, u16 *snr)
 787{
 788        struct cx24116_state *state = fe->demodulator_priv;
 789
 790        dprintk("%s()\n", __func__);
 791
 792        *snr = cx24116_readreg(state, CX24116_REG_QUALITY8) << 8 |
 793                cx24116_readreg(state, CX24116_REG_QUALITY0);
 794
 795        dprintk("%s: raw 0x%04x\n", __func__, *snr);
 796
 797        return 0;
 798}
 799
 800static int cx24116_read_snr(struct dvb_frontend *fe, u16 *snr)
 801{
 802        if (esno_snr == 1)
 803                return cx24116_read_snr_esno(fe, snr);
 804        else
 805                return cx24116_read_snr_pct(fe, snr);
 806}
 807
 808static int cx24116_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
 809{
 810        struct cx24116_state *state = fe->demodulator_priv;
 811
 812        dprintk("%s()\n", __func__);
 813
 814        *ucblocks = (cx24116_readreg(state, CX24116_REG_UCB8) << 8) |
 815                cx24116_readreg(state, CX24116_REG_UCB0);
 816
 817        return 0;
 818}
 819
 820/* Overwrite the current tuning params, we are about to tune */
 821static void cx24116_clone_params(struct dvb_frontend *fe)
 822{
 823        struct cx24116_state *state = fe->demodulator_priv;
 824        state->dcur = state->dnxt;
 825}
 826
 827/* Wait for LNB */
 828static int cx24116_wait_for_lnb(struct dvb_frontend *fe)
 829{
 830        struct cx24116_state *state = fe->demodulator_priv;
 831        int i;
 832
 833        dprintk("%s() qstatus = 0x%02x\n", __func__,
 834                cx24116_readreg(state, CX24116_REG_QSTATUS));
 835
 836        /* Wait for up to 300 ms */
 837        for (i = 0; i < 30 ; i++) {
 838                if (cx24116_readreg(state, CX24116_REG_QSTATUS) & 0x20)
 839                        return 0;
 840                msleep(10);
 841        }
 842
 843        dprintk("%s(): LNB not ready\n", __func__);
 844
 845        return -ETIMEDOUT; /* -EBUSY ? */
 846}
 847
 848static int cx24116_set_voltage(struct dvb_frontend *fe,
 849        enum fe_sec_voltage voltage)
 850{
 851        struct cx24116_cmd cmd;
 852        int ret;
 853
 854        dprintk("%s: %s\n", __func__,
 855                voltage == SEC_VOLTAGE_13 ? "SEC_VOLTAGE_13" :
 856                voltage == SEC_VOLTAGE_18 ? "SEC_VOLTAGE_18" : "??");
 857
 858        /* Wait for LNB ready */
 859        ret = cx24116_wait_for_lnb(fe);
 860        if (ret != 0)
 861                return ret;
 862
 863        /* Wait for voltage/min repeat delay */
 864        msleep(100);
 865
 866        cmd.args[0x00] = CMD_LNBDCLEVEL;
 867        cmd.args[0x01] = (voltage == SEC_VOLTAGE_18 ? 0x01 : 0x00);
 868        cmd.len = 0x02;
 869
 870        /* Min delay time before DiSEqC send */
 871        msleep(15);
 872
 873        return cx24116_cmd_execute(fe, &cmd);
 874}
 875
 876static int cx24116_set_tone(struct dvb_frontend *fe,
 877        enum fe_sec_tone_mode tone)
 878{
 879        struct cx24116_cmd cmd;
 880        int ret;
 881
 882        dprintk("%s(%d)\n", __func__, tone);
 883        if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) {
 884                printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone);
 885                return -EINVAL;
 886        }
 887
 888        /* Wait for LNB ready */
 889        ret = cx24116_wait_for_lnb(fe);
 890        if (ret != 0)
 891                return ret;
 892
 893        /* Min delay time after DiSEqC send */
 894        msleep(15); /* XXX determine is FW does this, see send_diseqc/burst */
 895
 896        /* Now we set the tone */
 897        cmd.args[0x00] = CMD_SET_TONE;
 898        cmd.args[0x01] = 0x00;
 899        cmd.args[0x02] = 0x00;
 900
 901        switch (tone) {
 902        case SEC_TONE_ON:
 903                dprintk("%s: setting tone on\n", __func__);
 904                cmd.args[0x03] = 0x01;
 905                break;
 906        case SEC_TONE_OFF:
 907                dprintk("%s: setting tone off\n", __func__);
 908                cmd.args[0x03] = 0x00;
 909                break;
 910        }
 911        cmd.len = 0x04;
 912
 913        /* Min delay time before DiSEqC send */
 914        msleep(15); /* XXX determine is FW does this, see send_diseqc/burst */
 915
 916        return cx24116_cmd_execute(fe, &cmd);
 917}
 918
 919/* Initialise DiSEqC */
 920static int cx24116_diseqc_init(struct dvb_frontend *fe)
 921{
 922        struct cx24116_state *state = fe->demodulator_priv;
 923        struct cx24116_cmd cmd;
 924        int ret;
 925
 926        /* Firmware CMD 20: LNB/DiSEqC config */
 927        cmd.args[0x00] = CMD_LNBCONFIG;
 928        cmd.args[0x01] = 0x00;
 929        cmd.args[0x02] = 0x10;
 930        cmd.args[0x03] = 0x00;
 931        cmd.args[0x04] = 0x8f;
 932        cmd.args[0x05] = 0x28;
 933        cmd.args[0x06] = (toneburst == CX24116_DISEQC_TONEOFF) ? 0x00 : 0x01;
 934        cmd.args[0x07] = 0x01;
 935        cmd.len = 0x08;
 936        ret = cx24116_cmd_execute(fe, &cmd);
 937        if (ret != 0)
 938                return ret;
 939
 940        /* Prepare a DiSEqC command */
 941        state->dsec_cmd.args[0x00] = CMD_LNBSEND;
 942
 943        /* DiSEqC burst */
 944        state->dsec_cmd.args[CX24116_DISEQC_BURST]  = CX24116_DISEQC_MINI_A;
 945
 946        /* Unknown */
 947        state->dsec_cmd.args[CX24116_DISEQC_ARG2_2] = 0x02;
 948        state->dsec_cmd.args[CX24116_DISEQC_ARG3_0] = 0x00;
 949        /* Continuation flag? */
 950        state->dsec_cmd.args[CX24116_DISEQC_ARG4_0] = 0x00;
 951
 952        /* DiSEqC message length */
 953        state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = 0x00;
 954
 955        /* Command length */
 956        state->dsec_cmd.len = CX24116_DISEQC_MSGOFS;
 957
 958        return 0;
 959}
 960
 961/* Send DiSEqC message with derived burst (hack) || previous burst */
 962static int cx24116_send_diseqc_msg(struct dvb_frontend *fe,
 963        struct dvb_diseqc_master_cmd *d)
 964{
 965        struct cx24116_state *state = fe->demodulator_priv;
 966        int i, ret;
 967
 968        /* Validate length */
 969        if (d->msg_len > sizeof(d->msg))
 970                return -EINVAL;
 971
 972        /* Dump DiSEqC message */
 973        if (debug) {
 974                printk(KERN_INFO "cx24116: %s(", __func__);
 975                for (i = 0 ; i < d->msg_len ;) {
 976                        printk(KERN_INFO "0x%02x", d->msg[i]);
 977                        if (++i < d->msg_len)
 978                                printk(KERN_INFO ", ");
 979                }
 980                printk(") toneburst=%d\n", toneburst);
 981        }
 982
 983        /* DiSEqC message */
 984        for (i = 0; i < d->msg_len; i++)
 985                state->dsec_cmd.args[CX24116_DISEQC_MSGOFS + i] = d->msg[i];
 986
 987        /* DiSEqC message length */
 988        state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] = d->msg_len;
 989
 990        /* Command length */
 991        state->dsec_cmd.len = CX24116_DISEQC_MSGOFS +
 992                state->dsec_cmd.args[CX24116_DISEQC_MSGLEN];
 993
 994        /* DiSEqC toneburst */
 995        if (toneburst == CX24116_DISEQC_MESGCACHE)
 996                /* Message is cached */
 997                return 0;
 998
 999        else if (toneburst == CX24116_DISEQC_TONEOFF)
1000                /* Message is sent without burst */
1001                state->dsec_cmd.args[CX24116_DISEQC_BURST] = 0;
1002
1003        else if (toneburst == CX24116_DISEQC_TONECACHE) {
1004                /*
1005                 * Message is sent with derived else cached burst
1006                 *
1007                 * WRITE PORT GROUP COMMAND 38
1008                 *
1009                 * 0/A/A: E0 10 38 F0..F3
1010                 * 1/B/B: E0 10 38 F4..F7
1011                 * 2/C/A: E0 10 38 F8..FB
1012                 * 3/D/B: E0 10 38 FC..FF
1013                 *
1014                 * databyte[3]= 8421:8421
1015                 *              ABCD:WXYZ
1016                 *              CLR :SET
1017                 *
1018                 *              WX= PORT SELECT 0..3    (X=TONEBURST)
1019                 *              Y = VOLTAGE             (0=13V, 1=18V)
1020                 *              Z = BAND                (0=LOW, 1=HIGH(22K))
1021                 */
1022                if (d->msg_len >= 4 && d->msg[2] == 0x38)
1023                        state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1024                                ((d->msg[3] & 4) >> 2);
1025                if (debug)
1026                        dprintk("%s burst=%d\n", __func__,
1027                                state->dsec_cmd.args[CX24116_DISEQC_BURST]);
1028        }
1029
1030        /* Wait for LNB ready */
1031        ret = cx24116_wait_for_lnb(fe);
1032        if (ret != 0)
1033                return ret;
1034
1035        /* Wait for voltage/min repeat delay */
1036        msleep(100);
1037
1038        /* Command */
1039        ret = cx24116_cmd_execute(fe, &state->dsec_cmd);
1040        if (ret != 0)
1041                return ret;
1042        /*
1043         * Wait for send
1044         *
1045         * Eutelsat spec:
1046         * >15ms delay          + (XXX determine if FW does this, see set_tone)
1047         *  13.5ms per byte     +
1048         * >15ms delay          +
1049         *  12.5ms burst        +
1050         * >15ms delay            (XXX determine if FW does this, see set_tone)
1051         */
1052        msleep((state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] << 4) +
1053                ((toneburst == CX24116_DISEQC_TONEOFF) ? 30 : 60));
1054
1055        return 0;
1056}
1057
1058/* Send DiSEqC burst */
1059static int cx24116_diseqc_send_burst(struct dvb_frontend *fe,
1060        enum fe_sec_mini_cmd burst)
1061{
1062        struct cx24116_state *state = fe->demodulator_priv;
1063        int ret;
1064
1065        dprintk("%s(%d) toneburst=%d\n", __func__, burst, toneburst);
1066
1067        /* DiSEqC burst */
1068        if (burst == SEC_MINI_A)
1069                state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1070                        CX24116_DISEQC_MINI_A;
1071        else if (burst == SEC_MINI_B)
1072                state->dsec_cmd.args[CX24116_DISEQC_BURST] =
1073                        CX24116_DISEQC_MINI_B;
1074        else
1075                return -EINVAL;
1076
1077        /* DiSEqC toneburst */
1078        if (toneburst != CX24116_DISEQC_MESGCACHE)
1079                /* Burst is cached */
1080                return 0;
1081
1082        /* Burst is to be sent with cached message */
1083
1084        /* Wait for LNB ready */
1085        ret = cx24116_wait_for_lnb(fe);
1086        if (ret != 0)
1087                return ret;
1088
1089        /* Wait for voltage/min repeat delay */
1090        msleep(100);
1091
1092        /* Command */
1093        ret = cx24116_cmd_execute(fe, &state->dsec_cmd);
1094        if (ret != 0)
1095                return ret;
1096
1097        /*
1098         * Wait for send
1099         *
1100         * Eutelsat spec:
1101         * >15ms delay          + (XXX determine if FW does this, see set_tone)
1102         *  13.5ms per byte     +
1103         * >15ms delay          +
1104         *  12.5ms burst        +
1105         * >15ms delay            (XXX determine if FW does this, see set_tone)
1106         */
1107        msleep((state->dsec_cmd.args[CX24116_DISEQC_MSGLEN] << 4) + 60);
1108
1109        return 0;
1110}
1111
1112static void cx24116_release(struct dvb_frontend *fe)
1113{
1114        struct cx24116_state *state = fe->demodulator_priv;
1115        dprintk("%s\n", __func__);
1116        kfree(state);
1117}
1118
1119static const struct dvb_frontend_ops cx24116_ops;
1120
1121struct dvb_frontend *cx24116_attach(const struct cx24116_config *config,
1122        struct i2c_adapter *i2c)
1123{
1124        struct cx24116_state *state = NULL;
1125        int ret;
1126
1127        dprintk("%s\n", __func__);
1128
1129        /* allocate memory for the internal state */
1130        state = kzalloc(sizeof(struct cx24116_state), GFP_KERNEL);
1131        if (state == NULL)
1132                goto error1;
1133
1134        state->config = config;
1135        state->i2c = i2c;
1136
1137        /* check if the demod is present */
1138        ret = (cx24116_readreg(state, 0xFF) << 8) |
1139                cx24116_readreg(state, 0xFE);
1140        if (ret != 0x0501) {
1141                printk(KERN_INFO "Invalid probe, probably not a CX24116 device\n");
1142                goto error2;
1143        }
1144
1145        /* create dvb_frontend */
1146        memcpy(&state->frontend.ops, &cx24116_ops,
1147                sizeof(struct dvb_frontend_ops));
1148        state->frontend.demodulator_priv = state;
1149        return &state->frontend;
1150
1151error2: kfree(state);
1152error1: return NULL;
1153}
1154EXPORT_SYMBOL(cx24116_attach);
1155
1156/*
1157 * Initialise or wake up device
1158 *
1159 * Power config will reset and load initial firmware if required
1160 */
1161static int cx24116_initfe(struct dvb_frontend *fe)
1162{
1163        struct cx24116_state *state = fe->demodulator_priv;
1164        struct cx24116_cmd cmd;
1165        int ret;
1166
1167        dprintk("%s()\n", __func__);
1168
1169        /* Power on */
1170        cx24116_writereg(state, 0xe0, 0);
1171        cx24116_writereg(state, 0xe1, 0);
1172        cx24116_writereg(state, 0xea, 0);
1173
1174        /* Firmware CMD 36: Power config */
1175        cmd.args[0x00] = CMD_TUNERSLEEP;
1176        cmd.args[0x01] = 0;
1177        cmd.len = 0x02;
1178        ret = cx24116_cmd_execute(fe, &cmd);
1179        if (ret != 0)
1180                return ret;
1181
1182        ret = cx24116_diseqc_init(fe);
1183        if (ret != 0)
1184                return ret;
1185
1186        /* HVR-4000 needs this */
1187        return cx24116_set_voltage(fe, SEC_VOLTAGE_13);
1188}
1189
1190/*
1191 * Put device to sleep
1192 */
1193static int cx24116_sleep(struct dvb_frontend *fe)
1194{
1195        struct cx24116_state *state = fe->demodulator_priv;
1196        struct cx24116_cmd cmd;
1197        int ret;
1198
1199        dprintk("%s()\n", __func__);
1200
1201        /* Firmware CMD 36: Power config */
1202        cmd.args[0x00] = CMD_TUNERSLEEP;
1203        cmd.args[0x01] = 1;
1204        cmd.len = 0x02;
1205        ret = cx24116_cmd_execute(fe, &cmd);
1206        if (ret != 0)
1207                return ret;
1208
1209        /* Power off (Shutdown clocks) */
1210        cx24116_writereg(state, 0xea, 0xff);
1211        cx24116_writereg(state, 0xe1, 1);
1212        cx24116_writereg(state, 0xe0, 1);
1213
1214        return 0;
1215}
1216
1217/* dvb-core told us to tune, the tv property cache will be complete,
1218 * it's safe for is to pull values and use them for tuning purposes.
1219 */
1220static int cx24116_set_frontend(struct dvb_frontend *fe)
1221{
1222        struct cx24116_state *state = fe->demodulator_priv;
1223        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
1224        struct cx24116_cmd cmd;
1225        enum fe_status tunerstat;
1226        int i, status, ret, retune = 1;
1227
1228        dprintk("%s()\n", __func__);
1229
1230        switch (c->delivery_system) {
1231        case SYS_DVBS:
1232                dprintk("%s: DVB-S delivery system selected\n", __func__);
1233
1234                /* Only QPSK is supported for DVB-S */
1235                if (c->modulation != QPSK) {
1236                        dprintk("%s: unsupported modulation selected (%d)\n",
1237                                __func__, c->modulation);
1238                        return -EOPNOTSUPP;
1239                }
1240
1241                /* Pilot doesn't exist in DVB-S, turn bit off */
1242                state->dnxt.pilot_val = CX24116_PILOT_OFF;
1243
1244                /* DVB-S only supports 0.35 */
1245                if (c->rolloff != ROLLOFF_35) {
1246                        dprintk("%s: unsupported rolloff selected (%d)\n",
1247                                __func__, c->rolloff);
1248                        return -EOPNOTSUPP;
1249                }
1250                state->dnxt.rolloff_val = CX24116_ROLLOFF_035;
1251                break;
1252
1253        case SYS_DVBS2:
1254                dprintk("%s: DVB-S2 delivery system selected\n", __func__);
1255
1256                /*
1257                 * NBC 8PSK/QPSK with DVB-S is supported for DVB-S2,
1258                 * but not hardware auto detection
1259                 */
1260                if (c->modulation != PSK_8 && c->modulation != QPSK) {
1261                        dprintk("%s: unsupported modulation selected (%d)\n",
1262                                __func__, c->modulation);
1263                        return -EOPNOTSUPP;
1264                }
1265
1266                switch (c->pilot) {
1267                case PILOT_AUTO:        /* Not supported but emulated */
1268                        state->dnxt.pilot_val = (c->modulation == QPSK)
1269                                ? CX24116_PILOT_OFF : CX24116_PILOT_ON;
1270                        retune++;
1271                        break;
1272                case PILOT_OFF:
1273                        state->dnxt.pilot_val = CX24116_PILOT_OFF;
1274                        break;
1275                case PILOT_ON:
1276                        state->dnxt.pilot_val = CX24116_PILOT_ON;
1277                        break;
1278                default:
1279                        dprintk("%s: unsupported pilot mode selected (%d)\n",
1280                                __func__, c->pilot);
1281                        return -EOPNOTSUPP;
1282                }
1283
1284                switch (c->rolloff) {
1285                case ROLLOFF_20:
1286                        state->dnxt.rolloff_val = CX24116_ROLLOFF_020;
1287                        break;
1288                case ROLLOFF_25:
1289                        state->dnxt.rolloff_val = CX24116_ROLLOFF_025;
1290                        break;
1291                case ROLLOFF_35:
1292                        state->dnxt.rolloff_val = CX24116_ROLLOFF_035;
1293                        break;
1294                case ROLLOFF_AUTO:      /* Rolloff must be explicit */
1295                default:
1296                        dprintk("%s: unsupported rolloff selected (%d)\n",
1297                                __func__, c->rolloff);
1298                        return -EOPNOTSUPP;
1299                }
1300                break;
1301
1302        default:
1303                dprintk("%s: unsupported delivery system selected (%d)\n",
1304                        __func__, c->delivery_system);
1305                return -EOPNOTSUPP;
1306        }
1307        state->dnxt.delsys = c->delivery_system;
1308        state->dnxt.modulation = c->modulation;
1309        state->dnxt.frequency = c->frequency;
1310        state->dnxt.pilot = c->pilot;
1311        state->dnxt.rolloff = c->rolloff;
1312
1313        ret = cx24116_set_inversion(state, c->inversion);
1314        if (ret !=  0)
1315                return ret;
1316
1317        /* FEC_NONE/AUTO for DVB-S2 is not supported and detected here */
1318        ret = cx24116_set_fec(state, c->delivery_system, c->modulation, c->fec_inner);
1319        if (ret !=  0)
1320                return ret;
1321
1322        ret = cx24116_set_symbolrate(state, c->symbol_rate);
1323        if (ret !=  0)
1324                return ret;
1325
1326        /* discard the 'current' tuning parameters and prepare to tune */
1327        cx24116_clone_params(fe);
1328
1329        dprintk("%s:   delsys      = %d\n", __func__, state->dcur.delsys);
1330        dprintk("%s:   modulation  = %d\n", __func__, state->dcur.modulation);
1331        dprintk("%s:   frequency   = %d\n", __func__, state->dcur.frequency);
1332        dprintk("%s:   pilot       = %d (val = 0x%02x)\n", __func__,
1333                state->dcur.pilot, state->dcur.pilot_val);
1334        dprintk("%s:   retune      = %d\n", __func__, retune);
1335        dprintk("%s:   rolloff     = %d (val = 0x%02x)\n", __func__,
1336                state->dcur.rolloff, state->dcur.rolloff_val);
1337        dprintk("%s:   symbol_rate = %d\n", __func__, state->dcur.symbol_rate);
1338        dprintk("%s:   FEC         = %d (mask/val = 0x%02x/0x%02x)\n", __func__,
1339                state->dcur.fec, state->dcur.fec_mask, state->dcur.fec_val);
1340        dprintk("%s:   Inversion   = %d (val = 0x%02x)\n", __func__,
1341                state->dcur.inversion, state->dcur.inversion_val);
1342
1343        /* This is also done in advise/acquire on HVR4000 but not on LITE */
1344        if (state->config->set_ts_params)
1345                state->config->set_ts_params(fe, 0);
1346
1347        /* Set/Reset B/W */
1348        cmd.args[0x00] = CMD_BANDWIDTH;
1349        cmd.args[0x01] = 0x01;
1350        cmd.len = 0x02;
1351        ret = cx24116_cmd_execute(fe, &cmd);
1352        if (ret != 0)
1353                return ret;
1354
1355        /* Prepare a tune request */
1356        cmd.args[0x00] = CMD_TUNEREQUEST;
1357
1358        /* Frequency */
1359        cmd.args[0x01] = (state->dcur.frequency & 0xff0000) >> 16;
1360        cmd.args[0x02] = (state->dcur.frequency & 0x00ff00) >> 8;
1361        cmd.args[0x03] = (state->dcur.frequency & 0x0000ff);
1362
1363        /* Symbol Rate */
1364        cmd.args[0x04] = ((state->dcur.symbol_rate / 1000) & 0xff00) >> 8;
1365        cmd.args[0x05] = ((state->dcur.symbol_rate / 1000) & 0x00ff);
1366
1367        /* Automatic Inversion */
1368        cmd.args[0x06] = state->dcur.inversion_val;
1369
1370        /* Modulation / FEC / Pilot */
1371        cmd.args[0x07] = state->dcur.fec_val | state->dcur.pilot_val;
1372
1373        cmd.args[0x08] = CX24116_SEARCH_RANGE_KHZ >> 8;
1374        cmd.args[0x09] = CX24116_SEARCH_RANGE_KHZ & 0xff;
1375        cmd.args[0x0a] = 0x00;
1376        cmd.args[0x0b] = 0x00;
1377        cmd.args[0x0c] = state->dcur.rolloff_val;
1378        cmd.args[0x0d] = state->dcur.fec_mask;
1379
1380        if (state->dcur.symbol_rate > 30000000) {
1381                cmd.args[0x0e] = 0x04;
1382                cmd.args[0x0f] = 0x00;
1383                cmd.args[0x10] = 0x01;
1384                cmd.args[0x11] = 0x77;
1385                cmd.args[0x12] = 0x36;
1386                cx24116_writereg(state, CX24116_REG_CLKDIV, 0x44);
1387                cx24116_writereg(state, CX24116_REG_RATEDIV, 0x01);
1388        } else {
1389                cmd.args[0x0e] = 0x06;
1390                cmd.args[0x0f] = 0x00;
1391                cmd.args[0x10] = 0x00;
1392                cmd.args[0x11] = 0xFA;
1393                cmd.args[0x12] = 0x24;
1394                cx24116_writereg(state, CX24116_REG_CLKDIV, 0x46);
1395                cx24116_writereg(state, CX24116_REG_RATEDIV, 0x00);
1396        }
1397
1398        cmd.len = 0x13;
1399
1400        /* We need to support pilot and non-pilot tuning in the
1401         * driver automatically. This is a workaround for because
1402         * the demod does not support autodetect.
1403         */
1404        do {
1405                /* Reset status register */
1406                status = cx24116_readreg(state, CX24116_REG_SSTATUS)
1407                        & CX24116_SIGNAL_MASK;
1408                cx24116_writereg(state, CX24116_REG_SSTATUS, status);
1409
1410                /* Tune */
1411                ret = cx24116_cmd_execute(fe, &cmd);
1412                if (ret != 0)
1413                        break;
1414
1415                /*
1416                 * Wait for up to 500 ms before retrying
1417                 *
1418                 * If we are able to tune then generally it occurs within 100ms.
1419                 * If it takes longer, try a different toneburst setting.
1420                 */
1421                for (i = 0; i < 50 ; i++) {
1422                        cx24116_read_status(fe, &tunerstat);
1423                        status = tunerstat & (FE_HAS_SIGNAL | FE_HAS_SYNC);
1424                        if (status == (FE_HAS_SIGNAL | FE_HAS_SYNC)) {
1425                                dprintk("%s: Tuned\n", __func__);
1426                                goto tuned;
1427                        }
1428                        msleep(10);
1429                }
1430
1431                dprintk("%s: Not tuned\n", __func__);
1432
1433                /* Toggle pilot bit when in auto-pilot */
1434                if (state->dcur.pilot == PILOT_AUTO)
1435                        cmd.args[0x07] ^= CX24116_PILOT_ON;
1436        } while (--retune);
1437
1438tuned:  /* Set/Reset B/W */
1439        cmd.args[0x00] = CMD_BANDWIDTH;
1440        cmd.args[0x01] = 0x00;
1441        cmd.len = 0x02;
1442        return cx24116_cmd_execute(fe, &cmd);
1443}
1444
1445static int cx24116_tune(struct dvb_frontend *fe, bool re_tune,
1446        unsigned int mode_flags, unsigned int *delay, enum fe_status *status)
1447{
1448        /*
1449         * It is safe to discard "params" here, as the DVB core will sync
1450         * fe->dtv_property_cache with fepriv->parameters_in, where the
1451         * DVBv3 params are stored. The only practical usage for it indicate
1452         * that re-tuning is needed, e. g. (fepriv->state & FESTATE_RETUNE) is
1453         * true.
1454         */
1455
1456        *delay = HZ / 5;
1457        if (re_tune) {
1458                int ret = cx24116_set_frontend(fe);
1459                if (ret)
1460                        return ret;
1461        }
1462        return cx24116_read_status(fe, status);
1463}
1464
1465static int cx24116_get_algo(struct dvb_frontend *fe)
1466{
1467        return DVBFE_ALGO_HW;
1468}
1469
1470static const struct dvb_frontend_ops cx24116_ops = {
1471        .delsys = { SYS_DVBS, SYS_DVBS2 },
1472        .info = {
1473                .name = "Conexant CX24116/CX24118",
1474                .frequency_min = 950000,
1475                .frequency_max = 2150000,
1476                .frequency_stepsize = 1011, /* kHz for QPSK frontends */
1477                .frequency_tolerance = 5000,
1478                .symbol_rate_min = 1000000,
1479                .symbol_rate_max = 45000000,
1480                .caps = FE_CAN_INVERSION_AUTO |
1481                        FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
1482                        FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
1483                        FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
1484                        FE_CAN_2G_MODULATION |
1485                        FE_CAN_QPSK | FE_CAN_RECOVER
1486        },
1487
1488        .release = cx24116_release,
1489
1490        .init = cx24116_initfe,
1491        .sleep = cx24116_sleep,
1492        .read_status = cx24116_read_status,
1493        .read_ber = cx24116_read_ber,
1494        .read_signal_strength = cx24116_read_signal_strength,
1495        .read_snr = cx24116_read_snr,
1496        .read_ucblocks = cx24116_read_ucblocks,
1497        .set_tone = cx24116_set_tone,
1498        .set_voltage = cx24116_set_voltage,
1499        .diseqc_send_master_cmd = cx24116_send_diseqc_msg,
1500        .diseqc_send_burst = cx24116_diseqc_send_burst,
1501        .get_frontend_algo = cx24116_get_algo,
1502        .tune = cx24116_tune,
1503
1504        .set_frontend = cx24116_set_frontend,
1505};
1506
1507MODULE_DESCRIPTION("DVB Frontend module for Conexant cx24116/cx24118 hardware");
1508MODULE_AUTHOR("Steven Toth");
1509MODULE_LICENSE("GPL");
1510
1511