From patchwork Thu Feb 6 09:45:07 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Jedelsky X-Patchwork-Id: 3595131 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 4EFBBC02DC for ; Thu, 6 Feb 2014 09:46:46 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6EBA520127 for ; Thu, 6 Feb 2014 09:46:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9556120122 for ; Thu, 6 Feb 2014 09:46:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755899AbaBFJql (ORCPT ); Thu, 6 Feb 2014 04:46:41 -0500 Received: from mail-ea0-f172.google.com ([209.85.215.172]:54458 "EHLO mail-ea0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755374AbaBFJqh (ORCPT ); Thu, 6 Feb 2014 04:46:37 -0500 Received: by mail-ea0-f172.google.com with SMTP id l9so650291eaj.3 for ; Thu, 06 Feb 2014 01:46:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=2BuI62NGhD3QrDqlArK0gXwPJ6z88AkAWtoNxBKLA5o=; b=oL3CvafHbMqU7lNWKQ21IGvn0QCk5KpK+D8BfuekKWSdWA1LT9MRuyxYtOZSiq4+g2 /zHlt9gVtawIARppHfWLZFzvAXnOlbcSQtQxBmK/Bt1bmzazevcaLrk8uvDy1LdeR9A5 bL8btnZoUp6aK0MRXKitMvA6uV6PnkeyMm0Xz+Xk+FZGNqKgBWgiRTjQcD6ANKcpZDzJ wxgnbTPHjLGGd4l8fr1Q5QLSmiD7A1IivYyEcr88OoNEkJiR4NSGcFfrOPcvx0Y041Iq EuLH2X2BnSFmyNiUqHooP9WWk6AvbLk41H/9ncW1g83251oirdC5XlyXjBMFcdVPjfvk U+7g== X-Received: by 10.15.55.193 with SMTP id v41mr7646224eew.80.1391679996234; Thu, 06 Feb 2014 01:46:36 -0800 (PST) Received: from localhost6.localdomain6 (38.248.broadband15.iol.cz. [90.182.248.38]) by mx.google.com with ESMTPSA id k41sm1460891een.19.2014.02.06.01.46.34 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 06 Feb 2014 01:46:35 -0800 (PST) From: David Jedelsky To: linux-media@vger.kernel.org Cc: David Jedelsky Subject: [PATCH] [media] stb0899: Fix DVB-S2 support for TechniSat SkyStar 2 HD CI USB ID 14f7:0002 Date: Thu, 6 Feb 2014 10:45:07 +0100 Message-Id: <1391679907-17876-1-git-send-email-david.jedelsky@gmail.com> X-Mailer: git-send-email 1.7.10.4 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP My TechniSat SkyStar 2 HD CI USB ID 14f7:0002 wasn't tuning DVB-S2 channels. Investigation revealed that it doesn't read DVB-S2 registers out of stb0899. Comparison with usb trafic of the Windows driver showed the correct communication scheme. This patch implements it. The question is, whether the changed communication doesn't break other devices. But the read part of patched _stb0899_read_s2reg routine is now functinally same as (not changed) stb0899_read_regs which reads ordinrary DVB-S registers. Giving high chance that it should work correctly on other devices too. Signed-off-by: David Jedelsky --- drivers/media/dvb-frontends/stb0899_drv.c | 44 +++++++++++------------------ 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/drivers/media/dvb-frontends/stb0899_drv.c b/drivers/media/dvb-frontends/stb0899_drv.c index 07cd5ea..3084cb2 100644 --- a/drivers/media/dvb-frontends/stb0899_drv.c +++ b/drivers/media/dvb-frontends/stb0899_drv.c @@ -305,19 +305,20 @@ u32 _stb0899_read_s2reg(struct stb0899_state *state, .len = 6 }; - struct i2c_msg msg_1 = { - .addr = state->config->demod_address, - .flags = 0, - .buf = buf_1, - .len = 2 + struct i2c_msg msg[] = { + { + .addr = state->config->demod_address, + .flags = 0, + .buf = buf_1, + .len = 2 + }, { + .addr = state->config->demod_address, + .flags = I2C_M_RD, + .buf = buf, + .len = 4 + } }; - struct i2c_msg msg_r = { - .addr = state->config->demod_address, - .flags = I2C_M_RD, - .buf = buf, - .len = 4 - }; tmpaddr = stb0899_reg_offset & 0xff00; if (!(stb0899_reg_offset & 0x8)) @@ -326,6 +327,7 @@ u32 _stb0899_read_s2reg(struct stb0899_state *state, buf_1[0] = GETBYTE(tmpaddr, BYTE1); buf_1[1] = GETBYTE(tmpaddr, BYTE0); + /* Write address */ status = i2c_transfer(state->i2c, &msg_0, 1); if (status < 1) { if (status != -ERESTARTSYS) @@ -336,28 +338,16 @@ u32 _stb0899_read_s2reg(struct stb0899_state *state, } /* Dummy */ - status = i2c_transfer(state->i2c, &msg_1, 1); - if (status < 1) - goto err; - - status = i2c_transfer(state->i2c, &msg_r, 1); - if (status < 1) + status = i2c_transfer(state->i2c, msg, 2); + if (status < 2) goto err; buf_1[0] = GETBYTE(stb0899_reg_offset, BYTE1); buf_1[1] = GETBYTE(stb0899_reg_offset, BYTE0); /* Actual */ - status = i2c_transfer(state->i2c, &msg_1, 1); - if (status < 1) { - if (status != -ERESTARTSYS) - printk(KERN_ERR "%s ERR(2), Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Status=%d\n", - __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, status); - goto err; - } - - status = i2c_transfer(state->i2c, &msg_r, 1); - if (status < 1) { + status = i2c_transfer(state->i2c, msg, 2); + if (status < 2) { if (status != -ERESTARTSYS) printk(KERN_ERR "%s ERR(3), Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Status=%d\n", __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, status);