Received: by 10.223.176.5 with SMTP id f5csp304240wra; Thu, 8 Feb 2018 22:26:38 -0800 (PST) X-Google-Smtp-Source: AH8x225LRB5nUye1jCtbSCiByv0DsBcWju+R6tcuetg/joehYc0Jtjv4GeQ3AKrgrlYzqHR1eCRi X-Received: by 10.99.117.1 with SMTP id q1mr1484975pgc.350.1518157597937; Thu, 08 Feb 2018 22:26:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518157597; cv=none; d=google.com; s=arc-20160816; b=rT0sVYzMO759t4VRCIhPB9cSNkukvIFt6uyBg6fya45rvQ0xFDsJJImDt2dKLaIs2i kJAy3bPrgcPofCW1a3T18IE9Oua8R9OAl4M+r6r+E7UQBwaaxDmjFl+yH5fD3V8EqNzk 2NJUjA3UKt14JYD1Er2v+ZxpC6y5rzLE+cZMLgczHRDrHLeTMr7NREdBk+GYZIclaVOr KKGCCUr3Z6MeGeufOnWh8pUebWhRy0diw6D++TWsvS3eaWWQoKV3DNSiJccT4x8rPfUY IJe3/GAPOhqkyzTjA0VVPuWo7GfBji5u+N2F1KnAD6H8Y2tBgByNn6dLi/WlyGSsu0Hw sAFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=Ab8T1oICPWz5C+pQStEMCN8qQP4aiPxWppqXIN1HxL4=; b=V7ujAtr3axDPVxp6EUEQ9QrkE3/xLX1MVxJEqEKIG7tPp+Zym/ZMc9krsq0HytYZkj oT1ozEjqt0TNy6Mu3G33QDKRIlar7fy+iQwzeS5PKRs+CzTJrC2GcwcfRZYeTb0Pkrc2 qjdgl3RLgcAzmw0G8QCo+8xBSQMy7giwYSzW4jJ/A5wLBuVQUklcL3UeXGE3jBMgpf5l ImZixqQc61wRXh6dE3cC2/xuRWatoaY8OZqJwdSZg57BagUCuxksp6sv1anYLoLFpdqc ZRchijQp+mHJe+VznWIQsr/6INWPZxJD/QG4WtdkZHHsHHUZLVz0Ovc8HFs+IgpMJP/5 daSg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=f2n+Txbg; 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 s9si992123pgn.281.2018.02.08.22.26.22; Thu, 08 Feb 2018 22:26:37 -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=f2n+Txbg; 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 S1751037AbeBIGZn (ORCPT + 99 others); Fri, 9 Feb 2018 01:25:43 -0500 Received: from mail-ot0-f195.google.com ([74.125.82.195]:45864 "EHLO mail-ot0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750878AbeBIGZl (ORCPT ); Fri, 9 Feb 2018 01:25:41 -0500 Received: by mail-ot0-f195.google.com with SMTP id 73so6680007oti.12 for ; Thu, 08 Feb 2018 22:25:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=Ab8T1oICPWz5C+pQStEMCN8qQP4aiPxWppqXIN1HxL4=; b=f2n+TxbgYYzWKydHGtfGYG8ENbrUbHtTpmXjnSaSr2xSz8B8k56eMDqZetBSpRqqHs qOhHsMC6awOmnNQbA/zh1s6W34H7rZlMMCRZks4kue3Xr1aMJifBQayLI8VJd0iRKf4v 0RRY07ZKImydPd8jmAbjruOoGTOGbnd3ewuDk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Ab8T1oICPWz5C+pQStEMCN8qQP4aiPxWppqXIN1HxL4=; b=EVIyzUWm/8M9wj3xIpgHhBw/xrIx/w5tAsKv6I6Van+1r+//F43aGoWpW3448iR52y 1lo/4sSGhe8SnLAAQk/LH0e+SPCURdoaRKAMr3kuuMZRbeLBTYdULAUca/ewh+z8vnCf Vtfdres3NaDJE01NJhBESLzy0TnWuKOc5d9vmRHHIzOoSOHlDAlDqG6txTDAfszWjwU0 W4GSmYy5sYHvgNzK3jp64VAwouwxl1ZVg5KyH33fWrP/uXqbz85Gwae7Rk5nNe3yytG5 o3q09AGEKNNVxmOXcYmCG1XQVSjdBhUpEjsMwacBm/htNHAyTBOXYInieVfEK3koxKKM l3fg== X-Gm-Message-State: APf1xPCyGtdm2jT19bhiPRTv2THNeuH2/rAo/qI/Wh9PpNXt+F7UGX8w dhDMwPF2z7GPBZ0MU+Bg6gqUfL8/8BksbUzUFeTlji7PGOE= X-Received: by 10.157.51.87 with SMTP id u23mr1424886otd.26.1518157541113; Thu, 08 Feb 2018 22:25:41 -0800 (PST) MIME-Version: 1.0 Received: by 10.157.28.174 with HTTP; Thu, 8 Feb 2018 22:25:40 -0800 (PST) In-Reply-To: <20180208215012.nrfhnr56r5jeb7vt@earth.universe> References: <5822b56a4e65e27183f8bf712d5889b11f90111e.1515118527.git.baolin.wang@linaro.org> <20180208215012.nrfhnr56r5jeb7vt@earth.universe> From: Baolin Wang Date: Fri, 9 Feb 2018 14:25:40 +0800 Message-ID: Subject: Re: [PATCH] power: reset: Add Spreadtrum SC27xx PMIC power off support To: Sebastian Reichel Cc: Arnd Bergmann , Mark Brown , LKML , Linux PM list Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Sebastian, On 9 February 2018 at 05:50, Sebastian Reichel wrote: > Hi Baolin, > > On Mon, Jan 15, 2018 at 03:58:57PM +0800, Baolin Wang wrote: >> 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 >> >> 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) >> +{ > > if (regmap) > return -EINVAL; OK. > >> + 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 void sc27xx_poweroff_remove(struct platform_device *pdev) { > if (pm_power_off == sc27xx_poweroff_do_poweroff) > pm_power_off = NULL; > regmap = NULL; > } OK. I will add it in next version. > >> +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_DESCRIPTION("Spreadtrum SC27xx PMIC Poweroff Driver"); >> +MODULE_LICENSE("GPL v2"); > > MODULE_ALIAS("platform:sc27xx-poweroff"); OK. Thanks for your comments. -- Baolin.wang Best Regards