Received: by 10.223.176.5 with SMTP id f5csp456124wra; Fri, 9 Feb 2018 01:45:04 -0800 (PST) X-Google-Smtp-Source: AH8x2264zPVqzW5ZLbi833CE0lZo/hyvfmsDcgxFBoQRnCkQ2lg5TH7e1kuDXed+0iSp3lBxcAqj X-Received: by 2002:a17:902:bb8d:: with SMTP id m13-v6mr2007878pls.49.1518169504226; Fri, 09 Feb 2018 01:45:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518169504; cv=none; d=google.com; s=arc-20160816; b=ei1OZ9x7YrvBw2vyJNh02smFSHE13I0vXL4Afj+Q4Y2knBaXVHq31E/t3F3qhm1SQO vHjX3YzHtJwO5/AfwpRRL5TTRPwdGMYnTSEsy9gsV4r5geJA+KOXFC2cZLrms6UbKOvX qD4nTEJzyJmXUo6WzbOz8lJr1BxJ4YkGFl/yMDh/CiW4N4CWqYCL3n2/HrldtU+BcORT iDQRXUaRkfoZjBdxuw+bD5x4XIHmPEX6Qs8RpHZ8e9sKX4ESTRDqlloluHfPcu+xR/mC N6ZCQ8Kn20lKXr0ikq8a6eb7iK8pAp1efQC+kqgKIfsOK4wQFfje18JP0uPdyDxZWpXj tjzg== 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=BjG5xum631wTNCzVAcnwi7nb06Tld78UuW5Pc25CL0U=; b=OqvZ6mimZ0VFPh8CCaWYG0jYo466M4XPKAthOoiMvlDc5PyLRWpVU70sZa/jl0u+Z/ 89FPh7N7KWcEHIKp8kg/6nMz02KYP1h/z2aTckV8w5f7gwivQto/eOVKm/4eDZuBCVOL ZN6RWHmCkMvEi0FSJtYlQLsUFWIp87jiXR8s4wg4DPX7XHEZQsZGqi3/AqaSLbCXZ4P1 nHYc00ZpTvfw8C+XEkwOSlQGVkyjgFEcTAIqIehvvkXtf6xL8NVd8pMy+5HpX+ztzyrj 1rvca4osppp9idpqZ8d0VK0MpYjIhrrD3BcKEIAycx02PhqirQkS8SoDY4onlQuJETn8 /wHw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ZqgNYuYI; 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 34-v6si1308931plc.650.2018.02.09.01.44.50; Fri, 09 Feb 2018 01:45:04 -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=ZqgNYuYI; 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 S1751071AbeBIJoG (ORCPT + 99 others); Fri, 9 Feb 2018 04:44:06 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:34730 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750924AbeBIJoE (ORCPT ); Fri, 9 Feb 2018 04:44:04 -0500 Received: by mail-pg0-f66.google.com with SMTP id s73so3278228pgc.1 for ; Fri, 09 Feb 2018 01:44:04 -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=BjG5xum631wTNCzVAcnwi7nb06Tld78UuW5Pc25CL0U=; b=ZqgNYuYIFoZ4ov2M8Wmcv3nRC+rx4UHTZQEv+kmMeP9CuMSMZ4TCGpNzFj5YV+1YoF 91wXSAzlUDvx0ZpvOE+8jwVVFOG6Qycvk4r+AYXCO2SWjJR0NRfs0LKZMWEcvOq8UUfV xz+VQMvjBjU+xLjYhYMxfy+FGxxUoPSH2ll9E= 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=BjG5xum631wTNCzVAcnwi7nb06Tld78UuW5Pc25CL0U=; b=Kf+N1gI093isM9nvcWp0fbxxrjgk+LBuiOKkW+pIRrLIR5J5p2ZYgGUarzcc+LNwKt Tr6CyuMWi78t+yyEJeqvQEloaki4nu1YEi/pguA89lxHIlNcbY7msz9zDqltudcOWVpc gobRycFpcgM/bVKYcorW/39UAUyZMQIAsTIieqLyf8sS8ib1x892JOhcxxwqqlB7Gbzi H48qo9snh6d/T1xl3ZAqwvZuGWyijCDa4bloFv4EfRJU6Cgxw4B4sp68XOsz1fXEHy8O /M0/obYAfxEb3yCBYr1ni2A5mP7dEenspnsaP6kfdLtBXpM8nGMCvwdj7Hx/4zFkaveh fWAg== X-Gm-Message-State: APf1xPACMcOtbJkcuDbgKuXWgBWpAGhMuP5Ktd+YLkDi6AlqoTOx+jku A4Zv4Qwrj6JH5JsiJ3Il6l+ETSuMacM= X-Received: by 10.101.80.69 with SMTP id k5mr1870152pgo.433.1518169443732; Fri, 09 Feb 2018 01:44:03 -0800 (PST) Received: from baolinwangubtpc.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id 87sm4319835pft.122.2018.02.09.01.44.01 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 09 Feb 2018 01:44:03 -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 v2] power: reset: Add Spreadtrum SC27xx PMIC power off support Date: Fri, 9 Feb 2018 17:43:38 +0800 Message-Id: <7655f39d44e804c9ed3209db475567abc250f642.1518169282.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 --- 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 | 79 +++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 drivers/power/reset/sc27xx-poweroff.c 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..73d9816 --- /dev/null +++ b/drivers/power/reset/sc27xx-poweroff.c @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2018 Spreadtrum Communications Inc. + * Copyright (C) 2018 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) +{ + 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 int sc27xx_poweroff_remove(struct platform_device *pdev) +{ + if (pm_power_off == sc27xx_poweroff_do_poweroff) + pm_power_off = NULL; + + regmap = NULL; + return 0; +} + +static struct platform_driver sc27xx_poweroff_driver = { + .probe = sc27xx_poweroff_probe, + .remove = sc27xx_poweroff_remove, + .driver = { + .name = "sc27xx-poweroff", + }, +}; +module_platform_driver(sc27xx_poweroff_driver); + +MODULE_ALIAS("platform:sc27xx-poweroff"); +MODULE_DESCRIPTION("Spreadtrum SC27xx PMIC Poweroff Driver"); +MODULE_LICENSE("GPL v2"); -- 1.7.9.5