Commit 9bb13a6d authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

V4L/DVB (3233): Fixed API to set I2S speed control


- Created a new ioctl to control I2S speed. Old calls to an
inadequate V4L2 API replaced.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@brturbo.com.br>
parent e1bc80ad
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <media/tuner.h> #include <media/tuner.h>
#include <media/audiochip.h> #include <media/audiochip.h>
#include <media/tveeprom.h> #include <media/tveeprom.h>
#include <media/v4l2-common.h>
#include "msp3400.h" #include "msp3400.h"
#include "em28xx.h" #include "em28xx.h"
...@@ -261,7 +262,6 @@ void em28xx_card_setup(struct em28xx *dev) ...@@ -261,7 +262,6 @@ void em28xx_card_setup(struct em28xx *dev)
/* request some modules */ /* request some modules */
if (dev->model == EM2820_BOARD_HAUPPAUGE_WINTV_USB_2) { if (dev->model == EM2820_BOARD_HAUPPAUGE_WINTV_USB_2) {
struct tveeprom tv; struct tveeprom tv;
struct v4l2_audioout ao;
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
request_module("tveeprom"); request_module("tveeprom");
request_module("ir-kbd-i2c"); request_module("ir-kbd-i2c");
...@@ -274,12 +274,8 @@ void em28xx_card_setup(struct em28xx *dev) ...@@ -274,12 +274,8 @@ void em28xx_card_setup(struct em28xx *dev)
dev->tuner_type= tv.tuner_type; dev->tuner_type= tv.tuner_type;
if (tv.audio_processor == AUDIO_CHIP_MSP34XX) { if (tv.audio_processor == AUDIO_CHIP_MSP34XX) {
dev->i2s_speed=2048000;
dev->has_msp34xx=1; 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 } else
dev->has_msp34xx=0; dev->has_msp34xx=0;
} }
......
...@@ -287,6 +287,8 @@ static void video_mux(struct em28xx *dev, int index) ...@@ -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); em28xx_videodbg("Setting input index=%d, vmux=%d, amux=%d\n",index,input,dev->ctl_ainput);
if (dev->has_msp34xx) { 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); em28xx_i2c_call_clients(dev, VIDIOC_S_AUDIO, &dev->ctl_ainput);
ainput = EM28XX_AUDIO_SRC_TUNER; ainput = EM28XX_AUDIO_SRC_TUNER;
em28xx_audio_source(dev, ainput); em28xx_audio_source(dev, ainput);
......
...@@ -216,6 +216,8 @@ struct em28xx { ...@@ -216,6 +216,8 @@ struct em28xx {
unsigned int has_msp34xx:1; unsigned int has_msp34xx:1;
unsigned int has_tda9887:1; unsigned int has_tda9887:1;
u32 i2s_speed; /* I2S speed for audio digital stream */
enum em28xx_decoder decoder; enum em28xx_decoder decoder;
int tuner_type; /* type of the tuner */ int tuner_type; /* type of the tuner */
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include <linux/videodev.h> #include <linux/videodev.h>
#include <media/audiochip.h> #include <media/audiochip.h>
#include <media/v4l2-common.h>
#include "msp3400.h" #include "msp3400.h"
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
...@@ -2104,23 +2105,36 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -2104,23 +2105,36 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
if (a->index<0||a->index>2) if (a->index<0||a->index>2)
return -EINVAL; return -EINVAL;
if (a->index==2) { msp3400_dbg("Setting audio out on msp34xx to input %i\n",a->index);
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);
msp3400c_set_scart(client,msp->in_scart,a->index+1); msp3400c_set_scart(client,msp->in_scart,a->index+1);
break; 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: case VIDIOC_QUERYCTRL:
{ {
struct v4l2_queryctrl *qc = arg; struct v4l2_queryctrl *qc = arg;
int i; int i;
msp3400_dbg("VIDIOC_QUERYCTRL"); msp3400_dbg("VIDIOC_QUERYCTRL\n");
for (i = 0; i < ARRAY_SIZE(msp34xx_qctrl); i++) for (i = 0; i < ARRAY_SIZE(msp34xx_qctrl); i++)
if (qc->id && qc->id == msp34xx_qctrl[i].id) { if (qc->id && qc->id == msp34xx_qctrl[i].id) {
......
...@@ -895,7 +895,6 @@ struct v4l2_audio ...@@ -895,7 +895,6 @@ struct v4l2_audio
/* Flags for the 'mode' field */ /* Flags for the 'mode' field */
#define V4L2_AUDMODE_AVL 0x00001 #define V4L2_AUDMODE_AVL 0x00001
#define V4L2_AUDMODE_32BITS 0x00002
struct v4l2_audioout struct v4l2_audioout
{ {
......
...@@ -107,4 +107,11 @@ enum v4l2_chip_ident { ...@@ -107,4 +107,11 @@ enum v4l2_chip_ident {
be made. */ be made. */
#define VIDIOC_INT_G_CHIP_IDENT _IOR ('d', 107, enum v4l2_chip_ident *) #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_ */ #endif /* V4L2_COMMON_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment