Hi just cleaning some errors which were introdruced by the patch i send you last month. - unregister the input device on disconnect and move cleanup stuff of the RC to own function - keymap should be static not const - set up keymap correctly and completly for input device plus a more cosmetic one: - usb endpoints are only 4bit numbers[0...15], the 8th bit only specifies the direction and is set by the snd/rcvxxxpipe() macro CU Peter -------------- next part -------------- Index: ttusb_dec.c =================================================================== RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c,v retrieving revision 1.68 diff -p -u -r1.68 ttusb_dec.c --- ttusb_dec.c 17 Mar 2005 03:17:18 -0000 1.68 +++ ttusb_dec.c 17 Mar 2005 23:35:46 -0000 @@ -58,10 +58,10 @@ MODULE_PARM_DESC(enable_rc, "Turn on/off #define DRIVER_NAME "TechnoTrend/Hauppauge DEC USB" #define COMMAND_PIPE 0x03 -#define RESULT_PIPE 0x84 -#define IN_PIPE 0x88 +#define RESULT_PIPE 0x04 +#define IN_PIPE 0x08 #define OUT_PIPE 0x07 -#define IRQ_PIPE 0x8A +#define IRQ_PIPE 0x0A #define COMMAND_PACKET_SIZE 0x3c #define ARM_PACKET_SIZE 0x1000 @@ -170,7 +170,7 @@ struct filter_info { struct list_head filter_info_list; }; -const uint16_t rc_keys[] = { +static u16 rc_keys[] = { KEY_POWER, KEY_MUTE, KEY_1, @@ -1191,8 +1191,9 @@ static void ttusb_init_rc( struct ttusb_ dec->rc_input_dev.name = "ttusb_dec remote control"; dec->rc_input_dev.evbit[0] = BIT(EV_KEY); - dec->rc_input_dev.keycodesize = sizeof(unsigned char); - dec->rc_input_dev.keycodemax = KEY_MAX; + dec->rc_input_dev.keycodesize = sizeof(u16); + dec->rc_input_dev.keycodemax = 0x1a; + dec->rc_input_dev.keycode = rc_keys; for (i = 0; i < sizeof(rc_keys)/sizeof(rc_keys[0]); i++) set_bit(rc_keys[i], dec->rc_input_dev.keybit); @@ -1498,6 +1499,26 @@ static void ttusb_dec_exit_dvb(struct tt dvb_unregister_adapter(&dec->adapter); } +static void ttusb_dec_exit_rc(struct ttusb_dec *dec) +{ + + dprintk("%s\n", __FUNCTION__); + /* we have to check whether the irq URB is already submitted. + * As the irq is submitted after the interface is changed, + * this is the best method i figured out. + * Any others?*/ + if(dec->interface == TTUSB_DEC_INTERFACE_IN) + usb_kill_urb(dec->irq_urb); + + usb_free_urb(dec->irq_urb); + + usb_buffer_free(dec->udev,IRQ_PACKET_SIZE, + dec->irq_buffer, dec->irq_dma_handle); + + input_unregister_device(&dec->rc_input_dev); +} + + static void ttusb_dec_exit_usb(struct ttusb_dec *dec) { int i; @@ -1510,20 +1531,6 @@ static void ttusb_dec_exit_usb(struct tt usb_kill_urb(dec->iso_urb[i]); ttusb_dec_free_iso_urbs(dec); - - if(enable_rc) { - /* we have to check whether the irq URB is already submitted. - * As the irq is submitted after the interface is changed, - * this is the best method i figured out. - * Any other possibilities?*/ - if(dec->interface == TTUSB_DEC_INTERFACE_IN) - usb_kill_urb(dec->irq_urb); - - usb_free_urb(dec->irq_urb); - - usb_buffer_free(dec->udev,IRQ_PACKET_SIZE, - dec->irq_buffer, dec->irq_dma_handle); - } } static void ttusb_dec_exit_tasklet(struct ttusb_dec *dec) @@ -1663,6 +1670,8 @@ static void ttusb_dec_disconnect(struct if (dec->active) { ttusb_dec_exit_tasklet(dec); ttusb_dec_exit_filters(dec); + if(enable_rc) + ttusb_dec_exit_rc(dec); ttusb_dec_exit_usb(dec); ttusb_dec_exit_dvb(dec); }