linux/drivers/media/video/msp3400-driver.c
<<
>>
Prefs
   1/*
   2 * Programming the mspx4xx sound processor family
   3 *
   4 * (c) 1997-2001 Gerd Knorr <kraxel@bytesex.org>
   5 *
   6 * what works and what doesn't:
   7 *
   8 *  AM-Mono
   9 *      Support for Hauppauge cards added (decoding handled by tuner) added by
  10 *      Frederic Crozat <fcrozat@mail.dotcom.fr>
  11 *
  12 *  FM-Mono
  13 *      should work. The stereo modes are backward compatible to FM-mono,
  14 *      therefore FM-Mono should be allways available.
  15 *
  16 *  FM-Stereo (B/G, used in germany)
  17 *      should work, with autodetect
  18 *
  19 *  FM-Stereo (satellite)
  20 *      should work, no autodetect (i.e. default is mono, but you can
  21 *      switch to stereo -- untested)
  22 *
  23 *  NICAM (B/G, L , used in UK, Scandinavia, Spain and France)
  24 *      should work, with autodetect. Support for NICAM was added by
  25 *      Pekka Pietikainen <pp@netppl.fi>
  26 *
  27 * TODO:
  28 *   - better SAT support
  29 *
  30 * 980623  Thomas Sailer (sailer@ife.ee.ethz.ch)
  31 *         using soundcore instead of OSS
  32 *
  33 * This program is free software; you can redistribute it and/or
  34 * modify it under the terms of the GNU General Public License
  35 * as published by the Free Software Foundation; either version 2
  36 * of the License, or (at your option) any later version.
  37 *
  38 * This program is distributed in the hope that it will be useful,
  39 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  40 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  41 * GNU General Public License for more details.
  42 *
  43 * You should have received a copy of the GNU General Public License
  44 * along with this program; if not, write to the Free Software
  45 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  46 */
  47
  48
  49#include <linux/kernel.h>
  50#include <linux/module.h>
  51#include <linux/slab.h>
  52#include <linux/i2c.h>
  53#include <linux/videodev.h>
  54#include <linux/videodev2.h>
  55#include <media/v4l2-common.h>
  56#include <media/tvaudio.h>
  57#include <media/msp3400.h>
  58#include <linux/kthread.h>
  59#include <linux/freezer.h>
  60#include "msp3400-driver.h"
  61
  62/* ---------------------------------------------------------------------- */
  63
  64MODULE_DESCRIPTION("device driver for msp34xx TV sound processor");
  65MODULE_AUTHOR("Gerd Knorr");
  66MODULE_LICENSE("GPL");
  67
  68/* module parameters */
  69static int opmode   = OPMODE_AUTO;
  70int msp_debug;           /* msp_debug output */
  71int msp_once;            /* no continous stereo monitoring */
  72int msp_amsound;         /* hard-wire AM sound at 6.5 Hz (france),
  73                            the autoscan seems work well only with FM... */
  74int msp_standard = 1;    /* Override auto detect of audio msp_standard, if needed. */
  75int msp_dolby;
  76
  77int msp_stereo_thresh = 0x190; /* a2 threshold for stereo/bilingual
  78                                        (msp34xxg only) 0x00a0-0x03c0 */
  79
  80/* read-only */
  81module_param(opmode,           int, 0444);
  82
  83/* read-write */
  84module_param_named(once,msp_once,                      bool, 0644);
  85module_param_named(debug,msp_debug,                    int,  0644);
  86module_param_named(stereo_threshold,msp_stereo_thresh, int,  0644);
  87module_param_named(standard,msp_standard,              int,  0644);
  88module_param_named(amsound,msp_amsound,                bool, 0644);
  89module_param_named(dolby,msp_dolby,                    bool, 0644);
  90
  91MODULE_PARM_DESC(opmode, "Forces a MSP3400 opmode. 0=Manual, 1=Autodetect, 2=Autodetect and autoselect");
  92MODULE_PARM_DESC(once, "No continuous stereo monitoring");
  93MODULE_PARM_DESC(debug, "Enable debug messages [0-3]");
  94MODULE_PARM_DESC(stereo_threshold, "Sets signal threshold to activate stereo");
  95MODULE_PARM_DESC(standard, "Specify audio standard: 32 = NTSC, 64 = radio, Default: Autodetect");
  96MODULE_PARM_DESC(amsound, "Hardwire AM sound at 6.5Hz (France), FM can autoscan");
  97MODULE_PARM_DESC(dolby, "Activates Dolby processsing");
  98
  99/* ---------------------------------------------------------------------- */
 100
 101/* control subaddress */
 102#define I2C_MSP_CONTROL 0x00
 103/* demodulator unit subaddress */
 104#define I2C_MSP_DEM     0x10
 105/* DSP unit subaddress */
 106#define I2C_MSP_DSP     0x12
 107
 108/* Addresses to scan */
 109static unsigned short normal_i2c[] = { 0x80 >> 1, 0x88 >> 1, I2C_CLIENT_END };
 110I2C_CLIENT_INSMOD;
 111
 112/* ----------------------------------------------------------------------- */
 113/* functions for talking to the MSP3400C Sound processor                   */
 114
 115int msp_reset(struct i2c_client *client)
 116{
 117        /* reset and read revision code */
 118        static u8 reset_off[3] = { I2C_MSP_CONTROL, 0x80, 0x00 };
 119        static u8 reset_on[3]  = { I2C_MSP_CONTROL, 0x00, 0x00 };
 120        static u8 write[3]     = { I2C_MSP_DSP + 1, 0x00, 0x1e };
 121        u8 read[2];
 122        struct i2c_msg reset[2] = {
 123                { client->addr, I2C_M_IGNORE_NAK, 3, reset_off },
 124                { client->addr, I2C_M_IGNORE_NAK, 3, reset_on  },
 125        };
 126        struct i2c_msg test[2] = {
 127                { client->addr, 0,        3, write },
 128                { client->addr, I2C_M_RD, 2, read  },
 129        };
 130
 131        v4l_dbg(3, msp_debug, client, "msp_reset\n");
 132        if (i2c_transfer(client->adapter, &reset[0], 1) != 1 ||
 133            i2c_transfer(client->adapter, &reset[1], 1) != 1 ||
 134            i2c_transfer(client->adapter, test, 2) != 2) {
 135                v4l_err(client, "chip reset failed\n");
 136                return -1;
 137        }
 138        return 0;
 139}
 140
 141static int msp_read(struct i2c_client *client, int dev, int addr)
 142{
 143        int err, retval;
 144        u8 write[3];
 145        u8 read[2];
 146        struct i2c_msg msgs[2] = {
 147                { client->addr, 0,        3, write },
 148                { client->addr, I2C_M_RD, 2, read  }
 149        };
 150
 151        write[0] = dev + 1;
 152        write[1] = addr >> 8;
 153        write[2] = addr & 0xff;
 154
 155        for (err = 0; err < 3; err++) {
 156                if (i2c_transfer(client->adapter, msgs, 2) == 2)
 157                        break;
 158                v4l_warn(client, "I/O error #%d (read 0x%02x/0x%02x)\n", err,
 159                       dev, addr);
 160                schedule_timeout_interruptible(msecs_to_jiffies(10));
 161        }
 162        if (err == 3) {
 163                v4l_warn(client, "giving up, resetting chip. Sound will go off, sorry folks :-|\n");
 164                msp_reset(client);
 165                return -1;
 166        }
 167        retval = read[0] << 8 | read[1];
 168        v4l_dbg(3, msp_debug, client, "msp_read(0x%x, 0x%x): 0x%x\n", dev, addr, retval);
 169        return retval;
 170}
 171
 172int msp_read_dem(struct i2c_client *client, int addr)
 173{
 174        return msp_read(client, I2C_MSP_DEM, addr);
 175}
 176
 177int msp_read_dsp(struct i2c_client *client, int addr)
 178{
 179        return msp_read(client, I2C_MSP_DSP, addr);
 180}
 181
 182static int msp_write(struct i2c_client *client, int dev, int addr, int val)
 183{
 184        int err;
 185        u8 buffer[5];
 186
 187        buffer[0] = dev;
 188        buffer[1] = addr >> 8;
 189        buffer[2] = addr &  0xff;
 190        buffer[3] = val  >> 8;
 191        buffer[4] = val  &  0xff;
 192
 193        v4l_dbg(3, msp_debug, client, "msp_write(0x%x, 0x%x, 0x%x)\n", dev, addr, val);
 194        for (err = 0; err < 3; err++) {
 195                if (i2c_master_send(client, buffer, 5) == 5)
 196                        break;
 197                v4l_warn(client, "I/O error #%d (write 0x%02x/0x%02x)\n", err,
 198                       dev, addr);
 199                schedule_timeout_interruptible(msecs_to_jiffies(10));
 200        }
 201        if (err == 3) {
 202                v4l_warn(client, "giving up, resetting chip. Sound will go off, sorry folks :-|\n");
 203                msp_reset(client);
 204                return -1;
 205        }
 206        return 0;
 207}
 208
 209int msp_write_dem(struct i2c_client *client, int addr, int val)
 210{
 211        return msp_write(client, I2C_MSP_DEM, addr, val);
 212}
 213
 214int msp_write_dsp(struct i2c_client *client, int addr, int val)
 215{
 216        return msp_write(client, I2C_MSP_DSP, addr, val);
 217}
 218
 219/* ----------------------------------------------------------------------- *
 220 * bits  9  8  5 - SCART DSP input Select:
 221 *       0  0  0 - SCART 1 to DSP input (reset position)
 222 *       0  1  0 - MONO to DSP input
 223 *       1  0  0 - SCART 2 to DSP input
 224 *       1  1  1 - Mute DSP input
 225 *
 226 * bits 11 10  6 - SCART 1 Output Select:
 227 *       0  0  0 - undefined (reset position)
 228 *       0  1  0 - SCART 2 Input to SCART 1 Output (for devices with 2 SCARTS)
 229 *       1  0  0 - MONO input to SCART 1 Output
 230 *       1  1  0 - SCART 1 DA to SCART 1 Output
 231 *       0  0  1 - SCART 2 DA to SCART 1 Output
 232 *       0  1  1 - SCART 1 Input to SCART 1 Output
 233 *       1  1  1 - Mute SCART 1 Output
 234 *
 235 * bits 13 12  7 - SCART 2 Output Select (for devices with 2 Output SCART):
 236 *       0  0  0 - SCART 1 DA to SCART 2 Output (reset position)
 237 *       0  1  0 - SCART 1 Input to SCART 2 Output
 238 *       1  0  0 - MONO input to SCART 2 Output
 239 *       0  0  1 - SCART 2 DA to SCART 2 Output
 240 *       0  1  1 - SCART 2 Input to SCART 2 Output
 241 *       1  1  0 - Mute SCART 2 Output
 242 *
 243 * Bits 4 to 0 should be zero.
 244 * ----------------------------------------------------------------------- */
 245
 246static int scarts[3][9] = {
 247        /* MASK   IN1     IN2     IN3     IN4     IN1_DA  IN2_DA  MONO    MUTE   */
 248        /* SCART DSP Input select */
 249        { 0x0320, 0x0000, 0x0200, 0x0300, 0x0020, -1,     -1,     0x0100, 0x0320 },
 250        /* SCART1 Output select */
 251        { 0x0c40, 0x0440, 0x0400, 0x0000, 0x0840, 0x0c00, 0x0040, 0x0800, 0x0c40 },
 252        /* SCART2 Output select */
 253        { 0x3080, 0x1000, 0x1080, 0x2080, 0x3080, 0x0000, 0x0080, 0x2000, 0x3000 },
 254};
 255
 256static char *scart_names[] = {
 257        "in1", "in2", "in3", "in4", "in1 da", "in2 da", "mono", "mute"
 258};
 259
 260void msp_set_scart(struct i2c_client *client, int in, int out)
 261{
 262        struct msp_state *state = i2c_get_clientdata(client);
 263
 264        state->in_scart = in;
 265
 266        if (in >= 0 && in <= 7 && out >= 0 && out <= 2) {
 267                if (-1 == scarts[out][in + 1])
 268                        return;
 269
 270                state->acb &= ~scarts[out][0];
 271                state->acb |=  scarts[out][in + 1];
 272        } else
 273                state->acb = 0xf60; /* Mute Input and SCART 1 Output */
 274
 275        v4l_dbg(1, msp_debug, client, "scart switch: %s => %d (ACB=0x%04x)\n",
 276                                                scart_names[in], out, state->acb);
 277        msp_write_dsp(client, 0x13, state->acb);
 278
 279        /* Sets I2S speed 0 = 1.024 Mbps, 1 = 2.048 Mbps */
 280        if (state->has_i2s_conf)
 281                msp_write_dem(client, 0x40, state->i2s_mode);
 282}
 283
 284void msp_set_audio(struct i2c_client *client)
 285{
 286        struct msp_state *state = i2c_get_clientdata(client);
 287        int bal = 0, bass, treble, loudness;
 288        int val = 0;
 289        int reallymuted = state->muted | state->scan_in_progress;
 290
 291        if (!reallymuted)
 292                val = (state->volume * 0x7f / 65535) << 8;
 293
 294        v4l_dbg(1, msp_debug, client, "mute=%s scanning=%s volume=%d\n",
 295                state->muted ? "on" : "off", state->scan_in_progress ? "yes" : "no",
 296                state->volume);
 297
 298        msp_write_dsp(client, 0x0000, val);
 299        msp_write_dsp(client, 0x0007, reallymuted ? 0x1 : (val | 0x1));
 300        if (state->has_scart2_out_volume)
 301                msp_write_dsp(client, 0x0040, reallymuted ? 0x1 : (val | 0x1));
 302        if (state->has_headphones)
 303                msp_write_dsp(client, 0x0006, val);
 304        if (!state->has_sound_processing)
 305                return;
 306
 307        if (val)
 308                bal = (u8)((state->balance / 256) - 128);
 309        bass = ((state->bass - 32768) * 0x60 / 65535) << 8;
 310        treble = ((state->treble - 32768) * 0x60 / 65535) << 8;
 311        loudness = state->loudness ? ((5 * 4) << 8) : 0;
 312
 313        v4l_dbg(1, msp_debug, client, "balance=%d bass=%d treble=%d loudness=%d\n",
 314                state->balance, state->bass, state->treble, state->loudness);
 315
 316        msp_write_dsp(client, 0x0001, bal << 8);
 317        msp_write_dsp(client, 0x0002, bass);
 318        msp_write_dsp(client, 0x0003, treble);
 319        msp_write_dsp(client, 0x0004, loudness);
 320        if (!state->has_headphones)
 321                return;
 322        msp_write_dsp(client, 0x0030, bal << 8);
 323        msp_write_dsp(client, 0x0031, bass);
 324        msp_write_dsp(client, 0x0032, treble);
 325        msp_write_dsp(client, 0x0033, loudness);
 326}
 327
 328/* ------------------------------------------------------------------------ */
 329
 330
 331static void msp_wake_thread(struct i2c_client *client)
 332{
 333        struct msp_state *state = i2c_get_clientdata(client);
 334
 335        if (NULL == state->kthread)
 336                return;
 337        state->watch_stereo = 0;
 338        state->restart = 1;
 339        wake_up_interruptible(&state->wq);
 340}
 341
 342int msp_sleep(struct msp_state *state, int timeout)
 343{
 344        DECLARE_WAITQUEUE(wait, current);
 345
 346        add_wait_queue(&state->wq, &wait);
 347        if (!kthread_should_stop()) {
 348                if (timeout < 0) {
 349                        set_current_state(TASK_INTERRUPTIBLE);
 350                        schedule();
 351                } else {
 352                        schedule_timeout_interruptible
 353                                                (msecs_to_jiffies(timeout));
 354                }
 355        }
 356
 357        remove_wait_queue(&state->wq, &wait);
 358        try_to_freeze();
 359        return state->restart;
 360}
 361
 362/* ------------------------------------------------------------------------ */
 363#ifdef CONFIG_VIDEO_V4L1
 364static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode)
 365{
 366        if (rxsubchans == V4L2_TUNER_SUB_MONO)
 367                return VIDEO_SOUND_MONO;
 368        if (rxsubchans == V4L2_TUNER_SUB_STEREO)
 369                return VIDEO_SOUND_STEREO;
 370        if (audmode == V4L2_TUNER_MODE_LANG2)
 371                return VIDEO_SOUND_LANG2;
 372        return VIDEO_SOUND_LANG1;
 373}
 374
 375static int msp_mode_v4l1_to_v4l2(int mode)
 376{
 377        if (mode & VIDEO_SOUND_STEREO)
 378                return V4L2_TUNER_MODE_STEREO;
 379        if (mode & VIDEO_SOUND_LANG2)
 380                return V4L2_TUNER_MODE_LANG2;
 381        if (mode & VIDEO_SOUND_LANG1)
 382                return V4L2_TUNER_MODE_LANG1;
 383        return V4L2_TUNER_MODE_MONO;
 384}
 385#endif
 386
 387static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl)
 388{
 389        struct msp_state *state = i2c_get_clientdata(client);
 390
 391        switch (ctrl->id) {
 392        case V4L2_CID_AUDIO_VOLUME:
 393                ctrl->value = state->volume;
 394                break;
 395
 396        case V4L2_CID_AUDIO_MUTE:
 397                ctrl->value = state->muted;
 398                break;
 399
 400        case V4L2_CID_AUDIO_BALANCE:
 401                if (!state->has_sound_processing)
 402                        return -EINVAL;
 403                ctrl->value = state->balance;
 404                break;
 405
 406        case V4L2_CID_AUDIO_BASS:
 407                if (!state->has_sound_processing)
 408                        return -EINVAL;
 409                ctrl->value = state->bass;
 410                break;
 411
 412        case V4L2_CID_AUDIO_TREBLE:
 413                if (!state->has_sound_processing)
 414                        return -EINVAL;
 415                ctrl->value = state->treble;
 416                break;
 417
 418        case V4L2_CID_AUDIO_LOUDNESS:
 419                if (!state->has_sound_processing)
 420                        return -EINVAL;
 421                ctrl->value = state->loudness;
 422                break;
 423
 424        default:
 425                return -EINVAL;
 426        }
 427        return 0;
 428}
 429
 430static int msp_set_ctrl(struct i2c_client *client, struct v4l2_control *ctrl)
 431{
 432        struct msp_state *state = i2c_get_clientdata(client);
 433
 434        switch (ctrl->id) {
 435        case V4L2_CID_AUDIO_VOLUME:
 436                state->volume = ctrl->value;
 437                if (state->volume == 0)
 438                        state->balance = 32768;
 439                break;
 440
 441        case V4L2_CID_AUDIO_MUTE:
 442                if (ctrl->value < 0 || ctrl->value >= 2)
 443                        return -ERANGE;
 444                state->muted = ctrl->value;
 445                break;
 446
 447        case V4L2_CID_AUDIO_BASS:
 448                if (!state->has_sound_processing)
 449                        return -EINVAL;
 450                state->bass = ctrl->value;
 451                break;
 452
 453        case V4L2_CID_AUDIO_TREBLE:
 454                if (!state->has_sound_processing)
 455                        return -EINVAL;
 456                state->treble = ctrl->value;
 457                break;
 458
 459        case V4L2_CID_AUDIO_LOUDNESS:
 460                if (!state->has_sound_processing)
 461                        return -EINVAL;
 462                state->loudness = ctrl->value;
 463                break;
 464
 465        case V4L2_CID_AUDIO_BALANCE:
 466                if (!state->has_sound_processing)
 467                        return -EINVAL;
 468                state->balance = ctrl->value;
 469                break;
 470
 471        default:
 472                return -EINVAL;
 473        }
 474        msp_set_audio(client);
 475        return 0;
 476}
 477
 478static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
 479{
 480        struct msp_state *state = i2c_get_clientdata(client);
 481
 482        if (msp_debug >= 2)
 483                v4l_i2c_print_ioctl(client, cmd);
 484
 485        switch (cmd) {
 486        case AUDC_SET_RADIO:
 487                if (state->radio)
 488                        return 0;
 489                state->radio = 1;
 490                v4l_dbg(1, msp_debug, client, "switching to radio mode\n");
 491                state->watch_stereo = 0;
 492                switch (state->opmode) {
 493                case OPMODE_MANUAL:
 494                        /* set msp3400 to FM radio mode */
 495                        msp3400c_set_mode(client, MSP_MODE_FM_RADIO);
 496                        msp3400c_set_carrier(client, MSP_CARRIER(10.7),
 497                                            MSP_CARRIER(10.7));
 498                        msp_set_audio(client);
 499                        break;
 500                case OPMODE_AUTODETECT:
 501                case OPMODE_AUTOSELECT:
 502                        /* the thread will do for us */
 503                        msp_wake_thread(client);
 504                        break;
 505                }
 506                break;
 507
 508        /* --- v4l ioctls --- */
 509        /* take care: bttv does userspace copying, we'll get a
 510           kernel pointer here... */
 511#ifdef CONFIG_VIDEO_V4L1
 512        case VIDIOCGAUDIO:
 513        {
 514                struct video_audio *va = arg;
 515
 516                va->flags |= VIDEO_AUDIO_VOLUME | VIDEO_AUDIO_MUTABLE;
 517                if (state->has_sound_processing)
 518                        va->flags |= VIDEO_AUDIO_BALANCE |
 519                                VIDEO_AUDIO_BASS |
 520                                VIDEO_AUDIO_TREBLE;
 521                if (state->muted)
 522                        va->flags |= VIDEO_AUDIO_MUTE;
 523                va->volume = state->volume;
 524                va->balance = state->volume ? state->balance : 32768;
 525                va->bass = state->bass;
 526                va->treble = state->treble;
 527
 528                if (state->radio)
 529                        break;
 530                if (state->opmode == OPMODE_AUTOSELECT)
 531                        msp_detect_stereo(client);
 532                va->mode = msp_mode_v4l2_to_v4l1(state->rxsubchans, state->audmode);
 533                break;
 534        }
 535
 536        case VIDIOCSAUDIO:
 537        {
 538                struct video_audio *va = arg;
 539
 540                state->muted = (va->flags & VIDEO_AUDIO_MUTE);
 541                state->volume = va->volume;
 542                state->balance = va->balance;
 543                state->bass = va->bass;
 544                state->treble = va->treble;
 545                msp_set_audio(client);
 546
 547                if (va->mode != 0 && state->radio == 0 &&
 548                    state->audmode != msp_mode_v4l1_to_v4l2(va->mode)) {
 549                        state->audmode = msp_mode_v4l1_to_v4l2(va->mode);
 550                        msp_set_audmode(client);
 551                }
 552                break;
 553        }
 554
 555        case VIDIOCSCHAN:
 556        {
 557                struct video_channel *vc = arg;
 558                int update = 0;
 559                v4l2_std_id std;
 560
 561                if (state->radio)
 562                        update = 1;
 563                state->radio = 0;
 564                if (vc->norm == VIDEO_MODE_PAL)
 565                        std = V4L2_STD_PAL;
 566                else if (vc->norm == VIDEO_MODE_SECAM)
 567                        std = V4L2_STD_SECAM;
 568                else
 569                        std = V4L2_STD_NTSC;
 570                if (std != state->v4l2_std) {
 571                        state->v4l2_std = std;
 572                        update = 1;
 573                }
 574                if (update)
 575                        msp_wake_thread(client);
 576                break;
 577        }
 578
 579        case VIDIOCSFREQ:
 580        {
 581                /* new channel -- kick audio carrier scan */
 582                msp_wake_thread(client);
 583                break;
 584        }
 585#endif
 586        case VIDIOC_S_FREQUENCY:
 587        {
 588                /* new channel -- kick audio carrier scan */
 589                msp_wake_thread(client);
 590                break;
 591        }
 592
 593        /* --- v4l2 ioctls --- */
 594        case VIDIOC_S_STD:
 595        {
 596                v4l2_std_id *id = arg;
 597                int update = state->radio || state->v4l2_std != *id;
 598
 599                state->v4l2_std = *id;
 600                state->radio = 0;
 601                if (update)
 602                        msp_wake_thread(client);
 603                return 0;
 604        }
 605
 606        case VIDIOC_INT_G_AUDIO_ROUTING:
 607        {
 608                struct v4l2_routing *rt = arg;
 609
 610                *rt = state->routing;
 611                break;
 612        }
 613
 614        case VIDIOC_INT_S_AUDIO_ROUTING:
 615        {
 616                struct v4l2_routing *rt = arg;
 617                int tuner = (rt->input >> 3) & 1;
 618                int sc_in = rt->input & 0x7;
 619                int sc1_out = rt->output & 0xf;
 620                int sc2_out = (rt->output >> 4) & 0xf;
 621                u16 val, reg;
 622                int i;
 623                int extern_input = 1;
 624
 625                if (state->routing.input == rt->input &&
 626                    state->routing.output == rt->output)
 627                        break;
 628                state->routing = *rt;
 629                /* check if the tuner input is used */
 630                for (i = 0; i < 5; i++) {
 631                        if (((rt->input >> (4 + i * 4)) & 0xf) == 0)
 632                                extern_input = 0;
 633                }
 634                state->mode = extern_input ? MSP_MODE_EXTERN : MSP_MODE_AM_DETECT;
 635                state->rxsubchans = V4L2_TUNER_SUB_STEREO;
 636                msp_set_scart(client, sc_in, 0);
 637                msp_set_scart(client, sc1_out, 1);
 638                msp_set_scart(client, sc2_out, 2);
 639                msp_set_audmode(client);
 640                reg = (state->opmode == OPMODE_AUTOSELECT) ? 0x30 : 0xbb;
 641                val = msp_read_dem(client, reg);
 642                msp_write_dem(client, reg, (val & ~0x100) | (tuner << 8));
 643                /* wake thread when a new input is chosen */
 644                msp_wake_thread(client);
 645                break;
 646        }
 647
 648        case VIDIOC_G_TUNER:
 649        {
 650                struct v4l2_tuner *vt = arg;
 651
 652                if (state->radio)
 653                        break;
 654                if (state->opmode == OPMODE_AUTOSELECT)
 655                        msp_detect_stereo(client);
 656                vt->audmode    = state->audmode;
 657                vt->rxsubchans = state->rxsubchans;
 658                vt->capability |= V4L2_TUNER_CAP_STEREO |
 659                        V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2;
 660                break;
 661        }
 662
 663        case VIDIOC_S_TUNER:
 664        {
 665                struct v4l2_tuner *vt = (struct v4l2_tuner *)arg;
 666
 667                if (state->radio)  /* TODO: add mono/stereo support for radio */
 668                        break;
 669                if (state->audmode == vt->audmode)
 670                        break;
 671                state->audmode = vt->audmode;
 672                /* only set audmode */
 673                msp_set_audmode(client);
 674                break;
 675        }
 676
 677        case VIDIOC_INT_I2S_CLOCK_FREQ:
 678        {
 679                u32 *a = (u32 *)arg;
 680
 681                v4l_dbg(1, msp_debug, client, "Setting I2S speed to %d\n", *a);
 682
 683                switch (*a) {
 684                        case 1024000:
 685                                state->i2s_mode = 0;
 686                                break;
 687                        case 2048000:
 688                                state->i2s_mode = 1;
 689                                break;
 690                        default:
 691                                return -EINVAL;
 692                }
 693                break;
 694        }
 695
 696        case VIDIOC_QUERYCTRL:
 697        {
 698                struct v4l2_queryctrl *qc = arg;
 699
 700                switch (qc->id) {
 701                        case V4L2_CID_AUDIO_VOLUME:
 702                        case V4L2_CID_AUDIO_MUTE:
 703                                return v4l2_ctrl_query_fill_std(qc);
 704                        default:
 705                                break;
 706                }
 707                if (!state->has_sound_processing)
 708                        return -EINVAL;
 709                switch (qc->id) {
 710                        case V4L2_CID_AUDIO_LOUDNESS:
 711                        case V4L2_CID_AUDIO_BALANCE:
 712                        case V4L2_CID_AUDIO_BASS:
 713                        case V4L2_CID_AUDIO_TREBLE:
 714                                return v4l2_ctrl_query_fill_std(qc);
 715                        default:
 716                                return -EINVAL;
 717                }
 718        }
 719
 720        case VIDIOC_G_CTRL:
 721                return msp_get_ctrl(client, arg);
 722
 723        case VIDIOC_S_CTRL:
 724                return msp_set_ctrl(client, arg);
 725
 726        case VIDIOC_LOG_STATUS:
 727        {
 728                const char *p;
 729
 730                if (state->opmode == OPMODE_AUTOSELECT)
 731                        msp_detect_stereo(client);
 732                v4l_info(client, "%s rev1 = 0x%04x rev2 = 0x%04x\n",
 733                                client->name, state->rev1, state->rev2);
 734                v4l_info(client, "Audio:    volume %d%s\n",
 735                                state->volume, state->muted ? " (muted)" : "");
 736                if (state->has_sound_processing) {
 737                        v4l_info(client, "Audio:    balance %d bass %d treble %d loudness %s\n",
 738                                        state->balance, state->bass, state->treble,
 739                                        state->loudness ? "on" : "off");
 740                }
 741                switch (state->mode) {
 742                case MSP_MODE_AM_DETECT: p = "AM (for carrier detect)"; break;
 743                case MSP_MODE_FM_RADIO: p = "FM Radio"; break;
 744                case MSP_MODE_FM_TERRA: p = "Terrestial FM-mono + FM-stereo"; break;
 745                case MSP_MODE_FM_SAT: p = "Satellite FM-mono"; break;
 746                case MSP_MODE_FM_NICAM1: p = "NICAM/FM (B/G, D/K)"; break;
 747                case MSP_MODE_FM_NICAM2: p = "NICAM/FM (I)"; break;
 748                case MSP_MODE_AM_NICAM: p = "NICAM/AM (L)"; break;
 749                case MSP_MODE_BTSC: p = "BTSC"; break;
 750                case MSP_MODE_EXTERN: p = "External input"; break;
 751                default: p = "unknown"; break;
 752                }
 753                if (state->mode == MSP_MODE_EXTERN) {
 754                        v4l_info(client, "Mode:     %s\n", p);
 755                } else if (state->opmode == OPMODE_MANUAL) {
 756                        v4l_info(client, "Mode:     %s (%s%s)\n", p,
 757                                (state->rxsubchans & V4L2_TUNER_SUB_STEREO) ? "stereo" : "mono",
 758                                (state->rxsubchans & V4L2_TUNER_SUB_LANG2) ? ", dual" : "");
 759                } else {
 760                        if (state->opmode == OPMODE_AUTODETECT)
 761                                v4l_info(client, "Mode:     %s\n", p);
 762                        v4l_info(client, "Standard: %s (%s%s)\n",
 763                                msp_standard_std_name(state->std),
 764                                (state->rxsubchans & V4L2_TUNER_SUB_STEREO) ? "stereo" : "mono",
 765                                (state->rxsubchans & V4L2_TUNER_SUB_LANG2) ? ", dual" : "");
 766                }
 767                v4l_info(client, "Audmode:  0x%04x\n", state->audmode);
 768                v4l_info(client, "Routing:  0x%08x (input) 0x%08x (output)\n",
 769                                state->routing.input, state->routing.output);
 770                v4l_info(client, "ACB:      0x%04x\n", state->acb);
 771                break;
 772        }
 773
 774        case VIDIOC_G_CHIP_IDENT:
 775                return v4l2_chip_ident_i2c_client(client, arg, state->ident, (state->rev1 << 16) | state->rev2);
 776
 777        default:
 778                /* unknown */
 779                return -EINVAL;
 780        }
 781        return 0;
 782}
 783
 784static int msp_suspend(struct i2c_client *client, pm_message_t state)
 785{
 786
 787        v4l_dbg(1, msp_debug, client, "suspend\n");
 788        msp_reset(client);
 789        return 0;
 790}
 791
 792static int msp_resume(struct i2c_client *client)
 793{
 794
 795        v4l_dbg(1, msp_debug, client, "resume\n");
 796        msp_wake_thread(client);
 797        return 0;
 798}
 799
 800/* ----------------------------------------------------------------------- */
 801
 802static struct i2c_driver i2c_driver;
 803
 804static int msp_attach(struct i2c_adapter *adapter, int address, int kind)
 805{
 806        struct i2c_client *client;
 807        struct msp_state *state;
 808        int (*thread_func)(void *data) = NULL;
 809        int msp_hard;
 810        int msp_family;
 811        int msp_revision;
 812        int msp_product, msp_prod_hi, msp_prod_lo;
 813        int msp_rom;
 814
 815        client = kzalloc(sizeof(*client), GFP_KERNEL);
 816        if (!client)
 817                return -ENOMEM;
 818
 819        client->addr = address;
 820        client->adapter = adapter;
 821        client->driver = &i2c_driver;
 822        snprintf(client->name, sizeof(client->name) - 1, "msp3400");
 823
 824        if (msp_reset(client) == -1) {
 825                v4l_dbg(1, msp_debug, client, "msp3400 not found\n");
 826                kfree(client);
 827                return 0;
 828        }
 829
 830        state = kzalloc(sizeof(*state), GFP_KERNEL);
 831        if (!state) {
 832                kfree(client);
 833                return -ENOMEM;
 834        }
 835
 836        i2c_set_clientdata(client, state);
 837
 838        state->v4l2_std = V4L2_STD_NTSC;
 839        state->audmode = V4L2_TUNER_MODE_STEREO;
 840        state->volume = 58880;  /* 0db gain */
 841        state->balance = 32768; /* 0db gain */
 842        state->bass = 32768;
 843        state->treble = 32768;
 844        state->loudness = 0;
 845        state->input = -1;
 846        state->muted = 0;
 847        state->i2s_mode = 0;
 848        init_waitqueue_head(&state->wq);
 849        /* These are the reset input/output positions */
 850        state->routing.input = MSP_INPUT_DEFAULT;
 851        state->routing.output = MSP_OUTPUT_DEFAULT;
 852
 853        state->rev1 = msp_read_dsp(client, 0x1e);
 854        if (state->rev1 != -1)
 855                state->rev2 = msp_read_dsp(client, 0x1f);
 856        v4l_dbg(1, msp_debug, client, "rev1=0x%04x, rev2=0x%04x\n", state->rev1, state->rev2);
 857        if (state->rev1 == -1 || (state->rev1 == 0 && state->rev2 == 0)) {
 858                v4l_dbg(1, msp_debug, client, "not an msp3400 (cannot read chip version)\n");
 859                kfree(state);
 860                kfree(client);
 861                return 0;
 862        }
 863
 864        msp_set_audio(client);
 865
 866        msp_family = ((state->rev1 >> 4) & 0x0f) + 3;
 867        msp_product = (state->rev2 >> 8) & 0xff;
 868        msp_prod_hi = msp_product / 10;
 869        msp_prod_lo = msp_product % 10;
 870        msp_revision = (state->rev1 & 0x0f) + '@';
 871        msp_hard = ((state->rev1 >> 8) & 0xff) + '@';
 872        msp_rom = state->rev2 & 0x1f;
 873        snprintf(client->name, sizeof(client->name), "MSP%d4%02d%c-%c%d",
 874                        msp_family, msp_product,
 875                        msp_revision, msp_hard, msp_rom);
 876        /* Rev B=2, C=3, D=4, G=7 */
 877        state->ident = msp_family * 10000 + 4000 + msp_product * 10 + msp_revision - '@';
 878
 879        /* Has NICAM support: all mspx41x and mspx45x products have NICAM */
 880        state->has_nicam = msp_prod_hi == 1 || msp_prod_hi == 5;
 881        /* Has radio support: was added with revision G */
 882        state->has_radio = msp_revision >= 'G';
 883        /* Has headphones output: not for stripped down products */
 884        state->has_headphones = msp_prod_lo < 5;
 885        /* Has scart2 input: not in stripped down products of the '3' family */
 886        state->has_scart2 = msp_family >= 4 || msp_prod_lo < 7;
 887        /* Has scart3 input: not in stripped down products of the '3' family */
 888        state->has_scart3 = msp_family >= 4 || msp_prod_lo < 5;
 889        /* Has scart4 input: not in pre D revisions, not in stripped D revs */
 890        state->has_scart4 = msp_family >= 4 || (msp_revision >= 'D' && msp_prod_lo < 5);
 891        /* Has scart2 output: not in stripped down products of the '3' family */
 892        state->has_scart2_out = msp_family >= 4 || msp_prod_lo < 5;
 893        /* Has scart2 a volume control? Not in pre-D revisions. */
 894        state->has_scart2_out_volume = msp_revision > 'C' && state->has_scart2_out;
 895        /* Has a configurable i2s out? */
 896        state->has_i2s_conf = msp_revision >= 'G' && msp_prod_lo < 7;
 897        /* Has subwoofer output: not in pre-D revs and not in stripped down products */
 898        state->has_subwoofer = msp_revision >= 'D' && msp_prod_lo < 5;
 899        /* Has soundprocessing (bass/treble/balance/loudness/equalizer): not in
 900           stripped down products */
 901        state->has_sound_processing = msp_prod_lo < 7;
 902        /* Has Virtual Dolby Surround: only in msp34x1 */
 903        state->has_virtual_dolby_surround = msp_revision == 'G' && msp_prod_lo == 1;
 904        /* Has Virtual Dolby Surround & Dolby Pro Logic: only in msp34x2 */
 905        state->has_dolby_pro_logic = msp_revision == 'G' && msp_prod_lo == 2;
 906        /* The msp343xG supports BTSC only and cannot do Automatic Standard Detection. */
 907        state->force_btsc = msp_family == 3 && msp_revision == 'G' && msp_prod_hi == 3;
 908
 909        state->opmode = opmode;
 910        if (state->opmode == OPMODE_AUTO) {
 911                /* MSP revision G and up have both autodetect and autoselect */
 912                if (msp_revision >= 'G')
 913                        state->opmode = OPMODE_AUTOSELECT;
 914                /* MSP revision D and up have autodetect */
 915                else if (msp_revision >= 'D')
 916                        state->opmode = OPMODE_AUTODETECT;
 917                else
 918                        state->opmode = OPMODE_MANUAL;
 919        }
 920
 921        /* hello world :-) */
 922        v4l_info(client, "%s found @ 0x%x (%s)\n", client->name, address << 1, adapter->name);
 923        v4l_info(client, "%s ", client->name);
 924        if (state->has_nicam && state->has_radio)
 925                printk("supports nicam and radio, ");
 926        else if (state->has_nicam)
 927                printk("supports nicam, ");
 928        else if (state->has_radio)
 929                printk("supports radio, ");
 930        printk("mode is ");
 931
 932        /* version-specific initialization */
 933        switch (state->opmode) {
 934        case OPMODE_MANUAL:
 935                printk("manual");
 936                thread_func = msp3400c_thread;
 937                break;
 938        case OPMODE_AUTODETECT:
 939                printk("autodetect");
 940                thread_func = msp3410d_thread;
 941                break;
 942        case OPMODE_AUTOSELECT:
 943                printk("autodetect and autoselect");
 944                thread_func = msp34xxg_thread;
 945                break;
 946        }
 947        printk("\n");
 948
 949        /* startup control thread if needed */
 950        if (thread_func) {
 951                state->kthread = kthread_run(thread_func, client, "msp34xx");
 952
 953                if (IS_ERR(state->kthread))
 954                        v4l_warn(client, "kernel_thread() failed\n");
 955                msp_wake_thread(client);
 956        }
 957
 958        /* done */
 959        i2c_attach_client(client);
 960
 961        return 0;
 962}
 963
 964static int msp_probe(struct i2c_adapter *adapter)
 965{
 966        if (adapter->class & I2C_CLASS_TV_ANALOG)
 967                return i2c_probe(adapter, &addr_data, msp_attach);
 968        return 0;
 969}
 970
 971static int msp_detach(struct i2c_client *client)
 972{
 973        struct msp_state *state = i2c_get_clientdata(client);
 974        int err;
 975
 976        /* shutdown control thread */
 977        if (state->kthread) {
 978                state->restart = 1;
 979                kthread_stop(state->kthread);
 980        }
 981        msp_reset(client);
 982
 983        err = i2c_detach_client(client);
 984        if (err) {
 985                return err;
 986        }
 987
 988        kfree(state);
 989        kfree(client);
 990        return 0;
 991}
 992
 993/* ----------------------------------------------------------------------- */
 994
 995/* i2c implementation */
 996static struct i2c_driver i2c_driver = {
 997        .id             = I2C_DRIVERID_MSP3400,
 998        .attach_adapter = msp_probe,
 999        .detach_client  = msp_detach,
1000        .suspend = msp_suspend,
1001        .resume  = msp_resume,
1002        .command        = msp_command,
1003        .driver = {
1004                .name    = "msp3400",
1005        },
1006};
1007
1008static int __init msp3400_init_module(void)
1009{
1010        return i2c_add_driver(&i2c_driver);
1011}
1012
1013static void __exit msp3400_cleanup_module(void)
1014{
1015        i2c_del_driver(&i2c_driver);
1016}
1017
1018module_init(msp3400_init_module);
1019module_exit(msp3400_cleanup_module);
1020
1021/*
1022 * Overrides for Emacs so that we follow Linus's tabbing style.
1023 * ---------------------------------------------------------------------------
1024 * Local variables:
1025 * c-basic-offset: 8
1026 * End:
1027 */
1028