Revert "Revert "v4l/dvb/rc: rebase to latest upstream""
This reverts commit 358f4a55c5
.
This commit is contained in:
parent
358f4a55c5
commit
d3e2823f71
|
@ -2367,6 +2367,7 @@ CONFIG_VIDEO_EM28XX_DVB=m
|
|||
CONFIG_VIDEO_CX231XX=m
|
||||
CONFIG_VIDEO_CX231XX_ALSA=m
|
||||
CONFIG_VIDEO_CX231XX_DVB=m
|
||||
CONFIG_VIDEO_CX231XX_RC=y
|
||||
CONFIG_VIDEO_HEXIUM_ORION=m
|
||||
CONFIG_VIDEO_HEXIUM_GEMINI=m
|
||||
CONFIG_VIDEO_IVTV=m
|
||||
|
@ -2381,6 +2382,7 @@ CONFIG_VIDEO_SAA6588=m
|
|||
CONFIG_VIDEO_SAA7134=m
|
||||
CONFIG_VIDEO_SAA7134_ALSA=m
|
||||
CONFIG_VIDEO_SAA7134_DVB=m
|
||||
CONFIG_VIDEO_SAA7134_RC=y
|
||||
CONFIG_VIDEO_STRADIS=m
|
||||
CONFIG_VIDEO_USBVISION=m
|
||||
CONFIG_VIDEO_W9966=m
|
||||
|
@ -2395,6 +2397,10 @@ CONFIG_VIDEO_ZORAN_ZR36060=m
|
|||
CONFIG_VIDEO_FB_IVTV=m
|
||||
CONFIG_VIDEO_SAA7164=m
|
||||
CONFIG_VIDEO_TLG2300=m
|
||||
# CONFIG_VIDEO_TIMBERDALE is not set
|
||||
CONFIG_VIDEO_SR030PC30=m
|
||||
# Doesn't build on 2.6.35
|
||||
# CONFIG_VIDEO_VIA_CAMERA is not set
|
||||
|
||||
CONFIG_USB_VIDEO_CLASS=m
|
||||
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
|
||||
|
@ -2410,6 +2416,7 @@ CONFIG_MEDIA_ATTACH=y
|
|||
CONFIG_MEDIA_TUNER_CUSTOMISE=y
|
||||
CONFIG_MEDIA_TUNER_SIMPLE=m
|
||||
CONFIG_MEDIA_TUNER_TDA8290=m
|
||||
CONFIG_MEDIA_TUNER_TDA18218=m
|
||||
CONFIG_MEDIA_TUNER_TEA5761=m
|
||||
CONFIG_MEDIA_TUNER_TEA5767=m
|
||||
CONFIG_MEDIA_TUNER_MT20XX=m
|
||||
|
@ -2492,6 +2499,10 @@ CONFIG_DVB_ATBM8830=m
|
|||
CONFIG_DVB_TDA665x=m
|
||||
CONFIG_DVB_STV0299=m
|
||||
CONFIG_DVB_MB86A16=m
|
||||
CONFIG_DVB_USB_LME2510=m
|
||||
CONFIG_DVB_S5H1432=m
|
||||
CONFIG_DVB_MB86A20S=m
|
||||
CONFIG_DVB_IX2505V=m
|
||||
|
||||
#
|
||||
# Supported Frontend Modules
|
||||
|
@ -2582,7 +2593,7 @@ CONFIG_VIDEO_PVRUSB2_SYSFS=y
|
|||
# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
|
||||
|
||||
CONFIG_RC_MAP=m
|
||||
CONFIG_IR_CORE=m
|
||||
CONFIG_RC_CORE=m
|
||||
CONFIG_IR_NEC_DECODER=m
|
||||
CONFIG_IR_RC5_DECODER=m
|
||||
CONFIG_IR_RC6_DECODER=m
|
||||
|
@ -2596,6 +2607,7 @@ CONFIG_IR_MCEUSB=m
|
|||
CONFIG_IR_NUVOTON=m
|
||||
CONFIG_IR_STREAMZAP=m
|
||||
CONFIG_IR_WINBOND_CIR=m
|
||||
CONFIG_RC_LOOPBACK=m
|
||||
|
||||
CONFIG_V4L_MEM2MEM_DRIVERS=y
|
||||
# CONFIG_VIDEO_MEM2MEM_TESTDEV is not set
|
||||
|
@ -3038,6 +3050,8 @@ CONFIG_USB_GL860=m
|
|||
CONFIG_USB_GSPCA_JEILINJ=m
|
||||
CONFIG_USB_GSPCA_SPCA1528=m
|
||||
CONFIG_USB_GSPCA_SQ930X=m
|
||||
CONFIG_USB_GSPCA_KONICA=m
|
||||
CONFIG_USB_GSPCA_XIRLINK_CIT=m
|
||||
|
||||
CONFIG_USB_IBMCAM=m
|
||||
CONFIG_USB_KONICAWC=m
|
||||
|
@ -3045,6 +3059,7 @@ CONFIG_USB_KONICAWC=m
|
|||
CONFIG_USB_S2255=m
|
||||
CONFIG_USB_SE401=m
|
||||
# CONFIG_VIDEO_SH_MOBILE_CEU is not set
|
||||
# CONFIG_VIDEO_SH_MOBILE_CSI2 is not set
|
||||
# CONFIG_USB_STV680 is not set
|
||||
# CONFIG_USB_SN9C102 is not set
|
||||
CONFIG_USB_ZR364XX=m
|
||||
|
@ -3059,6 +3074,8 @@ CONFIG_SOC_CAMERA_OV772X=m
|
|||
CONFIG_SOC_CAMERA_MT9T112=m
|
||||
CONFIG_SOC_CAMERA_RJ54N1=m
|
||||
CONFIG_SOC_CAMERA_OV9640=m
|
||||
CONFIG_SOC_CAMERA_IMX074=m
|
||||
CONFIG_SOC_CAMERA_OV6650=m
|
||||
|
||||
#
|
||||
# USB Network adaptors
|
||||
|
|
50
kernel.spec
50
kernel.spec
|
@ -48,7 +48,7 @@ Summary: The Linux kernel
|
|||
# reset this by hand to 1 (or to 0 and then use rpmdev-bumpspec).
|
||||
# scripts/rebase.sh should be made to do that for you, actually.
|
||||
#
|
||||
%global baserelease 70
|
||||
%global baserelease 69
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
|
@ -703,24 +703,7 @@ 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
|
||||
Patch2911: linux-2.6-v4l-dvb-add-kworld-a340-support.patch
|
||||
Patch2912: linux-2.6-v4l-dvb-ir-core-update.patch
|
||||
Patch2913: linux-2.6-v4l-dvb-ir-core-memleak-fixes.patch
|
||||
Patch2914: linux-2.6-v4l-dvb-ir-core-streamzap.patch
|
||||
|
||||
Patch2915: lirc-staging-2.6.36.patch
|
||||
#Patch2916: lirc-staging-2.6.36-fixes.patch
|
||||
Patch2917: hdpvr-ir-enable.patch
|
||||
Patch2918: linux-2.6-v4l-dvb-ir-core-update-2.patch
|
||||
Patch2919: linux-2.6-v4l-dvb-ir-core-update-3.patch
|
||||
Patch2920: linux-2.6-lirc-ioctl-compat-fixups.patch
|
||||
Patch2921: linux-2.6-v4l-dvb-ir-core-update-4.patch
|
||||
Patch2922: linux-2.6-v4l-dvb-ir-core-update-5.patch
|
||||
Patch2923: linux-2.6-v4l-dvb-hdpvr-updates.patch
|
||||
Patch2924: linux-2.6-v4l-dvb-ir-core-fix-imon.patch
|
||||
|
||||
Patch2950: linux-2.6-via-velocity-dma-fix.patch
|
||||
|
||||
|
@ -1403,31 +1386,16 @@ ApplyPatch efifb-check-that-the-base-addr-is-plausible-on-pci-systems.patch
|
|||
# silence the ACPI blacklist code
|
||||
ApplyPatch linux-2.6-silence-acpi-blacklist.patch
|
||||
|
||||
# enable IR receiver on Hauppauge HD PVR (v4l-dvb merge pending)
|
||||
ApplyPatch hdpvr-ir-enable.patch
|
||||
# bz #575873
|
||||
ApplyPatch flexcop-fix-xlate_proc_name-warning.patch
|
||||
|
||||
# V4L/DVB updates/fixes/experimental drivers
|
||||
# apply if non-empty
|
||||
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
|
||||
ApplyPatch linux-2.6-v4l-dvb-ir-core-memleak-fixes.patch
|
||||
ApplyPatch linux-2.6-v4l-dvb-ir-core-streamzap.patch
|
||||
ApplyPatch linux-2.6-v4l-dvb-add-lgdt3304-support.patch
|
||||
ApplyPatch linux-2.6-v4l-dvb-add-kworld-a340-support.patch
|
||||
|
||||
# http://www.lirc.org/
|
||||
ApplyPatch lirc-staging-2.6.36.patch
|
||||
#ApplyOptionalPatch lirc-staging-2.6.36-fixes.patch
|
||||
# enable IR receiver on Hauppauge HD PVR (v4l-dvb merge pending)
|
||||
ApplyPatch hdpvr-ir-enable.patch
|
||||
ApplyPatch linux-2.6-v4l-dvb-ir-core-update-2.patch
|
||||
ApplyPatch linux-2.6-v4l-dvb-ir-core-update-3.patch
|
||||
ApplyPatch linux-2.6-lirc-ioctl-compat-fixups.patch
|
||||
ApplyPatch linux-2.6-v4l-dvb-ir-core-update-4.patch
|
||||
ApplyPatch linux-2.6-v4l-dvb-ir-core-update-5.patch
|
||||
ApplyPatch linux-2.6-v4l-dvb-hdpvr-updates.patch
|
||||
ApplyPatch linux-2.6-v4l-dvb-ir-core-fix-imon.patch
|
||||
|
||||
# Fix DMA bug on via-velocity
|
||||
ApplyPatch linux-2.6-via-velocity-dma-fix.patch
|
||||
|
@ -1453,8 +1421,6 @@ ApplyPatch kprobes-x86-fix-kprobes-to-skip-prefixes-correctly.patch
|
|||
ApplyPatch fix-rcu_deref_check-warning.patch
|
||||
ApplyPatch linux-2.6-cgroups-rcu.patch
|
||||
|
||||
# bz #575873
|
||||
ApplyPatch flexcop-fix-xlate_proc_name-warning.patch
|
||||
|
||||
# Scheduler fixes (#635813 and #633037)
|
||||
ApplyPatch sched-05-avoid-side-effect-of-tickless-idle-on-update_cpu_load.patch
|
||||
|
@ -2109,7 +2075,7 @@ fi
|
|||
# and build.
|
||||
|
||||
%changelog
|
||||
* Sun Dec 19 2010 Kyle McMartin <kyle@redhat.com> 2.6.35.10-70
|
||||
* Sun Dec 19 2010 Kyle McMartin <kyle@redhat.com> 2.6.35.10-69
|
||||
- Revert Jarod's v4l-dvb-ir rebase, due to several issues reported against
|
||||
the 2.6.35.10-68 update.
|
||||
https://admin.fedoraproject.org/updates/kernel-2.6.35.10-68.fc14
|
||||
|
@ -2145,8 +2111,6 @@ fi
|
|||
r8169-03-fix-broken-checksum-for-invalid-sctp_igmp-packets.patch
|
||||
hda_realtek-handle-unset-external-amp-bits.patch
|
||||
|
||||
MARKME
|
||||
|
||||
* Fri Dec 10 2010 Kyle McMartin <kyle@redhat.com>
|
||||
- pci-disable-aspm-if-bios-asks-us-to.patch: Patch from mjg59 to disable
|
||||
ASPM if the BIOS has disabled it, but enabled it already on some devices.
|
||||
|
|
|
@ -1,625 +0,0 @@
|
|||
This patch rolls up the following commits pending merge in the v4l-dvb tree:
|
||||
|
||||
commit 7ce3b9f7bdb40837e15af89bb9d623c207ac9586
|
||||
Author: Jarod Wilson <jarod@redhat.com>
|
||||
Date: Sat Oct 9 14:17:03 2010 -0400
|
||||
|
||||
lirc_dev: fixup error messages w/missing newlines
|
||||
|
||||
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
||||
|
||||
commit d1af871dadaf58580490431a335ea122a9b00d92
|
||||
Author: Jarod Wilson <jarod@redhat.com>
|
||||
Date: Sat Oct 9 14:07:06 2010 -0400
|
||||
|
||||
lirc: wire up .compat_ioctl to main ioctl handler
|
||||
|
||||
As pointed out (and tested) by Joris van Rantwijk, we do actually need
|
||||
to wire up .compat_ioctl for 32-bit lirc userspace to work with 64-bit
|
||||
lirc kernelspace. Do it. And add a check to make sure we get a valid
|
||||
irctl in the ioctl handler.
|
||||
|
||||
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
||||
|
||||
commit 8dea589f4dc51b0363555a53fee128965a0548d4
|
||||
Author: Jarod Wilson <jarod@redhat.com>
|
||||
Date: Fri Oct 8 16:24:21 2010 -0400
|
||||
|
||||
IR/lirc: further ioctl portability fixups
|
||||
|
||||
From: Joris van Rantwijk <jorispubl@xs4all.nl>
|
||||
|
||||
----8<----
|
||||
I tested lirc_serial and found that it works fine.
|
||||
Except the LIRC ioctls do not work in my 64-bit-kernel/32-bit-user
|
||||
setup. I added compat_ioctl entries in the drivers to fix this.
|
||||
|
||||
While doing so, I noticed inconsistencies in the argument type of
|
||||
the LIRC ioctls. All ioctls are declared in lirc.h as having argument
|
||||
type __u32, however there are a few places where the driver calls
|
||||
get_user/put_user with an unsigned long argument.
|
||||
|
||||
The patch below changes lirc_dev and lirc_serial to use __u32 for all
|
||||
ioctl arguments, and adds compat_ioctl entries.
|
||||
It should probably also be done in the other low-level drivers,
|
||||
but I don't have hardware to test those.
|
||||
----8<----
|
||||
|
||||
I've dropped the .compat_ioctl addition from Joris' original patch,
|
||||
as I swear the non-compat definition should now work for both 32-bit
|
||||
and 64-bit userspace. Technically, I think we still need/want a
|
||||
Signed-off-by: from Joris here. Joris? (And sorry for the lengthy delay
|
||||
in getting a reply to you).
|
||||
|
||||
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
||||
|
||||
---
|
||||
drivers/media/IR/ir-lirc-codec.c | 13 +++++++----
|
||||
drivers/media/IR/lirc_dev.c | 36 ++++++++++++++++++++----------
|
||||
drivers/staging/lirc/lirc_igorplugusb.c | 2 +-
|
||||
drivers/staging/lirc/lirc_it87.c | 20 +++++++++-------
|
||||
drivers/staging/lirc/lirc_ite8709.c | 6 ++--
|
||||
drivers/staging/lirc/lirc_parallel.c | 35 ++++++++++++++++-------------
|
||||
drivers/staging/lirc/lirc_serial.c | 24 +++++++++++---------
|
||||
drivers/staging/lirc/lirc_sir.c | 24 +++++++++++---------
|
||||
drivers/staging/lirc/lirc_zilog.c | 3 ++
|
||||
include/media/lirc_dev.h | 6 ++--
|
||||
10 files changed, 98 insertions(+), 71 deletions(-)
|
||||
|
||||
diff --git a/drivers/media/IR/ir-lirc-codec.c b/drivers/media/IR/ir-lirc-codec.c
|
||||
index e63f757..20ac9a4 100644
|
||||
--- a/drivers/media/IR/ir-lirc-codec.c
|
||||
+++ b/drivers/media/IR/ir-lirc-codec.c
|
||||
@@ -102,7 +102,7 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd,
|
||||
struct ir_input_dev *ir_dev;
|
||||
int ret = 0;
|
||||
void *drv_data;
|
||||
- unsigned long val = 0;
|
||||
+ __u32 val = 0;
|
||||
|
||||
lirc = lirc_get_pdata(filep);
|
||||
if (!lirc)
|
||||
@@ -115,7 +115,7 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd,
|
||||
drv_data = ir_dev->props->priv;
|
||||
|
||||
if (_IOC_DIR(cmd) & _IOC_WRITE) {
|
||||
- ret = get_user(val, (unsigned long *)arg);
|
||||
+ ret = get_user(val, (__u32 *)arg);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
@@ -135,14 +135,14 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd,
|
||||
/* TX settings */
|
||||
case LIRC_SET_TRANSMITTER_MASK:
|
||||
if (ir_dev->props->s_tx_mask)
|
||||
- ret = ir_dev->props->s_tx_mask(drv_data, (u32)val);
|
||||
+ ret = ir_dev->props->s_tx_mask(drv_data, val);
|
||||
else
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
case LIRC_SET_SEND_CARRIER:
|
||||
if (ir_dev->props->s_tx_carrier)
|
||||
- ir_dev->props->s_tx_carrier(drv_data, (u32)val);
|
||||
+ ir_dev->props->s_tx_carrier(drv_data, val);
|
||||
else
|
||||
return -EINVAL;
|
||||
break;
|
||||
@@ -212,7 +212,7 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd,
|
||||
}
|
||||
|
||||
if (_IOC_DIR(cmd) & _IOC_READ)
|
||||
- ret = put_user(val, (unsigned long *)arg);
|
||||
+ ret = put_user(val, (__u32 *)arg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -231,6 +231,9 @@ static struct file_operations lirc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.write = ir_lirc_transmit_ir,
|
||||
.unlocked_ioctl = ir_lirc_ioctl,
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ .compat_ioctl = ir_lirc_ioctl,
|
||||
+#endif
|
||||
.read = lirc_dev_fop_read,
|
||||
.poll = lirc_dev_fop_poll,
|
||||
.open = lirc_dev_fop_open,
|
||||
diff --git a/drivers/media/IR/lirc_dev.c b/drivers/media/IR/lirc_dev.c
|
||||
index 899891b..930e4a7 100644
|
||||
--- a/drivers/media/IR/lirc_dev.c
|
||||
+++ b/drivers/media/IR/lirc_dev.c
|
||||
@@ -161,6 +161,9 @@ static struct file_operations fops = {
|
||||
.write = lirc_dev_fop_write,
|
||||
.poll = lirc_dev_fop_poll,
|
||||
.unlocked_ioctl = lirc_dev_fop_ioctl,
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ .compat_ioctl = lirc_dev_fop_ioctl,
|
||||
+#endif
|
||||
.open = lirc_dev_fop_open,
|
||||
.release = lirc_dev_fop_close,
|
||||
};
|
||||
@@ -359,19 +362,23 @@ int lirc_unregister_driver(int minor)
|
||||
struct irctl *ir;
|
||||
|
||||
if (minor < 0 || minor >= MAX_IRCTL_DEVICES) {
|
||||
- printk(KERN_ERR "lirc_dev: lirc_unregister_driver: "
|
||||
- "\"minor (%d)\" must be between 0 and %d!\n",
|
||||
- minor, MAX_IRCTL_DEVICES-1);
|
||||
+ printk(KERN_ERR "lirc_dev: %s: minor (%d) must be between "
|
||||
+ "0 and %d!\n", __func__, minor, MAX_IRCTL_DEVICES-1);
|
||||
return -EBADRQC;
|
||||
}
|
||||
|
||||
ir = irctls[minor];
|
||||
+ if (!ir) {
|
||||
+ printk(KERN_ERR "lirc_dev: %s: failed to get irctl struct "
|
||||
+ "for minor %d!\n", __func__, minor);
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
|
||||
mutex_lock(&lirc_dev_lock);
|
||||
|
||||
if (ir->d.minor != minor) {
|
||||
- printk(KERN_ERR "lirc_dev: lirc_unregister_driver: "
|
||||
- "minor (%d) device not registered!", minor);
|
||||
+ printk(KERN_ERR "lirc_dev: %s: minor (%d) device not "
|
||||
+ "registered!\n", __func__, minor);
|
||||
mutex_unlock(&lirc_dev_lock);
|
||||
return -ENOENT;
|
||||
}
|
||||
@@ -519,10 +526,15 @@ EXPORT_SYMBOL(lirc_dev_fop_poll);
|
||||
|
||||
long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
- unsigned long mode;
|
||||
+ __u32 mode;
|
||||
int result = 0;
|
||||
struct irctl *ir = file->private_data;
|
||||
|
||||
+ if (!ir) {
|
||||
+ printk(KERN_ERR "lirc_dev: %s: no irctl found!\n", __func__);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
dev_dbg(ir->d.dev, LOGHEAD "ioctl called (0x%x)\n",
|
||||
ir->d.name, ir->d.minor, cmd);
|
||||
|
||||
@@ -536,7 +548,7 @@ long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
|
||||
switch (cmd) {
|
||||
case LIRC_GET_FEATURES:
|
||||
- result = put_user(ir->d.features, (unsigned long *)arg);
|
||||
+ result = put_user(ir->d.features, (__u32 *)arg);
|
||||
break;
|
||||
case LIRC_GET_REC_MODE:
|
||||
if (!(ir->d.features & LIRC_CAN_REC_MASK)) {
|
||||
@@ -546,7 +558,7 @@ long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
|
||||
result = put_user(LIRC_REC2MODE
|
||||
(ir->d.features & LIRC_CAN_REC_MASK),
|
||||
- (unsigned long *)arg);
|
||||
+ (__u32 *)arg);
|
||||
break;
|
||||
case LIRC_SET_REC_MODE:
|
||||
if (!(ir->d.features & LIRC_CAN_REC_MASK)) {
|
||||
@@ -554,7 +566,7 @@ long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
}
|
||||
|
||||
- result = get_user(mode, (unsigned long *)arg);
|
||||
+ result = get_user(mode, (__u32 *)arg);
|
||||
if (!result && !(LIRC_MODE2REC(mode) & ir->d.features))
|
||||
result = -EINVAL;
|
||||
/*
|
||||
@@ -563,7 +575,7 @@ long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
*/
|
||||
break;
|
||||
case LIRC_GET_LENGTH:
|
||||
- result = put_user(ir->d.code_length, (unsigned long *)arg);
|
||||
+ result = put_user(ir->d.code_length, (__u32 *)arg);
|
||||
break;
|
||||
case LIRC_GET_MIN_TIMEOUT:
|
||||
if (!(ir->d.features & LIRC_CAN_SET_REC_TIMEOUT) ||
|
||||
@@ -572,7 +584,7 @@ long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
}
|
||||
|
||||
- result = put_user(ir->d.min_timeout, (unsigned long *)arg);
|
||||
+ result = put_user(ir->d.min_timeout, (__u32 *)arg);
|
||||
break;
|
||||
case LIRC_GET_MAX_TIMEOUT:
|
||||
if (!(ir->d.features & LIRC_CAN_SET_REC_TIMEOUT) ||
|
||||
@@ -581,7 +593,7 @@ long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
}
|
||||
|
||||
- result = put_user(ir->d.max_timeout, (unsigned long *)arg);
|
||||
+ result = put_user(ir->d.max_timeout, (__u32 *)arg);
|
||||
break;
|
||||
default:
|
||||
result = -EINVAL;
|
||||
diff --git a/drivers/staging/lirc/lirc_igorplugusb.c b/drivers/staging/lirc/lirc_igorplugusb.c
|
||||
index bce600e..e680d88 100644
|
||||
--- a/drivers/staging/lirc/lirc_igorplugusb.c
|
||||
+++ b/drivers/staging/lirc/lirc_igorplugusb.c
|
||||
@@ -390,7 +390,7 @@ static int usb_remote_probe(struct usb_interface *intf,
|
||||
devnum = dev->devnum;
|
||||
maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
|
||||
|
||||
- dprintk(DRIVER_NAME "[%d]: bytes_in_key=%lu maxp=%d\n",
|
||||
+ dprintk(DRIVER_NAME "[%d]: bytes_in_key=%zu maxp=%d\n",
|
||||
devnum, CODE_LENGTH, maxp);
|
||||
|
||||
|
||||
diff --git a/drivers/staging/lirc/lirc_it87.c b/drivers/staging/lirc/lirc_it87.c
|
||||
index ec11c0e..bd5006c 100644
|
||||
--- a/drivers/staging/lirc/lirc_it87.c
|
||||
+++ b/drivers/staging/lirc/lirc_it87.c
|
||||
@@ -239,8 +239,7 @@ static ssize_t lirc_write(struct file *file, const char *buf,
|
||||
static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int retval = 0;
|
||||
- unsigned long value = 0;
|
||||
- unsigned int ivalue;
|
||||
+ __u32 value = 0;
|
||||
unsigned long hw_flags;
|
||||
|
||||
if (cmd == LIRC_GET_FEATURES)
|
||||
@@ -256,24 +255,24 @@ static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
case LIRC_GET_FEATURES:
|
||||
case LIRC_GET_SEND_MODE:
|
||||
case LIRC_GET_REC_MODE:
|
||||
- retval = put_user(value, (unsigned long *) arg);
|
||||
+ retval = put_user(value, (__u32 *) arg);
|
||||
break;
|
||||
|
||||
case LIRC_SET_SEND_MODE:
|
||||
case LIRC_SET_REC_MODE:
|
||||
- retval = get_user(value, (unsigned long *) arg);
|
||||
+ retval = get_user(value, (__u32 *) arg);
|
||||
break;
|
||||
|
||||
case LIRC_SET_SEND_CARRIER:
|
||||
- retval = get_user(ivalue, (unsigned int *) arg);
|
||||
+ retval = get_user(value, (__u32 *) arg);
|
||||
if (retval)
|
||||
return retval;
|
||||
- ivalue /= 1000;
|
||||
- if (ivalue > IT87_CIR_FREQ_MAX ||
|
||||
- ivalue < IT87_CIR_FREQ_MIN)
|
||||
+ value /= 1000;
|
||||
+ if (value > IT87_CIR_FREQ_MAX ||
|
||||
+ value < IT87_CIR_FREQ_MIN)
|
||||
return -EINVAL;
|
||||
|
||||
- it87_freq = ivalue;
|
||||
+ it87_freq = value;
|
||||
|
||||
spin_lock_irqsave(&hardware_lock, hw_flags);
|
||||
outb(((inb(io + IT87_CIR_TCR2) & IT87_CIR_TCR2_TXMPW) |
|
||||
@@ -340,6 +339,9 @@ static const struct file_operations lirc_fops = {
|
||||
.write = lirc_write,
|
||||
.poll = lirc_poll,
|
||||
.unlocked_ioctl = lirc_ioctl,
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ .compat_ioctl = lirc_ioctl,
|
||||
+#endif
|
||||
.open = lirc_open,
|
||||
.release = lirc_close,
|
||||
};
|
||||
diff --git a/drivers/staging/lirc/lirc_ite8709.c b/drivers/staging/lirc/lirc_ite8709.c
|
||||
index 9352f45..cb20cfd 100644
|
||||
--- a/drivers/staging/lirc/lirc_ite8709.c
|
||||
+++ b/drivers/staging/lirc/lirc_ite8709.c
|
||||
@@ -102,8 +102,8 @@ struct ite8709_device {
|
||||
int io;
|
||||
int irq;
|
||||
spinlock_t hardware_lock;
|
||||
- unsigned long long acc_pulse;
|
||||
- unsigned long long acc_space;
|
||||
+ __u64 acc_pulse;
|
||||
+ __u64 acc_space;
|
||||
char lastbit;
|
||||
struct timeval last_tv;
|
||||
struct lirc_driver driver;
|
||||
@@ -220,7 +220,7 @@ static void ite8709_set_use_dec(void *data)
|
||||
}
|
||||
|
||||
static void ite8709_add_read_queue(struct ite8709_device *dev, int flag,
|
||||
- unsigned long long val)
|
||||
+ __u64 val)
|
||||
{
|
||||
int value;
|
||||
|
||||
diff --git a/drivers/staging/lirc/lirc_parallel.c b/drivers/staging/lirc/lirc_parallel.c
|
||||
index 6da4a8c..b8cce87 100644
|
||||
--- a/drivers/staging/lirc/lirc_parallel.c
|
||||
+++ b/drivers/staging/lirc/lirc_parallel.c
|
||||
@@ -301,9 +301,9 @@ static void irq_handler(void *blah)
|
||||
|
||||
if (signal != 0) {
|
||||
/* ajust value to usecs */
|
||||
- unsigned long long helper;
|
||||
+ __u64 helper;
|
||||
|
||||
- helper = ((unsigned long long) signal)*1000000;
|
||||
+ helper = ((__u64) signal)*1000000;
|
||||
do_div(helper, timer);
|
||||
signal = (long) helper;
|
||||
|
||||
@@ -404,9 +404,9 @@ static ssize_t lirc_write(struct file *filep, const char *buf, size_t n,
|
||||
|
||||
/* adjust values from usecs */
|
||||
for (i = 0; i < count; i++) {
|
||||
- unsigned long long helper;
|
||||
+ __u64 helper;
|
||||
|
||||
- helper = ((unsigned long long) wbuf[i])*timer;
|
||||
+ helper = ((__u64) wbuf[i])*timer;
|
||||
do_div(helper, 1000000);
|
||||
wbuf[i] = (int) helper;
|
||||
}
|
||||
@@ -464,48 +464,48 @@ static unsigned int lirc_poll(struct file *file, poll_table *wait)
|
||||
static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int result;
|
||||
- unsigned long features = LIRC_CAN_SET_TRANSMITTER_MASK |
|
||||
- LIRC_CAN_SEND_PULSE | LIRC_CAN_REC_MODE2;
|
||||
- unsigned long mode;
|
||||
- unsigned int ivalue;
|
||||
+ __u32 features = LIRC_CAN_SET_TRANSMITTER_MASK |
|
||||
+ LIRC_CAN_SEND_PULSE | LIRC_CAN_REC_MODE2;
|
||||
+ __u32 mode;
|
||||
+ __u32 value;
|
||||
|
||||
switch (cmd) {
|
||||
case LIRC_GET_FEATURES:
|
||||
- result = put_user(features, (unsigned long *) arg);
|
||||
+ result = put_user(features, (__u32 *) arg);
|
||||
if (result)
|
||||
return result;
|
||||
break;
|
||||
case LIRC_GET_SEND_MODE:
|
||||
- result = put_user(LIRC_MODE_PULSE, (unsigned long *) arg);
|
||||
+ result = put_user(LIRC_MODE_PULSE, (__u32 *) arg);
|
||||
if (result)
|
||||
return result;
|
||||
break;
|
||||
case LIRC_GET_REC_MODE:
|
||||
- result = put_user(LIRC_MODE_MODE2, (unsigned long *) arg);
|
||||
+ result = put_user(LIRC_MODE_MODE2, (__u32 *) arg);
|
||||
if (result)
|
||||
return result;
|
||||
break;
|
||||
case LIRC_SET_SEND_MODE:
|
||||
- result = get_user(mode, (unsigned long *) arg);
|
||||
+ result = get_user(mode, (__u32 *) arg);
|
||||
if (result)
|
||||
return result;
|
||||
if (mode != LIRC_MODE_PULSE)
|
||||
return -EINVAL;
|
||||
break;
|
||||
case LIRC_SET_REC_MODE:
|
||||
- result = get_user(mode, (unsigned long *) arg);
|
||||
+ result = get_user(mode, (__u32 *) arg);
|
||||
if (result)
|
||||
return result;
|
||||
if (mode != LIRC_MODE_MODE2)
|
||||
return -ENOSYS;
|
||||
break;
|
||||
case LIRC_SET_TRANSMITTER_MASK:
|
||||
- result = get_user(ivalue, (unsigned int *) arg);
|
||||
+ result = get_user(value, (__u32 *) arg);
|
||||
if (result)
|
||||
return result;
|
||||
- if ((ivalue & LIRC_PARALLEL_TRANSMITTER_MASK) != ivalue)
|
||||
+ if ((value & LIRC_PARALLEL_TRANSMITTER_MASK) != value)
|
||||
return LIRC_PARALLEL_MAX_TRANSMITTERS;
|
||||
- tx_mask = ivalue;
|
||||
+ tx_mask = value;
|
||||
break;
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
@@ -546,6 +546,9 @@ static const struct file_operations lirc_fops = {
|
||||
.write = lirc_write,
|
||||
.poll = lirc_poll,
|
||||
.unlocked_ioctl = lirc_ioctl,
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ .compat_ioctl = lirc_ioctl,
|
||||
+#endif
|
||||
.open = lirc_open,
|
||||
.release = lirc_close
|
||||
};
|
||||
diff --git a/drivers/staging/lirc/lirc_serial.c b/drivers/staging/lirc/lirc_serial.c
|
||||
index 9456f8e..05a9bf3 100644
|
||||
--- a/drivers/staging/lirc/lirc_serial.c
|
||||
+++ b/drivers/staging/lirc/lirc_serial.c
|
||||
@@ -372,7 +372,7 @@ static unsigned long conv_us_to_clocks;
|
||||
static int init_timing_params(unsigned int new_duty_cycle,
|
||||
unsigned int new_freq)
|
||||
{
|
||||
- unsigned long long loops_per_sec, work;
|
||||
+ __u64 loops_per_sec, work;
|
||||
|
||||
duty_cycle = new_duty_cycle;
|
||||
freq = new_freq;
|
||||
@@ -987,8 +987,7 @@ static ssize_t lirc_write(struct file *file, const char *buf,
|
||||
static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int result;
|
||||
- unsigned long value;
|
||||
- unsigned int ivalue;
|
||||
+ __u32 value;
|
||||
|
||||
switch (cmd) {
|
||||
case LIRC_GET_SEND_MODE:
|
||||
@@ -997,7 +996,7 @@ static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
|
||||
result = put_user(LIRC_SEND2MODE
|
||||
(hardware[type].features&LIRC_CAN_SEND_MASK),
|
||||
- (unsigned long *) arg);
|
||||
+ (__u32 *) arg);
|
||||
if (result)
|
||||
return result;
|
||||
break;
|
||||
@@ -1006,7 +1005,7 @@ static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
if (!(hardware[type].features&LIRC_CAN_SEND_MASK))
|
||||
return -ENOIOCTLCMD;
|
||||
|
||||
- result = get_user(value, (unsigned long *) arg);
|
||||
+ result = get_user(value, (__u32 *) arg);
|
||||
if (result)
|
||||
return result;
|
||||
/* only LIRC_MODE_PULSE supported */
|
||||
@@ -1023,12 +1022,12 @@ static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
if (!(hardware[type].features&LIRC_CAN_SET_SEND_DUTY_CYCLE))
|
||||
return -ENOIOCTLCMD;
|
||||
|
||||
- result = get_user(ivalue, (unsigned int *) arg);
|
||||
+ result = get_user(value, (__u32 *) arg);
|
||||
if (result)
|
||||
return result;
|
||||
- if (ivalue <= 0 || ivalue > 100)
|
||||
+ if (value <= 0 || value > 100)
|
||||
return -EINVAL;
|
||||
- return init_timing_params(ivalue, freq);
|
||||
+ return init_timing_params(value, freq);
|
||||
break;
|
||||
|
||||
case LIRC_SET_SEND_CARRIER:
|
||||
@@ -1036,12 +1035,12 @@ static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
if (!(hardware[type].features&LIRC_CAN_SET_SEND_CARRIER))
|
||||
return -ENOIOCTLCMD;
|
||||
|
||||
- result = get_user(ivalue, (unsigned int *) arg);
|
||||
+ result = get_user(value, (__u32 *) arg);
|
||||
if (result)
|
||||
return result;
|
||||
- if (ivalue > 500000 || ivalue < 20000)
|
||||
+ if (value > 500000 || value < 20000)
|
||||
return -EINVAL;
|
||||
- return init_timing_params(duty_cycle, ivalue);
|
||||
+ return init_timing_params(duty_cycle, value);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1054,6 +1053,9 @@ static const struct file_operations lirc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.write = lirc_write,
|
||||
.unlocked_ioctl = lirc_ioctl,
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ .compat_ioctl = lirc_ioctl,
|
||||
+#endif
|
||||
.read = lirc_dev_fop_read,
|
||||
.poll = lirc_dev_fop_poll,
|
||||
.open = lirc_dev_fop_open,
|
||||
diff --git a/drivers/staging/lirc/lirc_sir.c b/drivers/staging/lirc/lirc_sir.c
|
||||
index eb08fa7..c4cb3aa 100644
|
||||
--- a/drivers/staging/lirc/lirc_sir.c
|
||||
+++ b/drivers/staging/lirc/lirc_sir.c
|
||||
@@ -336,9 +336,8 @@ static ssize_t lirc_write(struct file *file, const char *buf, size_t n,
|
||||
static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int retval = 0;
|
||||
- unsigned long value = 0;
|
||||
+ __u32 value = 0;
|
||||
#ifdef LIRC_ON_SA1100
|
||||
- unsigned int ivalue;
|
||||
|
||||
if (cmd == LIRC_GET_FEATURES)
|
||||
value = LIRC_CAN_SEND_PULSE |
|
||||
@@ -362,22 +361,22 @@ static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
case LIRC_GET_FEATURES:
|
||||
case LIRC_GET_SEND_MODE:
|
||||
case LIRC_GET_REC_MODE:
|
||||
- retval = put_user(value, (unsigned long *) arg);
|
||||
+ retval = put_user(value, (__u32 *) arg);
|
||||
break;
|
||||
|
||||
case LIRC_SET_SEND_MODE:
|
||||
case LIRC_SET_REC_MODE:
|
||||
- retval = get_user(value, (unsigned long *) arg);
|
||||
+ retval = get_user(value, (__u32 *) arg);
|
||||
break;
|
||||
#ifdef LIRC_ON_SA1100
|
||||
case LIRC_SET_SEND_DUTY_CYCLE:
|
||||
- retval = get_user(ivalue, (unsigned int *) arg);
|
||||
+ retval = get_user(value, (__u32 *) arg);
|
||||
if (retval)
|
||||
return retval;
|
||||
- if (ivalue <= 0 || ivalue > 100)
|
||||
+ if (value <= 0 || value > 100)
|
||||
return -EINVAL;
|
||||
- /* (ivalue/100)*(1000000/freq) */
|
||||
- duty_cycle = ivalue;
|
||||
+ /* (value/100)*(1000000/freq) */
|
||||
+ duty_cycle = value;
|
||||
pulse_width = (unsigned long) duty_cycle*10000/freq;
|
||||
space_width = (unsigned long) 1000000L/freq-pulse_width;
|
||||
if (pulse_width >= LIRC_ON_SA1100_TRANSMITTER_LATENCY)
|
||||
@@ -386,12 +385,12 @@ static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
||||
space_width -= LIRC_ON_SA1100_TRANSMITTER_LATENCY;
|
||||
break;
|
||||
case LIRC_SET_SEND_CARRIER:
|
||||
- retval = get_user(ivalue, (unsigned int *) arg);
|
||||
+ retval = get_user(value, (__u32 *) arg);
|
||||
if (retval)
|
||||
return retval;
|
||||
- if (ivalue > 500000 || ivalue < 20000)
|
||||
+ if (value > 500000 || value < 20000)
|
||||
return -EINVAL;
|
||||
- freq = ivalue;
|
||||
+ freq = value;
|
||||
pulse_width = (unsigned long) duty_cycle*10000/freq;
|
||||
space_width = (unsigned long) 1000000L/freq-pulse_width;
|
||||
if (pulse_width >= LIRC_ON_SA1100_TRANSMITTER_LATENCY)
|
||||
@@ -457,6 +456,9 @@ static const struct file_operations lirc_fops = {
|
||||
.write = lirc_write,
|
||||
.poll = lirc_poll,
|
||||
.unlocked_ioctl = lirc_ioctl,
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ .compat_ioctl = lirc_ioctl,
|
||||
+#endif
|
||||
.open = lirc_dev_fop_open,
|
||||
.release = lirc_dev_fop_close,
|
||||
};
|
||||
diff --git a/drivers/staging/lirc/lirc_zilog.c b/drivers/staging/lirc/lirc_zilog.c
|
||||
index 100caab..d920644 100644
|
||||
--- a/drivers/staging/lirc/lirc_zilog.c
|
||||
+++ b/drivers/staging/lirc/lirc_zilog.c
|
||||
@@ -1139,6 +1139,9 @@ static const struct file_operations lirc_fops = {
|
||||
.write = write,
|
||||
.poll = poll,
|
||||
.unlocked_ioctl = ioctl,
|
||||
+#ifdef CONFIG_COMPAT
|
||||
+ .compat_ioctl = ioctl,
|
||||
+#endif
|
||||
.open = open,
|
||||
.release = close
|
||||
};
|
||||
diff --git a/include/media/lirc_dev.h b/include/media/lirc_dev.h
|
||||
index b1f6066..54780a5 100644
|
||||
--- a/include/media/lirc_dev.h
|
||||
+++ b/include/media/lirc_dev.h
|
||||
@@ -125,10 +125,10 @@ static inline unsigned int lirc_buffer_write(struct lirc_buffer *buf,
|
||||
struct lirc_driver {
|
||||
char name[40];
|
||||
int minor;
|
||||
- unsigned long code_length;
|
||||
+ __u32 code_length;
|
||||
unsigned int buffer_size; /* in chunks holding one code each */
|
||||
int sample_rate;
|
||||
- unsigned long features;
|
||||
+ __u32 features;
|
||||
|
||||
unsigned int chunk_size;
|
||||
|
||||
@@ -139,7 +139,7 @@ struct lirc_driver {
|
||||
struct lirc_buffer *rbuf;
|
||||
int (*set_use_inc) (void *data);
|
||||
void (*set_use_dec) (void *data);
|
||||
- struct file_operations *fops;
|
||||
+ const struct file_operations *fops;
|
||||
struct device *dev;
|
||||
struct module *owner;
|
||||
};
|
|
@ -1,165 +0,0 @@
|
|||
commit 611225f5e7f9d11c4b119fac224f1bd6903b0150
|
||||
Author: Jarod Wilson <jarod@redhat.com>
|
||||
Date: Sun Mar 7 17:55:43 2010 -0300
|
||||
|
||||
V4L/DVB: dvb: add support for kworld 340u and ub435-q to em28xx-dvb
|
||||
|
||||
This adds support for the KWorld PlusTV 340U and KWorld UB345-Q ATSC
|
||||
sticks, which are really the same device. The sticks have an eMPIA
|
||||
em2870 usb bridge chipset, an LG Electronics LGDT3304 ATSC/QAM
|
||||
demodulator and an NXP TDA18271HD tuner -- early versions of the 340U
|
||||
have a a TDA18271HD/C1, later models and the UB435-Q have a C2.
|
||||
|
||||
The stick has been tested succesfully with both VSB_8 and QAM_256 signals.
|
||||
Its using lgdt3304 support added to the lgdt3305 driver by a prior patch,
|
||||
rather than the current lgdt3304 driver, as its severely lacking in
|
||||
functionality by comparison (see said patch for details).
|
||||
|
||||
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
||||
Signed-off-by: Michael Krufky <mkrufky@kernellabs.com>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
|
||||
diff --git a/Documentation/video4linux/CARDLIST.em28xx b/Documentation/video4linux/CARDLIST.em28xx
|
||||
index 3a623aa..5c56875 100644
|
||||
--- a/Documentation/video4linux/CARDLIST.em28xx
|
||||
+++ b/Documentation/video4linux/CARDLIST.em28xx
|
||||
@@ -72,3 +72,4 @@
|
||||
73 -> Reddo DVB-C USB TV Box (em2870)
|
||||
74 -> Actionmaster/LinXcel/Digitus VC211A (em2800)
|
||||
75 -> Dikom DK300 (em2882)
|
||||
+ 76 -> KWorld PlusTV 340U or UB435-Q (ATSC) (em2870) [1b80:a340]
|
||||
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c
|
||||
index 3a4fd85..ffbe544 100644
|
||||
--- a/drivers/media/video/em28xx/em28xx-cards.c
|
||||
+++ b/drivers/media/video/em28xx/em28xx-cards.c
|
||||
@@ -158,6 +158,22 @@ static struct em28xx_reg_seq evga_indtube_digital[] = {
|
||||
{ -1, -1, -1, -1},
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * KWorld PlusTV 340U and UB435-Q (ATSC) GPIOs map:
|
||||
+ * EM_GPIO_0 - currently unknown
|
||||
+ * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
|
||||
+ * EM_GPIO_2 - currently unknown
|
||||
+ * EM_GPIO_3 - currently unknown
|
||||
+ * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
|
||||
+ * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
|
||||
+ * EM_GPIO_6 - currently unknown
|
||||
+ * EM_GPIO_7 - currently unknown
|
||||
+ */
|
||||
+static struct em28xx_reg_seq kworld_a340_digital[] = {
|
||||
+ {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10},
|
||||
+ { -1, -1, -1, -1},
|
||||
+};
|
||||
+
|
||||
/* Pinnacle Hybrid Pro eb1a:2881 */
|
||||
static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
|
||||
{EM28XX_R08_GPIO, 0xfd, ~EM_GPIO_4, 10},
|
||||
@@ -1667,6 +1683,16 @@ struct em28xx_board em28xx_boards[] = {
|
||||
.tuner_gpio = reddo_dvb_c_usb_box,
|
||||
.has_dvb = 1,
|
||||
},
|
||||
+ /* 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
|
||||
+ * initially as the KWorld PlusTV 340U, then as the UB435-Q.
|
||||
+ * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2 */
|
||||
+ [EM2870_BOARD_KWORLD_A340] = {
|
||||
+ .name = "KWorld PlusTV 340U or UB435-Q (ATSC)",
|
||||
+ .tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
|
||||
+ .has_dvb = 1,
|
||||
+ .dvb_gpio = kworld_a340_digital,
|
||||
+ .tuner_gpio = default_tuner_gpio,
|
||||
+ },
|
||||
};
|
||||
const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
|
||||
|
||||
@@ -1788,6 +1814,8 @@ struct usb_device_id em28xx_id_table[] = {
|
||||
.driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
|
||||
{ USB_DEVICE(0xeb1a, 0x50a6),
|
||||
.driver_info = EM2860_BOARD_GADMEI_UTV330 },
|
||||
+ { USB_DEVICE(0x1b80, 0xa340),
|
||||
+ .driver_info = EM2870_BOARD_KWORLD_A340 },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, em28xx_id_table);
|
||||
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c
|
||||
index cf1d8c3..3ac8d30 100644
|
||||
--- a/drivers/media/video/em28xx/em28xx-dvb.c
|
||||
+++ b/drivers/media/video/em28xx/em28xx-dvb.c
|
||||
@@ -30,11 +30,13 @@
|
||||
#include "tuner-simple.h"
|
||||
|
||||
#include "lgdt330x.h"
|
||||
+#include "lgdt3305.h"
|
||||
#include "zl10353.h"
|
||||
#include "s5h1409.h"
|
||||
#include "mt352.h"
|
||||
#include "mt352_priv.h" /* FIXME */
|
||||
#include "tda1002x.h"
|
||||
+#include "tda18271.h"
|
||||
|
||||
MODULE_DESCRIPTION("driver for em28xx based DVB cards");
|
||||
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
|
||||
@@ -231,6 +233,18 @@ static struct lgdt330x_config em2880_lgdt3303_dev = {
|
||||
.demod_chip = LGDT3303,
|
||||
};
|
||||
|
||||
+static struct lgdt3305_config em2870_lgdt3304_dev = {
|
||||
+ .i2c_addr = 0x0e,
|
||||
+ .demod_chip = LGDT3304,
|
||||
+ .spectral_inversion = 1,
|
||||
+ .deny_i2c_rptr = 1,
|
||||
+ .mpeg_mode = LGDT3305_MPEG_PARALLEL,
|
||||
+ .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
|
||||
+ .tpvalid_polarity = LGDT3305_TP_VALID_HIGH,
|
||||
+ .vsb_if_khz = 3250,
|
||||
+ .qam_if_khz = 4000,
|
||||
+};
|
||||
+
|
||||
static struct zl10353_config em28xx_zl10353_with_xc3028 = {
|
||||
.demod_address = (0x1e >> 1),
|
||||
.no_tuner = 1,
|
||||
@@ -247,6 +261,17 @@ static struct s5h1409_config em28xx_s5h1409_with_xc3028 = {
|
||||
.mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK
|
||||
};
|
||||
|
||||
+static struct tda18271_std_map kworld_a340_std_map = {
|
||||
+ .atsc_6 = { .if_freq = 3250, .agc_mode = 3, .std = 0,
|
||||
+ .if_lvl = 1, .rfagc_top = 0x37, },
|
||||
+ .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 1,
|
||||
+ .if_lvl = 1, .rfagc_top = 0x37, },
|
||||
+};
|
||||
+
|
||||
+static struct tda18271_config kworld_a340_config = {
|
||||
+ .std_map = &kworld_a340_std_map,
|
||||
+};
|
||||
+
|
||||
static struct zl10353_config em28xx_zl10353_xc3028_no_i2c_gate = {
|
||||
.demod_address = (0x1e >> 1),
|
||||
.no_tuner = 1,
|
||||
@@ -572,6 +597,14 @@ static int dvb_init(struct em28xx *dev)
|
||||
}
|
||||
}
|
||||
break;
|
||||
+ case EM2870_BOARD_KWORLD_A340:
|
||||
+ dvb->frontend = dvb_attach(lgdt3305_attach,
|
||||
+ &em2870_lgdt3304_dev,
|
||||
+ &dev->i2c_adap);
|
||||
+ if (dvb->frontend != NULL)
|
||||
+ dvb_attach(tda18271_attach, dvb->frontend, 0x60,
|
||||
+ &dev->i2c_adap, &kworld_a340_config);
|
||||
+ break;
|
||||
default:
|
||||
em28xx_errdev("/2: The frontend of your DVB/ATSC card"
|
||||
" isn't supported yet\n");
|
||||
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h
|
||||
index 6216786..1c61a6b 100644
|
||||
--- a/drivers/media/video/em28xx/em28xx.h
|
||||
+++ b/drivers/media/video/em28xx/em28xx.h
|
||||
@@ -114,6 +114,7 @@
|
||||
#define EM2870_BOARD_REDDO_DVB_C_USB_BOX 73
|
||||
#define EM2800_BOARD_VC211A 74
|
||||
#define EM2882_BOARD_DIKOM_DK300 75
|
||||
+#define EM2870_BOARD_KWORLD_A340 76
|
||||
|
||||
/* Limits minimum and default number of buffers */
|
||||
#define EM28XX_MIN_BUF 4
|
|
@ -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
|
||||
|
|
@ -1,219 +0,0 @@
|
|||
These are from the media_tree staging/v2.6.37 branch:
|
||||
|
||||
http://git.linuxtv.org/media_tree.git?a=shortlog;h=refs/heads/staging/v2.6.37
|
||||
|
||||
commit 0987d5b39def07e081376ec48e0825a8d9d0c1e0
|
||||
Author: Alan Young <ayoung@teleport.com>
|
||||
Date: Mon Jul 26 08:17:53 2010 -0300
|
||||
|
||||
[media] hdpvr: remove unnecessary sleep in hdpvr_config_call
|
||||
|
||||
Signed-off-by: Janne Grunau <j@jannau.net>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
|
||||
commit db882a96564a8f8384b3d44ba5f4dcc2b29fa6ea
|
||||
Author: Alan Young <ayoung@teleport.com>
|
||||
Date: Mon Jul 26 16:27:32 2010 -0300
|
||||
|
||||
[media] hdpvr: remove unecessary sleep in buffer drain loop
|
||||
|
||||
Signed-off-by: Janne Grunau <j@jannau.net>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
|
||||
commit c4b3bb7d6cbbfd729f8531ea433cdbe4ce6d6ec9
|
||||
Author: Alan Young <ayoung@teleport.com>
|
||||
Date: Mon Jul 26 08:30:06 2010 -0300
|
||||
|
||||
[media] hdpvr: print firmware date
|
||||
|
||||
Hauppauge released different firmwares using the same version number.
|
||||
The firmware date can be used to identify the exact driver/firmware
|
||||
combination.
|
||||
|
||||
Signed-off-by: Janne Grunau <j@jannau.net>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
|
||||
commit a742a790bc200a356b0645592bb21ebee55c81cd
|
||||
Author: Janne Grunau <j@jannau.net>
|
||||
Date: Tue Jul 27 11:03:35 2010 -0300
|
||||
|
||||
[media] hdpvr: add two known to work firmware versions
|
||||
|
||||
refine the firmware version test and print the version only once
|
||||
|
||||
Signed-off-by: Janne Grunau <j@jannau.net>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
|
||||
commit ab98088577ea97545c72be69ba092b4f12909bc9
|
||||
Author: Janne Grunau <j@jannau.net>
|
||||
Date: Tue Jul 27 10:40:43 2010 -0300
|
||||
|
||||
[media] hdpvr: use AC3 as default audio codec for SPDIF
|
||||
|
||||
Signed-off-by: Janne Grunau <j@jannau.net>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
|
||||
commit a7c443ee3040383e4d9b261d0af811350d221035
|
||||
Author: Janne Grunau <j@jannau.net>
|
||||
Date: Tue Jul 27 11:01:47 2010 -0300
|
||||
|
||||
[media] hdpvr: fix audio input setting for pre AC3 firmwares
|
||||
|
||||
Signed-off-by: Janne Grunau <j@jannau.net>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
|
||||
|
||||
commit 8a01ef612c78a802262a455eadf46240d4f02136
|
||||
Author: Alan Young <ayoung@teleport.com>
|
||||
Date: Mon Jul 26 08:50:32 2010 -0300
|
||||
|
||||
[media] hdpvr: decrease URB timeout to 90ms
|
||||
|
||||
Based on USB traces of the windows driver.
|
||||
|
||||
Signed-off-by: Janne Grunau <j@jannau.net>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
|
||||
commit 0e64f3d51b608e95bef4a324e85992d3da3c52ac
|
||||
Author: Janne Grunau <j@jannau.net>
|
||||
Date: Mon Oct 11 10:29:36 2010 -0300
|
||||
|
||||
[media] hdpvr: add usb product id 0x4903
|
||||
|
||||
Signed-off-by: Janne Grunau <j@jannau.net>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
|
||||
---
|
||||
Index: linux-2.6.35.x86_64.ir/drivers/media/video/hdpvr/hdpvr-video.c
|
||||
===================================================================
|
||||
--- linux-2.6.35.x86_64.ir.orig/drivers/media/video/hdpvr/hdpvr-video.c
|
||||
+++ linux-2.6.35.x86_64.ir/drivers/media/video/hdpvr/hdpvr-video.c
|
||||
@@ -26,7 +26,7 @@
|
||||
#include <media/v4l2-ioctl.h>
|
||||
#include "hdpvr.h"
|
||||
|
||||
-#define BULK_URB_TIMEOUT 1250 /* 1.25 seconds */
|
||||
+#define BULK_URB_TIMEOUT 90 /* 0.09 seconds */
|
||||
|
||||
#define print_buffer_status() { \
|
||||
v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev, \
|
||||
@@ -337,8 +337,6 @@ static int hdpvr_stop_streaming(struct h
|
||||
dev->bulk_in_endpointAddr),
|
||||
buf, dev->bulk_in_size, &actual_length,
|
||||
BULK_URB_TIMEOUT)) {
|
||||
- /* wait */
|
||||
- msleep(5);
|
||||
v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev,
|
||||
"%2d: got %d bytes\n", c, actual_length);
|
||||
}
|
||||
Index: linux-2.6.35.x86_64.ir/drivers/media/video/hdpvr/hdpvr-control.c
|
||||
===================================================================
|
||||
--- linux-2.6.35.x86_64.ir.orig/drivers/media/video/hdpvr/hdpvr-control.c
|
||||
+++ linux-2.6.35.x86_64.ir/drivers/media/video/hdpvr/hdpvr-control.c
|
||||
@@ -29,8 +29,6 @@ int hdpvr_config_call(struct hdpvr_devic
|
||||
int ret;
|
||||
char request_type = 0x38, snd_request = 0x01;
|
||||
|
||||
- msleep(10);
|
||||
-
|
||||
mutex_lock(&dev->usbc_mutex);
|
||||
dev->usbc_buf[0] = valbuf;
|
||||
ret = usb_control_msg(dev->udev,
|
||||
@@ -170,8 +168,7 @@ int hdpvr_set_audio(struct hdpvr_device
|
||||
if (ret == 2)
|
||||
ret = 0;
|
||||
} else
|
||||
- ret = hdpvr_config_call(dev, CTRL_AUDIO_INPUT_VALUE,
|
||||
- dev->options.audio_input+1);
|
||||
+ ret = hdpvr_config_call(dev, CTRL_AUDIO_INPUT_VALUE, input);
|
||||
error:
|
||||
return ret;
|
||||
}
|
||||
Index: linux-2.6.35.x86_64.ir/drivers/media/video/hdpvr/hdpvr-core.c
|
||||
===================================================================
|
||||
--- linux-2.6.35.x86_64.ir.orig/drivers/media/video/hdpvr/hdpvr-core.c
|
||||
+++ linux-2.6.35.x86_64.ir/drivers/media/video/hdpvr/hdpvr-core.c
|
||||
@@ -60,6 +60,7 @@ static struct usb_device_id hdpvr_table[
|
||||
{ USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID1) },
|
||||
{ USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID2) },
|
||||
{ USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID3) },
|
||||
+ { USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID4) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, hdpvr_table);
|
||||
@@ -152,19 +153,26 @@ static int device_authorization(struct h
|
||||
ret, print_buf);
|
||||
}
|
||||
#endif
|
||||
- if (dev->usbc_buf[1] == HDPVR_FIRMWARE_VERSION) {
|
||||
+
|
||||
+ v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n",
|
||||
+ dev->usbc_buf[1], &dev->usbc_buf[2]);
|
||||
+
|
||||
+ switch (dev->usbc_buf[1]) {
|
||||
+ case HDPVR_FIRMWARE_VERSION:
|
||||
dev->flags &= ~HDPVR_FLAG_AC3_CAP;
|
||||
- } else if (dev->usbc_buf[1] == HDPVR_FIRMWARE_VERSION_AC3) {
|
||||
- dev->flags |= HDPVR_FLAG_AC3_CAP;
|
||||
- } else if (dev->usbc_buf[1] > HDPVR_FIRMWARE_VERSION_AC3) {
|
||||
- v4l2_info(&dev->v4l2_dev, "untested firmware version 0x%x, "
|
||||
- "the driver might not work\n", dev->usbc_buf[1]);
|
||||
+ break;
|
||||
+ case HDPVR_FIRMWARE_VERSION_AC3:
|
||||
+ case HDPVR_FIRMWARE_VERSION_0X12:
|
||||
+ case HDPVR_FIRMWARE_VERSION_0X15:
|
||||
dev->flags |= HDPVR_FLAG_AC3_CAP;
|
||||
- } else {
|
||||
- v4l2_err(&dev->v4l2_dev, "unknown firmware version 0x%x\n",
|
||||
- dev->usbc_buf[1]);
|
||||
- ret = -EINVAL;
|
||||
- goto unlock;
|
||||
+ break;
|
||||
+ default:
|
||||
+ v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might"
|
||||
+ " not work.\n");
|
||||
+ if (dev->usbc_buf[1] >= HDPVR_FIRMWARE_VERSION_AC3)
|
||||
+ dev->flags |= HDPVR_FLAG_AC3_CAP;
|
||||
+ else
|
||||
+ dev->flags &= ~HDPVR_FLAG_AC3_CAP;
|
||||
}
|
||||
|
||||
response = dev->usbc_buf+38;
|
||||
@@ -319,8 +327,12 @@ static int hdpvr_probe(struct usb_interf
|
||||
if (default_video_input < HDPVR_VIDEO_INPUTS)
|
||||
dev->options.video_input = default_video_input;
|
||||
|
||||
- if (default_audio_input < HDPVR_AUDIO_INPUTS)
|
||||
+ if (default_audio_input < HDPVR_AUDIO_INPUTS) {
|
||||
dev->options.audio_input = default_audio_input;
|
||||
+ if (default_audio_input == HDPVR_SPDIF)
|
||||
+ dev->options.audio_codec =
|
||||
+ V4L2_MPEG_AUDIO_ENCODING_AC3;
|
||||
+ }
|
||||
|
||||
dev->udev = usb_get_dev(interface_to_usbdev(interface));
|
||||
|
||||
Index: linux-2.6.35.x86_64.ir/drivers/media/video/hdpvr/hdpvr.h
|
||||
===================================================================
|
||||
--- linux-2.6.35.x86_64.ir.orig/drivers/media/video/hdpvr/hdpvr.h
|
||||
+++ linux-2.6.35.x86_64.ir/drivers/media/video/hdpvr/hdpvr.h
|
||||
@@ -30,14 +30,17 @@
|
||||
#define HD_PVR_PRODUCT_ID 0x4900
|
||||
#define HD_PVR_PRODUCT_ID1 0x4901
|
||||
#define HD_PVR_PRODUCT_ID2 0x4902
|
||||
+#define HD_PVR_PRODUCT_ID4 0x4903
|
||||
#define HD_PVR_PRODUCT_ID3 0x4982
|
||||
|
||||
#define UNSET (-1U)
|
||||
|
||||
#define NUM_BUFFERS 64
|
||||
|
||||
-#define HDPVR_FIRMWARE_VERSION 0x8
|
||||
-#define HDPVR_FIRMWARE_VERSION_AC3 0xd
|
||||
+#define HDPVR_FIRMWARE_VERSION 0x08
|
||||
+#define HDPVR_FIRMWARE_VERSION_AC3 0x0d
|
||||
+#define HDPVR_FIRMWARE_VERSION_0X12 0x12
|
||||
+#define HDPVR_FIRMWARE_VERSION_0X15 0x15
|
||||
|
||||
/* #define HDPVR_DEBUG */
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
From: Jarod Wilson <jarod@redhat.com>
|
||||
Date: Sat, 23 Oct 2010 19:42:20 +0000 (-0300)
|
||||
Subject: [media] imon: fix my egregious brown paper bag w/rdev/idev split
|
||||
X-Git-Url: http://git.linuxtv.org/media_tree.git?a=commitdiff_plain;h=428cc7633dedbab05aab80b805d8585572dc6dbf
|
||||
|
||||
[media] imon: fix my egregious brown paper bag w/rdev/idev split
|
||||
|
||||
Somehow, I managed to screw things up when reworking the rdev/idev split
|
||||
patch from David, and started trying to get ir_input_dev from idev
|
||||
instead of rdev, thus resulting in button presses hanging the system.
|
||||
This fixes it.
|
||||
|
||||
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
---
|
||||
|
||||
diff --git a/drivers/media/IR/imon.c b/drivers/media/IR/imon.c
|
||||
index 0391c3b..bcb2826 100644
|
||||
--- a/drivers/media/IR/imon.c
|
||||
+++ b/drivers/media/IR/imon.c
|
||||
@@ -1477,7 +1477,7 @@ static void imon_incoming_packet(struct imon_context *ictx,
|
||||
bool norelease = false;
|
||||
int i;
|
||||
u64 scancode;
|
||||
- struct input_dev *idev = NULL;
|
||||
+ struct input_dev *rdev = NULL;
|
||||
struct ir_input_dev *irdev = NULL;
|
||||
int press_type = 0;
|
||||
int msec;
|
||||
@@ -1485,8 +1485,8 @@ static void imon_incoming_packet(struct imon_context *ictx,
|
||||
static struct timeval prev_time = { 0, 0 };
|
||||
u8 ktype;
|
||||
|
||||
- idev = ictx->idev;
|
||||
- irdev = input_get_drvdata(idev);
|
||||
+ rdev = ictx->rdev;
|
||||
+ irdev = input_get_drvdata(rdev);
|
||||
|
||||
/* filter out junk data on the older 0xffdc imon devices */
|
||||
if ((buf[0] == 0xff) && (buf[1] == 0xff) && (buf[2] == 0xff))
|
||||
@@ -1570,8 +1570,7 @@ static void imon_incoming_packet(struct imon_context *ictx,
|
||||
if (press_type == 0)
|
||||
ir_keyup(irdev);
|
||||
else {
|
||||
- ir_keydown(ictx->rdev, ictx->rc_scancode,
|
||||
- ictx->rc_toggle);
|
||||
+ ir_keydown(rdev, ictx->rc_scancode, ictx->rc_toggle);
|
||||
spin_lock_irqsave(&ictx->kc_lock, flags);
|
||||
ictx->last_keycode = ictx->kc;
|
||||
spin_unlock_irqrestore(&ictx->kc_lock, flags);
|
||||
@@ -1587,7 +1586,7 @@ static void imon_incoming_packet(struct imon_context *ictx,
|
||||
do_gettimeofday(&t);
|
||||
msec = tv2int(&t, &prev_time);
|
||||
prev_time = t;
|
||||
- if (msec < idev->rep[REP_DELAY]) {
|
||||
+ if (msec < ictx->idev->rep[REP_DELAY]) {
|
||||
spin_unlock_irqrestore(&ictx->kc_lock, flags);
|
||||
return;
|
||||
}
|
||||
@@ -1596,12 +1595,12 @@ static void imon_incoming_packet(struct imon_context *ictx,
|
||||
|
||||
spin_unlock_irqrestore(&ictx->kc_lock, flags);
|
||||
|
||||
- input_report_key(idev, kc, press_type);
|
||||
- input_sync(idev);
|
||||
+ input_report_key(ictx->idev, kc, press_type);
|
||||
+ input_sync(ictx->idev);
|
||||
|
||||
/* panel keys don't generate a release */
|
||||
- input_report_key(idev, kc, 0);
|
||||
- input_sync(idev);
|
||||
+ input_report_key(ictx->idev, kc, 0);
|
||||
+ input_sync(ictx->idev);
|
||||
|
||||
ictx->last_keycode = kc;
|
||||
|
|
@ -1,142 +0,0 @@
|
|||
drivers/media/IR/imon.c | 20 +-------------------
|
||||
drivers/media/IR/mceusb.c | 15 +--------------
|
||||
2 files changed, 2 insertions(+), 33 deletions(-)
|
||||
|
||||
diff --git a/drivers/media/IR/imon.c b/drivers/media/IR/imon.c
|
||||
index 65c125e..c185422 100644
|
||||
--- a/drivers/media/IR/imon.c
|
||||
+++ b/drivers/media/IR/imon.c
|
||||
@@ -87,7 +87,6 @@ static ssize_t lcd_write(struct file *file, const char *buf,
|
||||
struct imon_context {
|
||||
struct device *dev;
|
||||
struct ir_dev_props *props;
|
||||
- struct ir_input_dev *ir;
|
||||
/* Newer devices have two interfaces */
|
||||
struct usb_device *usbdev_intf0;
|
||||
struct usb_device *usbdev_intf1;
|
||||
@@ -1656,7 +1655,6 @@ static struct input_dev *imon_init_idev(struct imon_context *ictx)
|
||||
{
|
||||
struct input_dev *idev;
|
||||
struct ir_dev_props *props;
|
||||
- struct ir_input_dev *ir;
|
||||
int ret, i;
|
||||
|
||||
idev = input_allocate_device();
|
||||
@@ -1671,12 +1669,6 @@ static struct input_dev *imon_init_idev(struct imon_context *ictx)
|
||||
goto props_alloc_failed;
|
||||
}
|
||||
|
||||
- ir = kzalloc(sizeof(struct ir_input_dev), GFP_KERNEL);
|
||||
- if (!ir) {
|
||||
- dev_err(ictx->dev, "remote ir input dev allocation failed\n");
|
||||
- goto ir_dev_alloc_failed;
|
||||
- }
|
||||
-
|
||||
snprintf(ictx->name_idev, sizeof(ictx->name_idev),
|
||||
"iMON Remote (%04x:%04x)", ictx->vendor, ictx->product);
|
||||
idev->name = ictx->name_idev;
|
||||
@@ -1706,14 +1698,9 @@ static struct input_dev *imon_init_idev(struct imon_context *ictx)
|
||||
props->change_protocol = imon_ir_change_protocol;
|
||||
ictx->props = props;
|
||||
|
||||
- ictx->ir = ir;
|
||||
- memcpy(&ir->dev, ictx->dev, sizeof(struct device));
|
||||
-
|
||||
usb_to_input_id(ictx->usbdev_intf0, &idev->id);
|
||||
idev->dev.parent = ictx->dev;
|
||||
|
||||
- input_set_drvdata(idev, ir);
|
||||
-
|
||||
ret = ir_input_register(idev, RC_MAP_IMON_PAD, props, MOD_NAME);
|
||||
if (ret < 0) {
|
||||
dev_err(ictx->dev, "remote input dev register failed\n");
|
||||
@@ -1723,8 +1710,6 @@ static struct input_dev *imon_init_idev(struct imon_context *ictx)
|
||||
return idev;
|
||||
|
||||
idev_register_failed:
|
||||
- kfree(ir);
|
||||
-ir_dev_alloc_failed:
|
||||
kfree(props);
|
||||
props_alloc_failed:
|
||||
input_free_device(idev);
|
||||
@@ -1944,7 +1929,6 @@ static struct imon_context *imon_init_intf0(struct usb_interface *intf)
|
||||
|
||||
urb_submit_failed:
|
||||
ir_input_unregister(ictx->idev);
|
||||
- input_free_device(ictx->idev);
|
||||
idev_setup_failed:
|
||||
find_endpoint_failed:
|
||||
mutex_unlock(&ictx->lock);
|
||||
@@ -2014,10 +1998,8 @@ static struct imon_context *imon_init_intf1(struct usb_interface *intf,
|
||||
return ictx;
|
||||
|
||||
urb_submit_failed:
|
||||
- if (ictx->touch) {
|
||||
+ if (ictx->touch)
|
||||
input_unregister_device(ictx->touch);
|
||||
- input_free_device(ictx->touch);
|
||||
- }
|
||||
touch_setup_failed:
|
||||
find_endpoint_failed:
|
||||
mutex_unlock(&ictx->lock);
|
||||
diff --git a/drivers/media/IR/mceusb.c b/drivers/media/IR/mceusb.c
|
||||
index 78bf7f7..65b0738 100644
|
||||
--- a/drivers/media/IR/mceusb.c
|
||||
+++ b/drivers/media/IR/mceusb.c
|
||||
@@ -228,7 +228,6 @@ static struct usb_device_id std_tx_mask_list[] = {
|
||||
/* data structure for each usb transceiver */
|
||||
struct mceusb_dev {
|
||||
/* ir-core bits */
|
||||
- struct ir_input_dev *irdev;
|
||||
struct ir_dev_props *props;
|
||||
struct ir_raw_event rawir;
|
||||
|
||||
@@ -739,7 +738,7 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
|
||||
|
||||
if (ir->send_flags == RECV_FLAG_IN_PROGRESS) {
|
||||
ir->send_flags = SEND_FLAG_COMPLETE;
|
||||
- dev_dbg(&ir->irdev->dev, "setup answer received %d bytes\n",
|
||||
+ dev_dbg(ir->dev, "setup answer received %d bytes\n",
|
||||
buf_len);
|
||||
}
|
||||
|
||||
@@ -861,7 +860,6 @@ static struct input_dev *mceusb_init_input_dev(struct mceusb_dev *ir)
|
||||
{
|
||||
struct input_dev *idev;
|
||||
struct ir_dev_props *props;
|
||||
- struct ir_input_dev *irdev;
|
||||
struct device *dev = ir->dev;
|
||||
int ret = -ENODEV;
|
||||
|
||||
@@ -878,12 +876,6 @@ static struct input_dev *mceusb_init_input_dev(struct mceusb_dev *ir)
|
||||
goto props_alloc_failed;
|
||||
}
|
||||
|
||||
- irdev = kzalloc(sizeof(struct ir_input_dev), GFP_KERNEL);
|
||||
- if (!irdev) {
|
||||
- dev_err(dev, "remote ir input dev allocation failed\n");
|
||||
- goto ir_dev_alloc_failed;
|
||||
- }
|
||||
-
|
||||
snprintf(ir->name, sizeof(ir->name), "Media Center Ed. eHome "
|
||||
"Infrared Remote Transceiver (%04x:%04x)",
|
||||
le16_to_cpu(ir->usbdev->descriptor.idVendor),
|
||||
@@ -902,9 +894,6 @@ static struct input_dev *mceusb_init_input_dev(struct mceusb_dev *ir)
|
||||
props->tx_ir = mceusb_tx_ir;
|
||||
|
||||
ir->props = props;
|
||||
- ir->irdev = irdev;
|
||||
-
|
||||
- input_set_drvdata(idev, irdev);
|
||||
|
||||
ret = ir_input_register(idev, RC_MAP_RC6_MCE, props, DRIVER_NAME);
|
||||
if (ret < 0) {
|
||||
@@ -915,8 +904,6 @@ static struct input_dev *mceusb_init_input_dev(struct mceusb_dev *ir)
|
||||
return idev;
|
||||
|
||||
irdev_failed:
|
||||
- kfree(irdev);
|
||||
-ir_dev_alloc_failed:
|
||||
kfree(props);
|
||||
props_alloc_failed:
|
||||
input_free_device(idev);
|
|
@ -1,944 +0,0 @@
|
|||
diff -Naurp linux-2.6.35.x86_64.orig/drivers/media/IR/ir-core-priv.h linux-2.6.35.x86_64/drivers/media/IR/ir-core-priv.h
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/ir-core-priv.h 2010-08-15 17:50:34.572382442 -0400
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/ir-core-priv.h 2010-08-16 00:11:42.756124321 -0400
|
||||
@@ -73,6 +73,12 @@ struct ir_raw_event_ctrl {
|
||||
bool first;
|
||||
bool toggle;
|
||||
} jvc;
|
||||
+ struct rc5_sz_dec {
|
||||
+ int state;
|
||||
+ u32 bits;
|
||||
+ unsigned count;
|
||||
+ unsigned wanted_bits;
|
||||
+ } rc5_sz;
|
||||
struct lirc_codec {
|
||||
struct ir_input_dev *ir_dev;
|
||||
struct lirc_driver *drv;
|
||||
diff -Naurp linux-2.6.35.x86_64.orig/drivers/media/IR/ir-rc5-sz-decoder.c linux-2.6.35.x86_64/drivers/media/IR/ir-rc5-sz-decoder.c
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/ir-rc5-sz-decoder.c 1969-12-31 19:00:00.000000000 -0500
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/ir-rc5-sz-decoder.c 2010-08-16 00:07:19.962608685 -0400
|
||||
@@ -0,0 +1,153 @@
|
||||
+/* ir-rc5-sz-decoder.c - handle RC5 Streamzap IR Pulse/Space protocol
|
||||
+ *
|
||||
+ * Copyright (C) 2010 by Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
+ * Copyright (C) 2010 by Jarod Wilson <jarod@redhat.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation version 2 of the License.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * This code handles the 15 bit RC5-ish protocol used by the Streamzap
|
||||
+ * PC Remote.
|
||||
+ * It considers a carrier of 36 kHz, with a total of 15 bits, where
|
||||
+ * the first two bits are start bits, and a third one is a filing bit
|
||||
+ */
|
||||
+
|
||||
+#include "ir-core-priv.h"
|
||||
+
|
||||
+#define RC5_SZ_NBITS 15
|
||||
+#define RC5_UNIT 888888 /* ns */
|
||||
+#define RC5_BIT_START (1 * RC5_UNIT)
|
||||
+#define RC5_BIT_END (1 * RC5_UNIT)
|
||||
+
|
||||
+enum rc5_sz_state {
|
||||
+ STATE_INACTIVE,
|
||||
+ STATE_BIT_START,
|
||||
+ STATE_BIT_END,
|
||||
+ STATE_FINISHED,
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * ir_rc5_sz_decode() - Decode one RC-5 Streamzap pulse or space
|
||||
+ * @input_dev: the struct input_dev descriptor of the device
|
||||
+ * @ev: the struct ir_raw_event descriptor of the pulse/space
|
||||
+ *
|
||||
+ * This function returns -EINVAL if the pulse violates the state machine
|
||||
+ */
|
||||
+static int ir_rc5_sz_decode(struct input_dev *input_dev, struct ir_raw_event ev)
|
||||
+{
|
||||
+ struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
|
||||
+ struct rc5_sz_dec *data = &ir_dev->raw->rc5_sz;
|
||||
+ u8 toggle, command, system;
|
||||
+ u32 scancode;
|
||||
+
|
||||
+ if (!(ir_dev->raw->enabled_protocols & IR_TYPE_RC5_SZ))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (IS_RESET(ev)) {
|
||||
+ data->state = STATE_INACTIVE;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ if (!geq_margin(ev.duration, RC5_UNIT, RC5_UNIT / 2))
|
||||
+ goto out;
|
||||
+
|
||||
+again:
|
||||
+ IR_dprintk(2, "RC5-sz decode started at state %i (%uus %s)\n",
|
||||
+ data->state, TO_US(ev.duration), TO_STR(ev.pulse));
|
||||
+
|
||||
+ if (!geq_margin(ev.duration, RC5_UNIT, RC5_UNIT / 2))
|
||||
+ return 0;
|
||||
+
|
||||
+ switch (data->state) {
|
||||
+
|
||||
+ case STATE_INACTIVE:
|
||||
+ if (!ev.pulse)
|
||||
+ break;
|
||||
+
|
||||
+ data->state = STATE_BIT_START;
|
||||
+ data->count = 1;
|
||||
+ data->wanted_bits = RC5_SZ_NBITS;
|
||||
+ decrease_duration(&ev, RC5_BIT_START);
|
||||
+ goto again;
|
||||
+
|
||||
+ case STATE_BIT_START:
|
||||
+ if (!eq_margin(ev.duration, RC5_BIT_START, RC5_UNIT / 2))
|
||||
+ break;
|
||||
+
|
||||
+ data->bits <<= 1;
|
||||
+ if (!ev.pulse)
|
||||
+ data->bits |= 1;
|
||||
+ data->count++;
|
||||
+ data->state = STATE_BIT_END;
|
||||
+ return 0;
|
||||
+
|
||||
+ case STATE_BIT_END:
|
||||
+ if (!is_transition(&ev, &ir_dev->raw->prev_ev))
|
||||
+ break;
|
||||
+
|
||||
+ if (data->count == data->wanted_bits)
|
||||
+ data->state = STATE_FINISHED;
|
||||
+ else
|
||||
+ data->state = STATE_BIT_START;
|
||||
+
|
||||
+ decrease_duration(&ev, RC5_BIT_END);
|
||||
+ goto again;
|
||||
+
|
||||
+ case STATE_FINISHED:
|
||||
+ if (ev.pulse)
|
||||
+ break;
|
||||
+
|
||||
+ /* RC5-sz */
|
||||
+ command = (data->bits & 0x0003F) >> 0;
|
||||
+ system = (data->bits & 0x02FC0) >> 6;
|
||||
+ toggle = (data->bits & 0x01000) ? 1 : 0;
|
||||
+ scancode = system << 6 | command;
|
||||
+
|
||||
+ IR_dprintk(1, "RC5-sz scancode 0x%04x (toggle: %u)\n",
|
||||
+ scancode, toggle);
|
||||
+
|
||||
+ ir_keydown(input_dev, scancode, toggle);
|
||||
+ data->state = STATE_INACTIVE;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ IR_dprintk(1, "RC5-sz decode failed at state %i (%uus %s)\n",
|
||||
+ data->state, TO_US(ev.duration), TO_STR(ev.pulse));
|
||||
+ data->state = STATE_INACTIVE;
|
||||
+ return -EINVAL;
|
||||
+}
|
||||
+
|
||||
+static struct ir_raw_handler rc5_sz_handler = {
|
||||
+ .protocols = IR_TYPE_RC5_SZ,
|
||||
+ .decode = ir_rc5_sz_decode,
|
||||
+};
|
||||
+
|
||||
+static int __init ir_rc5_sz_decode_init(void)
|
||||
+{
|
||||
+ ir_raw_handler_register(&rc5_sz_handler);
|
||||
+
|
||||
+ printk(KERN_INFO "IR RC5 (streamzap) protocol handler initialized\n");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void __exit ir_rc5_sz_decode_exit(void)
|
||||
+{
|
||||
+ ir_raw_handler_unregister(&rc5_sz_handler);
|
||||
+}
|
||||
+
|
||||
+module_init(ir_rc5_sz_decode_init);
|
||||
+module_exit(ir_rc5_sz_decode_exit);
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_AUTHOR("Jarod Wilson <jarod@redhat.com>");
|
||||
+MODULE_AUTHOR("Red Hat Inc. (http://www.redhat.com)");
|
||||
+MODULE_DESCRIPTION("RC5 (streamzap) IR protocol decoder");
|
||||
diff -Naurp linux-2.6.35.x86_64.orig/drivers/media/IR/ir-sysfs.c linux-2.6.35.x86_64/drivers/media/IR/ir-sysfs.c
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/ir-sysfs.c 2010-08-15 17:50:34.574380413 -0400
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/ir-sysfs.c 2010-08-16 00:23:24.893168856 -0400
|
||||
@@ -93,6 +93,11 @@ static ssize_t show_protocols(struct dev
|
||||
else if (allowed & IR_TYPE_SONY)
|
||||
tmp += sprintf(tmp, "sony ");
|
||||
|
||||
+ if (allowed & enabled & IR_TYPE_RC5_SZ)
|
||||
+ tmp += sprintf(tmp, "[rc5sz] ");
|
||||
+ else if (allowed & IR_TYPE_RC5_SZ)
|
||||
+ tmp += sprintf(tmp, "rc5sz ");
|
||||
+
|
||||
if (allowed & enabled & IR_TYPE_LIRC)
|
||||
tmp += sprintf(tmp, "[lirc] ");
|
||||
else if (allowed & IR_TYPE_LIRC)
|
||||
@@ -165,6 +170,9 @@ static ssize_t store_protocols(struct de
|
||||
} else if (!strncasecmp(tmp, "sony", 4)) {
|
||||
tmp += 4;
|
||||
mask = IR_TYPE_SONY;
|
||||
+ } else if (!strncasecmp(tmp, "rc5sz", 5)) {
|
||||
+ tmp += 5;
|
||||
+ mask = IR_TYPE_RC5_SZ;
|
||||
} else if (!strncasecmp(tmp, "lirc", 4)) {
|
||||
tmp += 4;
|
||||
mask = IR_TYPE_LIRC;
|
||||
diff -Naurp linux-2.6.35.x86_64.orig/drivers/media/IR/Kconfig linux-2.6.35.x86_64/drivers/media/IR/Kconfig
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/Kconfig 2010-08-15 17:50:34.571382513 -0400
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/Kconfig 2010-08-16 00:10:09.292873588 -0400
|
||||
@@ -69,6 +69,16 @@ config IR_SONY_DECODER
|
||||
Enable this option if you have an infrared remote control which
|
||||
uses the Sony protocol, and you need software decoding support.
|
||||
|
||||
+config IR_RC5_SZ_DECODER
|
||||
+ tristate "Enable IR raw decoder for the RC-5 (streamzap) protocol"
|
||||
+ depends on IR_CORE
|
||||
+ select BITREVERSE
|
||||
+ default y
|
||||
+
|
||||
+ ---help---
|
||||
+ Enable this option if you have IR with RC-5 (streamzap) protocol,
|
||||
+ and if the IR is decoded in software.
|
||||
+
|
||||
config IR_LIRC_CODEC
|
||||
tristate "Enable IR to LIRC bridge"
|
||||
depends on IR_CORE
|
||||
@@ -102,3 +112,15 @@ config IR_MCEUSB
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called mceusb.
|
||||
+
|
||||
+config IR_STREAMZAP
|
||||
+ tristate "Streamzap PC Remote IR Receiver"
|
||||
+ depends on USB_ARCH_HAS_HCD
|
||||
+ depends on IR_CORE
|
||||
+ select USB
|
||||
+ ---help---
|
||||
+ Say Y here if you want to use a Streamzap PC Remote
|
||||
+ Infrared Receiver.
|
||||
+
|
||||
+ To compile this driver as a module, choose M here: the
|
||||
+ module will be called streamzap.
|
||||
diff -Naurp linux-2.6.35.x86_64.orig/drivers/media/IR/keymaps/Makefile linux-2.6.35.x86_64/drivers/media/IR/keymaps/Makefile
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/keymaps/Makefile 2010-08-15 17:50:34.575383346 -0400
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/keymaps/Makefile 2010-08-16 00:05:47.400370419 -0400
|
||||
@@ -60,6 +60,7 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t
|
||||
rc-rc5-tv.o \
|
||||
rc-rc6-mce.o \
|
||||
rc-real-audio-220-32-keys.o \
|
||||
+ rc-streamzap.o \
|
||||
rc-tbs-nec.o \
|
||||
rc-terratec-cinergy-xs.o \
|
||||
rc-tevii-nec.o \
|
||||
diff -Naurp linux-2.6.35.x86_64.orig/drivers/media/IR/keymaps/rc-streamzap.c linux-2.6.35.x86_64/drivers/media/IR/keymaps/rc-streamzap.c
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/keymaps/rc-streamzap.c 1969-12-31 19:00:00.000000000 -0500
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/keymaps/rc-streamzap.c 2010-08-16 00:05:47.402370467 -0400
|
||||
@@ -0,0 +1,82 @@
|
||||
+/* rc-streamzap.c - Keytable for Streamzap PC Remote, for use
|
||||
+ * with the Streamzap PC Remote IR Receiver.
|
||||
+ *
|
||||
+ * Copyright (c) 2010 by Jarod Wilson <jarod@redhat.com>
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation; either version 2 of the License, or
|
||||
+ * (at your option) any later version.
|
||||
+ */
|
||||
+
|
||||
+#include <media/rc-map.h>
|
||||
+
|
||||
+static struct ir_scancode streamzap[] = {
|
||||
+/*
|
||||
+ * The Streamzap remote is almost, but not quite, RC-5, as it has an extra
|
||||
+ * bit in it, which throws the in-kernel RC-5 decoder for a loop. Currently,
|
||||
+ * an additional RC-5-sz decoder is being deployed to support it, but it
|
||||
+ * may be possible to merge it back with the standard RC-5 decoder.
|
||||
+ */
|
||||
+ { 0x28c0, KEY_NUMERIC_0 },
|
||||
+ { 0x28c1, KEY_NUMERIC_1 },
|
||||
+ { 0x28c2, KEY_NUMERIC_2 },
|
||||
+ { 0x28c3, KEY_NUMERIC_3 },
|
||||
+ { 0x28c4, KEY_NUMERIC_4 },
|
||||
+ { 0x28c5, KEY_NUMERIC_5 },
|
||||
+ { 0x28c6, KEY_NUMERIC_6 },
|
||||
+ { 0x28c7, KEY_NUMERIC_7 },
|
||||
+ { 0x28c8, KEY_NUMERIC_8 },
|
||||
+ { 0x28c9, KEY_NUMERIC_9 },
|
||||
+ { 0x28ca, KEY_POWER },
|
||||
+ { 0x28cb, KEY_MUTE },
|
||||
+ { 0x28cc, KEY_CHANNELUP },
|
||||
+ { 0x28cd, KEY_VOLUMEUP },
|
||||
+ { 0x28ce, KEY_CHANNELDOWN },
|
||||
+ { 0x28cf, KEY_VOLUMEDOWN },
|
||||
+ { 0x28d0, KEY_UP },
|
||||
+ { 0x28d1, KEY_LEFT },
|
||||
+ { 0x28d2, KEY_OK },
|
||||
+ { 0x28d3, KEY_RIGHT },
|
||||
+ { 0x28d4, KEY_DOWN },
|
||||
+ { 0x28d5, KEY_MENU },
|
||||
+ { 0x28d6, KEY_EXIT },
|
||||
+ { 0x28d7, KEY_PLAY },
|
||||
+ { 0x28d8, KEY_PAUSE },
|
||||
+ { 0x28d9, KEY_STOP },
|
||||
+ { 0x28da, KEY_BACK },
|
||||
+ { 0x28db, KEY_FORWARD },
|
||||
+ { 0x28dc, KEY_RECORD },
|
||||
+ { 0x28dd, KEY_REWIND },
|
||||
+ { 0x28de, KEY_FASTFORWARD },
|
||||
+ { 0x28e0, KEY_RED },
|
||||
+ { 0x28e1, KEY_GREEN },
|
||||
+ { 0x28e2, KEY_YELLOW },
|
||||
+ { 0x28e3, KEY_BLUE },
|
||||
+
|
||||
+};
|
||||
+
|
||||
+static struct rc_keymap streamzap_map = {
|
||||
+ .map = {
|
||||
+ .scan = streamzap,
|
||||
+ .size = ARRAY_SIZE(streamzap),
|
||||
+ .ir_type = IR_TYPE_RC5,
|
||||
+ .name = RC_MAP_STREAMZAP,
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
+static int __init init_rc_map_streamzap(void)
|
||||
+{
|
||||
+ return ir_register_map(&streamzap_map);
|
||||
+}
|
||||
+
|
||||
+static void __exit exit_rc_map_streamzap(void)
|
||||
+{
|
||||
+ ir_unregister_map(&streamzap_map);
|
||||
+}
|
||||
+
|
||||
+module_init(init_rc_map_streamzap)
|
||||
+module_exit(exit_rc_map_streamzap)
|
||||
+
|
||||
+MODULE_LICENSE("GPL");
|
||||
+MODULE_AUTHOR("Jarod Wilson <jarod@redhat.com>");
|
||||
diff -Naurp linux-2.6.35.x86_64.orig/drivers/media/IR/Makefile linux-2.6.35.x86_64/drivers/media/IR/Makefile
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/Makefile 2010-08-15 17:50:34.571382513 -0400
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/Makefile 2010-08-16 00:10:29.478144601 -0400
|
||||
@@ -11,8 +11,10 @@ obj-$(CONFIG_IR_RC5_DECODER) += ir-rc5-d
|
||||
obj-$(CONFIG_IR_RC6_DECODER) += ir-rc6-decoder.o
|
||||
obj-$(CONFIG_IR_JVC_DECODER) += ir-jvc-decoder.o
|
||||
obj-$(CONFIG_IR_SONY_DECODER) += ir-sony-decoder.o
|
||||
+obj-$(CONFIG_IR_RC5_SZ_DECODER) += ir-rc5-sz-decoder.o
|
||||
obj-$(CONFIG_IR_LIRC_CODEC) += ir-lirc-codec.o
|
||||
|
||||
# stand-alone IR receivers/transmitters
|
||||
obj-$(CONFIG_IR_IMON) += imon.o
|
||||
obj-$(CONFIG_IR_MCEUSB) += mceusb.o
|
||||
+obj-$(CONFIG_IR_STREAMZAP) += streamzap.o
|
||||
diff -Naurp linux-2.6.35.x86_64.orig/drivers/media/IR/streamzap.c linux-2.6.35.x86_64/drivers/media/IR/streamzap.c
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/streamzap.c 1969-12-31 19:00:00.000000000 -0500
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/streamzap.c 2010-08-16 00:12:43.223932881 -0400
|
||||
@@ -0,0 +1,569 @@
|
||||
+/*
|
||||
+ * Streamzap Remote Control driver
|
||||
+ *
|
||||
+ * Copyright (c) 2005 Christoph Bartelmus <lirc@bartelmus.de>
|
||||
+ * Copyright (c) 2010 Jarod Wilson <jarod@wilsonet.com>
|
||||
+ *
|
||||
+ * This driver was based on the work of Greg Wickham and Adrian
|
||||
+ * Dewhurst. It was substantially rewritten to support correct signal
|
||||
+ * gaps and now maintains a delay buffer, which is used to present
|
||||
+ * consistent timing behaviour to user space applications. Without the
|
||||
+ * delay buffer an ugly hack would be required in lircd, which can
|
||||
+ * cause sluggish signal decoding in certain situations.
|
||||
+ *
|
||||
+ * Ported to in-kernel ir-core interface by Jarod Wilson
|
||||
+ *
|
||||
+ * This driver is based on the USB skeleton driver packaged with the
|
||||
+ * kernel; copyright (C) 2001-2003 Greg Kroah-Hartman (greg@kroah.com)
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation; either version 2 of the License, or
|
||||
+ * (at your option) any later version.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+ */
|
||||
+
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/usb.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <media/ir-core.h>
|
||||
+
|
||||
+#define DRIVER_VERSION "1.61"
|
||||
+#define DRIVER_NAME "streamzap"
|
||||
+#define DRIVER_DESC "Streamzap Remote Control driver"
|
||||
+
|
||||
+#ifdef CONFIG_USB_DEBUG
|
||||
+static int debug = 1;
|
||||
+#else
|
||||
+static int debug;
|
||||
+#endif
|
||||
+
|
||||
+#define USB_STREAMZAP_VENDOR_ID 0x0e9c
|
||||
+#define USB_STREAMZAP_PRODUCT_ID 0x0000
|
||||
+
|
||||
+/* table of devices that work with this driver */
|
||||
+static struct usb_device_id streamzap_table[] = {
|
||||
+ /* Streamzap Remote Control */
|
||||
+ { USB_DEVICE(USB_STREAMZAP_VENDOR_ID, USB_STREAMZAP_PRODUCT_ID) },
|
||||
+ /* Terminating entry */
|
||||
+ { }
|
||||
+};
|
||||
+
|
||||
+MODULE_DEVICE_TABLE(usb, streamzap_table);
|
||||
+
|
||||
+#define STREAMZAP_PULSE_MASK 0xf0
|
||||
+#define STREAMZAP_SPACE_MASK 0x0f
|
||||
+#define STREAMZAP_TIMEOUT 0xff
|
||||
+#define STREAMZAP_RESOLUTION 256
|
||||
+
|
||||
+/* number of samples buffered */
|
||||
+#define SZ_BUF_LEN 128
|
||||
+
|
||||
+/* from ir-rc5-sz-decoder.c */
|
||||
+#ifdef CONFIG_IR_RC5_SZ_DECODER_MODULE
|
||||
+#define load_rc5_sz_decode() request_module("ir-rc5-sz-decoder")
|
||||
+#else
|
||||
+#define load_rc5_sz_decode() 0
|
||||
+#endif
|
||||
+
|
||||
+enum StreamzapDecoderState {
|
||||
+ PulseSpace,
|
||||
+ FullPulse,
|
||||
+ FullSpace,
|
||||
+ IgnorePulse
|
||||
+};
|
||||
+
|
||||
+/* structure to hold our device specific stuff */
|
||||
+struct streamzap_ir {
|
||||
+
|
||||
+ /* ir-core */
|
||||
+ struct ir_dev_props *props;
|
||||
+
|
||||
+ /* core device info */
|
||||
+ struct device *dev;
|
||||
+ struct input_dev *idev;
|
||||
+
|
||||
+ /* usb */
|
||||
+ struct usb_device *usbdev;
|
||||
+ struct usb_interface *interface;
|
||||
+ struct usb_endpoint_descriptor *endpoint;
|
||||
+ struct urb *urb_in;
|
||||
+
|
||||
+ /* buffer & dma */
|
||||
+ unsigned char *buf_in;
|
||||
+ dma_addr_t dma_in;
|
||||
+ unsigned int buf_in_len;
|
||||
+
|
||||
+ /* track what state we're in */
|
||||
+ enum StreamzapDecoderState decoder_state;
|
||||
+ /* tracks whether we are currently receiving some signal */
|
||||
+ bool idle;
|
||||
+ /* sum of signal lengths received since signal start */
|
||||
+ unsigned long sum;
|
||||
+ /* start time of signal; necessary for gap tracking */
|
||||
+ struct timeval signal_last;
|
||||
+ struct timeval signal_start;
|
||||
+ bool timeout_enabled;
|
||||
+
|
||||
+ char name[128];
|
||||
+ char phys[64];
|
||||
+};
|
||||
+
|
||||
+
|
||||
+/* local function prototypes */
|
||||
+static int streamzap_probe(struct usb_interface *interface,
|
||||
+ const struct usb_device_id *id);
|
||||
+static void streamzap_disconnect(struct usb_interface *interface);
|
||||
+static void streamzap_callback(struct urb *urb);
|
||||
+static int streamzap_suspend(struct usb_interface *intf, pm_message_t message);
|
||||
+static int streamzap_resume(struct usb_interface *intf);
|
||||
+
|
||||
+/* usb specific object needed to register this driver with the usb subsystem */
|
||||
+static struct usb_driver streamzap_driver = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .probe = streamzap_probe,
|
||||
+ .disconnect = streamzap_disconnect,
|
||||
+ .suspend = streamzap_suspend,
|
||||
+ .resume = streamzap_resume,
|
||||
+ .id_table = streamzap_table,
|
||||
+};
|
||||
+
|
||||
+static void sz_push(struct streamzap_ir *sz, struct ir_raw_event rawir)
|
||||
+{
|
||||
+ ir_raw_event_store(sz->idev, &rawir);
|
||||
+}
|
||||
+
|
||||
+static void sz_push_full_pulse(struct streamzap_ir *sz,
|
||||
+ unsigned char value)
|
||||
+{
|
||||
+ struct ir_raw_event rawir;
|
||||
+
|
||||
+ if (sz->idle) {
|
||||
+ long deltv;
|
||||
+
|
||||
+ sz->signal_last = sz->signal_start;
|
||||
+ do_gettimeofday(&sz->signal_start);
|
||||
+
|
||||
+ deltv = sz->signal_start.tv_sec - sz->signal_last.tv_sec;
|
||||
+ rawir.pulse = false;
|
||||
+ if (deltv > 15) {
|
||||
+ /* really long time */
|
||||
+ rawir.duration = IR_MAX_DURATION;
|
||||
+ } else {
|
||||
+ rawir.duration = (int)(deltv * 1000000 +
|
||||
+ sz->signal_start.tv_usec -
|
||||
+ sz->signal_last.tv_usec);
|
||||
+ rawir.duration -= sz->sum;
|
||||
+ rawir.duration *= 1000;
|
||||
+ rawir.duration &= IR_MAX_DURATION;
|
||||
+ }
|
||||
+ dev_dbg(sz->dev, "ls %u\n", rawir.duration);
|
||||
+ sz_push(sz, rawir);
|
||||
+
|
||||
+ sz->idle = false;
|
||||
+ sz->sum = 0;
|
||||
+ }
|
||||
+
|
||||
+ rawir.pulse = true;
|
||||
+ rawir.duration = ((int) value) * STREAMZAP_RESOLUTION;
|
||||
+ rawir.duration += STREAMZAP_RESOLUTION / 2;
|
||||
+ sz->sum += rawir.duration;
|
||||
+ rawir.duration *= 1000;
|
||||
+ rawir.duration &= IR_MAX_DURATION;
|
||||
+ dev_dbg(sz->dev, "p %u\n", rawir.duration);
|
||||
+ sz_push(sz, rawir);
|
||||
+}
|
||||
+
|
||||
+static void sz_push_half_pulse(struct streamzap_ir *sz,
|
||||
+ unsigned char value)
|
||||
+{
|
||||
+ sz_push_full_pulse(sz, (value & STREAMZAP_PULSE_MASK) >> 4);
|
||||
+}
|
||||
+
|
||||
+static void sz_push_full_space(struct streamzap_ir *sz,
|
||||
+ unsigned char value)
|
||||
+{
|
||||
+ struct ir_raw_event rawir;
|
||||
+
|
||||
+ rawir.pulse = false;
|
||||
+ rawir.duration = ((int) value) * STREAMZAP_RESOLUTION;
|
||||
+ rawir.duration += STREAMZAP_RESOLUTION / 2;
|
||||
+ sz->sum += rawir.duration;
|
||||
+ rawir.duration *= 1000;
|
||||
+ dev_dbg(sz->dev, "s %u\n", rawir.duration);
|
||||
+ sz_push(sz, rawir);
|
||||
+}
|
||||
+
|
||||
+static void sz_push_half_space(struct streamzap_ir *sz,
|
||||
+ unsigned long value)
|
||||
+{
|
||||
+ sz_push_full_space(sz, value & STREAMZAP_SPACE_MASK);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * streamzap_callback - usb IRQ handler callback
|
||||
+ *
|
||||
+ * This procedure is invoked on reception of data from
|
||||
+ * the usb remote.
|
||||
+ */
|
||||
+static void streamzap_callback(struct urb *urb)
|
||||
+{
|
||||
+ struct streamzap_ir *sz;
|
||||
+ unsigned int i;
|
||||
+ int len;
|
||||
+ static int timeout = (((STREAMZAP_TIMEOUT * STREAMZAP_RESOLUTION) &
|
||||
+ IR_MAX_DURATION) | 0x03000000);
|
||||
+
|
||||
+ if (!urb)
|
||||
+ return;
|
||||
+
|
||||
+ sz = urb->context;
|
||||
+ len = urb->actual_length;
|
||||
+
|
||||
+ switch (urb->status) {
|
||||
+ case -ECONNRESET:
|
||||
+ case -ENOENT:
|
||||
+ case -ESHUTDOWN:
|
||||
+ /*
|
||||
+ * this urb is terminated, clean up.
|
||||
+ * sz might already be invalid at this point
|
||||
+ */
|
||||
+ dev_err(sz->dev, "urb terminated, status: %d\n", urb->status);
|
||||
+ return;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ dev_info(sz->dev, "%s: received urb, len %d\n", __func__, len);
|
||||
+ for (i = 0; i < len; i++) {
|
||||
+ dev_info(sz->dev, "sz idx %d: %x\n",
|
||||
+ i, (unsigned char)sz->buf_in[i]);
|
||||
+ switch (sz->decoder_state) {
|
||||
+ case PulseSpace:
|
||||
+ if ((sz->buf_in[i] & STREAMZAP_PULSE_MASK) ==
|
||||
+ STREAMZAP_PULSE_MASK) {
|
||||
+ sz->decoder_state = FullPulse;
|
||||
+ continue;
|
||||
+ } else if ((sz->buf_in[i] & STREAMZAP_SPACE_MASK)
|
||||
+ == STREAMZAP_SPACE_MASK) {
|
||||
+ sz_push_half_pulse(sz, sz->buf_in[i]);
|
||||
+ sz->decoder_state = FullSpace;
|
||||
+ continue;
|
||||
+ } else {
|
||||
+ sz_push_half_pulse(sz, sz->buf_in[i]);
|
||||
+ sz_push_half_space(sz, sz->buf_in[i]);
|
||||
+ }
|
||||
+ break;
|
||||
+ case FullPulse:
|
||||
+ sz_push_full_pulse(sz, sz->buf_in[i]);
|
||||
+ sz->decoder_state = IgnorePulse;
|
||||
+ break;
|
||||
+ case FullSpace:
|
||||
+ if (sz->buf_in[i] == STREAMZAP_TIMEOUT) {
|
||||
+ struct ir_raw_event rawir;
|
||||
+
|
||||
+ rawir.pulse = false;
|
||||
+ rawir.duration = timeout * 1000;
|
||||
+ sz->idle = true;
|
||||
+ if (sz->timeout_enabled)
|
||||
+ sz_push(sz, rawir);
|
||||
+ ir_raw_event_handle(sz->idev);
|
||||
+ } else {
|
||||
+ sz_push_full_space(sz, sz->buf_in[i]);
|
||||
+ }
|
||||
+ sz->decoder_state = PulseSpace;
|
||||
+ break;
|
||||
+ case IgnorePulse:
|
||||
+ if ((sz->buf_in[i] & STREAMZAP_SPACE_MASK) ==
|
||||
+ STREAMZAP_SPACE_MASK) {
|
||||
+ sz->decoder_state = FullSpace;
|
||||
+ continue;
|
||||
+ }
|
||||
+ sz_push_half_space(sz, sz->buf_in[i]);
|
||||
+ sz->decoder_state = PulseSpace;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ usb_submit_urb(urb, GFP_ATOMIC);
|
||||
+
|
||||
+ return;
|
||||
+}
|
||||
+
|
||||
+static struct input_dev *streamzap_init_input_dev(struct streamzap_ir *sz)
|
||||
+{
|
||||
+ struct input_dev *idev;
|
||||
+ struct ir_dev_props *props;
|
||||
+ struct device *dev = sz->dev;
|
||||
+ int ret;
|
||||
+
|
||||
+ idev = input_allocate_device();
|
||||
+ if (!idev) {
|
||||
+ dev_err(dev, "remote input dev allocation failed\n");
|
||||
+ goto idev_alloc_failed;
|
||||
+ }
|
||||
+
|
||||
+ props = kzalloc(sizeof(struct ir_dev_props), GFP_KERNEL);
|
||||
+ if (!props) {
|
||||
+ dev_err(dev, "remote ir dev props allocation failed\n");
|
||||
+ goto props_alloc_failed;
|
||||
+ }
|
||||
+
|
||||
+ snprintf(sz->name, sizeof(sz->name), "Streamzap PC Remote Infrared "
|
||||
+ "Receiver (%04x:%04x)",
|
||||
+ le16_to_cpu(sz->usbdev->descriptor.idVendor),
|
||||
+ le16_to_cpu(sz->usbdev->descriptor.idProduct));
|
||||
+
|
||||
+ idev->name = sz->name;
|
||||
+ usb_make_path(sz->usbdev, sz->phys, sizeof(sz->phys));
|
||||
+ strlcat(sz->phys, "/input0", sizeof(sz->phys));
|
||||
+ idev->phys = sz->phys;
|
||||
+
|
||||
+ props->priv = sz;
|
||||
+ props->driver_type = RC_DRIVER_IR_RAW;
|
||||
+ props->allowed_protos = IR_TYPE_ALL;
|
||||
+
|
||||
+ sz->props = props;
|
||||
+
|
||||
+ ret = ir_input_register(idev, RC_MAP_STREAMZAP, props, DRIVER_NAME);
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dev, "remote input device register failed\n");
|
||||
+ goto irdev_failed;
|
||||
+ }
|
||||
+
|
||||
+ return idev;
|
||||
+
|
||||
+irdev_failed:
|
||||
+ kfree(props);
|
||||
+props_alloc_failed:
|
||||
+ input_free_device(idev);
|
||||
+idev_alloc_failed:
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * streamzap_probe
|
||||
+ *
|
||||
+ * Called by usb-core to associated with a candidate device
|
||||
+ * On any failure the return value is the ERROR
|
||||
+ * On success return 0
|
||||
+ */
|
||||
+static int __devinit streamzap_probe(struct usb_interface *intf,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ struct usb_device *usbdev = interface_to_usbdev(intf);
|
||||
+ struct usb_host_interface *iface_host;
|
||||
+ struct streamzap_ir *sz = NULL;
|
||||
+ char buf[63], name[128] = "";
|
||||
+ int retval = -ENOMEM;
|
||||
+ int pipe, maxp;
|
||||
+
|
||||
+ /* Allocate space for device driver specific data */
|
||||
+ sz = kzalloc(sizeof(struct streamzap_ir), GFP_KERNEL);
|
||||
+ if (!sz)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ sz->usbdev = usbdev;
|
||||
+ sz->interface = intf;
|
||||
+
|
||||
+ /* Check to ensure endpoint information matches requirements */
|
||||
+ iface_host = intf->cur_altsetting;
|
||||
+
|
||||
+ if (iface_host->desc.bNumEndpoints != 1) {
|
||||
+ dev_err(&intf->dev, "%s: Unexpected desc.bNumEndpoints (%d)\n",
|
||||
+ __func__, iface_host->desc.bNumEndpoints);
|
||||
+ retval = -ENODEV;
|
||||
+ goto free_sz;
|
||||
+ }
|
||||
+
|
||||
+ sz->endpoint = &(iface_host->endpoint[0].desc);
|
||||
+ if ((sz->endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
|
||||
+ != USB_DIR_IN) {
|
||||
+ dev_err(&intf->dev, "%s: endpoint doesn't match input device "
|
||||
+ "02%02x\n", __func__, sz->endpoint->bEndpointAddress);
|
||||
+ retval = -ENODEV;
|
||||
+ goto free_sz;
|
||||
+ }
|
||||
+
|
||||
+ if ((sz->endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
|
||||
+ != USB_ENDPOINT_XFER_INT) {
|
||||
+ dev_err(&intf->dev, "%s: endpoint attributes don't match xfer "
|
||||
+ "02%02x\n", __func__, sz->endpoint->bmAttributes);
|
||||
+ retval = -ENODEV;
|
||||
+ goto free_sz;
|
||||
+ }
|
||||
+
|
||||
+ pipe = usb_rcvintpipe(usbdev, sz->endpoint->bEndpointAddress);
|
||||
+ maxp = usb_maxpacket(usbdev, pipe, usb_pipeout(pipe));
|
||||
+
|
||||
+ if (maxp == 0) {
|
||||
+ dev_err(&intf->dev, "%s: endpoint Max Packet Size is 0!?!\n",
|
||||
+ __func__);
|
||||
+ retval = -ENODEV;
|
||||
+ goto free_sz;
|
||||
+ }
|
||||
+
|
||||
+ /* Allocate the USB buffer and IRQ URB */
|
||||
+ sz->buf_in = usb_alloc_coherent(usbdev, maxp, GFP_ATOMIC, &sz->dma_in);
|
||||
+ if (!sz->buf_in)
|
||||
+ goto free_sz;
|
||||
+
|
||||
+ sz->urb_in = usb_alloc_urb(0, GFP_KERNEL);
|
||||
+ if (!sz->urb_in)
|
||||
+ goto free_buf_in;
|
||||
+
|
||||
+ sz->dev = &intf->dev;
|
||||
+ sz->buf_in_len = maxp;
|
||||
+
|
||||
+ if (usbdev->descriptor.iManufacturer
|
||||
+ && usb_string(usbdev, usbdev->descriptor.iManufacturer,
|
||||
+ buf, sizeof(buf)) > 0)
|
||||
+ strlcpy(name, buf, sizeof(name));
|
||||
+
|
||||
+ if (usbdev->descriptor.iProduct
|
||||
+ && usb_string(usbdev, usbdev->descriptor.iProduct,
|
||||
+ buf, sizeof(buf)) > 0)
|
||||
+ snprintf(name + strlen(name), sizeof(name) - strlen(name),
|
||||
+ " %s", buf);
|
||||
+
|
||||
+ sz->idev = streamzap_init_input_dev(sz);
|
||||
+ if (!sz->idev)
|
||||
+ goto input_dev_fail;
|
||||
+
|
||||
+ sz->idle = true;
|
||||
+ sz->decoder_state = PulseSpace;
|
||||
+ /* FIXME: don't yet have a way to set this */
|
||||
+ sz->timeout_enabled = true;
|
||||
+ #if 0
|
||||
+ /* not yet supported, depends on patches from maxim */
|
||||
+ /* see also: LIRC_GET_REC_RESOLUTION and LIRC_SET_REC_TIMEOUT */
|
||||
+ sz->min_timeout = STREAMZAP_TIMEOUT * STREAMZAP_RESOLUTION * 1000;
|
||||
+ sz->max_timeout = STREAMZAP_TIMEOUT * STREAMZAP_RESOLUTION * 1000;
|
||||
+ #endif
|
||||
+
|
||||
+ do_gettimeofday(&sz->signal_start);
|
||||
+
|
||||
+ /* Complete final initialisations */
|
||||
+ usb_fill_int_urb(sz->urb_in, usbdev, pipe, sz->buf_in,
|
||||
+ maxp, (usb_complete_t)streamzap_callback,
|
||||
+ sz, sz->endpoint->bInterval);
|
||||
+ sz->urb_in->transfer_dma = sz->dma_in;
|
||||
+ sz->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
+
|
||||
+ usb_set_intfdata(intf, sz);
|
||||
+
|
||||
+ if (usb_submit_urb(sz->urb_in, GFP_ATOMIC))
|
||||
+ dev_err(sz->dev, "urb submit failed\n");
|
||||
+
|
||||
+ dev_info(sz->dev, "Registered %s on usb%d:%d\n", name,
|
||||
+ usbdev->bus->busnum, usbdev->devnum);
|
||||
+
|
||||
+ /* Load the streamzap not-quite-rc5 decoder too */
|
||||
+ load_rc5_sz_decode();
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+input_dev_fail:
|
||||
+ usb_free_urb(sz->urb_in);
|
||||
+free_buf_in:
|
||||
+ usb_free_coherent(usbdev, maxp, sz->buf_in, sz->dma_in);
|
||||
+free_sz:
|
||||
+ kfree(sz);
|
||||
+
|
||||
+ return retval;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * streamzap_disconnect
|
||||
+ *
|
||||
+ * Called by the usb core when the device is removed from the system.
|
||||
+ *
|
||||
+ * This routine guarantees that the driver will not submit any more urbs
|
||||
+ * by clearing dev->usbdev. It is also supposed to terminate any currently
|
||||
+ * active urbs. Unfortunately, usb_bulk_msg(), used in streamzap_read(),
|
||||
+ * does not provide any way to do this.
|
||||
+ */
|
||||
+static void streamzap_disconnect(struct usb_interface *interface)
|
||||
+{
|
||||
+ struct streamzap_ir *sz = usb_get_intfdata(interface);
|
||||
+ struct usb_device *usbdev = interface_to_usbdev(interface);
|
||||
+
|
||||
+ usb_set_intfdata(interface, NULL);
|
||||
+
|
||||
+ if (!sz)
|
||||
+ return;
|
||||
+
|
||||
+ sz->usbdev = NULL;
|
||||
+ ir_input_unregister(sz->idev);
|
||||
+ usb_kill_urb(sz->urb_in);
|
||||
+ usb_free_urb(sz->urb_in);
|
||||
+ usb_free_coherent(usbdev, sz->buf_in_len, sz->buf_in, sz->dma_in);
|
||||
+
|
||||
+ kfree(sz);
|
||||
+}
|
||||
+
|
||||
+static int streamzap_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
+{
|
||||
+ struct streamzap_ir *sz = usb_get_intfdata(intf);
|
||||
+
|
||||
+ usb_kill_urb(sz->urb_in);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int streamzap_resume(struct usb_interface *intf)
|
||||
+{
|
||||
+ struct streamzap_ir *sz = usb_get_intfdata(intf);
|
||||
+
|
||||
+ if (usb_submit_urb(sz->urb_in, GFP_ATOMIC)) {
|
||||
+ dev_err(sz->dev, "Error sumbiting urb\n");
|
||||
+ return -EIO;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * streamzap_init
|
||||
+ */
|
||||
+static int __init streamzap_init(void)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ /* register this driver with the USB subsystem */
|
||||
+ ret = usb_register(&streamzap_driver);
|
||||
+ if (ret < 0)
|
||||
+ printk(KERN_ERR DRIVER_NAME ": usb register failed, "
|
||||
+ "result = %d\n", ret);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * streamzap_exit
|
||||
+ */
|
||||
+static void __exit streamzap_exit(void)
|
||||
+{
|
||||
+ usb_deregister(&streamzap_driver);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+module_init(streamzap_init);
|
||||
+module_exit(streamzap_exit);
|
||||
+
|
||||
+MODULE_AUTHOR("Jarod Wilson <jarod@wilsonet.com>");
|
||||
+MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
+module_param(debug, bool, S_IRUGO | S_IWUSR);
|
||||
+MODULE_PARM_DESC(debug, "Enable debugging messages");
|
||||
diff -Naurp linux-2.6.35.x86_64.orig/include/media/rc-map.h linux-2.6.35.x86_64/include/media/rc-map.h
|
||||
--- linux-2.6.35.x86_64.orig/include/media/rc-map.h 2010-08-15 17:50:34.584382568 -0400
|
||||
+++ linux-2.6.35.x86_64/include/media/rc-map.h 2010-08-16 00:18:02.455993732 -0400
|
||||
@@ -17,12 +17,13 @@
|
||||
#define IR_TYPE_RC6 (1 << 2) /* Philips RC6 protocol */
|
||||
#define IR_TYPE_JVC (1 << 3) /* JVC protocol */
|
||||
#define IR_TYPE_SONY (1 << 4) /* Sony12/15/20 protocol */
|
||||
+#define IR_TYPE_RC5_SZ (1 << 5) /* RC5 variant used by Streamzap */
|
||||
#define IR_TYPE_LIRC (1 << 30) /* Pass raw IR to lirc userspace */
|
||||
#define IR_TYPE_OTHER (1u << 31)
|
||||
|
||||
#define IR_TYPE_ALL (IR_TYPE_RC5 | IR_TYPE_NEC | IR_TYPE_RC6 | \
|
||||
IR_TYPE_JVC | IR_TYPE_SONY | IR_TYPE_LIRC | \
|
||||
- IR_TYPE_OTHER)
|
||||
+ IR_TYPE_RC5_SZ | IR_TYPE_OTHER)
|
||||
|
||||
struct ir_scancode {
|
||||
u32 scancode;
|
||||
@@ -115,6 +116,7 @@ void rc_map_init(void);
|
||||
#define RC_MAP_RC5_TV "rc-rc5-tv"
|
||||
#define RC_MAP_RC6_MCE "rc-rc6-mce"
|
||||
#define RC_MAP_REAL_AUDIO_220_32_KEYS "rc-real-audio-220-32-keys"
|
||||
+#define RC_MAP_STREAMZAP "rc-streamzap"
|
||||
#define RC_MAP_TBS_NEC "rc-tbs-nec"
|
||||
#define RC_MAP_TERRATEC_CINERGY_XS "rc-terratec-cinergy-xs"
|
||||
#define RC_MAP_TEVII_NEC "rc-tevii-nec"
|
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,497 +0,0 @@
|
|||
commit f9e50d2945d5760df718926edb6d27f328e0b935
|
||||
Author: Jarod Wilson <jarod@redhat.com>
|
||||
Date: Mon Nov 22 15:40:20 2010 -0500
|
||||
|
||||
mceusb: add another device ID
|
||||
|
||||
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
||||
|
||||
commit a89055498d24d1d464d62fbe37aeb82b404be262
|
||||
Author: Dan Carpenter <error27@gmail.com>
|
||||
Date: Wed Nov 17 05:20:15 2010 +0000
|
||||
|
||||
lirc_dev: fixes in lirc_dev_fop_read()
|
||||
|
||||
This makes several changes but they're in one function and sort of
|
||||
related:
|
||||
|
||||
"buf" was leaked on error. The leak if we try to read an invalid
|
||||
length is the main concern because it could be triggered over and
|
||||
over.
|
||||
|
||||
If the copy_to_user() failed, then the original code returned the
|
||||
number of bytes remaining. read() is supposed to be the opposite way,
|
||||
where we return the number of bytes copied. I changed it to just return
|
||||
-EFAULT on errors.
|
||||
|
||||
Also I changed the debug output from "-EFAULT" to just "<fail>" because
|
||||
it isn't -EFAULT necessarily. And since we go though that path if the
|
||||
length is invalid now, there was another debug print that I removed.
|
||||
|
||||
Signed-off-by: Dan Carpenter <error27@gmail.com>
|
||||
Reviewed-by: Jarod Wilson <jarod@redhat.com>
|
||||
Acked-by: Jarod Wilson <jarod@redhat.com>
|
||||
|
||||
commit c745bf29fb25c909e1f9a4921bec24890b6fd3a8
|
||||
Author: Dan Carpenter <error27@gmail.com>
|
||||
Date: Wed Nov 17 05:13:39 2010 +0000
|
||||
|
||||
lirc_dev: add some __user annotations
|
||||
|
||||
Sparse complains because there are no __user annotations.
|
||||
|
||||
drivers/media/rc/lirc_dev.c:156:27: warning:
|
||||
incorrect type in initializer (incompatible argument 2 (different address spaces))
|
||||
drivers/media/rc/lirc_dev.c:156:27: expected int ( *read )( ... )
|
||||
drivers/media/rc/lirc_dev.c:156:27: got int ( extern [toplevel] *<noident> )( ... )
|
||||
|
||||
Signed-off-by: Dan Carpenter <error27@gmail.com>
|
||||
Acked-by: Jarod Wilson <jarod@redhat.com>
|
||||
|
||||
commit 175a1933735cdf3cb0aeedbd313c67a522b06a35
|
||||
Author: Dan Carpenter <error27@gmail.com>
|
||||
Date: Wed Nov 17 05:12:23 2010 +0000
|
||||
|
||||
lirc_dev: stray unlock in lirc_dev_fop_poll()
|
||||
|
||||
We shouldn't unlock here. I think this was a cut and paste error.
|
||||
|
||||
Signed-off-by: Dan Carpenter <error27@gmail.com>
|
||||
Acked-by: Jarod Wilson <jarod@redhat.com>
|
||||
|
||||
commit 8dab0da0eab009933e6ef108cf6ccb07f0f8f9dd
|
||||
Author: Paul Bender <pebender@gmail.com>
|
||||
Date: Wed Nov 17 14:56:17 2010 -0500
|
||||
|
||||
rc: fix sysfs entry for mceusb and streamzap
|
||||
|
||||
When trying to create persistent device names for mceusb and streamzap
|
||||
devices, I noticed that their respective drivers are not creating the rc
|
||||
device as a child of the USB device. Rather it creates it as virtual
|
||||
device. As a result, udev cannot use the USB device information to
|
||||
create persistent device names for event and lirc devices associated
|
||||
with the rc device. Not having persistent device names makes it more
|
||||
difficult to make use of the devices in userspace as their names can
|
||||
change.
|
||||
|
||||
Signed-off-by: Paul Bender <pebender@gmail.com>
|
||||
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
||||
|
||||
commit 244ca200149ebfc47138ffdb9a1e57ea75a037bd
|
||||
Author: Jarod Wilson <jarod@redhat.com>
|
||||
Date: Wed Nov 17 15:25:45 2010 +0000
|
||||
|
||||
streamzap: merge timeout space with trailing space
|
||||
|
||||
There are cases where we get an ending space, and our trailing timeout
|
||||
space then gets sent right after it, which breaks repeat, at least for
|
||||
lirc userspace decoding. Merge the two spaces by way of using
|
||||
ir_raw_event_store_filter, set a timeout value, and we're back to good.
|
||||
|
||||
Successfully tested with streamzap and windows mce remotes.
|
||||
|
||||
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
||||
|
||||
commit 9a72f7df26f4b68627c3ebc340d146065703c0cb
|
||||
Author: Jarod Wilson <jarod@redhat.com>
|
||||
Date: Fri Nov 12 19:49:04 2010 -0300
|
||||
|
||||
[media] mceusb: fix keybouce issue after parser simplification
|
||||
|
||||
Something I failed to notice while testing the mceusb RLE buffer
|
||||
decoding simplification patches was that we were getting an extra event
|
||||
from the previously pressed key.
|
||||
|
||||
As was pointed out to me on irc by Maxim, this is actually due to using
|
||||
ir_raw_event_store_with_filter without having set up a timeout value.
|
||||
The hardware has a timeout value we're now reading and storing, which
|
||||
properly enables the transition to idle in the raw event storage
|
||||
process, and makes IR decode behave correctly w/o keybounce.
|
||||
|
||||
Also remove no-longer-used ir_raw_event struct from mceusb_dev struct
|
||||
and add as-yet-unused enable flags for carrier reports and learning
|
||||
mode, which I'll hopefully start wiring up sooner than later. While
|
||||
looking into that, found evidence that 0x9f 0x15 responses are only
|
||||
non-zero when the short-range learning sensor is used, so correct the
|
||||
debug spew message, and then suppress it when using the standard
|
||||
long-range sensor.
|
||||
|
||||
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
|
||||
---
|
||||
drivers/media/IR/lirc_dev.c | 33 +++++++++++---------
|
||||
drivers/media/IR/mceusb.c | 65 ++++++++++++++++++++++++++++++++++--------
|
||||
drivers/media/IR/streamzap.c | 21 ++++++++------
|
||||
include/media/lirc_dev.h | 6 ++--
|
||||
4 files changed, 86 insertions(+), 39 deletions(-)
|
||||
|
||||
Index: linux-2.6.35.x86_64/drivers/media/IR/lirc_dev.c
|
||||
===================================================================
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/lirc_dev.c
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/lirc_dev.c
|
||||
@@ -519,10 +519,8 @@ unsigned int lirc_dev_fop_poll(struct fi
|
||||
|
||||
dev_dbg(ir->d.dev, LOGHEAD "poll called\n", ir->d.name, ir->d.minor);
|
||||
|
||||
- if (!ir->attached) {
|
||||
- mutex_unlock(&ir->irctl_lock);
|
||||
+ if (!ir->attached)
|
||||
return POLLERR;
|
||||
- }
|
||||
|
||||
poll_wait(file, &ir->buf->wait_poll, wait);
|
||||
|
||||
@@ -626,7 +624,7 @@ long lirc_dev_fop_ioctl(struct file *fil
|
||||
EXPORT_SYMBOL(lirc_dev_fop_ioctl);
|
||||
|
||||
ssize_t lirc_dev_fop_read(struct file *file,
|
||||
- char *buffer,
|
||||
+ char __user *buffer,
|
||||
size_t length,
|
||||
loff_t *ppos)
|
||||
{
|
||||
@@ -646,18 +644,18 @@ ssize_t lirc_dev_fop_read(struct file *f
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
- if (mutex_lock_interruptible(&ir->irctl_lock))
|
||||
- return -ERESTARTSYS;
|
||||
+ if (mutex_lock_interruptible(&ir->irctl_lock)) {
|
||||
+ ret = -ERESTARTSYS;
|
||||
+ goto out_unlocked;
|
||||
+ }
|
||||
if (!ir->attached) {
|
||||
- mutex_unlock(&ir->irctl_lock);
|
||||
- return -ENODEV;
|
||||
+ ret = -ENODEV;
|
||||
+ goto out_locked;
|
||||
}
|
||||
|
||||
if (length % ir->chunk_size) {
|
||||
- dev_dbg(ir->d.dev, LOGHEAD "read result = -EINVAL\n",
|
||||
- ir->d.name, ir->d.minor);
|
||||
- mutex_unlock(&ir->irctl_lock);
|
||||
- return -EINVAL;
|
||||
+ ret = -EINVAL;
|
||||
+ goto out_locked;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -708,18 +706,23 @@ ssize_t lirc_dev_fop_read(struct file *f
|
||||
lirc_buffer_read(ir->buf, buf);
|
||||
ret = copy_to_user((void *)buffer+written, buf,
|
||||
ir->buf->chunk_size);
|
||||
- written += ir->buf->chunk_size;
|
||||
+ if (!ret)
|
||||
+ written += ir->buf->chunk_size;
|
||||
+ else
|
||||
+ ret = -EFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
remove_wait_queue(&ir->buf->wait_poll, &wait);
|
||||
set_current_state(TASK_RUNNING);
|
||||
+
|
||||
+out_locked:
|
||||
mutex_unlock(&ir->irctl_lock);
|
||||
|
||||
out_unlocked:
|
||||
kfree(buf);
|
||||
dev_dbg(ir->d.dev, LOGHEAD "read result = %s (%d)\n",
|
||||
- ir->d.name, ir->d.minor, ret ? "-EFAULT" : "OK", ret);
|
||||
+ ir->d.name, ir->d.minor, ret ? "<fail>" : "<ok>", ret);
|
||||
|
||||
return ret ? ret : written;
|
||||
}
|
||||
@@ -741,7 +744,7 @@ void *lirc_get_pdata(struct file *file)
|
||||
EXPORT_SYMBOL(lirc_get_pdata);
|
||||
|
||||
|
||||
-ssize_t lirc_dev_fop_write(struct file *file, const char *buffer,
|
||||
+ssize_t lirc_dev_fop_write(struct file *file, const char __user *buffer,
|
||||
size_t length, loff_t *ppos)
|
||||
{
|
||||
struct irctl *ir = irctls[iminor(file->f_dentry->d_inode)];
|
||||
Index: linux-2.6.35.x86_64/drivers/media/IR/mceusb.c
|
||||
===================================================================
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/mceusb.c
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/mceusb.c
|
||||
@@ -35,10 +35,10 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
-#include <linux/usb.h>
|
||||
#include <linux/input.h>
|
||||
+#include <linux/usb.h>
|
||||
+#include <linux/usb/input.h>
|
||||
#include <media/ir-core.h>
|
||||
-#include <media/ir-common.h>
|
||||
|
||||
#define DRIVER_VERSION "1.91"
|
||||
#define DRIVER_AUTHOR "Jarod Wilson <jarod@wilsonet.com>"
|
||||
@@ -49,6 +49,7 @@
|
||||
#define USB_BUFLEN 32 /* USB reception buffer length */
|
||||
#define USB_CTRL_MSG_SZ 2 /* Size of usb ctrl msg on gen1 hw */
|
||||
#define MCE_G1_INIT_MSGS 40 /* Init messages on gen1 hw to throw out */
|
||||
+#define MS_TO_NS(msec) ((msec) * 1000)
|
||||
|
||||
/* MCE constants */
|
||||
#define MCE_CMDBUF_SIZE 384 /* MCE Command buffer length */
|
||||
@@ -92,6 +93,7 @@
|
||||
#define MCE_CMD_G_TXMASK 0x13 /* Set TX port bitmask */
|
||||
#define MCE_CMD_S_RXSENSOR 0x14 /* Set RX sensor (std/learning) */
|
||||
#define MCE_CMD_G_RXSENSOR 0x15 /* Get RX sensor (std/learning) */
|
||||
+#define MCE_RSP_PULSE_COUNT 0x15 /* RX pulse count (only if learning) */
|
||||
#define MCE_CMD_TX_PORTS 0x16 /* Get number of TX ports */
|
||||
#define MCE_CMD_G_WAKESRC 0x17 /* Get wake source */
|
||||
#define MCE_CMD_UNKNOWN7 0x18 /* Unknown */
|
||||
@@ -281,6 +283,8 @@ static struct usb_device_id mceusb_dev_t
|
||||
{ USB_DEVICE(VENDOR_FORMOSA, 0xe03c) },
|
||||
/* Formosa Industrial Computing */
|
||||
{ USB_DEVICE(VENDOR_FORMOSA, 0xe03e) },
|
||||
+ /* Fintek eHome Infrared Transceiver (HP branded) */
|
||||
+ { USB_DEVICE(VENDOR_FINTEK, 0x5168) },
|
||||
/* Fintek eHome Infrared Transceiver */
|
||||
{ USB_DEVICE(VENDOR_FINTEK, 0x0602) },
|
||||
/* Fintek eHome Infrared Transceiver (in the AOpen MP45) */
|
||||
@@ -315,6 +319,10 @@ struct mceusb_dev {
|
||||
/* ir-core bits */
|
||||
struct ir_dev_props *props;
|
||||
|
||||
+ /* optional features we can enable */
|
||||
+ bool carrier_report_enabled;
|
||||
+ bool learning_enabled;
|
||||
+
|
||||
/* core device bits */
|
||||
struct device *dev;
|
||||
struct input_dev *idev;
|
||||
@@ -328,6 +336,8 @@ struct mceusb_dev {
|
||||
/* buffers and dma */
|
||||
unsigned char *buf_in;
|
||||
unsigned int len_in;
|
||||
+ dma_addr_t dma_in;
|
||||
+ dma_addr_t dma_out;
|
||||
|
||||
enum {
|
||||
CMD_HEADER = 0,
|
||||
@@ -335,10 +345,8 @@ struct mceusb_dev {
|
||||
CMD_DATA,
|
||||
PARSE_IRDATA,
|
||||
} parser_state;
|
||||
- u8 cmd, rem; /* Remaining IR data bytes in packet */
|
||||
|
||||
- dma_addr_t dma_in;
|
||||
- dma_addr_t dma_out;
|
||||
+ u8 cmd, rem; /* Remaining IR data bytes in packet */
|
||||
|
||||
struct {
|
||||
u32 connected:1;
|
||||
@@ -419,7 +427,7 @@ static int mceusb_cmdsize(u8 cmd, u8 sub
|
||||
case MCE_CMD_UNKNOWN:
|
||||
case MCE_CMD_S_CARRIER:
|
||||
case MCE_CMD_S_TIMEOUT:
|
||||
- case MCE_CMD_G_RXSENSOR:
|
||||
+ case MCE_RSP_PULSE_COUNT:
|
||||
datasize = 2;
|
||||
break;
|
||||
case MCE_CMD_SIG_END:
|
||||
@@ -540,10 +548,11 @@ static void mceusb_dev_printdata(struct
|
||||
inout, data1 == 0x02 ? "short" : "long");
|
||||
break;
|
||||
case MCE_CMD_G_RXSENSOR:
|
||||
- if (len == 2)
|
||||
+ /* aka MCE_RSP_PULSE_COUNT */
|
||||
+ if (out)
|
||||
dev_info(dev, "Get receive sensor\n");
|
||||
- else
|
||||
- dev_info(dev, "Remaining pulse count is %d\n",
|
||||
+ else if (ir->learning_enabled)
|
||||
+ dev_info(dev, "RX pulse count: %d\n",
|
||||
((data1 << 8) | data2));
|
||||
break;
|
||||
case MCE_RSP_CMD_INVALID:
|
||||
@@ -797,6 +806,34 @@ static int mceusb_set_tx_carrier(void *p
|
||||
return carrier;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * We don't do anything but print debug spew for many of the command bits
|
||||
+ * we receive from the hardware, but some of them are useful information
|
||||
+ * we want to store so that we can use them.
|
||||
+ */
|
||||
+static void mceusb_handle_command(struct mceusb_dev *ir, int index)
|
||||
+{
|
||||
+ u8 hi = ir->buf_in[index + 1] & 0xff;
|
||||
+ u8 lo = ir->buf_in[index + 2] & 0xff;
|
||||
+
|
||||
+ switch (ir->buf_in[index]) {
|
||||
+ /* 2-byte return value commands */
|
||||
+ case MCE_CMD_S_TIMEOUT:
|
||||
+ ir->props->timeout = MS_TO_NS((hi << 8 | lo) / 2);
|
||||
+ break;
|
||||
+
|
||||
+ /* 1-byte return value commands */
|
||||
+ case MCE_CMD_S_TXMASK:
|
||||
+ ir->tx_mask = hi;
|
||||
+ break;
|
||||
+ case MCE_CMD_S_RXSENSOR:
|
||||
+ ir->learning_enabled = (hi == 0x02);
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
|
||||
{
|
||||
struct ir_raw_event rawir = { .pulse = false, .duration = 0 };
|
||||
@@ -816,13 +853,14 @@ static void mceusb_process_ir_data(struc
|
||||
ir->rem = mceusb_cmdsize(ir->cmd, ir->buf_in[i]);
|
||||
mceusb_dev_printdata(ir, ir->buf_in, i - 1,
|
||||
ir->rem + 2, false);
|
||||
+ mceusb_handle_command(ir, i);
|
||||
ir->parser_state = CMD_DATA;
|
||||
break;
|
||||
case PARSE_IRDATA:
|
||||
ir->rem--;
|
||||
rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0);
|
||||
rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK)
|
||||
- * MCE_TIME_UNIT * 1000;
|
||||
+ * MS_TO_NS(MCE_TIME_UNIT);
|
||||
|
||||
dev_dbg(ir->dev, "Storing %s with duration %d\n",
|
||||
rawir.pulse ? "pulse" : "space",
|
||||
@@ -844,7 +882,8 @@ static void mceusb_process_ir_data(struc
|
||||
continue;
|
||||
}
|
||||
ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK);
|
||||
- mceusb_dev_printdata(ir, ir->buf_in, i, ir->rem + 1, false);
|
||||
+ mceusb_dev_printdata(ir, ir->buf_in,
|
||||
+ i, ir->rem + 1, false);
|
||||
if (ir->rem)
|
||||
ir->parser_state = PARSE_IRDATA;
|
||||
break;
|
||||
@@ -1042,6 +1081,9 @@ static struct input_dev *mceusb_init_inp
|
||||
|
||||
ir->props = props;
|
||||
|
||||
+ usb_to_input_id(ir->usbdev, &idev->id);
|
||||
+ idev->dev.parent = ir->dev;
|
||||
+
|
||||
if (mceusb_model[ir->model].rc_map)
|
||||
rc_map = mceusb_model[ir->model].rc_map;
|
||||
|
||||
Index: linux-2.6.35.x86_64/drivers/media/IR/streamzap.c
|
||||
===================================================================
|
||||
--- linux-2.6.35.x86_64.orig/drivers/media/IR/streamzap.c
|
||||
+++ linux-2.6.35.x86_64/drivers/media/IR/streamzap.c
|
||||
@@ -34,8 +34,9 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
-#include <linux/usb.h>
|
||||
#include <linux/input.h>
|
||||
+#include <linux/usb.h>
|
||||
+#include <linux/usb/input.h>
|
||||
#include <media/ir-core.h>
|
||||
|
||||
#define DRIVER_VERSION "1.61"
|
||||
@@ -140,7 +141,9 @@ static struct usb_driver streamzap_drive
|
||||
|
||||
static void sz_push(struct streamzap_ir *sz, struct ir_raw_event rawir)
|
||||
{
|
||||
- ir_raw_event_store(sz->idev, &rawir);
|
||||
+ dev_dbg(sz->dev, "Storing %s with duration %u us\n",
|
||||
+ (rawir.pulse ? "pulse" : "space"), rawir.duration);
|
||||
+ ir_raw_event_store_with_filter(sz->idev, &rawir);
|
||||
}
|
||||
|
||||
static void sz_push_full_pulse(struct streamzap_ir *sz,
|
||||
@@ -167,7 +170,6 @@ static void sz_push_full_pulse(struct st
|
||||
rawir.duration *= 1000;
|
||||
rawir.duration &= IR_MAX_DURATION;
|
||||
}
|
||||
- dev_dbg(sz->dev, "ls %u\n", rawir.duration);
|
||||
sz_push(sz, rawir);
|
||||
|
||||
sz->idle = false;
|
||||
@@ -180,7 +182,6 @@ static void sz_push_full_pulse(struct st
|
||||
sz->sum += rawir.duration;
|
||||
rawir.duration *= 1000;
|
||||
rawir.duration &= IR_MAX_DURATION;
|
||||
- dev_dbg(sz->dev, "p %u\n", rawir.duration);
|
||||
sz_push(sz, rawir);
|
||||
}
|
||||
|
||||
@@ -200,7 +201,6 @@ static void sz_push_full_space(struct st
|
||||
rawir.duration += SZ_RESOLUTION / 2;
|
||||
sz->sum += rawir.duration;
|
||||
rawir.duration *= 1000;
|
||||
- dev_dbg(sz->dev, "s %u\n", rawir.duration);
|
||||
sz_push(sz, rawir);
|
||||
}
|
||||
|
||||
@@ -221,8 +221,6 @@ static void streamzap_callback(struct ur
|
||||
struct streamzap_ir *sz;
|
||||
unsigned int i;
|
||||
int len;
|
||||
- static int timeout = (((SZ_TIMEOUT * SZ_RESOLUTION * 1000) &
|
||||
- IR_MAX_DURATION) | 0x03000000);
|
||||
|
||||
if (!urb)
|
||||
return;
|
||||
@@ -246,7 +244,7 @@ static void streamzap_callback(struct ur
|
||||
|
||||
dev_dbg(sz->dev, "%s: received urb, len %d\n", __func__, len);
|
||||
for (i = 0; i < len; i++) {
|
||||
- dev_dbg(sz->dev, "sz idx %d: %x\n",
|
||||
+ dev_dbg(sz->dev, "sz->buf_in[%d]: %x\n",
|
||||
i, (unsigned char)sz->buf_in[i]);
|
||||
switch (sz->decoder_state) {
|
||||
case PulseSpace:
|
||||
@@ -273,7 +271,7 @@ static void streamzap_callback(struct ur
|
||||
struct ir_raw_event rawir;
|
||||
|
||||
rawir.pulse = false;
|
||||
- rawir.duration = timeout;
|
||||
+ rawir.duration = sz->props->timeout;
|
||||
sz->idle = true;
|
||||
if (sz->timeout_enabled)
|
||||
sz_push(sz, rawir);
|
||||
@@ -335,6 +333,9 @@ static struct input_dev *streamzap_init_
|
||||
|
||||
sz->props = props;
|
||||
|
||||
+ usb_to_input_id(sz->usbdev, &idev->id);
|
||||
+ idev->dev.parent = sz->dev;
|
||||
+
|
||||
ret = ir_input_register(idev, RC_MAP_STREAMZAP, props, DRIVER_NAME);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "remote input device register failed\n");
|
||||
@@ -444,6 +445,8 @@ static int __devinit streamzap_probe(str
|
||||
sz->decoder_state = PulseSpace;
|
||||
/* FIXME: don't yet have a way to set this */
|
||||
sz->timeout_enabled = true;
|
||||
+ sz->props->timeout = (((SZ_TIMEOUT * SZ_RESOLUTION * 1000) &
|
||||
+ IR_MAX_DURATION) | 0x03000000);
|
||||
#if 0
|
||||
/* not yet supported, depends on patches from maxim */
|
||||
/* see also: LIRC_GET_REC_RESOLUTION and LIRC_SET_REC_TIMEOUT */
|
||||
Index: linux-2.6.35.x86_64/include/media/lirc_dev.h
|
||||
===================================================================
|
||||
--- linux-2.6.35.x86_64.orig/include/media/lirc_dev.h
|
||||
+++ linux-2.6.35.x86_64/include/media/lirc_dev.h
|
||||
@@ -217,9 +217,9 @@ int lirc_dev_fop_open(struct inode *inod
|
||||
int lirc_dev_fop_close(struct inode *inode, struct file *file);
|
||||
unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait);
|
||||
long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
||||
-ssize_t lirc_dev_fop_read(struct file *file, char *buffer, size_t length,
|
||||
+ssize_t lirc_dev_fop_read(struct file *file, char __user *buffer, size_t length,
|
||||
loff_t *ppos);
|
||||
-ssize_t lirc_dev_fop_write(struct file *file, const char *buffer, size_t length,
|
||||
- loff_t *ppos);
|
||||
+ssize_t lirc_dev_fop_write(struct file *file, const char __user *buffer,
|
||||
+ size_t length, loff_t *ppos);
|
||||
|
||||
#endif
|
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,
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue