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