linux/drivers/media/video/tuner-core.c
<<
>>
Prefs
   1/*
   2 *
   3 * i2c tv tuner chip device driver
   4 * core core, i.e. kernel interfaces, registering and so on
   5 */
   6
   7#include <linux/module.h>
   8#include <linux/kernel.h>
   9#include <linux/string.h>
  10#include <linux/timer.h>
  11#include <linux/delay.h>
  12#include <linux/errno.h>
  13#include <linux/slab.h>
  14#include <linux/poll.h>
  15#include <linux/i2c.h>
  16#include <linux/types.h>
  17#include <linux/init.h>
  18#include <linux/videodev2.h>
  19#include <media/tuner.h>
  20#include <media/tuner-types.h>
  21#include <media/v4l2-device.h>
  22#include <media/v4l2-ioctl.h>
  23#include <media/v4l2-i2c-drv.h>
  24#include "mt20xx.h"
  25#include "tda8290.h"
  26#include "tea5761.h"
  27#include "tea5767.h"
  28#include "tuner-xc2028.h"
  29#include "tuner-simple.h"
  30#include "tda9887.h"
  31#include "xc5000.h"
  32
  33#define UNSET (-1U)
  34
  35#define PREFIX t->i2c->driver->driver.name
  36
  37/** This macro allows us to probe dynamically, avoiding static links */
  38#ifdef CONFIG_MEDIA_ATTACH
  39#define tuner_symbol_probe(FUNCTION, ARGS...) ({ \
  40        int __r = -EINVAL; \
  41        typeof(&FUNCTION) __a = symbol_request(FUNCTION); \
  42        if (__a) { \
  43                __r = (int) __a(ARGS); \
  44                symbol_put(FUNCTION); \
  45        } else { \
  46                printk(KERN_ERR "TUNER: Unable to find " \
  47                                "symbol "#FUNCTION"()\n"); \
  48        } \
  49        __r; \
  50})
  51
  52static void tuner_detach(struct dvb_frontend *fe)
  53{
  54        if (fe->ops.tuner_ops.release) {
  55                fe->ops.tuner_ops.release(fe);
  56                symbol_put_addr(fe->ops.tuner_ops.release);
  57        }
  58        if (fe->ops.analog_ops.release) {
  59                fe->ops.analog_ops.release(fe);
  60                symbol_put_addr(fe->ops.analog_ops.release);
  61        }
  62}
  63#else
  64#define tuner_symbol_probe(FUNCTION, ARGS...) ({ \
  65        FUNCTION(ARGS); \
  66})
  67
  68static void tuner_detach(struct dvb_frontend *fe)
  69{
  70        if (fe->ops.tuner_ops.release)
  71                fe->ops.tuner_ops.release(fe);
  72        if (fe->ops.analog_ops.release)
  73                fe->ops.analog_ops.release(fe);
  74}
  75#endif
  76
  77struct tuner {
  78        /* device */
  79        struct dvb_frontend fe;
  80        struct i2c_client   *i2c;
  81        struct v4l2_subdev  sd;
  82        struct list_head    list;
  83        unsigned int        using_v4l2:1;
  84
  85        /* keep track of the current settings */
  86        v4l2_std_id         std;
  87        unsigned int        tv_freq;
  88        unsigned int        radio_freq;
  89        unsigned int        audmode;
  90
  91        unsigned int        mode;
  92        unsigned int        mode_mask; /* Combination of allowable modes */
  93
  94        unsigned int        type; /* chip type id */
  95        unsigned int        config;
  96        const char          *name;
  97};
  98
  99static inline struct tuner *to_tuner(struct v4l2_subdev *sd)
 100{
 101        return container_of(sd, struct tuner, sd);
 102}
 103
 104
 105/* insmod options used at init time => read/only */
 106static unsigned int addr;
 107static unsigned int no_autodetect;
 108static unsigned int show_i2c;
 109
 110/* insmod options used at runtime => read/write */
 111static int tuner_debug;
 112
 113#define tuner_warn(fmt, arg...) do {                    \
 114        printk(KERN_WARNING "%s %d-%04x: " fmt, PREFIX, \
 115               i2c_adapter_id(t->i2c->adapter),         \
 116               t->i2c->addr, ##arg);                    \
 117         } while (0)
 118
 119#define tuner_info(fmt, arg...) do {                    \
 120        printk(KERN_INFO "%s %d-%04x: " fmt, PREFIX,    \
 121               i2c_adapter_id(t->i2c->adapter),         \
 122               t->i2c->addr, ##arg);                    \
 123         } while (0)
 124
 125#define tuner_err(fmt, arg...) do {                     \
 126        printk(KERN_ERR "%s %d-%04x: " fmt, PREFIX,     \
 127               i2c_adapter_id(t->i2c->adapter),         \
 128               t->i2c->addr, ##arg);                    \
 129         } while (0)
 130
 131#define tuner_dbg(fmt, arg...) do {                             \
 132        if (tuner_debug)                                        \
 133                printk(KERN_DEBUG "%s %d-%04x: " fmt, PREFIX,   \
 134                       i2c_adapter_id(t->i2c->adapter),         \
 135                       t->i2c->addr, ##arg);                    \
 136         } while (0)
 137
 138/* ------------------------------------------------------------------------ */
 139
 140static unsigned int tv_range[2] = { 44, 958 };
 141static unsigned int radio_range[2] = { 65, 108 };
 142
 143static char pal[] = "--";
 144static char secam[] = "--";
 145static char ntsc[] = "-";
 146
 147
 148module_param(addr, int, 0444);
 149module_param(no_autodetect, int, 0444);
 150module_param(show_i2c, int, 0444);
 151module_param_named(debug,tuner_debug, int, 0644);
 152module_param_string(pal, pal, sizeof(pal), 0644);
 153module_param_string(secam, secam, sizeof(secam), 0644);
 154module_param_string(ntsc, ntsc, sizeof(ntsc), 0644);
 155module_param_array(tv_range, int, NULL, 0644);
 156module_param_array(radio_range, int, NULL, 0644);
 157
 158MODULE_DESCRIPTION("device driver for various TV and TV+FM radio tuners");
 159MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
 160MODULE_LICENSE("GPL");
 161
 162/* ---------------------------------------------------------------------- */
 163
 164static void fe_set_params(struct dvb_frontend *fe,
 165                          struct analog_parameters *params)
 166{
 167        struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
 168        struct tuner *t = fe->analog_demod_priv;
 169
 170        if (NULL == fe_tuner_ops->set_analog_params) {
 171                tuner_warn("Tuner frontend module has no way to set freq\n");
 172                return;
 173        }
 174        fe_tuner_ops->set_analog_params(fe, params);
 175}
 176
 177static void fe_standby(struct dvb_frontend *fe)
 178{
 179        struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
 180
 181        if (fe_tuner_ops->sleep)
 182                fe_tuner_ops->sleep(fe);
 183}
 184
 185static int fe_has_signal(struct dvb_frontend *fe)
 186{
 187        u16 strength = 0;
 188
 189        if (fe->ops.tuner_ops.get_rf_strength)
 190                fe->ops.tuner_ops.get_rf_strength(fe, &strength);
 191
 192        return strength;
 193}
 194
 195static int fe_set_config(struct dvb_frontend *fe, void *priv_cfg)
 196{
 197        struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
 198        struct tuner *t = fe->analog_demod_priv;
 199
 200        if (fe_tuner_ops->set_config)
 201                return fe_tuner_ops->set_config(fe, priv_cfg);
 202
 203        tuner_warn("Tuner frontend module has no way to set config\n");
 204
 205        return 0;
 206}
 207
 208static void tuner_status(struct dvb_frontend *fe);
 209
 210static struct analog_demod_ops tuner_analog_ops = {
 211        .set_params     = fe_set_params,
 212        .standby        = fe_standby,
 213        .has_signal     = fe_has_signal,
 214        .set_config     = fe_set_config,
 215        .tuner_status   = tuner_status
 216};
 217
 218/* Set tuner frequency,  freq in Units of 62.5kHz = 1/16MHz */
 219static void set_tv_freq(struct i2c_client *c, unsigned int freq)
 220{
 221        struct tuner *t = to_tuner(i2c_get_clientdata(c));
 222        struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 223
 224        struct analog_parameters params = {
 225                .mode      = t->mode,
 226                .audmode   = t->audmode,
 227                .std       = t->std
 228        };
 229
 230        if (t->type == UNSET) {
 231                tuner_warn ("tuner type not set\n");
 232                return;
 233        }
 234        if (NULL == analog_ops->set_params) {
 235                tuner_warn ("Tuner has no way to set tv freq\n");
 236                return;
 237        }
 238        if (freq < tv_range[0] * 16 || freq > tv_range[1] * 16) {
 239                tuner_dbg ("TV freq (%d.%02d) out of range (%d-%d)\n",
 240                           freq / 16, freq % 16 * 100 / 16, tv_range[0],
 241                           tv_range[1]);
 242                /* V4L2 spec: if the freq is not possible then the closest
 243                   possible value should be selected */
 244                if (freq < tv_range[0] * 16)
 245                        freq = tv_range[0] * 16;
 246                else
 247                        freq = tv_range[1] * 16;
 248        }
 249        params.frequency = freq;
 250
 251        analog_ops->set_params(&t->fe, &params);
 252}
 253
 254static void set_radio_freq(struct i2c_client *c, unsigned int freq)
 255{
 256        struct tuner *t = to_tuner(i2c_get_clientdata(c));
 257        struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 258
 259        struct analog_parameters params = {
 260                .mode      = t->mode,
 261                .audmode   = t->audmode,
 262                .std       = t->std
 263        };
 264
 265        if (t->type == UNSET) {
 266                tuner_warn ("tuner type not set\n");
 267                return;
 268        }
 269        if (NULL == analog_ops->set_params) {
 270                tuner_warn ("tuner has no way to set radio frequency\n");
 271                return;
 272        }
 273        if (freq < radio_range[0] * 16000 || freq > radio_range[1] * 16000) {
 274                tuner_dbg ("radio freq (%d.%02d) out of range (%d-%d)\n",
 275                           freq / 16000, freq % 16000 * 100 / 16000,
 276                           radio_range[0], radio_range[1]);
 277                /* V4L2 spec: if the freq is not possible then the closest
 278                   possible value should be selected */
 279                if (freq < radio_range[0] * 16000)
 280                        freq = radio_range[0] * 16000;
 281                else
 282                        freq = radio_range[1] * 16000;
 283        }
 284        params.frequency = freq;
 285
 286        analog_ops->set_params(&t->fe, &params);
 287}
 288
 289static void set_freq(struct i2c_client *c, unsigned long freq)
 290{
 291        struct tuner *t = to_tuner(i2c_get_clientdata(c));
 292
 293        switch (t->mode) {
 294        case V4L2_TUNER_RADIO:
 295                tuner_dbg("radio freq set to %lu.%02lu\n",
 296                          freq / 16000, freq % 16000 * 100 / 16000);
 297                set_radio_freq(c, freq);
 298                t->radio_freq = freq;
 299                break;
 300        case V4L2_TUNER_ANALOG_TV:
 301        case V4L2_TUNER_DIGITAL_TV:
 302                tuner_dbg("tv freq set to %lu.%02lu\n",
 303                          freq / 16, freq % 16 * 100 / 16);
 304                set_tv_freq(c, freq);
 305                t->tv_freq = freq;
 306                break;
 307        default:
 308                tuner_dbg("freq set: unknown mode: 0x%04x!\n",t->mode);
 309        }
 310}
 311
 312static void tuner_i2c_address_check(struct tuner *t)
 313{
 314        if ((t->type == UNSET || t->type == TUNER_ABSENT) ||
 315            ((t->i2c->addr < 0x64) || (t->i2c->addr > 0x6f)))
 316                return;
 317
 318        /* We already know that the XC5000 can only be located at
 319         * i2c address 0x61, 0x62, 0x63 or 0x64 */
 320        if ((t->type == TUNER_XC5000) &&
 321            ((t->i2c->addr <= 0x64)) && (t->i2c->addr >= 0x61))
 322                return;
 323
 324        tuner_warn("====================== WARNING! ======================\n");
 325        tuner_warn("Support for tuners in i2c address range 0x64 thru 0x6f\n");
 326        tuner_warn("will soon be dropped. This message indicates that your\n");
 327        tuner_warn("hardware has a %s tuner at i2c address 0x%02x.\n",
 328                   t->name, t->i2c->addr);
 329        tuner_warn("To ensure continued support for your device, please\n");
 330        tuner_warn("send a copy of this message, along with full dmesg\n");
 331        tuner_warn("output to v4l-dvb-maintainer@linuxtv.org\n");
 332        tuner_warn("Please use subject line: \"obsolete tuner i2c address.\"\n");
 333        tuner_warn("driver: %s, addr: 0x%02x, type: %d (%s)\n",
 334                   t->i2c->adapter->name, t->i2c->addr, t->type, t->name);
 335        tuner_warn("====================== WARNING! ======================\n");
 336}
 337
 338static struct xc5000_config xc5000_cfg;
 339
 340static void set_type(struct i2c_client *c, unsigned int type,
 341                     unsigned int new_mode_mask, unsigned int new_config,
 342                     int (*tuner_callback) (void *dev, int component, int cmd, int arg))
 343{
 344        struct tuner *t = to_tuner(i2c_get_clientdata(c));
 345        struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
 346        struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 347        unsigned char buffer[4];
 348
 349        if (type == UNSET || type == TUNER_ABSENT) {
 350                tuner_dbg ("tuner 0x%02x: Tuner type absent\n",c->addr);
 351                return;
 352        }
 353
 354        t->type = type;
 355        /* prevent invalid config values */
 356        t->config = ((new_config >= 0) && (new_config < 256)) ? new_config : 0;
 357        if (tuner_callback != NULL) {
 358                tuner_dbg("defining GPIO callback\n");
 359                t->fe.callback = tuner_callback;
 360        }
 361
 362        if (t->mode == T_UNINITIALIZED) {
 363                tuner_dbg ("tuner 0x%02x: called during i2c_client register by adapter's attach_inform\n", c->addr);
 364
 365                return;
 366        }
 367
 368        /* discard private data, in case set_type() was previously called */
 369        tuner_detach(&t->fe);
 370        t->fe.analog_demod_priv = NULL;
 371
 372        switch (t->type) {
 373        case TUNER_MT2032:
 374                if (!dvb_attach(microtune_attach,
 375                           &t->fe, t->i2c->adapter, t->i2c->addr))
 376                        goto attach_failed;
 377                break;
 378        case TUNER_PHILIPS_TDA8290:
 379        {
 380                struct tda829x_config cfg = {
 381                        .lna_cfg        = t->config,
 382                };
 383                if (!dvb_attach(tda829x_attach, &t->fe, t->i2c->adapter,
 384                                t->i2c->addr, &cfg))
 385                        goto attach_failed;
 386                break;
 387        }
 388        case TUNER_TEA5767:
 389                if (!dvb_attach(tea5767_attach, &t->fe,
 390                                t->i2c->adapter, t->i2c->addr))
 391                        goto attach_failed;
 392                t->mode_mask = T_RADIO;
 393                break;
 394        case TUNER_TEA5761:
 395                if (!dvb_attach(tea5761_attach, &t->fe,
 396                                t->i2c->adapter, t->i2c->addr))
 397                        goto attach_failed;
 398                t->mode_mask = T_RADIO;
 399                break;
 400        case TUNER_PHILIPS_FMD1216ME_MK3:
 401                buffer[0] = 0x0b;
 402                buffer[1] = 0xdc;
 403                buffer[2] = 0x9c;
 404                buffer[3] = 0x60;
 405                i2c_master_send(c, buffer, 4);
 406                mdelay(1);
 407                buffer[2] = 0x86;
 408                buffer[3] = 0x54;
 409                i2c_master_send(c, buffer, 4);
 410                if (!dvb_attach(simple_tuner_attach, &t->fe,
 411                                t->i2c->adapter, t->i2c->addr, t->type))
 412                        goto attach_failed;
 413                break;
 414        case TUNER_PHILIPS_TD1316:
 415                buffer[0] = 0x0b;
 416                buffer[1] = 0xdc;
 417                buffer[2] = 0x86;
 418                buffer[3] = 0xa4;
 419                i2c_master_send(c, buffer, 4);
 420                if (!dvb_attach(simple_tuner_attach, &t->fe,
 421                                t->i2c->adapter, t->i2c->addr, t->type))
 422                        goto attach_failed;
 423                break;
 424        case TUNER_XC2028:
 425        {
 426                struct xc2028_config cfg = {
 427                        .i2c_adap  = t->i2c->adapter,
 428                        .i2c_addr  = t->i2c->addr,
 429                };
 430                if (!dvb_attach(xc2028_attach, &t->fe, &cfg))
 431                        goto attach_failed;
 432                break;
 433        }
 434        case TUNER_TDA9887:
 435                if (!dvb_attach(tda9887_attach,
 436                           &t->fe, t->i2c->adapter, t->i2c->addr))
 437                        goto attach_failed;
 438                break;
 439        case TUNER_XC5000:
 440        {
 441                struct dvb_tuner_ops *xc_tuner_ops;
 442
 443                xc5000_cfg.i2c_address    = t->i2c->addr;
 444                /* if_khz will be set when the digital dvb_attach() occurs */
 445                xc5000_cfg.if_khz         = 0;
 446                if (!dvb_attach(xc5000_attach,
 447                                &t->fe, t->i2c->adapter, &xc5000_cfg))
 448                        goto attach_failed;
 449
 450                xc_tuner_ops = &t->fe.ops.tuner_ops;
 451                if (xc_tuner_ops->init)
 452                        xc_tuner_ops->init(&t->fe);
 453                break;
 454        }
 455        default:
 456                if (!dvb_attach(simple_tuner_attach, &t->fe,
 457                                t->i2c->adapter, t->i2c->addr, t->type))
 458                        goto attach_failed;
 459
 460                break;
 461        }
 462
 463        if ((NULL == analog_ops->set_params) &&
 464            (fe_tuner_ops->set_analog_params)) {
 465
 466                t->name = fe_tuner_ops->info.name;
 467
 468                t->fe.analog_demod_priv = t;
 469                memcpy(analog_ops, &tuner_analog_ops,
 470                       sizeof(struct analog_demod_ops));
 471
 472        } else {
 473                t->name = analog_ops->info.name;
 474        }
 475
 476        tuner_dbg("type set to %s\n", t->name);
 477
 478        if (t->mode_mask == T_UNINITIALIZED)
 479                t->mode_mask = new_mode_mask;
 480
 481        /* xc2028/3028 and xc5000 requires a firmware to be set-up later
 482           trying to set a frequency here will just fail
 483           FIXME: better to move set_freq to the tuner code. This is needed
 484           on analog tuners for PLL to properly work
 485         */
 486        if (t->type != TUNER_XC2028 && t->type != TUNER_XC5000)
 487                set_freq(c, (V4L2_TUNER_RADIO == t->mode) ?
 488                            t->radio_freq : t->tv_freq);
 489
 490        tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n",
 491                  c->adapter->name, c->driver->driver.name, c->addr << 1, type,
 492                  t->mode_mask);
 493        tuner_i2c_address_check(t);
 494        return;
 495
 496attach_failed:
 497        tuner_dbg("Tuner attach for type = %d failed.\n", t->type);
 498        t->type = TUNER_ABSENT;
 499        t->mode_mask = T_UNINITIALIZED;
 500
 501        return;
 502}
 503
 504/*
 505 * This function apply tuner config to tuner specified
 506 * by tun_setup structure. I addr is unset, then admin status
 507 * and tun addr status is more precise then current status,
 508 * it's applied. Otherwise status and type are applied only to
 509 * tuner with exactly the same addr.
 510*/
 511
 512static void set_addr(struct i2c_client *c, struct tuner_setup *tun_setup)
 513{
 514        struct tuner *t = to_tuner(i2c_get_clientdata(c));
 515
 516        if ( (t->type == UNSET && ((tun_setup->addr == ADDR_UNSET) &&
 517                (t->mode_mask & tun_setup->mode_mask))) ||
 518                (tun_setup->addr == c->addr)) {
 519                        set_type(c, tun_setup->type, tun_setup->mode_mask,
 520                                 tun_setup->config, tun_setup->tuner_callback);
 521        } else
 522                tuner_dbg("set addr discarded for type %i, mask %x. "
 523                          "Asked to change tuner at addr 0x%02x, with mask %x\n",
 524                          t->type, t->mode_mask,
 525                          tun_setup->addr, tun_setup->mode_mask);
 526}
 527
 528static inline int check_mode(struct tuner *t, char *cmd)
 529{
 530        if ((1 << t->mode & t->mode_mask) == 0) {
 531                return -EINVAL;
 532        }
 533
 534        switch (t->mode) {
 535        case V4L2_TUNER_RADIO:
 536                tuner_dbg("Cmd %s accepted for radio\n", cmd);
 537                break;
 538        case V4L2_TUNER_ANALOG_TV:
 539                tuner_dbg("Cmd %s accepted for analog TV\n", cmd);
 540                break;
 541        case V4L2_TUNER_DIGITAL_TV:
 542                tuner_dbg("Cmd %s accepted for digital TV\n", cmd);
 543                break;
 544        }
 545        return 0;
 546}
 547
 548/* get more precise norm info from insmod option */
 549static int tuner_fixup_std(struct tuner *t)
 550{
 551        if ((t->std & V4L2_STD_PAL) == V4L2_STD_PAL) {
 552                switch (pal[0]) {
 553                case '6':
 554                        tuner_dbg ("insmod fixup: PAL => PAL-60\n");
 555                        t->std = V4L2_STD_PAL_60;
 556                        break;
 557                case 'b':
 558                case 'B':
 559                case 'g':
 560                case 'G':
 561                        tuner_dbg ("insmod fixup: PAL => PAL-BG\n");
 562                        t->std = V4L2_STD_PAL_BG;
 563                        break;
 564                case 'i':
 565                case 'I':
 566                        tuner_dbg ("insmod fixup: PAL => PAL-I\n");
 567                        t->std = V4L2_STD_PAL_I;
 568                        break;
 569                case 'd':
 570                case 'D':
 571                case 'k':
 572                case 'K':
 573                        tuner_dbg ("insmod fixup: PAL => PAL-DK\n");
 574                        t->std = V4L2_STD_PAL_DK;
 575                        break;
 576                case 'M':
 577                case 'm':
 578                        tuner_dbg ("insmod fixup: PAL => PAL-M\n");
 579                        t->std = V4L2_STD_PAL_M;
 580                        break;
 581                case 'N':
 582                case 'n':
 583                        if (pal[1] == 'c' || pal[1] == 'C') {
 584                                tuner_dbg("insmod fixup: PAL => PAL-Nc\n");
 585                                t->std = V4L2_STD_PAL_Nc;
 586                        } else {
 587                                tuner_dbg ("insmod fixup: PAL => PAL-N\n");
 588                                t->std = V4L2_STD_PAL_N;
 589                        }
 590                        break;
 591                case '-':
 592                        /* default parameter, do nothing */
 593                        break;
 594                default:
 595                        tuner_warn ("pal= argument not recognised\n");
 596                        break;
 597                }
 598        }
 599        if ((t->std & V4L2_STD_SECAM) == V4L2_STD_SECAM) {
 600                switch (secam[0]) {
 601                case 'b':
 602                case 'B':
 603                case 'g':
 604                case 'G':
 605                case 'h':
 606                case 'H':
 607                        tuner_dbg("insmod fixup: SECAM => SECAM-BGH\n");
 608                        t->std = V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H;
 609                        break;
 610                case 'd':
 611                case 'D':
 612                case 'k':
 613                case 'K':
 614                        tuner_dbg ("insmod fixup: SECAM => SECAM-DK\n");
 615                        t->std = V4L2_STD_SECAM_DK;
 616                        break;
 617                case 'l':
 618                case 'L':
 619                        if ((secam[1]=='C')||(secam[1]=='c')) {
 620                                tuner_dbg ("insmod fixup: SECAM => SECAM-L'\n");
 621                                t->std = V4L2_STD_SECAM_LC;
 622                        } else {
 623                                tuner_dbg ("insmod fixup: SECAM => SECAM-L\n");
 624                                t->std = V4L2_STD_SECAM_L;
 625                        }
 626                        break;
 627                case '-':
 628                        /* default parameter, do nothing */
 629                        break;
 630                default:
 631                        tuner_warn ("secam= argument not recognised\n");
 632                        break;
 633                }
 634        }
 635
 636        if ((t->std & V4L2_STD_NTSC) == V4L2_STD_NTSC) {
 637                switch (ntsc[0]) {
 638                case 'm':
 639                case 'M':
 640                        tuner_dbg("insmod fixup: NTSC => NTSC-M\n");
 641                        t->std = V4L2_STD_NTSC_M;
 642                        break;
 643                case 'j':
 644                case 'J':
 645                        tuner_dbg("insmod fixup: NTSC => NTSC_M_JP\n");
 646                        t->std = V4L2_STD_NTSC_M_JP;
 647                        break;
 648                case 'k':
 649                case 'K':
 650                        tuner_dbg("insmod fixup: NTSC => NTSC_M_KR\n");
 651                        t->std = V4L2_STD_NTSC_M_KR;
 652                        break;
 653                case '-':
 654                        /* default parameter, do nothing */
 655                        break;
 656                default:
 657                        tuner_info("ntsc= argument not recognised\n");
 658                        break;
 659                }
 660        }
 661        return 0;
 662}
 663
 664static void tuner_status(struct dvb_frontend *fe)
 665{
 666        struct tuner *t = fe->analog_demod_priv;
 667        unsigned long freq, freq_fraction;
 668        struct dvb_tuner_ops *fe_tuner_ops = &fe->ops.tuner_ops;
 669        struct analog_demod_ops *analog_ops = &fe->ops.analog_ops;
 670        const char *p;
 671
 672        switch (t->mode) {
 673                case V4L2_TUNER_RADIO:      p = "radio"; break;
 674                case V4L2_TUNER_ANALOG_TV:  p = "analog TV"; break;
 675                case V4L2_TUNER_DIGITAL_TV: p = "digital TV"; break;
 676                default: p = "undefined"; break;
 677        }
 678        if (t->mode == V4L2_TUNER_RADIO) {
 679                freq = t->radio_freq / 16000;
 680                freq_fraction = (t->radio_freq % 16000) * 100 / 16000;
 681        } else {
 682                freq = t->tv_freq / 16;
 683                freq_fraction = (t->tv_freq % 16) * 100 / 16;
 684        }
 685        tuner_info("Tuner mode:      %s\n", p);
 686        tuner_info("Frequency:       %lu.%02lu MHz\n", freq, freq_fraction);
 687        tuner_info("Standard:        0x%08lx\n", (unsigned long)t->std);
 688        if (t->mode != V4L2_TUNER_RADIO)
 689               return;
 690        if (fe_tuner_ops->get_status) {
 691                u32 tuner_status;
 692
 693                fe_tuner_ops->get_status(&t->fe, &tuner_status);
 694                if (tuner_status & TUNER_STATUS_LOCKED)
 695                        tuner_info("Tuner is locked.\n");
 696                if (tuner_status & TUNER_STATUS_STEREO)
 697                        tuner_info("Stereo:          yes\n");
 698        }
 699        if (analog_ops->has_signal)
 700                tuner_info("Signal strength: %d\n",
 701                           analog_ops->has_signal(fe));
 702        if (analog_ops->is_stereo)
 703                tuner_info("Stereo:          %s\n",
 704                           analog_ops->is_stereo(fe) ? "yes" : "no");
 705}
 706
 707/* ---------------------------------------------------------------------- */
 708
 709/*
 710 * Switch tuner to other mode. If tuner support both tv and radio,
 711 * set another frequency to some value (This is needed for some pal
 712 * tuners to avoid locking). Otherwise, just put second tuner in
 713 * standby mode.
 714 */
 715
 716static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode, char *cmd)
 717{
 718        struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 719
 720        if (mode == t->mode)
 721                return 0;
 722
 723        t->mode = mode;
 724
 725        if (check_mode(t, cmd) == -EINVAL) {
 726                tuner_dbg("Tuner doesn't support this mode. "
 727                          "Putting tuner to sleep\n");
 728                t->mode = T_STANDBY;
 729                if (analog_ops->standby)
 730                        analog_ops->standby(&t->fe);
 731                return -EINVAL;
 732        }
 733        return 0;
 734}
 735
 736#define switch_v4l2()   if (!t->using_v4l2) \
 737                            tuner_dbg("switching to v4l2\n"); \
 738                        t->using_v4l2 = 1;
 739
 740static inline int check_v4l2(struct tuner *t)
 741{
 742        /* bttv still uses both v4l1 and v4l2 calls to the tuner (v4l2 for
 743           TV, v4l1 for radio), until that is fixed this code is disabled.
 744           Otherwise the radio (v4l1) wouldn't tune after using the TV (v4l2)
 745           first. */
 746        return 0;
 747}
 748
 749static int tuner_s_type_addr(struct v4l2_subdev *sd, struct tuner_setup *type)
 750{
 751        struct tuner *t = to_tuner(sd);
 752        struct i2c_client *client = v4l2_get_subdevdata(sd);
 753
 754        tuner_dbg("Calling set_type_addr for type=%d, addr=0x%02x, mode=0x%02x, config=0x%02x\n",
 755                        type->type,
 756                        type->addr,
 757                        type->mode_mask,
 758                        type->config);
 759
 760        set_addr(client, type);
 761        return 0;
 762}
 763
 764static int tuner_s_radio(struct v4l2_subdev *sd)
 765{
 766        struct tuner *t = to_tuner(sd);
 767        struct i2c_client *client = v4l2_get_subdevdata(sd);
 768
 769        if (set_mode(client, t, V4L2_TUNER_RADIO, "s_radio") == -EINVAL)
 770                return 0;
 771        if (t->radio_freq)
 772                set_freq(client, t->radio_freq);
 773        return 0;
 774}
 775
 776static int tuner_s_standby(struct v4l2_subdev *sd)
 777{
 778        struct tuner *t = to_tuner(sd);
 779        struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 780
 781        tuner_dbg("Putting tuner to sleep\n");
 782
 783        if (check_mode(t, "s_standby") == -EINVAL)
 784                return 0;
 785        t->mode = T_STANDBY;
 786        if (analog_ops->standby)
 787                analog_ops->standby(&t->fe);
 788        return 0;
 789}
 790
 791static int tuner_s_config(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *cfg)
 792{
 793        struct tuner *t = to_tuner(sd);
 794        struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 795
 796        if (t->type != cfg->tuner)
 797                return 0;
 798
 799        if (analog_ops->set_config) {
 800                analog_ops->set_config(&t->fe, cfg->priv);
 801                return 0;
 802        }
 803
 804        tuner_dbg("Tuner frontend module has no way to set config\n");
 805        return 0;
 806}
 807
 808/* --- v4l ioctls --- */
 809/* take care: bttv does userspace copying, we'll get a
 810   kernel pointer here... */
 811static int tuner_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
 812{
 813        struct tuner *t = to_tuner(sd);
 814        struct i2c_client *client = v4l2_get_subdevdata(sd);
 815
 816        if (set_mode(client, t, V4L2_TUNER_ANALOG_TV, "s_std") == -EINVAL)
 817                return 0;
 818
 819        switch_v4l2();
 820
 821        t->std = std;
 822        tuner_fixup_std(t);
 823        if (t->tv_freq)
 824                set_freq(client, t->tv_freq);
 825        return 0;
 826}
 827
 828static int tuner_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f)
 829{
 830        struct tuner *t = to_tuner(sd);
 831        struct i2c_client *client = v4l2_get_subdevdata(sd);
 832
 833        if (set_mode(client, t, f->type, "s_frequency") == -EINVAL)
 834                return 0;
 835        switch_v4l2();
 836        set_freq(client, f->frequency);
 837
 838        return 0;
 839}
 840
 841static int tuner_g_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f)
 842{
 843        struct tuner *t = to_tuner(sd);
 844        struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
 845
 846        if (check_mode(t, "g_frequency") == -EINVAL)
 847                return 0;
 848        switch_v4l2();
 849        f->type = t->mode;
 850        if (fe_tuner_ops->get_frequency) {
 851                u32 abs_freq;
 852
 853                fe_tuner_ops->get_frequency(&t->fe, &abs_freq);
 854                f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
 855                        (abs_freq * 2 + 125/2) / 125 :
 856                        (abs_freq + 62500/2) / 62500;
 857                return 0;
 858        }
 859        f->frequency = (V4L2_TUNER_RADIO == t->mode) ?
 860                t->radio_freq : t->tv_freq;
 861        return 0;
 862}
 863
 864static int tuner_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
 865{
 866        struct tuner *t = to_tuner(sd);
 867        struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 868        struct dvb_tuner_ops *fe_tuner_ops = &t->fe.ops.tuner_ops;
 869
 870        if (check_mode(t, "g_tuner") == -EINVAL)
 871                return 0;
 872        switch_v4l2();
 873
 874        vt->type = t->mode;
 875        if (analog_ops->get_afc)
 876                vt->afc = analog_ops->get_afc(&t->fe);
 877        if (t->mode == V4L2_TUNER_ANALOG_TV)
 878                vt->capability |= V4L2_TUNER_CAP_NORM;
 879        if (t->mode != V4L2_TUNER_RADIO) {
 880                vt->rangelow = tv_range[0] * 16;
 881                vt->rangehigh = tv_range[1] * 16;
 882                return 0;
 883        }
 884
 885        /* radio mode */
 886        vt->rxsubchans =
 887                V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
 888        if (fe_tuner_ops->get_status) {
 889                u32 tuner_status;
 890
 891                fe_tuner_ops->get_status(&t->fe, &tuner_status);
 892                vt->rxsubchans =
 893                        (tuner_status & TUNER_STATUS_STEREO) ?
 894                        V4L2_TUNER_SUB_STEREO :
 895                        V4L2_TUNER_SUB_MONO;
 896        } else {
 897                if (analog_ops->is_stereo) {
 898                        vt->rxsubchans =
 899                                analog_ops->is_stereo(&t->fe) ?
 900                                V4L2_TUNER_SUB_STEREO :
 901                                V4L2_TUNER_SUB_MONO;
 902                }
 903        }
 904        if (analog_ops->has_signal)
 905                vt->signal = analog_ops->has_signal(&t->fe);
 906        vt->capability |=
 907                V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
 908        vt->audmode = t->audmode;
 909        vt->rangelow = radio_range[0] * 16000;
 910        vt->rangehigh = radio_range[1] * 16000;
 911        return 0;
 912}
 913
 914static int tuner_s_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
 915{
 916        struct tuner *t = to_tuner(sd);
 917        struct i2c_client *client = v4l2_get_subdevdata(sd);
 918
 919        if (check_mode(t, "s_tuner") == -EINVAL)
 920                return 0;
 921
 922        switch_v4l2();
 923
 924        /* do nothing unless we're a radio tuner */
 925        if (t->mode != V4L2_TUNER_RADIO)
 926                return 0;
 927        t->audmode = vt->audmode;
 928        set_radio_freq(client, t->radio_freq);
 929        return 0;
 930}
 931
 932static int tuner_log_status(struct v4l2_subdev *sd)
 933{
 934        struct tuner *t = to_tuner(sd);
 935        struct analog_demod_ops *analog_ops = &t->fe.ops.analog_ops;
 936
 937        if (analog_ops->tuner_status)
 938                analog_ops->tuner_status(&t->fe);
 939        return 0;
 940}
 941
 942static int tuner_suspend(struct i2c_client *c, pm_message_t state)
 943{
 944        struct tuner *t = to_tuner(i2c_get_clientdata(c));
 945
 946        tuner_dbg("suspend\n");
 947        /* FIXME: power down ??? */
 948        return 0;
 949}
 950
 951static int tuner_resume(struct i2c_client *c)
 952{
 953        struct tuner *t = to_tuner(i2c_get_clientdata(c));
 954
 955        tuner_dbg("resume\n");
 956        if (V4L2_TUNER_RADIO == t->mode) {
 957                if (t->radio_freq)
 958                        set_freq(c, t->radio_freq);
 959        } else {
 960                if (t->tv_freq)
 961                        set_freq(c, t->tv_freq);
 962        }
 963        return 0;
 964}
 965
 966static int tuner_command(struct i2c_client *client, unsigned cmd, void *arg)
 967{
 968        struct v4l2_subdev *sd = i2c_get_clientdata(client);
 969
 970        /* TUNER_SET_CONFIG is still called by tuner-simple.c, so we have
 971           to handle it here.
 972           There must be a better way of doing this... */
 973        switch (cmd) {
 974        case TUNER_SET_CONFIG:
 975                return tuner_s_config(sd, arg);
 976        }
 977        return -ENOIOCTLCMD;
 978}
 979
 980/* ----------------------------------------------------------------------- */
 981
 982static const struct v4l2_subdev_core_ops tuner_core_ops = {
 983        .log_status = tuner_log_status,
 984        .s_std = tuner_s_std,
 985};
 986
 987static const struct v4l2_subdev_tuner_ops tuner_tuner_ops = {
 988        .s_radio = tuner_s_radio,
 989        .g_tuner = tuner_g_tuner,
 990        .s_tuner = tuner_s_tuner,
 991        .s_frequency = tuner_s_frequency,
 992        .g_frequency = tuner_g_frequency,
 993        .s_type_addr = tuner_s_type_addr,
 994        .s_config = tuner_s_config,
 995        .s_standby = tuner_s_standby,
 996};
 997
 998static const struct v4l2_subdev_ops tuner_ops = {
 999        .core = &tuner_core_ops,
1000        .tuner = &tuner_tuner_ops,
1001};
1002
1003/* ---------------------------------------------------------------------- */
1004
1005static LIST_HEAD(tuner_list);
1006
1007/* Search for existing radio and/or TV tuners on the given I2C adapter.
1008   Note that when this function is called from tuner_probe you can be
1009   certain no other devices will be added/deleted at the same time, I2C
1010   core protects against that. */
1011static void tuner_lookup(struct i2c_adapter *adap,
1012                struct tuner **radio, struct tuner **tv)
1013{
1014        struct tuner *pos;
1015
1016        *radio = NULL;
1017        *tv = NULL;
1018
1019        list_for_each_entry(pos, &tuner_list, list) {
1020                int mode_mask;
1021
1022                if (pos->i2c->adapter != adap ||
1023                    strcmp(pos->i2c->driver->driver.name, "tuner"))
1024                        continue;
1025
1026                mode_mask = pos->mode_mask & ~T_STANDBY;
1027                if (*radio == NULL && mode_mask == T_RADIO)
1028                        *radio = pos;
1029                /* Note: currently TDA9887 is the only demod-only
1030                   device. If other devices appear then we need to
1031                   make this test more general. */
1032                else if (*tv == NULL && pos->type != TUNER_TDA9887 &&
1033                         (pos->mode_mask & (T_ANALOG_TV | T_DIGITAL_TV)))
1034                        *tv = pos;
1035        }
1036}
1037
1038/* During client attach, set_type is called by adapter's attach_inform callback.
1039   set_type must then be completed by tuner_probe.
1040 */
1041static int tuner_probe(struct i2c_client *client,
1042                       const struct i2c_device_id *id)
1043{
1044        struct tuner *t;
1045        struct tuner *radio;
1046        struct tuner *tv;
1047
1048        t = kzalloc(sizeof(struct tuner), GFP_KERNEL);
1049        if (NULL == t)
1050                return -ENOMEM;
1051        v4l2_i2c_subdev_init(&t->sd, client, &tuner_ops);
1052        t->i2c = client;
1053        t->name = "(tuner unset)";
1054        t->type = UNSET;
1055        t->audmode = V4L2_TUNER_MODE_STEREO;
1056        t->mode_mask = T_UNINITIALIZED;
1057
1058        if (show_i2c) {
1059                unsigned char buffer[16];
1060                int i, rc;
1061
1062                memset(buffer, 0, sizeof(buffer));
1063                rc = i2c_master_recv(client, buffer, sizeof(buffer));
1064                tuner_info("I2C RECV = ");
1065                for (i = 0; i < rc; i++)
1066                        printk(KERN_CONT "%02x ", buffer[i]);
1067                printk("\n");
1068        }
1069        /* HACK: This test was added to avoid tuner to probe tda9840 and
1070           tea6415c on the MXB card */
1071        if (client->adapter->id == I2C_HW_SAA7146 && client->addr < 0x4a) {
1072                kfree(t);
1073                return -ENODEV;
1074        }
1075
1076        /* autodetection code based on the i2c addr */
1077        if (!no_autodetect) {
1078                switch (client->addr) {
1079                case 0x10:
1080                        if (tuner_symbol_probe(tea5761_autodetection,
1081                                               t->i2c->adapter,
1082                                               t->i2c->addr) >= 0) {
1083                                t->type = TUNER_TEA5761;
1084                                t->mode_mask = T_RADIO;
1085                                t->mode = T_STANDBY;
1086                                /* Sets freq to FM range */
1087                                t->radio_freq = 87.5 * 16000;
1088                                tuner_lookup(t->i2c->adapter, &radio, &tv);
1089                                if (tv)
1090                                        tv->mode_mask &= ~T_RADIO;
1091
1092                                goto register_client;
1093                        }
1094                        return -ENODEV;
1095                case 0x42:
1096                case 0x43:
1097                case 0x4a:
1098                case 0x4b:
1099                        /* If chip is not tda8290, don't register.
1100                           since it can be tda9887*/
1101                        if (tuner_symbol_probe(tda829x_probe, t->i2c->adapter,
1102                                               t->i2c->addr) >= 0) {
1103                                tuner_dbg("tda829x detected\n");
1104                        } else {
1105                                /* Default is being tda9887 */
1106                                t->type = TUNER_TDA9887;
1107                                t->mode_mask = T_RADIO | T_ANALOG_TV |
1108                                               T_DIGITAL_TV;
1109                                t->mode = T_STANDBY;
1110                                goto register_client;
1111                        }
1112                        break;
1113                case 0x60:
1114                        if (tuner_symbol_probe(tea5767_autodetection,
1115                                               t->i2c->adapter, t->i2c->addr)
1116                                        >= 0) {
1117                                t->type = TUNER_TEA5767;
1118                                t->mode_mask = T_RADIO;
1119                                t->mode = T_STANDBY;
1120                                /* Sets freq to FM range */
1121                                t->radio_freq = 87.5 * 16000;
1122                                tuner_lookup(t->i2c->adapter, &radio, &tv);
1123                                if (tv)
1124                                        tv->mode_mask &= ~T_RADIO;
1125
1126                                goto register_client;
1127                        }
1128                        break;
1129                }
1130        }
1131
1132        /* Initializes only the first TV tuner on this adapter. Why only the
1133           first? Because there are some devices (notably the ones with TI
1134           tuners) that have more than one i2c address for the *same* device.
1135           Experience shows that, except for just one case, the first
1136           address is the right one. The exception is a Russian tuner
1137           (ACORP_Y878F). So, the desired behavior is just to enable the
1138           first found TV tuner. */
1139        tuner_lookup(t->i2c->adapter, &radio, &tv);
1140        if (tv == NULL) {
1141                t->mode_mask = T_ANALOG_TV | T_DIGITAL_TV;
1142                if (radio == NULL)
1143                        t->mode_mask |= T_RADIO;
1144                tuner_dbg("Setting mode_mask to 0x%02x\n", t->mode_mask);
1145                t->tv_freq = 400 * 16; /* Sets freq to VHF High */
1146                t->radio_freq = 87.5 * 16000; /* Sets freq to FM range */
1147        }
1148
1149        /* Should be just before return */
1150register_client:
1151        tuner_info("chip found @ 0x%x (%s)\n", client->addr << 1,
1152                       client->adapter->name);
1153
1154        /* Sets a default mode */
1155        if (t->mode_mask & T_ANALOG_TV) {
1156                t->mode = V4L2_TUNER_ANALOG_TV;
1157        } else  if (t->mode_mask & T_RADIO) {
1158                t->mode = V4L2_TUNER_RADIO;
1159        } else {
1160                t->mode = V4L2_TUNER_DIGITAL_TV;
1161        }
1162        set_type(client, t->type, t->mode_mask, t->config, t->fe.callback);
1163        list_add_tail(&t->list, &tuner_list);
1164        return 0;
1165}
1166
1167static int tuner_remove(struct i2c_client *client)
1168{
1169        struct tuner *t = to_tuner(i2c_get_clientdata(client));
1170
1171        v4l2_device_unregister_subdev(&t->sd);
1172        tuner_detach(&t->fe);
1173        t->fe.analog_demod_priv = NULL;
1174
1175        list_del(&t->list);
1176        kfree(t);
1177        return 0;
1178}
1179
1180/* ----------------------------------------------------------------------- */
1181
1182/* This driver supports many devices and the idea is to let the driver
1183   detect which device is present. So rather than listing all supported
1184   devices here, we pretend to support a single, fake device type. */
1185static const struct i2c_device_id tuner_id[] = {
1186        { "tuner", }, /* autodetect */
1187        { }
1188};
1189MODULE_DEVICE_TABLE(i2c, tuner_id);
1190
1191static struct v4l2_i2c_driver_data v4l2_i2c_data = {
1192        .name = "tuner",
1193        .probe = tuner_probe,
1194        .remove = tuner_remove,
1195        .command = tuner_command,
1196        .suspend = tuner_suspend,
1197        .resume = tuner_resume,
1198        .id_table = tuner_id,
1199};
1200
1201/*
1202 * Overrides for Emacs so that we follow Linus's tabbing style.
1203 * ---------------------------------------------------------------------------
1204 * Local variables:
1205 * c-basic-offset: 8
1206 * End:
1207 */
1208
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.