summaryrefslogtreecommitdiff
path: root/linux/drivers
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <devnull@localhost>2005-11-03 22:31:23 +0000
committerMauro Carvalho Chehab <devnull@localhost>2005-11-03 22:31:23 +0000
commit646e183e74465a8cd42787bcc68b0d12e7bc8b39 (patch)
tree4ba0931c37ab0d7eb12aa47726e30ed00fa36246 /linux/drivers
parent68107d098397a4b8ae5bf4d62910efc1af3381a4 (diff)
downloadmediapointer-dvb-s2-646e183e74465a8cd42787bcc68b0d12e7bc8b39.tar.gz
mediapointer-dvb-s2-646e183e74465a8cd42787bcc68b0d12e7bc8b39.tar.bz2
- em28xx cleanups and fixes.
- Some cleanups and audio amux adjust. - em28xx will allways try, by default, the biggest size alt. - Fixes audio mux code. - Fixes some logs. - added a hack to allow using I2S output (commented). Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
Diffstat (limited to 'linux/drivers')
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-cards.c10
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-core.c7
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-video.c107
-rw-r--r--linux/drivers/media/video/msp3400-driver.c40
-rw-r--r--linux/drivers/media/video/msp3400.c40
5 files changed, 144 insertions, 60 deletions
diff --git a/linux/drivers/media/video/em28xx/em28xx-cards.c b/linux/drivers/media/video/em28xx/em28xx-cards.c
index fda0c99c3..5d1dda398 100644
--- a/linux/drivers/media/video/em28xx/em28xx-cards.c
+++ b/linux/drivers/media/video/em28xx/em28xx-cards.c
@@ -129,7 +129,7 @@ struct em28xx_board em28xx_boards[] = {
.input = {{
.type = EM28XX_VMUX_TELEVISION,
.vmux = 0,
- .amux = 0,
+ .amux = 6,
},{
.type = EM28XX_VMUX_SVIDEO,
.vmux = 2,
@@ -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->has_msp34xx=1;
- } else dev->has_msp34xx=0;
-#if 1
- em28xx_write_regs_req(dev,0x06,0x00,"\x40",1);// Serial Bus Frequency Select Register
- em28xx_write_regs_req(dev,0x0f,0x00,"\x87",1);// XCLK Frequency Select Register
- em28xx_write_regs_req(dev,0x88,0x0d,"\xd0",1);
-#endif
+ } else
+ dev->has_msp34xx=0;
}
}
diff --git a/linux/drivers/media/video/em28xx/em28xx-core.c b/linux/drivers/media/video/em28xx/em28xx-core.c
index 2c5f76c4c..5b71078e5 100644
--- a/linux/drivers/media/video/em28xx/em28xx-core.c
+++ b/linux/drivers/media/video/em28xx/em28xx-core.c
@@ -805,6 +805,12 @@ int em28xx_set_alternate(struct em28xx *dev)
dev->alt = alt;
if (dev->alt == 0) {
int i;
+#if 1 /* Always try to get the maximum size value */
+ for(i=0;i< EM28XX_MAX_ALT; i++)
+ if(dev->alt_max_pkt_size[i]>dev->alt_max_pkt_size[dev->alt])
+ dev->alt=i;
+#endif
+#if 0 /* Should be dependent of horizontal size */
if(dev->is_em2800){ /* always use the max packet size for em2800 based devices */
for(i=0;i< EM28XX_MAX_ALT; i++)
if(dev->alt_max_pkt_size[i]>dev->alt_max_pkt_size[dev->alt])
@@ -819,6 +825,7 @@ int em28xx_set_alternate(struct em28xx *dev)
break;
}
}
+#endif
}
if (dev->alt != prev_alt) {
diff --git a/linux/drivers/media/video/em28xx/em28xx-video.c b/linux/drivers/media/video/em28xx/em28xx-video.c
index bda4bca6e..2b373799a 100644
--- a/linux/drivers/media/video/em28xx/em28xx-video.c
+++ b/linux/drivers/media/video/em28xx/em28xx-video.c
@@ -336,6 +336,35 @@ static void em28xx_empty_framequeues(struct em28xx *dev)
}
}
+static void video_mux(struct em28xx *dev, int index)
+{
+ int input, ainput;
+
+ input = INPUT(index)->vmux;
+ dev->ctl_input = index;
+ dev->ctl_ainput = INPUT(index)->amux;
+
+ em28xx_i2c_call_clients(dev, DECODER_SET_INPUT, &input);
+
+
+ em28xx_videodbg("Setting input index=%d, vmux=%d, amux=%d\n",index,input,dev->ctl_ainput);
+
+ if (dev->has_msp34xx) {
+ em28xx_i2c_call_clients(dev, VIDIOC_S_AUDIO, &dev->ctl_ainput);
+ ainput = EM28XX_AUDIO_SRC_TUNER;
+ em28xx_audio_source(dev, ainput);
+ } else {
+ switch (dev->ctl_ainput) {
+ case 0:
+ ainput = EM28XX_AUDIO_SRC_TUNER;
+ break;
+ default:
+ ainput = EM28XX_AUDIO_SRC_LINE;
+ }
+ em28xx_audio_source(dev, ainput);
+ }
+}
+
/*
* em28xx_v4l2_open()
* inits the device and starts isoc transfer
@@ -357,7 +386,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
filp->private_data=dev;
- em28xx_videodbg("users=%d", dev->users);
+ em28xx_videodbg("users=%d\n", dev->users);
if (!down_read_trylock(&em28xx_disconnect))
return -ERESTARTSYS;
@@ -411,6 +440,8 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
dev->state |= DEV_INITIALIZED;
+ video_mux(dev, 0);
+
err:
up(&dev->lock);
up_read(&em28xx_disconnect);
@@ -445,7 +476,7 @@ static int em28xx_v4l2_close(struct inode *inode, struct file *filp)
int errCode;
struct em28xx *dev=filp->private_data;
- em28xx_videodbg("users=%d", dev->users);
+ em28xx_videodbg("users=%d\n", dev->users);
down(&dev->lock);
@@ -463,7 +494,7 @@ static int em28xx_v4l2_close(struct inode *inode, struct file *filp)
/* set alternate 0 */
dev->alt = 0;
- em28xx_videodbg("setting alternate 0");
+ em28xx_videodbg("setting alternate 0\n");
errCode = usb_set_interface(dev->udev, 0, 0);
if (errCode < 0) {
em28xx_errdev ("cannot change alternate number to 0 (error=%i)\n",
@@ -504,20 +535,20 @@ em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count,
return -ERESTARTSYS;
if (dev->state & DEV_DISCONNECTED) {
- em28xx_videodbg("device not present");
+ em28xx_videodbg("device not present\n");
up(&dev->fileop_lock);
return -ENODEV;
}
if (dev->state & DEV_MISCONFIGURED) {
- em28xx_videodbg("device misconfigured; close and open it again");
+ em28xx_videodbg("device misconfigured; close and open it again\n");
up(&dev->fileop_lock);
return -EIO;
}
if (dev->io == IO_MMAP) {
em28xx_videodbg ("IO method is set to mmap; close and open"
- " the device again to choose the read method");
+ " the device again to choose the read method\n");
up(&dev->fileop_lock);
return -EINVAL;
}
@@ -594,9 +625,9 @@ static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table * wait)
return POLLERR;
if (dev->state & DEV_DISCONNECTED) {
- em28xx_videodbg("device not present");
+ em28xx_videodbg("device not present\n");
} else if (dev->state & DEV_MISCONFIGURED) {
- em28xx_videodbg("device is misconfigured; close and open it again");
+ em28xx_videodbg("device is misconfigured; close and open it again\n");
} else {
if (dev->io == IO_NONE) {
if (!em28xx_request_buffers
@@ -665,14 +696,14 @@ static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
return -ERESTARTSYS;
if (dev->state & DEV_DISCONNECTED) {
- em28xx_videodbg("mmap: device not present");
+ em28xx_videodbg("mmap: device not present\n");
up(&dev->fileop_lock);
return -ENODEV;
}
if (dev->state & DEV_MISCONFIGURED) {
em28xx_videodbg ("mmap: Device is misconfigured; close and "
- "open it again");
+ "open it again\n");
up(&dev->fileop_lock);
return -EIO;
}
@@ -688,7 +719,7 @@ static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
break;
}
if (i == dev->num_frames) {
- em28xx_videodbg("mmap: user supplied mapping address is out of range");
+ em28xx_videodbg("mmap: user supplied mapping address is out of range\n");
up(&dev->fileop_lock);
return -EINVAL;
}
@@ -702,7 +733,7 @@ static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
page = vmalloc_to_pfn((void *)pos);
if (remap_pfn_range(vma, start, page, PAGE_SIZE,
vma->vm_page_prot)) {
- em28xx_videodbg("mmap: rename page map failed");
+ em28xx_videodbg("mmap: rename page map failed\n");
up(&dev->fileop_lock);
return -EAGAIN;
}
@@ -819,7 +850,7 @@ static int em28xx_stream_interrupt(struct em28xx *dev)
else if (ret) {
dev->state |= DEV_MISCONFIGURED;
em28xx_videodbg("device is misconfigured; close and "
- "open /dev/video%d again", dev->vdev->minor);
+ "open /dev/video%d again\n", dev->vdev->minor);
return ret;
}
@@ -870,28 +901,6 @@ static int em28xx_set_norm(struct em28xx *dev, int width, int height)
return 0;
}
-static void video_mux(struct em28xx *dev, int index)
-{
- int input, ainput;
-
- input = INPUT(index)->vmux;
- dev->ctl_input = index;
-
- em28xx_i2c_call_clients(dev, DECODER_SET_INPUT, &input);
-
- dev->ctl_ainput = INPUT(index)->amux;
-
- switch (dev->ctl_ainput) {
- case 0:
- ainput = EM28XX_AUDIO_SRC_TUNER;
- break;
- default:
- ainput = EM28XX_AUDIO_SRC_LINE;
- }
-
- em28xx_audio_source(dev, ainput);
-}
-
/*
* em28xx_v4l2_do_ioctl()
* This function is _not_ called directly, but from
@@ -1153,7 +1162,7 @@ static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
t->signal =
(status & DECODER_STATUS_GOOD) != 0 ? 0xffff : 0;
- em28xx_videodbg("VIDIO_G_TUNER: signal=%x, afc=%x", t->signal,
+ em28xx_videodbg("VIDIO_G_TUNER: signal=%x, afc=%x\n", t->signal,
t->afc);
return 0;
}
@@ -1245,7 +1254,7 @@ static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
dev->stream = STREAM_ON; /* FIXME: Start video capture here? */
- em28xx_videodbg("VIDIOC_STREAMON: starting stream");
+ em28xx_videodbg("VIDIOC_STREAMON: starting stream\n");
return 0;
}
@@ -1259,7 +1268,7 @@ static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
return -EINVAL;
if (dev->stream == STREAM_ON) {
- em28xx_videodbg ("VIDIOC_STREAMOFF: interrupting stream");
+ em28xx_videodbg ("VIDIOC_STREAMOFF: interrupting stream\n");
if ((ret = em28xx_stream_interrupt(dev)))
return ret;
}
@@ -1336,7 +1345,7 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
{
struct v4l2_format *format = arg;
- em28xx_videodbg("VIDIOC_G_FMT: type=%s",
+ em28xx_videodbg("VIDIOC_G_FMT: type=%s\n",
format->type ==
V4L2_BUF_TYPE_VIDEO_CAPTURE ?
"V4L2_BUF_TYPE_VIDEO_CAPTURE" : format->type ==
@@ -1367,7 +1376,7 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
format->fmt.pix.field = dev->interlaced ? V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP; /* FIXME: TOP? NONE? BOTTOM? ALTENATE? */
- em28xx_videodbg("VIDIOC_G_FMT: %dx%d", dev->width,
+ em28xx_videodbg("VIDIOC_G_FMT: %dx%d\n", dev->width,
dev->height);
return 0;
}
@@ -1388,7 +1397,7 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
/* int both_fields; */
- em28xx_videodbg("%s: type=%s",
+ em28xx_videodbg("%s: type=%s\n",
cmd ==
VIDIOC_TRY_FMT ? "VIDIOC_TRY_FMT" :
"VIDIOC_S_FMT",
@@ -1416,7 +1425,7 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;
- em28xx_videodbg("%s: requested %dx%d",
+ em28xx_videodbg("%s: requested %dx%d\n",
cmd ==
VIDIOC_TRY_FMT ? "VIDIOC_TRY_FMT" :
"VIDIOC_S_FMT", format->fmt.pix.width,
@@ -1475,7 +1484,7 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
format->fmt.pix.field = V4L2_FIELD_INTERLACED;
- em28xx_videodbg("%s: returned %dx%d (%d, %d)",
+ em28xx_videodbg("%s: returned %dx%d (%d, %d)\n",
cmd ==
VIDIOC_TRY_FMT ? "VIDIOC_TRY_FMT" :
"VIDIOC_S_FMT", format->fmt.pix.width,
@@ -1487,13 +1496,13 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
for (i = 0; i < dev->num_frames; i++)
if (dev->frame[i].vma_use_count) {
em28xx_videodbg("VIDIOC_S_FMT failed. "
- "Unmap the buffers first.");
+ "Unmap the buffers first.\n");
return -EINVAL;
}
/* stop io in case it is already in progress */
if (dev->stream == STREAM_ON) {
- em28xx_videodbg("VIDIOC_SET_FMT: interupting stream");
+ em28xx_videodbg("VIDIOC_SET_FMT: interupting stream\n");
if ((ret = em28xx_stream_interrupt(dev)))
return ret;
}
@@ -1559,18 +1568,18 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
if (dev->io == IO_READ) {
em28xx_videodbg ("method is set to read;"
" close and open the device again to"
- " choose the mmap I/O method");
+ " choose the mmap I/O method\n");
return -EINVAL;
}
for (i = 0; i < dev->num_frames; i++)
if (dev->frame[i].vma_use_count) {
- em28xx_videodbg ("VIDIOC_REQBUFS failed; previous buffers are still mapped");
+ em28xx_videodbg ("VIDIOC_REQBUFS failed; previous buffers are still mapped\n");
return -EINVAL;
}
if (dev->stream == STREAM_ON) {
- em28xx_videodbg("VIDIOC_REQBUFS: interrupting stream");
+ em28xx_videodbg("VIDIOC_REQBUFS: interrupting stream\n");
if ((ret = em28xx_stream_interrupt(dev)))
return ret;
}
@@ -1584,7 +1593,7 @@ static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
dev->frame_current = NULL;
- em28xx_videodbg ("VIDIOC_REQBUFS: setting io method to mmap: num bufs %i",
+ em28xx_videodbg ("VIDIOC_REQBUFS: setting io method to mmap: num bufs %i\n",
rb->count);
dev->io = rb->count ? IO_MMAP : IO_NONE;
return 0;
diff --git a/linux/drivers/media/video/msp3400-driver.c b/linux/drivers/media/video/msp3400-driver.c
index 7df31a1b2..b26dfaaf0 100644
--- a/linux/drivers/media/video/msp3400-driver.c
+++ b/linux/drivers/media/video/msp3400-driver.c
@@ -377,12 +377,40 @@ static struct CARRIER_DETECT carrier_detect_65[] = {
#define CARRIER_COUNT(x) (sizeof(x)/sizeof(struct CARRIER_DETECT))
-/* ----------------------------------------------------------------------- */
+/* ----------------------------------------------------------------------- *
+ * bits 9 8 5 - SCART DSP input Select:
+ * 0 0 0 - SCART 1 to DSP input (reset position)
+ * 0 1 0 - MONO to DSP input
+ * 1 0 0 - SCART 2 to DSP input
+ * 1 1 1 - Mute DSP input
+ *
+ * bits 11 10 6 - SCART 1 Output Select:
+ * 0 0 0 - undefined (reset position)
+ * 0 1 0 - SCART 2 Input to SCART 1 Output (for devices with 2 SCARTS)
+ * 1 0 0 - MONO input to SCART 1 Output
+ * 1 1 0 - SCART 1 DA to SCART 1 Output
+ * 0 0 1 - SCART 2 DA to SCART 1 Output
+ * 0 1 1 - SCART 1 Input to SCART 1 Output
+ * 1 1 1 - Mute SCART 1 Output
+ *
+ * bits 13 12 7 - SCART 2 Output Select (for devices with 2 Output SCART):
+ * 0 0 0 - SCART 1 DA to SCART 2 Output (reset position)
+ * 0 1 0 - SCART 1 Input to SCART 2 Output
+ * 1 0 0 - MONO input to SCART 2 Output
+ * 0 0 1 - SCART 2 DA to SCART 2 Output
+ * 0 1 1 - SCART 2 Input to SCART 2 Output
+ * 1 1 0 - Mute SCART 2 Output
+ *
+ * Bits 4 to 0 should be zero.
+ * ----------------------------------------------------------------------- */
static int scarts[3][9] = {
/* MASK IN1 IN2 IN1_DA IN2_DA IN3 IN4 MONO MUTE */
+ /* SCART DSP Input select */
{ 0x0320, 0x0000, 0x0200, -1, -1, 0x0300, 0x0020, 0x0100, 0x0320 },
+ /* SCART1 Output select */
{ 0x0c40, 0x0440, 0x0400, 0x0c00, 0x0040, 0x0000, 0x0840, 0x0800, 0x0c40 },
+ /* SCART2 Output select */
{ 0x3080, 0x1000, 0x1080, 0x0000, 0x0080, 0x2080, 0x3080, 0x2000, 0x3000 },
};
@@ -397,9 +425,11 @@ static void msp3400c_set_scart(struct i2c_client *client, int in, int out)
if (-1 == scarts[out][in])
return;
- dprintk("msp34xx: scart switch: %s => %d\n", scart_names[in], out);
msp->acb &= ~scarts[out][SCART_MASK];
msp->acb |= scarts[out][in];
+
+ dprintk("msp34xx: scart switch: %s => %d (ACB=0x%04x)\n",
+ scart_names[in], out,msp->acb);
msp3400c_write(client,I2C_MSP3400C_DFP, 0x0013, msp->acb);
}
@@ -1814,10 +1844,16 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
__u16 *sarg = arg;
int scart = 0;
+#if 0 /* HACK: Does activate I2S for WinTV USB 2 by enabling I2S */
+msp3400c_write(client,I2C_MSP3400C_DEM, 0x0040, 0x0001);
+#endif
+
+
switch (cmd) {
case AUDC_SET_INPUT:
dprintk("msp34xx: AUDC_SET_INPUT(%d)\n",*sarg);
+
if (*sarg == msp->input)
break;
msp->input = *sarg;
diff --git a/linux/drivers/media/video/msp3400.c b/linux/drivers/media/video/msp3400.c
index 7df31a1b2..b26dfaaf0 100644
--- a/linux/drivers/media/video/msp3400.c
+++ b/linux/drivers/media/video/msp3400.c
@@ -377,12 +377,40 @@ static struct CARRIER_DETECT carrier_detect_65[] = {
#define CARRIER_COUNT(x) (sizeof(x)/sizeof(struct CARRIER_DETECT))
-/* ----------------------------------------------------------------------- */
+/* ----------------------------------------------------------------------- *
+ * bits 9 8 5 - SCART DSP input Select:
+ * 0 0 0 - SCART 1 to DSP input (reset position)
+ * 0 1 0 - MONO to DSP input
+ * 1 0 0 - SCART 2 to DSP input
+ * 1 1 1 - Mute DSP input
+ *
+ * bits 11 10 6 - SCART 1 Output Select:
+ * 0 0 0 - undefined (reset position)
+ * 0 1 0 - SCART 2 Input to SCART 1 Output (for devices with 2 SCARTS)
+ * 1 0 0 - MONO input to SCART 1 Output
+ * 1 1 0 - SCART 1 DA to SCART 1 Output
+ * 0 0 1 - SCART 2 DA to SCART 1 Output
+ * 0 1 1 - SCART 1 Input to SCART 1 Output
+ * 1 1 1 - Mute SCART 1 Output
+ *
+ * bits 13 12 7 - SCART 2 Output Select (for devices with 2 Output SCART):
+ * 0 0 0 - SCART 1 DA to SCART 2 Output (reset position)
+ * 0 1 0 - SCART 1 Input to SCART 2 Output
+ * 1 0 0 - MONO input to SCART 2 Output
+ * 0 0 1 - SCART 2 DA to SCART 2 Output
+ * 0 1 1 - SCART 2 Input to SCART 2 Output
+ * 1 1 0 - Mute SCART 2 Output
+ *
+ * Bits 4 to 0 should be zero.
+ * ----------------------------------------------------------------------- */
static int scarts[3][9] = {
/* MASK IN1 IN2 IN1_DA IN2_DA IN3 IN4 MONO MUTE */
+ /* SCART DSP Input select */
{ 0x0320, 0x0000, 0x0200, -1, -1, 0x0300, 0x0020, 0x0100, 0x0320 },
+ /* SCART1 Output select */
{ 0x0c40, 0x0440, 0x0400, 0x0c00, 0x0040, 0x0000, 0x0840, 0x0800, 0x0c40 },
+ /* SCART2 Output select */
{ 0x3080, 0x1000, 0x1080, 0x0000, 0x0080, 0x2080, 0x3080, 0x2000, 0x3000 },
};
@@ -397,9 +425,11 @@ static void msp3400c_set_scart(struct i2c_client *client, int in, int out)
if (-1 == scarts[out][in])
return;
- dprintk("msp34xx: scart switch: %s => %d\n", scart_names[in], out);
msp->acb &= ~scarts[out][SCART_MASK];
msp->acb |= scarts[out][in];
+
+ dprintk("msp34xx: scart switch: %s => %d (ACB=0x%04x)\n",
+ scart_names[in], out,msp->acb);
msp3400c_write(client,I2C_MSP3400C_DFP, 0x0013, msp->acb);
}
@@ -1814,10 +1844,16 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
__u16 *sarg = arg;
int scart = 0;
+#if 0 /* HACK: Does activate I2S for WinTV USB 2 by enabling I2S */
+msp3400c_write(client,I2C_MSP3400C_DEM, 0x0040, 0x0001);
+#endif
+
+
switch (cmd) {
case AUDC_SET_INPUT:
dprintk("msp34xx: AUDC_SET_INPUT(%d)\n",*sarg);
+
if (*sarg == msp->input)
break;
msp->input = *sarg;