diff options
| -rw-r--r-- | drivers/media/usb/dvb-usb/dib0700.h | 2 | ||||
| -rw-r--r-- | drivers/media/usb/dvb-usb/dib0700_core.c | 43 | ||||
| -rw-r--r-- | drivers/media/usb/dvb-usb/dib0700_devices.c | 2 |
3 files changed, 38 insertions, 9 deletions
diff --git a/drivers/media/usb/dvb-usb/dib0700.h b/drivers/media/usb/dvb-usb/dib0700.h index 637b6123f391..927617d95616 100644 --- a/drivers/media/usb/dvb-usb/dib0700.h +++ b/drivers/media/usb/dvb-usb/dib0700.h | |||
| @@ -59,7 +59,7 @@ extern int dib0700_set_gpio(struct dvb_usb_device *, enum dib07x0_gpios gpio, u8 | |||
| 59 | extern int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3); | 59 | extern int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3); |
| 60 | extern int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen); | 60 | extern int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen); |
| 61 | extern int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw); | 61 | extern int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw); |
| 62 | extern int dib0700_rc_setup(struct dvb_usb_device *d); | 62 | extern int dib0700_rc_setup(struct dvb_usb_device *d, struct usb_interface *intf); |
| 63 | extern int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff); | 63 | extern int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff); |
| 64 | extern struct i2c_algorithm dib0700_i2c_algo; | 64 | extern struct i2c_algorithm dib0700_i2c_algo; |
| 65 | extern int dib0700_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props, | 65 | extern int dib0700_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props, |
diff --git a/drivers/media/usb/dvb-usb/dib0700_core.c b/drivers/media/usb/dvb-usb/dib0700_core.c index bf2a908d74cf..c14285fa8271 100644 --- a/drivers/media/usb/dvb-usb/dib0700_core.c +++ b/drivers/media/usb/dvb-usb/dib0700_core.c | |||
| @@ -754,17 +754,20 @@ resubmit: | |||
| 754 | usb_submit_urb(purb, GFP_ATOMIC); | 754 | usb_submit_urb(purb, GFP_ATOMIC); |
| 755 | } | 755 | } |
| 756 | 756 | ||
| 757 | int dib0700_rc_setup(struct dvb_usb_device *d) | 757 | int dib0700_rc_setup(struct dvb_usb_device *d, struct usb_interface *intf) |
| 758 | { | 758 | { |
| 759 | struct dib0700_state *st = d->priv; | 759 | struct dib0700_state *st = d->priv; |
| 760 | struct urb *purb; | 760 | struct urb *purb; |
| 761 | int ret; | 761 | const struct usb_endpoint_descriptor *e; |
| 762 | int ret, rc_ep = 1; | ||
| 763 | unsigned int pipe = 0; | ||
| 762 | 764 | ||
| 763 | /* Poll-based. Don't initialize bulk mode */ | 765 | /* Poll-based. Don't initialize bulk mode */ |
| 764 | if (st->fw_version < 0x10200) | 766 | if (st->fw_version < 0x10200 || !intf) |
| 765 | return 0; | 767 | return 0; |
| 766 | 768 | ||
| 767 | /* Starting in firmware 1.20, the RC info is provided on a bulk pipe */ | 769 | /* Starting in firmware 1.20, the RC info is provided on a bulk pipe */ |
| 770 | |||
| 768 | purb = usb_alloc_urb(0, GFP_KERNEL); | 771 | purb = usb_alloc_urb(0, GFP_KERNEL); |
| 769 | if (purb == NULL) { | 772 | if (purb == NULL) { |
| 770 | err("rc usb alloc urb failed"); | 773 | err("rc usb alloc urb failed"); |
| @@ -779,9 +782,35 @@ int dib0700_rc_setup(struct dvb_usb_device *d) | |||
| 779 | } | 782 | } |
| 780 | 783 | ||
| 781 | purb->status = -EINPROGRESS; | 784 | purb->status = -EINPROGRESS; |
| 782 | usb_fill_bulk_urb(purb, d->udev, usb_rcvbulkpipe(d->udev, 1), | 785 | |
| 783 | purb->transfer_buffer, RC_MSG_SIZE_V1_20, | 786 | /* |
| 784 | dib0700_rc_urb_completion, d); | 787 | * Some devices like the Hauppauge NovaTD model 52009 use an interrupt |
| 788 | * endpoint, while others use a bulk one. | ||
| 789 | */ | ||
| 790 | e = &intf->altsetting[0].endpoint[rc_ep].desc; | ||
| 791 | if (usb_endpoint_dir_in(e)) { | ||
| 792 | if (usb_endpoint_xfer_bulk(e)) { | ||
| 793 | pipe = usb_rcvbulkpipe(d->udev, rc_ep); | ||
| 794 | usb_fill_bulk_urb(purb, d->udev, pipe, | ||
| 795 | purb->transfer_buffer, | ||
| 796 | RC_MSG_SIZE_V1_20, | ||
| 797 | dib0700_rc_urb_completion, d); | ||
| 798 | |||
| 799 | } else if (usb_endpoint_xfer_int(e)) { | ||
| 800 | pipe = usb_rcvintpipe(d->udev, rc_ep); | ||
| 801 | usb_fill_int_urb(purb, d->udev, pipe, | ||
| 802 | purb->transfer_buffer, | ||
| 803 | RC_MSG_SIZE_V1_20, | ||
| 804 | dib0700_rc_urb_completion, d, 1); | ||
| 805 | } | ||
| 806 | } | ||
| 807 | |||
| 808 | if (!pipe) { | ||
| 809 | err("There's no endpoint for remote controller"); | ||
| 810 | kfree(purb->transfer_buffer); | ||
| 811 | usb_free_urb(purb); | ||
| 812 | return 0; | ||
| 813 | } | ||
| 785 | 814 | ||
| 786 | ret = usb_submit_urb(purb, GFP_ATOMIC); | 815 | ret = usb_submit_urb(purb, GFP_ATOMIC); |
| 787 | if (ret) { | 816 | if (ret) { |
| @@ -820,7 +849,7 @@ static int dib0700_probe(struct usb_interface *intf, | |||
| 820 | else | 849 | else |
| 821 | dev->props.rc.core.bulk_mode = false; | 850 | dev->props.rc.core.bulk_mode = false; |
| 822 | 851 | ||
| 823 | dib0700_rc_setup(dev); | 852 | dib0700_rc_setup(dev, intf); |
| 824 | 853 | ||
| 825 | return 0; | 854 | return 0; |
| 826 | } | 855 | } |
diff --git a/drivers/media/usb/dvb-usb/dib0700_devices.c b/drivers/media/usb/dvb-usb/dib0700_devices.c index 829323e42ca0..10e0db8d1850 100644 --- a/drivers/media/usb/dvb-usb/dib0700_devices.c +++ b/drivers/media/usb/dvb-usb/dib0700_devices.c | |||
| @@ -514,7 +514,7 @@ static int dib0700_rc_query_old_firmware(struct dvb_usb_device *d) | |||
| 514 | 514 | ||
| 515 | /* info("%d: %2X %2X %2X %2X",dvb_usb_dib0700_ir_proto,(int)key[3-2],(int)key[3-3],(int)key[3-1],(int)key[3]); */ | 515 | /* info("%d: %2X %2X %2X %2X",dvb_usb_dib0700_ir_proto,(int)key[3-2],(int)key[3-3],(int)key[3-1],(int)key[3]); */ |
| 516 | 516 | ||
| 517 | dib0700_rc_setup(d); /* reset ir sensor data to prevent false events */ | 517 | dib0700_rc_setup(d, NULL); /* reset ir sensor data to prevent false events */ |
| 518 | 518 | ||
| 519 | d->last_event = 0; | 519 | d->last_event = 0; |
| 520 | switch (d->props.rc.core.protocol) { | 520 | switch (d->props.rc.core.protocol) { |
