Thank you Sebastian! -----Original Message----- From: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxx> Sent: Friday, June 17, 2022 11:35 AM To: Asmaa Mnebhi <asmaa@xxxxxxxxxx> Cc: linux-pm@xxxxxxxxxxxxxxx; linux-acpi@xxxxxxxxxxxxxxx Subject: Re: [PATCH v2 1/1] Support power control driver for BlueField SoCs. Hi, On Tue, Jun 14, 2022 at 10:19:11AM -0400, Asmaa Mnebhi wrote: > This patch supports handling 2 BlueField power states controlled by GPIO interrupts: > 1) chip reset and > 2) low power mode > > This driver is dependent and should be loaded after the gpio-mlxbf2.c > driver, which is the gpio and interrupt controller. > > Changes made since v1 patch: > - use dev_err_probe > - use devm_work_autocancel > - fix sizeof() in devm_kzalloc > > Signed-off-by: Asmaa Mnebhi <asmaa@xxxxxxxxxx> > --- Thanks, I queued this into power-supply's for-next branch. I modified the commit message a bit. Please follow the common style (e.g. Changes are documented below ---, patch subject should be prefixed with the subsystem). -- Sebastian > drivers/power/reset/Kconfig | 6 ++ > drivers/power/reset/Makefile | 1 + > drivers/power/reset/pwr-mlxbf.c | 97 > +++++++++++++++++++++++++++++++++ > 3 files changed, 104 insertions(+) > create mode 100644 drivers/power/reset/pwr-mlxbf.c > > diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig > index 4b563db3ab3e..a8c46ba5878f 100644 > --- a/drivers/power/reset/Kconfig > +++ b/drivers/power/reset/Kconfig > @@ -297,4 +297,10 @@ config NVMEM_REBOOT_MODE > then the bootloader can read it and take different > action according to the mode. > > +config POWER_MLXBF > + tristate "Mellanox BlueField power handling driver" > + depends on (GPIO_MLXBF2 && ACPI) > + help > + This driver supports reset or low power mode handling for Mellanox BlueField. > + > endif > diff --git a/drivers/power/reset/Makefile > b/drivers/power/reset/Makefile index f606a2f60539..0a39424fc558 100644 > --- a/drivers/power/reset/Makefile > +++ b/drivers/power/reset/Makefile > @@ -35,3 +35,4 @@ obj-$(CONFIG_REBOOT_MODE) += reboot-mode.o > obj-$(CONFIG_SYSCON_REBOOT_MODE) += syscon-reboot-mode.o > obj-$(CONFIG_POWER_RESET_SC27XX) += sc27xx-poweroff.o > obj-$(CONFIG_NVMEM_REBOOT_MODE) += nvmem-reboot-mode.o > +obj-$(CONFIG_POWER_MLXBF) += pwr-mlxbf.o > diff --git a/drivers/power/reset/pwr-mlxbf.c > b/drivers/power/reset/pwr-mlxbf.c new file mode 100644 index > 000000000000..c1f9987834a2 > --- /dev/null > +++ b/drivers/power/reset/pwr-mlxbf.c > @@ -0,0 +1,97 @@ > +// SPDX-License-Identifier: GPL-2.0-only or BSD-3-Clause > + > +/* > + * Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. > + */ > + > +#include <linux/acpi.h> > +#include <linux/device.h> > +#include <linux/interrupt.h> > +#include <linux/kernel.h> > +#include <linux/mod_devicetable.h> > +#include <linux/module.h> > +#include <linux/platform_device.h> > +#include <linux/pm.h> > +#include <linux/reboot.h> > +#include <linux/types.h> > + > +const char *rst_pwr_hid = "MLNXBF24"; const char *low_pwr_hid = > +"MLNXBF29"; > + > +struct pwr_mlxbf { > + struct work_struct send_work; > + const char *hid; > +}; > + > +static void pwr_mlxbf_send_work(struct work_struct *work) { > + acpi_bus_generate_netlink_event("button/power.*", "Power Button", > +0x80, 1); } > + > +static irqreturn_t pwr_mlxbf_irq(int irq, void *ptr) { > + struct pwr_mlxbf *priv = ptr; > + > + if (!strncmp(priv->hid, rst_pwr_hid, 8)) > + emergency_restart(); > + > + if (!strncmp(priv->hid, low_pwr_hid, 8)) > + schedule_work(&priv->send_work); > + > + return IRQ_HANDLED; > +} > + > +static int pwr_mlxbf_probe(struct platform_device *pdev) { > + struct device *dev = &pdev->dev; > + struct acpi_device *adev; > + struct pwr_mlxbf *priv; > + const char *hid; > + int irq, err; > + > + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > + if (!priv) > + return -ENOMEM; > + > + adev = ACPI_COMPANION(dev); > + if (!adev) > + return -ENXIO; > + > + hid = acpi_device_hid(adev); > + priv->hid = hid; > + > + irq = acpi_dev_gpio_irq_get(ACPI_COMPANION(dev), 0); > + if (irq < 0) > + return dev_err_probe(dev, irq, "Error getting %s irq.\n", > +priv->hid); > + > + err = devm_work_autocancel(dev, &priv->send_work, pwr_mlxbf_send_work); > + if (err) > + return err; > + > + err = devm_request_irq(dev, irq, pwr_mlxbf_irq, 0, hid, priv); > + if (err) > + dev_err(dev, "Failed request of %s irq\n", priv->hid); > + > + return err; > +} > + > +static const struct acpi_device_id __maybe_unused pwr_mlxbf_acpi_match[] = { > + { "MLNXBF24", 0 }, > + { "MLNXBF29", 0 }, > + {}, > +}; > +MODULE_DEVICE_TABLE(acpi, pwr_mlxbf_acpi_match); > + > +static struct platform_driver pwr_mlxbf_driver = { > + .driver = { > + .name = "pwr_mlxbf", > + .acpi_match_table = pwr_mlxbf_acpi_match, > + }, > + .probe = pwr_mlxbf_probe, > +}; > + > +module_platform_driver(pwr_mlxbf_driver); > + > +MODULE_DESCRIPTION("Mellanox BlueField power driver"); > +MODULE_AUTHOR("Asmaa Mnebhi <asmaa@xxxxxxxxxx>"); > +MODULE_LICENSE("Dual BSD/GPL"); > -- > 2.30.1 >