linux/drivers/media/usb/dvb-usb-v2/anysee.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * DVB USB Linux driver for Anysee E30 DVB-C & DVB-T USB2.0 receiver
   4 *
   5 * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
   6 *
   7 * TODO:
   8 * - add smart card reader support for Conditional Access (CA)
   9 *
  10 * Card reader in Anysee is nothing more than ISO 7816 card reader.
  11 * There is no hardware CAM in any Anysee device sold.
  12 * In my understanding it should be implemented by making own module
  13 * for ISO 7816 card reader, like dvb_ca_en50221 is implemented. This
  14 * module registers serial interface that can be used to communicate
  15 * with any ISO 7816 smart card.
  16 *
  17 * Any help according to implement serial smart card reader support
  18 * is highly welcome!
  19 */
  20
  21#include "anysee.h"
  22#include "dvb-pll.h"
  23#include "tda1002x.h"
  24#include "mt352.h"
  25#include "mt352_priv.h"
  26#include "zl10353.h"
  27#include "tda18212.h"
  28#include "cx24116.h"
  29#include "stv0900.h"
  30#include "stv6110.h"
  31#include "isl6423.h"
  32#include "cxd2820r.h"
  33
  34DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  35
  36static int anysee_ctrl_msg(struct dvb_usb_device *d,
  37                u8 *sbuf, u8 slen, u8 *rbuf, u8 rlen)
  38{
  39        struct anysee_state *state = d_to_priv(d);
  40        int act_len, ret, i;
  41
  42        mutex_lock(&d->usb_mutex);
  43
  44        memcpy(&state->buf[0], sbuf, slen);
  45        state->buf[60] = state->seq++;
  46
  47        dev_dbg(&d->udev->dev, "%s: >>> %*ph\n", __func__, slen, state->buf);
  48
  49        /* We need receive one message more after dvb_usb_generic_rw due
  50           to weird transaction flow, which is 1 x send + 2 x receive. */
  51        ret = dvb_usbv2_generic_rw_locked(d, state->buf, sizeof(state->buf),
  52                        state->buf, sizeof(state->buf));
  53        if (ret)
  54                goto error_unlock;
  55
  56        /* TODO FIXME: dvb_usb_generic_rw() fails rarely with error code -32
  57         * (EPIPE, Broken pipe). Function supports currently msleep() as a
  58         * parameter but I would not like to use it, since according to
  59         * Documentation/timers/timers-howto.rst it should not be used such
  60         * short, under < 20ms, sleeps. Repeating failed message would be
  61         * better choice as not to add unwanted delays...
  62         * Fixing that correctly is one of those or both;
  63         * 1) use repeat if possible
  64         * 2) add suitable delay
  65         */
  66
  67        /* get answer, retry few times if error returned */
  68        for (i = 0; i < 3; i++) {
  69                /* receive 2nd answer */
  70                ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
  71                                d->props->generic_bulk_ctrl_endpoint),
  72                                state->buf, sizeof(state->buf), &act_len, 2000);
  73                if (ret) {
  74                        dev_dbg(&d->udev->dev,
  75                                        "%s: recv bulk message failed=%d\n",
  76                                        __func__, ret);
  77                } else {
  78                        dev_dbg(&d->udev->dev, "%s: <<< %*ph\n", __func__,
  79                                        rlen, state->buf);
  80
  81                        if (state->buf[63] != 0x4f)
  82                                dev_dbg(&d->udev->dev,
  83                                                "%s: cmd failed\n", __func__);
  84                        break;
  85                }
  86        }
  87
  88        if (ret) {
  89                /* all retries failed, it is fatal */
  90                dev_err(&d->udev->dev, "%s: recv bulk message failed=%d\n",
  91                                KBUILD_MODNAME, ret);
  92                goto error_unlock;
  93        }
  94
  95        /* read request, copy returned data to return buf */
  96        if (rbuf && rlen)
  97                memcpy(rbuf, state->buf, rlen);
  98
  99error_unlock:
 100        mutex_unlock(&d->usb_mutex);
 101        return ret;
 102}
 103
 104static int anysee_read_reg(struct dvb_usb_device *d, u16 reg, u8 *val)
 105{
 106        u8 buf[] = {CMD_REG_READ, reg >> 8, reg & 0xff, 0x01};
 107        int ret;
 108        ret = anysee_ctrl_msg(d, buf, sizeof(buf), val, 1);
 109        dev_dbg(&d->udev->dev, "%s: reg=%04x val=%02x\n", __func__, reg, *val);
 110        return ret;
 111}
 112
 113static int anysee_write_reg(struct dvb_usb_device *d, u16 reg, u8 val)
 114{
 115        u8 buf[] = {CMD_REG_WRITE, reg >> 8, reg & 0xff, 0x01, val};
 116        dev_dbg(&d->udev->dev, "%s: reg=%04x val=%02x\n", __func__, reg, val);
 117        return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
 118}
 119
 120/* write single register with mask */
 121static int anysee_wr_reg_mask(struct dvb_usb_device *d, u16 reg, u8 val,
 122        u8 mask)
 123{
 124        int ret;
 125        u8 tmp;
 126
 127        /* no need for read if whole reg is written */
 128        if (mask != 0xff) {
 129                ret = anysee_read_reg(d, reg, &tmp);
 130                if (ret)
 131                        return ret;
 132
 133                val &= mask;
 134                tmp &= ~mask;
 135                val |= tmp;
 136        }
 137
 138        return anysee_write_reg(d, reg, val);
 139}
 140
 141/* read single register with mask */
 142static int anysee_rd_reg_mask(struct dvb_usb_device *d, u16 reg, u8 *val,
 143        u8 mask)
 144{
 145        int ret, i;
 146        u8 tmp;
 147
 148        ret = anysee_read_reg(d, reg, &tmp);
 149        if (ret)
 150                return ret;
 151
 152        tmp &= mask;
 153
 154        /* find position of the first bit */
 155        for (i = 0; i < 8; i++) {
 156                if ((mask >> i) & 0x01)
 157                        break;
 158        }
 159        *val = tmp >> i;
 160
 161        return 0;
 162}
 163
 164static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
 165{
 166        u8 buf[] = {CMD_GET_HW_INFO};
 167        return anysee_ctrl_msg(d, buf, sizeof(buf), id, 3);
 168}
 169
 170static int anysee_streaming_ctrl(struct dvb_frontend *fe, int onoff)
 171{
 172        u8 buf[] = {CMD_STREAMING_CTRL, (u8)onoff, 0x00};
 173        dev_dbg(&fe_to_d(fe)->udev->dev, "%s: onoff=%d\n", __func__, onoff);
 174        return anysee_ctrl_msg(fe_to_d(fe), buf, sizeof(buf), NULL, 0);
 175}
 176
 177static int anysee_led_ctrl(struct dvb_usb_device *d, u8 mode, u8 interval)
 178{
 179        u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x01, mode, interval};
 180        dev_dbg(&d->udev->dev, "%s: state=%d interval=%d\n", __func__,
 181                        mode, interval);
 182        return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
 183}
 184
 185static int anysee_ir_ctrl(struct dvb_usb_device *d, u8 onoff)
 186{
 187        u8 buf[] = {CMD_LED_AND_IR_CTRL, 0x02, onoff};
 188        dev_dbg(&d->udev->dev, "%s: onoff=%d\n", __func__, onoff);
 189        return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
 190}
 191
 192/* I2C */
 193static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
 194        int num)
 195{
 196        struct dvb_usb_device *d = i2c_get_adapdata(adap);
 197        int ret = 0, inc, i = 0;
 198        u8 buf[52]; /* 4 + 48 (I2C WR USB command header + I2C WR max) */
 199
 200        if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
 201                return -EAGAIN;
 202
 203        while (i < num) {
 204                if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
 205                        if (msg[i].len > 2 || msg[i+1].len > 60) {
 206                                ret = -EOPNOTSUPP;
 207                                break;
 208                        }
 209                        buf[0] = CMD_I2C_READ;
 210                        buf[1] = (msg[i].addr << 1) | 0x01;
 211                        buf[2] = msg[i].buf[0];
 212                        buf[3] = msg[i].buf[1];
 213                        buf[4] = msg[i].len-1;
 214                        buf[5] = msg[i+1].len;
 215                        ret = anysee_ctrl_msg(d, buf, 6, msg[i+1].buf,
 216                                msg[i+1].len);
 217                        inc = 2;
 218                } else {
 219                        if (msg[i].len > 48) {
 220                                ret = -EOPNOTSUPP;
 221                                break;
 222                        }
 223                        buf[0] = CMD_I2C_WRITE;
 224                        buf[1] = (msg[i].addr << 1);
 225                        buf[2] = msg[i].len;
 226                        buf[3] = 0x01;
 227                        memcpy(&buf[4], msg[i].buf, msg[i].len);
 228                        ret = anysee_ctrl_msg(d, buf, 4 + msg[i].len, NULL, 0);
 229                        inc = 1;
 230                }
 231                if (ret)
 232                        break;
 233
 234                i += inc;
 235        }
 236
 237        mutex_unlock(&d->i2c_mutex);
 238
 239        return ret ? ret : i;
 240}
 241
 242static u32 anysee_i2c_func(struct i2c_adapter *adapter)
 243{
 244        return I2C_FUNC_I2C;
 245}
 246
 247static struct i2c_algorithm anysee_i2c_algo = {
 248        .master_xfer   = anysee_master_xfer,
 249        .functionality = anysee_i2c_func,
 250};
 251
 252static int anysee_mt352_demod_init(struct dvb_frontend *fe)
 253{
 254        static u8 clock_config[]   = { CLOCK_CTL,  0x38, 0x28 };
 255        static u8 reset[]          = { RESET,      0x80 };
 256        static u8 adc_ctl_1_cfg[]  = { ADC_CTL_1,  0x40 };
 257        static u8 agc_cfg[]        = { AGC_TARGET, 0x28, 0x20 };
 258        static u8 gpp_ctl_cfg[]    = { GPP_CTL,    0x33 };
 259        static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
 260
 261        mt352_write(fe, clock_config,   sizeof(clock_config));
 262        udelay(200);
 263        mt352_write(fe, reset,          sizeof(reset));
 264        mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
 265
 266        mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
 267        mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
 268        mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
 269
 270        return 0;
 271}
 272
 273/* Callbacks for DVB USB */
 274static struct tda10023_config anysee_tda10023_config = {
 275        .demod_address = (0x1a >> 1),
 276        .invert = 0,
 277        .xtal   = 16000000,
 278        .pll_m  = 11,
 279        .pll_p  = 3,
 280        .pll_n  = 1,
 281        .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
 282        .deltaf = 0xfeeb,
 283};
 284
 285static struct mt352_config anysee_mt352_config = {
 286        .demod_address = (0x1e >> 1),
 287        .demod_init    = anysee_mt352_demod_init,
 288};
 289
 290static struct zl10353_config anysee_zl10353_config = {
 291        .demod_address = (0x1e >> 1),
 292        .parallel_ts = 1,
 293};
 294
 295static struct zl10353_config anysee_zl10353_tda18212_config2 = {
 296        .demod_address = (0x1e >> 1),
 297        .parallel_ts = 1,
 298        .disable_i2c_gate_ctrl = 1,
 299        .no_tuner = 1,
 300        .if2 = 41500,
 301};
 302
 303static struct zl10353_config anysee_zl10353_tda18212_config = {
 304        .demod_address = (0x18 >> 1),
 305        .parallel_ts = 1,
 306        .disable_i2c_gate_ctrl = 1,
 307        .no_tuner = 1,
 308        .if2 = 41500,
 309};
 310
 311static struct tda10023_config anysee_tda10023_tda18212_config = {
 312        .demod_address = (0x1a >> 1),
 313        .xtal   = 16000000,
 314        .pll_m  = 12,
 315        .pll_p  = 3,
 316        .pll_n  = 1,
 317        .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_B,
 318        .deltaf = 0xba02,
 319};
 320
 321static struct tda18212_config anysee_tda18212_config = {
 322        .if_dvbt_6 = 4150,
 323        .if_dvbt_7 = 4150,
 324        .if_dvbt_8 = 4150,
 325        .if_dvbc = 5000,
 326};
 327
 328static struct tda18212_config anysee_tda18212_config2 = {
 329        .if_dvbt_6 = 3550,
 330        .if_dvbt_7 = 3700,
 331        .if_dvbt_8 = 4150,
 332        .if_dvbt2_6 = 3250,
 333        .if_dvbt2_7 = 4000,
 334        .if_dvbt2_8 = 4000,
 335        .if_dvbc = 5000,
 336};
 337
 338static struct cx24116_config anysee_cx24116_config = {
 339        .demod_address = (0xaa >> 1),
 340        .mpg_clk_pos_pol = 0x00,
 341        .i2c_wr_max = 48,
 342};
 343
 344static struct stv0900_config anysee_stv0900_config = {
 345        .demod_address = (0xd0 >> 1),
 346        .demod_mode = 0,
 347        .xtal = 8000000,
 348        .clkmode = 3,
 349        .diseqc_mode = 2,
 350        .tun1_maddress = 0,
 351        .tun1_adc = 1, /* 1 Vpp */
 352        .path1_mode = 3,
 353};
 354
 355static struct stv6110_config anysee_stv6110_config = {
 356        .i2c_address = (0xc0 >> 1),
 357        .mclk = 16000000,
 358        .clk_div = 1,
 359};
 360
 361static struct isl6423_config anysee_isl6423_config = {
 362        .current_max = SEC_CURRENT_800m,
 363        .curlim  = SEC_CURRENT_LIM_OFF,
 364        .mod_extern = 1,
 365        .addr = (0x10 >> 1),
 366};
 367
 368static struct cxd2820r_config anysee_cxd2820r_config = {
 369        .i2c_address = 0x6d, /* (0xda >> 1) */
 370        .ts_mode = 0x38,
 371};
 372
 373/*
 374 * New USB device strings: Mfr=1, Product=2, SerialNumber=0
 375 * Manufacturer: AMT.CO.KR
 376 *
 377 * E30 VID=04b4 PID=861f HW=2 FW=2.1 Product=????????
 378 * PCB: ?
 379 * parts: DNOS404ZH102A(MT352, DTT7579(?))
 380 *
 381 * E30 VID=04b4 PID=861f HW=2 FW=2.1 "anysee-T(LP)"
 382 * PCB: PCB 507T (rev1.61)
 383 * parts: DNOS404ZH103A(ZL10353, DTT7579(?))
 384 * OEA=0a OEB=00 OEC=00 OED=ff OEE=00
 385 * IOA=45 IOB=ff IOC=00 IOD=ff IOE=00
 386 *
 387 * E30 Plus VID=04b4 PID=861f HW=6 FW=1.0 "anysee"
 388 * PCB: 507CD (rev1.1)
 389 * parts: DNOS404ZH103A(ZL10353, DTT7579(?)), CST56I01
 390 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
 391 * IOA=4f IOB=ff IOC=00 IOD=06 IOE=01
 392 * IOD[0] ZL10353 1=enabled
 393 * IOA[7] TS 0=enabled
 394 * tuner is not behind ZL10353 I2C-gate (no care if gate disabled or not)
 395 *
 396 * E30 C Plus VID=04b4 PID=861f HW=10 FW=1.0 "anysee-DC(LP)"
 397 * PCB: 507DC (rev0.2)
 398 * parts: TDA10023, DTOS403IH102B TM, CST56I01
 399 * OEA=80 OEB=00 OEC=00 OED=ff OEE=fe
 400 * IOA=4f IOB=ff IOC=00 IOD=26 IOE=01
 401 * IOD[0] TDA10023 1=enabled
 402 *
 403 * E30 S2 Plus VID=04b4 PID=861f HW=11 FW=0.1 "anysee-S2(LP)"
 404 * PCB: 507SI (rev2.1)
 405 * parts: BS2N10WCC01(CX24116, CX24118), ISL6423, TDA8024
 406 * OEA=80 OEB=00 OEC=ff OED=ff OEE=fe
 407 * IOA=4d IOB=ff IOC=00 IOD=26 IOE=01
 408 * IOD[0] CX24116 1=enabled
 409 *
 410 * E30 C Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
 411 * PCB: 507FA (rev0.4)
 412 * parts: TDA10023, DTOS403IH102B TM, TDA8024
 413 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
 414 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
 415 * IOD[5] TDA10023 1=enabled
 416 * IOE[0] tuner 1=enabled
 417 *
 418 * E30 Combo Plus VID=1c73 PID=861f HW=15 FW=1.2 "anysee-FA(LP)"
 419 * PCB: 507FA (rev1.1)
 420 * parts: ZL10353, TDA10023, DTOS403IH102B TM, TDA8024
 421 * OEA=80 OEB=00 OEC=ff OED=ff OEE=ff
 422 * IOA=4d IOB=ff IOC=00 IOD=00 IOE=c0
 423 * DVB-C:
 424 * IOD[5] TDA10023 1=enabled
 425 * IOE[0] tuner 1=enabled
 426 * DVB-T:
 427 * IOD[0] ZL10353 1=enabled
 428 * IOE[0] tuner 0=enabled
 429 * tuner is behind ZL10353 I2C-gate
 430 * tuner is behind TDA10023 I2C-gate
 431 *
 432 * E7 TC VID=1c73 PID=861f HW=18 FW=0.7 AMTCI=0.5 "anysee-E7TC(LP)"
 433 * PCB: 508TC (rev0.6)
 434 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
 435 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
 436 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
 437 * IOA[7] TS 1=enabled
 438 * IOE[4] TDA18212 1=enabled
 439 * DVB-C:
 440 * IOD[6] ZL10353 0=disabled
 441 * IOD[5] TDA10023 1=enabled
 442 * IOE[0] IF 1=enabled
 443 * DVB-T:
 444 * IOD[5] TDA10023 0=disabled
 445 * IOD[6] ZL10353 1=enabled
 446 * IOE[0] IF 0=enabled
 447 *
 448 * E7 S2 VID=1c73 PID=861f HW=19 FW=0.4 AMTCI=0.5 "anysee-E7S2(LP)"
 449 * PCB: 508S2 (rev0.7)
 450 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
 451 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
 452 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
 453 * IOA[7] TS 1=enabled
 454 * IOE[5] STV0903 1=enabled
 455 *
 456 * E7 T2C VID=1c73 PID=861f HW=20 FW=0.1 AMTCI=0.5 "anysee-E7T2C(LP)"
 457 * PCB: 508T2C (rev0.3)
 458 * parts: DNOQ44QCH106A(CXD2820R, TDA18212), TDA8024
 459 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
 460 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
 461 * IOA[7] TS 1=enabled
 462 * IOE[5] CXD2820R 1=enabled
 463 *
 464 * E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
 465 * PCB: 508PTC (rev0.5)
 466 * parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
 467 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
 468 * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
 469 * IOA[7] TS 1=enabled
 470 * IOE[4] TDA18212 1=enabled
 471 * DVB-C:
 472 * IOD[6] ZL10353 0=disabled
 473 * IOD[5] TDA10023 1=enabled
 474 * IOE[0] IF 1=enabled
 475 * DVB-T:
 476 * IOD[5] TDA10023 0=disabled
 477 * IOD[6] ZL10353 1=enabled
 478 * IOE[0] IF 0=enabled
 479 *
 480 * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
 481 * PCB: 508PS2 (rev0.4)
 482 * parts: DNBU10512IST(STV0903, STV6110), ISL6423
 483 * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
 484 * IOA=4d IOB=00 IOC=c4 IOD=08 IOE=e4
 485 * IOA[7] TS 1=enabled
 486 * IOE[5] STV0903 1=enabled
 487 */
 488
 489static int anysee_read_config(struct dvb_usb_device *d)
 490{
 491        struct anysee_state *state = d_to_priv(d);
 492        int ret;
 493        u8 hw_info[3];
 494
 495        /*
 496         * Check which hardware we have.
 497         * We must do this call two times to get reliable values (hw/fw bug).
 498         */
 499        ret = anysee_get_hw_info(d, hw_info);
 500        if (ret)
 501                goto error;
 502
 503        ret = anysee_get_hw_info(d, hw_info);
 504        if (ret)
 505                goto error;
 506
 507        /*
 508         * Meaning of these info bytes are guessed.
 509         */
 510        dev_info(&d->udev->dev, "%s: firmware version %d.%d hardware id %d\n",
 511                        KBUILD_MODNAME, hw_info[1], hw_info[2], hw_info[0]);
 512
 513        state->hw = hw_info[0];
 514error:
 515        return ret;
 516}
 517
 518/* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
 519static int anysee_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
 520{
 521        /* enable / disable tuner access on IOE[4] */
 522        return anysee_wr_reg_mask(fe_to_d(fe), REG_IOE, (enable << 4), 0x10);
 523}
 524
 525static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
 526{
 527        struct anysee_state *state = fe_to_priv(fe);
 528        struct dvb_usb_device *d = fe_to_d(fe);
 529        int ret;
 530        dev_dbg(&d->udev->dev, "%s: fe=%d onoff=%d\n", __func__, fe->id, onoff);
 531
 532        /* no frontend sleep control */
 533        if (onoff == 0)
 534                return 0;
 535
 536        switch (state->hw) {
 537        case ANYSEE_HW_507FA: /* 15 */
 538                /* E30 Combo Plus */
 539                /* E30 C Plus */
 540
 541                if (fe->id == 0)  {
 542                        /* disable DVB-T demod on IOD[0] */
 543                        ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 0), 0x01);
 544                        if (ret)
 545                                goto error;
 546
 547                        /* enable DVB-C demod on IOD[5] */
 548                        ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
 549                        if (ret)
 550                                goto error;
 551
 552                        /* enable DVB-C tuner on IOE[0] */
 553                        ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 0), 0x01);
 554                        if (ret)
 555                                goto error;
 556                } else {
 557                        /* disable DVB-C demod on IOD[5] */
 558                        ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
 559                        if (ret)
 560                                goto error;
 561
 562                        /* enable DVB-T demod on IOD[0] */
 563                        ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
 564                        if (ret)
 565                                goto error;
 566
 567                        /* enable DVB-T tuner on IOE[0] */
 568                        ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 0), 0x01);
 569                        if (ret)
 570                                goto error;
 571                }
 572
 573                break;
 574        case ANYSEE_HW_508TC: /* 18 */
 575        case ANYSEE_HW_508PTC: /* 21 */
 576                /* E7 TC */
 577                /* E7 PTC */
 578
 579                if (fe->id == 0)  {
 580                        /* disable DVB-T demod on IOD[6] */
 581                        ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 6), 0x40);
 582                        if (ret)
 583                                goto error;
 584
 585                        /* enable DVB-C demod on IOD[5] */
 586                        ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
 587                        if (ret)
 588                                goto error;
 589
 590                        /* enable IF route on IOE[0] */
 591                        ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 0), 0x01);
 592                        if (ret)
 593                                goto error;
 594                } else {
 595                        /* disable DVB-C demod on IOD[5] */
 596                        ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
 597                        if (ret)
 598                                goto error;
 599
 600                        /* enable DVB-T demod on IOD[6] */
 601                        ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 6), 0x40);
 602                        if (ret)
 603                                goto error;
 604
 605                        /* enable IF route on IOE[0] */
 606                        ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 0), 0x01);
 607                        if (ret)
 608                                goto error;
 609                }
 610
 611                break;
 612        default:
 613                ret = 0;
 614        }
 615
 616error:
 617        return ret;
 618}
 619
 620static int anysee_add_i2c_dev(struct dvb_usb_device *d, const char *type,
 621                u8 addr, void *platform_data)
 622{
 623        int ret, num;
 624        struct anysee_state *state = d_to_priv(d);
 625        struct i2c_client *client;
 626        struct i2c_adapter *adapter = &d->i2c_adap;
 627        struct i2c_board_info board_info = {
 628                .addr = addr,
 629                .platform_data = platform_data,
 630        };
 631
 632        strscpy(board_info.type, type, I2C_NAME_SIZE);
 633
 634        /* find first free client */
 635        for (num = 0; num < ANYSEE_I2C_CLIENT_MAX; num++) {
 636                if (state->i2c_client[num] == NULL)
 637                        break;
 638        }
 639
 640        dev_dbg(&d->udev->dev, "%s: num=%d\n", __func__, num);
 641
 642        if (num == ANYSEE_I2C_CLIENT_MAX) {
 643                dev_err(&d->udev->dev, "%s: I2C client out of index\n",
 644                                KBUILD_MODNAME);
 645                ret = -ENODEV;
 646                goto err;
 647        }
 648
 649        request_module("%s", board_info.type);
 650
 651        /* register I2C device */
 652        client = i2c_new_device(adapter, &board_info);
 653        if (client == NULL || client->dev.driver == NULL) {
 654                ret = -ENODEV;
 655                goto err;
 656        }
 657
 658        /* increase I2C driver usage count */
 659        if (!try_module_get(client->dev.driver->owner)) {
 660                i2c_unregister_device(client);
 661                ret = -ENODEV;
 662                goto err;
 663        }
 664
 665        state->i2c_client[num] = client;
 666        return 0;
 667err:
 668        dev_dbg(&d->udev->dev, "%s: failed=%d\n", __func__, ret);
 669        return ret;
 670}
 671
 672static void anysee_del_i2c_dev(struct dvb_usb_device *d)
 673{
 674        int num;
 675        struct anysee_state *state = d_to_priv(d);
 676        struct i2c_client *client;
 677
 678        /* find last used client */
 679        num = ANYSEE_I2C_CLIENT_MAX;
 680        while (num--) {
 681                if (state->i2c_client[num] != NULL)
 682                        break;
 683        }
 684
 685        dev_dbg(&d->udev->dev, "%s: num=%d\n", __func__, num);
 686
 687        if (num == -1) {
 688                dev_err(&d->udev->dev, "%s: I2C client out of index\n",
 689                                KBUILD_MODNAME);
 690                goto err;
 691        }
 692
 693        client = state->i2c_client[num];
 694
 695        /* decrease I2C driver usage count */
 696        module_put(client->dev.driver->owner);
 697
 698        /* unregister I2C device */
 699        i2c_unregister_device(client);
 700
 701        state->i2c_client[num] = NULL;
 702err:
 703        dev_dbg(&d->udev->dev, "%s: failed\n", __func__);
 704}
 705
 706static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
 707{
 708        struct anysee_state *state = adap_to_priv(adap);
 709        struct dvb_usb_device *d = adap_to_d(adap);
 710        int ret = 0;
 711        u8 tmp;
 712        struct i2c_msg msg[2] = {
 713                {
 714                        .addr = 0x60,
 715                        .flags = 0,
 716                        .len = 1,
 717                        .buf = "\x00",
 718                }, {
 719                        .addr = 0x60,
 720                        .flags = I2C_M_RD,
 721                        .len = 1,
 722                        .buf = &tmp,
 723                }
 724        };
 725
 726        switch (state->hw) {
 727        case ANYSEE_HW_507T: /* 2 */
 728                /* E30 */
 729
 730                /* attach demod */
 731                adap->fe[0] = dvb_attach(mt352_attach, &anysee_mt352_config,
 732                                &d->i2c_adap);
 733                if (adap->fe[0])
 734                        break;
 735
 736                /* attach demod */
 737                adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
 738                                &d->i2c_adap);
 739
 740                break;
 741        case ANYSEE_HW_507CD: /* 6 */
 742                /* E30 Plus */
 743
 744                /* enable DVB-T demod on IOD[0] */
 745                ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
 746                if (ret)
 747                        goto error;
 748
 749                /* enable transport stream on IOA[7] */
 750                ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
 751                if (ret)
 752                        goto error;
 753
 754                /* attach demod */
 755                adap->fe[0] = dvb_attach(zl10353_attach, &anysee_zl10353_config,
 756                                &d->i2c_adap);
 757
 758                break;
 759        case ANYSEE_HW_507DC: /* 10 */
 760                /* E30 C Plus */
 761
 762                /* enable DVB-C demod on IOD[0] */
 763                ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
 764                if (ret)
 765                        goto error;
 766
 767                /* attach demod */
 768                adap->fe[0] = dvb_attach(tda10023_attach,
 769                                &anysee_tda10023_config, &d->i2c_adap, 0x48);
 770
 771                break;
 772        case ANYSEE_HW_507SI: /* 11 */
 773                /* E30 S2 Plus */
 774
 775                /* enable DVB-S/S2 demod on IOD[0] */
 776                ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
 777                if (ret)
 778                        goto error;
 779
 780                /* attach demod */
 781                adap->fe[0] = dvb_attach(cx24116_attach, &anysee_cx24116_config,
 782                                &d->i2c_adap);
 783
 784                break;
 785        case ANYSEE_HW_507FA: /* 15 */
 786                /* E30 Combo Plus */
 787                /* E30 C Plus */
 788
 789                /* enable tuner on IOE[4] */
 790                ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 4), 0x10);
 791                if (ret)
 792                        goto error;
 793
 794                /* probe TDA18212 */
 795                tmp = 0;
 796                ret = i2c_transfer(&d->i2c_adap, msg, 2);
 797                if (ret == 2 && tmp == 0xc7) {
 798                        dev_dbg(&d->udev->dev, "%s: TDA18212 found\n",
 799                                        __func__);
 800                        state->has_tda18212 = true;
 801                }
 802                else
 803                        tmp = 0;
 804
 805                /* disable tuner on IOE[4] */
 806                ret = anysee_wr_reg_mask(d, REG_IOE, (0 << 4), 0x10);
 807                if (ret)
 808                        goto error;
 809
 810                /* disable DVB-T demod on IOD[0] */
 811                ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 0), 0x01);
 812                if (ret)
 813                        goto error;
 814
 815                /* enable DVB-C demod on IOD[5] */
 816                ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
 817                if (ret)
 818                        goto error;
 819
 820                /* attach demod */
 821                if (tmp == 0xc7) {
 822                        /* TDA18212 config */
 823                        adap->fe[0] = dvb_attach(tda10023_attach,
 824                                        &anysee_tda10023_tda18212_config,
 825                                        &d->i2c_adap, 0x48);
 826
 827                        /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
 828                        if (adap->fe[0])
 829                                adap->fe[0]->ops.i2c_gate_ctrl =
 830                                                anysee_i2c_gate_ctrl;
 831                } else {
 832                        /* PLL config */
 833                        adap->fe[0] = dvb_attach(tda10023_attach,
 834                                        &anysee_tda10023_config,
 835                                        &d->i2c_adap, 0x48);
 836                }
 837
 838                /* break out if first frontend attaching fails */
 839                if (!adap->fe[0])
 840                        break;
 841
 842                /* disable DVB-C demod on IOD[5] */
 843                ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
 844                if (ret)
 845                        goto error;
 846
 847                /* enable DVB-T demod on IOD[0] */
 848                ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 0), 0x01);
 849                if (ret)
 850                        goto error;
 851
 852                /* attach demod */
 853                if (tmp == 0xc7) {
 854                        /* TDA18212 config */
 855                        adap->fe[1] = dvb_attach(zl10353_attach,
 856                                        &anysee_zl10353_tda18212_config2,
 857                                        &d->i2c_adap);
 858
 859                        /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
 860                        if (adap->fe[1])
 861                                adap->fe[1]->ops.i2c_gate_ctrl =
 862                                                anysee_i2c_gate_ctrl;
 863                } else {
 864                        /* PLL config */
 865                        adap->fe[1] = dvb_attach(zl10353_attach,
 866                                        &anysee_zl10353_config,
 867                                        &d->i2c_adap);
 868                }
 869
 870                break;
 871        case ANYSEE_HW_508TC: /* 18 */
 872        case ANYSEE_HW_508PTC: /* 21 */
 873                /* E7 TC */
 874                /* E7 PTC */
 875
 876                /* disable DVB-T demod on IOD[6] */
 877                ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 6), 0x40);
 878                if (ret)
 879                        goto error;
 880
 881                /* enable DVB-C demod on IOD[5] */
 882                ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 5), 0x20);
 883                if (ret)
 884                        goto error;
 885
 886                /* attach demod */
 887                adap->fe[0] = dvb_attach(tda10023_attach,
 888                                &anysee_tda10023_tda18212_config,
 889                                &d->i2c_adap, 0x48);
 890
 891                /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
 892                if (adap->fe[0])
 893                        adap->fe[0]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl;
 894
 895                /* break out if first frontend attaching fails */
 896                if (!adap->fe[0])
 897                        break;
 898
 899                /* disable DVB-C demod on IOD[5] */
 900                ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 5), 0x20);
 901                if (ret)
 902                        goto error;
 903
 904                /* enable DVB-T demod on IOD[6] */
 905                ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 6), 0x40);
 906                if (ret)
 907                        goto error;
 908
 909                /* attach demod */
 910                adap->fe[1] = dvb_attach(zl10353_attach,
 911                                &anysee_zl10353_tda18212_config,
 912                                &d->i2c_adap);
 913
 914                /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
 915                if (adap->fe[1])
 916                        adap->fe[1]->ops.i2c_gate_ctrl = anysee_i2c_gate_ctrl;
 917
 918                state->has_ci = true;
 919
 920                break;
 921        case ANYSEE_HW_508S2: /* 19 */
 922        case ANYSEE_HW_508PS2: /* 22 */
 923                /* E7 S2 */
 924                /* E7 PS2 */
 925
 926                /* enable DVB-S/S2 demod on IOE[5] */
 927                ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 5), 0x20);
 928                if (ret)
 929                        goto error;
 930
 931                /* attach demod */
 932                adap->fe[0] = dvb_attach(stv0900_attach,
 933                                &anysee_stv0900_config, &d->i2c_adap, 0);
 934
 935                state->has_ci = true;
 936
 937                break;
 938        case ANYSEE_HW_508T2C: /* 20 */
 939                /* E7 T2C */
 940
 941                /* enable DVB-T/T2/C demod on IOE[5] */
 942                ret = anysee_wr_reg_mask(d, REG_IOE, (1 << 5), 0x20);
 943                if (ret)
 944                        goto error;
 945
 946                /* attach demod */
 947                adap->fe[0] = dvb_attach(cxd2820r_attach,
 948                                &anysee_cxd2820r_config, &d->i2c_adap, NULL);
 949
 950                state->has_ci = true;
 951
 952                break;
 953        }
 954
 955        if (!adap->fe[0]) {
 956                /* we have no frontend :-( */
 957                ret = -ENODEV;
 958                dev_err(&d->udev->dev,
 959                                "%s: Unsupported Anysee version. Please report to <linux-media@vger.kernel.org>.\n",
 960                                KBUILD_MODNAME);
 961        }
 962error:
 963        return ret;
 964}
 965
 966static int anysee_tuner_attach(struct dvb_usb_adapter *adap)
 967{
 968        struct anysee_state *state = adap_to_priv(adap);
 969        struct dvb_usb_device *d = adap_to_d(adap);
 970        struct dvb_frontend *fe;
 971        int ret;
 972        dev_dbg(&d->udev->dev, "%s:\n", __func__);
 973
 974        switch (state->hw) {
 975        case ANYSEE_HW_507T: /* 2 */
 976                /* E30 */
 977
 978                /* attach tuner */
 979                fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1), NULL,
 980                                DVB_PLL_THOMSON_DTT7579);
 981
 982                break;
 983        case ANYSEE_HW_507CD: /* 6 */
 984                /* E30 Plus */
 985
 986                /* attach tuner */
 987                fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc2 >> 1),
 988                                &d->i2c_adap, DVB_PLL_THOMSON_DTT7579);
 989
 990                break;
 991        case ANYSEE_HW_507DC: /* 10 */
 992                /* E30 C Plus */
 993
 994                /* attach tuner */
 995                fe = dvb_attach(dvb_pll_attach, adap->fe[0], (0xc0 >> 1),
 996                                &d->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
 997
 998                break;
 999        case ANYSEE_HW_507SI: /* 11 */
1000                /* E30 S2 Plus */
1001
1002                /* attach LNB controller */
1003                fe = dvb_attach(isl6423_attach, adap->fe[0], &d->i2c_adap,
1004                                &anysee_isl6423_config);
1005
1006                break;
1007        case ANYSEE_HW_507FA: /* 15 */
1008                /* E30 Combo Plus */
1009                /* E30 C Plus */
1010
1011                /* Try first attach TDA18212 silicon tuner on IOE[4], if that
1012                 * fails attach old simple PLL. */
1013
1014                /* attach tuner */
1015                if (state->has_tda18212) {
1016                        struct tda18212_config tda18212_config =
1017                                        anysee_tda18212_config;
1018
1019                        tda18212_config.fe = adap->fe[0];
1020                        ret = anysee_add_i2c_dev(d, "tda18212", 0x60,
1021                                        &tda18212_config);
1022                        if (ret)
1023                                goto err;
1024
1025                        /* copy tuner ops for 2nd FE as tuner is shared */
1026                        if (adap->fe[1]) {
1027                                adap->fe[1]->tuner_priv =
1028                                                adap->fe[0]->tuner_priv;
1029                                memcpy(&adap->fe[1]->ops.tuner_ops,
1030                                                &adap->fe[0]->ops.tuner_ops,
1031                                                sizeof(struct dvb_tuner_ops));
1032                        }
1033
1034                        return 0;
1035                } else {
1036                        /* attach tuner */
1037                        fe = dvb_attach(dvb_pll_attach, adap->fe[0],
1038                                        (0xc0 >> 1), &d->i2c_adap,
1039                                        DVB_PLL_SAMSUNG_DTOS403IH102A);
1040
1041                        if (fe && adap->fe[1]) {
1042                                /* attach tuner for 2nd FE */
1043                                fe = dvb_attach(dvb_pll_attach, adap->fe[1],
1044                                                (0xc0 >> 1), &d->i2c_adap,
1045                                                DVB_PLL_SAMSUNG_DTOS403IH102A);
1046                        }
1047                }
1048
1049                break;
1050        case ANYSEE_HW_508TC: /* 18 */
1051        case ANYSEE_HW_508PTC: /* 21 */
1052        {
1053                /* E7 TC */
1054                /* E7 PTC */
1055                struct tda18212_config tda18212_config = anysee_tda18212_config;
1056
1057                tda18212_config.fe = adap->fe[0];
1058                ret = anysee_add_i2c_dev(d, "tda18212", 0x60, &tda18212_config);
1059                if (ret)
1060                        goto err;
1061
1062                /* copy tuner ops for 2nd FE as tuner is shared */
1063                if (adap->fe[1]) {
1064                        adap->fe[1]->tuner_priv = adap->fe[0]->tuner_priv;
1065                        memcpy(&adap->fe[1]->ops.tuner_ops,
1066                                        &adap->fe[0]->ops.tuner_ops,
1067                                        sizeof(struct dvb_tuner_ops));
1068                }
1069
1070                return 0;
1071        }
1072        case ANYSEE_HW_508S2: /* 19 */
1073        case ANYSEE_HW_508PS2: /* 22 */
1074                /* E7 S2 */
1075                /* E7 PS2 */
1076
1077                /* attach tuner */
1078                fe = dvb_attach(stv6110_attach, adap->fe[0],
1079                                &anysee_stv6110_config, &d->i2c_adap);
1080
1081                if (fe) {
1082                        /* attach LNB controller */
1083                        fe = dvb_attach(isl6423_attach, adap->fe[0],
1084                                        &d->i2c_adap, &anysee_isl6423_config);
1085                }
1086
1087                break;
1088
1089        case ANYSEE_HW_508T2C: /* 20 */
1090        {
1091                /* E7 T2C */
1092                struct tda18212_config tda18212_config =
1093                                anysee_tda18212_config2;
1094
1095                tda18212_config.fe = adap->fe[0];
1096                ret = anysee_add_i2c_dev(d, "tda18212", 0x60, &tda18212_config);
1097                if (ret)
1098                        goto err;
1099
1100                return 0;
1101        }
1102        default:
1103                fe = NULL;
1104        }
1105
1106        if (fe)
1107                ret = 0;
1108        else
1109                ret = -ENODEV;
1110err:
1111        return ret;
1112}
1113
1114#if IS_ENABLED(CONFIG_RC_CORE)
1115static int anysee_rc_query(struct dvb_usb_device *d)
1116{
1117        u8 buf[] = {CMD_GET_IR_CODE};
1118        u8 ircode[2];
1119        int ret;
1120
1121        /* Remote controller is basic NEC using address byte 0x08.
1122           Anysee device RC query returns only two bytes, status and code,
1123           address byte is dropped. Also it does not return any value for
1124           NEC RCs having address byte other than 0x08. Due to that, we
1125           cannot use that device as standard NEC receiver.
1126           It could be possible make hack which reads whole code directly
1127           from device memory... */
1128
1129        ret = anysee_ctrl_msg(d, buf, sizeof(buf), ircode, sizeof(ircode));
1130        if (ret)
1131                return ret;
1132
1133        if (ircode[0]) {
1134                dev_dbg(&d->udev->dev, "%s: key pressed %02x\n", __func__,
1135                                ircode[1]);
1136                rc_keydown(d->rc_dev, RC_PROTO_NEC,
1137                           RC_SCANCODE_NEC(0x08, ircode[1]), 0);
1138        }
1139
1140        return 0;
1141}
1142
1143static int anysee_get_rc_config(struct dvb_usb_device *d, struct dvb_usb_rc *rc)
1144{
1145        rc->allowed_protos = RC_PROTO_BIT_NEC;
1146        rc->query          = anysee_rc_query;
1147        rc->interval       = 250;  /* windows driver uses 500ms */
1148
1149        return 0;
1150}
1151#else
1152        #define anysee_get_rc_config NULL
1153#endif
1154
1155static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
1156        int addr)
1157{
1158        struct dvb_usb_device *d = ci->data;
1159        int ret;
1160        u8 buf[] = {CMD_CI, 0x02, 0x40 | addr >> 8, addr & 0xff, 0x00, 1};
1161        u8 val;
1162
1163        ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1164        if (ret)
1165                return ret;
1166
1167        return val;
1168}
1169
1170static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
1171        int addr, u8 val)
1172{
1173        struct dvb_usb_device *d = ci->data;
1174        int ret;
1175        u8 buf[] = {CMD_CI, 0x03, 0x40 | addr >> 8, addr & 0xff, 0x00, 1, val};
1176
1177        ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1178        if (ret)
1179                return ret;
1180
1181        return 0;
1182}
1183
1184static int anysee_ci_read_cam_control(struct dvb_ca_en50221 *ci, int slot,
1185        u8 addr)
1186{
1187        struct dvb_usb_device *d = ci->data;
1188        int ret;
1189        u8 buf[] = {CMD_CI, 0x04, 0x40, addr, 0x00, 1};
1190        u8 val;
1191
1192        ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1193        if (ret)
1194                return ret;
1195
1196        return val;
1197}
1198
1199static int anysee_ci_write_cam_control(struct dvb_ca_en50221 *ci, int slot,
1200        u8 addr, u8 val)
1201{
1202        struct dvb_usb_device *d = ci->data;
1203        int ret;
1204        u8 buf[] = {CMD_CI, 0x05, 0x40, addr, 0x00, 1, val};
1205
1206        ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1207        if (ret)
1208                return ret;
1209
1210        return 0;
1211}
1212
1213static int anysee_ci_slot_reset(struct dvb_ca_en50221 *ci, int slot)
1214{
1215        struct dvb_usb_device *d = ci->data;
1216        int ret;
1217        struct anysee_state *state = d_to_priv(d);
1218
1219        state->ci_cam_ready = jiffies + msecs_to_jiffies(1000);
1220
1221        ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1222        if (ret)
1223                return ret;
1224
1225        msleep(300);
1226
1227        ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1228        if (ret)
1229                return ret;
1230
1231        return 0;
1232}
1233
1234static int anysee_ci_slot_shutdown(struct dvb_ca_en50221 *ci, int slot)
1235{
1236        struct dvb_usb_device *d = ci->data;
1237        int ret;
1238
1239        ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1240        if (ret)
1241                return ret;
1242
1243        msleep(30);
1244
1245        ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1246        if (ret)
1247                return ret;
1248
1249        return 0;
1250}
1251
1252static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221 *ci, int slot)
1253{
1254        struct dvb_usb_device *d = ci->data;
1255        int ret;
1256
1257        ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 1), 0x02);
1258        if (ret)
1259                return ret;
1260
1261        return 0;
1262}
1263
1264static int anysee_ci_poll_slot_status(struct dvb_ca_en50221 *ci, int slot,
1265        int open)
1266{
1267        struct dvb_usb_device *d = ci->data;
1268        struct anysee_state *state = d_to_priv(d);
1269        int ret;
1270        u8 tmp = 0;
1271
1272        ret = anysee_rd_reg_mask(d, REG_IOC, &tmp, 0x40);
1273        if (ret)
1274                return ret;
1275
1276        if (tmp == 0) {
1277                ret = DVB_CA_EN50221_POLL_CAM_PRESENT;
1278                if (time_after(jiffies, state->ci_cam_ready))
1279                        ret |= DVB_CA_EN50221_POLL_CAM_READY;
1280        }
1281
1282        return ret;
1283}
1284
1285static int anysee_ci_init(struct dvb_usb_device *d)
1286{
1287        struct anysee_state *state = d_to_priv(d);
1288        int ret;
1289
1290        state->ci.owner               = THIS_MODULE;
1291        state->ci.read_attribute_mem  = anysee_ci_read_attribute_mem;
1292        state->ci.write_attribute_mem = anysee_ci_write_attribute_mem;
1293        state->ci.read_cam_control    = anysee_ci_read_cam_control;
1294        state->ci.write_cam_control   = anysee_ci_write_cam_control;
1295        state->ci.slot_reset          = anysee_ci_slot_reset;
1296        state->ci.slot_shutdown       = anysee_ci_slot_shutdown;
1297        state->ci.slot_ts_enable      = anysee_ci_slot_ts_enable;
1298        state->ci.poll_slot_status    = anysee_ci_poll_slot_status;
1299        state->ci.data                = d;
1300
1301        ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1302        if (ret)
1303                return ret;
1304
1305        ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 2)|(0 << 1)|(0 << 0), 0x07);
1306        if (ret)
1307                return ret;
1308
1309        ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 2)|(1 << 1)|(1 << 0), 0x07);
1310        if (ret)
1311                return ret;
1312
1313        ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1);
1314        if (ret)
1315                return ret;
1316
1317        state->ci_attached = true;
1318
1319        return 0;
1320}
1321
1322static void anysee_ci_release(struct dvb_usb_device *d)
1323{
1324        struct anysee_state *state = d_to_priv(d);
1325
1326        /* detach CI */
1327        if (state->ci_attached)
1328                dvb_ca_en50221_release(&state->ci);
1329
1330        return;
1331}
1332
1333static int anysee_init(struct dvb_usb_device *d)
1334{
1335        struct anysee_state *state = d_to_priv(d);
1336        int ret;
1337
1338        /* There is one interface with two alternate settings.
1339           Alternate setting 0 is for bulk transfer.
1340           Alternate setting 1 is for isochronous transfer.
1341           We use bulk transfer (alternate setting 0). */
1342        ret = usb_set_interface(d->udev, 0, 0);
1343        if (ret)
1344                return ret;
1345
1346        /* LED light */
1347        ret = anysee_led_ctrl(d, 0x01, 0x03);
1348        if (ret)
1349                return ret;
1350
1351        /* enable IR */
1352        ret = anysee_ir_ctrl(d, 1);
1353        if (ret)
1354                return ret;
1355
1356        /* attach CI */
1357        if (state->has_ci) {
1358                ret = anysee_ci_init(d);
1359                if (ret)
1360                        return ret;
1361        }
1362
1363        return 0;
1364}
1365
1366static void anysee_exit(struct dvb_usb_device *d)
1367{
1368        struct anysee_state *state = d_to_priv(d);
1369
1370        if (state->i2c_client[0])
1371                anysee_del_i2c_dev(d);
1372
1373        return anysee_ci_release(d);
1374}
1375
1376/* DVB USB Driver stuff */
1377static struct dvb_usb_device_properties anysee_props = {
1378        .driver_name = KBUILD_MODNAME,
1379        .owner = THIS_MODULE,
1380        .adapter_nr = adapter_nr,
1381        .size_of_priv = sizeof(struct anysee_state),
1382
1383        .generic_bulk_ctrl_endpoint = 0x01,
1384        .generic_bulk_ctrl_endpoint_response = 0x81,
1385
1386        .i2c_algo         = &anysee_i2c_algo,
1387        .read_config      = anysee_read_config,
1388        .frontend_attach  = anysee_frontend_attach,
1389        .tuner_attach     = anysee_tuner_attach,
1390        .init             = anysee_init,
1391        .get_rc_config    = anysee_get_rc_config,
1392        .frontend_ctrl    = anysee_frontend_ctrl,
1393        .streaming_ctrl   = anysee_streaming_ctrl,
1394        .exit             = anysee_exit,
1395
1396        .num_adapters = 1,
1397        .adapter = {
1398                {
1399                        .stream = DVB_USB_STREAM_BULK(0x82, 8, 16 * 512),
1400                }
1401        }
1402};
1403
1404static const struct usb_device_id anysee_id_table[] = {
1405        { DVB_USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE,
1406                &anysee_props, "Anysee", RC_MAP_ANYSEE) },
1407        { DVB_USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE,
1408                &anysee_props, "Anysee", RC_MAP_ANYSEE) },
1409        { }
1410};
1411MODULE_DEVICE_TABLE(usb, anysee_id_table);
1412
1413static struct usb_driver anysee_usb_driver = {
1414        .name = KBUILD_MODNAME,
1415        .id_table = anysee_id_table,
1416        .probe = dvb_usbv2_probe,
1417        .disconnect = dvb_usbv2_disconnect,
1418        .suspend = dvb_usbv2_suspend,
1419        .resume = dvb_usbv2_resume,
1420        .reset_resume = dvb_usbv2_reset_resume,
1421        .no_dynamic_id = 1,
1422        .soft_unbind = 1,
1423};
1424
1425module_usb_driver(anysee_usb_driver);
1426
1427MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1428MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1429MODULE_LICENSE("GPL");
1430