Commit 91797466 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 4c418ba9 a4e36e60
...@@ -658,13 +658,13 @@ static int tda8290_probe(struct tuner_i2c_props *i2c_props) ...@@ -658,13 +658,13 @@ static int tda8290_probe(struct tuner_i2c_props *i2c_props)
#define TDA8290_ID 0x89 #define TDA8290_ID 0x89
u8 reg = 0x1f, id; u8 reg = 0x1f, id;
struct i2c_msg msg_read[] = { struct i2c_msg msg_read[] = {
{ .addr = 0x4b, .flags = 0, .len = 1, .buf = &reg }, { .addr = i2c_props->addr, .flags = 0, .len = 1, .buf = &reg },
{ .addr = 0x4b, .flags = I2C_M_RD, .len = 1, .buf = &id }, { .addr = i2c_props->addr, .flags = I2C_M_RD, .len = 1, .buf = &id },
}; };
/* detect tda8290 */ /* detect tda8290 */
if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) { 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); __func__, reg);
return -ENODEV; return -ENODEV;
} }
...@@ -685,13 +685,13 @@ static int tda8295_probe(struct tuner_i2c_props *i2c_props) ...@@ -685,13 +685,13 @@ static int tda8295_probe(struct tuner_i2c_props *i2c_props)
#define TDA8295C2_ID 0x8b #define TDA8295C2_ID 0x8b
u8 reg = 0x2f, id; u8 reg = 0x2f, id;
struct i2c_msg msg_read[] = { struct i2c_msg msg_read[] = {
{ .addr = 0x4b, .flags = 0, .len = 1, .buf = &reg }, { .addr = i2c_props->addr, .flags = 0, .len = 1, .buf = &reg },
{ .addr = 0x4b, .flags = I2C_M_RD, .len = 1, .buf = &id }, { .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) { 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); __func__, reg);
return -ENODEV; return -ENODEV;
} }
......
...@@ -870,6 +870,23 @@ static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap) ...@@ -870,6 +870,23 @@ static int dib7070p_tuner_attach(struct dvb_usb_adapter *adap)
return 0; 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) 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); return dib7000p_pid_filter(adapter->fe, index, pid, onoff);
...@@ -1875,8 +1892,8 @@ struct dvb_usb_device_properties dib0700_devices[] = { ...@@ -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, .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
.pid_filter_count = 32, .pid_filter_count = 32,
.pid_filter = stk70x0p_pid_filter, .pid_filter = stk7700p_pid_filter,
.pid_filter_ctrl = stk70x0p_pid_filter_ctrl, .pid_filter_ctrl = stk7700p_pid_filter_ctrl,
.frontend_attach = stk7700p_frontend_attach, .frontend_attach = stk7700p_frontend_attach,
.tuner_attach = stk7700p_tuner_attach, .tuner_attach = stk7700p_tuner_attach,
......
...@@ -659,7 +659,7 @@ static int lme2510_download_firmware(struct usb_device *dev, ...@@ -659,7 +659,7 @@ static int lme2510_download_firmware(struct usb_device *dev,
} }
/* Default firmware for LME2510C */ /* 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) static void lme_coldreset(struct usb_device *dev)
{ {
...@@ -1006,7 +1006,7 @@ static struct dvb_usb_device_properties lme2510c_properties = { ...@@ -1006,7 +1006,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
.caps = DVB_USB_IS_AN_I2C_ADAPTER, .caps = DVB_USB_IS_AN_I2C_ADAPTER,
.usb_ctrl = DEVICE_SPECIFIC, .usb_ctrl = DEVICE_SPECIFIC,
.download_firmware = lme2510_download_firmware, .download_firmware = lme2510_download_firmware,
.firmware = lme_firmware, .firmware = (const char *)&lme_firmware,
.size_of_priv = sizeof(struct lme2510_state), .size_of_priv = sizeof(struct lme2510_state),
.num_adapters = 1, .num_adapters = 1,
.adapter = { .adapter = {
...@@ -1109,5 +1109,5 @@ module_exit(lme2510_module_exit); ...@@ -1109,5 +1109,5 @@ module_exit(lme2510_module_exit);
MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0"); MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
MODULE_VERSION("1.74"); MODULE_VERSION("1.75");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -1285,6 +1285,25 @@ struct i2c_adapter * dib7000m_get_i2c_master(struct dvb_frontend *demod, enum di ...@@ -1285,6 +1285,25 @@ struct i2c_adapter * dib7000m_get_i2c_master(struct dvb_frontend *demod, enum di
} }
EXPORT_SYMBOL(dib7000m_get_i2c_master); 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 #if 0
/* used with some prototype boards */ /* used with some prototype boards */
int dib7000m_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, 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, ...@@ -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 *, extern struct i2c_adapter *dib7000m_get_i2c_master(struct dvb_frontend *,
enum dibx000_i2c_interface, enum dibx000_i2c_interface,
int); 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 #else
static inline static inline
struct dvb_frontend *dib7000m_attach(struct i2c_adapter *i2c_adap, 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, ...@@ -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__); printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
return NULL; 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 #endif
/* TODO /* TODO
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/pgtable.h>
#include <asm/page.h> #include <asm/page.h>
#include <linux/kmod.h> #include <linux/kmod.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
......
...@@ -112,7 +112,7 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type) ...@@ -112,7 +112,7 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type)
{ {
ktime_t now; ktime_t now;
s64 delta; /* ns */ s64 delta; /* ns */
struct ir_raw_event ev; DEFINE_IR_RAW_EVENT(ev);
int rc = 0; int rc = 0;
if (!dev->raw) if (!dev->raw)
...@@ -125,7 +125,6 @@ int ir_raw_event_store_edge(struct rc_dev *dev, enum raw_event_type type) ...@@ -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 * being called for the first time, note that delta can't
* possibly be negative. * possibly be negative.
*/ */
ev.duration = 0;
if (delta > IR_MAX_DURATION || !dev->raw->last_type) if (delta > IR_MAX_DURATION || !dev->raw->last_type)
type |= IR_START_EVENT; type |= IR_START_EVENT;
else else
......
...@@ -148,6 +148,7 @@ enum mceusb_model_type { ...@@ -148,6 +148,7 @@ enum mceusb_model_type {
MCE_GEN2_TX_INV, MCE_GEN2_TX_INV,
POLARIS_EVK, POLARIS_EVK,
CX_HYBRID_TV, CX_HYBRID_TV,
MULTIFUNCTION,
}; };
struct mceusb_model { struct mceusb_model {
...@@ -155,9 +156,10 @@ struct mceusb_model { ...@@ -155,9 +156,10 @@ struct mceusb_model {
u32 mce_gen2:1; u32 mce_gen2:1;
u32 mce_gen3:1; u32 mce_gen3:1;
u32 tx_mask_normal:1; u32 tx_mask_normal:1;
u32 is_polaris:1;
u32 no_tx:1; u32 no_tx:1;
int ir_intfnum;
const char *rc_map; /* Allow specify a per-board map */ const char *rc_map; /* Allow specify a per-board map */
const char *name; /* per-board name */ const char *name; /* per-board name */
}; };
...@@ -179,7 +181,6 @@ static const struct mceusb_model mceusb_model[] = { ...@@ -179,7 +181,6 @@ static const struct mceusb_model mceusb_model[] = {
.tx_mask_normal = 1, .tx_mask_normal = 1,
}, },
[POLARIS_EVK] = { [POLARIS_EVK] = {
.is_polaris = 1,
/* /*
* In fact, the EVK is shipped without * In fact, the EVK is shipped without
* remotes, but we should have something handy, * remotes, but we should have something handy,
...@@ -189,10 +190,13 @@ static const struct mceusb_model mceusb_model[] = { ...@@ -189,10 +190,13 @@ static const struct mceusb_model mceusb_model[] = {
.name = "Conexant Hybrid TV (cx231xx) MCE IR", .name = "Conexant Hybrid TV (cx231xx) MCE IR",
}, },
[CX_HYBRID_TV] = { [CX_HYBRID_TV] = {
.is_polaris = 1,
.no_tx = 1, /* tx isn't wired up at all */ .no_tx = 1, /* tx isn't wired up at all */
.name = "Conexant Hybrid TV (cx231xx) MCE IR", .name = "Conexant Hybrid TV (cx231xx) MCE IR",
}, },
[MULTIFUNCTION] = {
.mce_gen2 = 1,
.ir_intfnum = 2,
},
}; };
static struct usb_device_id mceusb_dev_table[] = { static struct usb_device_id mceusb_dev_table[] = {
...@@ -216,8 +220,9 @@ 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) }, { USB_DEVICE(VENDOR_PHILIPS, 0x206c) },
/* Philips/Spinel plus IR transceiver for ASUS */ /* Philips/Spinel plus IR transceiver for ASUS */
{ USB_DEVICE(VENDOR_PHILIPS, 0x2088) }, { USB_DEVICE(VENDOR_PHILIPS, 0x2088) },
/* Realtek MCE IR Receiver */ /* Realtek MCE IR Receiver and card reader */
{ USB_DEVICE(VENDOR_REALTEK, 0x0161) }, { USB_DEVICE(VENDOR_REALTEK, 0x0161),
.driver_info = MULTIFUNCTION },
/* SMK/Toshiba G83C0004D410 */ /* SMK/Toshiba G83C0004D410 */
{ USB_DEVICE(VENDOR_SMK, 0x031d), { USB_DEVICE(VENDOR_SMK, 0x031d),
.driver_info = MCE_GEN2_TX_INV }, .driver_info = MCE_GEN2_TX_INV },
...@@ -1101,7 +1106,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, ...@@ -1101,7 +1106,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
bool is_gen3; bool is_gen3;
bool is_microsoft_gen1; bool is_microsoft_gen1;
bool tx_mask_normal; bool tx_mask_normal;
bool is_polaris; int ir_intfnum;
dev_dbg(&intf->dev, "%s called\n", __func__); dev_dbg(&intf->dev, "%s called\n", __func__);
...@@ -1110,13 +1115,11 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf, ...@@ -1110,13 +1115,11 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
is_gen3 = mceusb_model[model].mce_gen3; is_gen3 = mceusb_model[model].mce_gen3;
is_microsoft_gen1 = mceusb_model[model].mce_gen1; is_microsoft_gen1 = mceusb_model[model].mce_gen1;
tx_mask_normal = mceusb_model[model].tx_mask_normal; 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) { /* There are multi-function devices with non-IR interfaces */
/* Interface 0 is IR */ if (idesc->desc.bInterfaceNumber != ir_intfnum)
if (idesc->desc.bInterfaceNumber)
return -ENODEV; return -ENODEV;
}
/* step through the endpoints to find first bulk in and out endpoint */ /* step through the endpoints to find first bulk in and out endpoint */
for (i = 0; i < idesc->desc.bNumEndpoints; ++i) { for (i = 0; i < idesc->desc.bNumEndpoints; ++i) {
......
...@@ -385,8 +385,9 @@ static void nvt_cir_regs_init(struct nvt_dev *nvt) ...@@ -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) static void nvt_cir_wake_regs_init(struct nvt_dev *nvt)
{ {
/* set number of bytes needed for wake key comparison (default 67) */ /* set number of bytes needed for wake from s3 (default 65) */
nvt_cir_wake_reg_write(nvt, CIR_WAKE_FIFO_LEN, CIR_WAKE_FIFO_CMP_DEEP); 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 */ /* set tolerance/variance allowed per byte during wake compare */
nvt_cir_wake_reg_write(nvt, CIR_WAKE_CMP_TOLERANCE, nvt_cir_wake_reg_write(nvt, CIR_WAKE_CMP_TOLERANCE,
......
...@@ -305,8 +305,11 @@ struct nvt_dev { ...@@ -305,8 +305,11 @@ struct nvt_dev {
#define CIR_WAKE_IRFIFOSTS_RX_EMPTY 0x20 #define CIR_WAKE_IRFIFOSTS_RX_EMPTY 0x20
#define CIR_WAKE_IRFIFOSTS_RX_FULL 0x10 #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 */ /* CIR Wake byte comparison tolerance */
#define CIR_WAKE_CMP_TOLERANCE 5 #define CIR_WAKE_CMP_TOLERANCE 5
......
...@@ -850,7 +850,7 @@ static ssize_t store_protocols(struct device *device, ...@@ -850,7 +850,7 @@ static ssize_t store_protocols(struct device *device,
count++; count++;
} else { } else {
for (i = 0; i < ARRAY_SIZE(proto_names); i++) { 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); tmp += strlen(proto_names[i].name);
mask = proto_names[i].type; mask = proto_names[i].type;
break; break;
......
...@@ -1758,7 +1758,12 @@ static int vidioc_reqbufs(struct file *file, void *priv, ...@@ -1758,7 +1758,12 @@ static int vidioc_reqbufs(struct file *file, void *priv,
if (rc < 0) if (rc < 0)
return rc; 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, static int vidioc_querybuf(struct file *file, void *priv,
...@@ -1772,7 +1777,12 @@ 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) if (rc < 0)
return rc; 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) 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) ...@@ -1785,7 +1795,12 @@ static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
if (rc < 0) if (rc < 0)
return rc; 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) 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) ...@@ -1806,7 +1821,12 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
dev->greenscreen_detected = 0; 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 = { static struct v4l2_file_operations au0828_v4l_fops = {
......
...@@ -95,6 +95,53 @@ static const struct cx18_card cx18_card_hvr1600_esmt = { ...@@ -95,6 +95,53 @@ static const struct cx18_card cx18_card_hvr1600_esmt = {
.i2c = &cx18_i2c_std, .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 = { static const struct cx18_card cx18_card_hvr1600_samsung = {
.type = CX18_CARD_HVR_1600_SAMSUNG, .type = CX18_CARD_HVR_1600_SAMSUNG,
.name = "Hauppauge HVR-1600 (Preproduction)", .name = "Hauppauge HVR-1600 (Preproduction)",
...@@ -523,7 +570,8 @@ static const struct cx18_card *cx18_card_list[] = { ...@@ -523,7 +570,8 @@ static const struct cx18_card *cx18_card_list[] = {
&cx18_card_toshiba_qosmio_dvbt, &cx18_card_toshiba_qosmio_dvbt,
&cx18_card_leadtek_pvr2100, &cx18_card_leadtek_pvr2100,
&cx18_card_leadtek_dvr3100h, &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) const struct cx18_card *cx18_get_card(u16 index)
......
...@@ -157,6 +157,7 @@ MODULE_PARM_DESC(cardtype, ...@@ -157,6 +157,7 @@ MODULE_PARM_DESC(cardtype,
"\t\t\t 7 = Leadtek WinFast PVR2100\n" "\t\t\t 7 = Leadtek WinFast PVR2100\n"
"\t\t\t 8 = Leadtek WinFast DVR3100 H\n" "\t\t\t 8 = Leadtek WinFast DVR3100 H\n"
"\t\t\t 9 = GoTView PCI DVD3 Hybrid\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 0 = Autodetect (default)\n"
"\t\t\t-1 = Ignore this card\n\t\t"); "\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"); 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) ...@@ -337,6 +338,7 @@ void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv)
switch (cx->card->type) { switch (cx->card->type) {
case CX18_CARD_HVR_1600_ESMT: case CX18_CARD_HVR_1600_ESMT:
case CX18_CARD_HVR_1600_SAMSUNG: case CX18_CARD_HVR_1600_SAMSUNG:
case CX18_CARD_HVR_1600_S5H1411:
tveeprom_hauppauge_analog(&c, tv, eedata); tveeprom_hauppauge_analog(&c, tv, eedata);
break; break;
case CX18_CARD_YUAN_MPC718: case CX18_CARD_YUAN_MPC718:
...@@ -365,7 +367,25 @@ static void cx18_process_eeprom(struct cx18 *cx) ...@@ -365,7 +367,25 @@ static void cx18_process_eeprom(struct cx18 *cx)
from the model number. Use the cardtype module option if you from the model number. Use the cardtype module option if you
have one of these preproduction models. */ have one of these preproduction models. */
switch (tv.model) { 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); cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT);
break; break;
case 0x718: case 0x718:
...@@ -377,7 +397,8 @@ static void cx18_process_eeprom(struct cx18 *cx) ...@@ -377,7 +397,8 @@ static void cx18_process_eeprom(struct cx18 *cx)
CX18_ERR("Invalid EEPROM\n"); CX18_ERR("Invalid EEPROM\n");
return; return;
default: 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); cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT);
break; break;
} }
......
...@@ -85,7 +85,8 @@ ...@@ -85,7 +85,8 @@
#define CX18_CARD_LEADTEK_PVR2100 6 /* Leadtek WinFast PVR2100 */ #define CX18_CARD_LEADTEK_PVR2100 6 /* Leadtek WinFast PVR2100 */
#define CX18_CARD_LEADTEK_DVR3100H 7 /* Leadtek WinFast DVR3100 H */ #define CX18_CARD_LEADTEK_DVR3100H 7 /* Leadtek WinFast DVR3100 H */
#define CX18_CARD_GOTVIEW_PCI_DVD3 8 /* GoTView PCI DVD3 Hybrid */ #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_MPG 0
#define CX18_ENC_STREAM_TYPE_TS 1 #define CX18_ENC_STREAM_TYPE_TS 1
......
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
#include "cx18-gpio.h" #include "cx18-gpio.h"
#include "s5h1409.h" #include "s5h1409.h"
#include "mxl5005s.h" #include "mxl5005s.h"
#include "s5h1411.h"
#include "tda18271.h"
#include "zl10353.h" #include "zl10353.h"
#include <linux/firmware.h> #include <linux/firmware.h>
...@@ -76,6 +78,32 @@ static struct s5h1409_config hauppauge_hvr1600_config = { ...@@ -76,6 +78,32 @@ static struct s5h1409_config hauppauge_hvr1600_config = {
.hvr1600_opt = S5H1409_HVR1600_OPTIMIZE .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 * CX18_CARD_LEADTEK_DVR3100H
*/ */
...@@ -244,6 +272,7 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed) ...@@ -244,6 +272,7 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed)
switch (cx->card->type) { switch (cx->card->type) {
case CX18_CARD_HVR_1600_ESMT: case CX18_CARD_HVR_1600_ESMT:
case CX18_CARD_HVR_1600_SAMSUNG: 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 = cx18_read_reg(cx, CX18_REG_DMUX_NUM_PORT_0_CONTROL);
v |= 0x00400000; /* Serial Mode */ v |= 0x00400000; /* Serial Mode */
v |= 0x00002000; /* Data Length - Byte */ v |= 0x00002000; /* Data Length - Byte */
...@@ -455,6 +484,15 @@ static int dvb_register(struct cx18_stream *stream) ...@@ -455,6 +484,15 @@ static int dvb_register(struct cx18_stream *stream)
ret = 0; ret = 0;
} }
break; 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: case CX18_CARD_LEADTEK_DVR3100H:
dvb->fe = dvb_attach(zl10353_attach, dvb->fe = dvb_attach(zl10353_attach,
&leadtek_dvr3100h_demod, &leadtek_dvr3100h_demod,
......
...@@ -122,10 +122,6 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap, ...@@ -122,10 +122,6 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap,
if (!i2c_wait_done(i2c_adap)) if (!i2c_wait_done(i2c_adap))
goto eio; goto eio;
if (!i2c_slave_did_ack(i2c_adap)) {
retval = -ENXIO;
goto err;
}
if (i2c_debug) { if (i2c_debug) {
printk(" <W %02x %02x", msg->addr << 1, msg->buf[0]); printk(" <W %02x %02x", msg->addr << 1, msg->buf[0]);
if (!(ctrl & I2C_NOSTOP)) if (!(ctrl & I2C_NOSTOP))
...@@ -158,7 +154,6 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap, ...@@ -158,7 +154,6 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap,
eio: eio:
retval = -EIO; retval = -EIO;
err:
if (i2c_debug) if (i2c_debug)
printk(KERN_ERR " ERR: %d\n", retval); printk(KERN_ERR " ERR: %d\n", retval);
return retval; return retval;
...@@ -209,10 +204,6 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap, ...@@ -209,10 +204,6 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap,
if (!i2c_wait_done(i2c_adap)) if (!i2c_wait_done(i2c_adap))
goto eio; goto eio;
if (cnt == 0 && !i2c_slave_did_ack(i2c_adap)) {
retval = -ENXIO;
goto err;
}
msg->buf[cnt] = cx_read(bus->reg_rdata) & 0xff; msg->buf[cnt] = cx_read(bus->reg_rdata) & 0xff;
if (i2c_debug) { if (i2c_debug) {
dprintk(1, " %02x", msg->buf[cnt]); dprintk(1, " %02x", msg->buf[cnt]);
...@@ -224,7 +215,6 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap, ...@@ -224,7 +215,6 @@ static int i2c_readbytes(struct i2c_adapter *i2c_adap,
eio: eio:
retval = -EIO; retval = -EIO;
err:
if (i2c_debug) if (i2c_debug)
printk(KERN_ERR " ERR: %d\n", retval); printk(KERN_ERR " ERR: %d\n", retval);
return retval; return retval;
......
...@@ -2015,6 +2015,7 @@ static int cx25840_probe(struct i2c_client *client, ...@@ -2015,6 +2015,7 @@ static int cx25840_probe(struct i2c_client *client,
kfree(state); kfree(state);
return err; return err;
} }
if (!is_cx2583x(state))
v4l2_ctrl_cluster(2, &state->volume); v4l2_ctrl_cluster(2, &state->volume);
v4l2_ctrl_handler_setup(&state->hdl); v4l2_ctrl_handler_setup(&state->hdl);
......
...@@ -628,22 +628,66 @@ static void ivtv_irq_enc_pio_complete(struct ivtv *itv) ...@@ -628,22 +628,66 @@ static void ivtv_irq_enc_pio_complete(struct ivtv *itv)
static void ivtv_irq_dma_err(struct ivtv *itv) static void ivtv_irq_dma_err(struct ivtv *itv)
{ {
u32 data[CX2341X_MBOX_MAX_DATA]; u32 data[CX2341X_MBOX_MAX_DATA];
u32 status;
del_timer(&itv->dma_timer); del_timer(&itv->dma_timer);
ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data); 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], IVTV_DEBUG_WARN("DMA ERROR %08x %08x %08x %d\n", data[0], data[1],
read_reg(IVTV_REG_DMASTATUS), itv->cur_dma_stream); status, itv->cur_dma_stream);
write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS); /*
* 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) && if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) &&
itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) { itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) {
struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream]; struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream];
if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) {
/* retry */ /* retry */
if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) /*
* FIXME - handle cases of DMA error similar to
* encoder below, except conditioned on status & 0x1
*/
ivtv_dma_dec_start(s); 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)) { if (test_bit(IVTV_F_I_UDMA, &itv->i_flags)) {
ivtv_udma_start(itv); ivtv_udma_start(itv);
......
...@@ -1011,7 +1011,6 @@ static int m2mtest_remove(struct platform_device *pdev) ...@@ -1011,7 +1011,6 @@ static int m2mtest_remove(struct platform_device *pdev)
v4l2_m2m_release(dev->m2m_dev); v4l2_m2m_release(dev->m2m_dev);
del_timer_sync(&dev->timer); del_timer_sync(&dev->timer);
video_unregister_device(dev->vfd); video_unregister_device(dev->vfd);
video_device_release(dev->vfd);
v4l2_device_unregister(&dev->v4l2_dev); v4l2_device_unregister(&dev->v4l2_dev);
kfree(dev); kfree(dev);
......
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
#include <linux/usb.h> #include <linux/usb.h>
#define S2255_MAJOR_VERSION 1 #define S2255_MAJOR_VERSION 1
#define S2255_MINOR_VERSION 20 #define S2255_MINOR_VERSION 21
#define S2255_RELEASE 0 #define S2255_RELEASE 0
#define S2255_VERSION KERNEL_VERSION(S2255_MAJOR_VERSION, \ #define S2255_VERSION KERNEL_VERSION(S2255_MAJOR_VERSION, \
S2255_MINOR_VERSION, \ S2255_MINOR_VERSION, \
...@@ -312,9 +312,9 @@ struct s2255_fh { ...@@ -312,9 +312,9 @@ struct s2255_fh {
}; };
/* current cypress EEPROM firmware version */ /* 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 */ /* current DSP FW version */
#define S2255_CUR_DSP_FWVER 8 #define S2255_CUR_DSP_FWVER 10102
/* Need DSP version 5+ for video status feature */ /* Need DSP version 5+ for video status feature */
#define S2255_MIN_DSP_STATUS 5 #define S2255_MIN_DSP_STATUS 5
#define S2255_MIN_DSP_COLORFILTER 8 #define S2255_MIN_DSP_COLORFILTER 8
...@@ -492,9 +492,11 @@ static void planar422p_to_yuv_packed(const unsigned char *in, ...@@ -492,9 +492,11 @@ static void planar422p_to_yuv_packed(const unsigned char *in,
static void s2255_reset_dsppower(struct s2255_dev *dev) 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); msleep(10);
s2255_vendor_req(dev, 0x50, 0x0000, 0x0000, NULL, 0, 1); s2255_vendor_req(dev, 0x50, 0x0000, 0x0000, NULL, 0, 1);
msleep(600);
s2255_vendor_req(dev, 0x10, 0x0000, 0x0000, NULL, 0, 1);
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment