linux/drivers/media/dvb-frontends/dib9000.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Linux-DVB Driver for DiBcom's DiB9000 and demodulator-family.
   4 *
   5 * Copyright (C) 2005-10 DiBcom (http://www.dibcom.fr/)
   6 */
   7
   8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   9
  10#include <linux/kernel.h>
  11#include <linux/i2c.h>
  12#include <linux/mutex.h>
  13
  14#include <media/dvb_math.h>
  15#include <media/dvb_frontend.h>
  16
  17#include "dib9000.h"
  18#include "dibx000_common.h"
  19
  20static int debug;
  21module_param(debug, int, 0644);
  22MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
  23
  24#define dprintk(fmt, arg...) do {                                       \
  25        if (debug)                                                      \
  26                printk(KERN_DEBUG pr_fmt("%s: " fmt),                   \
  27                       __func__, ##arg);                                \
  28} while (0)
  29
  30#define MAX_NUMBER_OF_FRONTENDS 6
  31
  32struct i2c_device {
  33        struct i2c_adapter *i2c_adap;
  34        u8 i2c_addr;
  35        u8 *i2c_read_buffer;
  36        u8 *i2c_write_buffer;
  37};
  38
  39struct dib9000_pid_ctrl {
  40#define DIB9000_PID_FILTER_CTRL 0
  41#define DIB9000_PID_FILTER      1
  42        u8 cmd;
  43        u8 id;
  44        u16 pid;
  45        u8 onoff;
  46};
  47
  48struct dib9000_state {
  49        struct i2c_device i2c;
  50
  51        struct dibx000_i2c_master i2c_master;
  52        struct i2c_adapter tuner_adap;
  53        struct i2c_adapter component_bus;
  54
  55        u16 revision;
  56        u8 reg_offs;
  57
  58        enum frontend_tune_state tune_state;
  59        u32 status;
  60        struct dvb_frontend_parametersContext channel_status;
  61
  62        u8 fe_id;
  63
  64#define DIB9000_GPIO_DEFAULT_DIRECTIONS 0xffff
  65        u16 gpio_dir;
  66#define DIB9000_GPIO_DEFAULT_VALUES     0x0000
  67        u16 gpio_val;
  68#define DIB9000_GPIO_DEFAULT_PWM_POS    0xffff
  69        u16 gpio_pwm_pos;
  70
  71        union {                 /* common for all chips */
  72                struct {
  73                        u8 mobile_mode:1;
  74                } host;
  75
  76                struct {
  77                        struct dib9000_fe_memory_map {
  78                                u16 addr;
  79                                u16 size;
  80                        } fe_mm[18];
  81                        u8 memcmd;
  82
  83                        struct mutex mbx_if_lock;       /* to protect read/write operations */
  84                        struct mutex mbx_lock;  /* to protect the whole mailbox handling */
  85
  86                        struct mutex mem_lock;  /* to protect the memory accesses */
  87                        struct mutex mem_mbx_lock;      /* to protect the memory-based mailbox */
  88
  89#define MBX_MAX_WORDS (256 - 200 - 2)
  90#define DIB9000_MSG_CACHE_SIZE 2
  91                        u16 message_cache[DIB9000_MSG_CACHE_SIZE][MBX_MAX_WORDS];
  92                        u8 fw_is_running;
  93                } risc;
  94        } platform;
  95
  96        union {                 /* common for all platforms */
  97                struct {
  98                        struct dib9000_config cfg;
  99                } d9;
 100        } chip;
 101
 102        struct dvb_frontend *fe[MAX_NUMBER_OF_FRONTENDS];
 103        u16 component_bus_speed;
 104
 105        /* for the I2C transfer */
 106        struct i2c_msg msg[2];
 107        u8 i2c_write_buffer[255];
 108        u8 i2c_read_buffer[255];
 109        struct mutex demod_lock;
 110        u8 get_frontend_internal;
 111        struct dib9000_pid_ctrl pid_ctrl[10];
 112        s8 pid_ctrl_index; /* -1: empty list; -2: do not use the list */
 113};
 114
 115static const u32 fe_info[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 116        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 117        0, 0, 0, 0, 0, 0, 0, 0
 118};
 119
 120enum dib9000_power_mode {
 121        DIB9000_POWER_ALL = 0,
 122
 123        DIB9000_POWER_NO,
 124        DIB9000_POWER_INTERF_ANALOG_AGC,
 125        DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD,
 126        DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD,
 127        DIB9000_POWER_INTERFACE_ONLY,
 128};
 129
 130enum dib9000_out_messages {
 131        OUT_MSG_HBM_ACK,
 132        OUT_MSG_HOST_BUF_FAIL,
 133        OUT_MSG_REQ_VERSION,
 134        OUT_MSG_BRIDGE_I2C_W,
 135        OUT_MSG_BRIDGE_I2C_R,
 136        OUT_MSG_BRIDGE_APB_W,
 137        OUT_MSG_BRIDGE_APB_R,
 138        OUT_MSG_SCAN_CHANNEL,
 139        OUT_MSG_MONIT_DEMOD,
 140        OUT_MSG_CONF_GPIO,
 141        OUT_MSG_DEBUG_HELP,
 142        OUT_MSG_SUBBAND_SEL,
 143        OUT_MSG_ENABLE_TIME_SLICE,
 144        OUT_MSG_FE_FW_DL,
 145        OUT_MSG_FE_CHANNEL_SEARCH,
 146        OUT_MSG_FE_CHANNEL_TUNE,
 147        OUT_MSG_FE_SLEEP,
 148        OUT_MSG_FE_SYNC,
 149        OUT_MSG_CTL_MONIT,
 150
 151        OUT_MSG_CONF_SVC,
 152        OUT_MSG_SET_HBM,
 153        OUT_MSG_INIT_DEMOD,
 154        OUT_MSG_ENABLE_DIVERSITY,
 155        OUT_MSG_SET_OUTPUT_MODE,
 156        OUT_MSG_SET_PRIORITARY_CHANNEL,
 157        OUT_MSG_ACK_FRG,
 158        OUT_MSG_INIT_PMU,
 159};
 160
 161enum dib9000_in_messages {
 162        IN_MSG_DATA,
 163        IN_MSG_FRAME_INFO,
 164        IN_MSG_CTL_MONIT,
 165        IN_MSG_ACK_FREE_ITEM,
 166        IN_MSG_DEBUG_BUF,
 167        IN_MSG_MPE_MONITOR,
 168        IN_MSG_RAWTS_MONITOR,
 169        IN_MSG_END_BRIDGE_I2C_RW,
 170        IN_MSG_END_BRIDGE_APB_RW,
 171        IN_MSG_VERSION,
 172        IN_MSG_END_OF_SCAN,
 173        IN_MSG_MONIT_DEMOD,
 174        IN_MSG_ERROR,
 175        IN_MSG_FE_FW_DL_DONE,
 176        IN_MSG_EVENT,
 177        IN_MSG_ACK_CHANGE_SVC,
 178        IN_MSG_HBM_PROF,
 179};
 180
 181/* memory_access requests */
 182#define FE_MM_W_CHANNEL                   0
 183#define FE_MM_W_FE_INFO                   1
 184#define FE_MM_RW_SYNC                     2
 185
 186#define FE_SYNC_CHANNEL          1
 187#define FE_SYNC_W_GENERIC_MONIT  2
 188#define FE_SYNC_COMPONENT_ACCESS 3
 189
 190#define FE_MM_R_CHANNEL_SEARCH_STATE      3
 191#define FE_MM_R_CHANNEL_UNION_CONTEXT     4
 192#define FE_MM_R_FE_INFO                   5
 193#define FE_MM_R_FE_MONITOR                6
 194
 195#define FE_MM_W_CHANNEL_HEAD              7
 196#define FE_MM_W_CHANNEL_UNION             8
 197#define FE_MM_W_CHANNEL_CONTEXT           9
 198#define FE_MM_R_CHANNEL_UNION            10
 199#define FE_MM_R_CHANNEL_CONTEXT          11
 200#define FE_MM_R_CHANNEL_TUNE_STATE       12
 201
 202#define FE_MM_R_GENERIC_MONITORING_SIZE  13
 203#define FE_MM_W_GENERIC_MONITORING           14
 204#define FE_MM_R_GENERIC_MONITORING           15
 205
 206#define FE_MM_W_COMPONENT_ACCESS         16
 207#define FE_MM_RW_COMPONENT_ACCESS_BUFFER 17
 208static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len);
 209static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len);
 210
 211static u16 to_fw_output_mode(u16 mode)
 212{
 213        switch (mode) {
 214        case OUTMODE_HIGH_Z:
 215                return 0;
 216        case OUTMODE_MPEG2_PAR_GATED_CLK:
 217                return 4;
 218        case OUTMODE_MPEG2_PAR_CONT_CLK:
 219                return 8;
 220        case OUTMODE_MPEG2_SERIAL:
 221                return 16;
 222        case OUTMODE_DIVERSITY:
 223                return 128;
 224        case OUTMODE_MPEG2_FIFO:
 225                return 2;
 226        case OUTMODE_ANALOG_ADC:
 227                return 1;
 228        default:
 229                return 0;
 230        }
 231}
 232
 233static int dib9000_read16_attr(struct dib9000_state *state, u16 reg, u8 *b, u32 len, u16 attribute)
 234{
 235        u32 chunk_size = 126;
 236        u32 l;
 237        int ret;
 238
 239        if (state->platform.risc.fw_is_running && (reg < 1024))
 240                return dib9000_risc_apb_access_read(state, reg, attribute, NULL, 0, b, len);
 241
 242        memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
 243        state->msg[0].addr = state->i2c.i2c_addr >> 1;
 244        state->msg[0].flags = 0;
 245        state->msg[0].buf = state->i2c_write_buffer;
 246        state->msg[0].len = 2;
 247        state->msg[1].addr = state->i2c.i2c_addr >> 1;
 248        state->msg[1].flags = I2C_M_RD;
 249        state->msg[1].buf = b;
 250        state->msg[1].len = len;
 251
 252        state->i2c_write_buffer[0] = reg >> 8;
 253        state->i2c_write_buffer[1] = reg & 0xff;
 254
 255        if (attribute & DATA_BUS_ACCESS_MODE_8BIT)
 256                state->i2c_write_buffer[0] |= (1 << 5);
 257        if (attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
 258                state->i2c_write_buffer[0] |= (1 << 4);
 259
 260        do {
 261                l = len < chunk_size ? len : chunk_size;
 262                state->msg[1].len = l;
 263                state->msg[1].buf = b;
 264                ret = i2c_transfer(state->i2c.i2c_adap, state->msg, 2) != 2 ? -EREMOTEIO : 0;
 265                if (ret != 0) {
 266                        dprintk("i2c read error on %d\n", reg);
 267                        return -EREMOTEIO;
 268                }
 269
 270                b += l;
 271                len -= l;
 272
 273                if (!(attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT))
 274                        reg += l / 2;
 275        } while ((ret == 0) && len);
 276
 277        return 0;
 278}
 279
 280static u16 dib9000_i2c_read16(struct i2c_device *i2c, u16 reg)
 281{
 282        struct i2c_msg msg[2] = {
 283                {.addr = i2c->i2c_addr >> 1, .flags = 0,
 284                        .buf = i2c->i2c_write_buffer, .len = 2},
 285                {.addr = i2c->i2c_addr >> 1, .flags = I2C_M_RD,
 286                        .buf = i2c->i2c_read_buffer, .len = 2},
 287        };
 288
 289        i2c->i2c_write_buffer[0] = reg >> 8;
 290        i2c->i2c_write_buffer[1] = reg & 0xff;
 291
 292        if (i2c_transfer(i2c->i2c_adap, msg, 2) != 2) {
 293                dprintk("read register %x error\n", reg);
 294                return 0;
 295        }
 296
 297        return (i2c->i2c_read_buffer[0] << 8) | i2c->i2c_read_buffer[1];
 298}
 299
 300static inline u16 dib9000_read_word(struct dib9000_state *state, u16 reg)
 301{
 302        if (dib9000_read16_attr(state, reg, state->i2c_read_buffer, 2, 0) != 0)
 303                return 0;
 304        return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
 305}
 306
 307static inline u16 dib9000_read_word_attr(struct dib9000_state *state, u16 reg, u16 attribute)
 308{
 309        if (dib9000_read16_attr(state, reg, state->i2c_read_buffer, 2,
 310                                attribute) != 0)
 311                return 0;
 312        return (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
 313}
 314
 315#define dib9000_read16_noinc_attr(state, reg, b, len, attribute) dib9000_read16_attr(state, reg, b, len, (attribute) | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
 316
 317static int dib9000_write16_attr(struct dib9000_state *state, u16 reg, const u8 *buf, u32 len, u16 attribute)
 318{
 319        u32 chunk_size = 126;
 320        u32 l;
 321        int ret;
 322
 323        if (state->platform.risc.fw_is_running && (reg < 1024)) {
 324                if (dib9000_risc_apb_access_write
 325                    (state, reg, DATA_BUS_ACCESS_MODE_16BIT | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT | attribute, buf, len) != 0)
 326                        return -EINVAL;
 327                return 0;
 328        }
 329
 330        memset(&state->msg[0], 0, sizeof(struct i2c_msg));
 331        state->msg[0].addr = state->i2c.i2c_addr >> 1;
 332        state->msg[0].flags = 0;
 333        state->msg[0].buf = state->i2c_write_buffer;
 334        state->msg[0].len = len + 2;
 335
 336        state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
 337        state->i2c_write_buffer[1] = (reg) & 0xff;
 338
 339        if (attribute & DATA_BUS_ACCESS_MODE_8BIT)
 340                state->i2c_write_buffer[0] |= (1 << 5);
 341        if (attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
 342                state->i2c_write_buffer[0] |= (1 << 4);
 343
 344        do {
 345                l = len < chunk_size ? len : chunk_size;
 346                state->msg[0].len = l + 2;
 347                memcpy(&state->i2c_write_buffer[2], buf, l);
 348
 349                ret = i2c_transfer(state->i2c.i2c_adap, state->msg, 1) != 1 ? -EREMOTEIO : 0;
 350
 351                buf += l;
 352                len -= l;
 353
 354                if (!(attribute & DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT))
 355                        reg += l / 2;
 356        } while ((ret == 0) && len);
 357
 358        return ret;
 359}
 360
 361static int dib9000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
 362{
 363        struct i2c_msg msg = {
 364                .addr = i2c->i2c_addr >> 1, .flags = 0,
 365                .buf = i2c->i2c_write_buffer, .len = 4
 366        };
 367
 368        i2c->i2c_write_buffer[0] = (reg >> 8) & 0xff;
 369        i2c->i2c_write_buffer[1] = reg & 0xff;
 370        i2c->i2c_write_buffer[2] = (val >> 8) & 0xff;
 371        i2c->i2c_write_buffer[3] = val & 0xff;
 372
 373        return i2c_transfer(i2c->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
 374}
 375
 376static inline int dib9000_write_word(struct dib9000_state *state, u16 reg, u16 val)
 377{
 378        u8 b[2] = { val >> 8, val & 0xff };
 379        return dib9000_write16_attr(state, reg, b, 2, 0);
 380}
 381
 382static inline int dib9000_write_word_attr(struct dib9000_state *state, u16 reg, u16 val, u16 attribute)
 383{
 384        u8 b[2] = { val >> 8, val & 0xff };
 385        return dib9000_write16_attr(state, reg, b, 2, attribute);
 386}
 387
 388#define dib9000_write(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, 0)
 389#define dib9000_write16_noinc(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
 390#define dib9000_write16_noinc_attr(state, reg, buf, len, attribute) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT | (attribute))
 391
 392#define dib9000_mbx_send(state, id, data, len) dib9000_mbx_send_attr(state, id, data, len, 0)
 393#define dib9000_mbx_get_message(state, id, msg, len) dib9000_mbx_get_message_attr(state, id, msg, len, 0)
 394
 395#define MAC_IRQ      (1 << 1)
 396#define IRQ_POL_MSK  (1 << 4)
 397
 398#define dib9000_risc_mem_read_chunks(state, b, len) dib9000_read16_attr(state, 1063, b, len, DATA_BUS_ACCESS_MODE_8BIT | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
 399#define dib9000_risc_mem_write_chunks(state, buf, len) dib9000_write16_attr(state, 1063, buf, len, DATA_BUS_ACCESS_MODE_8BIT | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
 400
 401static void dib9000_risc_mem_setup_cmd(struct dib9000_state *state, u32 addr, u32 len, u8 reading)
 402{
 403        u8 b[14] = { 0 };
 404
 405/*      dprintk("%d memcmd: %d %d %d\n", state->fe_id, addr, addr+len, len); */
 406/*      b[0] = 0 << 7; */
 407        b[1] = 1;
 408
 409/*      b[2] = 0; */
 410/*      b[3] = 0; */
 411        b[4] = (u8) (addr >> 8);
 412        b[5] = (u8) (addr & 0xff);
 413
 414/*      b[10] = 0; */
 415/*      b[11] = 0; */
 416        b[12] = (u8) (addr >> 8);
 417        b[13] = (u8) (addr & 0xff);
 418
 419        addr += len;
 420/*      b[6] = 0; */
 421/*      b[7] = 0; */
 422        b[8] = (u8) (addr >> 8);
 423        b[9] = (u8) (addr & 0xff);
 424
 425        dib9000_write(state, 1056, b, 14);
 426        if (reading)
 427                dib9000_write_word(state, 1056, (1 << 15) | 1);
 428        state->platform.risc.memcmd = -1;       /* if it was called directly reset it - to force a future setup-call to set it */
 429}
 430
 431static void dib9000_risc_mem_setup(struct dib9000_state *state, u8 cmd)
 432{
 433        struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[cmd & 0x7f];
 434        /* decide whether we need to "refresh" the memory controller */
 435        if (state->platform.risc.memcmd == cmd &&       /* same command */
 436            !(cmd & 0x80 && m->size < 67))      /* and we do not want to read something with less than 67 bytes looping - working around a bug in the memory controller */
 437                return;
 438        dib9000_risc_mem_setup_cmd(state, m->addr, m->size, cmd & 0x80);
 439        state->platform.risc.memcmd = cmd;
 440}
 441
 442static int dib9000_risc_mem_read(struct dib9000_state *state, u8 cmd, u8 * b, u16 len)
 443{
 444        if (!state->platform.risc.fw_is_running)
 445                return -EIO;
 446
 447        if (mutex_lock_interruptible(&state->platform.risc.mem_lock) < 0) {
 448                dprintk("could not get the lock\n");
 449                return -EINTR;
 450        }
 451        dib9000_risc_mem_setup(state, cmd | 0x80);
 452        dib9000_risc_mem_read_chunks(state, b, len);
 453        mutex_unlock(&state->platform.risc.mem_lock);
 454        return 0;
 455}
 456
 457static int dib9000_risc_mem_write(struct dib9000_state *state, u8 cmd, const u8 * b)
 458{
 459        struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[cmd];
 460        if (!state->platform.risc.fw_is_running)
 461                return -EIO;
 462
 463        if (mutex_lock_interruptible(&state->platform.risc.mem_lock) < 0) {
 464                dprintk("could not get the lock\n");
 465                return -EINTR;
 466        }
 467        dib9000_risc_mem_setup(state, cmd);
 468        dib9000_risc_mem_write_chunks(state, b, m->size);
 469        mutex_unlock(&state->platform.risc.mem_lock);
 470        return 0;
 471}
 472
 473static int dib9000_firmware_download(struct dib9000_state *state, u8 risc_id, u16 key, const u8 * code, u32 len)
 474{
 475        u16 offs;
 476
 477        if (risc_id == 1)
 478                offs = 16;
 479        else
 480                offs = 0;
 481
 482        /* config crtl reg */
 483        dib9000_write_word(state, 1024 + offs, 0x000f);
 484        dib9000_write_word(state, 1025 + offs, 0);
 485        dib9000_write_word(state, 1031 + offs, key);
 486
 487        dprintk("going to download %dB of microcode\n", len);
 488        if (dib9000_write16_noinc(state, 1026 + offs, (u8 *) code, (u16) len) != 0) {
 489                dprintk("error while downloading microcode for RISC %c\n", 'A' + risc_id);
 490                return -EIO;
 491        }
 492
 493        dprintk("Microcode for RISC %c loaded\n", 'A' + risc_id);
 494
 495        return 0;
 496}
 497
 498static int dib9000_mbx_host_init(struct dib9000_state *state, u8 risc_id)
 499{
 500        u16 mbox_offs;
 501        u16 reset_reg;
 502        u16 tries = 1000;
 503
 504        if (risc_id == 1)
 505                mbox_offs = 16;
 506        else
 507                mbox_offs = 0;
 508
 509        /* Reset mailbox  */
 510        dib9000_write_word(state, 1027 + mbox_offs, 0x8000);
 511
 512        /* Read reset status */
 513        do {
 514                reset_reg = dib9000_read_word(state, 1027 + mbox_offs);
 515                msleep(100);
 516        } while ((reset_reg & 0x8000) && --tries);
 517
 518        if (reset_reg & 0x8000) {
 519                dprintk("MBX: init ERROR, no response from RISC %c\n", 'A' + risc_id);
 520                return -EIO;
 521        }
 522        dprintk("MBX: initialized\n");
 523        return 0;
 524}
 525
 526#define MAX_MAILBOX_TRY 100
 527static int dib9000_mbx_send_attr(struct dib9000_state *state, u8 id, u16 * data, u8 len, u16 attr)
 528{
 529        u8 *d, b[2];
 530        u16 tmp;
 531        u16 size;
 532        u32 i;
 533        int ret = 0;
 534
 535        if (!state->platform.risc.fw_is_running)
 536                return -EINVAL;
 537
 538        if (mutex_lock_interruptible(&state->platform.risc.mbx_if_lock) < 0) {
 539                dprintk("could not get the lock\n");
 540                return -EINTR;
 541        }
 542        tmp = MAX_MAILBOX_TRY;
 543        do {
 544                size = dib9000_read_word_attr(state, 1043, attr) & 0xff;
 545                if ((size + len + 1) > MBX_MAX_WORDS && --tmp) {
 546                        dprintk("MBX: RISC mbx full, retrying\n");
 547                        msleep(100);
 548                } else
 549                        break;
 550        } while (1);
 551
 552        /*dprintk( "MBX: size: %d\n", size); */
 553
 554        if (tmp == 0) {
 555                ret = -EINVAL;
 556                goto out;
 557        }
 558#ifdef DUMP_MSG
 559        dprintk("--> %02x %d %*ph\n", id, len + 1, len, data);
 560#endif
 561
 562        /* byte-order conversion - works on big (where it is not necessary) or little endian */
 563        d = (u8 *) data;
 564        for (i = 0; i < len; i++) {
 565                tmp = data[i];
 566                *d++ = tmp >> 8;
 567                *d++ = tmp & 0xff;
 568        }
 569
 570        /* write msg */
 571        b[0] = id;
 572        b[1] = len + 1;
 573        if (dib9000_write16_noinc_attr(state, 1045, b, 2, attr) != 0 || dib9000_write16_noinc_attr(state, 1045, (u8 *) data, len * 2, attr) != 0) {
 574                ret = -EIO;
 575                goto out;
 576        }
 577
 578        /* update register nb_mes_in_RX */
 579        ret = (u8) dib9000_write_word_attr(state, 1043, 1 << 14, attr);
 580
 581out:
 582        mutex_unlock(&state->platform.risc.mbx_if_lock);
 583
 584        return ret;
 585}
 586
 587static u8 dib9000_mbx_read(struct dib9000_state *state, u16 * data, u8 risc_id, u16 attr)
 588{
 589#ifdef DUMP_MSG
 590        u16 *d = data;
 591#endif
 592
 593        u16 tmp, i;
 594        u8 size;
 595        u8 mc_base;
 596
 597        if (!state->platform.risc.fw_is_running)
 598                return 0;
 599
 600        if (mutex_lock_interruptible(&state->platform.risc.mbx_if_lock) < 0) {
 601                dprintk("could not get the lock\n");
 602                return 0;
 603        }
 604        if (risc_id == 1)
 605                mc_base = 16;
 606        else
 607                mc_base = 0;
 608
 609        /* Length and type in the first word */
 610        *data = dib9000_read_word_attr(state, 1029 + mc_base, attr);
 611
 612        size = *data & 0xff;
 613        if (size <= MBX_MAX_WORDS) {
 614                data++;
 615                size--;         /* Initial word already read */
 616
 617                dib9000_read16_noinc_attr(state, 1029 + mc_base, (u8 *) data, size * 2, attr);
 618
 619                /* to word conversion */
 620                for (i = 0; i < size; i++) {
 621                        tmp = *data;
 622                        *data = (tmp >> 8) | (tmp << 8);
 623                        data++;
 624                }
 625
 626#ifdef DUMP_MSG
 627                dprintk("<--\n");
 628                for (i = 0; i < size + 1; i++)
 629                        dprintk("%04x\n", d[i]);
 630                dprintk("\n");
 631#endif
 632        } else {
 633                dprintk("MBX: message is too big for message cache (%d), flushing message\n", size);
 634                size--;         /* Initial word already read */
 635                while (size--)
 636                        dib9000_read16_noinc_attr(state, 1029 + mc_base, (u8 *) data, 2, attr);
 637        }
 638        /* Update register nb_mes_in_TX */
 639        dib9000_write_word_attr(state, 1028 + mc_base, 1 << 14, attr);
 640
 641        mutex_unlock(&state->platform.risc.mbx_if_lock);
 642
 643        return size + 1;
 644}
 645
 646static int dib9000_risc_debug_buf(struct dib9000_state *state, u16 * data, u8 size)
 647{
 648        u32 ts = data[1] << 16 | data[0];
 649        char *b = (char *)&data[2];
 650
 651        b[2 * (size - 2) - 1] = '\0';   /* Bullet proof the buffer */
 652        if (*b == '~') {
 653                b++;
 654                dprintk("%s\n", b);
 655        } else
 656                dprintk("RISC%d: %d.%04d %s\n",
 657                        state->fe_id,
 658                        ts / 10000, ts % 10000, *b ? b : "<empty>");
 659        return 1;
 660}
 661
 662static int dib9000_mbx_fetch_to_cache(struct dib9000_state *state, u16 attr)
 663{
 664        int i;
 665        u8 size;
 666        u16 *block;
 667        /* find a free slot */
 668        for (i = 0; i < DIB9000_MSG_CACHE_SIZE; i++) {
 669                block = state->platform.risc.message_cache[i];
 670                if (*block == 0) {
 671                        size = dib9000_mbx_read(state, block, 1, attr);
 672
 673/*                      dprintk( "MBX: fetched %04x message to cache\n", *block); */
 674
 675                        switch (*block >> 8) {
 676                        case IN_MSG_DEBUG_BUF:
 677                                dib9000_risc_debug_buf(state, block + 1, size); /* debug-messages are going to be printed right away */
 678                                *block = 0;     /* free the block */
 679                                break;
 680#if 0
 681                        case IN_MSG_DATA:       /* FE-TRACE */
 682                                dib9000_risc_data_process(state, block + 1, size);
 683                                *block = 0;
 684                                break;
 685#endif
 686                        default:
 687                                break;
 688                        }
 689
 690                        return 1;
 691                }
 692        }
 693        dprintk("MBX: no free cache-slot found for new message...\n");
 694        return -1;
 695}
 696
 697static u8 dib9000_mbx_count(struct dib9000_state *state, u8 risc_id, u16 attr)
 698{
 699        if (risc_id == 0)
 700                return (u8) (dib9000_read_word_attr(state, 1028, attr) >> 10) & 0x1f;   /* 5 bit field */
 701        else
 702                return (u8) (dib9000_read_word_attr(state, 1044, attr) >> 8) & 0x7f;    /* 7 bit field */
 703}
 704
 705static int dib9000_mbx_process(struct dib9000_state *state, u16 attr)
 706{
 707        int ret = 0;
 708
 709        if (!state->platform.risc.fw_is_running)
 710                return -1;
 711
 712        if (mutex_lock_interruptible(&state->platform.risc.mbx_lock) < 0) {
 713                dprintk("could not get the lock\n");
 714                return -1;
 715        }
 716
 717        if (dib9000_mbx_count(state, 1, attr))  /* 1=RiscB */
 718                ret = dib9000_mbx_fetch_to_cache(state, attr);
 719
 720        dib9000_read_word_attr(state, 1229, attr);      /* Clear the IRQ */
 721/*      if (tmp) */
 722/*              dprintk( "cleared IRQ: %x\n", tmp); */
 723        mutex_unlock(&state->platform.risc.mbx_lock);
 724
 725        return ret;
 726}
 727
 728static int dib9000_mbx_get_message_attr(struct dib9000_state *state, u16 id, u16 * msg, u8 * size, u16 attr)
 729{
 730        u8 i;
 731        u16 *block;
 732        u16 timeout = 30;
 733
 734        *msg = 0;
 735        do {
 736                /* dib9000_mbx_get_from_cache(); */
 737                for (i = 0; i < DIB9000_MSG_CACHE_SIZE; i++) {
 738                        block = state->platform.risc.message_cache[i];
 739                        if ((*block >> 8) == id) {
 740                                *size = (*block & 0xff) - 1;
 741                                memcpy(msg, block + 1, (*size) * 2);
 742                                *block = 0;     /* free the block */
 743                                i = 0;  /* signal that we found a message */
 744                                break;
 745                        }
 746                }
 747
 748                if (i == 0)
 749                        break;
 750
 751                if (dib9000_mbx_process(state, attr) == -1)     /* try to fetch one message - if any */
 752                        return -1;
 753
 754        } while (--timeout);
 755
 756        if (timeout == 0) {
 757                dprintk("waiting for message %d timed out\n", id);
 758                return -1;
 759        }
 760
 761        return i == 0;
 762}
 763
 764static int dib9000_risc_check_version(struct dib9000_state *state)
 765{
 766        u8 r[4];
 767        u8 size;
 768        u16 fw_version = 0;
 769
 770        if (dib9000_mbx_send(state, OUT_MSG_REQ_VERSION, &fw_version, 1) != 0)
 771                return -EIO;
 772
 773        if (dib9000_mbx_get_message(state, IN_MSG_VERSION, (u16 *) r, &size) < 0)
 774                return -EIO;
 775
 776        fw_version = (r[0] << 8) | r[1];
 777        dprintk("RISC: ver: %d.%02d (IC: %d)\n", fw_version >> 10, fw_version & 0x3ff, (r[2] << 8) | r[3]);
 778
 779        if ((fw_version >> 10) != 7)
 780                return -EINVAL;
 781
 782        switch (fw_version & 0x3ff) {
 783        case 11:
 784        case 12:
 785        case 14:
 786        case 15:
 787        case 16:
 788        case 17:
 789                break;
 790        default:
 791                dprintk("RISC: invalid firmware version");
 792                return -EINVAL;
 793        }
 794
 795        dprintk("RISC: valid firmware version");
 796        return 0;
 797}
 798
 799static int dib9000_fw_boot(struct dib9000_state *state, const u8 * codeA, u32 lenA, const u8 * codeB, u32 lenB)
 800{
 801        /* Reconfig pool mac ram */
 802        dib9000_write_word(state, 1225, 0x02);  /* A: 8k C, 4 k D - B: 32k C 6 k D - IRAM 96k */
 803        dib9000_write_word(state, 1226, 0x05);
 804
 805        /* Toggles IP crypto to Host APB interface. */
 806        dib9000_write_word(state, 1542, 1);
 807
 808        /* Set jump and no jump in the dma box */
 809        dib9000_write_word(state, 1074, 0);
 810        dib9000_write_word(state, 1075, 0);
 811
 812        /* Set MAC as APB Master. */
 813        dib9000_write_word(state, 1237, 0);
 814
 815        /* Reset the RISCs */
 816        if (codeA != NULL)
 817                dib9000_write_word(state, 1024, 2);
 818        else
 819                dib9000_write_word(state, 1024, 15);
 820        if (codeB != NULL)
 821                dib9000_write_word(state, 1040, 2);
 822
 823        if (codeA != NULL)
 824                dib9000_firmware_download(state, 0, 0x1234, codeA, lenA);
 825        if (codeB != NULL)
 826                dib9000_firmware_download(state, 1, 0x1234, codeB, lenB);
 827
 828        /* Run the RISCs */
 829        if (codeA != NULL)
 830                dib9000_write_word(state, 1024, 0);
 831        if (codeB != NULL)
 832                dib9000_write_word(state, 1040, 0);
 833
 834        if (codeA != NULL)
 835                if (dib9000_mbx_host_init(state, 0) != 0)
 836                        return -EIO;
 837        if (codeB != NULL)
 838                if (dib9000_mbx_host_init(state, 1) != 0)
 839                        return -EIO;
 840
 841        msleep(100);
 842        state->platform.risc.fw_is_running = 1;
 843
 844        if (dib9000_risc_check_version(state) != 0)
 845                return -EINVAL;
 846
 847        state->platform.risc.memcmd = 0xff;
 848        return 0;
 849}
 850
 851static u16 dib9000_identify(struct i2c_device *client)
 852{
 853        u16 value;
 854
 855        value = dib9000_i2c_read16(client, 896);
 856        if (value != 0x01b3) {
 857                dprintk("wrong Vendor ID (0x%x)\n", value);
 858                return 0;
 859        }
 860
 861        value = dib9000_i2c_read16(client, 897);
 862        if (value != 0x4000 && value != 0x4001 && value != 0x4002 && value != 0x4003 && value != 0x4004 && value != 0x4005) {
 863                dprintk("wrong Device ID (0x%x)\n", value);
 864                return 0;
 865        }
 866
 867        /* protect this driver to be used with 7000PC */
 868        if (value == 0x4000 && dib9000_i2c_read16(client, 769) == 0x4000) {
 869                dprintk("this driver does not work with DiB7000PC\n");
 870                return 0;
 871        }
 872
 873        switch (value) {
 874        case 0x4000:
 875                dprintk("found DiB7000MA/PA/MB/PB\n");
 876                break;
 877        case 0x4001:
 878                dprintk("found DiB7000HC\n");
 879                break;
 880        case 0x4002:
 881                dprintk("found DiB7000MC\n");
 882                break;
 883        case 0x4003:
 884                dprintk("found DiB9000A\n");
 885                break;
 886        case 0x4004:
 887                dprintk("found DiB9000H\n");
 888                break;
 889        case 0x4005:
 890                dprintk("found DiB9000M\n");
 891                break;
 892        }
 893
 894        return value;
 895}
 896
 897static void dib9000_set_power_mode(struct dib9000_state *state, enum dib9000_power_mode mode)
 898{
 899        /* by default everything is going to be powered off */
 900        u16 reg_903 = 0x3fff, reg_904 = 0xffff, reg_905 = 0xffff, reg_906;
 901        u8 offset;
 902
 903        if (state->revision == 0x4003 || state->revision == 0x4004 || state->revision == 0x4005)
 904                offset = 1;
 905        else
 906                offset = 0;
 907
 908        reg_906 = dib9000_read_word(state, 906 + offset) | 0x3; /* keep settings for RISC */
 909
 910        /* now, depending on the requested mode, we power on */
 911        switch (mode) {
 912                /* power up everything in the demod */
 913        case DIB9000_POWER_ALL:
 914                reg_903 = 0x0000;
 915                reg_904 = 0x0000;
 916                reg_905 = 0x0000;
 917                reg_906 = 0x0000;
 918                break;
 919
 920                /* just leave power on the control-interfaces: GPIO and (I2C or SDIO or SRAM) */
 921        case DIB9000_POWER_INTERFACE_ONLY:      /* TODO power up either SDIO or I2C or SRAM */
 922                reg_905 &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 2));
 923                break;
 924
 925        case DIB9000_POWER_INTERF_ANALOG_AGC:
 926                reg_903 &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10));
 927                reg_905 &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 2));
 928                reg_906 &= ~((1 << 0));
 929                break;
 930
 931        case DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD:
 932                reg_903 = 0x0000;
 933                reg_904 = 0x801f;
 934                reg_905 = 0x0000;
 935                reg_906 &= ~((1 << 0));
 936                break;
 937
 938        case DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD:
 939                reg_903 = 0x0000;
 940                reg_904 = 0x8000;
 941                reg_905 = 0x010b;
 942                reg_906 &= ~((1 << 0));
 943                break;
 944        default:
 945        case DIB9000_POWER_NO:
 946                break;
 947        }
 948
 949        /* always power down unused parts */
 950        if (!state->platform.host.mobile_mode)
 951                reg_904 |= (1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) | (1 << 1);
 952
 953        /* P_sdio_select_clk = 0 on MC and after */
 954        if (state->revision != 0x4000)
 955                reg_906 <<= 1;
 956
 957        dib9000_write_word(state, 903 + offset, reg_903);
 958        dib9000_write_word(state, 904 + offset, reg_904);
 959        dib9000_write_word(state, 905 + offset, reg_905);
 960        dib9000_write_word(state, 906 + offset, reg_906);
 961}
 962
 963static int dib9000_fw_reset(struct dvb_frontend *fe)
 964{
 965        struct dib9000_state *state = fe->demodulator_priv;
 966
 967        dib9000_write_word(state, 1817, 0x0003);
 968
 969        dib9000_write_word(state, 1227, 1);
 970        dib9000_write_word(state, 1227, 0);
 971
 972        switch ((state->revision = dib9000_identify(&state->i2c))) {
 973        case 0x4003:
 974        case 0x4004:
 975        case 0x4005:
 976                state->reg_offs = 1;
 977                break;
 978        default:
 979                return -EINVAL;
 980        }
 981
 982        /* reset the i2c-master to use the host interface */
 983        dibx000_reset_i2c_master(&state->i2c_master);
 984
 985        dib9000_set_power_mode(state, DIB9000_POWER_ALL);
 986
 987        /* unforce divstr regardless whether i2c enumeration was done or not */
 988        dib9000_write_word(state, 1794, dib9000_read_word(state, 1794) & ~(1 << 1));
 989        dib9000_write_word(state, 1796, 0);
 990        dib9000_write_word(state, 1805, 0x805);
 991
 992        /* restart all parts */
 993        dib9000_write_word(state, 898, 0xffff);
 994        dib9000_write_word(state, 899, 0xffff);
 995        dib9000_write_word(state, 900, 0x0001);
 996        dib9000_write_word(state, 901, 0xff19);
 997        dib9000_write_word(state, 902, 0x003c);
 998
 999        dib9000_write_word(state, 898, 0);
1000        dib9000_write_word(state, 899, 0);
1001        dib9000_write_word(state, 900, 0);
1002        dib9000_write_word(state, 901, 0);
1003        dib9000_write_word(state, 902, 0);
1004
1005        dib9000_write_word(state, 911, state->chip.d9.cfg.if_drives);
1006
1007        dib9000_set_power_mode(state, DIB9000_POWER_INTERFACE_ONLY);
1008
1009        return 0;
1010}
1011
1012static int dib9000_risc_apb_access_read(struct dib9000_state *state, u32 address, u16 attribute, const u8 * tx, u32 txlen, u8 * b, u32 len)
1013{
1014        u16 mb[10];
1015        u8 i, s;
1016
1017        if (address >= 1024 || !state->platform.risc.fw_is_running)
1018                return -EINVAL;
1019
1020        /* dprintk( "APB access through rd fw %d %x\n", address, attribute); */
1021
1022        mb[0] = (u16) address;
1023        mb[1] = len / 2;
1024        dib9000_mbx_send_attr(state, OUT_MSG_BRIDGE_APB_R, mb, 2, attribute);
1025        switch (dib9000_mbx_get_message_attr(state, IN_MSG_END_BRIDGE_APB_RW, mb, &s, attribute)) {
1026        case 1:
1027                s--;
1028                for (i = 0; i < s; i++) {
1029                        b[i * 2] = (mb[i + 1] >> 8) & 0xff;
1030                        b[i * 2 + 1] = (mb[i + 1]) & 0xff;
1031                }
1032                return 0;
1033        default:
1034                return -EIO;
1035        }
1036        return -EIO;
1037}
1038
1039static int dib9000_risc_apb_access_write(struct dib9000_state *state, u32 address, u16 attribute, const u8 * b, u32 len)
1040{
1041        u16 mb[10];
1042        u8 s, i;
1043
1044        if (address >= 1024 || !state->platform.risc.fw_is_running)
1045                return -EINVAL;
1046
1047        if (len > 18)
1048                return -EINVAL;
1049
1050        /* dprintk( "APB access through wr fw %d %x\n", address, attribute); */
1051
1052        mb[0] = (u16)address;
1053        for (i = 0; i + 1 < len; i += 2)
1054                mb[1 + i / 2] = b[i] << 8 | b[i + 1];
1055        if (len & 1)
1056                mb[1 + len / 2] = b[len - 1] << 8;
1057
1058        dib9000_mbx_send_attr(state, OUT_MSG_BRIDGE_APB_W, mb, (3 + len) / 2, attribute);
1059        return dib9000_mbx_get_message_attr(state, IN_MSG_END_BRIDGE_APB_RW, mb, &s, attribute) == 1 ? 0 : -EINVAL;
1060}
1061
1062static int dib9000_fw_memmbx_sync(struct dib9000_state *state, u8 i)
1063{
1064        u8 index_loop = 10;
1065
1066        if (!state->platform.risc.fw_is_running)
1067                return 0;
1068        dib9000_risc_mem_write(state, FE_MM_RW_SYNC, &i);
1069        do {
1070                dib9000_risc_mem_read(state, FE_MM_RW_SYNC, state->i2c_read_buffer, 1);
1071        } while (state->i2c_read_buffer[0] && index_loop--);
1072
1073        if (index_loop > 0)
1074                return 0;
1075        return -EIO;
1076}
1077
1078static int dib9000_fw_init(struct dib9000_state *state)
1079{
1080        struct dibGPIOFunction *f;
1081        u16 b[40] = { 0 };
1082        u8 i;
1083        u8 size;
1084
1085        if (dib9000_fw_boot(state, NULL, 0, state->chip.d9.cfg.microcode_B_fe_buffer, state->chip.d9.cfg.microcode_B_fe_size) != 0)
1086                return -EIO;
1087
1088        /* initialize the firmware */
1089        for (i = 0; i < ARRAY_SIZE(state->chip.d9.cfg.gpio_function); i++) {
1090                f = &state->chip.d9.cfg.gpio_function[i];
1091                if (f->mask) {
1092                        switch (f->function) {
1093                        case BOARD_GPIO_FUNCTION_COMPONENT_ON:
1094                                b[0] = (u16) f->mask;
1095                                b[1] = (u16) f->direction;
1096                                b[2] = (u16) f->value;
1097                                break;
1098                        case BOARD_GPIO_FUNCTION_COMPONENT_OFF:
1099                                b[3] = (u16) f->mask;
1100                                b[4] = (u16) f->direction;
1101                                b[5] = (u16) f->value;
1102                                break;
1103                        }
1104                }
1105        }
1106        if (dib9000_mbx_send(state, OUT_MSG_CONF_GPIO, b, 15) != 0)
1107                return -EIO;
1108
1109        /* subband */
1110        b[0] = state->chip.d9.cfg.subband.size; /* type == 0 -> GPIO - PWM not yet supported */
1111        for (i = 0; i < state->chip.d9.cfg.subband.size; i++) {
1112                b[1 + i * 4] = state->chip.d9.cfg.subband.subband[i].f_mhz;
1113                b[2 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.mask;
1114                b[3 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.direction;
1115                b[4 + i * 4] = (u16) state->chip.d9.cfg.subband.subband[i].gpio.value;
1116        }
1117        b[1 + i * 4] = 0;       /* fe_id */
1118        if (dib9000_mbx_send(state, OUT_MSG_SUBBAND_SEL, b, 2 + 4 * i) != 0)
1119                return -EIO;
1120
1121        /* 0 - id, 1 - no_of_frontends */
1122        b[0] = (0 << 8) | 1;
1123        /* 0 = i2c-address demod, 0 = tuner */
1124        b[1] = (0 << 8) | (0);
1125        b[2] = (u16) (((state->chip.d9.cfg.xtal_clock_khz * 1000) >> 16) & 0xffff);
1126        b[3] = (u16) (((state->chip.d9.cfg.xtal_clock_khz * 1000)) & 0xffff);
1127        b[4] = (u16) ((state->chip.d9.cfg.vcxo_timer >> 16) & 0xffff);
1128        b[5] = (u16) ((state->chip.d9.cfg.vcxo_timer) & 0xffff);
1129        b[6] = (u16) ((state->chip.d9.cfg.timing_frequency >> 16) & 0xffff);
1130        b[7] = (u16) ((state->chip.d9.cfg.timing_frequency) & 0xffff);
1131        b[29] = state->chip.d9.cfg.if_drives;
1132        if (dib9000_mbx_send(state, OUT_MSG_INIT_DEMOD, b, ARRAY_SIZE(b)) != 0)
1133                return -EIO;
1134
1135        if (dib9000_mbx_send(state, OUT_MSG_FE_FW_DL, NULL, 0) != 0)
1136                return -EIO;
1137
1138        if (dib9000_mbx_get_message(state, IN_MSG_FE_FW_DL_DONE, b, &size) < 0)
1139                return -EIO;
1140
1141        if (size > ARRAY_SIZE(b)) {
1142                dprintk("error : firmware returned %dbytes needed but the used buffer has only %dbytes\n Firmware init ABORTED", size,
1143                        (int)ARRAY_SIZE(b));
1144                return -EINVAL;
1145        }
1146
1147        for (i = 0; i < size; i += 2) {
1148                state->platform.risc.fe_mm[i / 2].addr = b[i + 0];
1149                state->platform.risc.fe_mm[i / 2].size = b[i + 1];
1150        }
1151
1152        return 0;
1153}
1154
1155static void dib9000_fw_set_channel_head(struct dib9000_state *state)
1156{
1157        u8 b[9];
1158        u32 freq = state->fe[0]->dtv_property_cache.frequency / 1000;
1159        if (state->fe_id % 2)
1160                freq += 101;
1161
1162        b[0] = (u8) ((freq >> 0) & 0xff);
1163        b[1] = (u8) ((freq >> 8) & 0xff);
1164        b[2] = (u8) ((freq >> 16) & 0xff);
1165        b[3] = (u8) ((freq >> 24) & 0xff);
1166        b[4] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 0) & 0xff);
1167        b[5] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 8) & 0xff);
1168        b[6] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 16) & 0xff);
1169        b[7] = (u8) ((state->fe[0]->dtv_property_cache.bandwidth_hz / 1000 >> 24) & 0xff);
1170        b[8] = 0x80;            /* do not wait for CELL ID when doing autosearch */
1171        if (state->fe[0]->dtv_property_cache.delivery_system == SYS_DVBT)
1172                b[8] |= 1;
1173        dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_HEAD, b);
1174}
1175
1176static int dib9000_fw_get_channel(struct dvb_frontend *fe)
1177{
1178        struct dib9000_state *state = fe->demodulator_priv;
1179        struct dibDVBTChannel {
1180                s8 spectrum_inversion;
1181
1182                s8 nfft;
1183                s8 guard;
1184                s8 constellation;
1185
1186                s8 hrch;
1187                s8 alpha;
1188                s8 code_rate_hp;
1189                s8 code_rate_lp;
1190                s8 select_hp;
1191
1192                s8 intlv_native;
1193        };
1194        struct dibDVBTChannel *ch;
1195        int ret = 0;
1196
1197        if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
1198                dprintk("could not get the lock\n");
1199                return -EINTR;
1200        }
1201        if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
1202                ret = -EIO;
1203                goto error;
1204        }
1205
1206        dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_UNION,
1207                        state->i2c_read_buffer, sizeof(struct dibDVBTChannel));
1208        ch = (struct dibDVBTChannel *)state->i2c_read_buffer;
1209
1210
1211        switch (ch->spectrum_inversion & 0x7) {
1212        case 1:
1213                state->fe[0]->dtv_property_cache.inversion = INVERSION_ON;
1214                break;
1215        case 0:
1216                state->fe[0]->dtv_property_cache.inversion = INVERSION_OFF;
1217                break;
1218        default:
1219        case -1:
1220                state->fe[0]->dtv_property_cache.inversion = INVERSION_AUTO;
1221                break;
1222        }
1223        switch (ch->nfft) {
1224        case 0:
1225                state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K;
1226                break;
1227        case 2:
1228                state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_4K;
1229                break;
1230        case 1:
1231                state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
1232                break;
1233        default:
1234        case -1:
1235                state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_AUTO;
1236                break;
1237        }
1238        switch (ch->guard) {
1239        case 0:
1240                state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32;
1241                break;
1242        case 1:
1243                state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16;
1244                break;
1245        case 2:
1246                state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
1247                break;
1248        case 3:
1249                state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4;
1250                break;
1251        default:
1252        case -1:
1253                state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_AUTO;
1254                break;
1255        }
1256        switch (ch->constellation) {
1257        case 2:
1258                state->fe[0]->dtv_property_cache.modulation = QAM_64;
1259                break;
1260        case 1:
1261                state->fe[0]->dtv_property_cache.modulation = QAM_16;
1262                break;
1263        case 0:
1264                state->fe[0]->dtv_property_cache.modulation = QPSK;
1265                break;
1266        default:
1267        case -1:
1268                state->fe[0]->dtv_property_cache.modulation = QAM_AUTO;
1269                break;
1270        }
1271        switch (ch->hrch) {
1272        case 0:
1273                state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_NONE;
1274                break;
1275        case 1:
1276                state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_1;
1277                break;
1278        default:
1279        case -1:
1280                state->fe[0]->dtv_property_cache.hierarchy = HIERARCHY_AUTO;
1281                break;
1282        }
1283        switch (ch->code_rate_hp) {
1284        case 1:
1285                state->fe[0]->dtv_property_cache.code_rate_HP = FEC_1_2;
1286                break;
1287        case 2:
1288                state->fe[0]->dtv_property_cache.code_rate_HP = FEC_2_3;
1289                break;
1290        case 3:
1291                state->fe[0]->dtv_property_cache.code_rate_HP = FEC_3_4;
1292                break;
1293        case 5:
1294                state->fe[0]->dtv_property_cache.code_rate_HP = FEC_5_6;
1295                break;
1296        case 7:
1297                state->fe[0]->dtv_property_cache.code_rate_HP = FEC_7_8;
1298                break;
1299        default:
1300        case -1:
1301                state->fe[0]->dtv_property_cache.code_rate_HP = FEC_AUTO;
1302                break;
1303        }
1304        switch (ch->code_rate_lp) {
1305        case 1:
1306                state->fe[0]->dtv_property_cache.code_rate_LP = FEC_1_2;
1307                break;
1308        case 2:
1309                state->fe[0]->dtv_property_cache.code_rate_LP = FEC_2_3;
1310                break;
1311        case 3:
1312                state->fe[0]->dtv_property_cache.code_rate_LP = FEC_3_4;
1313                break;
1314        case 5:
1315                state->fe[0]->dtv_property_cache.code_rate_LP = FEC_5_6;
1316                break;
1317        case 7:
1318                state->fe[0]->dtv_property_cache.code_rate_LP = FEC_7_8;
1319                break;
1320        default:
1321        case -1:
1322                state->fe[0]->dtv_property_cache.code_rate_LP = FEC_AUTO;
1323                break;
1324        }
1325
1326error:
1327        mutex_unlock(&state->platform.risc.mem_mbx_lock);
1328        return ret;
1329}
1330
1331static int dib9000_fw_set_channel_union(struct dvb_frontend *fe)
1332{
1333        struct dib9000_state *state = fe->demodulator_priv;
1334        struct dibDVBTChannel {
1335                s8 spectrum_inversion;
1336
1337                s8 nfft;
1338                s8 guard;
1339                s8 constellation;
1340
1341                s8 hrch;
1342                s8 alpha;
1343                s8 code_rate_hp;
1344                s8 code_rate_lp;
1345                s8 select_hp;
1346
1347                s8 intlv_native;
1348        };
1349        struct dibDVBTChannel ch;
1350
1351        switch (state->fe[0]->dtv_property_cache.inversion) {
1352        case INVERSION_ON:
1353                ch.spectrum_inversion = 1;
1354                break;
1355        case INVERSION_OFF:
1356                ch.spectrum_inversion = 0;
1357                break;
1358        default:
1359        case INVERSION_AUTO:
1360                ch.spectrum_inversion = -1;
1361                break;
1362        }
1363        switch (state->fe[0]->dtv_property_cache.transmission_mode) {
1364        case TRANSMISSION_MODE_2K:
1365                ch.nfft = 0;
1366                break;
1367        case TRANSMISSION_MODE_4K:
1368                ch.nfft = 2;
1369                break;
1370        case TRANSMISSION_MODE_8K:
1371                ch.nfft = 1;
1372                break;
1373        default:
1374        case TRANSMISSION_MODE_AUTO:
1375                ch.nfft = 1;
1376                break;
1377        }
1378        switch (state->fe[0]->dtv_property_cache.guard_interval) {
1379        case GUARD_INTERVAL_1_32:
1380                ch.guard = 0;
1381                break;
1382        case GUARD_INTERVAL_1_16:
1383                ch.guard = 1;
1384                break;
1385        case GUARD_INTERVAL_1_8:
1386                ch.guard = 2;
1387                break;
1388        case GUARD_INTERVAL_1_4:
1389                ch.guard = 3;
1390                break;
1391        default:
1392        case GUARD_INTERVAL_AUTO:
1393                ch.guard = -1;
1394                break;
1395        }
1396        switch (state->fe[0]->dtv_property_cache.modulation) {
1397        case QAM_64:
1398                ch.constellation = 2;
1399                break;
1400        case QAM_16:
1401                ch.constellation = 1;
1402                break;
1403        case QPSK:
1404                ch.constellation = 0;
1405                break;
1406        default:
1407        case QAM_AUTO:
1408                ch.constellation = -1;
1409                break;
1410        }
1411        switch (state->fe[0]->dtv_property_cache.hierarchy) {
1412        case HIERARCHY_NONE:
1413                ch.hrch = 0;
1414                break;
1415        case HIERARCHY_1:
1416        case HIERARCHY_2:
1417        case HIERARCHY_4:
1418                ch.hrch = 1;
1419                break;
1420        default:
1421        case HIERARCHY_AUTO:
1422                ch.hrch = -1;
1423                break;
1424        }
1425        ch.alpha = 1;
1426        switch (state->fe[0]->dtv_property_cache.code_rate_HP) {
1427        case FEC_1_2:
1428                ch.code_rate_hp = 1;
1429                break;
1430        case FEC_2_3:
1431                ch.code_rate_hp = 2;
1432                break;
1433        case FEC_3_4:
1434                ch.code_rate_hp = 3;
1435                break;
1436        case FEC_5_6:
1437                ch.code_rate_hp = 5;
1438                break;
1439        case FEC_7_8:
1440                ch.code_rate_hp = 7;
1441                break;
1442        default:
1443        case FEC_AUTO:
1444                ch.code_rate_hp = -1;
1445                break;
1446        }
1447        switch (state->fe[0]->dtv_property_cache.code_rate_LP) {
1448        case FEC_1_2:
1449                ch.code_rate_lp = 1;
1450                break;
1451        case FEC_2_3:
1452                ch.code_rate_lp = 2;
1453                break;
1454        case FEC_3_4:
1455                ch.code_rate_lp = 3;
1456                break;
1457        case FEC_5_6:
1458                ch.code_rate_lp = 5;
1459                break;
1460        case FEC_7_8:
1461                ch.code_rate_lp = 7;
1462                break;
1463        default:
1464        case FEC_AUTO:
1465                ch.code_rate_lp = -1;
1466                break;
1467        }
1468        ch.select_hp = 1;
1469        ch.intlv_native = 1;
1470
1471        dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_UNION, (u8 *) &ch);
1472
1473        return 0;
1474}
1475
1476static int dib9000_fw_tune(struct dvb_frontend *fe)
1477{
1478        struct dib9000_state *state = fe->demodulator_priv;
1479        int ret = 10, search = state->channel_status.status == CHANNEL_STATUS_PARAMETERS_UNKNOWN;
1480        s8 i;
1481
1482        switch (state->tune_state) {
1483        case CT_DEMOD_START:
1484                dib9000_fw_set_channel_head(state);
1485
1486                /* write the channel context - a channel is initialized to 0, so it is OK */
1487                dib9000_risc_mem_write(state, FE_MM_W_CHANNEL_CONTEXT, (u8 *) fe_info);
1488                dib9000_risc_mem_write(state, FE_MM_W_FE_INFO, (u8 *) fe_info);
1489
1490                if (search)
1491                        dib9000_mbx_send(state, OUT_MSG_FE_CHANNEL_SEARCH, NULL, 0);
1492                else {
1493                        dib9000_fw_set_channel_union(fe);
1494                        dib9000_mbx_send(state, OUT_MSG_FE_CHANNEL_TUNE, NULL, 0);
1495                }
1496                state->tune_state = CT_DEMOD_STEP_1;
1497                break;
1498        case CT_DEMOD_STEP_1:
1499                if (search)
1500                        dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_SEARCH_STATE, state->i2c_read_buffer, 1);
1501                else
1502                        dib9000_risc_mem_read(state, FE_MM_R_CHANNEL_TUNE_STATE, state->i2c_read_buffer, 1);
1503                i = (s8)state->i2c_read_buffer[0];
1504                switch (i) {    /* something happened */
1505                case 0:
1506                        break;
1507                case -2:        /* tps locks are "slower" than MPEG locks -> even in autosearch data is OK here */
1508                        if (search)
1509                                state->status = FE_STATUS_DEMOD_SUCCESS;
1510                        else {
1511                                state->tune_state = CT_DEMOD_STOP;
1512                                state->status = FE_STATUS_LOCKED;
1513                        }
1514                        break;
1515                default:
1516                        state->status = FE_STATUS_TUNE_FAILED;
1517                        state->tune_state = CT_DEMOD_STOP;
1518                        break;
1519                }
1520                break;
1521        default:
1522                ret = FE_CALLBACK_TIME_NEVER;
1523                break;
1524        }
1525
1526        return ret;
1527}
1528
1529static int dib9000_fw_set_diversity_in(struct dvb_frontend *fe, int onoff)
1530{
1531        struct dib9000_state *state = fe->demodulator_priv;
1532        u16 mode = (u16) onoff;
1533        return dib9000_mbx_send(state, OUT_MSG_ENABLE_DIVERSITY, &mode, 1);
1534}
1535
1536static int dib9000_fw_set_output_mode(struct dvb_frontend *fe, int mode)
1537{
1538        struct dib9000_state *state = fe->demodulator_priv;
1539        u16 outreg, smo_mode;
1540
1541        dprintk("setting output mode for demod %p to %d\n", fe, mode);
1542
1543        switch (mode) {
1544        case OUTMODE_MPEG2_PAR_GATED_CLK:
1545                outreg = (1 << 10);     /* 0x0400 */
1546                break;
1547        case OUTMODE_MPEG2_PAR_CONT_CLK:
1548                outreg = (1 << 10) | (1 << 6);  /* 0x0440 */
1549                break;
1550        case OUTMODE_MPEG2_SERIAL:
1551                outreg = (1 << 10) | (2 << 6) | (0 << 1);       /* 0x0482 */
1552                break;
1553        case OUTMODE_DIVERSITY:
1554                outreg = (1 << 10) | (4 << 6);  /* 0x0500 */
1555                break;
1556        case OUTMODE_MPEG2_FIFO:
1557                outreg = (1 << 10) | (5 << 6);
1558                break;
1559        case OUTMODE_HIGH_Z:
1560                outreg = 0;
1561                break;
1562        default:
1563                dprintk("Unhandled output_mode passed to be set for demod %p\n", &state->fe[0]);
1564                return -EINVAL;
1565        }
1566
1567        dib9000_write_word(state, 1795, outreg);
1568
1569        switch (mode) {
1570        case OUTMODE_MPEG2_PAR_GATED_CLK:
1571        case OUTMODE_MPEG2_PAR_CONT_CLK:
1572        case OUTMODE_MPEG2_SERIAL:
1573        case OUTMODE_MPEG2_FIFO:
1574                smo_mode = (dib9000_read_word(state, 295) & 0x0010) | (1 << 1);
1575                if (state->chip.d9.cfg.output_mpeg2_in_188_bytes)
1576                        smo_mode |= (1 << 5);
1577                dib9000_write_word(state, 295, smo_mode);
1578                break;
1579        }
1580
1581        outreg = to_fw_output_mode(mode);
1582        return dib9000_mbx_send(state, OUT_MSG_SET_OUTPUT_MODE, &outreg, 1);
1583}
1584
1585static int dib9000_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1586{
1587        struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1588        u16 i, len, t, index_msg;
1589
1590        for (index_msg = 0; index_msg < num; index_msg++) {
1591                if (msg[index_msg].flags & I2C_M_RD) {  /* read */
1592                        len = msg[index_msg].len;
1593                        if (len > 16)
1594                                len = 16;
1595
1596                        if (dib9000_read_word(state, 790) != 0)
1597                                dprintk("TunerITF: read busy\n");
1598
1599                        dib9000_write_word(state, 784, (u16) (msg[index_msg].addr));
1600                        dib9000_write_word(state, 787, (len / 2) - 1);
1601                        dib9000_write_word(state, 786, 1);      /* start read */
1602
1603                        i = 1000;
1604                        while (dib9000_read_word(state, 790) != (len / 2) && i)
1605                                i--;
1606
1607                        if (i == 0)
1608                                dprintk("TunerITF: read failed\n");
1609
1610                        for (i = 0; i < len; i += 2) {
1611                                t = dib9000_read_word(state, 785);
1612                                msg[index_msg].buf[i] = (t >> 8) & 0xff;
1613                                msg[index_msg].buf[i + 1] = (t) & 0xff;
1614                        }
1615                        if (dib9000_read_word(state, 790) != 0)
1616                                dprintk("TunerITF: read more data than expected\n");
1617                } else {
1618                        i = 1000;
1619                        while (dib9000_read_word(state, 789) && i)
1620                                i--;
1621                        if (i == 0)
1622                                dprintk("TunerITF: write busy\n");
1623
1624                        len = msg[index_msg].len;
1625                        if (len > 16)
1626                                len = 16;
1627
1628                        for (i = 0; i < len; i += 2)
1629                                dib9000_write_word(state, 785, (msg[index_msg].buf[i] << 8) | msg[index_msg].buf[i + 1]);
1630                        dib9000_write_word(state, 784, (u16) msg[index_msg].addr);
1631                        dib9000_write_word(state, 787, (len / 2) - 1);
1632                        dib9000_write_word(state, 786, 0);      /* start write */
1633
1634                        i = 1000;
1635                        while (dib9000_read_word(state, 791) > 0 && i)
1636                                i--;
1637                        if (i == 0)
1638                                dprintk("TunerITF: write failed\n");
1639                }
1640        }
1641        return num;
1642}
1643
1644int dib9000_fw_set_component_bus_speed(struct dvb_frontend *fe, u16 speed)
1645{
1646        struct dib9000_state *state = fe->demodulator_priv;
1647
1648        state->component_bus_speed = speed;
1649        return 0;
1650}
1651EXPORT_SYMBOL(dib9000_fw_set_component_bus_speed);
1652
1653static int dib9000_fw_component_bus_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
1654{
1655        struct dib9000_state *state = i2c_get_adapdata(i2c_adap);
1656        u8 type = 0;            /* I2C */
1657        u8 port = DIBX000_I2C_INTERFACE_GPIO_3_4;
1658        u16 scl = state->component_bus_speed;   /* SCL frequency */
1659        struct dib9000_fe_memory_map *m = &state->platform.risc.fe_mm[FE_MM_RW_COMPONENT_ACCESS_BUFFER];
1660        u8 p[13] = { 0 };
1661
1662        p[0] = type;
1663        p[1] = port;
1664        p[2] = msg[0].addr << 1;
1665
1666        p[3] = (u8) scl & 0xff; /* scl */
1667        p[4] = (u8) (scl >> 8);
1668
1669        p[7] = 0;
1670        p[8] = 0;
1671
1672        p[9] = (u8) (msg[0].len);
1673        p[10] = (u8) (msg[0].len >> 8);
1674        if ((num > 1) && (msg[1].flags & I2C_M_RD)) {
1675                p[11] = (u8) (msg[1].len);
1676                p[12] = (u8) (msg[1].len >> 8);
1677        } else {
1678                p[11] = 0;
1679                p[12] = 0;
1680        }
1681
1682        if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
1683                dprintk("could not get the lock\n");
1684                return 0;
1685        }
1686
1687        dib9000_risc_mem_write(state, FE_MM_W_COMPONENT_ACCESS, p);
1688
1689        {                       /* write-part */
1690                dib9000_risc_mem_setup_cmd(state, m->addr, msg[0].len, 0);
1691                dib9000_risc_mem_write_chunks(state, msg[0].buf, msg[0].len);
1692        }
1693
1694        /* do the transaction */
1695        if (dib9000_fw_memmbx_sync(state, FE_SYNC_COMPONENT_ACCESS) < 0) {
1696                mutex_unlock(&state->platform.risc.mem_mbx_lock);
1697                return 0;
1698        }
1699
1700        /* read back any possible result */
1701        if ((num > 1) && (msg[1].flags & I2C_M_RD))
1702                dib9000_risc_mem_read(state, FE_MM_RW_COMPONENT_ACCESS_BUFFER, msg[1].buf, msg[1].len);
1703
1704        mutex_unlock(&state->platform.risc.mem_mbx_lock);
1705
1706        return num;
1707}
1708
1709static u32 dib9000_i2c_func(struct i2c_adapter *adapter)
1710{
1711        return I2C_FUNC_I2C;
1712}
1713
1714static const struct i2c_algorithm dib9000_tuner_algo = {
1715        .master_xfer = dib9000_tuner_xfer,
1716        .functionality = dib9000_i2c_func,
1717};
1718
1719static const struct i2c_algorithm dib9000_component_bus_algo = {
1720        .master_xfer = dib9000_fw_component_bus_xfer,
1721        .functionality = dib9000_i2c_func,
1722};
1723
1724struct i2c_adapter *dib9000_get_tuner_interface(struct dvb_frontend *fe)
1725{
1726        struct dib9000_state *st = fe->demodulator_priv;
1727        return &st->tuner_adap;
1728}
1729EXPORT_SYMBOL(dib9000_get_tuner_interface);
1730
1731struct i2c_adapter *dib9000_get_component_bus_interface(struct dvb_frontend *fe)
1732{
1733        struct dib9000_state *st = fe->demodulator_priv;
1734        return &st->component_bus;
1735}
1736EXPORT_SYMBOL(dib9000_get_component_bus_interface);
1737
1738struct i2c_adapter *dib9000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
1739{
1740        struct dib9000_state *st = fe->demodulator_priv;
1741        return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
1742}
1743EXPORT_SYMBOL(dib9000_get_i2c_master);
1744
1745int dib9000_set_i2c_adapter(struct dvb_frontend *fe, struct i2c_adapter *i2c)
1746{
1747        struct dib9000_state *st = fe->demodulator_priv;
1748
1749        st->i2c.i2c_adap = i2c;
1750        return 0;
1751}
1752EXPORT_SYMBOL(dib9000_set_i2c_adapter);
1753
1754static int dib9000_cfg_gpio(struct dib9000_state *st, u8 num, u8 dir, u8 val)
1755{
1756        st->gpio_dir = dib9000_read_word(st, 773);
1757        st->gpio_dir &= ~(1 << num);    /* reset the direction bit */
1758        st->gpio_dir |= (dir & 0x1) << num;     /* set the new direction */
1759        dib9000_write_word(st, 773, st->gpio_dir);
1760
1761        st->gpio_val = dib9000_read_word(st, 774);
1762        st->gpio_val &= ~(1 << num);    /* reset the direction bit */
1763        st->gpio_val |= (val & 0x01) << num;    /* set the new value */
1764        dib9000_write_word(st, 774, st->gpio_val);
1765
1766        dprintk("gpio dir: %04x: gpio val: %04x\n", st->gpio_dir, st->gpio_val);
1767
1768        return 0;
1769}
1770
1771int dib9000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
1772{
1773        struct dib9000_state *state = fe->demodulator_priv;
1774        return dib9000_cfg_gpio(state, num, dir, val);
1775}
1776EXPORT_SYMBOL(dib9000_set_gpio);
1777
1778int dib9000_fw_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
1779{
1780        struct dib9000_state *state = fe->demodulator_priv;
1781        u16 val;
1782        int ret;
1783
1784        if ((state->pid_ctrl_index != -2) && (state->pid_ctrl_index < 9)) {
1785                /* postpone the pid filtering cmd */
1786                dprintk("pid filter cmd postpone\n");
1787                state->pid_ctrl_index++;
1788                state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER_CTRL;
1789                state->pid_ctrl[state->pid_ctrl_index].onoff = onoff;
1790                return 0;
1791        }
1792
1793        if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1794                dprintk("could not get the lock\n");
1795                return -EINTR;
1796        }
1797
1798        val = dib9000_read_word(state, 294 + 1) & 0xffef;
1799        val |= (onoff & 0x1) << 4;
1800
1801        dprintk("PID filter enabled %d\n", onoff);
1802        ret = dib9000_write_word(state, 294 + 1, val);
1803        mutex_unlock(&state->demod_lock);
1804        return ret;
1805
1806}
1807EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl);
1808
1809int dib9000_fw_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
1810{
1811        struct dib9000_state *state = fe->demodulator_priv;
1812        int ret;
1813
1814        if (state->pid_ctrl_index != -2) {
1815                /* postpone the pid filtering cmd */
1816                dprintk("pid filter postpone\n");
1817                if (state->pid_ctrl_index < 9) {
1818                        state->pid_ctrl_index++;
1819                        state->pid_ctrl[state->pid_ctrl_index].cmd = DIB9000_PID_FILTER;
1820                        state->pid_ctrl[state->pid_ctrl_index].id = id;
1821                        state->pid_ctrl[state->pid_ctrl_index].pid = pid;
1822                        state->pid_ctrl[state->pid_ctrl_index].onoff = onoff;
1823                } else
1824                        dprintk("can not add any more pid ctrl cmd\n");
1825                return 0;
1826        }
1827
1828        if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1829                dprintk("could not get the lock\n");
1830                return -EINTR;
1831        }
1832        dprintk("Index %x, PID %d, OnOff %d\n", id, pid, onoff);
1833        ret = dib9000_write_word(state, 300 + 1 + id,
1834                        onoff ? (1 << 13) | pid : 0);
1835        mutex_unlock(&state->demod_lock);
1836        return ret;
1837}
1838EXPORT_SYMBOL(dib9000_fw_pid_filter);
1839
1840int dib9000_firmware_post_pll_init(struct dvb_frontend *fe)
1841{
1842        struct dib9000_state *state = fe->demodulator_priv;
1843        return dib9000_fw_init(state);
1844}
1845EXPORT_SYMBOL(dib9000_firmware_post_pll_init);
1846
1847static void dib9000_release(struct dvb_frontend *demod)
1848{
1849        struct dib9000_state *st = demod->demodulator_priv;
1850        u8 index_frontend;
1851
1852        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
1853                dvb_frontend_detach(st->fe[index_frontend]);
1854
1855        dibx000_exit_i2c_master(&st->i2c_master);
1856
1857        i2c_del_adapter(&st->tuner_adap);
1858        i2c_del_adapter(&st->component_bus);
1859        kfree(st->fe[0]);
1860        kfree(st);
1861}
1862
1863static int dib9000_wakeup(struct dvb_frontend *fe)
1864{
1865        return 0;
1866}
1867
1868static int dib9000_sleep(struct dvb_frontend *fe)
1869{
1870        struct dib9000_state *state = fe->demodulator_priv;
1871        u8 index_frontend;
1872        int ret = 0;
1873
1874        if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1875                dprintk("could not get the lock\n");
1876                return -EINTR;
1877        }
1878        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1879                ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
1880                if (ret < 0)
1881                        goto error;
1882        }
1883        ret = dib9000_mbx_send(state, OUT_MSG_FE_SLEEP, NULL, 0);
1884
1885error:
1886        mutex_unlock(&state->demod_lock);
1887        return ret;
1888}
1889
1890static int dib9000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
1891{
1892        tune->min_delay_ms = 1000;
1893        return 0;
1894}
1895
1896static int dib9000_get_frontend(struct dvb_frontend *fe,
1897                                struct dtv_frontend_properties *c)
1898{
1899        struct dib9000_state *state = fe->demodulator_priv;
1900        u8 index_frontend, sub_index_frontend;
1901        enum fe_status stat;
1902        int ret = 0;
1903
1904        if (state->get_frontend_internal == 0) {
1905                if (mutex_lock_interruptible(&state->demod_lock) < 0) {
1906                        dprintk("could not get the lock\n");
1907                        return -EINTR;
1908                }
1909        }
1910
1911        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1912                state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
1913                if (stat & FE_HAS_SYNC) {
1914                        dprintk("TPS lock on the slave%i\n", index_frontend);
1915
1916                        /* synchronize the cache with the other frontends */
1917                        state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend], c);
1918                        for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL);
1919                             sub_index_frontend++) {
1920                                if (sub_index_frontend != index_frontend) {
1921                                        state->fe[sub_index_frontend]->dtv_property_cache.modulation =
1922                                            state->fe[index_frontend]->dtv_property_cache.modulation;
1923                                        state->fe[sub_index_frontend]->dtv_property_cache.inversion =
1924                                            state->fe[index_frontend]->dtv_property_cache.inversion;
1925                                        state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode =
1926                                            state->fe[index_frontend]->dtv_property_cache.transmission_mode;
1927                                        state->fe[sub_index_frontend]->dtv_property_cache.guard_interval =
1928                                            state->fe[index_frontend]->dtv_property_cache.guard_interval;
1929                                        state->fe[sub_index_frontend]->dtv_property_cache.hierarchy =
1930                                            state->fe[index_frontend]->dtv_property_cache.hierarchy;
1931                                        state->fe[sub_index_frontend]->dtv_property_cache.code_rate_HP =
1932                                            state->fe[index_frontend]->dtv_property_cache.code_rate_HP;
1933                                        state->fe[sub_index_frontend]->dtv_property_cache.code_rate_LP =
1934                                            state->fe[index_frontend]->dtv_property_cache.code_rate_LP;
1935                                        state->fe[sub_index_frontend]->dtv_property_cache.rolloff =
1936                                            state->fe[index_frontend]->dtv_property_cache.rolloff;
1937                                }
1938                        }
1939                        ret = 0;
1940                        goto return_value;
1941                }
1942        }
1943
1944        /* get the channel from master chip */
1945        ret = dib9000_fw_get_channel(fe);
1946        if (ret != 0)
1947                goto return_value;
1948
1949        /* synchronize the cache with the other frontends */
1950        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
1951                state->fe[index_frontend]->dtv_property_cache.inversion = c->inversion;
1952                state->fe[index_frontend]->dtv_property_cache.transmission_mode = c->transmission_mode;
1953                state->fe[index_frontend]->dtv_property_cache.guard_interval = c->guard_interval;
1954                state->fe[index_frontend]->dtv_property_cache.modulation = c->modulation;
1955                state->fe[index_frontend]->dtv_property_cache.hierarchy = c->hierarchy;
1956                state->fe[index_frontend]->dtv_property_cache.code_rate_HP = c->code_rate_HP;
1957                state->fe[index_frontend]->dtv_property_cache.code_rate_LP = c->code_rate_LP;
1958                state->fe[index_frontend]->dtv_property_cache.rolloff = c->rolloff;
1959        }
1960        ret = 0;
1961
1962return_value:
1963        if (state->get_frontend_internal == 0)
1964                mutex_unlock(&state->demod_lock);
1965        return ret;
1966}
1967
1968static int dib9000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
1969{
1970        struct dib9000_state *state = fe->demodulator_priv;
1971        state->tune_state = tune_state;
1972        if (tune_state == CT_DEMOD_START)
1973                state->status = FE_STATUS_TUNE_PENDING;
1974
1975        return 0;
1976}
1977
1978static u32 dib9000_get_status(struct dvb_frontend *fe)
1979{
1980        struct dib9000_state *state = fe->demodulator_priv;
1981        return state->status;
1982}
1983
1984static int dib9000_set_channel_status(struct dvb_frontend *fe, struct dvb_frontend_parametersContext *channel_status)
1985{
1986        struct dib9000_state *state = fe->demodulator_priv;
1987
1988        memcpy(&state->channel_status, channel_status, sizeof(struct dvb_frontend_parametersContext));
1989        return 0;
1990}
1991
1992static int dib9000_set_frontend(struct dvb_frontend *fe)
1993{
1994        struct dib9000_state *state = fe->demodulator_priv;
1995        int sleep_time, sleep_time_slave;
1996        u32 frontend_status;
1997        u8 nbr_pending, exit_condition, index_frontend, index_frontend_success;
1998        struct dvb_frontend_parametersContext channel_status;
1999
2000        /* check that the correct parameters are set */
2001        if (state->fe[0]->dtv_property_cache.frequency == 0) {
2002                dprintk("dib9000: must specify frequency\n");
2003                return 0;
2004        }
2005
2006        if (state->fe[0]->dtv_property_cache.bandwidth_hz == 0) {
2007                dprintk("dib9000: must specify bandwidth\n");
2008                return 0;
2009        }
2010
2011        state->pid_ctrl_index = -1; /* postpone the pid filtering cmd */
2012        if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2013                dprintk("could not get the lock\n");
2014                return 0;
2015        }
2016
2017        fe->dtv_property_cache.delivery_system = SYS_DVBT;
2018
2019        /* set the master status */
2020        if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO ||
2021            state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO ||
2022            state->fe[0]->dtv_property_cache.modulation == QAM_AUTO ||
2023            state->fe[0]->dtv_property_cache.code_rate_HP == FEC_AUTO) {
2024                /* no channel specified, autosearch the channel */
2025                state->channel_status.status = CHANNEL_STATUS_PARAMETERS_UNKNOWN;
2026        } else
2027                state->channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
2028
2029        /* set mode and status for the different frontends */
2030        for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2031                dib9000_fw_set_diversity_in(state->fe[index_frontend], 1);
2032
2033                /* synchronization of the cache */
2034                memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
2035
2036                state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_DVBT;
2037                dib9000_fw_set_output_mode(state->fe[index_frontend], OUTMODE_HIGH_Z);
2038
2039                dib9000_set_channel_status(state->fe[index_frontend], &state->channel_status);
2040                dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
2041        }
2042
2043        /* actual tune */
2044        exit_condition = 0;     /* 0: tune pending; 1: tune failed; 2:tune success */
2045        index_frontend_success = 0;
2046        do {
2047                sleep_time = dib9000_fw_tune(state->fe[0]);
2048                for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2049                        sleep_time_slave = dib9000_fw_tune(state->fe[index_frontend]);
2050                        if (sleep_time == FE_CALLBACK_TIME_NEVER)
2051                                sleep_time = sleep_time_slave;
2052                        else if ((sleep_time_slave != FE_CALLBACK_TIME_NEVER) && (sleep_time_slave > sleep_time))
2053                                sleep_time = sleep_time_slave;
2054                }
2055                if (sleep_time != FE_CALLBACK_TIME_NEVER)
2056                        msleep(sleep_time / 10);
2057                else
2058                        break;
2059
2060                nbr_pending = 0;
2061                exit_condition = 0;
2062                index_frontend_success = 0;
2063                for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2064                        frontend_status = -dib9000_get_status(state->fe[index_frontend]);
2065                        if (frontend_status > -FE_STATUS_TUNE_PENDING) {
2066                                exit_condition = 2;     /* tune success */
2067                                index_frontend_success = index_frontend;
2068                                break;
2069                        }
2070                        if (frontend_status == -FE_STATUS_TUNE_PENDING)
2071                                nbr_pending++;  /* some frontends are still tuning */
2072                }
2073                if ((exit_condition != 2) && (nbr_pending == 0))
2074                        exit_condition = 1;     /* if all tune are done and no success, exit: tune failed */
2075
2076        } while (exit_condition == 0);
2077
2078        /* check the tune result */
2079        if (exit_condition == 1) {      /* tune failed */
2080                dprintk("tune failed\n");
2081                mutex_unlock(&state->demod_lock);
2082                /* tune failed; put all the pid filtering cmd to junk */
2083                state->pid_ctrl_index = -1;
2084                return 0;
2085        }
2086
2087        dprintk("tune success on frontend%i\n", index_frontend_success);
2088
2089        /* synchronize all the channel cache */
2090        state->get_frontend_internal = 1;
2091        dib9000_get_frontend(state->fe[0], &state->fe[0]->dtv_property_cache);
2092        state->get_frontend_internal = 0;
2093
2094        /* retune the other frontends with the found channel */
2095        channel_status.status = CHANNEL_STATUS_PARAMETERS_SET;
2096        for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2097                /* only retune the frontends which was not tuned success */
2098                if (index_frontend != index_frontend_success) {
2099                        dib9000_set_channel_status(state->fe[index_frontend], &channel_status);
2100                        dib9000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
2101                }
2102        }
2103        do {
2104                sleep_time = FE_CALLBACK_TIME_NEVER;
2105                for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2106                        if (index_frontend != index_frontend_success) {
2107                                sleep_time_slave = dib9000_fw_tune(state->fe[index_frontend]);
2108                                if (sleep_time == FE_CALLBACK_TIME_NEVER)
2109                                        sleep_time = sleep_time_slave;
2110                                else if ((sleep_time_slave != FE_CALLBACK_TIME_NEVER) && (sleep_time_slave > sleep_time))
2111                                        sleep_time = sleep_time_slave;
2112                        }
2113                }
2114                if (sleep_time != FE_CALLBACK_TIME_NEVER)
2115                        msleep(sleep_time / 10);
2116                else
2117                        break;
2118
2119                nbr_pending = 0;
2120                for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2121                        if (index_frontend != index_frontend_success) {
2122                                frontend_status = -dib9000_get_status(state->fe[index_frontend]);
2123                                if ((index_frontend != index_frontend_success) && (frontend_status == -FE_STATUS_TUNE_PENDING))
2124                                        nbr_pending++;  /* some frontends are still tuning */
2125                        }
2126                }
2127        } while (nbr_pending != 0);
2128
2129        /* set the output mode */
2130        dib9000_fw_set_output_mode(state->fe[0], state->chip.d9.cfg.output_mode);
2131        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2132                dib9000_fw_set_output_mode(state->fe[index_frontend], OUTMODE_DIVERSITY);
2133
2134        /* turn off the diversity for the last frontend */
2135        dib9000_fw_set_diversity_in(state->fe[index_frontend - 1], 0);
2136
2137        mutex_unlock(&state->demod_lock);
2138        if (state->pid_ctrl_index >= 0) {
2139                u8 index_pid_filter_cmd;
2140                u8 pid_ctrl_index = state->pid_ctrl_index;
2141
2142                state->pid_ctrl_index = -2;
2143                for (index_pid_filter_cmd = 0;
2144                                index_pid_filter_cmd <= pid_ctrl_index;
2145                                index_pid_filter_cmd++) {
2146                        if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER_CTRL)
2147                                dib9000_fw_pid_filter_ctrl(state->fe[0],
2148                                                state->pid_ctrl[index_pid_filter_cmd].onoff);
2149                        else if (state->pid_ctrl[index_pid_filter_cmd].cmd == DIB9000_PID_FILTER)
2150                                dib9000_fw_pid_filter(state->fe[0],
2151                                                state->pid_ctrl[index_pid_filter_cmd].id,
2152                                                state->pid_ctrl[index_pid_filter_cmd].pid,
2153                                                state->pid_ctrl[index_pid_filter_cmd].onoff);
2154                }
2155        }
2156        /* do not postpone any more the pid filtering */
2157        state->pid_ctrl_index = -2;
2158
2159        return 0;
2160}
2161
2162static u16 dib9000_read_lock(struct dvb_frontend *fe)
2163{
2164        struct dib9000_state *state = fe->demodulator_priv;
2165
2166        return dib9000_read_word(state, 535);
2167}
2168
2169static int dib9000_read_status(struct dvb_frontend *fe, enum fe_status *stat)
2170{
2171        struct dib9000_state *state = fe->demodulator_priv;
2172        u8 index_frontend;
2173        u16 lock = 0, lock_slave = 0;
2174
2175        if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2176                dprintk("could not get the lock\n");
2177                return -EINTR;
2178        }
2179        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2180                lock_slave |= dib9000_read_lock(state->fe[index_frontend]);
2181
2182        lock = dib9000_read_word(state, 535);
2183
2184        *stat = 0;
2185
2186        if ((lock & 0x8000) || (lock_slave & 0x8000))
2187                *stat |= FE_HAS_SIGNAL;
2188        if ((lock & 0x3000) || (lock_slave & 0x3000))
2189                *stat |= FE_HAS_CARRIER;
2190        if ((lock & 0x0100) || (lock_slave & 0x0100))
2191                *stat |= FE_HAS_VITERBI;
2192        if (((lock & 0x0038) == 0x38) || ((lock_slave & 0x0038) == 0x38))
2193                *stat |= FE_HAS_SYNC;
2194        if ((lock & 0x0008) || (lock_slave & 0x0008))
2195                *stat |= FE_HAS_LOCK;
2196
2197        mutex_unlock(&state->demod_lock);
2198
2199        return 0;
2200}
2201
2202static int dib9000_read_ber(struct dvb_frontend *fe, u32 * ber)
2203{
2204        struct dib9000_state *state = fe->demodulator_priv;
2205        u16 *c;
2206        int ret = 0;
2207
2208        if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2209                dprintk("could not get the lock\n");
2210                return -EINTR;
2211        }
2212        if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2213                dprintk("could not get the lock\n");
2214                ret = -EINTR;
2215                goto error;
2216        }
2217        if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2218                mutex_unlock(&state->platform.risc.mem_mbx_lock);
2219                ret = -EIO;
2220                goto error;
2221        }
2222        dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR,
2223                        state->i2c_read_buffer, 16 * 2);
2224        mutex_unlock(&state->platform.risc.mem_mbx_lock);
2225
2226        c = (u16 *)state->i2c_read_buffer;
2227
2228        *ber = c[10] << 16 | c[11];
2229
2230error:
2231        mutex_unlock(&state->demod_lock);
2232        return ret;
2233}
2234
2235static int dib9000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
2236{
2237        struct dib9000_state *state = fe->demodulator_priv;
2238        u8 index_frontend;
2239        u16 *c = (u16 *)state->i2c_read_buffer;
2240        u16 val;
2241        int ret = 0;
2242
2243        if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2244                dprintk("could not get the lock\n");
2245                return -EINTR;
2246        }
2247        *strength = 0;
2248        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2249                state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
2250                if (val > 65535 - *strength)
2251                        *strength = 65535;
2252                else
2253                        *strength += val;
2254        }
2255
2256        if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2257                dprintk("could not get the lock\n");
2258                ret = -EINTR;
2259                goto error;
2260        }
2261        if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2262                mutex_unlock(&state->platform.risc.mem_mbx_lock);
2263                ret = -EIO;
2264                goto error;
2265        }
2266        dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2267        mutex_unlock(&state->platform.risc.mem_mbx_lock);
2268
2269        val = 65535 - c[4];
2270        if (val > 65535 - *strength)
2271                *strength = 65535;
2272        else
2273                *strength += val;
2274
2275error:
2276        mutex_unlock(&state->demod_lock);
2277        return ret;
2278}
2279
2280static u32 dib9000_get_snr(struct dvb_frontend *fe)
2281{
2282        struct dib9000_state *state = fe->demodulator_priv;
2283        u16 *c = (u16 *)state->i2c_read_buffer;
2284        u32 n, s, exp;
2285        u16 val;
2286
2287        if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2288                dprintk("could not get the lock\n");
2289                return 0;
2290        }
2291        if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2292                mutex_unlock(&state->platform.risc.mem_mbx_lock);
2293                return 0;
2294        }
2295        dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2296        mutex_unlock(&state->platform.risc.mem_mbx_lock);
2297
2298        val = c[7];
2299        n = (val >> 4) & 0xff;
2300        exp = ((val & 0xf) << 2);
2301        val = c[8];
2302        exp += ((val >> 14) & 0x3);
2303        if ((exp & 0x20) != 0)
2304                exp -= 0x40;
2305        n <<= exp + 16;
2306
2307        s = (val >> 6) & 0xFF;
2308        exp = (val & 0x3F);
2309        if ((exp & 0x20) != 0)
2310                exp -= 0x40;
2311        s <<= exp + 16;
2312
2313        if (n > 0) {
2314                u32 t = (s / n) << 16;
2315                return t + ((s << 16) - n * t) / n;
2316        }
2317        return 0xffffffff;
2318}
2319
2320static int dib9000_read_snr(struct dvb_frontend *fe, u16 * snr)
2321{
2322        struct dib9000_state *state = fe->demodulator_priv;
2323        u8 index_frontend;
2324        u32 snr_master;
2325
2326        if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2327                dprintk("could not get the lock\n");
2328                return -EINTR;
2329        }
2330        snr_master = dib9000_get_snr(fe);
2331        for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
2332                snr_master += dib9000_get_snr(state->fe[index_frontend]);
2333
2334        if ((snr_master >> 16) != 0) {
2335                snr_master = 10 * intlog10(snr_master >> 16);
2336                *snr = snr_master / ((1 << 24) / 10);
2337        } else
2338                *snr = 0;
2339
2340        mutex_unlock(&state->demod_lock);
2341
2342        return 0;
2343}
2344
2345static int dib9000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
2346{
2347        struct dib9000_state *state = fe->demodulator_priv;
2348        u16 *c = (u16 *)state->i2c_read_buffer;
2349        int ret = 0;
2350
2351        if (mutex_lock_interruptible(&state->demod_lock) < 0) {
2352                dprintk("could not get the lock\n");
2353                return -EINTR;
2354        }
2355        if (mutex_lock_interruptible(&state->platform.risc.mem_mbx_lock) < 0) {
2356                dprintk("could not get the lock\n");
2357                ret = -EINTR;
2358                goto error;
2359        }
2360        if (dib9000_fw_memmbx_sync(state, FE_SYNC_CHANNEL) < 0) {
2361                mutex_unlock(&state->platform.risc.mem_mbx_lock);
2362                ret = -EIO;
2363                goto error;
2364        }
2365        dib9000_risc_mem_read(state, FE_MM_R_FE_MONITOR, (u8 *) c, 16 * 2);
2366        mutex_unlock(&state->platform.risc.mem_mbx_lock);
2367
2368        *unc = c[12];
2369
2370error:
2371        mutex_unlock(&state->demod_lock);
2372        return ret;
2373}
2374
2375int dib9000_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, u8 first_addr)
2376{
2377        int k = 0, ret = 0;
2378        u8 new_addr = 0;
2379        struct i2c_device client = {.i2c_adap = i2c };
2380
2381        client.i2c_write_buffer = kzalloc(4, GFP_KERNEL);
2382        if (!client.i2c_write_buffer) {
2383                dprintk("%s: not enough memory\n", __func__);
2384                return -ENOMEM;
2385        }
2386        client.i2c_read_buffer = kzalloc(4, GFP_KERNEL);
2387        if (!client.i2c_read_buffer) {
2388                dprintk("%s: not enough memory\n", __func__);
2389                ret = -ENOMEM;
2390                goto error_memory;
2391        }
2392
2393        client.i2c_addr = default_addr + 16;
2394        dib9000_i2c_write16(&client, 1796, 0x0);
2395
2396        for (k = no_of_demods - 1; k >= 0; k--) {
2397                /* designated i2c address */
2398                new_addr = first_addr + (k << 1);
2399                client.i2c_addr = default_addr;
2400
2401                dib9000_i2c_write16(&client, 1817, 3);
2402                dib9000_i2c_write16(&client, 1796, 0);
2403                dib9000_i2c_write16(&client, 1227, 1);
2404                dib9000_i2c_write16(&client, 1227, 0);
2405
2406                client.i2c_addr = new_addr;
2407                dib9000_i2c_write16(&client, 1817, 3);
2408                dib9000_i2c_write16(&client, 1796, 0);
2409                dib9000_i2c_write16(&client, 1227, 1);
2410                dib9000_i2c_write16(&client, 1227, 0);
2411
2412                if (dib9000_identify(&client) == 0) {
2413                        client.i2c_addr = default_addr;
2414                        if (dib9000_identify(&client) == 0) {
2415                                dprintk("DiB9000 #%d: not identified\n", k);
2416                                ret = -EIO;
2417                                goto error;
2418                        }
2419                }
2420
2421                dib9000_i2c_write16(&client, 1795, (1 << 10) | (4 << 6));
2422                dib9000_i2c_write16(&client, 1794, (new_addr << 2) | 2);
2423
2424                dprintk("IC %d initialized (to i2c_address 0x%x)\n", k, new_addr);
2425        }
2426
2427        for (k = 0; k < no_of_demods; k++) {
2428                new_addr = first_addr | (k << 1);
2429                client.i2c_addr = new_addr;
2430
2431                dib9000_i2c_write16(&client, 1794, (new_addr << 2));
2432                dib9000_i2c_write16(&client, 1795, 0);
2433        }
2434
2435error:
2436        kfree(client.i2c_read_buffer);
2437error_memory:
2438        kfree(client.i2c_write_buffer);
2439
2440        return ret;
2441}
2442EXPORT_SYMBOL(dib9000_i2c_enumeration);
2443
2444int dib9000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
2445{
2446        struct dib9000_state *state = fe->demodulator_priv;
2447        u8 index_frontend = 1;
2448
2449        while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
2450                index_frontend++;
2451        if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
2452                dprintk("set slave fe %p to index %i\n", fe_slave, index_frontend);
2453                state->fe[index_frontend] = fe_slave;
2454                return 0;
2455        }
2456
2457        dprintk("too many slave frontend\n");
2458        return -ENOMEM;
2459}
2460EXPORT_SYMBOL(dib9000_set_slave_frontend);
2461
2462struct dvb_frontend *dib9000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
2463{
2464        struct dib9000_state *state = fe->demodulator_priv;
2465
2466        if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
2467                return NULL;
2468        return state->fe[slave_index];
2469}
2470EXPORT_SYMBOL(dib9000_get_slave_frontend);
2471
2472static const struct dvb_frontend_ops dib9000_ops;
2473struct dvb_frontend *dib9000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, const struct dib9000_config *cfg)
2474{
2475        struct dvb_frontend *fe;
2476        struct dib9000_state *st;
2477        st = kzalloc(sizeof(struct dib9000_state), GFP_KERNEL);
2478        if (st == NULL)
2479                return NULL;
2480        fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
2481        if (fe == NULL) {
2482                kfree(st);
2483                return NULL;
2484        }
2485
2486        memcpy(&st->chip.d9.cfg, cfg, sizeof(struct dib9000_config));
2487        st->i2c.i2c_adap = i2c_adap;
2488        st->i2c.i2c_addr = i2c_addr;
2489        st->i2c.i2c_write_buffer = st->i2c_write_buffer;
2490        st->i2c.i2c_read_buffer = st->i2c_read_buffer;
2491
2492        st->gpio_dir = DIB9000_GPIO_DEFAULT_DIRECTIONS;
2493        st->gpio_val = DIB9000_GPIO_DEFAULT_VALUES;
2494        st->gpio_pwm_pos = DIB9000_GPIO_DEFAULT_PWM_POS;
2495
2496        mutex_init(&st->platform.risc.mbx_if_lock);
2497        mutex_init(&st->platform.risc.mbx_lock);
2498        mutex_init(&st->platform.risc.mem_lock);
2499        mutex_init(&st->platform.risc.mem_mbx_lock);
2500        mutex_init(&st->demod_lock);
2501        st->get_frontend_internal = 0;
2502
2503        st->pid_ctrl_index = -2;
2504
2505        st->fe[0] = fe;
2506        fe->demodulator_priv = st;
2507        memcpy(&st->fe[0]->ops, &dib9000_ops, sizeof(struct dvb_frontend_ops));
2508
2509        /* Ensure the output mode remains at the previous default if it's
2510         * not specifically set by the caller.
2511         */
2512        if ((st->chip.d9.cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (st->chip.d9.cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
2513                st->chip.d9.cfg.output_mode = OUTMODE_MPEG2_FIFO;
2514
2515        if (dib9000_identify(&st->i2c) == 0)
2516                goto error;
2517
2518        dibx000_init_i2c_master(&st->i2c_master, DIB7000MC, st->i2c.i2c_adap, st->i2c.i2c_addr);
2519
2520        st->tuner_adap.dev.parent = i2c_adap->dev.parent;
2521        strscpy(st->tuner_adap.name, "DIB9000_FW TUNER ACCESS",
2522                sizeof(st->tuner_adap.name));
2523        st->tuner_adap.algo = &dib9000_tuner_algo;
2524        st->tuner_adap.algo_data = NULL;
2525        i2c_set_adapdata(&st->tuner_adap, st);
2526        if (i2c_add_adapter(&st->tuner_adap) < 0)
2527                goto error;
2528
2529        st->component_bus.dev.parent = i2c_adap->dev.parent;
2530        strscpy(st->component_bus.name, "DIB9000_FW COMPONENT BUS ACCESS",
2531                sizeof(st->component_bus.name));
2532        st->component_bus.algo = &dib9000_component_bus_algo;
2533        st->component_bus.algo_data = NULL;
2534        st->component_bus_speed = 340;
2535        i2c_set_adapdata(&st->component_bus, st);
2536        if (i2c_add_adapter(&st->component_bus) < 0)
2537                goto component_bus_add_error;
2538
2539        dib9000_fw_reset(fe);
2540
2541        return fe;
2542
2543component_bus_add_error:
2544        i2c_del_adapter(&st->tuner_adap);
2545error:
2546        kfree(st);
2547        return NULL;
2548}
2549EXPORT_SYMBOL(dib9000_attach);
2550
2551static const struct dvb_frontend_ops dib9000_ops = {
2552        .delsys = { SYS_DVBT },
2553        .info = {
2554                 .name = "DiBcom 9000",
2555                 .frequency_min_hz =  44250 * kHz,
2556                 .frequency_max_hz = 867250 * kHz,
2557                 .frequency_stepsize_hz = 62500,
2558                 .caps = FE_CAN_INVERSION_AUTO |
2559                 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
2560                 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
2561                 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
2562                 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
2563                 },
2564
2565        .release = dib9000_release,
2566
2567        .init = dib9000_wakeup,
2568        .sleep = dib9000_sleep,
2569
2570        .set_frontend = dib9000_set_frontend,
2571        .get_tune_settings = dib9000_fe_get_tune_settings,
2572        .get_frontend = dib9000_get_frontend,
2573
2574        .read_status = dib9000_read_status,
2575        .read_ber = dib9000_read_ber,
2576        .read_signal_strength = dib9000_read_signal_strength,
2577        .read_snr = dib9000_read_snr,
2578        .read_ucblocks = dib9000_read_unc_blocks,
2579};
2580
2581MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
2582MODULE_AUTHOR("Olivier Grenie <olivier.grenie@parrot.com>");
2583MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
2584MODULE_LICENSE("GPL");
2585