linux/drivers/media/usb/dvb-usb/af9005-fe.c
<<
>>
Prefs
   1/* Frontend part of the Linux driver for the Afatech 9005
   2 * USB1.1 DVB-T receiver.
   3 *
   4 * Copyright (C) 2007 Luca Olivetti (luca@ventoso.org)
   5 *
   6 * Thanks to Afatech who kindly provided information.
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21 *
  22 * see Documentation/dvb/README.dvb-usb for more information
  23 */
  24#include "af9005.h"
  25#include "af9005-script.h"
  26#include "mt2060.h"
  27#include "qt1010.h"
  28#include <asm/div64.h>
  29
  30struct af9005_fe_state {
  31        struct dvb_usb_device *d;
  32        fe_status_t stat;
  33
  34        /* retraining parameters */
  35        u32 original_fcw;
  36        u16 original_rf_top;
  37        u16 original_if_top;
  38        u16 original_if_min;
  39        u16 original_aci0_if_top;
  40        u16 original_aci1_if_top;
  41        u16 original_aci0_if_min;
  42        u8 original_if_unplug_th;
  43        u8 original_rf_unplug_th;
  44        u8 original_dtop_if_unplug_th;
  45        u8 original_dtop_rf_unplug_th;
  46
  47        /* statistics */
  48        u32 pre_vit_error_count;
  49        u32 pre_vit_bit_count;
  50        u32 ber;
  51        u32 post_vit_error_count;
  52        u32 post_vit_bit_count;
  53        u32 unc;
  54        u16 abort_count;
  55
  56        int opened;
  57        int strong;
  58        unsigned long next_status_check;
  59        struct dvb_frontend frontend;
  60};
  61
  62static int af9005_write_word_agc(struct dvb_usb_device *d, u16 reghi,
  63                                 u16 reglo, u8 pos, u8 len, u16 value)
  64{
  65        int ret;
  66
  67        if ((ret = af9005_write_ofdm_register(d, reglo, (u8) (value & 0xff))))
  68                return ret;
  69        return af9005_write_register_bits(d, reghi, pos, len,
  70                                          (u8) ((value & 0x300) >> 8));
  71}
  72
  73static int af9005_read_word_agc(struct dvb_usb_device *d, u16 reghi,
  74                                u16 reglo, u8 pos, u8 len, u16 * value)
  75{
  76        int ret;
  77        u8 temp0, temp1;
  78
  79        if ((ret = af9005_read_ofdm_register(d, reglo, &temp0)))
  80                return ret;
  81        if ((ret = af9005_read_ofdm_register(d, reghi, &temp1)))
  82                return ret;
  83        switch (pos) {
  84        case 0:
  85                *value = ((u16) (temp1 & 0x03) << 8) + (u16) temp0;
  86                break;
  87        case 2:
  88                *value = ((u16) (temp1 & 0x0C) << 6) + (u16) temp0;
  89                break;
  90        case 4:
  91                *value = ((u16) (temp1 & 0x30) << 4) + (u16) temp0;
  92                break;
  93        case 6:
  94                *value = ((u16) (temp1 & 0xC0) << 2) + (u16) temp0;
  95                break;
  96        default:
  97                err("invalid pos in read word agc");
  98                return -EINVAL;
  99        }
 100        return 0;
 101
 102}
 103
 104static int af9005_is_fecmon_available(struct dvb_frontend *fe, int *available)
 105{
 106        struct af9005_fe_state *state = fe->demodulator_priv;
 107        int ret;
 108        u8 temp;
 109
 110        *available = false;
 111
 112        ret = af9005_read_register_bits(state->d, xd_p_fec_vtb_rsd_mon_en,
 113                                        fec_vtb_rsd_mon_en_pos,
 114                                        fec_vtb_rsd_mon_en_len, &temp);
 115        if (ret)
 116                return ret;
 117        if (temp & 1) {
 118                ret =
 119                    af9005_read_register_bits(state->d,
 120                                              xd_p_reg_ofsm_read_rbc_en,
 121                                              reg_ofsm_read_rbc_en_pos,
 122                                              reg_ofsm_read_rbc_en_len, &temp);
 123                if (ret)
 124                        return ret;
 125                if ((temp & 1) == 0)
 126                        *available = true;
 127
 128        }
 129        return 0;
 130}
 131
 132static int af9005_get_post_vit_err_cw_count(struct dvb_frontend *fe,
 133                                            u32 * post_err_count,
 134                                            u32 * post_cw_count,
 135                                            u16 * abort_count)
 136{
 137        struct af9005_fe_state *state = fe->demodulator_priv;
 138        int ret;
 139        u32 err_count;
 140        u32 cw_count;
 141        u8 temp, temp0, temp1, temp2;
 142        u16 loc_abort_count;
 143
 144        *post_err_count = 0;
 145        *post_cw_count = 0;
 146
 147        /* check if error bit count is ready */
 148        ret =
 149            af9005_read_register_bits(state->d, xd_r_fec_rsd_ber_rdy,
 150                                      fec_rsd_ber_rdy_pos, fec_rsd_ber_rdy_len,
 151                                      &temp);
 152        if (ret)
 153                return ret;
 154        if (!temp) {
 155                deb_info("rsd counter not ready\n");
 156                return 100;
 157        }
 158        /* get abort count */
 159        ret =
 160            af9005_read_ofdm_register(state->d,
 161                                      xd_r_fec_rsd_abort_packet_cnt_7_0,
 162                                      &temp0);
 163        if (ret)
 164                return ret;
 165        ret =
 166            af9005_read_ofdm_register(state->d,
 167                                      xd_r_fec_rsd_abort_packet_cnt_15_8,
 168                                      &temp1);
 169        if (ret)
 170                return ret;
 171        loc_abort_count = ((u16) temp1 << 8) + temp0;
 172
 173        /* get error count */
 174        ret =
 175            af9005_read_ofdm_register(state->d, xd_r_fec_rsd_bit_err_cnt_7_0,
 176                                      &temp0);
 177        if (ret)
 178                return ret;
 179        ret =
 180            af9005_read_ofdm_register(state->d, xd_r_fec_rsd_bit_err_cnt_15_8,
 181                                      &temp1);
 182        if (ret)
 183                return ret;
 184        ret =
 185            af9005_read_ofdm_register(state->d, xd_r_fec_rsd_bit_err_cnt_23_16,
 186                                      &temp2);
 187        if (ret)
 188                return ret;
 189        err_count = ((u32) temp2 << 16) + ((u32) temp1 << 8) + temp0;
 190        *post_err_count = err_count - (u32) loc_abort_count *8 * 8;
 191
 192        /* get RSD packet number */
 193        ret =
 194            af9005_read_ofdm_register(state->d, xd_p_fec_rsd_packet_unit_7_0,
 195                                      &temp0);
 196        if (ret)
 197                return ret;
 198        ret =
 199            af9005_read_ofdm_register(state->d, xd_p_fec_rsd_packet_unit_15_8,
 200                                      &temp1);
 201        if (ret)
 202                return ret;
 203        cw_count = ((u32) temp1 << 8) + temp0;
 204        if (cw_count == 0) {
 205                err("wrong RSD packet count");
 206                return -EIO;
 207        }
 208        deb_info("POST abort count %d err count %d rsd packets %d\n",
 209                 loc_abort_count, err_count, cw_count);
 210        *post_cw_count = cw_count - (u32) loc_abort_count;
 211        *abort_count = loc_abort_count;
 212        return 0;
 213
 214}
 215
 216static int af9005_get_post_vit_ber(struct dvb_frontend *fe,
 217                                   u32 * post_err_count, u32 * post_cw_count,
 218                                   u16 * abort_count)
 219{
 220        u32 loc_cw_count = 0, loc_err_count;
 221        u16 loc_abort_count = 0;
 222        int ret;
 223
 224        ret =
 225            af9005_get_post_vit_err_cw_count(fe, &loc_err_count, &loc_cw_count,
 226                                             &loc_abort_count);
 227        if (ret)
 228                return ret;
 229        *post_err_count = loc_err_count;
 230        *post_cw_count = loc_cw_count * 204 * 8;
 231        *abort_count = loc_abort_count;
 232
 233        return 0;
 234}
 235
 236static int af9005_get_pre_vit_err_bit_count(struct dvb_frontend *fe,
 237                                            u32 * pre_err_count,
 238                                            u32 * pre_bit_count)
 239{
 240        struct af9005_fe_state *state = fe->demodulator_priv;
 241        u8 temp, temp0, temp1, temp2;
 242        u32 super_frame_count, x, bits;
 243        int ret;
 244
 245        ret =
 246            af9005_read_register_bits(state->d, xd_r_fec_vtb_ber_rdy,
 247                                      fec_vtb_ber_rdy_pos, fec_vtb_ber_rdy_len,
 248                                      &temp);
 249        if (ret)
 250                return ret;
 251        if (!temp) {
 252                deb_info("viterbi counter not ready\n");
 253                return 101;     /* ERR_APO_VTB_COUNTER_NOT_READY; */
 254        }
 255        ret =
 256            af9005_read_ofdm_register(state->d, xd_r_fec_vtb_err_bit_cnt_7_0,
 257                                      &temp0);
 258        if (ret)
 259                return ret;
 260        ret =
 261            af9005_read_ofdm_register(state->d, xd_r_fec_vtb_err_bit_cnt_15_8,
 262                                      &temp1);
 263        if (ret)
 264                return ret;
 265        ret =
 266            af9005_read_ofdm_register(state->d, xd_r_fec_vtb_err_bit_cnt_23_16,
 267                                      &temp2);
 268        if (ret)
 269                return ret;
 270        *pre_err_count = ((u32) temp2 << 16) + ((u32) temp1 << 8) + temp0;
 271
 272        ret =
 273            af9005_read_ofdm_register(state->d, xd_p_fec_super_frm_unit_7_0,
 274                                      &temp0);
 275        if (ret)
 276                return ret;
 277        ret =
 278            af9005_read_ofdm_register(state->d, xd_p_fec_super_frm_unit_15_8,
 279                                      &temp1);
 280        if (ret)
 281                return ret;
 282        super_frame_count = ((u32) temp1 << 8) + temp0;
 283        if (super_frame_count == 0) {
 284                deb_info("super frame count 0\n");
 285                return 102;
 286        }
 287
 288        /* read fft mode */
 289        ret =
 290            af9005_read_register_bits(state->d, xd_g_reg_tpsd_txmod,
 291                                      reg_tpsd_txmod_pos, reg_tpsd_txmod_len,
 292                                      &temp);
 293        if (ret)
 294                return ret;
 295        if (temp == 0) {
 296                /* 2K */
 297                x = 1512;
 298        } else if (temp == 1) {
 299                /* 8k */
 300                x = 6048;
 301        } else {
 302                err("Invalid fft mode");
 303                return -EINVAL;
 304        }
 305
 306        /* read modulation mode */
 307        ret =
 308            af9005_read_register_bits(state->d, xd_g_reg_tpsd_const,
 309                                      reg_tpsd_const_pos, reg_tpsd_const_len,
 310                                      &temp);
 311        if (ret)
 312                return ret;
 313        switch (temp) {
 314        case 0:         /* QPSK */
 315                bits = 2;
 316                break;
 317        case 1:         /* QAM_16 */
 318                bits = 4;
 319                break;
 320        case 2:         /* QAM_64 */
 321                bits = 6;
 322                break;
 323        default:
 324                err("invalid modulation mode");
 325                return -EINVAL;
 326        }
 327        *pre_bit_count = super_frame_count * 68 * 4 * x * bits;
 328        deb_info("PRE err count %d frame count %d bit count %d\n",
 329                 *pre_err_count, super_frame_count, *pre_bit_count);
 330        return 0;
 331}
 332
 333static int af9005_reset_pre_viterbi(struct dvb_frontend *fe)
 334{
 335        struct af9005_fe_state *state = fe->demodulator_priv;
 336        int ret;
 337
 338        /* set super frame count to 1 */
 339        ret =
 340            af9005_write_ofdm_register(state->d, xd_p_fec_super_frm_unit_7_0,
 341                                       1 & 0xff);
 342        if (ret)
 343                return ret;
 344        ret = af9005_write_ofdm_register(state->d, xd_p_fec_super_frm_unit_15_8,
 345                                         1 >> 8);
 346        if (ret)
 347                return ret;
 348        /* reset pre viterbi error count */
 349        ret =
 350            af9005_write_register_bits(state->d, xd_p_fec_vtb_ber_rst,
 351                                       fec_vtb_ber_rst_pos, fec_vtb_ber_rst_len,
 352                                       1);
 353
 354        return ret;
 355}
 356
 357static int af9005_reset_post_viterbi(struct dvb_frontend *fe)
 358{
 359        struct af9005_fe_state *state = fe->demodulator_priv;
 360        int ret;
 361
 362        /* set packet unit */
 363        ret =
 364            af9005_write_ofdm_register(state->d, xd_p_fec_rsd_packet_unit_7_0,
 365                                       10000 & 0xff);
 366        if (ret)
 367                return ret;
 368        ret =
 369            af9005_write_ofdm_register(state->d, xd_p_fec_rsd_packet_unit_15_8,
 370                                       10000 >> 8);
 371        if (ret)
 372                return ret;
 373        /* reset post viterbi error count */
 374        ret =
 375            af9005_write_register_bits(state->d, xd_p_fec_rsd_ber_rst,
 376                                       fec_rsd_ber_rst_pos, fec_rsd_ber_rst_len,
 377                                       1);
 378
 379        return ret;
 380}
 381
 382static int af9005_get_statistic(struct dvb_frontend *fe)
 383{
 384        struct af9005_fe_state *state = fe->demodulator_priv;
 385        int ret, fecavailable;
 386        u64 numerator, denominator;
 387
 388        deb_info("GET STATISTIC\n");
 389        ret = af9005_is_fecmon_available(fe, &fecavailable);
 390        if (ret)
 391                return ret;
 392        if (!fecavailable) {
 393                deb_info("fecmon not available\n");
 394                return 0;
 395        }
 396
 397        ret = af9005_get_pre_vit_err_bit_count(fe, &state->pre_vit_error_count,
 398                                               &state->pre_vit_bit_count);
 399        if (ret == 0) {
 400                af9005_reset_pre_viterbi(fe);
 401                if (state->pre_vit_bit_count > 0) {
 402                        /* according to v 0.0.4 of the dvb api ber should be a multiple
 403                           of 10E-9 so we have to multiply the error count by
 404                           10E9=1000000000 */
 405                        numerator =
 406                            (u64) state->pre_vit_error_count * (u64) 1000000000;
 407                        denominator = (u64) state->pre_vit_bit_count;
 408                        state->ber = do_div(numerator, denominator);
 409                } else {
 410                        state->ber = 0xffffffff;
 411                }
 412        }
 413
 414        ret = af9005_get_post_vit_ber(fe, &state->post_vit_error_count,
 415                                      &state->post_vit_bit_count,
 416                                      &state->abort_count);
 417        if (ret == 0) {
 418                ret = af9005_reset_post_viterbi(fe);
 419                state->unc += state->abort_count;
 420                if (ret)
 421                        return ret;
 422        }
 423        return 0;
 424}
 425
 426static int af9005_fe_refresh_state(struct dvb_frontend *fe)
 427{
 428        struct af9005_fe_state *state = fe->demodulator_priv;
 429        if (time_after(jiffies, state->next_status_check)) {
 430                deb_info("REFRESH STATE\n");
 431
 432                /* statistics */
 433                if (af9005_get_statistic(fe))
 434                        err("get_statistic_failed");
 435                state->next_status_check = jiffies + 250 * HZ / 1000;
 436        }
 437        return 0;
 438}
 439
 440static int af9005_fe_read_status(struct dvb_frontend *fe, fe_status_t * stat)
 441{
 442        struct af9005_fe_state *state = fe->demodulator_priv;
 443        u8 temp;
 444        int ret;
 445
 446        if (fe->ops.tuner_ops.release == NULL)
 447                return -ENODEV;
 448
 449        *stat = 0;
 450        ret = af9005_read_register_bits(state->d, xd_p_agc_lock,
 451                                        agc_lock_pos, agc_lock_len, &temp);
 452        if (ret)
 453                return ret;
 454        if (temp)
 455                *stat |= FE_HAS_SIGNAL;
 456
 457        ret = af9005_read_register_bits(state->d, xd_p_fd_tpsd_lock,
 458                                        fd_tpsd_lock_pos, fd_tpsd_lock_len,
 459                                        &temp);
 460        if (ret)
 461                return ret;
 462        if (temp)
 463                *stat |= FE_HAS_CARRIER;
 464
 465        ret = af9005_read_register_bits(state->d,
 466                                        xd_r_mp2if_sync_byte_locked,
 467                                        mp2if_sync_byte_locked_pos,
 468                                        mp2if_sync_byte_locked_pos, &temp);
 469        if (ret)
 470                return ret;
 471        if (temp)
 472                *stat |= FE_HAS_SYNC | FE_HAS_VITERBI | FE_HAS_LOCK;
 473        if (state->opened)
 474                af9005_led_control(state->d, *stat & FE_HAS_LOCK);
 475
 476        ret =
 477            af9005_read_register_bits(state->d, xd_p_reg_strong_sginal_detected,
 478                                      reg_strong_sginal_detected_pos,
 479                                      reg_strong_sginal_detected_len, &temp);
 480        if (ret)
 481                return ret;
 482        if (temp != state->strong) {
 483                deb_info("adjust for strong signal %d\n", temp);
 484                        state->strong = temp;
 485        }
 486        return 0;
 487}
 488
 489static int af9005_fe_read_ber(struct dvb_frontend *fe, u32 * ber)
 490{
 491        struct af9005_fe_state *state = fe->demodulator_priv;
 492        if (fe->ops.tuner_ops.release  == NULL)
 493                return -ENODEV;
 494        af9005_fe_refresh_state(fe);
 495        *ber = state->ber;
 496        return 0;
 497}
 498
 499static int af9005_fe_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
 500{
 501        struct af9005_fe_state *state = fe->demodulator_priv;
 502        if (fe->ops.tuner_ops.release == NULL)
 503                return -ENODEV;
 504        af9005_fe_refresh_state(fe);
 505        *unc = state->unc;
 506        return 0;
 507}
 508
 509static int af9005_fe_read_signal_strength(struct dvb_frontend *fe,
 510                                          u16 * strength)
 511{
 512        struct af9005_fe_state *state = fe->demodulator_priv;
 513        int ret;
 514        u8 if_gain, rf_gain;
 515
 516        if (fe->ops.tuner_ops.release == NULL)
 517                return -ENODEV;
 518        ret =
 519            af9005_read_ofdm_register(state->d, xd_r_reg_aagc_rf_gain,
 520                                      &rf_gain);
 521        if (ret)
 522                return ret;
 523        ret =
 524            af9005_read_ofdm_register(state->d, xd_r_reg_aagc_if_gain,
 525                                      &if_gain);
 526        if (ret)
 527                return ret;
 528        /* this value has no real meaning, but i don't have the tables that relate
 529           the rf and if gain with the dbm, so I just scale the value */
 530        *strength = (512 - rf_gain - if_gain) << 7;
 531        return 0;
 532}
 533
 534static int af9005_fe_read_snr(struct dvb_frontend *fe, u16 * snr)
 535{
 536        /* the snr can be derived from the ber and the modulation
 537           but I don't think this kind of complex calculations belong
 538           in the driver. I may be wrong.... */
 539        return -ENOSYS;
 540}
 541
 542static int af9005_fe_program_cfoe(struct dvb_usb_device *d, u32 bw)
 543{
 544        u8 temp0, temp1, temp2, temp3, buf[4];
 545        int ret;
 546        u32 NS_coeff1_2048Nu;
 547        u32 NS_coeff1_8191Nu;
 548        u32 NS_coeff1_8192Nu;
 549        u32 NS_coeff1_8193Nu;
 550        u32 NS_coeff2_2k;
 551        u32 NS_coeff2_8k;
 552
 553        switch (bw) {
 554        case 6000000:
 555                NS_coeff1_2048Nu = 0x2ADB6DC;
 556                NS_coeff1_8191Nu = 0xAB7313;
 557                NS_coeff1_8192Nu = 0xAB6DB7;
 558                NS_coeff1_8193Nu = 0xAB685C;
 559                NS_coeff2_2k = 0x156DB6E;
 560                NS_coeff2_8k = 0x55B6DC;
 561                break;
 562
 563        case 7000000:
 564                NS_coeff1_2048Nu = 0x3200001;
 565                NS_coeff1_8191Nu = 0xC80640;
 566                NS_coeff1_8192Nu = 0xC80000;
 567                NS_coeff1_8193Nu = 0xC7F9C0;
 568                NS_coeff2_2k = 0x1900000;
 569                NS_coeff2_8k = 0x640000;
 570                break;
 571
 572        case 8000000:
 573                NS_coeff1_2048Nu = 0x3924926;
 574                NS_coeff1_8191Nu = 0xE4996E;
 575                NS_coeff1_8192Nu = 0xE49249;
 576                NS_coeff1_8193Nu = 0xE48B25;
 577                NS_coeff2_2k = 0x1C92493;
 578                NS_coeff2_8k = 0x724925;
 579                break;
 580        default:
 581                err("Invalid bandwidth %d.", bw);
 582                return -EINVAL;
 583        }
 584
 585        /*
 586         *  write NS_coeff1_2048Nu
 587         */
 588
 589        temp0 = (u8) (NS_coeff1_2048Nu & 0x000000FF);
 590        temp1 = (u8) ((NS_coeff1_2048Nu & 0x0000FF00) >> 8);
 591        temp2 = (u8) ((NS_coeff1_2048Nu & 0x00FF0000) >> 16);
 592        temp3 = (u8) ((NS_coeff1_2048Nu & 0x03000000) >> 24);
 593
 594        /*  big endian to make 8051 happy */
 595        buf[0] = temp3;
 596        buf[1] = temp2;
 597        buf[2] = temp1;
 598        buf[3] = temp0;
 599
 600        /*  cfoe_NS_2k_coeff1_25_24 */
 601        ret = af9005_write_ofdm_register(d, 0xAE00, buf[0]);
 602        if (ret)
 603                return ret;
 604
 605        /*  cfoe_NS_2k_coeff1_23_16 */
 606        ret = af9005_write_ofdm_register(d, 0xAE01, buf[1]);
 607        if (ret)
 608                return ret;
 609
 610        /*  cfoe_NS_2k_coeff1_15_8 */
 611        ret = af9005_write_ofdm_register(d, 0xAE02, buf[2]);
 612        if (ret)
 613                return ret;
 614
 615        /*  cfoe_NS_2k_coeff1_7_0 */
 616        ret = af9005_write_ofdm_register(d, 0xAE03, buf[3]);
 617        if (ret)
 618                return ret;
 619
 620        /*
 621         *  write NS_coeff2_2k
 622         */
 623
 624        temp0 = (u8) ((NS_coeff2_2k & 0x0000003F));
 625        temp1 = (u8) ((NS_coeff2_2k & 0x00003FC0) >> 6);
 626        temp2 = (u8) ((NS_coeff2_2k & 0x003FC000) >> 14);
 627        temp3 = (u8) ((NS_coeff2_2k & 0x01C00000) >> 22);
 628
 629        /*  big endian to make 8051 happy */
 630        buf[0] = temp3;
 631        buf[1] = temp2;
 632        buf[2] = temp1;
 633        buf[3] = temp0;
 634
 635        ret = af9005_write_ofdm_register(d, 0xAE04, buf[0]);
 636        if (ret)
 637                return ret;
 638
 639        ret = af9005_write_ofdm_register(d, 0xAE05, buf[1]);
 640        if (ret)
 641                return ret;
 642
 643        ret = af9005_write_ofdm_register(d, 0xAE06, buf[2]);
 644        if (ret)
 645                return ret;
 646
 647        ret = af9005_write_ofdm_register(d, 0xAE07, buf[3]);
 648        if (ret)
 649                return ret;
 650
 651        /*
 652         *  write NS_coeff1_8191Nu
 653         */
 654
 655        temp0 = (u8) ((NS_coeff1_8191Nu & 0x000000FF));
 656        temp1 = (u8) ((NS_coeff1_8191Nu & 0x0000FF00) >> 8);
 657        temp2 = (u8) ((NS_coeff1_8191Nu & 0x00FFC000) >> 16);
 658        temp3 = (u8) ((NS_coeff1_8191Nu & 0x03000000) >> 24);
 659
 660        /*  big endian to make 8051 happy */
 661        buf[0] = temp3;
 662        buf[1] = temp2;
 663        buf[2] = temp1;
 664        buf[3] = temp0;
 665
 666        ret = af9005_write_ofdm_register(d, 0xAE08, buf[0]);
 667        if (ret)
 668                return ret;
 669
 670        ret = af9005_write_ofdm_register(d, 0xAE09, buf[1]);
 671        if (ret)
 672                return ret;
 673
 674        ret = af9005_write_ofdm_register(d, 0xAE0A, buf[2]);
 675        if (ret)
 676                return ret;
 677
 678        ret = af9005_write_ofdm_register(d, 0xAE0B, buf[3]);
 679        if (ret)
 680                return ret;
 681
 682        /*
 683         *  write NS_coeff1_8192Nu
 684         */
 685
 686        temp0 = (u8) (NS_coeff1_8192Nu & 0x000000FF);
 687        temp1 = (u8) ((NS_coeff1_8192Nu & 0x0000FF00) >> 8);
 688        temp2 = (u8) ((NS_coeff1_8192Nu & 0x00FFC000) >> 16);
 689        temp3 = (u8) ((NS_coeff1_8192Nu & 0x03000000) >> 24);
 690
 691        /*  big endian to make 8051 happy */
 692        buf[0] = temp3;
 693        buf[1] = temp2;
 694        buf[2] = temp1;
 695        buf[3] = temp0;
 696
 697        ret = af9005_write_ofdm_register(d, 0xAE0C, buf[0]);
 698        if (ret)
 699                return ret;
 700
 701        ret = af9005_write_ofdm_register(d, 0xAE0D, buf[1]);
 702        if (ret)
 703                return ret;
 704
 705        ret = af9005_write_ofdm_register(d, 0xAE0E, buf[2]);
 706        if (ret)
 707                return ret;
 708
 709        ret = af9005_write_ofdm_register(d, 0xAE0F, buf[3]);
 710        if (ret)
 711                return ret;
 712
 713        /*
 714         *  write NS_coeff1_8193Nu
 715         */
 716
 717        temp0 = (u8) ((NS_coeff1_8193Nu & 0x000000FF));
 718        temp1 = (u8) ((NS_coeff1_8193Nu & 0x0000FF00) >> 8);
 719        temp2 = (u8) ((NS_coeff1_8193Nu & 0x00FFC000) >> 16);
 720        temp3 = (u8) ((NS_coeff1_8193Nu & 0x03000000) >> 24);
 721
 722        /*  big endian to make 8051 happy */
 723        buf[0] = temp3;
 724        buf[1] = temp2;
 725        buf[2] = temp1;
 726        buf[3] = temp0;
 727
 728        ret = af9005_write_ofdm_register(d, 0xAE10, buf[0]);
 729        if (ret)
 730                return ret;
 731
 732        ret = af9005_write_ofdm_register(d, 0xAE11, buf[1]);
 733        if (ret)
 734                return ret;
 735
 736        ret = af9005_write_ofdm_register(d, 0xAE12, buf[2]);
 737        if (ret)
 738                return ret;
 739
 740        ret = af9005_write_ofdm_register(d, 0xAE13, buf[3]);
 741        if (ret)
 742                return ret;
 743
 744        /*
 745         *  write NS_coeff2_8k
 746         */
 747
 748        temp0 = (u8) ((NS_coeff2_8k & 0x0000003F));
 749        temp1 = (u8) ((NS_coeff2_8k & 0x00003FC0) >> 6);
 750        temp2 = (u8) ((NS_coeff2_8k & 0x003FC000) >> 14);
 751        temp3 = (u8) ((NS_coeff2_8k & 0x01C00000) >> 22);
 752
 753        /*  big endian to make 8051 happy */
 754        buf[0] = temp3;
 755        buf[1] = temp2;
 756        buf[2] = temp1;
 757        buf[3] = temp0;
 758
 759        ret = af9005_write_ofdm_register(d, 0xAE14, buf[0]);
 760        if (ret)
 761                return ret;
 762
 763        ret = af9005_write_ofdm_register(d, 0xAE15, buf[1]);
 764        if (ret)
 765                return ret;
 766
 767        ret = af9005_write_ofdm_register(d, 0xAE16, buf[2]);
 768        if (ret)
 769                return ret;
 770
 771        ret = af9005_write_ofdm_register(d, 0xAE17, buf[3]);
 772        return ret;
 773
 774}
 775
 776static int af9005_fe_select_bw(struct dvb_usb_device *d, u32 bw)
 777{
 778        u8 temp;
 779        switch (bw) {
 780        case 6000000:
 781                temp = 0;
 782                break;
 783        case 7000000:
 784                temp = 1;
 785                break;
 786        case 8000000:
 787                temp = 2;
 788                break;
 789        default:
 790                err("Invalid bandwidth %d.", bw);
 791                return -EINVAL;
 792        }
 793        return af9005_write_register_bits(d, xd_g_reg_bw, reg_bw_pos,
 794                                          reg_bw_len, temp);
 795}
 796
 797static int af9005_fe_power(struct dvb_frontend *fe, int on)
 798{
 799        struct af9005_fe_state *state = fe->demodulator_priv;
 800        u8 temp = on;
 801        int ret;
 802        deb_info("power %s tuner\n", on ? "on" : "off");
 803        ret = af9005_send_command(state->d, 0x03, &temp, 1, NULL, 0);
 804        return ret;
 805}
 806
 807static struct mt2060_config af9005_mt2060_config = {
 808        0xC0
 809};
 810
 811static struct qt1010_config af9005_qt1010_config = {
 812        0xC4
 813};
 814
 815static int af9005_fe_init(struct dvb_frontend *fe)
 816{
 817        struct af9005_fe_state *state = fe->demodulator_priv;
 818        struct dvb_usb_adapter *adap = fe->dvb->priv;
 819        int ret, i, scriptlen;
 820        u8 temp, temp0 = 0, temp1 = 0, temp2 = 0;
 821        u8 buf[2];
 822        u16 if1;
 823
 824        deb_info("in af9005_fe_init\n");
 825
 826        /* reset */
 827        deb_info("reset\n");
 828        if ((ret =
 829             af9005_write_register_bits(state->d, xd_I2C_reg_ofdm_rst_en,
 830                                        4, 1, 0x01)))
 831                return ret;
 832        if ((ret = af9005_write_ofdm_register(state->d, APO_REG_RESET, 0)))
 833                return ret;
 834        /* clear ofdm reset */
 835        deb_info("clear ofdm reset\n");
 836        for (i = 0; i < 150; i++) {
 837                if ((ret =
 838                     af9005_read_ofdm_register(state->d,
 839                                               xd_I2C_reg_ofdm_rst, &temp)))
 840                        return ret;
 841                if (temp & (regmask[reg_ofdm_rst_len - 1] << reg_ofdm_rst_pos))
 842                        break;
 843                msleep(10);
 844        }
 845        if (i == 150)
 846                return -ETIMEDOUT;
 847
 848        /*FIXME in the dump
 849           write B200 A9
 850           write xd_g_reg_ofsm_clk 7
 851           read eepr c6 (2)
 852           read eepr c7 (2)
 853           misc ctrl 3 -> 1
 854           read eepr ca (6)
 855           write xd_g_reg_ofsm_clk 0
 856           write B200 a1
 857         */
 858        ret = af9005_write_ofdm_register(state->d, 0xb200, 0xa9);
 859        if (ret)
 860                return ret;
 861        ret = af9005_write_ofdm_register(state->d, xd_g_reg_ofsm_clk, 0x07);
 862        if (ret)
 863                return ret;
 864        temp = 0x01;
 865        ret = af9005_send_command(state->d, 0x03, &temp, 1, NULL, 0);
 866        if (ret)
 867                return ret;
 868        ret = af9005_write_ofdm_register(state->d, xd_g_reg_ofsm_clk, 0x00);
 869        if (ret)
 870                return ret;
 871        ret = af9005_write_ofdm_register(state->d, 0xb200, 0xa1);
 872        if (ret)
 873                return ret;
 874
 875        temp = regmask[reg_ofdm_rst_len - 1] << reg_ofdm_rst_pos;
 876        if ((ret =
 877             af9005_write_register_bits(state->d, xd_I2C_reg_ofdm_rst,
 878                                        reg_ofdm_rst_pos, reg_ofdm_rst_len, 1)))
 879                return ret;
 880        ret = af9005_write_register_bits(state->d, xd_I2C_reg_ofdm_rst,
 881                                         reg_ofdm_rst_pos, reg_ofdm_rst_len, 0);
 882
 883        if (ret)
 884                return ret;
 885        /* don't know what register aefc is, but this is what the windows driver does */
 886        ret = af9005_write_ofdm_register(state->d, 0xaefc, 0);
 887        if (ret)
 888                return ret;
 889
 890        /* set stand alone chip */
 891        deb_info("set stand alone chip\n");
 892        if ((ret =
 893             af9005_write_register_bits(state->d, xd_p_reg_dca_stand_alone,
 894                                        reg_dca_stand_alone_pos,
 895                                        reg_dca_stand_alone_len, 1)))
 896                return ret;
 897
 898        /* set dca upper & lower chip */
 899        deb_info("set dca upper & lower chip\n");
 900        if ((ret =
 901             af9005_write_register_bits(state->d, xd_p_reg_dca_upper_chip,
 902                                        reg_dca_upper_chip_pos,
 903                                        reg_dca_upper_chip_len, 0)))
 904                return ret;
 905        if ((ret =
 906             af9005_write_register_bits(state->d, xd_p_reg_dca_lower_chip,
 907                                        reg_dca_lower_chip_pos,
 908                                        reg_dca_lower_chip_len, 0)))
 909                return ret;
 910
 911        /* set 2wire master clock to 0x14 (for 60KHz) */
 912        deb_info("set 2wire master clock to 0x14 (for 60KHz)\n");
 913        if ((ret =
 914             af9005_write_ofdm_register(state->d, xd_I2C_i2c_m_period, 0x14)))
 915                return ret;
 916
 917        /* clear dca enable chip */
 918        deb_info("clear dca enable chip\n");
 919        if ((ret =
 920             af9005_write_register_bits(state->d, xd_p_reg_dca_en,
 921                                        reg_dca_en_pos, reg_dca_en_len, 0)))
 922                return ret;
 923        /* FIXME these are register bits, but I don't know which ones */
 924        ret = af9005_write_ofdm_register(state->d, 0xa16c, 1);
 925        if (ret)
 926                return ret;
 927        ret = af9005_write_ofdm_register(state->d, 0xa3c1, 0);
 928        if (ret)
 929                return ret;
 930
 931        /* init other parameters: program cfoe and select bandwidth */
 932        deb_info("program cfoe\n");
 933        ret = af9005_fe_program_cfoe(state->d, 6000000);
 934        if (ret)
 935                return ret;
 936        /* set read-update bit for modulation */
 937        deb_info("set read-update bit for modulation\n");
 938        if ((ret =
 939             af9005_write_register_bits(state->d, xd_p_reg_feq_read_update,
 940                                        reg_feq_read_update_pos,
 941                                        reg_feq_read_update_len, 1)))
 942                return ret;
 943
 944        /* sample code has a set MPEG TS code here
 945           but sniffing reveals that it doesn't do it */
 946
 947        /* set read-update bit to 1 for DCA modulation */
 948        deb_info("set read-update bit 1 for DCA modulation\n");
 949        if ((ret =
 950             af9005_write_register_bits(state->d, xd_p_reg_dca_read_update,
 951                                        reg_dca_read_update_pos,
 952                                        reg_dca_read_update_len, 1)))
 953                return ret;
 954
 955        /* enable fec monitor */
 956        deb_info("enable fec monitor\n");
 957        if ((ret =
 958             af9005_write_register_bits(state->d, xd_p_fec_vtb_rsd_mon_en,
 959                                        fec_vtb_rsd_mon_en_pos,
 960                                        fec_vtb_rsd_mon_en_len, 1)))
 961                return ret;
 962
 963        /* FIXME should be register bits, I don't know which ones */
 964        ret = af9005_write_ofdm_register(state->d, 0xa601, 0);
 965
 966        /* set api_retrain_never_freeze */
 967        deb_info("set api_retrain_never_freeze\n");
 968        if ((ret = af9005_write_ofdm_register(state->d, 0xaefb, 0x01)))
 969                return ret;
 970
 971        /* load init script */
 972        deb_info("load init script\n");
 973        scriptlen = sizeof(script) / sizeof(RegDesc);
 974        for (i = 0; i < scriptlen; i++) {
 975                if ((ret =
 976                     af9005_write_register_bits(state->d, script[i].reg,
 977                                                script[i].pos,
 978                                                script[i].len, script[i].val)))
 979                        return ret;
 980                /* save 3 bytes of original fcw */
 981                if (script[i].reg == 0xae18)
 982                        temp2 = script[i].val;
 983                if (script[i].reg == 0xae19)
 984                        temp1 = script[i].val;
 985                if (script[i].reg == 0xae1a)
 986                        temp0 = script[i].val;
 987
 988                /* save original unplug threshold */
 989                if (script[i].reg == xd_p_reg_unplug_th)
 990                        state->original_if_unplug_th = script[i].val;
 991                if (script[i].reg == xd_p_reg_unplug_rf_gain_th)
 992                        state->original_rf_unplug_th = script[i].val;
 993                if (script[i].reg == xd_p_reg_unplug_dtop_if_gain_th)
 994                        state->original_dtop_if_unplug_th = script[i].val;
 995                if (script[i].reg == xd_p_reg_unplug_dtop_rf_gain_th)
 996                        state->original_dtop_rf_unplug_th = script[i].val;
 997
 998        }
 999        state->original_fcw =
1000            ((u32) temp2 << 16) + ((u32) temp1 << 8) + (u32) temp0;
1001
1002
1003        /* save original TOPs */
1004        deb_info("save original TOPs\n");
1005
1006        /*  RF TOP */
1007        ret =
1008            af9005_read_word_agc(state->d,
1009                                 xd_p_reg_aagc_rf_top_numerator_9_8,
1010                                 xd_p_reg_aagc_rf_top_numerator_7_0, 0, 2,
1011                                 &state->original_rf_top);
1012        if (ret)
1013                return ret;
1014
1015        /*  IF TOP */
1016        ret =
1017            af9005_read_word_agc(state->d,
1018                                 xd_p_reg_aagc_if_top_numerator_9_8,
1019                                 xd_p_reg_aagc_if_top_numerator_7_0, 0, 2,
1020                                 &state->original_if_top);
1021        if (ret)
1022                return ret;
1023
1024        /*  ACI 0 IF TOP */
1025        ret =
1026            af9005_read_word_agc(state->d, 0xA60E, 0xA60A, 4, 2,
1027                                 &state->original_aci0_if_top);
1028        if (ret)
1029                return ret;
1030
1031        /*  ACI 1 IF TOP */
1032        ret =
1033            af9005_read_word_agc(state->d, 0xA60E, 0xA60B, 6, 2,
1034                                 &state->original_aci1_if_top);
1035        if (ret)
1036                return ret;
1037
1038        /* attach tuner and init */
1039        if (fe->ops.tuner_ops.release == NULL) {
1040                /* read tuner and board id from eeprom */
1041                ret = af9005_read_eeprom(adap->dev, 0xc6, buf, 2);
1042                if (ret) {
1043                        err("Impossible to read EEPROM\n");
1044                        return ret;
1045                }
1046                deb_info("Tuner id %d, board id %d\n", buf[0], buf[1]);
1047                switch (buf[0]) {
1048                case 2: /* MT2060 */
1049                        /* read if1 from eeprom */
1050                        ret = af9005_read_eeprom(adap->dev, 0xc8, buf, 2);
1051                        if (ret) {
1052                                err("Impossible to read EEPROM\n");
1053                                return ret;
1054                        }
1055                        if1 = (u16) (buf[0] << 8) + buf[1];
1056                        if (dvb_attach(mt2060_attach, fe, &adap->dev->i2c_adap,
1057                                         &af9005_mt2060_config, if1) == NULL) {
1058                                deb_info("MT2060 attach failed\n");
1059                                return -ENODEV;
1060                        }
1061                        break;
1062                case 3: /* QT1010 */
1063                case 9: /* QT1010B */
1064                        if (dvb_attach(qt1010_attach, fe, &adap->dev->i2c_adap,
1065                                        &af9005_qt1010_config) ==NULL) {
1066                                deb_info("QT1010 attach failed\n");
1067                                return -ENODEV;
1068                        }
1069                        break;
1070                default:
1071                        err("Unsupported tuner type %d", buf[0]);
1072                        return -ENODEV;
1073                }
1074                ret = fe->ops.tuner_ops.init(fe);
1075                if (ret)
1076                        return ret;
1077        }
1078
1079        deb_info("profit!\n");
1080        return 0;
1081}
1082
1083static int af9005_fe_sleep(struct dvb_frontend *fe)
1084{
1085        return af9005_fe_power(fe, 0);
1086}
1087
1088static int af9005_ts_bus_ctrl(struct dvb_frontend *fe, int acquire)
1089{
1090        struct af9005_fe_state *state = fe->demodulator_priv;
1091
1092        if (acquire) {
1093                state->opened++;
1094        } else {
1095
1096                state->opened--;
1097                if (!state->opened)
1098                        af9005_led_control(state->d, 0);
1099        }
1100        return 0;
1101}
1102
1103static int af9005_fe_set_frontend(struct dvb_frontend *fe)
1104{
1105        struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
1106        struct af9005_fe_state *state = fe->demodulator_priv;
1107        int ret;
1108        u8 temp, temp0, temp1, temp2;
1109
1110        deb_info("af9005_fe_set_frontend freq %d bw %d\n", fep->frequency,
1111                 fep->bandwidth_hz);
1112        if (fe->ops.tuner_ops.release == NULL) {
1113                err("Tuner not attached");
1114                return -ENODEV;
1115        }
1116
1117        deb_info("turn off led\n");
1118        /* not in the log */
1119        ret = af9005_led_control(state->d, 0);
1120        if (ret)
1121                return ret;
1122        /* not sure about the bits */
1123        ret = af9005_write_register_bits(state->d, XD_MP2IF_MISC, 2, 1, 0);
1124        if (ret)
1125                return ret;
1126
1127        /* set FCW to default value */
1128        deb_info("set FCW to default value\n");
1129        temp0 = (u8) (state->original_fcw & 0x000000ff);
1130        temp1 = (u8) ((state->original_fcw & 0x0000ff00) >> 8);
1131        temp2 = (u8) ((state->original_fcw & 0x00ff0000) >> 16);
1132        ret = af9005_write_ofdm_register(state->d, 0xae1a, temp0);
1133        if (ret)
1134                return ret;
1135        ret = af9005_write_ofdm_register(state->d, 0xae19, temp1);
1136        if (ret)
1137                return ret;
1138        ret = af9005_write_ofdm_register(state->d, 0xae18, temp2);
1139        if (ret)
1140                return ret;
1141
1142        /* restore original TOPs */
1143        deb_info("restore original TOPs\n");
1144        ret =
1145            af9005_write_word_agc(state->d,
1146                                  xd_p_reg_aagc_rf_top_numerator_9_8,
1147                                  xd_p_reg_aagc_rf_top_numerator_7_0, 0, 2,
1148                                  state->original_rf_top);
1149        if (ret)
1150                return ret;
1151        ret =
1152            af9005_write_word_agc(state->d,
1153                                  xd_p_reg_aagc_if_top_numerator_9_8,
1154                                  xd_p_reg_aagc_if_top_numerator_7_0, 0, 2,
1155                                  state->original_if_top);
1156        if (ret)
1157                return ret;
1158        ret =
1159            af9005_write_word_agc(state->d, 0xA60E, 0xA60A, 4, 2,
1160                                  state->original_aci0_if_top);
1161        if (ret)
1162                return ret;
1163        ret =
1164            af9005_write_word_agc(state->d, 0xA60E, 0xA60B, 6, 2,
1165                                  state->original_aci1_if_top);
1166        if (ret)
1167                return ret;
1168
1169        /* select bandwidth */
1170        deb_info("select bandwidth");
1171        ret = af9005_fe_select_bw(state->d, fep->bandwidth_hz);
1172        if (ret)
1173                return ret;
1174        ret = af9005_fe_program_cfoe(state->d, fep->bandwidth_hz);
1175        if (ret)
1176                return ret;
1177
1178        /* clear easy mode flag */
1179        deb_info("clear easy mode flag\n");
1180        ret = af9005_write_ofdm_register(state->d, 0xaefd, 0);
1181        if (ret)
1182                return ret;
1183
1184        /* set unplug threshold to original value */
1185        deb_info("set unplug threshold to original value\n");
1186        ret =
1187            af9005_write_ofdm_register(state->d, xd_p_reg_unplug_th,
1188                                       state->original_if_unplug_th);
1189        if (ret)
1190                return ret;
1191        /* set tuner */
1192        deb_info("set tuner\n");
1193        ret = fe->ops.tuner_ops.set_params(fe);
1194        if (ret)
1195                return ret;
1196
1197        /* trigger ofsm */
1198        deb_info("trigger ofsm\n");
1199        temp = 0;
1200        ret = af9005_write_tuner_registers(state->d, 0xffff, &temp, 1);
1201        if (ret)
1202                return ret;
1203
1204        /* clear retrain and freeze flag */
1205        deb_info("clear retrain and freeze flag\n");
1206        ret =
1207            af9005_write_register_bits(state->d,
1208                                       xd_p_reg_api_retrain_request,
1209                                       reg_api_retrain_request_pos, 2, 0);
1210        if (ret)
1211                return ret;
1212
1213        /* reset pre viterbi and post viterbi registers and statistics */
1214        af9005_reset_pre_viterbi(fe);
1215        af9005_reset_post_viterbi(fe);
1216        state->pre_vit_error_count = 0;
1217        state->pre_vit_bit_count = 0;
1218        state->ber = 0;
1219        state->post_vit_error_count = 0;
1220        /* state->unc = 0; commented out since it should be ever increasing */
1221        state->abort_count = 0;
1222
1223        state->next_status_check = jiffies;
1224        state->strong = -1;
1225
1226        return 0;
1227}
1228
1229static int af9005_fe_get_frontend(struct dvb_frontend *fe)
1230{
1231        struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
1232        struct af9005_fe_state *state = fe->demodulator_priv;
1233        int ret;
1234        u8 temp;
1235
1236        /* mode */
1237        ret =
1238            af9005_read_register_bits(state->d, xd_g_reg_tpsd_const,
1239                                      reg_tpsd_const_pos, reg_tpsd_const_len,
1240                                      &temp);
1241        if (ret)
1242                return ret;
1243        deb_info("===== fe_get_frontend_legacy = =============\n");
1244        deb_info("CONSTELLATION ");
1245        switch (temp) {
1246        case 0:
1247                fep->modulation = QPSK;
1248                deb_info("QPSK\n");
1249                break;
1250        case 1:
1251                fep->modulation = QAM_16;
1252                deb_info("QAM_16\n");
1253                break;
1254        case 2:
1255                fep->modulation = QAM_64;
1256                deb_info("QAM_64\n");
1257                break;
1258        }
1259
1260        /* tps hierarchy and alpha value */
1261        ret =
1262            af9005_read_register_bits(state->d, xd_g_reg_tpsd_hier,
1263                                      reg_tpsd_hier_pos, reg_tpsd_hier_len,
1264                                      &temp);
1265        if (ret)
1266                return ret;
1267        deb_info("HIERARCHY ");
1268        switch (temp) {
1269        case 0:
1270                fep->hierarchy = HIERARCHY_NONE;
1271                deb_info("NONE\n");
1272                break;
1273        case 1:
1274                fep->hierarchy = HIERARCHY_1;
1275                deb_info("1\n");
1276                break;
1277        case 2:
1278                fep->hierarchy = HIERARCHY_2;
1279                deb_info("2\n");
1280                break;
1281        case 3:
1282                fep->hierarchy = HIERARCHY_4;
1283                deb_info("4\n");
1284                break;
1285        }
1286
1287        /*  high/low priority     */
1288        ret =
1289            af9005_read_register_bits(state->d, xd_g_reg_dec_pri,
1290                                      reg_dec_pri_pos, reg_dec_pri_len, &temp);
1291        if (ret)
1292                return ret;
1293        /* if temp is set = high priority */
1294        deb_info("PRIORITY %s\n", temp ? "high" : "low");
1295
1296        /* high coderate */
1297        ret =
1298            af9005_read_register_bits(state->d, xd_g_reg_tpsd_hpcr,
1299                                      reg_tpsd_hpcr_pos, reg_tpsd_hpcr_len,
1300                                      &temp);
1301        if (ret)
1302                return ret;
1303        deb_info("CODERATE HP ");
1304        switch (temp) {
1305        case 0:
1306                fep->code_rate_HP = FEC_1_2;
1307                deb_info("FEC_1_2\n");
1308                break;
1309        case 1:
1310                fep->code_rate_HP = FEC_2_3;
1311                deb_info("FEC_2_3\n");
1312                break;
1313        case 2:
1314                fep->code_rate_HP = FEC_3_4;
1315                deb_info("FEC_3_4\n");
1316                break;
1317        case 3:
1318                fep->code_rate_HP = FEC_5_6;
1319                deb_info("FEC_5_6\n");
1320                break;
1321        case 4:
1322                fep->code_rate_HP = FEC_7_8;
1323                deb_info("FEC_7_8\n");
1324                break;
1325        }
1326
1327        /* low coderate */
1328        ret =
1329            af9005_read_register_bits(state->d, xd_g_reg_tpsd_lpcr,
1330                                      reg_tpsd_lpcr_pos, reg_tpsd_lpcr_len,
1331                                      &temp);
1332        if (ret)
1333                return ret;
1334        deb_info("CODERATE LP ");
1335        switch (temp) {
1336        case 0:
1337                fep->code_rate_LP = FEC_1_2;
1338                deb_info("FEC_1_2\n");
1339                break;
1340        case 1:
1341                fep->code_rate_LP = FEC_2_3;
1342                deb_info("FEC_2_3\n");
1343                break;
1344        case 2:
1345                fep->code_rate_LP = FEC_3_4;
1346                deb_info("FEC_3_4\n");
1347                break;
1348        case 3:
1349                fep->code_rate_LP = FEC_5_6;
1350                deb_info("FEC_5_6\n");
1351                break;
1352        case 4:
1353                fep->code_rate_LP = FEC_7_8;
1354                deb_info("FEC_7_8\n");
1355                break;
1356        }
1357
1358        /* guard interval */
1359        ret =
1360            af9005_read_register_bits(state->d, xd_g_reg_tpsd_gi,
1361                                      reg_tpsd_gi_pos, reg_tpsd_gi_len, &temp);
1362        if (ret)
1363                return ret;
1364        deb_info("GUARD INTERVAL ");
1365        switch (temp) {
1366        case 0:
1367                fep->guard_interval = GUARD_INTERVAL_1_32;
1368                deb_info("1_32\n");
1369                break;
1370        case 1:
1371                fep->guard_interval = GUARD_INTERVAL_1_16;
1372                deb_info("1_16\n");
1373                break;
1374        case 2:
1375                fep->guard_interval = GUARD_INTERVAL_1_8;
1376                deb_info("1_8\n");
1377                break;
1378        case 3:
1379                fep->guard_interval = GUARD_INTERVAL_1_4;
1380                deb_info("1_4\n");
1381                break;
1382        }
1383
1384        /* fft */
1385        ret =
1386            af9005_read_register_bits(state->d, xd_g_reg_tpsd_txmod,
1387                                      reg_tpsd_txmod_pos, reg_tpsd_txmod_len,
1388                                      &temp);
1389        if (ret)
1390                return ret;
1391        deb_info("TRANSMISSION MODE ");
1392        switch (temp) {
1393        case 0:
1394                fep->transmission_mode = TRANSMISSION_MODE_2K;
1395                deb_info("2K\n");
1396                break;
1397        case 1:
1398                fep->transmission_mode = TRANSMISSION_MODE_8K;
1399                deb_info("8K\n");
1400                break;
1401        }
1402
1403        /* bandwidth      */
1404        ret =
1405            af9005_read_register_bits(state->d, xd_g_reg_bw, reg_bw_pos,
1406                                      reg_bw_len, &temp);
1407        deb_info("BANDWIDTH ");
1408        switch (temp) {
1409        case 0:
1410                fep->bandwidth_hz = 6000000;
1411                deb_info("6\n");
1412                break;
1413        case 1:
1414                fep->bandwidth_hz = 7000000;
1415                deb_info("7\n");
1416                break;
1417        case 2:
1418                fep->bandwidth_hz = 8000000;
1419                deb_info("8\n");
1420                break;
1421        }
1422        return 0;
1423}
1424
1425static void af9005_fe_release(struct dvb_frontend *fe)
1426{
1427        struct af9005_fe_state *state =
1428            (struct af9005_fe_state *)fe->demodulator_priv;
1429        kfree(state);
1430}
1431
1432static struct dvb_frontend_ops af9005_fe_ops;
1433
1434struct dvb_frontend *af9005_fe_attach(struct dvb_usb_device *d)
1435{
1436        struct af9005_fe_state *state = NULL;
1437
1438        /* allocate memory for the internal state */
1439        state = kzalloc(sizeof(struct af9005_fe_state), GFP_KERNEL);
1440        if (state == NULL)
1441                goto error;
1442
1443        deb_info("attaching frontend af9005\n");
1444
1445        state->d = d;
1446        state->opened = 0;
1447
1448        memcpy(&state->frontend.ops, &af9005_fe_ops,
1449               sizeof(struct dvb_frontend_ops));
1450        state->frontend.demodulator_priv = state;
1451
1452        return &state->frontend;
1453      error:
1454        return NULL;
1455}
1456
1457static struct dvb_frontend_ops af9005_fe_ops = {
1458        .delsys = { SYS_DVBT },
1459        .info = {
1460                 .name = "AF9005 USB DVB-T",
1461                 .frequency_min = 44250000,
1462                 .frequency_max = 867250000,
1463                 .frequency_stepsize = 250000,
1464                 .caps = FE_CAN_INVERSION_AUTO |
1465                 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
1466                 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
1467                 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
1468                 FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO |
1469                 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER |
1470                 FE_CAN_HIERARCHY_AUTO,
1471                 },
1472
1473        .release = af9005_fe_release,
1474
1475        .init = af9005_fe_init,
1476        .sleep = af9005_fe_sleep,
1477        .ts_bus_ctrl = af9005_ts_bus_ctrl,
1478
1479        .set_frontend = af9005_fe_set_frontend,
1480        .get_frontend = af9005_fe_get_frontend,
1481
1482        .read_status = af9005_fe_read_status,
1483        .read_ber = af9005_fe_read_ber,
1484        .read_signal_strength = af9005_fe_read_signal_strength,
1485        .read_snr = af9005_fe_read_snr,
1486        .read_ucblocks = af9005_fe_read_unc_blocks,
1487};
1488