From patchwork Fri Dec 22 09:32:25 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 10129387 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 F03C16019C for ; Fri, 22 Dec 2017 09:37:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id ECA6829FCA for ; Fri, 22 Dec 2017 09:37:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E1A322A026; Fri, 22 Dec 2017 09:37:13 +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=-4.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 7355529FCA for ; Fri, 22 Dec 2017 09:37:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=dGOKKa7xKxoYDvKNOMNduuuRd0BS+b9Y/Oct1f4qdgg=; b=YvptxF7sCT6bUO0j2cUEhHDzkQ 5UpEIuW0n80GquP2FN/WOslEuncYD5u3ARMgH4AWlrLdYfv773gRm/ln2mD+zyq5uVFzyOC9xHsFL BsMh4MaDD9XtHaCsdTzClPZ/OG2RrhJ1rxipdmD7/IvApEsyXFcKTVpa84X8xMApebTUqYEltPj+d iNdkN0Oaf9r/fmV2cTON4FTpCK4cypZgM9ULwAwcHkC1GmBuUWuTef6yc5bgOzDioky1qmwcQzZWu tSOGEh5YyElSNCG6XVyjBbB+4G3i9TqZnqvnVVL0sQLBcAu/BIJfsSczT6IAJfJdCTEmOcfmpOYCh f1cYM2HQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1eSJlL-0006S6-Io; Fri, 22 Dec 2017 09:37:07 +0000 Received: from mail.free-electrons.com ([62.4.15.54]) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1eSJhQ-00031m-CN for linux-arm-kernel@lists.infradead.org; Fri, 22 Dec 2017 09:33:24 +0000 Received: by mail.free-electrons.com (Postfix, from userid 110) id 36F252099A; Fri, 22 Dec 2017 10:32:50 +0100 (CET) Received: from localhost.localdomain (LStLambert-657-1-97-87.w90-63.abo.wanadoo.fr [90.63.216.87]) by mail.free-electrons.com (Postfix) with ESMTPSA id 56D58209A0; Fri, 22 Dec 2017 10:32:32 +0100 (CET) From: Miquel Raynal To: Zhang Rui , Eduardo Valentin , Rob Herring , Mark Rutland Subject: [PATCH v6 10/11] thermal: armada: Wait sensors validity before exiting the init callback Date: Fri, 22 Dec 2017 10:32:25 +0100 Message-Id: <20171222093226.23456-11-miquel.raynal@free-electrons.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171222093226.23456-1-miquel.raynal@free-electrons.com> References: <20171222093226.23456-1-miquel.raynal@free-electrons.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171222_013305_494860_83CF3D46 X-CRM114-Status: GOOD ( 13.26 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Petazzoni , devicetree@vger.kernel.org, Baruch Siach , linux-pm@vger.kernel.org, Antoine Tenart , Nadav Haklai , David Sniatkiwicz , Miquel Raynal , Gregory Clement , linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP The thermal core will check for sensors validity right after the initialization callback has returned. As the initialization routine make a reset, the sensors are not ready immediately and the core spawns an error in the dmesg. Avoid this annoying situation by polling on the validity bit before exiting from these routines. This also avoid the use of blind sleeps. Suggested-by: David Sniatkiwicz Signed-off-by: Miquel Raynal Reviewed-by: Gregory CLEMENT --- drivers/thermal/armada_thermal.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c index a3feaef7db20..ea958e651312 100644 --- a/drivers/thermal/armada_thermal.c +++ b/drivers/thermal/armada_thermal.c @@ -23,6 +23,7 @@ #include #include #include +#include /* Thermal Manager Control and Status Register */ #define PMU_TDC0_SW_RST_MASK (0x1 << 1) @@ -59,6 +60,9 @@ #define CONTROL1_EXT_TSEN_SW_RESET BIT(7) #define CONTROL1_EXT_TSEN_HW_RESETn BIT(8) +#define STATUS_POLL_PERIOD_US 1000 +#define STATUS_POLL_TIMEOUT_US 100000 + struct armada_thermal_data; /* Marvell EBU Thermal Sensor Dev Structure */ @@ -155,6 +159,16 @@ static void armada375_init_sensor(struct platform_device *pdev, msleep(50); } +static void armada_wait_sensor_validity(struct armada_thermal_priv *priv) +{ + u32 reg; + + readl_relaxed_poll_timeout(priv->status, reg, + reg & priv->data->is_valid_bit, + STATUS_POLL_PERIOD_US, + STATUS_POLL_TIMEOUT_US); +} + static void armada380_init_sensor(struct platform_device *pdev, struct armada_thermal_priv *priv) { @@ -164,7 +178,6 @@ static void armada380_init_sensor(struct platform_device *pdev, reg |= CONTROL1_EXT_TSEN_HW_RESETn; reg &= ~CONTROL1_EXT_TSEN_SW_RESET; writel(reg, priv->control1); - msleep(10); /* Set Tsen Tc Trim to correct default value (errata #132698) */ if (priv->control0) { @@ -172,8 +185,10 @@ static void armada380_init_sensor(struct platform_device *pdev, reg &= ~CONTROL0_TSEN_TC_TRIM_MASK; reg |= CONTROL0_TSEN_TC_TRIM_VAL; writel(reg, priv->control0); - msleep(10); } + + /* Wait the sensors to be valid or the core will warn the user */ + armada_wait_sensor_validity(priv); } static void armada_ap806_init_sensor(struct platform_device *pdev, @@ -185,7 +200,9 @@ static void armada_ap806_init_sensor(struct platform_device *pdev, reg &= ~CONTROL0_TSEN_RESET; reg |= CONTROL0_TSEN_START | CONTROL0_TSEN_ENABLE; writel(reg, priv->control0); - msleep(10); + + /* Wait the sensors to be valid or the core will warn the user */ + armada_wait_sensor_validity(priv); } static bool armada_is_valid(struct armada_thermal_priv *priv)