4c0c7bed2edf1e5206269e31e1022a37fefd129b
[pandora-kernel.git] / drivers / media / video / msp3400-driver.c
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/audiochip.h>
57 #include <linux/kthread.h>
58 #include <linux/suspend.h>
59 #include "msp3400.h"
60
61 /* ---------------------------------------------------------------------- */
62
63 MODULE_DESCRIPTION("device driver for msp34xx TV sound processor");
64 MODULE_AUTHOR("Gerd Knorr");
65 MODULE_LICENSE("GPL");
66
67 /* module parameters */
68 static int opmode   = OPMODE_AUTO;
69 int debug    = 0;    /* debug output */
70 int once     = 0;    /* no continous stereo monitoring */
71 int amsound  = 0;    /* hard-wire AM sound at 6.5 Hz (france),
72                                the autoscan seems work well only with FM... */
73 int standard = 1;    /* Override auto detect of audio standard, if needed. */
74 int dolby    = 0;
75
76 int stereo_threshold = 0x190; /* a2 threshold for stereo/bilingual
77                                         (msp34xxg only) 0x00a0-0x03c0 */
78
79 /* read-only */
80 module_param(opmode,           int, 0444);
81
82 /* read-write */
83 module_param(once,             int, 0644);
84 module_param(debug,            int, 0644);
85 module_param(stereo_threshold, int, 0644);
86 module_param(standard,         int, 0644);
87 module_param(amsound,          int, 0644);
88 module_param(dolby,            int, 0644);
89
90 MODULE_PARM_DESC(opmode, "Forces a MSP3400 opmode. 0=Manual, 1=Autodetect, 2=Autodetect and autoselect");
91 MODULE_PARM_DESC(once, "No continuous stereo monitoring");
92 MODULE_PARM_DESC(debug, "Enable debug messages [0-3]");
93 MODULE_PARM_DESC(stereo_threshold, "Sets signal threshold to activate stereo");
94 MODULE_PARM_DESC(standard, "Specify audio standard: 32 = NTSC, 64 = radio, Default: Autodetect");
95 MODULE_PARM_DESC(amsound, "Hardwire AM sound at 6.5Hz (France), FM can autoscan");
96 MODULE_PARM_DESC(dolby, "Activates Dolby processsing");
97
98 /* ---------------------------------------------------------------------- */
99
100 /* control subaddress */
101 #define I2C_MSP_CONTROL 0x00
102 /* demodulator unit subaddress */
103 #define I2C_MSP_DEM     0x10
104 /* DSP unit subaddress */
105 #define I2C_MSP_DSP     0x12
106
107 /* Addresses to scan */
108 static unsigned short normal_i2c[] = { 0x80 >> 1, 0x88 >> 1, I2C_CLIENT_END };
109
110 I2C_CLIENT_INSMOD;
111
112
113 /* ----------------------------------------------------------------------- */
114 /* functions for talking to the MSP3400C Sound processor                   */
115
116 int msp_reset(struct i2c_client *client)
117 {
118         /* reset and read revision code */
119         static u8 reset_off[3] = { I2C_MSP_CONTROL, 0x80, 0x00 };
120         static u8 reset_on[3]  = { I2C_MSP_CONTROL, 0x00, 0x00 };
121         static u8 write[3]     = { I2C_MSP_DSP + 1, 0x00, 0x1e };
122         u8 read[2];
123         struct i2c_msg reset[2] = {
124                 { client->addr, I2C_M_IGNORE_NAK, 3, reset_off },
125                 { client->addr, I2C_M_IGNORE_NAK, 3, reset_on  },
126         };
127         struct i2c_msg test[2] = {
128                 { client->addr, 0,        3, write },
129                 { client->addr, I2C_M_RD, 2, read  },
130         };
131
132         v4l_dbg(3, client, "msp_reset\n");
133         if (i2c_transfer(client->adapter, &reset[0], 1) != 1 ||
134             i2c_transfer(client->adapter, &reset[1], 1) != 1 ||
135             i2c_transfer(client->adapter, test, 2) != 2) {
136                 v4l_err(client, "chip reset failed\n");
137                 return -1;
138         }
139         return 0;
140 }
141
142 static int msp_read(struct i2c_client *client, int dev, int addr)
143 {
144         int err, retval;
145         u8 write[3];
146         u8 read[2];
147         struct i2c_msg msgs[2] = {
148                 { client->addr, 0,        3, write },
149                 { client->addr, I2C_M_RD, 2, read  }
150         };
151
152         write[0] = dev + 1;
153         write[1] = addr >> 8;
154         write[2] = addr & 0xff;
155
156         for (err = 0; err < 3; err++) {
157                 if (i2c_transfer(client->adapter, msgs, 2) == 2)
158                         break;
159                 v4l_warn(client, "I/O error #%d (read 0x%02x/0x%02x)\n", err,
160                        dev, addr);
161                 current->state = TASK_INTERRUPTIBLE;
162                 schedule_timeout(msecs_to_jiffies(10));
163         }
164         if (err == 3) {
165                 v4l_warn(client, "giving up, resetting chip. Sound will go off, sorry folks :-|\n");
166                 msp_reset(client);
167                 return -1;
168         }
169         retval = read[0] << 8 | read[1];
170         v4l_dbg(3, client, "msp_read(0x%x, 0x%x): 0x%x\n", dev, addr, retval);
171         return retval;
172 }
173
174 int msp_read_dem(struct i2c_client *client, int addr)
175 {
176         return msp_read(client, I2C_MSP_DEM, addr);
177 }
178
179 int msp_read_dsp(struct i2c_client *client, int addr)
180 {
181         return msp_read(client, I2C_MSP_DSP, addr);
182 }
183
184 static int msp_write(struct i2c_client *client, int dev, int addr, int val)
185 {
186         int err;
187         u8 buffer[5];
188
189         buffer[0] = dev;
190         buffer[1] = addr >> 8;
191         buffer[2] = addr &  0xff;
192         buffer[3] = val  >> 8;
193         buffer[4] = val  &  0xff;
194
195         v4l_dbg(3, client, "msp_write(0x%x, 0x%x, 0x%x)\n", dev, addr, val);
196         for (err = 0; err < 3; err++) {
197                 if (i2c_master_send(client, buffer, 5) == 5)
198                         break;
199                 v4l_warn(client, "I/O error #%d (write 0x%02x/0x%02x)\n", err,
200                        dev, addr);
201                 current->state = TASK_INTERRUPTIBLE;
202                 schedule_timeout(msecs_to_jiffies(10));
203         }
204         if (err == 3) {
205                 v4l_warn(client, "giving up, resetting chip. Sound will go off, sorry folks :-|\n");
206                 msp_reset(client);
207                 return -1;
208         }
209         return 0;
210 }
211
212 int msp_write_dem(struct i2c_client *client, int addr, int val)
213 {
214         return msp_write(client, I2C_MSP_DEM, addr, val);
215 }
216
217 int msp_write_dsp(struct i2c_client *client, int addr, int val)
218 {
219         return msp_write(client, I2C_MSP_DSP, addr, val);
220 }
221
222 /* ----------------------------------------------------------------------- *
223  * bits  9  8  5 - SCART DSP input Select:
224  *       0  0  0 - SCART 1 to DSP input (reset position)
225  *       0  1  0 - MONO to DSP input
226  *       1  0  0 - SCART 2 to DSP input
227  *       1  1  1 - Mute DSP input
228  *
229  * bits 11 10  6 - SCART 1 Output Select:
230  *       0  0  0 - undefined (reset position)
231  *       0  1  0 - SCART 2 Input to SCART 1 Output (for devices with 2 SCARTS)
232  *       1  0  0 - MONO input to SCART 1 Output
233  *       1  1  0 - SCART 1 DA to SCART 1 Output
234  *       0  0  1 - SCART 2 DA to SCART 1 Output
235  *       0  1  1 - SCART 1 Input to SCART 1 Output
236  *       1  1  1 - Mute SCART 1 Output
237  *
238  * bits 13 12  7 - SCART 2 Output Select (for devices with 2 Output SCART):
239  *       0  0  0 - SCART 1 DA to SCART 2 Output (reset position)
240  *       0  1  0 - SCART 1 Input to SCART 2 Output
241  *       1  0  0 - MONO input to SCART 2 Output
242  *       0  0  1 - SCART 2 DA to SCART 2 Output
243  *       0  1  1 - SCART 2 Input to SCART 2 Output
244  *       1  1  0 - Mute SCART 2 Output
245  *
246  * Bits 4 to 0 should be zero.
247  * ----------------------------------------------------------------------- */
248
249 static int scarts[3][9] = {
250         /* MASK    IN1     IN2     IN1_DA  IN2_DA  IN3     IN4     MONO    MUTE   */
251         /* SCART DSP Input select */
252         { 0x0320, 0x0000, 0x0200, -1,     -1,     0x0300, 0x0020, 0x0100, 0x0320 },
253         /* SCART1 Output select */
254         { 0x0c40, 0x0440, 0x0400, 0x0c00, 0x0040, 0x0000, 0x0840, 0x0800, 0x0c40 },
255         /* SCART2 Output select */
256         { 0x3080, 0x1000, 0x1080, 0x0000, 0x0080, 0x2080, 0x3080, 0x2000, 0x3000 },
257 };
258
259 static char *scart_names[] = {
260         "mask", "in1", "in2", "in1 da", "in2 da", "in3", "in4", "mono", "mute"
261 };
262
263 void msp_set_scart(struct i2c_client *client, int in, int out)
264 {
265         struct msp_state *state = i2c_get_clientdata(client);
266
267         state->in_scart=in;
268
269         if (in >= 1 && in <= 8 && out >= 0 && out <= 2) {
270                 if (-1 == scarts[out][in])
271                         return;
272
273                 state->acb &= ~scarts[out][SCART_MASK];
274                 state->acb |=  scarts[out][in];
275         } else
276                 state->acb = 0xf60; /* Mute Input and SCART 1 Output */
277
278         v4l_dbg(1, client, "scart switch: %s => %d (ACB=0x%04x)\n",
279                                                 scart_names[in], out, state->acb);
280         msp_write_dsp(client, 0x13, state->acb);
281
282         /* Sets I2S speed 0 = 1.024 Mbps, 1 = 2.048 Mbps */
283         msp_write_dem(client, 0x40, state->i2s_mode);
284 }
285
286 void msp_set_mute(struct i2c_client *client)
287 {
288         v4l_dbg(1, client, "mute audio\n");
289         msp_write_dsp(client, 0x0000, 0); /* loudspeaker */
290         msp_write_dsp(client, 0x0006, 0); /* headphones */
291 }
292
293 void msp_set_audio(struct i2c_client *client)
294 {
295         struct msp_state *state = i2c_get_clientdata(client);
296         int val = 0, bal = 0, bass, treble;
297
298         if (!state->muted)
299                 val = (state->volume * 0x7f / 65535) << 8;
300         if (val)
301                 bal = (state->balance / 256) - 128;
302         bass = ((state->bass - 32768) * 0x60 / 65535) << 8;
303         treble = ((state->treble - 32768) * 0x60 / 65535) << 8;
304
305         v4l_dbg(1, client, "mute=%s volume=%d balance=%d bass=%d treble=%d\n",
306                 state->muted ? "on" : "off", state->volume, state->balance,
307                 state->bass, state->treble);
308
309         msp_write_dsp(client, 0x0000, val); /* loudspeaker */
310         msp_write_dsp(client, 0x0006, val); /* headphones */
311         msp_write_dsp(client, 0x0007, state->muted ? 0x1 : (val | 0x1));
312         msp_write_dsp(client, 0x0001, bal << 8);
313         msp_write_dsp(client, 0x0002, bass); /* loudspeaker */
314         msp_write_dsp(client, 0x0003, treble); /* loudspeaker */
315 }
316
317 int msp_modus(struct i2c_client *client, int norm)
318 {
319         switch (norm) {
320         case VIDEO_MODE_PAL:
321                 v4l_dbg(1, client, "video mode selected to PAL\n");
322
323 #if 1
324                 /* experimental: not sure this works with all chip versions */
325                 return 0x7003;
326 #else
327                 /* previous value, try this if it breaks ... */
328                 return 0x1003;
329 #endif
330         case VIDEO_MODE_NTSC:  /* BTSC */
331                 v4l_dbg(1, client, "video mode selected to NTSC\n");
332                 return 0x2003;
333         case VIDEO_MODE_SECAM:
334                 v4l_dbg(1, client, "video mode selected to SECAM\n");
335                 return 0x0003;
336         case VIDEO_MODE_RADIO:
337                 v4l_dbg(1, client, "video mode selected to Radio\n");
338                 return 0x0003;
339         case VIDEO_MODE_AUTO:
340                 v4l_dbg(1, client, "video mode selected to Auto\n");
341                 return 0x2003;
342         default:
343                 return 0x0003;
344         }
345 }
346
347 int msp_standard(int norm)
348 {
349         switch (norm) {
350         case VIDEO_MODE_PAL:
351                 return 1;
352         case VIDEO_MODE_NTSC:  /* BTSC */
353                 return 0x0020;
354         case VIDEO_MODE_SECAM:
355                 return 1;
356         case VIDEO_MODE_RADIO:
357                 return 0x0040;
358         default:
359                 return 1;
360         }
361 }
362
363 /* ------------------------------------------------------------------------ */
364
365
366 static void msp_wake_thread(struct i2c_client *client)
367 {
368         struct msp_state *state = i2c_get_clientdata(client);
369
370         if (NULL == state->kthread)
371                 return;
372         msp_set_mute(client);
373         state->watch_stereo = 0;
374         state->restart = 1;
375         wake_up_interruptible(&state->wq);
376 }
377
378 int msp_sleep(struct msp_state *state, int timeout)
379 {
380         DECLARE_WAITQUEUE(wait, current);
381
382         add_wait_queue(&state->wq, &wait);
383         if (!kthread_should_stop()) {
384                 if (timeout < 0) {
385                         set_current_state(TASK_INTERRUPTIBLE);
386                         schedule();
387                 } else {
388                         schedule_timeout_interruptible
389                                                 (msecs_to_jiffies(timeout));
390                 }
391         }
392
393         remove_wait_queue(&state->wq, &wait);
394         try_to_freeze();
395         return state->restart;
396 }
397
398 /* ------------------------------------------------------------------------ */
399
400 static int msp_mode_v4l2_to_v4l1(int rxsubchans)
401 {
402         int mode = 0;
403
404         if (rxsubchans & V4L2_TUNER_SUB_STEREO)
405                 mode |= VIDEO_SOUND_STEREO;
406         if (rxsubchans & V4L2_TUNER_SUB_LANG2)
407                 mode |= VIDEO_SOUND_LANG2;
408         if (rxsubchans & V4L2_TUNER_SUB_LANG1)
409                 mode |= VIDEO_SOUND_LANG1;
410         if (mode == 0)
411                 mode |= VIDEO_SOUND_MONO;
412         return mode;
413 }
414
415 static int msp_mode_v4l1_to_v4l2(int mode)
416 {
417         if (mode & VIDEO_SOUND_STEREO)
418                 return V4L2_TUNER_MODE_STEREO;
419         if (mode & VIDEO_SOUND_LANG2)
420                 return V4L2_TUNER_MODE_LANG2;
421         if (mode & VIDEO_SOUND_LANG1)
422                 return V4L2_TUNER_MODE_LANG1;
423         return V4L2_TUNER_MODE_MONO;
424 }
425
426 static void msp_any_detect_stereo(struct i2c_client *client)
427 {
428         struct msp_state *state  = i2c_get_clientdata(client);
429
430         switch (state->opmode) {
431         case OPMODE_MANUAL:
432         case OPMODE_AUTODETECT:
433                 autodetect_stereo(client);
434                 break;
435         case OPMODE_AUTOSELECT:
436                 msp34xxg_detect_stereo(client);
437                 break;
438         }
439 }
440
441 static struct v4l2_queryctrl msp_qctrl[] = {
442         {
443                 .id            = V4L2_CID_AUDIO_VOLUME,
444                 .name          = "Volume",
445                 .minimum       = 0,
446                 .maximum       = 65535,
447                 .step          = 65535/100,
448                 .default_value = 58880,
449                 .flags         = 0,
450                 .type          = V4L2_CTRL_TYPE_INTEGER,
451         },{
452                 .id            = V4L2_CID_AUDIO_BALANCE,
453                 .name          = "Balance",
454                 .minimum       = 0,
455                 .maximum       = 65535,
456                 .step          = 65535/100,
457                 .default_value = 32768,
458                 .flags         = 0,
459                 .type          = V4L2_CTRL_TYPE_INTEGER,
460         },{
461                 .id            = V4L2_CID_AUDIO_MUTE,
462                 .name          = "Mute",
463                 .minimum       = 0,
464                 .maximum       = 1,
465                 .step          = 1,
466                 .default_value = 1,
467                 .flags         = 0,
468                 .type          = V4L2_CTRL_TYPE_BOOLEAN,
469         },{
470                 .id            = V4L2_CID_AUDIO_BASS,
471                 .name          = "Bass",
472                 .minimum       = 0,
473                 .maximum       = 65535,
474                 .step          = 65535/100,
475                 .default_value = 32768,
476                 .type          = V4L2_CTRL_TYPE_INTEGER,
477         },{
478                 .id            = V4L2_CID_AUDIO_TREBLE,
479                 .name          = "Treble",
480                 .minimum       = 0,
481                 .maximum       = 65535,
482                 .step          = 65535/100,
483                 .default_value = 32768,
484                 .type          = V4L2_CTRL_TYPE_INTEGER,
485         },
486 };
487
488
489 static void msp_any_set_audmode(struct i2c_client *client, int audmode)
490 {
491         struct msp_state *state = i2c_get_clientdata(client);
492
493         switch (state->opmode) {
494         case OPMODE_MANUAL:
495         case OPMODE_AUTODETECT:
496                 state->watch_stereo = 0;
497                 msp3400c_setstereo(client, audmode);
498                 break;
499         case OPMODE_AUTOSELECT:
500                 msp34xxg_set_audmode(client, audmode);
501                 break;
502         }
503 }
504
505 static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl)
506 {
507         struct msp_state *state = i2c_get_clientdata(client);
508
509         switch (ctrl->id) {
510         case V4L2_CID_AUDIO_MUTE:
511                 ctrl->value = state->muted;
512                 break;
513
514         case V4L2_CID_AUDIO_BALANCE:
515                 ctrl->value = state->balance;
516                 break;
517
518         case V4L2_CID_AUDIO_BASS:
519                 ctrl->value = state->bass;
520                 break;
521
522         case V4L2_CID_AUDIO_TREBLE:
523                 ctrl->value = state->treble;
524                 break;
525
526         case V4L2_CID_AUDIO_VOLUME:
527                 ctrl->value = state->volume;
528                 break;
529
530         default:
531                 return -EINVAL;
532         }
533         return 0;
534 }
535
536 static int msp_set_ctrl(struct i2c_client *client, struct v4l2_control *ctrl)
537 {
538         struct msp_state *state = i2c_get_clientdata(client);
539
540         switch (ctrl->id) {
541         case V4L2_CID_AUDIO_MUTE:
542                 if (ctrl->value < 0 || ctrl->value >= 2)
543                         return -ERANGE;
544                 state->muted = ctrl->value;
545                 break;
546
547         case V4L2_CID_AUDIO_BASS:
548                 state->bass = ctrl->value;
549                 break;
550
551         case V4L2_CID_AUDIO_TREBLE:
552                 state->treble = ctrl->value;
553                 break;
554
555         case V4L2_CID_AUDIO_BALANCE:
556                 state->balance = ctrl->value;
557                 break;
558
559         case V4L2_CID_AUDIO_VOLUME:
560                 state->volume = ctrl->value;
561                 if (state->volume == 0)
562                         state->balance = 32768;
563                 break;
564
565         default:
566                 return -EINVAL;
567         }
568         msp_set_audio(client);
569         return 0;
570 }
571
572 static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
573 {
574         struct msp_state *state = i2c_get_clientdata(client);
575         u16 *sarg = arg;
576         int scart = 0;
577
578         if (debug >= 2)
579                 v4l_i2c_print_ioctl(client, cmd);
580
581         switch (cmd) {
582         case AUDC_SET_INPUT:
583                 if (*sarg == state->input)
584                         break;
585                 state->input = *sarg;
586                 switch (*sarg) {
587                 case AUDIO_RADIO:
588                         /* Hauppauge uses IN2 for the radio */
589                         state->mode = MSP_MODE_FM_RADIO;
590                         scart       = SCART_IN2;
591                         break;
592                 case AUDIO_EXTERN_1:
593                         /* IN1 is often used for external input ... */
594                         state->mode = MSP_MODE_EXTERN;
595                         scart       = SCART_IN1;
596                         break;
597                 case AUDIO_EXTERN_2:
598                         /* ... sometimes it is IN2 through ;) */
599                         state->mode = MSP_MODE_EXTERN;
600                         scart       = SCART_IN2;
601                         break;
602                 case AUDIO_TUNER:
603                         state->mode = -1;
604                         break;
605                 default:
606                         if (*sarg & AUDIO_MUTE)
607                                 msp_set_scart(client, SCART_MUTE, 0);
608                         break;
609                 }
610                 if (scart) {
611                         state->rxsubchans = V4L2_TUNER_SUB_STEREO;
612                         state->audmode = V4L2_TUNER_MODE_STEREO;
613                         msp_set_scart(client, scart, 0);
614                         msp_write_dsp(client, 0x000d, 0x1900);
615                         if (state->opmode != OPMODE_AUTOSELECT)
616                                 msp3400c_setstereo(client, state->audmode);
617                 }
618                 msp_wake_thread(client);
619                 break;
620
621         case AUDC_SET_RADIO:
622                 state->norm = VIDEO_MODE_RADIO;
623                 v4l_dbg(1, client, "switching to radio mode\n");
624                 state->watch_stereo = 0;
625                 switch (state->opmode) {
626                 case OPMODE_MANUAL:
627                         /* set msp3400 to FM radio mode */
628                         msp3400c_setmode(client, MSP_MODE_FM_RADIO);
629                         msp3400c_setcarrier(client, MSP_CARRIER(10.7),
630                                             MSP_CARRIER(10.7));
631                         msp_set_audio(client);
632                         break;
633                 case OPMODE_AUTODETECT:
634                 case OPMODE_AUTOSELECT:
635                         /* the thread will do for us */
636                         msp_wake_thread(client);
637                         break;
638                 }
639                 break;
640
641         /* --- v4l ioctls --- */
642         /* take care: bttv does userspace copying, we'll get a
643            kernel pointer here... */
644         case VIDIOCGAUDIO:
645         {
646                 struct video_audio *va = arg;
647
648                 va->flags |= VIDEO_AUDIO_VOLUME |
649                         VIDEO_AUDIO_BASS |
650                         VIDEO_AUDIO_TREBLE |
651                         VIDEO_AUDIO_MUTABLE;
652                 if (state->muted)
653                         va->flags |= VIDEO_AUDIO_MUTE;
654
655                 if (state->muted)
656                         va->flags |= VIDEO_AUDIO_MUTE;
657                 va->volume = state->volume;
658                 va->balance = state->volume ? state->balance : 32768;
659                 va->bass = state->bass;
660                 va->treble = state->treble;
661
662                 msp_any_detect_stereo(client);
663                 va->mode = msp_mode_v4l2_to_v4l1(state->rxsubchans);
664                 break;
665         }
666
667         case VIDIOCSAUDIO:
668         {
669                 struct video_audio *va = arg;
670
671                 state->muted = (va->flags & VIDEO_AUDIO_MUTE);
672                 state->volume = va->volume;
673                 state->balance = va->balance;
674                 state->bass = va->bass;
675                 state->treble = va->treble;
676                 msp_set_audio(client);
677
678                 if (va->mode != 0 && state->norm != VIDEO_MODE_RADIO)
679                         msp_any_set_audmode(client, msp_mode_v4l1_to_v4l2(va->mode));
680                 break;
681         }
682
683         case VIDIOCSCHAN:
684         {
685                 struct video_channel *vc = arg;
686
687                 state->norm = vc->norm;
688                 msp_wake_thread(client);
689                 break;
690         }
691
692         case VIDIOCSFREQ:
693         case VIDIOC_S_FREQUENCY:
694         {
695                 /* new channel -- kick audio carrier scan */
696                 msp_wake_thread(client);
697                 break;
698         }
699
700         /* msp34xx specific */
701         case MSP_SET_MATRIX:
702         {
703                 struct msp_matrix *mspm = arg;
704
705                 msp_set_scart(client, mspm->input, mspm->output);
706                 break;
707         }
708
709         /* --- v4l2 ioctls --- */
710         case VIDIOC_S_STD:
711         {
712                 v4l2_std_id *id = arg;
713
714                 /*FIXME: use V4L2 mode flags on msp3400 instead of V4L1*/
715                 if (*id & V4L2_STD_PAL) {
716                         state->norm = VIDEO_MODE_PAL;
717                 } else if (*id & V4L2_STD_SECAM) {
718                         state->norm = VIDEO_MODE_SECAM;
719                 } else {
720                         state->norm = VIDEO_MODE_NTSC;
721                 }
722
723                 msp_wake_thread(client);
724                 return 0;
725         }
726
727         case VIDIOC_ENUMINPUT:
728         {
729                 struct v4l2_input *i = arg;
730
731                 if (i->index != 0)
732                         return -EINVAL;
733
734                 i->type = V4L2_INPUT_TYPE_TUNER;
735                 switch (i->index) {
736                 case AUDIO_RADIO:
737                         strcpy(i->name, "Radio");
738                         break;
739                 case AUDIO_EXTERN_1:
740                         strcpy(i->name, "Extern 1");
741                         break;
742                 case AUDIO_EXTERN_2:
743                         strcpy(i->name, "Extern 2");
744                         break;
745                 case AUDIO_TUNER:
746                         strcpy(i->name, "Television");
747                         break;
748                 default:
749                         return -EINVAL;
750                 }
751                 return 0;
752         }
753
754         case VIDIOC_G_AUDIO:
755         {
756                 struct v4l2_audio *a = arg;
757
758                 memset(a, 0, sizeof(*a));
759
760                 switch (a->index) {
761                 case AUDIO_RADIO:
762                         strcpy(a->name, "Radio");
763                         break;
764                 case AUDIO_EXTERN_1:
765                         strcpy(a->name, "Extern 1");
766                         break;
767                 case AUDIO_EXTERN_2:
768                         strcpy(a->name, "Extern 2");
769                         break;
770                 case AUDIO_TUNER:
771                         strcpy(a->name, "Television");
772                         break;
773                 default:
774                         return -EINVAL;
775                 }
776
777                 msp_any_detect_stereo(client);
778                 if (state->audmode == V4L2_TUNER_MODE_STEREO) {
779                         a->capability = V4L2_AUDCAP_STEREO;
780                 }
781
782                 break;
783         }
784
785         case VIDIOC_S_AUDIO:
786         {
787                 struct v4l2_audio *sarg = arg;
788
789                 switch (sarg->index) {
790                 case AUDIO_RADIO:
791                         /* Hauppauge uses IN2 for the radio */
792                         state->mode = MSP_MODE_FM_RADIO;
793                         scart       = SCART_IN2;
794                         break;
795                 case AUDIO_EXTERN_1:
796                         /* IN1 is often used for external input ... */
797                         state->mode = MSP_MODE_EXTERN;
798                         scart       = SCART_IN1;
799                         break;
800                 case AUDIO_EXTERN_2:
801                         /* ... sometimes it is IN2 through ;) */
802                         state->mode = MSP_MODE_EXTERN;
803                         scart       = SCART_IN2;
804                         break;
805                 case AUDIO_TUNER:
806                         state->mode = -1;
807                         break;
808                 }
809                 if (scart) {
810                         state->rxsubchans = V4L2_TUNER_SUB_STEREO;
811                         state->audmode = V4L2_TUNER_MODE_STEREO;
812                         msp_set_scart(client, scart, 0);
813                         msp_write_dsp(client, 0x000d, 0x1900);
814                 }
815                 if (sarg->capability == V4L2_AUDCAP_STEREO) {
816                         state->audmode = V4L2_TUNER_MODE_STEREO;
817                 } else {
818                         state->audmode &= ~V4L2_TUNER_MODE_STEREO;
819                 }
820                 msp_any_set_audmode(client, state->audmode);
821                 msp_wake_thread(client);
822                 break;
823         }
824
825         case VIDIOC_G_TUNER:
826         {
827                 struct v4l2_tuner *vt = arg;
828
829                 msp_any_detect_stereo(client);
830                 vt->audmode    = state->audmode;
831                 vt->rxsubchans = state->rxsubchans;
832                 vt->capability = V4L2_TUNER_CAP_STEREO |
833                         V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2;
834                 break;
835         }
836
837         case VIDIOC_S_TUNER:
838         {
839                 struct v4l2_tuner *vt = (struct v4l2_tuner *)arg;
840
841                 /* only set audmode */
842                 if (vt->audmode != -1 && vt->audmode != 0)
843                         msp_any_set_audmode(client, vt->audmode);
844                 break;
845         }
846
847         case VIDIOC_G_AUDOUT:
848         {
849                 struct v4l2_audioout *a = (struct v4l2_audioout *)arg;
850                 int idx = a->index;
851
852                 memset(a, 0, sizeof(*a));
853
854                 switch (idx) {
855                 case 0:
856                         strcpy(a->name, "Scart1 Out");
857                         break;
858                 case 1:
859                         strcpy(a->name, "Scart2 Out");
860                         break;
861                 case 2:
862                         strcpy(a->name, "I2S Out");
863                         break;
864                 default:
865                         return -EINVAL;
866                 }
867                 break;
868
869         }
870
871         case VIDIOC_S_AUDOUT:
872         {
873                 struct v4l2_audioout *a = (struct v4l2_audioout *)arg;
874
875                 if (a->index < 0 || a->index > 2)
876                         return -EINVAL;
877
878                 v4l_dbg(1, client, "Setting audio out on msp34xx to input %i\n", a->index);
879                 msp_set_scart(client, state->in_scart, a->index + 1);
880
881                 break;
882         }
883
884         case VIDIOC_INT_I2S_CLOCK_FREQ:
885         {
886                 u32 *a = (u32 *)arg;
887
888                 v4l_dbg(1, client, "Setting I2S speed to %d\n", *a);
889
890                 switch (*a) {
891                         case 1024000:
892                                 state->i2s_mode = 0;
893                                 break;
894                         case 2048000:
895                                 state->i2s_mode = 1;
896                                 break;
897                         default:
898                                 return -EINVAL;
899                 }
900                 break;
901         }
902
903         case VIDIOC_QUERYCTRL:
904         {
905                 struct v4l2_queryctrl *qc = arg;
906                 int i;
907
908                 for (i = 0; i < ARRAY_SIZE(msp_qctrl); i++)
909                         if (qc->id && qc->id == msp_qctrl[i].id) {
910                                 memcpy(qc, &msp_qctrl[i], sizeof(*qc));
911                                 return 0;
912                         }
913                 return -EINVAL;
914         }
915
916         case VIDIOC_G_CTRL:
917                 return msp_get_ctrl(client, arg);
918
919         case VIDIOC_S_CTRL:
920                 return msp_set_ctrl(client, arg);
921
922         case VIDIOC_LOG_STATUS:
923                 msp_any_detect_stereo(client);
924                 v4l_info(client, "%s rev1 = 0x%04x rev2 = 0x%04x\n",
925                                 client->name, state->rev1, state->rev2);
926                 v4l_info(client, "Audio:  volume %d balance %d bass %d treble %d%s\n",
927                                 state->volume, state->balance,
928                                 state->bass, state->treble,
929                                 state->muted ? " (muted)" : "");
930                 v4l_info(client, "Mode:   %s (%s%s)\n", msp_standard_mode_name(state->mode),
931                         (state->rxsubchans & V4L2_TUNER_SUB_STEREO) ? "stereo" : "mono",
932                         (state->rxsubchans & V4L2_TUNER_SUB_LANG2) ? ", dual" : "");
933                 v4l_info(client, "ACB:    0x%04x\n", state->acb);
934                 break;
935
936         default:
937                 /* nothing */
938                 break;
939         }
940         return 0;
941 }
942
943 static int msp_suspend(struct device * dev, pm_message_t state)
944 {
945         struct i2c_client *client = container_of(dev, struct i2c_client, dev);
946
947         v4l_dbg(1, client, "suspend\n");
948         msp_reset(client);
949         return 0;
950 }
951
952 static int msp_resume(struct device * dev)
953 {
954         struct i2c_client *client = container_of(dev, struct i2c_client, dev);
955
956         v4l_dbg(1, client, "resume\n");
957         msp_wake_thread(client);
958         return 0;
959 }
960
961 /* ----------------------------------------------------------------------- */
962
963 static struct i2c_driver i2c_driver;
964
965 static int msp_attach(struct i2c_adapter *adapter, int address, int kind)
966 {
967         struct i2c_client *client;
968         struct msp_state *state;
969         int (*thread_func)(void *data) = NULL;
970
971         client = kmalloc(sizeof(*client), GFP_KERNEL);
972         if (client == NULL)
973                 return -ENOMEM;
974         memset(client, 0, sizeof(*client));
975         client->addr = address;
976         client->adapter = adapter;
977         client->driver = &i2c_driver;
978         client->flags = I2C_CLIENT_ALLOW_USE;
979         snprintf(client->name, sizeof(client->name) - 1, "msp3400");
980
981         if (msp_reset(client) == -1) {
982                 v4l_dbg(1, client, "msp3400 not found\n");
983                 kfree(client);
984                 return -1;
985         }
986
987         state = kmalloc(sizeof(*state), GFP_KERNEL);
988         if (state == NULL) {
989                 kfree(client);
990                 return -ENOMEM;
991         }
992         i2c_set_clientdata(client, state);
993
994         memset(state, 0, sizeof(*state));
995         state->norm = VIDEO_MODE_NTSC;
996         state->volume = 58880;  /* 0db gain */
997         state->balance = 32768; /* 0db gain */
998         state->bass = 32768;
999         state->treble = 32768;
1000         state->input = -1;
1001         state->muted = 0;
1002         state->i2s_mode = 0;
1003         init_waitqueue_head(&state->wq);
1004
1005         state->rev1 = msp_read_dsp(client, 0x1e);
1006         if (state->rev1 != -1)
1007                 state->rev2 = msp_read_dsp(client, 0x1f);
1008         v4l_dbg(1, client, "rev1=0x%04x, rev2=0x%04x\n", state->rev1, state->rev2);
1009         if (state->rev1 == -1 || (state->rev1 == 0 && state->rev2 == 0)) {
1010                 v4l_dbg(1, client, "not an msp3400 (cannot read chip version)\n");
1011                 kfree(state);
1012                 kfree(client);
1013                 return -1;
1014         }
1015
1016         msp_set_audio(client);
1017
1018         snprintf(client->name, sizeof(client->name), "MSP%c4%02d%c-%c%d",
1019                  ((state->rev1 >> 4) & 0x0f) + '3',
1020                  (state->rev2 >> 8) & 0xff,
1021                  (state->rev1 & 0x0f) + '@',
1022                  ((state->rev1 >> 8) & 0xff) + '@',
1023                  state->rev2 & 0x1f);
1024
1025         state->opmode = opmode;
1026         if (state->opmode == OPMODE_AUTO) {
1027                 /* MSP revision G and up have both autodetect and autoselect */
1028                 if ((state->rev1 & 0x0f) >= 'G'-'@')
1029                         state->opmode = OPMODE_AUTOSELECT;
1030                 /* MSP revision D and up have autodetect */
1031                 else if ((state->rev1 & 0x0f) >= 'D'-'@')
1032                         state->opmode = OPMODE_AUTODETECT;
1033                 else
1034                         state->opmode = OPMODE_MANUAL;
1035         }
1036
1037         /* hello world :-) */
1038         v4l_info(client, "%s found @ 0x%x (%s)\n", client->name, address << 1, adapter->name);
1039         v4l_info(client, "%s ", client->name);
1040         if (HAVE_NICAM(state) && HAVE_RADIO(state))
1041                 printk("supports nicam and radio, ");
1042         else if (HAVE_NICAM(state))
1043                 printk("supports nicam, ");
1044         else if (HAVE_RADIO(state))
1045                 printk("supports radio, ");
1046         printk("mode is ");
1047
1048         /* version-specific initialization */
1049         switch (state->opmode) {
1050         case OPMODE_MANUAL:
1051                 printk("manual");
1052                 thread_func = msp3400c_thread;
1053                 break;
1054         case OPMODE_AUTODETECT:
1055                 printk("autodetect");
1056                 thread_func = msp3410d_thread;
1057                 break;
1058         case OPMODE_AUTOSELECT:
1059                 printk("autodetect and autoselect");
1060                 thread_func = msp34xxg_thread;
1061                 break;
1062         }
1063         printk("\n");
1064
1065         /* startup control thread if needed */
1066         if (thread_func) {
1067                 state->kthread = kthread_run(thread_func, client, "msp34xx");
1068
1069                 if (state->kthread == NULL)
1070                         v4l_warn(client, "kernel_thread() failed\n");
1071                 msp_wake_thread(client);
1072         }
1073
1074         /* done */
1075         i2c_attach_client(client);
1076
1077         return 0;
1078 }
1079
1080 static int msp_probe(struct i2c_adapter *adapter)
1081 {
1082         if (adapter->class & I2C_CLASS_TV_ANALOG)
1083                 return i2c_probe(adapter, &addr_data, msp_attach);
1084         return 0;
1085 }
1086
1087 static int msp_detach(struct i2c_client *client)
1088 {
1089         struct msp_state *state = i2c_get_clientdata(client);
1090         int err;
1091
1092         /* shutdown control thread */
1093         if (state->kthread) {
1094                 state->restart = 1;
1095                 kthread_stop(state->kthread);
1096         }
1097         msp_reset(client);
1098
1099         err = i2c_detach_client(client);
1100         if (err) {
1101                 return err;
1102         }
1103
1104         kfree(state);
1105         kfree(client);
1106         return 0;
1107 }
1108
1109 /* ----------------------------------------------------------------------- */
1110
1111 /* i2c implementation */
1112 static struct i2c_driver i2c_driver = {
1113         .id             = I2C_DRIVERID_MSP3400,
1114         .attach_adapter = msp_probe,
1115         .detach_client  = msp_detach,
1116         .command        = msp_command,
1117         .driver = {
1118                 .name    = "msp3400",
1119                 .suspend = msp_suspend,
1120                 .resume  = msp_resume,
1121         },
1122         .owner          = THIS_MODULE,
1123 };
1124
1125 static int __init msp3400_init_module(void)
1126 {
1127         return i2c_add_driver(&i2c_driver);
1128 }
1129
1130 static void __exit msp3400_cleanup_module(void)
1131 {
1132         i2c_del_driver(&i2c_driver);
1133 }
1134
1135 module_init(msp3400_init_module);
1136 module_exit(msp3400_cleanup_module);
1137
1138 /*
1139  * Overrides for Emacs so that we follow Linus's tabbing style.
1140  * ---------------------------------------------------------------------------
1141  * Local variables:
1142  * c-basic-offset: 8
1143  * End:
1144  */