diff --git a/packages/linux/patches/3.14.5/linux-224-geniatech-t220-dvb-t2-fix.patch b/packages/linux/patches/3.14.5/linux-224-geniatech-t220-dvb-t2-fix.patch new file mode 100644 index 0000000000..17488409ff --- /dev/null +++ b/packages/linux/patches/3.14.5/linux-224-geniatech-t220-dvb-t2-fix.patch @@ -0,0 +1,97 @@ +diff --git a/drivers/media/dvb-frontends/cxd2820r.h b/drivers/media/dvb-frontends/cxd2820r.h +index 82b3d93..6095dbc 100644 +--- a/drivers/media/dvb-frontends/cxd2820r.h ++++ b/drivers/media/dvb-frontends/cxd2820r.h +@@ -52,6 +52,12 @@ struct cxd2820r_config { + */ + u8 ts_mode; + ++ /* TS clock inverted. ++ * Default: 0 ++ * Values: 0, 1 ++ */ ++ bool ts_clock_inv; ++ + /* IF AGC polarity. + * Default: 0 + * Values: 0, 1 +diff --git a/drivers/media/dvb-frontends/cxd2820r_c.c b/drivers/media/dvb-frontends/cxd2820r_c.c +index 5c6ab49..0f4657e 100644 +--- a/drivers/media/dvb-frontends/cxd2820r_c.c ++++ b/drivers/media/dvb-frontends/cxd2820r_c.c +@@ -45,6 +45,7 @@ int cxd2820r_set_frontend_c(struct dvb_frontend *fe) + { 0x1008b, 0x07, 0xff }, + { 0x1001f, priv->cfg.if_agc_polarity << 7, 0x80 }, + { 0x10070, priv->cfg.ts_mode, 0xff }, ++ { 0x10071, !priv->cfg.ts_clock_inv << 4, 0x10 }, + }; + + dev_dbg(&priv->i2c->dev, "%s: frequency=%d symbol_rate=%d\n", __func__, +diff --git a/drivers/media/dvb-frontends/cxd2820r_t.c b/drivers/media/dvb-frontends/cxd2820r_t.c +index fa184ca..9b5a45b 100644 +--- a/drivers/media/dvb-frontends/cxd2820r_t.c ++++ b/drivers/media/dvb-frontends/cxd2820r_t.c +@@ -46,6 +46,7 @@ int cxd2820r_set_frontend_t(struct dvb_frontend *fe) + { 0x00088, 0x01, 0xff }, + + { 0x00070, priv->cfg.ts_mode, 0xff }, ++ { 0x00071, !priv->cfg.ts_clock_inv << 4, 0x10 }, + { 0x000cb, priv->cfg.if_agc_polarity << 6, 0x40 }, + { 0x000a5, 0x00, 0x01 }, + { 0x00082, 0x20, 0x60 }, +diff --git a/drivers/media/dvb-frontends/cxd2820r_t2.c b/drivers/media/dvb-frontends/cxd2820r_t2.c +index 2ba130e..9c0c4f4 100644 +--- a/drivers/media/dvb-frontends/cxd2820r_t2.c ++++ b/drivers/media/dvb-frontends/cxd2820r_t2.c +@@ -47,6 +47,7 @@ int cxd2820r_set_frontend_t2(struct dvb_frontend *fe) + { 0x02083, 0x0a, 0xff }, + { 0x020cb, priv->cfg.if_agc_polarity << 6, 0x40 }, + { 0x02070, priv->cfg.ts_mode, 0xff }, ++ { 0x02071, !priv->cfg.ts_clock_inv << 6, 0x40 }, + { 0x020b5, priv->cfg.spec_inv << 4, 0x10 }, + { 0x02567, 0x07, 0x0f }, + { 0x02569, 0x03, 0x03 }, +diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c +index ae0f56a..7135a3e 100644 +--- a/drivers/media/usb/dvb-usb/dw2102.c ++++ b/drivers/media/usb/dvb-usb/dw2102.c +@@ -1109,6 +1109,7 @@ static struct ds3000_config su3000_ds3000_config = { + static struct cxd2820r_config cxd2820r_config = { + .i2c_address = 0x6c, /* (0xd8 >> 1) */ + .ts_mode = 0x38, ++ .ts_clock_inv = 1, + }; + + static struct tda18271_config tda18271_config = { +@@ -1387,20 +1388,27 @@ static int su3000_frontend_attach(struct dvb_usb_adapter *d) + + static int t220_frontend_attach(struct dvb_usb_adapter *d) + { +- u8 obuf[3] = { 0xe, 0x80, 0 }; ++ u8 obuf[3] = { 0xe, 0x87, 0 }; + u8 ibuf[] = { 0 }; + + if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0) + err("command 0x0e transfer failed."); + + obuf[0] = 0xe; +- obuf[1] = 0x83; ++ obuf[1] = 0x86; ++ obuf[2] = 1; ++ ++ if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0) ++ err("command 0x0e transfer failed."); ++ ++ obuf[0] = 0xe; ++ obuf[1] = 0x80; + obuf[2] = 0; + + if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0) + err("command 0x0e transfer failed."); + +- msleep(100); ++ msleep(50); + + obuf[0] = 0xe; + obuf[1] = 0x80; + diff --git a/packages/linux/patches/3.15-rc8/linux-224-geniatech-t220-dvb-t2-fix.patch b/packages/linux/patches/3.15-rc8/linux-224-geniatech-t220-dvb-t2-fix.patch new file mode 100644 index 0000000000..17488409ff --- /dev/null +++ b/packages/linux/patches/3.15-rc8/linux-224-geniatech-t220-dvb-t2-fix.patch @@ -0,0 +1,97 @@ +diff --git a/drivers/media/dvb-frontends/cxd2820r.h b/drivers/media/dvb-frontends/cxd2820r.h +index 82b3d93..6095dbc 100644 +--- a/drivers/media/dvb-frontends/cxd2820r.h ++++ b/drivers/media/dvb-frontends/cxd2820r.h +@@ -52,6 +52,12 @@ struct cxd2820r_config { + */ + u8 ts_mode; + ++ /* TS clock inverted. ++ * Default: 0 ++ * Values: 0, 1 ++ */ ++ bool ts_clock_inv; ++ + /* IF AGC polarity. + * Default: 0 + * Values: 0, 1 +diff --git a/drivers/media/dvb-frontends/cxd2820r_c.c b/drivers/media/dvb-frontends/cxd2820r_c.c +index 5c6ab49..0f4657e 100644 +--- a/drivers/media/dvb-frontends/cxd2820r_c.c ++++ b/drivers/media/dvb-frontends/cxd2820r_c.c +@@ -45,6 +45,7 @@ int cxd2820r_set_frontend_c(struct dvb_frontend *fe) + { 0x1008b, 0x07, 0xff }, + { 0x1001f, priv->cfg.if_agc_polarity << 7, 0x80 }, + { 0x10070, priv->cfg.ts_mode, 0xff }, ++ { 0x10071, !priv->cfg.ts_clock_inv << 4, 0x10 }, + }; + + dev_dbg(&priv->i2c->dev, "%s: frequency=%d symbol_rate=%d\n", __func__, +diff --git a/drivers/media/dvb-frontends/cxd2820r_t.c b/drivers/media/dvb-frontends/cxd2820r_t.c +index fa184ca..9b5a45b 100644 +--- a/drivers/media/dvb-frontends/cxd2820r_t.c ++++ b/drivers/media/dvb-frontends/cxd2820r_t.c +@@ -46,6 +46,7 @@ int cxd2820r_set_frontend_t(struct dvb_frontend *fe) + { 0x00088, 0x01, 0xff }, + + { 0x00070, priv->cfg.ts_mode, 0xff }, ++ { 0x00071, !priv->cfg.ts_clock_inv << 4, 0x10 }, + { 0x000cb, priv->cfg.if_agc_polarity << 6, 0x40 }, + { 0x000a5, 0x00, 0x01 }, + { 0x00082, 0x20, 0x60 }, +diff --git a/drivers/media/dvb-frontends/cxd2820r_t2.c b/drivers/media/dvb-frontends/cxd2820r_t2.c +index 2ba130e..9c0c4f4 100644 +--- a/drivers/media/dvb-frontends/cxd2820r_t2.c ++++ b/drivers/media/dvb-frontends/cxd2820r_t2.c +@@ -47,6 +47,7 @@ int cxd2820r_set_frontend_t2(struct dvb_frontend *fe) + { 0x02083, 0x0a, 0xff }, + { 0x020cb, priv->cfg.if_agc_polarity << 6, 0x40 }, + { 0x02070, priv->cfg.ts_mode, 0xff }, ++ { 0x02071, !priv->cfg.ts_clock_inv << 6, 0x40 }, + { 0x020b5, priv->cfg.spec_inv << 4, 0x10 }, + { 0x02567, 0x07, 0x0f }, + { 0x02569, 0x03, 0x03 }, +diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c +index ae0f56a..7135a3e 100644 +--- a/drivers/media/usb/dvb-usb/dw2102.c ++++ b/drivers/media/usb/dvb-usb/dw2102.c +@@ -1109,6 +1109,7 @@ static struct ds3000_config su3000_ds3000_config = { + static struct cxd2820r_config cxd2820r_config = { + .i2c_address = 0x6c, /* (0xd8 >> 1) */ + .ts_mode = 0x38, ++ .ts_clock_inv = 1, + }; + + static struct tda18271_config tda18271_config = { +@@ -1387,20 +1388,27 @@ static int su3000_frontend_attach(struct dvb_usb_adapter *d) + + static int t220_frontend_attach(struct dvb_usb_adapter *d) + { +- u8 obuf[3] = { 0xe, 0x80, 0 }; ++ u8 obuf[3] = { 0xe, 0x87, 0 }; + u8 ibuf[] = { 0 }; + + if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0) + err("command 0x0e transfer failed."); + + obuf[0] = 0xe; +- obuf[1] = 0x83; ++ obuf[1] = 0x86; ++ obuf[2] = 1; ++ ++ if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0) ++ err("command 0x0e transfer failed."); ++ ++ obuf[0] = 0xe; ++ obuf[1] = 0x80; + obuf[2] = 0; + + if (dvb_usb_generic_rw(d->dev, obuf, 3, ibuf, 1, 0) < 0) + err("command 0x0e transfer failed."); + +- msleep(100); ++ msleep(50); + + obuf[0] = 0xe; + obuf[1] = 0x80; +