media_tree updates destined for 2.6.39 and 2.6.40, plus some hid goodness
Signed-off-by: Jarod Wilson <jarod@redhat.com>
This commit is contained in:
parent
36477ddc42
commit
78e43cbafc
@ -2675,9 +2675,6 @@ CONFIG_IR_JVC_DECODER=m
|
||||
CONFIG_IR_SONY_DECODER=m
|
||||
CONFIG_IR_RC5_SZ_DECODER=m
|
||||
CONFIG_IR_LIRC_CODEC=m
|
||||
CONFIG_IR_IMON=m
|
||||
CONFIG_IR_MCEUSB=m
|
||||
CONFIG_IR_NUVOTON=m
|
||||
|
||||
CONFIG_V4L_MEM2MEM_DRIVERS=y
|
||||
# CONFIG_VIDEO_MEM2MEM_TESTDEV is not set
|
||||
@ -3067,6 +3064,7 @@ CONFIG_HID_SONY=m
|
||||
CONFIG_HID_SUNPLUS=m
|
||||
CONFIG_HID_GREENASIA=m
|
||||
CONFIG_HID_SMARTJOYPLUS=m
|
||||
CONFIG_HID_TIVO_SLIDE=m
|
||||
CONFIG_HID_TOPSEED=m
|
||||
CONFIG_HID_THRUSTMASTER=m
|
||||
CONFIG_HID_ZEROPLUS=m
|
||||
@ -4469,6 +4467,10 @@ CONFIG_IR_CORE=m
|
||||
CONFIG_IR_ENE=m
|
||||
CONFIG_IR_STREAMZAP=m
|
||||
CONFIG_IR_WINBOND_CIR=m
|
||||
CONFIG_IR_IMON=m
|
||||
CONFIG_IR_MCEUSB=m
|
||||
CONFIG_IR_NUVOTON=m
|
||||
CONFIG_IR_ITE_CIR=m
|
||||
|
||||
# CONFIG_GPIO_SX150X is not set
|
||||
# CONFIG_MFD_STMPE is not set
|
||||
|
28
kernel.spec
28
kernel.spec
@ -51,7 +51,7 @@ Summary: The Linux kernel
|
||||
# For non-released -rc kernels, this will be prepended with "0.", so
|
||||
# for example a 3 here will become 0.3
|
||||
#
|
||||
%global baserelease 16
|
||||
%global baserelease 17
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
@ -696,12 +696,6 @@ Patch2802: linux-2.6-silence-acpi-blacklist.patch
|
||||
Patch2899: linux-2.6-v4l-dvb-fixes.patch
|
||||
Patch2900: linux-2.6-v4l-dvb-update.patch
|
||||
Patch2901: linux-2.6-v4l-dvb-experimental.patch
|
||||
Patch2902: linux-2.6-v4l-dvb-uvcvideo-update.patch
|
||||
|
||||
Patch2910: linux-2.6-v4l-dvb-add-lgdt3304-support.patch
|
||||
Patch2912: linux-2.6-v4l-dvb-ir-core-update.patch
|
||||
|
||||
#Patch2916: lirc-staging-2.6.36-fixes.patch
|
||||
|
||||
Patch2918: flexcop-fix-xlate_proc_name-warning.patch
|
||||
|
||||
@ -1323,13 +1317,6 @@ ApplyPatch linux-2.6-silence-acpi-blacklist.patch
|
||||
ApplyOptionalPatch linux-2.6-v4l-dvb-fixes.patch
|
||||
ApplyOptionalPatch linux-2.6-v4l-dvb-update.patch
|
||||
ApplyOptionalPatch linux-2.6-v4l-dvb-experimental.patch
|
||||
#ApplyPatch linux-2.6-v4l-dvb-uvcvideo-update.patch
|
||||
#ApplyPatch linux-2.6-v4l-dvb-ir-core-update.patch
|
||||
|
||||
###FIX###ApplyPatch linux-2.6-v4l-dvb-add-lgdt3304-support.patch
|
||||
|
||||
# http://www.lirc.org/
|
||||
#ApplyOptionalPatch lirc-staging-2.6.36-fixes.patch
|
||||
|
||||
# rhbz#664852
|
||||
ApplyPatch flexcop-fix-xlate_proc_name-warning.patch
|
||||
@ -1969,6 +1956,19 @@ fi
|
||||
# and build.
|
||||
|
||||
%changelog
|
||||
* Tue Apr 19 2011 Jarod Wilson <jarod@redhat.com>
|
||||
- Add basic support for full 32-bit NEC IR scancodes
|
||||
- Add latest patches sent upstream for hid layer expansion and full
|
||||
support for the TiVo Slide bluetooth/hid remote
|
||||
- Add a TiVo IR remote keymap, use it by default with TiVo mceusb device
|
||||
- Add ite-cir driver, nuke crappy old lirc_it* drivers
|
||||
- Add an initial Apple remote keymap
|
||||
- Add support for more Nuvoton IR hardware variants
|
||||
- Overhaul lirc_zilog refcounting so it doesn't suck so badly anymore
|
||||
- Clean up myriad of Hauppauge keymaps
|
||||
- Make ir-kbd-i2c pass full rc5 scancodes when it can
|
||||
- Misc minor v4l/dvb fixes
|
||||
|
||||
* Fri Apr 15 2011 Kyle McMartin <kmcmartin@redhat.com>
|
||||
- Drop x86-hibernate-initialize-mmu_cr4_features-during-boot.patch,
|
||||
e5f15b45 was reverted in stable.
|
||||
|
@ -1,350 +0,0 @@
|
||||
From b71e18093e2e7f240797875c50c49552722f8825 Mon Sep 17 00:00:00 2001
|
||||
From: Jarod Wilson <jarod@redhat.com>
|
||||
Date: Mon, 15 Feb 2010 17:13:25 -0500
|
||||
Subject: [PATCH 1/2] dvb: add lgdt3304 support to lgdt3305 driver
|
||||
|
||||
There's a currently-unused lgdt3304 demod driver, which leaves a lot to
|
||||
be desired as far as functionality. The 3304 is unsurprisingly quite
|
||||
similar to the 3305, and empirical testing yeilds far better results
|
||||
and more complete functionality by merging 3304 support into the 3305
|
||||
driver. (For example, the current lgdt3304 driver lacks support for
|
||||
signal strength, snr, ucblocks, etc., which we get w/the lgdt3305).
|
||||
|
||||
For the moment, not dropping the lgdt3304 driver, and its still up to
|
||||
a given device's config setup to choose which demod driver to use, but
|
||||
I'd suggest dropping the 3304 driver entirely.
|
||||
|
||||
As a follow-up to this patch, I've got another patch that adds support
|
||||
for the KWorld PlusTV 340U (ATSC) em2870-based tuner stick, driving
|
||||
its lgdt3304 demod via this lgdt3305 driver, which is what I used to
|
||||
successfully test this patch with both VSB_8 and QAM_256 signals.
|
||||
|
||||
A few pieces are still a touch crude, but I think its a solid start,
|
||||
as well as much cleaner and more feature-complete than the existing
|
||||
lgdt3304 driver.
|
||||
|
||||
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
||||
---
|
||||
drivers/media/dvb/frontends/lgdt3305.c | 206 ++++++++++++++++++++++++++++++--
|
||||
drivers/media/dvb/frontends/lgdt3305.h | 6 +
|
||||
2 files changed, 203 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/media/dvb/frontends/lgdt3305.c b/drivers/media/dvb/frontends/lgdt3305.c
|
||||
index fde8c59..40695e6 100644
|
||||
--- a/drivers/media/dvb/frontends/lgdt3305.c
|
||||
+++ b/drivers/media/dvb/frontends/lgdt3305.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Support for LGDT3305 - VSB/QAM
|
||||
+ * Support for LG Electronics LGDT3304 and LGDT3305 - VSB/QAM
|
||||
*
|
||||
* Copyright (C) 2008, 2009 Michael Krufky <mkrufky@linuxtv.org>
|
||||
*
|
||||
@@ -357,7 +357,10 @@ static int lgdt3305_rfagc_loop(struct lgdt3305_state *state,
|
||||
case QAM_256:
|
||||
agcdelay = 0x046b;
|
||||
rfbw = 0x8889;
|
||||
- ifbw = 0x8888;
|
||||
+ if (state->cfg->demod_chip == LGDT3305)
|
||||
+ ifbw = 0x8888;
|
||||
+ else
|
||||
+ ifbw = 0x6666;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -409,8 +412,18 @@ static int lgdt3305_agc_setup(struct lgdt3305_state *state,
|
||||
lg_dbg("lockdten = %d, acqen = %d\n", lockdten, acqen);
|
||||
|
||||
/* control agc function */
|
||||
- lgdt3305_write_reg(state, LGDT3305_AGC_CTRL_4, 0xe1 | lockdten << 1);
|
||||
- lgdt3305_set_reg_bit(state, LGDT3305_AGC_CTRL_1, 2, acqen);
|
||||
+ switch (state->cfg->demod_chip) {
|
||||
+ case LGDT3304:
|
||||
+ lgdt3305_write_reg(state, 0x0314, 0xe1 | lockdten << 1);
|
||||
+ lgdt3305_set_reg_bit(state, 0x030e, 2, acqen);
|
||||
+ break;
|
||||
+ case LGDT3305:
|
||||
+ lgdt3305_write_reg(state, LGDT3305_AGC_CTRL_4, 0xe1 | lockdten << 1);
|
||||
+ lgdt3305_set_reg_bit(state, LGDT3305_AGC_CTRL_1, 2, acqen);
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
|
||||
return lgdt3305_rfagc_loop(state, param);
|
||||
}
|
||||
@@ -543,6 +556,11 @@ static int lgdt3305_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
|
||||
enable ? 0 : 1);
|
||||
}
|
||||
|
||||
+static int lgdt3304_sleep(struct dvb_frontend *fe)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int lgdt3305_sleep(struct dvb_frontend *fe)
|
||||
{
|
||||
struct lgdt3305_state *state = fe->demodulator_priv;
|
||||
@@ -571,6 +589,55 @@ static int lgdt3305_sleep(struct dvb_frontend *fe)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int lgdt3304_init(struct dvb_frontend *fe)
|
||||
+{
|
||||
+ struct lgdt3305_state *state = fe->demodulator_priv;
|
||||
+ int ret;
|
||||
+
|
||||
+ static struct lgdt3305_reg lgdt3304_init_data[] = {
|
||||
+ { .reg = LGDT3305_GEN_CTRL_1, .val = 0x03, },
|
||||
+ { .reg = 0x000d, .val = 0x02, },
|
||||
+ { .reg = 0x000e, .val = 0x02, },
|
||||
+ { .reg = LGDT3305_DGTL_AGC_REF_1, .val = 0x32, },
|
||||
+ { .reg = LGDT3305_DGTL_AGC_REF_2, .val = 0xc4, },
|
||||
+ { .reg = LGDT3305_CR_CTR_FREQ_1, .val = 0x00, },
|
||||
+ { .reg = LGDT3305_CR_CTR_FREQ_2, .val = 0x00, },
|
||||
+ { .reg = LGDT3305_CR_CTR_FREQ_3, .val = 0x00, },
|
||||
+ { .reg = LGDT3305_CR_CTR_FREQ_4, .val = 0x00, },
|
||||
+ { .reg = LGDT3305_CR_CTRL_7, .val = 0xf9, },
|
||||
+ { .reg = 0x0112, .val = 0x17, },
|
||||
+ { .reg = 0x0113, .val = 0x15, },
|
||||
+ { .reg = 0x0114, .val = 0x18, },
|
||||
+ { .reg = 0x0115, .val = 0xff, },
|
||||
+ { .reg = 0x0116, .val = 0x3c, },
|
||||
+ { .reg = 0x0214, .val = 0x67, },
|
||||
+ { .reg = 0x0424, .val = 0x8d, },
|
||||
+ { .reg = 0x0427, .val = 0x12, },
|
||||
+ { .reg = 0x0428, .val = 0x4f, },
|
||||
+ { .reg = LGDT3305_IFBW_1, .val = 0x80, },
|
||||
+ { .reg = LGDT3305_IFBW_2, .val = 0x00, },
|
||||
+ { .reg = 0x030a, .val = 0x08, },
|
||||
+ { .reg = 0x030b, .val = 0x9b, },
|
||||
+ { .reg = 0x030d, .val = 0x00, },
|
||||
+ { .reg = 0x030e, .val = 0x1c, },
|
||||
+ { .reg = 0x0314, .val = 0xe1, },
|
||||
+ { .reg = 0x000d, .val = 0x82, },
|
||||
+ { .reg = LGDT3305_TP_CTRL_1, .val = 0x5b, },
|
||||
+ { .reg = LGDT3305_TP_CTRL_1, .val = 0x5b, },
|
||||
+ };
|
||||
+
|
||||
+ lg_dbg("\n");
|
||||
+
|
||||
+ ret = lgdt3305_write_regs(state, lgdt3304_init_data,
|
||||
+ ARRAY_SIZE(lgdt3304_init_data));
|
||||
+ if (lg_fail(ret))
|
||||
+ goto fail;
|
||||
+
|
||||
+ ret = lgdt3305_soft_reset(state);
|
||||
+fail:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int lgdt3305_init(struct dvb_frontend *fe)
|
||||
{
|
||||
struct lgdt3305_state *state = fe->demodulator_priv;
|
||||
@@ -639,6 +706,88 @@ fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static int lgdt3304_set_parameters(struct dvb_frontend *fe,
|
||||
+ struct dvb_frontend_parameters *param)
|
||||
+{
|
||||
+ struct lgdt3305_state *state = fe->demodulator_priv;
|
||||
+ int ret;
|
||||
+
|
||||
+ lg_dbg("(%d, %d)\n", param->frequency, param->u.vsb.modulation);
|
||||
+
|
||||
+ if (fe->ops.tuner_ops.set_params) {
|
||||
+ ret = fe->ops.tuner_ops.set_params(fe, param);
|
||||
+ if (fe->ops.i2c_gate_ctrl)
|
||||
+ fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
+ if (lg_fail(ret))
|
||||
+ goto fail;
|
||||
+ state->current_frequency = param->frequency;
|
||||
+ }
|
||||
+
|
||||
+ ret = lgdt3305_set_modulation(state, param);
|
||||
+ if (lg_fail(ret))
|
||||
+ goto fail;
|
||||
+
|
||||
+ ret = lgdt3305_passband_digital_agc(state, param);
|
||||
+ if (lg_fail(ret))
|
||||
+ goto fail;
|
||||
+
|
||||
+ ret = lgdt3305_agc_setup(state, param);
|
||||
+ if (lg_fail(ret))
|
||||
+ goto fail;
|
||||
+
|
||||
+ /* reg 0x030d is 3304-only... seen in vsb and qam usbsnoops... */
|
||||
+ switch (param->u.vsb.modulation) {
|
||||
+ case VSB_8:
|
||||
+ lgdt3305_write_reg(state, 0x030d, 0x00);
|
||||
+#if 1
|
||||
+ lgdt3305_write_reg(state, LGDT3305_CR_CTR_FREQ_1, 0x4f);
|
||||
+ lgdt3305_write_reg(state, LGDT3305_CR_CTR_FREQ_2, 0x0c);
|
||||
+ lgdt3305_write_reg(state, LGDT3305_CR_CTR_FREQ_3, 0xac);
|
||||
+ lgdt3305_write_reg(state, LGDT3305_CR_CTR_FREQ_4, 0xba);
|
||||
+#endif
|
||||
+ break;
|
||||
+ case QAM_64:
|
||||
+ case QAM_256:
|
||||
+ lgdt3305_write_reg(state, 0x030d, 0x14);
|
||||
+#if 1
|
||||
+ ret = lgdt3305_set_if(state, param);
|
||||
+ if (lg_fail(ret))
|
||||
+ goto fail;
|
||||
+#endif
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+#if 0
|
||||
+ /* the set_if vsb formula doesn't work for the 3304, we end up sending
|
||||
+ * 0x40851e07 instead of 0x4f0cacba (which works back to 94050, rather
|
||||
+ * than 3250, in the case of the kworld 340u) */
|
||||
+ ret = lgdt3305_set_if(state, param);
|
||||
+ if (lg_fail(ret))
|
||||
+ goto fail;
|
||||
+#endif
|
||||
+
|
||||
+ ret = lgdt3305_spectral_inversion(state, param,
|
||||
+ state->cfg->spectral_inversion
|
||||
+ ? 1 : 0);
|
||||
+ if (lg_fail(ret))
|
||||
+ goto fail;
|
||||
+
|
||||
+ state->current_modulation = param->u.vsb.modulation;
|
||||
+
|
||||
+ ret = lgdt3305_mpeg_mode(state, state->cfg->mpeg_mode);
|
||||
+ if (lg_fail(ret))
|
||||
+ goto fail;
|
||||
+
|
||||
+ /* lgdt3305_mpeg_mode_polarity calls lgdt3305_soft_reset */
|
||||
+ ret = lgdt3305_mpeg_mode_polarity(state,
|
||||
+ state->cfg->tpclk_edge,
|
||||
+ state->cfg->tpvalid_polarity);
|
||||
+fail:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int lgdt3305_set_parameters(struct dvb_frontend *fe,
|
||||
struct dvb_frontend_parameters *param)
|
||||
{
|
||||
@@ -847,6 +996,10 @@ static int lgdt3305_read_status(struct dvb_frontend *fe, fe_status_t *status)
|
||||
switch (state->current_modulation) {
|
||||
case QAM_256:
|
||||
case QAM_64:
|
||||
+#if 0 /* needed w/3304 to set FE_HAS_SIGNAL */
|
||||
+ if (cr_lock)
|
||||
+ *status |= FE_HAS_SIGNAL;
|
||||
+#endif
|
||||
ret = lgdt3305_read_fec_lock_status(state, &fec_lock);
|
||||
if (lg_fail(ret))
|
||||
goto fail;
|
||||
@@ -992,6 +1145,7 @@ static void lgdt3305_release(struct dvb_frontend *fe)
|
||||
kfree(state);
|
||||
}
|
||||
|
||||
+static struct dvb_frontend_ops lgdt3304_ops;
|
||||
static struct dvb_frontend_ops lgdt3305_ops;
|
||||
|
||||
struct dvb_frontend *lgdt3305_attach(const struct lgdt3305_config *config,
|
||||
@@ -1012,11 +1166,21 @@ struct dvb_frontend *lgdt3305_attach(const struct lgdt3305_config *config,
|
||||
state->cfg = config;
|
||||
state->i2c_adap = i2c_adap;
|
||||
|
||||
- memcpy(&state->frontend.ops, &lgdt3305_ops,
|
||||
- sizeof(struct dvb_frontend_ops));
|
||||
+ switch (config->demod_chip) {
|
||||
+ case LGDT3304:
|
||||
+ memcpy(&state->frontend.ops, &lgdt3304_ops,
|
||||
+ sizeof(struct dvb_frontend_ops));
|
||||
+ break;
|
||||
+ case LGDT3305:
|
||||
+ memcpy(&state->frontend.ops, &lgdt3305_ops,
|
||||
+ sizeof(struct dvb_frontend_ops));
|
||||
+ break;
|
||||
+ default:
|
||||
+ goto fail;
|
||||
+ }
|
||||
state->frontend.demodulator_priv = state;
|
||||
|
||||
- /* verify that we're talking to a lg dt3305 */
|
||||
+ /* verify that we're talking to a lg dt3304/5 */
|
||||
ret = lgdt3305_read_reg(state, LGDT3305_GEN_CTRL_2, &val);
|
||||
if ((lg_fail(ret)) | (val == 0))
|
||||
goto fail;
|
||||
@@ -1035,12 +1199,36 @@ struct dvb_frontend *lgdt3305_attach(const struct lgdt3305_config *config,
|
||||
|
||||
return &state->frontend;
|
||||
fail:
|
||||
- lg_warn("unable to detect LGDT3305 hardware\n");
|
||||
+ lg_warn("unable to detect %s hardware\n",
|
||||
+ config->demod_chip ? "LGDT3304" : "LGDT3305");
|
||||
kfree(state);
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(lgdt3305_attach);
|
||||
|
||||
+static struct dvb_frontend_ops lgdt3304_ops = {
|
||||
+ .info = {
|
||||
+ .name = "LG Electronics LGDT3304 VSB/QAM Frontend",
|
||||
+ .type = FE_ATSC,
|
||||
+ .frequency_min = 54000000,
|
||||
+ .frequency_max = 858000000,
|
||||
+ .frequency_stepsize = 62500,
|
||||
+ .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
|
||||
+ },
|
||||
+ .i2c_gate_ctrl = lgdt3305_i2c_gate_ctrl,
|
||||
+ .init = lgdt3304_init,
|
||||
+ .sleep = lgdt3304_sleep,
|
||||
+ .set_frontend = lgdt3304_set_parameters,
|
||||
+ .get_frontend = lgdt3305_get_frontend,
|
||||
+ .get_tune_settings = lgdt3305_get_tune_settings,
|
||||
+ .read_status = lgdt3305_read_status,
|
||||
+ .read_ber = lgdt3305_read_ber,
|
||||
+ .read_signal_strength = lgdt3305_read_signal_strength,
|
||||
+ .read_snr = lgdt3305_read_snr,
|
||||
+ .read_ucblocks = lgdt3305_read_ucblocks,
|
||||
+ .release = lgdt3305_release,
|
||||
+};
|
||||
+
|
||||
static struct dvb_frontend_ops lgdt3305_ops = {
|
||||
.info = {
|
||||
.name = "LG Electronics LGDT3305 VSB/QAM Frontend",
|
||||
@@ -1064,7 +1252,7 @@ static struct dvb_frontend_ops lgdt3305_ops = {
|
||||
.release = lgdt3305_release,
|
||||
};
|
||||
|
||||
-MODULE_DESCRIPTION("LG Electronics LGDT3305 ATSC/QAM-B Demodulator Driver");
|
||||
+MODULE_DESCRIPTION("LG Electronics LGDT3304/5 ATSC/QAM-B Demodulator Driver");
|
||||
MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION("0.1");
|
||||
diff --git a/drivers/media/dvb/frontends/lgdt3305.h b/drivers/media/dvb/frontends/lgdt3305.h
|
||||
index 9cb11c9..a7f30c2 100644
|
||||
--- a/drivers/media/dvb/frontends/lgdt3305.h
|
||||
+++ b/drivers/media/dvb/frontends/lgdt3305.h
|
||||
@@ -41,6 +41,11 @@ enum lgdt3305_tp_valid_polarity {
|
||||
LGDT3305_TP_VALID_HIGH = 1,
|
||||
};
|
||||
|
||||
+enum lgdt_demod_chip_type {
|
||||
+ LGDT3305 = 0,
|
||||
+ LGDT3304 = 1,
|
||||
+};
|
||||
+
|
||||
struct lgdt3305_config {
|
||||
u8 i2c_addr;
|
||||
|
||||
@@ -65,6 +70,7 @@ struct lgdt3305_config {
|
||||
enum lgdt3305_mpeg_mode mpeg_mode;
|
||||
enum lgdt3305_tp_clock_edge tpclk_edge;
|
||||
enum lgdt3305_tp_valid_polarity tpvalid_polarity;
|
||||
+ enum lgdt_demod_chip_type demod_chip;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_DVB_LGDT3305) || (defined(CONFIG_DVB_LGDT3305_MODULE) && \
|
||||
--
|
||||
1.6.6
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,362 +0,0 @@
|
||||
From: Martin Rubli <martin_rubli@logitech.com>
|
||||
Date: Wed, 19 May 2010 22:51:56 +0000 (+0200)
|
||||
Subject: uvcvideo: Add support for absolute pan/tilt controls
|
||||
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=d3c2f664ec76aff14c3841c99e84cd78d7227f79
|
||||
|
||||
uvcvideo: Add support for absolute pan/tilt controls
|
||||
|
||||
Signed-off-by: Martin Rubli <martin_rubli@logitech.com>
|
||||
---
|
||||
|
||||
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
|
||||
index aa0720a..5ec2f4a 100644
|
||||
--- a/drivers/media/video/uvc/uvc_ctrl.c
|
||||
+++ b/drivers/media/video/uvc/uvc_ctrl.c
|
||||
@@ -606,6 +606,26 @@ static struct uvc_control_mapping uvc_ctrl_mappings[] = {
|
||||
.set = uvc_ctrl_set_zoom,
|
||||
},
|
||||
{
|
||||
+ .id = V4L2_CID_PAN_ABSOLUTE,
|
||||
+ .name = "Pan (Absolute)",
|
||||
+ .entity = UVC_GUID_UVC_CAMERA,
|
||||
+ .selector = UVC_CT_PANTILT_ABSOLUTE_CONTROL,
|
||||
+ .size = 32,
|
||||
+ .offset = 0,
|
||||
+ .v4l2_type = V4L2_CTRL_TYPE_INTEGER,
|
||||
+ .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED,
|
||||
+ },
|
||||
+ {
|
||||
+ .id = V4L2_CID_TILT_ABSOLUTE,
|
||||
+ .name = "Tilt (Absolute)",
|
||||
+ .entity = UVC_GUID_UVC_CAMERA,
|
||||
+ .selector = UVC_CT_PANTILT_ABSOLUTE_CONTROL,
|
||||
+ .size = 32,
|
||||
+ .offset = 32,
|
||||
+ .v4l2_type = V4L2_CTRL_TYPE_INTEGER,
|
||||
+ .data_type = UVC_CTRL_DATA_TYPE_UNSIGNED,
|
||||
+ },
|
||||
+ {
|
||||
.id = V4L2_CID_PRIVACY,
|
||||
.name = "Privacy",
|
||||
.entity = UVC_GUID_UVC_CAMERA,
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 19 May 2010 23:15:00 +0000 (+0200)
|
||||
Subject: uvcvideo: Make button controls work properly
|
||||
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=2bd47ad4894bfaf1a97660b821cbc46439a614d6
|
||||
|
||||
uvcvideo: Make button controls work properly
|
||||
|
||||
According to the v4l2 spec, writing any value to a button control should
|
||||
result in the action belonging to the button control being triggered.
|
||||
UVC cams however want to see a 1 written, this patch fixes this by
|
||||
overriding whatever value user space passed in with -1 (0xffffffff) when
|
||||
the control is a button control.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
|
||||
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
|
||||
index 5ec2f4a..8bb825d 100644
|
||||
--- a/drivers/media/video/uvc/uvc_ctrl.c
|
||||
+++ b/drivers/media/video/uvc/uvc_ctrl.c
|
||||
@@ -698,6 +698,14 @@ static void uvc_set_le_value(struct uvc_control_mapping *mapping,
|
||||
int offset = mapping->offset;
|
||||
__u8 mask;
|
||||
|
||||
+ /* According to the v4l2 spec, writing any value to a button control
|
||||
+ * should result in the action belonging to the button control being
|
||||
+ * triggered. UVC devices however want to see a 1 written -> override
|
||||
+ * value.
|
||||
+ */
|
||||
+ if (mapping->v4l2_type == V4L2_CTRL_TYPE_BUTTON)
|
||||
+ value = -1;
|
||||
+
|
||||
data += offset / 8;
|
||||
offset &= 7;
|
||||
|
||||
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Date: Thu, 18 Feb 2010 19:38:52 +0000 (+0100)
|
||||
Subject: uvcvideo: Support menu controls in the control mapping API
|
||||
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=4930f2662e47d33e5baedac620da401a225bc3a8
|
||||
|
||||
uvcvideo: Support menu controls in the control mapping API
|
||||
|
||||
The UVCIOC_CTRL_MAP ioctl doesn't support menu entries for menu
|
||||
controls. As the uvc_xu_control_mapping structure has no reserved
|
||||
fields, this can't be fixed while keeping ABI compatibility.
|
||||
|
||||
Modify the UVCIOC_CTRL_MAP ioctl to add menu entries support, and define
|
||||
UVCIOC_CTRL_MAP_OLD that supports the old ABI without any ability to add
|
||||
menu controls.
|
||||
|
||||
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
---
|
||||
|
||||
diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
|
||||
index 8bb825d..c88d72e 100644
|
||||
--- a/drivers/media/video/uvc/uvc_ctrl.c
|
||||
+++ b/drivers/media/video/uvc/uvc_ctrl.c
|
||||
@@ -1606,6 +1606,28 @@ void uvc_ctrl_cleanup_device(struct uvc_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
+void uvc_ctrl_cleanup(void)
|
||||
+{
|
||||
+ struct uvc_control_info *info;
|
||||
+ struct uvc_control_info *ni;
|
||||
+ struct uvc_control_mapping *mapping;
|
||||
+ struct uvc_control_mapping *nm;
|
||||
+
|
||||
+ list_for_each_entry_safe(info, ni, &uvc_driver.controls, list) {
|
||||
+ if (!(info->flags & UVC_CONTROL_EXTENSION))
|
||||
+ continue;
|
||||
+
|
||||
+ list_for_each_entry_safe(mapping, nm, &info->mappings, list) {
|
||||
+ list_del(&mapping->list);
|
||||
+ kfree(mapping->menu_info);
|
||||
+ kfree(mapping);
|
||||
+ }
|
||||
+
|
||||
+ list_del(&info->list);
|
||||
+ kfree(info);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void uvc_ctrl_init(void)
|
||||
{
|
||||
struct uvc_control_info *ctrl = uvc_ctrls;
|
||||
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
|
||||
index 838b56f..34818c1 100644
|
||||
--- a/drivers/media/video/uvc/uvc_driver.c
|
||||
+++ b/drivers/media/video/uvc/uvc_driver.c
|
||||
@@ -2261,6 +2261,7 @@ static int __init uvc_init(void)
|
||||
static void __exit uvc_cleanup(void)
|
||||
{
|
||||
usb_deregister(&uvc_driver.driver);
|
||||
+ uvc_ctrl_cleanup();
|
||||
}
|
||||
|
||||
module_init(uvc_init);
|
||||
diff --git a/drivers/media/video/uvc/uvc_v4l2.c b/drivers/media/video/uvc/uvc_v4l2.c
|
||||
index 7c9ab29..485a899 100644
|
||||
--- a/drivers/media/video/uvc/uvc_v4l2.c
|
||||
+++ b/drivers/media/video/uvc/uvc_v4l2.c
|
||||
@@ -29,6 +29,71 @@
|
||||
#include "uvcvideo.h"
|
||||
|
||||
/* ------------------------------------------------------------------------
|
||||
+ * UVC ioctls
|
||||
+ */
|
||||
+static int uvc_ioctl_ctrl_map(struct uvc_xu_control_mapping *xmap, int old)
|
||||
+{
|
||||
+ struct uvc_control_mapping *map;
|
||||
+ unsigned int size;
|
||||
+ int ret;
|
||||
+
|
||||
+ map = kzalloc(sizeof *map, GFP_KERNEL);
|
||||
+ if (map == NULL)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ map->id = xmap->id;
|
||||
+ memcpy(map->name, xmap->name, sizeof map->name);
|
||||
+ memcpy(map->entity, xmap->entity, sizeof map->entity);
|
||||
+ map->selector = xmap->selector;
|
||||
+ map->size = xmap->size;
|
||||
+ map->offset = xmap->offset;
|
||||
+ map->v4l2_type = xmap->v4l2_type;
|
||||
+ map->data_type = xmap->data_type;
|
||||
+
|
||||
+ switch (xmap->v4l2_type) {
|
||||
+ case V4L2_CTRL_TYPE_INTEGER:
|
||||
+ case V4L2_CTRL_TYPE_BOOLEAN:
|
||||
+ case V4L2_CTRL_TYPE_BUTTON:
|
||||
+ break;
|
||||
+
|
||||
+ case V4L2_CTRL_TYPE_MENU:
|
||||
+ if (old) {
|
||||
+ ret = -EINVAL;
|
||||
+ goto done;
|
||||
+ }
|
||||
+
|
||||
+ size = xmap->menu_count * sizeof(*map->menu_info);
|
||||
+ map->menu_info = kmalloc(size, GFP_KERNEL);
|
||||
+ if (map->menu_info == NULL) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto done;
|
||||
+ }
|
||||
+
|
||||
+ if (copy_from_user(map->menu_info, xmap->menu_info, size)) {
|
||||
+ ret = -EFAULT;
|
||||
+ goto done;
|
||||
+ }
|
||||
+
|
||||
+ map->menu_count = xmap->menu_count;
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ ret = -EINVAL;
|
||||
+ goto done;
|
||||
+ }
|
||||
+
|
||||
+ ret = uvc_ctrl_add_mapping(map);
|
||||
+
|
||||
+done:
|
||||
+ if (ret < 0) {
|
||||
+ kfree(map->menu_info);
|
||||
+ kfree(map);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/* ------------------------------------------------------------------------
|
||||
* V4L2 interface
|
||||
*/
|
||||
|
||||
@@ -974,7 +1039,8 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
info->flags = xinfo->flags;
|
||||
|
||||
info->flags |= UVC_CONTROL_GET_MIN | UVC_CONTROL_GET_MAX |
|
||||
- UVC_CONTROL_GET_RES | UVC_CONTROL_GET_DEF;
|
||||
+ UVC_CONTROL_GET_RES | UVC_CONTROL_GET_DEF |
|
||||
+ UVC_CONTROL_EXTENSION;
|
||||
|
||||
ret = uvc_ctrl_add_info(info);
|
||||
if (ret < 0)
|
||||
@@ -982,32 +1048,12 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
||||
break;
|
||||
}
|
||||
|
||||
+ case UVCIOC_CTRL_MAP_OLD:
|
||||
case UVCIOC_CTRL_MAP:
|
||||
- {
|
||||
- struct uvc_xu_control_mapping *xmap = arg;
|
||||
- struct uvc_control_mapping *map;
|
||||
-
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
- map = kzalloc(sizeof *map, GFP_KERNEL);
|
||||
- if (map == NULL)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- map->id = xmap->id;
|
||||
- memcpy(map->name, xmap->name, sizeof map->name);
|
||||
- memcpy(map->entity, xmap->entity, sizeof map->entity);
|
||||
- map->selector = xmap->selector;
|
||||
- map->size = xmap->size;
|
||||
- map->offset = xmap->offset;
|
||||
- map->v4l2_type = xmap->v4l2_type;
|
||||
- map->data_type = xmap->data_type;
|
||||
-
|
||||
- ret = uvc_ctrl_add_mapping(map);
|
||||
- if (ret < 0)
|
||||
- kfree(map);
|
||||
- break;
|
||||
- }
|
||||
+ return uvc_ioctl_ctrl_map(arg, cmd == UVCIOC_CTRL_MAP_OLD);
|
||||
|
||||
case UVCIOC_CTRL_GET:
|
||||
return uvc_xu_ctrl_query(chain, arg, 0);
|
||||
diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h
|
||||
index d1f8840..14f77e4 100644
|
||||
--- a/drivers/media/video/uvc/uvcvideo.h
|
||||
+++ b/drivers/media/video/uvc/uvcvideo.h
|
||||
@@ -27,6 +27,8 @@
|
||||
#define UVC_CONTROL_RESTORE (1 << 6)
|
||||
/* Control can be updated by the camera. */
|
||||
#define UVC_CONTROL_AUTO_UPDATE (1 << 7)
|
||||
+/* Control is an extension unit control. */
|
||||
+#define UVC_CONTROL_EXTENSION (1 << 8)
|
||||
|
||||
#define UVC_CONTROL_GET_RANGE (UVC_CONTROL_GET_CUR | UVC_CONTROL_GET_MIN | \
|
||||
UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES | \
|
||||
@@ -40,6 +42,15 @@ struct uvc_xu_control_info {
|
||||
__u32 flags;
|
||||
};
|
||||
|
||||
+struct uvc_menu_info {
|
||||
+ __u32 value;
|
||||
+ __u8 name[32];
|
||||
+};
|
||||
+
|
||||
+struct uvc_xu_control_mapping_old {
|
||||
+ __u8 reserved[64];
|
||||
+};
|
||||
+
|
||||
struct uvc_xu_control_mapping {
|
||||
__u32 id;
|
||||
__u8 name[32];
|
||||
@@ -50,6 +61,11 @@ struct uvc_xu_control_mapping {
|
||||
__u8 offset;
|
||||
enum v4l2_ctrl_type v4l2_type;
|
||||
__u32 data_type;
|
||||
+
|
||||
+ struct uvc_menu_info __user *menu_info;
|
||||
+ __u32 menu_count;
|
||||
+
|
||||
+ __u32 reserved[4];
|
||||
};
|
||||
|
||||
struct uvc_xu_control {
|
||||
@@ -60,6 +76,7 @@ struct uvc_xu_control {
|
||||
};
|
||||
|
||||
#define UVCIOC_CTRL_ADD _IOW('U', 1, struct uvc_xu_control_info)
|
||||
+#define UVCIOC_CTRL_MAP_OLD _IOWR('U', 2, struct uvc_xu_control_mapping_old)
|
||||
#define UVCIOC_CTRL_MAP _IOWR('U', 2, struct uvc_xu_control_mapping)
|
||||
#define UVCIOC_CTRL_GET _IOWR('U', 3, struct uvc_xu_control)
|
||||
#define UVCIOC_CTRL_SET _IOW('U', 4, struct uvc_xu_control)
|
||||
@@ -198,11 +215,6 @@ struct uvc_streaming_control {
|
||||
__u8 bMaxVersion;
|
||||
};
|
||||
|
||||
-struct uvc_menu_info {
|
||||
- __u32 value;
|
||||
- __u8 name[32];
|
||||
-};
|
||||
-
|
||||
struct uvc_control_info {
|
||||
struct list_head list;
|
||||
struct list_head mappings;
|
||||
@@ -625,6 +637,7 @@ extern int uvc_ctrl_init_device(struct uvc_device *dev);
|
||||
extern void uvc_ctrl_cleanup_device(struct uvc_device *dev);
|
||||
extern int uvc_ctrl_resume_device(struct uvc_device *dev);
|
||||
extern void uvc_ctrl_init(void);
|
||||
+extern void uvc_ctrl_cleanup(void);
|
||||
|
||||
extern int uvc_ctrl_begin(struct uvc_video_chain *chain);
|
||||
extern int __uvc_ctrl_commit(struct uvc_video_chain *chain, int rollback);
|
||||
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Date: Fri, 25 Jun 2010 07:58:43 +0000 (+0200)
|
||||
Subject: uvcvideo: Add support for Manta MM-353 Plako
|
||||
X-Git-Url: http://git.linuxtv.org/pinchartl/uvcvideo.git?a=commitdiff_plain;h=352e661e1f347390a86cf34bc5e41adbdd1caa41
|
||||
|
||||
uvcvideo: Add support for Manta MM-353 Plako
|
||||
|
||||
The camera requires the PROBE_MINMAX quirk. Add a corresponding entry
|
||||
in the device IDs list
|
||||
|
||||
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
---
|
||||
|
||||
diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
|
||||
index 34818c1..1a89384 100644
|
||||
--- a/drivers/media/video/uvc/uvc_driver.c
|
||||
+++ b/drivers/media/video/uvc/uvc_driver.c
|
||||
@@ -2174,6 +2174,15 @@ static struct usb_device_id uvc_ids[] = {
|
||||
.bInterfaceSubClass = 1,
|
||||
.bInterfaceProtocol = 0,
|
||||
.driver_info = UVC_QUIRK_PROBE_EXTRAFIELDS },
|
||||
+ /* Manta MM-353 Plako */
|
||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
+ .idVendor = 0x18ec,
|
||||
+ .idProduct = 0x3188,
|
||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
||||
+ .bInterfaceSubClass = 1,
|
||||
+ .bInterfaceProtocol = 0,
|
||||
+ .driver_info = UVC_QUIRK_PROBE_MINMAX },
|
||||
/* FSC WebCam V30S */
|
||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
Loading…
Reference in New Issue
Block a user