Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (33 commits) V4L/DVB (9103): em28xx: HVR-900 B3C0 - fix audio clicking issue V4L/DVB (9099): em28xx: Add detection for K-WORLD DVB-T 310U V4L/DVB (9092): gspca: Bad init values for sonixj ov7660. V4L/DVB (9080): gspca: Add a delay after writing to the sonixj sensors. V4L/DVB (9075): gspca: Bad check of returned status in i2c_read() spca561. V4L/DVB (9053): fix buffer overflow in uvc-video V4L/DVB (9043): S5H1420: Fix size of shadow-array to avoid overflow V4L/DVB (9037): Fix support for Hauppauge Nova-S SE V4L/DVB (9029): Fix deadlock in demux code V4L/DVB (8979): sms1xxx: Add new USB product ID for Hauppauge WinTV MiniStick V4L/DVB (8978): sms1xxx: fix product name for Hauppauge WinTV MiniStick V4L/DVB (8967): Use correct XC3028L firmware for AMD ATI TV Wonder 600 V4L/DVB (8963): s2255drv field count fix V4L/DVB (8961): zr36067: Fix RGBR pixel format V4L/DVB (8960): drivers/media/video/cafe_ccic.c needs mm.h V4L/DVB (8958): zr36067: Return proper bytes-per-line value V4L/DVB (8957): zr36067: Restore the default pixel format V4L/DVB (8955): bttv: Prevent NULL pointer dereference in radio_open V4L/DVB (8935): em28xx-cards: Remove duplicate entry (EM2800_BOARD_KWORLD_USB2800) V4L/DVB (8933): gspca: Disable light frquency for zc3xx cs2102 Kokom. ...
This commit is contained in:
commit
11f9b020fa
@ -46,7 +46,7 @@
|
|||||||
45 -> Pinnacle PCTV DVB-T (em2870)
|
45 -> Pinnacle PCTV DVB-T (em2870)
|
||||||
46 -> Compro, VideoMate U3 (em2870) [185b:2870]
|
46 -> Compro, VideoMate U3 (em2870) [185b:2870]
|
||||||
47 -> KWorld DVB-T 305U (em2880) [eb1a:e305]
|
47 -> KWorld DVB-T 305U (em2880) [eb1a:e305]
|
||||||
48 -> KWorld DVB-T 310U (em2880)
|
48 -> KWorld DVB-T 310U (em2880) [eb1a:e310]
|
||||||
49 -> MSI DigiVox A/D (em2880) [eb1a:e310]
|
49 -> MSI DigiVox A/D (em2880) [eb1a:e310]
|
||||||
50 -> MSI DigiVox A/D II (em2880) [eb1a:e320]
|
50 -> MSI DigiVox A/D II (em2880) [eb1a:e320]
|
||||||
51 -> Terratec Hybrid XS Secam (em2880) [0ccd:004c]
|
51 -> Terratec Hybrid XS Secam (em2880) [0ccd:004c]
|
||||||
|
@ -190,6 +190,7 @@ pac7311 093a:260f SnakeCam
|
|||||||
pac7311 093a:2621 PAC731x
|
pac7311 093a:2621 PAC731x
|
||||||
pac7311 093a:2624 PAC7302
|
pac7311 093a:2624 PAC7302
|
||||||
pac7311 093a:2626 Labtec 2200
|
pac7311 093a:2626 Labtec 2200
|
||||||
|
pac7311 093a:262a Webcam 300k
|
||||||
zc3xx 0ac8:0302 Z-star Vimicro zc0302
|
zc3xx 0ac8:0302 Z-star Vimicro zc0302
|
||||||
vc032x 0ac8:0321 Vimicro generic vc0321
|
vc032x 0ac8:0321 Vimicro generic vc0321
|
||||||
vc032x 0ac8:0323 Vimicro Vc0323
|
vc032x 0ac8:0323 Vimicro Vc0323
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "dvb_frontend.h"
|
#include "dvb_frontend.h"
|
||||||
|
|
||||||
#define XC2028_DEFAULT_FIRMWARE "xc3028-v27.fw"
|
#define XC2028_DEFAULT_FIRMWARE "xc3028-v27.fw"
|
||||||
|
#define XC3028L_DEFAULT_FIRMWARE "xc3028L-v36.fw"
|
||||||
|
|
||||||
/* Dmoduler IF (kHz) */
|
/* Dmoduler IF (kHz) */
|
||||||
#define XC3028_FE_DEFAULT 0 /* Don't load SCODE */
|
#define XC3028_FE_DEFAULT 0 /* Don't load SCODE */
|
||||||
|
@ -491,6 +491,7 @@ static struct s5h1420_config skystar2_rev2_7_s5h1420_config = {
|
|||||||
.demod_address = 0x53,
|
.demod_address = 0x53,
|
||||||
.invert = 1,
|
.invert = 1,
|
||||||
.repeated_start_workaround = 1,
|
.repeated_start_workaround = 1,
|
||||||
|
.serial_mpeg = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct itd1000_config skystar2_rev2_7_itd1000_config = {
|
static struct itd1000_config skystar2_rev2_7_itd1000_config = {
|
||||||
|
@ -364,15 +364,16 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
|
|||||||
enum dmx_success success)
|
enum dmx_success success)
|
||||||
{
|
{
|
||||||
struct dmxdev_filter *dmxdevfilter = filter->priv;
|
struct dmxdev_filter *dmxdevfilter = filter->priv;
|
||||||
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (dmxdevfilter->buffer.error) {
|
if (dmxdevfilter->buffer.error) {
|
||||||
wake_up(&dmxdevfilter->buffer.queue);
|
wake_up(&dmxdevfilter->buffer.queue);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
spin_lock(&dmxdevfilter->dev->lock);
|
spin_lock_irqsave(&dmxdevfilter->dev->lock, flags);
|
||||||
if (dmxdevfilter->state != DMXDEV_STATE_GO) {
|
if (dmxdevfilter->state != DMXDEV_STATE_GO) {
|
||||||
spin_unlock(&dmxdevfilter->dev->lock);
|
spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
del_timer(&dmxdevfilter->timer);
|
del_timer(&dmxdevfilter->timer);
|
||||||
@ -391,7 +392,7 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
|
|||||||
}
|
}
|
||||||
if (dmxdevfilter->params.sec.flags & DMX_ONESHOT)
|
if (dmxdevfilter->params.sec.flags & DMX_ONESHOT)
|
||||||
dmxdevfilter->state = DMXDEV_STATE_DONE;
|
dmxdevfilter->state = DMXDEV_STATE_DONE;
|
||||||
spin_unlock(&dmxdevfilter->dev->lock);
|
spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
|
||||||
wake_up(&dmxdevfilter->buffer.queue);
|
wake_up(&dmxdevfilter->buffer.queue);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -403,11 +404,12 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
|
|||||||
{
|
{
|
||||||
struct dmxdev_filter *dmxdevfilter = feed->priv;
|
struct dmxdev_filter *dmxdevfilter = feed->priv;
|
||||||
struct dvb_ringbuffer *buffer;
|
struct dvb_ringbuffer *buffer;
|
||||||
|
unsigned long flags;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
spin_lock(&dmxdevfilter->dev->lock);
|
spin_lock_irqsave(&dmxdevfilter->dev->lock, flags);
|
||||||
if (dmxdevfilter->params.pes.output == DMX_OUT_DECODER) {
|
if (dmxdevfilter->params.pes.output == DMX_OUT_DECODER) {
|
||||||
spin_unlock(&dmxdevfilter->dev->lock);
|
spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -417,7 +419,7 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
|
|||||||
else
|
else
|
||||||
buffer = &dmxdevfilter->dev->dvr_buffer;
|
buffer = &dmxdevfilter->dev->dvr_buffer;
|
||||||
if (buffer->error) {
|
if (buffer->error) {
|
||||||
spin_unlock(&dmxdevfilter->dev->lock);
|
spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
|
||||||
wake_up(&buffer->queue);
|
wake_up(&buffer->queue);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -428,7 +430,7 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
|
|||||||
dvb_ringbuffer_flush(buffer);
|
dvb_ringbuffer_flush(buffer);
|
||||||
buffer->error = ret;
|
buffer->error = ret;
|
||||||
}
|
}
|
||||||
spin_unlock(&dmxdevfilter->dev->lock);
|
spin_unlock_irqrestore(&dmxdevfilter->dev->lock, flags);
|
||||||
wake_up(&buffer->queue);
|
wake_up(&buffer->queue);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -399,7 +399,9 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
|
|||||||
void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
|
void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
spin_lock(&demux->lock);
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&demux->lock, flags);
|
||||||
|
|
||||||
while (count--) {
|
while (count--) {
|
||||||
if (buf[0] == 0x47)
|
if (buf[0] == 0x47)
|
||||||
@ -407,16 +409,17 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
|
|||||||
buf += 188;
|
buf += 188;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock(&demux->lock);
|
spin_unlock_irqrestore(&demux->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
|
EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
|
||||||
|
|
||||||
void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
|
void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
|
||||||
{
|
{
|
||||||
|
unsigned long flags;
|
||||||
int p = 0, i, j;
|
int p = 0, i, j;
|
||||||
|
|
||||||
spin_lock(&demux->lock);
|
spin_lock_irqsave(&demux->lock, flags);
|
||||||
|
|
||||||
if (demux->tsbufp) {
|
if (demux->tsbufp) {
|
||||||
i = demux->tsbufp;
|
i = demux->tsbufp;
|
||||||
@ -449,17 +452,18 @@ void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bailout:
|
bailout:
|
||||||
spin_unlock(&demux->lock);
|
spin_unlock_irqrestore(&demux->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(dvb_dmx_swfilter);
|
EXPORT_SYMBOL(dvb_dmx_swfilter);
|
||||||
|
|
||||||
void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)
|
void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)
|
||||||
{
|
{
|
||||||
|
unsigned long flags;
|
||||||
int p = 0, i, j;
|
int p = 0, i, j;
|
||||||
u8 tmppack[188];
|
u8 tmppack[188];
|
||||||
|
|
||||||
spin_lock(&demux->lock);
|
spin_lock_irqsave(&demux->lock, flags);
|
||||||
|
|
||||||
if (demux->tsbufp) {
|
if (demux->tsbufp) {
|
||||||
i = demux->tsbufp;
|
i = demux->tsbufp;
|
||||||
@ -500,7 +504,7 @@ void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bailout:
|
bailout:
|
||||||
spin_unlock(&demux->lock);
|
spin_unlock_irqrestore(&demux->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(dvb_dmx_swfilter_204);
|
EXPORT_SYMBOL(dvb_dmx_swfilter_204);
|
||||||
|
@ -59,7 +59,7 @@ struct s5h1420_state {
|
|||||||
* it does not support repeated-start, workaround: write addr-1
|
* it does not support repeated-start, workaround: write addr-1
|
||||||
* and then read
|
* and then read
|
||||||
*/
|
*/
|
||||||
u8 shadow[255];
|
u8 shadow[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
static u32 s5h1420_getsymbolrate(struct s5h1420_state* state);
|
static u32 s5h1420_getsymbolrate(struct s5h1420_state* state);
|
||||||
@ -94,8 +94,11 @@ static u8 s5h1420_readreg(struct s5h1420_state *state, u8 reg)
|
|||||||
if (ret != 3)
|
if (ret != 3)
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
ret = i2c_transfer(state->i2c, &msg[1], 2);
|
ret = i2c_transfer(state->i2c, &msg[1], 1);
|
||||||
if (ret != 2)
|
if (ret != 1)
|
||||||
|
return ret;
|
||||||
|
ret = i2c_transfer(state->i2c, &msg[2], 1);
|
||||||
|
if (ret != 1)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -823,7 +826,7 @@ static int s5h1420_init (struct dvb_frontend* fe)
|
|||||||
struct s5h1420_state* state = fe->demodulator_priv;
|
struct s5h1420_state* state = fe->demodulator_priv;
|
||||||
|
|
||||||
/* disable power down and do reset */
|
/* disable power down and do reset */
|
||||||
state->CON_1_val = 0x10;
|
state->CON_1_val = state->config->serial_mpeg << 4;
|
||||||
s5h1420_writereg(state, 0x02, state->CON_1_val);
|
s5h1420_writereg(state, 0x02, state->CON_1_val);
|
||||||
msleep(10);
|
msleep(10);
|
||||||
s5h1420_reset(state);
|
s5h1420_reset(state);
|
||||||
|
@ -32,10 +32,12 @@ struct s5h1420_config
|
|||||||
u8 demod_address;
|
u8 demod_address;
|
||||||
|
|
||||||
/* does the inversion require inversion? */
|
/* does the inversion require inversion? */
|
||||||
u8 invert : 1;
|
u8 invert:1;
|
||||||
|
|
||||||
u8 repeated_start_workaround : 1;
|
u8 repeated_start_workaround:1;
|
||||||
u8 cdclk_polarity : 1; /* 1 == falling edge, 0 == raising edge */
|
u8 cdclk_polarity:1; /* 1 == falling edge, 0 == raising edge */
|
||||||
|
|
||||||
|
u8 serial_mpeg:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CONFIG_DVB_S5H1420) || (defined(CONFIG_DVB_S5H1420_MODULE) && defined(MODULE))
|
#if defined(CONFIG_DVB_S5H1420) || (defined(CONFIG_DVB_S5H1420_MODULE) && defined(MODULE))
|
||||||
|
@ -40,6 +40,8 @@ struct usb_device_id smsusb_id_table[] = {
|
|||||||
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B },
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B },
|
||||||
{ USB_DEVICE(0x2040, 0x5500),
|
{ USB_DEVICE(0x2040, 0x5500),
|
||||||
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
||||||
|
{ USB_DEVICE(0x2040, 0x5510),
|
||||||
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
||||||
{ USB_DEVICE(0x2040, 0x5580),
|
{ USB_DEVICE(0x2040, 0x5580),
|
||||||
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
||||||
{ USB_DEVICE(0x2040, 0x5590),
|
{ USB_DEVICE(0x2040, 0x5590),
|
||||||
@ -87,7 +89,7 @@ static struct sms_board sms_boards[] = {
|
|||||||
.fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-b-dvbt-01.fw",
|
.fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-nova-b-dvbt-01.fw",
|
||||||
},
|
},
|
||||||
[SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = {
|
[SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = {
|
||||||
.name = "Hauppauge WinTV-Nova-T-MiniStick",
|
.name = "Hauppauge WinTV MiniStick",
|
||||||
.type = SMS_NOVA_B0,
|
.type = SMS_NOVA_B0,
|
||||||
.fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-01.fw",
|
.fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-01.fw",
|
||||||
},
|
},
|
||||||
|
@ -3431,7 +3431,7 @@ static int radio_open(struct inode *inode, struct file *file)
|
|||||||
dprintk("bttv: open minor=%d\n",minor);
|
dprintk("bttv: open minor=%d\n",minor);
|
||||||
|
|
||||||
for (i = 0; i < bttv_num; i++) {
|
for (i = 0; i < bttv_num; i++) {
|
||||||
if (bttvs[i].radio_dev->minor == minor) {
|
if (bttvs[i].radio_dev && bttvs[i].radio_dev->minor == minor) {
|
||||||
btv = &bttvs[i];
|
btv = &bttvs[i];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
@ -632,7 +632,7 @@ int cpia2_usb_transfer_cmd(struct camera_data *cam,
|
|||||||
static int submit_urbs(struct camera_data *cam)
|
static int submit_urbs(struct camera_data *cam)
|
||||||
{
|
{
|
||||||
struct urb *urb;
|
struct urb *urb;
|
||||||
int fx, err, i;
|
int fx, err, i, j;
|
||||||
|
|
||||||
for(i=0; i<NUM_SBUF; ++i) {
|
for(i=0; i<NUM_SBUF; ++i) {
|
||||||
if (cam->sbuf[i].data)
|
if (cam->sbuf[i].data)
|
||||||
@ -657,6 +657,9 @@ static int submit_urbs(struct camera_data *cam)
|
|||||||
}
|
}
|
||||||
urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
|
urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
|
||||||
if (!urb) {
|
if (!urb) {
|
||||||
|
ERR("%s: usb_alloc_urb error!\n", __func__);
|
||||||
|
for (j = 0; j < i; j++)
|
||||||
|
usb_free_urb(cam->sbuf[j].urb);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,7 +163,7 @@ static const struct cx18_card cx18_card_h900 = {
|
|||||||
},
|
},
|
||||||
.audio_inputs = {
|
.audio_inputs = {
|
||||||
{ CX18_CARD_INPUT_AUD_TUNER,
|
{ CX18_CARD_INPUT_AUD_TUNER,
|
||||||
CX18_AV_AUDIO8, 0 },
|
CX18_AV_AUDIO5, 0 },
|
||||||
{ CX18_CARD_INPUT_LINE_IN1,
|
{ CX18_CARD_INPUT_LINE_IN1,
|
||||||
CX18_AV_AUDIO_SERIAL1, 0 },
|
CX18_AV_AUDIO_SERIAL1, 0 },
|
||||||
},
|
},
|
||||||
|
@ -1070,6 +1070,7 @@ static int mpeg_open(struct inode *inode, struct file *file)
|
|||||||
err = drv->request_acquire(drv);
|
err = drv->request_acquire(drv);
|
||||||
if(err != 0) {
|
if(err != 0) {
|
||||||
dprintk(1,"%s: Unable to acquire hardware, %d\n", __func__, err);
|
dprintk(1,"%s: Unable to acquire hardware, %d\n", __func__, err);
|
||||||
|
unlock_kernel();
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -117,10 +117,10 @@ static void em28xx_audio_isocirq(struct urb *urb)
|
|||||||
|
|
||||||
if (oldptr + length >= runtime->buffer_size) {
|
if (oldptr + length >= runtime->buffer_size) {
|
||||||
unsigned int cnt =
|
unsigned int cnt =
|
||||||
runtime->buffer_size - oldptr - 1;
|
runtime->buffer_size - oldptr;
|
||||||
memcpy(runtime->dma_area + oldptr * stride, cp,
|
memcpy(runtime->dma_area + oldptr * stride, cp,
|
||||||
cnt * stride);
|
cnt * stride);
|
||||||
memcpy(runtime->dma_area, cp + cnt,
|
memcpy(runtime->dma_area, cp + cnt * stride,
|
||||||
length * stride - cnt * stride);
|
length * stride - cnt * stride);
|
||||||
} else {
|
} else {
|
||||||
memcpy(runtime->dma_area + oldptr * stride, cp,
|
memcpy(runtime->dma_area + oldptr * stride, cp,
|
||||||
@ -161,8 +161,14 @@ static int em28xx_init_audio_isoc(struct em28xx *dev)
|
|||||||
|
|
||||||
memset(dev->adev->transfer_buffer[i], 0x80, sb_size);
|
memset(dev->adev->transfer_buffer[i], 0x80, sb_size);
|
||||||
urb = usb_alloc_urb(EM28XX_NUM_AUDIO_PACKETS, GFP_ATOMIC);
|
urb = usb_alloc_urb(EM28XX_NUM_AUDIO_PACKETS, GFP_ATOMIC);
|
||||||
if (!urb)
|
if (!urb) {
|
||||||
|
em28xx_errdev("usb_alloc_urb failed!\n");
|
||||||
|
for (j = 0; j < i; j++) {
|
||||||
|
usb_free_urb(dev->adev->urb[j]);
|
||||||
|
kfree(dev->adev->transfer_buffer[j]);
|
||||||
|
}
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
urb->dev = dev->udev;
|
urb->dev = dev->udev;
|
||||||
urb->context = dev;
|
urb->context = dev;
|
||||||
|
@ -93,28 +93,6 @@ struct em28xx_board em28xx_boards[] = {
|
|||||||
.amux = 0,
|
.amux = 0,
|
||||||
} },
|
} },
|
||||||
},
|
},
|
||||||
[EM2800_BOARD_KWORLD_USB2800] = {
|
|
||||||
.name = "Kworld USB2800",
|
|
||||||
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
||||||
.is_em2800 = 1,
|
|
||||||
.vchannels = 3,
|
|
||||||
.tuner_type = TUNER_PHILIPS_FCV1236D,
|
|
||||||
.tda9887_conf = TDA9887_PRESENT,
|
|
||||||
.decoder = EM28XX_SAA7113,
|
|
||||||
.input = { {
|
|
||||||
.type = EM28XX_VMUX_TELEVISION,
|
|
||||||
.vmux = SAA7115_COMPOSITE2,
|
|
||||||
.amux = 0,
|
|
||||||
}, {
|
|
||||||
.type = EM28XX_VMUX_COMPOSITE1,
|
|
||||||
.vmux = SAA7115_COMPOSITE0,
|
|
||||||
.amux = 1,
|
|
||||||
}, {
|
|
||||||
.type = EM28XX_VMUX_SVIDEO,
|
|
||||||
.vmux = SAA7115_SVIDEO3,
|
|
||||||
.amux = 1,
|
|
||||||
} },
|
|
||||||
},
|
|
||||||
[EM2820_BOARD_KWORLD_PVRTV2800RF] = {
|
[EM2820_BOARD_KWORLD_PVRTV2800RF] = {
|
||||||
.name = "Kworld PVR TV 2800 RF",
|
.name = "Kworld PVR TV 2800 RF",
|
||||||
.is_em2800 = 0,
|
.is_em2800 = 0,
|
||||||
@ -599,7 +577,7 @@ struct em28xx_board em28xx_boards[] = {
|
|||||||
}, {
|
}, {
|
||||||
.type = EM28XX_VMUX_COMPOSITE1,
|
.type = EM28XX_VMUX_COMPOSITE1,
|
||||||
.vmux = TVP5150_COMPOSITE1,
|
.vmux = TVP5150_COMPOSITE1,
|
||||||
.amux = 1,
|
.amux = 3,
|
||||||
}, {
|
}, {
|
||||||
.type = EM28XX_VMUX_SVIDEO,
|
.type = EM28XX_VMUX_SVIDEO,
|
||||||
.vmux = TVP5150_SVIDEO,
|
.vmux = TVP5150_SVIDEO,
|
||||||
@ -952,22 +930,23 @@ struct em28xx_board em28xx_boards[] = {
|
|||||||
},
|
},
|
||||||
[EM2880_BOARD_KWORLD_DVB_310U] = {
|
[EM2880_BOARD_KWORLD_DVB_310U] = {
|
||||||
.name = "KWorld DVB-T 310U",
|
.name = "KWorld DVB-T 310U",
|
||||||
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
||||||
.vchannels = 3,
|
.vchannels = 3,
|
||||||
.tuner_type = TUNER_XC2028,
|
.tuner_type = TUNER_XC2028,
|
||||||
|
.has_dvb = 1,
|
||||||
|
.mts_firmware = 1,
|
||||||
.decoder = EM28XX_TVP5150,
|
.decoder = EM28XX_TVP5150,
|
||||||
.input = { {
|
.input = { {
|
||||||
.type = EM28XX_VMUX_TELEVISION,
|
.type = EM28XX_VMUX_TELEVISION,
|
||||||
.vmux = TVP5150_COMPOSITE0,
|
.vmux = TVP5150_COMPOSITE0,
|
||||||
.amux = 0,
|
.amux = EM28XX_AMUX_VIDEO,
|
||||||
}, {
|
}, {
|
||||||
.type = EM28XX_VMUX_COMPOSITE1,
|
.type = EM28XX_VMUX_COMPOSITE1,
|
||||||
.vmux = TVP5150_COMPOSITE1,
|
.vmux = TVP5150_COMPOSITE1,
|
||||||
.amux = 1,
|
.amux = EM28XX_AMUX_AC97_LINE_IN,
|
||||||
}, {
|
}, { /* S-video has not been tested yet */
|
||||||
.type = EM28XX_VMUX_SVIDEO,
|
.type = EM28XX_VMUX_SVIDEO,
|
||||||
.vmux = TVP5150_SVIDEO,
|
.vmux = TVP5150_SVIDEO,
|
||||||
.amux = 1,
|
.amux = EM28XX_AMUX_AC97_LINE_IN,
|
||||||
} },
|
} },
|
||||||
},
|
},
|
||||||
[EM2881_BOARD_DNT_DA2_HYBRID] = {
|
[EM2881_BOARD_DNT_DA2_HYBRID] = {
|
||||||
@ -1282,6 +1261,7 @@ static struct em28xx_reg_seq em2882_terratec_hybrid_xs_digital[] = {
|
|||||||
static struct em28xx_hash_table em28xx_eeprom_hash [] = {
|
static struct em28xx_hash_table em28xx_eeprom_hash [] = {
|
||||||
/* P/N: SA 60002070465 Tuner: TVF7533-MF */
|
/* P/N: SA 60002070465 Tuner: TVF7533-MF */
|
||||||
{0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
|
{0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
|
||||||
|
{0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* I2C devicelist hash table for devices with generic USB IDs */
|
/* I2C devicelist hash table for devices with generic USB IDs */
|
||||||
@ -1552,9 +1532,12 @@ static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
|
|||||||
/* djh - Not sure which demod we need here */
|
/* djh - Not sure which demod we need here */
|
||||||
ctl->demod = XC3028_FE_DEFAULT;
|
ctl->demod = XC3028_FE_DEFAULT;
|
||||||
break;
|
break;
|
||||||
|
case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
|
||||||
|
ctl->demod = XC3028_FE_DEFAULT;
|
||||||
|
ctl->fname = XC3028L_DEFAULT_FIRMWARE;
|
||||||
|
break;
|
||||||
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
|
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
|
||||||
case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
|
case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
|
||||||
case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
|
|
||||||
/* FIXME: Better to specify the needed IF */
|
/* FIXME: Better to specify the needed IF */
|
||||||
ctl->demod = XC3028_FE_DEFAULT;
|
ctl->demod = XC3028_FE_DEFAULT;
|
||||||
break;
|
break;
|
||||||
@ -1764,6 +1747,20 @@ void em28xx_card_setup(struct em28xx *dev)
|
|||||||
break;
|
break;
|
||||||
case EM2820_BOARD_UNKNOWN:
|
case EM2820_BOARD_UNKNOWN:
|
||||||
case EM2800_BOARD_UNKNOWN:
|
case EM2800_BOARD_UNKNOWN:
|
||||||
|
/*
|
||||||
|
* The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
|
||||||
|
*
|
||||||
|
* This occurs because they share identical USB vendor and
|
||||||
|
* product IDs.
|
||||||
|
*
|
||||||
|
* What we do here is look up the EEPROM hash of the K-WORLD
|
||||||
|
* and if it is found then we decide that we do not have
|
||||||
|
* a DIGIVOX and reset the device to the K-WORLD instead.
|
||||||
|
*
|
||||||
|
* This solution is only valid if they do not share eeprom
|
||||||
|
* hash identities which has not been determined as yet.
|
||||||
|
*/
|
||||||
|
case EM2880_BOARD_MSI_DIGIVOX_AD:
|
||||||
if (!em28xx_hint_board(dev))
|
if (!em28xx_hint_board(dev))
|
||||||
em28xx_set_model(dev);
|
em28xx_set_model(dev);
|
||||||
break;
|
break;
|
||||||
|
@ -452,6 +452,15 @@ static int dvb_init(struct em28xx *dev)
|
|||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case EM2880_BOARD_KWORLD_DVB_310U:
|
||||||
|
dvb->frontend = dvb_attach(zl10353_attach,
|
||||||
|
&em28xx_zl10353_with_xc3028,
|
||||||
|
&dev->i2c_adap);
|
||||||
|
if (attach_xc3028(0x61, dev) < 0) {
|
||||||
|
result = -EINVAL;
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card"
|
printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card"
|
||||||
" isn't supported yet\n",
|
" isn't supported yet\n",
|
||||||
|
@ -459,6 +459,7 @@ static int create_urbs(struct gspca_dev *gspca_dev,
|
|||||||
urb = usb_alloc_urb(npkt, GFP_KERNEL);
|
urb = usb_alloc_urb(npkt, GFP_KERNEL);
|
||||||
if (!urb) {
|
if (!urb) {
|
||||||
err("usb_alloc_urb failed");
|
err("usb_alloc_urb failed");
|
||||||
|
destroy_urbs(gspca_dev);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
urb->transfer_buffer = usb_buffer_alloc(gspca_dev->dev,
|
urb->transfer_buffer = usb_buffer_alloc(gspca_dev->dev,
|
||||||
@ -468,8 +469,8 @@ static int create_urbs(struct gspca_dev *gspca_dev,
|
|||||||
|
|
||||||
if (urb->transfer_buffer == NULL) {
|
if (urb->transfer_buffer == NULL) {
|
||||||
usb_free_urb(urb);
|
usb_free_urb(urb);
|
||||||
destroy_urbs(gspca_dev);
|
|
||||||
err("usb_buffer_urb failed");
|
err("usb_buffer_urb failed");
|
||||||
|
destroy_urbs(gspca_dev);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
gspca_dev->urb[n] = urb;
|
gspca_dev->urb[n] = urb;
|
||||||
|
@ -1063,6 +1063,7 @@ static __devinitdata struct usb_device_id device_table[] = {
|
|||||||
{USB_DEVICE(0x093a, 0x2621), .driver_info = SENSOR_PAC7302},
|
{USB_DEVICE(0x093a, 0x2621), .driver_info = SENSOR_PAC7302},
|
||||||
{USB_DEVICE(0x093a, 0x2624), .driver_info = SENSOR_PAC7302},
|
{USB_DEVICE(0x093a, 0x2624), .driver_info = SENSOR_PAC7302},
|
||||||
{USB_DEVICE(0x093a, 0x2626), .driver_info = SENSOR_PAC7302},
|
{USB_DEVICE(0x093a, 0x2626), .driver_info = SENSOR_PAC7302},
|
||||||
|
{USB_DEVICE(0x093a, 0x262a), .driver_info = SENSOR_PAC7302},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(usb, device_table);
|
MODULE_DEVICE_TABLE(usb, device_table);
|
||||||
|
@ -232,7 +232,7 @@ static struct ctrl sd_ctrls[] = {
|
|||||||
static struct v4l2_pix_format vga_mode[] = {
|
static struct v4l2_pix_format vga_mode[] = {
|
||||||
{160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
{160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
||||||
.bytesperline = 160,
|
.bytesperline = 160,
|
||||||
.sizeimage = 160 * 120 * 5 / 4,
|
.sizeimage = 160 * 120,
|
||||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||||
.priv = 2 | MODE_RAW},
|
.priv = 2 | MODE_RAW},
|
||||||
{160, 120, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
|
{160, 120, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
|
||||||
@ -264,7 +264,7 @@ static struct v4l2_pix_format sif_mode[] = {
|
|||||||
.priv = 1 | MODE_REDUCED_SIF},
|
.priv = 1 | MODE_REDUCED_SIF},
|
||||||
{176, 144, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
{176, 144, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
|
||||||
.bytesperline = 176,
|
.bytesperline = 176,
|
||||||
.sizeimage = 176 * 144 * 5 / 4,
|
.sizeimage = 176 * 144,
|
||||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||||
.priv = 1 | MODE_RAW},
|
.priv = 1 | MODE_RAW},
|
||||||
{176, 144, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
|
{176, 144, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
|
||||||
|
@ -707,6 +707,7 @@ static void i2c_w8(struct gspca_dev *gspca_dev,
|
|||||||
0x08, 0, /* value, index */
|
0x08, 0, /* value, index */
|
||||||
gspca_dev->usb_buf, 8,
|
gspca_dev->usb_buf, 8,
|
||||||
500);
|
500);
|
||||||
|
msleep(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read 5 bytes in gspca_dev->usb_buf */
|
/* read 5 bytes in gspca_dev->usb_buf */
|
||||||
@ -976,13 +977,13 @@ static int sd_init(struct gspca_dev *gspca_dev)
|
|||||||
case BRIDGE_SN9C105:
|
case BRIDGE_SN9C105:
|
||||||
if (regF1 != 0x11)
|
if (regF1 != 0x11)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
reg_w(gspca_dev, 0x02, regGpio, 2);
|
reg_w(gspca_dev, 0x01, regGpio, 2);
|
||||||
break;
|
break;
|
||||||
case BRIDGE_SN9C120:
|
case BRIDGE_SN9C120:
|
||||||
if (regF1 != 0x12)
|
if (regF1 != 0x12)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
regGpio[1] = 0x70;
|
regGpio[1] = 0x70;
|
||||||
reg_w(gspca_dev, 0x02, regGpio, 2);
|
reg_w(gspca_dev, 0x01, regGpio, 2);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* case BRIDGE_SN9C110: */
|
/* case BRIDGE_SN9C110: */
|
||||||
@ -1183,7 +1184,7 @@ static void sd_start(struct gspca_dev *gspca_dev)
|
|||||||
static const __u8 CA[] = { 0x28, 0xd8, 0x14, 0xec };
|
static const __u8 CA[] = { 0x28, 0xd8, 0x14, 0xec };
|
||||||
static const __u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd }; /* MI0360 */
|
static const __u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd }; /* MI0360 */
|
||||||
static const __u8 CE_ov76xx[] =
|
static const __u8 CE_ov76xx[] =
|
||||||
{ 0x32, 0xdd, 0x32, 0xdd }; /* OV7630/48 */
|
{ 0x32, 0xdd, 0x32, 0xdd };
|
||||||
|
|
||||||
sn9c1xx = sn_tb[(int) sd->sensor];
|
sn9c1xx = sn_tb[(int) sd->sensor];
|
||||||
configure_gpio(gspca_dev, sn9c1xx);
|
configure_gpio(gspca_dev, sn9c1xx);
|
||||||
@ -1223,8 +1224,15 @@ static void sd_start(struct gspca_dev *gspca_dev)
|
|||||||
reg_w(gspca_dev, 0x20, gamma_def, sizeof gamma_def);
|
reg_w(gspca_dev, 0x20, gamma_def, sizeof gamma_def);
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
reg_w(gspca_dev, 0x84, reg84, sizeof reg84);
|
reg_w(gspca_dev, 0x84, reg84, sizeof reg84);
|
||||||
|
switch (sd->sensor) {
|
||||||
|
case SENSOR_OV7660:
|
||||||
|
reg_w1(gspca_dev, 0x9a, 0x05);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
reg_w1(gspca_dev, 0x9a, 0x08);
|
reg_w1(gspca_dev, 0x9a, 0x08);
|
||||||
reg_w1(gspca_dev, 0x99, 0x59);
|
reg_w1(gspca_dev, 0x99, 0x59);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
|
mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
|
||||||
if (mode)
|
if (mode)
|
||||||
@ -1275,8 +1283,8 @@ static void sd_start(struct gspca_dev *gspca_dev)
|
|||||||
/* reg1 = 0x44; */
|
/* reg1 = 0x44; */
|
||||||
/* reg1 = 0x46; (done) */
|
/* reg1 = 0x46; (done) */
|
||||||
} else {
|
} else {
|
||||||
reg17 = 0x22; /* 640 MCKSIZE */
|
reg17 = 0xa2; /* 640 */
|
||||||
reg1 = 0x06;
|
reg1 = 0x44;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1285,6 +1293,7 @@ static void sd_start(struct gspca_dev *gspca_dev)
|
|||||||
switch (sd->sensor) {
|
switch (sd->sensor) {
|
||||||
case SENSOR_OV7630:
|
case SENSOR_OV7630:
|
||||||
case SENSOR_OV7648:
|
case SENSOR_OV7648:
|
||||||
|
case SENSOR_OV7660:
|
||||||
reg_w(gspca_dev, 0xce, CE_ov76xx, 4);
|
reg_w(gspca_dev, 0xce, CE_ov76xx, 4);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -225,7 +225,7 @@ static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode)
|
|||||||
reg_w_val(gspca_dev->dev, 0x8802, (mode | 0x01));
|
reg_w_val(gspca_dev->dev, 0x8802, (mode | 0x01));
|
||||||
do {
|
do {
|
||||||
reg_r(gspca_dev, 0x8803, 1);
|
reg_r(gspca_dev, 0x8803, 1);
|
||||||
if (!gspca_dev->usb_buf)
|
if (!gspca_dev->usb_buf[0])
|
||||||
break;
|
break;
|
||||||
} while (--retry);
|
} while (--retry);
|
||||||
if (retry == 0)
|
if (retry == 0)
|
||||||
|
@ -6576,8 +6576,8 @@ static int setlightfreq(struct gspca_dev *gspca_dev)
|
|||||||
cs2102_60HZ, cs2102_60HZScale},
|
cs2102_60HZ, cs2102_60HZScale},
|
||||||
/* SENSOR_CS2102K 1 */
|
/* SENSOR_CS2102K 1 */
|
||||||
{cs2102_NoFliker, cs2102_NoFlikerScale,
|
{cs2102_NoFliker, cs2102_NoFlikerScale,
|
||||||
cs2102_50HZ, cs2102_50HZScale,
|
NULL, NULL, /* currently disabled */
|
||||||
cs2102_60HZ, cs2102_60HZScale},
|
NULL, NULL},
|
||||||
/* SENSOR_GC0305 2 */
|
/* SENSOR_GC0305 2 */
|
||||||
{gc0305_NoFliker, gc0305_NoFliker,
|
{gc0305_NoFliker, gc0305_NoFliker,
|
||||||
gc0305_50HZ, gc0305_50HZ,
|
gc0305_50HZ, gc0305_50HZ,
|
||||||
|
@ -3591,7 +3591,7 @@ static int
|
|||||||
ov51x_init_isoc(struct usb_ov511 *ov)
|
ov51x_init_isoc(struct usb_ov511 *ov)
|
||||||
{
|
{
|
||||||
struct urb *urb;
|
struct urb *urb;
|
||||||
int fx, err, n, size;
|
int fx, err, n, i, size;
|
||||||
|
|
||||||
PDEBUG(3, "*** Initializing capture ***");
|
PDEBUG(3, "*** Initializing capture ***");
|
||||||
|
|
||||||
@ -3662,6 +3662,8 @@ ov51x_init_isoc(struct usb_ov511 *ov)
|
|||||||
urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
|
urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
|
||||||
if (!urb) {
|
if (!urb) {
|
||||||
err("init isoc: usb_alloc_urb ret. NULL");
|
err("init isoc: usb_alloc_urb ret. NULL");
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
usb_free_urb(ov->sbuf[i].urb);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
ov->sbuf[n].urb = urb;
|
ov->sbuf[n].urb = urb;
|
||||||
@ -5651,7 +5653,7 @@ static ssize_t show_exposure(struct device *cd,
|
|||||||
if (!ov->dev)
|
if (!ov->dev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
sensor_get_exposure(ov, &exp);
|
sensor_get_exposure(ov, &exp);
|
||||||
return sprintf(buf, "%d\n", exp >> 8);
|
return sprintf(buf, "%d\n", exp);
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR(exposure, S_IRUGO, show_exposure, NULL);
|
static DEVICE_ATTR(exposure, S_IRUGO, show_exposure, NULL);
|
||||||
|
|
||||||
|
@ -489,6 +489,8 @@ static const struct pvr2_device_desc pvr2_device_751xx = {
|
|||||||
struct usb_device_id pvr2_device_table[] = {
|
struct usb_device_id pvr2_device_table[] = {
|
||||||
{ USB_DEVICE(0x2040, 0x2900),
|
{ USB_DEVICE(0x2040, 0x2900),
|
||||||
.driver_info = (kernel_ulong_t)&pvr2_device_29xxx},
|
.driver_info = (kernel_ulong_t)&pvr2_device_29xxx},
|
||||||
|
{ USB_DEVICE(0x2040, 0x2950), /* Logically identical to 2900 */
|
||||||
|
.driver_info = (kernel_ulong_t)&pvr2_device_29xxx},
|
||||||
{ USB_DEVICE(0x2040, 0x2400),
|
{ USB_DEVICE(0x2040, 0x2400),
|
||||||
.driver_info = (kernel_ulong_t)&pvr2_device_24xxx},
|
.driver_info = (kernel_ulong_t)&pvr2_device_24xxx},
|
||||||
{ USB_DEVICE(0x1164, 0x0622),
|
{ USB_DEVICE(0x1164, 0x0622),
|
||||||
|
@ -669,7 +669,7 @@ static void s2255_fillbuff(struct s2255_dev *dev, struct s2255_buffer *buf,
|
|||||||
(unsigned long)vbuf, pos);
|
(unsigned long)vbuf, pos);
|
||||||
/* tell v4l buffer was filled */
|
/* tell v4l buffer was filled */
|
||||||
|
|
||||||
buf->vb.field_count++;
|
buf->vb.field_count = dev->frame_count[chn] * 2;
|
||||||
do_gettimeofday(&ts);
|
do_gettimeofday(&ts);
|
||||||
buf->vb.ts = ts;
|
buf->vb.ts = ts;
|
||||||
buf->vb.state = VIDEOBUF_DONE;
|
buf->vb.state = VIDEOBUF_DONE;
|
||||||
@ -1268,6 +1268,7 @@ static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
|
|||||||
dev->last_frame[chn] = -1;
|
dev->last_frame[chn] = -1;
|
||||||
dev->bad_payload[chn] = 0;
|
dev->bad_payload[chn] = 0;
|
||||||
dev->cur_frame[chn] = 0;
|
dev->cur_frame[chn] = 0;
|
||||||
|
dev->frame_count[chn] = 0;
|
||||||
for (j = 0; j < SYS_FRAMES; j++) {
|
for (j = 0; j < SYS_FRAMES; j++) {
|
||||||
dev->buffer[chn].frame[j].ulState = 0;
|
dev->buffer[chn].frame[j].ulState = 0;
|
||||||
dev->buffer[chn].frame[j].cur_size = 0;
|
dev->buffer[chn].frame[j].cur_size = 0;
|
||||||
|
@ -592,7 +592,7 @@ int uvc_query_v4l2_ctrl(struct uvc_video_device *video,
|
|||||||
if (ctrl == NULL)
|
if (ctrl == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
data = kmalloc(8, GFP_KERNEL);
|
data = kmalloc(ctrl->info->size, GFP_KERNEL);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -911,7 +911,6 @@ static int w9968cf_start_transfer(struct w9968cf_device* cam)
|
|||||||
|
|
||||||
for (i = 0; i < W9968CF_URBS; i++) {
|
for (i = 0; i < W9968CF_URBS; i++) {
|
||||||
urb = usb_alloc_urb(W9968CF_ISO_PACKETS, GFP_KERNEL);
|
urb = usb_alloc_urb(W9968CF_ISO_PACKETS, GFP_KERNEL);
|
||||||
cam->urb[i] = urb;
|
|
||||||
if (!urb) {
|
if (!urb) {
|
||||||
for (j = 0; j < i; j++)
|
for (j = 0; j < i; j++)
|
||||||
usb_free_urb(cam->urb[j]);
|
usb_free_urb(cam->urb[j]);
|
||||||
@ -919,6 +918,7 @@ static int w9968cf_start_transfer(struct w9968cf_device* cam)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cam->urb[i] = urb;
|
||||||
urb->dev = udev;
|
urb->dev = udev;
|
||||||
urb->context = (void*)cam;
|
urb->context = (void*)cam;
|
||||||
urb->pipe = usb_rcvisocpipe(udev, 1);
|
urb->pipe = usb_rcvisocpipe(udev, 1);
|
||||||
|
@ -274,10 +274,8 @@ static int wm8739_probe(struct i2c_client *client,
|
|||||||
client->addr << 1, client->adapter->name);
|
client->addr << 1, client->adapter->name);
|
||||||
|
|
||||||
state = kmalloc(sizeof(struct wm8739_state), GFP_KERNEL);
|
state = kmalloc(sizeof(struct wm8739_state), GFP_KERNEL);
|
||||||
if (state == NULL) {
|
if (state == NULL)
|
||||||
kfree(client);
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
state->vol_l = 0x17; /* 0dB */
|
state->vol_l = 0x17; /* 0dB */
|
||||||
state->vol_r = 0x17; /* 0dB */
|
state->vol_r = 0x17; /* 0dB */
|
||||||
state->muted = 0;
|
state->muted = 0;
|
||||||
|
@ -988,7 +988,7 @@ zoran_open_init_params (struct zoran *zr)
|
|||||||
zr->v4l_grab_seq = 0;
|
zr->v4l_grab_seq = 0;
|
||||||
zr->v4l_settings.width = 192;
|
zr->v4l_settings.width = 192;
|
||||||
zr->v4l_settings.height = 144;
|
zr->v4l_settings.height = 144;
|
||||||
zr->v4l_settings.format = &zoran_formats[4]; /* YUY2 - YUV-4:2:2 packed */
|
zr->v4l_settings.format = &zoran_formats[7]; /* YUY2 - YUV-4:2:2 packed */
|
||||||
zr->v4l_settings.bytesperline =
|
zr->v4l_settings.bytesperline =
|
||||||
zr->v4l_settings.width *
|
zr->v4l_settings.width *
|
||||||
((zr->v4l_settings.format->depth + 7) / 8);
|
((zr->v4l_settings.format->depth + 7) / 8);
|
||||||
|
@ -134,7 +134,7 @@ const struct zoran_format zoran_formats[] = {
|
|||||||
}, {
|
}, {
|
||||||
.name = "16-bit RGB BE",
|
.name = "16-bit RGB BE",
|
||||||
ZFMT(-1,
|
ZFMT(-1,
|
||||||
V4L2_PIX_FMT_RGB565, V4L2_COLORSPACE_SRGB),
|
V4L2_PIX_FMT_RGB565X, V4L2_COLORSPACE_SRGB),
|
||||||
.depth = 16,
|
.depth = 16,
|
||||||
.flags = ZORAN_FORMAT_CAPTURE |
|
.flags = ZORAN_FORMAT_CAPTURE |
|
||||||
ZORAN_FORMAT_OVERLAY,
|
ZORAN_FORMAT_OVERLAY,
|
||||||
@ -2737,7 +2737,8 @@ zoran_do_ioctl (struct inode *inode,
|
|||||||
fh->v4l_settings.format->fourcc;
|
fh->v4l_settings.format->fourcc;
|
||||||
fmt->fmt.pix.colorspace =
|
fmt->fmt.pix.colorspace =
|
||||||
fh->v4l_settings.format->colorspace;
|
fh->v4l_settings.format->colorspace;
|
||||||
fmt->fmt.pix.bytesperline = 0;
|
fmt->fmt.pix.bytesperline =
|
||||||
|
fh->v4l_settings.bytesperline;
|
||||||
if (BUZ_MAX_HEIGHT <
|
if (BUZ_MAX_HEIGHT <
|
||||||
(fh->v4l_settings.height * 2))
|
(fh->v4l_settings.height * 2))
|
||||||
fmt->fmt.pix.field =
|
fmt->fmt.pix.field =
|
||||||
@ -2833,13 +2834,6 @@ zoran_do_ioctl (struct inode *inode,
|
|||||||
fmt->fmt.pix.pixelformat,
|
fmt->fmt.pix.pixelformat,
|
||||||
(char *) &printformat);
|
(char *) &printformat);
|
||||||
|
|
||||||
if (fmt->fmt.pix.bytesperline > 0) {
|
|
||||||
dprintk(5,
|
|
||||||
KERN_ERR "%s: bpl not supported\n",
|
|
||||||
ZR_DEVNAME(zr));
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we can be requested to do JPEG/raw playback/capture */
|
/* we can be requested to do JPEG/raw playback/capture */
|
||||||
if (!
|
if (!
|
||||||
(fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ||
|
(fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ||
|
||||||
@ -2923,6 +2917,7 @@ zoran_do_ioctl (struct inode *inode,
|
|||||||
fh->jpg_buffers.buffer_size =
|
fh->jpg_buffers.buffer_size =
|
||||||
zoran_v4l2_calc_bufsize(&fh->
|
zoran_v4l2_calc_bufsize(&fh->
|
||||||
jpg_settings);
|
jpg_settings);
|
||||||
|
fmt->fmt.pix.bytesperline = 0;
|
||||||
fmt->fmt.pix.sizeimage =
|
fmt->fmt.pix.sizeimage =
|
||||||
fh->jpg_buffers.buffer_size;
|
fh->jpg_buffers.buffer_size;
|
||||||
|
|
||||||
@ -2979,6 +2974,8 @@ zoran_do_ioctl (struct inode *inode,
|
|||||||
|
|
||||||
/* tell the user the
|
/* tell the user the
|
||||||
* results/missing stuff */
|
* results/missing stuff */
|
||||||
|
fmt->fmt.pix.bytesperline =
|
||||||
|
fh->v4l_settings.bytesperline;
|
||||||
fmt->fmt.pix.sizeimage =
|
fmt->fmt.pix.sizeimage =
|
||||||
fh->v4l_settings.height *
|
fh->v4l_settings.height *
|
||||||
fh->v4l_settings.bytesperline;
|
fh->v4l_settings.bytesperline;
|
||||||
|
Loading…
Reference in New Issue
Block a user