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 const 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 const 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_client_device(adapter, &board_info);
 653        if (!i2c_client_has_driver(client)) {
 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        u8 buf[] = {CMD_CI, 0x03, 0x40 | addr >> 8, addr & 0xff, 0x00, 1, val};
1175
1176        return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1177}
1178
1179static int anysee_ci_read_cam_control(struct dvb_ca_en50221 *ci, int slot,
1180        u8 addr)
1181{
1182        struct dvb_usb_device *d = ci->data;
1183        int ret;
1184        u8 buf[] = {CMD_CI, 0x04, 0x40, addr, 0x00, 1};
1185        u8 val;
1186
1187        ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
1188        if (ret)
1189                return ret;
1190
1191        return val;
1192}
1193
1194static int anysee_ci_write_cam_control(struct dvb_ca_en50221 *ci, int slot,
1195        u8 addr, u8 val)
1196{
1197        struct dvb_usb_device *d = ci->data;
1198        u8 buf[] = {CMD_CI, 0x05, 0x40, addr, 0x00, 1, val};
1199
1200        return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
1201}
1202
1203static int anysee_ci_slot_reset(struct dvb_ca_en50221 *ci, int slot)
1204{
1205        struct dvb_usb_device *d = ci->data;
1206        int ret;
1207        struct anysee_state *state = d_to_priv(d);
1208
1209        state->ci_cam_ready = jiffies + msecs_to_jiffies(1000);
1210
1211        ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1212        if (ret)
1213                return ret;
1214
1215        msleep(300);
1216
1217        ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1218        if (ret)
1219                return ret;
1220
1221        return 0;
1222}
1223
1224static int anysee_ci_slot_shutdown(struct dvb_ca_en50221 *ci, int slot)
1225{
1226        struct dvb_usb_device *d = ci->data;
1227        int ret;
1228
1229        ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
1230        if (ret)
1231                return ret;
1232
1233        msleep(30);
1234
1235        ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1236        if (ret)
1237                return ret;
1238
1239        return 0;
1240}
1241
1242static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221 *ci, int slot)
1243{
1244        struct dvb_usb_device *d = ci->data;
1245
1246        return anysee_wr_reg_mask(d, REG_IOD, (0 << 1), 0x02);
1247}
1248
1249static int anysee_ci_poll_slot_status(struct dvb_ca_en50221 *ci, int slot,
1250        int open)
1251{
1252        struct dvb_usb_device *d = ci->data;
1253        struct anysee_state *state = d_to_priv(d);
1254        int ret;
1255        u8 tmp = 0;
1256
1257        ret = anysee_rd_reg_mask(d, REG_IOC, &tmp, 0x40);
1258        if (ret)
1259                return ret;
1260
1261        if (tmp == 0) {
1262                ret = DVB_CA_EN50221_POLL_CAM_PRESENT;
1263                if (time_after(jiffies, state->ci_cam_ready))
1264                        ret |= DVB_CA_EN50221_POLL_CAM_READY;
1265        }
1266
1267        return ret;
1268}
1269
1270static int anysee_ci_init(struct dvb_usb_device *d)
1271{
1272        struct anysee_state *state = d_to_priv(d);
1273        int ret;
1274
1275        state->ci.owner               = THIS_MODULE;
1276        state->ci.read_attribute_mem  = anysee_ci_read_attribute_mem;
1277        state->ci.write_attribute_mem = anysee_ci_write_attribute_mem;
1278        state->ci.read_cam_control    = anysee_ci_read_cam_control;
1279        state->ci.write_cam_control   = anysee_ci_write_cam_control;
1280        state->ci.slot_reset          = anysee_ci_slot_reset;
1281        state->ci.slot_shutdown       = anysee_ci_slot_shutdown;
1282        state->ci.slot_ts_enable      = anysee_ci_slot_ts_enable;
1283        state->ci.poll_slot_status    = anysee_ci_poll_slot_status;
1284        state->ci.data                = d;
1285
1286        ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
1287        if (ret)
1288                return ret;
1289
1290        ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 2)|(0 << 1)|(0 << 0), 0x07);
1291        if (ret)
1292                return ret;
1293
1294        ret = anysee_wr_reg_mask(d, REG_IOD, (1 << 2)|(1 << 1)|(1 << 0), 0x07);
1295        if (ret)
1296                return ret;
1297
1298        ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1);
1299        if (ret)
1300                return ret;
1301
1302        state->ci_attached = true;
1303
1304        return 0;
1305}
1306
1307static void anysee_ci_release(struct dvb_usb_device *d)
1308{
1309        struct anysee_state *state = d_to_priv(d);
1310
1311        /* detach CI */
1312        if (state->ci_attached)
1313                dvb_ca_en50221_release(&state->ci);
1314
1315        return;
1316}
1317
1318static int anysee_init(struct dvb_usb_device *d)
1319{
1320        struct anysee_state *state = d_to_priv(d);
1321        int ret;
1322
1323        /* There is one interface with two alternate settings.
1324           Alternate setting 0 is for bulk transfer.
1325           Alternate setting 1 is for isochronous transfer.
1326           We use bulk transfer (alternate setting 0). */
1327        ret = usb_set_interface(d->udev, 0, 0);
1328        if (ret)
1329                return ret;
1330
1331        /* LED light */
1332        ret = anysee_led_ctrl(d, 0x01, 0x03);
1333        if (ret)
1334                return ret;
1335
1336        /* enable IR */
1337        ret = anysee_ir_ctrl(d, 1);
1338        if (ret)
1339                return ret;
1340
1341        /* attach CI */
1342        if (state->has_ci) {
1343                ret = anysee_ci_init(d);
1344                if (ret)
1345                        return ret;
1346        }
1347
1348        return 0;
1349}
1350
1351static void anysee_exit(struct dvb_usb_device *d)
1352{
1353        struct anysee_state *state = d_to_priv(d);
1354
1355        if (state->i2c_client[0])
1356                anysee_del_i2c_dev(d);
1357
1358        return anysee_ci_release(d);
1359}
1360
1361/* DVB USB Driver stuff */
1362static struct dvb_usb_device_properties anysee_props = {
1363        .driver_name = KBUILD_MODNAME,
1364        .owner = THIS_MODULE,
1365        .adapter_nr = adapter_nr,
1366        .size_of_priv = sizeof(struct anysee_state),
1367
1368        .generic_bulk_ctrl_endpoint = 0x01,
1369        .generic_bulk_ctrl_endpoint_response = 0x81,
1370
1371        .i2c_algo         = &anysee_i2c_algo,
1372        .read_config      = anysee_read_config,
1373        .frontend_attach  = anysee_frontend_attach,
1374        .tuner_attach     = anysee_tuner_attach,
1375        .init             = anysee_init,
1376        .get_rc_config    = anysee_get_rc_config,
1377        .frontend_ctrl    = anysee_frontend_ctrl,
1378        .streaming_ctrl   = anysee_streaming_ctrl,
1379        .exit             = anysee_exit,
1380
1381        .num_adapters = 1,
1382        .adapter = {
1383                {
1384                        .stream = DVB_USB_STREAM_BULK(0x82, 8, 16 * 512),
1385                }
1386        }
1387};
1388
1389static const struct usb_device_id anysee_id_table[] = {
1390        { DVB_USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE,
1391                &anysee_props, "Anysee", RC_MAP_ANYSEE) },
1392        { DVB_USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE,
1393                &anysee_props, "Anysee", RC_MAP_ANYSEE) },
1394        { }
1395};
1396MODULE_DEVICE_TABLE(usb, anysee_id_table);
1397
1398static struct usb_driver anysee_usb_driver = {
1399        .name = KBUILD_MODNAME,
1400        .id_table = anysee_id_table,
1401        .probe = dvb_usbv2_probe,
1402        .disconnect = dvb_usbv2_disconnect,
1403        .suspend = dvb_usbv2_suspend,
1404        .resume = dvb_usbv2_resume,
1405        .reset_resume = dvb_usbv2_reset_resume,
1406        .no_dynamic_id = 1,
1407        .soft_unbind = 1,
1408};
1409
1410module_usb_driver(anysee_usb_driver);
1411
1412MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1413MODULE_DESCRIPTION("Driver Anysee E30 DVB-C & DVB-T USB2.0");
1414MODULE_LICENSE("GPL");
1415