Received: by 10.223.185.116 with SMTP id b49csp3265351wrg; Sun, 25 Feb 2018 18:25:33 -0800 (PST) X-Google-Smtp-Source: AH8x226nn5Vn2hQbtSaYBmm/Hy4yDg5odT0Mw/ZPHokbkUTwrLadgfnYxWVt4ZVafbyt9jgiz8uj X-Received: by 10.101.92.66 with SMTP id v2mr7193206pgr.341.1519611932899; Sun, 25 Feb 2018 18:25:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519611932; cv=none; d=google.com; s=arc-20160816; b=JViI5NzlhGc6mgNlCYB7BHIQhHqz66SwprNbkIXB3lWdz+tYJmzOot5SQA3GbjeYtJ aqW5oKjOde9hsZakcaMOJjtnpbuc0k1XxG4jXN4V7yFUFoVOsW9rob5TN9HQ6qH5IG7H hzA8HZuN6/A8k0XPh47TNn1UlWkOxv9UusCBY7r+WWjug+dpRlW/UmZQ1GN0984xMfal zQXrHXmaq5Q5DmH/U42u3ElsRZjZK1PDPVn0VH2v5cBe9827W61TgvdM9GwkYvfKzdnu lALPFoDGXg/C9NLQlCelPcuWi4buaj87m0C7uhVLYvB7wWHI5GWDQ7CqGrsCnm2iulmc 6vbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=Dg/T8kW/A2CkkhhF0OgTJ0Wjgsh9oxMzJy4eRNW+acU=; b=p4lLseXQK0w3DXyMxZygzmlm39fNvz713HQpiVHEdiVIlWCfXAPOYmi+D8V5PsJG/c NNr72/T+++lUYTsGD4CxUfhZNS9ninQbNfkTw3H9VuxUdGbYMc4378PdJ6qWdxHEysZx huoaXDqtEpv0eFM+JcFI9DUDIlbP6w4yTZ4nocpqDFpaRV5wz1Ch5EIZaDcDzxKh3iiH e4fOrJ/1ETV4n1Xqo/49WE6qiP9VkYxXS/qiaMkDCESKARae7Uu2rVXPHcn8xCsxG6My mmz/VB3u/crlYhzccWyEb1+DrVKQgM8ynbw5+dKx56ov+JMIA3PuGczbesfilG+moOLL EfsQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Xq4qE6f9; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n7si4907857pga.250.2018.02.25.18.25.05; Sun, 25 Feb 2018 18:25:32 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Xq4qE6f9; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752174AbeBZCX6 (ORCPT + 99 others); Sun, 25 Feb 2018 21:23:58 -0500 Received: from mail-pl0-f66.google.com ([209.85.160.66]:33947 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752143AbeBZCXu (ORCPT ); Sun, 25 Feb 2018 21:23:50 -0500 Received: by mail-pl0-f66.google.com with SMTP id u13so8440506plq.1 for ; Sun, 25 Feb 2018 18:23:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=Dg/T8kW/A2CkkhhF0OgTJ0Wjgsh9oxMzJy4eRNW+acU=; b=Xq4qE6f9Yf0rPO4rZVHNNKSItl4At3hBEmGHXmr0mT1L2d6yZ9ANmwIY5Km8VSnmaw /RXpi9TuapAXAZVRgLhY36uolPGY9pt8SXGQWgGDdB5ODjLbRRZpo4VUm91ZUxuzfOtc hXleqmajrBnoDo/SKa4bJ6M9Gia6G+6GVvpAw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Dg/T8kW/A2CkkhhF0OgTJ0Wjgsh9oxMzJy4eRNW+acU=; b=Hi0MtyxkxNYGBYt/SspDsWZBcdFkfzNygHzKgqvp/FrehJwXKYi8zwJ5ynqcAdxaaK 0iepSaRm8/ON80XMgI80nujencYxuooXubNeJpjgWvW68rOPthHr4t3HZ2OQ4FeZ0tB5 0q5SdaTJJZ3vdfRLQZkYO7HOZhXaGEgPw2HL7NcIQKnxvaPKmqz3c7fcT4SRFVN5sSHq JbTbNJBGfSocos6KYTUy/p84epALgD3+pU0MdcItv9ql1+YiWgJLtq4OPOV1j6Rq/9AN 8hnTEoy342L/vmTKJWyMDehnofaAe84qveyGaAToILfBwJwJa0VzDqn0C4Nb+Ris6eI1 QtBg== X-Gm-Message-State: APf1xPCwyAXhtDhiIU7dt9iAsRNavMd2bDjqvhNXHrNh/L2VMh1tYgJf diZTb/fc0Ml6yNuG+Ehde7e1jg== X-Received: by 2002:a17:902:d81:: with SMTP id 1-v6mr7976425plv.324.1519611829624; Sun, 25 Feb 2018 18:23:49 -0800 (PST) Received: from baolinwangubtpc.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id n12sm12172401pgp.20.2018.02.25.18.23.46 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 25 Feb 2018 18:23:48 -0800 (PST) From: Baolin Wang To: sre@kernel.org Cc: broonie@kernel.org, baolin.wang@linaro.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: [PATCH v4] power: reset: Add Spreadtrum SC27xx PMIC power off support Date: Mon, 26 Feb 2018 10:23:14 +0800 Message-Id: X-Mailer: git-send-email 1.7.9.5 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Spreadtrum platform, we need power off system through external SC27xx series PMICs including the SC2720, SC2721, SC2723, SC2730 and SC2731 chips. Thus this patch adds SC27xx series PMICs power-off support. Signed-off-by: Baolin Wang --- Changes since v3: - Add CONFIG_PM_SLEEP_SMP macro to avoid building error. Changes since v2: - Change to build-in this driver. Changes since v1: - Add remove interface. - Add regmap checking when probing the driver. - Add MODULE_ALIAS() --- drivers/power/reset/Kconfig | 9 +++++ drivers/power/reset/Makefile | 1 + drivers/power/reset/sc27xx-poweroff.c | 66 +++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 drivers/power/reset/sc27xx-poweroff.c diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig index ca0de1a..01543f5 100644 --- a/drivers/power/reset/Kconfig +++ b/drivers/power/reset/Kconfig @@ -227,5 +227,14 @@ config SYSCON_REBOOT_MODE register, then the bootloader can read it to take different action according to the mode. +config POWER_RESET_SC27XX + bool "Spreadtrum SC27xx PMIC power-off driver" + depends on MFD_SC27XX_PMIC || COMPILE_TEST + help + This driver supports powering off a system through + Spreadtrum SC27xx series PMICs. The SC27xx series + PMICs includes the SC2720, SC2721, SC2723, SC2730 + and SC2731 chips. + endif diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile index aeb65ed..225d645 100644 --- a/drivers/power/reset/Makefile +++ b/drivers/power/reset/Makefile @@ -27,3 +27,4 @@ obj-$(CONFIG_POWER_RESET_RMOBILE) += rmobile-reset.o obj-$(CONFIG_POWER_RESET_ZX) += zx-reboot.o obj-$(CONFIG_REBOOT_MODE) += reboot-mode.o obj-$(CONFIG_SYSCON_REBOOT_MODE) += syscon-reboot-mode.o +obj-$(CONFIG_POWER_RESET_SC27XX) += sc27xx-poweroff.o diff --git a/drivers/power/reset/sc27xx-poweroff.c b/drivers/power/reset/sc27xx-poweroff.c new file mode 100644 index 0000000..65c477e --- /dev/null +++ b/drivers/power/reset/sc27xx-poweroff.c @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2018 Spreadtrum Communications Inc. + * Copyright (C) 2018 Linaro Ltd. + */ + +#include +#include +#include +#include +#include +#include + +#define SC27XX_PWR_PD_HW 0xc2c +#define SC27XX_PWR_OFF_EN BIT(0) + +static struct regmap *regmap; + +/* + * On Spreadtrum platform, we need power off system through external SC27xx + * series PMICs, and it is one similar SPI bus mapped by regmap to access PMIC, + * which is not fast io access. + * + * So before stopping other cores, we need release other cores' resource by + * taking cpus down to avoid racing regmap or spi mutex lock when poweroff + * system through PMIC. + */ +void sc27xx_poweroff_shutdown(void) +{ +#ifdef CONFIG_PM_SLEEP_SMP + int cpu = smp_processor_id(); + + freeze_secondary_cpus(cpu); +#endif +} + +static struct syscore_ops poweroff_syscore_ops = { + .shutdown = sc27xx_poweroff_shutdown, +}; + +static void sc27xx_poweroff_do_poweroff(void) +{ + regmap_write(regmap, SC27XX_PWR_PD_HW, SC27XX_PWR_OFF_EN); +} + +static int sc27xx_poweroff_probe(struct platform_device *pdev) +{ + if (regmap) + return -EINVAL; + + regmap = dev_get_regmap(pdev->dev.parent, NULL); + if (!regmap) + return -ENODEV; + + pm_power_off = sc27xx_poweroff_do_poweroff; + register_syscore_ops(&poweroff_syscore_ops); + return 0; +} + +static struct platform_driver sc27xx_poweroff_driver = { + .probe = sc27xx_poweroff_probe, + .driver = { + .name = "sc27xx-poweroff", + }, +}; +builtin_platform_driver(sc27xx_poweroff_driver); -- 1.7.9.5