diff options
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/em28xx/em28xx-cards.c | 105 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-input.c | 52 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx.h | 46 |
3 files changed, 106 insertions, 97 deletions
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index fe0ee4518479..368a766eb802 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
@@ -42,12 +42,36 @@ static int tuner = -1; | |||
42 | module_param(tuner, int, 0444); | 42 | module_param(tuner, int, 0444); |
43 | MODULE_PARM_DESC(tuner, "tuner type"); | 43 | MODULE_PARM_DESC(tuner, "tuner type"); |
44 | 44 | ||
45 | static unsigned int disable_ir; | ||
46 | module_param(disable_ir, int, 0444); | ||
47 | MODULE_PARM_DESC(disable_ir, "disable infrared remote support"); | ||
48 | |||
45 | struct em28xx_hash_table { | 49 | struct em28xx_hash_table { |
46 | unsigned long hash; | 50 | unsigned long hash; |
47 | unsigned int model; | 51 | unsigned int model; |
48 | unsigned int tuner; | 52 | unsigned int tuner; |
49 | }; | 53 | }; |
50 | 54 | ||
55 | /* Boards supported by driver */ | ||
56 | |||
57 | #define EM2800_BOARD_UNKNOWN 0 | ||
58 | #define EM2820_BOARD_UNKNOWN 1 | ||
59 | #define EM2820_BOARD_TERRATEC_CINERGY_250 2 | ||
60 | #define EM2820_BOARD_PINNACLE_USB_2 3 | ||
61 | #define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 4 | ||
62 | #define EM2820_BOARD_MSI_VOX_USB_2 5 | ||
63 | #define EM2800_BOARD_TERRATEC_CINERGY_200 6 | ||
64 | #define EM2800_BOARD_LEADTEK_WINFAST_USBII 7 | ||
65 | #define EM2800_BOARD_KWORLD_USB2800 8 | ||
66 | #define EM2820_BOARD_PINNACLE_DVC_90 9 | ||
67 | #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 10 | ||
68 | #define EM2880_BOARD_TERRATEC_HYBRID_XS 11 | ||
69 | #define EM2820_BOARD_KWORLD_PVRTV2800RF 12 | ||
70 | #define EM2880_BOARD_TERRATEC_PRODIGY_XS 13 | ||
71 | #define EM2820_BOARD_PROLINK_PLAYTV_USB2 14 | ||
72 | #define EM2800_BOARD_VGEAR_POCKETTV 15 | ||
73 | #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 16 | ||
74 | |||
51 | struct em28xx_board em28xx_boards[] = { | 75 | struct em28xx_board em28xx_boards[] = { |
52 | [EM2800_BOARD_UNKNOWN] = { | 76 | [EM2800_BOARD_UNKNOWN] = { |
53 | .name = "Unknown EM2800 video grabber", | 77 | .name = "Unknown EM2800 video grabber", |
@@ -245,26 +269,28 @@ struct em28xx_board em28xx_boards[] = { | |||
245 | } }, | 269 | } }, |
246 | }, | 270 | }, |
247 | [EM2820_BOARD_MSI_VOX_USB_2] = { | 271 | [EM2820_BOARD_MSI_VOX_USB_2] = { |
248 | .name = "MSI VOX USB 2.0", | 272 | .name = "MSI VOX USB 2.0", |
249 | .vchannels = 3, | 273 | .vchannels = 3, |
250 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, | 274 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
251 | .tda9887_conf = TDA9887_PRESENT | | 275 | .tda9887_conf = TDA9887_PRESENT | |
252 | TDA9887_PORT1_ACTIVE | | 276 | TDA9887_PORT1_ACTIVE | |
253 | TDA9887_PORT2_ACTIVE, | 277 | TDA9887_PORT2_ACTIVE, |
254 | .has_tuner = 1, | 278 | .has_tuner = 1, |
255 | .decoder = EM28XX_SAA7114, | 279 | .max_range_640_480 = 1, |
256 | .input = { { | 280 | |
257 | .type = EM28XX_VMUX_TELEVISION, | 281 | .decoder = EM28XX_SAA7114, |
258 | .vmux = SAA7115_COMPOSITE4, | 282 | .input = { { |
259 | .amux = 0, | 283 | .type = EM28XX_VMUX_TELEVISION, |
284 | .vmux = SAA7115_COMPOSITE4, | ||
285 | .amux = 0, | ||
260 | }, { | 286 | }, { |
261 | .type = EM28XX_VMUX_COMPOSITE1, | 287 | .type = EM28XX_VMUX_COMPOSITE1, |
262 | .vmux = SAA7115_COMPOSITE0, | 288 | .vmux = SAA7115_COMPOSITE0, |
263 | .amux = 1, | 289 | .amux = 1, |
264 | }, { | 290 | }, { |
265 | .type = EM28XX_VMUX_SVIDEO, | 291 | .type = EM28XX_VMUX_SVIDEO, |
266 | .vmux = SAA7115_SVIDEO3, | 292 | .vmux = SAA7115_SVIDEO3, |
267 | .amux = 1, | 293 | .amux = 1, |
268 | } }, | 294 | } }, |
269 | }, | 295 | }, |
270 | [EM2800_BOARD_TERRATEC_CINERGY_200] = { | 296 | [EM2800_BOARD_TERRATEC_CINERGY_200] = { |
@@ -649,11 +675,54 @@ static void em28xx_set_model(struct em28xx *dev) | |||
649 | dev->video_inputs = em28xx_boards[dev->model].vchannels; | 675 | dev->video_inputs = em28xx_boards[dev->model].vchannels; |
650 | dev->analog_gpio = em28xx_boards[dev->model].analog_gpio; | 676 | dev->analog_gpio = em28xx_boards[dev->model].analog_gpio; |
651 | dev->has_12mhz_i2s = em28xx_boards[dev->model].has_12mhz_i2s; | 677 | dev->has_12mhz_i2s = em28xx_boards[dev->model].has_12mhz_i2s; |
678 | dev->max_range_640_480 = em28xx_boards[dev->model].max_range_640_480; | ||
652 | 679 | ||
653 | if (!em28xx_boards[dev->model].has_tuner) | 680 | if (!em28xx_boards[dev->model].has_tuner) |
654 | dev->tuner_type = UNSET; | 681 | dev->tuner_type = UNSET; |
655 | } | 682 | } |
656 | 683 | ||
684 | /* ----------------------------------------------------------------------- */ | ||
685 | void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir) | ||
686 | { | ||
687 | if (disable_ir) { | ||
688 | ir->get_key = NULL; | ||
689 | return ; | ||
690 | } | ||
691 | |||
692 | /* detect & configure */ | ||
693 | switch (dev->model) { | ||
694 | case (EM2800_BOARD_UNKNOWN): | ||
695 | break; | ||
696 | case (EM2820_BOARD_UNKNOWN): | ||
697 | break; | ||
698 | case (EM2800_BOARD_TERRATEC_CINERGY_200): | ||
699 | case (EM2820_BOARD_TERRATEC_CINERGY_250): | ||
700 | ir->ir_codes = ir_codes_em_terratec; | ||
701 | ir->get_key = em28xx_get_key_terratec; | ||
702 | snprintf(ir->c.name, sizeof(ir->c.name), | ||
703 | "i2c IR (EM28XX Terratec)"); | ||
704 | break; | ||
705 | case (EM2820_BOARD_PINNACLE_USB_2): | ||
706 | ir->ir_codes = ir_codes_pinnacle_grey; | ||
707 | ir->get_key = em28xx_get_key_pinnacle_usb_grey; | ||
708 | snprintf(ir->c.name, sizeof(ir->c.name), | ||
709 | "i2c IR (EM28XX Pinnacle PCTV)"); | ||
710 | break; | ||
711 | case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2): | ||
712 | ir->ir_codes = ir_codes_hauppauge_new; | ||
713 | ir->get_key = em28xx_get_key_em_haup; | ||
714 | snprintf(ir->c.name, sizeof(ir->c.name), | ||
715 | "i2c IR (EM2840 Hauppauge)"); | ||
716 | break; | ||
717 | case (EM2820_BOARD_MSI_VOX_USB_2): | ||
718 | break; | ||
719 | case (EM2800_BOARD_LEADTEK_WINFAST_USBII): | ||
720 | break; | ||
721 | case (EM2800_BOARD_KWORLD_USB2800): | ||
722 | break; | ||
723 | } | ||
724 | } | ||
725 | |||
657 | void em28xx_card_setup(struct em28xx *dev) | 726 | void em28xx_card_setup(struct em28xx *dev) |
658 | { | 727 | { |
659 | em28xx_set_model(dev); | 728 | em28xx_set_model(dev); |
diff --git a/drivers/media/video/em28xx/em28xx-input.c b/drivers/media/video/em28xx/em28xx-input.c index e3894b68c4ee..10da2fd8d987 100644 --- a/drivers/media/video/em28xx/em28xx-input.c +++ b/drivers/media/video/em28xx/em28xx-input.c | |||
@@ -30,11 +30,7 @@ | |||
30 | 30 | ||
31 | #include "em28xx.h" | 31 | #include "em28xx.h" |
32 | 32 | ||
33 | static unsigned int disable_ir = 0; | 33 | static unsigned int ir_debug; |
34 | module_param(disable_ir, int, 0444); | ||
35 | MODULE_PARM_DESC(disable_ir,"disable infrared remote support"); | ||
36 | |||
37 | static unsigned int ir_debug = 0; | ||
38 | module_param(ir_debug, int, 0644); | 34 | module_param(ir_debug, int, 0644); |
39 | MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]"); | 35 | MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]"); |
40 | 36 | ||
@@ -43,7 +39,7 @@ MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]"); | |||
43 | 39 | ||
44 | /* ----------------------------------------------------------------------- */ | 40 | /* ----------------------------------------------------------------------- */ |
45 | 41 | ||
46 | static int get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | 42 | int em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) |
47 | { | 43 | { |
48 | unsigned char b; | 44 | unsigned char b; |
49 | 45 | ||
@@ -72,7 +68,7 @@ static int get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | |||
72 | } | 68 | } |
73 | 69 | ||
74 | 70 | ||
75 | static int get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | 71 | int em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) |
76 | { | 72 | { |
77 | unsigned char buf[2]; | 73 | unsigned char buf[2]; |
78 | unsigned char code; | 74 | unsigned char code; |
@@ -103,7 +99,8 @@ static int get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | |||
103 | return 1; | 99 | return 1; |
104 | } | 100 | } |
105 | 101 | ||
106 | static int get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | 102 | int em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key, |
103 | u32 *ir_raw) | ||
107 | { | 104 | { |
108 | unsigned char buf[3]; | 105 | unsigned char buf[3]; |
109 | 106 | ||
@@ -125,45 +122,6 @@ static int get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw | |||
125 | return 1; | 122 | return 1; |
126 | } | 123 | } |
127 | 124 | ||
128 | /* ----------------------------------------------------------------------- */ | ||
129 | void em28xx_set_ir(struct em28xx * dev,struct IR_i2c *ir) | ||
130 | { | ||
131 | if (disable_ir) { | ||
132 | ir->get_key=NULL; | ||
133 | return ; | ||
134 | } | ||
135 | |||
136 | /* detect & configure */ | ||
137 | switch (dev->model) { | ||
138 | case (EM2800_BOARD_UNKNOWN): | ||
139 | break; | ||
140 | case (EM2820_BOARD_UNKNOWN): | ||
141 | break; | ||
142 | case (EM2800_BOARD_TERRATEC_CINERGY_200): | ||
143 | case (EM2820_BOARD_TERRATEC_CINERGY_250): | ||
144 | ir->ir_codes = ir_codes_em_terratec; | ||
145 | ir->get_key = get_key_terratec; | ||
146 | snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (EM28XX Terratec)"); | ||
147 | break; | ||
148 | case (EM2820_BOARD_PINNACLE_USB_2): | ||
149 | ir->ir_codes = ir_codes_pinnacle_grey; | ||
150 | ir->get_key = get_key_pinnacle_usb_grey; | ||
151 | snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (EM28XX Pinnacle PCTV)"); | ||
152 | break; | ||
153 | case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2): | ||
154 | ir->ir_codes = ir_codes_hauppauge_new; | ||
155 | ir->get_key = get_key_em_haup; | ||
156 | snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (EM2840 Hauppauge)"); | ||
157 | break; | ||
158 | case (EM2820_BOARD_MSI_VOX_USB_2): | ||
159 | break; | ||
160 | case (EM2800_BOARD_LEADTEK_WINFAST_USBII): | ||
161 | break; | ||
162 | case (EM2800_BOARD_KWORLD_USB2800): | ||
163 | break; | ||
164 | } | ||
165 | } | ||
166 | |||
167 | /* ---------------------------------------------------------------------- | 125 | /* ---------------------------------------------------------------------- |
168 | * Local variables: | 126 | * Local variables: |
169 | * c-basic-offset: 8 | 127 | * c-basic-offset: 8 |
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h index 2ba34e5b4cc2..3ef80d8b566e 100644 --- a/drivers/media/video/em28xx/em28xx.h +++ b/drivers/media/video/em28xx/em28xx.h | |||
@@ -30,26 +30,6 @@ | |||
30 | #include <linux/mutex.h> | 30 | #include <linux/mutex.h> |
31 | #include <media/ir-kbd-i2c.h> | 31 | #include <media/ir-kbd-i2c.h> |
32 | 32 | ||
33 | /* Boards supported by driver */ | ||
34 | |||
35 | #define EM2800_BOARD_UNKNOWN 0 | ||
36 | #define EM2820_BOARD_UNKNOWN 1 | ||
37 | #define EM2820_BOARD_TERRATEC_CINERGY_250 2 | ||
38 | #define EM2820_BOARD_PINNACLE_USB_2 3 | ||
39 | #define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 4 | ||
40 | #define EM2820_BOARD_MSI_VOX_USB_2 5 | ||
41 | #define EM2800_BOARD_TERRATEC_CINERGY_200 6 | ||
42 | #define EM2800_BOARD_LEADTEK_WINFAST_USBII 7 | ||
43 | #define EM2800_BOARD_KWORLD_USB2800 8 | ||
44 | #define EM2820_BOARD_PINNACLE_DVC_90 9 | ||
45 | #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 10 | ||
46 | #define EM2880_BOARD_TERRATEC_HYBRID_XS 11 | ||
47 | #define EM2820_BOARD_KWORLD_PVRTV2800RF 12 | ||
48 | #define EM2880_BOARD_TERRATEC_PRODIGY_XS 13 | ||
49 | #define EM2820_BOARD_PROLINK_PLAYTV_USB2 14 | ||
50 | #define EM2800_BOARD_VGEAR_POCKETTV 15 | ||
51 | #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 16 | ||
52 | |||
53 | #define UNSET -1 | 33 | #define UNSET -1 |
54 | 34 | ||
55 | /* maximum number of em28xx boards */ | 35 | /* maximum number of em28xx boards */ |
@@ -185,6 +165,7 @@ struct em28xx_board { | |||
185 | unsigned int has_msp34xx:1; | 165 | unsigned int has_msp34xx:1; |
186 | unsigned int mts_firmware:1; | 166 | unsigned int mts_firmware:1; |
187 | unsigned int has_12mhz_i2s:1; | 167 | unsigned int has_12mhz_i2s:1; |
168 | unsigned int max_range_640_480:1; | ||
188 | 169 | ||
189 | unsigned int analog_gpio; | 170 | unsigned int analog_gpio; |
190 | 171 | ||
@@ -251,6 +232,7 @@ struct em28xx { | |||
251 | unsigned int stream_on:1; /* Locks streams */ | 232 | unsigned int stream_on:1; /* Locks streams */ |
252 | unsigned int has_audio_class:1; | 233 | unsigned int has_audio_class:1; |
253 | unsigned int has_12mhz_i2s:1; | 234 | unsigned int has_12mhz_i2s:1; |
235 | unsigned int max_range_640_480:1; | ||
254 | 236 | ||
255 | int video_inputs; /* number of video inputs */ | 237 | int video_inputs; /* number of video inputs */ |
256 | struct list_head devlist; | 238 | struct list_head devlist; |
@@ -352,10 +334,6 @@ void em28xx_do_i2c_scan(struct em28xx *dev); | |||
352 | int em28xx_i2c_register(struct em28xx *dev); | 334 | int em28xx_i2c_register(struct em28xx *dev); |
353 | int em28xx_i2c_unregister(struct em28xx *dev); | 335 | int em28xx_i2c_unregister(struct em28xx *dev); |
354 | 336 | ||
355 | /* Provided by em28xx-input.c */ | ||
356 | |||
357 | void em28xx_set_ir(struct em28xx * dev,struct IR_i2c *ir); | ||
358 | |||
359 | /* Provided by em28xx-core.c */ | 337 | /* Provided by em28xx-core.c */ |
360 | 338 | ||
361 | u32 em28xx_request_buffers(struct em28xx *dev, u32 count); | 339 | u32 em28xx_request_buffers(struct em28xx *dev, u32 count); |
@@ -393,6 +371,14 @@ extern void em28xx_card_setup(struct em28xx *dev); | |||
393 | extern struct em28xx_board em28xx_boards[]; | 371 | extern struct em28xx_board em28xx_boards[]; |
394 | extern struct usb_device_id em28xx_id_table[]; | 372 | extern struct usb_device_id em28xx_id_table[]; |
395 | extern const unsigned int em28xx_bcount; | 373 | extern const unsigned int em28xx_bcount; |
374 | void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir); | ||
375 | |||
376 | /* Provided by em28xx-input.c */ | ||
377 | /* TODO: Check if the standard get_key handlers on ir-common can be used */ | ||
378 | int em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); | ||
379 | int em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw); | ||
380 | int em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key, | ||
381 | u32 *ir_raw); | ||
396 | 382 | ||
397 | /* em2800 registers */ | 383 | /* em2800 registers */ |
398 | #define EM2800_AUDIOSRC_REG 0x08 | 384 | #define EM2800_AUDIOSRC_REG 0x08 |
@@ -550,21 +536,17 @@ inline static int em28xx_gamma_set(struct em28xx *dev, s32 val) | |||
550 | /*FIXME: maxw should be dependent of alt mode */ | 536 | /*FIXME: maxw should be dependent of alt mode */ |
551 | inline static unsigned int norm_maxw(struct em28xx *dev) | 537 | inline static unsigned int norm_maxw(struct em28xx *dev) |
552 | { | 538 | { |
553 | switch (dev->model) { | 539 | if (dev->max_range_640_480) |
554 | case EM2820_BOARD_MSI_VOX_USB_2: | ||
555 | return 640; | 540 | return 640; |
556 | default: | 541 | else |
557 | return 720; | 542 | return 720; |
558 | } | ||
559 | } | 543 | } |
560 | 544 | ||
561 | inline static unsigned int norm_maxh(struct em28xx *dev) | 545 | inline static unsigned int norm_maxh(struct em28xx *dev) |
562 | { | 546 | { |
563 | switch (dev->model) { | 547 | if (dev->max_range_640_480) |
564 | case EM2820_BOARD_MSI_VOX_USB_2: | ||
565 | return 480; | 548 | return 480; |
566 | default: | 549 | else |
567 | return (dev->norm & V4L2_STD_625_50) ? 576 : 480; | 550 | return (dev->norm & V4L2_STD_625_50) ? 576 : 480; |
568 | } | ||
569 | } | 551 | } |
570 | #endif | 552 | #endif |