Support power control driver for BlueField SoCs.
Subsystems (2)
PATCH 1/1 Support power control driver for BlueField SoCs.
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.
--- drivers/power/reset/Kconfig | 6 ++ drivers/power/reset/Makefile | 1 + drivers/power/reset/pwr-mlxbf.c | 100 ++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 drivers/power/reset/pwr-mlxbf.c
drivers/power/reset/Kconfig +6 -0
@@ -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
drivers/power/reset/Makefile +1 -0
@@ -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
drivers/power/reset/pwr-mlxbf.c new file +100 -0
100 lines not on this page · raw message
Signature · 1 line
2.30.1
Hi,
Please find review feedback inline,
Quoted 88 lines · Asmaa Mnebhi
This patch supports handling 2 BlueField power states controlled by GPIO interrupts:
1) chip reset and
2) low power modeThis driver is dependent and should be loaded after the
gpio-mlxbf2.cdriver, which is the gpio and interrupt controller.Signed-off-by Asmaa Mnebhi <[email protected]>--- drivers/power/reset/Kconfig | 6 ++ drivers/power/reset/Makefile | 1 + drivers/power/reset/pwr-mlxbf.c | 100 ++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 drivers/power/reset/pwr-mlxbf.cdrivers/power/reset/Kconfig +6
-0@@ -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. + endifdrivers/power/reset/Makefile +1
-0@@ -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.odrivers/power/reset/pwr-mlxbf.c new file +43
-0@@ -0,0 +1,100 @@ +// 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 ; +} +
drivers/power/reset/pwr-mlxbf.c line 53
Quoted 10 lines
drivers/power/reset/pwr-mlxbf.c new file +10
-0+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 (struct pwr_mlxbf ),GFP_KERNEL );
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
Quoted 7 lines
drivers/power/reset/pwr-mlxbf.c new file +7
-0+if (!priv) +return -ENOMEM ; + + adev =ACPI_COMPANION (dev); +if (!adev) +return -ENXIO ; +
drivers/power/reset/pwr-mlxbf.c line 70
Quoted 10 lines
drivers/power/reset/pwr-mlxbf.c new file +10
-0+ hid =acpi_device_hid (adev); + priv->hid = hid; + + irq =acpi_dev_gpio_irq_get (ACPI_COMPANION (&pdev->dev),0 ); +if (irq == -EPROBE_DEFER ) { +return -EPROBE_DEFER ; + }else if (irq <0 ) { +dev_err (&pdev->dev,"Error getting %s irq.\n" , priv->hid); +return -ENXIO ; + }
if (irq < 0)
return dev_err_probe(&pdev->dev, irq, "Error getting %s irq.\n", priv->hid);
drivers/power/reset/pwr-mlxbf.c line 72
Quoted 1 line
drivers/power/reset/pwr-mlxbf.c new file +1
-0+INIT_WORK (&priv->send_work, pwr_mlxbf_send_work);
err = devm_work_autocancel(dev, &priv->send_work, pwr_mlxbf_send_work); if (err)
return err;
Otherwise LGTM,
-- Sebastian
Quoted 27 lines
drivers/power/reset/pwr-mlxbf.c new file +27
-0+ err =devm_request_irq (&pdev->dev, irq, pwr_mlxbf_irq,0 , hid, priv); +if (err) +dev_err (&pdev->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 <[email protected]>" ); +MODULE_LICENSE ("Dual BSD/GPL" );