From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5372AC433F5 for ; Tue, 12 Apr 2022 13:34:15 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 7EC6083E06; Tue, 12 Apr 2022 15:33:40 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=collabora.com header.i=@collabora.com header.b="b3Xmo1kU"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 0FFE583B8B; Tue, 12 Apr 2022 15:32:59 +0200 (CEST) Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 588CD835B9 for ; Tue, 12 Apr 2022 15:32:56 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ariel.dalessandro@collabora.com Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: adalessandro) with ESMTPSA id 0BE831F444B4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1649770376; bh=v8bayG9XOktD5X+jXdEz5hkYFAjSbFxGs4QuriNO7EU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=b3Xmo1kUISTwGbwkpCMX/bno5PdQ4FKi+qDC0omcL/SlTfYc+p5Svu406eZ9EN4NQ A7b1LTc4xPZBAk5waaP2sN7JvmP0n4kDN16Y6Amsoi6rc2fKPrGSXVDN/KO0VPq8e+ Uo79KOvmIxmcBq6FlVzm7kK+OhGatIhjn+wdoAzcHubyNDUZX5iiXGhPXiDww5/E/+ npdepqF1FmWkg+fRO/5HMqD7o4kaeaxg3Zvubn/cRI+GQALZdb/ONEgYm/XaLGxrHf qzwHCULitrNQ9V6T2BLxbpEwCf1GglcaWTlVxhEdPC4HKKgFt2NYRR1cu/wwFMK9HJ uNB06Z/RqQuEA== From: Ariel D'Alessandro To: u-boot@lists.denx.de Cc: Peter.Hoyes@arm.com, aford173@gmail.com, alice.guo@nxp.com, andre.przywara@arm.com, andrey.zhizhikin@leica-geosystems.com, ariel.dalessandro@collabora.com, bmeng.cn@gmail.com, christian.gmeiner@gmail.com, christianshewitt@gmail.com, festevam@gmail.com, iliev@ronetix.at, jagan@amarulasolutions.com, jh80.chung@samsung.com, joe.hershberger@ni.com, kettenis@openbsd.org, kever.yang@rock-chips.com, kuldeep.singh@nxp.com, marcel.ziswiler@toradex.com, marex@denx.de, michael@amarulasolutions.com, michal.simek@xilinx.com, oliver.graute@kococonnector.com, pali@kernel.org, paul.liu@linaro.org, pbrobinson@gmail.com, peng.fan@nxp.com, philipp.tomsich@vrull.eu, priyanka.jain@nxp.com, radu-nicolae.pirea@oss.nxp.com, rath@ibv-augsburg.net, rfried.dev@gmail.com, samuel@sholland.org, sbabic@denx.de, simon.k.r.goldschmidt@gmail.com, sjg@chromium.org, stephan@gerhold.net, tharvey@gateworks.com, tien.fong.chee@intel.com, uboot-imx@nxp.com, vladimir.oltean@nxp.com, wd@denx.de, xypron.glpk@gmx.de, ye.li@nxp.com Subject: [PATCH v5 4/7] iopoll: Extend read_poll_timeout macro to support variable parameters Date: Tue, 12 Apr 2022 10:31:35 -0300 Message-Id: <20220412133138.110815-5-ariel.dalessandro@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220412133138.110815-1-ariel.dalessandro@collabora.com> References: <20220412133138.110815-1-ariel.dalessandro@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Mailman-Approved-At: Tue, 12 Apr 2022 15:33:24 +0200 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.5 at phobos.denx.de X-Virus-Status: Clean This macro currently supports only one parameter. Based on Linux iopoll, let's extend read_poll_timeout common API to allow multiple variable parameters. Signed-off-by: Ariel D'Alessandro --- arch/arm/mach-socfpga/reset_manager_s10.c | 20 +++++++++++--------- drivers/mmc/rockchip_sdhci.c | 9 +++++---- include/linux/iopoll.h | 12 ++++++------ 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/arch/arm/mach-socfpga/reset_manager_s10.c b/arch/arm/mach-socfpga/reset_manager_s10.c index d2337bd4d62..f47fec10a0c 100644 --- a/arch/arm/mach-socfpga/reset_manager_s10.c +++ b/arch/arm/mach-socfpga/reset_manager_s10.c @@ -80,9 +80,9 @@ void socfpga_bridges_reset(int enable) ~0); /* Poll until all idleack to 0 */ - read_poll_timeout(readl, socfpga_get_sysmgr_addr() + - SYSMGR_SOC64_NOC_IDLEACK, reg, !reg, 1000, - 300000); + read_poll_timeout(readl, reg, !reg, 1000, 300000, + socfpga_get_sysmgr_addr() + + SYSMGR_SOC64_NOC_IDLEACK); } else { /* set idle request to all bridges */ writel(~0, @@ -93,18 +93,20 @@ void socfpga_bridges_reset(int enable) writel(1, socfpga_get_sysmgr_addr() + SYSMGR_SOC64_NOC_TIMEOUT); /* Poll until all idleack to 1 */ - read_poll_timeout(readl, socfpga_get_sysmgr_addr() + - SYSMGR_SOC64_NOC_IDLEACK, reg, + read_poll_timeout(readl, reg, reg == (SYSMGR_NOC_H2F_MSK | SYSMGR_NOC_LWH2F_MSK), - 1000, 300000); + 1000, 300000, + socfpga_get_sysmgr_addr() + + SYSMGR_SOC64_NOC_IDLEACK); /* Poll until all idlestatus to 1 */ - read_poll_timeout(readl, socfpga_get_sysmgr_addr() + - SYSMGR_SOC64_NOC_IDLESTATUS, reg, + read_poll_timeout(readl, reg, reg == (SYSMGR_NOC_H2F_MSK | SYSMGR_NOC_LWH2F_MSK), - 1000, 300000); + 1000, 300000, + socfpga_get_sysmgr_addr() + + SYSMGR_SOC64_NOC_IDLESTATUS); /* Reset all bridges (except NOR DDR scheduler & F2S) */ setbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_SOC64_BRGMODRST, diff --git a/drivers/mmc/rockchip_sdhci.c b/drivers/mmc/rockchip_sdhci.c index f3f9d83ba36..1fdc8415178 100644 --- a/drivers/mmc/rockchip_sdhci.c +++ b/drivers/mmc/rockchip_sdhci.c @@ -202,8 +202,8 @@ static void rk3399_emmc_phy_power_on(struct rockchip_emmc_phy *phy, u32 clock) /* REN Enable on STRB Line for HS400 */ writel(RK_CLRSETBITS(0, 1 << 9), &phy->emmcphy_con[2]); - read_poll_timeout(readl, &phy->emmcphy_status, dllrdy, - PHYCTRL_DLL_LOCK_WO_TMOUT(dllrdy), 1, 5000); + read_poll_timeout(readl, dllrdy, PHYCTRL_DLL_LOCK_WO_TMOUT(dllrdy), 1, + 5000, &phy->emmcphy_status); } static void rk3399_emmc_phy_power_off(struct rockchip_emmc_phy *phy) @@ -328,8 +328,9 @@ static int rk3568_sdhci_emmc_set_clock(struct sdhci_host *host, unsigned int clo DWCMSHC_EMMC_DLL_START; sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_CTRL); - ret = read_poll_timeout(readl, host->ioaddr + DWCMSHC_EMMC_DLL_STATUS0, - val, DLL_LOCK_WO_TMOUT(val), 1, 500); + ret = read_poll_timeout(readl, val, DLL_LOCK_WO_TMOUT(val), 1, + 500, + host->ioaddr + DWCMSHC_EMMC_DLL_STATUS0); if (ret) return ret; diff --git a/include/linux/iopoll.h b/include/linux/iopoll.h index 30cdea0cdc1..0ee2bddaa83 100644 --- a/include/linux/iopoll.h +++ b/include/linux/iopoll.h @@ -14,11 +14,11 @@ /** * read_poll_timeout - Periodically poll an address until a condition is met or a timeout occurs * @op: accessor function (takes @addr as its only argument) - * @addr: Address to poll * @val: Variable to read the value into * @cond: Break condition (usually involving @val) * @sleep_us: Maximum time to sleep in us * @timeout_us: Timeout in us, 0 means never timeout + * @args: arguments for @op poll * * Returns 0 on success and -ETIMEDOUT upon a timeout. In either * case, the last read value at @addr is stored in @val. @@ -26,15 +26,15 @@ * When available, you'll probably want to use one of the specialized * macros defined below rather than this macro directly. */ -#define read_poll_timeout(op, addr, val, cond, sleep_us, timeout_us) \ +#define read_poll_timeout(op, val, cond, sleep_us, timeout_us, args...) \ ({ \ unsigned long timeout = timer_get_us() + timeout_us; \ for (;;) { \ - (val) = op(addr); \ + (val) = op(args); \ if (cond) \ break; \ if (timeout_us && time_after(timer_get_us(), timeout)) { \ - (val) = op(addr); \ + (val) = op(args); \ break; \ } \ if (sleep_us) \ @@ -44,13 +44,13 @@ }) #define readx_poll_sleep_timeout(op, addr, val, cond, sleep_us, timeout_us) \ - read_poll_timeout(op, addr, val, cond, sleep_us, timeout_us) + read_poll_timeout(op, val, cond, sleep_us, timeout_us, addr) #define readl_poll_sleep_timeout(addr, val, cond, sleep_us, timeout_us) \ readx_poll_sleep_timeout(readl, addr, val, cond, sleep_us, timeout_us) #define readx_poll_timeout(op, addr, val, cond, timeout_us) \ - read_poll_timeout(op, addr, val, cond, false, timeout_us) + read_poll_timeout(op, val, cond, false, timeout_us, addr) #define readb_poll_timeout(addr, val, cond, timeout_us) \ readx_poll_timeout(readb, addr, val, cond, timeout_us) -- 2.34.1