Skip to content

Commit

Permalink
V4L/DVB (3233): Fixed API to set I2S speed control
Browse files Browse the repository at this point in the history
- 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>
  • Loading branch information
Mauro Carvalho Chehab committed Jan 9, 2006
1 parent e1bc80a commit 9bb13a6
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 15 deletions.
8 changes: 2 additions & 6 deletions drivers/media/video/em28xx/em28xx-cards.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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");
Expand All @@ -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;
}
Expand Down
2 changes: 2 additions & 0 deletions drivers/media/video/em28xx/em28xx-video.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions drivers/media/video/em28xx/em28xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
30 changes: 22 additions & 8 deletions drivers/media/video/msp3400.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@

#include <linux/videodev.h>
#include <media/audiochip.h>
#include <media/v4l2-common.h>
#include "msp3400.h"

/* ---------------------------------------------------------------------- */
Expand Down Expand Up @@ -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) {
Expand Down
1 change: 0 additions & 1 deletion include/linux/videodev2.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
7 changes: 7 additions & 0 deletions include/media/v4l2-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_ */

0 comments on commit 9bb13a6

Please sign in to comment.