From patchwork Mon Jan 15 07:58:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "\(Exiting\) Baolin Wang" X-Patchwork-Id: 124477 Delivered-To: patch@linaro.org Received: by 10.46.64.148 with SMTP id r20csp589676lje; Sun, 14 Jan 2018 23:59:41 -0800 (PST) X-Google-Smtp-Source: ACJfBou40xyUVAEmVdiNfFZWfee4++NqvlXKgBQ4rGpZahr+TV1GSbTZ5hmO2f6HQzQZLGcmgxL2 X-Received: by 10.159.230.16 with SMTP id u16mr19310517plq.401.1516003181796; Sun, 14 Jan 2018 23:59:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516003181; cv=none; d=google.com; s=arc-20160816; b=08gqClWqGN3K1c2uXmQQopAeL1uOQqJufuSjCCsS/KQ3vyDOqsNJKklXlJm1pum9Jb BqYT+u3kwzzwWWSA+LSUvsv/uYJnKbHb4k2vJz6eWB38M6m1wcrkq1VChAjMmqyEG8QR J+BPyYOn8ghxE4xAg33cqh1w2irpyjV+bV5VYXDBHL6+wfSfPlwc8cJGw+InzcVaRsXn dCuHrAKTBGa3Czf2XDzinBxmGSsgT0+zEprXBj21tlcPv6e5lTSuu5EO65MNkn19nUUA 616dxNV+EV1LolBfgE+qYdXj41KiBvAWRUoBGbrgRJobpm+x4m3gIL9X3eYyvgomFTQN Wx2A== 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=6iei+w5bTLpya43nD0oXC0eEDmxIiAzMNHuxNkITjDs=; b=QSD5gTVqWxY1koHklAvvWVdNU1AeHmfDdOUpup+cHelQe3EaWJ5LVYe4FY7umuFCQO k6It/4DbxWsETDkQZhGhfu2cu6Rz9haly2uVD5AZf2eXjS3D+VcSuX5YMKnkPha7P3ca +q/ysnJjHJs8ePfc4ewqPh3VTzrGZKMBwkMhxeFnzoBPDnrfx72owsp9UZnaWDN521hM WcBJmgSDxNdvTZLmJitYRhvPnlc+Dhu4dr4lYh0PgnmggdBsUchZXskQSw1dENXog8jF R7bOeHUw5MvTe4H61m9q5jHNnwAkSyKz7+3+XvBMUU8yXGTsmuHWfqt7aQehC3J9FC6S RzRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BAJVPtUI; 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 d123si10670270pfg.70.2018.01.14.23.59.41; Sun, 14 Jan 2018 23:59:41 -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=BAJVPtUI; 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 S1754496AbeAOH7k (ORCPT + 28 others); Mon, 15 Jan 2018 02:59:40 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:41907 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754346AbeAOH7h (ORCPT ); Mon, 15 Jan 2018 02:59:37 -0500 Received: by mail-pg0-f68.google.com with SMTP id 136so7040374pgd.8 for ; Sun, 14 Jan 2018 23:59:37 -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=6iei+w5bTLpya43nD0oXC0eEDmxIiAzMNHuxNkITjDs=; b=BAJVPtUIu+M3VsD2xIagzIOumCymlxbsjZcyxEBkgPPLqYTPki/n1cK5WBCMFXiph9 lqayOlx/SSOSgI+WqBrvQ3KcdiROUd3KB5xPq1JHtJPqeybLP2EYQWIh9IMnmLLnA1HH HC69tYuV79IWqUz/9TBdz8CVXoCi7X+2B9wpU= 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=6iei+w5bTLpya43nD0oXC0eEDmxIiAzMNHuxNkITjDs=; b=P4Mx1V79f57T2/n0pIAnu0LVGYBNtLMtu3LFeAm+QgpNUC59OjoHKOo0S7PYCyD18I 4UAZIgI7H35L3mg/e3lI0sG++rsvl+j4jPcs2OTHAcqzWSx9g/ovECBb/4ila3bfmwa7 1XxPzQqDWKh2YJkzGywFr9FVoRvLr/OkvZOfeMuaqlL1q8a+vcPH9aDmtHKLyVVbvzyJ YPYyekfwToFnIIcL7oLplFoYaTq6yvLg6RqYr79iWJ9fHFb0gZZHgMVRyGRrtIfbgAmG LbRKWeUrgcqWxdISx7NmAk1KcofWUNeigqWwwuwBBmIg16NIJciO4Cnk+fJztyS7aayF arsg== X-Gm-Message-State: AKwxytdztI+lMXcyzxvkPaQkwRgGNVduVBjucQrr+TUMEan3ypGZO3T1 7AwsJs3HvFNRAxl1fe5HNeKBkg== X-Received: by 10.99.170.73 with SMTP id x9mr8864505pgo.393.1516003176663; Sun, 14 Jan 2018 23:59:36 -0800 (PST) Received: from baolinwangubtpc.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id g69sm13926638pgc.32.2018.01.14.23.59.33 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 14 Jan 2018 23:59:36 -0800 (PST) From: Baolin Wang To: sre@kernel.org Cc: arnd@arndb.de, broonie@kernel.org, baolin.wang@linaro.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: [PATCH] power: reset: Add Spreadtrum SC27xx PMIC power off support Date: Mon, 15 Jan 2018 15:58:57 +0800 Message-Id: <5822b56a4e65e27183f8bf712d5889b11f90111e.1515118527.git.baolin.wang@linaro.org> 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 --- drivers/power/reset/Kconfig | 9 +++++ drivers/power/reset/Makefile | 1 + drivers/power/reset/sc27xx-poweroff.c | 65 +++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 drivers/power/reset/sc27xx-poweroff.c -- 1.7.9.5 diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig index ca0de1a..611ae56 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 + tristate "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..8e4b6a0 --- /dev/null +++ b/drivers/power/reset/sc27xx-poweroff.c @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2017 Spreadtrum Communications Inc. + * Copyright (c) 2017 Linaro Ltd. + */ + +#include +#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) +{ + int cpu = smp_processor_id(); + + freeze_secondary_cpus(cpu); +} + +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) +{ + 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", + }, +}; +module_platform_driver(sc27xx_poweroff_driver); + +MODULE_DESCRIPTION("Spreadtrum SC27xx PMIC Poweroff Driver"); +MODULE_LICENSE("GPL v2");