Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp920655pxb; Wed, 27 Oct 2021 15:14:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxsjMOuPoin+lM4e8kyv/3akme/w4TM/QyfmlWjllewqlKA6bb/f0xuJaNEYEmjgSuZsSvB X-Received: by 2002:a63:b34a:: with SMTP id x10mr298795pgt.473.1635372887872; Wed, 27 Oct 2021 15:14:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635372887; cv=none; d=google.com; s=arc-20160816; b=Psxf+UwexHyUrAB8IRRGtTKTQ5RZC64DmCek1zGyvchHv73t6icVT+KsI23zMZZgn6 M6KHj2KM0eB1ZtObC5yovCgpWfFAaNsw9b38FebrNXUOgYi1Z4lgThUfQN1g5mPnUPQg 62nwdLZkNIVoX7F67y30Ypb7iZSm/1WPtzBBQK5oaXacSUgLgphUYfjaC7kY1jV51MY9 ghI0qIAoXG5REVDYdmHBpuztIWMpI8VKIAq16R5UJQgL4hy0DJnvnmc2NEJXCi5THYxj Lx8CZw7tGlezO5VIJ7PQRYNQcY/mBSVn3CNf3GjHwXeLW/8yNHCMoxqIKyTboGIraEYE YOcA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=HanWLUgUF9ofZz0QDrpGI0FWc48M0ufWpqHp0nt1b2E=; b=gnI6CUNNwz6gFtZ0AEEy5Cu5viw4YJwzeZfjOevNWEoH4IMZePVsoGKSAZ5MqRJFCX qD2LJ/pCkc6yRcwkII+PzMLg/EV5aQ1Pbcfho/bvJ0U9nPK4VZuQoUvCIHBVCW3n/cvR eyXGaFHmuV5n9Ajisad9dNOpJbJHNMW+N17GlQ3cSjtXQHZYI73bMomCXMLkT22uS5KX ZQkoDVF0MVDPAgne8QB5y7TFyBzbfSXT0abIgCacA1/J0kVN77dxBMt+VzVtRRTrrlPI qlRtCQasINfJ6olOOqso4rfuItecjqS05konyy2BYW8H8y1f2zhFr587mc8un/u2TpAn ebJw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=a1C0lJ0g; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id pc11si1541823pjb.57.2021.10.27.15.14.35; Wed, 27 Oct 2021 15:14:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=a1C0lJ0g; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244269AbhJ0VUV (ORCPT + 99 others); Wed, 27 Oct 2021 17:20:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53682 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235594AbhJ0VUU (ORCPT ); Wed, 27 Oct 2021 17:20:20 -0400 Received: from mail-lf1-x12a.google.com (mail-lf1-x12a.google.com [IPv6:2a00:1450:4864:20::12a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 35012C061570; Wed, 27 Oct 2021 14:17:54 -0700 (PDT) Received: by mail-lf1-x12a.google.com with SMTP id bq11so8952736lfb.10; Wed, 27 Oct 2021 14:17:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=HanWLUgUF9ofZz0QDrpGI0FWc48M0ufWpqHp0nt1b2E=; b=a1C0lJ0gvckIcvrduJKizBVznyKnv2//TCPoPAKkXD5DGkkQrqb/ViKHcln36NfZVY ISxWYKFK39QVsDuVPSlu1LT5SZ/nBBGFDz/uufiZqdO/sZQ/qKfQbI2KUPqf8Q5RxkHA MqrWECpWx+g/FtcgYyau3zztbhU+vtw2w2aCc+udZXZ6rXXp+WIwUtGzuFURsYXqbmre UplyFnSR1G34j0+8EfYoJdUe8oXvIadmEQEw4Cs4f6QOILfUENf3Exk7blXkIQnIkrzz fkcmzAmhEcuM9KSNxc0P3MxX2C8tZcNnFx2+J321vEf5QsS8Rq276nN8ZpOlB8JNgrdd UeOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=HanWLUgUF9ofZz0QDrpGI0FWc48M0ufWpqHp0nt1b2E=; b=2DBntz91cSzQN0hRaF2E2r81j/aTuNe4fWfUbZrLjhLoW8iksFUvDeW7fS/UzDKebm mtVXi4Xj24A9qUUK+3V+XwL1thd7HsWfor75K1v75Yo+w6TMWXhYeX5Uml/ctT758X/o T1MvUYvL3hljnFUylZLyu3CkLhlhJDtcl9HVo3W0b8mx1E26Z9uOJlpHS8KvbojLMTfk hsv9Wz7SwIMBMyhTEd3R7oH3SYFJgkJzLtB6ouRuP7L/1u/OZC3lyAs6ILDk5nzkG/qA Qm0Ix5LNU+2mAdbZgE3HWIRziutrX2FoIEdewSaAyk8SQ04aKVXTLMdiUTa+nwqG8FDA juQg== X-Gm-Message-State: AOAM531GISKMTlxyJl2aqX0gN8gj0vwq+ULZblzv2Id05X36+NwQ+7wQ 826MJLuq2Y6L+xRgUTIoU3s= X-Received: by 2002:a05:6512:31a:: with SMTP id t26mr121977lfp.280.1635369472536; Wed, 27 Oct 2021 14:17:52 -0700 (PDT) Received: from localhost.localdomain (46-138-41-28.dynamic.spd-mgts.ru. [46.138.41.28]) by smtp.gmail.com with ESMTPSA id d7sm104336ljl.18.2021.10.27.14.17.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Oct 2021 14:17:52 -0700 (PDT) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Lee Jones , "Rafael J . Wysocki" , Mark Brown , Andrew Morton , Guenter Roeck , Russell King , Daniel Lezcano , Andy Shevchenko , Ulf Hansson Cc: Catalin Marinas , Will Deacon , Guo Ren , Geert Uytterhoeven , Greg Ungerer , Joshua Thompson , Thomas Bogendoerfer , Nick Hu , Greentime Hu , Vincent Chen , "James E.J. Bottomley" , Helge Deller , Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , Paul Walmsley , Palmer Dabbelt , Albert Ou , Yoshinori Sato , Rich Felker , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Boris Ostrovsky , Juergen Gross , Stefano Stabellini , Len Brown , Santosh Shilimkar , Krzysztof Kozlowski , Linus Walleij , Chen-Yu Tsai , =?UTF-8?q?Jonathan=20Neusch=C3=A4fer?= , Tony Lindgren , Liam Girdwood , Philipp Zabel , Vladimir Zapolskiy , Avi Fishman , Tomer Maimon , Tali Perry , Patrick Venture , Nancy Yuen , Benjamin Fair , Pavel Machek , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-csky@vger.kernel.org, linux-ia64@vger.kernel.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-sh@vger.kernel.org, xen-devel@lists.xenproject.org, linux-acpi@vger.kernel.org, linux-omap@vger.kernel.org, openbmc@lists.ozlabs.org, linux-tegra@vger.kernel.org, linux-pm@vger.kernel.org Subject: [PATCH v2 00/45] Introduce power-off+restart call chain API Date: Thu, 28 Oct 2021 00:16:30 +0300 Message-Id: <20211027211715.12671-1-digetx@gmail.com> X-Mailer: git-send-email 2.33.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Problem ------- SoC devices require power-off call chaining functionality from kernel. We have a widely used restart chaining provided by restart notifier API, but nothing for power-off. Solution -------- Introduce new API that provides both restart and power-off call chains. Why combine restart with power-off? Because drivers often do both. More practical to have API that provides both under the same roof. The new API is designed with simplicity and extensibility in mind. It's built upon the existing restart and reboot APIs. The simplicity is in new helper functions that are convenient for drivers. The extensibility is in the design that doesn't hardcode callback arguments, making easy to add new parameters and remove old. This is a third attempt to introduce the new API. First was made by Guenter Roeck back in 2014, second was made by Thierry Reding in 2017. In fact the work didn't stop and recently arm_pm_restart() was removed from v5.14 kernel, which was a part of preparatory work started by Guenter Roeck. I took into account experience and ideas from the previous attempts, extended and polished them. Adoption plan ------------- This patchset introduces the new API. It also converts multiple drivers and arch code to the new API to demonstrate how it all looks in practice. The plan is: 1. Merge new API (patches 1-8). This API will co-exist with the old APIs. 2. Convert arch code to do_kernel_power_off() (patches 9-21). 3. Convert drivers and platform code to the new API. 4. Remove obsolete pm_power_off and pm_power_off_prepare variables. 5. Make restart-notifier API private to kernel/reboot.c once no users left. Results ------- 1. Devices can be powered off properly. 2. Global variables are removed from drivers. 3. Global pm_power_off and pm_power_off_prepare callback variables are removed once all users are converted to the new API. The latter callback is removed by patch #25 of this series. 4. Ambiguous call chain ordering is prohibited. See patch #5 which adds verification of restart handlers priorities, ensuring that they are unique. Changelog: v2: - Replaced standalone power-off call chain demo-API with the combined power-off+restart API because this is what drivers want. It's a more comprehensive solution. - Converted multiple drivers and arch code to the new API. Suggested by Andy Shevchenko. I skimmed through the rest of drivers, verifying that new API suits them. The rest of the drivers will be converted once we will settle on the new API, otherwise will be too many patches here. - v2 API doesn't expose notifier to users and require handlers to have unique priority. Suggested by Guenter Roeck. - v2 API has power-off chaining disabled by default and require drivers to explicitly opt-in to the chaining. This preserves old behaviour for existing drivers once they are converted to the new API. Dmitry Osipenko (45): notifier: Remove extern annotation from function prototypes notifier: Add blocking_notifier_call_chain_empty() notifier: Add atomic/blocking_notifier_has_unique_priority() reboot: Correct typo in a comment reboot: Warn if restart handler has duplicated priority reboot: Warn if unregister_restart_handler() fails reboot: Remove extern annotation from function prototypes kernel: Add combined power-off+restart handler call chain API xen/x86: Use do_kernel_power_off() ARM: Use do_kernel_power_off() arm64: Use do_kernel_power_off() csky: Use do_kernel_power_off() ia64: Use do_kernel_power_off() mips: Use do_kernel_power_off() nds32: Use do_kernel_power_off() parisc: Use do_kernel_power_off() powerpc: Use do_kernel_power_off() riscv: Use do_kernel_power_off() sh: Use do_kernel_power_off() x86: Use do_kernel_power_off() m68k: Switch to new power-handler API memory: emif: Use kernel_can_power_off() ACPI: power: Switch to power-handler API regulator: pfuze100: Use devm_register_power_handler() reboot: Remove pm_power_off_prepare() soc/tegra: pmc: Utilize power-handler API to power off Nexus 7 properly mfd: ntxec: Use devm_register_power_handler() mfd: rn5t618: Use devm_register_power_handler() mfd: acer-a500: Use devm_register_power_handler() mfd: ene-kb3930: Use devm_register_power_handler() mfd: axp20x: Use register_simple_power_off_handler() mfd: retu: Use devm_register_simple_power_off_handler() mfd: rk808: Use devm_register_simple_power_off_handler() mfd: palmas: Use devm_register_simple_power_off_handler() mfd: max8907: Use devm_register_simple_power_off_handler() mfd: tps6586x: Use devm_register_simple_power_off_handler() mfd: tps65910: Use devm_register_simple_power_off_handler() mfd: max77620: Use devm_register_simple_power_off_handler() mfd: dm355evm_msp: Use devm_register_trivial_power_off_handler() mfd: twl4030: Use devm_register_trivial_power_off_handler() mfd: ab8500: Use devm_register_trivial_power_off_handler() reset: ath79: Use devm_register_simple_restart_handler() reset: intel-gw: Use devm_register_simple_restart_handler() reset: lpc18xx: Use devm_register_prioritized_restart_handler() reset: npcm: Use devm_register_prioritized_restart_handler() arch/arm/kernel/reboot.c | 4 +- arch/arm64/kernel/process.c | 3 +- arch/csky/kernel/power.c | 6 +- arch/ia64/kernel/process.c | 4 +- arch/m68k/emu/natfeat.c | 3 +- arch/m68k/include/asm/machdep.h | 1 - arch/m68k/kernel/process.c | 5 +- arch/m68k/kernel/setup_mm.c | 1 - arch/m68k/kernel/setup_no.c | 1 - arch/m68k/mac/config.c | 4 +- arch/mips/kernel/reset.c | 3 +- arch/nds32/kernel/process.c | 3 +- arch/parisc/kernel/process.c | 4 +- arch/powerpc/kernel/setup-common.c | 4 +- arch/powerpc/xmon/xmon.c | 3 +- arch/riscv/kernel/reset.c | 12 +- arch/sh/kernel/reboot.c | 3 +- arch/x86/kernel/reboot.c | 4 +- arch/x86/xen/enlighten_pv.c | 4 +- drivers/acpi/sleep.c | 25 +- drivers/memory/emif.c | 2 +- drivers/mfd/ab8500-sysctrl.c | 17 +- drivers/mfd/acer-ec-a500.c | 52 +-- drivers/mfd/axp20x.c | 22 +- drivers/mfd/dm355evm_msp.c | 20 +- drivers/mfd/ene-kb3930.c | 45 +- drivers/mfd/max77620.c | 21 +- drivers/mfd/max8907.c | 22 +- drivers/mfd/ntxec.c | 50 +- drivers/mfd/palmas.c | 24 +- drivers/mfd/retu-mfd.c | 31 +- drivers/mfd/rk808.c | 23 +- drivers/mfd/rn5t618.c | 56 +-- drivers/mfd/tps6586x.c | 21 +- drivers/mfd/tps65910.c | 17 +- drivers/mfd/twl4030-power.c | 10 +- drivers/regulator/pfuze100-regulator.c | 39 +- drivers/reset/reset-ath79.c | 15 +- drivers/reset/reset-intel-gw.c | 13 +- drivers/reset/reset-lpc18xx.c | 14 +- drivers/reset/reset-npcm.c | 14 +- drivers/soc/tegra/pmc.c | 54 ++- include/linux/mfd/axp20x.h | 1 + include/linux/notifier.h | 37 +- include/linux/pm.h | 1 - include/linux/reboot.h | 216 ++++++++- kernel/notifier.c | 88 ++++ kernel/power/hibernate.c | 2 +- kernel/reboot.c | 615 ++++++++++++++++++++++++- 49 files changed, 1209 insertions(+), 430 deletions(-) -- 2.33.1