linux/drivers/media/dvb-frontends/rtl2830.c
<<
>>
Prefs
   1/*
   2 * Realtek RTL2830 DVB-T demodulator driver
   3 *
   4 * Copyright (C) 2011 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 */
  17
  18#include "rtl2830_priv.h"
  19
  20/* Our regmap is bypassing I2C adapter lock, thus we do it! */
  21static int rtl2830_bulk_write(struct i2c_client *client, unsigned int reg,
  22                              const void *val, size_t val_count)
  23{
  24        struct rtl2830_dev *dev = i2c_get_clientdata(client);
  25        int ret;
  26
  27        i2c_lock_adapter(client->adapter);
  28        ret = regmap_bulk_write(dev->regmap, reg, val, val_count);
  29        i2c_unlock_adapter(client->adapter);
  30        return ret;
  31}
  32
  33static int rtl2830_update_bits(struct i2c_client *client, unsigned int reg,
  34                               unsigned int mask, unsigned int val)
  35{
  36        struct rtl2830_dev *dev = i2c_get_clientdata(client);
  37        int ret;
  38
  39        i2c_lock_adapter(client->adapter);
  40        ret = regmap_update_bits(dev->regmap, reg, mask, val);
  41        i2c_unlock_adapter(client->adapter);
  42        return ret;
  43}
  44
  45static int rtl2830_bulk_read(struct i2c_client *client, unsigned int reg,
  46                             void *val, size_t val_count)
  47{
  48        struct rtl2830_dev *dev = i2c_get_clientdata(client);
  49        int ret;
  50
  51        i2c_lock_adapter(client->adapter);
  52        ret = regmap_bulk_read(dev->regmap, reg, val, val_count);
  53        i2c_unlock_adapter(client->adapter);
  54        return ret;
  55}
  56
  57static int rtl2830_init(struct dvb_frontend *fe)
  58{
  59        struct i2c_client *client = fe->demodulator_priv;
  60        struct rtl2830_dev *dev = i2c_get_clientdata(client);
  61        struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
  62        int ret, i;
  63        struct rtl2830_reg_val_mask tab[] = {
  64                {0x00d, 0x01, 0x03},
  65                {0x00d, 0x10, 0x10},
  66                {0x104, 0x00, 0x1e},
  67                {0x105, 0x80, 0x80},
  68                {0x110, 0x02, 0x03},
  69                {0x110, 0x08, 0x0c},
  70                {0x17b, 0x00, 0x40},
  71                {0x17d, 0x05, 0x0f},
  72                {0x17d, 0x50, 0xf0},
  73                {0x18c, 0x08, 0x0f},
  74                {0x18d, 0x00, 0xc0},
  75                {0x188, 0x05, 0x0f},
  76                {0x189, 0x00, 0xfc},
  77                {0x2d5, 0x02, 0x02},
  78                {0x2f1, 0x02, 0x06},
  79                {0x2f1, 0x20, 0xf8},
  80                {0x16d, 0x00, 0x01},
  81                {0x1a6, 0x00, 0x80},
  82                {0x106, dev->pdata->vtop, 0x3f},
  83                {0x107, dev->pdata->krf, 0x3f},
  84                {0x112, 0x28, 0xff},
  85                {0x103, dev->pdata->agc_targ_val, 0xff},
  86                {0x00a, 0x02, 0x07},
  87                {0x140, 0x0c, 0x3c},
  88                {0x140, 0x40, 0xc0},
  89                {0x15b, 0x05, 0x07},
  90                {0x15b, 0x28, 0x38},
  91                {0x15c, 0x05, 0x07},
  92                {0x15c, 0x28, 0x38},
  93                {0x115, dev->pdata->spec_inv, 0x01},
  94                {0x16f, 0x01, 0x07},
  95                {0x170, 0x18, 0x38},
  96                {0x172, 0x0f, 0x0f},
  97                {0x173, 0x08, 0x38},
  98                {0x175, 0x01, 0x07},
  99                {0x176, 0x00, 0xc0},
 100        };
 101
 102        for (i = 0; i < ARRAY_SIZE(tab); i++) {
 103                ret = rtl2830_update_bits(client, tab[i].reg, tab[i].mask,
 104                                          tab[i].val);
 105                if (ret)
 106                        goto err;
 107        }
 108
 109        ret = rtl2830_bulk_write(client, 0x18f, "\x28\x00", 2);
 110        if (ret)
 111                goto err;
 112
 113        ret = rtl2830_bulk_write(client, 0x195,
 114                                 "\x04\x06\x0a\x12\x0a\x12\x1e\x28", 8);
 115        if (ret)
 116                goto err;
 117
 118        /* TODO: spec init */
 119
 120        /* soft reset */
 121        ret = rtl2830_update_bits(client, 0x101, 0x04, 0x04);
 122        if (ret)
 123                goto err;
 124
 125        ret = rtl2830_update_bits(client, 0x101, 0x04, 0x00);
 126        if (ret)
 127                goto err;
 128
 129        /* init stats here in order signal app which stats are supported */
 130        c->strength.len = 1;
 131        c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 132        c->cnr.len = 1;
 133        c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 134        c->post_bit_error.len = 1;
 135        c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 136        c->post_bit_count.len = 1;
 137        c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 138        /* start statistics polling */
 139        schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
 140
 141        dev->sleeping = false;
 142
 143        return ret;
 144err:
 145        dev_dbg(&client->dev, "failed=%d\n", ret);
 146        return ret;
 147}
 148
 149static int rtl2830_sleep(struct dvb_frontend *fe)
 150{
 151        struct i2c_client *client = fe->demodulator_priv;
 152        struct rtl2830_dev *dev = i2c_get_clientdata(client);
 153
 154        dev->sleeping = true;
 155        /* stop statistics polling */
 156        cancel_delayed_work_sync(&dev->stat_work);
 157        dev->fe_status = 0;
 158
 159        return 0;
 160}
 161
 162static int rtl2830_get_tune_settings(struct dvb_frontend *fe,
 163                                     struct dvb_frontend_tune_settings *s)
 164{
 165        s->min_delay_ms = 500;
 166        s->step_size = fe->ops.info.frequency_stepsize * 2;
 167        s->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
 168
 169        return 0;
 170}
 171
 172static int rtl2830_set_frontend(struct dvb_frontend *fe)
 173{
 174        struct i2c_client *client = fe->demodulator_priv;
 175        struct rtl2830_dev *dev = i2c_get_clientdata(client);
 176        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 177        int ret, i;
 178        u64 num;
 179        u8 buf[3], u8tmp;
 180        u32 if_ctl, if_frequency;
 181        static const u8 bw_params1[3][34] = {
 182                {
 183                0x1f, 0xf0, 0x1f, 0xf0, 0x1f, 0xfa, 0x00, 0x17, 0x00, 0x41,
 184                0x00, 0x64, 0x00, 0x67, 0x00, 0x38, 0x1f, 0xde, 0x1f, 0x7a,
 185                0x1f, 0x47, 0x1f, 0x7c, 0x00, 0x30, 0x01, 0x4b, 0x02, 0x82,
 186                0x03, 0x73, 0x03, 0xcf, /* 6 MHz */
 187                }, {
 188                0x1f, 0xfa, 0x1f, 0xda, 0x1f, 0xc1, 0x1f, 0xb3, 0x1f, 0xca,
 189                0x00, 0x07, 0x00, 0x4d, 0x00, 0x6d, 0x00, 0x40, 0x1f, 0xca,
 190                0x1f, 0x4d, 0x1f, 0x2a, 0x1f, 0xb2, 0x00, 0xec, 0x02, 0x7e,
 191                0x03, 0xd0, 0x04, 0x53, /* 7 MHz */
 192                }, {
 193                0x00, 0x10, 0x00, 0x0e, 0x1f, 0xf7, 0x1f, 0xc9, 0x1f, 0xa0,
 194                0x1f, 0xa6, 0x1f, 0xec, 0x00, 0x4e, 0x00, 0x7d, 0x00, 0x3a,
 195                0x1f, 0x98, 0x1f, 0x10, 0x1f, 0x40, 0x00, 0x75, 0x02, 0x5f,
 196                0x04, 0x24, 0x04, 0xdb, /* 8 MHz */
 197                },
 198        };
 199        static const u8 bw_params2[3][6] = {
 200                {0xc3, 0x0c, 0x44, 0x33, 0x33, 0x30}, /* 6 MHz */
 201                {0xb8, 0xe3, 0x93, 0x99, 0x99, 0x98}, /* 7 MHz */
 202                {0xae, 0xba, 0xf3, 0x26, 0x66, 0x64}, /* 8 MHz */
 203        };
 204
 205        dev_dbg(&client->dev, "frequency=%u bandwidth_hz=%u inversion=%u\n",
 206                c->frequency, c->bandwidth_hz, c->inversion);
 207
 208        /* program tuner */
 209        if (fe->ops.tuner_ops.set_params)
 210                fe->ops.tuner_ops.set_params(fe);
 211
 212        switch (c->bandwidth_hz) {
 213        case 6000000:
 214                i = 0;
 215                break;
 216        case 7000000:
 217                i = 1;
 218                break;
 219        case 8000000:
 220                i = 2;
 221                break;
 222        default:
 223                dev_err(&client->dev, "invalid bandwidth_hz %u\n",
 224                        c->bandwidth_hz);
 225                return -EINVAL;
 226        }
 227
 228        ret = rtl2830_update_bits(client, 0x008, 0x06, i << 1);
 229        if (ret)
 230                goto err;
 231
 232        /* program if frequency */
 233        if (fe->ops.tuner_ops.get_if_frequency)
 234                ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency);
 235        else
 236                ret = -EINVAL;
 237        if (ret)
 238                goto err;
 239
 240        num = if_frequency % dev->pdata->clk;
 241        num *= 0x400000;
 242        num = div_u64(num, dev->pdata->clk);
 243        num = -num;
 244        if_ctl = num & 0x3fffff;
 245        dev_dbg(&client->dev, "if_frequency=%d if_ctl=%08x\n",
 246                if_frequency, if_ctl);
 247
 248        buf[0] = (if_ctl >> 16) & 0x3f;
 249        buf[1] = (if_ctl >>  8) & 0xff;
 250        buf[2] = (if_ctl >>  0) & 0xff;
 251
 252        ret = rtl2830_bulk_read(client, 0x119, &u8tmp, 1);
 253        if (ret)
 254                goto err;
 255
 256        buf[0] |= u8tmp & 0xc0;  /* [7:6] */
 257
 258        ret = rtl2830_bulk_write(client, 0x119, buf, 3);
 259        if (ret)
 260                goto err;
 261
 262        /* 1/2 split I2C write */
 263        ret = rtl2830_bulk_write(client, 0x11c, &bw_params1[i][0], 17);
 264        if (ret)
 265                goto err;
 266
 267        /* 2/2 split I2C write */
 268        ret = rtl2830_bulk_write(client, 0x12d, &bw_params1[i][17], 17);
 269        if (ret)
 270                goto err;
 271
 272        ret = rtl2830_bulk_write(client, 0x19d, bw_params2[i], 6);
 273        if (ret)
 274                goto err;
 275
 276        return ret;
 277err:
 278        dev_dbg(&client->dev, "failed=%d\n", ret);
 279        return ret;
 280}
 281
 282static int rtl2830_get_frontend(struct dvb_frontend *fe,
 283                                struct dtv_frontend_properties *c)
 284{
 285        struct i2c_client *client = fe->demodulator_priv;
 286        struct rtl2830_dev *dev = i2c_get_clientdata(client);
 287        int ret;
 288        u8 buf[3];
 289
 290        if (dev->sleeping)
 291                return 0;
 292
 293        ret = rtl2830_bulk_read(client, 0x33c, buf, 2);
 294        if (ret)
 295                goto err;
 296
 297        ret = rtl2830_bulk_read(client, 0x351, &buf[2], 1);
 298        if (ret)
 299                goto err;
 300
 301        dev_dbg(&client->dev, "TPS=%*ph\n", 3, buf);
 302
 303        switch ((buf[0] >> 2) & 3) {
 304        case 0:
 305                c->modulation = QPSK;
 306                break;
 307        case 1:
 308                c->modulation = QAM_16;
 309                break;
 310        case 2:
 311                c->modulation = QAM_64;
 312                break;
 313        }
 314
 315        switch ((buf[2] >> 2) & 1) {
 316        case 0:
 317                c->transmission_mode = TRANSMISSION_MODE_2K;
 318                break;
 319        case 1:
 320                c->transmission_mode = TRANSMISSION_MODE_8K;
 321        }
 322
 323        switch ((buf[2] >> 0) & 3) {
 324        case 0:
 325                c->guard_interval = GUARD_INTERVAL_1_32;
 326                break;
 327        case 1:
 328                c->guard_interval = GUARD_INTERVAL_1_16;
 329                break;
 330        case 2:
 331                c->guard_interval = GUARD_INTERVAL_1_8;
 332                break;
 333        case 3:
 334                c->guard_interval = GUARD_INTERVAL_1_4;
 335                break;
 336        }
 337
 338        switch ((buf[0] >> 4) & 7) {
 339        case 0:
 340                c->hierarchy = HIERARCHY_NONE;
 341                break;
 342        case 1:
 343                c->hierarchy = HIERARCHY_1;
 344                break;
 345        case 2:
 346                c->hierarchy = HIERARCHY_2;
 347                break;
 348        case 3:
 349                c->hierarchy = HIERARCHY_4;
 350                break;
 351        }
 352
 353        switch ((buf[1] >> 3) & 7) {
 354        case 0:
 355                c->code_rate_HP = FEC_1_2;
 356                break;
 357        case 1:
 358                c->code_rate_HP = FEC_2_3;
 359                break;
 360        case 2:
 361                c->code_rate_HP = FEC_3_4;
 362                break;
 363        case 3:
 364                c->code_rate_HP = FEC_5_6;
 365                break;
 366        case 4:
 367                c->code_rate_HP = FEC_7_8;
 368                break;
 369        }
 370
 371        switch ((buf[1] >> 0) & 7) {
 372        case 0:
 373                c->code_rate_LP = FEC_1_2;
 374                break;
 375        case 1:
 376                c->code_rate_LP = FEC_2_3;
 377                break;
 378        case 2:
 379                c->code_rate_LP = FEC_3_4;
 380                break;
 381        case 3:
 382                c->code_rate_LP = FEC_5_6;
 383                break;
 384        case 4:
 385                c->code_rate_LP = FEC_7_8;
 386                break;
 387        }
 388
 389        return 0;
 390err:
 391        dev_dbg(&client->dev, "failed=%d\n", ret);
 392        return ret;
 393}
 394
 395static int rtl2830_read_status(struct dvb_frontend *fe, enum fe_status *status)
 396{
 397        struct i2c_client *client = fe->demodulator_priv;
 398        struct rtl2830_dev *dev = i2c_get_clientdata(client);
 399        int ret;
 400        u8 u8tmp;
 401
 402        *status = 0;
 403
 404        if (dev->sleeping)
 405                return 0;
 406
 407        ret = rtl2830_bulk_read(client, 0x351, &u8tmp, 1);
 408        if (ret)
 409                goto err;
 410
 411        u8tmp = (u8tmp >> 3) & 0x0f; /* [6:3] */
 412        if (u8tmp == 11) {
 413                *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
 414                        FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
 415        } else if (u8tmp == 10) {
 416                *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |
 417                        FE_HAS_VITERBI;
 418        }
 419
 420        dev->fe_status = *status;
 421
 422        return ret;
 423err:
 424        dev_dbg(&client->dev, "failed=%d\n", ret);
 425        return ret;
 426}
 427
 428static int rtl2830_read_snr(struct dvb_frontend *fe, u16 *snr)
 429{
 430        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 431
 432        if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)
 433                *snr = div_s64(c->cnr.stat[0].svalue, 100);
 434        else
 435                *snr = 0;
 436
 437        return 0;
 438}
 439
 440static int rtl2830_read_ber(struct dvb_frontend *fe, u32 *ber)
 441{
 442        struct i2c_client *client = fe->demodulator_priv;
 443        struct rtl2830_dev *dev = i2c_get_clientdata(client);
 444
 445        *ber = (dev->post_bit_error - dev->post_bit_error_prev);
 446        dev->post_bit_error_prev = dev->post_bit_error;
 447
 448        return 0;
 449}
 450
 451static int rtl2830_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
 452{
 453        *ucblocks = 0;
 454
 455        return 0;
 456}
 457
 458static int rtl2830_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
 459{
 460        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 461
 462        if (c->strength.stat[0].scale == FE_SCALE_RELATIVE)
 463                *strength = c->strength.stat[0].uvalue;
 464        else
 465                *strength = 0;
 466
 467        return 0;
 468}
 469
 470static struct dvb_frontend_ops rtl2830_ops = {
 471        .delsys = {SYS_DVBT},
 472        .info = {
 473                .name = "Realtek RTL2830 (DVB-T)",
 474                .caps = FE_CAN_FEC_1_2 |
 475                        FE_CAN_FEC_2_3 |
 476                        FE_CAN_FEC_3_4 |
 477                        FE_CAN_FEC_5_6 |
 478                        FE_CAN_FEC_7_8 |
 479                        FE_CAN_FEC_AUTO |
 480                        FE_CAN_QPSK |
 481                        FE_CAN_QAM_16 |
 482                        FE_CAN_QAM_64 |
 483                        FE_CAN_QAM_AUTO |
 484                        FE_CAN_TRANSMISSION_MODE_AUTO |
 485                        FE_CAN_GUARD_INTERVAL_AUTO |
 486                        FE_CAN_HIERARCHY_AUTO |
 487                        FE_CAN_RECOVER |
 488                        FE_CAN_MUTE_TS
 489        },
 490
 491        .init = rtl2830_init,
 492        .sleep = rtl2830_sleep,
 493
 494        .get_tune_settings = rtl2830_get_tune_settings,
 495
 496        .set_frontend = rtl2830_set_frontend,
 497        .get_frontend = rtl2830_get_frontend,
 498
 499        .read_status = rtl2830_read_status,
 500        .read_snr = rtl2830_read_snr,
 501        .read_ber = rtl2830_read_ber,
 502        .read_ucblocks = rtl2830_read_ucblocks,
 503        .read_signal_strength = rtl2830_read_signal_strength,
 504};
 505
 506static void rtl2830_stat_work(struct work_struct *work)
 507{
 508        struct rtl2830_dev *dev = container_of(work, struct rtl2830_dev, stat_work.work);
 509        struct i2c_client *client = dev->client;
 510        struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache;
 511        int ret, tmp;
 512        u8 u8tmp, buf[2];
 513        u16 u16tmp;
 514
 515        dev_dbg(&client->dev, "\n");
 516
 517        /* signal strength */
 518        if (dev->fe_status & FE_HAS_SIGNAL) {
 519                struct {signed int x:14; } s;
 520
 521                /* read IF AGC */
 522                ret = rtl2830_bulk_read(client, 0x359, buf, 2);
 523                if (ret)
 524                        goto err;
 525
 526                u16tmp = buf[0] << 8 | buf[1] << 0;
 527                u16tmp &= 0x3fff; /* [13:0] */
 528                tmp = s.x = u16tmp; /* 14-bit bin to 2 complement */
 529                u16tmp = clamp_val(-4 * tmp + 32767, 0x0000, 0xffff);
 530
 531                dev_dbg(&client->dev, "IF AGC=%d\n", tmp);
 532
 533                c->strength.stat[0].scale = FE_SCALE_RELATIVE;
 534                c->strength.stat[0].uvalue = u16tmp;
 535        } else {
 536                c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 537        }
 538
 539        /* CNR */
 540        if (dev->fe_status & FE_HAS_VITERBI) {
 541                unsigned hierarchy, constellation;
 542                #define CONSTELLATION_NUM 3
 543                #define HIERARCHY_NUM 4
 544                static const u32 constant[CONSTELLATION_NUM][HIERARCHY_NUM] = {
 545                        {70705899, 70705899, 70705899, 70705899},
 546                        {82433173, 82433173, 87483115, 94445660},
 547                        {92888734, 92888734, 95487525, 99770748},
 548                };
 549
 550                ret = rtl2830_bulk_read(client, 0x33c, &u8tmp, 1);
 551                if (ret)
 552                        goto err;
 553
 554                constellation = (u8tmp >> 2) & 0x03; /* [3:2] */
 555                if (constellation > CONSTELLATION_NUM - 1)
 556                        goto err_schedule_delayed_work;
 557
 558                hierarchy = (u8tmp >> 4) & 0x07; /* [6:4] */
 559                if (hierarchy > HIERARCHY_NUM - 1)
 560                        goto err_schedule_delayed_work;
 561
 562                ret = rtl2830_bulk_read(client, 0x40c, buf, 2);
 563                if (ret)
 564                        goto err;
 565
 566                u16tmp = buf[0] << 8 | buf[1] << 0;
 567                if (u16tmp)
 568                        tmp = (constant[constellation][hierarchy] -
 569                               intlog10(u16tmp)) / ((1 << 24) / 10000);
 570                else
 571                        tmp = 0;
 572
 573                dev_dbg(&client->dev, "CNR raw=%u\n", u16tmp);
 574
 575                c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
 576                c->cnr.stat[0].svalue = tmp;
 577        } else {
 578                c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 579        }
 580
 581        /* BER */
 582        if (dev->fe_status & FE_HAS_LOCK) {
 583                ret = rtl2830_bulk_read(client, 0x34e, buf, 2);
 584                if (ret)
 585                        goto err;
 586
 587                u16tmp = buf[0] << 8 | buf[1] << 0;
 588                dev->post_bit_error += u16tmp;
 589                dev->post_bit_count += 1000000;
 590
 591                dev_dbg(&client->dev, "BER errors=%u total=1000000\n", u16tmp);
 592
 593                c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
 594                c->post_bit_error.stat[0].uvalue = dev->post_bit_error;
 595                c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
 596                c->post_bit_count.stat[0].uvalue = dev->post_bit_count;
 597        } else {
 598                c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 599                c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
 600        }
 601
 602err_schedule_delayed_work:
 603        schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000));
 604        return;
 605err:
 606        dev_dbg(&client->dev, "failed=%d\n", ret);
 607}
 608
 609static int rtl2830_pid_filter_ctrl(struct dvb_frontend *fe, int onoff)
 610{
 611        struct i2c_client *client = fe->demodulator_priv;
 612        int ret;
 613        u8 u8tmp;
 614
 615        dev_dbg(&client->dev, "onoff=%d\n", onoff);
 616
 617        /* enable / disable PID filter */
 618        if (onoff)
 619                u8tmp = 0x80;
 620        else
 621                u8tmp = 0x00;
 622
 623        ret = rtl2830_update_bits(client, 0x061, 0x80, u8tmp);
 624        if (ret)
 625                goto err;
 626
 627        return 0;
 628err:
 629        dev_dbg(&client->dev, "failed=%d\n", ret);
 630        return ret;
 631}
 632
 633static int rtl2830_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid, int onoff)
 634{
 635        struct i2c_client *client = fe->demodulator_priv;
 636        struct rtl2830_dev *dev = i2c_get_clientdata(client);
 637        int ret;
 638        u8 buf[4];
 639
 640        dev_dbg(&client->dev, "index=%d pid=%04x onoff=%d\n",
 641                index, pid, onoff);
 642
 643        /* skip invalid PIDs (0x2000) */
 644        if (pid > 0x1fff || index > 32)
 645                return 0;
 646
 647        if (onoff)
 648                set_bit(index, &dev->filters);
 649        else
 650                clear_bit(index, &dev->filters);
 651
 652        /* enable / disable PIDs */
 653        buf[0] = (dev->filters >>  0) & 0xff;
 654        buf[1] = (dev->filters >>  8) & 0xff;
 655        buf[2] = (dev->filters >> 16) & 0xff;
 656        buf[3] = (dev->filters >> 24) & 0xff;
 657        ret = rtl2830_bulk_write(client, 0x062, buf, 4);
 658        if (ret)
 659                goto err;
 660
 661        /* add PID */
 662        buf[0] = (pid >> 8) & 0xff;
 663        buf[1] = (pid >> 0) & 0xff;
 664        ret = rtl2830_bulk_write(client, 0x066 + 2 * index, buf, 2);
 665        if (ret)
 666                goto err;
 667
 668        return 0;
 669err:
 670        dev_dbg(&client->dev, "failed=%d\n", ret);
 671        return ret;
 672}
 673
 674/*
 675 * I2C gate/mux/repeater logic
 676 * We must use unlocked __i2c_transfer() here (through regmap) because of I2C
 677 * adapter lock is already taken by tuner driver.
 678 * Gate is closed automatically after single I2C transfer.
 679 */
 680static int rtl2830_select(struct i2c_adapter *adap, void *mux_priv, u32 chan_id)
 681{
 682        struct i2c_client *client = mux_priv;
 683        struct rtl2830_dev *dev = i2c_get_clientdata(client);
 684        int ret;
 685
 686        dev_dbg(&client->dev, "\n");
 687
 688        /* open I2C repeater for 1 transfer, closes automatically */
 689        /* XXX: regmap_update_bits() does not lock I2C adapter */
 690        ret = regmap_update_bits(dev->regmap, 0x101, 0x08, 0x08);
 691        if (ret)
 692                goto err;
 693
 694        return 0;
 695err:
 696        dev_dbg(&client->dev, "failed=%d\n", ret);
 697        return ret;
 698}
 699
 700static struct dvb_frontend *rtl2830_get_dvb_frontend(struct i2c_client *client)
 701{
 702        struct rtl2830_dev *dev = i2c_get_clientdata(client);
 703
 704        dev_dbg(&client->dev, "\n");
 705
 706        return &dev->fe;
 707}
 708
 709static struct i2c_adapter *rtl2830_get_i2c_adapter(struct i2c_client *client)
 710{
 711        struct rtl2830_dev *dev = i2c_get_clientdata(client);
 712
 713        dev_dbg(&client->dev, "\n");
 714
 715        return dev->adapter;
 716}
 717
 718/*
 719 * We implement own I2C access routines for regmap in order to get manual access
 720 * to I2C adapter lock, which is needed for I2C mux adapter.
 721 */
 722static int rtl2830_regmap_read(void *context, const void *reg_buf,
 723                               size_t reg_size, void *val_buf, size_t val_size)
 724{
 725        struct i2c_client *client = context;
 726        int ret;
 727        struct i2c_msg msg[2] = {
 728                {
 729                        .addr = client->addr,
 730                        .flags = 0,
 731                        .len = reg_size,
 732                        .buf = (u8 *)reg_buf,
 733                }, {
 734                        .addr = client->addr,
 735                        .flags = I2C_M_RD,
 736                        .len = val_size,
 737                        .buf = val_buf,
 738                }
 739        };
 740
 741        ret = __i2c_transfer(client->adapter, msg, 2);
 742        if (ret != 2) {
 743                dev_warn(&client->dev, "i2c reg read failed %d\n", ret);
 744                if (ret >= 0)
 745                        ret = -EREMOTEIO;
 746                return ret;
 747        }
 748        return 0;
 749}
 750
 751static int rtl2830_regmap_write(void *context, const void *data, size_t count)
 752{
 753        struct i2c_client *client = context;
 754        int ret;
 755        struct i2c_msg msg[1] = {
 756                {
 757                        .addr = client->addr,
 758                        .flags = 0,
 759                        .len = count,
 760                        .buf = (u8 *)data,
 761                }
 762        };
 763
 764        ret = __i2c_transfer(client->adapter, msg, 1);
 765        if (ret != 1) {
 766                dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
 767                if (ret >= 0)
 768                        ret = -EREMOTEIO;
 769                return ret;
 770        }
 771        return 0;
 772}
 773
 774static int rtl2830_regmap_gather_write(void *context, const void *reg,
 775                                       size_t reg_len, const void *val,
 776                                       size_t val_len)
 777{
 778        struct i2c_client *client = context;
 779        int ret;
 780        u8 buf[256];
 781        struct i2c_msg msg[1] = {
 782                {
 783                        .addr = client->addr,
 784                        .flags = 0,
 785                        .len = 1 + val_len,
 786                        .buf = buf,
 787                }
 788        };
 789
 790        buf[0] = *(u8 const *)reg;
 791        memcpy(&buf[1], val, val_len);
 792
 793        ret = __i2c_transfer(client->adapter, msg, 1);
 794        if (ret != 1) {
 795                dev_warn(&client->dev, "i2c reg write failed %d\n", ret);
 796                if (ret >= 0)
 797                        ret = -EREMOTEIO;
 798                return ret;
 799        }
 800        return 0;
 801}
 802
 803static int rtl2830_probe(struct i2c_client *client,
 804                         const struct i2c_device_id *id)
 805{
 806        struct rtl2830_platform_data *pdata = client->dev.platform_data;
 807        struct rtl2830_dev *dev;
 808        int ret;
 809        u8 u8tmp;
 810        static const struct regmap_bus regmap_bus = {
 811                .read = rtl2830_regmap_read,
 812                .write = rtl2830_regmap_write,
 813                .gather_write = rtl2830_regmap_gather_write,
 814                .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
 815        };
 816        static const struct regmap_range_cfg regmap_range_cfg[] = {
 817                {
 818                        .selector_reg     = 0x00,
 819                        .selector_mask    = 0xff,
 820                        .selector_shift   = 0,
 821                        .window_start     = 0,
 822                        .window_len       = 0x100,
 823                        .range_min        = 0 * 0x100,
 824                        .range_max        = 5 * 0x100,
 825                },
 826        };
 827        static const struct regmap_config regmap_config = {
 828                .reg_bits    =  8,
 829                .val_bits    =  8,
 830                .max_register = 5 * 0x100,
 831                .ranges = regmap_range_cfg,
 832                .num_ranges = ARRAY_SIZE(regmap_range_cfg),
 833        };
 834
 835        dev_dbg(&client->dev, "\n");
 836
 837        if (pdata == NULL) {
 838                ret = -EINVAL;
 839                goto err;
 840        }
 841
 842        /* allocate memory for the internal state */
 843        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
 844        if (dev == NULL) {
 845                ret = -ENOMEM;
 846                goto err;
 847        }
 848
 849        /* setup the state */
 850        i2c_set_clientdata(client, dev);
 851        dev->client = client;
 852        dev->pdata = client->dev.platform_data;
 853        dev->sleeping = true;
 854        INIT_DELAYED_WORK(&dev->stat_work, rtl2830_stat_work);
 855        dev->regmap = regmap_init(&client->dev, &regmap_bus, client,
 856                                  &regmap_config);
 857        if (IS_ERR(dev->regmap)) {
 858                ret = PTR_ERR(dev->regmap);
 859                goto err_kfree;
 860        }
 861
 862        /* check if the demod is there */
 863        ret = rtl2830_bulk_read(client, 0x000, &u8tmp, 1);
 864        if (ret)
 865                goto err_regmap_exit;
 866
 867        /* create muxed i2c adapter for tuner */
 868        dev->adapter = i2c_add_mux_adapter(client->adapter, &client->dev,
 869                        client, 0, 0, 0, rtl2830_select, NULL);
 870        if (dev->adapter == NULL) {
 871                ret = -ENODEV;
 872                goto err_regmap_exit;
 873        }
 874
 875        /* create dvb frontend */
 876        memcpy(&dev->fe.ops, &rtl2830_ops, sizeof(dev->fe.ops));
 877        dev->fe.demodulator_priv = client;
 878
 879        /* setup callbacks */
 880        pdata->get_dvb_frontend = rtl2830_get_dvb_frontend;
 881        pdata->get_i2c_adapter = rtl2830_get_i2c_adapter;
 882        pdata->pid_filter = rtl2830_pid_filter;
 883        pdata->pid_filter_ctrl = rtl2830_pid_filter_ctrl;
 884
 885        dev_info(&client->dev, "Realtek RTL2830 successfully attached\n");
 886
 887        return 0;
 888err_regmap_exit:
 889        regmap_exit(dev->regmap);
 890err_kfree:
 891        kfree(dev);
 892err:
 893        dev_dbg(&client->dev, "failed=%d\n", ret);
 894        return ret;
 895}
 896
 897static int rtl2830_remove(struct i2c_client *client)
 898{
 899        struct rtl2830_dev *dev = i2c_get_clientdata(client);
 900
 901        dev_dbg(&client->dev, "\n");
 902
 903        /* stop statistics polling */
 904        cancel_delayed_work_sync(&dev->stat_work);
 905
 906        i2c_del_mux_adapter(dev->adapter);
 907        regmap_exit(dev->regmap);
 908        kfree(dev);
 909
 910        return 0;
 911}
 912
 913static const struct i2c_device_id rtl2830_id_table[] = {
 914        {"rtl2830", 0},
 915        {}
 916};
 917MODULE_DEVICE_TABLE(i2c, rtl2830_id_table);
 918
 919static struct i2c_driver rtl2830_driver = {
 920        .driver = {
 921                .name   = "rtl2830",
 922        },
 923        .probe          = rtl2830_probe,
 924        .remove         = rtl2830_remove,
 925        .id_table       = rtl2830_id_table,
 926};
 927
 928module_i2c_driver(rtl2830_driver);
 929
 930MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
 931MODULE_DESCRIPTION("Realtek RTL2830 DVB-T demodulator driver");
 932MODULE_LICENSE("GPL");
 933