From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2B7E4CCD1A5 for ; Wed, 22 Oct 2025 00:49:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=EozbdL2ZGAH6g/fwTaEIV637PWNrFJEj1Or4DieBC00=; b=uAh+D0Ux3FTFNH NOhkoe3VLzWbM5zJ5TuSlFHz6jh6G9AdJuM4cVP67FUAXqYvHsTyrQKryZISzHbEYm7060Ezf1qwA H2VirdZLusPZkos/oo+wvD34PnaFNYw2cUMdNdA+GYVlivjyqXRXNP6sOpEMyWKDm3QhIjLKCRfvm TXZM74vvnG1lTWca/gdNeY7DI6rnRWPY7l3t8uZID9tJBbU1fGPi6Hjtfl2id/HkLA04TQfh3I2Xn pLbMY4A5n0IbECaLdV0POh3wzoTrlRbtxAQEiOePmF5j1uR0wHdmEJjc13s7vxJhb6m92AYjCOw9y p0EDuE5Euv34KIP4n5fw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vBN1t-0000000153S-3UBl; Wed, 22 Oct 2025 00:48:41 +0000 Received: from woodpecker.gentoo.org ([140.211.166.183] helo=smtp.gentoo.org) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1vBN1r-00000001535-0OC7 for linux-riscv@lists.infradead.org; Wed, 22 Oct 2025 00:48:40 +0000 Received: from localhost (unknown [116.232.147.23]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange secp256r1 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: dlan) by smtp.gentoo.org (Postfix) with ESMTPSA id 203E434106A; Wed, 22 Oct 2025 00:48:34 +0000 (UTC) Date: Wed, 22 Oct 2025 08:48:30 +0800 From: Yixun Lan To: Aurelien Jarno Cc: linux-kernel@vger.kernel.org, Lee Jones , Sebastian Reichel , Troy Mitchell , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , "open list:RISC-V ARCHITECTURE:Keyword:riscv" , "open list:RISC-V SPACEMIT SoC Support:Keyword:spacemit" , "open list:SYSTEM RESET/SHUTDOWN DRIVERS" Subject: Re: [PATCH v3 1/2] driver: reset: spacemit-p1: add driver for poweroff/reboot Message-ID: <20251022004830-GYB1522542@gentoo.org> References: <20251021201451.1013640-1-aurelien@aurel32.net> <20251021201451.1013640-2-aurelien@aurel32.net> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20251021201451.1013640-2-aurelien@aurel32.net> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20251021_174839_162072_77879CAC X-CRM114-Status: GOOD ( 31.85 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org Hi Aurelien, On 22:11 Tue 21 Oct , Aurelien Jarno wrote: > This driver implements poweroff/reboot support for the SpacemiT P1 PMIC > chip, which is commonly paired with the SpacemiT K1 SoC. > > The SpacemiT P1 support is implemented as a MFD driver, so the access is > done directly through the regmap interface. Reboot or poweroff is > triggered by setting a specific bit in a control register, which is > automatically cleared by the hardware afterwards. > > Signed-off-by: Aurelien Jarno > Reviewed-by: Yixun Lan > --- > v3: > - Allow building as a module > - Remove outdated Acked-by and Tested-by > - Collect Reviewed-by > > drivers/power/reset/Kconfig | 9 +++ > drivers/power/reset/Makefile | 1 + > drivers/power/reset/spacemit-p1-reboot.c | 88 ++++++++++++++++++++++++ > 3 files changed, 98 insertions(+) > create mode 100644 drivers/power/reset/spacemit-p1-reboot.c > > diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig > index 8248895ca9038..6577d73edbda4 100644 > --- a/drivers/power/reset/Kconfig > +++ b/drivers/power/reset/Kconfig > @@ -283,6 +283,15 @@ config POWER_RESET_KEYSTONE > help > Reboot support for the KEYSTONE SoCs. > > +config POWER_RESET_SPACEMIT_P1 > + tristate "SpacemiT P1 poweroff and reset driver" > + depends on ARCH_SPACEMIT || COMPILE_TEST .. > + select MFD_SPACEMIT_P1 I'd suggest to use "depends on" instead of "select", the reason is that using "select" will sometimes ignore the dependency, considering the reset driver here is tightly coupled with P1, so I think it's reasonable to switch to use "depends on", also refer below link https://lxr.linux.no/#linux+v6.7.1/Documentation/kbuild/kconfig-language.rst#L144 select should be used with care. select will force a symbol to a value without visiting the dependencies. By abusing select you are able to select a symbol FOO even if FOO depends on BAR that is not set. In general use select only for non-visible symbols (no prompts anywhere) and for symbols with no dependencies. That will limit the usefulness but on the other hand avoid the illegal configurations all over. > + default m > + help > + This driver supports power-off and reset operations for the SpacemiT > + P1 PMIC. > + > config POWER_RESET_SYSCON > bool "Generic SYSCON regmap reset driver" > depends on OF > diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile > index 51da87e05ce76..0e4ae6f6b5c55 100644 > --- a/drivers/power/reset/Makefile > +++ b/drivers/power/reset/Makefile > @@ -24,6 +24,7 @@ obj-$(CONFIG_POWER_RESET_LTC2952) += ltc2952-poweroff.o > obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o > obj-$(CONFIG_POWER_RESET_REGULATOR) += regulator-poweroff.o > obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o > +obj-$(CONFIG_POWER_RESET_SPACEMIT_P1) += spacemit-p1-reboot.o > obj-$(CONFIG_POWER_RESET_ST) += st-poweroff.o > obj-$(CONFIG_POWER_RESET_TH1520_AON) += th1520-aon-reboot.o > obj-$(CONFIG_POWER_RESET_TORADEX_EC) += tdx-ec-poweroff.o > diff --git a/drivers/power/reset/spacemit-p1-reboot.c b/drivers/power/reset/spacemit-p1-reboot.c > new file mode 100644 > index 0000000000000..9ec3d1fff8f3d > --- /dev/null > +++ b/drivers/power/reset/spacemit-p1-reboot.c > @@ -0,0 +1,88 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2025 by Aurelien Jarno > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +/* Power Control Register 2 */ > +#define PWR_CTRL2 0x7e > +#define PWR_CTRL2_SHUTDOWN BIT(2) /* Shutdown request */ > +#define PWR_CTRL2_RST BIT(1) /* Reset request */ > + > +static int spacemit_p1_pwroff_handler(struct sys_off_data *data) > +{ > + struct regmap *regmap = data->cb_data; > + int ret; > + > + /* Put the PMIC into shutdown state */ > + ret = regmap_set_bits(regmap, PWR_CTRL2, PWR_CTRL2_SHUTDOWN); > + if (ret) { > + dev_err(data->dev, "shutdown failed: %d\n", ret); > + return notifier_from_errno(ret); > + } > + > + return NOTIFY_DONE; > +} > + > +static int spacemit_p1_restart_handler(struct sys_off_data *data) > +{ > + struct regmap *regmap = data->cb_data; > + int ret; > + > + /* Put the PMIC into reset state */ > + ret = regmap_set_bits(regmap, PWR_CTRL2, PWR_CTRL2_RST); > + if (ret) { > + dev_err(data->dev, "restart failed: %d\n", ret); > + return notifier_from_errno(ret); > + } > + > + return NOTIFY_DONE; > +} > + > +static int spacemit_p1_reboot_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct regmap *regmap; > + int ret; > + > + regmap = dev_get_regmap(dev->parent, NULL); > + if (!regmap) > + return -ENODEV; > + > + ret = devm_register_power_off_handler(dev, &spacemit_p1_pwroff_handler, > + regmap); > + if (ret) > + return dev_err_probe(dev, ret, > + "Failed to register power off handler\n"); > + > + ret = devm_register_restart_handler(dev, spacemit_p1_restart_handler, > + regmap); > + if (ret) > + return dev_err_probe(dev, ret, > + "Failed to register restart handler\n"); > + > + return 0; > +} > + > +static const struct platform_device_id spacemit_p1_reboot_id_table[] = { > + { "spacemit-p1-reboot", }, > + { /* sentinel */ }, > +}; > +MODULE_DEVICE_TABLE(platform, spacemit_p1_reboot_id_table); > + > +static struct platform_driver spacemit_p1_reboot_driver = { > + .driver = { > + .name = "spacemit-p1-reboot", > + }, > + .probe = spacemit_p1_reboot_probe, > + .id_table = spacemit_p1_reboot_id_table, > +}; > +module_platform_driver(spacemit_p1_reboot_driver); > + > +MODULE_DESCRIPTION("SpacemiT P1 reboot/poweroff driver"); > +MODULE_LICENSE("GPL"); > -- > 2.47.2 > -- Yixun Lan (dlan) _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv