Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp223822imm; Thu, 21 Jun 2018 17:10:03 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLEvVKneOCM7nCX+2GjzOnvLVDrCL3AJ0hGdWwVnYW/2hXn7PgY9KXvYI6l38mya2dulqd/ X-Received: by 2002:a63:7d51:: with SMTP id m17-v6mr24294369pgn.245.1529626203752; Thu, 21 Jun 2018 17:10:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529626203; cv=none; d=google.com; s=arc-20160816; b=BTWnvUErOm85VOd5UCZSuun8kmtTIZsKs+LfO8kNIPUlb5uto/C7b3p23iCf3u5/C/ u6Zb1cbD65ZpqKrJa0B2E4ozYU7LseIpPDQoQuV5fDQceWOFHjtxdr/4k4M9sUEgxDeI O6t6jRdtvviMiAVBHpt4AhSq9eF/0cQKKW5AKgZGh/+vQo6DD4iQvdQ4U4rXNKEhnLvG Ct4A0TJd3+iigZkubtGTcTdmhePGgykmOlJtBGQqKU2XRVAF/usKU6Lu5J/56x+bkL3I ZxunOpGc2vT0z8ZMkTrSL3IcEIfobpgTBGPAMNTJM+KHpZf8KAD0/Z1zn1DVEBIxl+If GYOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=Z58/r99Cvh4g/xjr7U7Kmx/luLfPGqBIHIzMlqd/j5A=; b=TzK6gfRl51c6HLjZNkenxQxDotu2Y6Zqvl3qkyK7/tslmRBdQAWWSOovHdgpznhsFg g/AlhU35YB17gIYSSAydRHE1sQlgKy72xQZZZCxov61bmnToAWdD8ZzRKRyL76RhX8XK Ui6eoYsB22OAoXJiCv82OJBBWlAOTV+vlJziJ4NoV6ZqZmtqPokqv5wY5R6Z3gDPgzvG 0/008WB3F+/4c2VJATOBOW/7YbgUZBh4Bt7s9+gjoHANTO+imTV+q7RFtmqi7Vn3wOxl uV8zdVW7OovSF5lVRPlPEIbjafR1PZMi5AqlEiBOfHPg7wC06CTwKDXYPioccJvRVK6M tAbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="PiIz/vQ0"; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i16-v6si5997295pfi.234.2018.06.21.17.09.48; Thu, 21 Jun 2018 17:10:03 -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=@gmail.com header.s=20161025 header.b="PiIz/vQ0"; 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=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933899AbeFVAJI (ORCPT + 99 others); Thu, 21 Jun 2018 20:09:08 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:42784 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932718AbeFVAJG (ORCPT ); Thu, 21 Jun 2018 20:09:06 -0400 Received: by mail-pf0-f194.google.com with SMTP id w7-v6so2302428pfn.9; Thu, 21 Jun 2018 17:09:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=Z58/r99Cvh4g/xjr7U7Kmx/luLfPGqBIHIzMlqd/j5A=; b=PiIz/vQ0YC8ljMp7TXvl267VAfl9tuXEjUXDsjSV60vJWzsX0B2X0d4+lTofY56cCc VDXJqc5XeL9YdZG3Jj67lELAJle4a1tOB/0r1pDdLodJC93vnrn6GzCbO6Ttbbv7+z0e R4KT8WDLOjB287zcdH5RwKjSwHXjx8f1YwN8IRZcvIIXjzzjtd3HrLd1RKcCh9+OZ8Ap w38OFG4faRi2jm0DAKYJ5283kuA8AqEwqRr0waAcyEQYMYZoQQSiUb5TFIjQkAz2CJS/ bRG7X1DWY/RfsgF42+ccRtEfbeUwKghG0nQymLhpAN3SVjcaobwkmBaaNdDeAkOQ+GZr lIxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=Z58/r99Cvh4g/xjr7U7Kmx/luLfPGqBIHIzMlqd/j5A=; b=IimgWViTSWStcqsm99UwCcAobPzYfzZf3xZeVKSAoKufpFBAGpQSJxxCUnYacpyLrg Rj+f1Ik98GjQXX6l+CSBgw2R1Hw+Kwl5bARZphWMOqBr8DO7X34SpdZ6knKfk4BrFv7y RnM70V95OPoGcUDIu6xX/Tanxe0aowwC8NiM71ncX6FiBZ6fJFwGI/sD9w15Ph1E73I+ bCZeUM7WZxYd0zIFdP9/wod4Xk7dgjWaaZSH3c5CsZY95L1+cAK6QjJOhQWd/h3BiSw3 4o+kcLU6uANOyHLinoo8kRg/j+LyKmewPAzPt76cGpvH7iUW6iVfqNvxRxACTCYLThvL 8YCg== X-Gm-Message-State: APt69E32i36MzQjcGQ5Y1F4PZ3aDdI0JVSi80dFYcY103OTz+fPa59Jw R2E0XgUBn0lItQ5tDXxEG7g= X-Received: by 2002:a62:660a:: with SMTP id a10-v6mr29497157pfc.156.1529626145581; Thu, 21 Jun 2018 17:09:05 -0700 (PDT) Received: from dtor-ws ([2620:0:1000:1511:8de6:27a8:ed13:2ef5]) by smtp.gmail.com with ESMTPSA id w7-v6sm7342767pgs.68.2018.06.21.17.09.03 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 21 Jun 2018 17:09:04 -0700 (PDT) Date: Thu, 21 Jun 2018 17:09:02 -0700 From: Dmitry Torokhov To: Janusz Krzysztofik Cc: Tony Lindgren , Aaro Koskinen , "David S . Miller " , Mauro Carvalho Chehab , Greg Kroah-Hartman , Andrew Morton , Randy Dunlap , Linus Walleij , Mark Brown , Liam Girdwood , linux-arm-kernel@lists.infradead.org, linux-omap@vger.kernel.org, linux-input@vger.kernel.org, linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 04/10] Input: ams_delta_serio: Replace power GPIO with regulator Message-ID: <20180622000902.GC79890@dtor-ws> References: <20180609140224.32606-1-jmkrzyszt@gmail.com> <20180621224128.17623-1-jmkrzyszt@gmail.com> <20180621224128.17623-4-jmkrzyszt@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180621224128.17623-4-jmkrzyszt@gmail.com> User-Agent: Mutt/1.9.2 (2017-12-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jun 22, 2018 at 12:41:22AM +0200, Janusz Krzysztofik wrote: > Modify the driver so it no longer requests and manipulates the > "keybrd_pwr" GPIO pin but a "vcc" regulator supply instead. > > For this to work with Amstrad Delta, define a regulator over the > "keybrd_pwr" GPIO pin with the "vcc" supply for ams-delta-serio device > and register it from the board file. Both assign an absulute GPIO > number to the soon depreciated .gpio member of the regulator config > structure, and also build and register a GPIO lookup table so it is > ready for use by the regulator driver as soon as its upcoming update > is applied. > > Signed-off-by: Janusz Krzysztofik Input bits look good. Acked-by: Dmitry Torokhov > --- > Changelog: > v2: - extended comment above error code conversion, thanks Dmitry for > requesting that, > - rebased on v4.18-rc1, no conflicts. > > arch/arm/mach-omap1/board-ams-delta.c | 63 +++++++++++++++++++++++++++++++++-- > drivers/input/serio/ams_delta_serio.c | 37 +++++++++++++++----- > 2 files changed, 89 insertions(+), 11 deletions(-) > > diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c > index 2119d2d3ba84..706eb2f9301d 100644 > --- a/arch/arm/mach-omap1/board-ams-delta.c > +++ b/arch/arm/mach-omap1/board-ams-delta.c > @@ -509,6 +509,46 @@ static struct platform_device ams_delta_serio_device = { > .id = PLATFORM_DEVID_NONE, > }; > > +static struct regulator_consumer_supply keybrd_pwr_consumers[] = { > + /* > + * Initialize supply .dev_name with NULL. It will be replaced > + * with serio dev_name() as soon as the serio device is registered. > + */ > + REGULATOR_SUPPLY("vcc", NULL), > +}; > + > +static struct regulator_init_data keybrd_pwr_initdata = { > + .constraints = { > + .valid_ops_mask = REGULATOR_CHANGE_STATUS, > + }, > + .num_consumer_supplies = ARRAY_SIZE(keybrd_pwr_consumers), > + .consumer_supplies = keybrd_pwr_consumers, > +}; > + > +static struct fixed_voltage_config keybrd_pwr_config = { > + .supply_name = "keybrd_pwr", > + .microvolts = 5000000, > + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_PWR, > + .enable_high = 1, > + .init_data = &keybrd_pwr_initdata, > +}; > + > +static struct platform_device keybrd_pwr_device = { > + .name = "reg-fixed-voltage", > + .id = PLATFORM_DEVID_AUTO, > + .dev = { > + .platform_data = &keybrd_pwr_config, > + }, > +}; > + > +static struct gpiod_lookup_table keybrd_pwr_gpio_table = { > + .table = { > + GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_KEYBRD_PWR, NULL, > + GPIO_ACTIVE_HIGH), > + { }, > + }, > +}; > + > static struct platform_device *ams_delta_devices[] __initdata = { > &latch1_gpio_device, > &latch2_gpio_device, > @@ -526,6 +566,7 @@ static struct platform_device *late_devices[] __initdata = { > > static struct gpiod_lookup_table *ams_delta_gpio_tables[] __initdata = { > &ams_delta_audio_gpio_table, > + &keybrd_pwr_gpio_table, > }; > > static struct gpiod_lookup_table *late_gpio_tables[] __initdata = { > @@ -566,12 +607,30 @@ static void __init ams_delta_init(void) > platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices)); > > /* > - * As soon as devices have been registered, assign their dev_names > - * to respective GPIO lookup tables before they are added. > + * As soon as regulator consumers have been registered, assign their > + * dev_names to consumer supply entries of respective regulators. > + */ > + keybrd_pwr_consumers[0].dev_name = > + dev_name(&ams_delta_serio_device.dev); > + > + /* > + * Once consumer supply entries are populated with dev_names, > + * register regulator devices. At this stage only the keyboard > + * power regulator has its consumer supply table fully populated. > + */ > + platform_device_register(&keybrd_pwr_device); > + > + /* > + * As soon as GPIO consumers have been registered, assign > + * their dev_names to respective GPIO lookup tables. > */ > ams_delta_audio_gpio_table.dev_id = > dev_name(&ams_delta_audio_device.dev); > + keybrd_pwr_gpio_table.dev_id = dev_name(&keybrd_pwr_device.dev); > > + /* > + * Once GPIO lookup tables are populated with dev_names, register them. > + */ > gpiod_add_lookup_tables(ams_delta_gpio_tables, > ARRAY_SIZE(ams_delta_gpio_tables)); > > diff --git a/drivers/input/serio/ams_delta_serio.c b/drivers/input/serio/ams_delta_serio.c > index 551a4fa73fe4..854d0d3ada52 100644 > --- a/drivers/input/serio/ams_delta_serio.c > +++ b/drivers/input/serio/ams_delta_serio.c > @@ -23,6 +23,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -39,6 +40,7 @@ MODULE_LICENSE("GPL"); > > struct ams_delta_serio { > struct serio *serio; > + struct regulator *vcc; > }; > > static int check_data(struct serio *serio, int data) > @@ -94,16 +96,18 @@ static irqreturn_t ams_delta_serio_interrupt(int irq, void *dev_id) > > static int ams_delta_serio_open(struct serio *serio) > { > - /* enable keyboard */ > - gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 1); > + struct ams_delta_serio *priv = serio->port_data; > > - return 0; > + /* enable keyboard */ > + return regulator_enable(priv->vcc); > } > > static void ams_delta_serio_close(struct serio *serio) > { > + struct ams_delta_serio *priv = serio->port_data; > + > /* disable keyboard */ > - gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 0); > + regulator_disable(priv->vcc); > } > > static const struct gpio ams_delta_gpios[] __initconst_or_module = { > @@ -117,11 +121,6 @@ static const struct gpio ams_delta_gpios[] __initconst_or_module = { > .flags = GPIOF_DIR_IN, > .label = "serio-clock", > }, > - { > - .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_PWR, > - .flags = GPIOF_OUT_INIT_LOW, > - .label = "serio-power", > - }, > { > .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT, > .flags = GPIOF_OUT_INIT_LOW, > @@ -146,6 +145,26 @@ static int ams_delta_serio_init(struct platform_device *pdev) > goto serio; > } > > + priv->vcc = devm_regulator_get(&pdev->dev, "vcc"); > + if (IS_ERR(priv->vcc)) { > + err = PTR_ERR(priv->vcc); > + dev_err(&pdev->dev, "regulator request failed (%d)\n", err); > + /* > + * When running on a non-dt platform and requested regulator > + * is not available, devm_regulator_get() never returns > + * -EPROBE_DEFER as it is not able to justify if the regulator > + * may still appear later. On the other hand, the board can > + * still set full constriants flag at late_initcall in order > + * to instruct devm_regulator_get() to returnn a dummy one > + * if sufficient. Hence, if we get -ENODEV here, let's convert > + * it to -EPROBE_DEFER and wait for the board to decide or > + * let Deferred Probe infrastructure handle this error. > + */ > + if (err == -ENODEV) > + err = -EPROBE_DEFER; > + goto gpio; > + } > + > err = request_irq(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), > ams_delta_serio_interrupt, IRQ_TYPE_EDGE_RISING, > DRIVER_NAME, priv); > -- > 2.16.4 > -- Dmitry