[{"id":3682913,"web_url":"http://patchwork.ozlabs.org/comment/3682913/","msgid":"<CAJZ5v0gR=wvgFomQzjS6rzoJYxwT2sxB60EM52PA4j-iwcXocw@mail.gmail.com>","list_archive_url":null,"date":"2026-04-27T19:32:28","subject":"Re: [PATCH v3 2/2] platform/x86: x86-android-tablets: enable fwnode\n matching of GPIO chips","submitter":{"id":64267,"url":"http://patchwork.ozlabs.org/api/people/64267/","name":"Rafael J. Wysocki","email":"rafael@kernel.org"},"content":"On Mon, Apr 27, 2026 at 2:19 PM Bartosz Golaszewski\n<bartosz.golaszewski@oss.qualcomm.com> wrote:\n>\n> In order to allow GPIOLIB to match cherryview and baytrail GPIO\n> controllers by their firmware nodes instead of their names, we need to\n> attach the - currently \"dangling\" - existing software nodes to their\n> target devices dynamically.\n>\n> We deal with devices described in ACPI so set up a bus notifier waiting\n> for the ADD events. We know the name of the device we're waiting for so\n> match against it and - on match - assign the appropriate software node\n> as the secondary firmware node of the underlying ACPI node. In case the\n> event was emitted earlier than this driver's probe: also make sure the\n> device was not added before.\n>\n> Scheduling fine-grained devres actions allows for proper teardown and\n> unsetting of the secondary firmware nodes.\n>\n> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>\n> ---\n>  drivers/platform/x86/x86-android-tablets/core.c | 127 +++++++++++++++++++++++-\n>  1 file changed, 124 insertions(+), 3 deletions(-)\n>\n> diff --git a/drivers/platform/x86/x86-android-tablets/core.c b/drivers/platform/x86/x86-android-tablets/core.c\n> index 021009e9085bec3db9c4daa1f6235600210a6099..9e6e8f272dfe16cda421b569802045c3d94fc0ab 100644\n> --- a/drivers/platform/x86/x86-android-tablets/core.c\n> +++ b/drivers/platform/x86/x86-android-tablets/core.c\n> @@ -13,10 +13,12 @@\n>  #include <linux/acpi.h>\n>  #include <linux/device.h>\n>  #include <linux/dmi.h>\n> +#include <linux/fwnode.h>\n>  #include <linux/gpio/consumer.h>\n>  #include <linux/gpio/machine.h>\n>  #include <linux/irq.h>\n>  #include <linux/module.h>\n> +#include <linux/notifier.h>\n>  #include <linux/pci.h>\n>  #include <linux/platform_device.h>\n>  #include <linux/serdev.h>\n> @@ -360,6 +362,124 @@ static const struct software_node *cherryview_gpiochip_node_group[] = {\n>         NULL\n>  };\n>\n> +struct auto_secondary_data {\n> +       struct notifier_block nb;\n> +       struct device *parent;\n> +};\n> +\n> +static void auto_secondary_unset(void *data)\n> +{\n> +       struct fwnode_handle *fwnode = data;\n> +\n> +       fwnode->secondary = NULL;\n> +}\n> +\n> +static int acpi_set_secondary_fwnode(struct device *parent, struct device *dev,\n> +                                    const struct software_node *const swnode)\n> +{\n> +       struct acpi_device *device = to_acpi_device(dev);\n> +       struct fwnode_handle *fwnode;\n> +       int ret;\n> +\n> +       fwnode = software_node_fwnode(swnode);\n> +       if (WARN_ON(!fwnode))\n> +               return -ENOENT;\n> +\n> +       fwnode->secondary = ERR_PTR(-ENODEV);\n> +       device->fwnode.secondary = fwnode;\n> +\n> +       ret = devm_add_action_or_reset(parent, auto_secondary_unset, &device->fwnode);\n> +       if (ret)\n> +               dev_err(parent, \"Failed to schedule the unset action for secondary fwnode\\n\");\n> +\n> +       return ret;\n> +}\n> +\n> +static int acpi_auto_secondary_notifier(struct notifier_block *nb,\n> +                                       unsigned long action, void *data)\n> +{\n> +       struct auto_secondary_data *auto_sec = container_of(nb, struct auto_secondary_data, nb);\n> +       const struct software_node *const *swnode;\n> +       struct device *dev = data;\n> +       int ret;\n> +\n> +       switch (action) {\n> +       case BUS_NOTIFY_ADD_DEVICE:\n> +               for (swnode = gpiochip_node_group; *swnode; swnode++) {\n> +                       if (strcmp((*swnode)->name, dev_name(dev)) == 0) {\n> +                               ret = acpi_set_secondary_fwnode(auto_sec->parent, dev, *swnode);\n> +                               return ret ? NOTIFY_BAD : NOTIFY_OK;\n> +                       }\n> +               }\n> +               break;\n> +       default:\n> +               break;\n> +       }\n> +\n> +       return NOTIFY_DONE;\n> +}\n> +\n> +static void auto_secondary_unregister_node_group(void *data)\n> +{\n> +       const struct software_node **nodes = data;\n> +\n> +       software_node_unregister_node_group(nodes);\n> +}\n> +\n> +static void auto_secondary_unregister_notifier(void *data)\n> +{\n> +       struct notifier_block *nb = data;\n> +\n> +       bus_unregister_notifier(&acpi_bus_type, nb);\n\nPlease introduce acpi_bus_unregister_notifier() and use it here instead.\n\n> +}\n> +\n> +static int auto_secondary_fwnode_init(struct device *parent)\n> +{\n> +       const struct software_node *const *swnode;\n> +       struct auto_secondary_data *data;\n> +       int ret;\n> +\n> +       ret = software_node_register_node_group(gpiochip_node_group);\n> +       if (ret)\n> +               return ret;\n> +\n> +       ret = devm_add_action_or_reset(parent,\n> +                                      auto_secondary_unregister_node_group,\n> +                                      gpiochip_node_group);\n> +       if (ret)\n> +               return ret;\n> +\n> +       data = devm_kzalloc(parent, sizeof(*data), GFP_KERNEL);\n> +       if (!data)\n> +               return -ENOMEM;\n> +\n> +       data->nb.notifier_call = acpi_auto_secondary_notifier;\n> +       data->parent = parent;\n> +\n> +       ret = bus_register_notifier(&acpi_bus_type, &data->nb);\n\nPlease introduce acpi_bus_register_notifier() and use it here instead.\n\n> +       if (ret)\n> +               return ret;\n> +\n> +       ret = devm_add_action_or_reset(parent,\n> +                                      auto_secondary_unregister_notifier,\n> +                                      &data->nb);\n> +       if (ret)\n> +               return ret;\n> +\n> +       /* Device may have been already added. */\n> +       for (swnode = gpiochip_node_group; *swnode; swnode++) {\n> +               struct device *dev __free(put_device) =\n> +                       bus_find_device_by_name(&acpi_bus_type, NULL, (*swnode)->name);\n\nPlease introduce acpi_bus_find_device_by_name() and use it here instead.\n\n> +               if (dev) {\n> +                       ret = acpi_set_secondary_fwnode(parent, dev, *swnode);\n> +                       if (ret)\n> +                               return ret;\n> +               }\n> +       }\n> +\n> +       return 0;\n> +}\n> +\n>  static void x86_android_tablet_remove(struct platform_device *pdev)\n>  {\n>         int i;\n> @@ -391,7 +511,6 @@ static void x86_android_tablet_remove(struct platform_device *pdev)\n>\n>         software_node_unregister_node_group(gpio_button_swnodes);\n>         software_node_unregister_node_group(swnode_group);\n> -       software_node_unregister_node_group(gpiochip_node_group);\n>  }\n>\n>  static __init int x86_android_tablet_probe(struct platform_device *pdev)\n> @@ -427,9 +546,11 @@ static __init int x86_android_tablet_probe(struct platform_device *pdev)\n>                 break;\n>         }\n>\n> -       ret = software_node_register_node_group(gpiochip_node_group);\n> -       if (ret)\n> +       ret = auto_secondary_fwnode_init(&pdev->dev);\n> +       if (ret) {\n> +               x86_android_tablet_remove(pdev);\n>                 return ret;\n> +       }\n>\n>         ret = software_node_register_node_group(dev_info->swnode_group);\n>         if (ret) {\n>\n> --\n> 2.47.3\n>\n>","headers":{"Return-Path":"\n <linux-gpio+bounces-35612-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-gpio@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=OOE7miFq;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-gpio+bounces-35612-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"OOE7miFq\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g4DJd1Gbgz1xvV\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 05:33:53 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 2DD5C307411A\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 27 Apr 2026 19:32:44 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 4F84F41C311;\n\tMon, 27 Apr 2026 19:32:43 +0000 (UTC)","from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 10A3D3FBED2\n\tfor <linux-gpio@vger.kernel.org>; Mon, 27 Apr 2026 19:32:43 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id E2405C4AF0C\n\tfor <linux-gpio@vger.kernel.org>; Mon, 27 Apr 2026 19:32:42 +0000 (UTC)","by mail-lj1-f176.google.com with SMTP id\n 38308e7fff4ca-38e8292423fso94122051fa.0\n        for <linux-gpio@vger.kernel.org>;\n Mon, 27 Apr 2026 12:32:42 -0700 (PDT)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1777318363; cv=none;\n b=IdJrvupxpL1ZyLkmr3INjIoZdYVoKghSiGvl+tRd/vMVRwZ55s565cFCb8VfonwPPL22y5PyZAVPHWz6B0l40F6bhy4EIvdiSaq/S3z+68IhyD9YiNA6Qvet4iqjWae89czs7t20WmOWvXpXKi9LsaVAnDTUUU5Yt7y4JzlaQP4=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1777318363; c=relaxed/simple;\n\tbh=GcVXS9DHM5KxSH9pj/UKoe1HEQEMUMwCF6ORNHkDtWY=;\n\th=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject:\n\t To:Cc:Content-Type;\n b=eTLQh1/qc8oG73jL77C5b2ntrMGRH7lFjFuZ+gs8rx/L+WDuwpAf+cUpCVwYXhHc+j3oVFhim+OA9DZTaULmBM2Itn50iWg2BKbMdGz3ZriguC33D3wHvPX2fCceakkm1gHj2+i1dCLhK7AEYIzo9wf7sZAvcDNyFPzXdEdKti4=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=OOE7miFq; arc=none smtp.client-ip=10.30.226.201","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1777318362;\n\tbh=GcVXS9DHM5KxSH9pj/UKoe1HEQEMUMwCF6ORNHkDtWY=;\n\th=References:In-Reply-To:From:Date:Subject:To:Cc:From;\n\tb=OOE7miFq3mxasU1R85/vcilbMy/53K8jtyZ7HUsOiO4Oqvsbxd8FSMidIoQm43/jn\n\t 734CPhh9uggVwsTcRz9E2+HFDa8e/X3nIe3XYlthRdXp0EHuT55uIE+VaXHD4p/Nam\n\t TkRPmmp/wN42yYCIfWJVQ4PsLY0m8ZSZhW57NnlUtymqhDWTZeroAM9uM4A1pqwUaG\n\t lFIG1Jgr14IGn7lXYqjq3jsdfHzcbG5W6PBRV17v77HE/L/OCmw+kwULfGtIlSJ34b\n\t 8JqYb6JfQnjY9+CM8rqysaX2lcD3j09PrM3Y6G49rCAQ/rTMcdjKDjNYgdWJw7knI9\n\t Vq2u2uIAgIPDw==","X-Forwarded-Encrypted":"i=1;\n AFNElJ+CoKdrFHvdeDriSGMknmLhE8k84nxWwMDy5MMawqdziaNSSa+pSBo4etK56WPrBdwaZWoWBiuq1z8I@vger.kernel.org","X-Gm-Message-State":"AOJu0YxthI4FvvOj79K/xuKlnAiDvDo0vwwObeDve2FS+YeGUG1x/Thx\n\t9BC5Oy5RrHrJUZuSKibnvNN1op9ze8lKmPUD7d4kUlhhpkvOv65kJZziBM22ytf1Nk42J3TmoOP\n\tRAzV1yRYV+WUaCiC71Ol3zjzjHIATgyk=","X-Received":"by 2002:a05:6512:1256:b0:5a3:e7d7:c67 with SMTP id\n 2adb3069b0e04-5a7466035femr65340e87.5.1777318361178; Mon, 27 Apr 2026\n 12:32:41 -0700 (PDT)","Precedence":"bulk","X-Mailing-List":"linux-gpio@vger.kernel.org","List-Id":"<linux-gpio.vger.kernel.org>","List-Subscribe":"<mailto:linux-gpio+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-gpio+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","References":"<20260427-baytrail-real-swnode-v3-0-0003e4c1708c@oss.qualcomm.com>\n <20260427-baytrail-real-swnode-v3-2-0003e4c1708c@oss.qualcomm.com>","In-Reply-To":"\n <20260427-baytrail-real-swnode-v3-2-0003e4c1708c@oss.qualcomm.com>","From":"\"Rafael J. Wysocki\" <rafael@kernel.org>","Date":"Mon, 27 Apr 2026 21:32:28 +0200","X-Gmail-Original-Message-ID":"\n <CAJZ5v0gR=wvgFomQzjS6rzoJYxwT2sxB60EM52PA4j-iwcXocw@mail.gmail.com>","X-Gm-Features":"AVHnY4JhHwVpV2lDxM_tmrikNutREbg4Pf9PEzlXufNxh7vs1vpuoZx2mRT4OyE","Message-ID":"\n <CAJZ5v0gR=wvgFomQzjS6rzoJYxwT2sxB60EM52PA4j-iwcXocw@mail.gmail.com>","Subject":"Re: [PATCH v3 2/2] platform/x86: x86-android-tablets: enable fwnode\n matching of GPIO chips","To":"Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>","Cc":"Andy Shevchenko <andriy.shevchenko@linux.intel.com>,\n Daniel Scally <djrscally@gmail.com>,\n  Heikki Krogerus <heikki.krogerus@linux.intel.com>,\n  Sakari Ailus <sakari.ailus@linux.intel.com>,\n  Greg Kroah-Hartman <gregkh@linuxfoundation.org>,\n \"Rafael J. Wysocki\" <rafael@kernel.org>,  Danilo Krummrich <dakr@kernel.org>,\n Mika Westerberg <mika.westerberg@linux.intel.com>,\n  Andy Shevchenko <andy@kernel.org>, Linus Walleij <linusw@kernel.org>,\n Hans de Goede <hansg@kernel.org>,\n =?utf-8?q?Ilpo_J=C3=A4rvinen?= <ilpo.jarvinen@linux.intel.com>,\n  Dmitry Torokhov <dmitry.torokhov@gmail.com>, Len Brown <lenb@kernel.org>,\n linux-acpi@vger.kernel.org,  driver-core@lists.linux.dev,\n linux-kernel@vger.kernel.org,  linux-gpio@vger.kernel.org,\n platform-driver-x86@vger.kernel.org,  brgl@kernel.org","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable"}},{"id":3683293,"web_url":"http://patchwork.ozlabs.org/comment/3683293/","msgid":"<CAMRc=MfVMLz3jZvxdgaD8ZUdcX6pgYO=WGCfH-dDmpU_WsfDLA@mail.gmail.com>","list_archive_url":null,"date":"2026-04-28T09:19:20","subject":"Re: [PATCH v3 2/2] platform/x86: x86-android-tablets: enable fwnode\n matching of GPIO chips","submitter":{"id":92191,"url":"http://patchwork.ozlabs.org/api/people/92191/","name":"Bartosz Golaszewski","email":"brgl@kernel.org"},"content":"On Tue, Apr 28, 2026 at 11:16 AM Hans de Goede <hansg@kernel.org> wrote:\n>\n> Hi Bartosz,\n>\n> On 27-Apr-26 14:19, Bartosz Golaszewski wrote:\n> > In order to allow GPIOLIB to match cherryview and baytrail GPIO\n> > controllers by their firmware nodes instead of their names, we need to\n> > attach the - currently \"dangling\" - existing software nodes to their\n> > target devices dynamically.\n> >\n> > We deal with devices described in ACPI so set up a bus notifier waiting\n> > for the ADD events. We know the name of the device we're waiting for so\n> > match against it and - on match - assign the appropriate software node\n> > as the secondary firmware node of the underlying ACPI node. In case the\n> > event was emitted earlier than this driver's probe: also make sure the\n> > device was not added before.\n> >\n> > Scheduling fine-grained devres actions allows for proper teardown and\n> > unsetting of the secondary firmware nodes.\n>\n> Thank you for your work on this.\n>\n> The x86-android-tablets.ko kernel module uses platform_create_bundle()\n> so its probe() cannot return -EPROBE_DEFER. IOW it expects all the GPIO\n> pins which it needs to already be there when it loads (which so far in\n> practice holds, since these x86 GPIO controllers are always builtin\n> for various reasons).\n>\n> This means that there is no need all the notifier stuff. Only adding\n> an acpi_bus_find_device_by_name() helper as suggested by Rafael and\n> then finding the GPIO controllers and attaching the swnodes is\n> necessary.\n>\n> And if the acpi_bus_find_device_by_name() fails it is ok to fail\n> the probe() just like it currently fails when gpiod_get() returns\n> -EPROBE_DEFER (or fails for other reasons).\n>\n> This should nicely simplify this patch.\n>\n\nThanks Hans, I was not aware of this. Given that this is the only\ndriver needing this quirk, it will indeed make things much simpler.\nI'll have a v4 by the end of this week.\n\nBart","headers":{"Return-Path":"\n <linux-gpio+bounces-35670-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-gpio@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=XA4n621B;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-gpio+bounces-35670-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"XA4n621B\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g4Zmx3GSGz1xvV\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 19:26:09 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 050F83374D6F\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 09:19:37 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 436563148D9;\n\tTue, 28 Apr 2026 09:19:34 +0000 (UTC)","from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 03F912D47E9\n\tfor <linux-gpio@vger.kernel.org>; Tue, 28 Apr 2026 09:19:33 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id B80AEC2BCF5\n\tfor <linux-gpio@vger.kernel.org>; Tue, 28 Apr 2026 09:19:33 +0000 (UTC)","by mail-lj1-f174.google.com with SMTP id\n 38308e7fff4ca-38e91b06006so92286751fa.2\n        for <linux-gpio@vger.kernel.org>;\n Tue, 28 Apr 2026 02:19:33 -0700 (PDT)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1777367974; cv=none;\n b=Eoe5Ai9EWCT8YUQR1FOn+C+aisk50l0o8pcRKBKRV/3BMU/dX9FPnInMZJQyscOFCePyPp4BCMnJaiLgSKKfVfqg/tu+1ys5PSKItBZHk/Lu4ctqFxOIWLuwxoFXrOjNk3Qaokf4GI0taiDt5UzoQMj5/Z3071ga9wPnIcSzL+s=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1777367974; c=relaxed/simple;\n\tbh=ZMSJhyCOtIvkpDAY1UyV0WQQ/akVYaE/bewN9HqkYjI=;\n\th=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject:\n\t To:Cc:Content-Type;\n b=fW8U2L9HbZhpgfw0ucerW3tyNjz30E1eCf1cRDZVaccXU9rho3fmD+yKTahcdBx57p5eLRNghcKo+Ro4qyMFuecXP814z9vSz/nVf0b/rctSGFg+8L48eiaf4DVylU7VZ25garoN2rKXw62dXbv/UKWv0+I1XocDBt1GlHU1ngo=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=XA4n621B; arc=none smtp.client-ip=10.30.226.201","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1777367973;\n\tbh=ZMSJhyCOtIvkpDAY1UyV0WQQ/akVYaE/bewN9HqkYjI=;\n\th=References:In-Reply-To:From:Date:Subject:To:Cc:From;\n\tb=XA4n621B4oxs87UXHlV5GM7gBt/2vn5/LdyCWHwfVBQZEGshe8CNZXj318dxb4fCB\n\t 0xOi9b6b7XQdIQA/4XxbV7XNhFOvqmxglUSjQLsvERJWt1KIGGD9O7sJduiXdQyMND\n\t 893pVGekl2a2PDWCxWqlQkUmJw1G06qw8Iu2fOmDZ6xwSpKE7Moc4n7691x3LTYgVG\n\t R3ddxwnIEIoPpvoyAQTqnxS/cvuW/+plVKWZTrX57sW4HBLb8ZtfpNZcDa8qDQyDff\n\t ZVbEOIJiHOrnBDwUM2AnxDV4EW2sE2Xs8GIDZzWL209dypeNWazYlIu+HzTmRcJpml\n\t GskwFfsGb6d+g==","X-Forwarded-Encrypted":"i=1;\n AFNElJ9LbLxV3/yiU4VG1AIE8+VXF3XNTPoowwz3Y+eLrclp6EjFwnwFm8APDvYrIRqG6ys4RHnl93cDo7nj@vger.kernel.org","X-Gm-Message-State":"AOJu0YwQmHa0C3QtrVehv9HTaOpuH/Wfwbwk5eRQBgh3IeYx0zkry713\n\tKLbj5x6luxJGY8ZlHEdAIWl8/jEz2z4ItjzICVvB+h0ERBc3FOrje4p357zsIC9FSC8GyV6U5TY\n\tzbvV8B/iL4pmN40XfkqICOW3DnCFMqUbttrsrYcioJw==","X-Received":"by 2002:a05:651c:513:b0:38e:58c7:cd0 with SMTP id\n 38308e7fff4ca-39240ccfba3mr7100321fa.10.1777367972313; Tue, 28 Apr 2026\n 02:19:32 -0700 (PDT)","Precedence":"bulk","X-Mailing-List":"linux-gpio@vger.kernel.org","List-Id":"<linux-gpio.vger.kernel.org>","List-Subscribe":"<mailto:linux-gpio+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-gpio+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","References":"<20260427-baytrail-real-swnode-v3-0-0003e4c1708c@oss.qualcomm.com>\n <20260427-baytrail-real-swnode-v3-2-0003e4c1708c@oss.qualcomm.com>\n <f100e787-f45a-4d72-9664-a75b1181763e@kernel.org>","In-Reply-To":"<f100e787-f45a-4d72-9664-a75b1181763e@kernel.org>","From":"Bartosz Golaszewski <brgl@kernel.org>","Date":"Tue, 28 Apr 2026 11:19:20 +0200","X-Gmail-Original-Message-ID":"\n <CAMRc=MfVMLz3jZvxdgaD8ZUdcX6pgYO=WGCfH-dDmpU_WsfDLA@mail.gmail.com>","X-Gm-Features":"AVHnY4L6HCdejwKae1mL2EFJhpoS5hPoP_ZtDkqrEE7U7UUevyusXQnkvGNf5lM","Message-ID":"\n <CAMRc=MfVMLz3jZvxdgaD8ZUdcX6pgYO=WGCfH-dDmpU_WsfDLA@mail.gmail.com>","Subject":"Re: [PATCH v3 2/2] platform/x86: x86-android-tablets: enable fwnode\n matching of GPIO chips","To":"Hans de Goede <hansg@kernel.org>","Cc":"Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>,\n  Andy Shevchenko <andriy.shevchenko@linux.intel.com>,\n Daniel Scally <djrscally@gmail.com>,\n  Heikki Krogerus <heikki.krogerus@linux.intel.com>,\n  Sakari Ailus <sakari.ailus@linux.intel.com>,\n  Greg Kroah-Hartman <gregkh@linuxfoundation.org>,\n \"Rafael J. Wysocki\" <rafael@kernel.org>,  Danilo Krummrich <dakr@kernel.org>,\n Mika Westerberg <mika.westerberg@linux.intel.com>,\n  Andy Shevchenko <andy@kernel.org>, Linus Walleij <linusw@kernel.org>,\n\t=?utf-8?q?Ilpo_J=C3=A4rvinen?= <ilpo.jarvinen@linux.intel.com>,\n  Dmitry Torokhov <dmitry.torokhov@gmail.com>, Len Brown <lenb@kernel.org>,\n linux-acpi@vger.kernel.org,  driver-core@lists.linux.dev,\n linux-kernel@vger.kernel.org,  linux-gpio@vger.kernel.org,\n platform-driver-x86@vger.kernel.org","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable"}},{"id":3683329,"web_url":"http://patchwork.ozlabs.org/comment/3683329/","msgid":"<f100e787-f45a-4d72-9664-a75b1181763e@kernel.org>","list_archive_url":null,"date":"2026-04-28T09:16:06","subject":"Re: [PATCH v3 2/2] platform/x86: x86-android-tablets: enable fwnode\n matching of GPIO chips","submitter":{"id":91026,"url":"http://patchwork.ozlabs.org/api/people/91026/","name":"Hans de Goede","email":"hansg@kernel.org"},"content":"Hi Bartosz,\n\nOn 27-Apr-26 14:19, Bartosz Golaszewski wrote:\n> In order to allow GPIOLIB to match cherryview and baytrail GPIO\n> controllers by their firmware nodes instead of their names, we need to\n> attach the - currently \"dangling\" - existing software nodes to their\n> target devices dynamically.\n> \n> We deal with devices described in ACPI so set up a bus notifier waiting\n> for the ADD events. We know the name of the device we're waiting for so\n> match against it and - on match - assign the appropriate software node\n> as the secondary firmware node of the underlying ACPI node. In case the\n> event was emitted earlier than this driver's probe: also make sure the\n> device was not added before.\n> \n> Scheduling fine-grained devres actions allows for proper teardown and\n> unsetting of the secondary firmware nodes.\n\nThank you for your work on this.\n\nThe x86-android-tablets.ko kernel module uses platform_create_bundle()\nso its probe() cannot return -EPROBE_DEFER. IOW it expects all the GPIO\npins which it needs to already be there when it loads (which so far in\npractice holds, since these x86 GPIO controllers are always builtin\nfor various reasons).\n\nThis means that there is no need all the notifier stuff. Only adding\nan acpi_bus_find_device_by_name() helper as suggested by Rafael and\nthen finding the GPIO controllers and attaching the swnodes is\nnecessary.\n\nAnd if the acpi_bus_find_device_by_name() fails it is ok to fail\nthe probe() just like it currently fails when gpiod_get() returns\n-EPROBE_DEFER (or fails for other reasons).\n\nThis should nicely simplify this patch.\n\nRegards,\n\nHans\n\n\n\n\n\n> \n> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>\n> ---\n>  drivers/platform/x86/x86-android-tablets/core.c | 127 +++++++++++++++++++++++-\n>  1 file changed, 124 insertions(+), 3 deletions(-)\n> \n> diff --git a/drivers/platform/x86/x86-android-tablets/core.c b/drivers/platform/x86/x86-android-tablets/core.c\n> index 021009e9085bec3db9c4daa1f6235600210a6099..9e6e8f272dfe16cda421b569802045c3d94fc0ab 100644\n> --- a/drivers/platform/x86/x86-android-tablets/core.c\n> +++ b/drivers/platform/x86/x86-android-tablets/core.c\n> @@ -13,10 +13,12 @@\n>  #include <linux/acpi.h>\n>  #include <linux/device.h>\n>  #include <linux/dmi.h>\n> +#include <linux/fwnode.h>\n>  #include <linux/gpio/consumer.h>\n>  #include <linux/gpio/machine.h>\n>  #include <linux/irq.h>\n>  #include <linux/module.h>\n> +#include <linux/notifier.h>\n>  #include <linux/pci.h>\n>  #include <linux/platform_device.h>\n>  #include <linux/serdev.h>\n> @@ -360,6 +362,124 @@ static const struct software_node *cherryview_gpiochip_node_group[] = {\n>  \tNULL\n>  };\n>  \n> +struct auto_secondary_data {\n> +\tstruct notifier_block nb;\n> +\tstruct device *parent;\n> +};\n> +\n> +static void auto_secondary_unset(void *data)\n> +{\n> +\tstruct fwnode_handle *fwnode = data;\n> +\n> +\tfwnode->secondary = NULL;\n> +}\n> +\n> +static int acpi_set_secondary_fwnode(struct device *parent, struct device *dev,\n> +\t\t\t\t     const struct software_node *const swnode)\n> +{\n> +\tstruct acpi_device *device = to_acpi_device(dev);\n> +\tstruct fwnode_handle *fwnode;\n> +\tint ret;\n> +\n> +\tfwnode = software_node_fwnode(swnode);\n> +\tif (WARN_ON(!fwnode))\n> +\t\treturn -ENOENT;\n> +\n> +\tfwnode->secondary = ERR_PTR(-ENODEV);\n> +\tdevice->fwnode.secondary = fwnode;\n> +\n> +\tret = devm_add_action_or_reset(parent, auto_secondary_unset, &device->fwnode);\n> +\tif (ret)\n> +\t\tdev_err(parent, \"Failed to schedule the unset action for secondary fwnode\\n\");\n> +\n> +\treturn ret;\n> +}\n> +\n> +static int acpi_auto_secondary_notifier(struct notifier_block *nb,\n> +\t\t\t\t\tunsigned long action, void *data)\n> +{\n> +\tstruct auto_secondary_data *auto_sec = container_of(nb, struct auto_secondary_data, nb);\n> +\tconst struct software_node *const *swnode;\n> +\tstruct device *dev = data;\n> +\tint ret;\n> +\n> +\tswitch (action) {\n> +\tcase BUS_NOTIFY_ADD_DEVICE:\n> +\t\tfor (swnode = gpiochip_node_group; *swnode; swnode++) {\n> +\t\t\tif (strcmp((*swnode)->name, dev_name(dev)) == 0) {\n> +\t\t\t\tret = acpi_set_secondary_fwnode(auto_sec->parent, dev, *swnode);\n> +\t\t\t\treturn ret ? NOTIFY_BAD : NOTIFY_OK;\n> +\t\t\t}\n> +\t\t}\n> +\t\tbreak;\n> +\tdefault:\n> +\t\tbreak;\n> +\t}\n> +\n> +\treturn NOTIFY_DONE;\n> +}\n> +\n> +static void auto_secondary_unregister_node_group(void *data)\n> +{\n> +\tconst struct software_node **nodes = data;\n> +\n> +\tsoftware_node_unregister_node_group(nodes);\n> +}\n> +\n> +static void auto_secondary_unregister_notifier(void *data)\n> +{\n> +\tstruct notifier_block *nb = data;\n> +\n> +\tbus_unregister_notifier(&acpi_bus_type, nb);\n> +}\n> +\n> +static int auto_secondary_fwnode_init(struct device *parent)\n> +{\n> +\tconst struct software_node *const *swnode;\n> +\tstruct auto_secondary_data *data;\n> +\tint ret;\n> +\n> +\tret = software_node_register_node_group(gpiochip_node_group);\n> +\tif (ret)\n> +\t\treturn ret;\n> +\n> +\tret = devm_add_action_or_reset(parent,\n> +\t\t\t\t       auto_secondary_unregister_node_group,\n> +\t\t\t\t       gpiochip_node_group);\n> +\tif (ret)\n> +\t\treturn ret;\n> +\n> +\tdata = devm_kzalloc(parent, sizeof(*data), GFP_KERNEL);\n> +\tif (!data)\n> +\t\treturn -ENOMEM;\n> +\n> +\tdata->nb.notifier_call = acpi_auto_secondary_notifier;\n> +\tdata->parent = parent;\n> +\n> +\tret = bus_register_notifier(&acpi_bus_type, &data->nb);\n> +\tif (ret)\n> +\t\treturn ret;\n> +\n> +\tret = devm_add_action_or_reset(parent,\n> +\t\t\t\t       auto_secondary_unregister_notifier,\n> +\t\t\t\t       &data->nb);\n> +\tif (ret)\n> +\t\treturn ret;\n> +\n> +\t/* Device may have been already added. */\n> +\tfor (swnode = gpiochip_node_group; *swnode; swnode++) {\n> +\t\tstruct device *dev __free(put_device) =\n> +\t\t\tbus_find_device_by_name(&acpi_bus_type, NULL, (*swnode)->name);\n> +\t\tif (dev) {\n> +\t\t\tret = acpi_set_secondary_fwnode(parent, dev, *swnode);\n> +\t\t\tif (ret)\n> +\t\t\t\treturn ret;\n> +\t\t}\n> +\t}\n> +\n> +\treturn 0;\n> +}\n> +\n>  static void x86_android_tablet_remove(struct platform_device *pdev)\n>  {\n>  \tint i;\n> @@ -391,7 +511,6 @@ static void x86_android_tablet_remove(struct platform_device *pdev)\n>  \n>  \tsoftware_node_unregister_node_group(gpio_button_swnodes);\n>  \tsoftware_node_unregister_node_group(swnode_group);\n> -\tsoftware_node_unregister_node_group(gpiochip_node_group);\n>  }\n>  \n>  static __init int x86_android_tablet_probe(struct platform_device *pdev)\n> @@ -427,9 +546,11 @@ static __init int x86_android_tablet_probe(struct platform_device *pdev)\n>  \t\tbreak;\n>  \t}\n>  \n> -\tret = software_node_register_node_group(gpiochip_node_group);\n> -\tif (ret)\n> +\tret = auto_secondary_fwnode_init(&pdev->dev);\n> +\tif (ret) {\n> +\t\tx86_android_tablet_remove(pdev);\n>  \t\treturn ret;\n> +\t}\n>  \n>  \tret = software_node_register_node_group(dev_info->swnode_group);\n>  \tif (ret) {\n>","headers":{"Return-Path":"\n <linux-gpio+bounces-35669-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-gpio@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=TfLq+sHl;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=linux-gpio+bounces-35669-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"TfLq+sHl\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g4bSQ57rwz1xvV\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 19:56:54 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 44BEA3316CB9\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 09:16:16 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 706D02FF675;\n\tTue, 28 Apr 2026 09:16:12 +0000 (UTC)","from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 257422DE70D;\n\tTue, 28 Apr 2026 09:16:11 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id 4B6FCC2BCB5;\n\tTue, 28 Apr 2026 09:16:08 +0000 (UTC)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1777367772; cv=none;\n b=LBq5Szs1mRmq2tPGXG2RKuUushk7i32pNoBdEYwMGG/2BFT4ccY03cOWRjQ/mELmA5edc1pBNcLBi81MaD3TEWnYGCtFUvqsLfMCN15ET3/72xYiIcbWSJMMb+21lHF1SY9XTk4aqqxc3kPiYsg76KWB59gGjyQDOe0u8cfy/e8=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1777367772; c=relaxed/simple;\n\tbh=d7nQyxp5R2nQ8E6FB8Ki2Z4lRNOguQ70LNdUnV0Y47c=;\n\th=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From:\n\t In-Reply-To:Content-Type;\n b=e/ZpZveZ1ro7Ut5fkj4HrXOiKqzu4+ecKC7pkJkikMwB89FVizPExUlUezofIniCS9vAGXE2c495NIW7LewxsFM6hiKabCb4vmc779+IBeoGryDqChxOSDQDtzns4tr7JbytGXByvxS+rLVeGCCVaotNKRJfl3Fwc7Bu/EPr2Yg=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=TfLq+sHl; arc=none smtp.client-ip=10.30.226.201","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1777367771;\n\tbh=d7nQyxp5R2nQ8E6FB8Ki2Z4lRNOguQ70LNdUnV0Y47c=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=TfLq+sHle2bK5m59V+E5xC2OT1UwN5LVcljCK98cxtqpsmSAcR6bt2xwxxfEkwSA4\n\t m+zXVMfxtYQ0TEaDOCJFUIw/+QHSrAfP9hUWJBHG3AiL1KbozRk4N2PM2y/uqddab/\n\t 62BPzczJn3KLa/08tONykbIC0Dcy25x+wu9C2y+CW2WwsIlAtxTu6TB+zKEzHDEtHf\n\t uQs4IONZZX/68ue3WVllwON8NqhYQjn42flebgIddMZ71rs6a6kRGhspnY7hp95HkW\n\t 3sa7D1ph5fLHWnQsvJlQp7s+NUzWqeAF1H7axxLJJetQ40+ueuCtJiqHjrJ2LhetCS\n\t 1IaOW5TQYNhsg==","Message-ID":"<f100e787-f45a-4d72-9664-a75b1181763e@kernel.org>","Date":"Tue, 28 Apr 2026 11:16:06 +0200","Precedence":"bulk","X-Mailing-List":"linux-gpio@vger.kernel.org","List-Id":"<linux-gpio.vger.kernel.org>","List-Subscribe":"<mailto:linux-gpio+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-gpio+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v3 2/2] platform/x86: x86-android-tablets: enable fwnode\n matching of GPIO chips","To":"Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>,\n Andy Shevchenko <andriy.shevchenko@linux.intel.com>,\n Daniel Scally <djrscally@gmail.com>,\n Heikki Krogerus <heikki.krogerus@linux.intel.com>,\n Sakari Ailus <sakari.ailus@linux.intel.com>,\n Greg Kroah-Hartman <gregkh@linuxfoundation.org>,\n \"Rafael J. Wysocki\" <rafael@kernel.org>, Danilo Krummrich <dakr@kernel.org>,\n Mika Westerberg <mika.westerberg@linux.intel.com>,\n Andy Shevchenko <andy@kernel.org>, Linus Walleij <linusw@kernel.org>,\n\t=?utf-8?q?Ilpo_J=C3=A4rvinen?= <ilpo.jarvinen@linux.intel.com>,\n Dmitry Torokhov <dmitry.torokhov@gmail.com>, Len Brown <lenb@kernel.org>","Cc":"linux-acpi@vger.kernel.org, driver-core@lists.linux.dev,\n linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org,\n platform-driver-x86@vger.kernel.org, brgl@kernel.org","References":"<20260427-baytrail-real-swnode-v3-0-0003e4c1708c@oss.qualcomm.com>\n <20260427-baytrail-real-swnode-v3-2-0003e4c1708c@oss.qualcomm.com>","From":"Hans de Goede <hansg@kernel.org>","Content-Language":"en-US, nl","In-Reply-To":"\n <20260427-baytrail-real-swnode-v3-2-0003e4c1708c@oss.qualcomm.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit"}}]