Received: by 10.192.165.148 with SMTP id m20csp4816118imm; Tue, 8 May 2018 15:07:36 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoMreezz8oCrlBDrCpBcrgmixTQUCVN2osRug6t5VFcFcGwZ6eAcHlPYpI/r5qNIrlth85J X-Received: by 2002:a17:902:a9c1:: with SMTP id b1-v6mr35366778plr.181.1525817256228; Tue, 08 May 2018 15:07:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525817256; cv=none; d=google.com; s=arc-20160816; b=bc8Ph3P17GfPpmrANBVjFzHluwf3r3ZqHsyCVPMUvySmRbIY0/ma7L7/U45W4IUe69 l78rJX5wNDW+FB/PA9XASvMR222JVZxUhunWMx/VMW9N3iPB9iQKIAkHq+ZKTphOYGqO 4Zi8tYc0AJgcyO10uck1ANyuz3px1KQ0KHQlG6kNuelPYY//mZPCsuKLSFXelnNXwAaZ 23Tm9txWqOLTa951kWfwIoIluo99lpNcDAmYUlNNvzbCpErXY9aQi8Z7vB4p4twcXgxy eX6shDfy9eF4+NPgZU+EWQWkIvPssiTYSZGgUBI+pSmyTn6DZGycIWmW0+0Okp0fMm8p uijQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=Akgshs5yj4m7AOZHdjef2vo7hoeaasUN6JkSOjTtTDY=; b=hADaQ+CKXYOJnOFuhCXlVZKU/2gpaKMvcVRpBb+PtYrookAe3EJ+CZdErbV2l5SZVq HeLn8GFAJZzcrxRDeSoYVA1PLzs5R9mA4Zfzx3hDTXsRoftEhnQ1gw0Gg71aG3816XUi DgXkPhmdWalGmwpxLmfy2qb7WyK/upo100ry3n75jzVmcYn9QX4anfVCtxm4i2B0e8xo 5mU8Yh+Y6UQaN+uo33NfLuGOl+6FsC2j53rkzcKx/tBwQOQi5w7GvczyZvpNTIn6iLMO fE7l8nv8D94pzj6FEzve6UEYbE91mIkUG7fOIJNo073m5fzFR67s2wmdMvrCeoGr1KDb uQmw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=phjt/KRs; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c3si22372001pfn.245.2018.05.08.15.07.20; Tue, 08 May 2018 15:07:36 -0700 (PDT) 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=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=phjt/KRs; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932367AbeEHWGX (ORCPT + 99 others); Tue, 8 May 2018 18:06:23 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:52483 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755741AbeEHWGV (ORCPT ); Tue, 8 May 2018 18:06:21 -0400 Received: by mail-wm0-f67.google.com with SMTP id w194so21137771wmf.2 for ; Tue, 08 May 2018 15:06:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=Akgshs5yj4m7AOZHdjef2vo7hoeaasUN6JkSOjTtTDY=; b=phjt/KRs+RSMKU0tjcG8/l2pMZk625C0NhCCdqRkxuf37XxzR72RF2l5wcgtdACiCx ZUrNjjvrwL64s/O5uN7sDkz7/5nZltEcwSc1QtqjXVW9kfhwEfdRJNwaH1mbeqaqnP1U j6UpPeatedQIw5QatJrdBBxPFM1cC9rMYQXTJpLxbJVFR9VPqLZyW1oFScfZlWQtuW0H oPsrybH7E8FEbhSRvLAtY5SCzPMhxiiy4TGNJmMrx4I/7UXRyg94lDE+FHquSUG6x5da lQ/wBgt7nmh50Uf8Os9qrPwWrOD8jfW8l4plPAyPIJd6qaYPMiJFFe6WPJMhaFqjTd+0 QTMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Akgshs5yj4m7AOZHdjef2vo7hoeaasUN6JkSOjTtTDY=; b=MCQpdwvFoUxCFgXu3EKuXTmrKr6C0ZC9mT3yu+0qK9BHCPAk+dX3VHdp6YVB/lIpbf I30Svw6v5Vw0nqOr8FASzhLeUwqEpYJyeCCEel0eeu5I2759x/vEh0W6Jl3UPBRNXxMZ lwxyXrzWEVSoftCAXqIbu9cbHSD+S1hXXeNEbwhMZyGP/u13hCNCyPSmBmVgwtEMh9IH gbtbXjTQAiMzGgQjnHln7IYG4pHlSJAHmD6ScOO9vEUqDYjhrM/RmsWJ4hfr4nZwi+FH qjtndsdDeKBat/7JlzLoonmzGHdSk7+FJ74vQKEdayBlmiZwjjwBhnwvEzTcUhzPLiNI 68NQ== X-Gm-Message-State: ALKqPweGSGA+EvSj36/Yv0A1Ez7LuzhZg0Brq5HIP9LnOU6G5hQ6gNnG G6LuWU1o3ZJRIGQnTQlZmkOXjA== X-Received: by 10.28.227.212 with SMTP id a203mr4147851wmh.151.1525817180519; Tue, 08 May 2018 15:06:20 -0700 (PDT) Received: from localhost.localdomain (141.pool85-51-114.dynamic.orange.es. [85.51.114.141]) by smtp.gmail.com with ESMTPSA id q7-v6sm30415774wrf.49.2018.05.08.15.06.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 08 May 2018 15:06:20 -0700 (PDT) From: Jorge Ramirez-Ortiz To: jramirez@baylibre.com, broonie@kernel.org Cc: linux-kernel@vger.kernel.org Subject: [RFC] regmap: allow volatile register writes with cached only read maps Date: Wed, 9 May 2018 00:06:09 +0200 Message-Id: <1525817169-29233-1-git-send-email-jramirez@baylibre.com> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Regmap only allows volatile access to registers when the client supports both reads and writes. This commit bypasses that limitation and enables volatile writes to selected registers while maintaining cached accesses on all reads. For this, the client does not need to configure the reg_read callback. Signed-off-by: Jorge Ramirez-Ortiz --- drivers/base/regmap/internal.h | 1 + drivers/base/regmap/regcache.c | 10 +++++++++- drivers/base/regmap/regmap-debugfs.c | 17 +++++++++++++++-- drivers/base/regmap/regmap.c | 11 +++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h index 53785e0..496c825 100644 --- a/drivers/base/regmap/internal.h +++ b/drivers/base/regmap/internal.h @@ -180,6 +180,7 @@ bool regmap_cached(struct regmap *map, unsigned int reg); bool regmap_writeable(struct regmap *map, unsigned int reg); bool regmap_readable(struct regmap *map, unsigned int reg); bool regmap_volatile(struct regmap *map, unsigned int reg); +bool regmap_volatile_writes(struct regmap *map, unsigned int reg); bool regmap_precious(struct regmap *map, unsigned int reg); int _regmap_write(struct regmap *map, unsigned int reg, diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c index 7735603..51cceaa 100644 --- a/drivers/base/regmap/regcache.c +++ b/drivers/base/regmap/regcache.c @@ -273,8 +273,16 @@ int regcache_write(struct regmap *map, BUG_ON(!map->cache_ops); - if (!regmap_volatile(map, reg)) + if (!regmap_volatile(map, reg)) { + + if (!regmap_readable(map, reg)) { + /* check if the client configured volatile writes */ + if (regmap_volatile_writes(map, reg)) + return 0; + } + return map->cache_ops->write(map, reg, value); + } return 0; } diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c index 87b562e..89fb771 100644 --- a/drivers/base/regmap/regmap-debugfs.c +++ b/drivers/base/regmap/regmap-debugfs.c @@ -415,20 +415,33 @@ static const struct file_operations regmap_reg_ranges_fops = { static int regmap_access_show(struct seq_file *s, void *ignored) { struct regmap *map = s->private; + char reg_volatile; int i, reg_len; reg_len = regmap_calc_reg_len(map->max_register); for (i = 0; i <= map->max_register; i += map->reg_stride) { - /* Ignore registers which are neither readable nor writable */ + reg_volatile = 'n'; + + /* Ignore registers which are neither readable nor writable */ if (!regmap_readable(map, i) && !regmap_writeable(map, i)) continue; + if (regmap_volatile(map, i)) { + reg_volatile = 'y'; + goto done; + } + + if (!regmap_readable(map, i)) { + if (regmap_volatile_writes(map, i)) + reg_volatile = 'y'; + } +done: /* Format the register */ seq_printf(s, "%.*x: %c %c %c %c\n", reg_len, i, regmap_readable(map, i) ? 'y' : 'n', regmap_writeable(map, i) ? 'y' : 'n', - regmap_volatile(map, i) ? 'y' : 'n', + reg_volatile, regmap_precious(map, i) ? 'y' : 'n'); } diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 3bc8488..7d4b671 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -154,6 +154,17 @@ bool regmap_volatile(struct regmap *map, unsigned int reg) return true; } +bool regmap_volatile_writes(struct regmap *map, unsigned int reg) +{ + if (map->volatile_reg) + return map->volatile_reg(map->dev, reg); + + if (map->volatile_table) + return regmap_check_range_table(map, reg, map->volatile_table); + + return false; +} + bool regmap_precious(struct regmap *map, unsigned int reg) { if (!regmap_readable(map, reg)) -- 2.7.4