Re: [PATCH] af9035: fix dual tuner detection with PCTV 79e

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
>> Signed-off-by: Stefan Pöschel <basic.master@xxxxxx>
>> ---
>>  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@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux