From patchwork Tue Aug 7 02:47:09 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Devin Heitmueller X-Patchwork-Id: 13645 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1SyZqB-000731-6V for patchwork@linuxtv.org; Tue, 07 Aug 2012 04:48:15 +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 1SyZqA-0005Od-I6; Tue, 07 Aug 2012 04:48:15 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932582Ab2HGCsK (ORCPT ); Mon, 6 Aug 2012 22:48:10 -0400 Received: from mail-vc0-f174.google.com ([209.85.220.174]:52727 "EHLO mail-vc0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932575Ab2HGCsG (ORCPT ); Mon, 6 Aug 2012 22:48:06 -0400 Received: by mail-vc0-f174.google.com with SMTP id fk26so3432709vcb.19 for ; Mon, 06 Aug 2012 19:48:06 -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:x-mailer:in-reply-to:references :x-gm-message-state; bh=jVqr6K+bRv67wJ1A9r2GbGfx3mj12lZWVLlM9OUCSKU=; b=Nd7jY8cuD/wsKMFDca1huUzqj1q+qedgmsG361OSD9GAQkwKkrp5ICo6ysGthsMQsh sqsvpIAoL7olZ+6ybTRnmsPCE+99z42bKPZwyLWh/LD10Sr2gU0llcC4pzXw1jt5PZ+z Y3CUsdX6nvyD2Wi977Rp2ehoX7RWyYTzaJeC9gHLXqOjJVMeU3wR0MLMMdGbgRqGqUNb wHYS5quw40bsjGzbOpjSFV/jk9IxfH6euT3VO1Jdiy57nZabCH+fevalV2DTChuZG5xC JYp/Lnw0Dct8Msv0qcwQj9RKfXt5xp+vA4eOfkNVsZG4EAeYlmbt2qNYlU1eF3E/Jyi8 +sfQ== Received: by 10.52.95.203 with SMTP id dm11mr8446607vdb.70.1344307686122; Mon, 06 Aug 2012 19:48:06 -0700 (PDT) Received: from localhost.localdomain (pool-108-54-72-165.nycmny.fios.verizon.net. [108.54.72.165]) by mx.google.com with ESMTPS id e9sm17555638vdf.21.2012.08.06.19.48.05 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 06 Aug 2012 19:48:05 -0700 (PDT) From: Devin Heitmueller To: linux-media@vger.kernel.org Cc: Devin Heitmueller Subject: [PATCH 19/24] xc5000: add support for firmware load check and init status Date: Mon, 6 Aug 2012 22:47:09 -0400 Message-Id: <1344307634-11673-20-git-send-email-dheitmueller@kernellabs.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1344307634-11673-1-git-send-email-dheitmueller@kernellabs.com> References: <1344307634-11673-1-git-send-email-dheitmueller@kernellabs.com> X-Gm-Message-State: ALoCoQkCRUDGa1xLkBDCBgblT5YogLsJi8CP5O3X4DC8KfUQlP69F96vclO3QYryoID482Ng8tBY 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.8.7.23921 X-PMX-Spam: Gauge=X, Probability=10%, Report=' HASHBUSTER_BLOCK_V2 0.5, HTML_00_01 0.05, HTML_00_10 0.05, BODY_SIZE_3000_3999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, DATE_TZ_NA 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __HASHBUSTER_BLOCK_V2_1 0, __HAS_FROM 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __SANE_MSGID 0, __STOCK_PHRASE_7 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS ' The xc5000c and newer versions of the xc5000a firmware need minor revisions to their initialization process. Add support for validating the firmware was properly loaded, as well as checking the init status after initialization. Based on advice from CrestaTech support as well as xc5000 datasheet v2.3. Signed-off-by: Devin Heitmueller --- drivers/media/common/tuners/xc5000.c | 39 ++++++++++++++++++++++++++++++++++ 1 files changed, 39 insertions(+), 0 deletions(-) diff --git a/drivers/media/common/tuners/xc5000.c b/drivers/media/common/tuners/xc5000.c index 7c36465..3e5f8cd 100644 --- a/drivers/media/common/tuners/xc5000.c +++ b/drivers/media/common/tuners/xc5000.c @@ -63,6 +63,8 @@ struct xc5000_priv { int chip_id; u16 pll_register_no; + u8 init_status_supported; + u8 fw_checksum_supported; }; /* Misc Defines */ @@ -113,6 +115,8 @@ struct xc5000_priv { #define XREG_BUSY 0x09 #define XREG_BUILD 0x0D #define XREG_TOTALGAIN 0x0F +#define XREG_FW_CHECKSUM 0x12 +#define XREG_INIT_STATUS 0x13 /* Basic firmware description. This will remain with @@ -211,6 +215,8 @@ struct xc5000_fw_cfg { char *name; u16 size; u16 pll_reg; + u8 init_status_supported; + u8 fw_checksum_supported; }; static const struct xc5000_fw_cfg xc5000a_1_6_114 = { @@ -223,6 +229,8 @@ static const struct xc5000_fw_cfg xc5000c_41_024_5 = { .name = "dvb-fe-xc5000c-41.024.5.fw", .size = 16497, .pll_reg = 0x13, + .init_status_supported = 1, + .fw_checksum_supported = 1, }; static inline const struct xc5000_fw_cfg *xc5000_assign_firmware(int chip_id) @@ -622,6 +630,8 @@ static int xc5000_fwupload(struct dvb_frontend *fe) const struct xc5000_fw_cfg *desired_fw = xc5000_assign_firmware(priv->chip_id); priv->pll_register_no = desired_fw->pll_reg; + priv->init_status_supported = desired_fw->init_status_supported; + priv->fw_checksum_supported = desired_fw->fw_checksum_supported; /* request the firmware, this will block and timeout */ printk(KERN_INFO "xc5000: waiting for firmware upload (%s)...\n", @@ -1082,6 +1092,7 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe, int force) struct xc5000_priv *priv = fe->tuner_priv; int ret = XC_RESULT_SUCCESS; u16 pll_lock_status; + u16 fw_ck; if (force || xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) { @@ -1093,6 +1104,21 @@ fw_retry: msleep(20); + if (priv->fw_checksum_supported) { + if (xc5000_readreg(priv, XREG_FW_CHECKSUM, &fw_ck) + != XC_RESULT_SUCCESS) { + dprintk(1, "%s() FW checksum reading failed.\n", + __func__); + goto fw_retry; + } + + if (fw_ck == 0) { + dprintk(1, "%s() FW checksum failed = 0x%04x\n", + __func__, fw_ck); + goto fw_retry; + } + } + /* Start the tuner self-calibration process */ ret |= xc_initialize(priv); @@ -1106,6 +1132,19 @@ fw_retry: */ xc_wait(100); + if (priv->init_status_supported) { + if (xc5000_readreg(priv, XREG_INIT_STATUS, &fw_ck) != XC_RESULT_SUCCESS) { + dprintk(1, "%s() FW failed reading init status.\n", + __func__); + goto fw_retry; + } + + if (fw_ck == 0) { + dprintk(1, "%s() FW init status failed = 0x%04x\n", __func__, fw_ck); + goto fw_retry; + } + } + if (priv->pll_register_no) { xc5000_readreg(priv, priv->pll_register_no, &pll_lock_status);