mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-24 11:16:51 +00:00
linux: remove linux-4.0 support
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
9e5a61725a
commit
6ff0766cae
@ -39,10 +39,6 @@ case "$LINUX" in
|
||||
PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.xz"
|
||||
PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET imx6-status-led imx6-soc-fan"
|
||||
;;
|
||||
4.0)
|
||||
PKG_VERSION="4.0.5"
|
||||
PKG_URL="http://www.kernel.org/pub/linux/kernel/v4.x/$PKG_NAME-$PKG_VERSION.tar.xz"
|
||||
;;
|
||||
*)
|
||||
PKG_VERSION="4.1-rc8"
|
||||
PKG_URL="http://www.kernel.org/pub/linux/kernel/v4.x/testing/$PKG_NAME-$PKG_VERSION.tar.xz"
|
||||
|
@ -1,21 +0,0 @@
|
||||
diff --git a/init/main.c b/init/main.c
|
||||
index 9484f4b..db55edd 100644
|
||||
--- a/init/main.c
|
||||
+++ b/init/main.c
|
||||
@@ -880,8 +880,14 @@ static noinline void __init kernel_init_freeable(void)
|
||||
do_basic_setup();
|
||||
|
||||
/* Open the /dev/console on the rootfs, this should never fail */
|
||||
- if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
|
||||
- pr_err("Warning: unable to open an initial console.\n");
|
||||
+ char *console = "/dev_console";
|
||||
+
|
||||
+ if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) {
|
||||
+ sys_mknod(console, S_IFCHR|0600, (TTYAUX_MAJOR<<8)|1);
|
||||
+ if (sys_open(console, O_RDWR, 0) < 0)
|
||||
+ printk(KERN_WARNING "Warning: unable to open an initial console.\n");
|
||||
+ sys_unlink(console);
|
||||
+ }
|
||||
|
||||
(void) sys_dup(0);
|
||||
(void) sys_dup(0);
|
@ -1,315 +0,0 @@
|
||||
diff -Naur linux-3.19.orig/drivers/hid/hid-core.c linux-3.19/drivers/hid/hid-core.c
|
||||
--- linux-3.19.orig/drivers/hid/hid-core.c 2015-02-20 14:01:17.080322846 -0800
|
||||
+++ linux-3.19/drivers/hid/hid-core.c 2015-02-20 14:03:30.375519421 -0800
|
||||
@@ -1884,6 +1884,7 @@
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) },
|
||||
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_6000) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_SPINEL_PLUS_1) },
|
||||
diff -Naur linux-3.19.orig/drivers/hid/hid-ids.h linux-3.19/drivers/hid/hid-ids.h
|
||||
--- linux-3.19.orig/drivers/hid/hid-ids.h 2015-02-20 14:01:17.080322846 -0800
|
||||
+++ linux-3.19/drivers/hid/hid-ids.h 2015-02-20 14:03:30.382519482 -0800
|
||||
@@ -721,6 +721,9 @@
|
||||
#define USB_DEVICE_ID_ORTEK_PKB1700 0x1700
|
||||
#define USB_DEVICE_ID_ORTEK_WKB2000 0x2000
|
||||
|
||||
+#define USB_VENDOR_ID_OUYA 0x2836
|
||||
+#define USB_DEVICE_ID_OUYA_CONTROLLER 0x0001
|
||||
+
|
||||
#define USB_VENDOR_ID_PLANTRONICS 0x047f
|
||||
|
||||
#define USB_VENDOR_ID_PANASONIC 0x04da
|
||||
diff -Naur linux-3.19.orig/drivers/hid/hid-ouya.c linux-3.19/drivers/hid/hid-ouya.c
|
||||
--- linux-3.19.orig/drivers/hid/hid-ouya.c 1969-12-31 16:00:00.000000000 -0800
|
||||
+++ linux-3.19/drivers/hid/hid-ouya.c 2015-02-20 14:03:30.371519386 -0800
|
||||
@@ -0,0 +1,260 @@
|
||||
+/*
|
||||
+ * HID driver for OUYA Game Controller(s)
|
||||
+ *
|
||||
+ * Copyright (c) 2013 OUYA
|
||||
+ */
|
||||
+
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/hid.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#include "hid-ids.h"
|
||||
+
|
||||
+#define OUYA_TOUCHPAD_FIXUP (1 << 0)
|
||||
+
|
||||
+struct ouya_sc {
|
||||
+ unsigned long quirks;
|
||||
+};
|
||||
+
|
||||
+/* Fixed report descriptor */
|
||||
+static __u8 ouya_rdesc_fixed[] = {
|
||||
+
|
||||
+ 0x05, 0x01, /* Usage Page (Desktop), */
|
||||
+ 0x09, 0x05, /* Usage (Game Pad), */
|
||||
+
|
||||
+ 0xA1, 0x01, /* Collection (Application), */
|
||||
+ 0x85, 0x07, /* Report ID (7), */
|
||||
+
|
||||
+ 0xA1, 0x00, /* Collection (Physical), */
|
||||
+ 0x09, 0x30, /* Usage (X), */
|
||||
+ 0x09, 0x31, /* Usage (Y), */
|
||||
+ 0x15, 0x00, /* Logical Minimum (0), */
|
||||
+ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
|
||||
+ 0x35, 0x00, /* Physical Minimum (0), */
|
||||
+ 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
|
||||
+ 0x95, 0x02, /* Report Count (2), */
|
||||
+ 0x75, 0x08, /* Report Size (8), */
|
||||
+ 0x81, 0x02, /* Input (Variable), */
|
||||
+ 0xC0, /* End Collection, */
|
||||
+
|
||||
+ 0xA1, 0x00, /* Collection (Physical), */
|
||||
+ 0x09, 0x33, /* Usage (Rx), */
|
||||
+ 0x09, 0x34, /* Usage (Ry), */
|
||||
+ 0x15, 0x00, /* Logical Minimum (0), */
|
||||
+ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
|
||||
+ 0x35, 0x00, /* Physical Minimum (0), */
|
||||
+ 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
|
||||
+ 0x95, 0x02, /* Report Count (2), */
|
||||
+ 0x75, 0x08, /* Report Size (8), */
|
||||
+ 0x81, 0x02, /* Input (Variable), */
|
||||
+ 0xC0, /* End Collection, */
|
||||
+
|
||||
+ 0xA1, 0x00, /* Collection (Physical), */
|
||||
+ 0x09, 0x32, /* Usage (Z), */
|
||||
+ 0x15, 0x00, /* Logical Minimum (0), */
|
||||
+ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
|
||||
+ 0x35, 0x00, /* Physical Minimum (0), */
|
||||
+ 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
|
||||
+ 0x95, 0x01, /* Report Count (1), */
|
||||
+ 0x75, 0x08, /* Report Size (8), */
|
||||
+ 0x81, 0x02, /* Input (Variable), */
|
||||
+ 0xC0, /* End Collection, */
|
||||
+
|
||||
+ 0xA1, 0x00, /* Collection (Physical), */
|
||||
+ 0x09, 0x35, /* Usage (Rz), */
|
||||
+ 0x15, 0x00, /* Logical Minimum (0), */
|
||||
+ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
|
||||
+ 0x35, 0x00, /* Physical Minimum (0), */
|
||||
+ 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
|
||||
+ 0x95, 0x01, /* Report Count (1), */
|
||||
+ 0x75, 0x08, /* Report Size (8), */
|
||||
+ 0x81, 0x02, /* Input (Variable), */
|
||||
+ 0xC0, /* End Collection, */
|
||||
+
|
||||
+ 0x05, 0x09, /* Usage Page (Button), */
|
||||
+ 0x19, 0x01, /* Usage Minimum (01h), */
|
||||
+ 0x29, 0x10, /* Usage Maximum (10h), */
|
||||
+ 0x95, 0x10, /* Report Count (16), */
|
||||
+ 0x75, 0x01, /* Report Size (1), */
|
||||
+ 0x81, 0x02, /* Input (Variable), */
|
||||
+
|
||||
+ /* ORIGINAL REPORT DESCRIPTOR FOR TOUCHPAD INPUT */
|
||||
+ /* 06 00 ff a1 02 09 02 15 00 26 ff 00 35 00 46 ff 00 95 03 75 08 81 02 c0 */
|
||||
+
|
||||
+ 0x06, 0x00, 0xFF, /* Usage Page (Custom), */
|
||||
+ 0x09, 0x02, /* Usage (Mouse), */
|
||||
+ 0x09, 0x01, /* Usage (Pointer), */
|
||||
+ 0xA1, 0x00, /* Collection (Physical), */
|
||||
+ 0x05, 0x09, /* Usage Page (Button), */
|
||||
+ 0x19, 0x01, /* Usage Minimum (01h), */
|
||||
+ 0x29, 0x03, /* Usage Maximum (03h), */
|
||||
+ 0x15, 0x00, /* Logical Minimum (0), */
|
||||
+ 0x25, 0x01, /* Logical Maximum (1), */
|
||||
+ 0x95, 0x03, /* Report Count (3), */
|
||||
+ 0x75, 0x01, /* Report Size (1), */
|
||||
+ 0x81, 0x02, /* Input (Variable), */
|
||||
+ 0x95, 0x01, /* Report Count (1), */
|
||||
+ 0x75, 0x05, /* Report Size (5), */
|
||||
+ 0x81, 0x01, /* Input (Constant), */
|
||||
+ 0x05, 0x01, /* Usage Page (Desktop), */
|
||||
+ 0x09, 0x30, /* Usage (X), */
|
||||
+ 0x09, 0x31, /* Usage (Y), */
|
||||
+ 0x15, 0x81, /* Logical Minimum (-127), */
|
||||
+ 0x25, 0x7f, /* Logical Maximum (127), */
|
||||
+ 0x95, 0x02, /* Report Count (2), */
|
||||
+ 0x75, 0x08, /* Report Size (8), */
|
||||
+ 0x81, 0x06, /* Input (Relative), */
|
||||
+ 0xC0, /* End Collection, */
|
||||
+
|
||||
+ 0x06, 0x00, 0xFF, /* Usage Page (Custom), */
|
||||
+ 0xA1, 0x02, /* Collection (Logical), */
|
||||
+ 0x75, 0x08, /* Report Size (8), */
|
||||
+ 0x95, 0x07, /* Report Count (7), */
|
||||
+ 0x46, 0xFF, 0x00, /* Physical Maximum (255), */
|
||||
+ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
|
||||
+ 0x09, 0x01, /* Usage (Pointer), */
|
||||
+ 0x91, 0x02, /* Output (Variable), */
|
||||
+ 0xC0, /* End Collection, */
|
||||
+
|
||||
+ 0xC0, /* End Collection */
|
||||
+
|
||||
+
|
||||
+ 0x06, 0x00, 0xFF, /* Usage Page (Custom), */
|
||||
+ 0x05, 0x0C, /* Usage Page (Consumer), */
|
||||
+ 0x09, 0x01, /* Usage (Consumer Control), */
|
||||
+
|
||||
+ 0xA1, 0x01, /* Collection (Application), */
|
||||
+ 0x85, 0x03, /* Report ID (3), */
|
||||
+ 0x05, 0x01, /* Usage Page (Desktop), */
|
||||
+ 0x09, 0x06, /* Usage (Keyboard), */
|
||||
+ 0xA1, 0x02, /* Collection (Logical), */
|
||||
+ 0x05, 0x06, /* Usage Page (Generic), */
|
||||
+ 0x09, 0x20, /* Usage (Battery Strgth), */
|
||||
+ 0x15, 0x00, /* Logical Minimum (0), */
|
||||
+ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */
|
||||
+ 0x75, 0x08, /* Report Size (8), */
|
||||
+ 0x95, 0x01, /* Report Count (1), */
|
||||
+ 0x81, 0x02, /* Input (Variable), */
|
||||
+ 0x06, 0xBC, 0xFF, /* Usage Page (Custom), */
|
||||
+
|
||||
+ 0x0A, 0xAD, 0xBD, /* UNKNOWN */
|
||||
+
|
||||
+ 0x75, 0x08, /* Report Size (8), */
|
||||
+ 0x95, 0x06, /* Report Count (6), */
|
||||
+ 0x81, 0x02, /* Input (Variable), */
|
||||
+ 0xC0, /* End Collection, */
|
||||
+
|
||||
+ 0xC0, /* End Collection */
|
||||
+
|
||||
+ 0x00
|
||||
+};
|
||||
+
|
||||
+static __u8 *ouya_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
+ unsigned int *rsize)
|
||||
+{
|
||||
+ struct ouya_sc *sc = hid_get_drvdata(hdev);
|
||||
+
|
||||
+ if (sc->quirks & OUYA_TOUCHPAD_FIXUP) {
|
||||
+ rdesc = ouya_rdesc_fixed;
|
||||
+ *rsize = sizeof(ouya_rdesc_fixed);
|
||||
+ }
|
||||
+ return rdesc;
|
||||
+}
|
||||
+
|
||||
+static int ouya_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
||||
+ struct hid_field *field, struct hid_usage *usage,
|
||||
+ unsigned long **bit, int *max)
|
||||
+{
|
||||
+ struct ouya_sc *sc = hid_get_drvdata(hdev);
|
||||
+
|
||||
+ if (!(sc->quirks & OUYA_TOUCHPAD_FIXUP)) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ if ((usage->hid & 0x90000) == 0x90000 &&
|
||||
+ (field->physical & 0xff000000) == 0xff000000 &&
|
||||
+ usage->collection_index == 5 &&
|
||||
+ field->report_count == 3) {
|
||||
+
|
||||
+ hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_MOUSE + (usage->hid - 0x90001));
|
||||
+
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int ouya_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
+{
|
||||
+ int ret;
|
||||
+ struct ouya_sc *sc;
|
||||
+
|
||||
+ sc = kzalloc(sizeof(*sc), GFP_KERNEL);
|
||||
+ if (sc == NULL) {
|
||||
+ hid_err(hdev, "can't alloc ouya descriptor\n");
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ if(((hdev->version & 0xff00) == 0x0100 && (hdev->version & 0xff) >= 0x04) ||
|
||||
+ ((hdev->version & 0xff00) == 0xe100 && (hdev->version & 0xff) >= 0x3a)) {
|
||||
+ hid_info(hdev, "ouya controller - new version\n");
|
||||
+ sc->quirks = OUYA_TOUCHPAD_FIXUP;
|
||||
+ } else {
|
||||
+ sc->quirks = 0;
|
||||
+ }
|
||||
+ hid_set_drvdata(hdev, sc);
|
||||
+
|
||||
+ ret = hid_parse(hdev);
|
||||
+ if (ret) {
|
||||
+ hid_err(hdev, "parse failed\n");
|
||||
+ goto err_free;
|
||||
+ }
|
||||
+
|
||||
+ ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT |
|
||||
+ HID_CONNECT_HIDDEV_FORCE);
|
||||
+ if (ret) {
|
||||
+ hid_err(hdev, "hw start failed\n");
|
||||
+ goto err_free;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+err_free:
|
||||
+ kfree(sc);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static void ouya_remove(struct hid_device *hdev)
|
||||
+{
|
||||
+ hid_hw_stop(hdev);
|
||||
+ kfree(hid_get_drvdata(hdev));
|
||||
+}
|
||||
+
|
||||
+static const struct hid_device_id ouya_devices[] = {
|
||||
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(hid, ouya_devices);
|
||||
+
|
||||
+static struct hid_driver ouya_driver = {
|
||||
+ .name = "ouya",
|
||||
+ .id_table = ouya_devices,
|
||||
+ .probe = ouya_probe,
|
||||
+ .remove = ouya_remove,
|
||||
+ .input_mapping = ouya_input_mapping,
|
||||
+ .report_fixup = ouya_report_fixup
|
||||
+};
|
||||
+
|
||||
+static int __init ouya_init(void)
|
||||
+{
|
||||
+ return hid_register_driver(&ouya_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit ouya_exit(void)
|
||||
+{
|
||||
+ hid_unregister_driver(&ouya_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(ouya_init);
|
||||
+module_exit(ouya_exit);
|
||||
diff -Naur linux-3.19.orig/drivers/hid/Kconfig linux-3.19/drivers/hid/Kconfig
|
||||
--- linux-3.19.orig/drivers/hid/Kconfig 2015-02-20 14:01:17.081322855 -0800
|
||||
+++ linux-3.19/drivers/hid/Kconfig 2015-02-20 14:03:30.381519473 -0800
|
||||
@@ -528,6 +528,12 @@
|
||||
- Ortek WKB-2000
|
||||
- Skycable wireless presenter
|
||||
|
||||
+config HID_OUYA
|
||||
+ tristate "OUYA Game Controller"
|
||||
+ depends on USB_HID
|
||||
+ ---help---
|
||||
+ Support for OUYA Game Controller.
|
||||
+
|
||||
config HID_PANTHERLORD
|
||||
tristate "Pantherlord/GreenAsia game controller"
|
||||
depends on HID
|
||||
diff -Naur linux-3.19.orig/drivers/hid/Makefile linux-3.19/drivers/hid/Makefile
|
||||
--- linux-3.19.orig/drivers/hid/Makefile 2015-02-20 14:01:17.081322855 -0800
|
||||
+++ linux-3.19/drivers/hid/Makefile 2015-02-20 14:03:30.382519482 -0800
|
||||
@@ -70,6 +70,7 @@
|
||||
obj-$(CONFIG_HID_MULTITOUCH) += hid-multitouch.o
|
||||
obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o
|
||||
obj-$(CONFIG_HID_ORTEK) += hid-ortek.o
|
||||
+obj-$(CONFIG_HID_OUYA) += hid-ouya.o
|
||||
obj-$(CONFIG_HID_PRODIKEYS) += hid-prodikeys.o
|
||||
obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o
|
||||
obj-$(CONFIG_HID_PENMOUNT) += hid-penmount.o
|
File diff suppressed because it is too large
Load Diff
@ -1,161 +0,0 @@
|
||||
diff -Naur linux-3.19/drivers/hid/hid-core.c linux-3.19.patch/drivers/hid/hid-core.c
|
||||
--- linux-3.19/drivers/hid/hid-core.c 2015-02-09 03:54:22.000000000 +0100
|
||||
+++ linux-3.19.patch/drivers/hid/hid-core.c 2015-02-11 00:06:14.966131308 +0100
|
||||
@@ -1886,6 +1886,9 @@
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_6000) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_SPINEL_PLUS_1) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_SPINEL_PLUS_2) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_SPINEL_PLUS_3) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) },
|
||||
#if IS_ENABLED(CONFIG_HID_ROCCAT)
|
||||
diff -Naur linux-3.19/drivers/hid/hid-ids.h linux-3.19.patch/drivers/hid/hid-ids.h
|
||||
--- linux-3.19/drivers/hid/hid-ids.h 2015-02-09 03:54:22.000000000 +0100
|
||||
+++ linux-3.19.patch/drivers/hid/hid-ids.h 2015-02-11 00:04:45.885977057 +0100
|
||||
@@ -743,6 +743,9 @@
|
||||
|
||||
#define USB_VENDOR_ID_PHILIPS 0x0471
|
||||
#define USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE 0x0617
|
||||
+#define USB_DEVICE_ID_PHILIPS_SPINEL_PLUS_1 0x206c
|
||||
+#define USB_DEVICE_ID_PHILIPS_SPINEL_PLUS_2 0x20cc
|
||||
+#define USB_DEVICE_ID_PHILIPS_SPINEL_PLUS_3 0x0613
|
||||
|
||||
#define USB_VENDOR_ID_PI_ENGINEERING 0x05f3
|
||||
#define USB_DEVICE_ID_PI_ENGINEERING_VEC_USB_FOOTPEDAL 0xff
|
||||
diff -Naur linux-3.19/drivers/hid/hid-spinelplus.c linux-3.19.patch/drivers/hid/hid-spinelplus.c
|
||||
--- linux-3.19/drivers/hid/hid-spinelplus.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ linux-3.19.patch/drivers/hid/hid-spinelplus.c 2015-02-11 00:04:45.886977059 +0100
|
||||
@@ -0,0 +1,104 @@
|
||||
+/*
|
||||
+ * HID driver for "PHILIPS MCE USB IR Receiver- Spinel plus" remotes
|
||||
+ *
|
||||
+ * Copyright (c) 2010 Panagiotis Skintzos
|
||||
+ *
|
||||
+ * Renamed to Spinel, cleanup and modified to also support
|
||||
+ * Spinel Plus 0471:20CC by Stephan Raue 2012.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * 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 <linux/device.h>
|
||||
+#include <linux/input.h>
|
||||
+#include <linux/hid.h>
|
||||
+#include <linux/module.h>
|
||||
+
|
||||
+#include "hid-ids.h"
|
||||
+
|
||||
+#define spinelplus_map_key(c) set_bit(EV_REP, hi->input->evbit); \
|
||||
+ hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
|
||||
+
|
||||
+static int spinelplus_input_mapping(struct hid_device *hdev,
|
||||
+ struct hid_input *hi, struct hid_field *field, struct hid_usage *usage,
|
||||
+ unsigned long **bit, int *max)
|
||||
+{
|
||||
+ switch (usage->hid) {
|
||||
+ case 0xffbc000d: spinelplus_map_key(KEY_MEDIA); break;
|
||||
+ case 0xffbc0024: spinelplus_map_key(KEY_MEDIA); break;
|
||||
+ case 0xffbc0027: spinelplus_map_key(KEY_ZOOM); break;
|
||||
+ case 0xffbc0033: spinelplus_map_key(KEY_HOME); break;
|
||||
+ case 0xffbc0035: spinelplus_map_key(KEY_CAMERA); break;
|
||||
+ case 0xffbc0036: spinelplus_map_key(KEY_EPG); break;
|
||||
+ case 0xffbc0037: spinelplus_map_key(KEY_DVD); break;
|
||||
+ case 0xffbc0038: spinelplus_map_key(KEY_HOME); break;
|
||||
+ case 0xffbc0039: spinelplus_map_key(KEY_MP3); break;
|
||||
+ case 0xffbc003a: spinelplus_map_key(KEY_VIDEO); break;
|
||||
+ case 0xffbc005a: spinelplus_map_key(KEY_TEXT); break;
|
||||
+ case 0xffbc005b: spinelplus_map_key(KEY_RED); break;
|
||||
+ case 0xffbc005c: spinelplus_map_key(KEY_GREEN); break;
|
||||
+ case 0xffbc005d: spinelplus_map_key(KEY_YELLOW); break;
|
||||
+ case 0xffbc005e: spinelplus_map_key(KEY_BLUE); break;
|
||||
+ default:
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+static int spinelplus_probe(struct hid_device *hdev,
|
||||
+ const struct hid_device_id *id)
|
||||
+{
|
||||
+ int ret;
|
||||
+ /* Connect only to hid input (not hiddev & hidraw)*/
|
||||
+ unsigned int cmask = HID_CONNECT_HIDINPUT;
|
||||
+
|
||||
+ ret = hid_parse(hdev);
|
||||
+ if (ret) {
|
||||
+ dev_err(&hdev->dev, "parse failed\n");
|
||||
+ goto err_free;
|
||||
+ }
|
||||
+
|
||||
+ ret = hid_hw_start(hdev, cmask);
|
||||
+ if (ret) {
|
||||
+ dev_err(&hdev->dev, "hw start failed\n");
|
||||
+ goto err_free;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+err_free:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static const struct hid_device_id spinelplus_devices[] = {
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS,USB_DEVICE_ID_PHILIPS_SPINEL_PLUS_1) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS,USB_DEVICE_ID_PHILIPS_SPINEL_PLUS_2) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS,USB_DEVICE_ID_PHILIPS_SPINEL_PLUS_3) },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(hid, spinelplus_devices);
|
||||
+
|
||||
+static struct hid_driver spinelplus_driver = {
|
||||
+ .name = "SpinelPlus",
|
||||
+ .id_table = spinelplus_devices,
|
||||
+ .input_mapping = spinelplus_input_mapping,
|
||||
+ .probe = spinelplus_probe,
|
||||
+};
|
||||
+
|
||||
+static int __init spinelplus_init(void)
|
||||
+{
|
||||
+ return hid_register_driver(&spinelplus_driver);
|
||||
+}
|
||||
+
|
||||
+static void __exit spinelplus_exit(void)
|
||||
+{
|
||||
+ hid_unregister_driver(&spinelplus_driver);
|
||||
+}
|
||||
+
|
||||
+module_init(spinelplus_init);
|
||||
+module_exit(spinelplus_exit);
|
||||
+MODULE_LICENSE("GPL");
|
||||
diff -Naur linux-3.19/drivers/hid/Kconfig linux-3.19.patch/drivers/hid/Kconfig
|
||||
--- linux-3.19/drivers/hid/Kconfig 2015-02-09 03:54:22.000000000 +0100
|
||||
+++ linux-3.19.patch/drivers/hid/Kconfig 2015-02-11 00:04:45.886977059 +0100
|
||||
@@ -702,6 +702,12 @@
|
||||
---help---
|
||||
Support for Steelseries SRW-S1 steering wheel
|
||||
|
||||
+config HID_SPINELPLUS
|
||||
+ tristate "Spinel Plus remote control"
|
||||
+ depends on USB_HID
|
||||
+ ---help---
|
||||
+ Say Y here if you have a Spinel Plus (0471:206c/20cc/0613) remote
|
||||
+
|
||||
config HID_SUNPLUS
|
||||
tristate "Sunplus wireless desktop"
|
||||
depends on HID
|
||||
diff -Naur linux-3.19/drivers/hid/Makefile linux-3.19.patch/drivers/hid/Makefile
|
||||
--- linux-3.19/drivers/hid/Makefile 2015-02-09 03:54:22.000000000 +0100
|
||||
+++ linux-3.19.patch/drivers/hid/Makefile 2015-02-11 00:04:45.886977059 +0100
|
||||
@@ -107,6 +107,7 @@
|
||||
obj-$(CONFIG_HID_SMARTJOYPLUS) += hid-sjoy.o
|
||||
obj-$(CONFIG_HID_SONY) += hid-sony.o
|
||||
obj-$(CONFIG_HID_SPEEDLINK) += hid-speedlink.o
|
||||
+obj-$(CONFIG_HID_SPINELPLUS) += hid-spinelplus.o
|
||||
obj-$(CONFIG_HID_STEELSERIES) += hid-steelseries.o
|
||||
obj-$(CONFIG_HID_SUNPLUS) += hid-sunplus.o
|
||||
obj-$(CONFIG_HID_GREENASIA) += hid-gaff.o
|
@ -1,12 +0,0 @@
|
||||
diff -Naur linux-3.0/drivers/media/rc/nuvoton-cir.c linux-3.0.patch/drivers/media/rc/nuvoton-cir.c
|
||||
--- linux-3.0/drivers/media/rc/nuvoton-cir.c 2011-07-22 04:17:23.000000000 +0200
|
||||
+++ linux-3.0.patch/drivers/media/rc/nuvoton-cir.c 2011-07-22 21:30:48.374591146 +0200
|
||||
@@ -1110,7 +1110,7 @@
|
||||
rdev->dev.parent = &pdev->dev;
|
||||
rdev->driver_name = NVT_DRIVER_NAME;
|
||||
rdev->map_name = RC_MAP_RC6_MCE;
|
||||
- rdev->timeout = MS_TO_NS(100);
|
||||
+ rdev->timeout = US_TO_NS(1000);
|
||||
/* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */
|
||||
rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD);
|
||||
#if 0
|
@ -1,21 +0,0 @@
|
||||
diff -Naur linux-3.17.1/drivers/media/rc/mceusb.c linux-3.17.1.patch/drivers/media/rc/mceusb.c
|
||||
--- linux-3.17.1/drivers/media/rc/mceusb.c 2014-10-15 12:29:30.000000000 +0200
|
||||
+++ linux-3.17.1.patch/drivers/media/rc/mceusb.c 2014-10-16 11:45:57.480176874 +0200
|
||||
@@ -188,6 +188,8 @@
|
||||
#define VENDOR_TWISTEDMELON 0x2596
|
||||
#define VENDOR_HAUPPAUGE 0x2040
|
||||
#define VENDOR_PCTV 0x2013
|
||||
+#define VENDOR_ADAPTEC 0x03f3
|
||||
+
|
||||
|
||||
enum mceusb_model_type {
|
||||
MCE_GEN2 = 0, /* Most boards */
|
||||
@@ -401,6 +403,8 @@
|
||||
.driver_info = HAUPPAUGE_CX_HYBRID_TV },
|
||||
{ USB_DEVICE(VENDOR_PCTV, 0x025e),
|
||||
.driver_info = HAUPPAUGE_CX_HYBRID_TV },
|
||||
+ /* Adaptec / HP eHome Receiver */
|
||||
+ { USB_DEVICE(VENDOR_ADAPTEC, 0x0094) },
|
||||
|
||||
/* Terminating entry */
|
||||
{ }
|
@ -1,28 +0,0 @@
|
||||
--- linux/drivers/media/rc/ir-rc6-decoder.c 2012-11-25 22:08:13.148418669 -0800
|
||||
+++ linux.patch/drivers/media/rc/ir-rc6-decoder.c 2012-11-25 22:07:48.864417975 -0800
|
||||
@@ -39,7 +39,6 @@
|
||||
#define RC6_STARTBIT_MASK 0x08 /* for the header bits */
|
||||
#define RC6_6A_MCE_TOGGLE_MASK 0x8000 /* for the body bits */
|
||||
#define RC6_6A_LCC_MASK 0xffff0000 /* RC6-6A-32 long customer code mask */
|
||||
-#define RC6_6A_MCE_CC 0x800f0000 /* MCE customer code */
|
||||
#ifndef CHAR_BIT
|
||||
#define CHAR_BIT 8 /* Normally in <limits.h> */
|
||||
#endif
|
||||
@@ -257,14 +256,9 @@ again:
|
||||
toggle = 0;
|
||||
break;
|
||||
case 32:
|
||||
- if ((scancode & RC6_6A_LCC_MASK) == RC6_6A_MCE_CC) {
|
||||
- protocol = RC_TYPE_RC6_MCE;
|
||||
- toggle = !!(scancode & RC6_6A_MCE_TOGGLE_MASK);
|
||||
- scancode &= ~RC6_6A_MCE_TOGGLE_MASK;
|
||||
- } else {
|
||||
- protocol = RC_BIT_RC6_6A_32;
|
||||
- toggle = 0;
|
||||
- }
|
||||
+ protocol = RC_TYPE_RC6_MCE;
|
||||
+ toggle = !!(scancode & RC6_6A_MCE_TOGGLE_MASK);
|
||||
+ scancode &= ~RC6_6A_MCE_TOGGLE_MASK;
|
||||
break;
|
||||
default:
|
||||
IR_dprintk(1, "RC6(6A) unsupported length\n");
|
@ -1,13 +0,0 @@
|
||||
diff -Naur linux-3.9.4/drivers/media/rc/mceusb.c linux-3.9.4.patch/drivers/media/rc/mceusb.c
|
||||
--- linux-3.9.4/drivers/media/rc/mceusb.c 2013-05-24 20:45:59.000000000 +0200
|
||||
+++ linux-3.9.4.patch/drivers/media/rc/mceusb.c 2013-05-27 12:28:12.811230633 +0200
|
||||
@@ -309,6 +309,9 @@
|
||||
/* SMK/I-O Data GV-MC7/RCKIT Receiver */
|
||||
{ USB_DEVICE(VENDOR_SMK, 0x0353),
|
||||
.driver_info = MCE_GEN2_NO_TX },
|
||||
+ /* SMK Manufacturing, Inc. Receiver */
|
||||
+ { USB_DEVICE(VENDOR_SMK, 0x0357),
|
||||
+ .driver_info = MCE_GEN2_NO_TX },
|
||||
/* Tatung eHome Infrared Transceiver */
|
||||
{ USB_DEVICE(VENDOR_TATUNG, 0x9150) },
|
||||
/* Shuttle eHome Infrared Transceiver */
|
@ -1,64 +0,0 @@
|
||||
From 7051422474e4c4e302ede3d07ffd8ef2682e07a2 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Saraev <stefan@saraev.ca>
|
||||
Date: Tue, 22 Apr 2014 16:05:14 +0300
|
||||
Subject: [PATCH] [RFC] hid/sony: add autorepeat for PS3 remotes
|
||||
|
||||
adapted to 3.17
|
||||
|
||||
Betreff: [RFC] hid/sony: add autorepeat for PS3 remotes
|
||||
Von: David Dillow <dave@thedillows.org>
|
||||
Datum: 28.06.2013 04:28
|
||||
An: linux-input@vger.kernel.org
|
||||
Kopie (CC): Stephan Raue <stephan@openelec.tv>
|
||||
|
||||
Some applications using the PS3 remote would like to have autorepeat
|
||||
from the device. Use the input subsystem's software emulation to provide
|
||||
this capability, and enable those that don't need it to turn it off.
|
||||
---
|
||||
I'm not sure this is the correct approach, or if it is even appropriate
|
||||
for a remote to do autorepeat. However, the media/rc subsystem does do
|
||||
it by default, and it's been requested by users, so there is at least
|
||||
some demand.
|
||||
|
||||
This compiled against the hid-sony driver with the PS3 remote changes
|
||||
merged, but I have done no testing of it. If the approach seems
|
||||
reasonable, I'll try to test it when the MythTV is idle.
|
||||
---
|
||||
diff -Naur linux-3.17.1/drivers/hid/hid-sony.c linux-3.17.1.patch/drivers/hid/hid-sony.c
|
||||
--- linux-3.17.1/drivers/hid/hid-sony.c 2014-10-15 12:29:30.000000000 +0200
|
||||
+++ linux-3.17.1.patch/drivers/hid/hid-sony.c 2014-10-16 12:55:43.979181366 +0200
|
||||
@@ -875,6 +875,25 @@
|
||||
return 1;
|
||||
}
|
||||
|
||||
+static int ps3remote_setup_repeat(struct hid_device *hdev)
|
||||
+{
|
||||
+ struct hid_input *hidinput = list_first_entry(&hdev->inputs,
|
||||
+ struct hid_input, list);
|
||||
+ struct input_dev *input = hidinput->input;
|
||||
+
|
||||
+ /*
|
||||
+ * Set up autorepeat defaults per the remote control subsystem;
|
||||
+ * this must be done after hid_hw_start(), as having these non-zero
|
||||
+ * at the time of input_register_device() tells the input system that
|
||||
+ * the hardware does the autorepeat, and the PS3 remote does not.
|
||||
+ */
|
||||
+ set_bit(EV_REP, input->evbit);
|
||||
+ input->rep[REP_DELAY] = 500;
|
||||
+ input->rep[REP_PERIOD] = 125;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static __u8 *sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
unsigned int *rsize)
|
||||
{
|
||||
@@ -1932,6 +1951,8 @@
|
||||
goto err_stop;
|
||||
|
||||
sony_init_work(sc, dualshock4_state_worker);
|
||||
+ } else if (sc->quirks & PS3REMOTE) {
|
||||
+ ret = ps3remote_setup_repeat(hdev);
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
diff -Naur linux-3.16.1/drivers/media/rc/imon.c linux-3.16.1.patch/drivers/media/rc/imon.c
|
||||
--- linux-3.16.1/drivers/media/rc/imon.c 2014-08-14 04:36:35.000000000 +0200
|
||||
+++ linux-3.16.1.patch/drivers/media/rc/imon.c 2014-08-15 13:57:16.587620642 +0200
|
||||
@@ -1344,6 +1344,17 @@
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
+ * For users without stabilized, just ignore any value getting
|
||||
+ * to close to the diagonal.
|
||||
+ */
|
||||
+ if ((abs(rel_y) < 2 && abs(rel_x) < 2) ||
|
||||
+ abs(abs(rel_y) - abs(rel_x)) < 2 ) {
|
||||
+ spin_lock_irqsave(&ictx->kc_lock, flags);
|
||||
+ ictx->kc = KEY_UNKNOWN;
|
||||
+ spin_unlock_irqrestore(&ictx->kc_lock, flags);
|
||||
+ return;
|
||||
+ }
|
||||
+ /*
|
||||
* Hack alert: instead of using keycodes, we have
|
||||
* to use hard-coded scancodes here...
|
||||
*/
|
@ -1,12 +0,0 @@
|
||||
diff -Naur linux-3.7.2/drivers/media/dvb-frontends/stb0899_drv.c linux-3.7.2.patch/drivers/media/dvb-frontends/stb0899_drv.c
|
||||
--- linux-3.7.2/drivers/media/dvb-frontends/stb0899_drv.c 2013-01-11 18:19:28.000000000 +0100
|
||||
+++ linux-3.7.2.patch/drivers/media/dvb-frontends/stb0899_drv.c 2013-01-16 10:25:43.479645317 +0100
|
||||
@@ -1581,7 +1581,7 @@
|
||||
.frequency_max = 2150000,
|
||||
.frequency_stepsize = 0,
|
||||
.frequency_tolerance = 0,
|
||||
- .symbol_rate_min = 5000000,
|
||||
+ .symbol_rate_min = 1000000,
|
||||
.symbol_rate_max = 45000000,
|
||||
|
||||
.caps = FE_CAN_INVERSION_AUTO |
|
@ -1,138 +0,0 @@
|
||||
diff -Naur linux-3.7.2/drivers/media/dvb-frontends/stb0899_algo.c linux-3.7.2.patch/drivers/media/dvb-frontends/stb0899_algo.c
|
||||
--- linux-3.7.2/drivers/media/dvb-frontends/stb0899_algo.c 2013-01-11 18:19:28.000000000 +0100
|
||||
+++ linux-3.7.2.patch/drivers/media/dvb-frontends/stb0899_algo.c 2013-01-16 10:28:33.633409961 +0100
|
||||
@@ -206,7 +206,6 @@
|
||||
static enum stb0899_status stb0899_search_tmg(struct stb0899_state *state)
|
||||
{
|
||||
struct stb0899_internal *internal = &state->internal;
|
||||
- struct stb0899_params *params = &state->params;
|
||||
|
||||
short int derot_step, derot_freq = 0, derot_limit, next_loop = 3;
|
||||
int index = 0;
|
||||
@@ -216,10 +215,9 @@
|
||||
|
||||
/* timing loop computation & symbol rate optimisation */
|
||||
derot_limit = (internal->sub_range / 2L) / internal->mclk;
|
||||
- derot_step = (params->srate / 2L) / internal->mclk;
|
||||
+ derot_step = internal->derot_step * 4; /* dertot_step = decreasing delta */
|
||||
|
||||
while ((stb0899_check_tmg(state) != TIMINGOK) && next_loop) {
|
||||
- index++;
|
||||
derot_freq += index * internal->direction * derot_step; /* next derot zig zag position */
|
||||
|
||||
if (abs(derot_freq) > derot_limit)
|
||||
@@ -230,6 +228,7 @@
|
||||
STB0899_SETFIELD_VAL(CFRL, cfr[1], LSB(state->config->inversion * derot_freq));
|
||||
stb0899_write_regs(state, STB0899_CFRM, cfr, 2); /* derotator frequency */
|
||||
}
|
||||
+ index++;
|
||||
internal->direction = -internal->direction; /* Change zigzag direction */
|
||||
}
|
||||
|
||||
@@ -278,14 +277,18 @@
|
||||
{
|
||||
struct stb0899_internal *internal = &state->internal;
|
||||
|
||||
- short int derot_freq = 0, last_derot_freq = 0, derot_limit, next_loop = 3;
|
||||
+ short int derot_freq = 0, last_derot_freq = 0, derot_limit, derot_step, next_loop = 3;
|
||||
int index = 0;
|
||||
+ int base_freq;
|
||||
u8 cfr[2];
|
||||
u8 reg;
|
||||
|
||||
internal->status = NOCARRIER;
|
||||
derot_limit = (internal->sub_range / 2L) / internal->mclk;
|
||||
derot_freq = internal->derot_freq;
|
||||
+ derot_step = internal->derot_step * 2;
|
||||
+ last_derot_freq = internal->derot_freq;
|
||||
+ base_freq = internal->derot_freq;
|
||||
|
||||
reg = stb0899_read_reg(state, STB0899_CFD);
|
||||
STB0899_SETFIELD_VAL(CFD_ON, reg, 1);
|
||||
@@ -294,11 +297,10 @@
|
||||
do {
|
||||
dprintk(state->verbose, FE_DEBUG, 1, "Derot Freq=%d, mclk=%d", derot_freq, internal->mclk);
|
||||
if (stb0899_check_carrier(state) == NOCARRIER) {
|
||||
- index++;
|
||||
last_derot_freq = derot_freq;
|
||||
- derot_freq += index * internal->direction * internal->derot_step; /* next zig zag derotator position */
|
||||
+ derot_freq += index * internal->direction * derot_step; /* next zig zag derotator position */
|
||||
|
||||
- if(abs(derot_freq) > derot_limit)
|
||||
+ if (derot_freq > base_freq + derot_limit || derot_freq < base_freq - derot_limit)
|
||||
next_loop--;
|
||||
|
||||
if (next_loop) {
|
||||
@@ -310,9 +312,10 @@
|
||||
STB0899_SETFIELD_VAL(CFRL, cfr[1], LSB(state->config->inversion * derot_freq));
|
||||
stb0899_write_regs(state, STB0899_CFRM, cfr, 2); /* derotator frequency */
|
||||
}
|
||||
+ index++;
|
||||
+ internal->direction = -internal->direction; /* Change zigzag direction */
|
||||
}
|
||||
|
||||
- internal->direction = -internal->direction; /* Change zigzag direction */
|
||||
} while ((internal->status != CARRIEROK) && next_loop);
|
||||
|
||||
if (internal->status == CARRIEROK) {
|
||||
@@ -338,6 +341,7 @@
|
||||
int lock = 0, index = 0, dataTime = 500, loop;
|
||||
u8 reg;
|
||||
|
||||
+ msleep(1);
|
||||
internal->status = NODATA;
|
||||
|
||||
/* RESET FEC */
|
||||
@@ -348,6 +352,7 @@
|
||||
reg = stb0899_read_reg(state, STB0899_TSTRES);
|
||||
STB0899_SETFIELD_VAL(FRESACS, reg, 0);
|
||||
stb0899_write_reg(state, STB0899_TSTRES, reg);
|
||||
+ msleep(1);
|
||||
|
||||
if (params->srate <= 2000000)
|
||||
dataTime = 2000;
|
||||
@@ -363,6 +368,7 @@
|
||||
|
||||
stb0899_write_reg(state, STB0899_DSTATUS2, 0x00); /* force search loop */
|
||||
while (1) {
|
||||
+ msleep(1); // Alex: added 1 mSec
|
||||
/* WARNING! VIT LOCKED has to be tested before VIT_END_LOOOP */
|
||||
reg = stb0899_read_reg(state, STB0899_VSTATUS);
|
||||
lock = STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg);
|
||||
@@ -390,20 +396,21 @@
|
||||
short int derot_freq, derot_step, derot_limit, next_loop = 3;
|
||||
u8 cfr[2];
|
||||
u8 reg;
|
||||
- int index = 1;
|
||||
+ int index = 0;
|
||||
+ int base_freq;
|
||||
|
||||
struct stb0899_internal *internal = &state->internal;
|
||||
- struct stb0899_params *params = &state->params;
|
||||
|
||||
- derot_step = (params->srate / 4L) / internal->mclk;
|
||||
+ derot_step = internal->derot_step;
|
||||
derot_limit = (internal->sub_range / 2L) / internal->mclk;
|
||||
derot_freq = internal->derot_freq;
|
||||
+ base_freq = internal->derot_freq;
|
||||
|
||||
do {
|
||||
if ((internal->status != CARRIEROK) || (stb0899_check_data(state) != DATAOK)) {
|
||||
|
||||
derot_freq += index * internal->direction * derot_step; /* next zig zag derotator position */
|
||||
- if (abs(derot_freq) > derot_limit)
|
||||
+ if (derot_freq > base_freq + derot_limit || derot_freq < base_freq - derot_limit)
|
||||
next_loop--;
|
||||
|
||||
if (next_loop) {
|
||||
@@ -417,9 +424,9 @@
|
||||
stb0899_write_regs(state, STB0899_CFRM, cfr, 2); /* derotator frequency */
|
||||
|
||||
stb0899_check_carrier(state);
|
||||
- index++;
|
||||
}
|
||||
}
|
||||
+ index++;
|
||||
internal->direction = -internal->direction; /* change zig zag direction */
|
||||
} while ((internal->status != DATAOK) && next_loop);
|
||||
|
34102
packages/linux/patches/4.0.5/linux-221-ngene-octopus.patch
vendored
34102
packages/linux/patches/4.0.5/linux-221-ngene-octopus.patch
vendored
File diff suppressed because it is too large
Load Diff
@ -1,62 +0,0 @@
|
||||
diff -Naur linux-3.7.2/drivers/media/dvb-frontends/stb0899_drv.c linux-3.7.2.patch/drivers/media/dvb-frontends/stb0899_drv.c
|
||||
--- linux-3.7.2/drivers/media/dvb-frontends/stb0899_drv.c 2013-01-11 18:19:28.000000000 +0100
|
||||
+++ linux-3.7.2.patch/drivers/media/dvb-frontends/stb0899_drv.c 2013-01-16 10:33:10.323380937 +0100
|
||||
@@ -971,6 +971,16 @@
|
||||
|
||||
*strength = stb0899_table_lookup(stb0899_dvbsrf_tab, ARRAY_SIZE(stb0899_dvbsrf_tab) - 1, val);
|
||||
*strength += 750;
|
||||
+
|
||||
+ const int MIN_STRENGTH_DVBS = 0;
|
||||
+ const int MAX_STRENGTH_DVBS = 680;
|
||||
+ if (*strength < MIN_STRENGTH_DVBS)
|
||||
+ *strength = 0;
|
||||
+ else if(*strength > MAX_STRENGTH_DVBS)
|
||||
+ *strength = 0xFFFF;
|
||||
+ else
|
||||
+ *strength = (*strength - MIN_STRENGTH_DVBS) * 0xFFFF / (MAX_STRENGTH_DVBS - MIN_STRENGTH_DVBS);
|
||||
+
|
||||
dprintk(state->verbose, FE_DEBUG, 1, "AGCIQVALUE = 0x%02x, C = %d * 0.1 dBm",
|
||||
val & 0xff, *strength);
|
||||
}
|
||||
@@ -983,6 +993,7 @@
|
||||
|
||||
*strength = stb0899_table_lookup(stb0899_dvbs2rf_tab, ARRAY_SIZE(stb0899_dvbs2rf_tab) - 1, val);
|
||||
*strength += 950;
|
||||
+ *strength = *strength << 4;
|
||||
dprintk(state->verbose, FE_DEBUG, 1, "IF_AGC_GAIN = 0x%04x, C = %d * 0.1 dBm",
|
||||
val & 0x3fff, *strength);
|
||||
}
|
||||
@@ -1016,6 +1027,16 @@
|
||||
val = MAKEWORD16(buf[0], buf[1]);
|
||||
|
||||
*snr = stb0899_table_lookup(stb0899_cn_tab, ARRAY_SIZE(stb0899_cn_tab) - 1, val);
|
||||
+
|
||||
+ const int MIN_SNR_DVBS = 0;
|
||||
+ const int MAX_SNR_DVBS = 200;
|
||||
+ if (*snr < MIN_SNR_DVBS)
|
||||
+ *snr = 0;
|
||||
+ else if(*snr > MAX_SNR_DVBS)
|
||||
+ *snr = 0xFFFF;
|
||||
+ else
|
||||
+ *snr = (*snr - MIN_SNR_DVBS) * 0xFFFF / (MAX_SNR_DVBS - MIN_SNR_DVBS);
|
||||
+
|
||||
dprintk(state->verbose, FE_DEBUG, 1, "NIR = 0x%02x%02x = %u, C/N = %d * 0.1 dBm\n",
|
||||
buf[0], buf[1], val, *snr);
|
||||
}
|
||||
@@ -1040,6 +1061,16 @@
|
||||
val = (quantn - estn) / 10;
|
||||
}
|
||||
*snr = val;
|
||||
+
|
||||
+ const int MIN_SNR_DVBS2 = 10;
|
||||
+ const int MAX_SNR_DVBS2 = 70;
|
||||
+ if (*snr < MIN_SNR_DVBS2)
|
||||
+ *snr = 0;
|
||||
+ else if(*snr > MAX_SNR_DVBS2)
|
||||
+ *snr = 0xFFFF;
|
||||
+ else
|
||||
+ *snr = (*snr - MIN_SNR_DVBS2) * 0xFFFF / (MAX_SNR_DVBS2 - MIN_SNR_DVBS2);
|
||||
+
|
||||
dprintk(state->verbose, FE_DEBUG, 1, "Es/N0 quant = %d (%d) estimate = %u (%d), C/N = %d * 0.1 dBm",
|
||||
quant, quantn, est, estn, val);
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
diff -Naur linux-3.7.9/drivers/media/usb/dvb-usb/pctv452e.c linux-3.7.9.patch/drivers/media/usb/dvb-usb/pctv452e.c
|
||||
--- linux-3.7.9/drivers/media/usb/dvb-usb/pctv452e.c 2013-01-11 18:19:28.000000000 +0100
|
||||
+++ linux-3.7.9.patch/drivers/media/usb/dvb-usb/pctv452e.c 2013-01-16 10:35:01.131342123 +0100
|
||||
@@ -995,11 +995,11 @@
|
||||
/* parameter for the MPEG2-data transfer */
|
||||
.stream = {
|
||||
.type = USB_ISOC,
|
||||
- .count = 7,
|
||||
+ .count = 4,
|
||||
.endpoint = 0x02,
|
||||
.u = {
|
||||
.isoc = {
|
||||
- .framesperurb = 4,
|
||||
+ .framesperurb = 64,
|
||||
.framesize = 940,
|
||||
.interval = 1
|
||||
}
|
@ -1,284 +0,0 @@
|
||||
From edf8977b62ae86859cccf3d0ea4883333ea4d138 Mon Sep 17 00:00:00 2001
|
||||
From: Dale Hamel <dale.hamel@srvthe.net>
|
||||
Date: Tue, 24 Feb 2015 10:31:04 -0500
|
||||
Subject: [PATCH] Add framescaling support to stk1160
|
||||
|
||||
Implements frame scaling support for stk1160 to support format changes instead of a static frame size.
|
||||
|
||||
This is effectively a dumb sampling, and could perhaps benefit from being an averaging instead.
|
||||
|
||||
This was a requested "TO DO" for this driver, and allows support for userspace programs like Hyperion and Boblight.
|
||||
|
||||
Submitted on behalf of the original author, Michael Stegemann <endarno@gmail.com>
|
||||
---
|
||||
drivers/media/usb/stk1160/stk1160-core.c | 1 +
|
||||
drivers/media/usb/stk1160/stk1160-reg.h | 26 +++++++
|
||||
drivers/media/usb/stk1160/stk1160-v4l.c | 112 +++++++++++++++++++++++-------
|
||||
drivers/media/usb/stk1160/stk1160-video.c | 17 ++++-
|
||||
drivers/media/usb/stk1160/stk1160.h | 1 +
|
||||
5 files changed, 130 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/drivers/media/usb/stk1160/stk1160-core.c b/drivers/media/usb/stk1160/stk1160-core.c
|
||||
index 03504dc..1881770 100644
|
||||
--- a/drivers/media/usb/stk1160/stk1160-core.c
|
||||
+++ b/drivers/media/usb/stk1160/stk1160-core.c
|
||||
@@ -418,6 +418,7 @@ static void stk1160_disconnect(struct usb_interface *interface)
|
||||
stk1160_ac97_unregister(dev);
|
||||
|
||||
stk1160_clear_queue(dev);
|
||||
+ vb2_queue_release(&dev->vb_vidq);
|
||||
|
||||
video_unregister_device(&dev->vdev);
|
||||
v4l2_device_disconnect(&dev->v4l2_dev);
|
||||
diff --git a/drivers/media/usb/stk1160/stk1160-reg.h b/drivers/media/usb/stk1160/stk1160-reg.h
|
||||
index 3e49da6..b1fa11d 100644
|
||||
--- a/drivers/media/usb/stk1160/stk1160-reg.h
|
||||
+++ b/drivers/media/usb/stk1160/stk1160-reg.h
|
||||
@@ -33,6 +33,32 @@
|
||||
*/
|
||||
#define STK1160_DCTRL 0x100
|
||||
|
||||
+/*
|
||||
+ * Decimation Control Register:
|
||||
+ * Byte 104:
|
||||
+ * Horizontal Decimation Line Unit Count
|
||||
+ * Byte 105:
|
||||
+ * Vertical Decimation Line Unit Count
|
||||
+ * Byte 106:
|
||||
+ * Bit 0 - Horizontal Decimation Control
|
||||
+ * 0 Horizontal decimation is disabled.
|
||||
+ * 1 Horizontal decimation is enabled.
|
||||
+ * Bit 1 - Decimates Half or More Column
|
||||
+ * 0 Decimates less than half from original column,
|
||||
+ * -> send count unit (0x105) before each unit skipped.
|
||||
+ * 1 Decimates half or more from original column,
|
||||
+ * -> skip count unit (0x105) before each unit sent.
|
||||
+ * Bit 2 - Vertical Decimation Control
|
||||
+ * see Bit 0, only vertical
|
||||
+ * Bit 3 - Vertical Greater or Equal to Half
|
||||
+ * see Bit 1, only vertical
|
||||
+ * Bit 4 - Decimation Unit
|
||||
+ * 0 Decimation will work with 2 rows or columns per unit.
|
||||
+ * 1 Decimation will work with 4 rows or columns per unit.
|
||||
+ */
|
||||
+#define STK1160_DMCTRL 0x104
|
||||
+
|
||||
+
|
||||
/* Capture Frame Start Position */
|
||||
#define STK116_CFSPO 0x110
|
||||
#define STK116_CFSPO_STX_L 0x110
|
||||
diff --git a/drivers/media/usb/stk1160/stk1160-v4l.c b/drivers/media/usb/stk1160/stk1160-v4l.c
|
||||
index 65a326c..94dafeb 100644
|
||||
--- a/drivers/media/usb/stk1160/stk1160-v4l.c
|
||||
+++ b/drivers/media/usb/stk1160/stk1160-v4l.c
|
||||
@@ -106,6 +106,76 @@ static void stk1160_set_std(struct stk1160 *dev)
|
||||
|
||||
}
|
||||
|
||||
+static void stk1160_try_fmt(struct stk1160 *dev, struct v4l2_format *f, bool try)
|
||||
+{
|
||||
+ int base_width, base_height;
|
||||
+
|
||||
+ if (dev->norm & V4L2_STD_525_60){
|
||||
+ base_width = 720;
|
||||
+ base_height = 480;
|
||||
+ } else {
|
||||
+ base_width = 720;
|
||||
+ base_height = 576;
|
||||
+ }
|
||||
+
|
||||
+ if (f->fmt.pix.width <= (base_width / 3)
|
||||
+ || f->fmt.pix.height <= (base_height / 3)){
|
||||
+ f->fmt.pix.width = base_width / 3;
|
||||
+ f->fmt.pix.height = base_height / 3;
|
||||
+ if (!try){
|
||||
+ dev->decimate = 3;
|
||||
+ }
|
||||
+ } else if ((f->fmt.pix.width >= base_width >> 1
|
||||
+ && f->fmt.pix.width < base_width)
|
||||
+ ||((f->fmt.pix.height >= base_height >> 1
|
||||
+ && f->fmt.pix.height < base_height))){
|
||||
+ f->fmt.pix.width = base_width >> 1;
|
||||
+ f->fmt.pix.height = base_height >> 1;
|
||||
+ if (!try){
|
||||
+ dev->decimate = 2;
|
||||
+ }
|
||||
+ } else {
|
||||
+ f->fmt.pix.width = base_width;
|
||||
+ f->fmt.pix.height = base_height;
|
||||
+ if (!try){
|
||||
+ dev->decimate = 0;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void stk1160_set_fmt(struct stk1160 *dev)
|
||||
+{
|
||||
+ if (dev->norm & V4L2_STD_525_60){
|
||||
+ dev->width = 720;
|
||||
+ dev->height = 480;
|
||||
+ } else {
|
||||
+ dev->width = 720;
|
||||
+ dev->height = 576;
|
||||
+ }
|
||||
+
|
||||
+ switch (dev->decimate){
|
||||
+ case 0:
|
||||
+ stk1160_write_reg(dev, STK1160_DMCTRL, 0x00);
|
||||
+ stk1160_write_reg(dev, STK1160_DMCTRL+1, 0x00);
|
||||
+ stk1160_write_reg(dev, STK1160_DMCTRL+2, 0x00);
|
||||
+ break;
|
||||
+ case 2:
|
||||
+ stk1160_write_reg(dev, STK1160_DMCTRL, 0x01);
|
||||
+ stk1160_write_reg(dev, STK1160_DMCTRL+1, 0x01);
|
||||
+ stk1160_write_reg(dev, STK1160_DMCTRL+2, 0x1f);
|
||||
+ dev->width = dev->width >> 1;
|
||||
+ dev->height = dev->height >> 1;
|
||||
+ break;
|
||||
+ case 3:
|
||||
+ stk1160_write_reg(dev, STK1160_DMCTRL, 0x02);
|
||||
+ stk1160_write_reg(dev, STK1160_DMCTRL+1, 0x02);
|
||||
+ stk1160_write_reg(dev, STK1160_DMCTRL+2, 0x1f);
|
||||
+ dev->width = dev->width / 3;
|
||||
+ dev->height = dev->height / 3;
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Set a new alternate setting.
|
||||
* Returns true is dev->max_pkt_size has changed, false otherwise.
|
||||
@@ -321,17 +391,10 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
|
||||
{
|
||||
struct stk1160 *dev = video_drvdata(file);
|
||||
|
||||
- /*
|
||||
- * User can't choose size at his own will,
|
||||
- * so we just return him the current size chosen
|
||||
- * at standard selection.
|
||||
- * TODO: Implement frame scaling?
|
||||
- */
|
||||
+ stk1160_try_fmt(dev, f, true);
|
||||
|
||||
- f->fmt.pix.pixelformat = dev->fmt->fourcc;
|
||||
- f->fmt.pix.width = dev->width;
|
||||
- f->fmt.pix.height = dev->height;
|
||||
f->fmt.pix.field = V4L2_FIELD_INTERLACED;
|
||||
+ f->fmt.pix.pixelformat = dev->fmt->fourcc;
|
||||
f->fmt.pix.bytesperline = dev->width * 2;
|
||||
f->fmt.pix.sizeimage = dev->height * f->fmt.pix.bytesperline;
|
||||
f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
@@ -348,9 +411,14 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
|
||||
if (vb2_is_busy(q))
|
||||
return -EBUSY;
|
||||
|
||||
- vidioc_try_fmt_vid_cap(file, priv, f);
|
||||
+ stk1160_try_fmt(dev, f, false);
|
||||
+ stk1160_set_fmt(dev);
|
||||
|
||||
- /* We don't support any format changes */
|
||||
+ f->fmt.pix.field = V4L2_FIELD_INTERLACED;
|
||||
+ f->fmt.pix.pixelformat = dev->fmt->fourcc;
|
||||
+ f->fmt.pix.bytesperline = dev->width * 2;
|
||||
+ f->fmt.pix.sizeimage = dev->height * f->fmt.pix.bytesperline;
|
||||
+ f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -389,23 +457,18 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id norm)
|
||||
dev->norm = norm;
|
||||
|
||||
/* This is taken from saa7115 video decoder */
|
||||
- if (dev->norm & V4L2_STD_525_60) {
|
||||
- dev->width = 720;
|
||||
- dev->height = 480;
|
||||
- } else if (dev->norm & V4L2_STD_625_50) {
|
||||
- dev->width = 720;
|
||||
- dev->height = 576;
|
||||
+ if (dev->norm & V4L2_STD_525_60 || dev->norm & V4L2_STD_625_50) {
|
||||
+ stk1160_set_std(dev);
|
||||
+ stk1160_set_fmt(dev);
|
||||
+
|
||||
+ v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_std,
|
||||
+ dev->norm);
|
||||
+
|
||||
+ return 0;
|
||||
} else {
|
||||
stk1160_err("invalid standard\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
-
|
||||
- stk1160_set_std(dev);
|
||||
-
|
||||
- v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_std,
|
||||
- dev->norm);
|
||||
-
|
||||
- return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -671,6 +734,7 @@ int stk1160_video_register(struct stk1160 *dev)
|
||||
dev->norm = V4L2_STD_NTSC_M;
|
||||
dev->width = 720;
|
||||
dev->height = 480;
|
||||
+ dev->decimate = 0;
|
||||
|
||||
/* set default format */
|
||||
dev->fmt = &format[0];
|
||||
diff --git a/drivers/media/usb/stk1160/stk1160-video.c b/drivers/media/usb/stk1160/stk1160-video.c
|
||||
index 39f1aae..5a55028 100644
|
||||
--- a/drivers/media/usb/stk1160/stk1160-video.c
|
||||
+++ b/drivers/media/usb/stk1160/stk1160-video.c
|
||||
@@ -84,7 +84,6 @@ struct stk1160_buffer *stk1160_next_buffer(struct stk1160 *dev)
|
||||
if (!list_empty(&dev->avail_bufs)) {
|
||||
buf = list_first_entry(&dev->avail_bufs,
|
||||
struct stk1160_buffer, list);
|
||||
- list_del(&buf->list);
|
||||
}
|
||||
spin_unlock_irqrestore(&dev->buf_lock, flags);
|
||||
|
||||
@@ -95,7 +94,7 @@ static inline
|
||||
void stk1160_buffer_done(struct stk1160 *dev)
|
||||
{
|
||||
struct stk1160_buffer *buf = dev->isoc_ctl.buf;
|
||||
-
|
||||
+ unsigned long flags = 0;
|
||||
dev->field_count++;
|
||||
|
||||
buf->vb.v4l2_buf.sequence = dev->field_count >> 1;
|
||||
@@ -104,7 +103,19 @@ void stk1160_buffer_done(struct stk1160 *dev)
|
||||
v4l2_get_timestamp(&buf->vb.v4l2_buf.timestamp);
|
||||
|
||||
vb2_set_plane_payload(&buf->vb, 0, buf->bytesused);
|
||||
- vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);
|
||||
+
|
||||
+ spin_lock_irqsave(&dev->buf_lock, flags);
|
||||
+ if (buf->bytesused == vb2_plane_size(&buf->vb, 0))
|
||||
+ vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);
|
||||
+ else
|
||||
+ vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
|
||||
+
|
||||
+ if (!list_empty(&dev->avail_bufs)) {
|
||||
+ list_del(&buf->list);
|
||||
+ }
|
||||
+
|
||||
+ spin_unlock_irqrestore(&dev->buf_lock, flags);
|
||||
+
|
||||
|
||||
dev->isoc_ctl.buf = NULL;
|
||||
}
|
||||
diff --git a/drivers/media/usb/stk1160/stk1160.h b/drivers/media/usb/stk1160/stk1160.h
|
||||
index abdea48..895ed35 100644
|
||||
--- a/drivers/media/usb/stk1160/stk1160.h
|
||||
+++ b/drivers/media/usb/stk1160/stk1160.h
|
||||
@@ -150,6 +150,7 @@ struct stk1160 {
|
||||
unsigned int ctl_input; /* selected input */
|
||||
v4l2_std_id norm; /* current norm */
|
||||
struct stk1160_fmt *fmt; /* selected format */
|
||||
+ int decimate;
|
||||
|
||||
unsigned int field_count; /* not sure ??? */
|
||||
enum v4l2_field field; /* also not sure :/ */
|
||||
--
|
||||
2.1.1
|
||||
|
@ -1,18 +0,0 @@
|
||||
diff -rupN a/drivers/media/dvb-frontends/ds3000.c b/drivers/media/dvb-frontends/ds3000.c
|
||||
--- a/drivers/media/dvb-frontends/ds3000.c 2015-01-28 23:24:59.000000000 +0100
|
||||
+++ b/drivers/media/dvb-frontends/ds3000.c 2015-01-29 21:57:56.000000000 +0100
|
||||
@@ -958,6 +958,14 @@ static int ds3000_set_frontend(struct dv
|
||||
/* enable ac coupling */
|
||||
ds3000_writereg(state, 0x25, 0x8a);
|
||||
|
||||
+ dprintk("%s() frequency:%u symbol_rate:%u\n", __func__, c->frequency, c->symbol_rate);
|
||||
+
|
||||
+ if (c->symbol_rate < ds3000_ops.info.symbol_rate_min || c->symbol_rate > ds3000_ops.info.symbol_rate_max ) {
|
||||
+ dprintk("%s() symbol_rate %u out of range (%u ... %u)\n", __func__, c->symbol_rate,
|
||||
+ ds3000_ops.info.symbol_rate_min, ds3000_ops.info.symbol_rate_max);
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
/* enhance symbol rate performance */
|
||||
if ((c->symbol_rate / 1000) <= 5000) {
|
||||
value = 29777 / (c->symbol_rate / 1000) + 1;
|
@ -1,382 +0,0 @@
|
||||
diff -urN a/drivers/media/dvb-core/dvb-usb-ids.h b/drivers/media/dvb-core/dvb-usb-ids.h
|
||||
--- a/drivers/media/dvb-core/dvb-usb-ids.h 2015-04-29 11:22:30.000000000 +0300
|
||||
+++ b/drivers/media/dvb-core/dvb-usb-ids.h 2015-05-05 20:35:29.392417272 +0300
|
||||
@@ -245,6 +245,7 @@
|
||||
#define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006
|
||||
#define USB_PID_TECHNOTREND_CONNECT_S2400_8KEEPROM 0x3009
|
||||
#define USB_PID_TECHNOTREND_CONNECT_CT3650 0x300d
|
||||
+#define USB_PID_TECHNOTREND_CONNECT_S2_4600 0x3011
|
||||
#define USB_PID_TECHNOTREND_CONNECT_CT2_4650_CI 0x3012
|
||||
#define USB_PID_TECHNOTREND_TVSTICK_CT2_4400 0x3014
|
||||
#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a
|
||||
diff -urN a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c
|
||||
--- a/drivers/media/usb/dvb-usb/dw2102.c 2015-04-29 11:22:30.000000000 +0300
|
||||
+++ b/drivers/media/usb/dvb-usb/dw2102.c 2015-05-05 20:37:20.376421156 +0300
|
||||
@@ -2,7 +2,8 @@
|
||||
* DVBWorld DVB-S 2101, 2102, DVB-S2 2104, DVB-C 3101,
|
||||
* TeVii S600, S630, S650, S660, S480, S421, S632
|
||||
* Prof 1100, 7500,
|
||||
- * Geniatech SU3000, T220 Cards
|
||||
+ * Geniatech SU3000, T220,
|
||||
+ * TechnoTrend S2-4600 Cards
|
||||
* Copyright (C) 2008-2012 Igor M. Liplianin (liplianin@me.by)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -31,6 +32,8 @@
|
||||
#include "m88rs2000.h"
|
||||
#include "tda18271.h"
|
||||
#include "cxd2820r.h"
|
||||
+#include "m88ds3103.h"
|
||||
+#include "m88ts2022.h"
|
||||
|
||||
/* Max transfer size done by I2C transfer functions */
|
||||
#define MAX_XFER_SIZE 64
|
||||
@@ -112,12 +115,15 @@
|
||||
"Please see linux/Documentation/dvb/ for more details " \
|
||||
"on firmware-problems."
|
||||
|
||||
-struct su3000_state {
|
||||
+struct dw2102_state {
|
||||
u8 initialized;
|
||||
-};
|
||||
+ u8 last_lock;
|
||||
+ struct i2c_client *i2c_client_tuner;
|
||||
|
||||
-struct s6x0_state {
|
||||
+ /* fe hook functions*/
|
||||
int (*old_set_voltage)(struct dvb_frontend *f, fe_sec_voltage_t v);
|
||||
+ int (*fe_read_status)(struct dvb_frontend *fe,
|
||||
+ fe_status_t *status);
|
||||
};
|
||||
|
||||
/* debug */
|
||||
@@ -887,7 +893,7 @@
|
||||
|
||||
static int su3000_power_ctrl(struct dvb_usb_device *d, int i)
|
||||
{
|
||||
- struct su3000_state *state = (struct su3000_state *)d->priv;
|
||||
+ struct dw2102_state *state = (struct dw2102_state *)d->priv;
|
||||
u8 obuf[] = {0xde, 0};
|
||||
|
||||
info("%s: %d, initialized %d\n", __func__, i, state->initialized);
|
||||
@@ -973,7 +979,7 @@
|
||||
{
|
||||
struct dvb_usb_adapter *d =
|
||||
(struct dvb_usb_adapter *)(fe->dvb->priv);
|
||||
- struct s6x0_state *st = (struct s6x0_state *)d->dev->priv;
|
||||
+ struct dw2102_state *st = (struct dw2102_state *)d->dev->priv;
|
||||
|
||||
dw210x_set_voltage(fe, voltage);
|
||||
if (st->old_set_voltage)
|
||||
@@ -1000,6 +1006,23 @@
|
||||
i2c_transfer(&udev_adap->dev->i2c_adap, &msg, 1);
|
||||
}
|
||||
|
||||
+static int tt_s2_4600_read_status(struct dvb_frontend *fe, fe_status_t *status)
|
||||
+{
|
||||
+ struct dvb_usb_adapter *d =
|
||||
+ (struct dvb_usb_adapter *)(fe->dvb->priv);
|
||||
+ struct dw2102_state *st = (struct dw2102_state *)d->dev->priv;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = st->fe_read_status(fe, status);
|
||||
+
|
||||
+ /* resync slave fifo when signal change from unlock to lock */
|
||||
+ if ((*status & FE_HAS_LOCK) && (!st->last_lock))
|
||||
+ su3000_streaming_ctrl(d, 1);
|
||||
+
|
||||
+ st->last_lock = (*status & FE_HAS_LOCK) ? 1 : 0;
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static struct stv0299_config sharp_z0194a_config = {
|
||||
.demod_address = 0x68,
|
||||
.inittab = sharp_z0194a_inittab,
|
||||
@@ -1117,6 +1140,22 @@
|
||||
.gate = TDA18271_GATE_DIGITAL,
|
||||
};
|
||||
|
||||
+static const struct m88ds3103_config tt_s2_4600_m88ds3103_config = {
|
||||
+ .i2c_addr = 0x68,
|
||||
+ .clock = 27000000,
|
||||
+ .i2c_wr_max = 33,
|
||||
+ .ts_mode = M88DS3103_TS_CI,
|
||||
+ .ts_clk = 16000,
|
||||
+ .ts_clk_pol = 0,
|
||||
+ .spec_inv = 0,
|
||||
+ .agc_inv = 0,
|
||||
+ .clock_out = M88DS3103_CLOCK_OUT_ENABLED,
|
||||
+ .envelope_mode = 0,
|
||||
+ .agc = 0x99,
|
||||
+ .lnb_hv_pol = 1,
|
||||
+ .lnb_en_pol = 0,
|
||||
+};
|
||||
+
|
||||
static u8 m88rs2000_inittab[] = {
|
||||
DEMOD_WRITE, 0x9a, 0x30,
|
||||
DEMOD_WRITE, 0x00, 0x01,
|
||||
@@ -1295,7 +1334,7 @@
|
||||
|
||||
static int ds3000_frontend_attach(struct dvb_usb_adapter *d)
|
||||
{
|
||||
- struct s6x0_state *st = (struct s6x0_state *)d->dev->priv;
|
||||
+ struct dw2102_state *st = d->dev->priv;
|
||||
u8 obuf[] = {7, 1};
|
||||
|
||||
d->fe_adap[0].fe = dvb_attach(ds3000_attach, &s660_ds3000_config,
|
||||
@@ -1461,6 +1500,92 @@
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
+static int tt_s2_4600_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = adap->dev;
|
||||
+ struct dw2102_state *state = d->priv;
|
||||
+ u8 obuf[3] = { 0xe, 0x80, 0 };
|
||||
+ u8 ibuf[] = { 0 };
|
||||
+ struct i2c_adapter *i2c_adapter;
|
||||
+ struct i2c_client *client;
|
||||
+ struct i2c_board_info info;
|
||||
+ struct m88ts2022_config m88ts2022_config = {
|
||||
+ .clock = 27000000,
|
||||
+ };
|
||||
+
|
||||
+ if (dvb_usb_generic_rw(d, obuf, 3, ibuf, 1, 0) < 0)
|
||||
+ err("command 0x0e transfer failed.");
|
||||
+
|
||||
+ obuf[0] = 0xe;
|
||||
+ obuf[1] = 0x02;
|
||||
+ obuf[2] = 1;
|
||||
+
|
||||
+ if (dvb_usb_generic_rw(d, obuf, 3, ibuf, 1, 0) < 0)
|
||||
+ err("command 0x0e transfer failed.");
|
||||
+ msleep(300);
|
||||
+
|
||||
+ obuf[0] = 0xe;
|
||||
+ obuf[1] = 0x83;
|
||||
+ obuf[2] = 0;
|
||||
+
|
||||
+ if (dvb_usb_generic_rw(d, obuf, 3, ibuf, 1, 0) < 0)
|
||||
+ err("command 0x0e transfer failed.");
|
||||
+
|
||||
+ obuf[0] = 0xe;
|
||||
+ obuf[1] = 0x83;
|
||||
+ obuf[2] = 1;
|
||||
+
|
||||
+ if (dvb_usb_generic_rw(d, obuf, 3, ibuf, 1, 0) < 0)
|
||||
+ err("command 0x0e transfer failed.");
|
||||
+
|
||||
+ obuf[0] = 0x51;
|
||||
+
|
||||
+ if (dvb_usb_generic_rw(d, obuf, 1, ibuf, 1, 0) < 0)
|
||||
+ err("command 0x51 transfer failed.");
|
||||
+
|
||||
+ memset(&info, 0, sizeof(struct i2c_board_info));
|
||||
+
|
||||
+ adap->fe_adap[0].fe = dvb_attach(m88ds3103_attach,
|
||||
+ &tt_s2_4600_m88ds3103_config,
|
||||
+ &d->i2c_adap,
|
||||
+ &i2c_adapter);
|
||||
+ if (adap->fe_adap[0].fe == NULL)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ /* attach tuner */
|
||||
+ m88ts2022_config.fe = adap->fe_adap[0].fe;
|
||||
+ strlcpy(info.type, "m88ts2022", I2C_NAME_SIZE);
|
||||
+ info.addr = 0x60;
|
||||
+ info.platform_data = &m88ts2022_config;
|
||||
+ request_module("m88ts2022");
|
||||
+ client = i2c_new_device(i2c_adapter, &info);
|
||||
+
|
||||
+ if (client == NULL || client->dev.driver == NULL) {
|
||||
+ dvb_frontend_detach(adap->fe_adap[0].fe);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ if (!try_module_get(client->dev.driver->owner)) {
|
||||
+ i2c_unregister_device(client);
|
||||
+ dvb_frontend_detach(adap->fe_adap[0].fe);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ /* delegate signal strength measurement to tuner */
|
||||
+ adap->fe_adap[0].fe->ops.read_signal_strength =
|
||||
+ adap->fe_adap[0].fe->ops.tuner_ops.get_rf_strength;
|
||||
+
|
||||
+ state->i2c_client_tuner = client;
|
||||
+
|
||||
+ /* hook fe: need to resync the slave fifo when signal locks */
|
||||
+ state->fe_read_status = adap->fe_adap[0].fe->ops.read_status;
|
||||
+ adap->fe_adap[0].fe->ops.read_status = tt_s2_4600_read_status;
|
||||
+
|
||||
+ state->last_lock = 0;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int dw2102_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
|
||||
@@ -1561,6 +1686,7 @@
|
||||
TERRATEC_CINERGY_S2_R2,
|
||||
GOTVIEW_SAT_HD,
|
||||
GENIATECH_T220,
|
||||
+ TECHNOTREND_S2_4600,
|
||||
};
|
||||
|
||||
static struct usb_device_id dw2102_table[] = {
|
||||
@@ -1584,6 +1710,8 @@
|
||||
[TERRATEC_CINERGY_S2_R2] = {USB_DEVICE(USB_VID_TERRATEC, 0x00b0)},
|
||||
[GOTVIEW_SAT_HD] = {USB_DEVICE(0x1FE1, USB_PID_GOTVIEW_SAT_HD)},
|
||||
[GENIATECH_T220] = {USB_DEVICE(0x1f4d, 0xD220)},
|
||||
+ [TECHNOTREND_S2_4600] = {USB_DEVICE(USB_VID_TECHNOTREND,
|
||||
+ USB_PID_TECHNOTREND_CONNECT_S2_4600)},
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -1857,7 +1985,7 @@
|
||||
static struct dvb_usb_device_properties s6x0_properties = {
|
||||
.caps = DVB_USB_IS_AN_I2C_ADAPTER,
|
||||
.usb_ctrl = DEVICE_SPECIFIC,
|
||||
- .size_of_priv = sizeof(struct s6x0_state),
|
||||
+ .size_of_priv = sizeof(struct dw2102_state),
|
||||
.firmware = S630_FIRMWARE,
|
||||
.no_reconnect = 1,
|
||||
|
||||
@@ -1950,7 +2078,7 @@
|
||||
static struct dvb_usb_device_properties su3000_properties = {
|
||||
.caps = DVB_USB_IS_AN_I2C_ADAPTER,
|
||||
.usb_ctrl = DEVICE_SPECIFIC,
|
||||
- .size_of_priv = sizeof(struct su3000_state),
|
||||
+ .size_of_priv = sizeof(struct dw2102_state),
|
||||
.power_ctrl = su3000_power_ctrl,
|
||||
.num_adapters = 1,
|
||||
.identify_state = su3000_identify_state,
|
||||
@@ -2015,7 +2143,7 @@
|
||||
static struct dvb_usb_device_properties t220_properties = {
|
||||
.caps = DVB_USB_IS_AN_I2C_ADAPTER,
|
||||
.usb_ctrl = DEVICE_SPECIFIC,
|
||||
- .size_of_priv = sizeof(struct su3000_state),
|
||||
+ .size_of_priv = sizeof(struct dw2102_state),
|
||||
.power_ctrl = su3000_power_ctrl,
|
||||
.num_adapters = 1,
|
||||
.identify_state = su3000_identify_state,
|
||||
@@ -2061,6 +2189,55 @@
|
||||
}
|
||||
};
|
||||
|
||||
+static struct dvb_usb_device_properties tt_s2_4600_properties = {
|
||||
+ .caps = DVB_USB_IS_AN_I2C_ADAPTER,
|
||||
+ .usb_ctrl = DEVICE_SPECIFIC,
|
||||
+ .size_of_priv = sizeof(struct dw2102_state),
|
||||
+ .power_ctrl = su3000_power_ctrl,
|
||||
+ .num_adapters = 1,
|
||||
+ .identify_state = su3000_identify_state,
|
||||
+ .i2c_algo = &su3000_i2c_algo,
|
||||
+
|
||||
+ .rc.core = {
|
||||
+ .rc_interval = 250,
|
||||
+ .rc_codes = RC_MAP_TT_1500,
|
||||
+ .module_name = "dw2102",
|
||||
+ .allowed_protos = RC_BIT_RC5,
|
||||
+ .rc_query = su3000_rc_query,
|
||||
+ },
|
||||
+
|
||||
+ .read_mac_address = su3000_read_mac_address,
|
||||
+
|
||||
+ .generic_bulk_ctrl_endpoint = 0x01,
|
||||
+
|
||||
+ .adapter = {
|
||||
+ {
|
||||
+ .num_frontends = 1,
|
||||
+ .fe = {{
|
||||
+ .streaming_ctrl = su3000_streaming_ctrl,
|
||||
+ .frontend_attach = tt_s2_4600_frontend_attach,
|
||||
+ .stream = {
|
||||
+ .type = USB_BULK,
|
||||
+ .count = 8,
|
||||
+ .endpoint = 0x82,
|
||||
+ .u = {
|
||||
+ .bulk = {
|
||||
+ .buffersize = 4096,
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ } },
|
||||
+ }
|
||||
+ },
|
||||
+ .num_device_descs = 1,
|
||||
+ .devices = {
|
||||
+ { "TechnoTrend TT-connect S2-4600",
|
||||
+ { &dw2102_table[TECHNOTREND_S2_4600], NULL },
|
||||
+ { NULL },
|
||||
+ },
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
static int dw2102_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
@@ -2135,16 +2312,34 @@
|
||||
0 == dvb_usb_device_init(intf, &su3000_properties,
|
||||
THIS_MODULE, NULL, adapter_nr) ||
|
||||
0 == dvb_usb_device_init(intf, &t220_properties,
|
||||
+ THIS_MODULE, NULL, adapter_nr) ||
|
||||
+ 0 == dvb_usb_device_init(intf, &tt_s2_4600_properties,
|
||||
THIS_MODULE, NULL, adapter_nr))
|
||||
return 0;
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
+static void dw2102_disconnect(struct usb_interface *intf)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = usb_get_intfdata(intf);
|
||||
+ struct dw2102_state *st = (struct dw2102_state *)d->priv;
|
||||
+ struct i2c_client *client;
|
||||
+
|
||||
+ /* remove I2C client for tuner */
|
||||
+ client = st->i2c_client_tuner;
|
||||
+ if (client) {
|
||||
+ module_put(client->dev.driver->owner);
|
||||
+ i2c_unregister_device(client);
|
||||
+ }
|
||||
+
|
||||
+ dvb_usb_device_exit(intf);
|
||||
+}
|
||||
+
|
||||
static struct usb_driver dw2102_driver = {
|
||||
.name = "dw2102",
|
||||
.probe = dw2102_probe,
|
||||
- .disconnect = dvb_usb_device_exit,
|
||||
+ .disconnect = dw2102_disconnect,
|
||||
.id_table = dw2102_table,
|
||||
};
|
||||
|
||||
@@ -2155,7 +2350,8 @@
|
||||
" DVB-C 3101 USB2.0,"
|
||||
" TeVii S600, S630, S650, S660, S480, S421, S632"
|
||||
" Prof 1100, 7500 USB2.0,"
|
||||
- " Geniatech SU3000, T220 devices");
|
||||
+ " Geniatech SU3000, T220,"
|
||||
+ " TechnoTrend S2-4600 devices");
|
||||
MODULE_VERSION("0.1");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE(DW2101_FIRMWARE);
|
||||
diff -urN a/drivers/media/usb/dvb-usb/Kconfig b/drivers/media/usb/dvb-usb/Kconfig
|
||||
--- a/drivers/media/usb/dvb-usb/Kconfig 2015-04-29 11:22:30.000000000 +0300
|
||||
+++ b/drivers/media/usb/dvb-usb/Kconfig 2015-05-05 20:35:29.392417272 +0300
|
||||
@@ -278,9 +278,11 @@
|
||||
select DVB_STV6110 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_STV0900 if MEDIA_SUBDRV_AUTOSELECT
|
||||
select DVB_M88RS2000 if MEDIA_SUBDRV_AUTOSELECT
|
||||
+ select DVB_M88DS3103 if MEDIA_SUBDRV_AUTOSELECT
|
||||
+ select MEDIA_TUNER_TS2022 if MEDIA_SUBDRV_AUTOSELECT
|
||||
help
|
||||
- Say Y here to support the DvbWorld, TeVii, Prof DVB-S/S2 USB2.0
|
||||
- receivers.
|
||||
+ Say Y here to support the DvbWorld, TeVii, Prof, TechnoTrend
|
||||
+ DVB-S/S2 USB2.0 receivers.
|
||||
|
||||
config DVB_USB_CINERGY_T2
|
||||
tristate "Terratec CinergyT2/qanu USB 2.0 DVB-T receiver"
|
File diff suppressed because it is too large
Load Diff
@ -1,11 +0,0 @@
|
||||
diff -Naur linux-3.10.16/drivers/staging/rtl8712/usb_intf.c linux-3.10.16.patch/drivers/staging/rtl8712/usb_intf.c
|
||||
--- linux-3.10.16/drivers/staging/rtl8712/usb_intf.c 2013-10-14 01:08:56.000000000 +0200
|
||||
+++ linux-3.10.16.patch/drivers/staging/rtl8712/usb_intf.c 2013-10-16 13:27:44.032951265 +0200
|
||||
@@ -92,6 +92,7 @@
|
||||
{USB_DEVICE(0x0DF6, 0x005B)},
|
||||
{USB_DEVICE(0x0DF6, 0x005D)},
|
||||
{USB_DEVICE(0x0DF6, 0x0063)},
|
||||
+ {USB_DEVICE(0x0DF6, 0x006C)},
|
||||
/* Sweex */
|
||||
{USB_DEVICE(0x177F, 0x0154)},
|
||||
/* Thinkware */
|
File diff suppressed because it is too large
Load Diff
@ -1,83 +0,0 @@
|
||||
From 56ca3555ed8e0f5fd741477fd23497f5455c3f53 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Saraev <stefan@saraev.ca>
|
||||
Date: Tue, 22 Apr 2014 15:58:50 +0300
|
||||
Subject: [PATCH] ALSA: hda - Avoid outputting HDMI audio before prepare() and after close()
|
||||
|
||||
adapted to 3.15
|
||||
|
||||
From a6024295fd3290a8c9c5519a03316081ee82378a Mon Sep 17 00:00:00 2001
|
||||
From: Anssi Hannula <anssi.hannula@iki.fi>
|
||||
Date: Sat, 16 Feb 2013 17:42:46 +0200
|
||||
Subject: [PATCH] ALSA: hda - Avoid outputting HDMI audio before prepare() and
|
||||
after close()
|
||||
|
||||
Some HDMI codecs (at least NVIDIA 0x10de000b:0x10de0101:0x100100) start
|
||||
transmitting an empty audio stream as soon as PIN_OUT and AC_DIG1_ENABLE
|
||||
are enabled.
|
||||
|
||||
Since commit 6169b673618bf0b2518ce413b54925782a603f06 ("ALSA: hda -
|
||||
Always turn on pins for HDMI/DP") this happens at first open() time, and
|
||||
will continue even after close().
|
||||
|
||||
Additionally, some codecs (at least Intel PantherPoint HDMI) currently
|
||||
continue transmitting HDMI audio even after close() in case some actual
|
||||
audio was output after open() (this happens regardless of PIN_OUT).
|
||||
|
||||
Empty HDMI audio transmission when not intended has the effect that a
|
||||
possible HDMI audio sink/receiver may prefer the empty HDMI audio stream
|
||||
over an actual audio stream on its S/PDIF inputs.
|
||||
|
||||
To avoid the issue before first prepare(), set stream format to 0 on
|
||||
codec initialization. 0 is not a valid format value for HDMI and will
|
||||
prevent the audio stream from being output.
|
||||
|
||||
Additionally, at close() time, make sure that the stream is cleaned up.
|
||||
This will ensure that the format is reset to 0 at that time, preventing
|
||||
audio from being output in that case.
|
||||
|
||||
Thanks to OpenELEC developers and users for their help in investigating
|
||||
this issue on the affected NVIDIA "ION2" hardware. Testing of the final
|
||||
version on NVIDIA ION2 was done by OpenELEC user "MrXIII". Testing on
|
||||
Intel PantherPoint was done by myself.
|
||||
|
||||
Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
|
||||
Cc: stable@vger.kernel.org
|
||||
---
|
||||
sound/pci/hda/patch_hdmi.c | 14 ++++++++++++++
|
||||
1 files changed, 14 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
|
||||
index 0cb5b89..e92f24f 100644
|
||||
--- a/sound/pci/hda/patch_hdmi.c
|
||||
+++ b/sound/pci/hda/patch_hdmi.c
|
||||
@@ -1698,6 +1698,14 @@ static int hdmi_add_cvt(struct hda_codec *codec, hda_nid_t cvt_nid)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
+ /*
|
||||
+ * Some HDMI codecs (at least NVIDIA 0x10de000b:0x10de0101:0x100100)
|
||||
+ * start transmitting an empty audio stream as soon as PIN_OUT and
|
||||
+ * AC_DIG1_ENABLE are enabled, which happens at open() time.
|
||||
+ * To avoid that, set format to 0, which is not valid for HDMI.
|
||||
+ */
|
||||
+ snd_hda_codec_write(codec, cvt_nid, 0, AC_VERB_SET_STREAM_FORMAT, 0);
|
||||
+
|
||||
if (spec->num_cvts < ARRAY_SIZE(spec->cvt_nids))
|
||||
spec->cvt_nids[spec->num_cvts] = cvt_nid;
|
||||
spec->num_cvts++;
|
||||
@@ -1823,6 +1831,12 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo,
|
||||
int pinctl;
|
||||
|
||||
if (hinfo->nid) {
|
||||
+ /*
|
||||
+ * Make sure no empty audio is output after this point by
|
||||
+ * setting stream format to 0, which is not valid for HDMI.
|
||||
+ */
|
||||
+ __snd_hda_codec_cleanup_stream(codec, hinfo->nid, 1);
|
||||
+
|
||||
cvt_idx = cvt_nid_to_cvt_index(codec, hinfo->nid);
|
||||
if (snd_BUG_ON(cvt_idx < 0))
|
||||
return -EINVAL;
|
||||
--
|
||||
1.7.2.5
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,30 +0,0 @@
|
||||
From 89973c56cefd075a0209d63f87ecfbbe7245d100 Mon Sep 17 00:00:00 2001
|
||||
From: fritsch <Peter.Fruehberger@gmail.com>
|
||||
Date: Fri, 6 Mar 2015 17:26:41 +0100
|
||||
Subject: [PATCH] i915_irq: enable legacy turbo
|
||||
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_irq.c | 7 +------
|
||||
1 file changed, 1 insertion(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
|
||||
index b051a23..5cceebf 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_irq.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_irq.c
|
||||
@@ -4340,12 +4340,7 @@ void intel_irq_init(struct drm_i915_private *dev_priv)
|
||||
INIT_WORK(&dev_priv->rps.work, gen6_pm_rps_work);
|
||||
INIT_WORK(&dev_priv->l3_parity.error_work, ivybridge_parity_work);
|
||||
|
||||
- /* Let's track the enabled rps events */
|
||||
- if (IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
|
||||
- /* WaGsvRC0ResidencyMethod:vlv */
|
||||
- dev_priv->pm_rps_events = GEN6_PM_RP_UP_EI_EXPIRED;
|
||||
- else
|
||||
- dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS;
|
||||
+ dev_priv->pm_rps_events = GEN6_PM_RPS_EVENTS;
|
||||
|
||||
setup_timer(&dev_priv->gpu_error.hangcheck_timer,
|
||||
i915_hangcheck_elapsed,
|
||||
--
|
||||
1.9.1
|
||||
|
@ -1,25 +0,0 @@
|
||||
From c314d9af9d774c052bea324e1a140ccdba0ca070 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Saraev <stefan@saraev.ca>
|
||||
Date: Tue, 8 Apr 2014 14:02:53 +0300
|
||||
Subject: [PATCH] pm: disable async suspend/resume by default
|
||||
|
||||
---
|
||||
kernel/power/main.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/kernel/power/main.c b/kernel/power/main.c
|
||||
index 1d1bf63..361db93 100644
|
||||
--- a/kernel/power/main.c
|
||||
+++ b/kernel/power/main.c
|
||||
@@ -46,7 +46,7 @@ int pm_notifier_call_chain(unsigned long val)
|
||||
}
|
||||
|
||||
/* If set, devices may be suspended and resumed asynchronously. */
|
||||
-int pm_async_enabled = 1;
|
||||
+int pm_async_enabled = 0;
|
||||
|
||||
static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
char *buf)
|
||||
--
|
||||
1.7.2.5
|
||||
|
@ -1,26 +0,0 @@
|
||||
From 57f0b99ca9a2db948fa70988c447553683368be1 Mon Sep 17 00:00:00 2001
|
||||
From: Nell Hardcastle <nell@dev-nell.com>
|
||||
Date: Thu, 29 May 2014 22:06:50 -0700
|
||||
Subject: [PATCH] eMMC: Don't initialize partitions on RPMB flagged areas.
|
||||
|
||||
Prevents a lot of pointless hanging at boot on some devices.
|
||||
---
|
||||
drivers/mmc/card/block.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
|
||||
index 4409d79..56df902 100644
|
||||
--- a/drivers/mmc/card/block.c
|
||||
+++ b/drivers/mmc/card/block.c
|
||||
@@ -2254,7 +2254,7 @@ static int mmc_blk_alloc_parts(struct mmc_card *card, struct mmc_blk_data *md)
|
||||
return 0;
|
||||
|
||||
for (idx = 0; idx < card->nr_parts; idx++) {
|
||||
- if (card->part[idx].size) {
|
||||
+ if (card->part[idx].size && !(card->part[idx].area_type & MMC_BLK_DATA_AREA_RPMB)) {
|
||||
ret = mmc_blk_alloc_part(card, md,
|
||||
card->part[idx].part_cfg,
|
||||
card->part[idx].size >> 9,
|
||||
--
|
||||
1.7.10.4
|
||||
|
@ -1,269 +0,0 @@
|
||||
From 37dfde26fbb38bdfb1f3b7d72444132f021020f5 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
Date: Mon, 23 Feb 2015 10:11:49 -0500
|
||||
Subject: [PATCH 1/2] drm/radeon: add an output_csc property
|
||||
|
||||
This adds the drm property for output csc (e.g.,
|
||||
transform of output display colorspace). Currently
|
||||
only common ones (TV RGB, BT.601, BT.709) are supported,
|
||||
but bypass and tv rgb are really the only useful ones at
|
||||
the moment. Additionally we could expose a user adjustable
|
||||
matrix in the future.
|
||||
|
||||
This commit just adds the property. The hw support will
|
||||
be added in subsequent patches.
|
||||
|
||||
bug:
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=83226
|
||||
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
---
|
||||
drivers/gpu/drm/radeon/radeon_display.c | 13 +++++++++++++
|
||||
drivers/gpu/drm/radeon/radeon_mode.h | 9 +++++++++
|
||||
2 files changed, 22 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
|
||||
index 1021169..b6ed51a 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_display.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_display.c
|
||||
@@ -1379,6 +1379,13 @@ static struct drm_prop_enum_list radeon_dither_enum_list[] =
|
||||
{ RADEON_FMT_DITHER_ENABLE, "on" },
|
||||
};
|
||||
|
||||
+static struct drm_prop_enum_list radeon_output_csc_enum_list[] =
|
||||
+{ { RADEON_OUTPUT_CSC_BYPASS, "bypass" },
|
||||
+ { RADEON_OUTPUT_CSC_TVRGB, "tvrgb" },
|
||||
+ { RADEON_OUTPUT_CSC_YCBCR601, "ycbcr601" },
|
||||
+ { RADEON_OUTPUT_CSC_YCBCR709, "ycbcr709" },
|
||||
+};
|
||||
+
|
||||
static int radeon_modeset_create_props(struct radeon_device *rdev)
|
||||
{
|
||||
int sz;
|
||||
@@ -1441,6 +1448,12 @@ static int radeon_modeset_create_props(struct radeon_device *rdev)
|
||||
"dither",
|
||||
radeon_dither_enum_list, sz);
|
||||
|
||||
+ sz = ARRAY_SIZE(radeon_output_csc_enum_list);
|
||||
+ rdev->mode_info.output_csc_property =
|
||||
+ drm_property_create_enum(rdev->ddev, 0,
|
||||
+ "output_csc",
|
||||
+ radeon_output_csc_enum_list, sz);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
|
||||
index f78087a..49f4c9d 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_mode.h
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
|
||||
@@ -85,6 +85,13 @@ enum radeon_hpd_id {
|
||||
RADEON_HPD_NONE = 0xff,
|
||||
};
|
||||
|
||||
+enum radeon_output_csc {
|
||||
+ RADEON_OUTPUT_CSC_BYPASS = 0,
|
||||
+ RADEON_OUTPUT_CSC_TVRGB = 1,
|
||||
+ RADEON_OUTPUT_CSC_YCBCR601 = 2,
|
||||
+ RADEON_OUTPUT_CSC_YCBCR709 = 3,
|
||||
+};
|
||||
+
|
||||
#define RADEON_MAX_I2C_BUS 16
|
||||
|
||||
/* radeon gpio-based i2c
|
||||
@@ -255,6 +262,8 @@ struct radeon_mode_info {
|
||||
struct drm_property *audio_property;
|
||||
/* FMT dithering */
|
||||
struct drm_property *dither_property;
|
||||
+ /* Output CSC */
|
||||
+ struct drm_property *output_csc_property;
|
||||
/* hardcoded DFP edid from BIOS */
|
||||
struct edid *bios_hardcoded_edid;
|
||||
int bios_hardcoded_edid_size;
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
From 2ed0abe27e4358d39b5c3fc2800478c5cafa59d8 Mon Sep 17 00:00:00 2001
|
||||
From: Alex Deucher <alexander.deucher@amd.com>
|
||||
Date: Mon, 23 Feb 2015 10:59:36 -0500
|
||||
Subject: [PATCH 2/2] drm/radeon: implement output csc property for DCE5+
|
||||
|
||||
Implement the property for DCE5+ asics. Older asics
|
||||
require a slightly more complex process.
|
||||
|
||||
bug:
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=83226
|
||||
|
||||
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
|
||||
---
|
||||
drivers/gpu/drm/radeon/atombios_crtc.c | 6 ++++
|
||||
drivers/gpu/drm/radeon/radeon_connectors.c | 52 ++++++++++++++++++++++++++++++
|
||||
drivers/gpu/drm/radeon/radeon_display.c | 2 +-
|
||||
drivers/gpu/drm/radeon/radeon_mode.h | 2 ++
|
||||
4 files changed, 61 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
|
||||
index ed644a4..7d827cb 100644
|
||||
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
|
||||
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
|
||||
@@ -2066,6 +2066,12 @@ static bool atombios_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||
radeon_crtc->connector = NULL;
|
||||
return false;
|
||||
}
|
||||
+ if (radeon_crtc->encoder) {
|
||||
+ struct radeon_encoder *radeon_encoder =
|
||||
+ to_radeon_encoder(radeon_crtc->encoder);
|
||||
+
|
||||
+ radeon_crtc->output_csc = radeon_encoder->output_csc;
|
||||
+ }
|
||||
if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
|
||||
return false;
|
||||
if (!atombios_crtc_prepare_pll(crtc, adjusted_mode))
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||
index 27def67..0a371a1 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
|
||||
@@ -725,6 +725,30 @@ static int radeon_connector_set_property(struct drm_connector *connector, struct
|
||||
radeon_property_change_mode(&radeon_encoder->base);
|
||||
}
|
||||
|
||||
+ if (property == rdev->mode_info.output_csc_property) {
|
||||
+ if (connector->encoder)
|
||||
+ radeon_encoder = to_radeon_encoder(connector->encoder);
|
||||
+ else {
|
||||
+ struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
|
||||
+ radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
|
||||
+ }
|
||||
+
|
||||
+ if (radeon_encoder->output_csc == val)
|
||||
+ return 0;
|
||||
+
|
||||
+ radeon_encoder->output_csc = val;
|
||||
+
|
||||
+ if (connector->encoder->crtc) {
|
||||
+ struct drm_crtc *crtc = connector->encoder->crtc;
|
||||
+ struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
|
||||
+ struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
+
|
||||
+ radeon_crtc->output_csc = radeon_encoder->output_csc;
|
||||
+
|
||||
+ (*crtc_funcs->load_lut)(crtc);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1872,6 +1896,10 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||
drm_object_attach_property(&radeon_connector->base.base,
|
||||
dev->mode_config.scaling_mode_property,
|
||||
DRM_MODE_SCALE_NONE);
|
||||
+ if (ASIC_IS_DCE5(rdev))
|
||||
+ drm_object_attach_property(&radeon_connector->base.base,
|
||||
+ rdev->mode_info.output_csc_property,
|
||||
+ RADEON_OUTPUT_CSC_BYPASS);
|
||||
break;
|
||||
case DRM_MODE_CONNECTOR_DVII:
|
||||
case DRM_MODE_CONNECTOR_DVID:
|
||||
@@ -1904,6 +1932,10 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||
drm_object_attach_property(&radeon_connector->base.base,
|
||||
rdev->mode_info.audio_property,
|
||||
RADEON_AUDIO_AUTO);
|
||||
+ if (ASIC_IS_DCE5(rdev))
|
||||
+ drm_object_attach_property(&radeon_connector->base.base,
|
||||
+ rdev->mode_info.output_csc_property,
|
||||
+ RADEON_OUTPUT_CSC_BYPASS);
|
||||
|
||||
subpixel_order = SubPixelHorizontalRGB;
|
||||
connector->interlace_allowed = true;
|
||||
@@ -1950,6 +1982,10 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||
drm_object_attach_property(&radeon_connector->base.base,
|
||||
dev->mode_config.scaling_mode_property,
|
||||
DRM_MODE_SCALE_NONE);
|
||||
+ if (ASIC_IS_DCE5(rdev))
|
||||
+ drm_object_attach_property(&radeon_connector->base.base,
|
||||
+ rdev->mode_info.output_csc_property,
|
||||
+ RADEON_OUTPUT_CSC_BYPASS);
|
||||
/* no HPD on analog connectors */
|
||||
radeon_connector->hpd.hpd = RADEON_HPD_NONE;
|
||||
connector->polled = DRM_CONNECTOR_POLL_CONNECT;
|
||||
@@ -1972,6 +2008,10 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||
drm_object_attach_property(&radeon_connector->base.base,
|
||||
dev->mode_config.scaling_mode_property,
|
||||
DRM_MODE_SCALE_NONE);
|
||||
+ if (ASIC_IS_DCE5(rdev))
|
||||
+ drm_object_attach_property(&radeon_connector->base.base,
|
||||
+ rdev->mode_info.output_csc_property,
|
||||
+ RADEON_OUTPUT_CSC_BYPASS);
|
||||
/* no HPD on analog connectors */
|
||||
radeon_connector->hpd.hpd = RADEON_HPD_NONE;
|
||||
connector->interlace_allowed = true;
|
||||
@@ -2023,6 +2063,10 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||
rdev->mode_info.load_detect_property,
|
||||
1);
|
||||
}
|
||||
+ if (ASIC_IS_DCE5(rdev))
|
||||
+ drm_object_attach_property(&radeon_connector->base.base,
|
||||
+ rdev->mode_info.output_csc_property,
|
||||
+ RADEON_OUTPUT_CSC_BYPASS);
|
||||
connector->interlace_allowed = true;
|
||||
if (connector_type == DRM_MODE_CONNECTOR_DVII)
|
||||
connector->doublescan_allowed = true;
|
||||
@@ -2068,6 +2112,10 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||
rdev->mode_info.audio_property,
|
||||
RADEON_AUDIO_AUTO);
|
||||
}
|
||||
+ if (ASIC_IS_DCE5(rdev))
|
||||
+ drm_object_attach_property(&radeon_connector->base.base,
|
||||
+ rdev->mode_info.output_csc_property,
|
||||
+ RADEON_OUTPUT_CSC_BYPASS);
|
||||
subpixel_order = SubPixelHorizontalRGB;
|
||||
connector->interlace_allowed = true;
|
||||
if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
|
||||
@@ -2116,6 +2164,10 @@ radeon_add_atom_connector(struct drm_device *dev,
|
||||
rdev->mode_info.audio_property,
|
||||
RADEON_AUDIO_AUTO);
|
||||
}
|
||||
+ if (ASIC_IS_DCE5(rdev))
|
||||
+ drm_object_attach_property(&radeon_connector->base.base,
|
||||
+ rdev->mode_info.output_csc_property,
|
||||
+ RADEON_OUTPUT_CSC_BYPASS);
|
||||
connector->interlace_allowed = true;
|
||||
/* in theory with a DP to VGA converter... */
|
||||
connector->doublescan_allowed = false;
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
|
||||
index b6ed51a..4d26443 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_display.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_display.c
|
||||
@@ -154,7 +154,7 @@ static void dce5_crtc_load_lut(struct drm_crtc *crtc)
|
||||
(NI_GRPH_REGAMMA_MODE(NI_REGAMMA_BYPASS) |
|
||||
NI_OVL_REGAMMA_MODE(NI_REGAMMA_BYPASS)));
|
||||
WREG32(NI_OUTPUT_CSC_CONTROL + radeon_crtc->crtc_offset,
|
||||
- (NI_OUTPUT_CSC_GRPH_MODE(NI_OUTPUT_CSC_BYPASS) |
|
||||
+ (NI_OUTPUT_CSC_GRPH_MODE(radeon_crtc->output_csc) |
|
||||
NI_OUTPUT_CSC_OVL_MODE(NI_OUTPUT_CSC_BYPASS)));
|
||||
/* XXX match this to the depth of the crtc fmt block, move to modeset? */
|
||||
WREG32(0x6940 + radeon_crtc->crtc_offset, 0);
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
|
||||
index 49f4c9d..60043bf 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_mode.h
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
|
||||
@@ -366,6 +366,7 @@ struct radeon_crtc {
|
||||
u32 wm_low;
|
||||
u32 wm_high;
|
||||
struct drm_display_mode hw_mode;
|
||||
+ enum radeon_output_csc output_csc;
|
||||
};
|
||||
|
||||
struct radeon_encoder_primary_dac {
|
||||
@@ -459,6 +460,7 @@ struct radeon_encoder {
|
||||
bool is_ext_encoder;
|
||||
u16 caps;
|
||||
struct radeon_audio_funcs *audio;
|
||||
+ enum radeon_output_csc output_csc;
|
||||
};
|
||||
|
||||
struct radeon_connector_atom_dig {
|
||||
--
|
||||
1.8.3.1
|
||||
|
Loading…
x
Reference in New Issue
Block a user