From patchwork Sun Apr 1 13:11:53 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Michael_B=C3=BCsch?= X-Patchwork-Id: 10515 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1SEKaJ-0006nw-DT for patchwork@linuxtv.org; Sun, 01 Apr 2012 15:12:43 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-2) with esmtp for id 1SEKaG-0004F3-It; Sun, 01 Apr 2012 15:12:41 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751918Ab2DANMI (ORCPT ); Sun, 1 Apr 2012 09:12:08 -0400 Received: from bues.ch ([80.190.117.144]:42321 "EHLO bues.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751872Ab2DANMF (ORCPT ); Sun, 1 Apr 2012 09:12:05 -0400 Received: by bues.ch with esmtpsa (Exim 4.72) (envelope-from ) id 1SEKZc-00053X-TS; Sun, 01 Apr 2012 15:12:02 +0200 Date: Sun, 1 Apr 2012 15:11:53 +0200 From: Michael =?UTF-8?B?QsO8c2No?= To: Antti Palosaari Cc: linux-media@vger.kernel.org, Daniel =?UTF-8?B?R2zDtmNrbmVy?= Subject: Re: [GIT PULL FOR 3.5] AF9035/AF9033/TUA9001 => TerraTec Cinergy T Stick [0ccd:0093] Message-ID: <20120401151153.637d2393@milhouse> In-Reply-To: <4F784A13.5000704@iki.fi> References: <4F75A7FE.8090405@iki.fi> <20120330234545.45f4e2e8@milhouse> <4F762CF5.9010303@iki.fi> <20120331001458.33f12d82@milhouse> <20120331160445.71cd1e78@milhouse> <4F771496.8080305@iki.fi> <20120331182925.3b85d2bc@milhouse> <4F77320F.8050009@iki.fi> <4F773562.6010008@iki.fi> <20120331185217.2c82c4ad@milhouse> <4F77DED5.2040103@iki.fi> <20120401103315.1149d6bf@milhouse> <20120401141940.04e5220c@milhouse> <4F784A13.5000704@iki.fi> X-Mailer: Claws Mail 3.8.0 (GTK+ 2.24.10; x86_64-pc-linux-gnu) Mime-Version: 1.0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2012.4.1.130320 X-PMX-Spam: Gauge=IIIIIIIII, Probability=9%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, MIME_LOWER_CASE 0.05, MSGID_ADDED_BY_MTA 0.05, BODYTEXTP_SIZE_3000_LESS 0, BODY_SIZE_10000_PLUS 0, INVALID_MSGID_NO_FQDN 0, __ANY_URI 0, __BOUNCE_CHALLENGE_SUBJ 0, __BOUNCE_NDR_SUBJ_EXEMPT 0, __CP_URI_IN_BODY 0, __CT 0, __CTYPE_HAS_BOUNDARY 0, __CTYPE_MULTIPART 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __MIME_VERSION 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __TO_MALFORMED_2 0, __URI_NO_WWW 0, __URI_NS ' On Sun, 01 Apr 2012 15:29:07 +0300 Antti Palosaari wrote: > buf[1] = msg[0].addr << 1; > Maybe you have given I2C address as a "8bit" format? Uhh, the address is leftshifted by one. So I changed the i2c address from 0xC0 to 0x60. The i2c write seems to work now. At least it doesn't complain anymore and it sorta seems to tune to the right frequency. But i2c read may be broken. I had to enable the commented read code, but it still fails to read the VCO calibration value: [ 3101.940765] i2c i2c-8: Failed to read VCO calibration value (got 20) It doesn't run into this check on the other af903x driver. So I suspect an i2c read issue here. Attached: The patches. Index: linux/drivers/media/dvb/dvb-usb/af9035.c =================================================================== --- linux.orig/drivers/media/dvb/dvb-usb/af9035.c 2012-04-01 11:42:38.867573221 +0200 +++ linux/drivers/media/dvb/dvb-usb/af9035.c 2012-04-01 14:44:20.848955668 +0200 @@ -22,6 +22,7 @@ #include "af9035.h" #include "af9033.h" #include "tua9001.h" +#include "fc0011.h" DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); static DEFINE_MUTEX(af9035_usb_mutex); @@ -209,12 +210,6 @@ msg[1].len); } else { /* I2C */ -#if 0 - /* - * FIXME: Keep that code. It should work but as it is - * not tested I left it disabled and return -EOPNOTSUPP - * for the sure. - */ u8 buf[4 + msg[0].len]; struct usb_req req = { CMD_I2C_RD, 0, sizeof(buf), buf, msg[1].len, msg[1].buf }; @@ -224,9 +219,6 @@ buf[3] = 0x00; memcpy(&buf[4], msg[0].buf, msg[0].len); ret = af9035_ctrl_msg(d->udev, &req); -#endif - pr_debug("%s: I2C operation not supported\n", __func__); - ret = -EOPNOTSUPP; } } else if (num == 1 && !(msg[0].flags & I2C_M_RD)) { if (msg[0].len > 40) { @@ -480,6 +472,7 @@ switch (tmp) { case AF9033_TUNER_TUA9001: + case AF9033_TUNER_FC0011: af9035_af9033_config[i].spec_inv = 1; break; default: @@ -524,6 +517,83 @@ return ret; } +static int af9035_fc0011_tuner_callback(struct dvb_usb_device *d, + int cmd, int arg) +{ + int err; + + switch (cmd) { + case FC0011_FE_CALLBACK_POWER: + /* Tuner enable */ + err = af9035_wr_reg_mask(d, 0xd8eb, 1, 1); + if (err) + return err; + err = af9035_wr_reg_mask(d, 0xd8ec, 1, 1); + if (err) + return err; + err = af9035_wr_reg_mask(d, 0xd8ed, 1, 1); + if (err) + return err; + /* LED */ + err = af9035_wr_reg_mask(d, 0xd8d0, 1, 1); + if (err) + return err; + err = af9035_wr_reg_mask(d, 0xd8d1, 1, 1); + if (err) + return err; + msleep(10); + break; + case FC0011_FE_CALLBACK_RESET: + err = af9035_wr_reg(d, 0xd8e9, 1); + if (err) + return err; + err = af9035_wr_reg(d, 0xd8e8, 1); + if (err) + return err; + err = af9035_wr_reg(d, 0xd8e7, 1); + if (err) + return err; + msleep(10); + err = af9035_wr_reg(d, 0xd8e7, 0); + if (err) + return err; + msleep(10); + break; + default: + return -EINVAL; + } + + return 0; +} + +static int af9035_tuner_callback(struct dvb_usb_device *d, int cmd, int arg) +{ + switch (af9035_af9033_config[0].tuner) { + case AF9033_TUNER_FC0011: + return af9035_fc0011_tuner_callback(d, cmd, arg); + default: + break; + } + + return -ENODEV; +} + +static int af9035_frontend_callback(void *adapter_priv, int component, + int cmd, int arg) +{ + struct i2c_adapter *adap = adapter_priv; + struct dvb_usb_device *d = i2c_get_adapdata(adap); + + switch (component) { + case DVB_FRONTEND_COMPONENT_TUNER: + return af9035_tuner_callback(d, cmd, arg); + default: + break; + } + + return -EINVAL; +} + static int af9035_frontend_attach(struct dvb_usb_adapter *adap) { int ret; @@ -552,6 +622,7 @@ ret = -ENODEV; goto err; } + adap->fe_adap[0].fe->callback = af9035_frontend_callback; return 0; @@ -565,6 +636,10 @@ .i2c_addr = 0x60, }; +static const struct fc0011_config af9035_fc0011_config = { + .i2c_address = 0x60, +}; + static int af9035_tuner_attach(struct dvb_usb_adapter *adap) { int ret; @@ -613,6 +688,10 @@ fe = dvb_attach(tua9001_attach, adap->fe_adap[0].fe, &adap->dev->i2c_adap, &af9035_tua9001_config); break; + case AF9033_TUNER_FC0011: + fe = dvb_attach(fc0011_attach, adap->fe_adap[0].fe, + &adap->dev->i2c_adap, &af9035_fc0011_config); + break; default: fe = NULL; } Index: linux/drivers/media/dvb/frontends/af9033.c =================================================================== --- linux.orig/drivers/media/dvb/frontends/af9033.c 2012-04-01 11:42:36.147526208 +0200 +++ linux/drivers/media/dvb/frontends/af9033.c 2012-04-01 11:42:38.919574120 +0200 @@ -297,6 +297,10 @@ len = ARRAY_SIZE(tuner_init_tua9001); init = tuner_init_tua9001; break; + case AF9033_TUNER_FC0011: + len = ARRAY_SIZE(tuner_init_fc0011); + init = tuner_init_fc0011; + break; default: pr_debug("%s: unsupported tuner ID=%d\n", __func__, state->cfg.tuner); Index: linux/drivers/media/dvb/frontends/af9033_priv.h =================================================================== --- linux.orig/drivers/media/dvb/frontends/af9033_priv.h 2012-04-01 11:42:36.147526208 +0200 +++ linux/drivers/media/dvb/frontends/af9033_priv.h 2012-04-01 11:42:38.919574120 +0200 @@ -238,5 +238,66 @@ { 0x80f1e6, 0x00 }, }; +/* Fitipower fc0011 tuner init + AF9033_TUNER_FC0011 = 0x28 */ +static const struct reg_val tuner_init_fc0011[] = { + { 0x800046, AF9033_TUNER_FC0011 }, + { 0x800057, 0x00 }, + { 0x800058, 0x01 }, + { 0x80005f, 0x00 }, + { 0x800060, 0x00 }, + { 0x800068, 0xa5 }, + { 0x80006e, 0x01 }, + { 0x800071, 0x0A }, + { 0x800072, 0x02 }, + { 0x800074, 0x01 }, + { 0x800079, 0x01 }, + { 0x800093, 0x00 }, + { 0x800094, 0x00 }, + { 0x800095, 0x00 }, + { 0x800096, 0x00 }, + { 0x80009b, 0x2D }, + { 0x80009c, 0x60 }, + { 0x80009d, 0x23 }, + { 0x8000a4, 0x50 }, + { 0x8000ad, 0x50 }, + { 0x8000b3, 0x01 }, + { 0x8000b7, 0x88 }, + { 0x8000b8, 0xa6 }, + { 0x8000c3, 0x01 }, + { 0x8000c4, 0x01 }, + { 0x8000c7, 0x69 }, + { 0x80F007, 0x00 }, + { 0x80F00A, 0x1B }, + { 0x80F00B, 0x1B }, + { 0x80F00C, 0x1B }, + { 0x80F00D, 0x1B }, + { 0x80F00E, 0xFF }, + { 0x80F00F, 0x01 }, + { 0x80F010, 0x00 }, + { 0x80F011, 0x02 }, + { 0x80F012, 0xFF }, + { 0x80F013, 0x01 }, + { 0x80F014, 0x00 }, + { 0x80F015, 0x02 }, + { 0x80F01B, 0xEF }, + { 0x80F01C, 0x01 }, + { 0x80F01D, 0x0f }, + { 0x80F01E, 0x02 }, + { 0x80F01F, 0x6E }, + { 0x80F020, 0x00 }, + { 0x80F025, 0xDE }, + { 0x80F026, 0x00 }, + { 0x80F027, 0x0A }, + { 0x80F028, 0x03 }, + { 0x80F029, 0x6E }, + { 0x80F02A, 0x00 }, + { 0x80F047, 0x00 }, + { 0x80F054, 0x00 }, + { 0x80F055, 0x00 }, + { 0x80F077, 0x01 }, + { 0x80F1E6, 0x00 }, +}; + #endif /* AF9033_PRIV_H */