mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-29 13:46:49 +00:00
linux: remove unneeded patches for linux-3.2
Signed-off-by: Stephan Raue <stephan@openelec.tv> projects/RPi/linux: update kernel config Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
a215eaba8b
commit
853eff563d
@ -1,12 +0,0 @@
|
||||
diff -Naur linux-2.6.39-rc5/drivers/gpu/drm/i915/i915_drv.c linux-2.6.39-rc5.patch/drivers/gpu/drm/i915/i915_drv.c
|
||||
--- linux-2.6.39-rc5/drivers/gpu/drm/i915/i915_drv.c 2011-04-27 05:48:50.000000000 +0200
|
||||
+++ linux-2.6.39-rc5.patch/drivers/gpu/drm/i915/i915_drv.c 2011-04-29 02:51:28.773622809 +0200
|
||||
@@ -760,7 +760,7 @@
|
||||
static int __init i915_init(void)
|
||||
{
|
||||
if (!intel_agp_enabled) {
|
||||
- DRM_ERROR("drm/i915 can't work without intel_agp module!\n");
|
||||
+ DRM_INFO("drm/i915 can't work without intel_agp module!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -1,358 +0,0 @@
|
||||
diff -Naur linux-3.1.2/drivers/gpu/drm/drm_edid.c linux-3.1.2.patch/drivers/gpu/drm/drm_edid.c
|
||||
--- linux-3.1.2/drivers/gpu/drm/drm_edid.c 2011-11-21 23:47:46.000000000 +0100
|
||||
+++ linux-3.1.2.patch/drivers/gpu/drm/drm_edid.c 2011-11-23 00:35:54.444938016 +0100
|
||||
@@ -1318,6 +1318,7 @@
|
||||
|
||||
#define HDMI_IDENTIFIER 0x000C03
|
||||
#define AUDIO_BLOCK 0x01
|
||||
+#define VIDEO_BLOCK 0x02
|
||||
#define VENDOR_BLOCK 0x03
|
||||
#define EDID_BASIC_AUDIO (1 << 6)
|
||||
|
||||
@@ -1347,6 +1348,47 @@
|
||||
}
|
||||
EXPORT_SYMBOL(drm_find_cea_extension);
|
||||
|
||||
+static int
|
||||
+do_cea_modes (struct drm_connector *connector, u8 *db, u8 len)
|
||||
+{
|
||||
+ struct drm_device *dev = connector->dev;
|
||||
+ u8 * mode, cea_mode;
|
||||
+ int modes = 0;
|
||||
+
|
||||
+ for (mode = db; mode < db + len; mode++) {
|
||||
+ cea_mode = (*mode & 127) - 1; /* CEA modes are numbered 1..127 */
|
||||
+ if (cea_mode < drm_num_cea_modes) {
|
||||
+ struct drm_display_mode *newmode;
|
||||
+ newmode = drm_mode_duplicate(dev,
|
||||
+ &edid_cea_modes[cea_mode]);
|
||||
+ if (newmode) {
|
||||
+ drm_mode_probed_add(connector, newmode);
|
||||
+ modes++;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return modes;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+add_cea_modes(struct drm_connector *connector, struct edid *edid)
|
||||
+{
|
||||
+ u8 * cea = drm_find_cea_extension(edid);
|
||||
+ u8 * db, dbl;
|
||||
+ int modes = 0;
|
||||
+
|
||||
+ if (cea && cea[1] >= 3) {
|
||||
+ for (db = cea + 4; db < cea + cea[2]; db += dbl + 1) {
|
||||
+ dbl = db[0] & 0x1f;
|
||||
+ if (((db[0] & 0xe0) >> 5) == VIDEO_BLOCK)
|
||||
+ modes += do_cea_modes (connector, db+1, dbl);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return modes;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* drm_detect_hdmi_monitor - detect whether monitor is hdmi.
|
||||
* @edid: monitor EDID information
|
||||
@@ -1550,6 +1592,7 @@
|
||||
num_modes += add_standard_modes(connector, edid);
|
||||
num_modes += add_established_modes(connector, edid);
|
||||
num_modes += add_inferred_modes(connector, edid);
|
||||
+ num_modes += add_cea_modes(connector, edid);
|
||||
|
||||
if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
|
||||
edid_fixup_preferred(connector, quirks);
|
||||
diff -Naur linux-3.1.2/drivers/gpu/drm/drm_edid_modes.h linux-3.1.2.patch/drivers/gpu/drm/drm_edid_modes.h
|
||||
--- linux-3.1.2/drivers/gpu/drm/drm_edid_modes.h 2011-11-21 23:47:46.000000000 +0100
|
||||
+++ linux-3.1.2.patch/drivers/gpu/drm/drm_edid_modes.h 2011-11-23 00:31:42.218643364 +0100
|
||||
@@ -378,3 +378,287 @@
|
||||
{ 1920, 1440, 75, 0 },
|
||||
};
|
||||
static const int num_est3_modes = sizeof(est3_modes) / sizeof(est3_modes[0]);
|
||||
+
|
||||
+/*
|
||||
+ * Probably taken from CEA-861 spec.
|
||||
+ * This table is converted from xorg's hw/xfree86/modes/xf86EdidModes.c.
|
||||
+ */
|
||||
+static const struct drm_display_mode edid_cea_modes[] = {
|
||||
+ /* 640x480@60Hz */
|
||||
+ { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
|
||||
+ 752, 800, 0, 480, 490, 492, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 720x480@60Hz */
|
||||
+ { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
|
||||
+ 798, 858, 0, 480, 489, 495, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 720x480@60Hz */
|
||||
+ { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 27000, 720, 736,
|
||||
+ 798, 858, 0, 480, 489, 495, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1280x720@60Hz */
|
||||
+ { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1390,
|
||||
+ 1430, 1650, 0, 720, 725, 730, 750, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 1920x1080i@60Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
|
||||
+ 2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1440x480i@60Hz */
|
||||
+ { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
|
||||
+ 1602, 1716, 0, 480, 488, 494, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1440x480i@60Hz */
|
||||
+ { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
|
||||
+ 1602, 1716, 0, 480, 488, 494, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1440x240@60Hz */
|
||||
+ { DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
|
||||
+ 1602, 1716, 0, 240, 244, 247, 262, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x240@60Hz */
|
||||
+ { DRM_MODE("1440x240", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1478,
|
||||
+ 1602, 1716, 0, 240, 244, 247, 262, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 2880x480i@60Hz */
|
||||
+ { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
|
||||
+ 3204, 3432, 0, 480, 488, 494, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 2880x480i@60Hz */
|
||||
+ { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
|
||||
+ 3204, 3432, 0, 480, 488, 494, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 2880x240@60Hz */
|
||||
+ { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
|
||||
+ 3204, 3432, 0, 240, 244, 247, 262, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 2880x240@60Hz */
|
||||
+ { DRM_MODE("2880x240", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2956,
|
||||
+ 3204, 3432, 0, 240, 244, 247, 262, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x480@60Hz */
|
||||
+ { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
|
||||
+ 1596, 1716, 0, 480, 489, 495, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x480@60Hz */
|
||||
+ { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1472,
|
||||
+ 1596, 1716, 0, 480, 489, 495, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1920x1080@60Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
|
||||
+ 2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 720x576@50Hz */
|
||||
+ { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
|
||||
+ 796, 864, 0, 576, 581, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 720x576@50Hz */
|
||||
+ { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 27000, 720, 732,
|
||||
+ 796, 864, 0, 576, 581, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1280x720@50Hz */
|
||||
+ { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 1720,
|
||||
+ 1760, 1980, 0, 720, 725, 730, 750, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 1920x1080i@50Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
|
||||
+ 2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1440x576i@50Hz */
|
||||
+ { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
|
||||
+ 1590, 1728, 0, 576, 580, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1440x576i@50Hz */
|
||||
+ { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
|
||||
+ 1590, 1728, 0, 576, 580, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1440x288@50Hz */
|
||||
+ { DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
|
||||
+ 1590, 1728, 0, 288, 290, 293, 312, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x288@50Hz */
|
||||
+ { DRM_MODE("1440x288", DRM_MODE_TYPE_DRIVER, 27000, 1440, 1464,
|
||||
+ 1590, 1728, 0, 288, 290, 293, 312, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 2880x576i@50Hz */
|
||||
+ { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
|
||||
+ 3180, 3456, 0, 576, 580, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 2880x576i@50Hz */
|
||||
+ { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
|
||||
+ 3180, 3456, 0, 576, 580, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 2880x288@50Hz */
|
||||
+ { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
|
||||
+ 3180, 3456, 0, 288, 290, 293, 312, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 2880x288@50Hz */
|
||||
+ { DRM_MODE("2880x288", DRM_MODE_TYPE_DRIVER, 54000, 2880, 2928,
|
||||
+ 3180, 3456, 0, 288, 290, 293, 312, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x576@50Hz */
|
||||
+ { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
|
||||
+ 1592, 1728, 0, 576, 581, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x576@50Hz */
|
||||
+ { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
|
||||
+ 1592, 1728, 0, 576, 581, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1920x1080@50Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
|
||||
+ 2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 1920x1080@24Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2558,
|
||||
+ 2602, 2750, 0, 1080, 1084, 1089, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 1920x1080@25Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2448,
|
||||
+ 2492, 2640, 0, 1080, 1084, 1089, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 1920x1080@30Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 74250, 1920, 2008,
|
||||
+ 2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 2880x480@60Hz */
|
||||
+ { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
|
||||
+ 3192, 3432, 0, 480, 489, 495, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 2880x480@60Hz */
|
||||
+ { DRM_MODE("2880x480", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2944,
|
||||
+ 3192, 3432, 0, 480, 489, 495, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 2880x576@50Hz */
|
||||
+ { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
|
||||
+ 3184, 3456, 0, 576, 581, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 2880x576@50Hz */
|
||||
+ { DRM_MODE("2880x576", DRM_MODE_TYPE_DRIVER, 108000, 2880, 2928,
|
||||
+ 3184, 3456, 0, 576, 581, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1920x1080i@50Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 72000, 1920, 1952,
|
||||
+ 2120, 2304, 0, 1080, 1126, 1136, 1250, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1920x1080i@100Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2448,
|
||||
+ 2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1280x720@100Hz */
|
||||
+ { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1720,
|
||||
+ 1760, 1980, 0, 720, 725, 730, 750, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 720x576@100Hz */
|
||||
+ { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
|
||||
+ 796, 864, 0, 576, 581, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 720x576@100Hz */
|
||||
+ { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 54000, 720, 732,
|
||||
+ 796, 864, 0, 576, 581, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x576i@100Hz */
|
||||
+ { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
|
||||
+ 1590, 1728, 0, 576, 580, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x576i@100Hz */
|
||||
+ { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1464,
|
||||
+ 1590, 1728, 0, 576, 580, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1920x1080i@120Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 148500, 1920, 2008,
|
||||
+ 2052, 2200, 0, 1080, 1084, 1094, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1280x720@120Hz */
|
||||
+ { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 148500, 1280, 1390,
|
||||
+ 1430, 1650, 0, 720, 725, 730, 750, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 720x480@120Hz */
|
||||
+ { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
|
||||
+ 798, 858, 0, 480, 489, 495, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 720x480@120Hz */
|
||||
+ { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 54000, 720, 736,
|
||||
+ 798, 858, 0, 480, 489, 495, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x480i@120Hz */
|
||||
+ { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478,
|
||||
+ 1602, 1716, 0, 480, 488, 494, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1440x480i@120Hz */
|
||||
+ { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 54000, 1440, 1478,
|
||||
+ 1602, 1716, 0, 480, 488, 494, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 720x576@200Hz */
|
||||
+ { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
|
||||
+ 796, 864, 0, 576, 581, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 720x576@200Hz */
|
||||
+ { DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 108000, 720, 732,
|
||||
+ 796, 864, 0, 576, 581, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x576i@200Hz */
|
||||
+ { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464,
|
||||
+ 1590, 1728, 0, 576, 580, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1440x576i@200Hz */
|
||||
+ { DRM_MODE("1440x576", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1464,
|
||||
+ 1590, 1728, 0, 576, 580, 586, 625, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 720x480@240Hz */
|
||||
+ { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
|
||||
+ 798, 858, 0, 480, 489, 495, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 720x480@240Hz */
|
||||
+ { DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 108000, 720, 736,
|
||||
+ 798, 858, 0, 480, 489, 495, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },
|
||||
+ /* 1440x480i@240 */
|
||||
+ { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478,
|
||||
+ 1602, 1716, 0, 480, 488, 494, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1440x480i@240 */
|
||||
+ { DRM_MODE("1440x480", DRM_MODE_TYPE_DRIVER, 108000, 1440, 1478,
|
||||
+ 1602, 1716, 0, 480, 488, 494, 525, 0,
|
||||
+ DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC |
|
||||
+ DRM_MODE_FLAG_INTERLACE) },
|
||||
+ /* 1280x720@24Hz */
|
||||
+ { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 59400, 1280, 3040,
|
||||
+ 3080, 3300, 0, 720, 725, 730, 750, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 1280x720@25Hz */
|
||||
+ { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3700,
|
||||
+ 3740, 3960, 0, 720, 725, 730, 750, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 1280x720@30Hz */
|
||||
+ { DRM_MODE("1280x720", DRM_MODE_TYPE_DRIVER, 74250, 1280, 3040,
|
||||
+ 3080, 3300, 0, 720, 725, 730, 750, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 1920x1080@120Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2008,
|
||||
+ 2052, 2200, 0, 1080, 1084, 1089, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+ /* 1920x1080@100Hz */
|
||||
+ { DRM_MODE("1920x1080", DRM_MODE_TYPE_DRIVER, 297000, 1920, 2448,
|
||||
+ 2492, 2640, 0, 1080, 1084, 1094, 1125, 0,
|
||||
+ DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
|
||||
+};
|
||||
+static const int drm_num_cea_modes =
|
||||
+ sizeof (edid_cea_modes) / sizeof (edid_cea_modes[0]);
|
@ -1,845 +0,0 @@
|
||||
diff -Naur linux-3.2.1/drivers/media/common/tuners/tda18212.c linux-3.2.1.patch/drivers/media/common/tuners/tda18212.c
|
||||
--- linux-3.2.1/drivers/media/common/tuners/tda18212.c 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/common/tuners/tda18212.c 2012-01-22 16:07:33.176264363 +0100
|
||||
@@ -25,6 +25,8 @@
|
||||
struct tda18212_priv {
|
||||
struct tda18212_config *cfg;
|
||||
struct i2c_adapter *i2c;
|
||||
+
|
||||
+ u32 if_frequency;
|
||||
};
|
||||
|
||||
#define dbg(fmt, arg...) \
|
||||
@@ -136,12 +138,24 @@
|
||||
int ret, i;
|
||||
u32 if_khz;
|
||||
u8 buf[9];
|
||||
+ #define DVBT_6 0
|
||||
+ #define DVBT_7 1
|
||||
+ #define DVBT_8 2
|
||||
+ #define DVBT2_6 3
|
||||
+ #define DVBT2_7 4
|
||||
+ #define DVBT2_8 5
|
||||
+ #define DVBC_6 6
|
||||
+ #define DVBC_8 7
|
||||
static const u8 bw_params[][3] = {
|
||||
- /* 0f 13 23 */
|
||||
- { 0xb3, 0x20, 0x03 }, /* DVB-T 6 MHz */
|
||||
- { 0xb3, 0x31, 0x01 }, /* DVB-T 7 MHz */
|
||||
- { 0xb3, 0x22, 0x01 }, /* DVB-T 8 MHz */
|
||||
- { 0x92, 0x53, 0x03 }, /* DVB-C */
|
||||
+ /* reg: 0f 13 23 */
|
||||
+ [DVBT_6] = { 0xb3, 0x20, 0x03 },
|
||||
+ [DVBT_7] = { 0xb3, 0x31, 0x01 },
|
||||
+ [DVBT_8] = { 0xb3, 0x22, 0x01 },
|
||||
+ [DVBT2_6] = { 0xbc, 0x20, 0x03 },
|
||||
+ [DVBT2_7] = { 0xbc, 0x72, 0x03 },
|
||||
+ [DVBT2_8] = { 0xbc, 0x22, 0x01 },
|
||||
+ [DVBC_6] = { 0x92, 0x50, 0x03 },
|
||||
+ [DVBC_8] = { 0x92, 0x53, 0x03 },
|
||||
};
|
||||
|
||||
dbg("delsys=%d RF=%d BW=%d\n",
|
||||
@@ -155,15 +169,34 @@
|
||||
switch (c->bandwidth_hz) {
|
||||
case 6000000:
|
||||
if_khz = priv->cfg->if_dvbt_6;
|
||||
- i = 0;
|
||||
+ i = DVBT_6;
|
||||
break;
|
||||
case 7000000:
|
||||
if_khz = priv->cfg->if_dvbt_7;
|
||||
- i = 1;
|
||||
+ i = DVBT_7;
|
||||
break;
|
||||
case 8000000:
|
||||
if_khz = priv->cfg->if_dvbt_8;
|
||||
- i = 2;
|
||||
+ i = DVBT_8;
|
||||
+ break;
|
||||
+ default:
|
||||
+ ret = -EINVAL;
|
||||
+ goto error;
|
||||
+ }
|
||||
+ break;
|
||||
+ case SYS_DVBT2:
|
||||
+ switch (c->bandwidth_hz) {
|
||||
+ case 6000000:
|
||||
+ if_khz = priv->cfg->if_dvbt2_6;
|
||||
+ i = DVBT2_6;
|
||||
+ break;
|
||||
+ case 7000000:
|
||||
+ if_khz = priv->cfg->if_dvbt2_7;
|
||||
+ i = DVBT2_7;
|
||||
+ break;
|
||||
+ case 8000000:
|
||||
+ if_khz = priv->cfg->if_dvbt2_8;
|
||||
+ i = DVBT2_8;
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
@@ -172,7 +205,7 @@
|
||||
break;
|
||||
case SYS_DVBC_ANNEX_AC:
|
||||
if_khz = priv->cfg->if_dvbc;
|
||||
- i = 3;
|
||||
+ i = DVBC_8;
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
@@ -194,7 +227,7 @@
|
||||
buf[0] = 0x02;
|
||||
buf[1] = bw_params[i][1];
|
||||
buf[2] = 0x03; /* default value */
|
||||
- buf[3] = if_khz / 50;
|
||||
+ buf[3] = DIV_ROUND_CLOSEST(if_khz, 50);
|
||||
buf[4] = ((c->frequency / 1000) >> 16) & 0xff;
|
||||
buf[5] = ((c->frequency / 1000) >> 8) & 0xff;
|
||||
buf[6] = ((c->frequency / 1000) >> 0) & 0xff;
|
||||
@@ -204,6 +237,9 @@
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
+ /* actual IF rounded as it is on register */
|
||||
+ priv->if_frequency = buf[3] * 50 * 1000;
|
||||
+
|
||||
exit:
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 0); /* close I2C-gate */
|
||||
@@ -215,6 +251,15 @@
|
||||
goto exit;
|
||||
}
|
||||
|
||||
+static int tda18212_get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
|
||||
+{
|
||||
+ struct tda18212_priv *priv = fe->tuner_priv;
|
||||
+
|
||||
+ *frequency = priv->if_frequency;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int tda18212_release(struct dvb_frontend *fe)
|
||||
{
|
||||
kfree(fe->tuner_priv);
|
||||
@@ -234,6 +279,7 @@
|
||||
.release = tda18212_release,
|
||||
|
||||
.set_params = tda18212_set_params,
|
||||
+ .get_if_frequency = tda18212_get_if_frequency,
|
||||
};
|
||||
|
||||
struct dvb_frontend *tda18212_attach(struct dvb_frontend *fe,
|
||||
diff -Naur linux-3.2.1/drivers/media/common/tuners/tda18212.h linux-3.2.1.patch/drivers/media/common/tuners/tda18212.h
|
||||
--- linux-3.2.1/drivers/media/common/tuners/tda18212.h 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/common/tuners/tda18212.h 2012-01-22 16:07:33.176264363 +0100
|
||||
@@ -29,6 +29,10 @@
|
||||
u16 if_dvbt_6;
|
||||
u16 if_dvbt_7;
|
||||
u16 if_dvbt_8;
|
||||
+ u16 if_dvbt2_5;
|
||||
+ u16 if_dvbt2_6;
|
||||
+ u16 if_dvbt2_7;
|
||||
+ u16 if_dvbt2_8;
|
||||
u16 if_dvbc;
|
||||
};
|
||||
|
||||
diff -Naur linux-3.2.1/drivers/media/dvb/dvb-usb/anysee.c linux-3.2.1.patch/drivers/media/dvb/dvb-usb/anysee.c
|
||||
--- linux-3.2.1/drivers/media/dvb/dvb-usb/anysee.c 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/dvb/dvb-usb/anysee.c 2012-01-22 16:09:04.983927302 +0100
|
||||
@@ -41,6 +41,7 @@
|
||||
#include "stv0900.h"
|
||||
#include "stv6110.h"
|
||||
#include "isl6423.h"
|
||||
+#include "cxd2820r.h"
|
||||
|
||||
/* debug */
|
||||
static int dvb_usb_anysee_debug;
|
||||
@@ -66,10 +67,12 @@
|
||||
if (mutex_lock_interruptible(&anysee_usb_mutex) < 0)
|
||||
return -EAGAIN;
|
||||
|
||||
+ deb_xfer(">>> ");
|
||||
+ debug_dump(buf, slen, deb_xfer);
|
||||
+
|
||||
/* We need receive one message more after dvb_usb_generic_rw due
|
||||
to weird transaction flow, which is 1 x send + 2 x receive. */
|
||||
ret = dvb_usb_generic_rw(d, buf, sizeof(buf), buf, sizeof(buf), 0);
|
||||
-
|
||||
if (!ret) {
|
||||
/* receive 2nd answer */
|
||||
ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
|
||||
@@ -79,7 +82,10 @@
|
||||
err("%s: recv bulk message failed: %d", __func__, ret);
|
||||
else {
|
||||
deb_xfer("<<< ");
|
||||
- debug_dump(buf, act_len, deb_xfer);
|
||||
+ debug_dump(buf, rlen, deb_xfer);
|
||||
+
|
||||
+ if (buf[63] != 0x4f)
|
||||
+ deb_info("%s: cmd failed\n", __func__);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,6 +135,29 @@
|
||||
return anysee_write_reg(d, reg, val);
|
||||
}
|
||||
|
||||
+/* read single register with mask */
|
||||
+static int anysee_rd_reg_mask(struct dvb_usb_device *d, u16 reg, u8 *val,
|
||||
+ u8 mask)
|
||||
+{
|
||||
+ int ret, i;
|
||||
+ u8 tmp;
|
||||
+
|
||||
+ ret = anysee_read_reg(d, reg, &tmp);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ tmp &= mask;
|
||||
+
|
||||
+ /* find position of the first bit */
|
||||
+ for (i = 0; i < 8; i++) {
|
||||
+ if ((mask >> i) & 0x01)
|
||||
+ break;
|
||||
+ }
|
||||
+ *val = tmp >> i;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int anysee_get_hw_info(struct dvb_usb_device *d, u8 *id)
|
||||
{
|
||||
u8 buf[] = {CMD_GET_HW_INFO};
|
||||
@@ -156,22 +185,6 @@
|
||||
return anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
|
||||
}
|
||||
|
||||
-static int anysee_init(struct dvb_usb_device *d)
|
||||
-{
|
||||
- int ret;
|
||||
- /* LED light */
|
||||
- ret = anysee_led_ctrl(d, 0x01, 0x03);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- /* enable IR */
|
||||
- ret = anysee_ir_ctrl(d, 1);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
/* I2C */
|
||||
static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
|
||||
int num)
|
||||
@@ -297,7 +310,7 @@
|
||||
.pll_m = 12,
|
||||
.pll_p = 3,
|
||||
.pll_n = 1,
|
||||
- .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_C,
|
||||
+ .output_mode = TDA10023_OUTPUT_MODE_PARALLEL_B,
|
||||
.deltaf = 0xba02,
|
||||
};
|
||||
|
||||
@@ -309,6 +322,17 @@
|
||||
.if_dvbc = 5000,
|
||||
};
|
||||
|
||||
+static struct tda18212_config anysee_tda18212_config2 = {
|
||||
+ .i2c_address = 0x60 /* (0xc0 >> 1) */,
|
||||
+ .if_dvbt_6 = 3550,
|
||||
+ .if_dvbt_7 = 3700,
|
||||
+ .if_dvbt_8 = 4150,
|
||||
+ .if_dvbt2_6 = 3250,
|
||||
+ .if_dvbt2_7 = 4000,
|
||||
+ .if_dvbt2_8 = 4000,
|
||||
+ .if_dvbc = 5000,
|
||||
+};
|
||||
+
|
||||
static struct cx24116_config anysee_cx24116_config = {
|
||||
.demod_address = (0xaa >> 1),
|
||||
.mpg_clk_pos_pol = 0x00,
|
||||
@@ -339,6 +363,18 @@
|
||||
.addr = (0x10 >> 1),
|
||||
};
|
||||
|
||||
+static struct cxd2820r_config anysee_cxd2820r_config = {
|
||||
+ .i2c_address = 0x6d, /* (0xda >> 1) */
|
||||
+ .ts_mode = 0x38,
|
||||
+ .if_dvbt_6 = 3550,
|
||||
+ .if_dvbt_7 = 3700,
|
||||
+ .if_dvbt_8 = 4150,
|
||||
+ .if_dvbt2_6 = 3250,
|
||||
+ .if_dvbt2_7 = 4000,
|
||||
+ .if_dvbt2_8 = 4000,
|
||||
+ .if_dvbc = 5000,
|
||||
+};
|
||||
+
|
||||
/*
|
||||
* New USB device strings: Mfr=1, Product=2, SerialNumber=0
|
||||
* Manufacturer: AMT.CO.KR
|
||||
@@ -421,6 +457,14 @@
|
||||
* IOA[7] TS 1=enabled
|
||||
* IOE[5] STV0903 1=enabled
|
||||
*
|
||||
+ * E7 T2C VID=1c73 PID=861f HW=20 FW=0.1 AMTCI=0.5 "anysee-E7T2C(LP)"
|
||||
+ * PCB: 508T2C (rev0.3)
|
||||
+ * parts: DNOQ44QCH106A(CXD2820R, TDA18212), TDA8024
|
||||
+ * OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
|
||||
+ * IOA=4d IOB=00 IOC=cc IOD=48 IOE=e4
|
||||
+ * IOA[7] TS 1=enabled
|
||||
+ * IOE[5] CXD2820R 1=enabled
|
||||
+ *
|
||||
* E7 PTC VID=1c73 PID=861f HW=21 FW=0.1 AMTCI=?? "anysee-E7PTC(LP)"
|
||||
* PCB: 508PTC (rev0.5)
|
||||
* parts: ZL10353, TDA10023, DNOD44CDH086A(TDA18212)
|
||||
@@ -437,7 +481,7 @@
|
||||
* IOD[6] ZL10353 1=enabled
|
||||
* IOE[0] IF 0=enabled
|
||||
*
|
||||
- * E7 S2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
|
||||
+ * E7 PS2 VID=1c73 PID=861f HW=22 FW=0.1 AMTCI=?? "anysee-E7PS2(LP)"
|
||||
* PCB: 508PS2 (rev0.4)
|
||||
* parts: DNBU10512IST(STV0903, STV6110), ISL6423
|
||||
* OEA=80 OEB=00 OEC=03 OED=f7 OEE=ff
|
||||
@@ -446,6 +490,16 @@
|
||||
* IOE[5] STV0903 1=enabled
|
||||
*/
|
||||
|
||||
+
|
||||
+/* external I2C gate used for DNOD44CDH086A(TDA18212) tuner module */
|
||||
+static int anysee_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
|
||||
+{
|
||||
+ struct dvb_usb_adapter *adap = fe->dvb->priv;
|
||||
+
|
||||
+ /* enable / disable tuner access on IOE[4] */
|
||||
+ return anysee_wr_reg_mask(adap->dev, REG_IOE, (enable << 4), 0x10);
|
||||
+}
|
||||
+
|
||||
static int anysee_frontend_ctrl(struct dvb_frontend *fe, int onoff)
|
||||
{
|
||||
struct dvb_usb_adapter *adap = fe->dvb->priv;
|
||||
@@ -577,7 +631,8 @@
|
||||
/* detect hardware only once */
|
||||
if (adap->fe_adap[0].fe == NULL) {
|
||||
/* Check which hardware we have.
|
||||
- * We must do this call two times to get reliable values (hw bug).
|
||||
+ * We must do this call two times to get reliable values
|
||||
+ * (hw/fw bug).
|
||||
*/
|
||||
ret = anysee_get_hw_info(adap->dev, hw_info);
|
||||
if (ret)
|
||||
@@ -606,14 +661,14 @@
|
||||
break;
|
||||
|
||||
/* attach demod */
|
||||
- adap->fe_adap[0].fe = dvb_attach(mt352_attach, &anysee_mt352_config,
|
||||
- &adap->dev->i2c_adap);
|
||||
+ adap->fe_adap[0].fe = dvb_attach(mt352_attach,
|
||||
+ &anysee_mt352_config, &adap->dev->i2c_adap);
|
||||
if (adap->fe_adap[0].fe)
|
||||
break;
|
||||
|
||||
/* attach demod */
|
||||
- adap->fe_adap[0].fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
|
||||
- &adap->dev->i2c_adap);
|
||||
+ adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
|
||||
+ &anysee_zl10353_config, &adap->dev->i2c_adap);
|
||||
|
||||
break;
|
||||
case ANYSEE_HW_507CD: /* 6 */
|
||||
@@ -665,8 +720,8 @@
|
||||
goto error;
|
||||
|
||||
/* attach demod */
|
||||
- adap->fe_adap[0].fe = dvb_attach(cx24116_attach, &anysee_cx24116_config,
|
||||
- &adap->dev->i2c_adap);
|
||||
+ adap->fe_adap[0].fe = dvb_attach(cx24116_attach,
|
||||
+ &anysee_cx24116_config, &adap->dev->i2c_adap);
|
||||
|
||||
break;
|
||||
case ANYSEE_HW_507FA: /* 15 */
|
||||
@@ -747,17 +802,19 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
|
||||
+ if (tmp == 0xc7) {
|
||||
+ if (adap->fe_adap[state->fe_id].fe)
|
||||
+ adap->fe_adap[state->fe_id].fe->ops.i2c_gate_ctrl =
|
||||
+ anysee_i2c_gate_ctrl;
|
||||
+ }
|
||||
+
|
||||
break;
|
||||
case ANYSEE_HW_508TC: /* 18 */
|
||||
case ANYSEE_HW_508PTC: /* 21 */
|
||||
/* E7 TC */
|
||||
/* E7 PTC */
|
||||
|
||||
- /* enable transport stream on IOA[7] */
|
||||
- ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
|
||||
- if (ret)
|
||||
- goto error;
|
||||
-
|
||||
if ((state->fe_id ^ dvb_usb_anysee_delsys) == 0) {
|
||||
/* disable DVB-T demod on IOD[6] */
|
||||
ret = anysee_wr_reg_mask(adap->dev, REG_IOD, (0 << 6),
|
||||
@@ -772,7 +829,8 @@
|
||||
goto error;
|
||||
|
||||
/* attach demod */
|
||||
- adap->fe_adap[state->fe_id].fe = dvb_attach(tda10023_attach,
|
||||
+ adap->fe_adap[state->fe_id].fe =
|
||||
+ dvb_attach(tda10023_attach,
|
||||
&anysee_tda10023_tda18212_config,
|
||||
&adap->dev->i2c_adap, 0x48);
|
||||
} else {
|
||||
@@ -789,11 +847,19 @@
|
||||
goto error;
|
||||
|
||||
/* attach demod */
|
||||
- adap->fe_adap[state->fe_id].fe = dvb_attach(zl10353_attach,
|
||||
+ adap->fe_adap[state->fe_id].fe =
|
||||
+ dvb_attach(zl10353_attach,
|
||||
&anysee_zl10353_tda18212_config,
|
||||
&adap->dev->i2c_adap);
|
||||
}
|
||||
|
||||
+ /* I2C gate for DNOD44CDH086A(TDA18212) tuner module */
|
||||
+ if (adap->fe_adap[state->fe_id].fe)
|
||||
+ adap->fe_adap[state->fe_id].fe->ops.i2c_gate_ctrl =
|
||||
+ anysee_i2c_gate_ctrl;
|
||||
+
|
||||
+ state->has_ci = true;
|
||||
+
|
||||
break;
|
||||
case ANYSEE_HW_508S2: /* 19 */
|
||||
case ANYSEE_HW_508PS2: /* 22 */
|
||||
@@ -803,19 +869,35 @@
|
||||
if (state->fe_id)
|
||||
break;
|
||||
|
||||
- /* enable transport stream on IOA[7] */
|
||||
- ret = anysee_wr_reg_mask(adap->dev, REG_IOA, (1 << 7), 0x80);
|
||||
+ /* enable DVB-S/S2 demod on IOE[5] */
|
||||
+ ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
- /* enable DVB-S/S2 demod on IOE[5] */
|
||||
+ /* attach demod */
|
||||
+ adap->fe_adap[0].fe = dvb_attach(stv0900_attach,
|
||||
+ &anysee_stv0900_config, &adap->dev->i2c_adap, 0);
|
||||
+
|
||||
+ state->has_ci = true;
|
||||
+
|
||||
+ break;
|
||||
+ case ANYSEE_HW_508T2C: /* 20 */
|
||||
+ /* E7 T2C */
|
||||
+
|
||||
+ if (state->fe_id)
|
||||
+ break;
|
||||
+
|
||||
+ /* enable DVB-T/T2/C demod on IOE[5] */
|
||||
ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 5), 0x20);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
/* attach demod */
|
||||
- adap->fe_adap[0].fe = dvb_attach(stv0900_attach, &anysee_stv0900_config,
|
||||
- &adap->dev->i2c_adap, 0);
|
||||
+ adap->fe_adap[state->fe_id].fe = dvb_attach(cxd2820r_attach,
|
||||
+ &anysee_cxd2820r_config, &adap->dev->i2c_adap,
|
||||
+ NULL);
|
||||
+
|
||||
+ state->has_ci = true;
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -842,24 +924,26 @@
|
||||
/* E30 */
|
||||
|
||||
/* attach tuner */
|
||||
- fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc2 >> 1),
|
||||
- NULL, DVB_PLL_THOMSON_DTT7579);
|
||||
+ fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
|
||||
+ (0xc2 >> 1), NULL, DVB_PLL_THOMSON_DTT7579);
|
||||
|
||||
break;
|
||||
case ANYSEE_HW_507CD: /* 6 */
|
||||
/* E30 Plus */
|
||||
|
||||
/* attach tuner */
|
||||
- fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc2 >> 1),
|
||||
- &adap->dev->i2c_adap, DVB_PLL_THOMSON_DTT7579);
|
||||
+ fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
|
||||
+ (0xc2 >> 1), &adap->dev->i2c_adap,
|
||||
+ DVB_PLL_THOMSON_DTT7579);
|
||||
|
||||
break;
|
||||
case ANYSEE_HW_507DC: /* 10 */
|
||||
/* E30 C Plus */
|
||||
|
||||
/* attach tuner */
|
||||
- fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, (0xc0 >> 1),
|
||||
- &adap->dev->i2c_adap, DVB_PLL_SAMSUNG_DTOS403IH102A);
|
||||
+ fe = dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe,
|
||||
+ (0xc0 >> 1), &adap->dev->i2c_adap,
|
||||
+ DVB_PLL_SAMSUNG_DTOS403IH102A);
|
||||
|
||||
break;
|
||||
case ANYSEE_HW_507SI: /* 11 */
|
||||
@@ -877,22 +961,12 @@
|
||||
/* Try first attach TDA18212 silicon tuner on IOE[4], if that
|
||||
* fails attach old simple PLL. */
|
||||
|
||||
- /* enable tuner on IOE[4] */
|
||||
- ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
|
||||
- if (ret)
|
||||
- goto error;
|
||||
-
|
||||
/* attach tuner */
|
||||
fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
|
||||
&adap->dev->i2c_adap, &anysee_tda18212_config);
|
||||
if (fe)
|
||||
break;
|
||||
|
||||
- /* disable tuner on IOE[4] */
|
||||
- ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (0 << 4), 0x10);
|
||||
- if (ret)
|
||||
- goto error;
|
||||
-
|
||||
/* attach tuner */
|
||||
fe = dvb_attach(dvb_pll_attach, adap->fe_adap[state->fe_id].fe,
|
||||
(0xc0 >> 1), &adap->dev->i2c_adap,
|
||||
@@ -904,11 +978,6 @@
|
||||
/* E7 TC */
|
||||
/* E7 PTC */
|
||||
|
||||
- /* enable tuner on IOE[4] */
|
||||
- ret = anysee_wr_reg_mask(adap->dev, REG_IOE, (1 << 4), 0x10);
|
||||
- if (ret)
|
||||
- goto error;
|
||||
-
|
||||
/* attach tuner */
|
||||
fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
|
||||
&adap->dev->i2c_adap, &anysee_tda18212_config);
|
||||
@@ -930,6 +999,15 @@
|
||||
}
|
||||
|
||||
break;
|
||||
+
|
||||
+ case ANYSEE_HW_508T2C: /* 20 */
|
||||
+ /* E7 T2C */
|
||||
+
|
||||
+ /* attach tuner */
|
||||
+ fe = dvb_attach(tda18212_attach, adap->fe_adap[state->fe_id].fe,
|
||||
+ &adap->dev->i2c_adap, &anysee_tda18212_config2);
|
||||
+
|
||||
+ break;
|
||||
default:
|
||||
fe = NULL;
|
||||
}
|
||||
@@ -939,7 +1017,6 @@
|
||||
else
|
||||
ret = -ENODEV;
|
||||
|
||||
-error:
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -969,6 +1046,201 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int anysee_ci_read_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
|
||||
+ int addr)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = ci->data;
|
||||
+ int ret;
|
||||
+ u8 buf[] = {CMD_CI, 0x02, 0x40 | addr >> 8, addr & 0xff, 0x00, 1};
|
||||
+ u8 val;
|
||||
+
|
||||
+ ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
+static int anysee_ci_write_attribute_mem(struct dvb_ca_en50221 *ci, int slot,
|
||||
+ int addr, u8 val)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = ci->data;
|
||||
+ int ret;
|
||||
+ u8 buf[] = {CMD_CI, 0x03, 0x40 | addr >> 8, addr & 0xff, 0x00, 1, val};
|
||||
+
|
||||
+ ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int anysee_ci_read_cam_control(struct dvb_ca_en50221 *ci, int slot,
|
||||
+ u8 addr)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = ci->data;
|
||||
+ int ret;
|
||||
+ u8 buf[] = {CMD_CI, 0x04, 0x40, addr, 0x00, 1};
|
||||
+ u8 val;
|
||||
+
|
||||
+ ret = anysee_ctrl_msg(d, buf, sizeof(buf), &val, 1);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
+static int anysee_ci_write_cam_control(struct dvb_ca_en50221 *ci, int slot,
|
||||
+ u8 addr, u8 val)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = ci->data;
|
||||
+ int ret;
|
||||
+ u8 buf[] = {CMD_CI, 0x05, 0x40, addr, 0x00, 1, val};
|
||||
+
|
||||
+ ret = anysee_ctrl_msg(d, buf, sizeof(buf), NULL, 0);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int anysee_ci_slot_reset(struct dvb_ca_en50221 *ci, int slot)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = ci->data;
|
||||
+ int ret;
|
||||
+ struct anysee_state *state = d->priv;
|
||||
+
|
||||
+ state->ci_cam_ready = jiffies + msecs_to_jiffies(1000);
|
||||
+
|
||||
+ ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ msleep(300);
|
||||
+
|
||||
+ ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int anysee_ci_slot_shutdown(struct dvb_ca_en50221 *ci, int slot)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = ci->data;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = anysee_wr_reg_mask(d, REG_IOA, (0 << 7), 0x80);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ msleep(30);
|
||||
+
|
||||
+ ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int anysee_ci_slot_ts_enable(struct dvb_ca_en50221 *ci, int slot)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = ci->data;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = anysee_wr_reg_mask(d, REG_IOD, (0 << 1), 0x02);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int anysee_ci_poll_slot_status(struct dvb_ca_en50221 *ci, int slot,
|
||||
+ int open)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = ci->data;
|
||||
+ struct anysee_state *state = d->priv;
|
||||
+ int ret;
|
||||
+ u8 tmp;
|
||||
+
|
||||
+ ret = anysee_rd_reg_mask(d, REG_IOC, &tmp, 0x40);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (tmp == 0) {
|
||||
+ ret = DVB_CA_EN50221_POLL_CAM_PRESENT;
|
||||
+ if (time_after(jiffies, state->ci_cam_ready))
|
||||
+ ret |= DVB_CA_EN50221_POLL_CAM_READY;
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int anysee_ci_init(struct dvb_usb_device *d)
|
||||
+{
|
||||
+ struct anysee_state *state = d->priv;
|
||||
+ int ret;
|
||||
+
|
||||
+ state->ci.owner = THIS_MODULE;
|
||||
+ state->ci.read_attribute_mem = anysee_ci_read_attribute_mem;
|
||||
+ state->ci.write_attribute_mem = anysee_ci_write_attribute_mem;
|
||||
+ state->ci.read_cam_control = anysee_ci_read_cam_control;
|
||||
+ state->ci.write_cam_control = anysee_ci_write_cam_control;
|
||||
+ state->ci.slot_reset = anysee_ci_slot_reset;
|
||||
+ state->ci.slot_shutdown = anysee_ci_slot_shutdown;
|
||||
+ state->ci.slot_ts_enable = anysee_ci_slot_ts_enable;
|
||||
+ state->ci.poll_slot_status = anysee_ci_poll_slot_status;
|
||||
+ state->ci.data = d;
|
||||
+
|
||||
+ ret = anysee_wr_reg_mask(d, REG_IOA, (1 << 7), 0x80);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = dvb_ca_en50221_init(&d->adapter[0].dvb_adap, &state->ci, 0, 1);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void anysee_ci_release(struct dvb_usb_device *d)
|
||||
+{
|
||||
+ struct anysee_state *state = d->priv;
|
||||
+
|
||||
+ /* detach CI */
|
||||
+ if (state->has_ci)
|
||||
+ dvb_ca_en50221_release(&state->ci);
|
||||
+
|
||||
+ return;
|
||||
+}
|
||||
+
|
||||
+static int anysee_init(struct dvb_usb_device *d)
|
||||
+{
|
||||
+ struct anysee_state *state = d->priv;
|
||||
+ int ret;
|
||||
+
|
||||
+ /* LED light */
|
||||
+ ret = anysee_led_ctrl(d, 0x01, 0x03);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* enable IR */
|
||||
+ ret = anysee_ir_ctrl(d, 1);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* attach CI */
|
||||
+ if (state->has_ci) {
|
||||
+ ret = anysee_ci_init(d);
|
||||
+ if (ret) {
|
||||
+ state->has_ci = false;
|
||||
+ return ret;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* DVB USB Driver stuff */
|
||||
static struct dvb_usb_device_properties anysee_properties;
|
||||
|
||||
@@ -1010,6 +1282,16 @@
|
||||
return anysee_init(d);
|
||||
}
|
||||
|
||||
+static void anysee_disconnect(struct usb_interface *intf)
|
||||
+{
|
||||
+ struct dvb_usb_device *d = usb_get_intfdata(intf);
|
||||
+
|
||||
+ anysee_ci_release(d);
|
||||
+ dvb_usb_device_exit(intf);
|
||||
+
|
||||
+ return;
|
||||
+}
|
||||
+
|
||||
static struct usb_device_id anysee_table[] = {
|
||||
{ USB_DEVICE(USB_VID_CYPRESS, USB_PID_ANYSEE) },
|
||||
{ USB_DEVICE(USB_VID_AMT, USB_PID_ANYSEE) },
|
||||
@@ -1029,7 +1311,7 @@
|
||||
{
|
||||
.num_frontends = 2,
|
||||
.frontend_ctrl = anysee_frontend_ctrl,
|
||||
- .fe = {{
|
||||
+ .fe = { {
|
||||
.streaming_ctrl = anysee_streaming_ctrl,
|
||||
.frontend_attach = anysee_frontend_attach,
|
||||
.tuner_attach = anysee_tuner_attach,
|
||||
@@ -1057,7 +1339,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
- }},
|
||||
+ } },
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1087,7 +1369,7 @@
|
||||
static struct usb_driver anysee_driver = {
|
||||
.name = "dvb_usb_anysee",
|
||||
.probe = anysee_probe,
|
||||
- .disconnect = dvb_usb_device_exit,
|
||||
+ .disconnect = anysee_disconnect,
|
||||
.id_table = anysee_table,
|
||||
};
|
||||
|
||||
diff -Naur linux-3.2.1/drivers/media/dvb/dvb-usb/anysee.h linux-3.2.1.patch/drivers/media/dvb/dvb-usb/anysee.h
|
||||
--- linux-3.2.1/drivers/media/dvb/dvb-usb/anysee.h 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/dvb/dvb-usb/anysee.h 2012-01-22 16:07:33.178264400 +0100
|
||||
@@ -36,6 +36,7 @@
|
||||
|
||||
#define DVB_USB_LOG_PREFIX "anysee"
|
||||
#include "dvb-usb.h"
|
||||
+#include "dvb_ca_en50221.h"
|
||||
|
||||
#define deb_info(args...) dprintk(dvb_usb_anysee_debug, 0x01, args)
|
||||
#define deb_xfer(args...) dprintk(dvb_usb_anysee_debug, 0x02, args)
|
||||
@@ -54,12 +55,16 @@
|
||||
CMD_GET_IR_CODE = 0x41,
|
||||
CMD_GET_HW_INFO = 0x19,
|
||||
CMD_SMARTCARD = 0x34,
|
||||
+ CMD_CI = 0x37,
|
||||
};
|
||||
|
||||
struct anysee_state {
|
||||
u8 hw; /* PCB ID */
|
||||
u8 seq;
|
||||
u8 fe_id:1; /* frondend ID */
|
||||
+ u8 has_ci:1;
|
||||
+ struct dvb_ca_en50221 ci;
|
||||
+ unsigned long ci_cam_ready; /* jiffies */
|
||||
};
|
||||
|
||||
#define ANYSEE_HW_507T 2 /* E30 */
|
||||
@@ -69,6 +74,7 @@
|
||||
#define ANYSEE_HW_507FA 15 /* E30 Combo Plus / E30 C Plus */
|
||||
#define ANYSEE_HW_508TC 18 /* E7 TC */
|
||||
#define ANYSEE_HW_508S2 19 /* E7 S2 */
|
||||
+#define ANYSEE_HW_508T2C 20 /* E7 T2C */
|
||||
#define ANYSEE_HW_508PTC 21 /* E7 PTC Plus */
|
||||
#define ANYSEE_HW_508PS2 22 /* E7 PS2 Plus */
|
||||
|
||||
diff -Naur linux-3.2.1/drivers/media/dvb/dvb-usb/Kconfig linux-3.2.1.patch/drivers/media/dvb/dvb-usb/Kconfig
|
||||
--- linux-3.2.1/drivers/media/dvb/dvb-usb/Kconfig 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/dvb/dvb-usb/Kconfig 2012-01-22 16:07:33.179264419 +0100
|
||||
@@ -311,6 +311,7 @@
|
||||
select DVB_STV0900 if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV6110 if !DVB_FE_CUSTOMISE
|
||||
select DVB_ISL6423 if !DVB_FE_CUSTOMISE
|
||||
+ select DVB_CXD2820R if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
Say Y here to support the Anysee E30, Anysee E30 Plus or
|
||||
Anysee E30 C Plus DVB USB2.0 receiver.
|
@ -1,649 +0,0 @@
|
||||
diff -Naur linux-3.2.1/Documentation/DocBook/media/dvb/dvbproperty.xml linux-3.2.1.patch/Documentation/DocBook/media/dvb/dvbproperty.xml
|
||||
--- linux-3.2.1/Documentation/DocBook/media/dvb/dvbproperty.xml 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/Documentation/DocBook/media/dvb/dvbproperty.xml 2012-01-22 15:52:29.773509131 +0100
|
||||
@@ -311,6 +311,8 @@
|
||||
ROLLOFF_20,
|
||||
ROLLOFF_25,
|
||||
ROLLOFF_AUTO,
|
||||
+ ROLLOFF_15, /* DVB-C Annex A */
|
||||
+ ROLLOFF_13, /* DVB-C Annex C */
|
||||
} fe_rolloff_t;
|
||||
</programlisting>
|
||||
</section>
|
||||
@@ -778,8 +780,10 @@
|
||||
<listitem><para><link linkend="DTV-MODULATION"><constant>DTV_MODULATION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-INVERSION"><constant>DTV_INVERSION</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-SYMBOL-RATE"><constant>DTV_SYMBOL_RATE</constant></link></para></listitem>
|
||||
+ <listitem><para><link linkend="DTV-ROLLOFF"><constant>DTV_ROLLOFF</constant></link></para></listitem>
|
||||
<listitem><para><link linkend="DTV-INNER-FEC"><constant>DTV_INNER_FEC</constant></link></para></listitem>
|
||||
</itemizedlist>
|
||||
+ <para>The Rolloff of 0.15 (ROLLOFF_15) is assumed, as ITU-T J.83 Annex A is more common. For Annex C, rolloff should be 0.13 (ROLLOFF_13). All other values are invalid.</para>
|
||||
</section>
|
||||
<section id="dvbc-annex-b-params">
|
||||
<title>DVB-C Annex B delivery system</title>
|
||||
diff -Naur linux-3.2.1/Documentation/dvb/get_dvb_firmware linux-3.2.1.patch/Documentation/dvb/get_dvb_firmware
|
||||
--- linux-3.2.1/Documentation/dvb/get_dvb_firmware 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/Documentation/dvb/get_dvb_firmware 2012-01-22 15:38:50.939309809 +0100
|
||||
@@ -27,8 +27,8 @@
|
||||
"or51211", "or51132_qam", "or51132_vsb", "bluebird",
|
||||
"opera1", "cx231xx", "cx18", "cx23885", "pvrusb2", "mpc718",
|
||||
"af9015", "ngene", "az6027", "lme2510_lg", "lme2510c_s7395",
|
||||
- "lme2510c_s7395_old", "drxk", "drxk_terratec_h5", "tda10071",
|
||||
- "it9135" );
|
||||
+ "lme2510c_s7395_old", "drxk", "drxk_terratec_h5",
|
||||
+ "drxk_hauppauge_hvr930c", "tda10071", "it9135" );
|
||||
|
||||
# Check args
|
||||
syntax() if (scalar(@ARGV) != 1);
|
||||
@@ -643,6 +643,24 @@
|
||||
|
||||
"$fwfile"
|
||||
}
|
||||
+
|
||||
+sub drxk_hauppauge_hvr930c {
|
||||
+ my $url = "http://www.wintvcd.co.uk/drivers/";
|
||||
+ my $zipfile = "HVR-9x0_5_10_325_28153_SIGNED.zip";
|
||||
+ my $hash = "83ab82e7e9480ec8bf1ae0155ca63c88";
|
||||
+ my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||
+ my $drvfile = "HVR-900/emOEM.sys";
|
||||
+ my $fwfile = "dvb-usb-hauppauge-hvr930c-drxk.fw";
|
||||
+
|
||||
+ checkstandard();
|
||||
+
|
||||
+ wgetfile($zipfile, $url . $zipfile);
|
||||
+ verify($zipfile, $hash);
|
||||
+ unzip($zipfile, $tmpdir);
|
||||
+ extract("$tmpdir/$drvfile", 0x117b0, 42692, "$fwfile");
|
||||
+
|
||||
+ "$fwfile"
|
||||
+}
|
||||
|
||||
sub drxk_terratec_h5 {
|
||||
my $url = "http://www.linuxtv.org/downloads/firmware/";
|
||||
diff -Naur linux-3.2.1/drivers/media/common/tuners/xc5000.c linux-3.2.1.patch/drivers/media/common/tuners/xc5000.c
|
||||
--- linux-3.2.1/drivers/media/common/tuners/xc5000.c 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/common/tuners/xc5000.c 2012-01-22 15:38:54.115367896 +0100
|
||||
@@ -628,20 +628,12 @@
|
||||
dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);
|
||||
}
|
||||
|
||||
-/*
|
||||
- * As defined on EN 300 429, the DVB-C roll-off factor is 0.15.
|
||||
- * So, the amount of the needed bandwith is given by:
|
||||
- * Bw = Symbol_rate * (1 + 0.15)
|
||||
- * As such, the maximum symbol rate supported by 6 MHz is given by:
|
||||
- * max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds
|
||||
- */
|
||||
-#define MAX_SYMBOL_RATE_6MHz 5217391
|
||||
-
|
||||
static int xc5000_set_params(struct dvb_frontend *fe,
|
||||
struct dvb_frontend_parameters *params)
|
||||
{
|
||||
struct xc5000_priv *priv = fe->tuner_priv;
|
||||
int ret;
|
||||
+ u32 bw;
|
||||
|
||||
if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
|
||||
if (xc_load_fw_and_init_tuner(fe) != XC_RESULT_SUCCESS) {
|
||||
@@ -684,8 +676,10 @@
|
||||
priv->freq_hz = params->frequency - 1750000;
|
||||
break;
|
||||
case BANDWIDTH_7_MHZ:
|
||||
- printk(KERN_ERR "xc5000 bandwidth 7MHz not supported\n");
|
||||
- return -EINVAL;
|
||||
+ priv->bandwidth = BANDWIDTH_7_MHZ;
|
||||
+ priv->video_standard = DTV7;
|
||||
+ priv->freq_hz = params->frequency - 2250000;
|
||||
+ break;
|
||||
case BANDWIDTH_8_MHZ:
|
||||
priv->bandwidth = BANDWIDTH_8_MHZ;
|
||||
priv->video_standard = DTV8;
|
||||
@@ -707,14 +701,26 @@
|
||||
dprintk(1, "%s() QAM modulation\n", __func__);
|
||||
priv->rf_mode = XC_RF_MODE_CABLE;
|
||||
/*
|
||||
- * Using a 8MHz bandwidth sometimes fail
|
||||
- * with 6MHz-spaced channels, due to inter-carrier
|
||||
- * interference. So, use DTV6 firmware
|
||||
+ * Using a higher bandwidth at the tuner filter may
|
||||
+ * allow inter-carrier interference.
|
||||
+ * So, determine the minimal channel spacing, in order
|
||||
+ * to better adjust the tuner filter.
|
||||
+ * According with ITU-T J.83, the bandwidth is given by:
|
||||
+ * bw = Simbol Rate * (1 + roll_off), where the roll_off
|
||||
+ * is equal to 0.15 for Annex A, and 0.13 for annex C
|
||||
*/
|
||||
- if (params->u.qam.symbol_rate <= MAX_SYMBOL_RATE_6MHz) {
|
||||
+ if (fe->dtv_property_cache.rolloff == ROLLOFF_13)
|
||||
+ bw = (params->u.qam.symbol_rate * 13) / 10;
|
||||
+ else
|
||||
+ bw = (params->u.qam.symbol_rate * 15) / 10;
|
||||
+ if (bw <= 6000000) {
|
||||
priv->bandwidth = BANDWIDTH_6_MHZ;
|
||||
priv->video_standard = DTV6;
|
||||
priv->freq_hz = params->frequency - 1750000;
|
||||
+ } else if (bw <= 7000000) {
|
||||
+ priv->bandwidth = BANDWIDTH_7_MHZ;
|
||||
+ priv->video_standard = DTV7;
|
||||
+ priv->freq_hz = params->frequency - 2250000;
|
||||
} else {
|
||||
priv->bandwidth = BANDWIDTH_8_MHZ;
|
||||
priv->video_standard = DTV7_8;
|
||||
@@ -996,6 +1002,8 @@
|
||||
struct xc5000_priv *priv = fe->tuner_priv;
|
||||
int ret = 0;
|
||||
|
||||
+ mutex_lock(&xc5000_list_mutex);
|
||||
+
|
||||
if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
|
||||
ret = xc5000_fwupload(fe);
|
||||
if (ret != XC_RESULT_SUCCESS)
|
||||
@@ -1015,6 +1023,8 @@
|
||||
/* Default to "CABLE" mode */
|
||||
ret |= xc_write_reg(priv, XREG_SIGNALSOURCE, XC_RF_MODE_CABLE);
|
||||
|
||||
+ mutex_unlock(&xc5000_list_mutex);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
diff -Naur linux-3.2.1/drivers/media/dvb/dvb-core/dvb_frontend.c linux-3.2.1.patch/drivers/media/dvb/dvb-core/dvb_frontend.c
|
||||
--- linux-3.2.1/drivers/media/dvb/dvb-core/dvb_frontend.c 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/dvb/dvb-core/dvb_frontend.c 2012-01-22 15:52:29.774509149 +0100
|
||||
@@ -876,6 +876,7 @@
|
||||
c->symbol_rate = QAM_AUTO;
|
||||
c->code_rate_HP = FEC_AUTO;
|
||||
c->code_rate_LP = FEC_AUTO;
|
||||
+ c->rolloff = ROLLOFF_AUTO;
|
||||
|
||||
c->isdbt_partial_reception = -1;
|
||||
c->isdbt_sb_mode = -1;
|
||||
@@ -1030,6 +1031,7 @@
|
||||
break;
|
||||
case FE_QAM:
|
||||
c->delivery_system = SYS_DVBC_ANNEX_AC;
|
||||
+ c->rolloff = ROLLOFF_15; /* implied for Annex A */
|
||||
break;
|
||||
case FE_OFDM:
|
||||
c->delivery_system = SYS_DVBT;
|
||||
diff -Naur linux-3.2.1/drivers/media/dvb/frontends/drxk.h linux-3.2.1.patch/drivers/media/dvb/frontends/drxk.h
|
||||
--- linux-3.2.1/drivers/media/dvb/frontends/drxk.h 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/dvb/frontends/drxk.h 2012-01-22 15:38:45.923218078 +0100
|
||||
@@ -26,6 +26,8 @@
|
||||
bool antenna_dvbt;
|
||||
u16 antenna_gpio;
|
||||
|
||||
+ int chunk_size;
|
||||
+
|
||||
const char *microcode_name;
|
||||
};
|
||||
|
||||
diff -Naur linux-3.2.1/drivers/media/dvb/frontends/drxk_hard.c linux-3.2.1.patch/drivers/media/dvb/frontends/drxk_hard.c
|
||||
--- linux-3.2.1/drivers/media/dvb/frontends/drxk_hard.c 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/dvb/frontends/drxk_hard.c 2012-01-22 15:39:13.797727862 +0100
|
||||
@@ -681,7 +681,8 @@
|
||||
state->m_hasOOB = false;
|
||||
state->m_hasAudio = false;
|
||||
|
||||
- state->m_ChunkSize = 124;
|
||||
+ if (!state->m_ChunkSize)
|
||||
+ state->m_ChunkSize = 124;
|
||||
|
||||
state->m_oscClockFreq = 0;
|
||||
state->m_smartAntInverted = false;
|
||||
@@ -1846,6 +1847,7 @@
|
||||
*/
|
||||
switch (oMode) {
|
||||
case OM_DVBT:
|
||||
+ dprintk(1, ": DVB-T\n");
|
||||
state->m_OperationMode = oMode;
|
||||
status = SetDVBTStandard(state, oMode);
|
||||
if (status < 0)
|
||||
@@ -1853,6 +1855,8 @@
|
||||
break;
|
||||
case OM_QAM_ITU_A: /* fallthrough */
|
||||
case OM_QAM_ITU_C:
|
||||
+ dprintk(1, ": DVB-C Annex %c\n",
|
||||
+ (state->m_OperationMode == OM_QAM_ITU_A) ? 'A' : 'C');
|
||||
state->m_OperationMode = oMode;
|
||||
status = SetQAMStandard(state, oMode);
|
||||
if (status < 0)
|
||||
@@ -6182,7 +6186,10 @@
|
||||
dprintk(1, "\n");
|
||||
if (mutex_trylock(&state->ctlock) == 0)
|
||||
return -EBUSY;
|
||||
- SetOperationMode(state, OM_QAM_ITU_A);
|
||||
+ if (state->m_itut_annex_c)
|
||||
+ SetOperationMode(state, OM_QAM_ITU_C);
|
||||
+ else
|
||||
+ SetOperationMode(state, OM_QAM_ITU_A);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6218,6 +6225,12 @@
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ if (fe->ops.info.type == FE_QAM) {
|
||||
+ if (fe->dtv_property_cache.rolloff == ROLLOFF_13)
|
||||
+ state->m_itut_annex_c = true;
|
||||
+ else
|
||||
+ state->m_itut_annex_c = false;
|
||||
+ }
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
@@ -6423,6 +6436,7 @@
|
||||
state->no_i2c_bridge = config->no_i2c_bridge;
|
||||
state->antenna_gpio = config->antenna_gpio;
|
||||
state->antenna_dvbt = config->antenna_dvbt;
|
||||
+ state->m_ChunkSize = config->chunk_size;
|
||||
|
||||
/* NOTE: as more UIO bits will be used, add them to the mask */
|
||||
state->UIO_mask = config->antenna_gpio;
|
||||
diff -Naur linux-3.2.1/drivers/media/dvb/frontends/drxk_hard.h linux-3.2.1.patch/drivers/media/dvb/frontends/drxk_hard.h
|
||||
--- linux-3.2.1/drivers/media/dvb/frontends/drxk_hard.h 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/dvb/frontends/drxk_hard.h 2012-01-22 15:39:13.798727880 +0100
|
||||
@@ -263,6 +263,8 @@
|
||||
u8 m_TSDataStrength;
|
||||
u8 m_TSClockkStrength;
|
||||
|
||||
+ bool m_itut_annex_c; /* If true, uses ITU-T DVB-C Annex C, instead of Annex A */
|
||||
+
|
||||
enum DRXMPEGStrWidth_t m_widthSTR; /**< MPEG start width */
|
||||
u32 m_mpegTsStaticBitrate; /**< Maximum bitrate in b/s in case
|
||||
static clockrate is selected */
|
||||
diff -Naur linux-3.2.1/drivers/media/dvb/frontends/tda18271c2dd.c linux-3.2.1.patch/drivers/media/dvb/frontends/tda18271c2dd.c
|
||||
--- linux-3.2.1/drivers/media/dvb/frontends/tda18271c2dd.c 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/dvb/frontends/tda18271c2dd.c 2012-01-22 15:38:39.024091895 +0100
|
||||
@@ -1123,20 +1123,6 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
-/*
|
||||
- * As defined on EN 300 429 Annex A and on ITU-T J.83 annex A, the DVB-C
|
||||
- * roll-off factor is 0.15.
|
||||
- * According with the specs, the amount of the needed bandwith is given by:
|
||||
- * Bw = Symbol_rate * (1 + 0.15)
|
||||
- * As such, the maximum symbol rate supported by 6 MHz is
|
||||
- * max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds
|
||||
- *NOTE: For ITU-T J.83 Annex C, the roll-off factor is 0.13. So:
|
||||
- * max_symbol_rate = 6 MHz / 1.13 = 5309735 Baud
|
||||
- * That means that an adjustment is needed for Japan,
|
||||
- * but, as currently DRX-K is hardcoded to Annex A, let's stick
|
||||
- * with 0.15 roll-off factor.
|
||||
- */
|
||||
-#define MAX_SYMBOL_RATE_6MHz 5217391
|
||||
|
||||
static int set_params(struct dvb_frontend *fe,
|
||||
struct dvb_frontend_parameters *params)
|
||||
@@ -1144,6 +1130,7 @@
|
||||
struct tda_state *state = fe->tuner_priv;
|
||||
int status = 0;
|
||||
int Standard;
|
||||
+ u32 bw;
|
||||
|
||||
state->m_Frequency = params->frequency;
|
||||
|
||||
@@ -1161,8 +1148,23 @@
|
||||
break;
|
||||
}
|
||||
else if (fe->ops.info.type == FE_QAM) {
|
||||
- if (params->u.qam.symbol_rate <= MAX_SYMBOL_RATE_6MHz)
|
||||
+ /*
|
||||
+ * Using a higher bandwidth at the tuner filter may
|
||||
+ * allow inter-carrier interference.
|
||||
+ * So, determine the minimal channel spacing, in order
|
||||
+ * to better adjust the tuner filter.
|
||||
+ * According with ITU-T J.83, the bandwidth is given by:
|
||||
+ * bw = Simbol Rate * (1 + roll_off), where the roll_off
|
||||
+ * is equal to 0.15 for Annex A, and 0.13 for annex C
|
||||
+ */
|
||||
+ if (fe->dtv_property_cache.rolloff == ROLLOFF_13)
|
||||
+ bw = (params->u.qam.symbol_rate * 13) / 10;
|
||||
+ else
|
||||
+ bw = (params->u.qam.symbol_rate * 15) / 10;
|
||||
+ if (bw <= 6000000)
|
||||
Standard = HF_DVBC_6MHZ;
|
||||
+ else if (bw <= 7000000)
|
||||
+ Standard = HF_DVBC_7MHZ;
|
||||
else
|
||||
Standard = HF_DVBC_8MHZ;
|
||||
} else
|
||||
diff -Naur linux-3.2.1/drivers/media/rc/keymaps/rc-hauppauge.c linux-3.2.1.patch/drivers/media/rc/keymaps/rc-hauppauge.c
|
||||
--- linux-3.2.1/drivers/media/rc/keymaps/rc-hauppauge.c 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/rc/keymaps/rc-hauppauge.c 2012-01-22 15:39:04.767562712 +0100
|
||||
@@ -183,6 +183,57 @@
|
||||
{ 0x1d3f, KEY_HOME },
|
||||
|
||||
/*
|
||||
+ * Keycodes for PT# R-005 remote bundled with Haupauge HVR-930C
|
||||
+ * Keycodes start with address = 0x1c
|
||||
+ */
|
||||
+ { 0x1c3b, KEY_GOTO },
|
||||
+ { 0x1c3d, KEY_POWER },
|
||||
+
|
||||
+ { 0x1c14, KEY_UP },
|
||||
+ { 0x1c15, KEY_DOWN },
|
||||
+ { 0x1c16, KEY_LEFT },
|
||||
+ { 0x1c17, KEY_RIGHT },
|
||||
+ { 0x1c25, KEY_OK },
|
||||
+
|
||||
+ { 0x1c00, KEY_0 },
|
||||
+ { 0x1c01, KEY_1 },
|
||||
+ { 0x1c02, KEY_2 },
|
||||
+ { 0x1c03, KEY_3 },
|
||||
+ { 0x1c04, KEY_4 },
|
||||
+ { 0x1c05, KEY_5 },
|
||||
+ { 0x1c06, KEY_6 },
|
||||
+ { 0x1c07, KEY_7 },
|
||||
+ { 0x1c08, KEY_8 },
|
||||
+ { 0x1c09, KEY_9 },
|
||||
+
|
||||
+ { 0x1c1f, KEY_EXIT }, /* BACK */
|
||||
+ { 0x1c0d, KEY_MENU },
|
||||
+ { 0x1c1c, KEY_TV },
|
||||
+
|
||||
+ { 0x1c10, KEY_VOLUMEUP },
|
||||
+ { 0x1c11, KEY_VOLUMEDOWN },
|
||||
+
|
||||
+ { 0x1c20, KEY_CHANNELUP },
|
||||
+ { 0x1c21, KEY_CHANNELDOWN },
|
||||
+
|
||||
+ { 0x1c0f, KEY_MUTE },
|
||||
+ { 0x1c12, KEY_PREVIOUS }, /* Prev */
|
||||
+
|
||||
+ { 0x1c36, KEY_STOP },
|
||||
+ { 0x1c37, KEY_RECORD },
|
||||
+
|
||||
+ { 0x1c24, KEY_LAST }, /* <| */
|
||||
+ { 0x1c1e, KEY_NEXT }, /* >| */
|
||||
+
|
||||
+ { 0x1c0a, KEY_TEXT },
|
||||
+ { 0x1c0e, KEY_SUBTITLE }, /* CC */
|
||||
+
|
||||
+ { 0x1c32, KEY_REWIND },
|
||||
+ { 0x1c30, KEY_PAUSE },
|
||||
+ { 0x1c35, KEY_PLAY },
|
||||
+ { 0x1c34, KEY_FASTFORWARD },
|
||||
+
|
||||
+ /*
|
||||
* Keycodes for the old Black Remote Controller
|
||||
* This one also uses RC-5 protocol
|
||||
* Keycodes start with address = 0x00
|
||||
diff -Naur linux-3.2.1/drivers/media/video/em28xx/em28xx-cards.c linux-3.2.1.patch/drivers/media/video/em28xx/em28xx-cards.c
|
||||
--- linux-3.2.1/drivers/media/video/em28xx/em28xx-cards.c 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/video/em28xx/em28xx-cards.c 2012-01-22 15:39:04.921565528 +0100
|
||||
@@ -336,6 +336,23 @@
|
||||
{ -1, -1, -1, -1},
|
||||
};
|
||||
|
||||
+static struct em28xx_reg_seq hauppauge_930c_gpio[] = {
|
||||
+ {EM2874_R80_GPIO, 0x6f, 0xff, 10},
|
||||
+ {EM2874_R80_GPIO, 0x4f, 0xff, 10}, /* xc5000 reset */
|
||||
+ {EM2874_R80_GPIO, 0x6f, 0xff, 10},
|
||||
+ {EM2874_R80_GPIO, 0x4f, 0xff, 10},
|
||||
+ { -1, -1, -1, -1},
|
||||
+};
|
||||
+
|
||||
+#if 0
|
||||
+static struct em28xx_reg_seq hauppauge_930c_digital[] = {
|
||||
+ {EM2874_R80_GPIO, 0xf6, 0xff, 10},
|
||||
+ {EM2874_R80_GPIO, 0xe6, 0xff, 100},
|
||||
+ {EM2874_R80_GPIO, 0xa6, 0xff, 10},
|
||||
+ { -1, -1, -1, -1},
|
||||
+};
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* Board definitions
|
||||
*/
|
||||
@@ -887,7 +904,25 @@
|
||||
.tuner_addr = 0x41,
|
||||
.dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */
|
||||
.tuner_gpio = terratec_h5_gpio,
|
||||
+#else
|
||||
+ .tuner_type = TUNER_ABSENT,
|
||||
+#endif
|
||||
+ .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT |
|
||||
+ EM28XX_I2C_CLK_WAIT_ENABLE |
|
||||
+ EM28XX_I2C_FREQ_400_KHZ,
|
||||
+ },
|
||||
+ [EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {
|
||||
+ .name = "Hauppauge WinTV HVR 930C",
|
||||
+ .has_dvb = 1,
|
||||
+#if 0 /* FIXME: Add analog support */
|
||||
+ .tuner_type = TUNER_XC5000,
|
||||
+ .tuner_addr = 0x41,
|
||||
+ .dvb_gpio = hauppauge_930c_digital,
|
||||
+ .tuner_gpio = hauppauge_930c_gpio,
|
||||
+#else
|
||||
+ .tuner_type = TUNER_ABSENT,
|
||||
#endif
|
||||
+ .ir_codes = RC_MAP_HAUPPAUGE,
|
||||
.i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT |
|
||||
EM28XX_I2C_CLK_WAIT_ENABLE |
|
||||
EM28XX_I2C_FREQ_400_KHZ,
|
||||
@@ -1975,6 +2010,8 @@
|
||||
.driver_info = EM28174_BOARD_PCTV_290E },
|
||||
{ USB_DEVICE(0x2013, 0x024c),
|
||||
.driver_info = EM28174_BOARD_PCTV_460E },
|
||||
+ { USB_DEVICE(0x2040, 0x1605),
|
||||
+ .driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, em28xx_id_table);
|
||||
@@ -2028,10 +2065,10 @@
|
||||
int rc = 0;
|
||||
struct em28xx *dev = ptr;
|
||||
|
||||
- if (dev->tuner_type != TUNER_XC2028)
|
||||
+ if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)
|
||||
return 0;
|
||||
|
||||
- if (command != XC2028_TUNER_RESET)
|
||||
+ if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)
|
||||
return 0;
|
||||
|
||||
rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
|
||||
diff -Naur linux-3.2.1/drivers/media/video/em28xx/em28xx-dvb.c linux-3.2.1.patch/drivers/media/video/em28xx/em28xx-dvb.c
|
||||
--- linux-3.2.1/drivers/media/video/em28xx/em28xx-dvb.c 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/video/em28xx/em28xx-dvb.c 2012-01-22 15:39:13.799727898 +0100
|
||||
@@ -316,6 +316,14 @@
|
||||
.microcode_name = "dvb-usb-terratec-h5-drxk.fw",
|
||||
};
|
||||
|
||||
+struct drxk_config hauppauge_930c_drxk = {
|
||||
+ .adr = 0x29,
|
||||
+ .single_master = 1,
|
||||
+ .no_i2c_bridge = 1,
|
||||
+ .microcode_name = "dvb-usb-hauppauge-hvr930c-drxk.fw",
|
||||
+ .chunk_size = 56,
|
||||
+};
|
||||
+
|
||||
static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
|
||||
{
|
||||
struct em28xx_dvb *dvb = fe->sec_priv;
|
||||
@@ -334,6 +342,73 @@
|
||||
return status;
|
||||
}
|
||||
|
||||
+static void hauppauge_hvr930c_init(struct em28xx *dev)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ struct em28xx_reg_seq hauppauge_hvr930c_init[] = {
|
||||
+ {EM2874_R80_GPIO, 0xff, 0xff, 0x65},
|
||||
+ {EM2874_R80_GPIO, 0xfb, 0xff, 0x32},
|
||||
+ {EM2874_R80_GPIO, 0xff, 0xff, 0xb8},
|
||||
+ { -1, -1, -1, -1},
|
||||
+ };
|
||||
+ struct em28xx_reg_seq hauppauge_hvr930c_end[] = {
|
||||
+ {EM2874_R80_GPIO, 0xef, 0xff, 0x01},
|
||||
+ {EM2874_R80_GPIO, 0xaf, 0xff, 0x65},
|
||||
+ {EM2874_R80_GPIO, 0xef, 0xff, 0x76},
|
||||
+ {EM2874_R80_GPIO, 0xef, 0xff, 0x01},
|
||||
+ {EM2874_R80_GPIO, 0xcf, 0xff, 0x0b},
|
||||
+ {EM2874_R80_GPIO, 0xef, 0xff, 0x40},
|
||||
+
|
||||
+ {EM2874_R80_GPIO, 0xcf, 0xff, 0x65},
|
||||
+ {EM2874_R80_GPIO, 0xef, 0xff, 0x65},
|
||||
+ {EM2874_R80_GPIO, 0xcf, 0xff, 0x0b},
|
||||
+ {EM2874_R80_GPIO, 0xef, 0xff, 0x65},
|
||||
+
|
||||
+ { -1, -1, -1, -1},
|
||||
+ };
|
||||
+
|
||||
+ struct {
|
||||
+ unsigned char r[4];
|
||||
+ int len;
|
||||
+ } regs[] = {
|
||||
+ {{ 0x06, 0x02, 0x00, 0x31 }, 4},
|
||||
+ {{ 0x01, 0x02 }, 2},
|
||||
+ {{ 0x01, 0x02, 0x00, 0xc6 }, 4},
|
||||
+ {{ 0x01, 0x00 }, 2},
|
||||
+ {{ 0x01, 0x00, 0xff, 0xaf }, 4},
|
||||
+ {{ 0x01, 0x00, 0x03, 0xa0 }, 4},
|
||||
+ {{ 0x01, 0x00 }, 2},
|
||||
+ {{ 0x01, 0x00, 0x73, 0xaf }, 4},
|
||||
+ {{ 0x04, 0x00 }, 2},
|
||||
+ {{ 0x00, 0x04 }, 2},
|
||||
+ {{ 0x00, 0x04, 0x00, 0x0a }, 4},
|
||||
+ {{ 0x04, 0x14 }, 2},
|
||||
+ {{ 0x04, 0x14, 0x00, 0x00 }, 4},
|
||||
+ };
|
||||
+
|
||||
+ em28xx_gpio_set(dev, hauppauge_hvr930c_init);
|
||||
+ em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
|
||||
+ msleep(10);
|
||||
+ em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x44);
|
||||
+ msleep(10);
|
||||
+
|
||||
+ dev->i2c_client.addr = 0x82 >> 1;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(regs); i++)
|
||||
+ i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len);
|
||||
+ em28xx_gpio_set(dev, hauppauge_hvr930c_end);
|
||||
+
|
||||
+ msleep(100);
|
||||
+
|
||||
+ em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x44);
|
||||
+ msleep(30);
|
||||
+
|
||||
+ em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x45);
|
||||
+ msleep(10);
|
||||
+
|
||||
+}
|
||||
+
|
||||
static void terratec_h5_init(struct em28xx *dev)
|
||||
{
|
||||
int i;
|
||||
@@ -788,6 +863,51 @@
|
||||
mfe_shared = 1;
|
||||
}
|
||||
break;
|
||||
+ case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
|
||||
+ hauppauge_hvr930c_init(dev);
|
||||
+
|
||||
+ dvb->dont_attach_fe1 = 1;
|
||||
+
|
||||
+ dvb->fe[0] = dvb_attach(drxk_attach,
|
||||
+ &hauppauge_930c_drxk, &dev->i2c_adap,
|
||||
+ &dvb->fe[1]);
|
||||
+ if (!dvb->fe[0]) {
|
||||
+ result = -EINVAL;
|
||||
+ goto out_free;
|
||||
+ }
|
||||
+ /* FIXME: do we need a pll semaphore? */
|
||||
+ dvb->fe[0]->sec_priv = dvb;
|
||||
+ sema_init(&dvb->pll_mutex, 1);
|
||||
+ dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl;
|
||||
+ dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl;
|
||||
+ dvb->fe[1]->id = 1;
|
||||
+
|
||||
+ /* Attach xc5000 */
|
||||
+ struct xc5000_config cfg;
|
||||
+ memset(&cfg, 0, sizeof(cfg));
|
||||
+ cfg.i2c_address = 0x61;
|
||||
+ cfg.if_khz = 4000;
|
||||
+
|
||||
+ if (dvb->fe[0]->ops.i2c_gate_ctrl)
|
||||
+ dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 1);
|
||||
+ if (!dvb_attach(xc5000_attach, dvb->fe[0], &dev->i2c_adap,
|
||||
+ &cfg)) {
|
||||
+ result = -EINVAL;
|
||||
+ goto out_free;
|
||||
+ }
|
||||
+
|
||||
+ if (dvb->fe[0]->ops.i2c_gate_ctrl)
|
||||
+ dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0);
|
||||
+
|
||||
+ /* Hack - needed by drxk/tda18271c2dd */
|
||||
+ dvb->fe[1]->tuner_priv = dvb->fe[0]->tuner_priv;
|
||||
+ memcpy(&dvb->fe[1]->ops.tuner_ops,
|
||||
+ &dvb->fe[0]->ops.tuner_ops,
|
||||
+ sizeof(dvb->fe[0]->ops.tuner_ops));
|
||||
+
|
||||
+ mfe_shared = 1;
|
||||
+
|
||||
+ break;
|
||||
case EM2884_BOARD_TERRATEC_H5:
|
||||
terratec_h5_init(dev);
|
||||
|
||||
@@ -798,7 +918,6 @@
|
||||
result = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
-
|
||||
/* FIXME: do we need a pll semaphore? */
|
||||
dvb->fe[0]->sec_priv = dvb;
|
||||
sema_init(&dvb->pll_mutex, 1);
|
||||
@@ -822,6 +941,8 @@
|
||||
&dvb->fe[0]->ops.tuner_ops,
|
||||
sizeof(dvb->fe[0]->ops.tuner_ops));
|
||||
|
||||
+ mfe_shared = 1;
|
||||
+
|
||||
break;
|
||||
case EM28174_BOARD_PCTV_460E:
|
||||
/* attach demod */
|
||||
@@ -845,6 +966,8 @@
|
||||
}
|
||||
/* define general-purpose callback pointer */
|
||||
dvb->fe[0]->callback = em28xx_tuner_callback;
|
||||
+ if (dvb->fe[1])
|
||||
+ dvb->fe[1]->callback = em28xx_tuner_callback;
|
||||
|
||||
/* register everything */
|
||||
result = em28xx_register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev);
|
||||
diff -Naur linux-3.2.1/drivers/media/video/em28xx/em28xx.h linux-3.2.1.patch/drivers/media/video/em28xx/em28xx.h
|
||||
--- linux-3.2.1/drivers/media/video/em28xx/em28xx.h 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/drivers/media/video/em28xx/em28xx.h 2012-01-22 15:38:45.930218200 +0100
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <media/videobuf-dvb.h>
|
||||
#endif
|
||||
#include "tuner-xc2028.h"
|
||||
+#include "xc5000.h"
|
||||
#include "em28xx-reg.h"
|
||||
|
||||
/* Boards supported by driver */
|
||||
@@ -121,6 +122,7 @@
|
||||
#define EM28174_BOARD_PCTV_290E 78
|
||||
#define EM2884_BOARD_TERRATEC_H5 79
|
||||
#define EM28174_BOARD_PCTV_460E 80
|
||||
+#define EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C 81
|
||||
|
||||
/* Limits minimum and default number of buffers */
|
||||
#define EM28XX_MIN_BUF 4
|
||||
diff -Naur linux-3.2.1/include/linux/dvb/frontend.h linux-3.2.1.patch/include/linux/dvb/frontend.h
|
||||
--- linux-3.2.1/include/linux/dvb/frontend.h 2012-01-12 20:42:45.000000000 +0100
|
||||
+++ linux-3.2.1.patch/include/linux/dvb/frontend.h 2012-01-22 15:52:29.793509493 +0100
|
||||
@@ -329,6 +329,8 @@
|
||||
ROLLOFF_20,
|
||||
ROLLOFF_25,
|
||||
ROLLOFF_AUTO,
|
||||
+ ROLLOFF_15, /* DVB-C Annex A */
|
||||
+ ROLLOFF_13, /* DVB-C Annex C */
|
||||
} fe_rolloff_t;
|
||||
|
||||
typedef enum fe_delivery_system {
|
File diff suppressed because it is too large
Load Diff
@ -1,90 +0,0 @@
|
||||
cx23885: add TeVii s471 card.
|
||||
|
||||
From: Igor M. Liplianin <liplianin@me.by>
|
||||
|
||||
New TeVii s471 card is like s470 model,
|
||||
but there is different LNB power control.
|
||||
|
||||
Signed-off-by: Igor M. Liplianin <liplianin@me.by>
|
||||
|
||||
diff --git a/drivers/media/dvb/frontends/ds3000.c b/drivers/media/dvb/frontends/ds3000.c
|
||||
index 90bf573..6f4901a 100644
|
||||
--- a/drivers/media/dvb/frontends/ds3000.c
|
||||
+++ b/drivers/media/dvb/frontends/ds3000.c
|
||||
@@ -1129,7 +1129,10 @@ static int ds3000_set_frontend(struct dvb_frontend *fe,
|
||||
ds3000_writereg(state,
|
||||
ds3000_dvbs2_init_tab[i],
|
||||
ds3000_dvbs2_init_tab[i + 1]);
|
||||
- ds3000_writereg(state, 0xfe, 0x98);
|
||||
+ if (c->symbol_rate >= 30000000)
|
||||
+ ds3000_writereg(state, 0xfe, 0x54);
|
||||
+ else
|
||||
+ ds3000_writereg(state, 0xfe, 0x98);
|
||||
break;
|
||||
default:
|
||||
return 1;
|
||||
diff --git a/drivers/media/video/cx23885/cx23885-cards.c b/drivers/media/video/cx23885/cx23885-cards.c
|
||||
index ab8be9a..76e83e4 100644
|
||||
--- a/drivers/media/video/cx23885/cx23885-cards.c
|
||||
+++ b/drivers/media/video/cx23885/cx23885-cards.c
|
||||
@@ -452,6 +452,10 @@ struct cx23885_board cx23885_boards[] = {
|
||||
.portc = CX23885_MPEG_DVB,
|
||||
},
|
||||
|
||||
+ [CX23885_BOARD_TEVII_S471] = {
|
||||
+ .name = "TeVii S471",
|
||||
+ .portb = CX23885_MPEG_DVB,
|
||||
+ },
|
||||
};
|
||||
const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards);
|
||||
|
||||
@@ -663,6 +667,10 @@ struct cx23885_subid cx23885_subids[] = {
|
||||
.subvendor = 0x4254,
|
||||
.subdevice = 0x0952,
|
||||
.card = CX23885_BOARD_DVBSKY_S952,
|
||||
+ }, {
|
||||
+ .subvendor = 0xd471,
|
||||
+ .subdevice = 0x9022,
|
||||
+ .card = CX23885_BOARD_TEVII_S471,
|
||||
},
|
||||
};
|
||||
const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids);
|
||||
@@ -1485,6 +1493,7 @@ void cx23885_card_setup(struct cx23885_dev *dev)
|
||||
case CX23885_BOARD_BST_PS8512:
|
||||
case CX23885_BOARD_DVBSKY_S950:
|
||||
case CX23885_BOARD_TEVII_S470:
|
||||
+ case CX23885_BOARD_TEVII_S471:
|
||||
case CX23885_BOARD_DVBWORLD_2005:
|
||||
ts1->gen_ctrl_val = 0x5; /* Parallel */
|
||||
ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
|
||||
diff --git a/drivers/media/video/cx23885/cx23885-dvb.c b/drivers/media/video/cx23885/cx23885-dvb.c
|
||||
index af9c459..9f68250 100644
|
||||
--- a/drivers/media/video/cx23885/cx23885-dvb.c
|
||||
+++ b/drivers/media/video/cx23885/cx23885-dvb.c
|
||||
@@ -1174,6 +1174,14 @@ static int dvb_register(struct cx23885_tsport *port)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
+ case CX23885_BOARD_TEVII_S471:
|
||||
+ i2c_bus = &dev->i2c_bus[1];
|
||||
+
|
||||
+ fe0->dvb.frontend = dvb_attach(ds3000_attach,
|
||||
+ &tevii_ds3000_config,
|
||||
+ &i2c_bus->i2c_adap);
|
||||
+ break;
|
||||
+
|
||||
default:
|
||||
printk(KERN_INFO "%s: The frontend of your DVB/ATSC card "
|
||||
" isn't supported yet\n",
|
||||
diff --git a/drivers/media/video/cx23885/cx23885.h b/drivers/media/video/cx23885/cx23885.h
|
||||
index 6f058f1..19cebdf 100644
|
||||
--- a/drivers/media/video/cx23885/cx23885.h
|
||||
+++ b/drivers/media/video/cx23885/cx23885.h
|
||||
@@ -90,6 +90,7 @@
|
||||
#define CX23885_BOARD_BST_PS8512 (CX23885_BOARD_MPX885+1)
|
||||
#define CX23885_BOARD_DVBSKY_S952 (CX23885_BOARD_BST_PS8512+1)
|
||||
#define CX23885_BOARD_DVBSKY_S950 (CX23885_BOARD_DVBSKY_S952+1)
|
||||
+#define CX23885_BOARD_TEVII_S471 (CX23885_BOARD_DVBSKY_S950+1)
|
||||
|
||||
#define GPIO_0 0x00000001
|
||||
#define GPIO_1 0x00000002
|
@ -1,141 +0,0 @@
|
||||
diff --git a/drivers/media/dvb/frontends/stb0899_algo.c b/drivers/media/dvb/frontends/stb0899_algo.c
|
||||
index 2da55ec..3efde1e 100644
|
||||
--- a/drivers/media/dvb/frontends/stb0899_algo.c
|
||||
+++ b/drivers/media/dvb/frontends/stb0899_algo.c
|
||||
@@ -206,7 +206,6 @@ static enum stb0899_status stb0899_check_tmg(struct stb0899_state *state)
|
||||
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 @@ static enum stb0899_status stb0899_search_tmg(struct stb0899_state *state)
|
||||
|
||||
/* 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 @@ static enum stb0899_status stb0899_search_tmg(struct stb0899_state *state)
|
||||
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 @@ static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state)
|
||||
{
|
||||
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 @@ static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state)
|
||||
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 @@ static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state)
|
||||
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 @@ static enum stb0899_status stb0899_check_data(struct stb0899_state *state)
|
||||
int lock = 0, index = 0, dataTime = 500, loop;
|
||||
u8 reg;
|
||||
|
||||
+ msleep(1);
|
||||
internal->status = NODATA;
|
||||
|
||||
/* RESET FEC */
|
||||
@@ -348,6 +352,7 @@ static enum stb0899_status stb0899_check_data(struct stb0899_state *state)
|
||||
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;
|
||||
@@ -360,6 +365,7 @@ static enum stb0899_status stb0899_check_data(struct stb0899_state *state)
|
||||
|
||||
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);
|
||||
@@ -387,20 +393,21 @@ static enum stb0899_status stb0899_search_data(struct stb0899_state *state)
|
||||
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) {
|
||||
@@ -414,9 +421,9 @@ static enum stb0899_status stb0899_search_data(struct stb0899_state *state)
|
||||
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);
|
||||
|
||||
--
|
||||
1.7.1
|
@ -1,46 +0,0 @@
|
||||
diff -Naur linux-3.2.21/drivers/media/dvb/dvb-usb/dw2102.c linux-3.2.21.patch/drivers/media/dvb/dvb-usb/dw2102.c
|
||||
--- linux-3.2.21/drivers/media/dvb/dvb-usb/dw2102.c 2012-06-20 00:18:30.000000000 +0200
|
||||
+++ linux-3.2.21.patch/drivers/media/dvb/dvb-usb/dw2102.c 2012-06-28 14:08:50.721691934 +0200
|
||||
@@ -1181,6 +1181,14 @@
|
||||
{
|
||||
u8 obuf[3] = { 0xe, 0x80, 0 };
|
||||
u8 ibuf[] = { 0 };
|
||||
+
|
||||
+ if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0)
|
||||
+ err("command 0x0e transfer failed.");
|
||||
+
|
||||
+ //power on su3000
|
||||
+ obuf[0] = 0xe;
|
||||
+ obuf[1] = 0x02;
|
||||
+ obuf[2] = 1;
|
||||
|
||||
if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0)
|
||||
err("command 0x0e transfer failed.");
|
||||
@@ -1448,6 +1456,7 @@
|
||||
{USB_DEVICE(0x3034, 0x7500)},
|
||||
{USB_DEVICE(0x1f4d, 0x3000)},
|
||||
{USB_DEVICE(USB_VID_TERRATEC, 0x00a8)},
|
||||
+ {USB_DEVICE(USB_VID_TERRATEC, 0x00b0)},
|
||||
{USB_DEVICE(0x9022, USB_PID_TEVII_S480_1)},
|
||||
{USB_DEVICE(0x9022, USB_PID_TEVII_S480_2)},
|
||||
{USB_DEVICE(0x1f4d, 0x3100)},
|
||||
@@ -1839,7 +1848,7 @@
|
||||
}},
|
||||
}
|
||||
},
|
||||
- .num_device_descs = 3,
|
||||
+ .num_device_descs = 4,
|
||||
.devices = {
|
||||
{ "SU3000HD DVB-S USB2.0",
|
||||
{ &dw2102_table[10], NULL },
|
||||
@@ -1853,6 +1862,10 @@
|
||||
{ &dw2102_table[14], NULL },
|
||||
{ NULL },
|
||||
},
|
||||
+ { "Terratec Cinergy S2 USB HD Rev.2",
|
||||
+ { &dw2102_table[17], NULL },
|
||||
+ { NULL },
|
||||
+ },
|
||||
}
|
||||
};
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,45 +0,0 @@
|
||||
From 35621030c0bd5cb4f1a345cf2b4a97e290bc244a Mon Sep 17 00:00:00 2001
|
||||
From: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
Date: Fri, 23 Sep 2011 13:03:42 -0300
|
||||
Subject: [PATCH] [media] xc5000: Add support for get_if_frequency
|
||||
|
||||
This is needed for devices with DRX-K and xc5000.
|
||||
|
||||
Tested with a HVR 930C hardware.
|
||||
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
---
|
||||
drivers/media/common/tuners/xc5000.c | 9 +++++++++
|
||||
1 files changed, 9 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/media/common/tuners/xc5000.c b/drivers/media/common/tuners/xc5000.c
|
||||
index 88b329c..ecd1f95 100644
|
||||
--- a/drivers/media/common/tuners/xc5000.c
|
||||
+++ b/drivers/media/common/tuners/xc5000.c
|
||||
@@ -968,6 +968,14 @@ static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int xc5000_get_if_frequency(struct dvb_frontend *fe, u32 *freq)
|
||||
+{
|
||||
+ struct xc5000_priv *priv = fe->tuner_priv;
|
||||
+ dprintk(1, "%s()\n", __func__);
|
||||
+ *freq = priv->if_khz * 1000;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int xc5000_get_bandwidth(struct dvb_frontend *fe, u32 *bw)
|
||||
{
|
||||
struct xc5000_priv *priv = fe->tuner_priv;
|
||||
@@ -1108,6 +1116,7 @@ static const struct dvb_tuner_ops xc5000_tuner_ops = {
|
||||
.set_params = xc5000_set_params,
|
||||
.set_analog_params = xc5000_set_analog_params,
|
||||
.get_frequency = xc5000_get_frequency,
|
||||
+ .get_if_frequency = xc5000_get_if_frequency,
|
||||
.get_bandwidth = xc5000_get_bandwidth,
|
||||
.get_status = xc5000_get_status
|
||||
};
|
||||
--
|
||||
1.7.2.5
|
||||
|
||||
|
@ -1285,7 +1285,6 @@ CONFIG_DVB_TUNER_ITD1000=m
|
||||
CONFIG_DVB_TUNER_CX24113=m
|
||||
CONFIG_DVB_TDA826X=m
|
||||
CONFIG_DVB_CX24116=m
|
||||
CONFIG_DVB_M88DS3103=m
|
||||
CONFIG_DVB_SI21XX=m
|
||||
CONFIG_DVB_DS3000=m
|
||||
CONFIG_DVB_TDA10071=m
|
||||
|
Loading…
x
Reference in New Issue
Block a user