]> err.no Git - linux-2.6/blobdiff - drivers/media/video/bt8xx/bttv-audio-hook.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
[linux-2.6] / drivers / media / video / bt8xx / bttv-audio-hook.c
index 1f25cdbed7d6043667bb69fa75a9f6be2a129f6e..2364d16586b37f377c35cdf3da85eaac55385a9e 100644 (file)
@@ -7,22 +7,18 @@
 
 #include "bttv-audio-hook.h"
 
+#include <linux/delay.h>
+
 /* ----------------------------------------------------------------------- */
 /* winview                                                                 */
 
- void winview_audio(struct bttv *btv, struct video_audio *v, int set)
+void winview_volume(struct bttv *btv, __u16 volume)
 {
        /* PT2254A programming Jon Tombs, jon@gte.esi.us.es */
        int bits_out, loops, vol, data;
 
-       if (!set) {
-               /* Fixed by Leandro Lucarella <luca@linuxmendoza.org.ar (07/31/01) */
-               v->flags |= VIDEO_AUDIO_VOLUME;
-               return;
-       }
-
        /* 32 levels logarithmic */
-       vol = 32 - ((v->volume>>11));
+       vol = 32 - ((volume>>11));
        /* units */
        bits_out = (PT2254_DBS_IN_2>>(vol%5));
        /* tens */
 /* mono/stereo control for various cards (which don't use i2c chips but    */
 /* connect something to the GPIO pins                                      */
 
- void
-gvbctv3pci_audio(struct bttv *btv, struct video_audio *v, int set)
+void gvbctv3pci_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
 {
        unsigned int con = 0;
 
        if (set) {
                gpio_inout(0x300, 0x300);
-               if (v->mode & VIDEO_SOUND_LANG1)
+               if (t->audmode & V4L2_TUNER_MODE_LANG1)
                        con = 0x000;
-               if (v->mode & VIDEO_SOUND_LANG2)
+               if (t->audmode & V4L2_TUNER_MODE_LANG2)
                        con = 0x300;
-               if (v->mode & VIDEO_SOUND_STEREO)
+               if (t->audmode & V4L2_TUNER_MODE_STEREO)
                        con = 0x200;
-/*             if (v->mode & VIDEO_SOUND_MONO)
+/*             if (t->audmode & V4L2_TUNER_MODE_MONO)
  *                     con = 0x100; */
                gpio_bits(0x300, con);
        } else {
-               v->mode = VIDEO_SOUND_STEREO |
-                         VIDEO_SOUND_LANG1  | VIDEO_SOUND_LANG2;
+               t->audmode = V4L2_TUNER_MODE_STEREO |
+                         V4L2_TUNER_MODE_LANG1  | V4L2_TUNER_MODE_LANG2;
        }
 }
 
- void
-gvbctv5pci_audio(struct bttv *btv, struct video_audio *v, int set)
+void gvbctv5pci_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
 {
        unsigned int val, con;
 
@@ -89,8 +83,8 @@ gvbctv5pci_audio(struct bttv *btv, struct video_audio *v, int set)
        val = gpio_read();
        if (set) {
                con = 0x000;
-               if (v->mode & VIDEO_SOUND_LANG2) {
-                       if (v->mode & VIDEO_SOUND_LANG1) {
+               if (t->audmode & V4L2_TUNER_MODE_LANG2) {
+                       if (t->audmode & V4L2_TUNER_MODE_LANG1) {
                                /* LANG1 + LANG2 */
                                con = 0x100;
                        }
@@ -107,24 +101,28 @@ gvbctv5pci_audio(struct bttv *btv, struct video_audio *v, int set)
        } else {
                switch (val & 0x70) {
                  case 0x10:
-                       v->mode = VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+                       t->rxsubchans = V4L2_TUNER_SUB_LANG1 |  V4L2_TUNER_SUB_LANG2;
                        break;
                  case 0x30:
-                       v->mode = VIDEO_SOUND_LANG2;
+                       t->rxsubchans = V4L2_TUNER_SUB_LANG2;
                        break;
                  case 0x50:
-                       v->mode = VIDEO_SOUND_LANG1;
+                       t->rxsubchans = V4L2_TUNER_SUB_LANG1;
                        break;
                  case 0x60:
-                       v->mode = VIDEO_SOUND_STEREO;
+                       t->rxsubchans = V4L2_TUNER_SUB_STEREO;
                        break;
                  case 0x70:
-                       v->mode = VIDEO_SOUND_MONO;
+                       t->rxsubchans = V4L2_TUNER_SUB_MONO;
                        break;
                  default:
-                       v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
-                                 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+                       t->rxsubchans = V4L2_TUNER_SUB_MONO |
+                                        V4L2_TUNER_SUB_STEREO |
+                                        V4L2_TUNER_SUB_LANG1 |
+                                        V4L2_TUNER_SUB_LANG2;
                }
+               t->audmode = V4L2_TUNER_MODE_STEREO |
+                         V4L2_TUNER_MODE_LANG1  | V4L2_TUNER_MODE_LANG2;
        }
 }
 
@@ -141,15 +139,15 @@ gvbctv5pci_audio(struct bttv *btv, struct video_audio *v, int set)
  * handles this with a tda9840
  *
  */
- void
-avermedia_tvphone_audio(struct bttv *btv, struct video_audio *v, int set)
+
+void avermedia_tvphone_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
 {
        int val = 0;
 
        if (set) {
-               if (v->mode & VIDEO_SOUND_LANG2)   /* SAP */
+               if (t->audmode & V4L2_TUNER_MODE_LANG2)   /* SAP */
                        val = 0x02;
-               if (v->mode & VIDEO_SOUND_STEREO)
+               if (t->audmode & V4L2_TUNER_MODE_STEREO)
                        val = 0x01;
                if (val) {
                        gpio_bits(0x03,val);
@@ -157,97 +155,96 @@ avermedia_tvphone_audio(struct bttv *btv, struct video_audio *v, int set)
                                bttv_gpio_tracking(btv,"avermedia");
                }
        } else {
-               v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
-                       VIDEO_SOUND_LANG1;
+               t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
+                       V4L2_TUNER_MODE_LANG1;
                return;
        }
 }
 
- void
-avermedia_tv_stereo_audio(struct bttv *btv, struct video_audio *v, int set)
+
+void avermedia_tv_stereo_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
 {
        int val = 0;
 
        if (set) {
-               if (v->mode & VIDEO_SOUND_LANG2)   /* SAP */
+               if (t->audmode & V4L2_TUNER_MODE_LANG2)   /* SAP */
                        val = 0x01;
-               if (v->mode & VIDEO_SOUND_STEREO)  /* STEREO */
+               if (t->audmode & V4L2_TUNER_MODE_STEREO)  /* STEREO */
                        val = 0x02;
                btaor(val, ~0x03, BT848_GPIO_DATA);
                if (bttv_gpio)
                        bttv_gpio_tracking(btv,"avermedia");
        } else {
-               v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
-                       VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+               t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
+                       V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
                return;
        }
 }
 
 /* Lifetec 9415 handling */
- void
-lt9415_audio(struct bttv *btv, struct video_audio *v, int set)
+
+void lt9415_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
 {
        int val = 0;
 
        if (gpio_read() & 0x4000) {
-               v->mode = VIDEO_SOUND_MONO;
+               t->audmode = V4L2_TUNER_MODE_MONO;
                return;
        }
 
        if (set) {
-               if (v->mode & VIDEO_SOUND_LANG2)  /* A2 SAP */
+               if (t->audmode & V4L2_TUNER_MODE_LANG2)  /* A2 SAP */
                        val = 0x0080;
-               if (v->mode & VIDEO_SOUND_STEREO) /* A2 stereo */
+               if (t->audmode & V4L2_TUNER_MODE_STEREO) /* A2 stereo */
                        val = 0x0880;
-               if ((v->mode & VIDEO_SOUND_LANG1) ||
-                   (v->mode & VIDEO_SOUND_MONO))
+               if ((t->audmode & V4L2_TUNER_MODE_LANG1) ||
+                   (t->audmode & V4L2_TUNER_MODE_MONO))
                        val = 0;
                gpio_bits(0x0880, val);
                if (bttv_gpio)
                        bttv_gpio_tracking(btv,"lt9415");
        } else {
                /* autodetect doesn't work with this card :-( */
-               v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
-                       VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+               t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
+                       V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
                return;
        }
 }
 
 /* TDA9821 on TerraTV+ Bt848, Bt878 */
- void
-terratv_audio(struct bttv *btv, struct video_audio *v, int set)
+void terratv_audio(struct bttv *btv,  struct v4l2_tuner *t, int set)
 {
        unsigned int con = 0;
 
        if (set) {
                gpio_inout(0x180000,0x180000);
-               if (v->mode & VIDEO_SOUND_LANG2)
+               if (t->audmode & V4L2_TUNER_MODE_LANG2)
                        con = 0x080000;
-               if (v->mode & VIDEO_SOUND_STEREO)
+               if (t->audmode & V4L2_TUNER_MODE_STEREO)
                        con = 0x180000;
                gpio_bits(0x180000, con);
                if (bttv_gpio)
                        bttv_gpio_tracking(btv,"terratv");
        } else {
-               v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
-                       VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+               t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
+                       V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
        }
 }
 
- void
-winfast2000_audio(struct bttv *btv, struct video_audio *v, int set)
+
+void winfast2000_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
 {
        unsigned long val = 0;
 
        if (set) {
                /*btor (0xc32000, BT848_GPIO_OUT_EN);*/
-               if (v->mode & VIDEO_SOUND_MONO)         /* Mono */
+               if (t->audmode & V4L2_TUNER_MODE_MONO)          /* Mono */
                        val = 0x420000;
-               if (v->mode & VIDEO_SOUND_LANG1)        /* Mono */
+               if (t->audmode & V4L2_TUNER_MODE_LANG1) /* Mono */
                        val = 0x420000;
-               if (v->mode & VIDEO_SOUND_LANG2)        /* SAP */
+               if (t->audmode & V4L2_TUNER_MODE_LANG2) /* SAP */
                        val = 0x410000;
-               if (v->mode & VIDEO_SOUND_STEREO)       /* Stereo */
+               if (t->audmode & V4L2_TUNER_MODE_STEREO)        /* Stereo */
                        val = 0x020000;
                if (val) {
                        gpio_bits(0x430000, val);
@@ -255,8 +252,8 @@ winfast2000_audio(struct bttv *btv, struct video_audio *v, int set)
                                bttv_gpio_tracking(btv,"winfast2000");
                }
        } else {
-               v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
-                         VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+               t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
+                         V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
        }
 }
 
@@ -268,8 +265,7 @@ winfast2000_audio(struct bttv *btv, struct video_audio *v, int set)
  * Note: There are card variants without tda9874a. Forcing the "stereo sound route"
  *       will mute this cards.
  */
- void
-pvbt878p9b_audio(struct bttv *btv, struct video_audio *v, int set)
+void pvbt878p9b_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
 {
        unsigned int val = 0;
 
@@ -277,11 +273,11 @@ pvbt878p9b_audio(struct bttv *btv, struct video_audio *v, int set)
                return;
 
        if (set) {
-               if (v->mode & VIDEO_SOUND_MONO) {
+               if (t->audmode & V4L2_TUNER_MODE_MONO)  {
                        val = 0x01;
                }
-               if ((v->mode & (VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2))
-                   || (v->mode & VIDEO_SOUND_STEREO)) {
+               if ((t->audmode & (V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2))
+                   || (t->audmode & V4L2_TUNER_MODE_STEREO)) {
                        val = 0x02;
                }
                if (val) {
@@ -290,8 +286,8 @@ pvbt878p9b_audio(struct bttv *btv, struct video_audio *v, int set)
                                bttv_gpio_tracking(btv,"pvbt878p9b");
                }
        } else {
-               v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
-                       VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+               t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
+                       V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
        }
 }
 
@@ -300,8 +296,7 @@ pvbt878p9b_audio(struct bttv *btv, struct video_audio *v, int set)
  * sound control for FlyVideo 2000S (with tda9874 decoder)
  * based on pvbt878p9b_audio() - this is not tested, please fix!!!
  */
- void
-fv2000s_audio(struct bttv *btv, struct video_audio *v, int set)
+void fv2000s_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
 {
        unsigned int val = 0xffff;
 
@@ -309,11 +304,11 @@ fv2000s_audio(struct bttv *btv, struct video_audio *v, int set)
                return;
 
        if (set) {
-               if (v->mode & VIDEO_SOUND_MONO) {
+               if (t->audmode & V4L2_TUNER_MODE_MONO)  {
                        val = 0x0000;
                }
-               if ((v->mode & (VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2))
-                   || (v->mode & VIDEO_SOUND_STEREO)) {
+               if ((t->audmode & (V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2))
+                   || (t->audmode & V4L2_TUNER_MODE_STEREO)) {
                        val = 0x1080; /*-dk-???: 0x0880, 0x0080, 0x1800 ... */
                }
                if (val != 0xffff) {
@@ -322,8 +317,8 @@ fv2000s_audio(struct bttv *btv, struct video_audio *v, int set)
                                bttv_gpio_tracking(btv,"fv2000s");
                }
        } else {
-               v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
-                       VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+               t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
+                       V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
        }
 }
 
@@ -331,19 +326,18 @@ fv2000s_audio(struct bttv *btv, struct video_audio *v, int set)
  * sound control for Canopus WinDVR PCI
  * Masaki Suzuki <masaki@btree.org>
  */
- void
-windvr_audio(struct bttv *btv, struct video_audio *v, int set)
+void windvr_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
 {
        unsigned long val = 0;
 
        if (set) {
-               if (v->mode & VIDEO_SOUND_MONO)
+               if (t->audmode & V4L2_TUNER_MODE_MONO)
                        val = 0x040000;
-               if (v->mode & VIDEO_SOUND_LANG1)
+               if (t->audmode & V4L2_TUNER_MODE_LANG1)
                        val = 0;
-               if (v->mode & VIDEO_SOUND_LANG2)
+               if (t->audmode & V4L2_TUNER_MODE_LANG2)
                        val = 0x100000;
-               if (v->mode & VIDEO_SOUND_STEREO)
+               if (t->audmode & V4L2_TUNER_MODE_STEREO)
                        val = 0;
                if (val) {
                        gpio_bits(0x140000, val);
@@ -351,8 +345,8 @@ windvr_audio(struct bttv *btv, struct video_audio *v, int set)
                                bttv_gpio_tracking(btv,"windvr");
                }
        } else {
-               v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
-                         VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
+               t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
+                         V4L2_TUNER_MODE_LANG1 | V4L2_TUNER_MODE_LANG2;
        }
 }
 
@@ -360,8 +354,7 @@ windvr_audio(struct bttv *btv, struct video_audio *v, int set)
  * sound control for AD-TVK503
  * Hiroshi Takekawa <sian@big.or.jp>
  */
- void
-adtvk503_audio(struct bttv *btv, struct video_audio *v, int set)
+void adtvk503_audio(struct bttv *btv, struct v4l2_tuner *t, int set)
 {
        unsigned int con = 0xffffff;
 
@@ -369,13 +362,13 @@ adtvk503_audio(struct bttv *btv, struct video_audio *v, int set)
 
        if (set) {
                /* btor(***, BT848_GPIO_OUT_EN); */
-               if (v->mode & VIDEO_SOUND_LANG1)
+               if (t->audmode & V4L2_TUNER_MODE_LANG1)
                        con = 0x00000000;
-               if (v->mode & VIDEO_SOUND_LANG2)
+               if (t->audmode & V4L2_TUNER_MODE_LANG2)
                        con = 0x00180000;
-               if (v->mode & VIDEO_SOUND_STEREO)
+               if (t->audmode & V4L2_TUNER_MODE_STEREO)
                        con = 0x00000000;
-               if (v->mode & VIDEO_SOUND_MONO)
+               if (t->audmode & V4L2_TUNER_MODE_MONO)
                        con = 0x00060000;
                if (con != 0xffffff) {
                        gpio_bits(0x1e0000,con);
@@ -383,7 +376,7 @@ adtvk503_audio(struct bttv *btv, struct video_audio *v, int set)
                                bttv_gpio_tracking(btv, "adtvk503");
                }
        } else {
-               v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
-                         VIDEO_SOUND_LANG1  | VIDEO_SOUND_LANG2;
+               t->audmode = V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO |
+                         V4L2_TUNER_MODE_LANG1  | V4L2_TUNER_MODE_LANG2;
        }
 }