From patchwork Thu Oct 7 06:02:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1537520 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20210112 header.b=SI7tM5D9; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4HQ1433qb6z9sXS for ; Thu, 7 Oct 2021 17:04:19 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240158AbhJGGGL (ORCPT ); Thu, 7 Oct 2021 02:06:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52546 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236997AbhJGGGJ (ORCPT ); Thu, 7 Oct 2021 02:06:09 -0400 Received: from mail-qk1-x732.google.com (mail-qk1-x732.google.com [IPv6:2607:f8b0:4864:20::732]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 74736C061746; Wed, 6 Oct 2021 23:04:16 -0700 (PDT) Received: by mail-qk1-x732.google.com with SMTP id p4so4986436qki.3; Wed, 06 Oct 2021 23:04:16 -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:in-reply-to:references :mime-version:content-transfer-encoding; bh=VM/3QqT61sEu6/tGSpWiy3SXMXIkh6EIpUzphFMdS6s=; b=SI7tM5D90t1doaIZuK+x0lCkecGfwH/buE9WdfWMP0wHreV9DiYhU7aM+6EDow56zJ S+AtGbjt8+0w73TVLkM33MOfJZJfTI72r3kJqirGE1D1JgGnbggBpdMCnnO/OWnn32aD 4NoPSl+abAqx4rTLIQ3ODiniUACsJNfurv6Qt9mqH8Ow6bBgyz6YVeEUnxeV/BDjfJ5U mYhL8WlAub40VVSnXkgTd/2AhK8z1fu698jtV0HuBcAuteGQGtZQ6a8gYv4L4YfwPq9C r0gaoqREI/t5YAKhLunNCAjk6AcPhonbZOQ2mJSTA5FpmsjLkjUncFRAum1aNU/Kf8XG cU/A== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=VM/3QqT61sEu6/tGSpWiy3SXMXIkh6EIpUzphFMdS6s=; b=tTSSePcdFLGDGisKwTG3QJqRUXdgwM1u+0QN76gqgAWyKZl2Gkwni3un0yF2W71169 SKgyRmtPqL/uMM56eG7fwYJlmZZHIewAdrLYqKoaL9NdFWvpSs7MATZ5Uq4ZZAAH/Q5d P0cMw78f6BIIEUb17W7N78+VTEmtzHZD8icuvnIu8+oWUJvVtKVIxHS82wX0UGIo0UlS wB6f89ogB8ey12dojpnYPm9PxQdtx2FOhuyOs88HmklBPsFC6zV0DNnZ3xKqboH3llt3 rWqewhh/GGB6rs58QdsPUHbBRC6bIkb/STEiB+rWoU43eOyyG772uvsl/t56PfccKJ1k CGlA== X-Gm-Message-State: AOAM530TrCObaKpd2FNAF2/OGHgmqfBtUXZNSgIy2Eoe4XSNI9rA89Ey 3lgC/WspWe7NhUGCZR9HbIlL1Eu62gw= X-Google-Smtp-Source: ABdhPJz2tgUx/RBVJ2NREFJxdllSwwqTwVQ4NsAcTwz5lpnULdJBLqzVSULU0El9cZA9nmlilFm49w== X-Received: by 2002:ae9:df45:: with SMTP id t66mr1836886qkf.335.1633586655677; Wed, 06 Oct 2021 23:04:15 -0700 (PDT) Received: from localhost.localdomain (79-139-163-57.dynamic.spd-mgts.ru. [79.139.163.57]) by smtp.gmail.com with ESMTPSA id x79sm13235042qkb.65.2021.10.06.23.04.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Oct 2021 23:04:15 -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: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org Subject: [PATCH v1 1/6] notifier: Add blocking_notifier_call_chain_empty() Date: Thu, 7 Oct 2021 09:02:48 +0300 Message-Id: <20211007060253.17049-2-digetx@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211007060253.17049-1-digetx@gmail.com> References: <20211007060253.17049-1-digetx@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Add blocking_notifier_call_chain_empty() that returns true if call chain is empty and false otherwise. Signed-off-by: Dmitry Osipenko --- include/linux/notifier.h | 2 ++ kernel/notifier.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/linux/notifier.h b/include/linux/notifier.h index 87069b8459af..f0b1d600d9f6 100644 --- a/include/linux/notifier.h +++ b/include/linux/notifier.h @@ -173,6 +173,8 @@ extern int blocking_notifier_call_chain_robust(struct blocking_notifier_head *nh extern int raw_notifier_call_chain_robust(struct raw_notifier_head *nh, unsigned long val_up, unsigned long val_down, void *v); +extern bool blocking_notifier_call_chain_empty(struct blocking_notifier_head *nh); + #define NOTIFY_DONE 0x0000 /* Don't care */ #define NOTIFY_OK 0x0001 /* Suits me */ #define NOTIFY_STOP_MASK 0x8000 /* Don't call further */ diff --git a/kernel/notifier.c b/kernel/notifier.c index b8251dc0bc0f..1f7ba8988b90 100644 --- a/kernel/notifier.c +++ b/kernel/notifier.c @@ -322,6 +322,20 @@ int blocking_notifier_call_chain(struct blocking_notifier_head *nh, } EXPORT_SYMBOL_GPL(blocking_notifier_call_chain); +/** + * blocking_notifier_call_chain_empty - Check whether notifier chain is empty + * @nh: Pointer to head of the blocking notifier chain + * + * Checks whether notifier chain is empty. + * + * Returns true is notifier chain is empty, false otherwise. + */ +bool blocking_notifier_call_chain_empty(struct blocking_notifier_head *nh) +{ + return !rcu_access_pointer(nh->head); +} +EXPORT_SYMBOL_GPL(blocking_notifier_call_chain_empty); + /* * Raw notifier chain routines. There is no protection; * the caller must provide it. Use at your own risk! From patchwork Thu Oct 7 06:02:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1537521 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20210112 header.b=djDZ3VVz; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4HQ1471mXLz9sXS for ; Thu, 7 Oct 2021 17:04:23 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240203AbhJGGGN (ORCPT ); Thu, 7 Oct 2021 02:06:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52564 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236269AbhJGGGM (ORCPT ); Thu, 7 Oct 2021 02:06:12 -0400 Received: from mail-qk1-x734.google.com (mail-qk1-x734.google.com [IPv6:2607:f8b0:4864:20::734]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 518E4C061746; Wed, 6 Oct 2021 23:04:19 -0700 (PDT) Received: by mail-qk1-x734.google.com with SMTP id t63so233341qkf.1; Wed, 06 Oct 2021 23:04:19 -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:in-reply-to:references :mime-version:content-transfer-encoding; bh=v5unlXCCWgJvBuiCzfmTWdVp+0Woi4JIlep2S0jg/Jg=; b=djDZ3VVzEuq+g6PpAWrSfzJ66Vx0pTytlQ/lS7gK+I/nLTSev9ao73O87hbf2SMHoI xSPsh4G8whRRQZcd6BKdPWe+RuSRNLhg4pDJdeCc6Azevb1Gm0E/TZ6hl5HyPlv0Hj+0 53CosM1BI5ZLS4Sy7Mllt7qheBmETj9wCoYU+eBRD0MXRgMx+nuQSVze1bw3Uu4W31fJ FhLIC0dbLA43JEMKPU6nVnYetM+3fNrsZsHcTjbPU/wniBnFtyl33MtN79xlG72lToJW XfqLfaRD/OeCZxO619jrc0kzZdd5cI1DINmftTs3dkGXz9si+ZtPOzEsO10+nv6N0BMf 7GMw== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=v5unlXCCWgJvBuiCzfmTWdVp+0Woi4JIlep2S0jg/Jg=; b=uS0er/Nkq5DVyrA8Is4LC1KxQC7yQ7QVFArFVWBLfaE8i5KA00Owe+/vk21GsdTldh J7prNaeUku0UviUsuY6b6Fo9/ubYSM+Pi1EGRQQhWc5UJUdX0zV7wYQfy60z5yRfVUna JQBukPZl4BTsr5odQisg58wnoEuJekLXQwT39oDgFQnSjGx0FupiK1s8PClldaqwCWvA HhY6xqJSZo89tASRgApc4feK0ir/SPGJc6qHwHRvF9zz1NSGWvosGLVOOeCzgPBt6mOz bNSZ9yzseSlF3nfPhJpKz7H3YS7k77ocV3T0Pv2Z4KL8UFQEN7zZ/ZmRsijTBocZpOX6 6WCA== X-Gm-Message-State: AOAM533mx9s1ysotpERk2FrEKUVkdjzJugvGO3HQ1h8yCSML6m9Am1Zu 1smtloY3AYu5sG6mWQu/0VQ= X-Google-Smtp-Source: ABdhPJw++YRw2AnjUldzLepuhyAXxTxqpKrn6q7pDcxn4xqZTAndK6khEp4qEXUbFjcj+97I7NN9zA== X-Received: by 2002:a37:4658:: with SMTP id t85mr1793774qka.195.1633586658472; Wed, 06 Oct 2021 23:04:18 -0700 (PDT) Received: from localhost.localdomain (79-139-163-57.dynamic.spd-mgts.ru. [79.139.163.57]) by smtp.gmail.com with ESMTPSA id x79sm13235042qkb.65.2021.10.06.23.04.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Oct 2021 23:04:18 -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: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org Subject: [PATCH v1 2/6] kernel: Add power off handler call chain API Date: Thu, 7 Oct 2021 09:02:49 +0300 Message-Id: <20211007060253.17049-3-digetx@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211007060253.17049-1-digetx@gmail.com> References: <20211007060253.17049-1-digetx@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org SoC platforms often have multiple options for performing system's power off. Meanwhile kernel is limited to a single option. Add power off handler call chain API, which is inspired by the restart API. The old pm_power_off method will be kept around till all drivers are converted to the new API. Signed-off-by: Dmitry Osipenko --- include/linux/reboot.h | 5 ++ kernel/reboot.c | 111 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/include/linux/reboot.h b/include/linux/reboot.h index af907a3d68d1..f72fb8729608 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h @@ -49,6 +49,11 @@ extern int register_restart_handler(struct notifier_block *); extern int unregister_restart_handler(struct notifier_block *); extern void do_kernel_restart(char *cmd); +extern int register_poweroff_handler(struct notifier_block *); +extern int unregister_poweroff_handler(struct notifier_block *); + +extern int devm_register_poweroff_handler(struct device *, struct notifier_block *); + /* * Architecture-specific implementations of sys_reboot commands. */ diff --git a/kernel/reboot.c b/kernel/reboot.c index f7440c0c7e43..6e90afec2bb8 100644 --- a/kernel/reboot.c +++ b/kernel/reboot.c @@ -280,6 +280,113 @@ void kernel_halt(void) } EXPORT_SYMBOL_GPL(kernel_halt); +/* + * Notifier list for kernel code which wants to be called + * to power off the system. + */ +static BLOCKING_NOTIFIER_HEAD(poweroff_handler_list); + +/** + * register_poweroff_handler - Register function to be called to power off + * the system + * @nb: Info about handler function to be called + * @nb->priority: Handler priority. Handlers should follow the + * following guidelines for setting priorities. + * 0: Poweroff handler of last resort, + * with limited poweroff capabilities + * 128: Default poweroff handler; use if no other + * poweroff handler is expected to be available, + * and/or if poweroff functionality is + * sufficient to poweroff the entire system + * 255: Highest priority poweroff handler, will + * preempt all other poweroff handlers + * + * Registers a function with code to be called to power off the + * system. + * + * Registered functions will be called as last step of the poweroff + * sequence. + * + * Registered functions are expected to power off the system immediately. + * If more than one function is registered, the poweroff handler priority + * selects which function will be called first. + * + * Poweroff handlers are expected to be registered from non-architecture + * code, typically from drivers. A typical use case would be a system + * where poweroff functionality is provided through a PMIC. Multiple + * poweroff handlers may exist; for example, one poweroff handler might + * turn off the entire system, while another only turns off part of + * system. In such cases, the poweroff handler which only disables part + * of the hardware is expected to register with low priority to ensure + * that it only runs if no other means to power off the system is + * available. + * + * Currently always returns zero, as blocking_notifier_chain_register() + * always returns zero. + */ +int register_poweroff_handler(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&poweroff_handler_list, nb); +} +EXPORT_SYMBOL(register_poweroff_handler); + +/** + * unregister_poweroff_handler - Unregister previously registered + * poweroff handler + * @nb: Hook to be unregistered + * + * Unregisters a previously registered poweroff handler function. + * + * Returns zero on success, or %-ENOENT on failure. + */ +int unregister_poweroff_handler(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&poweroff_handler_list, nb); +} +EXPORT_SYMBOL(unregister_poweroff_handler); + +static void devm_unregister_poweroff_handler(struct device *dev, void *res) +{ + WARN_ON(unregister_poweroff_handler(*(struct notifier_block **)res)); +} + +int devm_register_poweroff_handler(struct device *dev, struct notifier_block *nb) +{ + struct notifier_block **rcnb; + int ret; + + rcnb = devres_alloc(devm_unregister_poweroff_handler, + sizeof(*rcnb), GFP_KERNEL); + if (!rcnb) + return -ENOMEM; + + ret = register_poweroff_handler(nb); + if (!ret) { + *rcnb = nb; + devres_add(dev, rcnb); + } else { + devres_free(rcnb); + } + + return ret; +} +EXPORT_SYMBOL(devm_register_poweroff_handler); + +/** + * do_kernel_power_off - Execute kernel poweroff handler call chain + * + * Calls functions registered with register_poweroff_handler. + * + * Expected to be called as last step of the poweroff sequence. + * + * Powers off the system immediately if a poweroff handler function has + * been registered. Otherwise does nothing. + */ +static void do_kernel_power_off(void) +{ + blocking_notifier_call_chain(&poweroff_handler_list, 0, NULL); +} + /** * kernel_power_off - power_off the system * @@ -295,6 +402,7 @@ void kernel_power_off(void) pr_emerg("Power down\n"); kmsg_dump(KMSG_DUMP_SHUTDOWN); machine_power_off(); + do_kernel_power_off(); } EXPORT_SYMBOL_GPL(kernel_power_off); @@ -339,7 +447,8 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, /* Instead of trying to make the power_off code look like * halt when pm_power_off is not set do it the easy way. */ - if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off) + if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off && + blocking_notifier_call_chain_empty(&poweroff_handler_list)) cmd = LINUX_REBOOT_CMD_HALT; mutex_lock(&system_transition_mutex); From patchwork Thu Oct 7 06:02:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1537522 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20210112 header.b=AwOVSu2K; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4HQ14B3yCGz9sXS for ; Thu, 7 Oct 2021 17:04:26 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240184AbhJGGGQ (ORCPT ); Thu, 7 Oct 2021 02:06:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52582 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240212AbhJGGGP (ORCPT ); Thu, 7 Oct 2021 02:06:15 -0400 Received: from mail-qv1-xf2d.google.com (mail-qv1-xf2d.google.com [IPv6:2607:f8b0:4864:20::f2d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0BAC0C061762; Wed, 6 Oct 2021 23:04:22 -0700 (PDT) Received: by mail-qv1-xf2d.google.com with SMTP id 11so3480207qvd.11; Wed, 06 Oct 2021 23:04:22 -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:in-reply-to:references :mime-version:content-transfer-encoding; bh=HNsfnJd+5kS80akoo8bxdjzrR4smQrHB5wW716HCL/U=; b=AwOVSu2KnBDEnKj72Rjg6LT4qZmGDufDaNvanRPXjPrzNg3mnZQ5AXJiX3aM+zooz/ F99klJJW86reoPrtbAJqYt5LNXyccKYO0lrp4GMUCK5ebSFdnrIOD2ENAjfzss5EYWaD d94IG5xE7H5LQvyAwZFqavldd105j33Qk3DHXE+Knm1H0yt1/CMlxfUlVgfcNnu9FdST foBffZwR0/wAHaYNQQH2OOYp4ohqkrsEh6OBWb+xIO2gdkstOH75yLJWhHwGi6qVQxrR B4as6RSYhPFyQ4EcIGvKSuj1rgAnRAo5V2x6bhrU6ByhlKAa7r4Q3+Ov9ETtfzYXC+p5 UR1w== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=HNsfnJd+5kS80akoo8bxdjzrR4smQrHB5wW716HCL/U=; b=4uRQlotWiKY06XzJs+1vBm/zHlfQSbWhdIty7a31zB33BJd7NGg/K4l8Obj/Zv4gA0 I0R4s0q0UzwHnVBKXYSUGTym0vRCUfSM69sgOGwyIDCL+pIQNuB8yVLD33p7UjlwKD74 MtpPTW59mYZz2jQiplYjiMVjXxEmjvAC59fSs8Nl2sXTGENba8FWxEczi0kJjlWlelfu 0k1KtTu2AiJomlGbvMnNR4ni8GbSwilB7+6Dm9lsrtnh+m/iy1+bTv75wTOy7Bs4nxPE 0Vc/QbSI9sA6KbYewUzYpUOarQJA7dR6p+qKcsBx5ES3VPtF97fXl1VSsFM96ZNU82DS 46xw== X-Gm-Message-State: AOAM530gYetroE5FnomtCki3R8y/geuPglGkfKTi4VfkpLa5j+M4BsZB tRr0RdHFKeW2mD8QN9K8vwk= X-Google-Smtp-Source: ABdhPJyoERJF+dBkQiPBDLcF0qOcjYVLRaaI9m+OEpsXDIQNfiZSg2J2U3RkUrNAd+vGD7XGTXM6jQ== X-Received: by 2002:a05:6214:1022:: with SMTP id k2mr2188082qvr.53.1633586661289; Wed, 06 Oct 2021 23:04:21 -0700 (PDT) Received: from localhost.localdomain (79-139-163-57.dynamic.spd-mgts.ru. [79.139.163.57]) by smtp.gmail.com with ESMTPSA id x79sm13235042qkb.65.2021.10.06.23.04.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Oct 2021 23:04:20 -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: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org Subject: [PATCH v1 3/6] kernel: Add devm_register_restart_handler() Date: Thu, 7 Oct 2021 09:02:50 +0300 Message-Id: <20211007060253.17049-4-digetx@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211007060253.17049-1-digetx@gmail.com> References: <20211007060253.17049-1-digetx@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Add resource-managed variant of register_restart_handler(). Signed-off-by: Dmitry Osipenko --- include/linux/reboot.h | 2 ++ kernel/reboot.c | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/include/linux/reboot.h b/include/linux/reboot.h index f72fb8729608..fb17fad63e53 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h @@ -49,6 +49,8 @@ extern int register_restart_handler(struct notifier_block *); extern int unregister_restart_handler(struct notifier_block *); extern void do_kernel_restart(char *cmd); +extern int devm_register_restart_handler(struct device *, struct notifier_block *); + extern int register_poweroff_handler(struct notifier_block *); extern int unregister_poweroff_handler(struct notifier_block *); diff --git a/kernel/reboot.c b/kernel/reboot.c index 6e90afec2bb8..b611e49a5ac6 100644 --- a/kernel/reboot.c +++ b/kernel/reboot.c @@ -200,6 +200,33 @@ int unregister_restart_handler(struct notifier_block *nb) } EXPORT_SYMBOL(unregister_restart_handler); +static void devm_unregister_restart_handler(struct device *dev, void *res) +{ + WARN_ON(unregister_restart_handler(*(struct notifier_block **)res)); +} + +int devm_register_restart_handler(struct device *dev, struct notifier_block *nb) +{ + struct notifier_block **rcnb; + int ret; + + rcnb = devres_alloc(devm_unregister_restart_handler, + sizeof(*rcnb), GFP_KERNEL); + if (!rcnb) + return -ENOMEM; + + ret = register_restart_handler(nb); + if (!ret) { + *rcnb = nb; + devres_add(dev, rcnb); + } else { + devres_free(rcnb); + } + + return ret; +} +EXPORT_SYMBOL(devm_register_restart_handler); + /** * do_kernel_restart - Execute kernel restart handler call chain * From patchwork Thu Oct 7 06:02:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1537523 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20210112 header.b=MS8H6zdX; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4HQ14D3y1Cz9sXS for ; Thu, 7 Oct 2021 17:04:28 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240207AbhJGGGT (ORCPT ); Thu, 7 Oct 2021 02:06:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52606 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240230AbhJGGGS (ORCPT ); Thu, 7 Oct 2021 02:06:18 -0400 Received: from mail-qk1-x72d.google.com (mail-qk1-x72d.google.com [IPv6:2607:f8b0:4864:20::72d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D1B4DC061746; Wed, 6 Oct 2021 23:04:24 -0700 (PDT) Received: by mail-qk1-x72d.google.com with SMTP id t63so233512qkf.1; Wed, 06 Oct 2021 23:04:24 -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:in-reply-to:references :mime-version:content-transfer-encoding; bh=wsvYgeVVG8SKskfDqOgobykv3cFchIXrq53qABMEo18=; b=MS8H6zdX/Crn0whvsYNGYfUbv8DlUtJPT+afbHg2KH8nNgv2Bv2Wn0Ae5aQB3OdJK5 FajFWQ6YESOlL6WiVDxb68h4gegNpZkFziLvBj1dyEbvY8oYVc98iGY5helXP8F3S+Mf 180ABjO/nHDXxC9JwizM1SMy9la2x4+r12EMh4JzgBvRmdyVQj+T/4T/IwF9X3mOQ6YF +wteucJwYREsDQ8dO68HKkUxvcsk8EICxbI3JPn6DndLgMQ4XUvAfG5yhMtzT1DqYFS0 3we8KVbZG6JnKpRtCW77+0O1xx3UgJf3/nUT7xwpUftVBBI5oxXtVajSD/lNZd2Rf6TR fViw== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=wsvYgeVVG8SKskfDqOgobykv3cFchIXrq53qABMEo18=; b=vRZe2wqvyolRCohhjlIBHBRdT6nOU+QexbVZ28zbt1YL1l/CI092OrFAWvp/Roy1nT Q06BRccLMHWV3Z3St+cFlYPf/BBk2cEwOxIBKWTJ64DJRl0NHM3f7Dn594Usibc4dmBq B3qj5499lk53cH79dYTyu9TnmLN09enNUNGZXmzJOOTeapZCQ6259vyyTOmuCyIFcMUg TGoutYVigXFGz7cGk99R2U5GkulGTI/oP2Jy0IhPIOD4BgnTal7VoKTAyUk0gVTR5arQ BjgFHJeMAtGnD/z/avpqZM/XoaTIikofjWhynoaA9+MFCfg7e0P/NmMv6TKft9gf2Z9H +Nng== X-Gm-Message-State: AOAM5328MwKdjmwfl00ZIuj/o3AOY5qd4xCJhdSZaSqMl4hY6mCX8YS4 Dma5KHTDuxiLRPlKfk5tFBY= X-Google-Smtp-Source: ABdhPJx8dKDtb4TjLhT2xUji03vrz94GkdJV8nQC+MJjqJX/fJEsb/kOv1ObSmQl+mQqIQ/G7lcWwQ== X-Received: by 2002:a37:670d:: with SMTP id b13mr1812482qkc.420.1633586664072; Wed, 06 Oct 2021 23:04:24 -0700 (PDT) Received: from localhost.localdomain (79-139-163-57.dynamic.spd-mgts.ru. [79.139.163.57]) by smtp.gmail.com with ESMTPSA id x79sm13235042qkb.65.2021.10.06.23.04.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Oct 2021 23:04:23 -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: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org Subject: [PATCH v1 4/6] mfd: max77620: Use power off call chain API Date: Thu, 7 Oct 2021 09:02:51 +0300 Message-Id: <20211007060253.17049-5-digetx@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211007060253.17049-1-digetx@gmail.com> References: <20211007060253.17049-1-digetx@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Use new power off call chain API which allows multiple power off handlers to coexist. Nexus 7 Android tablet can be powered off using MAX77663 PMIC and using a special bootloader command. At first the bootloader option should be tried, it will have a higher priority than the PMIC. Signed-off-by: Dmitry Osipenko --- drivers/mfd/max77620.c | 22 +++++++++++++++------- include/linux/mfd/max77620.h | 2 ++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/mfd/max77620.c b/drivers/mfd/max77620.c index fec2096474ad..ad40eed1f0c6 100644 --- a/drivers/mfd/max77620.c +++ b/drivers/mfd/max77620.c @@ -31,11 +31,10 @@ #include #include #include +#include #include #include -static struct max77620_chip *max77620_scratch; - static const struct resource gpio_resources[] = { DEFINE_RES_IRQ(MAX77620_IRQ_TOP_GPIO), }; @@ -483,13 +482,17 @@ static int max77620_read_es_version(struct max77620_chip *chip) return ret; } -static void max77620_pm_power_off(void) +static int max77620_pm_power_off(struct notifier_block *nb, + unsigned long reboot_mode, void *data) { - struct max77620_chip *chip = max77620_scratch; + struct max77620_chip *chip = container_of(nb, struct max77620_chip, + pm_off_nb); regmap_update_bits(chip->rmap, MAX77620_REG_ONOFFCNFG1, MAX77620_ONOFFCNFG1_SFT_RST, MAX77620_ONOFFCNFG1_SFT_RST); + + return NOTIFY_DONE; } static int max77620_probe(struct i2c_client *client, @@ -566,9 +569,14 @@ static int max77620_probe(struct i2c_client *client, } pm_off = of_device_is_system_power_controller(client->dev.of_node); - if (pm_off && !pm_power_off) { - max77620_scratch = chip; - pm_power_off = max77620_pm_power_off; + if (pm_off) { + chip->pm_off_nb.notifier_call = max77620_pm_power_off; + chip->pm_off_nb.priority = 128; + + ret = devm_register_poweroff_handler(chip->dev, &chip->pm_off_nb); + if (ret < 0) + dev_err(chip->dev, + "Failed to register poweroff handler: %d\n", ret); } return 0; diff --git a/include/linux/mfd/max77620.h b/include/linux/mfd/max77620.h index f552ef5b1100..99de4f8c9cbf 100644 --- a/include/linux/mfd/max77620.h +++ b/include/linux/mfd/max77620.h @@ -8,6 +8,7 @@ #ifndef _MFD_MAX77620_H_ #define _MFD_MAX77620_H_ +#include #include /* GLOBAL, PMIC, GPIO, FPS, ONOFFC, CID Registers */ @@ -327,6 +328,7 @@ enum max77620_chip_id { struct max77620_chip { struct device *dev; struct regmap *rmap; + struct notifier_block pm_off_nb; int chip_irq; From patchwork Thu Oct 7 06:02:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1537524 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20210112 header.b=WJQWWwK2; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4HQ14S50Zmz9sXS for ; Thu, 7 Oct 2021 17:04:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240275AbhJGGGa (ORCPT ); Thu, 7 Oct 2021 02:06:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52622 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240215AbhJGGGU (ORCPT ); Thu, 7 Oct 2021 02:06:20 -0400 Received: from mail-qt1-x835.google.com (mail-qt1-x835.google.com [IPv6:2607:f8b0:4864:20::835]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 994A0C061755; Wed, 6 Oct 2021 23:04:27 -0700 (PDT) Received: by mail-qt1-x835.google.com with SMTP id z24so395099qtv.9; Wed, 06 Oct 2021 23:04:27 -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:in-reply-to:references :mime-version:content-transfer-encoding; bh=IQB/PnOQ9jEZSlqGGpfAjGbsGvYCB4Ti4A1tjQkA4Pg=; b=WJQWWwK2XIbvfEXBeN3WMVtH7Db82eSl84Ns0cQ/2v0K7z/thZyEsdIWdnPhyb+aA9 ohxKQYgWVeYnJzF1ar7Mbowqnd7e8e4WD+NRrYDrRxcFrC9SivmDmDmWiEMDPl2ZibU7 pU0pZo/TqyOGE0YSDITOzdpcAJo3Bjdz+S7z2S9yHVEXNB+vYUA+/Dx3FU29MA+fAr26 sMcd+QhEFG+dpn6X9pRpuCO4n/LBZkSWaTx+yUGUwnnmEyP+x1KKMlXNWJnBISM+Rai4 P8tHyD3QlQrq9Pca8z9vzRCyX8NAMXMg+T3Wu/PlpJFVf7AzSRPO+iwJo4wUsQvSYGXR 7riA== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=IQB/PnOQ9jEZSlqGGpfAjGbsGvYCB4Ti4A1tjQkA4Pg=; b=5su3lbycjsXtB+tn45WXkYFW4/Ori73IdN+LRa0B7iKW3CLAie0/mNhhXRtB4c4mjN XFmPpNfgsDlsKAFFq/avTARYDhGoA1/Vim78fV9Z6wY131vlwJqtjZ/p1yrPVeJAk1k2 UY/Ag4uC0b+HSJ8m5OQ0wpVerkbid4ZJGvP+VcdQ5rhvNBqIePz6ORR0xsmqtYb2ZE5o Cok/4xo4BryIi2gkxvDUMnqHZT8EQ00U+iqe7121MaRj8dl5hnG/tevKKeo6pDpUqXse n6p+RqleMSxBIefknKHzBt6j4oOmgvbpm38Oip70GBEwLnqDIO192oI/RoJQ7Dw//9IF azDA== X-Gm-Message-State: AOAM5324/hguQKKaeKrelHxm25CWF7VxATK2So8XOIQ7460488aaFC2j XRNZrAH2kIYtsXMILQsSanI= X-Google-Smtp-Source: ABdhPJycIDhLRrYRu49xiD+NCip1ZF/+RA0PJKuKRi8bnKHJQeXVEOiPGqZrOVMYEiQKUyHlaafbOQ== X-Received: by 2002:ac8:6112:: with SMTP id a18mr2775450qtm.401.1633586666852; Wed, 06 Oct 2021 23:04:26 -0700 (PDT) Received: from localhost.localdomain (79-139-163-57.dynamic.spd-mgts.ru. [79.139.163.57]) by smtp.gmail.com with ESMTPSA id x79sm13235042qkb.65.2021.10.06.23.04.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Oct 2021 23:04:26 -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: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org Subject: [PATCH v1 5/6] soc/tegra: pmc: Use devm_register_restart_handler() Date: Thu, 7 Oct 2021 09:02:52 +0300 Message-Id: <20211007060253.17049-6-digetx@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211007060253.17049-1-digetx@gmail.com> References: <20211007060253.17049-1-digetx@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Use resource-managed variant of register_restart_handler() to make code cleaner. Signed-off-by: Dmitry Osipenko --- drivers/soc/tegra/pmc.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c index 50091c4ec948..dc9ad075ee4a 100644 --- a/drivers/soc/tegra/pmc.c +++ b/drivers/soc/tegra/pmc.c @@ -2859,6 +2859,13 @@ static int tegra_pmc_probe(struct platform_device *pdev) pmc->clk = NULL; } + err = devm_register_restart_handler(&pdev->dev, &tegra_pmc_restart_handler); + if (err) { + dev_err(&pdev->dev, "unable to register restart handler, %d\n", + err); + return err; + } + /* * PCLK clock rate can't be retrieved using CLK API because it * causes lockup if CPU enters LP2 idle state from some other @@ -2890,20 +2897,13 @@ static int tegra_pmc_probe(struct platform_device *pdev) goto cleanup_sysfs; } - err = register_restart_handler(&tegra_pmc_restart_handler); - if (err) { - dev_err(&pdev->dev, "unable to register restart handler, %d\n", - err); - goto cleanup_debugfs; - } - err = tegra_pmc_pinctrl_init(pmc); if (err) - goto cleanup_restart_handler; + goto cleanup_debugfs; err = tegra_pmc_regmap_init(pmc); if (err < 0) - goto cleanup_restart_handler; + goto cleanup_debugfs; err = tegra_powergate_init(pmc, pdev->dev.of_node); if (err < 0) @@ -2926,8 +2926,6 @@ static int tegra_pmc_probe(struct platform_device *pdev) cleanup_powergates: tegra_powergate_remove_all(pdev->dev.of_node); -cleanup_restart_handler: - unregister_restart_handler(&tegra_pmc_restart_handler); cleanup_debugfs: debugfs_remove(pmc->debugfs); cleanup_sysfs: From patchwork Thu Oct 7 06:02:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 1537525 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20210112 header.b=lhqw1eS6; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4HQ14m2LVKz9sXS for ; Thu, 7 Oct 2021 17:04:56 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240236AbhJGGGp (ORCPT ); Thu, 7 Oct 2021 02:06:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52662 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240265AbhJGGG3 (ORCPT ); Thu, 7 Oct 2021 02:06:29 -0400 Received: from mail-qk1-x72a.google.com (mail-qk1-x72a.google.com [IPv6:2607:f8b0:4864:20::72a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 642EEC061768; Wed, 6 Oct 2021 23:04:30 -0700 (PDT) Received: by mail-qk1-x72a.google.com with SMTP id q125so4933769qkd.12; Wed, 06 Oct 2021 23:04:30 -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:in-reply-to:references :mime-version:content-transfer-encoding; bh=AjmE6VeuEyL2QsLaDyUixanuKQ8JeVYXpqh+lIstwTs=; b=lhqw1eS6JVCxVYVw/4ep9L56P6tHseCPftpc5iQrus8h1JoH1nCjutvVTSp26TudPr vx0BsB0O7PX9DYaI0jRv/raDi3xwn1w5zq1RRxMUorG7q8BQ/TXyu9z3FgQ71JCRcwT/ Aigoht9RSFpF9fRfSsm6gu3aFUVsP5Dunha8mwnZUuc1TrGD0OxDMddAJR322HZGh8fb q0zBx5PO8ZdLNb4Z+4xzkeP+L+kKFnvY2PRQ7isFgU8AgKLEmhgAbb62zCKFxPz2JKJ4 6wxJ/4m78S1j0oayHuhboGUUKZVnbMQcF7lMkwdF/ZIZ85l49uEdWCuOIsnhMO/1xBU3 o4oQ== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=AjmE6VeuEyL2QsLaDyUixanuKQ8JeVYXpqh+lIstwTs=; b=xcmVUlEaDho2xElebVzQKyOMocVH24Qeo1YraQEbHu4F5c07xKjWhiHzdIze4z+B5c ex5Y4C1eQNAatUp1WBYAQz+KByxalmwjsiU014bQKmRHw9GM+9+fH/WiAZAuTCI95OIk r5TjK0fMtJ/5o3Q7f1zQnjQFAp+Qix1mwFJdlUCHXla4rdcuGmL2lhywR24pD/jL1uEn lp4Klpo6k7/d1JlVfWxw54g+7nv+wPBJ1My4Pax2B+44E33GvKhcGM2d8dE13axL7R4V PRLy5GWLL74vzJKT8WuQVQDXBdSlTLCvQU+F8+LDT6JDjinaOZOnLfwtSYca58Tz6Y1S G24g== X-Gm-Message-State: AOAM531lqEzGKtpHpWI9+3oI9sGRGs1ZFB5o9bzTkA+JMr4+XQRq+Usl UR6SEiwwLg1fBOPnwb5/5UlluZxnNws= X-Google-Smtp-Source: ABdhPJzUdkKDXGeOcDoog5HzF5lLmrBd3P1A2PZmqp7t4Y7eyd9UmIsTEg3eLvsBH/zb2/mlkrnbCg== X-Received: by 2002:a37:9fc1:: with SMTP id i184mr1842222qke.247.1633586669653; Wed, 06 Oct 2021 23:04:29 -0700 (PDT) Received: from localhost.localdomain (79-139-163-57.dynamic.spd-mgts.ru. [79.139.163.57]) by smtp.gmail.com with ESMTPSA id x79sm13235042qkb.65.2021.10.06.23.04.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 Oct 2021 23:04:29 -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: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org Subject: [PATCH v1 6/6] soc/tegra: pmc: Add power off handler Date: Thu, 7 Oct 2021 09:02:53 +0300 Message-Id: <20211007060253.17049-7-digetx@gmail.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20211007060253.17049-1-digetx@gmail.com> References: <20211007060253.17049-1-digetx@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Nexus 7 Android tablet can be turned off using a special bootloader command which is conveyed to bootloader by putting magic value into specific scratch register and then rebooting normally. This power off method should be invoked if USB cable is connected. Bootloader then will display battery status and power off the device. This behaviour is borrowed from downstream kernel and matches user expectations, otherwise it looks like device got hung during power off. Signed-off-by: Dmitry Osipenko --- drivers/soc/tegra/pmc.c | 42 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c index dc9ad075ee4a..44de043c2012 100644 --- a/drivers/soc/tegra/pmc.c +++ b/drivers/soc/tegra/pmc.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -107,6 +108,7 @@ #define PMC_USB_DEBOUNCE_DEL 0xec #define PMC_USB_AO 0xf0 +#define PMC_SCRATCH37 0x130 #define PMC_SCRATCH41 0x140 #define PMC_WAKE2_MASK 0x160 @@ -1063,10 +1065,8 @@ int tegra_pmc_cpu_remove_clamping(unsigned int cpuid) return tegra_powergate_remove_clamping(id); } -static int tegra_pmc_restart_notify(struct notifier_block *this, - unsigned long action, void *data) +static void tegra_pmc_restart(const char *cmd) { - const char *cmd = data; u32 value; value = tegra_pmc_scratch_readl(pmc, pmc->soc->regs->scratch0); @@ -1089,6 +1089,12 @@ static int tegra_pmc_restart_notify(struct notifier_block *this, value = tegra_pmc_readl(pmc, PMC_CNTRL); value |= PMC_CNTRL_MAIN_RST; tegra_pmc_writel(pmc, value, PMC_CNTRL); +} + +static int tegra_pmc_restart_notify(struct notifier_block *this, + unsigned long action, void *data) +{ + tegra_pmc_restart(data); return NOTIFY_DONE; } @@ -1098,6 +1104,29 @@ static struct notifier_block tegra_pmc_restart_handler = { .priority = 128, }; +static int tegra_pmc_poweroff_notify(struct notifier_block *this, + unsigned long action, void *data) +{ + /* + * Reboot Nexus 7 into special bootloader mode if USB cable is + * connected in order to display battery status and power off. + */ + if (of_machine_is_compatible("asus,grouper") && + power_supply_is_system_supplied()) { + const u32 go_to_charger_mode = 0xa5a55a5a; + + tegra_pmc_writel(pmc, go_to_charger_mode, PMC_SCRATCH37); + tegra_pmc_restart(NULL); + } + + return NOTIFY_DONE; +} + +static struct notifier_block tegra_pmc_poweroff_handler = { + .notifier_call = tegra_pmc_poweroff_notify, + .priority = 200, +}; + static int powergate_show(struct seq_file *s, void *data) { unsigned int i; @@ -2866,6 +2895,13 @@ static int tegra_pmc_probe(struct platform_device *pdev) return err; } + err = devm_register_poweroff_handler(&pdev->dev, &tegra_pmc_poweroff_handler); + if (err) { + dev_err(&pdev->dev, "unable to register poweroff handler, %d\n", + err); + return err; + } + /* * PCLK clock rate can't be retrieved using CLK API because it * causes lockup if CPU enters LP2 idle state from some other