提交 a99d726b 编写于 作者: L Linus Torvalds

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb

* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb:
  V4L/DVB (5023): Fix compilation on ppc32 architecture
  V4L/DVB (5071): Tveeprom: autodetect LG TAPC G701D as tuner type 37
  V4L/DVB (5069): Fix bttv and friends on 64bit machines with lots of memory
  V4L/DVB (5033): MSI TV@nywhere Plus fixes
  V4L/DVB (5029): Ks0127 status flags
  V4L/DVB (5024): Fix quickcam communicator driver for big endian architectures
  V4L/DVB (5021): Cx88xx: Fix lockup on suspend
  V4L/DVB (5020): Fix: disable interrupts while at KM_BOUNCE_READ
  V4L/DVB (5019): Fix the frame->grabstate update in read() entry point.
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/freezer.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/mm.h> #include <linux/mm.h>
...@@ -961,6 +962,7 @@ int cx88_audio_thread(void *data) ...@@ -961,6 +962,7 @@ int cx88_audio_thread(void *data)
msleep_interruptible(1000); msleep_interruptible(1000);
if (kthread_should_stop()) if (kthread_should_stop())
break; break;
try_to_freeze();
/* just monitor the audio status for now ... */ /* just monitor the audio status for now ... */
memset(&t, 0, sizeof(t)); memset(&t, 0, sizeof(t));
......
...@@ -712,13 +712,13 @@ static int ks0127_command(struct i2c_client *client, ...@@ -712,13 +712,13 @@ static int ks0127_command(struct i2c_client *client,
*iarg = 0; *iarg = 0;
status = ks0127_read(ks, KS_STAT); status = ks0127_read(ks, KS_STAT);
if (!(status & 0x20)) /* NOVID not set */ if (!(status & 0x20)) /* NOVID not set */
*iarg = (*iarg & DECODER_STATUS_GOOD); *iarg = (*iarg | DECODER_STATUS_GOOD);
if ((status & 0x01)) /* CLOCK set */ if ((status & 0x01)) /* CLOCK set */
*iarg = (*iarg & DECODER_STATUS_COLOR); *iarg = (*iarg | DECODER_STATUS_COLOR);
if ((status & 0x08)) /* PALDET set */ if ((status & 0x08)) /* PALDET set */
*iarg = (*iarg & DECODER_STATUS_PAL); *iarg = (*iarg | DECODER_STATUS_PAL);
else else
*iarg = (*iarg & DECODER_STATUS_NTSC); *iarg = (*iarg | DECODER_STATUS_NTSC);
break; break;
//Catch any unknown command //Catch any unknown command
......
...@@ -2570,6 +2570,7 @@ struct saa7134_board saa7134_boards[] = { ...@@ -2570,6 +2570,7 @@ struct saa7134_board saa7134_boards[] = {
.radio_type = UNSET, .radio_type = UNSET,
.tuner_addr = ADDR_UNSET, .tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET,
.gpiomask = 1 << 21,
.inputs = {{ .inputs = {{
.name = name_tv, .name = name_tv,
.vmux = 1, .vmux = 1,
...@@ -2578,15 +2579,20 @@ struct saa7134_board saa7134_boards[] = { ...@@ -2578,15 +2579,20 @@ struct saa7134_board saa7134_boards[] = {
},{ },{
.name = name_comp1, .name = name_comp1,
.vmux = 3, .vmux = 3,
.amux = LINE1, .amux = LINE2, /* unconfirmed, taken from Philips driver */
},{
.name = name_comp2,
.vmux = 0, /* untested, Composite over S-Video */
.amux = LINE2,
},{ },{
.name = name_svideo, .name = name_svideo,
.vmux = 0, .vmux = 8,
.amux = LINE1, .amux = LINE2,
}}, }},
.radio = { .radio = {
.name = name_radio, .name = name_radio,
.amux = LINE1, .amux = TV,
.gpio = 0x0200000,
}, },
}, },
[SAA7134_BOARD_CINERGY250PCI] = { [SAA7134_BOARD_CINERGY250PCI] = {
......
...@@ -184,7 +184,7 @@ hauppauge_tuner[] = ...@@ -184,7 +184,7 @@ hauppauge_tuner[] =
{ TUNER_ABSENT, "Thompson DTT757"}, { TUNER_ABSENT, "Thompson DTT757"},
/* 80-89 */ /* 80-89 */
{ TUNER_ABSENT, "Philips FQ1216LME MK3"}, { TUNER_ABSENT, "Philips FQ1216LME MK3"},
{ TUNER_ABSENT, "LG TAPC G701D"}, { TUNER_LG_PAL_NEW_TAPC, "LG TAPC G701D"},
{ TUNER_LG_NTSC_NEW_TAPC, "LG TAPC H791F"}, { TUNER_LG_NTSC_NEW_TAPC, "LG TAPC H791F"},
{ TUNER_LG_PAL_NEW_TAPC, "TCL 2002MB 3"}, { TUNER_LG_PAL_NEW_TAPC, "TCL 2002MB 3"},
{ TUNER_LG_PAL_NEW_TAPC, "TCL 2002MI 3"}, { TUNER_LG_PAL_NEW_TAPC, "TCL 2002MI 3"},
......
...@@ -35,27 +35,13 @@ struct rgb { ...@@ -35,27 +35,13 @@ struct rgb {
}; };
struct bayL0 { struct bayL0 {
#ifdef __BIG_ENDIAN
u8 r;
u8 g;
#elif __LITTLE_ENDIAN
u8 g; u8 g;
u8 r; u8 r;
#else
#error not byte order defined
#endif
}; };
struct bayL1 { struct bayL1 {
#ifdef __BIG_ENDIAN
u8 g;
u8 b;
#elif __LITTLE_ENDIAN
u8 b; u8 b;
u8 g; u8 g;
#else
#error not byte order defined
#endif
}; };
struct cam_size { struct cam_size {
......
...@@ -1080,7 +1080,6 @@ static ssize_t usbvision_v4l2_read(struct file *file, char *buf, ...@@ -1080,7 +1080,6 @@ static ssize_t usbvision_v4l2_read(struct file *file, char *buf,
int noblock = file->f_flags & O_NONBLOCK; int noblock = file->f_flags & O_NONBLOCK;
unsigned long lock_flags; unsigned long lock_flags;
int frmx = -1;
int ret,i; int ret,i;
struct usbvision_frame *frame; struct usbvision_frame *frame;
...@@ -1155,7 +1154,7 @@ static ssize_t usbvision_v4l2_read(struct file *file, char *buf, ...@@ -1155,7 +1154,7 @@ static ssize_t usbvision_v4l2_read(struct file *file, char *buf,
frame->bytes_read = 0; frame->bytes_read = 0;
/* Mark it as available to be used again. */ /* Mark it as available to be used again. */
usbvision->frame[frmx].grabstate = FrameState_Unused; frame->grabstate = FrameState_Unused;
/* } */ /* } */
return count; return count;
......
...@@ -90,8 +90,15 @@ MODULE_LICENSE("GPL"); ...@@ -90,8 +90,15 @@ MODULE_LICENSE("GPL");
char *v4l2_norm_to_name(v4l2_std_id id) char *v4l2_norm_to_name(v4l2_std_id id)
{ {
char *name; char *name;
u32 myid = id;
switch (id) { /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle
64 bit comparations. So, on that architecture, with some gcc variants,
compilation fails. Currently, the max value is 30bit wide.
*/
BUG_ON(myid != id);
switch (myid) {
case V4L2_STD_PAL: case V4L2_STD_PAL:
name="PAL"; break; name="PAL"; break;
case V4L2_STD_PAL_BG: case V4L2_STD_PAL_BG:
......
...@@ -1229,7 +1229,7 @@ videobuf_vm_nopage(struct vm_area_struct *vma, unsigned long vaddr, ...@@ -1229,7 +1229,7 @@ videobuf_vm_nopage(struct vm_area_struct *vma, unsigned long vaddr,
vaddr,vma->vm_start,vma->vm_end); vaddr,vma->vm_start,vma->vm_end);
if (vaddr > vma->vm_end) if (vaddr > vma->vm_end)
return NOPAGE_SIGBUS; return NOPAGE_SIGBUS;
page = alloc_page(GFP_USER); page = alloc_page(GFP_USER | __GFP_DMA32);
if (!page) if (!page)
return NOPAGE_OOM; return NOPAGE_OOM;
clear_user_page(page_address(page), vaddr, page); clear_user_page(page_address(page), vaddr, page);
......
...@@ -270,10 +270,15 @@ static void gen_line(struct sg_to_addr to_addr[],int inipos,int pages,int wmax, ...@@ -270,10 +270,15 @@ static void gen_line(struct sg_to_addr to_addr[],int inipos,int pages,int wmax,
char *p,*s,*basep; char *p,*s,*basep;
struct page *pg; struct page *pg;
u8 chr,r,g,b,color; u8 chr,r,g,b,color;
unsigned long flags;
spinlock_t spinlock;
spin_lock_init(&spinlock);
/* Get first addr pointed to pixel position */ /* Get first addr pointed to pixel position */
oldpg=get_addr_pos(pos,pages,to_addr); oldpg=get_addr_pos(pos,pages,to_addr);
pg=pfn_to_page(sg_dma_address(to_addr[oldpg].sg) >> PAGE_SHIFT); pg=pfn_to_page(sg_dma_address(to_addr[oldpg].sg) >> PAGE_SHIFT);
spin_lock_irqsave(&spinlock,flags);
basep = kmap_atomic(pg, KM_BOUNCE_READ)+to_addr[oldpg].sg->offset; basep = kmap_atomic(pg, KM_BOUNCE_READ)+to_addr[oldpg].sg->offset;
/* We will just duplicate the second pixel at the packet */ /* We will just duplicate the second pixel at the packet */
...@@ -376,6 +381,8 @@ static void gen_line(struct sg_to_addr to_addr[],int inipos,int pages,int wmax, ...@@ -376,6 +381,8 @@ static void gen_line(struct sg_to_addr to_addr[],int inipos,int pages,int wmax,
end: end:
kunmap_atomic(basep, KM_BOUNCE_READ); kunmap_atomic(basep, KM_BOUNCE_READ);
spin_unlock_irqrestore(&spinlock,flags);
} }
static void vivi_fillbuff(struct vivi_dev *dev,struct vivi_buffer *buf) static void vivi_fillbuff(struct vivi_dev *dev,struct vivi_buffer *buf)
{ {
......
...@@ -662,6 +662,15 @@ typedef __u64 v4l2_std_id; ...@@ -662,6 +662,15 @@ typedef __u64 v4l2_std_id;
#define V4L2_STD_ATSC_8_VSB ((v4l2_std_id)0x01000000) #define V4L2_STD_ATSC_8_VSB ((v4l2_std_id)0x01000000)
#define V4L2_STD_ATSC_16_VSB ((v4l2_std_id)0x02000000) #define V4L2_STD_ATSC_16_VSB ((v4l2_std_id)0x02000000)
/* FIXME:
Although std_id is 64 bits, there is an issue on PPC32 architecture that
makes switch(__u64) to break. So, there's a hack on v4l2-common.c rounding
this value to 32 bits.
As, currently, the max value is for V4L2_STD_ATSC_16_VSB (30 bits wide),
it should work fine. However, if needed to add more than two standards,
v4l2-common.c should be fixed.
*/
/* some merged standards */ /* some merged standards */
#define V4L2_STD_MN (V4L2_STD_PAL_M|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc|V4L2_STD_NTSC) #define V4L2_STD_MN (V4L2_STD_PAL_M|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc|V4L2_STD_NTSC)
#define V4L2_STD_B (V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_SECAM_B) #define V4L2_STD_B (V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_SECAM_B)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册