Commit 1702b520 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb

* git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (42 commits)
  V4L/DVB (8108): Fix open/close race in saa7134
  V4L/DVB (8100): V4L/vivi: fix possible memory leak in vivi_fillbuff
  V4L/DVB (8097): xc5000: check device hardware state to determine if firmware download is needed
  V4L/DVB (8096): au8522: prevent false-positive lock status
  V4L/DVB (8092): videodev: simplify and fix standard enumeration
  V4L/DVB (8075): stv0299: Uncorrected block count and bit error rate fixed
  V4L/DVB (8074): av7110: OSD transfers should not be interrupted
  V4L/DVB (8073): av7110: Catch another type of ARM crash
  V4L/DVB (8071): tda10023: Fix possible kernel oops during initialisation
  V4L/DVB (8069): cx18: Fix S-Video and Compsite inputs for the Yuan MPC718 and enable card entry
  V4L/DVB (8068): cx18: Add I2C slave reset via GPIO upon initialization
  V4L/DVB (8067): cx18: Fix firmware load for case when digital capture happens first
  V4L/DVB (8066): cx18: Fix audio mux input definitions for HVR-1600 Line In 2 and FM radio
  V4L/DVB (8063): cx18: Fix unintended auto configurations in cx18-av-core
  V4L/DVB (8061): cx18: only select tuner / frontend modules if !DVB_FE_CUSTOMISE
  V4L/DVB (8048): saa7134: Fix entries for Avermedia A16d and Avermedia E506
  V4L/DVB (8044): au8522: tuning optimizations
  V4L/DVB (8043): au0828: add support for additional USB device id's
  V4L/DVB (8042): DVB-USB UMT-010 channel scan oops
  V4L/DVB (8040): soc-camera: remove soc_camera_host_class class
  ...
parents 0acbbee4 a1789873
0 -> Unknown board (au0828) 0 -> Unknown board (au0828)
1 -> Hauppauge HVR950Q (au0828) [2040:7200] 1 -> Hauppauge HVR950Q (au0828) [2040:7200,2040:7210,2040:7217,2040:721b,2040:721f,2040:7280,0fd9:0008]
2 -> Hauppauge HVR850 (au0828) [2040:7240] 2 -> Hauppauge HVR850 (au0828) [2040:7240]
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620] 3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
...@@ -2201,3 +2201,41 @@ IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE] = { ...@@ -2201,3 +2201,41 @@ IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE] = {
[0x25] = KEY_POWER, /* power */ [0x25] = KEY_POWER, /* power */
}; };
EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel); EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel);
IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE] = {
[0x20] = KEY_LIST,
[0x00] = KEY_POWER,
[0x28] = KEY_1,
[0x18] = KEY_2,
[0x38] = KEY_3,
[0x24] = KEY_4,
[0x14] = KEY_5,
[0x34] = KEY_6,
[0x2c] = KEY_7,
[0x1c] = KEY_8,
[0x3c] = KEY_9,
[0x12] = KEY_SUBTITLE,
[0x22] = KEY_0,
[0x32] = KEY_REWIND,
[0x3a] = KEY_SHUFFLE,
[0x02] = KEY_PRINT,
[0x11] = KEY_CHANNELDOWN,
[0x31] = KEY_CHANNELUP,
[0x0c] = KEY_ZOOM,
[0x1e] = KEY_VOLUMEDOWN,
[0x3e] = KEY_VOLUMEUP,
[0x0a] = KEY_MUTE,
[0x04] = KEY_AUDIO,
[0x26] = KEY_RECORD,
[0x06] = KEY_PLAY,
[0x36] = KEY_STOP,
[0x16] = KEY_PAUSE,
[0x2e] = KEY_REWIND,
[0x0e] = KEY_FASTFORWARD,
[0x30] = KEY_TEXT,
[0x21] = KEY_GREEN,
[0x01] = KEY_BLUE,
[0x08] = KEY_EPG,
[0x2a] = KEY_MENU,
};
EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d);
...@@ -649,9 +649,17 @@ int tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq) ...@@ -649,9 +649,17 @@ int tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq)
u8 val; u8 val;
int ret = tda18271_lookup_map(fe, RF_CAL, freq, &val); int ret = tda18271_lookup_map(fe, RF_CAL, freq, &val);
/* The TDA18271HD/C1 rf_cal map lookup is expected to go out of range
* for frequencies above 61.1 MHz. In these cases, the internal RF
* tracking filters calibration mechanism is used.
*
* There is no need to warn the user about this.
*/
if (ret < 0)
goto fail;
regs[R_EB14] = val; regs[R_EB14] = val;
fail:
return ret; return ret;
} }
......
...@@ -45,6 +45,21 @@ static inline int charge_pump_source(struct dvb_frontend *fe, int force) ...@@ -45,6 +45,21 @@ static inline int charge_pump_source(struct dvb_frontend *fe, int force)
TDA18271_MAIN_PLL, force); TDA18271_MAIN_PLL, force);
} }
static inline void tda18271_set_if_notch(struct dvb_frontend *fe)
{
struct tda18271_priv *priv = fe->tuner_priv;
unsigned char *regs = priv->tda18271_regs;
switch (priv->mode) {
case TDA18271_ANALOG:
regs[R_MPD] &= ~0x80; /* IF notch = 0 */
break;
case TDA18271_DIGITAL:
regs[R_MPD] |= 0x80; /* IF notch = 1 */
break;
}
}
static int tda18271_channel_configuration(struct dvb_frontend *fe, static int tda18271_channel_configuration(struct dvb_frontend *fe,
struct tda18271_std_map_item *map, struct tda18271_std_map_item *map,
u32 freq, u32 bw) u32 freq, u32 bw)
...@@ -60,25 +75,18 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, ...@@ -60,25 +75,18 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
regs[R_EP3] &= ~0x1f; /* clear std bits */ regs[R_EP3] &= ~0x1f; /* clear std bits */
regs[R_EP3] |= (map->agc_mode << 3) | map->std; regs[R_EP3] |= (map->agc_mode << 3) | map->std;
/* set rfagc to high speed mode */ if (priv->id == TDA18271HDC2) {
regs[R_EP3] &= ~0x04; /* set rfagc to high speed mode */
regs[R_EP3] &= ~0x04;
}
/* set cal mode to normal */ /* set cal mode to normal */
regs[R_EP4] &= ~0x03; regs[R_EP4] &= ~0x03;
/* update IF output level & IF notch frequency */ /* update IF output level */
regs[R_EP4] &= ~0x1c; /* clear if level bits */ regs[R_EP4] &= ~0x1c; /* clear if level bits */
regs[R_EP4] |= (map->if_lvl << 2); regs[R_EP4] |= (map->if_lvl << 2);
switch (priv->mode) {
case TDA18271_ANALOG:
regs[R_MPD] &= ~0x80; /* IF notch = 0 */
break;
case TDA18271_DIGITAL:
regs[R_MPD] |= 0x80; /* IF notch = 1 */
break;
}
/* update FM_RFn */ /* update FM_RFn */
regs[R_EP4] &= ~0x80; regs[R_EP4] &= ~0x80;
regs[R_EP4] |= map->fm_rfn << 7; regs[R_EP4] |= map->fm_rfn << 7;
...@@ -95,6 +103,9 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, ...@@ -95,6 +103,9 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
/* disable Power Level Indicator */ /* disable Power Level Indicator */
regs[R_EP1] |= 0x40; regs[R_EP1] |= 0x40;
/* make sure thermometer is off */
regs[R_TM] &= ~0x10;
/* frequency dependent parameters */ /* frequency dependent parameters */
tda18271_calc_ir_measure(fe, &freq); tda18271_calc_ir_measure(fe, &freq);
...@@ -135,6 +146,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, ...@@ -135,6 +146,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
switch (priv->role) { switch (priv->role) {
case TDA18271_MASTER: case TDA18271_MASTER:
tda18271_calc_main_pll(fe, N); tda18271_calc_main_pll(fe, N);
tda18271_set_if_notch(fe);
tda18271_write_regs(fe, R_MPD, 4); tda18271_write_regs(fe, R_MPD, 4);
break; break;
case TDA18271_SLAVE: case TDA18271_SLAVE:
...@@ -142,6 +154,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, ...@@ -142,6 +154,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
tda18271_write_regs(fe, R_CPD, 4); tda18271_write_regs(fe, R_CPD, 4);
regs[R_MPD] = regs[R_CPD] & 0x7f; regs[R_MPD] = regs[R_CPD] & 0x7f;
tda18271_set_if_notch(fe);
tda18271_write_regs(fe, R_MPD, 1); tda18271_write_regs(fe, R_MPD, 1);
break; break;
} }
...@@ -160,12 +173,14 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, ...@@ -160,12 +173,14 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe,
msleep(20); msleep(20);
/* set rfagc to normal speed mode */ if (priv->id == TDA18271HDC2) {
if (map->fm_rfn) /* set rfagc to normal speed mode */
regs[R_EP3] &= ~0x04; if (map->fm_rfn)
else regs[R_EP3] &= ~0x04;
regs[R_EP3] |= 0x04; else
ret = tda18271_write_regs(fe, R_EP3, 1); regs[R_EP3] |= 0x04;
ret = tda18271_write_regs(fe, R_EP3, 1);
}
fail: fail:
return ret; return ret;
} }
...@@ -507,7 +522,7 @@ static int tda18271_powerscan_init(struct dvb_frontend *fe) ...@@ -507,7 +522,7 @@ static int tda18271_powerscan_init(struct dvb_frontend *fe)
/* set cal mode to normal */ /* set cal mode to normal */
regs[R_EP4] &= ~0x03; regs[R_EP4] &= ~0x03;
/* update IF output level & IF notch frequency */ /* update IF output level */
regs[R_EP4] &= ~0x1c; /* clear if level bits */ regs[R_EP4] &= ~0x1c; /* clear if level bits */
ret = tda18271_write_regs(fe, R_EP3, 2); ret = tda18271_write_regs(fe, R_EP3, 2);
......
...@@ -177,6 +177,7 @@ static XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = { ...@@ -177,6 +177,7 @@ static XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = {
{"FM Radio-INPUT1", 0x0208, 0x9002} {"FM Radio-INPUT1", 0x0208, 0x9002}
}; };
static int xc5000_is_firmware_loaded(struct dvb_frontend *fe);
static int xc5000_writeregs(struct xc5000_priv *priv, u8 *buf, u8 len); static int xc5000_writeregs(struct xc5000_priv *priv, u8 *buf, u8 len);
static int xc5000_readregs(struct xc5000_priv *priv, u8 *buf, u8 len); static int xc5000_readregs(struct xc5000_priv *priv, u8 *buf, u8 len);
static void xc5000_TunerReset(struct dvb_frontend *fe); static void xc5000_TunerReset(struct dvb_frontend *fe);
...@@ -352,7 +353,7 @@ static int xc_SetTVStandard(struct xc5000_priv *priv, ...@@ -352,7 +353,7 @@ static int xc_SetTVStandard(struct xc5000_priv *priv,
static int xc_shutdown(struct xc5000_priv *priv) static int xc_shutdown(struct xc5000_priv *priv)
{ {
return 0; return XC_RESULT_SUCCESS;
/* Fixme: cannot bring tuner back alive once shutdown /* Fixme: cannot bring tuner back alive once shutdown
* without reloading the driver modules. * without reloading the driver modules.
* return xc_write_reg(priv, XREG_POWER_DOWN, 0); * return xc_write_reg(priv, XREG_POWER_DOWN, 0);
...@@ -685,6 +686,25 @@ static int xc5000_set_params(struct dvb_frontend *fe, ...@@ -685,6 +686,25 @@ static int xc5000_set_params(struct dvb_frontend *fe,
return 0; return 0;
} }
static int xc5000_is_firmware_loaded(struct dvb_frontend *fe)
{
struct xc5000_priv *priv = fe->tuner_priv;
int ret;
u16 id;
ret = xc5000_readreg(priv, XREG_PRODUCT_ID, &id);
if (ret == XC_RESULT_SUCCESS) {
if (id == XC_PRODUCT_ID_FW_NOT_LOADED)
ret = XC_RESULT_RESET_FAILURE;
else
ret = XC_RESULT_SUCCESS;
}
dprintk(1, "%s() returns %s id = 0x%x\n", __func__,
ret == XC_RESULT_SUCCESS ? "True" : "False", id);
return ret;
}
static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe); static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe);
static int xc5000_set_analog_params(struct dvb_frontend *fe, static int xc5000_set_analog_params(struct dvb_frontend *fe,
...@@ -693,7 +713,7 @@ static int xc5000_set_analog_params(struct dvb_frontend *fe, ...@@ -693,7 +713,7 @@ static int xc5000_set_analog_params(struct dvb_frontend *fe,
struct xc5000_priv *priv = fe->tuner_priv; struct xc5000_priv *priv = fe->tuner_priv;
int ret; int ret;
if(priv->fwloaded == 0) if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS)
xc_load_fw_and_init_tuner(fe); xc_load_fw_and_init_tuner(fe);
dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n", dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n",
...@@ -808,11 +828,10 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe) ...@@ -808,11 +828,10 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe)
struct xc5000_priv *priv = fe->tuner_priv; struct xc5000_priv *priv = fe->tuner_priv;
int ret = 0; int ret = 0;
if (priv->fwloaded == 0) { if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
ret = xc5000_fwupload(fe); ret = xc5000_fwupload(fe);
if (ret != XC_RESULT_SUCCESS) if (ret != XC_RESULT_SUCCESS)
return ret; return ret;
priv->fwloaded = 1;
} }
/* Start the tuner self-calibration process */ /* Start the tuner self-calibration process */
...@@ -852,7 +871,6 @@ static int xc5000_sleep(struct dvb_frontend *fe) ...@@ -852,7 +871,6 @@ static int xc5000_sleep(struct dvb_frontend *fe)
return -EREMOTEIO; return -EREMOTEIO;
} }
else { else {
/* priv->fwloaded = 0; */
return XC_RESULT_SUCCESS; return XC_RESULT_SUCCESS;
} }
} }
...@@ -933,7 +951,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe, ...@@ -933,7 +951,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
cfg->i2c_address); cfg->i2c_address);
printk(KERN_INFO printk(KERN_INFO
"xc5000: Firmware has been loaded previously\n"); "xc5000: Firmware has been loaded previously\n");
priv->fwloaded = 1;
break; break;
case XC_PRODUCT_ID_FW_NOT_LOADED: case XC_PRODUCT_ID_FW_NOT_LOADED:
printk(KERN_INFO printk(KERN_INFO
...@@ -941,7 +958,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe, ...@@ -941,7 +958,6 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
cfg->i2c_address); cfg->i2c_address);
printk(KERN_INFO printk(KERN_INFO
"xc5000: Firmware has not been loaded previously\n"); "xc5000: Firmware has not been loaded previously\n");
priv->fwloaded = 0;
break; break;
default: default:
printk(KERN_ERR printk(KERN_ERR
......
...@@ -30,7 +30,6 @@ struct xc5000_priv { ...@@ -30,7 +30,6 @@ struct xc5000_priv {
u32 bandwidth; u32 bandwidth;
u8 video_standard; u8 video_standard;
u8 rf_mode; u8 rf_mode;
u8 fwloaded;
void *devptr; void *devptr;
}; };
......
...@@ -47,6 +47,8 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr, ...@@ -47,6 +47,8 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr,
return -EINVAL; return -EINVAL;
} }
msleep(1); /* avoid I2C errors */
return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type, return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type,
value, index, rbuf, rlen, 2000); value, index, rbuf, rlen, 2000);
} }
...@@ -92,16 +94,6 @@ static struct i2c_algorithm gl861_i2c_algo = { ...@@ -92,16 +94,6 @@ static struct i2c_algorithm gl861_i2c_algo = {
}; };
/* Callbacks for DVB USB */ /* Callbacks for DVB USB */
static int gl861_identify_state(struct usb_device *udev,
struct dvb_usb_device_properties *props,
struct dvb_usb_device_description **desc,
int *cold)
{
*cold = 0;
return 0;
}
static struct zl10353_config gl861_zl10353_config = { static struct zl10353_config gl861_zl10353_config = {
.demod_address = 0x0f, .demod_address = 0x0f,
.no_tuner = 1, .no_tuner = 1,
...@@ -172,7 +164,6 @@ static struct dvb_usb_device_properties gl861_properties = { ...@@ -172,7 +164,6 @@ static struct dvb_usb_device_properties gl861_properties = {
.size_of_priv = 0, .size_of_priv = 0,
.identify_state = gl861_identify_state,
.num_adapters = 1, .num_adapters = 1,
.adapter = {{ .adapter = {{
...@@ -194,13 +185,15 @@ static struct dvb_usb_device_properties gl861_properties = { ...@@ -194,13 +185,15 @@ static struct dvb_usb_device_properties gl861_properties = {
.num_device_descs = 2, .num_device_descs = 2,
.devices = { .devices = {
{ "MSI Mega Sky 55801 DVB-T USB2.0", {
{ &gl861_table[0], NULL }, .name = "MSI Mega Sky 55801 DVB-T USB2.0",
{ NULL }, .cold_ids = { NULL },
.warm_ids = { &gl861_table[0], NULL },
}, },
{ "A-LINK DTU DVB-T USB2.0", {
{ &gl861_table[1], NULL }, .name = "A-LINK DTU DVB-T USB2.0",
{ NULL }, .cold_ids = { NULL },
.warm_ids = { &gl861_table[1], NULL },
}, },
} }
}; };
......
...@@ -107,7 +107,7 @@ static struct dvb_usb_device_properties umt_properties = { ...@@ -107,7 +107,7 @@ static struct dvb_usb_device_properties umt_properties = {
/* parameter for the MPEG2-data transfer */ /* parameter for the MPEG2-data transfer */
.stream = { .stream = {
.type = USB_BULK, .type = USB_BULK,
.count = 20, .count = MAX_NO_URBS_FOR_DATA_STREAM,
.endpoint = 0x06, .endpoint = 0x06,
.u = { .u = {
.bulk = { .bulk = {
......
...@@ -463,10 +463,13 @@ static int au8522_set_frontend(struct dvb_frontend *fe, ...@@ -463,10 +463,13 @@ static int au8522_set_frontend(struct dvb_frontend *fe,
struct dvb_frontend_parameters *p) struct dvb_frontend_parameters *p)
{ {
struct au8522_state *state = fe->demodulator_priv; struct au8522_state *state = fe->demodulator_priv;
int ret = -EINVAL;
dprintk("%s(frequency=%d)\n", __func__, p->frequency); dprintk("%s(frequency=%d)\n", __func__, p->frequency);
state->current_frequency = p->frequency; if ((state->current_frequency == p->frequency) &&
(state->current_modulation == p->u.vsb.modulation))
return 0;
au8522_enable_modulation(fe, p->u.vsb.modulation); au8522_enable_modulation(fe, p->u.vsb.modulation);
...@@ -476,11 +479,16 @@ static int au8522_set_frontend(struct dvb_frontend *fe, ...@@ -476,11 +479,16 @@ static int au8522_set_frontend(struct dvb_frontend *fe,
if (fe->ops.tuner_ops.set_params) { if (fe->ops.tuner_ops.set_params) {
if (fe->ops.i2c_gate_ctrl) if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); fe->ops.i2c_gate_ctrl(fe, 1);
fe->ops.tuner_ops.set_params(fe, p); ret = fe->ops.tuner_ops.set_params(fe, p);
if (fe->ops.i2c_gate_ctrl) if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0); fe->ops.i2c_gate_ctrl(fe, 0);
} }
if (ret < 0)
return ret;
state->current_frequency = p->frequency;
return 0; return 0;
} }
...@@ -498,6 +506,16 @@ static int au8522_init(struct dvb_frontend *fe) ...@@ -498,6 +506,16 @@ static int au8522_init(struct dvb_frontend *fe)
return 0; return 0;
} }
static int au8522_sleep(struct dvb_frontend *fe)
{
struct au8522_state *state = fe->demodulator_priv;
dprintk("%s()\n", __func__);
state->current_frequency = 0;
return 0;
}
static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status) static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status)
{ {
struct au8522_state *state = fe->demodulator_priv; struct au8522_state *state = fe->demodulator_priv;
...@@ -509,10 +527,8 @@ static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status) ...@@ -509,10 +527,8 @@ static int au8522_read_status(struct dvb_frontend *fe, fe_status_t *status)
if (state->current_modulation == VSB_8) { if (state->current_modulation == VSB_8) {
dprintk("%s() Checking VSB_8\n", __func__); dprintk("%s() Checking VSB_8\n", __func__);
reg = au8522_readreg(state, 0x4088); reg = au8522_readreg(state, 0x4088);
if (reg & 0x01) if ((reg & 0x03) == 0x03)
*status |= FE_HAS_VITERBI; *status |= FE_HAS_LOCK | FE_HAS_SYNC | FE_HAS_VITERBI;
if (reg & 0x02)
*status |= FE_HAS_LOCK | FE_HAS_SYNC;
} else { } else {
dprintk("%s() Checking QAM\n", __func__); dprintk("%s() Checking QAM\n", __func__);
reg = au8522_readreg(state, 0x4541); reg = au8522_readreg(state, 0x4541);
...@@ -672,6 +688,7 @@ static struct dvb_frontend_ops au8522_ops = { ...@@ -672,6 +688,7 @@ static struct dvb_frontend_ops au8522_ops = {
}, },
.init = au8522_init, .init = au8522_init,
.sleep = au8522_sleep,
.i2c_gate_ctrl = au8522_i2c_gate_ctrl, .i2c_gate_ctrl = au8522_i2c_gate_ctrl,
.set_frontend = au8522_set_frontend, .set_frontend = au8522_set_frontend,
.get_frontend = au8522_get_frontend, .get_frontend = au8522_get_frontend,
......
...@@ -63,6 +63,7 @@ struct stv0299_state { ...@@ -63,6 +63,7 @@ struct stv0299_state {
u32 symbol_rate; u32 symbol_rate;
fe_code_rate_t fec_inner; fe_code_rate_t fec_inner;
int errmode; int errmode;
u32 ucblocks;
}; };
#define STATUS_BER 0 #define STATUS_BER 0
...@@ -501,8 +502,10 @@ static int stv0299_read_ber(struct dvb_frontend* fe, u32* ber) ...@@ -501,8 +502,10 @@ static int stv0299_read_ber(struct dvb_frontend* fe, u32* ber)
{ {
struct stv0299_state* state = fe->demodulator_priv; struct stv0299_state* state = fe->demodulator_priv;
if (state->errmode != STATUS_BER) return 0; if (state->errmode != STATUS_BER)
*ber = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e); return -ENOSYS;
*ber = stv0299_readreg(state, 0x1e) | (stv0299_readreg(state, 0x1d) << 8);
return 0; return 0;
} }
...@@ -540,8 +543,12 @@ static int stv0299_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks) ...@@ -540,8 +543,12 @@ static int stv0299_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
{ {
struct stv0299_state* state = fe->demodulator_priv; struct stv0299_state* state = fe->demodulator_priv;
if (state->errmode != STATUS_UCBLOCKS) *ucblocks = 0; if (state->errmode != STATUS_UCBLOCKS)
else *ucblocks = (stv0299_readreg (state, 0x1d) << 8) | stv0299_readreg (state, 0x1e); return -ENOSYS;
state->ucblocks += stv0299_readreg(state, 0x1e);
state->ucblocks += (stv0299_readreg(state, 0x1d) << 8);
*ucblocks = state->ucblocks;
return 0; return 0;
} }
......
...@@ -116,9 +116,12 @@ static u8 tda10023_readreg (struct tda10023_state* state, u8 reg) ...@@ -116,9 +116,12 @@ static u8 tda10023_readreg (struct tda10023_state* state, u8 reg)
int ret; int ret;
ret = i2c_transfer (state->i2c, msg, 2); ret = i2c_transfer (state->i2c, msg, 2);
if (ret != 2) if (ret != 2) {
printk("DVB: TDA10023: %s: readreg error (ret == %i)\n", int num = state->frontend.dvb ? state->frontend.dvb->num : -1;
__func__, ret); printk(KERN_ERR "DVB: TDA10023(%d): %s: readreg error "
"(reg == 0x%02x, ret == %i)\n",
num, __func__, reg, ret);
}
return b1[0]; return b1[0];
} }
...@@ -129,11 +132,12 @@ static int tda10023_writereg (struct tda10023_state* state, u8 reg, u8 data) ...@@ -129,11 +132,12 @@ static int tda10023_writereg (struct tda10023_state* state, u8 reg, u8 data)
int ret; int ret;
ret = i2c_transfer (state->i2c, &msg, 1); ret = i2c_transfer (state->i2c, &msg, 1);
if (ret != 1) if (ret != 1) {
printk("DVB: TDA10023(%d): %s, writereg error " int num = state->frontend.dvb ? state->frontend.dvb->num : -1;
printk(KERN_ERR "DVB: TDA10023(%d): %s, writereg error "
"(reg == 0x%02x, val == 0x%02x, ret == %i)\n", "(reg == 0x%02x, val == 0x%02x, ret == %i)\n",
state->frontend.dvb->num, __func__, reg, data, ret); num, __func__, reg, data, ret);
}
return (ret != 1) ? -EREMOTEIO : 0; return (ret != 1) ? -EREMOTEIO : 0;
} }
...@@ -464,7 +468,7 @@ struct dvb_frontend* tda10023_attach(const struct tda1002x_config* config, ...@@ -464,7 +468,7 @@ struct dvb_frontend* tda10023_attach(const struct tda1002x_config* config,
int i; int i;
/* allocate memory for the internal state */ /* allocate memory for the internal state */
state = kmalloc(sizeof(struct tda10023_state), GFP_KERNEL); state = kzalloc(sizeof(struct tda10023_state), GFP_KERNEL);
if (state == NULL) goto error; if (state == NULL) goto error;
/* setup the state */ /* setup the state */
......
...@@ -1248,11 +1248,14 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, ...@@ -1248,11 +1248,14 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
struct i2c_adapter* i2c) struct i2c_adapter* i2c)
{ {
struct tda1004x_state *state; struct tda1004x_state *state;
int id;
/* allocate memory for the internal state */ /* allocate memory for the internal state */
state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL); state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
if (!state) if (!state) {
printk(KERN_ERR "Can't alocate memory for tda10045 state\n");
return NULL; return NULL;
}
/* setup the state */ /* setup the state */
state->config = config; state->config = config;
...@@ -1260,7 +1263,15 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, ...@@ -1260,7 +1263,15 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
state->demod_type = TDA1004X_DEMOD_TDA10045; state->demod_type = TDA1004X_DEMOD_TDA10045;
/* check if the demod is there */ /* check if the demod is there */
if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x25) { id = tda1004x_read_byte(state, TDA1004X_CHIPID);
if (id < 0) {
printk(KERN_ERR "tda10045: chip is not answering. Giving up.\n");
kfree(state);
return NULL;
}
if (id != 0x25) {
printk(KERN_ERR "Invalid tda1004x ID = 0x%02x. Can't proceed\n", id);
kfree(state); kfree(state);
return NULL; return NULL;
} }
...@@ -1307,11 +1318,14 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, ...@@ -1307,11 +1318,14 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
struct i2c_adapter* i2c) struct i2c_adapter* i2c)
{ {
struct tda1004x_state *state; struct tda1004x_state *state;
int id;
/* allocate memory for the internal state */ /* allocate memory for the internal state */
state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL); state = kmalloc(sizeof(struct tda1004x_state), GFP_KERNEL);
if (!state) if (!state) {
printk(KERN_ERR "Can't alocate memory for tda10046 state\n");
return NULL; return NULL;
}
/* setup the state */ /* setup the state */
state->config = config; state->config = config;
...@@ -1319,7 +1333,14 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, ...@@ -1319,7 +1333,14 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
state->demod_type = TDA1004X_DEMOD_TDA10046; state->demod_type = TDA1004X_DEMOD_TDA10046;
/* check if the demod is there */ /* check if the demod is there */
if (tda1004x_read_byte(state, TDA1004X_CHIPID) != 0x46) { id = tda1004x_read_byte(state, TDA1004X_CHIPID);
if (id < 0) {
printk(KERN_ERR "tda10046: chip is not answering. Giving up.\n");
kfree(state);
return NULL;
}
if (id != 0x46) {
printk(KERN_ERR "Invalid tda1004x ID = 0x%02x. Can't proceed\n", id);
kfree(state); kfree(state);
return NULL; return NULL;
} }
......
...@@ -101,6 +101,7 @@ config DVB_BUDGET ...@@ -101,6 +101,7 @@ config DVB_BUDGET
config DVB_BUDGET_CI config DVB_BUDGET_CI
tristate "Budget cards with onboard CI connector" tristate "Budget cards with onboard CI connector"
depends on DVB_BUDGET_CORE && I2C depends on DVB_BUDGET_CORE && I2C
depends on INPUT # due to IR
select DVB_STV0297 if !DVB_FE_CUSTOMISE select DVB_STV0297 if !DVB_FE_CUSTOMISE
select DVB_STV0299 if !DVB_FE_CUSTOMISE select DVB_STV0299 if !DVB_FE_CUSTOMISE
select DVB_TDA1004X if !DVB_FE_CUSTOMISE select DVB_TDA1004X if !DVB_FE_CUSTOMISE
......
...@@ -427,6 +427,7 @@ static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length) ...@@ -427,6 +427,7 @@ static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
if (err) { if (err) {
printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n", printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n",
__func__, type); __func__, type);
av7110->arm_errors++;
return -ETIMEDOUT; return -ETIMEDOUT;
} }
msleep(1); msleep(1);
...@@ -853,10 +854,8 @@ static osd_raw_window_t bpp2bit[8] = { ...@@ -853,10 +854,8 @@ static osd_raw_window_t bpp2bit[8] = {
static inline int WaitUntilBmpLoaded(struct av7110 *av7110) static inline int WaitUntilBmpLoaded(struct av7110 *av7110)
{ {
int ret = wait_event_interruptible_timeout(av7110->bmpq, int ret = wait_event_timeout(av7110->bmpq,
av7110->bmp_state != BMP_LOADING, 10*HZ); av7110->bmp_state != BMP_LOADING, 10*HZ);
if (ret == -ERESTARTSYS)
return ret;
if (ret == 0) { if (ret == 0) {
printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n", printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n",
ret, av7110->bmp_state); ret, av7110->bmp_state);
......
...@@ -77,8 +77,14 @@ static void hauppauge_eeprom(struct au0828_dev *dev, u8 *eeprom_data) ...@@ -77,8 +77,14 @@ static void hauppauge_eeprom(struct au0828_dev *dev, u8 *eeprom_data)
/* Make sure we support the board model */ /* Make sure we support the board model */
switch (tv.model) { switch (tv.model) {
case 72000: /* WinTV-HVR950q (Retail, IR, ATSC/QAM */
case 72001: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and basic analog video */ case 72001: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and basic analog video */
case 72211: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */
case 72221: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */
case 72231: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */
case 72241: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM and basic analog video */
case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and basic analog video */ case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and basic analog video */
case 72500: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM */
break; break;
default: default:
printk(KERN_WARNING "%s: warning: " printk(KERN_WARNING "%s: warning: "
...@@ -175,6 +181,18 @@ struct usb_device_id au0828_usb_id_table [] = { ...@@ -175,6 +181,18 @@ struct usb_device_id au0828_usb_id_table [] = {
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR850 }, .driver_info = AU0828_BOARD_HAUPPAUGE_HVR850 },
{ USB_DEVICE(0x0fe9, 0xd620), { USB_DEVICE(0x0fe9, 0xd620),
.driver_info = AU0828_BOARD_DVICO_FUSIONHDTV7 }, .driver_info = AU0828_BOARD_DVICO_FUSIONHDTV7 },
{ USB_DEVICE(0x2040, 0x7210),
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
{ USB_DEVICE(0x2040, 0x7217),
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
{ USB_DEVICE(0x2040, 0x721b),
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
{ USB_DEVICE(0x2040, 0x721f),
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
{ USB_DEVICE(0x2040, 0x7280),
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
{ USB_DEVICE(0x0fd9, 0x0008),
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
{ }, { },
}; };
......
...@@ -10,8 +10,8 @@ config VIDEO_CX18 ...@@ -10,8 +10,8 @@ config VIDEO_CX18
select VIDEO_TVEEPROM select VIDEO_TVEEPROM
select VIDEO_CX2341X select VIDEO_CX2341X
select VIDEO_CS5345 select VIDEO_CS5345
select DVB_S5H1409 select DVB_S5H1409 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_MXL5005S select MEDIA_TUNER_MXL5005S if !DVB_FE_CUSTOMISE
---help--- ---help---
This is a video4linux driver for Conexant cx23418 based This is a video4linux driver for Conexant cx23418 based
PCI combo video recorder devices. PCI combo video recorder devices.
......
...@@ -69,6 +69,58 @@ int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 and_mask, ...@@ -69,6 +69,58 @@ int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 and_mask,
or_value); or_value);
} }
int cx18_av_write_no_acfg(struct cx18 *cx, u16 addr, u8 value, int no_acfg_mask)
{
int retval;
u32 saved_reg[8] = {0};
if (no_acfg_mask & CXADEC_NO_ACFG_AFE) {
saved_reg[0] = cx18_av_read4(cx, CXADEC_CHIP_CTRL);
saved_reg[1] = cx18_av_read4(cx, CXADEC_AFE_CTRL);
}
if (no_acfg_mask & CXADEC_NO_ACFG_PLL) {
saved_reg[2] = cx18_av_read4(cx, CXADEC_PLL_CTRL1);
saved_reg[3] = cx18_av_read4(cx, CXADEC_VID_PLL_FRAC);
}
if (no_acfg_mask & CXADEC_NO_ACFG_VID) {
saved_reg[4] = cx18_av_read4(cx, CXADEC_HORIZ_TIM_CTRL);
saved_reg[5] = cx18_av_read4(cx, CXADEC_VERT_TIM_CTRL);
saved_reg[6] = cx18_av_read4(cx, CXADEC_SRC_COMB_CFG);
saved_reg[7] = cx18_av_read4(cx, CXADEC_CHROMA_VBIOFF_CFG);
}
retval = cx18_av_write(cx, addr, value);
if (no_acfg_mask & CXADEC_NO_ACFG_AFE) {
cx18_av_write4(cx, CXADEC_CHIP_CTRL, saved_reg[0]);
cx18_av_write4(cx, CXADEC_AFE_CTRL, saved_reg[1]);
}
if (no_acfg_mask & CXADEC_NO_ACFG_PLL) {
cx18_av_write4(cx, CXADEC_PLL_CTRL1, saved_reg[2]);
cx18_av_write4(cx, CXADEC_VID_PLL_FRAC, saved_reg[3]);
}
if (no_acfg_mask & CXADEC_NO_ACFG_VID) {
cx18_av_write4(cx, CXADEC_HORIZ_TIM_CTRL, saved_reg[4]);
cx18_av_write4(cx, CXADEC_VERT_TIM_CTRL, saved_reg[5]);
cx18_av_write4(cx, CXADEC_SRC_COMB_CFG, saved_reg[6]);
cx18_av_write4(cx, CXADEC_CHROMA_VBIOFF_CFG, saved_reg[7]);
}
return retval;
}
int cx18_av_and_or_no_acfg(struct cx18 *cx, u16 addr, unsigned and_mask,
u8 or_value, int no_acfg_mask)
{
return cx18_av_write_no_acfg(cx, addr,
(cx18_av_read(cx, addr) & and_mask) |
or_value, no_acfg_mask);
}
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input, static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input,
...@@ -170,13 +222,15 @@ static void input_change(struct cx18 *cx) ...@@ -170,13 +222,15 @@ static void input_change(struct cx18 *cx)
/* Follow step 8c and 8d of section 3.16 in the cx18_av datasheet */ /* Follow step 8c and 8d of section 3.16 in the cx18_av datasheet */
if (std & V4L2_STD_SECAM) if (std & V4L2_STD_SECAM)
cx18_av_write(cx, 0x402, 0); cx18_av_write_no_acfg(cx, 0x402, 0, CXADEC_NO_ACFG_ALL);
else { else {
cx18_av_write(cx, 0x402, 0x04); cx18_av_write_no_acfg(cx, 0x402, 0x04, CXADEC_NO_ACFG_ALL);
cx18_av_write(cx, 0x49f, (std & V4L2_STD_NTSC) ? 0x14 : 0x11); cx18_av_write(cx, 0x49f, (std & V4L2_STD_NTSC) ? 0x14 : 0x11);
} }
cx18_av_and_or(cx, 0x401, ~0x60, 0); cx18_av_and_or_no_acfg(cx, 0x401, ~0x60, 0,
cx18_av_and_or(cx, 0x401, ~0x60, 0x60); CXADEC_NO_ACFG_PLL | CXADEC_NO_ACFG_VID);
cx18_av_and_or_no_acfg(cx, 0x401, ~0x60, 0x60,
CXADEC_NO_ACFG_PLL | CXADEC_NO_ACFG_VID);
if (std & V4L2_STD_525_60) { if (std & V4L2_STD_525_60) {
if (std == V4L2_STD_NTSC_M_JP) { if (std == V4L2_STD_NTSC_M_JP) {
...@@ -228,7 +282,7 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input, ...@@ -228,7 +282,7 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input,
if ((vid_input & ~0xff0) || if ((vid_input & ~0xff0) ||
luma < CX18_AV_SVIDEO_LUMA1 || luma < CX18_AV_SVIDEO_LUMA1 ||
luma > CX18_AV_SVIDEO_LUMA4 || luma > CX18_AV_SVIDEO_LUMA8 ||
chroma < CX18_AV_SVIDEO_CHROMA4 || chroma < CX18_AV_SVIDEO_CHROMA4 ||
chroma > CX18_AV_SVIDEO_CHROMA8) { chroma > CX18_AV_SVIDEO_CHROMA8) {
CX18_ERR("0x%04x is not a valid video input!\n", CX18_ERR("0x%04x is not a valid video input!\n",
...@@ -262,7 +316,8 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input, ...@@ -262,7 +316,8 @@ static int set_input(struct cx18 *cx, enum cx18_av_video_input vid_input,
cx18_av_write(cx, 0x103, reg); cx18_av_write(cx, 0x103, reg);
/* Set INPUT_MODE to Composite (0) or S-Video (1) */ /* Set INPUT_MODE to Composite (0) or S-Video (1) */
cx18_av_and_or(cx, 0x401, ~0x6, is_composite ? 0 : 0x02); cx18_av_and_or_no_acfg(cx, 0x401, ~0x6, is_composite ? 0 : 0x02,
CXADEC_NO_ACFG_PLL | CXADEC_NO_ACFG_VID);
/* Set CH_SEL_ADC2 to 1 if input comes from CH3 */ /* Set CH_SEL_ADC2 to 1 if input comes from CH3 */
cx18_av_and_or(cx, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0); cx18_av_and_or(cx, 0x102, ~0x2, (reg & 0x80) == 0 ? 2 : 0);
/* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2 and CH3 */ /* Set DUAL_MODE_ADC2 to 1 if input comes from both CH2 and CH3 */
...@@ -318,12 +373,12 @@ static int set_v4lstd(struct cx18 *cx) ...@@ -318,12 +373,12 @@ static int set_v4lstd(struct cx18 *cx)
This happens for example with the Yuan MPC622. */ This happens for example with the Yuan MPC622. */
if (fmt >= 4 && fmt < 8) { if (fmt >= 4 && fmt < 8) {
/* Set format to NTSC-M */ /* Set format to NTSC-M */
cx18_av_and_or(cx, 0x400, ~0xf, 1); cx18_av_and_or_no_acfg(cx, 0x400, ~0xf, 1, CXADEC_NO_ACFG_AFE);
/* Turn off LCOMB */ /* Turn off LCOMB */
cx18_av_and_or(cx, 0x47b, ~6, 0); cx18_av_and_or(cx, 0x47b, ~6, 0);
} }
cx18_av_and_or(cx, 0x400, ~0xf, fmt); cx18_av_and_or_no_acfg(cx, 0x400, ~0xf, fmt, CXADEC_NO_ACFG_AFE);
cx18_av_and_or(cx, 0x403, ~0x3, pal_m); cx18_av_and_or_no_acfg(cx, 0x403, ~0x3, pal_m, CXADEC_NO_ACFG_ALL);
cx18_av_vbi_setup(cx); cx18_av_vbi_setup(cx);
input_change(cx); input_change(cx);
return 0; return 0;
......
...@@ -37,12 +37,16 @@ enum cx18_av_video_input { ...@@ -37,12 +37,16 @@ enum cx18_av_video_input {
CX18_AV_COMPOSITE7, CX18_AV_COMPOSITE7,
CX18_AV_COMPOSITE8, CX18_AV_COMPOSITE8,
/* S-Video inputs consist of one luma input (In1-In4) ORed with one /* S-Video inputs consist of one luma input (In1-In8) ORed with one
chroma input (In5-In8) */ chroma input (In5-In8) */
CX18_AV_SVIDEO_LUMA1 = 0x10, CX18_AV_SVIDEO_LUMA1 = 0x10,
CX18_AV_SVIDEO_LUMA2 = 0x20, CX18_AV_SVIDEO_LUMA2 = 0x20,
CX18_AV_SVIDEO_LUMA3 = 0x30, CX18_AV_SVIDEO_LUMA3 = 0x30,
CX18_AV_SVIDEO_LUMA4 = 0x40, CX18_AV_SVIDEO_LUMA4 = 0x40,
CX18_AV_SVIDEO_LUMA5 = 0x50,
CX18_AV_SVIDEO_LUMA6 = 0x60,
CX18_AV_SVIDEO_LUMA7 = 0x70,
CX18_AV_SVIDEO_LUMA8 = 0x80,
CX18_AV_SVIDEO_CHROMA4 = 0x400, CX18_AV_SVIDEO_CHROMA4 = 0x400,
CX18_AV_SVIDEO_CHROMA5 = 0x500, CX18_AV_SVIDEO_CHROMA5 = 0x500,
CX18_AV_SVIDEO_CHROMA6 = 0x600, CX18_AV_SVIDEO_CHROMA6 = 0x600,
...@@ -291,14 +295,24 @@ struct cx18_av_state { ...@@ -291,14 +295,24 @@ struct cx18_av_state {
#define CXADEC_SELECT_AUDIO_STANDARD_FM 0xF9 /* FM radio */ #define CXADEC_SELECT_AUDIO_STANDARD_FM 0xF9 /* FM radio */
#define CXADEC_SELECT_AUDIO_STANDARD_AUTO 0xFF /* Auto detect */ #define CXADEC_SELECT_AUDIO_STANDARD_AUTO 0xFF /* Auto detect */
/* Flags on what to preserve on write to 0x400-0x403 with cx18_av_.*_no_acfg()*/
#define CXADEC_NO_ACFG_AFE 0x01 /* Preserve 0x100-0x107 */
#define CXADEC_NO_ACFG_PLL 0x02 /* Preserve 0x108-0x10f */
#define CXADEC_NO_ACFG_VID 0x04 /* Preserve 0x470-0x47f */
#define CXADEC_NO_ACFG_ALL 0x07
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
/* cx18_av-core.c */ /* cx18_av-core.c */
int cx18_av_write(struct cx18 *cx, u16 addr, u8 value); int cx18_av_write(struct cx18 *cx, u16 addr, u8 value);
int cx18_av_write4(struct cx18 *cx, u16 addr, u32 value); int cx18_av_write4(struct cx18 *cx, u16 addr, u32 value);
int cx18_av_write_no_acfg(struct cx18 *cx, u16 addr, u8 value,
int no_acfg_mask);
u8 cx18_av_read(struct cx18 *cx, u16 addr); u8 cx18_av_read(struct cx18 *cx, u16 addr);
u32 cx18_av_read4(struct cx18 *cx, u16 addr); u32 cx18_av_read4(struct cx18 *cx, u16 addr);
int cx18_av_and_or(struct cx18 *cx, u16 addr, unsigned mask, u8 value); int cx18_av_and_or(struct cx18 *cx, u16 addr, unsigned mask, u8 value);
int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 mask, u32 value); int cx18_av_and_or4(struct cx18 *cx, u16 addr, u32 mask, u32 value);
int cx18_av_and_or_no_acfg(struct cx18 *cx, u16 addr, unsigned mask, u8 value,
int no_acfg_mask);
int cx18_av_cmd(struct cx18 *cx, unsigned int cmd, void *arg); int cx18_av_cmd(struct cx18 *cx, unsigned int cmd, void *arg);
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "cx18-driver.h" #include "cx18-driver.h"
#include "cx18-cards.h" #include "cx18-cards.h"
#include "cx18-av-core.h"
#include "cx18-i2c.h" #include "cx18-i2c.h"
#include <media/cs5345.h> #include <media/cs5345.h>
...@@ -54,22 +55,22 @@ static const struct cx18_card cx18_card_hvr1600_esmt = { ...@@ -54,22 +55,22 @@ static const struct cx18_card cx18_card_hvr1600_esmt = {
.hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER | .hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER |
CX18_HW_CS5345 | CX18_HW_DVB, CX18_HW_CS5345 | CX18_HW_DVB,
.video_inputs = { .video_inputs = {
{ CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 },
{ CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, { CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 },
{ CX18_CARD_INPUT_COMPOSITE1, 1, CX23418_COMPOSITE3 }, { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 },
{ CX18_CARD_INPUT_SVIDEO2, 2, CX23418_SVIDEO2 }, { CX18_CARD_INPUT_SVIDEO2, 2, CX18_AV_SVIDEO2 },
{ CX18_CARD_INPUT_COMPOSITE2, 2, CX23418_COMPOSITE4 }, { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 },
}, },
.audio_inputs = { .audio_inputs = {
{ CX18_CARD_INPUT_AUD_TUNER, { CX18_CARD_INPUT_AUD_TUNER,
CX23418_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 },
{ CX18_CARD_INPUT_LINE_IN1, { CX18_CARD_INPUT_LINE_IN1,
CX23418_AUDIO_SERIAL, CS5345_IN_2 }, CX18_AV_AUDIO_SERIAL, CS5345_IN_2 },
{ CX18_CARD_INPUT_LINE_IN2, { CX18_CARD_INPUT_LINE_IN2,
CX23418_AUDIO_SERIAL, CS5345_IN_2 }, CX18_AV_AUDIO_SERIAL, CS5345_IN_3 },
}, },
.radio_input = { CX18_CARD_INPUT_AUD_TUNER, .radio_input = { CX18_CARD_INPUT_AUD_TUNER,
CX23418_AUDIO_SERIAL, 0 }, CX18_AV_AUDIO_SERIAL, CS5345_IN_4 },
.ddr = { .ddr = {
/* ESMT M13S128324A-5B memory */ /* ESMT M13S128324A-5B memory */
.chip_config = 0x003, .chip_config = 0x003,
...@@ -81,6 +82,11 @@ static const struct cx18_card cx18_card_hvr1600_esmt = { ...@@ -81,6 +82,11 @@ static const struct cx18_card cx18_card_hvr1600_esmt = {
}, },
.gpio_init.initial_value = 0x3001, .gpio_init.initial_value = 0x3001,
.gpio_init.direction = 0x3001, .gpio_init.direction = 0x3001,
.gpio_i2c_slave_reset = {
.active_lo_mask = 0x3001,
.msecs_asserted = 10,
.msecs_recovery = 40,
},
.i2c = &cx18_i2c_std, .i2c = &cx18_i2c_std,
}; };
...@@ -94,22 +100,22 @@ static const struct cx18_card cx18_card_hvr1600_samsung = { ...@@ -94,22 +100,22 @@ static const struct cx18_card cx18_card_hvr1600_samsung = {
.hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER | .hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER |
CX18_HW_CS5345 | CX18_HW_DVB, CX18_HW_CS5345 | CX18_HW_DVB,
.video_inputs = { .video_inputs = {
{ CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE7 },
{ CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, { CX18_CARD_INPUT_SVIDEO1, 1, CX18_AV_SVIDEO1 },
{ CX18_CARD_INPUT_COMPOSITE1, 1, CX23418_COMPOSITE3 }, { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE3 },
{ CX18_CARD_INPUT_SVIDEO2, 2, CX23418_SVIDEO2 }, { CX18_CARD_INPUT_SVIDEO2, 2, CX18_AV_SVIDEO2 },
{ CX18_CARD_INPUT_COMPOSITE2, 2, CX23418_COMPOSITE4 }, { CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE4 },
}, },
.audio_inputs = { .audio_inputs = {
{ CX18_CARD_INPUT_AUD_TUNER, { CX18_CARD_INPUT_AUD_TUNER,
CX23418_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 }, CX18_AV_AUDIO8, CS5345_IN_1 | CS5345_MCLK_1_5 },
{ CX18_CARD_INPUT_LINE_IN1, { CX18_CARD_INPUT_LINE_IN1,
CX23418_AUDIO_SERIAL, CS5345_IN_2 }, CX18_AV_AUDIO_SERIAL, CS5345_IN_2 },
{ CX18_CARD_INPUT_LINE_IN2, { CX18_CARD_INPUT_LINE_IN2,
CX23418_AUDIO_SERIAL, CS5345_IN_2 }, CX18_AV_AUDIO_SERIAL, CS5345_IN_3 },
}, },
.radio_input = { CX18_CARD_INPUT_AUD_TUNER, .radio_input = { CX18_CARD_INPUT_AUD_TUNER,
CX23418_AUDIO_SERIAL, 0 }, CX18_AV_AUDIO_SERIAL, CS5345_IN_4 },
.ddr = { .ddr = {
/* Samsung K4D263238G-VC33 memory */ /* Samsung K4D263238G-VC33 memory */
.chip_config = 0x003, .chip_config = 0x003,
...@@ -121,6 +127,11 @@ static const struct cx18_card cx18_card_hvr1600_samsung = { ...@@ -121,6 +127,11 @@ static const struct cx18_card cx18_card_hvr1600_samsung = {
}, },
.gpio_init.initial_value = 0x3001, .gpio_init.initial_value = 0x3001,
.gpio_init.direction = 0x3001, .gpio_init.direction = 0x3001,
.gpio_i2c_slave_reset = {
.active_lo_mask = 0x3001,
.msecs_asserted = 10,
.msecs_recovery = 40,
},
.i2c = &cx18_i2c_std, .i2c = &cx18_i2c_std,
}; };
...@@ -141,19 +152,19 @@ static const struct cx18_card cx18_card_h900 = { ...@@ -141,19 +152,19 @@ static const struct cx18_card cx18_card_h900 = {
.hw_audio_ctrl = CX18_HW_CX23418, .hw_audio_ctrl = CX18_HW_CX23418,
.hw_all = CX18_HW_TUNER, .hw_all = CX18_HW_TUNER,
.video_inputs = { .video_inputs = {
{ CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE2 }, { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE2 },
{ CX18_CARD_INPUT_SVIDEO1, 1, { CX18_CARD_INPUT_SVIDEO1, 1,
CX23418_SVIDEO_LUMA3 | CX23418_SVIDEO_CHROMA4 }, CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 },
{ CX18_CARD_INPUT_COMPOSITE1, 1, CX23418_COMPOSITE1 }, { CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 },
}, },
.audio_inputs = { .audio_inputs = {
{ CX18_CARD_INPUT_AUD_TUNER, { CX18_CARD_INPUT_AUD_TUNER,
CX23418_AUDIO8, 0 }, CX18_AV_AUDIO8, 0 },
{ CX18_CARD_INPUT_LINE_IN1, { CX18_CARD_INPUT_LINE_IN1,
CX23418_AUDIO_SERIAL, 0 }, CX18_AV_AUDIO_SERIAL, 0 },
}, },
.radio_input = { CX18_CARD_INPUT_AUD_TUNER, .radio_input = { CX18_CARD_INPUT_AUD_TUNER,
CX23418_AUDIO_SERIAL, 0 }, CX18_AV_AUDIO_SERIAL, 0 },
.tuners = { .tuners = {
{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
}, },
...@@ -183,23 +194,26 @@ static const struct cx18_card_pci_info cx18_pci_mpc718[] = { ...@@ -183,23 +194,26 @@ static const struct cx18_card_pci_info cx18_pci_mpc718[] = {
static const struct cx18_card cx18_card_mpc718 = { static const struct cx18_card cx18_card_mpc718 = {
.type = CX18_CARD_YUAN_MPC718, .type = CX18_CARD_YUAN_MPC718,
.name = "Yuan MPC718", .name = "Yuan MPC718",
.comment = "Not yet supported!\n", .comment = "Some Composite and S-Video inputs are currently working.\n",
.v4l2_capabilities = 0, .v4l2_capabilities = CX18_CAP_ENCODER,
.hw_audio_ctrl = CX18_HW_CX23418, .hw_audio_ctrl = CX18_HW_CX23418,
.hw_all = CX18_HW_TUNER, .hw_all = CX18_HW_TUNER,
.video_inputs = { .video_inputs = {
{ CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, { CX18_CARD_INPUT_VID_TUNER, 0, CX18_AV_COMPOSITE2 },
{ CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, { CX18_CARD_INPUT_SVIDEO1, 1,
{ CX18_CARD_INPUT_COMPOSITE1, 1, CX23418_COMPOSITE3 }, CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 },
{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 },
{ CX18_CARD_INPUT_SVIDEO2, 2,
CX18_AV_SVIDEO_LUMA7 | CX18_AV_SVIDEO_CHROMA8 },
{ CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE6 },
{ CX18_CARD_INPUT_COMPOSITE3, 2, CX18_AV_COMPOSITE3 },
}, },
.audio_inputs = { .audio_inputs = {
{ CX18_CARD_INPUT_AUD_TUNER, { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO5, 0 },
CX23418_AUDIO8, 0 }, { CX18_CARD_INPUT_LINE_IN1, CX18_AV_AUDIO_SERIAL, 0 },
{ CX18_CARD_INPUT_LINE_IN1, { CX18_CARD_INPUT_LINE_IN2, CX18_AV_AUDIO_SERIAL, 0 },
CX23418_AUDIO_SERIAL, 0 },
}, },
.radio_input = { CX18_CARD_INPUT_AUD_TUNER, .radio_input = { CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO_SERIAL, 0 },
CX23418_AUDIO_SERIAL, 0 },
.tuners = { .tuners = {
/* XC3028 tuner */ /* XC3028 tuner */
{ .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 },
......
...@@ -36,36 +36,6 @@ ...@@ -36,36 +36,6 @@
#define CX18_CARD_INPUT_COMPOSITE2 5 #define CX18_CARD_INPUT_COMPOSITE2 5
#define CX18_CARD_INPUT_COMPOSITE3 6 #define CX18_CARD_INPUT_COMPOSITE3 6
enum cx34180_video_input {
/* Composite video inputs In1-In8 */
CX23418_COMPOSITE1 = 1,
CX23418_COMPOSITE2,
CX23418_COMPOSITE3,
CX23418_COMPOSITE4,
CX23418_COMPOSITE5,
CX23418_COMPOSITE6,
CX23418_COMPOSITE7,
CX23418_COMPOSITE8,
/* S-Video inputs consist of one luma input (In1-In4) ORed with one
chroma input (In5-In8) */
CX23418_SVIDEO_LUMA1 = 0x10,
CX23418_SVIDEO_LUMA2 = 0x20,
CX23418_SVIDEO_LUMA3 = 0x30,
CX23418_SVIDEO_LUMA4 = 0x40,
CX23418_SVIDEO_CHROMA4 = 0x400,
CX23418_SVIDEO_CHROMA5 = 0x500,
CX23418_SVIDEO_CHROMA6 = 0x600,
CX23418_SVIDEO_CHROMA7 = 0x700,
CX23418_SVIDEO_CHROMA8 = 0x800,
/* S-Video aliases for common luma/chroma combinations */
CX23418_SVIDEO1 = 0x510,
CX23418_SVIDEO2 = 0x620,
CX23418_SVIDEO3 = 0x730,
CX23418_SVIDEO4 = 0x840,
};
/* audio inputs */ /* audio inputs */
#define CX18_CARD_INPUT_AUD_TUNER 1 #define CX18_CARD_INPUT_AUD_TUNER 1
#define CX18_CARD_INPUT_LINE_IN1 2 #define CX18_CARD_INPUT_LINE_IN1 2
...@@ -75,16 +45,6 @@ enum cx34180_video_input { ...@@ -75,16 +45,6 @@ enum cx34180_video_input {
#define CX18_CARD_MAX_AUDIO_INPUTS 3 #define CX18_CARD_MAX_AUDIO_INPUTS 3
#define CX18_CARD_MAX_TUNERS 2 #define CX18_CARD_MAX_TUNERS 2
enum cx23418_audio_input {
/* Audio inputs: serial or In4-In8 */
CX23418_AUDIO_SERIAL,
CX23418_AUDIO4 = 4,
CX23418_AUDIO5,
CX23418_AUDIO6,
CX23418_AUDIO7,
CX23418_AUDIO8,
};
/* V4L2 capability aliases */ /* V4L2 capability aliases */
#define CX18_CAP_ENCODER (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | \ #define CX18_CAP_ENCODER (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER | \
V4L2_CAP_AUDIO | V4L2_CAP_READWRITE) V4L2_CAP_AUDIO | V4L2_CAP_READWRITE)
...@@ -118,6 +78,13 @@ struct cx18_gpio_init { /* set initial GPIO DIR and OUT values */ ...@@ -118,6 +78,13 @@ struct cx18_gpio_init { /* set initial GPIO DIR and OUT values */
u32 initial_value; u32 initial_value;
}; };
struct cx18_gpio_i2c_slave_reset {
u32 active_lo_mask; /* GPIO outputs that reset i2c chips when low */
u32 active_hi_mask; /* GPIO outputs that reset i2c chips when high */
int msecs_asserted; /* time period reset must remain asserted */
int msecs_recovery; /* time after deassert for chips to be ready */
};
struct cx18_card_tuner { struct cx18_card_tuner {
v4l2_std_id std; /* standard for which the tuner is suitable */ v4l2_std_id std; /* standard for which the tuner is suitable */
int tuner; /* tuner ID (from tuner.h) */ int tuner; /* tuner ID (from tuner.h) */
...@@ -154,7 +121,8 @@ struct cx18_card { ...@@ -154,7 +121,8 @@ struct cx18_card {
/* GPIO card-specific settings */ /* GPIO card-specific settings */
u8 xceive_pin; /* XCeive tuner GPIO reset pin */ u8 xceive_pin; /* XCeive tuner GPIO reset pin */
struct cx18_gpio_init gpio_init; struct cx18_gpio_init gpio_init;
struct cx18_gpio_i2c_slave_reset gpio_i2c_slave_reset;
struct cx18_card_tuner tuners[CX18_CARD_MAX_TUNERS]; struct cx18_card_tuner tuners[CX18_CARD_MAX_TUNERS];
struct cx18_card_tuner_i2c *i2c; struct cx18_card_tuner_i2c *i2c;
......
...@@ -69,11 +69,21 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed) ...@@ -69,11 +69,21 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed)
struct dvb_demux *demux = feed->demux; struct dvb_demux *demux = feed->demux;
struct cx18_stream *stream = (struct cx18_stream *) demux->priv; struct cx18_stream *stream = (struct cx18_stream *) demux->priv;
struct cx18 *cx = stream->cx; struct cx18 *cx = stream->cx;
int ret = -EINVAL; int ret;
u32 v; u32 v;
CX18_DEBUG_INFO("Start feed: pid = 0x%x index = %d\n", CX18_DEBUG_INFO("Start feed: pid = 0x%x index = %d\n",
feed->pid, feed->index); feed->pid, feed->index);
mutex_lock(&cx->serialize_lock);
ret = cx18_init_on_first_open(cx);
mutex_unlock(&cx->serialize_lock);
if (ret) {
CX18_ERR("Failed to initialize firmware starting DVB feed\n");
return ret;
}
ret = -EINVAL;
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:
...@@ -101,6 +111,11 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed) ...@@ -101,6 +111,11 @@ static int cx18_dvb_start_feed(struct dvb_demux_feed *feed)
if (stream->dvb.feeding++ == 0) { if (stream->dvb.feeding++ == 0) {
CX18_DEBUG_INFO("Starting Transport DMA\n"); CX18_DEBUG_INFO("Starting Transport DMA\n");
ret = cx18_start_v4l2_encode_stream(stream); ret = cx18_start_v4l2_encode_stream(stream);
if (ret < 0) {
CX18_DEBUG_INFO(
"Failed to start Transport DMA\n");
stream->dvb.feeding--;
}
} else } else
ret = 0; ret = 0;
mutex_unlock(&stream->dvb.feedlock); mutex_unlock(&stream->dvb.feedlock);
......
...@@ -53,10 +53,34 @@ static void gpio_write(struct cx18 *cx) ...@@ -53,10 +53,34 @@ static void gpio_write(struct cx18 *cx)
write_reg(((dir & 0xffff) << 16) | (val & 0xffff), write_reg(((dir & 0xffff) << 16) | (val & 0xffff),
CX18_REG_GPIO_OUT1); CX18_REG_GPIO_OUT1);
write_reg(dir & 0xffff0000, CX18_REG_GPIO_DIR2); write_reg(dir & 0xffff0000, CX18_REG_GPIO_DIR2);
write_reg((dir & 0xffff0000) | ((val & 0xffff0000) >> 16), write_reg_sync((dir & 0xffff0000) | ((val & 0xffff0000) >> 16),
CX18_REG_GPIO_OUT2); CX18_REG_GPIO_OUT2);
} }
void cx18_reset_i2c_slaves_gpio(struct cx18 *cx)
{
const struct cx18_gpio_i2c_slave_reset *p;
p = &cx->card->gpio_i2c_slave_reset;
if ((p->active_lo_mask | p->active_hi_mask) == 0)
return;
/* Assuming that the masks are a subset of the bits in gpio_dir */
/* Assert */
cx->gpio_val =
(cx->gpio_val | p->active_hi_mask) & ~(p->active_lo_mask);
gpio_write(cx);
schedule_timeout_uninterruptible(msecs_to_jiffies(p->msecs_asserted));
/* Deassert */
cx->gpio_val =
(cx->gpio_val | p->active_lo_mask) & ~(p->active_hi_mask);
gpio_write(cx);
schedule_timeout_uninterruptible(msecs_to_jiffies(p->msecs_recovery));
}
void cx18_gpio_init(struct cx18 *cx) void cx18_gpio_init(struct cx18 *cx)
{ {
cx->gpio_dir = cx->card->gpio_init.direction; cx->gpio_dir = cx->card->gpio_init.direction;
......
...@@ -21,4 +21,5 @@ ...@@ -21,4 +21,5 @@
*/ */
void cx18_gpio_init(struct cx18 *cx); void cx18_gpio_init(struct cx18 *cx);
void cx18_reset_i2c_slaves_gpio(struct cx18 *cx);
int cx18_reset_tuner_gpio(void *dev, int cmd, int value); int cx18_reset_tuner_gpio(void *dev, int cmd, int value);
...@@ -405,6 +405,8 @@ int init_cx18_i2c(struct cx18 *cx) ...@@ -405,6 +405,8 @@ int init_cx18_i2c(struct cx18 *cx)
cx18_setscl(&cx->i2c_algo_cb_data[1], 1); cx18_setscl(&cx->i2c_algo_cb_data[1], 1);
cx18_setsda(&cx->i2c_algo_cb_data[1], 1); cx18_setsda(&cx->i2c_algo_cb_data[1], 1);
cx18_reset_i2c_slaves_gpio(cx);
return i2c_bit_add_bus(&cx->i2c_adap[0]) || return i2c_bit_add_bus(&cx->i2c_adap[0]) ||
i2c_bit_add_bus(&cx->i2c_adap[1]); i2c_bit_add_bus(&cx->i2c_adap[1]);
} }
......
...@@ -433,7 +433,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp ...@@ -433,7 +433,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
int chroma = vid_input & 0xf00; int chroma = vid_input & 0xf00;
if ((vid_input & ~0xff0) || if ((vid_input & ~0xff0) ||
luma < CX25840_SVIDEO_LUMA1 || luma > CX25840_SVIDEO_LUMA4 || luma < CX25840_SVIDEO_LUMA1 || luma > CX25840_SVIDEO_LUMA8 ||
chroma < CX25840_SVIDEO_CHROMA4 || chroma > CX25840_SVIDEO_CHROMA8) { chroma < CX25840_SVIDEO_CHROMA4 || chroma > CX25840_SVIDEO_CHROMA8) {
v4l_err(client, "0x%04x is not a valid video input!\n", v4l_err(client, "0x%04x is not a valid video input!\n",
vid_input); vid_input);
......
...@@ -332,6 +332,12 @@ static int snd_cx88_pcm_open(struct snd_pcm_substream *substream) ...@@ -332,6 +332,12 @@ static int snd_cx88_pcm_open(struct snd_pcm_substream *substream)
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
int err; int err;
if (!chip) {
printk(KERN_ERR "BUG: cx88 can't find device struct."
" Can't proceed with open\n");
return -ENODEV;
}
err = snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIODS); err = snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIODS);
if (err < 0) if (err < 0)
goto _error; goto _error;
......
...@@ -268,6 +268,12 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) ...@@ -268,6 +268,12 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream)
dprintk("opening device and trying to acquire exclusive lock\n"); dprintk("opening device and trying to acquire exclusive lock\n");
if (!dev) {
printk(KERN_ERR "BUG: em28xx can't find device struct."
" Can't proceed with open\n");
return -ENODEV;
}
/* Sets volume, mute, etc */ /* Sets volume, mute, etc */
dev->mute = 0; dev->mute = 0;
...@@ -415,6 +421,12 @@ static int em28xx_audio_init(struct em28xx *dev) ...@@ -415,6 +421,12 @@ static int em28xx_audio_init(struct em28xx *dev)
static int devnr; static int devnr;
int ret, err; int ret, err;
if (dev->has_audio_class) {
/* This device does not support the extension (in this case
the device is expecting the snd-usb-audio module */
return 0;
}
printk(KERN_INFO "em28xx-audio.c: probing for em28x1 " printk(KERN_INFO "em28xx-audio.c: probing for em28x1 "
"non standard usbaudio\n"); "non standard usbaudio\n");
printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2006 Markus " printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2006 Markus "
...@@ -458,6 +470,12 @@ static int em28xx_audio_fini(struct em28xx *dev) ...@@ -458,6 +470,12 @@ static int em28xx_audio_fini(struct em28xx *dev)
if (dev == NULL) if (dev == NULL)
return 0; return 0;
if (dev->has_audio_class) {
/* This device does not support the extension (in this case
the device is expecting the snd-usb-audio module */
return 0;
}
if (dev->adev) { if (dev->adev) {
snd_card_free(dev->adev->sndcard); snd_card_free(dev->adev->sndcard);
kfree(dev->adev); kfree(dev->adev);
......
...@@ -157,6 +157,7 @@ struct em28xx_board em28xx_boards[] = { ...@@ -157,6 +157,7 @@ struct em28xx_board em28xx_boards[] = {
.tda9887_conf = TDA9887_PRESENT, .tda9887_conf = TDA9887_PRESENT,
.tuner_type = TUNER_XC2028, .tuner_type = TUNER_XC2028,
.mts_firmware = 1, .mts_firmware = 1,
.has_dvb = 1,
.decoder = EM28XX_TVP5150, .decoder = EM28XX_TVP5150,
.input = { { .input = { {
.type = EM28XX_VMUX_TELEVISION, .type = EM28XX_VMUX_TELEVISION,
...@@ -524,6 +525,9 @@ void em28xx_pre_card_setup(struct em28xx *dev) ...@@ -524,6 +525,9 @@ void em28xx_pre_card_setup(struct em28xx *dev)
rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID); rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
if (rc > 0) { if (rc > 0) {
switch (rc) { switch (rc) {
case CHIP_ID_EM2860:
em28xx_info("chip ID is em2860\n");
break;
case CHIP_ID_EM2883: case CHIP_ID_EM2883:
em28xx_info("chip ID is em2882/em2883\n"); em28xx_info("chip ID is em2882/em2883\n");
dev->wait_after_write = 0; dev->wait_after_write = 0;
......
...@@ -382,6 +382,11 @@ static int dvb_init(struct em28xx *dev) ...@@ -382,6 +382,11 @@ static int dvb_init(struct em28xx *dev)
int result = 0; int result = 0;
struct em28xx_dvb *dvb; struct em28xx_dvb *dvb;
if (!dev->has_dvb) {
/* This device does not support the extension */
return 0;
}
dvb = kzalloc(sizeof(struct em28xx_dvb), GFP_KERNEL); dvb = kzalloc(sizeof(struct em28xx_dvb), GFP_KERNEL);
if (dvb == NULL) { if (dvb == NULL) {
...@@ -444,6 +449,11 @@ static int dvb_init(struct em28xx *dev) ...@@ -444,6 +449,11 @@ static int dvb_init(struct em28xx *dev)
static int dvb_fini(struct em28xx *dev) static int dvb_fini(struct em28xx *dev)
{ {
if (!dev->has_dvb) {
/* This device does not support the extension */
return 0;
}
if (dev->dvb) { if (dev->dvb) {
unregister_dvb(dev->dvb); unregister_dvb(dev->dvb);
dev->dvb = NULL; dev->dvb = NULL;
......
...@@ -84,5 +84,6 @@ ...@@ -84,5 +84,6 @@
/* FIXME: Need to be populated with the other chip ID's */ /* FIXME: Need to be populated with the other chip ID's */
enum em28xx_chip_id { enum em28xx_chip_id {
CHIP_ID_EM2860 = 34,
CHIP_ID_EM2883 = 36, CHIP_ID_EM2883 = 36,
}; };
...@@ -1848,32 +1848,28 @@ static DEFINE_MUTEX(em28xx_extension_devlist_lock); ...@@ -1848,32 +1848,28 @@ static DEFINE_MUTEX(em28xx_extension_devlist_lock);
int em28xx_register_extension(struct em28xx_ops *ops) int em28xx_register_extension(struct em28xx_ops *ops)
{ {
struct em28xx *h, *dev = NULL; struct em28xx *dev = NULL;
list_for_each_entry(h, &em28xx_devlist, devlist)
dev = h;
mutex_lock(&em28xx_extension_devlist_lock); mutex_lock(&em28xx_extension_devlist_lock);
list_add_tail(&ops->next, &em28xx_extension_devlist); list_add_tail(&ops->next, &em28xx_extension_devlist);
if (dev) list_for_each_entry(dev, &em28xx_devlist, devlist) {
ops->init(dev); if (dev)
ops->init(dev);
}
printk(KERN_INFO "Em28xx: Initialized (%s) extension\n", ops->name); printk(KERN_INFO "Em28xx: Initialized (%s) extension\n", ops->name);
mutex_unlock(&em28xx_extension_devlist_lock); mutex_unlock(&em28xx_extension_devlist_lock);
return 0; return 0;
} }
EXPORT_SYMBOL(em28xx_register_extension); EXPORT_SYMBOL(em28xx_register_extension);
void em28xx_unregister_extension(struct em28xx_ops *ops) void em28xx_unregister_extension(struct em28xx_ops *ops)
{ {
struct em28xx *h, *dev = NULL; struct em28xx *dev = NULL;
list_for_each_entry(h, &em28xx_devlist, devlist)
dev = h;
if (dev) list_for_each_entry(dev, &em28xx_devlist, devlist) {
ops->fini(dev); if (dev)
ops->fini(dev);
}
mutex_lock(&em28xx_extension_devlist_lock); mutex_lock(&em28xx_extension_devlist_lock);
printk(KERN_INFO "Em28xx: Removed (%s) extension\n", ops->name); printk(KERN_INFO "Em28xx: Removed (%s) extension\n", ops->name);
......
...@@ -1019,12 +1019,12 @@ static int pxa_camera_probe(struct platform_device *pdev) ...@@ -1019,12 +1019,12 @@ static int pxa_camera_probe(struct platform_device *pdev)
struct pxa_camera_dev *pcdev; struct pxa_camera_dev *pcdev;
struct resource *res; struct resource *res;
void __iomem *base; void __iomem *base;
unsigned int irq; int irq;
int err = 0; int err = 0;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (!res || !irq) { if (!res || irq < 0) {
err = -ENODEV; err = -ENODEV;
goto exit; goto exit;
} }
......
...@@ -613,9 +613,15 @@ static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream) ...@@ -613,9 +613,15 @@ static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream)
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
snd_card_saa7134_pcm_t *pcm; snd_card_saa7134_pcm_t *pcm;
snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
struct saa7134_dev *dev = saa7134->dev; struct saa7134_dev *dev;
int amux, err; int amux, err;
if (!saa7134) {
printk(KERN_ERR "BUG: saa7134 can't find device struct."
" Can't proceed with open\n");
return -ENODEV;
}
dev = saa7134->dev;
mutex_lock(&dev->dmasound.lock); mutex_lock(&dev->dmasound.lock);
dev->dmasound.read_count = 0; dev->dmasound.read_count = 0;
......
...@@ -4114,11 +4114,7 @@ struct saa7134_board saa7134_boards[] = { ...@@ -4114,11 +4114,7 @@ struct saa7134_board saa7134_boards[] = {
.radio_type = UNSET, .radio_type = UNSET,
.tuner_addr = ADDR_UNSET, .tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET,
/*
TODO:
.mpeg = SAA7134_MPEG_DVB, .mpeg = SAA7134_MPEG_DVB,
*/
.inputs = {{ .inputs = {{
.name = name_tv, .name = name_tv,
.vmux = 1, .vmux = 1,
...@@ -4157,7 +4153,7 @@ struct saa7134_board saa7134_boards[] = { ...@@ -4157,7 +4153,7 @@ struct saa7134_board saa7134_boards[] = {
} }, } },
.radio = { .radio = {
.name = name_radio, .name = name_radio,
.amux = LINE1, .amux = TV,
}, },
}, },
[SAA7134_BOARD_AVERMEDIA_M115] = { [SAA7134_BOARD_AVERMEDIA_M115] = {
...@@ -4167,6 +4163,7 @@ struct saa7134_board saa7134_boards[] = { ...@@ -4167,6 +4163,7 @@ struct saa7134_board saa7134_boards[] = {
.radio_type = UNSET, .radio_type = UNSET,
.tuner_addr = ADDR_UNSET, .tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET, .radio_addr = ADDR_UNSET,
.mpeg = SAA7134_MPEG_DVB,
.inputs = {{ .inputs = {{
.name = name_tv, .name = name_tv,
.vmux = 1, .vmux = 1,
...@@ -5351,22 +5348,21 @@ static int saa7134_xc2028_callback(struct saa7134_dev *dev, ...@@ -5351,22 +5348,21 @@ static int saa7134_xc2028_callback(struct saa7134_dev *dev,
{ {
switch (command) { switch (command) {
case XC2028_TUNER_RESET: case XC2028_TUNER_RESET:
saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x06e20000, 0x06e20000); saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00008000, 0x00000000);
saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x06a20000, 0x06a20000); saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00008000, 0x00008000);
mdelay(250); switch (dev->board) {
saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x06e20000, 0); case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x06a20000, 0); saa7134_set_gpio(dev, 23, 0);
mdelay(250); msleep(10);
saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x06e20000, 0x06e20000); saa7134_set_gpio(dev, 23, 1);
saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x06a20000, 0x06a20000); break;
mdelay(250); case SAA7134_BOARD_AVERMEDIA_A16D:
saa_andorl(SAA7133_ANALOG_IO_SELECT >> 2, 0x02, 0x02); saa7134_set_gpio(dev, 21, 0);
saa_andorl(SAA7134_ANALOG_IN_CTRL1 >> 2, 0x81, 0x81); msleep(10);
saa_andorl(SAA7134_AUDIO_CLOCK0 >> 2, 0x03187de7, 0x03187de7); saa7134_set_gpio(dev, 21, 1);
saa_andorl(SAA7134_AUDIO_PLL_CTRL >> 2, 0x03, 0x03); break;
saa_andorl(SAA7134_AUDIO_CLOCKS_PER_FIELD0 >> 2, }
0x0001e000, 0x0001e000); return 0;
return 0;
} }
return -EINVAL; return -EINVAL;
} }
...@@ -5553,9 +5549,7 @@ int saa7134_board_init1(struct saa7134_dev *dev) ...@@ -5553,9 +5549,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x08000000, 0x00000000); saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x08000000, 0x00000000);
break; break;
case SAA7134_BOARD_AVERMEDIA_CARDBUS: case SAA7134_BOARD_AVERMEDIA_CARDBUS:
case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
case SAA7134_BOARD_AVERMEDIA_M115: case SAA7134_BOARD_AVERMEDIA_M115:
case SAA7134_BOARD_AVERMEDIA_A16D:
/* power-down tuner chip */ /* power-down tuner chip */
saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0xffffffff, 0); saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0xffffffff, 0);
saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0); saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0);
...@@ -5565,6 +5559,18 @@ int saa7134_board_init1(struct saa7134_dev *dev) ...@@ -5565,6 +5559,18 @@ int saa7134_board_init1(struct saa7134_dev *dev)
saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0xffffffff); saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0xffffffff);
msleep(10); msleep(10);
break; break;
case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
saa7134_set_gpio(dev, 23, 0);
msleep(10);
saa7134_set_gpio(dev, 23, 1);
break;
case SAA7134_BOARD_AVERMEDIA_A16D:
saa7134_set_gpio(dev, 21, 0);
msleep(10);
saa7134_set_gpio(dev, 21, 1);
msleep(1);
dev->has_remote = SAA7134_REMOTE_GPIO;
break;
case SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM: case SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM:
/* power-down tuner chip */ /* power-down tuner chip */
saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x000A8004, 0x000A8004); saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x000A8004, 0x000A8004);
...@@ -5615,7 +5621,8 @@ int saa7134_board_init1(struct saa7134_dev *dev) ...@@ -5615,7 +5621,8 @@ int saa7134_board_init1(struct saa7134_dev *dev)
saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x80040100, 0x80040100); saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x80040100, 0x80040100);
saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x80040100, 0x00040100); saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x80040100, 0x00040100);
printk("%s: %s: hybrid analog/dvb card\n" printk("%s: %s: hybrid analog/dvb card\n"
"%s: Sorry, only the analog inputs are supported for now.\n", "%s: Sorry, only analog s-video and composite input "
"are supported for now.\n",
dev->name, card(dev).name, dev->name); dev->name, card(dev).name, dev->name);
break; break;
} }
...@@ -5675,6 +5682,7 @@ static void saa7134_tuner_setup(struct saa7134_dev *dev) ...@@ -5675,6 +5682,7 @@ static void saa7134_tuner_setup(struct saa7134_dev *dev)
switch (dev->board) { switch (dev->board) {
case SAA7134_BOARD_AVERMEDIA_A16D: case SAA7134_BOARD_AVERMEDIA_A16D:
case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
ctl.demod = XC3028_FE_ZARLINK456; ctl.demod = XC3028_FE_ZARLINK456;
break; break;
default: default:
......
...@@ -153,12 +153,12 @@ static int mt352_aver777_init(struct dvb_frontend* fe) ...@@ -153,12 +153,12 @@ static int mt352_aver777_init(struct dvb_frontend* fe)
return 0; return 0;
} }
static int mt352_aver_a16d_init(struct dvb_frontend *fe) static int mt352_avermedia_xc3028_init(struct dvb_frontend *fe)
{ {
static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x2d }; static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x2d };
static u8 reset [] = { RESET, 0x80 }; static u8 reset [] = { RESET, 0x80 };
static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 }; static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
static u8 agc_cfg [] = { AGC_TARGET, 0x28, 0xa0 }; static u8 agc_cfg [] = { AGC_TARGET, 0xe };
static u8 capt_range_cfg[] = { CAPT_RANGE, 0x33 }; static u8 capt_range_cfg[] = { CAPT_RANGE, 0x33 };
mt352_write(fe, clock_config, sizeof(clock_config)); mt352_write(fe, clock_config, sizeof(clock_config));
...@@ -167,12 +167,9 @@ static int mt352_aver_a16d_init(struct dvb_frontend *fe) ...@@ -167,12 +167,9 @@ static int mt352_aver_a16d_init(struct dvb_frontend *fe)
mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg)); mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
mt352_write(fe, agc_cfg, sizeof(agc_cfg)); mt352_write(fe, agc_cfg, sizeof(agc_cfg));
mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg)); mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
return 0; return 0;
} }
static int mt352_pinnacle_tuner_set_params(struct dvb_frontend* fe, static int mt352_pinnacle_tuner_set_params(struct dvb_frontend* fe,
struct dvb_frontend_parameters* params) struct dvb_frontend_parameters* params)
{ {
...@@ -215,14 +212,10 @@ static struct mt352_config avermedia_777 = { ...@@ -215,14 +212,10 @@ static struct mt352_config avermedia_777 = {
.demod_init = mt352_aver777_init, .demod_init = mt352_aver777_init,
}; };
static struct mt352_config avermedia_16d = { static struct mt352_config avermedia_xc3028_mt352_dev = {
.demod_address = 0xf,
.demod_init = mt352_aver_a16d_init,
};
static struct mt352_config avermedia_e506r_mt352_dev = {
.demod_address = (0x1e >> 1), .demod_address = (0x1e >> 1),
.no_tuner = 1, .no_tuner = 1,
.demod_init = mt352_avermedia_xc3028_init,
}; };
/* ================================================================== /* ==================================================================
...@@ -975,9 +968,10 @@ static int dvb_init(struct saa7134_dev *dev) ...@@ -975,9 +968,10 @@ static int dvb_init(struct saa7134_dev *dev)
} }
break; break;
case SAA7134_BOARD_AVERMEDIA_A16D: case SAA7134_BOARD_AVERMEDIA_A16D:
dprintk("avertv A16D dvb setup\n"); dprintk("AverMedia A16D dvb setup\n");
dev->dvb.frontend = dvb_attach(mt352_attach, &avermedia_16d, dev->dvb.frontend = dvb_attach(mt352_attach,
&dev->i2c_adap); &avermedia_xc3028_mt352_dev,
&dev->i2c_adap);
attach_xc3028 = 1; attach_xc3028 = 1;
break; break;
case SAA7134_BOARD_MD7134: case SAA7134_BOARD_MD7134:
...@@ -1091,7 +1085,8 @@ static int dvb_init(struct saa7134_dev *dev) ...@@ -1091,7 +1085,8 @@ static int dvb_init(struct saa7134_dev *dev)
ads_tech_duo_config.tuner_address); ads_tech_duo_config.tuner_address);
goto dettach_frontend; goto dettach_frontend;
} }
} } else
wprintk("failed to attach tda10046\n");
break; break;
case SAA7134_BOARD_TEVION_DVBT_220RF: case SAA7134_BOARD_TEVION_DVBT_220RF:
if (configure_tda827x_fe(dev, &tevion_dvbt220rf_config, if (configure_tda827x_fe(dev, &tevion_dvbt220rf_config,
...@@ -1260,11 +1255,14 @@ static int dvb_init(struct saa7134_dev *dev) ...@@ -1260,11 +1255,14 @@ static int dvb_init(struct saa7134_dev *dev)
goto dettach_frontend; goto dettach_frontend;
break; break;
case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
dprintk("AverMedia E506R dvb setup\n");
saa7134_set_gpio(dev, 25, 0);
msleep(10);
saa7134_set_gpio(dev, 25, 1);
dev->dvb.frontend = dvb_attach(mt352_attach, dev->dvb.frontend = dvb_attach(mt352_attach,
&avermedia_e506r_mt352_dev, &avermedia_xc3028_mt352_dev,
&dev->i2c_adap); &dev->i2c_adap);
attach_xc3028 = 1; attach_xc3028 = 1;
break;
case SAA7134_BOARD_MD7134_BRIDGE_2: case SAA7134_BOARD_MD7134_BRIDGE_2:
dev->dvb.frontend = dvb_attach(tda10086_attach, dev->dvb.frontend = dvb_attach(tda10086_attach,
&sd1878_4m, &dev->i2c_adap); &sd1878_4m, &dev->i2c_adap);
...@@ -1338,7 +1336,8 @@ static int dvb_init(struct saa7134_dev *dev) ...@@ -1338,7 +1336,8 @@ static int dvb_init(struct saa7134_dev *dev)
return ret; return ret;
dettach_frontend: dettach_frontend:
dvb_frontend_detach(dev->dvb.frontend); if (dev->dvb.frontend)
dvb_frontend_detach(dev->dvb.frontend);
dev->dvb.frontend = NULL; dev->dvb.frontend = NULL;
return -1; return -1;
......
...@@ -110,9 +110,10 @@ static int ts_release(struct inode *inode, struct file *file) ...@@ -110,9 +110,10 @@ static int ts_release(struct inode *inode, struct file *file)
{ {
struct saa7134_dev *dev = file->private_data; struct saa7134_dev *dev = file->private_data;
mutex_lock(&dev->empress_tsq.vb_lock);
videobuf_stop(&dev->empress_tsq); videobuf_stop(&dev->empress_tsq);
videobuf_mmap_free(&dev->empress_tsq); videobuf_mmap_free(&dev->empress_tsq);
dev->empress_users--;
/* stop the encoder */ /* stop the encoder */
ts_reset_encoder(dev); ts_reset_encoder(dev);
...@@ -121,6 +122,10 @@ static int ts_release(struct inode *inode, struct file *file) ...@@ -121,6 +122,10 @@ static int ts_release(struct inode *inode, struct file *file)
saa_writeb(SAA7134_AUDIO_MUTE_CTRL, saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6)); saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6));
dev->empress_users--;
mutex_unlock(&dev->empress_tsq.vb_lock);
return 0; return 0;
} }
...@@ -218,8 +223,7 @@ static int empress_enum_fmt_cap(struct file *file, void *priv, ...@@ -218,8 +223,7 @@ static int empress_enum_fmt_cap(struct file *file, void *priv,
static int empress_g_fmt_cap(struct file *file, void *priv, static int empress_g_fmt_cap(struct file *file, void *priv,
struct v4l2_format *f) struct v4l2_format *f)
{ {
struct saa7134_fh *fh = priv; struct saa7134_dev *dev = file->private_data;
struct saa7134_dev *dev = fh->dev;
saa7134_i2c_call_clients(dev, VIDIOC_G_FMT, f); saa7134_i2c_call_clients(dev, VIDIOC_G_FMT, f);
...@@ -232,8 +236,7 @@ static int empress_g_fmt_cap(struct file *file, void *priv, ...@@ -232,8 +236,7 @@ static int empress_g_fmt_cap(struct file *file, void *priv,
static int empress_s_fmt_cap(struct file *file, void *priv, static int empress_s_fmt_cap(struct file *file, void *priv,
struct v4l2_format *f) struct v4l2_format *f)
{ {
struct saa7134_fh *fh = priv; struct saa7134_dev *dev = file->private_data;
struct saa7134_dev *dev = fh->dev;
saa7134_i2c_call_clients(dev, VIDIOC_S_FMT, f); saa7134_i2c_call_clients(dev, VIDIOC_S_FMT, f);
...@@ -247,8 +250,7 @@ static int empress_s_fmt_cap(struct file *file, void *priv, ...@@ -247,8 +250,7 @@ static int empress_s_fmt_cap(struct file *file, void *priv,
static int empress_reqbufs(struct file *file, void *priv, static int empress_reqbufs(struct file *file, void *priv,
struct v4l2_requestbuffers *p) struct v4l2_requestbuffers *p)
{ {
struct saa7134_fh *fh = priv; struct saa7134_dev *dev = file->private_data;
struct saa7134_dev *dev = fh->dev;
return videobuf_reqbufs(&dev->empress_tsq, p); return videobuf_reqbufs(&dev->empress_tsq, p);
} }
...@@ -256,24 +258,21 @@ static int empress_reqbufs(struct file *file, void *priv, ...@@ -256,24 +258,21 @@ static int empress_reqbufs(struct file *file, void *priv,
static int empress_querybuf(struct file *file, void *priv, static int empress_querybuf(struct file *file, void *priv,
struct v4l2_buffer *b) struct v4l2_buffer *b)
{ {
struct saa7134_fh *fh = priv; struct saa7134_dev *dev = file->private_data;
struct saa7134_dev *dev = fh->dev;
return videobuf_querybuf(&dev->empress_tsq, b); return videobuf_querybuf(&dev->empress_tsq, b);
} }
static int empress_qbuf(struct file *file, void *priv, struct v4l2_buffer *b) static int empress_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
{ {
struct saa7134_fh *fh = priv; struct saa7134_dev *dev = file->private_data;
struct saa7134_dev *dev = fh->dev;
return videobuf_qbuf(&dev->empress_tsq, b); return videobuf_qbuf(&dev->empress_tsq, b);
} }
static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
{ {
struct saa7134_fh *fh = priv; struct saa7134_dev *dev = file->private_data;
struct saa7134_dev *dev = fh->dev;
return videobuf_dqbuf(&dev->empress_tsq, b, return videobuf_dqbuf(&dev->empress_tsq, b,
file->f_flags & O_NONBLOCK); file->f_flags & O_NONBLOCK);
...@@ -282,8 +281,7 @@ static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b) ...@@ -282,8 +281,7 @@ static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
static int empress_streamon(struct file *file, void *priv, static int empress_streamon(struct file *file, void *priv,
enum v4l2_buf_type type) enum v4l2_buf_type type)
{ {
struct saa7134_fh *fh = priv; struct saa7134_dev *dev = file->private_data;
struct saa7134_dev *dev = fh->dev;
return videobuf_streamon(&dev->empress_tsq); return videobuf_streamon(&dev->empress_tsq);
} }
...@@ -291,8 +289,7 @@ static int empress_streamon(struct file *file, void *priv, ...@@ -291,8 +289,7 @@ static int empress_streamon(struct file *file, void *priv,
static int empress_streamoff(struct file *file, void *priv, static int empress_streamoff(struct file *file, void *priv,
enum v4l2_buf_type type) enum v4l2_buf_type type)
{ {
struct saa7134_fh *fh = priv; struct saa7134_dev *dev = file->private_data;
struct saa7134_dev *dev = fh->dev;
return videobuf_streamoff(&dev->empress_tsq); return videobuf_streamoff(&dev->empress_tsq);
} }
...@@ -300,8 +297,7 @@ static int empress_streamoff(struct file *file, void *priv, ...@@ -300,8 +297,7 @@ static int empress_streamoff(struct file *file, void *priv,
static int empress_s_ext_ctrls(struct file *file, void *priv, static int empress_s_ext_ctrls(struct file *file, void *priv,
struct v4l2_ext_controls *ctrls) struct v4l2_ext_controls *ctrls)
{ {
struct saa7134_fh *fh = priv; struct saa7134_dev *dev = file->private_data;
struct saa7134_dev *dev = fh->dev;
/* count == 0 is abused in saa6752hs.c, so that special /* count == 0 is abused in saa6752hs.c, so that special
case is handled here explicitly. */ case is handled here explicitly. */
...@@ -320,8 +316,7 @@ static int empress_s_ext_ctrls(struct file *file, void *priv, ...@@ -320,8 +316,7 @@ static int empress_s_ext_ctrls(struct file *file, void *priv,
static int empress_g_ext_ctrls(struct file *file, void *priv, static int empress_g_ext_ctrls(struct file *file, void *priv,
struct v4l2_ext_controls *ctrls) struct v4l2_ext_controls *ctrls)
{ {
struct saa7134_fh *fh = priv; struct saa7134_dev *dev = file->private_data;
struct saa7134_dev *dev = fh->dev;
if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
return -EINVAL; return -EINVAL;
......
...@@ -323,6 +323,15 @@ int saa7134_input_init1(struct saa7134_dev *dev) ...@@ -323,6 +323,15 @@ int saa7134_input_init1(struct saa7134_dev *dev)
saa_setb(SAA7134_GPIO_GPMODE1, 0x1); saa_setb(SAA7134_GPIO_GPMODE1, 0x1);
saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1); saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1);
break; break;
case SAA7134_BOARD_AVERMEDIA_A16D:
ir_codes = ir_codes_avermedia_a16d;
mask_keycode = 0x02F200;
mask_keydown = 0x000400;
polling = 50; /* ms */
/* Without this we won't receive key up events */
saa_setb(SAA7134_GPIO_GPMODE1, 0x1);
saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1);
break;
case SAA7134_BOARD_KWORLD_TERMINATOR: case SAA7134_BOARD_KWORLD_TERMINATOR:
ir_codes = ir_codes_pixelview; ir_codes = ir_codes_pixelview;
mask_keycode = 0x00001f; mask_keycode = 0x00001f;
......
...@@ -763,15 +763,6 @@ static struct device_driver ic_drv = { ...@@ -763,15 +763,6 @@ static struct device_driver ic_drv = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };
/*
* Image capture host - this is a host device, not a bus device, so,
* no bus reference, no probing.
*/
static struct class soc_camera_host_class = {
.owner = THIS_MODULE,
.name = "camera_host",
};
static void dummy_release(struct device *dev) static void dummy_release(struct device *dev)
{ {
} }
...@@ -801,7 +792,6 @@ int soc_camera_host_register(struct soc_camera_host *ici) ...@@ -801,7 +792,6 @@ int soc_camera_host_register(struct soc_camera_host *ici)
/* Number might be equal to the platform device ID */ /* Number might be equal to the platform device ID */
sprintf(ici->dev.bus_id, "camera_host%d", ici->nr); sprintf(ici->dev.bus_id, "camera_host%d", ici->nr);
ici->dev.class = &soc_camera_host_class;
mutex_lock(&list_lock); mutex_lock(&list_lock);
list_for_each_entry(ix, &hosts, list) { list_for_each_entry(ix, &hosts, list) {
...@@ -1003,14 +993,9 @@ static int __init soc_camera_init(void) ...@@ -1003,14 +993,9 @@ static int __init soc_camera_init(void)
ret = driver_register(&ic_drv); ret = driver_register(&ic_drv);
if (ret) if (ret)
goto edrvr; goto edrvr;
ret = class_register(&soc_camera_host_class);
if (ret)
goto eclr;
return 0; return 0;
eclr:
driver_unregister(&ic_drv);
edrvr: edrvr:
bus_unregister(&soc_camera_bus_type); bus_unregister(&soc_camera_bus_type);
return ret; return ret;
...@@ -1018,7 +1003,6 @@ static int __init soc_camera_init(void) ...@@ -1018,7 +1003,6 @@ static int __init soc_camera_init(void)
static void __exit soc_camera_exit(void) static void __exit soc_camera_exit(void)
{ {
class_unregister(&soc_camera_host_class);
driver_unregister(&ic_drv); driver_unregister(&ic_drv);
bus_unregister(&soc_camera_bus_type); bus_unregister(&soc_camera_bus_type);
} }
......
...@@ -51,12 +51,51 @@ ...@@ -51,12 +51,51 @@
#define VIDEO_NUM_DEVICES 256 #define VIDEO_NUM_DEVICES 256
#define VIDEO_NAME "video4linux" #define VIDEO_NAME "video4linux"
struct std_descr {
v4l2_std_id std;
const char *descr;
};
static const struct std_descr standards[] = {
{ V4L2_STD_NTSC, "NTSC" },
{ V4L2_STD_NTSC_M, "NTSC-M" },
{ V4L2_STD_NTSC_M_JP, "NTSC-M-JP" },
{ V4L2_STD_NTSC_M_KR, "NTSC-M-KR" },
{ V4L2_STD_NTSC_443, "NTSC-443" },
{ V4L2_STD_PAL, "PAL" },
{ V4L2_STD_PAL_BG, "PAL-BG" },
{ V4L2_STD_PAL_B, "PAL-B" },
{ V4L2_STD_PAL_B1, "PAL-B1" },
{ V4L2_STD_PAL_G, "PAL-G" },
{ V4L2_STD_PAL_H, "PAL-H" },
{ V4L2_STD_PAL_I, "PAL-I" },
{ V4L2_STD_PAL_DK, "PAL-DK" },
{ V4L2_STD_PAL_D, "PAL-D" },
{ V4L2_STD_PAL_D1, "PAL-D1" },
{ V4L2_STD_PAL_K, "PAL-K" },
{ V4L2_STD_PAL_M, "PAL-M" },
{ V4L2_STD_PAL_N, "PAL-N" },
{ V4L2_STD_PAL_Nc, "PAL-Nc" },
{ V4L2_STD_PAL_60, "PAL-60" },
{ V4L2_STD_SECAM, "SECAM" },
{ V4L2_STD_SECAM_B, "SECAM-B" },
{ V4L2_STD_SECAM_G, "SECAM-G" },
{ V4L2_STD_SECAM_H, "SECAM-H" },
{ V4L2_STD_SECAM_DK, "SECAM-DK" },
{ V4L2_STD_SECAM_D, "SECAM-D" },
{ V4L2_STD_SECAM_K, "SECAM-K" },
{ V4L2_STD_SECAM_K1, "SECAM-K1" },
{ V4L2_STD_SECAM_L, "SECAM-L" },
{ V4L2_STD_SECAM_LC, "SECAM-Lc" },
{ 0, "Unknown" }
};
/* video4linux standard ID conversion to standard name /* video4linux standard ID conversion to standard name
*/ */
char *v4l2_norm_to_name(v4l2_std_id id) const char *v4l2_norm_to_name(v4l2_std_id id)
{ {
char *name;
u32 myid = id; u32 myid = id;
int i;
/* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle /* HACK: ppc32 architecture doesn't have __ucmpdi2 function to handle
64 bit comparations. So, on that architecture, with some gcc 64 bit comparations. So, on that architecture, with some gcc
...@@ -64,110 +103,17 @@ char *v4l2_norm_to_name(v4l2_std_id id) ...@@ -64,110 +103,17 @@ char *v4l2_norm_to_name(v4l2_std_id id)
*/ */
BUG_ON(myid != id); BUG_ON(myid != id);
switch (myid) { for (i = 0; standards[i].std; i++)
case V4L2_STD_PAL: if (myid == standards[i].std)
name = "PAL"; break;
break; return standards[i].descr;
case V4L2_STD_PAL_BG:
name = "PAL-BG";
break;
case V4L2_STD_PAL_DK:
name = "PAL-DK";
break;
case V4L2_STD_PAL_B:
name = "PAL-B";
break;
case V4L2_STD_PAL_B1:
name = "PAL-B1";
break;
case V4L2_STD_PAL_G:
name = "PAL-G";
break;
case V4L2_STD_PAL_H:
name = "PAL-H";
break;
case V4L2_STD_PAL_I:
name = "PAL-I";
break;
case V4L2_STD_PAL_D:
name = "PAL-D";
break;
case V4L2_STD_PAL_D1:
name = "PAL-D1";
break;
case V4L2_STD_PAL_K:
name = "PAL-K";
break;
case V4L2_STD_PAL_M:
name = "PAL-M";
break;
case V4L2_STD_PAL_N:
name = "PAL-N";
break;
case V4L2_STD_PAL_Nc:
name = "PAL-Nc";
break;
case V4L2_STD_PAL_60:
name = "PAL-60";
break;
case V4L2_STD_NTSC:
name = "NTSC";
break;
case V4L2_STD_NTSC_M:
name = "NTSC-M";
break;
case V4L2_STD_NTSC_M_JP:
name = "NTSC-M-JP";
break;
case V4L2_STD_NTSC_443:
name = "NTSC-443";
break;
case V4L2_STD_NTSC_M_KR:
name = "NTSC-M-KR";
break;
case V4L2_STD_SECAM:
name = "SECAM";
break;
case V4L2_STD_SECAM_DK:
name = "SECAM-DK";
break;
case V4L2_STD_SECAM_B:
name = "SECAM-B";
break;
case V4L2_STD_SECAM_D:
name = "SECAM-D";
break;
case V4L2_STD_SECAM_G:
name = "SECAM-G";
break;
case V4L2_STD_SECAM_H:
name = "SECAM-H";
break;
case V4L2_STD_SECAM_K:
name = "SECAM-K";
break;
case V4L2_STD_SECAM_K1:
name = "SECAM-K1";
break;
case V4L2_STD_SECAM_L:
name = "SECAM-L";
break;
case V4L2_STD_SECAM_LC:
name = "SECAM-LC";
break;
default:
name = "Unknown";
break;
}
return name;
} }
EXPORT_SYMBOL(v4l2_norm_to_name); EXPORT_SYMBOL(v4l2_norm_to_name);
/* Fill in the fields of a v4l2_standard structure according to the /* Fill in the fields of a v4l2_standard structure according to the
'id' and 'transmission' parameters. Returns negative on error. */ 'id' and 'transmission' parameters. Returns negative on error. */
int v4l2_video_std_construct(struct v4l2_standard *vs, int v4l2_video_std_construct(struct v4l2_standard *vs,
int id, char *name) int id, const char *name)
{ {
u32 index = vs->index; u32 index = vs->index;
...@@ -1218,95 +1164,40 @@ static int __video_do_ioctl(struct inode *inode, struct file *file, ...@@ -1218,95 +1164,40 @@ static int __video_do_ioctl(struct inode *inode, struct file *file,
case VIDIOC_ENUMSTD: case VIDIOC_ENUMSTD:
{ {
struct v4l2_standard *p = arg; struct v4l2_standard *p = arg;
v4l2_std_id id = vfd->tvnorms,curr_id=0; v4l2_std_id id = vfd->tvnorms, curr_id = 0;
unsigned int index = p->index,i; unsigned int index = p->index, i, j = 0;
const char *descr = "";
if (index<0) {
ret=-EINVAL; /* Return norm array in a canonical way */
break; for (i = 0; i <= index && id; i++) {
} /* last std value in the standards array is 0, so this
while always ends there since (id & 0) == 0. */
/* Return norm array on a canonical way */ while ((id & standards[j].std) != standards[j].std)
for (i=0;i<= index && id; i++) { j++;
if ( (id & V4L2_STD_PAL) == V4L2_STD_PAL) { curr_id = standards[j].std;
curr_id = V4L2_STD_PAL; descr = standards[j].descr;
} else if ( (id & V4L2_STD_PAL_BG) == V4L2_STD_PAL_BG) { j++;
curr_id = V4L2_STD_PAL_BG; if (curr_id == 0)
} else if ( (id & V4L2_STD_PAL_DK) == V4L2_STD_PAL_DK) {
curr_id = V4L2_STD_PAL_DK;
} else if ( (id & V4L2_STD_PAL_B) == V4L2_STD_PAL_B) {
curr_id = V4L2_STD_PAL_B;
} else if ( (id & V4L2_STD_PAL_B1) == V4L2_STD_PAL_B1) {
curr_id = V4L2_STD_PAL_B1;
} else if ( (id & V4L2_STD_PAL_G) == V4L2_STD_PAL_G) {
curr_id = V4L2_STD_PAL_G;
} else if ( (id & V4L2_STD_PAL_H) == V4L2_STD_PAL_H) {
curr_id = V4L2_STD_PAL_H;
} else if ( (id & V4L2_STD_PAL_I) == V4L2_STD_PAL_I) {
curr_id = V4L2_STD_PAL_I;
} else if ( (id & V4L2_STD_PAL_D) == V4L2_STD_PAL_D) {
curr_id = V4L2_STD_PAL_D;
} else if ( (id & V4L2_STD_PAL_D1) == V4L2_STD_PAL_D1) {
curr_id = V4L2_STD_PAL_D1;
} else if ( (id & V4L2_STD_PAL_K) == V4L2_STD_PAL_K) {
curr_id = V4L2_STD_PAL_K;
} else if ( (id & V4L2_STD_PAL_M) == V4L2_STD_PAL_M) {
curr_id = V4L2_STD_PAL_M;
} else if ( (id & V4L2_STD_PAL_N) == V4L2_STD_PAL_N) {
curr_id = V4L2_STD_PAL_N;
} else if ( (id & V4L2_STD_PAL_Nc) == V4L2_STD_PAL_Nc) {
curr_id = V4L2_STD_PAL_Nc;
} else if ( (id & V4L2_STD_PAL_60) == V4L2_STD_PAL_60) {
curr_id = V4L2_STD_PAL_60;
} else if ( (id & V4L2_STD_NTSC) == V4L2_STD_NTSC) {
curr_id = V4L2_STD_NTSC;
} else if ( (id & V4L2_STD_NTSC_M) == V4L2_STD_NTSC_M) {
curr_id = V4L2_STD_NTSC_M;
} else if ( (id & V4L2_STD_NTSC_M_JP) == V4L2_STD_NTSC_M_JP) {
curr_id = V4L2_STD_NTSC_M_JP;
} else if ( (id & V4L2_STD_NTSC_443) == V4L2_STD_NTSC_443) {
curr_id = V4L2_STD_NTSC_443;
} else if ( (id & V4L2_STD_NTSC_M_KR) == V4L2_STD_NTSC_M_KR) {
curr_id = V4L2_STD_NTSC_M_KR;
} else if ( (id & V4L2_STD_SECAM) == V4L2_STD_SECAM) {
curr_id = V4L2_STD_SECAM;
} else if ( (id & V4L2_STD_SECAM_DK) == V4L2_STD_SECAM_DK) {
curr_id = V4L2_STD_SECAM_DK;
} else if ( (id & V4L2_STD_SECAM_B) == V4L2_STD_SECAM_B) {
curr_id = V4L2_STD_SECAM_B;
} else if ( (id & V4L2_STD_SECAM_D) == V4L2_STD_SECAM_D) {
curr_id = V4L2_STD_SECAM_D;
} else if ( (id & V4L2_STD_SECAM_G) == V4L2_STD_SECAM_G) {
curr_id = V4L2_STD_SECAM_G;
} else if ( (id & V4L2_STD_SECAM_H) == V4L2_STD_SECAM_H) {
curr_id = V4L2_STD_SECAM_H;
} else if ( (id & V4L2_STD_SECAM_K) == V4L2_STD_SECAM_K) {
curr_id = V4L2_STD_SECAM_K;
} else if ( (id & V4L2_STD_SECAM_K1) == V4L2_STD_SECAM_K1) {
curr_id = V4L2_STD_SECAM_K1;
} else if ( (id & V4L2_STD_SECAM_L) == V4L2_STD_SECAM_L) {
curr_id = V4L2_STD_SECAM_L;
} else if ( (id & V4L2_STD_SECAM_LC) == V4L2_STD_SECAM_LC) {
curr_id = V4L2_STD_SECAM_LC;
} else {
break; break;
} if (curr_id != V4L2_STD_PAL &&
id &= ~curr_id; curr_id != V4L2_STD_SECAM &&
curr_id != V4L2_STD_NTSC)
id &= ~curr_id;
} }
if (i<=index) if (i <= index)
return -EINVAL; return -EINVAL;
v4l2_video_std_construct(p, curr_id,v4l2_norm_to_name(curr_id)); v4l2_video_std_construct(p, curr_id, descr);
p->index = index; p->index = index;
dbgarg (cmd, "index=%d, id=%Ld, name=%s, fps=%d/%d, " dbgarg(cmd, "index=%d, id=%Ld, name=%s, fps=%d/%d, "
"framelines=%d\n", p->index, "framelines=%d\n", p->index,
(unsigned long long)p->id, p->name, (unsigned long long)p->id, p->name,
p->frameperiod.numerator, p->frameperiod.numerator,
p->frameperiod.denominator, p->frameperiod.denominator,
p->framelines); p->framelines);
ret=0; ret = 0;
break; break;
} }
case VIDIOC_G_STD: case VIDIOC_G_STD:
......
...@@ -327,13 +327,14 @@ static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf) ...@@ -327,13 +327,14 @@ static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf)
int hmax = buf->vb.height; int hmax = buf->vb.height;
int wmax = buf->vb.width; int wmax = buf->vb.width;
struct timeval ts; struct timeval ts;
char *tmpbuf = kmalloc(wmax * 2, GFP_ATOMIC); char *tmpbuf;
void *vbuf = videobuf_to_vmalloc(&buf->vb); void *vbuf = videobuf_to_vmalloc(&buf->vb);
if (!tmpbuf) if (!vbuf)
return; return;
if (!vbuf) tmpbuf = kmalloc(wmax * 2, GFP_ATOMIC);
if (!tmpbuf)
return; return;
for (h = 0; h < hmax; h++) { for (h = 0; h < hmax; h++) {
......
...@@ -32,12 +32,16 @@ enum cx25840_video_input { ...@@ -32,12 +32,16 @@ enum cx25840_video_input {
CX25840_COMPOSITE7, CX25840_COMPOSITE7,
CX25840_COMPOSITE8, CX25840_COMPOSITE8,
/* S-Video inputs consist of one luma input (In1-In4) ORed with one /* S-Video inputs consist of one luma input (In1-In8) ORed with one
chroma input (In5-In8) */ chroma input (In5-In8) */
CX25840_SVIDEO_LUMA1 = 0x10, CX25840_SVIDEO_LUMA1 = 0x10,
CX25840_SVIDEO_LUMA2 = 0x20, CX25840_SVIDEO_LUMA2 = 0x20,
CX25840_SVIDEO_LUMA3 = 0x30, CX25840_SVIDEO_LUMA3 = 0x30,
CX25840_SVIDEO_LUMA4 = 0x40, CX25840_SVIDEO_LUMA4 = 0x40,
CX25840_SVIDEO_LUMA5 = 0x50,
CX25840_SVIDEO_LUMA6 = 0x60,
CX25840_SVIDEO_LUMA7 = 0x70,
CX25840_SVIDEO_LUMA8 = 0x80,
CX25840_SVIDEO_CHROMA4 = 0x400, CX25840_SVIDEO_CHROMA4 = 0x400,
CX25840_SVIDEO_CHROMA5 = 0x500, CX25840_SVIDEO_CHROMA5 = 0x500,
CX25840_SVIDEO_CHROMA6 = 0x600, CX25840_SVIDEO_CHROMA6 = 0x600,
......
...@@ -146,6 +146,7 @@ extern IR_KEYTAB_TYPE ir_codes_behold_columbus[IR_KEYTAB_SIZE]; ...@@ -146,6 +146,7 @@ extern IR_KEYTAB_TYPE ir_codes_behold_columbus[IR_KEYTAB_SIZE];
extern IR_KEYTAB_TYPE ir_codes_pinnacle_pctv_hd[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_pinnacle_pctv_hd[IR_KEYTAB_SIZE];
extern IR_KEYTAB_TYPE ir_codes_genius_tvgo_a11mce[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_genius_tvgo_a11mce[IR_KEYTAB_SIZE];
extern IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE]; extern IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE];
extern IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE];
#endif #endif
......
...@@ -40,9 +40,9 @@ ...@@ -40,9 +40,9 @@
#define VFL_TYPE_VTX 3 #define VFL_TYPE_VTX 3
/* Video standard functions */ /* Video standard functions */
extern char *v4l2_norm_to_name(v4l2_std_id id); extern const char *v4l2_norm_to_name(v4l2_std_id id);
extern int v4l2_video_std_construct(struct v4l2_standard *vs, extern int v4l2_video_std_construct(struct v4l2_standard *vs,
int id, char *name); int id, const char *name);
/* Prints the ioctl in a human-readable format */ /* Prints the ioctl in a human-readable format */
extern void v4l_printk_ioctl(unsigned int cmd); extern void v4l_printk_ioctl(unsigned int cmd);
......
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