diff options
author | Dongwon Kang <dwkang@google.com> | 2016-12-21 10:09:50 -0800 |
---|---|---|
committer | Nick Desaulniers <ndesaulniers@google.com> | 2017-02-09 21:41:19 +0000 |
commit | 7a1ab4e2cb16186c224c018981da752fecbe845d (patch) | |
tree | b4662b6f2e41243ba4f2b2e8131d13534725af32 | |
parent | 4ac98c444c0801e2adee26bec6fc456bab27881a (diff) | |
download | x86_64-7a1ab4e2cb16186c224c018981da752fecbe845d.tar.gz |
media: usb: em28xx: support bulk mode of Hauppauge WinTV-DualHD devices
Bug: 30095176
Change-Id: I43061ca56ddb85415aa581e90e0d2449a640e0bf
(cherry picked from commit 70a32da6df1bfbdb7411c4494e6d3f22bd04e3f8)
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-cards.c | 20 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-core.c | 15 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-dvb.c | 4 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx.h | 2 |
4 files changed, 32 insertions, 9 deletions
diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c index 6804b1144b40..681839fe11a5 100644 --- a/drivers/media/usb/em28xx/em28xx-cards.c +++ b/drivers/media/usb/em28xx/em28xx-cards.c @@ -429,8 +429,6 @@ static struct em28xx_reg_seq hauppauge_dualhd_dvb[] = { {EM2874_R80_GPIO, 0xdf, 0xff, 100}, /* demod 2 reset */ {EM2874_R80_GPIO, 0xff, 0xff, 100}, {EM2874_R5F_TS_ENABLE, 0x44, 0xff, 50}, - {EM2874_R5D_TS1_PKT_SIZE, 0x05, 0xff, 50}, - {EM2874_R5E_TS2_PKT_SIZE, 0x05, 0xff, 50}, { -1, -1, -1, -1}, }; @@ -3505,14 +3503,24 @@ static int em28xx_usb_probe(struct usb_interface *interface, } dev->dev_next->dvb_ep_isoc = dev->dvb_ep_isoc_ts2; + dev->dev_next->dvb_ep_bulk = dev->dvb_ep_bulk_ts2; dev->dev_next->dvb_max_pkt_size_isoc = dev->dvb_max_pkt_size_isoc_ts2; dev->dev_next->dvb_alt_isoc = dev->dvb_alt_isoc; /* Configure hardware to support TS2*/ - em28xx_write_reg(dev, 0x0b, 0x96); - mdelay(100); - em28xx_write_reg(dev, 0x0b, 0x82); - mdelay(100); + if(dev->dvb_xfer_bulk) { + /* The ep4 and ep5 are configuared for BULK */ + em28xx_write_reg(dev, 0x0b, 0x96); + mdelay(100); + em28xx_write_reg(dev, 0x0b, 0x80); + mdelay(100); + } else { + /* The ep4 and ep5 are configuared for ISO */ + em28xx_write_reg(dev, 0x0b, 0x96); + mdelay(100); + em28xx_write_reg(dev, 0x0b, 0x82); + mdelay(100); + } } request_modules(dev); diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c index e9efc920fe17..5bbfc47d952f 100644 --- a/drivers/media/usb/em28xx/em28xx-core.c +++ b/drivers/media/usb/em28xx/em28xx-core.c @@ -649,8 +649,23 @@ int em28xx_capture_start(struct em28xx *dev, int start) dev->chip_id == CHIP_ID_EM2884 || dev->chip_id == CHIP_ID_EM28174) { /* The Transport Stream Enable Register moved in em2874 */ + if(dev->dvb_xfer_bulk) { + /* TS1 Maximum Transfer Size = 188 * EM28XX_DVB_BULK_PACKET_MULTIPLIER */ + em28xx_write_reg(dev, EM2874_R5D_TS1_PKT_SIZE, 0xef); + } else { + /* TS1 Maximum Transfer Size = 188 * 5 */ + em28xx_write_reg(dev, EM2874_R5D_TS1_PKT_SIZE, 0x05); + } + if (dev->board.has_dual_ts) { if (start) { + if(dev->dvb_xfer_bulk) { + /* TS2 Maximum Transfer Size = 188 * EM28XX_DVB_BULK_PACKET_MULTIPLIER */ + em28xx_write_reg(dev, EM2874_R5E_TS2_PKT_SIZE, 0xef); + } else { + /* TS2 Maximum Transfer Size = 188 * 5 */ + em28xx_write_reg(dev, EM2874_R5E_TS2_PKT_SIZE, 0x05); + } rc = em28xx_write_reg_bits(dev, EM2874_R5F_TS_ENABLE, (EM2874_TS1_CAPTURE_ENABLE | EM2874_TS2_CAPTURE_ENABLE), (EM2874_TS1_CAPTURE_ENABLE | EM2874_TS2_CAPTURE_ENABLE)); diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c index c902f9def1cf..878e1f51643e 100644 --- a/drivers/media/usb/em28xx/em28xx-dvb.c +++ b/drivers/media/usb/em28xx/em28xx-dvb.c @@ -191,7 +191,7 @@ static int em28xx_start_streaming(struct em28xx_dvb *dvb) if (dev->dvb_xfer_bulk) { if (!dev->dvb_ep_bulk) return -ENODEV; - dvb_max_packet_size = 512; /* USB 2.0 spec */ + dvb_max_packet_size = 188; packet_multiplier = EM28XX_DVB_BULK_PACKET_MULTIPLIER; dvb_alt = 0; } else { /* isoc */ @@ -986,7 +986,7 @@ static int em28xx_dvb_init(struct em28xx *dev) result = em28xx_alloc_urbs(dev, EM28XX_DIGITAL_MODE, dev->dvb_xfer_bulk, EM28XX_DVB_NUM_BUFS, - 512, + 188, EM28XX_DVB_BULK_PACKET_MULTIPLIER); } else { result = em28xx_alloc_urbs(dev, EM28XX_DIGITAL_MODE, diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h index e4881132bd23..6f86ec01a0b6 100644 --- a/drivers/media/usb/em28xx/em28xx.h +++ b/drivers/media/usb/em28xx/em28xx.h @@ -174,7 +174,7 @@ USB 2.0 spec says bulk packet size is always 512 bytes */ #define EM28XX_BULK_PACKET_MULTIPLIER 384 -#define EM28XX_DVB_BULK_PACKET_MULTIPLIER 384 +#define EM28XX_DVB_BULK_PACKET_MULTIPLIER 240 #define EM28XX_INTERLACED_DEFAULT 1 |