af9035: fix dual tuner detection with PCTV 79e

Message ID 5783D80F.2040808@gmx.de (mailing list archive)
State Superseded, archived
Headers

Commit Message

Stefan Pöschel July 11, 2016, 5:31 p.m. UTC
  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.

Reported-by: Marc Duponcheel <marc@offline.be>
Signed-off-by: Stefan Pöschel <basic.master@gmx.de>
---
 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(-)
  

Comments

Antti Palosaari July 15, 2016, 6:21 a.m. UTC | #1
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

On 07/11/2016 08:31 PM, Stefan Pöschel wrote:
> 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.
>
> Reported-by: Marc Duponcheel <marc@offline.be>
> Signed-off-by: Stefan Pöschel <basic.master@gmx.de>
> ---
>  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(-)
>
> diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c
> index eabede4..ca018cd 100644
> --- a/drivers/media/usb/dvb-usb-v2/af9035.c
> +++ b/drivers/media/usb/dvb-usb-v2/af9035.c
> @@ -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,
> diff --git a/drivers/media/usb/dvb-usb-v2/af9035.h b/drivers/media/usb/dvb-usb-v2/af9035.h
> index c91d1a3..1f83c92 100644
> --- a/drivers/media/usb/dvb-usb-v2/af9035.h
> +++ b/drivers/media/usb/dvb-usb-v2/af9035.h
> @@ -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.
>
  
Mauro Carvalho Chehab July 15, 2016, 10:24 a.m. UTC | #2
Em Fri, 15 Jul 2016 09:21:51 +0300
Antti Palosaari <crope@iki.fi> escreveu:

> 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.

> 
> Anyhow, it does not apply for 4.6. You must backport that patch to 4.6 
> stable also!
> 
> regards
> Antti
> 
> On 07/11/2016 08:31 PM, Stefan Pöschel wrote:
> > 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.
> >
> > Reported-by: Marc Duponcheel <marc@offline.be>
> > Signed-off-by: Stefan Pöschel <basic.master@gmx.de>
> > ---
> >  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(-)
> >
> > diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c
> > index eabede4..ca018cd 100644
> > --- a/drivers/media/usb/dvb-usb-v2/af9035.c
> > +++ b/drivers/media/usb/dvb-usb-v2/af9035.c
> > @@ -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,
> > diff --git a/drivers/media/usb/dvb-usb-v2/af9035.h b/drivers/media/usb/dvb-usb-v2/af9035.h
> > index c91d1a3..1f83c92 100644
> > --- a/drivers/media/usb/dvb-usb-v2/af9035.h
> > +++ b/drivers/media/usb/dvb-usb-v2/af9035.h
> > @@ -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.
> >  
> 



Thanks,
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
  
Stefan Pöschel July 16, 2016, 8:05 p.m. UTC | #3
Am 15.07.2016 um 08:21 schrieb Antti Palosaari:
> Applied and PULL requested for 4.7.

Great, thanks!

> 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


> On 07/11/2016 08:31 PM, Stefan Pöschel wrote:
>> 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.
>>
>> Reported-by: Marc Duponcheel <marc@offline.be>
>> Signed-off-by: Stefan Pöschel <basic.master@gmx.de>
>> ---
>>  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(-)
>>
>> diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c
>> b/drivers/media/usb/dvb-usb-v2/af9035.c
>> index eabede4..ca018cd 100644
>> --- a/drivers/media/usb/dvb-usb-v2/af9035.c
>> +++ b/drivers/media/usb/dvb-usb-v2/af9035.c
>> @@ -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,
>> diff --git a/drivers/media/usb/dvb-usb-v2/af9035.h
>> b/drivers/media/usb/dvb-usb-v2/af9035.h
>> index c91d1a3..1f83c92 100644
>> --- a/drivers/media/usb/dvb-usb-v2/af9035.h
>> +++ b/drivers/media/usb/dvb-usb-v2/af9035.h
>> @@ -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.
>>
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
  
Antti Palosaari July 17, 2016, 8:59 a.m. UTC | #4
On 07/16/2016 11:05 PM, Stefan Pöschel wrote:
> Am 15.07.2016 um 08:21 schrieb Antti Palosaari:
>> Applied and PULL requested for 4.7.
>
> Great, thanks!
>
>> 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


> 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
>
>
>> On 07/11/2016 08:31 PM, Stefan Pöschel wrote:
>>> 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.
>>>
>>> Reported-by: Marc Duponcheel <marc@offline.be>
>>> Signed-off-by: Stefan Pöschel <basic.master@gmx.de>
>>> ---
>>>  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(-)
>>>
>>> diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c
>>> b/drivers/media/usb/dvb-usb-v2/af9035.c
>>> index eabede4..ca018cd 100644
>>> --- a/drivers/media/usb/dvb-usb-v2/af9035.c
>>> +++ b/drivers/media/usb/dvb-usb-v2/af9035.c
>>> @@ -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,
>>> diff --git a/drivers/media/usb/dvb-usb-v2/af9035.h
>>> b/drivers/media/usb/dvb-usb-v2/af9035.h
>>> index c91d1a3..1f83c92 100644
>>> --- a/drivers/media/usb/dvb-usb-v2/af9035.h
>>> +++ b/drivers/media/usb/dvb-usb-v2/af9035.h
>>> @@ -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.
>>>
>>
  

Patch

diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c
index eabede4..ca018cd 100644
--- a/drivers/media/usb/dvb-usb-v2/af9035.c
+++ b/drivers/media/usb/dvb-usb-v2/af9035.c
@@ -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,
diff --git a/drivers/media/usb/dvb-usb-v2/af9035.h b/drivers/media/usb/dvb-usb-v2/af9035.h
index c91d1a3..1f83c92 100644
--- a/drivers/media/usb/dvb-usb-v2/af9035.h
+++ b/drivers/media/usb/dvb-usb-v2/af9035.h
@@ -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.