From patchwork Wed May 9 11:54:49 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Igor M. Liplianin" X-Patchwork-Id: 11120 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1SS5Tr-0001fw-V8 for patchwork@linuxtv.org; Wed, 09 May 2012 13:54:56 +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-3) with esmtp for id 1SS5Tr-0004IG-EP; Wed, 09 May 2012 13:54:55 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758458Ab2EILyw (ORCPT ); Wed, 9 May 2012 07:54:52 -0400 Received: from mail-bk0-f46.google.com ([209.85.214.46]:43740 "EHLO mail-bk0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758341Ab2EILyv (ORCPT ); Wed, 9 May 2012 07:54:51 -0400 Received: by bkcji2 with SMTP id ji2so173179bkc.19 for ; Wed, 09 May 2012 04:54:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:user-agent:mime-version :content-type:content-transfer-encoding:x-gm-message-state; bh=9lg6s7KtkUXLzU2VxhDS5IA7WxaRHPi8ozgIWJfBkeM=; b=hblgs/JiolOhUxcF677kUyZaa9477nskCMpUc96gce3NSi5m8VVolayQ/q9jCwTsW3 igfAvfo/Dw1urYlF5E9nDQ77AEF+1tds86MdQhCCNrObf+cmfDuV7J+KVeGcYEy1izuH Sj6ZtX77P98WhDbhLvE2aF2t5Q8F7+GWpg0RhMYcsEEmTjHovcF7qN/heXyxBTXLfXfB b1FQE2PaC1RNGjZJQKh7BeJ0lHlE1ssYInxYsfVZ3WRJZEsun9nVoyfSmg6zK+WSrTnI gKKhopuU34ELUZJG+vOT2BLHCqKJmh0TTUifETRUvzxOTjE4pb1xL88sdx0jl9yglwUh 35iw== Received: by 10.204.148.83 with SMTP id o19mr8297578bkv.96.1336564490475; Wed, 09 May 2012 04:54:50 -0700 (PDT) Received: from useri.localnet ([93.125.112.3]) by mx.google.com with ESMTPS id f11sm4588856bkw.6.2012.05.09.04.54.48 (version=SSLv3 cipher=OTHER); Wed, 09 May 2012 04:54:49 -0700 (PDT) From: "Igor M. Liplianin" To: Malcolm Priestley Cc: linux-media@vger.kernel.org Subject: [PATCH] [TEST] Regarding m88rc2000 i2c gate operation, SNR, BER and others Date: Wed, 09 May 2012 04:54:49 -0700 (PDT) Message-ID: <1682436.JdK20qceHM@useri> User-Agent: KMail/4.8.2 (Linux/3.3.4; KDE/4.8.2; x86_64; ; ) MIME-Version: 1.0 X-Gm-Message-State: ALoCoQnJ5+LkRJoesuuJF7u/YWdiN/g0D+tguNeA31UfPxalEXVqhZnpuX1O3JGDWEWqufKo5ocL 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.5.9.114816 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' HTML_00_01 0.05, HTML_00_10 0.05, MIME_TEXT_ONLY_MP_MIXED 0.05, MSGID_ADDED_BY_MTA 0.05, BODYTEXTP_SIZE_3000_LESS 0, BODY_SIZE_3000_3999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, INVALID_MSGID_NO_FQDN 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __CT 0, __CTE 0, __CTYPE_HAS_BOUNDARY 0, __CTYPE_MULTIPART 0, __CTYPE_MULTIPART_MIXED 0, __HAS_MSGID 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MIME_VERSION 0, __SANE_MSGID 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __URI_NO_WWW 0, __URI_NS , __USER_AGENT 0' Malcolm, I made SNR, BER, UCB and signal level code for m88rc2000, but my cards show them correctly only if I made changes in m88rs2000_tuner_read function. Analyzing USB logs I found that register 0x81 never set to 0x85 value. It is always set to 0x84 regardless of read or write operation to tuner. I was wondering is this my hardware specific? Can you test you cards with attached patch? Igor diff --git a/drivers/media/dvb/frontends/m88rs2000.c b/drivers/media/dvb/frontends/m88rs2000.c index f6d6e39..f5ece59 100644 --- a/drivers/media/dvb/frontends/m88rs2000.c +++ b/drivers/media/dvb/frontends/m88rs2000.c @@ -143,7 +143,7 @@ static u8 m88rs2000_demod_read(struct m88rs2000_state *state, u8 reg) static u8 m88rs2000_tuner_read(struct m88rs2000_state *state, u8 reg) { - m88rs2000_demod_write(state, 0x81, 0x85); + m88rs2000_demod_write(state, 0x81, 0x84); udelay(10); return m88rs2000_readreg(state, 0, reg); } @@ -492,33 +492,81 @@ static int m88rs2000_read_status(struct dvb_frontend *fe, fe_status_t *status) return 0; } -/* Extact code for these unknown but lmedm04 driver uses interupt callbacks */ - static int m88rs2000_read_ber(struct dvb_frontend *fe, u32 *ber) { - deb_info("m88rs2000_read_ber %d\n", *ber); - *ber = 0; + struct m88rs2000_state *state = fe->demodulator_priv; + u8 tmp0, tmp1; + + m88rs2000_demod_write(state, 0x9a, 0x30); + tmp0 = m88rs2000_demod_read(state, 0xd8); + if ((tmp0 & 0x10) != 0) { + m88rs2000_demod_write(state, 0x9a, 0xb0); + *ber = 0xffffffff; + return 0; + } + + *ber = (m88rs2000_demod_read(state, 0xd7) << 8) | + m88rs2000_demod_read(state, 0xd6); + + tmp1 = m88rs2000_demod_read(state, 0xd9); + m88rs2000_demod_write(state, 0xd9, (tmp1 & ~7) | 4); + /* needs twice */ + m88rs2000_demod_write(state, 0xd8, (tmp0 & ~8) | 0x30); + m88rs2000_demod_write(state, 0xd8, (tmp0 & ~8) | 0x30); + m88rs2000_demod_write(state, 0x9a, 0xb0); + return 0; } static int m88rs2000_read_signal_strength(struct dvb_frontend *fe, - u16 *strength) + u16 *signal_strength) { - *strength = 0; + struct m88rs2000_state *state = fe->demodulator_priv; + u8 rfg, bbg, gain, strength; + + rfg = m88rs2000_tuner_read(state, 0x3d) & 0x1f; + bbg = m88rs2000_tuner_read(state, 0x21) & 0x1f; + gain = rfg * 2 + bbg * 3; + + if (gain > 80) + strength = 0; + else if (gain > 65) + strength = 4 * (80 - gain); + else if (gain > 50) + strength = 65 + 4 * (65 - gain) / 3; + else + strength = 85 + 2 * (50 - gain) / 3; + + *signal_strength = strength * 655; + + deb_info("%s: rfg, bbg / gain = %d, %d, %d\n", + __func__, rfg, bbg, gain); + return 0; } static int m88rs2000_read_snr(struct dvb_frontend *fe, u16 *snr) { - deb_info("m88rs2000_read_snr %d\n", *snr); - *snr = 0; + struct m88rs2000_state *state = fe->demodulator_priv; + + *snr = 512 * m88rs2000_demod_read(state, 0x65); + return 0; } static int m88rs2000_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) { - deb_info("m88rs2000_read_ber %d\n", *ucblocks); - *ucblocks = 0; + struct m88rs2000_state *state = fe->demodulator_priv; + u8 tmp; + + *ucblocks = (m88rs2000_demod_read(state, 0xd5) << 8) | + m88rs2000_demod_read(state, 0xd4); + tmp = m88rs2000_demod_read(state, 0xd8); + m88rs2000_demod_write(state, 0xd8, tmp & ~0x20); + /* needs two times */ + m88rs2000_demod_write(state, 0xd8, tmp | 0x20); + m88rs2000_demod_write(state, 0xd8, tmp | 0x20); + return 0; }