aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMike Isely <isely@pobox.com>2007-11-25 23:53:12 -0500
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-01-25 16:03:02 -0500
commit989eb154eafad00c3b5039a3eca03e108dac1df8 (patch)
tree1a2b0638f473c4d5877188f80bce0efbeee0ded9 /drivers
parent681c739944018d80dbcf7f19997eba97676c7116 (diff)
V4L/DVB (6692): pvrusb2: Centralize device specific attributes into a single place
The pvrusb2 driver currently supports two variants of the Hauppauge PVR USB2. However there are other hardware types potentially supportable, but the driver at the moment is not structured to make it easy to describe these minor variations. This changeset is the first set of changes to make such additional device support possible. Device attributes are held in several tables all contained within pvrusb2-devattr.c; all other device-specific driver behavior now derives from these tables. Signed-off-by: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-devattr.c101
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-devattr.h87
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-encoder.c16
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h6
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw.c91
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw.h3
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-i2c-core.c8
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-main.c1
8 files changed, 219 insertions, 94 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-devattr.c b/drivers/media/video/pvrusb2/pvrusb2-devattr.c
new file mode 100644
index 000000000000..aebcb846de6a
--- /dev/null
+++ b/drivers/media/video/pvrusb2/pvrusb2-devattr.c
@@ -0,0 +1,101 @@
1/*
2 *
3 * $Id$
4 *
5 * Copyright (C) 2007 Mike Isely <isely@pobox.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21
22/*
23
24This source file should encompass ALL per-device type information for the
25driver. To define a new device, add elements to the pvr2_device_table and
26pvr2_device_desc structures.
27
28*/
29
30#include "pvrusb2-devattr.h"
31#include <linux/usb.h>
32
33/* Known major hardware variants, keyed from device ID */
34#define PVR2_HDW_TYPE_29XXX 0
35#define PVR2_HDW_TYPE_24XXX 1
36
37struct usb_device_id pvr2_device_table[] = {
38 [PVR2_HDW_TYPE_29XXX] = { USB_DEVICE(0x2040, 0x2900) },
39 [PVR2_HDW_TYPE_24XXX] = { USB_DEVICE(0x2040, 0x2400) },
40 { }
41};
42
43/* Names of other client modules to request for 24xxx model hardware */
44static const char *pvr2_client_24xxx[] = {
45 "cx25840",
46 "tuner",
47 "wm8775",
48};
49
50/* Names of other client modules to request for 29xxx model hardware */
51static const char *pvr2_client_29xxx[] = {
52 "msp3400",
53 "saa7115",
54 "tuner",
55};
56
57/* Firmware file name(s) for 29xxx devices */
58static const char *pvr2_fw1_names_29xxx[] = {
59 "v4l-pvrusb2-29xxx-01.fw",
60};
61
62/* Firmware file name(s) for 29xxx devices */
63static const char *pvr2_fw1_names_24xxx[] = {
64 "v4l-pvrusb2-24xxx-01.fw",
65};
66
67const struct pvr2_device_desc pvr2_device_descriptions[] = {
68 [PVR2_HDW_TYPE_29XXX] = {
69 .description = "WinTV PVR USB2 Model Category 29xxxx",
70 .shortname = "29xxx",
71 .client_modules.lst = pvr2_client_29xxx,
72 .client_modules.cnt = ARRAY_SIZE(pvr2_client_29xxx),
73 .fx2_firmware.lst = pvr2_fw1_names_29xxx,
74 .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_29xxx),
75 },
76 [PVR2_HDW_TYPE_24XXX] = {
77 .description = "WinTV PVR USB2 Model Category 24xxxx",
78 .shortname = "24xxx",
79 .client_modules.lst = pvr2_client_24xxx,
80 .client_modules.cnt = ARRAY_SIZE(pvr2_client_24xxx),
81 .fx2_firmware.lst = pvr2_fw1_names_24xxx,
82 .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_24xxx),
83 .flag_has_cx25840 = !0,
84 .flag_has_wm8775 = !0,
85 },
86};
87
88const unsigned int pvr2_device_count = ARRAY_SIZE(pvr2_device_descriptions);
89
90MODULE_DEVICE_TABLE(usb, pvr2_device_table);
91
92
93/*
94 Stuff for Emacs to see, in order to encourage consistent editing style:
95 *** Local Variables: ***
96 *** mode: c ***
97 *** fill-column: 75 ***
98 *** tab-width: 8 ***
99 *** c-basic-offset: 8 ***
100 *** End: ***
101 */
diff --git a/drivers/media/video/pvrusb2/pvrusb2-devattr.h b/drivers/media/video/pvrusb2/pvrusb2-devattr.h
new file mode 100644
index 000000000000..6576aefd27c3
--- /dev/null
+++ b/drivers/media/video/pvrusb2/pvrusb2-devattr.h
@@ -0,0 +1,87 @@
1/*
2 *
3 * $Id$
4 *
5 * Copyright (C) 2005 Mike Isely <isely@pobox.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21#ifndef __PVRUSB2_DEVATTR_H
22#define __PVRUSB2_DEVATTR_H
23
24#include <linux/mod_devicetable.h>
25
26/*
27
28 This header defines structures used to describe attributes of a device.
29
30*/
31
32
33struct pvr2_string_table {
34 const char **lst;
35 unsigned int cnt;
36};
37
38
39/* This describes a particular hardware type (except for the USB device ID
40 which must live in a separate structure due to environmental
41 constraints). See the top of pvrusb2-hdw.c for where this is
42 instantiated. */
43struct pvr2_device_desc {
44 /* Single line text description of hardware */
45 const char *description;
46
47 /* Single token identifier for hardware */
48 const char *shortname;
49
50 /* List of additional client modules we need to load */
51 struct pvr2_string_table client_modules;
52
53 /* List of FX2 firmware file names we should search; if empty then
54 FX2 firmware check / load is skipped and we assume the device
55 was initialized from internal ROM. */
56 struct pvr2_string_table fx2_firmware;
57
58 /* If set, we don't bother trying to load cx23416 firmware. */
59 char flag_skip_cx23416_firmware;
60
61 /* Device does not require a powerup command to be issued. */
62 char flag_no_powerup;
63
64 /* Device has a cx25840 - this enables special additional logic to
65 handle it. */
66 char flag_has_cx25840;
67
68 /* Device has a wm8775 - this enables special additional logic to
69 ensure that it is found. */
70 char flag_has_wm8775;
71};
72
73extern const struct pvr2_device_desc pvr2_device_descriptions[];
74extern struct usb_device_id pvr2_device_table[];
75extern const unsigned int pvr2_device_count;
76
77#endif /* __PVRUSB2_HDW_INTERNAL_H */
78
79/*
80 Stuff for Emacs to see, in order to encourage consistent editing style:
81 *** Local Variables: ***
82 *** mode: c ***
83 *** fill-column: 75 ***
84 *** tab-width: 8 ***
85 *** c-basic-offset: 8 ***
86 *** End: ***
87 */
diff --git a/drivers/media/video/pvrusb2/pvrusb2-encoder.c b/drivers/media/video/pvrusb2/pvrusb2-encoder.c
index 5ca548cc7e7f..4271b4132664 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-encoder.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-encoder.c
@@ -370,13 +370,13 @@ static int pvr2_encoder_prep_config(struct pvr2_hdw *hdw)
370 370
371 /* This ENC_MISC(3,encMisc3Arg) command is critical - without 371 /* This ENC_MISC(3,encMisc3Arg) command is critical - without
372 it there will eventually be video corruption. Also, the 372 it there will eventually be video corruption. Also, the
373 29xxx case is strange - the Windows driver is passing 1 373 saa7115 case is strange - the Windows driver is passing 1
374 regardless of device type but if we have 1 for 29xxx device 374 regardless of device type but if we have 1 for saa7115
375 the video turns sluggish. */ 375 devices the video turns sluggish. */
376 switch (hdw->hdw_type) { 376 if (hdw->hdw_desc->flag_has_cx25840) {
377 case PVR2_HDW_TYPE_24XXX: encMisc3Arg = 1; break; 377 encMisc3Arg = 1;
378 case PVR2_HDW_TYPE_29XXX: encMisc3Arg = 0; break; 378 } else {
379 default: break; 379 encMisc3Arg = 0;
380 } 380 }
381 ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 3, 381 ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 3,
382 encMisc3Arg,0,0); 382 encMisc3Arg,0,0);
@@ -434,7 +434,7 @@ int pvr2_encoder_configure(struct pvr2_hdw *hdw)
434 434
435 /* saa7115: 0xf0 */ 435 /* saa7115: 0xf0 */
436 val = 0xf0; 436 val = 0xf0;
437 if (hdw->hdw_type == PVR2_HDW_TYPE_24XXX) { 437 if (hdw->hdw_desc->flag_has_cx25840) {
438 /* ivtv cx25840: 0x140 */ 438 /* ivtv cx25840: 0x140 */
439 val = 0x140; 439 val = 0x140;
440 } 440 }
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
index 8ee4549b7a9f..8c2d222960f1 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
@@ -40,6 +40,7 @@
40#include "pvrusb2-hdw.h" 40#include "pvrusb2-hdw.h"
41#include "pvrusb2-io.h" 41#include "pvrusb2-io.h"
42#include <media/cx2341x.h> 42#include <media/cx2341x.h>
43#include "pvrusb2-devattr.h"
43 44
44/* Legal values for PVR2_CID_HSM */ 45/* Legal values for PVR2_CID_HSM */
45#define PVR2_CVAL_HSM_FAIL 0 46#define PVR2_CVAL_HSM_FAIL 0
@@ -162,10 +163,6 @@ struct pvr2_decoder_ctrl {
162#define FW1_STATE_RELOAD 3 163#define FW1_STATE_RELOAD 3
163#define FW1_STATE_OK 4 164#define FW1_STATE_OK 4
164 165
165/* Known major hardware variants, keyed from device ID */
166#define PVR2_HDW_TYPE_29XXX 0
167#define PVR2_HDW_TYPE_24XXX 1
168
169typedef int (*pvr2_i2c_func)(struct pvr2_hdw *,u8,u8 *,u16,u8 *, u16); 166typedef int (*pvr2_i2c_func)(struct pvr2_hdw *,u8,u8 *,u16,u8 *, u16);
170#define PVR2_I2C_FUNC_CNT 128 167#define PVR2_I2C_FUNC_CNT 128
171 168
@@ -179,6 +176,7 @@ struct pvr2_hdw {
179 176
180 /* Device type, one of PVR2_HDW_TYPE_xxxxx */ 177 /* Device type, one of PVR2_HDW_TYPE_xxxxx */
181 unsigned int hdw_type; 178 unsigned int hdw_type;
179 const struct pvr2_device_desc *hdw_desc;
182 180
183 /* Kernel worker thread handling */ 181 /* Kernel worker thread handling */
184 struct workqueue_struct *workqueue; 182 struct workqueue_struct *workqueue;
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index 4e55a2a84073..c56208456bc0 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -41,47 +41,6 @@
41#define TV_MIN_FREQ 55250000L 41#define TV_MIN_FREQ 55250000L
42#define TV_MAX_FREQ 850000000L 42#define TV_MAX_FREQ 850000000L
43 43
44struct usb_device_id pvr2_device_table[] = {
45 [PVR2_HDW_TYPE_29XXX] = { USB_DEVICE(0x2040, 0x2900) },
46 [PVR2_HDW_TYPE_24XXX] = { USB_DEVICE(0x2040, 0x2400) },
47 { }
48};
49
50MODULE_DEVICE_TABLE(usb, pvr2_device_table);
51
52static const char *pvr2_device_names[] = {
53 [PVR2_HDW_TYPE_29XXX] = "WinTV PVR USB2 Model Category 29xxxx",
54 [PVR2_HDW_TYPE_24XXX] = "WinTV PVR USB2 Model Category 24xxxx",
55};
56
57struct pvr2_string_table {
58 const char **lst;
59 unsigned int cnt;
60};
61
62// Names of other client modules to request for 24xxx model hardware
63static const char *pvr2_client_24xxx[] = {
64 "cx25840",
65 "tuner",
66 "wm8775",
67};
68
69// Names of other client modules to request for 29xxx model hardware
70static const char *pvr2_client_29xxx[] = {
71 "msp3400",
72 "saa7115",
73 "tuner",
74};
75
76static struct pvr2_string_table pvr2_client_lists[] = {
77 [PVR2_HDW_TYPE_29XXX] = {
78 pvr2_client_29xxx, ARRAY_SIZE(pvr2_client_29xxx)
79 },
80 [PVR2_HDW_TYPE_24XXX] = {
81 pvr2_client_24xxx, ARRAY_SIZE(pvr2_client_24xxx)
82 },
83};
84
85static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL}; 44static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
86static DEFINE_MUTEX(pvr2_unit_mtx); 45static DEFINE_MUTEX(pvr2_unit_mtx);
87 46
@@ -394,8 +353,8 @@ static int ctrl_vres_max_get(struct pvr2_ctrl *cptr,int *vp)
394 353
395static int ctrl_vres_min_get(struct pvr2_ctrl *cptr,int *vp) 354static int ctrl_vres_min_get(struct pvr2_ctrl *cptr,int *vp)
396{ 355{
397 /* Actual minimum depends on device type. */ 356 /* Actual minimum depends on device digitizer type. */
398 if (cptr->hdw->hdw_type == PVR2_HDW_TYPE_24XXX) { 357 if (cptr->hdw->hdw_desc->flag_has_cx25840) {
399 *vp = 75; 358 *vp = 75;
400 } else { 359 } else {
401 *vp = 17; 360 *vp = 17;
@@ -1131,23 +1090,8 @@ static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
1131 unsigned int pipe; 1090 unsigned int pipe;
1132 int ret; 1091 int ret;
1133 u16 address; 1092 u16 address;
1134 static const char *fw_files_29xxx[] = {
1135 "v4l-pvrusb2-29xxx-01.fw",
1136 };
1137 static const char *fw_files_24xxx[] = {
1138 "v4l-pvrusb2-24xxx-01.fw",
1139 };
1140 static const struct pvr2_string_table fw_file_defs[] = {
1141 [PVR2_HDW_TYPE_29XXX] = {
1142 fw_files_29xxx, ARRAY_SIZE(fw_files_29xxx)
1143 },
1144 [PVR2_HDW_TYPE_24XXX] = {
1145 fw_files_24xxx, ARRAY_SIZE(fw_files_24xxx)
1146 },
1147 };
1148 1093
1149 if ((hdw->hdw_type >= ARRAY_SIZE(fw_file_defs)) || 1094 if (!hdw->hdw_desc->fx2_firmware.cnt) {
1150 (!fw_file_defs[hdw->hdw_type].lst)) {
1151 hdw->fw1_state = FW1_STATE_OK; 1095 hdw->fw1_state = FW1_STATE_OK;
1152 return 0; 1096 return 0;
1153 } 1097 }
@@ -1157,8 +1101,8 @@ static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
1157 trace_firmware("pvr2_upload_firmware1"); 1101 trace_firmware("pvr2_upload_firmware1");
1158 1102
1159 ret = pvr2_locate_firmware(hdw,&fw_entry,"fx2 controller", 1103 ret = pvr2_locate_firmware(hdw,&fw_entry,"fx2 controller",
1160 fw_file_defs[hdw->hdw_type].cnt, 1104 hdw->hdw_desc->fx2_firmware.cnt,
1161 fw_file_defs[hdw->hdw_type].lst); 1105 hdw->hdw_desc->fx2_firmware.lst);
1162 if (ret < 0) { 1106 if (ret < 0) {
1163 if (ret == -ENOENT) hdw->fw1_state = FW1_STATE_MISSING; 1107 if (ret == -ENOENT) hdw->fw1_state = FW1_STATE_MISSING;
1164 return ret; 1108 return ret;
@@ -1233,8 +1177,7 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
1233 CX2341X_FIRM_ENC_FILENAME, 1177 CX2341X_FIRM_ENC_FILENAME,
1234 }; 1178 };
1235 1179
1236 if ((hdw->hdw_type != PVR2_HDW_TYPE_29XXX) && 1180 if (hdw->hdw_desc->flag_skip_cx23416_firmware) {
1237 (hdw->hdw_type != PVR2_HDW_TYPE_24XXX)) {
1238 return 0; 1181 return 0;
1239 } 1182 }
1240 1183
@@ -1652,8 +1595,7 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
1652 unsigned int idx; 1595 unsigned int idx;
1653 struct pvr2_ctrl *cptr; 1596 struct pvr2_ctrl *cptr;
1654 int reloadFl = 0; 1597 int reloadFl = 0;
1655 if ((hdw->hdw_type == PVR2_HDW_TYPE_29XXX) || 1598 if (hdw->hdw_desc->fx2_firmware.cnt) {
1656 (hdw->hdw_type == PVR2_HDW_TYPE_24XXX)) {
1657 if (!reloadFl) { 1599 if (!reloadFl) {
1658 reloadFl = 1600 reloadFl =
1659 (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints 1601 (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
@@ -1689,17 +1631,11 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
1689 } 1631 }
1690 if (!pvr2_hdw_dev_ok(hdw)) return; 1632 if (!pvr2_hdw_dev_ok(hdw)) return;
1691 1633
1692 if (hdw->hdw_type < ARRAY_SIZE(pvr2_client_lists)) { 1634 for (idx = 0; idx < hdw->hdw_desc->client_modules.cnt; idx++) {
1693 for (idx = 0; 1635 request_module(hdw->hdw_desc->client_modules.lst[idx]);
1694 idx < pvr2_client_lists[hdw->hdw_type].cnt;
1695 idx++) {
1696 request_module(
1697 pvr2_client_lists[hdw->hdw_type].lst[idx]);
1698 }
1699 } 1636 }
1700 1637
1701 if ((hdw->hdw_type == PVR2_HDW_TYPE_29XXX) || 1638 if (!hdw->hdw_desc->flag_no_powerup) {
1702 (hdw->hdw_type == PVR2_HDW_TYPE_24XXX)) {
1703 pvr2_hdw_cmd_powerup(hdw); 1639 pvr2_hdw_cmd_powerup(hdw);
1704 if (!pvr2_hdw_dev_ok(hdw)) return; 1640 if (!pvr2_hdw_dev_ok(hdw)) return;
1705 } 1641 }
@@ -1857,20 +1793,22 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
1857 unsigned int hdw_type; 1793 unsigned int hdw_type;
1858 int valid_std_mask; 1794 int valid_std_mask;
1859 struct pvr2_ctrl *cptr; 1795 struct pvr2_ctrl *cptr;
1796 const struct pvr2_device_desc *hdw_desc;
1860 __u8 ifnum; 1797 __u8 ifnum;
1861 struct v4l2_queryctrl qctrl; 1798 struct v4l2_queryctrl qctrl;
1862 struct pvr2_ctl_info *ciptr; 1799 struct pvr2_ctl_info *ciptr;
1863 1800
1864 hdw_type = devid - pvr2_device_table; 1801 hdw_type = devid - pvr2_device_table;
1865 if (hdw_type >= ARRAY_SIZE(pvr2_device_names)) { 1802 if (hdw_type >= pvr2_device_count) {
1866 pvr2_trace(PVR2_TRACE_ERROR_LEGS, 1803 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
1867 "Bogus device type of %u reported",hdw_type); 1804 "Bogus device type of %u reported",hdw_type);
1868 return NULL; 1805 return NULL;
1869 } 1806 }
1807 hdw_desc = pvr2_device_descriptions + hdw_type;
1870 1808
1871 hdw = kzalloc(sizeof(*hdw),GFP_KERNEL); 1809 hdw = kzalloc(sizeof(*hdw),GFP_KERNEL);
1872 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_create: hdw=%p, type \"%s\"", 1810 pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_create: hdw=%p, type \"%s\"",
1873 hdw,pvr2_device_names[hdw_type]); 1811 hdw,hdw_desc->description);
1874 if (!hdw) goto fail; 1812 if (!hdw) goto fail;
1875 1813
1876 init_timer(&hdw->quiescent_timer); 1814 init_timer(&hdw->quiescent_timer);
@@ -1894,6 +1832,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
1894 GFP_KERNEL); 1832 GFP_KERNEL);
1895 if (!hdw->controls) goto fail; 1833 if (!hdw->controls) goto fail;
1896 hdw->hdw_type = hdw_type; 1834 hdw->hdw_type = hdw_type;
1835 hdw->hdw_desc = hdw_desc;
1897 for (idx = 0; idx < hdw->control_cnt; idx++) { 1836 for (idx = 0; idx < hdw->control_cnt; idx++) {
1898 cptr = hdw->controls + idx; 1837 cptr = hdw->controls + idx;
1899 cptr->hdw = hdw; 1838 cptr->hdw = hdw;
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.h b/drivers/media/video/pvrusb2/pvrusb2-hdw.h
index 383685f7c81f..205fa03057e6 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.h
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.h
@@ -311,9 +311,6 @@ void pvr2_hdw_trigger_module_log(struct pvr2_hdw *hdw);
311 a debugging aid. */ 311 a debugging aid. */
312int pvr2_upload_firmware2(struct pvr2_hdw *hdw); 312int pvr2_upload_firmware2(struct pvr2_hdw *hdw);
313 313
314/* List of device types that we can match */
315extern struct usb_device_id pvr2_device_table[];
316
317#endif /* __PVRUSB2_HDW_H */ 314#endif /* __PVRUSB2_HDW_H */
318 315
319/* 316/*
diff --git a/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c b/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
index f8b7bd1e0d89..7721ec85d572 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
@@ -980,14 +980,16 @@ void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
980 printk(KERN_INFO "%s: IR disabled\n",hdw->name); 980 printk(KERN_INFO "%s: IR disabled\n",hdw->name);
981 hdw->i2c_func[0x18] = i2c_black_hole; 981 hdw->i2c_func[0x18] = i2c_black_hole;
982 } else if (ir_mode[hdw->unit_number] == 1) { 982 } else if (ir_mode[hdw->unit_number] == 1) {
983 if (hdw->hdw_type == PVR2_HDW_TYPE_24XXX) { 983 if (hdw->hdw_desc->flag_has_cx25840) {
984 hdw->i2c_func[0x18] = i2c_24xxx_ir; 984 hdw->i2c_func[0x18] = i2c_24xxx_ir;
985 } 985 }
986 } 986 }
987 if (hdw->hdw_type == PVR2_HDW_TYPE_24XXX) { 987 if (hdw->hdw_desc->flag_has_cx25840) {
988 hdw->i2c_func[0x1b] = i2c_hack_wm8775;
989 hdw->i2c_func[0x44] = i2c_hack_cx25840; 988 hdw->i2c_func[0x44] = i2c_hack_cx25840;
990 } 989 }
990 if (hdw->hdw_desc->flag_has_wm8775) {
991 hdw->i2c_func[0x1b] = i2c_hack_wm8775;
992 }
991 993
992 // Configure the adapter and set up everything else related to it. 994 // Configure the adapter and set up everything else related to it.
993 memcpy(&hdw->i2c_adap,&pvr2_i2c_adap_template,sizeof(hdw->i2c_adap)); 995 memcpy(&hdw->i2c_adap,&pvr2_i2c_adap_template,sizeof(hdw->i2c_adap));
diff --git a/drivers/media/video/pvrusb2/pvrusb2-main.c b/drivers/media/video/pvrusb2/pvrusb2-main.c
index 11b3b2e84b90..a8370737b503 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-main.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-main.c
@@ -28,6 +28,7 @@
28#include <linux/videodev2.h> 28#include <linux/videodev2.h>
29 29
30#include "pvrusb2-hdw.h" 30#include "pvrusb2-hdw.h"
31#include "pvrusb2-devattr.h"
31#include "pvrusb2-context.h" 32#include "pvrusb2-context.h"
32#include "pvrusb2-debug.h" 33#include "pvrusb2-debug.h"
33#include "pvrusb2-v4l2.h" 34#include "pvrusb2-v4l2.h"