Merge branch 'media_fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'media_fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: [media] mantis_pci: remove asm/pgtable.h include [media] tda829x: fix regression in probe functions [media] mceusb: don't claim multifunction device non-IR parts [media] nuvoton-cir: fix wake from suspend [media] cx18: Add support for Hauppauge HVR-1600 models with s5h1411 [media] ivtv: Fix corrective action taken upon DMA ERR interrupt to avoid hang [media] cx25840: fix probing of cx2583x chips [media] cx23885: Remove unused 'err:' labels to quiet compiler warning [media] cx23885: Revert "Check for slave nack on all transactions" [media] DiB7000M: add pid filtering [media] Fix sysfs rc protocol lookup for rc-5-sz [media] au0828: fix VBI handling when in V4L2 streaming mode [media] ir-raw: Properly initialize the IR event (BZ#27202) [media] s2255drv: firmware re-loading changes [media] Fix double free of video_device in mem2mem_testdev [media] DM04/QQBOX memcpy to const char fix
This commit is contained in:
commit
9179746652
|
@ -658,13 +658,13 @@ static int tda8290_probe(struct tuner_i2c_props *i2c_props)
|
|||
#define TDA8290_ID 0x89
|
||||
u8 reg = 0x1f, id;
|
||||
struct i2c_msg msg_read[] = {
|
||||
{ .addr = 0x4b, .flags = 0, .len = 1, .buf = ® },
|
||||
{ .addr = 0x4b, .flags = I2C_M_RD, .len = 1, .buf = &id },
|
||||
{ .addr = i2c_props->addr, .flags = 0, .len = 1, .buf = ® },
|
||||
{ .addr = i2c_props->addr, .flags = I2C_M_RD, .len = 1, .buf = &id },
|
||||
};
|
||||
|
||||
/* detect tda8290 */
|
||||
if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) {
|
||||
printk(KERN_WARNING "%s: tda8290 couldn't read register 0x%02x\n",
|
||||
printk(KERN_WARNING "%s: couldn't read register 0x%02x\n",
|
||||
__func__, reg);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -685,13 +685,13 @@ static int tda8295_probe(struct tuner_i2c_props *i2c_props)
|
|||
#define TDA8295C2_ID 0x8b
|
||||
u8 reg = 0x2f, id;
|
||||
struct i2c_msg msg_read[] = {
|
||||
{ .addr = 0x4b, .flags = 0, .len = 1, .buf = ® },
|
||||
{ .addr = 0x4b, .flags = I2C_M_RD, .len = 1, .buf = &id },
|
||||
{ .addr = i2c_props->addr, .flags = 0, .len = 1, .buf = ® },
|
||||
{ .addr = i2c_props->addr, .flags = I2C_M_RD, .len = 1, .buf = &id },
|
||||
};
|
||||
|
||||
/* detect tda8290 */
|
||||
/* detect tda8295 */
|
||||
if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) {
|
||||
printk(KERN_WARNING "%s: tda8290 couldn't read register 0x%02x\n",
|
||||
printk(KERN_WARNING "%s: couldn't read register 0x%02x\n",
|
||||
__func__, reg);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
@ -870,6 +870,23 @@ static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int stk7700p_pid_filter(struct dvb_usb_adapter *adapter, int index,
|
||||
u16 pid, int onoff)
|
||||
{
|
||||
struct dib0700_state *st = adapter->dev->priv;
|
||||
if (st->is_dib7000pc)
|
||||
return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
|
||||
return dib7000m_pid_filter(adapter->fe, index, pid, onoff);
|
||||
}
|
||||
|
||||
static int stk7700p_pid_filter_ctrl(struct dvb_usb_adapter *adapter, int onoff)
|
||||
{
|
||||
struct dib0700_state *st = adapter->dev->priv;
|
||||
if (st->is_dib7000pc)
|
||||
return dib7000p_pid_filter_ctrl(adapter->fe, onoff);
|
||||
return dib7000m_pid_filter_ctrl(adapter->fe, onoff);
|
||||
}
|
||||
|
||||
static int stk70x0p_pid_filter(struct dvb_usb_adapter *adapter, int index, u16 pid, int onoff)
|
||||
{
|
||||
return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
|
||||
|
@ -1875,8 +1892,8 @@ struct dvb_usb_device_properties dib0700_devices[] = {
|
|||
{
|
||||
.caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
|
||||
.pid_filter_count = 32,
|
||||
.pid_filter = stk70x0p_pid_filter,
|
||||
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl,
|
||||
.pid_filter = stk7700p_pid_filter,
|
||||
.pid_filter_ctrl = stk7700p_pid_filter_ctrl,
|
||||
.frontend_attach = stk7700p_frontend_attach,
|
||||
.tuner_attach = stk7700p_tuner_attach,
|
||||
|
||||
|
|
|
@ -659,7 +659,7 @@ static int lme2510_download_firmware(struct usb_device *dev,
|
|||
}
|
||||
|
||||
/* Default firmware for LME2510C */
|
||||
const char lme_firmware[50] = "dvb-usb-lme2510c-s7395.fw";
|
||||
char lme_firmware[50] = "dvb-usb-lme2510c-s7395.fw";
|
||||
|
||||
static void lme_coldreset(struct usb_device *dev)
|
||||
{
|
||||
|
@ -1006,7 +1006,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
|
|||
.caps = DVB_USB_IS_AN_I2C_ADAPTER,
|
||||
.usb_ctrl = DEVICE_SPECIFIC,
|
||||
.download_firmware = lme2510_download_firmware,
|
||||
.firmware = lme_firmware,
|
||||
.firmware = (const char *)&lme_firmware,
|
||||
.size_of_priv = sizeof(struct lme2510_state),
|
||||
.num_adapters = 1,
|
||||
.adapter = {
|
||||
|
@ -1109,5 +1109,5 @@ module_exit(lme2510_module_exit);
|
|||
|
||||
MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
|
||||
MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
|
||||
MODULE_VERSION("1.74");
|
||||
MODULE_VERSION("1.75");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -1285,6 +1285,25 @@ struct i2c_adapter * dib7000m_get_i2c_master(struct dvb_frontend *demod, enum di
|
|||
}
|
||||
EXPORT_SYMBOL(dib7000m_get_i2c_master);
|
||||
|
||||
int dib7000m_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
|
||||
{
|
||||
struct dib7000m_state *state = fe->demodulator_priv;
|
||||
u16 val = dib7000m_read_word(state, 294 + state->reg_offs) & 0xffef;
|
||||
val |= (onoff & 0x1) << 4;
|
||||
dprintk("PID filter enabled %d", onoff);
|
||||
return dib7000m_write_word(state, 294 + state->reg_offs, val);
|
||||
}
|
||||
EXPORT_SYMBOL(dib7000m_pid_filter_ctrl);
|
||||
|
||||
int dib7000m_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
|
||||
{
|
||||
struct dib7000m_state *state = fe->demodulator_priv;
|
||||
dprintk("PID filter: index %x, PID %d, OnOff %d", id, pid, onoff);
|
||||
return dib7000m_write_word(state, 300 + state->reg_offs + id,
|
||||
onoff ? (1 << 13) | pid : 0);
|
||||
}
|
||||
EXPORT_SYMBOL(dib7000m_pid_filter);
|
||||
|
||||
#if 0
|
||||
/* used with some prototype boards */
|
||||
int dib7000m_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods,
|
||||
|
|
|
@ -46,6 +46,8 @@ extern struct dvb_frontend *dib7000m_attach(struct i2c_adapter *i2c_adap,
|
|||
extern struct i2c_adapter *dib7000m_get_i2c_master(struct dvb_frontend *,
|
||||
enum dibx000_i2c_interface,
|
||||
int);
|
||||
extern int dib7000m_pid_filter(struct dvb_frontend *, u8 id, u16 pid, u8 onoff);
|
||||
extern int dib7000m_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff);
|
||||
#else
|
||||
static inline
|
||||
struct dvb_frontend *dib7000m_attach(struct i2c_adapter *i2c_adap,
|
||||
|
@ -63,6 +65,19 @@ struct i2c_adapter *dib7000m_get_i2c_master(struct dvb_frontend *demod,
|
|||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
||||
return NULL;
|
||||
}
|
||||
static inline int dib7000m_pid_filter(struct dvb_frontend *fe, u8 id,
|
||||
u16 pid, u8 onoff)
|
||||
{
|
||||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int dib7000m_pid_filter_ctrl(struct dvb_frontend *fe,
|
||||
uint8_t onoff)
|
||||
{
|
||||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* TODO
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include <linux/moduleparam.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
|
|
@ -112,7 +112,7 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type)
|
|||
{
|
||||
ktime_t now;
|
||||
s64 delta; /* ns */
|
||||
struct ir_raw_event ev;
|
||||
DEFINE_IR_RAW_EVENT(ev);
|
||||
int rc = 0;
|
||||
|
||||
if (!dev->raw)
|
||||
|
@ -125,7 +125,6 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type)
|
|||
* being called for the first time, note that delta can't
|
||||
* possibly be negative.
|
||||
*/
|
||||
ev.duration = 0;
|
||||
if (delta > IR_MAX_DURATION || !dev->raw->last_type)
|
||||
type |= IR_START_EVENT;
|
||||
else
|
||||
|
|
|
@ -148,6 +148,7 @@ enum mceusb_model_type {
|
|||
MCE_GEN2_TX_INV,
|
||||
POLARIS_EVK,
|
||||
CX_HYBRID_TV,
|
||||
MULTIFUNCTION,
|
||||
};
|
||||
|
||||
struct mceusb_model {
|
||||
|
@ -155,9 +156,10 @@ struct mceusb_model {
|
|||
u32 mce_gen2:1;
|
||||
u32 mce_gen3:1;
|
||||
u32 tx_mask_normal:1;
|
||||
u32 is_polaris:1;
|
||||
u32 no_tx:1;
|
||||
|
||||
int ir_intfnum;
|
||||
|
||||
const char *rc_map; /* Allow specify a per-board map */
|
||||
const char *name; /* per-board name */
|
||||
};
|
||||
|
@ -179,7 +181,6 @@ static const struct mceusb_model mceusb_model[] = {
|
|||
.tx_mask_normal = 1,
|
||||
},
|
||||
[POLARIS_EVK] = {
|
||||
.is_polaris = 1,
|
||||
/*
|
||||
* In fact, the EVK is shipped without
|
||||
* remotes, but we should have something handy,
|
||||
|
@ -189,10 +190,13 @@ static const struct mceusb_model mceusb_model[] = {
|
|||
.name = "Conexant Hybrid TV (cx231xx) MCE IR",
|
||||
},
|
||||
[CX_HYBRID_TV] = {
|
||||
.is_polaris = 1,
|
||||
.no_tx = 1, /* tx isn't wired up at all */
|
||||
.name = "Conexant Hybrid TV (cx231xx) MCE IR",
|
||||
},
|
||||
[MULTIFUNCTION] = {
|
||||
.mce_gen2 = 1,
|
||||
.ir_intfnum = 2,
|
||||
},
|
||||
};
|
||||
|
||||
static struct usb_device_id mceusb_dev_table[] = {
|
||||
|
@ -216,8 +220,9 @@ static struct usb_device_id mceusb_dev_table[] = {
|
|||
{ USB_DEVICE(VENDOR_PHILIPS, 0x206c) },
|
||||
/* Philips/Spinel plus IR transceiver for ASUS */
|
||||
{ USB_DEVICE(VENDOR_PHILIPS, 0x2088) },
|
||||
/* Realtek MCE IR Receiver */
|
||||
{ USB_DEVICE(VENDOR_REALTEK, 0x0161) },
|
||||
/* Realtek MCE IR Receiver and card reader */
|
||||
{ USB_DEVICE(VENDOR_REALTEK, 0x0161),
|
||||
.driver_info = MULTIFUNCTION },
|
||||
/* SMK/Toshiba G83C0004D410 */
|
||||
{ USB_DEVICE(VENDOR_SMK, 0x031d),
|
||||
.driver_info = MCE_GEN2_TX_INV },
|
||||
|
@ -1101,7 +1106,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
|
|||
bool is_gen3;
|
||||
bool is_microsoft_gen1;
|
||||
bool tx_mask_normal;
|
||||
bool is_polaris;
|
||||
int ir_intfnum;
|
||||
|
||||
dev_dbg(&intf->dev, "%s called\n", __func__);
|
||||
|
||||
|
@ -1110,13 +1115,11 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
|
|||
is_gen3 = mceusb_model[model].mce_gen3;
|
||||
is_microsoft_gen1 = mceusb_model[model].mce_gen1;
|
||||
tx_mask_normal = mceusb_model[model].tx_mask_normal;
|
||||
is_polaris = mceusb_model[model].is_polaris;
|
||||
ir_intfnum = mceusb_model[model].ir_intfnum;
|
||||
|
||||
if (is_polaris) {
|
||||
/* Interface 0 is IR */
|
||||
if (idesc->desc.bInterfaceNumber)
|
||||
return -ENODEV;
|
||||
}
|
||||
/* There are multi-function devices with non-IR interfaces */
|
||||
if (idesc->desc.bInterfaceNumber != ir_intfnum)
|
||||
return -ENODEV;
|
||||
|
||||
/* step through the endpoints to find first bulk in and out endpoint */
|
||||
for (i = 0; i < idesc->desc.bNumEndpoints; ++i) {
|
||||
|
|
|
@ -385,8 +385,9 @@ static void nvt_cir_regs_init(struct nvt_dev *nvt)
|
|||
|
||||
static void nvt_cir_wake_regs_init(struct nvt_dev *nvt)
|
||||
{
|
||||
/* set number of bytes needed for wake key comparison (default 67) */
|
||||
nvt_cir_wake_reg_write(nvt, CIR_WAKE_FIFO_LEN, CIR_WAKE_FIFO_CMP_DEEP);
|
||||
/* set number of bytes needed for wake from s3 (default 65) */
|
||||
nvt_cir_wake_reg_write(nvt, CIR_WAKE_FIFO_CMP_BYTES,
|
||||
CIR_WAKE_FIFO_CMP_DEEP);
|
||||
|
||||
/* set tolerance/variance allowed per byte during wake compare */
|
||||
nvt_cir_wake_reg_write(nvt, CIR_WAKE_CMP_TOLERANCE,
|
||||
|
|
|
@ -305,8 +305,11 @@ struct nvt_dev {
|
|||
#define CIR_WAKE_IRFIFOSTS_RX_EMPTY 0x20
|
||||
#define CIR_WAKE_IRFIFOSTS_RX_FULL 0x10
|
||||
|
||||
/* CIR Wake FIFO buffer is 67 bytes long */
|
||||
#define CIR_WAKE_FIFO_LEN 67
|
||||
/*
|
||||
* The CIR Wake FIFO buffer is 67 bytes long, but the stock remote wakes
|
||||
* the system comparing only 65 bytes (fails with this set to 67)
|
||||
*/
|
||||
#define CIR_WAKE_FIFO_CMP_BYTES 65
|
||||
/* CIR Wake byte comparison tolerance */
|
||||
#define CIR_WAKE_CMP_TOLERANCE 5
|
||||
|
||||
|
|
|
@ -850,7 +850,7 @@ static ssize_t store_protocols(struct device *device,
|
|||
count++;
|
||||
} else {
|
||||
for (i = 0; i < ARRAY_SIZE(proto_names); i++) {
|
||||
if (!strncasecmp(tmp, proto_names[i].name, strlen(proto_names[i].name))) {
|
||||
if (!strcasecmp(tmp, proto_names[i].name)) {
|
||||
tmp += strlen(proto_names[i].name);
|
||||
mask = proto_names[i].type;
|
||||
break;
|
||||
|
|
|
@ -1758,7 +1758,12 @@ static int vidioc_reqbufs(struct file *file, void *priv,
|
|||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
return videobuf_reqbufs(&fh->vb_vidq, rb);
|
||||
if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
rc = videobuf_reqbufs(&fh->vb_vidq, rb);
|
||||
else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
|
||||
rc = videobuf_reqbufs(&fh->vb_vbiq, rb);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int vidioc_querybuf(struct file *file, void *priv,
|
||||
|
@ -1772,7 +1777,12 @@ static int vidioc_querybuf(struct file *file, void *priv,
|
|||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
return videobuf_querybuf(&fh->vb_vidq, b);
|
||||
if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
rc = videobuf_querybuf(&fh->vb_vidq, b);
|
||||
else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
|
||||
rc = videobuf_querybuf(&fh->vb_vbiq, b);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
|
||||
|
@ -1785,7 +1795,12 @@ static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
|
|||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
return videobuf_qbuf(&fh->vb_vidq, b);
|
||||
if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
rc = videobuf_qbuf(&fh->vb_vidq, b);
|
||||
else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
|
||||
rc = videobuf_qbuf(&fh->vb_vbiq, b);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
|
||||
|
@ -1806,7 +1821,12 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
|
|||
dev->greenscreen_detected = 0;
|
||||
}
|
||||
|
||||
return videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
|
||||
if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
rc = videobuf_dqbuf(&fh->vb_vidq, b, file->f_flags & O_NONBLOCK);
|
||||
else if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
|
||||
rc = videobuf_dqbuf(&fh->vb_vbiq, b, file->f_flags & O_NONBLOCK);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static struct v4l2_file_operations au0828_v4l_fops = {
|
||||
|
|
|
@ -95,6 +95,53 @@ static const struct cx18_card cx18_card_hvr1600_esmt = {
|
|||
.i2c = &cx18_i2c_std,
|
||||
};
|
||||
|
||||
static const struct cx18_card cx18_card_hvr1600_s5h1411 = {
|
||||
.type = CX18_CARD_HVR_1600_S5H1411,
|
||||
.name = "Hauppauge HVR-1600",
|
||||
.comment = "Simultaneous Digital and Analog TV capture supported\n",
|
||||
.v4l2_capabilities = CX18_CAP_ENCODER,
|
||||
.hw_audio_ctrl = CX18_HW_418_AV,
|
||||
.hw_muxer = CX18_HW_CS5345,
|
||||
.hw_all = CX18_HW_TVEEPROM | CX18_HW_418_AV | CX18_HW_TUNER |
|
||||
CX18_HW_CS5345 | CX18_HW_DVB | CX18_HW_GPIO_RESET_CTRL |
|
||||
CX18_HW_Z8F0811_IR_HAUP,
|
||||
.video_inputs = {
|
||||
{ CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 },
|
||||
{ CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 },
|
||||
{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 },
|
||||
{ CX18_CARD_INPUT_SVIDEO2, 2, CX18_AV_SVIDEO2 },
|
||||
{ CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 },
|
||||
},
|
||||
.audio_inputs = {
|
||||
{ CX18_CARD_INPUT_AUD_TUNER,
|
||||
CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 },
|
||||
{ CX18_CARD_INPUT_LINE_IN1,
|
||||
CX18_AV_AUDIO_SERIAL1, CS5345_IN_2 },
|
||||
{ CX18_CARD_INPUT_LINE_IN2,
|
||||
CX18_AV_AUDIO_SERIAL1, CS5345_IN_3 },
|
||||
},
|
||||
.radio_input = { CX18_CARD_INPUT_AUD_TUNER,
|
||||
CX18_AV_AUDIO_SERIAL1, CS5345_IN_4 },
|
||||
.ddr = {
|
||||
/* ESMT M13S128324A-5B memory */
|
||||
.chip_config = 0x003,
|
||||
.refresh = 0x30c,
|
||||
.timing1 = 0x44220e82,
|
||||
.timing2 = 0x08,
|
||||
.tune_lane = 0,
|
||||
.initial_emrs = 0,
|
||||
},
|
||||
.gpio_init.initial_value = 0x3001,
|
||||
.gpio_init.direction = 0x3001,
|
||||
.gpio_i2c_slave_reset = {
|
||||
.active_lo_mask = 0x3001,
|
||||
.msecs_asserted = 10,
|
||||
.msecs_recovery = 40,
|
||||
.ir_reset_mask = 0x0001,
|
||||
},
|
||||
.i2c = &cx18_i2c_std,
|
||||
};
|
||||
|
||||
static const struct cx18_card cx18_card_hvr1600_samsung = {
|
||||
.type = CX18_CARD_HVR_1600_SAMSUNG,
|
||||
.name = "Hauppauge HVR-1600 (Preproduction)",
|
||||
|
@ -523,7 +570,8 @@ static const struct cx18_card *cx18_card_list[] = {
|
|||
&cx18_card_toshiba_qosmio_dvbt,
|
||||
&cx18_card_leadtek_pvr2100,
|
||||
&cx18_card_leadtek_dvr3100h,
|
||||
&cx18_card_gotview_dvd3
|
||||
&cx18_card_gotview_dvd3,
|
||||
&cx18_card_hvr1600_s5h1411
|
||||
};
|
||||
|
||||
const struct cx18_card *cx18_get_card(u16 index)
|
||||
|
|
|
@ -157,6 +157,7 @@ MODULE_PARM_DESC(cardtype,
|
|||
"\t\t\t 7 = Leadtek WinFast PVR2100\n"
|
||||
"\t\t\t 8 = Leadtek WinFast DVR3100 H\n"
|
||||
"\t\t\t 9 = GoTView PCI DVD3 Hybrid\n"
|
||||
"\t\t\t 10 = Hauppauge HVR 1600 (S5H1411)\n"
|
||||
"\t\t\t 0 = Autodetect (default)\n"
|
||||
"\t\t\t-1 = Ignore this card\n\t\t");
|
||||
MODULE_PARM_DESC(pal, "Set PAL standard: B, G, H, D, K, I, M, N, Nc, 60");
|
||||
|
@ -337,6 +338,7 @@ void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv)
|
|||
switch (cx->card->type) {
|
||||
case CX18_CARD_HVR_1600_ESMT:
|
||||
case CX18_CARD_HVR_1600_SAMSUNG:
|
||||
case CX18_CARD_HVR_1600_S5H1411:
|
||||
tveeprom_hauppauge_analog(&c, tv, eedata);
|
||||
break;
|
||||
case CX18_CARD_YUAN_MPC718:
|
||||
|
@ -365,7 +367,25 @@ static void cx18_process_eeprom(struct cx18 *cx)
|
|||
from the model number. Use the cardtype module option if you
|
||||
have one of these preproduction models. */
|
||||
switch (tv.model) {
|
||||
case 74000 ... 74999:
|
||||
case 74301: /* Retail models */
|
||||
case 74321:
|
||||
case 74351: /* OEM models */
|
||||
case 74361:
|
||||
/* Digital side is s5h1411/tda18271 */
|
||||
cx->card = cx18_get_card(CX18_CARD_HVR_1600_S5H1411);
|
||||
break;
|
||||
case 74021: /* Retail models */
|
||||
case 74031:
|
||||
case 74041:
|
||||
case 74141:
|
||||
case 74541: /* OEM models */
|
||||
case 74551:
|
||||
case 74591:
|
||||
case 74651:
|
||||
case 74691:
|
||||
case 74751:
|
||||
case 74891:
|
||||
/* Digital side is s5h1409/mxl5005s */
|
||||
cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT);
|
||||
break;
|
||||
case 0x718:
|
||||
|
@ -377,7 +397,8 @@ static void cx18_process_eeprom(struct cx18 *cx)
|
|||
CX18_ERR("Invalid EEPROM\n");
|
||||
return;
|
||||
default:
|
||||
CX18_ERR("Unknown model %d, defaulting to HVR-1600\n", tv.model);
|
||||
CX18_ERR("Unknown model %d, defaulting to original HVR-1600 "
|
||||
"(cardtype=1)\n", tv.model);
|
||||
cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -85,7 +85,8 @@
|
|||
#define CX18_CARD_LEADTEK_PVR2100 6 /* Leadtek WinFast PVR2100 */
|
||||
#define CX18_CARD_LEADTEK_DVR3100H 7 /* Leadtek WinFast DVR3100 H */
|
||||
#define CX18_CARD_GOTVIEW_PCI_DVD3 8 /* GoTView PCI DVD3 Hybrid */
|
||||
#define CX18_CARD_LAST 8
|
||||
#define CX18_CARD_HVR_1600_S5H1411 9 /* Hauppauge HVR 1600 s5h1411/tda18271*/
|
||||
#define CX18_CARD_LAST 9
|
||||
|
||||
#define CX18_ENC_STREAM_TYPE_MPG 0
|
||||
#define CX18_ENC_STREAM_TYPE_TS 1
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
#include "cx18-gpio.h"
|
||||
#include "s5h1409.h"
|
||||
#include "mxl5005s.h"
|
||||
#include "s5h1411.h"
|
||||
#include "tda18271.h"
|
||||
#include "zl10353.h"
|
||||
|
||||
#include <linux/firmware.h>
|
||||
|
@ -76,6 +78,32 @@ static struct s5h1409_config hauppauge_hvr1600_config = {
|
|||
.hvr1600_opt = S5H1409_HVR1600_OPTIMIZE
|
||||
};
|
||||
|
||||
/*
|
||||
* CX18_CARD_HVR_1600_S5H1411
|
||||
*/
|
||||
static struct s5h1411_config hcw_s5h1411_config = {
|
||||
.output_mode = S5H1411_SERIAL_OUTPUT,
|
||||
.gpio = S5H1411_GPIO_OFF,
|
||||
.vsb_if = S5H1411_IF_44000,
|
||||
.qam_if = S5H1411_IF_4000,
|
||||
.inversion = S5H1411_INVERSION_ON,
|
||||
.status_mode = S5H1411_DEMODLOCKING,
|
||||
.mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
|
||||
};
|
||||
|
||||
static struct tda18271_std_map hauppauge_tda18271_std_map = {
|
||||
.atsc_6 = { .if_freq = 5380, .agc_mode = 3, .std = 3,
|
||||
.if_lvl = 6, .rfagc_top = 0x37 },
|
||||
.qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 0,
|
||||
.if_lvl = 6, .rfagc_top = 0x37 },
|
||||
};
|
||||
|
||||
static struct tda18271_config hauppauge_tda18271_config = {
|
||||
.std_map = &hauppauge_tda18271_std_map,
|
||||
.gate = TDA18271_GATE_DIGITAL,
|
||||
.output_opt = TDA18271_OUTPUT_LT_OFF,
|
||||
};
|
||||
|
||||
/*
|
||||
* CX18_CARD_LEADTEK_DVR3100H
|
||||
*/
|
||||
|
@ -244,6 +272,7 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed)
|
|||
switch (cx->card->type) {
|
||||
case CX18_CARD_HVR_1600_ESMT:
|
||||
case CX18_CARD_HVR_1600_SAMSUNG:
|
||||
case CX18_CARD_HVR_1600_S5H1411:
|
||||
v = cx18_read_reg(cx, CX18_REG_DMUX_NUM_PORT_0_CONTROL);
|
||||
v |= 0x00400000; /* Serial Mode */
|
||||
v |= 0x00002000; /* Data Length - Byte */
|
||||
|
@ -455,6 +484,15 @@ static int dvb_register(struct cx18_stream *stream)
|
|||
ret = 0;
|
||||
}
|
||||
break;
|
||||
case CX18_CARD_HVR_1600_S5H1411:
|
||||
dvb->fe = dvb_attach(s5h1411_attach,
|
||||
&hcw_s5h1411_config,
|
||||
&cx->i2c_adap[0]);
|
||||
if (dvb->fe != NULL)
|
||||
dvb_attach(tda18271_attach, dvb->fe,
|
||||
0x60, &cx->i2c_adap[0],
|
||||
&hauppauge_tda18271_config);
|
||||
break;
|
||||
case CX18_CARD_LEADTEK_DVR3100H:
|
||||
dvb->fe = dvb_attach(zl10353_attach,
|
||||
&leadtek_dvr3100h_demod,
|
||||
|
|
|
@ -122,10 +122,6 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap,
|
|||
|
||||
if (!i2c_wait_done(i2c_adap))
|
||||
goto eio;
|
||||
if (!i2c_slave_did_ack(i2c_adap)) {
|
||||
retval = -ENXIO;
|
||||
goto err;
|
||||
}
|
||||
if (i2c_debug) {
|
||||
printk(" <W %02x %02x", msg->addr << 1, msg->buf[0]);
|
||||
if (!(ctrl & I2C_NOSTOP))
|
||||
|
@ -158,7 +154,6 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap,
|
|||
|
||||
eio:
|
||||
retval = -EIO;
|
||||
err:
|
||||
if (i2c_debug)
|
||||
printk(KERN_ERR " ERR: %d\n", retval);
|
||||
return retval;
|
||||
|
@ -209,10 +204,6 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap,
|
|||
|
||||
if (!i2c_wait_done(i2c_adap))
|
||||
goto eio;
|
||||
if (cnt == 0 && !i2c_slave_did_ack(i2c_adap)) {
|
||||
retval = -ENXIO;
|
||||
goto err;
|
||||
}
|
||||
msg->buf[cnt] = cx_read(bus->reg_rdata) & 0xff;
|
||||
if (i2c_debug) {
|
||||
dprintk(1, " %02x", msg->buf[cnt]);
|
||||
|
@ -224,7 +215,6 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap,
|
|||
|
||||
eio:
|
||||
retval = -EIO;
|
||||
err:
|
||||
if (i2c_debug)
|
||||
printk(KERN_ERR " ERR: %d\n", retval);
|
||||
return retval;
|
||||
|
|
|
@ -2015,7 +2015,8 @@ static int cx25840_probe(struct i2c_client *client,
|
|||
kfree(state);
|
||||
return err;
|
||||
}
|
||||
v4l2_ctrl_cluster(2, &state->volume);
|
||||
if (!is_cx2583x(state))
|
||||
v4l2_ctrl_cluster(2, &state->volume);
|
||||
v4l2_ctrl_handler_setup(&state->hdl);
|
||||
|
||||
if (client->dev.platform_data) {
|
||||
|
|
|
@ -628,22 +628,66 @@ static void ivtv_irq_enc_pio_complete(struct ivtv *itv)
|
|||
static void ivtv_irq_dma_err(struct ivtv *itv)
|
||||
{
|
||||
u32 data[CX2341X_MBOX_MAX_DATA];
|
||||
u32 status;
|
||||
|
||||
del_timer(&itv->dma_timer);
|
||||
|
||||
ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data);
|
||||
status = read_reg(IVTV_REG_DMASTATUS);
|
||||
IVTV_DEBUG_WARN("DMA ERROR %08x %08x %08x %d\n", data[0], data[1],
|
||||
read_reg(IVTV_REG_DMASTATUS), itv->cur_dma_stream);
|
||||
write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
|
||||
status, itv->cur_dma_stream);
|
||||
/*
|
||||
* We do *not* write back to the IVTV_REG_DMASTATUS register to
|
||||
* clear the error status, if either the encoder write (0x02) or
|
||||
* decoder read (0x01) bus master DMA operation do not indicate
|
||||
* completed. We can race with the DMA engine, which may have
|
||||
* transitioned to completed status *after* we read the register.
|
||||
* Setting a IVTV_REG_DMASTATUS flag back to "busy" status, after the
|
||||
* DMA engine has completed, will cause the DMA engine to stop working.
|
||||
*/
|
||||
status &= 0x3;
|
||||
if (status == 0x3)
|
||||
write_reg(status, IVTV_REG_DMASTATUS);
|
||||
|
||||
if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) &&
|
||||
itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) {
|
||||
struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream];
|
||||
|
||||
/* retry */
|
||||
if (s->type >= IVTV_DEC_STREAM_TYPE_MPG)
|
||||
if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) {
|
||||
/* retry */
|
||||
/*
|
||||
* FIXME - handle cases of DMA error similar to
|
||||
* encoder below, except conditioned on status & 0x1
|
||||
*/
|
||||
ivtv_dma_dec_start(s);
|
||||
else
|
||||
ivtv_dma_enc_start(s);
|
||||
return;
|
||||
return;
|
||||
} else {
|
||||
if ((status & 0x2) == 0) {
|
||||
/*
|
||||
* CX2341x Bus Master DMA write is ongoing.
|
||||
* Reset the timer and let it complete.
|
||||
*/
|
||||
itv->dma_timer.expires =
|
||||
jiffies + msecs_to_jiffies(600);
|
||||
add_timer(&itv->dma_timer);
|
||||
return;
|
||||
}
|
||||
|
||||
if (itv->dma_retries < 3) {
|
||||
/*
|
||||
* CX2341x Bus Master DMA write has ended.
|
||||
* Retry the write, starting with the first
|
||||
* xfer segment. Just retrying the current
|
||||
* segment is not sufficient.
|
||||
*/
|
||||
s->sg_processed = 0;
|
||||
itv->dma_retries++;
|
||||
ivtv_dma_enc_start_xfer(s);
|
||||
return;
|
||||
}
|
||||
/* Too many retries, give up on this one */
|
||||
}
|
||||
|
||||
}
|
||||
if (test_bit(IVTV_F_I_UDMA, &itv->i_flags)) {
|
||||
ivtv_udma_start(itv);
|
||||
|
|
|
@ -1011,7 +1011,6 @@ static int m2mtest_remove(struct platform_device *pdev)
|
|||
v4l2_m2m_release(dev->m2m_dev);
|
||||
del_timer_sync(&dev->timer);
|
||||
video_unregister_device(dev->vfd);
|
||||
video_device_release(dev->vfd);
|
||||
v4l2_device_unregister(&dev->v4l2_dev);
|
||||
kfree(dev);
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@
|
|||
#include <linux/usb.h>
|
||||
|
||||
#define S2255_MAJOR_VERSION 1
|
||||
#define S2255_MINOR_VERSION 20
|
||||
#define S2255_MINOR_VERSION 21
|
||||
#define S2255_RELEASE 0
|
||||
#define S2255_VERSION KERNEL_VERSION(S2255_MAJOR_VERSION, \
|
||||
S2255_MINOR_VERSION, \
|
||||
|
@ -312,9 +312,9 @@ struct s2255_fh {
|
|||
};
|
||||
|
||||
/* current cypress EEPROM firmware version */
|
||||
#define S2255_CUR_USB_FWVER ((3 << 8) | 6)
|
||||
#define S2255_CUR_USB_FWVER ((3 << 8) | 11)
|
||||
/* current DSP FW version */
|
||||
#define S2255_CUR_DSP_FWVER 8
|
||||
#define S2255_CUR_DSP_FWVER 10102
|
||||
/* Need DSP version 5+ for video status feature */
|
||||
#define S2255_MIN_DSP_STATUS 5
|
||||
#define S2255_MIN_DSP_COLORFILTER 8
|
||||
|
@ -492,9 +492,11 @@ static void planar422p_to_yuv_packed(const unsigned char *in,
|
|||
|
||||
static void s2255_reset_dsppower(struct s2255_dev *dev)
|
||||
{
|
||||
s2255_vendor_req(dev, 0x40, 0x0b0b, 0x0b0b, NULL, 0, 1);
|
||||
s2255_vendor_req(dev, 0x40, 0x0b0b, 0x0b01, NULL, 0, 1);
|
||||
msleep(10);
|
||||
s2255_vendor_req(dev, 0x50, 0x0000, 0x0000, NULL, 0, 1);
|
||||
msleep(600);
|
||||
s2255_vendor_req(dev, 0x10, 0x0000, 0x0000, NULL, 0, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue