From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lj1-f172.google.com (mail-lj1-f172.google.com [209.85.208.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 904282253EB for ; Thu, 25 Jun 2026 08:00:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782374415; cv=none; b=EMW2Bn7BDJq//cLGTGYl2hcadI7MOgiKTxxhHdrZRsMBdV65Jv1iyJ30XhI7BWnNTMoH+4ptnM/4iNmTTMz9tPDoOjgopFSytg36rRHXF/m2dUcAl0DZRctvb+0sKA2iugLhd7LNf1Hw81hPdsJ4Wps8XaMO5MhPW7qHUDrHyaw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782374415; c=relaxed/simple; bh=2UgCvlR3jrvZzDyo199KiO9ao3I+WCYzr926NUr6dWk=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=AUmgd8InCcVxnhWQOHyDjN23b2wLVFfQARq3VMPiIqlfz71Mf1neXcslACQJZQSsQxmfltfGCljVMOPQo9L6LBlds6ZH7NnoSqjDN6UANFPlwTFNSnZ+Vv4F/QO84H6hZtWKB80Nh2g9Sxt13LB+sMBnI6ExAXsKCRyaH4hjDGc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Ez4vb6QU; arc=none smtp.client-ip=209.85.208.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ez4vb6QU" Received: by mail-lj1-f172.google.com with SMTP id 38308e7fff4ca-3967726bc47so17394181fa.1 for ; Thu, 25 Jun 2026 01:00:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782374411; x=1782979211; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=Y/F37YE2Dnv7LZAxqe4LK8gSeHFgw66plNdQSjeV5RI=; b=Ez4vb6QUqJemhDtEWk1jkXrABDKorbH0P/iDd7WpK1I/w/UIw9oIqSWHeQkCQjpI+7 gQUxNXjStRGEaBVcNgfpaMoBX6W35175eUpAd5yyXdGALC0u57s03/UTSCcMb4s1IGQN ztf4jdxAfaer2fHy7aL7EZHuOqm8agtM98oYZknyf/fmoq2XK1t8fij+n7v5S9nWlgsn cmLlA0IB3Pf/w6zZiIrYSsBwNp+gENzVp0f/4wvMbrGPry4RP8EJjRguWrk6e2ZQ8yAO YR2oZwWkyLvm4uv26axCL0ZzB145x28a1ylSdU7DseP49UyR6y7DsAkPXJdLRf1LAGsc xrbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782374411; x=1782979211; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Y/F37YE2Dnv7LZAxqe4LK8gSeHFgw66plNdQSjeV5RI=; b=oOL0JOto1Zm8EwtgenCI7ZjmGobh3JffyTvwqRDgG0/Is/RfaLw9qOnc3Hyzip5Hlw sahgNAeIT1Y8oxa+rxUkDFfvXnDu8XT1oLN8g9SQwMPFmE3maEFv4VHq+PFbto7Da/ZK vk2jQmrVx2T9cT/yUZSbm2onolYg1ystnbxvNO+xO+d/yPKaqarwtTXPbFENEawID1L8 HkZYT81ThRNwM+9+wQAGXqdLcgIVV4PYVPW2TVkHuGx3HoKY922Mk3tBVap+iFlUHtqR 95mtIrITSmiKchVwnUHcNI6YLEUCWhyBnZrabBcAU7rlfeeEwB2mLmNW1cE/a2BYANT+ FSdA== X-Gm-Message-State: AOJu0Yw4VDI93IrKoQm3fayB/Bu7PnXLqw/18dSlT5XfYRpluotQvEIg a01NR1V8NMbz8UGR2SfY/LMjySliilXo/430M8vM+PdKXDfEb89il46LbGlscNFm X-Gm-Gg: AfdE7ckrnPAa8ZnoI9yaOnFdTeicI/MqO8gDd0LC6pY6r01rcmFPoMUlOP2R3RoMMQ4 CLrzb5B1vlBBrF6o4wlsey/J/O+oHt62cyR+vptw4cc5peur9qL4gSSHJanbQTZpqdSUJQKdtYQ gW6Vp/uO6TzmWJm/5hPadhI5mfmZDxnOBox43l2yyWZPmDjcuvHShBzn2U6qm+XrUoTwiNVgol7 2YNRKVG53h/cmX3oWB/6tJevy/dcKiELbiH3MtUZxec6vXYteF486VF0P/74d8ZdM43fNbyh+LR SnUMQNMC5e2roeqTCJf1Nfqr5ZliDBKI+fDt6rccRLMNBGB7/uLWxEQ5Lvc5JzPu/cKUWGKXakh yC2B1Bo9NCLSU1z8lweQnijVmHlb2ijubpFyZRVtr3I88LscHUISm+dTuk+CLbFevePkVkTofkC yeel9GMJVUwz8MGOQYc9i6sQ== X-Received: by 2002:a05:6512:61d9:20b0:5ad:518a:61dd with SMTP id 2adb3069b0e04-5aea2062e28mr271778e87.46.1782374410208; Thu, 25 Jun 2026 01:00:10 -0700 (PDT) Received: from [10.38.18.54] ([213.255.186.37]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5aea2b85af9sm224823e87.19.2026.06.25.01.00.08 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 25 Jun 2026 01:00:09 -0700 (PDT) Message-ID: Date: Thu, 25 Jun 2026 11:00:08 +0300 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] mfd: rohm: Factor out power button registration To: Dmitry Torokhov , Lee Jones Cc: linux-kernel@vger.kernel.org References: Content-Language: en-US, en-AU, en-GB, en-BW From: Matti Vaittinen In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 18/06/2026 21:58, Dmitry Torokhov wrote: > Factor out the power button registration logic using software nodes > from rohm-bd718x7 and rohm-bd71828 drivers into a shared module > rohm-pwrbutton. > > This reduces duplication and makes it easier to support other ROHM > PMICs with similar power button configurations. > > Suggested-by: Lee Jones > Assisted-by: Antigravity:gemini-3.5-flash > Signed-off-by: Dmitry Torokhov Thanks a lot Dmitry. I like the idea of having generic helpers for crearting the swnodes for the power-button! > --- > MAINTAINERS | 2 + > drivers/mfd/Kconfig | 6 ++ > drivers/mfd/Makefile | 1 + > drivers/mfd/rohm-bd71828.c | 84 ++------------------------ > drivers/mfd/rohm-bd718x7.c | 84 ++------------------------ > drivers/mfd/rohm-pwrbutton.c | 112 +++++++++++++++++++++++++++++++++++ > drivers/mfd/rohm-pwrbutton.h | 12 ++++ > 7 files changed, 141 insertions(+), 160 deletions(-) > > diff --git a/MAINTAINERS b/MAINTAINERS > index f1caa6e5198b..40c46a7363fb 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -23524,6 +23524,8 @@ F: drivers/mfd/rohm-bd71828.c > F: drivers/mfd/rohm-bd718x7.c > F: drivers/mfd/rohm-bd9576.c > F: drivers/mfd/rohm-bd96801.c > +F: drivers/mfd/rohm-pwrbutton.c > +F: drivers/mfd/rohm-pwrbutton.h > F: drivers/regulator/bd71815-regulator.c > F: drivers/regulator/bd71828-regulator.c > F: drivers/regulator/bd718x7-regulator.c > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig > index 763ce6a34782..8d04e1b1f8c8 100644 > --- a/drivers/mfd/Kconfig > +++ b/drivers/mfd/Kconfig > @@ -2208,6 +2208,10 @@ config MFD_STW481X > in various ST Microelectronics and ST-Ericsson embedded > Nomadik series. > > +config MFD_ROHM_PWRBUTTON > + tristate > + select MFD_CORE I would drop the MFD dependency from the helper. It'd be nice to be able to add the SW-nodes representing power-button(s) outside MFD as well. Furthermore, I would drop the _ROHM_ from it as it should be useful for other vendors as well. I might then add another, "MFD-helper", which includes the MFD-specific bits. If there are no other users but ROHM drivers in MFD, then that could carry the ROHM in the name. Finally, I am unsure if we should select the GPIO_KEYS? How do you see it? > + > config MFD_ROHM_BD718XX > tristate "ROHM BD71837 Power Management IC" > depends on I2C=y > @@ -2215,6 +2219,7 @@ config MFD_ROHM_BD718XX > select REGMAP_I2C > select REGMAP_IRQ > select MFD_CORE > + select MFD_ROHM_PWRBUTTON > help > Select this option to get support for the ROHM BD71837 > Power Management ICs. BD71837 is designed to power processors like > @@ -2228,6 +2233,7 @@ config MFD_ROHM_BD71828 > select REGMAP_I2C > select REGMAP_IRQ > select MFD_CORE > + select MFD_ROHM_PWRBUTTON > help > Select this option to get support for the ROHM BD71815, BD71828, > BD71879, BD72720 and BD73900 Power Management ICs (PMICs). These are > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile > index dd4bb7e77c33..72d3944b0ad8 100644 > --- a/drivers/mfd/Makefile > +++ b/drivers/mfd/Makefile > @@ -273,6 +273,7 @@ obj-$(CONFIG_MFD_STM32_TIMERS) += stm32-timers.o > obj-$(CONFIG_MFD_MXS_LRADC) += mxs-lradc.o > obj-$(CONFIG_MFD_SC27XX_PMIC) += sprd-sc27xx-spi.o > obj-$(CONFIG_RAVE_SP_CORE) += rave-sp.o > +obj-$(CONFIG_MFD_ROHM_PWRBUTTON) += rohm-pwrbutton.o > obj-$(CONFIG_MFD_ROHM_BD71828) += rohm-bd71828.o > obj-$(CONFIG_MFD_ROHM_BD718XX) += rohm-bd718x7.o > obj-$(CONFIG_MFD_ROHM_BD957XMUF) += rohm-bd9576.o > diff --git a/drivers/mfd/rohm-bd71828.c b/drivers/mfd/rohm-bd71828.c > index 5fb6142cf087..dfc23cd13ef2 100644 > --- a/drivers/mfd/rohm-bd71828.c > +++ b/drivers/mfd/rohm-bd71828.c > @@ -5,8 +5,6 @@ > * ROHM BD718[15/28/79] and BD72720 PMIC driver > */ > > -#include > -#include > #include > #include > #include > @@ -19,10 +17,11 @@ > #include > #include > #include > -#include > #include > #include > > +#include "rohm-pwrbutton.h" > + > #define BD72720_TYPED_IRQ_REG(_irq, _stat_offset, _mask, _type_offset) \ > [_irq] = { \ > .reg_offset = (_stat_offset), \ > @@ -859,83 +858,7 @@ static int set_clk_mode(struct device *dev, struct regmap *regmap, > OUT32K_MODE_CMOS); > } > > -static const struct property_entry bd71828_powerkey_parent_props[] = { > - PROPERTY_ENTRY_STRING("label", "bd71828-pwrkey"), > - { } > -}; > - > -static const struct property_entry bd71828_powerkey_props[] = { > - PROPERTY_ENTRY_U32("linux,code", KEY_POWER), > - PROPERTY_ENTRY_BOOL("wakeup-source"), > - { } > -}; > - > -#define GPIO_KEYS 0 /* Node corresponding to gpio-keys device itself */ > -#define PWRON_KEY 1 /* Node describing power button in gpio-keys */ > - > -static int bd71828_i2c_register_swnodes(const struct software_node *nodes) > -{ > - const struct software_node * const node_group[] = { > - &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL > - }; > - > - return software_node_register_node_group(node_group); > -} > - > -static void bd71828_i2c_unregister_swnodes(void *data) > -{ > - const struct software_node *nodes = data; > - const struct software_node * const node_group[] = { > - &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL > - }; > - > - software_node_unregister_node_group(node_group); > -} > - > -static int bd71828_i2c_register_pwrbutton(struct device *dev, int button_irq, > - struct irq_domain *irq_domain) > -{ > - const struct resource res[] = { > - DEFINE_RES_IRQ_NAMED(button_irq, "bd71828-pwrkey"), > - }; > - struct mfd_cell gpio_keys_cell = { > - .name = "gpio-keys", > - .resources = res, > - .num_resources = ARRAY_SIZE(res), > - }; > - struct software_node *nodes; > - int ret; > > - nodes = devm_kcalloc(dev, 2, sizeof(*nodes), GFP_KERNEL); > - if (!nodes) > - return -ENOMEM; > - > - nodes[GPIO_KEYS].name = devm_kasprintf(dev, GFP_KERNEL, "%s-power-key", dev_name(dev)); > - if (!nodes[GPIO_KEYS].name) > - return -ENOMEM; > - > - nodes[GPIO_KEYS].properties = bd71828_powerkey_parent_props; > - > - nodes[PWRON_KEY].parent = &nodes[GPIO_KEYS]; > - nodes[PWRON_KEY].properties = bd71828_powerkey_props; > - > - ret = bd71828_i2c_register_swnodes(nodes); > - if (ret) > - return ret; > - > - ret = devm_add_action_or_reset(dev, bd71828_i2c_unregister_swnodes, nodes); > - if (ret) > - return ret; > - > - gpio_keys_cell.swnode = &nodes[GPIO_KEYS]; > - > - ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, &gpio_keys_cell, 1, > - NULL, 0, irq_domain); > - if (ret) > - return dev_err_probe(dev, ret, "Failed to register power-button"); > - > - return 0; > -} > > static struct i2c_client *bd71828_dev; > static void bd71828_power_off(void) > @@ -1096,7 +1019,8 @@ static int bd71828_i2c_probe(struct i2c_client *i2c) > return dev_err_probe(&i2c->dev, ret, "Failed to create subdevices\n"); > > if (button_irq) { > - ret = bd71828_i2c_register_pwrbutton(&i2c->dev, button_irq, irq_domain); > + ret = rohm_mfd_register_pwrbutton(&i2c->dev, button_irq, > + "bd71828-pwrkey", true, irq_domain); > if (ret) > return ret; > } > diff --git a/drivers/mfd/rohm-bd718x7.c b/drivers/mfd/rohm-bd718x7.c > index be2acc429fe3..bab3b1c2445b 100644 > --- a/drivers/mfd/rohm-bd718x7.c > +++ b/drivers/mfd/rohm-bd718x7.c > @@ -7,8 +7,6 @@ > // Datasheet for BD71837MWV available from > // https://www.rohm.com/datasheet/BD71837MWV/bd71837mwv-e > > -#include > -#include > #include > #include > #include > @@ -16,10 +14,11 @@ > #include > #include > #include > -#include > #include > #include > > +#include "rohm-pwrbutton.h" > + > static struct mfd_cell bd71837_mfd_cells[] = { > { .name = "bd71837-clk", }, > { .name = "bd71837-pmic", }, > @@ -105,83 +104,7 @@ static int bd718xx_init_press_duration(struct regmap *regmap, > return 0; > } > > -static const struct property_entry bd718xx_powerkey_parent_props[] = { > - PROPERTY_ENTRY_STRING("label", "bd718xx-pwrkey"), > - { } > -}; > - > -static const struct property_entry bd718xx_powerkey_props[] = { > - PROPERTY_ENTRY_U32("linux,code", KEY_POWER), > - { } > -}; > - > -static const struct resource bd718xx_powerkey_resources[] = { > - DEFINE_RES_IRQ_NAMED(BD718XX_INT_PWRBTN_S, "bd718xx-pwrkey"), > -}; > - > -#define GPIO_KEYS 0 /* Node corresponding to gpio-keys device itself */ > -#define PWRON_KEY 1 /* Node describing power button in gpio-keys */ > - > -static int bd718xx_i2c_register_swnodes(const struct software_node *nodes) > -{ > - const struct software_node * const node_group[] = { > - &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL > - }; > - > - return software_node_register_node_group(node_group); > -} > - > -static void bd718xx_i2c_unregister_swnodes(void *data) > -{ > - const struct software_node *nodes = data; > - const struct software_node * const node_group[] = { > - &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL > - }; > - > - software_node_unregister_node_group(node_group); > -} > > -static int bd718xx_i2c_register_pwrbutton(struct device *dev, > - struct irq_domain *irq_domain) > -{ > - struct mfd_cell gpio_keys_cell = { > - .name = "gpio-keys", > - .resources = bd718xx_powerkey_resources, > - .num_resources = ARRAY_SIZE(bd718xx_powerkey_resources), > - }; > - struct software_node *nodes; > - int ret; > - > - nodes = devm_kcalloc(dev, 2, sizeof(*nodes), GFP_KERNEL); > - if (!nodes) > - return -ENOMEM; > - > - nodes[GPIO_KEYS].name = devm_kasprintf(dev, GFP_KERNEL, "%s-power-key", dev_name(dev)); > - if (!nodes[GPIO_KEYS].name) > - return -ENOMEM; > - > - nodes[GPIO_KEYS].properties = bd718xx_powerkey_parent_props; > - > - nodes[PWRON_KEY].parent = &nodes[GPIO_KEYS]; > - nodes[PWRON_KEY].properties = bd718xx_powerkey_props; > - > - ret = bd718xx_i2c_register_swnodes(nodes); > - if (ret) > - return ret; > - > - ret = devm_add_action_or_reset(dev, bd718xx_i2c_unregister_swnodes, nodes); > - if (ret) > - return ret; > - > - gpio_keys_cell.swnode = &nodes[GPIO_KEYS]; > - > - ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, &gpio_keys_cell, 1, > - NULL, 0, irq_domain); > - if (ret) > - return dev_err_probe(dev, ret, "Failed to register power-button"); > - > - return 0; > -} > > static int bd718xx_i2c_probe(struct i2c_client *i2c) > { > @@ -235,7 +158,8 @@ static int bd718xx_i2c_probe(struct i2c_client *i2c) > if (ret) > return dev_err_probe(&i2c->dev, ret, "Failed to create subdevices\n"); > > - ret = bd718xx_i2c_register_pwrbutton(&i2c->dev, irq_domain); > + ret = rohm_mfd_register_pwrbutton(&i2c->dev, BD718XX_INT_PWRBTN_S, > + "bd718xx-pwrkey", false, irq_domain); > if (ret) > return ret; > > diff --git a/drivers/mfd/rohm-pwrbutton.c b/drivers/mfd/rohm-pwrbutton.c > new file mode 100644 > index 000000000000..e0cb74fdd73c > --- /dev/null > +++ b/drivers/mfd/rohm-pwrbutton.c > @@ -0,0 +1,112 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Shared helper for ROHM PMIC power button registration > + * > + * Copyright 2018, 2019 ROHM Semiconductors > + * Copyright 2026 Google LLC > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "rohm-pwrbutton.h" > + > +#define GPIO_KEYS 0 /* Node corresponding to gpio-keys device itself */ > +#define PWRON_KEY 1 /* Node describing power button in gpio-keys */ > + > +static int rohm_mfd_pwrbutton_register_swnodes(const struct software_node *nodes) > +{ > + const struct software_node * const node_group[] = { > + &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL > + }; > + > + return software_node_register_node_group(node_group); > +} > + > +static void rohm_mfd_pwrbutton_unregister_swnodes(void *data) > +{ > + const struct software_node *nodes = data; > + const struct software_node * const node_group[] = { > + &nodes[GPIO_KEYS], &nodes[PWRON_KEY], NULL > + }; > + > + software_node_unregister_node_group(node_group); > +} > + > +int rohm_mfd_register_pwrbutton(struct device *dev, int irq, const char *name, > + bool wakeup, struct irq_domain *irq_domain) > +{ > + const struct resource res[] = { > + DEFINE_RES_IRQ_NAMED(irq, name), > + }; > + struct mfd_cell gpio_keys_cell = { > + .name = "gpio-keys", > + .resources = res, > + .num_resources = ARRAY_SIZE(res), > + }; > + struct property_entry *parent_props; > + struct property_entry *child_props; > + struct software_node *nodes; > + int n_props; > + int ret; > + > + if (irq <= 0) > + return -EINVAL; > + > + nodes = devm_kcalloc(dev, 2, sizeof(*nodes), GFP_KERNEL); > + if (!nodes) > + return -ENOMEM; > + > + nodes[GPIO_KEYS].name = devm_kasprintf(dev, GFP_KERNEL, "%s-power-key", dev_name(dev)); > + if (!nodes[GPIO_KEYS].name) > + return -ENOMEM; > + > + parent_props = devm_kcalloc(dev, 2, sizeof(*parent_props), GFP_KERNEL); > + if (!parent_props) > + return -ENOMEM; > + > + parent_props[0] = PROPERTY_ENTRY_STRING("label", name); > + nodes[GPIO_KEYS].properties = parent_props; > + > + n_props = 2; /* linux,code and terminator */ > + if (wakeup) > + n_props++; > + > + child_props = devm_kcalloc(dev, n_props, sizeof(*child_props), GFP_KERNEL); > + if (!child_props) > + return -ENOMEM; > + > + child_props[0] = PROPERTY_ENTRY_U32("linux,code", KEY_POWER); > + if (wakeup) > + child_props[1] = PROPERTY_ENTRY_BOOL("wakeup-source"); > + > + nodes[PWRON_KEY].parent = &nodes[GPIO_KEYS]; > + nodes[PWRON_KEY].properties = child_props; > + > + ret = rohm_mfd_pwrbutton_register_swnodes(nodes); > + if (ret) > + return ret; > + > + ret = devm_add_action_or_reset(dev, rohm_mfd_pwrbutton_unregister_swnodes, nodes); > + if (ret) > + return ret; > + > + gpio_keys_cell.swnode = &nodes[GPIO_KEYS]; > + > + ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, &gpio_keys_cell, 1, > + NULL, 0, irq_domain); > + if (ret) > + return dev_err_probe(dev, ret, "Failed to register power-button"); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(rohm_mfd_register_pwrbutton); As explained, I would split this to something like: pwrbutton_create_swnodes() // Shouldn't depend on MFD. Allocates and registers the swnodes for power-button + registers the devm-release. (rohm)_register_pwrbutton() // Should call pwrbutton_create_swnodes() to allocate and populate the swnodes, and then fill-in the MFC-cell data + call the devm_mfd_add_devices(). > + > +MODULE_LICENSE("GPL"); > +MODULE_AUTHOR("Dmitry Torokhov "); > +MODULE_DESCRIPTION("Shared helper for ROHM PMIC power button registration"); > diff --git a/drivers/mfd/rohm-pwrbutton.h b/drivers/mfd/rohm-pwrbutton.h > new file mode 100644 > index 000000000000..985bd37a4ad0 > --- /dev/null > +++ b/drivers/mfd/rohm-pwrbutton.h > @@ -0,0 +1,12 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > + > +#ifndef __LINUX_MFD_ROHM_PWRBUTTON_H__ > +#define __LINUX_MFD_ROHM_PWRBUTTON_H__ > + > +struct device; > +struct irq_domain; > + > +int rohm_mfd_register_pwrbutton(struct device *dev, int irq, const char *name, > + bool wakeup, struct irq_domain *irq_domain); > + > +#endif /* __LINUX_MFD_ROHM_PWRBUTTON_H__ */ Yours, -- Matti -- Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~