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