aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Isely <isely@pobox.com>2008-04-22 13:45:42 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-04-24 13:07:48 -0400
commit40381cb02fb7fc0b46c55e3a71325b5d930580fa (patch)
treea2654ff76b947f1aa3dcee9bc4ad77e7504d022b
parentc55a97d7538d5f3abbee5486e37e56e896478fbd (diff)
V4L/DVB (7313): pvrusb2: Make LED control into a device-specific attribute
The pvrusb2 driver has used hardcoded logic to control the LED on the device. However this is really Hauppauge-specific behavior. This change defines a new device attribute for LED control and sets things up appropriately for Hauppauge devices. Signed-off-by: Mike Isely <isely@pobox.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-devattr.c3
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-devattr.h8
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-encoder.c4
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h3
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw.c39
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-hdw.h3
6 files changed, 46 insertions, 14 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-devattr.c b/drivers/media/video/pvrusb2/pvrusb2-devattr.c
index 1a60591e38b5..638c577e3268 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-devattr.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-devattr.c
@@ -61,6 +61,7 @@ static const struct pvr2_device_desc pvr2_device_29xxx = {
61 .flag_has_composite = !0, 61 .flag_has_composite = !0,
62 .flag_has_svideo = !0, 62 .flag_has_svideo = !0,
63 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 63 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
64 .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE,
64}; 65};
65 66
66 67
@@ -94,6 +95,7 @@ static const struct pvr2_device_desc pvr2_device_24xxx = {
94 .flag_has_composite = !0, 95 .flag_has_composite = !0,
95 .flag_has_svideo = !0, 96 .flag_has_svideo = !0,
96 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 97 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
98 .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE,
97}; 99};
98 100
99 101
@@ -235,6 +237,7 @@ static const struct pvr2_device_desc pvr2_device_75xxx = {
235 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, 237 .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
236 .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, 238 .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE,
237 .default_std_mask = V4L2_STD_NTSC_M, 239 .default_std_mask = V4L2_STD_NTSC_M,
240 .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE,
238}; 241};
239 242
240 243
diff --git a/drivers/media/video/pvrusb2/pvrusb2-devattr.h b/drivers/media/video/pvrusb2/pvrusb2-devattr.h
index 4e4798d6139f..ce4004978a92 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-devattr.h
+++ b/drivers/media/video/pvrusb2/pvrusb2-devattr.h
@@ -43,6 +43,9 @@ struct pvr2_string_table {
43#define PVR2_DIGITAL_SCHEME_HAUPPAUGE 1 43#define PVR2_DIGITAL_SCHEME_HAUPPAUGE 1
44#define PVR2_DIGITAL_SCHEME_ONAIR 2 44#define PVR2_DIGITAL_SCHEME_ONAIR 2
45 45
46#define PVR2_LED_SCHEME_NONE 0
47#define PVR2_LED_SCHEME_HAUPPAUGE 1
48
46/* This describes a particular hardware type (except for the USB device ID 49/* This describes a particular hardware type (except for the USB device ID
47 which must live in a separate structure due to environmental 50 which must live in a separate structure due to environmental
48 constraints). See the top of pvrusb2-hdw.c for where this is 51 constraints). See the top of pvrusb2-hdw.c for where this is
@@ -70,6 +73,11 @@ struct pvr2_device_desc {
70 drivers (search for things which touch this field). */ 73 drivers (search for things which touch this field). */
71 unsigned int signal_routing_scheme; 74 unsigned int signal_routing_scheme;
72 75
76 /* Indicates scheme for controlling device's LED (if any). The
77 driver will turn on the LED when streaming is underway. This
78 contains one of PVR2_LED_SCHEME_XXX. */
79 unsigned int led_scheme;
80
73 /* Control scheme to use if there is a digital tuner. This 81 /* Control scheme to use if there is a digital tuner. This
74 contains one of PVR2_DIGITAL_SCHEME_XXX. This is an arbitrary 82 contains one of PVR2_DIGITAL_SCHEME_XXX. This is an arbitrary
75 integer scheme id; its meaning is contained entirely within the 83 integer scheme id; its meaning is contained entirely within the
diff --git a/drivers/media/video/pvrusb2/pvrusb2-encoder.c b/drivers/media/video/pvrusb2/pvrusb2-encoder.c
index ccb5d14ddf85..324d1bd8500d 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-encoder.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-encoder.c
@@ -480,8 +480,6 @@ int pvr2_encoder_start(struct pvr2_hdw *hdw)
480 /* unmask some interrupts */ 480 /* unmask some interrupts */
481 pvr2_write_register(hdw, 0x0048, 0xbfffffff); 481 pvr2_write_register(hdw, 0x0048, 0xbfffffff);
482 482
483 pvr2_led_ctrl(hdw, 1);
484
485 pvr2_encoder_vcmd(hdw,CX2341X_ENC_MUTE_VIDEO,1, 483 pvr2_encoder_vcmd(hdw,CX2341X_ENC_MUTE_VIDEO,1,
486 hdw->input_val == PVR2_CVAL_INPUT_RADIO ? 1 : 0); 484 hdw->input_val == PVR2_CVAL_INPUT_RADIO ? 1 : 0);
487 485
@@ -524,8 +522,6 @@ int pvr2_encoder_stop(struct pvr2_hdw *hdw)
524 break; 522 break;
525 } 523 }
526 524
527 pvr2_led_ctrl(hdw, 0);
528
529 return status; 525 return status;
530} 526}
531 527
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
index af06e6c4b8d5..bc341ae5c79a 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
@@ -253,6 +253,9 @@ struct pvr2_hdw {
253 PVR2_STATE_xxxx */ 253 PVR2_STATE_xxxx */
254 unsigned int master_state; 254 unsigned int master_state;
255 255
256 /* True if device led is currently on */
257 int led_on;
258
256 /* True if states must be re-evaluated */ 259 /* True if states must be re-evaluated */
257 int state_stale; 260 int state_stale;
258 261
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index 9b1e22f2e555..c51c5cef82dd 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -3357,24 +3357,48 @@ static void pvr2_hdw_cmd_modeswitch(struct pvr2_hdw *hdw,int digitalFl)
3357} 3357}
3358 3358
3359 3359
3360/* Toggle LED */ 3360void pvr2_led_ctrl_hauppauge(struct pvr2_hdw *hdw, int onoff)
3361int pvr2_led_ctrl(struct pvr2_hdw *hdw, int onoff)
3362{ 3361{
3363 /* change some GPIO data 3362 /* change some GPIO data
3364 * 3363 *
3365 * note: bit d7 of dir appears to control the LED, 3364 * note: bit d7 of dir appears to control the LED,
3366 * so we shut it off here. 3365 * so we shut it off here.
3367 * 3366 *
3368 * FIXME: is this device-specific?
3369 */ 3367 */
3370 if (onoff) 3368 if (onoff) {
3371 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000481); 3369 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000481);
3372 else 3370 } else {
3373 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000401); 3371 pvr2_hdw_gpio_chg_dir(hdw, 0xffffffff, 0x00000401);
3374 3372 }
3375 pvr2_hdw_gpio_chg_out(hdw, 0xffffffff, 0x00000000); 3373 pvr2_hdw_gpio_chg_out(hdw, 0xffffffff, 0x00000000);
3374}
3376 3375
3377 return 0; 3376
3377typedef void (*led_method_func)(struct pvr2_hdw *,int);
3378
3379static led_method_func led_methods[] = {
3380 [PVR2_LED_SCHEME_HAUPPAUGE] = pvr2_led_ctrl_hauppauge,
3381};
3382
3383
3384/* Toggle LED */
3385static void pvr2_led_ctrl(struct pvr2_hdw *hdw,int onoff)
3386{
3387 unsigned int scheme_id;
3388 led_method_func fp;
3389
3390 if ((!onoff) == (!hdw->led_on)) return;
3391
3392 hdw->led_on = onoff != 0;
3393
3394 scheme_id = hdw->hdw_desc->led_scheme;
3395 if (scheme_id < ARRAY_SIZE(led_methods)) {
3396 fp = led_methods[scheme_id];
3397 } else {
3398 fp = NULL;
3399 }
3400
3401 if (fp) (*fp)(hdw,onoff);
3378} 3402}
3379 3403
3380 3404
@@ -3871,6 +3895,7 @@ static int pvr2_hdw_state_eval(struct pvr2_hdw *hdw)
3871 "Device state change from %s to %s", 3895 "Device state change from %s to %s",
3872 pvr2_get_state_name(hdw->master_state), 3896 pvr2_get_state_name(hdw->master_state),
3873 pvr2_get_state_name(st)); 3897 pvr2_get_state_name(st));
3898 pvr2_led_ctrl(hdw,st == PVR2_STATE_RUN);
3874 hdw->master_state = st; 3899 hdw->master_state = st;
3875 state_updated = !0; 3900 state_updated = !0;
3876 callback_flag = !0; 3901 callback_flag = !0;
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.h b/drivers/media/video/pvrusb2/pvrusb2-hdw.h
index 4fc9db3efff2..57e1ff491497 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.h
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.h
@@ -258,9 +258,6 @@ int pvr2_hdw_cmd_powerup(struct pvr2_hdw *);
258/* suspend */ 258/* suspend */
259int pvr2_hdw_cmd_powerdown(struct pvr2_hdw *); 259int pvr2_hdw_cmd_powerdown(struct pvr2_hdw *);
260 260
261/* toggle LED */
262int pvr2_led_ctrl(struct pvr2_hdw *hdw, int onoff);
263
264/* Order decoder to reset */ 261/* Order decoder to reset */
265int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *); 262int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *);
266 263