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 X-Spam-Level: X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 20ABCC4743F for ; Sat, 5 Jun 2021 11:07:51 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 05BAA61354 for ; Sat, 5 Jun 2021 11:07:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230161AbhFELJh (ORCPT ); Sat, 5 Jun 2021 07:09:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35304 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230103AbhFELJg (ORCPT ); Sat, 5 Jun 2021 07:09:36 -0400 Received: from polaris.svanheule.net (polaris.svanheule.net [IPv6:2a00:c98:2060:a004:1::200]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4D8D5C061768 for ; Sat, 5 Jun 2021 04:07:48 -0700 (PDT) Received: from [IPv6:2a02:a03f:eafb:ee01:578f:7526:5a0:96d5] (unknown [IPv6:2a02:a03f:eafb:ee01:578f:7526:5a0:96d5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: sander@svanheule.net) by polaris.svanheule.net (Postfix) with ESMTPSA id 4411A20907C; Sat, 5 Jun 2021 13:07:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=svanheule.net; s=mail1707; t=1622891266; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UFmqQDr1GHxA/eAjSwi6GL9nIZuMpYiXeJXZ70OTXsk=; b=55gawZN8Lm9MfXTMFG5Gc8TsY44sUdRvZ351PiFdgxZ/gs2TvofEsqFOHXLm7gt1sdD9+G tnXtlKDpv5LiAvAB9p/m6HSJ+OeI7mHzYozRPSHastEb84xtvB8eu5Cq8hGZ329hkWYchN MHOiGluIBMkzuU+J8mGh4Uj3QeIuP60N0KZi9LZ9duYsvQWuiSwo4L2WmMoGBnfsPH7CxN QYwZF7e+kxigdWZAdrTkgqRPRcwMfuLsj3puSB3B674NtpDWdW9ufEyHUbNZu3aE/OpTcp TE6xAJJmKGP95Wp0qe2Xd06UWMIE0HRllzfrzI1b4ioLWsOMCuORpSfJdMoQFw== Message-ID: <76c058318f5c5d984ade4f65bb359e686836b0b4.camel@svanheule.net> Subject: Re: [PATCH v4 3/5] mfd: Add RTL8231 core device From: Sander Vanheule To: Andy Shevchenko Cc: Pavel Machek , Rob Herring , Lee Jones , Linus Walleij , Michael Walle , Linux LED Subsystem , devicetree , "open list:GPIO SUBSYSTEM" , Hans de Goede , Andrew Lunn , Linux Kernel Mailing List , Mark Brown Date: Sat, 05 Jun 2021 13:07:44 +0200 In-Reply-To: References: <56fb027587fa067a249237ecaf40828cd508cdcc.1622713678.git.sander@svanheule.net> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.4 (3.38.4-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 2021-06-03 at 13:58 +0300, Andy Shevchenko wrote: > On Thu, Jun 3, 2021 at 1:01 PM Sander Vanheule wrote: > > +static int rtl8231_reg_read(void *context, unsigned int reg, unsigned int > > *val) > > +{ > > +       struct mdio_device *mdio_dev = context; > > +       int ret; > > + > > +       ret = mdiobus_read(mdio_dev->bus, mdio_dev->addr, > > RTL8231_REAL_REG(reg)); > > + > > +       if (ret < 0) > > +               return ret; > > + > > +       *val = ret & 0xffff; > > + > > +       return 0; > > +} > > + > > +static int rtl8231_reg_write(void *context, unsigned int reg, unsigned int > > val) > > +{ > > +       struct mdio_device *mdio_dev = context; > > + > > +       return mdiobus_write(mdio_dev->bus, mdio_dev->addr, > > RTL8231_REAL_REG(reg), val); > > +} > > Hmm... Maybe we can amend regmap-mdio to avoid duplication of the > above? Something like xlate in gpio-regmap or so? (+Cc Mark for the regmap discussion) It turns out that I can't use both devm_regmap_init_mdio and the overrides regmap_config.reg_read/write. This appears to be in contrast to what the documentation for these two overrides suggest. devm_regmap_init_mdio provides a bus for the regmap, which causes the overrides to be ignored in regmap.c Then I tried to use the paging support provided by regmap, by adding the following config: static struct regmap_range_cfg rtl8231_reg_ranges[] = { { /* Specify an unused register with an empty mask */ .selector_reg = 0x1f, .selector_mask = 0x00, .selector_shift = 0, .range_min = 0x00, .range_max = RTL8231_VREG(RTL8231_REG_COUNT - 1), .window_start = 0x00, .window_len = 0x20, }, }; This also doesn't work, because the used _regmap_bus_reg_read/write don't resolve register pages. The patch below fixes this, but maybe this missing functionality is intentional, and I should actually implement regmap_bus.read/write? ----8<---- diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 0d185ec018a5..20b6a2e0d2e3 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -1881,6 +1881,15 @@ static int _regmap_bus_reg_write(void *context, unsigned int reg, unsigned int val) { struct regmap *map = context; + struct regmap_range_node *range; + int ret; + + range = _regmap_range_lookup(map, reg); + if (range) { + ret = _regmap_select_page(map, ®, range, 1); + if (ret != 0) + return ret; + } return map->bus->reg_write(map->bus_context, reg, val); } @@ -2651,6 +2660,15 @@ static int _regmap_bus_reg_read(void *context, unsigned int reg, unsigned int *val) { struct regmap *map = context; + struct regmap_range_node *range; + int ret; + + range = _regmap_range_lookup(map, reg); + if (range) { + ret = _regmap_select_page(map, ®, range, 1); + if (ret != 0) + return ret; + } return map->bus->reg_read(map->bus_context, reg, val); } -- Best, Sander