Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp1584935ybl; Wed, 8 Jan 2020 21:02:24 -0800 (PST) X-Google-Smtp-Source: APXvYqzR0pP4YN9DrPgkUln+nw5ggYiERSuCVgz9dYF3ZcMvfJEFKvyfzttxX5pP9MfXF//xzpRA X-Received: by 2002:aca:d502:: with SMTP id m2mr1669867oig.41.1578546143796; Wed, 08 Jan 2020 21:02:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578546143; cv=none; d=google.com; s=arc-20160816; b=ZIvJTyPTNJbtRFAkflGgooUM243/JZVgSRhAA6rtbfuvHCp3i0UikqmXRYVuPSGXBq bjdSwuuMgPq9HmxjDtO3W2XQ6C+Y6TBvo69Gu15N1YlMskWdUt/0N7+9ZsIsikPwSIuU F2t0xaOR+3WeqzB8nNB1Btwlcj7EhV/P0qERnIW+Os52yxXJUvZhr0EVFAa9En7q6buT JGMUO/T9tL/B96i27tw/Qwg9YP5mR2t3EjNTH1x6M3fcmX9mifgTUfylJcMzveM/y9zc nvF1H8uZhEb0eI6rmdPp7DZ/P2meY1XO51KbxTQH8dY98W1pqPwD6K2DqEbyNu6a1u8T 9JQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:dkim-signature:mime-version:message-id :date:subject:cc:to:from; bh=b30C9NYKDdrFBi/22S24jwRhgeystEGwwCyuH/hljpU=; b=uNkkOR3AAOS6rSnL29vXwoEA0HSxJj9Lj6SLZuaMYXaUF5QorGwAZNEN+qhz+612d1 F6HgXSvOhadd2O3BMYMY2xjOj7ZDlF0yZr04zbIlWxi0PYjHlkj52E4hEnxR2pPF5jef NIe76P4qkWnC6wui/XUElhTmEiwRiFSygcOf+DUfgagB0bux7o/cCitruqnZi1lfthmC tHx05BQsXSI2tyCyWwsDnIEH6PnbqNAMurHS3D/pXhjxGWOZP4XADQAGnIlfQV8Inn/u MXqkQo71tXoVdlUhF457jNtcKd9fCOL5MpPHH9zha/V9SMTaBdjvsfUmu60Jfst0yczL 449A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nvidia.com header.s=n1 header.b=enhRVLF1; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=nvidia.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v13si3964843otr.140.2020.01.08.21.02.11; Wed, 08 Jan 2020 21:02:23 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@nvidia.com header.s=n1 header.b=enhRVLF1; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=nvidia.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725830AbgAIFBa (ORCPT + 99 others); Thu, 9 Jan 2020 00:01:30 -0500 Received: from hqnvemgate24.nvidia.com ([216.228.121.143]:14982 "EHLO hqnvemgate24.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725308AbgAIFBa (ORCPT ); Thu, 9 Jan 2020 00:01:30 -0500 Received: from hqpgpgate102.nvidia.com (Not Verified[216.228.121.13]) by hqnvemgate24.nvidia.com (using TLS: TLSv1.2, DES-CBC3-SHA) id ; Wed, 08 Jan 2020 21:00:39 -0800 Received: from hqmail.nvidia.com ([172.20.161.6]) by hqpgpgate102.nvidia.com (PGP Universal service); Wed, 08 Jan 2020 21:01:28 -0800 X-PGP-Universal: processed; by hqpgpgate102.nvidia.com on Wed, 08 Jan 2020 21:01:28 -0800 Received: from HQMAIL107.nvidia.com (172.20.187.13) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Thu, 9 Jan 2020 05:01:28 +0000 Received: from hqnvemgw03.nvidia.com (10.124.88.68) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Thu, 9 Jan 2020 05:01:28 +0000 Received: from audio.nvidia.com (Not Verified[10.24.34.185]) by hqnvemgw03.nvidia.com with Trustwave SEG (v7,5,8,10121) id ; Wed, 08 Jan 2020 21:01:28 -0800 From: Sameer Pujar To: CC: , , , Sameer Pujar Subject: [PATCH v2] regmap: add iopoll-like atomic polling macro Date: Thu, 9 Jan 2020 10:31:17 +0530 Message-ID: <1578546077-764-1-git-send-email-spujar@nvidia.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 Content-Type: text/plain DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1578546039; bh=b30C9NYKDdrFBi/22S24jwRhgeystEGwwCyuH/hljpU=; h=X-PGP-Universal:From:To:CC:Subject:Date:Message-ID:X-Mailer: MIME-Version:Content-Type; b=enhRVLF1CNZsINaeW6PHFoM5sIgJwgTUTCVf6K9syRk4SnGC8WDeKjJMTxAcbf56I lVveFY/LIFdNK9Ep5C7uXW+LMBqZgSjjOD+X+YNiJTL0ZGcKQSR7j+AxQZCsgfa66Y O9CIxzWgC1cCIqWVfzS7gQ31SuEGx+JGQcdDhiQWZBTy1gP0cHxDcmcKCdv18ADmOg QnQA+LcfGB4w8DsXZQJtp8+sLl3F52CNOXPq71mxaQfXdlvwFLjeuMpqVdhGD1Zitd +Y2+5dK81K42b3M/RIkJ4IgRUTt/QdQjHMd+rAXKLqxBdawV7pSuATMf9grGcpdKdW EpRSRngz7iRww== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds a macro 'regmap_read_poll_timeout_atomic' that works similar to 'readx_poll_timeout_atomic' defined in linux/iopoll.h; This is atomic version of already available 'regmap_read_poll_timeout' macro. It should be noted that above atomic macro cannot be used by all regmaps. If the regmap is set up for atomic use (flat or no cache and MMIO) then only it can use. Signed-off-by: Sameer Pujar --- include/linux/regmap.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/include/linux/regmap.h b/include/linux/regmap.h index dfe493a..aaf0ed1 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -119,6 +119,10 @@ struct reg_sequence { * from atomic context if sleep_us or timeout_us are used. * * This is modelled after the readx_poll_timeout macros in linux/iopoll.h. + * + * Note: In general regmap cannot be used in atomic context. If you want to use + * this macro then first setup your regmap for atomic use (flat or no cache + * and MMIO regmap). */ #define regmap_read_poll_timeout(map, addr, val, cond, sleep_us, timeout_us) \ ({ \ @@ -145,6 +149,47 @@ struct reg_sequence { }) /** + * regmap_read_poll_timeout_atomic - Poll until a condition is met or a timeout occurs + * + * @map: Regmap to read from + * @addr: Address to poll + * @val: Unsigned integer variable to read the value into + * @cond: Break condition (usually involving @val) + * @delay_us: Time to udelay between reads in us (0 tight-loops). + * Should be less than ~10us since udelay is used + * (see Documentation/timers/timers-howto.rst). + * @timeout_us: Timeout in us, 0 means never timeout + * + * Returns 0 on success and -ETIMEDOUT upon a timeout or the regmap_read + * error return value in case of a error read. In the two former cases, + * the last read value at @addr is stored in @val. + * + * This is modelled after the readx_poll_timeout_atomic macros in linux/iopoll.h. + */ +#define regmap_read_poll_timeout_atomic(map, addr, val, cond, delay_us, timeout_us) \ +({ \ + u64 __timeout_us = (timeout_us); \ + unsigned long __delay_us = (delay_us); \ + ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \ + int __ret; \ + for (;;) { \ + __ret = regmap_read((map), (addr), &(val)); \ + if (__ret) \ + break; \ + if (cond) \ + break; \ + if ((__timeout_us) && \ + ktime_compare(ktime_get(), __timeout) > 0) { \ + __ret = regmap_read((map), (addr), &(val)); \ + break; \ + } \ + if (__delay_us) \ + udelay(__delay_us); \ + } \ + __ret ?: ((cond) ? 0 : -ETIMEDOUT); \ +}) + +/** * regmap_field_read_poll_timeout - Poll until a condition is met or timeout * * @field: Regmap field to read from -- 2.7.4