Showing error 1617

User: Jiri Slaby
Error type: Division by Zero
Error type description: The code tries to divide by zero
File location: drivers/media/common/tuners/tuner-simple.c
Line in file: 829
Project: Linux Kernel
Project version: 2.6.28
Confirmation: Fixed by 6b55009e1dc7c2a66c8f5fad67045f0536c9bbd8
Tools: Manual Work
Entered: 2012-08-14 09:51:55 UTC


Source:

   1/*
   2 * i2c tv tuner chip device driver
   3 * controls all those simple 4-control-bytes style tuners.
   4 *
   5 * This "tuner-simple" module was split apart from the original "tuner" module.
   6 */
   7#include <linux/delay.h>
   8#include <linux/i2c.h>
   9#include <linux/videodev2.h>
  10#include <media/tuner.h>
  11#include <media/v4l2-common.h>
  12#include <media/tuner-types.h>
  13#include "tuner-i2c.h"
  14#include "tuner-simple.h"
  15
  16static int debug;
  17module_param(debug, int, 0644);
  18MODULE_PARM_DESC(debug, "enable verbose debug messages");
  19
  20#define TUNER_SIMPLE_MAX 64
  21static unsigned int simple_devcount;
  22
  23static int offset;
  24module_param(offset, int, 0664);
  25MODULE_PARM_DESC(offset, "Allows to specify an offset for tuner");
  26
  27static unsigned int atv_input[TUNER_SIMPLE_MAX] = \
  28                        { [0 ... (TUNER_SIMPLE_MAX-1)] = 0 };
  29static unsigned int dtv_input[TUNER_SIMPLE_MAX] = \
  30                        { [0 ... (TUNER_SIMPLE_MAX-1)] = 0 };
  31module_param_array(atv_input, int, NULL, 0644);
  32module_param_array(dtv_input, int, NULL, 0644);
  33MODULE_PARM_DESC(atv_input, "specify atv rf input, 0 for autoselect");
  34MODULE_PARM_DESC(dtv_input, "specify dtv rf input, 0 for autoselect");
  35
  36/* ---------------------------------------------------------------------- */
  37
  38/* tv standard selection for Temic 4046 FM5
  39   this value takes the low bits of control byte 2
  40   from datasheet Rev.01, Feb.00
  41     standard     BG      I       L       L2      D
  42     picture IF   38.9    38.9    38.9    33.95   38.9
  43     sound 1      33.4    32.9    32.4    40.45   32.4
  44     sound 2      33.16
  45     NICAM        33.05   32.348  33.05           33.05
  46 */
  47#define TEMIC_SET_PAL_I         0x05
  48#define TEMIC_SET_PAL_DK        0x09
  49#define TEMIC_SET_PAL_L         0x0a /* SECAM ? */
  50#define TEMIC_SET_PAL_L2        0x0b /* change IF ! */
  51#define TEMIC_SET_PAL_BG        0x0c
  52
  53/* tv tuner system standard selection for Philips FQ1216ME
  54   this value takes the low bits of control byte 2
  55   from datasheet "1999 Nov 16" (supersedes "1999 Mar 23")
  56     standard                 BG        DK        I        L        L`
  57     picture carrier        38.90        38.90        38.90        38.90        33.95
  58     colour                34.47        34.47        34.47        34.47        38.38
  59     sound 1                33.40        32.40        32.90        32.40        40.45
  60     sound 2                33.16        -        -        -        -
  61     NICAM                33.05        33.05        32.35        33.05        39.80
  62 */
  63#define PHILIPS_SET_PAL_I        0x01 /* Bit 2 always zero !*/
  64#define PHILIPS_SET_PAL_BGDK        0x09
  65#define PHILIPS_SET_PAL_L2        0x0a
  66#define PHILIPS_SET_PAL_L        0x0b
  67
  68/* system switching for Philips FI1216MF MK2
  69   from datasheet "1996 Jul 09",
  70    standard         BG     L      L'
  71    picture carrier  38.90  38.90  33.95
  72    colour             34.47  34.37  38.38
  73    sound 1          33.40  32.40  40.45
  74    sound 2          33.16  -      -
  75    NICAM            33.05  33.05  39.80
  76 */
  77#define PHILIPS_MF_SET_STD_BG        0x01 /* Bit 2 must be zero, Bit 3 is system output */
  78#define PHILIPS_MF_SET_STD_L        0x03 /* Used on Secam France */
  79#define PHILIPS_MF_SET_STD_LC        0x02 /* Used on SECAM L' */
  80
  81/* Control byte */
  82
  83#define TUNER_RATIO_MASK        0x06 /* Bit cb1:cb2 */
  84#define TUNER_RATIO_SELECT_50   0x00
  85#define TUNER_RATIO_SELECT_32   0x02
  86#define TUNER_RATIO_SELECT_166  0x04
  87#define TUNER_RATIO_SELECT_62   0x06
  88
  89#define TUNER_CHARGE_PUMP       0x40  /* Bit cb6 */
  90
  91/* Status byte */
  92
  93#define TUNER_POR          0x80
  94#define TUNER_FL          0x40
  95#define TUNER_MODE        0x38
  96#define TUNER_AFC         0x07
  97#define TUNER_SIGNAL      0x07
  98#define TUNER_STEREO      0x10
  99
 100#define TUNER_PLL_LOCKED   0x40
 101#define TUNER_STEREO_MK3   0x04
 102
 103static DEFINE_MUTEX(tuner_simple_list_mutex);
 104static LIST_HEAD(hybrid_tuner_instance_list);
 105
 106struct tuner_simple_priv {
 107        unsigned int nr;
 108        u16 last_div;
 109
 110        struct tuner_i2c_props i2c_props;
 111        struct list_head hybrid_tuner_instance_list;
 112
 113        unsigned int type;
 114        struct tunertype *tun;
 115
 116        u32 frequency;
 117        u32 bandwidth;
 118};
 119
 120/* ---------------------------------------------------------------------- */
 121
 122static int tuner_read_status(struct dvb_frontend *fe)
 123{
 124        struct tuner_simple_priv *priv = fe->tuner_priv;
 125        unsigned char byte;
 126
 127        if (1 != tuner_i2c_xfer_recv(&priv->i2c_props, &byte, 1))
 128                return 0;
 129
 130        return byte;
 131}
 132
 133static inline int tuner_signal(const int status)
 134{
 135        return (status & TUNER_SIGNAL) << 13;
 136}
 137
 138static inline int tuner_stereo(const int type, const int status)
 139{
 140        switch (type) {
 141        case TUNER_PHILIPS_FM1216ME_MK3:
 142        case TUNER_PHILIPS_FM1236_MK3:
 143        case TUNER_PHILIPS_FM1256_IH3:
 144        case TUNER_LG_NTSC_TAPE:
 145        case TUNER_TCL_MF02GIP_5N:
 146                return ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3);
 147        default:
 148                return status & TUNER_STEREO;
 149        }
 150}
 151
 152static inline int tuner_islocked(const int status)
 153{
 154        return (status & TUNER_FL);
 155}
 156
 157static inline int tuner_afcstatus(const int status)
 158{
 159        return (status & TUNER_AFC) - 2;
 160}
 161
 162
 163static int simple_get_status(struct dvb_frontend *fe, u32 *status)
 164{
 165        struct tuner_simple_priv *priv = fe->tuner_priv;
 166        int tuner_status;
 167
 168        if (priv->i2c_props.adap == NULL)
 169                return -EINVAL;
 170
 171        tuner_status = tuner_read_status(fe);
 172
 173        *status = 0;
 174
 175        if (tuner_islocked(tuner_status))
 176                *status = TUNER_STATUS_LOCKED;
 177        if (tuner_stereo(priv->type, tuner_status))
 178                *status |= TUNER_STATUS_STEREO;
 179
 180        tuner_dbg("AFC Status: %d\n", tuner_afcstatus(tuner_status));
 181
 182        return 0;
 183}
 184
 185static int simple_get_rf_strength(struct dvb_frontend *fe, u16 *strength)
 186{
 187        struct tuner_simple_priv *priv = fe->tuner_priv;
 188        int signal;
 189
 190        if (priv->i2c_props.adap == NULL)
 191                return -EINVAL;
 192
 193        signal = tuner_signal(tuner_read_status(fe));
 194
 195        *strength = signal;
 196
 197        tuner_dbg("Signal strength: %d\n", signal);
 198
 199        return 0;
 200}
 201
 202/* ---------------------------------------------------------------------- */
 203
 204static inline char *tuner_param_name(enum param_type type)
 205{
 206        char *name;
 207
 208        switch (type) {
 209        case TUNER_PARAM_TYPE_RADIO:
 210                name = "radio";
 211                break;
 212        case TUNER_PARAM_TYPE_PAL:
 213                name = "pal";
 214                break;
 215        case TUNER_PARAM_TYPE_SECAM:
 216                name = "secam";
 217                break;
 218        case TUNER_PARAM_TYPE_NTSC:
 219                name = "ntsc";
 220                break;
 221        case TUNER_PARAM_TYPE_DIGITAL:
 222                name = "digital";
 223                break;
 224        default:
 225                name = "unknown";
 226                break;
 227        }
 228        return name;
 229}
 230
 231static struct tuner_params *simple_tuner_params(struct dvb_frontend *fe,
 232                                                enum param_type desired_type)
 233{
 234        struct tuner_simple_priv *priv = fe->tuner_priv;
 235        struct tunertype *tun = priv->tun;
 236        int i;
 237
 238        for (i = 0; i < tun->count; i++)
 239                if (desired_type == tun->params[i].type)
 240                        break;
 241
 242        /* use default tuner params if desired_type not available */
 243        if (i == tun->count) {
 244                tuner_dbg("desired params (%s) undefined for tuner %d\n",
 245                          tuner_param_name(desired_type), priv->type);
 246                i = 0;
 247        }
 248
 249        tuner_dbg("using tuner params #%d (%s)\n", i,
 250                  tuner_param_name(tun->params[i].type));
 251
 252        return &tun->params[i];
 253}
 254
 255static int simple_config_lookup(struct dvb_frontend *fe,
 256                                struct tuner_params *t_params,
 257                                unsigned *frequency, u8 *config, u8 *cb)
 258{
 259        struct tuner_simple_priv *priv = fe->tuner_priv;
 260        int i;
 261
 262        for (i = 0; i < t_params->count; i++) {
 263                if (*frequency > t_params->ranges[i].limit)
 264                        continue;
 265                break;
 266        }
 267        if (i == t_params->count) {
 268                tuner_dbg("frequency out of range (%d > %d)\n",
 269                          *frequency, t_params->ranges[i - 1].limit);
 270                *frequency = t_params->ranges[--i].limit;
 271        }
 272        *config = t_params->ranges[i].config;
 273        *cb     = t_params->ranges[i].cb;
 274
 275        tuner_dbg("freq = %d.%02d (%d), range = %d, "
 276                  "config = 0x%02x, cb = 0x%02x\n",
 277                  *frequency / 16, *frequency % 16 * 100 / 16, *frequency,
 278                  i, *config, *cb);
 279
 280        return i;
 281}
 282
 283/* ---------------------------------------------------------------------- */
 284
 285static void simple_set_rf_input(struct dvb_frontend *fe,
 286                                u8 *config, u8 *cb, unsigned int rf)
 287{
 288        struct tuner_simple_priv *priv = fe->tuner_priv;
 289
 290        switch (priv->type) {
 291        case TUNER_PHILIPS_TUV1236D:
 292                switch (rf) {
 293                case 1:
 294                        *cb |= 0x08;
 295                        break;
 296                default:
 297                        *cb &= ~0x08;
 298                        break;
 299                }
 300                break;
 301        case TUNER_PHILIPS_FCV1236D:
 302                switch (rf) {
 303                case 1:
 304                        *cb |= 0x01;
 305                        break;
 306                default:
 307                        *cb &= ~0x01;
 308                        break;
 309                }
 310                break;
 311        default:
 312                break;
 313        }
 314}
 315
 316static int simple_std_setup(struct dvb_frontend *fe,
 317                            struct analog_parameters *params,
 318                            u8 *config, u8 *cb)
 319{
 320        struct tuner_simple_priv *priv = fe->tuner_priv;
 321        u8 tuneraddr;
 322        int rc;
 323
 324        /* tv norm specific stuff for multi-norm tuners */
 325        switch (priv->type) {
 326        case TUNER_PHILIPS_SECAM: /* FI1216MF */
 327                /* 0x01 -> ??? no change ??? */
 328                /* 0x02 -> PAL BDGHI / SECAM L */
 329                /* 0x04 -> ??? PAL others / SECAM others ??? */
 330                *cb &= ~0x03;
 331                if (params->std & V4L2_STD_SECAM_L)
 332                        /* also valid for V4L2_STD_SECAM */
 333                        *cb |= PHILIPS_MF_SET_STD_L;
 334                else if (params->std & V4L2_STD_SECAM_LC)
 335                        *cb |= PHILIPS_MF_SET_STD_LC;
 336                else /* V4L2_STD_B|V4L2_STD_GH */
 337                        *cb |= PHILIPS_MF_SET_STD_BG;
 338                break;
 339
 340        case TUNER_TEMIC_4046FM5:
 341                *cb &= ~0x0f;
 342
 343                if (params->std & V4L2_STD_PAL_BG) {
 344                        *cb |= TEMIC_SET_PAL_BG;
 345
 346                } else if (params->std & V4L2_STD_PAL_I) {
 347                        *cb |= TEMIC_SET_PAL_I;
 348
 349                } else if (params->std & V4L2_STD_PAL_DK) {
 350                        *cb |= TEMIC_SET_PAL_DK;
 351
 352                } else if (params->std & V4L2_STD_SECAM_L) {
 353                        *cb |= TEMIC_SET_PAL_L;
 354
 355                }
 356                break;
 357
 358        case TUNER_PHILIPS_FQ1216ME:
 359                *cb &= ~0x0f;
 360
 361                if (params->std & (V4L2_STD_PAL_BG|V4L2_STD_PAL_DK)) {
 362                        *cb |= PHILIPS_SET_PAL_BGDK;
 363
 364                } else if (params->std & V4L2_STD_PAL_I) {
 365                        *cb |= PHILIPS_SET_PAL_I;
 366
 367                } else if (params->std & V4L2_STD_SECAM_L) {
 368                        *cb |= PHILIPS_SET_PAL_L;
 369
 370                }
 371                break;
 372
 373        case TUNER_PHILIPS_FCV1236D:
 374                /* 0x00 -> ATSC antenna input 1 */
 375                /* 0x01 -> ATSC antenna input 2 */
 376                /* 0x02 -> NTSC antenna input 1 */
 377                /* 0x03 -> NTSC antenna input 2 */
 378                *cb &= ~0x03;
 379                if (!(params->std & V4L2_STD_ATSC))
 380                        *cb |= 2;
 381                break;
 382
 383        case TUNER_MICROTUNE_4042FI5:
 384                /* Set the charge pump for fast tuning */
 385                *config |= TUNER_CHARGE_PUMP;
 386                break;
 387
 388        case TUNER_PHILIPS_TUV1236D:
 389        {
 390                /* 0x40 -> ATSC antenna input 1 */
 391                /* 0x48 -> ATSC antenna input 2 */
 392                /* 0x00 -> NTSC antenna input 1 */
 393                /* 0x08 -> NTSC antenna input 2 */
 394                u8 buffer[4] = { 0x14, 0x00, 0x17, 0x00};
 395                *cb &= ~0x40;
 396                if (params->std & V4L2_STD_ATSC) {
 397                        *cb |= 0x40;
 398                        buffer[1] = 0x04;
 399                }
 400                /* set to the correct mode (analog or digital) */
 401                tuneraddr = priv->i2c_props.addr;
 402                priv->i2c_props.addr = 0x0a;
 403                rc = tuner_i2c_xfer_send(&priv->i2c_props, &buffer[0], 2);
 404                if (2 != rc)
 405                        tuner_warn("i2c i/o error: rc == %d "
 406                                   "(should be 2)\n", rc);
 407                rc = tuner_i2c_xfer_send(&priv->i2c_props, &buffer[2], 2);
 408                if (2 != rc)
 409                        tuner_warn("i2c i/o error: rc == %d "
 410                                   "(should be 2)\n", rc);
 411                priv->i2c_props.addr = tuneraddr;
 412                break;
 413        }
 414        }
 415        if (atv_input[priv->nr])
 416                simple_set_rf_input(fe, config, cb, atv_input[priv->nr]);
 417
 418        return 0;
 419}
 420
 421static int simple_post_tune(struct dvb_frontend *fe, u8 *buffer,
 422                            u16 div, u8 config, u8 cb)
 423{
 424        struct tuner_simple_priv *priv = fe->tuner_priv;
 425        int rc;
 426
 427        switch (priv->type) {
 428        case TUNER_LG_TDVS_H06XF:
 429                /* Set the Auxiliary Byte. */
 430                buffer[0] = buffer[2];
 431                buffer[0] &= ~0x20;
 432                buffer[0] |= 0x18;
 433                buffer[1] = 0x20;
 434                tuner_dbg("tv 0x%02x 0x%02x\n", buffer[0], buffer[1]);
 435
 436                rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 2);
 437                if (2 != rc)
 438                        tuner_warn("i2c i/o error: rc == %d "
 439                                   "(should be 2)\n", rc);
 440                break;
 441        case TUNER_MICROTUNE_4042FI5:
 442        {
 443                /* FIXME - this may also work for other tuners */
 444                unsigned long timeout = jiffies + msecs_to_jiffies(1);
 445                u8 status_byte = 0;
 446
 447                /* Wait until the PLL locks */
 448                for (;;) {
 449                        if (time_after(jiffies, timeout))
 450                                return 0;
 451                        rc = tuner_i2c_xfer_recv(&priv->i2c_props,
 452                                                 &status_byte, 1);
 453                        if (1 != rc) {
 454                                tuner_warn("i2c i/o read error: rc == %d "
 455                                           "(should be 1)\n", rc);
 456                                break;
 457                        }
 458                        if (status_byte & TUNER_PLL_LOCKED)
 459                                break;
 460                        udelay(10);
 461                }
 462
 463                /* Set the charge pump for optimized phase noise figure */
 464                config &= ~TUNER_CHARGE_PUMP;
 465                buffer[0] = (div>>8) & 0x7f;
 466                buffer[1] = div      & 0xff;
 467                buffer[2] = config;
 468                buffer[3] = cb;
 469                tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
 470                          buffer[0], buffer[1], buffer[2], buffer[3]);
 471
 472                rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 4);
 473                if (4 != rc)
 474                        tuner_warn("i2c i/o error: rc == %d "
 475                                   "(should be 4)\n", rc);
 476                break;
 477        }
 478        }
 479
 480        return 0;
 481}
 482
 483static int simple_radio_bandswitch(struct dvb_frontend *fe, u8 *buffer)
 484{
 485        struct tuner_simple_priv *priv = fe->tuner_priv;
 486
 487        switch (priv->type) {
 488        case TUNER_TENA_9533_DI:
 489        case TUNER_YMEC_TVF_5533MF:
 490                tuner_dbg("This tuner doesn't have FM. "
 491                          "Most cards have a TEA5767 for FM\n");
 492                return 0;
 493        case TUNER_PHILIPS_FM1216ME_MK3:
 494        case TUNER_PHILIPS_FM1236_MK3:
 495        case TUNER_PHILIPS_FMD1216ME_MK3:
 496        case TUNER_PHILIPS_FMD1216MEX_MK3:
 497        case TUNER_LG_NTSC_TAPE:
 498        case TUNER_PHILIPS_FM1256_IH3:
 499        case TUNER_TCL_MF02GIP_5N:
 500                buffer[3] = 0x19;
 501                break;
 502        case TUNER_TNF_5335MF:
 503                buffer[3] = 0x11;
 504                break;
 505        case TUNER_LG_PAL_FM:
 506                buffer[3] = 0xa5;
 507                break;
 508        case TUNER_THOMSON_DTT761X:
 509                buffer[3] = 0x39;
 510                break;
 511        case TUNER_MICROTUNE_4049FM5:
 512        default:
 513                buffer[3] = 0xa4;
 514                break;
 515        }
 516
 517        return 0;
 518}
 519
 520/* ---------------------------------------------------------------------- */
 521
 522static int simple_set_tv_freq(struct dvb_frontend *fe,
 523                              struct analog_parameters *params)
 524{
 525        struct tuner_simple_priv *priv = fe->tuner_priv;
 526        u8 config, cb;
 527        u16 div;
 528        struct tunertype *tun;
 529        u8 buffer[4];
 530        int rc, IFPCoff, i;
 531        enum param_type desired_type;
 532        struct tuner_params *t_params;
 533
 534        tun = priv->tun;
 535
 536        /* IFPCoff = Video Intermediate Frequency - Vif:
 537                940  =16*58.75  NTSC/J (Japan)
 538                732  =16*45.75  M/N STD
 539                704  =16*44     ATSC (at DVB code)
 540                632  =16*39.50  I U.K.
 541                622.4=16*38.90  B/G D/K I, L STD
 542                592  =16*37.00  D China
 543                590  =16.36.875 B Australia
 544                543.2=16*33.95  L' STD
 545                171.2=16*10.70  FM Radio (at set_radio_freq)
 546        */
 547
 548        if (params->std == V4L2_STD_NTSC_M_JP) {
 549                IFPCoff      = 940;
 550                desired_type = TUNER_PARAM_TYPE_NTSC;
 551        } else if ((params->std & V4L2_STD_MN) &&
 552                  !(params->std & ~V4L2_STD_MN)) {
 553                IFPCoff      = 732;
 554                desired_type = TUNER_PARAM_TYPE_NTSC;
 555        } else if (params->std == V4L2_STD_SECAM_LC) {
 556                IFPCoff      = 543;
 557                desired_type = TUNER_PARAM_TYPE_SECAM;
 558        } else {
 559                IFPCoff      = 623;
 560                desired_type = TUNER_PARAM_TYPE_PAL;
 561        }
 562
 563        t_params = simple_tuner_params(fe, desired_type);
 564
 565        i = simple_config_lookup(fe, t_params, &params->frequency,
 566                                 &config, &cb);
 567
 568        div = params->frequency + IFPCoff + offset;
 569
 570        tuner_dbg("Freq= %d.%02d MHz, V_IF=%d.%02d MHz, "
 571                  "Offset=%d.%02d MHz, div=%0d\n",
 572                  params->frequency / 16, params->frequency % 16 * 100 / 16,
 573                  IFPCoff / 16, IFPCoff % 16 * 100 / 16,
 574                  offset / 16, offset % 16 * 100 / 16, div);
 575
 576        /* tv norm specific stuff for multi-norm tuners */
 577        simple_std_setup(fe, params, &config, &cb);
 578
 579        if (t_params->cb_first_if_lower_freq && div < priv->last_div) {
 580                buffer[0] = config;
 581                buffer[1] = cb;
 582                buffer[2] = (div>>8) & 0x7f;
 583                buffer[3] = div      & 0xff;
 584        } else {
 585                buffer[0] = (div>>8) & 0x7f;
 586                buffer[1] = div      & 0xff;
 587                buffer[2] = config;
 588                buffer[3] = cb;
 589        }
 590        priv->last_div = div;
 591        if (t_params->has_tda9887) {
 592                struct v4l2_priv_tun_config tda9887_cfg;
 593                int tda_config = 0;
 594                int is_secam_l = (params->std & (V4L2_STD_SECAM_L |
 595                                                 V4L2_STD_SECAM_LC)) &&
 596                        !(params->std & ~(V4L2_STD_SECAM_L |
 597                                          V4L2_STD_SECAM_LC));
 598
 599                tda9887_cfg.tuner = TUNER_TDA9887;
 600                tda9887_cfg.priv  = &tda_config;
 601
 602                if (params->std == V4L2_STD_SECAM_LC) {
 603                        if (t_params->port1_active ^ t_params->port1_invert_for_secam_lc)
 604                                tda_config |= TDA9887_PORT1_ACTIVE;
 605                        if (t_params->port2_active ^ t_params->port2_invert_for_secam_lc)
 606                                tda_config |= TDA9887_PORT2_ACTIVE;
 607                } else {
 608                        if (t_params->port1_active)
 609                                tda_config |= TDA9887_PORT1_ACTIVE;
 610                        if (t_params->port2_active)
 611                                tda_config |= TDA9887_PORT2_ACTIVE;
 612                }
 613                if (t_params->intercarrier_mode)
 614                        tda_config |= TDA9887_INTERCARRIER;
 615                if (is_secam_l) {
 616                        if (i == 0 && t_params->default_top_secam_low)
 617                                tda_config |= TDA9887_TOP(t_params->default_top_secam_low);
 618                        else if (i == 1 && t_params->default_top_secam_mid)
 619                                tda_config |= TDA9887_TOP(t_params->default_top_secam_mid);
 620                        else if (t_params->default_top_secam_high)
 621                                tda_config |= TDA9887_TOP(t_params->default_top_secam_high);
 622                } else {
 623                        if (i == 0 && t_params->default_top_low)
 624                                tda_config |= TDA9887_TOP(t_params->default_top_low);
 625                        else if (i == 1 && t_params->default_top_mid)
 626                                tda_config |= TDA9887_TOP(t_params->default_top_mid);
 627                        else if (t_params->default_top_high)
 628                                tda_config |= TDA9887_TOP(t_params->default_top_high);
 629                }
 630                if (t_params->default_pll_gating_18)
 631                        tda_config |= TDA9887_GATING_18;
 632                i2c_clients_command(priv->i2c_props.adap, TUNER_SET_CONFIG,
 633                                    &tda9887_cfg);
 634        }
 635        tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
 636                  buffer[0], buffer[1], buffer[2], buffer[3]);
 637
 638        rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 4);
 639        if (4 != rc)
 640                tuner_warn("i2c i/o error: rc == %d (should be 4)\n", rc);
 641
 642        simple_post_tune(fe, &buffer[0], div, config, cb);
 643
 644        return 0;
 645}
 646
 647static int simple_set_radio_freq(struct dvb_frontend *fe,
 648                                 struct analog_parameters *params)
 649{
 650        struct tunertype *tun;
 651        struct tuner_simple_priv *priv = fe->tuner_priv;
 652        u8 buffer[4];
 653        u16 div;
 654        int rc, j;
 655        struct tuner_params *t_params;
 656        unsigned int freq = params->frequency;
 657
 658        tun = priv->tun;
 659
 660        for (j = tun->count-1; j > 0; j--)
 661                if (tun->params[j].type == TUNER_PARAM_TYPE_RADIO)
 662                        break;
 663        /* default t_params (j=0) will be used if desired type wasn't found */
 664        t_params = &tun->params[j];
 665
 666        /* Select Radio 1st IF used */
 667        switch (t_params->radio_if) {
 668        case 0: /* 10.7 MHz */
 669                freq += (unsigned int)(10.7*16000);
 670                break;
 671        case 1: /* 33.3 MHz */
 672                freq += (unsigned int)(33.3*16000);
 673                break;
 674        case 2: /* 41.3 MHz */
 675                freq += (unsigned int)(41.3*16000);
 676                break;
 677        default:
 678                tuner_warn("Unsupported radio_if value %d\n",
 679                           t_params->radio_if);
 680                return 0;
 681        }
 682
 683        /* Bandswitch byte */
 684        simple_radio_bandswitch(fe, &buffer[0]);
 685
 686        buffer[2] = (t_params->ranges[0].config & ~TUNER_RATIO_MASK) |
 687                    TUNER_RATIO_SELECT_50; /* 50 kHz step */
 688
 689        /* Convert from 1/16 kHz V4L steps to 1/20 MHz (=50 kHz) PLL steps
 690           freq * (1 Mhz / 16000 V4L steps) * (20 PLL steps / 1 MHz) =
 691           freq * (1/800) */
 692        div = (freq + 400) / 800;
 693
 694        if (t_params->cb_first_if_lower_freq && div < priv->last_div) {
 695                buffer[0] = buffer[2];
 696                buffer[1] = buffer[3];
 697                buffer[2] = (div>>8) & 0x7f;
 698                buffer[3] = div      & 0xff;
 699        } else {
 700                buffer[0] = (div>>8) & 0x7f;
 701                buffer[1] = div      & 0xff;
 702        }
 703
 704        tuner_dbg("radio 0x%02x 0x%02x 0x%02x 0x%02x\n",
 705               buffer[0], buffer[1], buffer[2], buffer[3]);
 706        priv->last_div = div;
 707
 708        if (t_params->has_tda9887) {
 709                int config = 0;
 710                struct v4l2_priv_tun_config tda9887_cfg;
 711
 712                tda9887_cfg.tuner = TUNER_TDA9887;
 713                tda9887_cfg.priv = &config;
 714
 715                if (t_params->port1_active &&
 716                    !t_params->port1_fm_high_sensitivity)
 717                        config |= TDA9887_PORT1_ACTIVE;
 718                if (t_params->port2_active &&
 719                    !t_params->port2_fm_high_sensitivity)
 720                        config |= TDA9887_PORT2_ACTIVE;
 721                if (t_params->intercarrier_mode)
 722                        config |= TDA9887_INTERCARRIER;
 723/*                if (t_params->port1_set_for_fm_mono)
 724                        config &= ~TDA9887_PORT1_ACTIVE;*/
 725                if (t_params->fm_gain_normal)
 726                        config |= TDA9887_GAIN_NORMAL;
 727                if (t_params->radio_if == 2)
 728                        config |= TDA9887_RIF_41_3;
 729                i2c_clients_command(priv->i2c_props.adap, TUNER_SET_CONFIG,
 730                                    &tda9887_cfg);
 731        }
 732        rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 4);
 733        if (4 != rc)
 734                tuner_warn("i2c i/o error: rc == %d (should be 4)\n", rc);
 735
 736        return 0;
 737}
 738
 739static int simple_set_params(struct dvb_frontend *fe,
 740                             struct analog_parameters *params)
 741{
 742        struct tuner_simple_priv *priv = fe->tuner_priv;
 743        int ret = -EINVAL;
 744
 745        if (priv->i2c_props.adap == NULL)
 746                return -EINVAL;
 747
 748        switch (params->mode) {
 749        case V4L2_TUNER_RADIO:
 750                ret = simple_set_radio_freq(fe, params);
 751                priv->frequency = params->frequency * 125 / 2;
 752                break;
 753        case V4L2_TUNER_ANALOG_TV:
 754        case V4L2_TUNER_DIGITAL_TV:
 755                ret = simple_set_tv_freq(fe, params);
 756                priv->frequency = params->frequency * 62500;
 757                break;
 758        }
 759        priv->bandwidth = 0;
 760
 761        return ret;
 762}
 763
 764static void simple_set_dvb(struct dvb_frontend *fe, u8 *buf,
 765                           const struct dvb_frontend_parameters *params)
 766{
 767        struct tuner_simple_priv *priv = fe->tuner_priv;
 768
 769        switch (priv->type) {
 770        case TUNER_PHILIPS_FMD1216ME_MK3:
 771        case TUNER_PHILIPS_FMD1216MEX_MK3:
 772                if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ &&
 773                    params->frequency >= 158870000)
 774                        buf[3] |= 0x08;
 775                break;
 776        case TUNER_PHILIPS_TD1316:
 777                /* determine band */
 778                buf[3] |= (params->frequency < 161000000) ? 1 :
 779                          (params->frequency < 444000000) ? 2 : 4;
 780
 781                /* setup PLL filter */
 782                if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
 783                        buf[3] |= 1 << 3;
 784                break;
 785        case TUNER_PHILIPS_TUV1236D:
 786        case TUNER_PHILIPS_FCV1236D:
 787        {
 788                unsigned int new_rf;
 789
 790                if (dtv_input[priv->nr])
 791                        new_rf = dtv_input[priv->nr];
 792                else
 793                        switch (params->u.vsb.modulation) {
 794                        case QAM_64:
 795                        case QAM_256:
 796                                new_rf = 1;
 797                                break;
 798                        case VSB_8:
 799                        default:
 800                                new_rf = 0;
 801                                break;
 802                        }
 803                simple_set_rf_input(fe, &buf[2], &buf[3], new_rf);
 804                break;
 805        }
 806        default:
 807                break;
 808        }
 809}
 810
 811static u32 simple_dvb_configure(struct dvb_frontend *fe, u8 *buf,
 812                                const struct dvb_frontend_parameters *params)
 813{
 814        /* This function returns the tuned frequency on success, 0 on error */
 815        struct tuner_simple_priv *priv = fe->tuner_priv;
 816        struct tunertype *tun = priv->tun;
 817        static struct tuner_params *t_params;
 818        u8 config, cb;
 819        u32 div;
 820        int ret;
 821        unsigned frequency = params->frequency / 62500;
 822
 823        t_params = simple_tuner_params(fe, TUNER_PARAM_TYPE_DIGITAL);
 824        ret = simple_config_lookup(fe, t_params, &frequency, &config, &cb);
 825        if (ret < 0)
 826                return 0; /* failure */
 827
 828        div = ((frequency + t_params->iffreq) * 62500 + offset +
 829               tun->stepsize/2) / tun->stepsize;
 830
 831        buf[0] = div >> 8;
 832        buf[1] = div & 0xff;
 833        buf[2] = config;
 834        buf[3] = cb;
 835
 836        simple_set_dvb(fe, buf, params);
 837
 838        tuner_dbg("%s: div=%d | buf=0x%02x,0x%02x,0x%02x,0x%02x\n",
 839                  tun->name, div, buf[0], buf[1], buf[2], buf[3]);
 840
 841        /* calculate the frequency we set it to */
 842        return (div * tun->stepsize) - t_params->iffreq;
 843}
 844
 845static int simple_dvb_calc_regs(struct dvb_frontend *fe,
 846                                struct dvb_frontend_parameters *params,
 847                                u8 *buf, int buf_len)
 848{
 849        struct tuner_simple_priv *priv = fe->tuner_priv;
 850        u32 frequency;
 851
 852        if (buf_len < 5)
 853                return -EINVAL;
 854
 855        frequency = simple_dvb_configure(fe, buf+1, params);
 856        if (frequency == 0)
 857                return -EINVAL;
 858
 859        buf[0] = priv->i2c_props.addr;
 860
 861        priv->frequency = frequency;
 862        priv->bandwidth = (fe->ops.info.type == FE_OFDM) ?
 863                params->u.ofdm.bandwidth : 0;
 864
 865        return 5;
 866}
 867
 868static int simple_dvb_set_params(struct dvb_frontend *fe,
 869                                 struct dvb_frontend_parameters *params)
 870{
 871        struct tuner_simple_priv *priv = fe->tuner_priv;
 872        u32 prev_freq, prev_bw;
 873        int ret;
 874        u8 buf[5];
 875
 876        if (priv->i2c_props.adap == NULL)
 877                return -EINVAL;
 878
 879        prev_freq = priv->frequency;
 880        prev_bw   = priv->bandwidth;
 881
 882        ret = simple_dvb_calc_regs(fe, params, buf, 5);
 883        if (ret != 5)
 884                goto fail;
 885
 886        /* put analog demod in standby when tuning digital */
 887        if (fe->ops.analog_ops.standby)
 888                fe->ops.analog_ops.standby(fe);
 889
 890        if (fe->ops.i2c_gate_ctrl)
 891                fe->ops.i2c_gate_ctrl(fe, 1);
 892
 893        /* buf[0] contains the i2c address, but *
 894         * we already have it in i2c_props.addr */
 895        ret = tuner_i2c_xfer_send(&priv->i2c_props, buf+1, 4);
 896        if (ret != 4)
 897                goto fail;
 898
 899        return 0;
 900fail:
 901        /* calc_regs sets frequency and bandwidth. if we failed, unset them */
 902        priv->frequency = prev_freq;
 903        priv->bandwidth = prev_bw;
 904
 905        return ret;
 906}
 907
 908static int simple_init(struct dvb_frontend *fe)
 909{
 910        struct tuner_simple_priv *priv = fe->tuner_priv;
 911
 912        if (priv->i2c_props.adap == NULL)
 913                return -EINVAL;
 914
 915        if (priv->tun->initdata) {
 916                int ret;
 917
 918                if (fe->ops.i2c_gate_ctrl)
 919                        fe->ops.i2c_gate_ctrl(fe, 1);
 920
 921                ret = tuner_i2c_xfer_send(&priv->i2c_props,
 922                                          priv->tun->initdata + 1,
 923                                          priv->tun->initdata[0]);
 924                if (ret != priv->tun->initdata[0])
 925                        return ret;
 926        }
 927
 928        return 0;
 929}
 930
 931static int simple_sleep(struct dvb_frontend *fe)
 932{
 933        struct tuner_simple_priv *priv = fe->tuner_priv;
 934
 935        if (priv->i2c_props.adap == NULL)
 936                return -EINVAL;
 937
 938        if (priv->tun->sleepdata) {
 939                int ret;
 940
 941                if (fe->ops.i2c_gate_ctrl)
 942                        fe->ops.i2c_gate_ctrl(fe, 1);
 943
 944                ret = tuner_i2c_xfer_send(&priv->i2c_props,
 945                                          priv->tun->sleepdata + 1,
 946                                          priv->tun->sleepdata[0]);
 947                if (ret != priv->tun->sleepdata[0])
 948                        return ret;
 949        }
 950
 951        return 0;
 952}
 953
 954static int simple_release(struct dvb_frontend *fe)
 955{
 956        struct tuner_simple_priv *priv = fe->tuner_priv;
 957
 958        mutex_lock(&tuner_simple_list_mutex);
 959
 960        if (priv)
 961                hybrid_tuner_release_state(priv);
 962
 963        mutex_unlock(&tuner_simple_list_mutex);
 964
 965        fe->tuner_priv = NULL;
 966
 967        return 0;
 968}
 969
 970static int simple_get_frequency(struct dvb_frontend *fe, u32 *frequency)
 971{
 972        struct tuner_simple_priv *priv = fe->tuner_priv;
 973        *frequency = priv->frequency;
 974        return 0;
 975}
 976
 977static int simple_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
 978{
 979        struct tuner_simple_priv *priv = fe->tuner_priv;
 980        *bandwidth = priv->bandwidth;
 981        return 0;
 982}
 983
 984static struct dvb_tuner_ops simple_tuner_ops = {
 985        .init              = simple_init,
 986        .sleep             = simple_sleep,
 987        .set_analog_params = simple_set_params,
 988        .set_params        = simple_dvb_set_params,
 989        .calc_regs         = simple_dvb_calc_regs,
 990        .release           = simple_release,
 991        .get_frequency     = simple_get_frequency,
 992        .get_bandwidth     = simple_get_bandwidth,
 993        .get_status        = simple_get_status,
 994        .get_rf_strength   = simple_get_rf_strength,
 995};
 996
 997struct dvb_frontend *simple_tuner_attach(struct dvb_frontend *fe,
 998                                         struct i2c_adapter *i2c_adap,
 999                                         u8 i2c_addr,
1000                                         unsigned int type)
1001{
1002        struct tuner_simple_priv *priv = NULL;
1003        int instance;
1004
1005        if (type >= tuner_count) {
1006                printk(KERN_WARNING "%s: invalid tuner type: %d (max: %d)\n",
1007                       __func__, type, tuner_count-1);
1008                return NULL;
1009        }
1010
1011        /* If i2c_adap is set, check that the tuner is at the correct address.
1012         * Otherwise, if i2c_adap is NULL, the tuner will be programmed directly
1013         * by the digital demod via calc_regs.
1014         */
1015        if (i2c_adap != NULL) {
1016                u8 b[1];
1017                struct i2c_msg msg = {
1018                        .addr = i2c_addr, .flags = I2C_M_RD,
1019                        .buf = b, .len = 1,
1020                };
1021
1022                if (fe->ops.i2c_gate_ctrl)
1023                        fe->ops.i2c_gate_ctrl(fe, 1);
1024
1025                if (1 != i2c_transfer(i2c_adap, &msg, 1))
1026                        printk(KERN_WARNING "tuner-simple %d-%04x: "
1027                               "unable to probe %s, proceeding anyway.",
1028                               i2c_adapter_id(i2c_adap), i2c_addr,
1029                               tuners[type].name);
1030
1031                if (fe->ops.i2c_gate_ctrl)
1032                        fe->ops.i2c_gate_ctrl(fe, 0);
1033        }
1034
1035        mutex_lock(&tuner_simple_list_mutex);
1036
1037        instance = hybrid_tuner_request_state(struct tuner_simple_priv, priv,
1038                                              hybrid_tuner_instance_list,
1039                                              i2c_adap, i2c_addr,
1040                                              "tuner-simple");
1041        switch (instance) {
1042        case 0:
1043                mutex_unlock(&tuner_simple_list_mutex);
1044                return NULL;
1045        case 1:
1046                fe->tuner_priv = priv;
1047
1048                priv->type = type;
1049                priv->tun  = &tuners[type];
1050                priv->nr   = simple_devcount++;
1051                break;
1052        default:
1053                fe->tuner_priv = priv;
1054                break;
1055        }
1056
1057        mutex_unlock(&tuner_simple_list_mutex);
1058
1059        memcpy(&fe->ops.tuner_ops, &simple_tuner_ops,
1060               sizeof(struct dvb_tuner_ops));
1061
1062        tuner_info("type set to %d (%s)\n", type, priv->tun->name);
1063
1064        if ((debug) || ((atv_input[priv->nr] > 0) ||
1065                        (dtv_input[priv->nr] > 0))) {
1066                if (0 == atv_input[priv->nr])
1067                        tuner_info("tuner %d atv rf input will be "
1068                                   "autoselected\n", priv->nr);
1069                else
1070                        tuner_info("tuner %d atv rf input will be "
1071                                   "set to input %d (insmod option)\n",
1072                                   priv->nr, atv_input[priv->nr]);
1073                if (0 == dtv_input[priv->nr])
1074                        tuner_info("tuner %d dtv rf input will be "
1075                                   "autoselected\n", priv->nr);
1076                else
1077                        tuner_info("tuner %d dtv rf input will be "
1078                                   "set to input %d (insmod option)\n",
1079                                   priv->nr, dtv_input[priv->nr]);
1080        }
1081
1082        strlcpy(fe->ops.tuner_ops.info.name, priv->tun->name,
1083                sizeof(fe->ops.tuner_ops.info.name));
1084
1085        return fe;
1086}
1087EXPORT_SYMBOL_GPL(simple_tuner_attach);
1088
1089MODULE_DESCRIPTION("Simple 4-control-bytes style tuner driver");
1090MODULE_AUTHOR("Ralph Metzler, Gerd Knorr, Gunther Mayer");
1091MODULE_LICENSE("GPL");
1092
1093/*
1094 * Overrides for Emacs so that we follow Linus's tabbing style.
1095 * ---------------------------------------------------------------------------
1096 * Local variables:
1097 * c-basic-offset: 8
1098 * End:
1099 */