mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-19 02:34:01 +08:00
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: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
This commit is contained in:
parent
e1bc80adaf
commit
9bb13a6dc3
@ -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)
|
|||||||
/* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
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 {
|
|||||||
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 @@
|
|||||||
|
|
||||||
#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)
|
|||||||
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
|
|||||||
|
|
||||||
/* 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 {
|
|||||||
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_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user