Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb: V4L/DVB (4227): Update this driver for recent header file movement. V4L/DVB (4223): Add V4L2_CID_MPEG_STREAM_VBI_FMT control V4L/DVB (4222): Always switch tuner mode when calling VIDIOC_S_FREQUENCY. V4L/DVB (4221): Add HM12 YUV format define. V4L/DVB (4219): Av7110: analog sound output of DVB-C rev 2.3 V4L/DVB (4217): Fix a misplaced closing bracket/else, which caused swzigzag not to be called V4L/DVB (4215): Make VIDEO_CX88_BLACKBIRD a separate build option V4L/DVB (4214): Make VIDEO_CX2341X a selectable build option V4L/DVB (4213): Cx88: cleanups V4L/DVB (4211): Fix an Oops for all fe that have get_frontend_algo == NULL
This commit is contained in:
commit
5f2f444136
19 changed files with 157 additions and 75 deletions
|
@ -82,9 +82,6 @@ config VIDEO_IR
|
||||||
config VIDEO_TVEEPROM
|
config VIDEO_TVEEPROM
|
||||||
tristate
|
tristate
|
||||||
|
|
||||||
config VIDEO_CX2341X
|
|
||||||
tristate
|
|
||||||
|
|
||||||
config USB_DABUSB
|
config USB_DABUSB
|
||||||
tristate "DABUSB driver"
|
tristate "DABUSB driver"
|
||||||
depends on USB
|
depends on USB
|
||||||
|
|
|
@ -556,22 +556,23 @@ static int dvb_frontend_thread(void *data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* do an iteration of the tuning loop */
|
/* do an iteration of the tuning loop */
|
||||||
if (fe->ops.get_frontend_algo(fe) == FE_ALGO_HW) {
|
if (fe->ops.get_frontend_algo) {
|
||||||
/* have we been asked to retune? */
|
if (fe->ops.get_frontend_algo(fe) == FE_ALGO_HW) {
|
||||||
params = NULL;
|
/* have we been asked to retune? */
|
||||||
if (fepriv->state & FESTATE_RETUNE) {
|
params = NULL;
|
||||||
params = &fepriv->parameters;
|
if (fepriv->state & FESTATE_RETUNE) {
|
||||||
fepriv->state = FESTATE_TUNED;
|
params = &fepriv->parameters;
|
||||||
}
|
fepriv->state = FESTATE_TUNED;
|
||||||
|
}
|
||||||
|
|
||||||
fe->ops.tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s);
|
fe->ops.tune(fe, params, fepriv->tune_mode_flags, &fepriv->delay, &s);
|
||||||
if (s != fepriv->status) {
|
if (s != fepriv->status) {
|
||||||
dvb_frontend_add_event(fe, s);
|
dvb_frontend_add_event(fe, s);
|
||||||
fepriv->status = s;
|
fepriv->status = s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else
|
||||||
dvb_frontend_swzigzag(fe);
|
dvb_frontend_swzigzag(fe);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dvb_shutdown_timeout) {
|
if (dvb_shutdown_timeout) {
|
||||||
|
|
|
@ -152,13 +152,9 @@ static void init_av7110_av(struct av7110 *av7110)
|
||||||
/* remaining inits according to card and frontend type */
|
/* remaining inits according to card and frontend type */
|
||||||
av7110->analog_tuner_flags = 0;
|
av7110->analog_tuner_flags = 0;
|
||||||
av7110->current_input = 0;
|
av7110->current_input = 0;
|
||||||
if (dev->pci->subsystem_vendor == 0x13c2 && dev->pci->subsystem_device == 0x000a) {
|
if (dev->pci->subsystem_vendor == 0x13c2 && dev->pci->subsystem_device == 0x000a)
|
||||||
printk("dvb-ttpci: MSP3415 audio DAC @ card %d\n",
|
|
||||||
av7110->dvb_adapter.num);
|
|
||||||
av7110->adac_type = DVB_ADAC_MSP34x5;
|
|
||||||
av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 0); // SPDIF on
|
av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 0); // SPDIF on
|
||||||
}
|
if (i2c_writereg(av7110, 0x20, 0x00, 0x00) == 1) {
|
||||||
else if (i2c_writereg(av7110, 0x20, 0x00, 0x00) == 1) {
|
|
||||||
printk ("dvb-ttpci: Crystal audio DAC @ card %d detected\n",
|
printk ("dvb-ttpci: Crystal audio DAC @ card %d detected\n",
|
||||||
av7110->dvb_adapter.num);
|
av7110->dvb_adapter.num);
|
||||||
av7110->adac_type = DVB_ADAC_CRYSTAL;
|
av7110->adac_type = DVB_ADAC_CRYSTAL;
|
||||||
|
|
|
@ -318,7 +318,17 @@ int av7110_set_volume(struct av7110 *av7110, int volleft, int volright)
|
||||||
msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */
|
msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */
|
||||||
msp_writereg(av7110, MSP_WR_DSP, 0x0006, val); /* headphonesr */
|
msp_writereg(av7110, MSP_WR_DSP, 0x0006, val); /* headphonesr */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case DVB_ADAC_MSP34x5:
|
||||||
|
vol = (volleft > volright) ? volleft : volright;
|
||||||
|
val = (vol * 0x73 / 255) << 8;
|
||||||
|
if (vol > 0)
|
||||||
|
balance = ((volright - volleft) * 127) / vol;
|
||||||
|
msp_writereg(av7110, MSP_WR_DSP, 0x0001, balance << 8);
|
||||||
|
msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1267,23 +1277,32 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file,
|
||||||
switch(av7110->audiostate.channel_select) {
|
switch(av7110->audiostate.channel_select) {
|
||||||
case AUDIO_STEREO:
|
case AUDIO_STEREO:
|
||||||
ret = audcom(av7110, AUDIO_CMD_STEREO);
|
ret = audcom(av7110, AUDIO_CMD_STEREO);
|
||||||
if (!ret)
|
if (!ret) {
|
||||||
if (av7110->adac_type == DVB_ADAC_CRYSTAL)
|
if (av7110->adac_type == DVB_ADAC_CRYSTAL)
|
||||||
i2c_writereg(av7110, 0x20, 0x02, 0x49);
|
i2c_writereg(av7110, 0x20, 0x02, 0x49);
|
||||||
|
else if (av7110->adac_type == DVB_ADAC_MSP34x5)
|
||||||
|
msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AUDIO_MONO_LEFT:
|
case AUDIO_MONO_LEFT:
|
||||||
ret = audcom(av7110, AUDIO_CMD_MONO_L);
|
ret = audcom(av7110, AUDIO_CMD_MONO_L);
|
||||||
if (!ret)
|
if (!ret) {
|
||||||
if (av7110->adac_type == DVB_ADAC_CRYSTAL)
|
if (av7110->adac_type == DVB_ADAC_CRYSTAL)
|
||||||
i2c_writereg(av7110, 0x20, 0x02, 0x4a);
|
i2c_writereg(av7110, 0x20, 0x02, 0x4a);
|
||||||
|
else if (av7110->adac_type == DVB_ADAC_MSP34x5)
|
||||||
|
msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0200);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AUDIO_MONO_RIGHT:
|
case AUDIO_MONO_RIGHT:
|
||||||
ret = audcom(av7110, AUDIO_CMD_MONO_R);
|
ret = audcom(av7110, AUDIO_CMD_MONO_R);
|
||||||
if (!ret)
|
if (!ret) {
|
||||||
if (av7110->adac_type == DVB_ADAC_CRYSTAL)
|
if (av7110->adac_type == DVB_ADAC_CRYSTAL)
|
||||||
i2c_writereg(av7110, 0x20, 0x02, 0x45);
|
i2c_writereg(av7110, 0x20, 0x02, 0x45);
|
||||||
|
else if (av7110->adac_type == DVB_ADAC_MSP34x5)
|
||||||
|
msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0210);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -42,7 +42,18 @@
|
||||||
int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val)
|
int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val)
|
||||||
{
|
{
|
||||||
u8 msg[5] = { dev, reg >> 8, reg & 0xff, val >> 8 , val & 0xff };
|
u8 msg[5] = { dev, reg >> 8, reg & 0xff, val >> 8 , val & 0xff };
|
||||||
struct i2c_msg msgs = { .flags = 0, .addr = 0x40, .len = 5, .buf = msg };
|
struct i2c_msg msgs = { .flags = 0, .len = 5, .buf = msg };
|
||||||
|
|
||||||
|
switch (av7110->adac_type) {
|
||||||
|
case DVB_ADAC_MSP34x0:
|
||||||
|
msgs.addr = 0x40;
|
||||||
|
break;
|
||||||
|
case DVB_ADAC_MSP34x5:
|
||||||
|
msgs.addr = 0x42;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (i2c_transfer(&av7110->i2c_adap, &msgs, 1) != 1) {
|
if (i2c_transfer(&av7110->i2c_adap, &msgs, 1) != 1) {
|
||||||
dprintk(1, "dvb-ttpci: failed @ card %d, %u = %u\n",
|
dprintk(1, "dvb-ttpci: failed @ card %d, %u = %u\n",
|
||||||
|
@ -57,10 +68,23 @@ static int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val)
|
||||||
u8 msg1[3] = { dev, reg >> 8, reg & 0xff };
|
u8 msg1[3] = { dev, reg >> 8, reg & 0xff };
|
||||||
u8 msg2[2];
|
u8 msg2[2];
|
||||||
struct i2c_msg msgs[2] = {
|
struct i2c_msg msgs[2] = {
|
||||||
{ .flags = 0, .addr = 0x40, .len = 3, .buf = msg1 },
|
{ .flags = 0 , .len = 3, .buf = msg1 },
|
||||||
{ .flags = I2C_M_RD, .addr = 0x40, .len = 2, .buf = msg2 }
|
{ .flags = I2C_M_RD, .len = 2, .buf = msg2 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
switch (av7110->adac_type) {
|
||||||
|
case DVB_ADAC_MSP34x0:
|
||||||
|
msgs[0].addr = 0x40;
|
||||||
|
msgs[1].addr = 0x40;
|
||||||
|
break;
|
||||||
|
case DVB_ADAC_MSP34x5:
|
||||||
|
msgs[0].addr = 0x42;
|
||||||
|
msgs[1].addr = 0x42;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (i2c_transfer(&av7110->i2c_adap, &msgs[0], 2) != 2) {
|
if (i2c_transfer(&av7110->i2c_adap, &msgs[0], 2) != 2) {
|
||||||
dprintk(1, "dvb-ttpci: failed @ card %d, %u\n",
|
dprintk(1, "dvb-ttpci: failed @ card %d, %u\n",
|
||||||
av7110->dvb_adapter.num, reg);
|
av7110->dvb_adapter.num, reg);
|
||||||
|
@ -678,17 +702,23 @@ int av7110_init_analog_module(struct av7110 *av7110)
|
||||||
{
|
{
|
||||||
u16 version1, version2;
|
u16 version1, version2;
|
||||||
|
|
||||||
if (i2c_writereg(av7110, 0x80, 0x0, 0x80) != 1
|
if (i2c_writereg(av7110, 0x80, 0x0, 0x80) == 1 &&
|
||||||
|| i2c_writereg(av7110, 0x80, 0x0, 0) != 1)
|
i2c_writereg(av7110, 0x80, 0x0, 0) == 1) {
|
||||||
|
printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3400\n",
|
||||||
|
av7110->dvb_adapter.num);
|
||||||
|
av7110->adac_type = DVB_ADAC_MSP34x0;
|
||||||
|
} else if (i2c_writereg(av7110, 0x84, 0x0, 0x80) == 1 &&
|
||||||
|
i2c_writereg(av7110, 0x84, 0x0, 0) == 1) {
|
||||||
|
printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3415\n",
|
||||||
|
av7110->dvb_adapter.num);
|
||||||
|
av7110->adac_type = DVB_ADAC_MSP34x5;
|
||||||
|
} else
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3400\n",
|
|
||||||
av7110->dvb_adapter.num);
|
|
||||||
av7110->adac_type = DVB_ADAC_MSP34x0;
|
|
||||||
msleep(100); // the probing above resets the msp...
|
msleep(100); // the probing above resets the msp...
|
||||||
msp_readreg(av7110, MSP_RD_DSP, 0x001e, &version1);
|
msp_readreg(av7110, MSP_RD_DSP, 0x001e, &version1);
|
||||||
msp_readreg(av7110, MSP_RD_DSP, 0x001f, &version2);
|
msp_readreg(av7110, MSP_RD_DSP, 0x001f, &version2);
|
||||||
dprintk(1, "dvb-ttpci: @ card %d MSP3400 version 0x%04x 0x%04x\n",
|
dprintk(1, "dvb-ttpci: @ card %d MSP34xx version 0x%04x 0x%04x\n",
|
||||||
av7110->dvb_adapter.num, version1, version2);
|
av7110->dvb_adapter.num, version1, version2);
|
||||||
msp_writereg(av7110, MSP_WR_DSP, 0x0013, 0x0c00);
|
msp_writereg(av7110, MSP_WR_DSP, 0x0013, 0x0c00);
|
||||||
msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone
|
msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone
|
||||||
|
@ -697,7 +727,7 @@ int av7110_init_analog_module(struct av7110 *av7110)
|
||||||
msp_writereg(av7110, MSP_WR_DSP, 0x0004, 0x7f00); // loudspeaker volume
|
msp_writereg(av7110, MSP_WR_DSP, 0x0004, 0x7f00); // loudspeaker volume
|
||||||
msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source
|
msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source
|
||||||
msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume
|
msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume
|
||||||
msp_writereg(av7110, MSP_WR_DSP, 0x000d, 0x4800); // prescale SCART
|
msp_writereg(av7110, MSP_WR_DSP, 0x000d, 0x1900); // prescale SCART
|
||||||
|
|
||||||
if (i2c_writereg(av7110, 0x48, 0x01, 0x00)!=1) {
|
if (i2c_writereg(av7110, 0x48, 0x01, 0x00)!=1) {
|
||||||
INFO(("saa7113 not accessible.\n"));
|
INFO(("saa7113 not accessible.\n"));
|
||||||
|
|
|
@ -381,6 +381,18 @@ config VIDEO_WM8739
|
||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called wm8739.
|
module will be called wm8739.
|
||||||
|
|
||||||
|
config VIDEO_CX2341X
|
||||||
|
tristate "Conexant CX2341x MPEG encoders"
|
||||||
|
depends on VIDEO_V4L2 && EXPERIMENTAL
|
||||||
|
---help---
|
||||||
|
Support for the Conexant CX23416 MPEG encoders
|
||||||
|
and CX23415 MPEG encoder/decoders.
|
||||||
|
|
||||||
|
This module currently supports the encoding functions only.
|
||||||
|
|
||||||
|
To compile this driver as a module, choose M here: the
|
||||||
|
module will be called cx2341x.
|
||||||
|
|
||||||
source "drivers/media/video/cx25840/Kconfig"
|
source "drivers/media/video/cx25840/Kconfig"
|
||||||
|
|
||||||
config VIDEO_SAA711X
|
config VIDEO_SAA711X
|
||||||
|
|
|
@ -43,6 +43,7 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
|
||||||
const u32 cx2341x_mpeg_ctrls[] = {
|
const u32 cx2341x_mpeg_ctrls[] = {
|
||||||
V4L2_CID_MPEG_CLASS,
|
V4L2_CID_MPEG_CLASS,
|
||||||
V4L2_CID_MPEG_STREAM_TYPE,
|
V4L2_CID_MPEG_STREAM_TYPE,
|
||||||
|
V4L2_CID_MPEG_STREAM_VBI_FMT,
|
||||||
V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
|
V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
|
||||||
V4L2_CID_MPEG_AUDIO_ENCODING,
|
V4L2_CID_MPEG_AUDIO_ENCODING,
|
||||||
V4L2_CID_MPEG_AUDIO_L2_BITRATE,
|
V4L2_CID_MPEG_AUDIO_L2_BITRATE,
|
||||||
|
@ -135,6 +136,9 @@ static int cx2341x_get_ctrl(struct cx2341x_mpeg_params *params,
|
||||||
case V4L2_CID_MPEG_STREAM_TYPE:
|
case V4L2_CID_MPEG_STREAM_TYPE:
|
||||||
ctrl->value = params->stream_type;
|
ctrl->value = params->stream_type;
|
||||||
break;
|
break;
|
||||||
|
case V4L2_CID_MPEG_STREAM_VBI_FMT:
|
||||||
|
ctrl->value = params->stream_vbi_fmt;
|
||||||
|
break;
|
||||||
case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
|
case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
|
||||||
ctrl->value = params->video_spatial_filter_mode;
|
ctrl->value = params->video_spatial_filter_mode;
|
||||||
break;
|
break;
|
||||||
|
@ -257,6 +261,9 @@ static int cx2341x_set_ctrl(struct cx2341x_mpeg_params *params,
|
||||||
params->video_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_CBR;
|
params->video_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_CBR;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case V4L2_CID_MPEG_STREAM_VBI_FMT:
|
||||||
|
params->stream_vbi_fmt = ctrl->value;
|
||||||
|
break;
|
||||||
case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
|
case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
|
||||||
params->video_spatial_filter_mode = ctrl->value;
|
params->video_spatial_filter_mode = ctrl->value;
|
||||||
break;
|
break;
|
||||||
|
@ -418,6 +425,14 @@ int cx2341x_ctrl_query(struct cx2341x_mpeg_params *params, struct v4l2_queryctrl
|
||||||
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
|
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
case V4L2_CID_MPEG_STREAM_VBI_FMT:
|
||||||
|
if (params->capabilities & CX2341X_CAP_HAS_SLICED_VBI)
|
||||||
|
return v4l2_ctrl_query_fill_std(qctrl);
|
||||||
|
return cx2341x_ctrl_query_fill(qctrl,
|
||||||
|
V4L2_MPEG_STREAM_VBI_FMT_NONE,
|
||||||
|
V4L2_MPEG_STREAM_VBI_FMT_NONE, 1,
|
||||||
|
V4L2_MPEG_STREAM_VBI_FMT_NONE);
|
||||||
|
|
||||||
/* CX23415/6 specific */
|
/* CX23415/6 specific */
|
||||||
case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
|
case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
|
||||||
return cx2341x_ctrl_query_fill(qctrl,
|
return cx2341x_ctrl_query_fill(qctrl,
|
||||||
|
@ -639,6 +654,7 @@ void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
|
||||||
{
|
{
|
||||||
static struct cx2341x_mpeg_params default_params = {
|
static struct cx2341x_mpeg_params default_params = {
|
||||||
/* misc */
|
/* misc */
|
||||||
|
.capabilities = 0,
|
||||||
.port = CX2341X_PORT_MEMORY,
|
.port = CX2341X_PORT_MEMORY,
|
||||||
.width = 720,
|
.width = 720,
|
||||||
.height = 480,
|
.height = 480,
|
||||||
|
@ -646,6 +662,7 @@ void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
|
||||||
|
|
||||||
/* stream */
|
/* stream */
|
||||||
.stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS,
|
.stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS,
|
||||||
|
.stream_vbi_fmt = V4L2_MPEG_STREAM_VBI_FMT_NONE,
|
||||||
|
|
||||||
/* audio */
|
/* audio */
|
||||||
.audio_sampling_freq = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
|
.audio_sampling_freq = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
|
||||||
|
|
|
@ -11,7 +11,6 @@ config VIDEO_CX88
|
||||||
select VIDEO_BUF
|
select VIDEO_BUF
|
||||||
select VIDEO_TUNER
|
select VIDEO_TUNER
|
||||||
select VIDEO_TVEEPROM
|
select VIDEO_TVEEPROM
|
||||||
select VIDEO_CX2341X
|
|
||||||
select VIDEO_IR
|
select VIDEO_IR
|
||||||
---help---
|
---help---
|
||||||
This is a video4linux driver for Conexant 2388x based
|
This is a video4linux driver for Conexant 2388x based
|
||||||
|
@ -36,13 +35,25 @@ config VIDEO_CX88_ALSA
|
||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called cx88-alsa.
|
module will be called cx88-alsa.
|
||||||
|
|
||||||
|
config VIDEO_CX88_BLACKBIRD
|
||||||
|
tristate "Blackbird MPEG encoder support (cx2388x + cx23416)"
|
||||||
|
depends on VIDEO_CX88
|
||||||
|
select VIDEO_CX2341X
|
||||||
|
---help---
|
||||||
|
This adds support for MPEG encoder cards based on the
|
||||||
|
Blackbird reference design, using the Conexant 2388x
|
||||||
|
and 23416 chips.
|
||||||
|
|
||||||
|
To compile this driver as a module, choose M here: the
|
||||||
|
module will be called cx88-blackbird.
|
||||||
|
|
||||||
config VIDEO_CX88_DVB
|
config VIDEO_CX88_DVB
|
||||||
tristate "DVB/ATSC Support for cx2388x based TV cards"
|
tristate "DVB/ATSC Support for cx2388x based TV cards"
|
||||||
depends on VIDEO_CX88 && DVB_CORE
|
depends on VIDEO_CX88 && DVB_CORE
|
||||||
select VIDEO_BUF_DVB
|
select VIDEO_BUF_DVB
|
||||||
---help---
|
---help---
|
||||||
This adds support for DVB/ATSC cards based on the
|
This adds support for DVB/ATSC cards based on the
|
||||||
Connexant 2388x chip.
|
Conexant 2388x chip.
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called cx88-dvb.
|
module will be called cx88-dvb.
|
||||||
|
|
|
@ -3,9 +3,10 @@ cx88xx-objs := cx88-cards.o cx88-core.o cx88-i2c.o cx88-tvaudio.o \
|
||||||
cx8800-objs := cx88-video.o cx88-vbi.o
|
cx8800-objs := cx88-video.o cx88-vbi.o
|
||||||
cx8802-objs := cx88-mpeg.o
|
cx8802-objs := cx88-mpeg.o
|
||||||
|
|
||||||
obj-$(CONFIG_VIDEO_CX88) += cx88xx.o cx8800.o cx8802.o cx88-blackbird.o
|
obj-$(CONFIG_VIDEO_CX88) += cx88xx.o cx8800.o cx8802.o
|
||||||
obj-$(CONFIG_VIDEO_CX88_DVB) += cx88-dvb.o
|
|
||||||
obj-$(CONFIG_VIDEO_CX88_ALSA) += cx88-alsa.o
|
obj-$(CONFIG_VIDEO_CX88_ALSA) += cx88-alsa.o
|
||||||
|
obj-$(CONFIG_VIDEO_CX88_BLACKBIRD) += cx88-blackbird.o
|
||||||
|
obj-$(CONFIG_VIDEO_CX88_DVB) += cx88-dvb.o
|
||||||
obj-$(CONFIG_VIDEO_CX88_VP3054) += cx88-vp3054-i2c.o
|
obj-$(CONFIG_VIDEO_CX88_VP3054) += cx88-vp3054-i2c.o
|
||||||
|
|
||||||
EXTRA_CFLAGS += -Idrivers/media/video
|
EXTRA_CFLAGS += -Idrivers/media/video
|
||||||
|
|
|
@ -846,7 +846,7 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
|
||||||
BLACKBIRD_MPEG_CAPTURE,
|
BLACKBIRD_MPEG_CAPTURE,
|
||||||
BLACKBIRD_RAW_BITS_NONE);
|
BLACKBIRD_RAW_BITS_NONE);
|
||||||
|
|
||||||
cx88_do_ioctl( inode, file, 0, dev->core, cmd, arg, cx88_ioctl_hook );
|
cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, mpeg_do_ioctl);
|
||||||
|
|
||||||
blackbird_initialize_codec(dev);
|
blackbird_initialize_codec(dev);
|
||||||
cx88_set_scale(dev->core, dev->width, dev->height,
|
cx88_set_scale(dev->core, dev->width, dev->height,
|
||||||
|
@ -855,15 +855,11 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return cx88_do_ioctl( inode, file, 0, dev->core, cmd, arg, cx88_ioctl_hook );
|
return cx88_do_ioctl(inode, file, 0, dev->core, cmd, arg, mpeg_do_ioctl);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int (*cx88_ioctl_hook)(struct inode *inode, struct file *file,
|
|
||||||
unsigned int cmd, void *arg);
|
|
||||||
unsigned int (*cx88_ioctl_translator)(unsigned int cmd);
|
|
||||||
|
|
||||||
static unsigned int mpeg_translate_ioctl(unsigned int cmd)
|
static unsigned int mpeg_translate_ioctl(unsigned int cmd)
|
||||||
{
|
{
|
||||||
return cmd;
|
return cmd;
|
||||||
|
@ -872,8 +868,8 @@ static unsigned int mpeg_translate_ioctl(unsigned int cmd)
|
||||||
static int mpeg_ioctl(struct inode *inode, struct file *file,
|
static int mpeg_ioctl(struct inode *inode, struct file *file,
|
||||||
unsigned int cmd, unsigned long arg)
|
unsigned int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
cmd = cx88_ioctl_translator( cmd );
|
cmd = mpeg_translate_ioctl( cmd );
|
||||||
return video_usercopy(inode, file, cmd, arg, cx88_ioctl_hook);
|
return video_usercopy(inode, file, cmd, arg, mpeg_do_ioctl);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mpeg_open(struct inode *inode, struct file *file)
|
static int mpeg_open(struct inode *inode, struct file *file)
|
||||||
|
@ -1119,8 +1115,6 @@ static int blackbird_init(void)
|
||||||
printk(KERN_INFO "cx2388x: snapshot date %04d-%02d-%02d\n",
|
printk(KERN_INFO "cx2388x: snapshot date %04d-%02d-%02d\n",
|
||||||
SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
|
SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);
|
||||||
#endif
|
#endif
|
||||||
cx88_ioctl_hook = mpeg_do_ioctl;
|
|
||||||
cx88_ioctl_translator = mpeg_translate_ioctl;
|
|
||||||
return pci_register_driver(&blackbird_pci_driver);
|
return pci_register_driver(&blackbird_pci_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1132,9 +1126,6 @@ static void blackbird_fini(void)
|
||||||
module_init(blackbird_init);
|
module_init(blackbird_init);
|
||||||
module_exit(blackbird_fini);
|
module_exit(blackbird_fini);
|
||||||
|
|
||||||
EXPORT_SYMBOL(cx88_ioctl_hook);
|
|
||||||
EXPORT_SYMBOL(cx88_ioctl_translator);
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------- */
|
/* ----------------------------------------------------------- */
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
|
|
|
@ -1700,11 +1700,6 @@ void cx88_card_setup(struct cx88_core *core)
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
EXPORT_SYMBOL(cx88_boards);
|
EXPORT_SYMBOL(cx88_boards);
|
||||||
EXPORT_SYMBOL(cx88_bcount);
|
|
||||||
EXPORT_SYMBOL(cx88_subids);
|
|
||||||
EXPORT_SYMBOL(cx88_idcount);
|
|
||||||
EXPORT_SYMBOL(cx88_card_list);
|
|
||||||
EXPORT_SYMBOL(cx88_card_setup);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
|
|
|
@ -1181,8 +1181,6 @@ EXPORT_SYMBOL(cx88_set_scale);
|
||||||
EXPORT_SYMBOL(cx88_vdev_init);
|
EXPORT_SYMBOL(cx88_vdev_init);
|
||||||
EXPORT_SYMBOL(cx88_core_get);
|
EXPORT_SYMBOL(cx88_core_get);
|
||||||
EXPORT_SYMBOL(cx88_core_put);
|
EXPORT_SYMBOL(cx88_core_put);
|
||||||
EXPORT_SYMBOL(cx88_start_audio_dma);
|
|
||||||
EXPORT_SYMBOL(cx88_stop_audio_dma);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
|
|
|
@ -234,7 +234,6 @@ int cx88_i2c_init(struct cx88_core *core, struct pci_dev *pci)
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
EXPORT_SYMBOL(cx88_call_i2c_clients);
|
EXPORT_SYMBOL(cx88_call_i2c_clients);
|
||||||
EXPORT_SYMBOL(cx88_i2c_init);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
|
|
|
@ -726,7 +726,7 @@ static void set_audio_standard_FM(struct cx88_core *core,
|
||||||
|
|
||||||
/* ----------------------------------------------------------- */
|
/* ----------------------------------------------------------- */
|
||||||
|
|
||||||
int cx88_detect_nicam(struct cx88_core *core)
|
static int cx88_detect_nicam(struct cx88_core *core)
|
||||||
{
|
{
|
||||||
int i, j = 0;
|
int i, j = 0;
|
||||||
|
|
||||||
|
|
|
@ -563,7 +563,6 @@ void cx88_newstation(struct cx88_core *core);
|
||||||
void cx88_get_stereo(struct cx88_core *core, struct v4l2_tuner *t);
|
void cx88_get_stereo(struct cx88_core *core, struct v4l2_tuner *t);
|
||||||
void cx88_set_stereo(struct cx88_core *core, u32 mode, int manual);
|
void cx88_set_stereo(struct cx88_core *core, u32 mode, int manual);
|
||||||
int cx88_audio_thread(void *data);
|
int cx88_audio_thread(void *data);
|
||||||
int cx88_detect_nicam(struct cx88_core *core);
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------- */
|
/* ----------------------------------------------------------- */
|
||||||
/* cx88-input.c */
|
/* cx88-input.c */
|
||||||
|
@ -592,12 +591,6 @@ extern int cx88_do_ioctl(struct inode *inode, struct file *file, int radio,
|
||||||
struct cx88_core *core, unsigned int cmd,
|
struct cx88_core *core, unsigned int cmd,
|
||||||
void *arg, v4l2_kioctl driver_ioctl);
|
void *arg, v4l2_kioctl driver_ioctl);
|
||||||
|
|
||||||
/* ----------------------------------------------------------- */
|
|
||||||
/* cx88-blackbird.c */
|
|
||||||
extern int (*cx88_ioctl_hook)(struct inode *inode, struct file *file,
|
|
||||||
unsigned int cmd, void *arg);
|
|
||||||
extern unsigned int (*cx88_ioctl_translator)(unsigned int cmd);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
* c-basic-offset: 8
|
* c-basic-offset: 8
|
||||||
|
|
|
@ -730,14 +730,10 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||||
{
|
{
|
||||||
struct v4l2_frequency *f = arg;
|
struct v4l2_frequency *f = arg;
|
||||||
|
|
||||||
|
if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY")
|
||||||
|
== EINVAL)
|
||||||
|
return 0;
|
||||||
switch_v4l2();
|
switch_v4l2();
|
||||||
if ((V4L2_TUNER_RADIO == f->type && V4L2_TUNER_RADIO != t->mode)
|
|
||||||
|| (V4L2_TUNER_DIGITAL_TV == f->type
|
|
||||||
&& V4L2_TUNER_DIGITAL_TV != t->mode)) {
|
|
||||||
if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY")
|
|
||||||
== EINVAL)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
set_freq(client,f->frequency);
|
set_freq(client,f->frequency);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1101,6 +1101,11 @@ const char **v4l2_ctrl_get_menu(u32 id)
|
||||||
"MPEG-2 SVCD-compatible Stream",
|
"MPEG-2 SVCD-compatible Stream",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
static const char *mpeg_stream_vbi_fmt[] = {
|
||||||
|
"No VBI",
|
||||||
|
"VBI in private packets, IVTV format",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
|
case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
|
||||||
|
@ -1129,6 +1134,8 @@ const char **v4l2_ctrl_get_menu(u32 id)
|
||||||
return mpeg_video_bitrate_mode;
|
return mpeg_video_bitrate_mode;
|
||||||
case V4L2_CID_MPEG_STREAM_TYPE:
|
case V4L2_CID_MPEG_STREAM_TYPE:
|
||||||
return mpeg_stream_type;
|
return mpeg_stream_type;
|
||||||
|
case V4L2_CID_MPEG_STREAM_VBI_FMT:
|
||||||
|
return mpeg_stream_vbi_fmt;
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1182,6 +1189,7 @@ int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 ste
|
||||||
case V4L2_CID_MPEG_STREAM_PID_PCR: name = "Stream PCR Program ID"; break;
|
case V4L2_CID_MPEG_STREAM_PID_PCR: name = "Stream PCR Program ID"; break;
|
||||||
case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: name = "Stream PES Audio ID"; break;
|
case V4L2_CID_MPEG_STREAM_PES_ID_AUDIO: name = "Stream PES Audio ID"; break;
|
||||||
case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: name = "Stream PES Video ID"; break;
|
case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO: name = "Stream PES Video ID"; break;
|
||||||
|
case V4L2_CID_MPEG_STREAM_VBI_FMT: name = "Stream VBI Format"; break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1208,6 +1216,7 @@ int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 ste
|
||||||
case V4L2_CID_MPEG_VIDEO_ASPECT:
|
case V4L2_CID_MPEG_VIDEO_ASPECT:
|
||||||
case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
|
case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
|
||||||
case V4L2_CID_MPEG_STREAM_TYPE:
|
case V4L2_CID_MPEG_STREAM_TYPE:
|
||||||
|
case V4L2_CID_MPEG_STREAM_VBI_FMT:
|
||||||
qctrl->type = V4L2_CTRL_TYPE_MENU;
|
qctrl->type = V4L2_CTRL_TYPE_MENU;
|
||||||
step = 1;
|
step = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -1367,6 +1376,11 @@ int v4l2_ctrl_query_fill_std(struct v4l2_queryctrl *qctrl)
|
||||||
return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0);
|
return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0);
|
||||||
case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO:
|
case V4L2_CID_MPEG_STREAM_PES_ID_VIDEO:
|
||||||
return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0);
|
return v4l2_ctrl_query_fill(qctrl, 0, 255, 1, 0);
|
||||||
|
case V4L2_CID_MPEG_STREAM_VBI_FMT:
|
||||||
|
return v4l2_ctrl_query_fill(qctrl,
|
||||||
|
V4L2_MPEG_STREAM_VBI_FMT_NONE,
|
||||||
|
V4L2_MPEG_STREAM_VBI_FMT_IVTV, 1,
|
||||||
|
V4L2_MPEG_STREAM_VBI_FMT_NONE);
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,6 +245,7 @@ struct v4l2_pix_format
|
||||||
#define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y','U','1','2') /* 12 YUV 4:2:0 */
|
#define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y','U','1','2') /* 12 YUV 4:2:0 */
|
||||||
#define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y','Y','U','V') /* 16 YUV 4:2:2 */
|
#define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y','Y','U','V') /* 16 YUV 4:2:2 */
|
||||||
#define V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4') /* 8 8-bit color */
|
#define V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4') /* 8 8-bit color */
|
||||||
|
#define V4L2_PIX_FMT_HM12 v4l2_fourcc('H','M','1','2') /* 8 YUV 4:1:1 16x16 macroblocks */
|
||||||
|
|
||||||
/* see http://www.siliconimaging.com/RGB%20Bayer.htm */
|
/* see http://www.siliconimaging.com/RGB%20Bayer.htm */
|
||||||
#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR.. */
|
#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1') /* 8 BGBG.. GRGR.. */
|
||||||
|
@ -821,6 +822,11 @@ enum v4l2_mpeg_stream_type {
|
||||||
#define V4L2_CID_MPEG_STREAM_PID_PCR (V4L2_CID_MPEG_BASE+4)
|
#define V4L2_CID_MPEG_STREAM_PID_PCR (V4L2_CID_MPEG_BASE+4)
|
||||||
#define V4L2_CID_MPEG_STREAM_PES_ID_AUDIO (V4L2_CID_MPEG_BASE+5)
|
#define V4L2_CID_MPEG_STREAM_PES_ID_AUDIO (V4L2_CID_MPEG_BASE+5)
|
||||||
#define V4L2_CID_MPEG_STREAM_PES_ID_VIDEO (V4L2_CID_MPEG_BASE+6)
|
#define V4L2_CID_MPEG_STREAM_PES_ID_VIDEO (V4L2_CID_MPEG_BASE+6)
|
||||||
|
#define V4L2_CID_MPEG_STREAM_VBI_FMT (V4L2_CID_MPEG_BASE+7)
|
||||||
|
enum v4l2_mpeg_stream_vbi_fmt {
|
||||||
|
V4L2_MPEG_STREAM_VBI_FMT_NONE = 0, /* No VBI in the MPEG stream */
|
||||||
|
V4L2_MPEG_STREAM_VBI_FMT_IVTV = 1, /* VBI in private packets, IVTV format */
|
||||||
|
};
|
||||||
|
|
||||||
/* MPEG audio */
|
/* MPEG audio */
|
||||||
#define V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ (V4L2_CID_MPEG_BASE+100)
|
#define V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ (V4L2_CID_MPEG_BASE+100)
|
||||||
|
|
|
@ -25,8 +25,13 @@ enum cx2341x_port {
|
||||||
CX2341X_PORT_SERIAL = 2
|
CX2341X_PORT_SERIAL = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum cx2341x_cap {
|
||||||
|
CX2341X_CAP_HAS_SLICED_VBI = 1 << 0,
|
||||||
|
};
|
||||||
|
|
||||||
struct cx2341x_mpeg_params {
|
struct cx2341x_mpeg_params {
|
||||||
/* misc */
|
/* misc */
|
||||||
|
u32 capabilities;
|
||||||
enum cx2341x_port port;
|
enum cx2341x_port port;
|
||||||
u16 width;
|
u16 width;
|
||||||
u16 height;
|
u16 height;
|
||||||
|
@ -34,6 +39,7 @@ struct cx2341x_mpeg_params {
|
||||||
|
|
||||||
/* stream */
|
/* stream */
|
||||||
enum v4l2_mpeg_stream_type stream_type;
|
enum v4l2_mpeg_stream_type stream_type;
|
||||||
|
enum v4l2_mpeg_stream_vbi_fmt stream_vbi_fmt;
|
||||||
|
|
||||||
/* audio */
|
/* audio */
|
||||||
enum v4l2_mpeg_audio_sampling_freq audio_sampling_freq;
|
enum v4l2_mpeg_audio_sampling_freq audio_sampling_freq;
|
||||||
|
|
Loading…
Add table
Reference in a new issue