V4L/DVB (3233): Fixed API to set I2S speed control
authorMauro Carvalho Chehab <mchehab@brturbo.com.br>
Mon, 9 Jan 2006 17:25:37 +0000 (15:25 -0200)
committerMauro Carvalho Chehab <mchehab@brturbo.com.br>
Mon, 9 Jan 2006 17:25:37 +0000 (15:25 -0200)
- Created a new ioctl to control I2S speed. Old calls to an
inadequate V4L2 API replaced.

Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/em28xx/em28xx.h
drivers/media/video/msp3400.c
include/linux/videodev2.h
include/media/v4l2-common.h

index 57779e63f35d344264ac94395542b532eec92b1a..58f7b4194a0d51a6359475923c93c84e6583dad5 100644 (file)
@@ -30,6 +30,7 @@
 #include <media/tuner.h>
 #include <media/audiochip.h>
 #include <media/tveeprom.h>
+#include <media/v4l2-common.h>
 #include "msp3400.h"
 
 #include "em28xx.h"
@@ -261,7 +262,6 @@ void em28xx_card_setup(struct em28xx *dev)
        /* request some modules */
        if (dev->model == EM2820_BOARD_HAUPPAUGE_WINTV_USB_2) {
                struct tveeprom tv;
-               struct v4l2_audioout ao;
 #ifdef CONFIG_MODULES
                request_module("tveeprom");
                request_module("ir-kbd-i2c");
@@ -274,12 +274,8 @@ void em28xx_card_setup(struct em28xx *dev)
 
                dev->tuner_type= tv.tuner_type;
                if (tv.audio_processor == AUDIO_CHIP_MSP34XX) {
+                       dev->i2s_speed=2048000;
                        dev->has_msp34xx=1;
-                       memset (&ao,0,sizeof(ao));
-
-                       ao.index=2;
-                       ao.mode=V4L2_AUDMODE_32BITS;
-                       em28xx_i2c_call_clients(dev, VIDIOC_S_AUDOUT, &ao);
                } else
                        dev->has_msp34xx=0;
        }
index 5e831fccf3fd4c8d63fea37077685cceb3785290..0b5557c479aedcd30e65cd98df90b72ba44c053d 100644 (file)
@@ -287,6 +287,8 @@ static void video_mux(struct em28xx *dev, int index)
        em28xx_videodbg("Setting input index=%d, vmux=%d, amux=%d\n",index,input,dev->ctl_ainput);
 
        if (dev->has_msp34xx) {
+               if (dev->i2s_speed)
+                       em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ, &dev->i2s_speed);
                em28xx_i2c_call_clients(dev, VIDIOC_S_AUDIO, &dev->ctl_ainput);
                ainput = EM28XX_AUDIO_SRC_TUNER;
                em28xx_audio_source(dev, ainput);
index 5c7a41ce69f37c69daaa441134a4c0fab301f304..ffa9acc9be37c7ac949532ba245eced35df9b9f4 100644 (file)
@@ -216,6 +216,8 @@ struct em28xx {
        unsigned int has_msp34xx:1;
        unsigned int has_tda9887:1;
 
+       u32 i2s_speed;          /* I2S speed for audio digital stream */
+
        enum em28xx_decoder decoder;
 
        int tuner_type;         /* type of the tuner */
index fd0589352822d6af8d892aff4b385a8218dfc4d4..11235c1ac5c6b76cf9ba32a086525e4f8448b5a8 100644 (file)
@@ -54,6 +54,7 @@
 
 #include <linux/videodev.h>
 #include <media/audiochip.h>
+#include <media/v4l2-common.h>
 #include "msp3400.h"
 
 /* ---------------------------------------------------------------------- */
@@ -2104,23 +2105,36 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
                if (a->index<0||a->index>2)
                        return -EINVAL;
 
-               if (a->index==2) {
-                       if (a->mode == V4L2_AUDMODE_32BITS)
-                               msp->i2s_mode=1;
-                       else
-                               msp->i2s_mode=0;
-               }
-               msp3400_dbg("Setting audio out on msp34xx to input %i, mode %i\n",a->index,msp->i2s_mode);
+               msp3400_dbg("Setting audio out on msp34xx to input %i\n",a->index);
                msp3400c_set_scart(client,msp->in_scart,a->index+1);
 
                break;
        }
+       case VIDIOC_INT_I2S_CLOCK_FREQ:
+       {
+               u32 *a=(u32 *)arg;
+
+               msp3400_dbg("Setting I2S speed to %d\n",*a);
+
+               switch (*a) {
+                       case 1024000:
+                               msp->i2s_mode=0;
+                               break;
+                       case 2048000:
+                               msp->i2s_mode=1;
+                               break;
+                       default:
+                               return -EINVAL;
+               }
+               break;
+       }
+
        case VIDIOC_QUERYCTRL:
        {
                struct v4l2_queryctrl *qc = arg;
                int i;
 
-               msp3400_dbg("VIDIOC_QUERYCTRL");
+               msp3400_dbg("VIDIOC_QUERYCTRL\n");
 
                for (i = 0; i < ARRAY_SIZE(msp34xx_qctrl); i++)
                        if (qc->id && qc->id ==  msp34xx_qctrl[i].id) {
index b2f5e864b39728a7dec13bcf8cd496381989a014..6ac7c1f7902fba868c5488b1b26c91e3aec7a91d 100644 (file)
@@ -895,7 +895,6 @@ struct v4l2_audio
 
 /*  Flags for the 'mode' field */
 #define V4L2_AUDMODE_AVL               0x00001
-#define V4L2_AUDMODE_32BITS            0x00002
 
 struct v4l2_audioout
 {
index d3fd48157eb8bb87205e41fd82abdb9d8f89afd9..2f2402996409af8db8618e999047086edc2173e4 100644 (file)
@@ -107,4 +107,11 @@ enum v4l2_chip_ident {
    be made. */
 #define VIDIOC_INT_G_CHIP_IDENT                _IOR ('d', 107, enum v4l2_chip_ident *)
 
+/* Sets I2S speed in bps. This is used to provide a standard way to select I2S
+   clock used by driving digital audio streams at some board designs.
+   Usual values for the frequency are 1024000 and 2048000.
+   If the frequency is not supported, then -EINVAL is returned. */
+#define VIDIOC_INT_I2S_CLOCK_FREQ      _IOW ('d', 108, u32)
+
+
 #endif /* V4L2_COMMON_H_ */