rendered paste bodydiff -r 071fb4e338da Makefile
--- a/Makefile Mon Nov 05 00:28:22 2007 +0100
+++ b/Makefile Fri Nov 09 15:29:52 2007 +0100
@@ -13,9 +13,14 @@ obj-$(CONFIG_VIDEO_EM28XX_AUDIO) += em28
obj-$(CONFIG_VIDEO_EM28XX_AUDIO) += em28xx-audio.o
obj-$(CONFIG_DVB_EM2880) += em28xx-dvb.o
-EXTRA_CFLAGS += -Idrivers/media/video -Idrivers/media/dvb/frontends -Idrivers/media/dvb/dvb-core -Idrivers/media/tuners/ -Iinclude/linux -DCONFIG_DVB_TUNER_STUB -DCONFIG_DVB_DEMOD_STUB -Wall
+SDIR := /lib/modules/$(shell uname -r)/source
+
+
+EXTRA_CFLAGS += -I$(SDIR)/drivers/media/video -I$(SDIR)/drivers/media/dvb/frontends -I$(SDIR)/drivers/media/dvb/dvb-core -I$(SDIR)/drivers/media/tuners/ -Iinclude/linux -Idrivers/media/video -Idrivers/media/dvb/frontends -Idrivers/media/dvb/dvb-core -Idrivers/media/tuners/ -Iinclude/linux -DCONFIG_DVB_TUNER_STUB -DCONFIG_DVB_DEMOD_STUB -Wall
KDIR := /lib/modules/$(shell uname -r)/build
+
+
PWD := $(shell pwd)
default:
diff -r 071fb4e338da em28xx-audio.c
--- a/em28xx-audio.c Mon Nov 05 00:28:22 2007 +0100
+++ b/em28xx-audio.c Mon Nov 05 05:26:53 2007 +0100
@@ -75,18 +75,22 @@ static snd_pcm_hardware_t snd_em28xx_hw_
#else
static struct snd_pcm_hardware snd_em28xx_hw_capture = {
#endif
- .info = SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP_VALID,
+ .info = SNDRV_PCM_INFO_BLOCK_TRANSFER |
+ SNDRV_PCM_INFO_MMAP |
+ SNDRV_PCM_INFO_BATCH |
+ SNDRV_PCM_INFO_INTERLEAVED |
+ SNDRV_PCM_INFO_MMAP_VALID,
.formats = SNDRV_PCM_FMTBIT_S16_LE,
.rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_KNOT,
.rate_min = 48000,
.rate_max = 48000,
.channels_min = 2,
.channels_max = 2,
- .buffer_bytes_max = 62720*8, /* just about the value in usbaudio.c */
- .period_bytes_min = 64, //12544/2,
- .period_bytes_max = 12544,
+ .buffer_bytes_max = 1024*1024, //62720*8, /* just about the value in usbaudio.c */
+ .period_bytes_min = 64, //64, //12544/2,
+ .period_bytes_max = 512*1024, //6272, //12544,
.periods_min = 2,
- .periods_max = 98, //12544,
+ .periods_max = 1024, //12544,
};
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
@@ -109,6 +113,7 @@ static int snd_em28xx_capture_open(struc
case TUNER_STUB_DVBT_TV:
case TUNER_STUB_ATSC_TV:
/* digital has no support for analog audio */
+ ret = dev->em28xx_acquire(dev, EM28XX_RADIO, 1);
if (ret != 0 ) {
printk("device is already in use by DVB-T\n");
return -EINVAL;
@@ -122,7 +127,7 @@ static int snd_em28xx_capture_open(struc
tuner.type = V4L2_TUNER_RADIO;
/* enable GPIO for analog TV */
- dev->em28xx_gpio_control(dev, EM28XX_MODE, (void*)mode);
+ dev->em28xx_gpio_control(dev, EM28XX_MODE, &mode);
dev->mode = mode;
/* upload firmware */
vtype = mode;
@@ -136,7 +141,6 @@ static int snd_em28xx_capture_open(struc
em28xx_i2c_call_clients(dev, VIDIOC_S_TUNER, &tuner);
dev->em28xx_write_regs(dev, 0x0f, "\x87", 1);
- ret = dev->em28xx_acquire(dev, EM28XX_RADIO, 1);
em28xx_i2c_call_clients(dev, VIDIOC_INT_RESET, 0);
/* TODO switch to FM mode */
@@ -149,16 +153,19 @@ static int snd_em28xx_capture_open(struc
case TUNER_STUB_ANALOG_TV:
printk("em28xx-audio: device is currently in analog TV mode\n");
/* unmute by default */
+ ret = dev->em28xx_acquire(dev, EM28XX_VIDEO, 1);
+ if (ret!=0)
+ return -EBUSY;
dev->em28xx_write_regs(dev, 0x0f, "\x87", 1);
break;
case TUNER_STUB_RADIO:
/* check current mode and put a hard lock onto it */
printk("em28xx-audio: device is currently in analogue FM mode\n");
/* unmute by default here */
- dev->em28xx_write_regs(dev, 0x0f, "\x87", 1);
ret = dev->em28xx_acquire(dev, EM28XX_RADIO, 1);
if ( ret == 0 )
printk("device is locked in fmradio mode now\n");
+ dev->em28xx_write_regs(dev, 0x0f, "\x87", 1);
break;
default:
printk("em28xx-audio: unhandled mode %d\n", dev->mode);
@@ -298,10 +305,15 @@ static void em28xx_audio_isocirq(struct
stride = runtime->frame_bits >> 3;
for(i=0;i<urb->number_of_packets;i++){
+
int length=urb->iso_frame_desc[i].actual_length/stride;
cp=(unsigned char *) urb->transfer_buffer + urb->iso_frame_desc[i].offset;
if(!length)
+ continue;
+
+
+ if (urb->iso_frame_desc[i].status)
continue;
spin_lock_irqsave(&dev->adev->slock, flags);
@@ -317,8 +329,8 @@ static void em28xx_audio_isocirq(struct
}
spin_unlock_irqrestore(&dev->adev->slock, flags);
- if(oldptr + length >= runtime->buffer_size){
- unsigned int cnt = runtime->buffer_size-oldptr-1;
+ if(oldptr + length > runtime->buffer_size){
+ unsigned int cnt = runtime->buffer_size-oldptr;
memcpy(runtime->dma_area+oldptr*stride, cp , cnt*stride);
memcpy(runtime->dma_area, cp + cnt, length*stride - cnt*stride);
} else {
diff -r 071fb4e338da em28xx-video.c
--- a/em28xx-video.c Mon Nov 05 00:28:22 2007 +0100
+++ b/em28xx-video.c Fri Nov 09 15:19:52 2007 +0100
@@ -271,8 +271,6 @@ static void request_modules(struct em28x
*/
int em28xx_config(struct em28xx *dev)
{
-
-#if 0
em28xx_audio_usb_mute(dev, EM28XX_MUTED);
dev->mute = 1; /* maybe not the right place... */
dev->volume = 0x1f;
@@ -282,7 +280,6 @@ int em28xx_config(struct em28xx *dev)
em28xx_colorlevels_set_default(dev);
em28xx_compression_disable(dev);
-#endif
return 0;
}
@@ -409,8 +406,6 @@ static void video_mux(struct em28xx *dev
static int em28xx_acquire(struct em28xx *dev, int mode, int lock) {
int ret = 0;
- printk("LOCK REQUEST: %d\n",lock);
- printk("LOCK DBG:\nRADIO: %d\nVIDEO: %d\nVBI: %d\nDVBT: %d\n",dev->radio_user, dev->video_user, dev->vbi_user, dev->fe_user);
switch(mode) {
/* radio is allowed if TV and DVB is not in use */
case EM28XX_RADIO:
@@ -426,9 +421,7 @@ static int em28xx_acquire(struct em28xx
break;
/* video, vbi and analogue audio are allowed at the same time */
case EM28XX_VIDEO:
- printk("trying to acquire videolock\n");
if (lock) {
- printk("LOCK == 1\n");
if (dev->fe_user>0 || dev->radio_user>0) {
printk("ret will be ebusy!\n");
ret = -EBUSY;
@@ -451,7 +444,6 @@ static int em28xx_acquire(struct em28xx
}
break;
case EM28XX_DVBT:
- /* dvb only works in single mode */
if (lock) {
if (dev->radio_user || dev->video_user || dev->vbi_user) {
ret = -EBUSY;
@@ -466,7 +458,6 @@ static int em28xx_acquire(struct em28xx
ret = -EINVAL;
}
- printk("lock attempt: %d\n",ret);
return ret;
}
@@ -539,7 +530,7 @@ static int em28xx_v4l2_open(struct inode
em28xx_config_i2c(dev);
/* this is moreover to switch the decoder to FM */
-// em28xx_i2c_call_clients(dev, VIDIOC_S_TUNER, &config_tuner);
+ em28xx_i2c_call_clients(dev, VIDIOC_S_TUNER, &config_tuner);
}
}
@@ -601,7 +592,6 @@ static int em28xx_v4l2_open(struct inode
dev->state |= DEV_INITIALIZED;
dev->state &= ~DEV_MISCONFIGURED;
}
- printk("em28xx-video.c: opened\n");
err:
up_read(&em28xx_disconnect);
return errCode;
@@ -667,10 +657,7 @@ static int em28xx_v4l2_close(struct inod
dev->vbi_reader=0;
}
- printk("releasing lock for video\n");
dev->em28xx_acquire(dev, fh->type, 0);
-
- printk("released lock for video\n");
/* assume that all handles are closed */
if(dev->users==1){
@@ -1330,7 +1317,6 @@ static int em28xx_set_fmt(struct em28xx
if (format->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
em28xx_i2c_call_clients(dev,VIDIOC_G_FMT,format);
- printk("sliced vbi capture!!!\n");
if (format->fmt.sliced.service_set==0)
return -EINVAL;
@@ -1351,7 +1337,6 @@ static int em28xx_set_fmt(struct em28xx
}
if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE){
- printk("em28xx-video.c: %s !V4L_BUF_TYPE_VIDEO_CAPTURE\n",__FUNCTION__);
return -EINVAL;
}
@@ -1420,7 +1405,6 @@ static int em28xx_set_fmt(struct em28xx
for (i = 0; i < dev->num_frames; i++)
if (dev->frame[i].vma_use_count) {
- printk("numframes !! EINVAL!!!\n");
em28xx_videodbg("VIDIOC_S_FMT failed. "
"Unmap the buffers first.\n");
return -EINVAL;
@@ -1787,25 +1771,20 @@ static int em28xx_do_ioctl(struct inode
struct v4l2_frequency *f = arg;
if (0 != f->tuner){
- printk("VIDIOC_S_FREQUENCY: (arg)->tuner != 0\n");
return -EINVAL;
}
switch(fh->type) {
case EM28XX_RADIO:
- printk("radio is trying to tune\n");
break;
case EM28XX_VIDEO:
- printk("video is trying to tune\n");
break;
}
if ((fh->type == EM28XX_RADIO && f->type != V4L2_TUNER_RADIO) ||
(fh->type == EM28XX_VIDEO && f->type != V4L2_TUNER_ANALOG_TV)) {
- printk("VIDIOC_S_FREQUENCY: (arg)->type != V4L2_TUNER_ANALOG_TV\n");
return -EINVAL;
}
dev->ctl_freq = f->frequency;
- printk("setting frequency(em28xx): %d\n",f->frequency);
em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, f);
return 0;
@@ -2325,9 +2304,7 @@ static int em28xx_init_dev(struct em28xx
request_module("media-stub");
/* Do board specific init and eeprom reading */
- printk("card setup %04x!\n",(unsigned int)dev->udev);
em28xx_card_setup(dev);
- printk("card setup done!\n");
memset(&config, 0x0, sizeof(struct media_config));
config.module_id = tuner_translateid(dev->tuner_type);
@@ -2360,7 +2337,6 @@ static int em28xx_init_dev(struct em28xx
config.config = 0;
config.addr = 0x88>>1;
config.mode = TUNER_STUB_ANALOG_TV;
- printk("trying to attach cx25843\n");
// dev->em28xx_gpio_control(dev, EM28XX_RESET2, NULL);
tuner_bridge_attach(&dev->i2c_adap, em28xx_gpio_control, dev, &config, &dev->vobj);
break;
diff -r 071fb4e338da em28xx.h
--- a/em28xx.h Mon Nov 05 00:28:22 2007 +0100
+++ b/em28xx.h Mon Nov 05 05:19:13 2007 +0100
@@ -177,7 +177,7 @@
/* number of buffers for isoc transfers */
#define EM28XX_NUM_BUFS 5
#define EM2880_DVB_NUM_BUFS 5
-#define EM28XX_AUDIO_BUFS 5
+#define EM28XX_AUDIO_BUFS 3
#define EM28XX_NUM_AUDIO_PACKETS 64
#define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */