From patchwork Wed Jul 20 17:14:29 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Stefan_P=C3=B6schel?= X-Patchwork-Id: 9240071 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8A772602F0 for ; Wed, 20 Jul 2016 17:14:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 780FA27CE5 for ; Wed, 20 Jul 2016 17:14:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6BC5527D29; Wed, 20 Jul 2016 17:14:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A089F1FEBD for ; Wed, 20 Jul 2016 17:14:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753278AbcGTROr (ORCPT ); Wed, 20 Jul 2016 13:14:47 -0400 Received: from mout.gmx.net ([212.227.15.19]:59111 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752583AbcGTROq (ORCPT ); Wed, 20 Jul 2016 13:14:46 -0400 Received: from [192.168.6.10] ([87.146.203.158]) by mail.gmx.com (mrgmx002) with ESMTPSA (Nemesis) id 0LhfZR-1b3SLj1pOT-00mw2u; Wed, 20 Jul 2016 19:14:34 +0200 Subject: Re: [PATCH] af9035: fix dual tuner detection with PCTV 79e To: Antti Palosaari , Linux Media Mailing List References: <5783D80F.2040808@gmx.de> <8c71e2a3-ca04-0215-b3cb-c478afa9b1cb@iki.fi> <578A937E.4060502@gmx.de> From: basic.master@gmx.de Message-ID: Date: Wed, 20 Jul 2016 19:14:29 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: X-Provags-ID: V03:K0:ESWaIHpjr+Oz2ljObfMFn9YpE3v9kg3Gt0lAysA+HoSDUR2LdkJ Td8+YVK0pXcfw+3ZxdBwtEFe3yEAutCI8axlluPulq9fBeMz/FrT5TbhICrpQTjxUIp7x/W Pt8cHXK8LNbDS34h2vc1wLD349Bb33cZAADAgHzCh6dW6hOPN3ek0va1P4km4+7OHZlDKPs sctd+q67USgAPwgJUDWIg== X-UI-Out-Filterresults: notjunk:1; V01:K0:QmFKsSKOv3s=:4zmQ4FalTLdH48VGrENOpA kHbHujZukQ+4Q+H9SPZCyN8Gahym01rvbNweTH/PMVjHr9PUnfDlnI73H7+0kCsozaJYQXqqC WwtRsmZvFnLBv8MG6Kgg5mRb1+IZIpFlYap6jj0hEAjUFaNdf4l5blaaPVoyaghByZORoDAun 97bI9LevmdwdMfrDs62f4KQU1Fqt5k2Z2QdN3V3aUrM4mO3Myi0PGs/F01Kqna+TPXfPpaZB7 kg+vcvIJ6moMmOt+34kWy+E1+w3mhVS0TFV1ONsdDitcJPKYwZ6l14Qs1kpKzoJjz5qLvRq2E UpcE2P/jMnL39MIJP6cgloZf1fbSNyyzH+ul5CqpHhGJgDdQqSWp8nhN1Tl6AJBXVWTKQBb5V VMRFP7T71rWL9J7OP4rsFh5DbhPC9Xu7RKZzU3aXlOuT03AdjwcSzAIO+sMdTwqwiMTPsmaYm 5en8n16WrKgsnzRYafvOIUehW+m9e3YKSSxKkxqENk/Ady2UnlgVHygQJWDGHHQUz7gfzfRaR bFPT/0P2WPUNEauqao9Xb9hpkt8HX9hOub++xQmPoewieYv2C91ykdx518vLUfathm6ZPw4oB VNOVckkt4PE7Z43R8vhjvA5Dh+q31SagG9VpvxmR94dhLAEw60NNjQVzZzElwdoclgP1GYtuP l1ZUZVYG/e8eeMe00+Q3dtUwuZQ4gX+HqDtg33WNBk/CrAZs+vilXB+P5+TOn/cBEqpCfqGDn /srpmTn2GfajREkdrFUp3V86UtLKImsXbOrJfE7qQerDkg/rWc7Xal8OTc39A3Wsd/kz4buhV hy1h3JI Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Am 17.07.2016 um 10:59 schrieb Antti Palosaari: > 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. 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) Reported-by: Marc Duponcheel Signed-off-by: Stefan Pöschel --- 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(-) diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c index 2638e32..14dbfeb 100644 --- a/drivers/media/usb/dvb-usb-v2/af9035.c +++ b/drivers/media/usb/dvb-usb-v2/af9035.c @@ -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, diff --git a/drivers/media/usb/dvb-usb-v2/af9035.h b/drivers/media/usb/dvb-usb-v2/af9035.h index df22001..d50ff15 100644 --- a/drivers/media/usb/dvb-usb-v2/af9035.h +++ b/drivers/media/usb/dvb-usb-v2/af9035.h @@ -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.