Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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