summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDongwon Kang <dwkang@google.com>2016-12-21 10:09:50 -0800
committerNick Desaulniers <ndesaulniers@google.com>2017-02-09 21:41:19 +0000
commit7a1ab4e2cb16186c224c018981da752fecbe845d (patch)
treeb4662b6f2e41243ba4f2b2e8131d13534725af32
parent4ac98c444c0801e2adee26bec6fc456bab27881a (diff)
downloadx86_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.c20
-rw-r--r--drivers/media/usb/em28xx/em28xx-core.c15
-rw-r--r--drivers/media/usb/em28xx/em28xx-dvb.c4
-rw-r--r--drivers/media/usb/em28xx/em28xx.h2
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