Skip to contentSkip to conversation

af9035: fix dual tuner detection with PCTV 79e

PATCH In review Stefan Pöschel 3 participants 6 messages Jul 11, 2016 – Jul 20, 2016

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 af9035: fix dual tuner detection with PCTV 79e

The value 5 of the EEPROM_TS_MODE register (meaning dual tuner presence) is only valid for AF9035 devices. For IT9135 devices it is invalid and led to a false positive dual tuner mode detection with PCTV 79e. Therefore on non-AF9035 devices and with value 5 the driver now defaults to single tuner mode and outputs a regarding info message to log.

This fixes Bugzilla bug #118561.

---
 drivers/media/usb/dvb-usb-v2/af9035.c | 50 +++++++++++++++++++++++------------
 drivers/media/usb/dvb-usb-v2/af9035.h |  2 +-
 2 files changed, 34 insertions(+), 18 deletions(-)
drivers/media/usb/dvb-usb-v2/af9035.c +33 -17
index eabede4..ca018cd 100644
@@ -496,7 +496,8 @@ static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
 {
 	struct state *state = d_to_priv(d);
 	struct usb_interface *intf = d->intf;
-	int ret;
+	int ret, ts_mode_invalid;
+	u8 tmp;
 	u8 wbuf[1] = { 1 };
 	u8 rbuf[4];
 	struct usb_req req = { CMD_FW_QUERYINFO, 0, sizeof(wbuf), wbuf,
@@ -530,6 +531,36 @@ static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
 		state->eeprom_addr = EEPROM_BASE_AF9035;
 	}
 
+
+	/* check for dual tuner mode */
+	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
+	if (ret < 0)
+		goto err;
+
+	ts_mode_invalid = 0;
+	switch (tmp) {
+	case 0:
+		break;
+	case 1:
+	case 3:
+		state->dual_mode = true;
+		break;
+	case 5:
+		if (state->chip_type != 0x9135 && state->chip_type != 0x9306)
+			state->dual_mode = true;	/* AF9035 */
+		else
+			ts_mode_invalid = 1;
+		break;
+	default:
+		ts_mode_invalid = 1;
+	}
+
+	dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp, state->dual_mode);
+
+	if (ts_mode_invalid)
+		dev_info(&intf->dev, "ts mode=%d not supported, defaulting to single tuner mode!", tmp);
+
+
 	ret = af9035_ctrl_msg(d, &req);
 	if (ret < 0)
 		goto err;
@@ -698,11 +729,7 @@ static int af9035_download_firmware(struct dvb_usb_device *d,
 	 * which is done by master demod.
 	 * Master feeds also clock and controls power via GPIO.
 	 */
-	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-	if (ret < 0)
-		goto err;
-
-	if (tmp == 1 || tmp == 3 || tmp == 5) {
+	if (state->dual_mode) {
 		/* configure gpioh1, reset & power slave demod */
 		ret = af9035_wr_reg_mask(d, 0x00d8b0, 0x01, 0x01);
 		if (ret < 0)
@@ -835,17 +862,6 @@ static int af9035_read_config(struct dvb_usb_device *d)
 	}
 
 
-
-	/* check if there is dual tuners */
-	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-	if (ret < 0)
-		goto err;
-
-	if (tmp == 1 || tmp == 3 || tmp == 5)
-		state->dual_mode = true;
-
-	dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp, state->dual_mode);
-
 	if (state->dual_mode) {
 		/* read 2nd demodulator I2C address */
 		ret = af9035_rd_reg(d,
drivers/media/usb/dvb-usb-v2/af9035.h +1 -1
index c91d1a3..1f83c92 100644
@@ -113,7 +113,7 @@ static const u32 clock_lut_it9135[] = {
  * 0  TS
  * 1  DCA + PIP
  * 3  PIP
- * 5  DCA + PIP
+ * 5  DCA + PIP (AF9035 only)
  * n  DCA
  *
  * Values 0, 3 and 5 are seen to this day. 0 for single TS and 3/5 for dual TS.
Signature · 1 line
2.9.0
#1 lore raw

Applied and PULL requested for 4.7.

Anyhow, it does not apply for 4.6. You must backport that patch to 4.6 stable also!

regards
Antti

Quoted 111 lines · Stefan Pöschel

The value 5 of the EEPROM_TS_MODE register (meaning dual tuner presence) is only valid for AF9035 devices. For IT9135 devices it is invalid and led to a false positive dual tuner mode detection with PCTV 79e. Therefore on non-AF9035 devices and with value 5 the driver now defaults to single tuner mode and outputs a regarding info message to log.

This fixes Bugzilla bug #118561.

---
 drivers/media/usb/dvb-usb-v2/af9035.c | 50 +++++++++++++++++++++++------------
 drivers/media/usb/dvb-usb-v2/af9035.h |  2 +-
 2 files changed, 34 insertions(+), 18 deletions(-)
drivers/media/usb/dvb-usb-v2/af9035.c +33 -17
index eabede4..ca018cd 100644
@@ -496,7 +496,8 @@ static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
 {
 	struct state *state = d_to_priv(d);
 	struct usb_interface *intf = d->intf;
-	int ret;
+	int ret, ts_mode_invalid;
+	u8 tmp;
 	u8 wbuf[1] = { 1 };
 	u8 rbuf[4];
 	struct usb_req req = { CMD_FW_QUERYINFO, 0, sizeof(wbuf), wbuf,
@@ -530,6 +531,36 @@ static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
 		state->eeprom_addr = EEPROM_BASE_AF9035;
 	}
 
+
+	/* check for dual tuner mode */
+	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
+	if (ret < 0)
+		goto err;
+
+	ts_mode_invalid = 0;
+	switch (tmp) {
+	case 0:
+		break;
+	case 1:
+	case 3:
+		state->dual_mode = true;
+		break;
+	case 5:
+		if (state->chip_type != 0x9135 && state->chip_type != 0x9306)
+			state->dual_mode = true;	/* AF9035 */
+		else
+			ts_mode_invalid = 1;
+		break;
+	default:
+		ts_mode_invalid = 1;
+	}
+
+	dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp, state->dual_mode);
+
+	if (ts_mode_invalid)
+		dev_info(&intf->dev, "ts mode=%d not supported, defaulting to single tuner mode!", tmp);
+
+
 	ret = af9035_ctrl_msg(d, &req);
 	if (ret < 0)
 		goto err;
@@ -698,11 +729,7 @@ static int af9035_download_firmware(struct dvb_usb_device *d,
 	 * which is done by master demod.
 	 * Master feeds also clock and controls power via GPIO.
 	 */
-	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-	if (ret < 0)
-		goto err;
-
-	if (tmp == 1 || tmp == 3 || tmp == 5) {
+	if (state->dual_mode) {
 		/* configure gpioh1, reset & power slave demod */
 		ret = af9035_wr_reg_mask(d, 0x00d8b0, 0x01, 0x01);
 		if (ret < 0)
@@ -835,17 +862,6 @@ static int af9035_read_config(struct dvb_usb_device *d)
 	}
 
 
-
-	/* check if there is dual tuners */
-	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-	if (ret < 0)
-		goto err;
-
-	if (tmp == 1 || tmp == 3 || tmp == 5)
-		state->dual_mode = true;
-
-	dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp, state->dual_mode);
-
 	if (state->dual_mode) {
 		/* read 2nd demodulator I2C address */
 		ret = af9035_rd_reg(d,
drivers/media/usb/dvb-usb-v2/af9035.h +1 -1
index c91d1a3..1f83c92 100644
@@ -113,7 +113,7 @@ static const u32 clock_lut_it9135[] = {
  * 0  TS
  * 1  DCA + PIP
  * 3  PIP
- * 5  DCA + PIP
+ * 5  DCA + PIP (AF9035 only)
  * n  DCA
  *
  * Values 0, 3 and 5 are seen to this day. 0 for single TS and 3/5 for dual TS.
Signature · 1 line
http://palosaari.fi/
#2 lore raw

Em Fri, 15 Jul 2016 09:21:51 +0300
Antti Palosaari <[email protected]> escreveu:

Quoted 1 line

Applied and PULL requested for 4.7.

It is too late to be applied on 4.7. I can apply it to the next merge window.

Quoted 111 lines

Anyhow, it does not apply for 4.6. You must backport that patch to 4.6 stable also!

regards
Antti

Quoted 103 lines · Stefan Pöschel

The value 5 of the EEPROM_TS_MODE register (meaning dual tuner presence) is only valid for AF9035 devices. For IT9135 devices it is invalid and led to a false positive dual tuner mode detection with PCTV 79e. Therefore on non-AF9035 devices and with value 5 the driver now defaults to single tuner mode and outputs a regarding info message to log.

This fixes Bugzilla bug #118561.

---
 drivers/media/usb/dvb-usb-v2/af9035.c | 50 +++++++++++++++++++++++------------
 drivers/media/usb/dvb-usb-v2/af9035.h |  2 +-
 2 files changed, 34 insertions(+), 18 deletions(-)
drivers/media/usb/dvb-usb-v2/af9035.c +33 -17
index eabede4..ca018cd 100644
@@ -496,7 +496,8 @@ static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
 {
 	struct state *state = d_to_priv(d);
 	struct usb_interface *intf = d->intf;
-	int ret;
+	int ret, ts_mode_invalid;
+	u8 tmp;
 	u8 wbuf[1] = { 1 };
 	u8 rbuf[4];
 	struct usb_req req = { CMD_FW_QUERYINFO, 0, sizeof(wbuf), wbuf,
@@ -530,6 +531,36 @@ static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
 		state->eeprom_addr = EEPROM_BASE_AF9035;
 	}
 
+
+	/* check for dual tuner mode */
+	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
+	if (ret < 0)
+		goto err;
+
+	ts_mode_invalid = 0;
+	switch (tmp) {
+	case 0:
+		break;
+	case 1:
+	case 3:
+		state->dual_mode = true;
+		break;
+	case 5:
+		if (state->chip_type != 0x9135 && state->chip_type != 0x9306)
+			state->dual_mode = true;	/* AF9035 */
+		else
+			ts_mode_invalid = 1;
+		break;
+	default:
+		ts_mode_invalid = 1;
+	}
+
+	dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp, state->dual_mode);
+
+	if (ts_mode_invalid)
+		dev_info(&intf->dev, "ts mode=%d not supported, defaulting to single tuner mode!", tmp);
+
+
 	ret = af9035_ctrl_msg(d, &req);
 	if (ret < 0)
 		goto err;
@@ -698,11 +729,7 @@ static int af9035_download_firmware(struct dvb_usb_device *d,
 	 * which is done by master demod.
 	 * Master feeds also clock and controls power via GPIO.
 	 */
-	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-	if (ret < 0)
-		goto err;
-
-	if (tmp == 1 || tmp == 3 || tmp == 5) {
+	if (state->dual_mode) {
 		/* configure gpioh1, reset & power slave demod */
 		ret = af9035_wr_reg_mask(d, 0x00d8b0, 0x01, 0x01);
 		if (ret < 0)
@@ -835,17 +862,6 @@ static int af9035_read_config(struct dvb_usb_device *d)
 	}
 
 
-
-	/* check if there is dual tuners */
-	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-	if (ret < 0)
-		goto err;
-
-	if (tmp == 1 || tmp == 3 || tmp == 5)
-		state->dual_mode = true;
-
-	dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp, state->dual_mode);
-
 	if (state->dual_mode) {
 		/* read 2nd demodulator I2C address */
 		ret = af9035_rd_reg(d,
drivers/media/usb/dvb-usb-v2/af9035.h +0 -0
index c91d1a3..1f83c92 100644
@@ -113,7 +113,7 @@ static const u32 clock_lut_it9135[] = {
  * 0  TS
Quoted 9 lines

drivers/media/usb/dvb-usb-v2/af9035.h static const u32 clock_lut_it9135[] = { · line 119

Quoted 8 lines
drivers/media/usb/dvb-usb-v2/af9035.h +1 -1
  * 1  DCA + PIP
  * 3  PIP
- * 5  DCA + PIP
+ * 5  DCA + PIP (AF9035 only)
  * n  DCA
  *
  * Values 0, 3 and 5 are seen to this day. 0 for single TS and 3/5 for dual TS.

Thanks,
Mauro

#3 lore raw
In reply to Antti Palosaari

Am 15.07.2016 um 08:21 schrieb Antti Palosaari:

Quoted 1 line

Applied and PULL requested for 4.7.

Great, thanks!

Quoted 2 lines

Anyhow, it does not apply for 4.6. You must backport that patch to 4.6 stable also!

I have never done backporting before, so I need some advice I think:
Am I right that I have to create the patch, now just based on tag "v4.6" of the media_tree repo?
And then move that patch (properly named) to the backports subdir of the media_build repo, with regarding modification of the backports.txt:
Using an "add" entry under "[4.6.255]" and an "delete" entry under "[4.5.255]" (so that it just gets applied to 4.6.x) ?

BTW I wonder about the status update of
https://patchwork.linuxtv.org/patch/35337/ from "New" to "Superseeded" (instead of "Accepted")...why is this?

Regards,
Stefan

Quoted 127 lines · Stefan Pöschel
Quoted 125 lines

The value 5 of the EEPROM_TS_MODE register (meaning dual tuner presence) is
only valid for AF9035 devices. For IT9135 devices it is invalid and led to a
false positive dual tuner mode detection with PCTV 79e. Therefore on non-AF9035 devices and with value 5 the driver now defaults to
single tuner mode and outputs a regarding info message to log.

This fixes Bugzilla bug #118561.

---
 drivers/media/usb/dvb-usb-v2/af9035.c | 50
+++++++++++++++++++++++------------
 drivers/media/usb/dvb-usb-v2/af9035.h |  2 +-
 2 files changed, 34 insertions(+), 18 deletions(-)
drivers/media/usb/dvb-usb-v2/af9035.c +2 -1
index eabede4..ca018cd 100644
@@ -496,7 +496,8 @@ static int af9035_identify_state(struct
 dvb_usb_device *d, const char **name)
 {
     struct state *state = d_to_priv(d);
     struct usb_interface *intf = d->intf;
-    int ret;
+    int ret, ts_mode_invalid;
+    u8 tmp;
     u8 wbuf[1] = { 1 };
     u8 rbuf[4];

struct usb_req req = { CMD_FW_QUERYINFO, 0, sizeof(wbuf), wbuf,

drivers/media/usb/dvb-usb-v2/af9035.c +30 -0
@@ -530,6 +531,36 @@ static int af9035_identify_state(struct
 dvb_usb_device *d, const char **name)
         state->eeprom_addr = EEPROM_BASE_AF9035;
     }
 
+
+    /* check for dual tuner mode */
+    ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
+    if (ret < 0)
+        goto err;
+
+    ts_mode_invalid = 0;
+    switch (tmp) {
+    case 0:
+        break;
+    case 1:
+    case 3:
+        state->dual_mode = true;
+        break;
+    case 5:
+        if (state->chip_type != 0x9135 && state->chip_type != 0x9306)
+            state->dual_mode = true;    /* AF9035 */
+        else
+            ts_mode_invalid = 1;
+        break;
+    default:
+        ts_mode_invalid = 1;
+    }
+
+    dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp,
 state->dual_mode);
+
+    if (ts_mode_invalid)
+        dev_info(&intf->dev, "ts mode=%d not supported, defaulting to
 single tuner mode!", tmp);
+
+
     ret = af9035_ctrl_msg(d, &req);
     if (ret < 0)
         goto err;
drivers/media/usb/dvb-usb-v2/af9035.c +1 -5
@@ -698,11 +729,7 @@ static int af9035_download_firmware(struct
 dvb_usb_device *d,
      * which is done by master demod.
      * Master feeds also clock and controls power via GPIO.
      */
-    ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-    if (ret < 0)
-        goto err;
-
-    if (tmp == 1 || tmp == 3 || tmp == 5) {
+    if (state->dual_mode) {
         /* configure gpioh1, reset & power slave demod */
         ret = af9035_wr_reg_mask(d, 0x00d8b0, 0x01, 0x01);
         if (ret < 0)
drivers/media/usb/dvb-usb-v2/af9035.c +0 -11
@@ -835,17 +862,6 @@ static int af9035_read_config(struct
 dvb_usb_device *d)
     }
 
 
-
-    /* check if there is dual tuners */
-    ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-    if (ret < 0)
-        goto err;
-
-    if (tmp == 1 || tmp == 3 || tmp == 5)
-        state->dual_mode = true;
-
-    dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp,
 state->dual_mode);
-
     if (state->dual_mode) {
         /* read 2nd demodulator I2C address */
         ret = af9035_rd_reg(d,
drivers/media/usb/dvb-usb-v2/af9035.h +1 -1
index c91d1a3..1f83c92 100644
@@ -113,7 +113,7 @@ static const u32 clock_lut_it9135[] = {
  * 0  TS
  * 1  DCA + PIP
  * 3  PIP
- * 5  DCA + PIP
+ * 5  DCA + PIP (AF9035 only)
  * n  DCA
  *
  * Values 0, 3 and 5 are seen to this day. 0 for single TS and 3/5

for dual TS.

#4 lore raw
Quoted 11 lines · Stefan Pöschel

Am 15.07.2016 um 08:21 schrieb Antti Palosaari:

Quoted 1 line

Applied and PULL requested for 4.7.

Great, thanks!

Quoted 2 lines

Anyhow, it does not apply for 4.6. You must backport that patch to 4.6 stable also!

I have never done backporting before, so I need some advice I think:
Am I right that I have to create the patch, now just based on tag "v4.6" of the media_tree repo?

Just make patch that compiles and works against kernel tag v4.6. No need to backport it to media_tree or media_build. It should go 4.6 kernel stable tree.

Antti

Quoted 140 lines

And then move that patch (properly named) to the backports subdir of the media_build repo, with regarding modification of the backports.txt:
Using an "add" entry under "[4.6.255]" and an "delete" entry under "[4.5.255]" (so that it just gets applied to 4.6.x) ?

BTW I wonder about the status update of
https://patchwork.linuxtv.org/patch/35337/ from "New" to "Superseeded" (instead of "Accepted")...why is this?

Regards,
Stefan

Quoted 127 lines · Stefan Pöschel
Quoted 125 lines

The value 5 of the EEPROM_TS_MODE register (meaning dual tuner presence) is
only valid for AF9035 devices. For IT9135 devices it is invalid and led to a
false positive dual tuner mode detection with PCTV 79e. Therefore on non-AF9035 devices and with value 5 the driver now defaults to
single tuner mode and outputs a regarding info message to log.

This fixes Bugzilla bug #118561.

---
 drivers/media/usb/dvb-usb-v2/af9035.c | 50
+++++++++++++++++++++++------------
 drivers/media/usb/dvb-usb-v2/af9035.h |  2 +-
 2 files changed, 34 insertions(+), 18 deletions(-)
drivers/media/usb/dvb-usb-v2/af9035.c +2 -1
index eabede4..ca018cd 100644
@@ -496,7 +496,8 @@ static int af9035_identify_state(struct
 dvb_usb_device *d, const char **name)
 {
     struct state *state = d_to_priv(d);
     struct usb_interface *intf = d->intf;
-    int ret;
+    int ret, ts_mode_invalid;
+    u8 tmp;
     u8 wbuf[1] = { 1 };
     u8 rbuf[4];

struct usb_req req = { CMD_FW_QUERYINFO, 0, sizeof(wbuf), wbuf,

drivers/media/usb/dvb-usb-v2/af9035.c +30 -0
@@ -530,6 +531,36 @@ static int af9035_identify_state(struct
 dvb_usb_device *d, const char **name)
         state->eeprom_addr = EEPROM_BASE_AF9035;
     }
 
+
+    /* check for dual tuner mode */
+    ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
+    if (ret < 0)
+        goto err;
+
+    ts_mode_invalid = 0;
+    switch (tmp) {
+    case 0:
+        break;
+    case 1:
+    case 3:
+        state->dual_mode = true;
+        break;
+    case 5:
+        if (state->chip_type != 0x9135 && state->chip_type != 0x9306)
+            state->dual_mode = true;    /* AF9035 */
+        else
+            ts_mode_invalid = 1;
+        break;
+    default:
+        ts_mode_invalid = 1;
+    }
+
+    dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp,
 state->dual_mode);
+
+    if (ts_mode_invalid)
+        dev_info(&intf->dev, "ts mode=%d not supported, defaulting to
 single tuner mode!", tmp);
+
+
     ret = af9035_ctrl_msg(d, &req);
     if (ret < 0)
         goto err;
drivers/media/usb/dvb-usb-v2/af9035.c +1 -5
@@ -698,11 +729,7 @@ static int af9035_download_firmware(struct
 dvb_usb_device *d,
      * which is done by master demod.
      * Master feeds also clock and controls power via GPIO.
      */
-    ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-    if (ret < 0)
-        goto err;
-
-    if (tmp == 1 || tmp == 3 || tmp == 5) {
+    if (state->dual_mode) {
         /* configure gpioh1, reset & power slave demod */
         ret = af9035_wr_reg_mask(d, 0x00d8b0, 0x01, 0x01);
         if (ret < 0)
drivers/media/usb/dvb-usb-v2/af9035.c +0 -11
@@ -835,17 +862,6 @@ static int af9035_read_config(struct
 dvb_usb_device *d)
     }
 
 
-
-    /* check if there is dual tuners */
-    ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-    if (ret < 0)
-        goto err;
-
-    if (tmp == 1 || tmp == 3 || tmp == 5)
-        state->dual_mode = true;
-
-    dev_dbg(&intf->dev, "ts mode=%d dual mode=%d\n", tmp,
 state->dual_mode);
-
     if (state->dual_mode) {
         /* read 2nd demodulator I2C address */
         ret = af9035_rd_reg(d,
drivers/media/usb/dvb-usb-v2/af9035.h +1 -1
index c91d1a3..1f83c92 100644
@@ -113,7 +113,7 @@ static const u32 clock_lut_it9135[] = {
  * 0  TS
  * 1  DCA + PIP
  * 3  PIP
- * 5  DCA + PIP
+ * 5  DCA + PIP (AF9035 only)
  * n  DCA
  *
  * Values 0, 3 and 5 are seen to this day. 0 for single TS and 3/5

for dual TS.

Signature · 1 line
http://palosaari.fi/
#5 lore raw

Am 17.07.2016 um 10:59 schrieb Antti Palosaari:

Quoted 6 lines · Stefan Pöschel
Quoted 5 lines

Am 15.07.2016 um 08:21 schrieb Antti Palosaari:

Quoted 1 line

Applied and PULL requested for 4.7.

Great, thanks!

Quoted 8 lines
Quoted 6 lines
Quoted 2 lines

Anyhow, it does not apply for 4.6. You must backport that patch to 4.6 stable also!

I have never done backporting before, so I need some advice I think:
Am I right that I have to create the patch, now just based on tag "v4.6" of the media_tree repo?

Just make patch that compiles and works against kernel tag v4.6. No need to backport it to media_tree or media_build. It should go 4.6 kernel stable tree.

Please find the backport patch below. Is sending to this ML here enough or are there any further steps needed to do by me?

Regards,
Stefan
-------------------------------------

The value 5 of the EEPROM_TS_MODE register (meaning dual tuner presence) is only valid for AF9035 devices. For IT9135 devices it is invalid and led to a false positive dual tuner mode detection with PCTV 79e. Therefore on non-AF9035 devices and with value 5 the driver now defaults to single tuner mode and outputs a regarding info message to log.

This fixes Bugzilla bug #118561.

(backport of 4.7)

---
 drivers/media/usb/dvb-usb-v2/af9035.c | 53 +++++++++++++++++++++++------------
 drivers/media/usb/dvb-usb-v2/af9035.h |  2 +-
 2 files changed, 36 insertions(+), 19 deletions(-)
drivers/media/usb/dvb-usb-v2/af9035.c +35 -18
index 2638e32..14dbfeb 100644
@@ -475,7 +475,8 @@ static struct i2c_algorithm af9035_i2c_algo = {
 static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
 {
 	struct state *state = d_to_priv(d);
-	int ret;
+	int ret, ts_mode_invalid;
+	u8 tmp;
 	u8 wbuf[1] = { 1 };
 	u8 rbuf[4];
 	struct usb_req req = { CMD_FW_QUERYINFO, 0, sizeof(wbuf), wbuf,
@@ -511,6 +512,38 @@ static int af9035_identify_state(struct dvb_usb_device *d, const char **name)
 		state->eeprom_addr = EEPROM_BASE_AF9035;
 	}
 
+
+	/* check for dual tuner mode */
+	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
+	if (ret < 0)
+		goto err;
+
+	ts_mode_invalid = 0;
+	switch (tmp) {
+	case 0:
+		break;
+	case 1:
+	case 3:
+		state->dual_mode = true;
+		break;
+	case 5:
+		if (state->chip_type != 0x9135 && state->chip_type != 0x9306)
+			state->dual_mode = true;	/* AF9035 */
+		else
+			ts_mode_invalid = 1;
+		break;
+	default:
+		ts_mode_invalid = 1;
+	}
+
+	dev_dbg(&d->udev->dev, "%s: ts mode=%d dual mode=%d\n",
+			__func__, tmp, state->dual_mode);
+
+	if (ts_mode_invalid)
+		dev_info(&d->udev->dev, "%s: ts mode=%d not supported, defaulting to single tuner mode!",
+				__func__, tmp);
+
+
 	ret = af9035_ctrl_msg(d, &req);
 	if (ret < 0)
 		goto err;
@@ -680,11 +713,7 @@ static int af9035_download_firmware(struct dvb_usb_device *d,
 	 * which is done by master demod.
 	 * Master feeds also clock and controls power via GPIO.
 	 */
-	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-	if (ret < 0)
-		goto err;
-
-	if (tmp == 1 || tmp == 3 || tmp == 5) {
+	if (state->dual_mode) {
 		/* configure gpioh1, reset & power slave demod */
 		ret = af9035_wr_reg_mask(d, 0x00d8b0, 0x01, 0x01);
 		if (ret < 0)
@@ -817,18 +846,6 @@ static int af9035_read_config(struct dvb_usb_device *d)
 	}
 
 
-
-	/* check if there is dual tuners */
-	ret = af9035_rd_reg(d, state->eeprom_addr + EEPROM_TS_MODE, &tmp);
-	if (ret < 0)
-		goto err;
-
-	if (tmp == 1 || tmp == 3 || tmp == 5)
-		state->dual_mode = true;
-
-	dev_dbg(&d->udev->dev, "%s: ts mode=%d dual mode=%d\n", __func__,
-			tmp, state->dual_mode);
-
 	if (state->dual_mode) {
 		/* read 2nd demodulator I2C address */
 		ret = af9035_rd_reg(d,
drivers/media/usb/dvb-usb-v2/af9035.h +1 -1
index df22001..d50ff15 100644
@@ -112,7 +112,7 @@ static const u32 clock_lut_it9135[] = {
  * 0  TS
  * 1  DCA + PIP
  * 3  PIP
- * 5  DCA + PIP
+ * 5  DCA + PIP (AF9035 only)
  * n  DCA
  *
  * Values 0, 3 and 5 are seen to this day. 0 for single TS and 3/5 for dual TS.
Signature · 1 line
2.9.1