Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp1626570pxj; Wed, 19 May 2021 10:05:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzafsU55PCjxeFxKumHybg4DW9sxvfOrEWGrW518iEsP2W9bo2/PUjmG4otd+5D861OPhQ0 X-Received: by 2002:a17:906:1305:: with SMTP id w5mr173597ejb.404.1621443925085; Wed, 19 May 2021 10:05:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621443925; cv=none; d=google.com; s=arc-20160816; b=tG5/us+zW3WdLcHl2veUTXMECCoN2ujl72jModnfVbJBrkmNt8rHYoQJe5mPHSIM6g 0l2y+hpVMnhgd24y+yTB3CxxiMNTKaav6xJu/1beL47JldCzhKI6K2/mdyxUa6MniTkB WYaDhMFcO+MR5LwK3UwPXafZ/hF/81hmomZLW8a9dHshIB5BXrnSFt4wc7cnc+/gXPf7 uLE6/4H7pQ33VdJB5Vea9AgnumPp5BywUplDmeO5TDLikP8D90p+9WHKu7akg3vRvTeZ i4Biq/j0X89YjPImaIdWKAUBOy84zcHWnIkIIjTaB+fN//IawyGE47YIXbRcg1UrsOZu TTzw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:user-agent:references:in-reply-to :subject:cc:to:from:date:content-transfer-encoding:mime-version :dkim-signature; bh=wN0B4yaF1WgJIn6AazhTXeaQAJgd9QwuhScgIP3JPig=; b=XSWdS5EBLvqsp6ntZUn8HasnD5gc1YzSPT7amHUh6RZhOr7efme4OGTgJyr06bRb+T ghT3m5e/11mt74vEzddaDFNCb9Dm0PFO7mSDILzsJ2iLY439TgCQvKm0MnCfkVLenm9B enX1TQdLLDyD1a2elXLSWOpqI0HDw+/DXZ6hdHp+hA6tyfHwl+1zHABWvkbzj7xrXdte YhgatnmuO/X9OYCKcOmhsMOaoTOEOBwA0v4j35RSE0sq0cqmHKgOEiYJuEIh8KSMoPf2 TGlzIoz1DOq1of2NIayi0+GLKoEMWe/SsZkzFoFgbvcP0i+Z/GltzVKZY0dX8w1YffBT jAUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@walle.cc header.s=mail2016061301 header.b=W7b3wCMR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bc2si471498edb.349.2021.05.19.10.05.01; Wed, 19 May 2021 10:05:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@walle.cc header.s=mail2016061301 header.b=W7b3wCMR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239891AbhERIkv (ORCPT + 99 others); Tue, 18 May 2021 04:40:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59514 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242786AbhERIkn (ORCPT ); Tue, 18 May 2021 04:40:43 -0400 Received: from ssl.serverraum.org (ssl.serverraum.org [IPv6:2a01:4f8:151:8464::1:2]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A3632C061573; Tue, 18 May 2021 01:39:23 -0700 (PDT) Received: from ssl.serverraum.org (web.serverraum.org [172.16.0.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.serverraum.org (Postfix) with ESMTPSA id 295CA2224B; Tue, 18 May 2021 10:39:21 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=walle.cc; s=mail2016061301; t=1621327161; 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=wN0B4yaF1WgJIn6AazhTXeaQAJgd9QwuhScgIP3JPig=; b=W7b3wCMRCC72RnHy19toWuAE0OyvC1yLqiBEuGMw1sko1O8bL+Y9dPLdMp1tOLShcNbhRh ouSdgYVJewMtatpzPXd3OBAhJdWrUa/sdhY9+zjXbCcd6s6dCXG8xXrBGYMzRzky8y2cdo ffr7ke+rRR4ESpybksIKM3BR72SUytI= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Tue, 18 May 2021 10:39:20 +0200 From: Michael Walle To: Sander Vanheule Cc: Pavel Machek , Rob Herring , Lee Jones , Mark Brown , Greg Kroah-Hartman , "Rafael J . Wysocki" , Linus Walleij , Bartosz Golaszewski , linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-gpio@vger.kernel.org, Andrew Lunn , Andy Shevchenko , linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 2/7] gpio: regmap: Add configurable dir/value order In-Reply-To: References: User-Agent: Roundcube Webmail/1.4.11 Message-ID: <675e36df5aaa1e1be3a1a77289a0a952@walle.cc> X-Sender: michael@walle.cc Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, Am 2021-05-17 21:28, schrieb Sander Vanheule: > GPIO chips may not support setting the output value when a pin is > configured as an input, although the current implementation assumes > this > is always possible. > > Add support for setting pin direction before value. The order defaults > to setting the value first, but this can be reversed by setting the > regmap_config.no_set_on_input flag, similar to the corresponding flag > in > the gpio-mmio driver. > > Signed-off-by: Sander Vanheule > --- > drivers/gpio/gpio-regmap.c | 20 +++++++++++++++++--- > include/linux/gpio/regmap.h | 3 +++ > 2 files changed, 20 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpio/gpio-regmap.c b/drivers/gpio/gpio-regmap.c > index 134cedf151a7..1cdb20f8f8b4 100644 > --- a/drivers/gpio/gpio-regmap.c > +++ b/drivers/gpio/gpio-regmap.c > @@ -170,14 +170,25 @@ static int gpio_regmap_direction_input(struct > gpio_chip *chip, > return gpio_regmap_set_direction(chip, offset, false); > } > > -static int gpio_regmap_direction_output(struct gpio_chip *chip, > - unsigned int offset, int value) > +static int gpio_regmap_dir_out_val_first(struct gpio_chip *chip, > + unsigned int offset, int value) Can we leave the name as is? TBH I find these two similar names super confusing. Maybe its just me, though. > { > gpio_regmap_set(chip, offset, value); > > return gpio_regmap_set_direction(chip, offset, true); > } > > +static int gpio_regmap_dir_out_dir_first(struct gpio_chip *chip, > + unsigned int offset, int value) > +{ > + int err; use ret for consistency here > + > + err = gpio_regmap_set_direction(chip, offset, true); > + gpio_regmap_set(chip, offset, value); > + > + return err; > +} > + Instead of adding a new one, we can also just check no_set_on_input in gpio_regmap_direction_output(), which I'd prefer. static int gpio_regmap_direction_output(struct gpio_chip *chip, unsigned int offset, int value) { struct gpio_regmap *gpio = gpiochip_get_data(chip); int ret; if (gpio->no_set_on_input) { /* some smart comment here, also mention gliches */ ret = gpio_regmap_set_direction(chip, offset, true); gpio_regmap_set(chip, offset, value); } else { gpio_regmap_set(chip, offset, value); ret = gpio_regmap_set_direction(chip, offset, true); } return ret; } > void gpio_regmap_set_drvdata(struct gpio_regmap *gpio, void *data) > { > gpio->driver_data = data; > @@ -277,7 +288,10 @@ struct gpio_regmap *gpio_regmap_register(const > struct gpio_regmap_config *config > if (gpio->reg_dir_in_base || gpio->reg_dir_out_base) { > chip->get_direction = gio_regmap_get_direction; > chip->direction_input = gpio_regmap_direction_input; > - chip->direction_output = gpio_regmap_direction_output; > + if (config->no_set_on_input) > + chip->direction_output = gpio_regmap_dir_out_dir_first; > + else > + chip->direction_output = gpio_regmap_dir_out_val_first; > } > > ret = gpiochip_add_data(chip, gpio); > diff --git a/include/linux/gpio/regmap.h b/include/linux/gpio/regmap.h > index 334dd928042b..2a732f8f23be 100644 > --- a/include/linux/gpio/regmap.h > +++ b/include/linux/gpio/regmap.h > @@ -30,6 +30,8 @@ struct regmap; > * @reg_dir_out_base: (Optional) out setting register base address > * @reg_stride: (Optional) May be set if the registers (of the > * same type, dat, set, etc) are not consecutive. > + * @no_set_on_input: Set if output value can only be set when the > direction > + * is configured as output. set_direction_first ? > * @ngpio_per_reg: Number of GPIOs per register > * @irq_domain: (Optional) IRQ domain if the controller is > * interrupt-capable > @@ -73,6 +75,7 @@ struct gpio_regmap_config { > unsigned int reg_dir_out_base; > int reg_stride; > int ngpio_per_reg; > + bool no_set_on_input; > struct irq_domain *irq_domain; > > int (*reg_mask_xlate)(struct gpio_regmap *gpio, unsigned int base, -michael