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

Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6

* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (27 commits)
  V4L/DVB (13314): saa7134: set ts_force_val for the Hauppauge WinTV HVR-1150
  V4L/DVB (13313): saa7134: add support for FORCE_TS_VALID mode for mpeg ts input
  V4L/DVB (13311): uvcvideo: Fix compilation warning with 2.6.32 due to type mismatch with abs()
  V4L/DVB (13309): uvcvideo: Ignore the FIX_BANDWIDTH for compressed video
  V4L/DVB (13287): ce6230 - saa7164-cmd: Fix wrong sizeof
  V4L/DVB (13286): pxa-camera: Fix missing sched.h
  V4L/DVB (13264): gspca_mr97310a: Change vstart for CIF sensor type 1 cams
  V4L/DVB (13257): gspca - m5602-s5k4aa: Add vflip for Fujitsu Amilo Xi 2528
  V4L/DVB (13256): gspca - m5602-s5k4aa: Add another MSI GX700 vflip quirk
  V4L/DVB (13255): gspca - m5602-s5k4aa: Add vflip quirk for the Bruneinit laptop
  V4L/DVB (13240): firedtv: fix regression: tuning fails due to bogus error return
  V4L/DVB (13237): firedtv: length field corrupt in ca2host if length>127
  V4L/DVB (13230): s2255drv: Don't conditionalize video buffer completion on waiting processes
  V4L/DVB (13202): smsusb: add autodetection support for three additional Hauppauge USB IDs
  V4L/DVB (13190): em28xx: fix panic that can occur when starting audio streaming
  V4L/DVB (13170): bttv: Fix reversed polarity error when switching video standard
  V4L/DVB (13169): bttv: Fix potential out-of-order field processing
  V4L/DVB (13167): pt1: Fix a compile error on arm
  V4L/DVB (13132): fix use-after-free Oops, resulting from a driver-core API change
  V4L/DVB (13131): pxa_camera: fix camera pixel format configuration
  ...
...@@ -616,13 +616,13 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq) ...@@ -616,13 +616,13 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq)
case RF2: case RF2:
map[i].rf_a1 = (prog_cal[RF2] - prog_tab[RF2] - map[i].rf_a1 = (prog_cal[RF2] - prog_tab[RF2] -
prog_cal[RF1] + prog_tab[RF1]) / prog_cal[RF1] + prog_tab[RF1]) /
((rf_freq[RF2] - rf_freq[RF1]) / 1000); (s32)((rf_freq[RF2] - rf_freq[RF1]) / 1000);
map[i].rf2 = rf_freq[RF2] / 1000; map[i].rf2 = rf_freq[RF2] / 1000;
break; break;
case RF3: case RF3:
map[i].rf_a2 = (prog_cal[RF3] - prog_tab[RF3] - map[i].rf_a2 = (prog_cal[RF3] - prog_tab[RF3] -
prog_cal[RF2] + prog_tab[RF2]) / prog_cal[RF2] + prog_tab[RF2]) /
((rf_freq[RF3] - rf_freq[RF2]) / 1000); (s32)((rf_freq[RF3] - rf_freq[RF2]) / 1000);
map[i].rf_b2 = prog_cal[RF2] - prog_tab[RF2]; map[i].rf_b2 = prog_cal[RF2] - prog_tab[RF2];
map[i].rf3 = rf_freq[RF3] / 1000; map[i].rf3 = rf_freq[RF3] / 1000;
break; break;
...@@ -1000,12 +1000,12 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe, ...@@ -1000,12 +1000,12 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe,
struct tda18271_std_map_item *map; struct tda18271_std_map_item *map;
char *mode; char *mode;
int ret; int ret;
u32 freq = params->frequency * 62500; u32 freq = params->frequency * 125 *
((params->mode == V4L2_TUNER_RADIO) ? 1 : 1000) / 2;
priv->mode = TDA18271_ANALOG; priv->mode = TDA18271_ANALOG;
if (params->mode == V4L2_TUNER_RADIO) { if (params->mode == V4L2_TUNER_RADIO) {
freq = freq / 1000;
map = &std_map->fm_radio; map = &std_map->fm_radio;
mode = "fm"; mode = "fm";
} else if (params->std & V4L2_STD_MN) { } else if (params->std & V4L2_STD_MN) {
......
...@@ -75,7 +75,7 @@ config DVB_USB_DIB0700 ...@@ -75,7 +75,7 @@ config DVB_USB_DIB0700
select DVB_DIB3000MC if !DVB_FE_CUSTOMISE select DVB_DIB3000MC if !DVB_FE_CUSTOMISE
select DVB_S5H1411 if !DVB_FE_CUSTOMISE select DVB_S5H1411 if !DVB_FE_CUSTOMISE
select DVB_LGDT3305 if !DVB_FE_CUSTOMISE select DVB_LGDT3305 if !DVB_FE_CUSTOMISE
select DVB_TUNER_DIB0070 select DVB_TUNER_DIB0070 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE select MEDIA_TUNER_MT2060 if !MEDIA_TUNER_CUSTOMISE
select MEDIA_TUNER_MT2266 if !MEDIA_TUNER_CUSTOMISE select MEDIA_TUNER_MT2266 if !MEDIA_TUNER_CUSTOMISE
select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE
......
...@@ -105,7 +105,7 @@ static int ce6230_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], ...@@ -105,7 +105,7 @@ static int ce6230_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
int i = 0; int i = 0;
struct req_t req; struct req_t req;
int ret = 0; int ret = 0;
memset(&req, 0, sizeof(&req)); memset(&req, 0, sizeof(req));
if (num > 2) if (num > 2)
return -EINVAL; return -EINVAL;
......
...@@ -1925,7 +1925,7 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -1925,7 +1925,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
{ NULL }, { NULL },
}, },
{ "Leadtek Winfast DTV Dongle (STK7700P based)", { "Leadtek Winfast DTV Dongle (STK7700P based)",
{ &dib0700_usb_id_table[8] }, { &dib0700_usb_id_table[8], &dib0700_usb_id_table[34] },
{ NULL }, { NULL },
}, },
{ "AVerMedia AVerTV DVB-T Express", { "AVerMedia AVerTV DVB-T Express",
...@@ -2064,7 +2064,7 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2064,7 +2064,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
}, },
}, },
.num_device_descs = 12, .num_device_descs = 11,
.devices = { .devices = {
{ "DiBcom STK7070P reference design", { "DiBcom STK7070P reference design",
{ &dib0700_usb_id_table[15], NULL }, { &dib0700_usb_id_table[15], NULL },
...@@ -2098,11 +2098,6 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2098,11 +2098,6 @@ struct dvb_usb_device_properties dib0700_devices[] = {
{ &dib0700_usb_id_table[30], NULL }, { &dib0700_usb_id_table[30], NULL },
{ NULL }, { NULL },
}, },
{ "Terratec Cinergy T USB XXS/ T3",
{ &dib0700_usb_id_table[33],
&dib0700_usb_id_table[52], NULL },
{ NULL },
},
{ "Elgato EyeTV DTT", { "Elgato EyeTV DTT",
{ &dib0700_usb_id_table[49], NULL }, { &dib0700_usb_id_table[49], NULL },
{ NULL }, { NULL },
...@@ -2343,8 +2338,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -2343,8 +2338,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
{ &dib0700_usb_id_table[59], NULL }, { &dib0700_usb_id_table[59], NULL },
{ NULL }, { NULL },
}, },
{ "Terratec Cinergy T USB XXS (HD)", { "Terratec Cinergy T USB XXS (HD)/ T3",
{ &dib0700_usb_id_table[34], &dib0700_usb_id_table[60] }, { &dib0700_usb_id_table[33],
&dib0700_usb_id_table[52],
&dib0700_usb_id_table[60], NULL},
{ NULL }, { NULL },
}, },
}, },
......
...@@ -1050,28 +1050,28 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length) ...@@ -1050,28 +1050,28 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
c->operand[4] = 0; /* slot */ c->operand[4] = 0; /* slot */
c->operand[5] = SFE_VENDOR_TAG_CA_PMT; /* ca tag */ c->operand[5] = SFE_VENDOR_TAG_CA_PMT; /* ca tag */
c->operand[6] = 0; /* more/last */ c->operand[6] = 0; /* more/last */
/* c->operand[7] = XXXprogram_info_length + 17; */ /* length */ /* Use three bytes for length field in case length > 127 */
c->operand[8] = list_management; c->operand[10] = list_management;
c->operand[9] = 0x01; /* pmt_cmd=OK_descramble */ c->operand[11] = 0x01; /* pmt_cmd=OK_descramble */
/* TS program map table */ /* TS program map table */
c->operand[10] = 0x02; /* Table id=2 */ c->operand[12] = 0x02; /* Table id=2 */
c->operand[11] = 0x80; /* Section syntax + length */ c->operand[13] = 0x80; /* Section syntax + length */
/* c->operand[12] = XXXprogram_info_length + 12; */ /* c->operand[14] = XXXprogram_info_length + 12; */
c->operand[13] = msg[1]; /* Program number */ c->operand[15] = msg[1]; /* Program number */
c->operand[14] = msg[2]; c->operand[16] = msg[2];
c->operand[15] = 0x01; /* Version number=0 + current/next=1 */ c->operand[17] = 0x01; /* Version number=0 + current/next=1 */
c->operand[16] = 0x00; /* Section number=0 */ c->operand[18] = 0x00; /* Section number=0 */
c->operand[17] = 0x00; /* Last section number=0 */ c->operand[19] = 0x00; /* Last section number=0 */
c->operand[18] = 0x1f; /* PCR_PID=1FFF */ c->operand[20] = 0x1f; /* PCR_PID=1FFF */
c->operand[19] = 0xff; c->operand[21] = 0xff;
c->operand[20] = (program_info_length >> 8); /* Program info length */ c->operand[22] = (program_info_length >> 8); /* Program info length */
c->operand[21] = (program_info_length & 0xff); c->operand[23] = (program_info_length & 0xff);
/* CA descriptors at programme level */ /* CA descriptors at programme level */
read_pos = 6; read_pos = 6;
write_pos = 22; write_pos = 24;
if (program_info_length > 0) { if (program_info_length > 0) {
pmt_cmd_id = msg[read_pos++]; pmt_cmd_id = msg[read_pos++];
if (pmt_cmd_id != 1 && pmt_cmd_id != 4) if (pmt_cmd_id != 1 && pmt_cmd_id != 4)
...@@ -1113,8 +1113,10 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length) ...@@ -1113,8 +1113,10 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
c->operand[write_pos++] = 0x00; c->operand[write_pos++] = 0x00;
c->operand[write_pos++] = 0x00; c->operand[write_pos++] = 0x00;
c->operand[7] = write_pos - 8; c->operand[7] = 0x82;
c->operand[12] = write_pos - 13; c->operand[8] = (write_pos - 10) >> 8;
c->operand[9] = (write_pos - 10) & 0xff;
c->operand[14] = write_pos - 15;
crc32_csum = crc32_be(0, &c->operand[10], c->operand[12] - 1); crc32_csum = crc32_be(0, &c->operand[10], c->operand[12] - 1);
c->operand[write_pos - 4] = (crc32_csum >> 24) & 0xff; c->operand[write_pos - 4] = (crc32_csum >> 24) & 0xff;
......
...@@ -141,18 +141,12 @@ static int fdtv_read_uncorrected_blocks(struct dvb_frontend *fe, u32 *ucblocks) ...@@ -141,18 +141,12 @@ static int fdtv_read_uncorrected_blocks(struct dvb_frontend *fe, u32 *ucblocks)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
#define ACCEPTED 0x9
static int fdtv_set_frontend(struct dvb_frontend *fe, static int fdtv_set_frontend(struct dvb_frontend *fe,
struct dvb_frontend_parameters *params) struct dvb_frontend_parameters *params)
{ {
struct firedtv *fdtv = fe->sec_priv; struct firedtv *fdtv = fe->sec_priv;
/* FIXME: avc_tuner_dsd never returns ACCEPTED. Check status? */ return avc_tuner_dsd(fdtv, params);
if (avc_tuner_dsd(fdtv, params) != ACCEPTED)
return -EINVAL;
else
return 0; /* not sure of this... */
} }
static int fdtv_get_frontend(struct dvb_frontend *fe, static int fdtv_get_frontend(struct dvb_frontend *fe,
......
...@@ -51,6 +51,7 @@ struct dib0070_config { ...@@ -51,6 +51,7 @@ struct dib0070_config {
#if defined(CONFIG_DVB_TUNER_DIB0070) || (defined(CONFIG_DVB_TUNER_DIB0070_MODULE) && defined(MODULE)) #if defined(CONFIG_DVB_TUNER_DIB0070) || (defined(CONFIG_DVB_TUNER_DIB0070_MODULE) && defined(MODULE))
extern struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg); extern struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg);
extern u16 dib0070_wbd_offset(struct dvb_frontend *); extern u16 dib0070_wbd_offset(struct dvb_frontend *);
extern void dib0070_ctrl_agc_filter(struct dvb_frontend *, u8 open);
#else #else
static inline struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg) static inline struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg)
{ {
...@@ -63,7 +64,11 @@ static inline u16 dib0070_wbd_offset(struct dvb_frontend *fe) ...@@ -63,7 +64,11 @@ static inline u16 dib0070_wbd_offset(struct dvb_frontend *fe)
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
return -ENODEV; return -ENODEV;
} }
static inline void dib0070_ctrl_agc_filter(struct dvb_frontend *fe, u8 open)
{
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
}
#endif #endif
extern void dib0070_ctrl_agc_filter(struct dvb_frontend *, u8 open);
#endif #endif
...@@ -1375,6 +1375,11 @@ struct dvb_frontend * dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, ...@@ -1375,6 +1375,11 @@ struct dvb_frontend * dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr,
if (dib7000p_identify(st) != 0) if (dib7000p_identify(st) != 0)
goto error; goto error;
/* FIXME: make sure the dev.parent field is initialized, or else
request_firmware() will hit an OOPS (this should be moved somewhere
more common) */
st->i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->dev.parent;
dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr); dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr);
dib7000p_demod_reset(st); dib7000p_demod_reset(st);
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/freezer.h> #include <linux/freezer.h>
#include <linux/vmalloc.h>
#include "dvbdev.h" #include "dvbdev.h"
#include "dvb_demux.h" #include "dvb_demux.h"
......
...@@ -529,6 +529,12 @@ struct usb_device_id smsusb_id_table[] = { ...@@ -529,6 +529,12 @@ struct usb_device_id smsusb_id_table[] = {
.driver_info = SMS1XXX_BOARD_SIANO_NICE }, .driver_info = SMS1XXX_BOARD_SIANO_NICE },
{ USB_DEVICE(0x187f, 0x0301), { USB_DEVICE(0x187f, 0x0301),
.driver_info = SMS1XXX_BOARD_SIANO_VENICE }, .driver_info = SMS1XXX_BOARD_SIANO_VENICE },
{ USB_DEVICE(0x2040, 0xb900),
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
{ USB_DEVICE(0x2040, 0xb910),
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
{ USB_DEVICE(0x2040, 0xc000),
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
......
...@@ -1299,7 +1299,7 @@ set_tvnorm(struct bttv *btv, unsigned int norm) ...@@ -1299,7 +1299,7 @@ set_tvnorm(struct bttv *btv, unsigned int norm)
tvnorm = &bttv_tvnorms[norm]; tvnorm = &bttv_tvnorms[norm];
if (!memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap, if (memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap,
sizeof (tvnorm->cropcap))) { sizeof (tvnorm->cropcap))) {
bttv_crop_reset(&btv->crop[0], norm); bttv_crop_reset(&btv->crop[0], norm);
btv->crop[1] = btv->crop[0]; /* current = default */ btv->crop[1] = btv->crop[0]; /* current = default */
...@@ -3800,11 +3800,34 @@ bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set) ...@@ -3800,11 +3800,34 @@ bttv_irq_next_video(struct bttv *btv, struct bttv_buffer_set *set)
if (!V4L2_FIELD_HAS_BOTH(item->vb.field) && if (!V4L2_FIELD_HAS_BOTH(item->vb.field) &&
(item->vb.queue.next != &btv->capture)) { (item->vb.queue.next != &btv->capture)) {
item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue); item = list_entry(item->vb.queue.next, struct bttv_buffer, vb.queue);
/* Mike Isely <isely@pobox.com> - Only check
* and set up the bottom field in the logic
* below. Don't ever do the top field. This
* of course means that if we set up the
* bottom field in the above code that we'll
* actually skip a field. But that's OK.
* Having processed only a single buffer this
* time, then the next time around the first
* available buffer should be for a top field.
* That will then cause us here to set up a
* top then a bottom field in the normal way.
* The alternative to this understanding is
* that we set up the second available buffer
* as a top field, but that's out of order
* since this driver always processes the top
* field first - the effect will be the two
* buffers being returned in the wrong order,
* with the second buffer also being delayed
* by one field time (owing to the fifo nature
* of videobuf). Worse still, we'll be stuck
* doing fields out of order now every time
* until something else causes a field to be
* dropped. By effectively forcing a field to
* drop this way then we always get back into
* sync within a single frame time. (Out of
* order fields can screw up deinterlacing
* algorithms.) */
if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) { if (!V4L2_FIELD_HAS_BOTH(item->vb.field)) {
if (NULL == set->top &&
V4L2_FIELD_TOP == item->vb.field) {
set->top = item;
}
if (NULL == set->bottom && if (NULL == set->bottom &&
V4L2_FIELD_BOTTOM == item->vb.field) { V4L2_FIELD_BOTTOM == item->vb.field) {
set->bottom = item; set->bottom = item;
......
...@@ -383,6 +383,11 @@ static int snd_em28xx_hw_capture_free(struct snd_pcm_substream *substream) ...@@ -383,6 +383,11 @@ static int snd_em28xx_hw_capture_free(struct snd_pcm_substream *substream)
static int snd_em28xx_prepare(struct snd_pcm_substream *substream) static int snd_em28xx_prepare(struct snd_pcm_substream *substream)
{ {
struct em28xx *dev = snd_pcm_substream_chip(substream);
dev->adev.hwptr_done_capture = 0;
dev->adev.capture_transfer_done = 0;
return 0; return 0;
} }
......
...@@ -35,11 +35,24 @@ static ...@@ -35,11 +35,24 @@ static
const const
struct dmi_system_id s5k4aa_vflip_dmi_table[] = { struct dmi_system_id s5k4aa_vflip_dmi_table[] = {
{ {
.ident = "BRUNEINIT",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "BRUNENIT"),
DMI_MATCH(DMI_PRODUCT_NAME, "BRUNENIT"),
DMI_MATCH(DMI_BOARD_VERSION, "00030D0000000001")
}
}, {
.ident = "Fujitsu-Siemens Amilo Xa 2528", .ident = "Fujitsu-Siemens Amilo Xa 2528",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xa 2528") DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xa 2528")
} }
}, {
.ident = "Fujitsu-Siemens Amilo Xi 2528",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 2528")
}
}, { }, {
.ident = "Fujitsu-Siemens Amilo Xi 2550", .ident = "Fujitsu-Siemens Amilo Xi 2550",
.matches = { .matches = {
...@@ -52,6 +65,13 @@ static ...@@ -52,6 +65,13 @@ static
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2548") DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2548")
} }
}, {
.ident = "MSI GX700",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"),
DMI_MATCH(DMI_PRODUCT_NAME, "GX700"),
DMI_MATCH(DMI_BIOS_DATE, "12/02/2008")
}
}, { }, {
.ident = "MSI GX700", .ident = "MSI GX700",
.matches = { .matches = {
......
...@@ -483,7 +483,7 @@ static int start_cif_cam(struct gspca_dev *gspca_dev) ...@@ -483,7 +483,7 @@ static int start_cif_cam(struct gspca_dev *gspca_dev)
data[3] = 0x2c; /* reg 2, H size/8 */ data[3] = 0x2c; /* reg 2, H size/8 */
data[4] = 0x48; /* reg 3, V size/4 */ data[4] = 0x48; /* reg 3, V size/4 */
data[6] = 0x06; /* reg 5, H start */ data[6] = 0x06; /* reg 5, H start */
data[8] = 0x06 + sd->sensor_type; /* reg 7, V start */ data[8] = 0x06 - sd->sensor_type; /* reg 7, V start */
break; break;
} }
err_code = mr_write(gspca_dev, 11); err_code = mr_write(gspca_dev, 11);
......
...@@ -2919,7 +2919,7 @@ static void ov518_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -2919,7 +2919,7 @@ static void ov518_pkt_scan(struct gspca_dev *gspca_dev,
/* A false positive here is likely, until OVT gives me /* A false positive here is likely, until OVT gives me
* the definitive SOF/EOF format */ * the definitive SOF/EOF format */
if ((!(data[0] | data[1] | data[2] | data[3] | data[5])) && data[6]) { if ((!(data[0] | data[1] | data[2] | data[3] | data[5])) && data[6]) {
gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0); frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0);
gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, 0); gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, 0);
sd->packet_nr = 0; sd->packet_nr = 0;
} }
......
...@@ -394,7 +394,8 @@ static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev, ...@@ -394,7 +394,8 @@ static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev,
PDEBUG(D_PACK, "End of frame detected"); PDEBUG(D_PACK, "End of frame detected");
/* Complete the last frame (if any) */ /* Complete the last frame (if any) */
gspca_frame_add(gspca_dev, LAST_PACKET, frame, data, 0); frame = gspca_frame_add(gspca_dev, LAST_PACKET,
frame, data, 0);
if (chunk_len) if (chunk_len)
PDEBUG(D_ERR, "Chunk length is " PDEBUG(D_ERR, "Chunk length is "
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/sched.h>
#include <media/v4l2-common.h> #include <media/v4l2-common.h>
#include <media/v4l2-dev.h> #include <media/v4l2-dev.h>
...@@ -1432,7 +1433,9 @@ static int pxa_camera_set_fmt(struct soc_camera_device *icd, ...@@ -1432,7 +1433,9 @@ static int pxa_camera_set_fmt(struct soc_camera_device *icd,
icd->sense = &sense; icd->sense = &sense;
cam_f.fmt.pix.pixelformat = cam_fmt->fourcc; cam_f.fmt.pix.pixelformat = cam_fmt->fourcc;
ret = v4l2_subdev_call(sd, video, s_fmt, f); ret = v4l2_subdev_call(sd, video, s_fmt, &cam_f);
cam_f.fmt.pix.pixelformat = pix->pixelformat;
*pix = cam_f.fmt.pix;
icd->sense = NULL; icd->sense = NULL;
......
...@@ -598,11 +598,6 @@ static int s2255_got_frame(struct s2255_dev *dev, int chn, int jpgsize) ...@@ -598,11 +598,6 @@ static int s2255_got_frame(struct s2255_dev *dev, int chn, int jpgsize)
buf = list_entry(dma_q->active.next, buf = list_entry(dma_q->active.next,
struct s2255_buffer, vb.queue); struct s2255_buffer, vb.queue);
if (!waitqueue_active(&buf->vb.done)) {
/* no one active */
rc = -1;
goto unlock;
}
list_del(&buf->vb.queue); list_del(&buf->vb.queue);
do_gettimeofday(&buf->vb.ts); do_gettimeofday(&buf->vb.ts);
dprintk(100, "[%p/%d] wakeup\n", buf, buf->vb.i); dprintk(100, "[%p/%d] wakeup\n", buf, buf->vb.i);
......
...@@ -3428,6 +3428,7 @@ struct saa7134_board saa7134_boards[] = { ...@@ -3428,6 +3428,7 @@ struct saa7134_board saa7134_boards[] = {
.tuner_config = 3, .tuner_config = 3,
.mpeg = SAA7134_MPEG_DVB, .mpeg = SAA7134_MPEG_DVB,
.ts_type = SAA7134_MPEG_TS_SERIAL, .ts_type = SAA7134_MPEG_TS_SERIAL,
.ts_force_val = 1,
.gpiomask = 0x0800100, /* GPIO 21 is an INPUT */ .gpiomask = 0x0800100, /* GPIO 21 is an INPUT */
.inputs = {{ .inputs = {{
.name = name_tv, .name = name_tv,
......
...@@ -262,11 +262,13 @@ int saa7134_ts_start(struct saa7134_dev *dev) ...@@ -262,11 +262,13 @@ int saa7134_ts_start(struct saa7134_dev *dev)
switch (saa7134_boards[dev->board].ts_type) { switch (saa7134_boards[dev->board].ts_type) {
case SAA7134_MPEG_TS_PARALLEL: case SAA7134_MPEG_TS_PARALLEL:
saa_writeb(SAA7134_TS_SERIAL0, 0x40); saa_writeb(SAA7134_TS_SERIAL0, 0x40);
saa_writeb(SAA7134_TS_PARALLEL, 0xec); saa_writeb(SAA7134_TS_PARALLEL, 0xec |
(saa7134_boards[dev->board].ts_force_val << 4));
break; break;
case SAA7134_MPEG_TS_SERIAL: case SAA7134_MPEG_TS_SERIAL:
saa_writeb(SAA7134_TS_SERIAL0, 0xd8); saa_writeb(SAA7134_TS_SERIAL0, 0xd8);
saa_writeb(SAA7134_TS_PARALLEL, 0x6c); saa_writeb(SAA7134_TS_PARALLEL, 0x6c |
(saa7134_boards[dev->board].ts_force_val << 4));
saa_writeb(SAA7134_TS_PARALLEL_SERIAL, 0xbc); saa_writeb(SAA7134_TS_PARALLEL_SERIAL, 0xbc);
saa_writeb(SAA7134_TS_SERIAL1, 0x02); saa_writeb(SAA7134_TS_SERIAL1, 0x02);
break; break;
......
...@@ -360,6 +360,7 @@ struct saa7134_board { ...@@ -360,6 +360,7 @@ struct saa7134_board {
enum saa7134_mpeg_type mpeg; enum saa7134_mpeg_type mpeg;
enum saa7134_mpeg_ts_type ts_type; enum saa7134_mpeg_ts_type ts_type;
unsigned int vid_port_opts; unsigned int vid_port_opts;
unsigned int ts_force_val:1;
}; };
#define card_has_radio(dev) (NULL != saa7134_boards[dev->board].radio.name) #define card_has_radio(dev) (NULL != saa7134_boards[dev->board].radio.name)
......
...@@ -347,7 +347,7 @@ int saa7164_cmd_send(struct saa7164_dev *dev, u8 id, tmComResCmd_t command, ...@@ -347,7 +347,7 @@ int saa7164_cmd_send(struct saa7164_dev *dev, u8 id, tmComResCmd_t command,
/* Prepare some basic command/response structures */ /* Prepare some basic command/response structures */
memset(&command_t, 0, sizeof(command_t)); memset(&command_t, 0, sizeof(command_t));
memset(&response_t, 0, sizeof(&response_t)); memset(&response_t, 0, sizeof(response_t));
pcommand_t = &command_t; pcommand_t = &command_t;
presponse_t = &response_t; presponse_t = &response_t;
command_t.id = id; command_t.id = id;
......
...@@ -1173,8 +1173,8 @@ static int get_scales(struct soc_camera_device *icd, ...@@ -1173,8 +1173,8 @@ static int get_scales(struct soc_camera_device *icd,
width_in = scale_up(cam->ceu_rect.width, *scale_h); width_in = scale_up(cam->ceu_rect.width, *scale_h);
height_in = scale_up(cam->ceu_rect.height, *scale_v); height_in = scale_up(cam->ceu_rect.height, *scale_v);
*scale_h = calc_generic_scale(cam->ceu_rect.width, icd->user_width); *scale_h = calc_generic_scale(width_in, icd->user_width);
*scale_v = calc_generic_scale(cam->ceu_rect.height, icd->user_height); *scale_v = calc_generic_scale(height_in, icd->user_height);
return 0; return 0;
} }
......
...@@ -1160,13 +1160,15 @@ void soc_camera_host_unregister(struct soc_camera_host *ici) ...@@ -1160,13 +1160,15 @@ void soc_camera_host_unregister(struct soc_camera_host *ici)
if (icd->iface == ici->nr) { if (icd->iface == ici->nr) {
/* The bus->remove will be called */ /* The bus->remove will be called */
device_unregister(&icd->dev); device_unregister(&icd->dev);
/* Not before device_unregister(), .remove /*
* needs parent to call ici->ops->remove() */ * Not before device_unregister(), .remove
icd->dev.parent = NULL; * needs parent to call ici->ops->remove().
* If the host module is loaded again, device_register()
/* If the host module is loaded again, device_register() * would complain "already initialised," since 2.6.32
* would complain "already initialised" */ * this is also needed to prevent use-after-free of the
memset(&icd->dev.kobj, 0, sizeof(icd->dev.kobj)); * device private data.
*/
memset(&icd->dev, 0, sizeof(icd->dev));
} }
} }
......
...@@ -348,7 +348,7 @@ static void uvc_ctrl_set_zoom(struct uvc_control_mapping *mapping, ...@@ -348,7 +348,7 @@ static void uvc_ctrl_set_zoom(struct uvc_control_mapping *mapping,
__s32 value, __u8 *data) __s32 value, __u8 *data)
{ {
data[0] = value == 0 ? 0 : (value > 0) ? 1 : 0xff; data[0] = value == 0 ? 0 : (value > 0) ? 1 : 0xff;
data[2] = min(abs(value), 0xff); data[2] = min((int)abs(value), 0xff);
} }
static struct uvc_control_mapping uvc_ctrl_mappings[] = { static struct uvc_control_mapping uvc_ctrl_mappings[] = {
......
...@@ -90,7 +90,8 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, ...@@ -90,7 +90,8 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
ctrl->dwMaxVideoFrameSize = ctrl->dwMaxVideoFrameSize =
frame->dwMaxVideoFrameBufferSize; frame->dwMaxVideoFrameBufferSize;
if (stream->dev->quirks & UVC_QUIRK_FIX_BANDWIDTH && if (!(format->flags & UVC_FMT_FLAG_COMPRESSED) &&
stream->dev->quirks & UVC_QUIRK_FIX_BANDWIDTH &&
stream->intf->num_altsetting > 1) { stream->intf->num_altsetting > 1) {
u32 interval; u32 interval;
u32 bandwidth; u32 bandwidth;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册