Merge tag 'media/v5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media

Pull media updates from Mauro Carvalho Chehab:

 - new Atmel microship ISC driver

 - coda has gained support for mpeg2 and mpeg4

 - cxusb gained support for analog TV

 - rockchip staging driver was split into two separate staging drivers

 - added a new staging driver for Allegro DVT video IP core

 - added a new staging driver for Amlogic Meson video decoder

 - lots of improvements and cleanups

* tag 'media/v5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (398 commits)
  media: allegro: use new v4l2_m2m_ioctl_try_encoder_cmd funcs
  media: doc-rst: Fix typos
  media: radio-raremono: change devm_k*alloc to k*alloc
  media: stv0297: fix frequency range limit
  media: rc: Prefer KEY_NUMERIC_* for number buttons on remotes
  media: dvb_frontend: split dvb_frontend_handle_ioctl function
  media: mceusb: disable "nonsensical irdata" messages
  media: rc: remove redundant dev_err message
  media: cec-notifier: add new notifier functions
  media: cec: add struct cec_connector_info support
  media: cec-notifier: rename variables, check kstrdup and n->conn_name
  media: MAINTAINERS: Add maintainers for Media Controller
  media: staging: media: tegra-vde: Defer dmabuf's unmapping
  media: staging: media: tegra-vde: Add IOMMU support
  media: hdpvr: fix locking and a missing msleep
  media: v4l2: Test type instead of cfg->type in v4l2_ctrl_new_custom()
  media: atmel: atmel-isc: fix i386 build error
  media: v4l2-ctrl: Move compound control initialization
  media: hantro: Use vb2_get_buffer
  media: pci: cx88: Change the type of 'missed' to u64
  ...
这个提交包含在:
Linus Torvalds
2019-07-09 09:47:22 -07:00
当前提交 ed63b9c873
修改 591 个文件,包含 25519 行新增9457 行删除

查看文件

@@ -41,6 +41,8 @@ config VIDEO_PVRUSB2_DVB
select DVB_S5H1409 if MEDIA_SUBDRV_AUTOSELECT
select DVB_S5H1411 if MEDIA_SUBDRV_AUTOSELECT
select DVB_TDA10048 if MEDIA_SUBDRV_AUTOSELECT
select DVB_LGDT3306A if MEDIA_SUBDRV_AUTOSELECT
select DVB_SI2168 if MEDIA_SUBDRV_AUTOSELECT
select MEDIA_TUNER_TDA18271 if MEDIA_SUBDRV_AUTOSELECT
select MEDIA_TUNER_SIMPLE if MEDIA_SUBDRV_AUTOSELECT
select MEDIA_TUNER_TDA8290 if MEDIA_SUBDRV_AUTOSELECT

查看文件

@@ -101,10 +101,35 @@ static const struct routing_scheme routing_defav400 = {
.cnt = ARRAY_SIZE(routing_schemeav400),
};
static const struct routing_scheme_item routing_scheme160xxx[] = {
[PVR2_CVAL_INPUT_TV] = {
.vid = CX25840_COMPOSITE7,
.aud = CX25840_AUDIO8,
},
[PVR2_CVAL_INPUT_RADIO] = {
.vid = CX25840_COMPOSITE4,
.aud = CX25840_AUDIO6,
},
[PVR2_CVAL_INPUT_COMPOSITE] = {
.vid = CX25840_COMPOSITE3,
.aud = CX25840_AUDIO_SERIAL,
},
[PVR2_CVAL_INPUT_SVIDEO] = {
.vid = CX25840_SVIDEO1,
.aud = CX25840_AUDIO_SERIAL,
},
};
static const struct routing_scheme routing_def160xxx = {
.def = routing_scheme160xxx,
.cnt = ARRAY_SIZE(routing_scheme160xxx),
};
static const struct routing_scheme *routing_schemes[] = {
[PVR2_ROUTING_SCHEME_HAUPPAUGE] = &routing_def0,
[PVR2_ROUTING_SCHEME_GOTVIEW] = &routing_defgv,
[PVR2_ROUTING_SCHEME_AV400] = &routing_defav400,
[PVR2_ROUTING_SCHEME_HAUP160XXX] = &routing_def160xxx,
};
void pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)

查看文件

@@ -27,6 +27,9 @@ pvr2_device_desc structures.
#include "tda18271.h"
#include "tda8290.h"
#include "tuner-simple.h"
#include "si2157.h"
#include "lgdt3306a.h"
#include "si2168.h"
#endif
@@ -178,10 +181,10 @@ static struct lgdt330x_config pvr2_lgdt3303_config = {
static int pvr2_lgdt3303_attach(struct pvr2_dvb_adapter *adap)
{
adap->fe = dvb_attach(lgdt330x_attach, &pvr2_lgdt3303_config,
0x0e,
&adap->channel.hdw->i2c_adap);
if (adap->fe)
adap->fe[0] = dvb_attach(lgdt330x_attach, &pvr2_lgdt3303_config,
0x0e,
&adap->channel.hdw->i2c_adap);
if (adap->fe[0])
return 0;
return -EIO;
@@ -189,7 +192,7 @@ static int pvr2_lgdt3303_attach(struct pvr2_dvb_adapter *adap)
static int pvr2_lgh06xf_attach(struct pvr2_dvb_adapter *adap)
{
dvb_attach(simple_tuner_attach, adap->fe,
dvb_attach(simple_tuner_attach, adap->fe[0],
&adap->channel.hdw->i2c_adap, 0x61,
TUNER_LG_TDVS_H06XF);
@@ -238,10 +241,10 @@ static struct lgdt330x_config pvr2_lgdt3302_config = {
static int pvr2_lgdt3302_attach(struct pvr2_dvb_adapter *adap)
{
adap->fe = dvb_attach(lgdt330x_attach, &pvr2_lgdt3302_config,
0x0e,
&adap->channel.hdw->i2c_adap);
if (adap->fe)
adap->fe[0] = dvb_attach(lgdt330x_attach, &pvr2_lgdt3302_config,
0x0e,
&adap->channel.hdw->i2c_adap);
if (adap->fe[0])
return 0;
return -EIO;
@@ -249,7 +252,7 @@ static int pvr2_lgdt3302_attach(struct pvr2_dvb_adapter *adap)
static int pvr2_fcv1236d_attach(struct pvr2_dvb_adapter *adap)
{
dvb_attach(simple_tuner_attach, adap->fe,
dvb_attach(simple_tuner_attach, adap->fe[0],
&adap->channel.hdw->i2c_adap, 0x61,
TUNER_PHILIPS_FCV1236D);
@@ -325,9 +328,9 @@ static struct tda18271_config hauppauge_tda18271_dvb_config = {
static int pvr2_tda10048_attach(struct pvr2_dvb_adapter *adap)
{
adap->fe = dvb_attach(tda10048_attach, &hauppauge_tda10048_config,
&adap->channel.hdw->i2c_adap);
if (adap->fe)
adap->fe[0] = dvb_attach(tda10048_attach, &hauppauge_tda10048_config,
&adap->channel.hdw->i2c_adap);
if (adap->fe[0])
return 0;
return -EIO;
@@ -335,10 +338,10 @@ static int pvr2_tda10048_attach(struct pvr2_dvb_adapter *adap)
static int pvr2_73xxx_tda18271_8295_attach(struct pvr2_dvb_adapter *adap)
{
dvb_attach(tda829x_attach, adap->fe,
dvb_attach(tda829x_attach, adap->fe[0],
&adap->channel.hdw->i2c_adap, 0x42,
&tda829x_no_probe);
dvb_attach(tda18271_attach, adap->fe, 0x60,
dvb_attach(tda18271_attach, adap->fe[0], 0x60,
&adap->channel.hdw->i2c_adap,
&hauppauge_tda18271_dvb_config);
@@ -423,9 +426,9 @@ static struct tda18271_config hauppauge_tda18271_config = {
static int pvr2_s5h1409_attach(struct pvr2_dvb_adapter *adap)
{
adap->fe = dvb_attach(s5h1409_attach, &pvr2_s5h1409_config,
&adap->channel.hdw->i2c_adap);
if (adap->fe)
adap->fe[0] = dvb_attach(s5h1409_attach, &pvr2_s5h1409_config,
&adap->channel.hdw->i2c_adap);
if (adap->fe[0])
return 0;
return -EIO;
@@ -433,9 +436,9 @@ static int pvr2_s5h1409_attach(struct pvr2_dvb_adapter *adap)
static int pvr2_s5h1411_attach(struct pvr2_dvb_adapter *adap)
{
adap->fe = dvb_attach(s5h1411_attach, &pvr2_s5h1411_config,
&adap->channel.hdw->i2c_adap);
if (adap->fe)
adap->fe[0] = dvb_attach(s5h1411_attach, &pvr2_s5h1411_config,
&adap->channel.hdw->i2c_adap);
if (adap->fe[0])
return 0;
return -EIO;
@@ -443,10 +446,10 @@ static int pvr2_s5h1411_attach(struct pvr2_dvb_adapter *adap)
static int pvr2_tda18271_8295_attach(struct pvr2_dvb_adapter *adap)
{
dvb_attach(tda829x_attach, adap->fe,
dvb_attach(tda829x_attach, adap->fe[0],
&adap->channel.hdw->i2c_adap, 0x42,
&tda829x_no_probe);
dvb_attach(tda18271_attach, adap->fe, 0x60,
dvb_attach(tda18271_attach, adap->fe[0], 0x60,
&adap->channel.hdw->i2c_adap,
&hauppauge_tda18271_config);
@@ -515,7 +518,166 @@ static const struct pvr2_device_desc pvr2_device_751xx = {
#endif
};
/*------------------------------------------------------------------------*/
/* Hauppauge PVR-USB2 Model 160000 / 160111 -- HVR-1955 / HVR-1975 */
#ifdef CONFIG_VIDEO_PVRUSB2_DVB
static int pvr2_si2157_attach(struct pvr2_dvb_adapter *adap);
static int pvr2_si2168_attach(struct pvr2_dvb_adapter *adap);
static int pvr2_dual_fe_attach(struct pvr2_dvb_adapter *adap);
static int pvr2_lgdt3306a_attach(struct pvr2_dvb_adapter *adap);
static const struct pvr2_dvb_props pvr2_160000_dvb_props = {
.frontend_attach = pvr2_dual_fe_attach,
.tuner_attach = pvr2_si2157_attach,
};
static const struct pvr2_dvb_props pvr2_160111_dvb_props = {
.frontend_attach = pvr2_lgdt3306a_attach,
.tuner_attach = pvr2_si2157_attach,
};
static int pvr2_si2157_attach(struct pvr2_dvb_adapter *adap)
{
struct si2157_config si2157_config = {};
si2157_config.inversion = 1;
si2157_config.fe = adap->fe[0];
adap->i2c_client_tuner = dvb_module_probe("si2157", "si2177",
&adap->channel.hdw->i2c_adap,
0x60, &si2157_config);
if (!adap->i2c_client_tuner)
return -ENODEV;
return 0;
}
static int pvr2_si2168_attach(struct pvr2_dvb_adapter *adap)
{
struct si2168_config si2168_config = {};
struct i2c_adapter *adapter;
pr_debug("%s()\n", __func__);
si2168_config.fe = &adap->fe[1];
si2168_config.i2c_adapter = &adapter;
si2168_config.ts_mode = SI2168_TS_PARALLEL; /*2, 1-serial, 2-parallel.*/
si2168_config.ts_clock_gapped = 1; /*0-disabled, 1-enabled.*/
si2168_config.ts_clock_inv = 0; /*0-not-invert, 1-invert*/
si2168_config.spectral_inversion = 1; /*0-not-invert, 1-invert*/
adap->i2c_client_demod[1] = dvb_module_probe("si2168", NULL,
&adap->channel.hdw->i2c_adap,
0x64, &si2168_config);
if (!adap->i2c_client_demod[1])
return -ENODEV;
return 0;
}
static int pvr2_lgdt3306a_attach(struct pvr2_dvb_adapter *adap)
{
struct lgdt3306a_config lgdt3306a_config;
struct i2c_adapter *adapter;
pr_debug("%s()\n", __func__);
lgdt3306a_config.fe = &adap->fe[0];
lgdt3306a_config.i2c_adapter = &adapter;
lgdt3306a_config.deny_i2c_rptr = 1;
lgdt3306a_config.spectral_inversion = 1;
lgdt3306a_config.qam_if_khz = 4000;
lgdt3306a_config.vsb_if_khz = 3250;
lgdt3306a_config.mpeg_mode = LGDT3306A_MPEG_PARALLEL;
lgdt3306a_config.tpclk_edge = LGDT3306A_TPCLK_FALLING_EDGE;
lgdt3306a_config.tpvalid_polarity = LGDT3306A_TP_VALID_LOW;
lgdt3306a_config.xtalMHz = 25, /* demod clock MHz; 24/25 supported */
adap->i2c_client_demod[0] = dvb_module_probe("lgdt3306a", NULL,
&adap->channel.hdw->i2c_adap,
0x59, &lgdt3306a_config);
if (!adap->i2c_client_demod[0])
return -ENODEV;
return 0;
}
static int pvr2_dual_fe_attach(struct pvr2_dvb_adapter *adap)
{
pr_debug("%s()\n", __func__);
if (pvr2_lgdt3306a_attach(adap) != 0)
return -ENODEV;
if (pvr2_si2168_attach(adap) != 0) {
dvb_module_release(adap->i2c_client_demod[0]);
return -ENODEV;
}
return 0;
}
#endif
#define PVR2_FIRMWARE_160xxx "v4l-pvrusb2-160xxx-01.fw"
static const char *pvr2_fw1_names_160xxx[] = {
PVR2_FIRMWARE_160xxx,
};
static const struct pvr2_device_client_desc pvr2_cli_160xxx[] = {
{ .module_id = PVR2_CLIENT_ID_CX25840 },
};
static const struct pvr2_device_desc pvr2_device_160000 = {
.description = "WinTV HVR-1975 Model 160000",
.shortname = "160000",
.client_table.lst = pvr2_cli_160xxx,
.client_table.cnt = ARRAY_SIZE(pvr2_cli_160xxx),
.fx2_firmware.lst = pvr2_fw1_names_160xxx,
.fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_160xxx),
.default_tuner_type = TUNER_ABSENT,
.flag_has_cx25840 = 1,
.flag_has_hauppauge_rom = 1,
.flag_has_analogtuner = 1,
.flag_has_composite = 1,
.flag_has_svideo = 1,
.flag_fx2_16kb = 1,
.signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
.digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE,
.default_std_mask = V4L2_STD_NTSC_M,
.led_scheme = PVR2_LED_SCHEME_HAUPPAUGE,
.ir_scheme = PVR2_IR_SCHEME_ZILOG,
#ifdef CONFIG_VIDEO_PVRUSB2_DVB
.dvb_props = &pvr2_160000_dvb_props,
#endif
};
static const struct pvr2_device_desc pvr2_device_160111 = {
.description = "WinTV HVR-1955 Model 160111",
.shortname = "160111",
.client_table.lst = pvr2_cli_160xxx,
.client_table.cnt = ARRAY_SIZE(pvr2_cli_160xxx),
.fx2_firmware.lst = pvr2_fw1_names_160xxx,
.fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_160xxx),
.default_tuner_type = TUNER_ABSENT,
.flag_has_cx25840 = 1,
.flag_has_hauppauge_rom = 1,
.flag_has_analogtuner = 1,
.flag_has_composite = 1,
.flag_has_svideo = 1,
.flag_fx2_16kb = 1,
.signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
.digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE,
.default_std_mask = V4L2_STD_NTSC_M,
.led_scheme = PVR2_LED_SCHEME_HAUPPAUGE,
.ir_scheme = PVR2_IR_SCHEME_ZILOG,
#ifdef CONFIG_VIDEO_PVRUSB2_DVB
.dvb_props = &pvr2_160111_dvb_props,
#endif
};
/*------------------------------------------------------------------------*/
@@ -542,6 +704,10 @@ struct usb_device_id pvr2_device_table[] = {
.driver_info = (kernel_ulong_t)&pvr2_device_751xx},
{ USB_DEVICE(0x0ccd, 0x0039),
.driver_info = (kernel_ulong_t)&pvr2_device_av400},
{ USB_DEVICE(0x2040, 0x7502),
.driver_info = (kernel_ulong_t)&pvr2_device_160111},
{ USB_DEVICE(0x2040, 0x7510),
.driver_info = (kernel_ulong_t)&pvr2_device_160000},
{ }
};

查看文件

@@ -56,6 +56,7 @@ struct pvr2_string_table {
#define PVR2_ROUTING_SCHEME_GOTVIEW 1
#define PVR2_ROUTING_SCHEME_ONAIR 2
#define PVR2_ROUTING_SCHEME_AV400 3
#define PVR2_ROUTING_SCHEME_HAUP160XXX 4
#define PVR2_DIGITAL_SCHEME_NONE 0
#define PVR2_DIGITAL_SCHEME_HAUPPAUGE 1

查看文件

@@ -334,26 +334,19 @@ static int pvr2_dvb_frontend_init(struct pvr2_dvb_adapter *adap)
goto done;
}
if ((dvb_props->frontend_attach(adap) == 0) && (adap->fe)) {
if (dvb_register_frontend(&adap->dvb_adap, adap->fe)) {
if (dvb_props->frontend_attach(adap) == 0 && adap->fe[0]) {
if (dvb_register_frontend(&adap->dvb_adap, adap->fe[0])) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"frontend registration failed!");
dvb_frontend_detach(adap->fe);
adap->fe = NULL;
ret = -ENODEV;
goto done;
goto fail_frontend0;
}
if (adap->fe[0]->ops.analog_ops.standby)
adap->fe[0]->ops.analog_ops.standby(adap->fe[0]);
if (dvb_props->tuner_attach)
dvb_props->tuner_attach(adap);
if (adap->fe->ops.analog_ops.standby)
adap->fe->ops.analog_ops.standby(adap->fe);
/* Ensure all frontends negotiate bus access */
adap->fe->ops.ts_bus_ctrl = pvr2_dvb_bus_ctrl;
pvr2_trace(PVR2_TRACE_INFO, "transferring fe[%d] ts_bus_ctrl() to pvr2_dvb_bus_ctrl()",
adap->fe[0]->id);
adap->fe[0]->ops.ts_bus_ctrl = pvr2_dvb_bus_ctrl;
} else {
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"no frontend was attached!");
@@ -361,17 +354,74 @@ static int pvr2_dvb_frontend_init(struct pvr2_dvb_adapter *adap)
return ret;
}
done:
if (dvb_props->tuner_attach && dvb_props->tuner_attach(adap)) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, "tuner attach failed");
ret = -ENODEV;
goto fail_tuner;
}
if (adap->fe[1]) {
adap->fe[1]->id = 1;
adap->fe[1]->tuner_priv = adap->fe[0]->tuner_priv;
memcpy(&adap->fe[1]->ops.tuner_ops,
&adap->fe[0]->ops.tuner_ops,
sizeof(struct dvb_tuner_ops));
if (dvb_register_frontend(&adap->dvb_adap, adap->fe[1])) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"frontend registration failed!");
ret = -ENODEV;
goto fail_frontend1;
}
/* MFE lock */
adap->dvb_adap.mfe_shared = 1;
if (adap->fe[1]->ops.analog_ops.standby)
adap->fe[1]->ops.analog_ops.standby(adap->fe[1]);
pvr2_trace(PVR2_TRACE_INFO, "transferring fe[%d] ts_bus_ctrl() to pvr2_dvb_bus_ctrl()",
adap->fe[1]->id);
adap->fe[1]->ops.ts_bus_ctrl = pvr2_dvb_bus_ctrl;
}
done:
pvr2_channel_limit_inputs(&adap->channel, 0);
return ret;
fail_frontend1:
dvb_frontend_detach(adap->fe[1]);
adap->fe[1] = NULL;
fail_tuner:
dvb_unregister_frontend(adap->fe[0]);
fail_frontend0:
dvb_frontend_detach(adap->fe[0]);
adap->fe[0] = NULL;
dvb_module_release(adap->i2c_client_tuner);
dvb_module_release(adap->i2c_client_demod[1]);
dvb_module_release(adap->i2c_client_demod[0]);
return ret;
}
static int pvr2_dvb_frontend_exit(struct pvr2_dvb_adapter *adap)
{
if (adap->fe != NULL) {
dvb_unregister_frontend(adap->fe);
dvb_frontend_detach(adap->fe);
if (adap->fe[1]) {
dvb_unregister_frontend(adap->fe[1]);
dvb_frontend_detach(adap->fe[1]);
adap->fe[1] = NULL;
}
if (adap->fe[0]) {
dvb_unregister_frontend(adap->fe[0]);
dvb_frontend_detach(adap->fe[0]);
adap->fe[0] = NULL;
}
dvb_module_release(adap->i2c_client_tuner);
adap->i2c_client_tuner = NULL;
dvb_module_release(adap->i2c_client_demod[1]);
adap->i2c_client_demod[1] = NULL;
dvb_module_release(adap->i2c_client_demod[0]);
adap->i2c_client_demod[0] = NULL;
return 0;
}

查看文件

@@ -18,7 +18,10 @@ struct pvr2_dvb_adapter {
struct dmxdev dmxdev;
struct dvb_demux demux;
struct dvb_net dvb_net;
struct dvb_frontend *fe;
struct dvb_frontend *fe[2];
struct i2c_client *i2c_client_demod[2];
struct i2c_client *i2c_client_tuner;
int feedcount;
int max_feed_count;

查看文件

@@ -28,6 +28,10 @@
#define FX2CMD_FWPOST1 0x52u
/* These 2 only exist on Model 160xxx */
#define FX2CMD_HCW_DEMOD_RESET_PIN 0xd4u
#define FX2CMD_HCW_MAKO_SLEEP_PIN 0xd5u
#define FX2CMD_POWER_OFF 0xdcu
#define FX2CMD_POWER_ON 0xdeu

查看文件

@@ -306,6 +306,8 @@ static const struct pvr2_fx2cmd_descdef pvr2_fx2cmd_desc[] = {
{FX2CMD_ONAIR_DTV_STREAMING_OFF, "onair dtv stream off"},
{FX2CMD_ONAIR_DTV_POWER_ON, "onair dtv power on"},
{FX2CMD_ONAIR_DTV_POWER_OFF, "onair dtv power off"},
{FX2CMD_HCW_DEMOD_RESET_PIN, "hcw demod reset pin"},
{FX2CMD_HCW_MAKO_SLEEP_PIN, "hcw mako sleep pin"},
};
@@ -1670,7 +1672,7 @@ static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl)
}
if (!hdw->flag_decoder_missed) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"WARNING: No decoder present");
"***WARNING*** No decoder present");
hdw->flag_decoder_missed = !0;
trace_stbit("flag_decoder_missed",
hdw->flag_decoder_missed);
@@ -2129,10 +2131,28 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
((0) << 16));
}
// This step MUST happen after the earlier powerup step.
/* This step MUST happen after the earlier powerup step */
pvr2_i2c_core_init(hdw);
if (!pvr2_hdw_dev_ok(hdw)) return;
/* Reset demod only on Hauppauge 160xxx platform */
if (le16_to_cpu(hdw->usb_dev->descriptor.idVendor) == 0x2040 &&
(le16_to_cpu(hdw->usb_dev->descriptor.idProduct) == 0x7502 ||
le16_to_cpu(hdw->usb_dev->descriptor.idProduct) == 0x7510)) {
pr_info("%s(): resetting 160xxx demod\n", __func__);
/* TODO: not sure this is proper place to reset once only */
pvr2_issue_simple_cmd(hdw,
FX2CMD_HCW_DEMOD_RESET_PIN |
(1 << 8) |
((0) << 16));
usleep_range(10000, 10500);
pvr2_issue_simple_cmd(hdw,
FX2CMD_HCW_DEMOD_RESET_PIN |
(1 << 8) |
((1) << 16));
usleep_range(10000, 10500);
}
pvr2_hdw_load_modules(hdw);
if (!pvr2_hdw_dev_ok(hdw)) return;
@@ -2356,7 +2376,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
if (hdw_desc->flag_is_experimental) {
pvr2_trace(PVR2_TRACE_INFO, "**********");
pvr2_trace(PVR2_TRACE_INFO,
"WARNING: Support for this device (%s) is experimental.",
"***WARNING*** Support for this device (%s) is experimental.",
hdw_desc->description);
pvr2_trace(PVR2_TRACE_INFO,
"Important functionality might not be entirely working.");
@@ -4002,6 +4022,20 @@ int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw)
static int pvr2_hdw_cmd_hcw_demod_reset(struct pvr2_hdw *hdw, int onoff)
{
hdw->flag_ok = !0;
/* Use this for Hauppauge 160xxx only */
if (le16_to_cpu(hdw->usb_dev->descriptor.idVendor) == 0x2040 &&
(le16_to_cpu(hdw->usb_dev->descriptor.idProduct) == 0x7502 ||
le16_to_cpu(hdw->usb_dev->descriptor.idProduct) == 0x7510)) {
pr_debug("%s(): resetting demod on Hauppauge 160xxx platform skipped\n",
__func__);
/* Can't reset 160xxx or it will trash Demod tristate */
return pvr2_issue_simple_cmd(hdw,
FX2CMD_HCW_MAKO_SLEEP_PIN |
(1 << 8) |
((onoff ? 1 : 0) << 16));
}
return pvr2_issue_simple_cmd(hdw,
FX2CMD_HCW_DEMOD_RESETIN |
(1 << 8) |

查看文件

@@ -333,11 +333,11 @@ static int i2c_hack_cx25840(struct pvr2_hdw *hdw,
if ((ret != 0) || (*rdata == 0x04) || (*rdata == 0x0a)) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"WARNING: Detected a wedged cx25840 chip; the device will not work.");
"***WARNING*** Detected a wedged cx25840 chip; the device will not work.");
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"WARNING: Try power cycling the pvrusb2 device.");
"***WARNING*** Try power cycling the pvrusb2 device.");
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"WARNING: Disabling further access to the device to prevent other foul-ups.");
"***WARNING*** Disabling further access to the device to prevent other foul-ups.");
// This blocks all further communication with the part.
hdw->i2c_func[0x44] = NULL;
pvr2_hdw_render_useless(hdw);

查看文件

@@ -343,7 +343,7 @@ struct v4l2_standard *pvr2_std_create_enum(unsigned int *countptr,
bcnt = pvr2_std_id_to_str(buf,sizeof(buf),fmsk);
pvr2_trace(
PVR2_TRACE_ERROR_LEGS,
"WARNING: Failed to classify the following standard(s): %.*s",
"***WARNING*** Failed to classify the following standard(s): %.*s",
bcnt,buf);
}

查看文件

@@ -792,7 +792,8 @@ struct pvr2_sysfs_class *pvr2_sysfs_class_create(void)
void pvr2_sysfs_class_destroy(struct pvr2_sysfs_class *clp)
{
pvr2_sysfs_trace("Unregistering pvr2_sysfs_class id=%p", clp);
class_unregister(&clp->class);
if (clp)
class_unregister(&clp->class);
}

查看文件

@@ -118,17 +118,6 @@ static int pvr2_querycap(struct file *file, void *priv, struct v4l2_capability *
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER |
V4L2_CAP_AUDIO | V4L2_CAP_RADIO |
V4L2_CAP_READWRITE | V4L2_CAP_DEVICE_CAPS;
switch (fh->pdi->devbase.vfl_type) {
case VFL_TYPE_GRABBER:
cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_AUDIO;
break;
case VFL_TYPE_RADIO:
cap->device_caps = V4L2_CAP_RADIO;
break;
default:
return -EINVAL;
}
cap->device_caps |= V4L2_CAP_TUNER | V4L2_CAP_READWRITE;
return 0;
}
@@ -1195,6 +1184,8 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
int unit_number;
struct pvr2_hdw *hdw;
int *nr_ptr = NULL;
u32 caps = V4L2_CAP_TUNER | V4L2_CAP_READWRITE;
dip->v4lp = vp;
hdw = vp->channel.mc_head->hdw;
@@ -1205,6 +1196,7 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
dip->config = pvr2_config_mpeg;
dip->minor_type = pvr2_v4l_type_video;
nr_ptr = video_nr;
caps |= V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_AUDIO;
if (!dip->stream) {
pr_err(KBUILD_MODNAME
": Failed to set up pvrusb2 v4l video dev due to missing stream instance\n");
@@ -1215,12 +1207,14 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
dip->config = pvr2_config_vbi;
dip->minor_type = pvr2_v4l_type_vbi;
nr_ptr = vbi_nr;
caps |= V4L2_CAP_VBI_CAPTURE;
break;
case VFL_TYPE_RADIO:
dip->stream = &vp->channel.mc_head->video_stream;
dip->config = pvr2_config_mpeg;
dip->minor_type = pvr2_v4l_type_radio;
nr_ptr = radio_nr;
caps |= V4L2_CAP_RADIO;
break;
default:
/* Bail out (this should be impossible) */
@@ -1231,6 +1225,7 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip,
dip->devbase = vdev_template;
dip->devbase.release = pvr2_video_device_release;
dip->devbase.ioctl_ops = &pvr2_ioctl_ops;
dip->devbase.device_caps = caps;
{
int val;
pvr2_ctrl_get_value(