All of lore.kernel.org
 help / color / mirror / Atom feed
From: <sean.wang@mediatek.com>
To: <robh+dt@kernel.org>, <mark.rutland@arm.com>, <sre@kernel.org>,
	<lee.jones@linaro.org>, <a.zummo@towertech.it>,
	<alexandre.belloni@free-electrons.com>,
	<eddie.huang@mediatek.com>
Cc: <devicetree@vger.kernel.org>, <linux-rtc@vger.kernel.org>,
	<linux-pm@vger.kernel.org>, <linux-mediatek@lists.infradead.org>,
	<linux-kernel@vger.kernel.org>,
	Sean Wang <sean.wang@mediatek.com>
Subject: [PATCH v1 14/16] power: reset: mediatek: add a power-off driver using PMIC RTC device
Date: Fri, 23 Mar 2018 17:15:11 +0800	[thread overview]
Message-ID: <ba7cd65b58f335b44896bd671f8b0f851d04fc01.1521794177.git.sean.wang@mediatek.com> (raw)
In-Reply-To: <cover.1521794176.git.sean.wang@mediatek.com>

From: Sean Wang <sean.wang@mediatek.com>

The power device is responsible for externally down or up the power
of the remote MediaTek SoC through the tiny circuit BBPU inside PMIC RTC.

Though it's a part of RTC device, it would be better to be a standalone
driver against existent RTC driver so as to make concentration on works
about power-controlling topic and help gather more improvements while the
subsystem's constantly growing.

Currently, the most basic functionality supported is to just power off the
system by writing to a special bit field in BBPU register after the system
has reached pm_poweroff.

Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
 drivers/power/reset/Kconfig               |   9 +++
 drivers/power/reset/Makefile              |   1 +
 drivers/power/reset/mt6397-rtc-poweroff.c | 100 ++++++++++++++++++++++++++++++
 include/linux/rtc/mt6397.h                |   1 +
 4 files changed, 111 insertions(+)
 create mode 100644 drivers/power/reset/mt6397-rtc-poweroff.c

diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
index a102e74..0bd4603 100644
--- a/drivers/power/reset/Kconfig
+++ b/drivers/power/reset/Kconfig
@@ -121,6 +121,15 @@ config POWER_RESET_LTC2952
 	  This driver supports an external powerdown trigger and board power
 	  down via the LTC2952. Bindings are made in the device tree.
 
+config POWER_RESET_MT6397_RTC
+	bool "MediaTek MT6397 RTC power-off driver"
+	help
+	  This driver supports turning off a remote MediaTek SoC by
+	  controlling BBPU on MT6397 or MT6323 RTC.
+
+	  Select this if you're building a kernel with your MediaTek SoC
+	  with an equipment with MT6397 or MT6323 PMIC.
+
 config POWER_RESET_QNAP
 	bool "QNAP power-off driver"
 	depends on OF_GPIO && PLAT_ORION
diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile
index dcc92f5..d45099e 100644
--- a/drivers/power/reset/Makefile
+++ b/drivers/power/reset/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o
 obj-$(CONFIG_POWER_RESET_GPIO_RESTART) += gpio-restart.o
 obj-$(CONFIG_POWER_RESET_HISI) += hisi-reboot.o
 obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o
+obj-$(CONFIG_POWER_RESET_MT6397_RTC) += mt6397-rtc-poweroff.o
 obj-$(CONFIG_POWER_RESET_PIIX4_POWEROFF) += piix4-poweroff.o
 obj-$(CONFIG_POWER_RESET_LTC2952) += ltc2952-poweroff.o
 obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o
diff --git a/drivers/power/reset/mt6397-rtc-poweroff.c b/drivers/power/reset/mt6397-rtc-poweroff.c
new file mode 100644
index 0000000..9b57366
--- /dev/null
+++ b/drivers/power/reset/mt6397-rtc-poweroff.c
@@ -0,0 +1,100 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Power-off using MediaTek PMIC RTC device
+ *
+ * Copyright (C) 2018 MediaTek Inc.
+ *
+ * Author: Sean Wang <sean.wang@mediatek.com>
+ *
+ */
+
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/rtc/mt6397.h>
+
+struct mt6397_rtc_powercon {
+	struct device *dev;
+	struct mt6397_rtc *rtc;
+};
+
+static struct mt6397_rtc_powercon *mt_powercon;
+
+static void mt6397_rtc_do_poweroff(void)
+{
+	struct mt6397_rtc_powercon *powercon = mt_powercon;
+	struct mt6397_rtc *rtc = powercon->rtc;
+	unsigned int val;
+	int ret;
+
+	regmap_write(rtc->regmap, rtc->addr_base + RTC_BBPU, RTC_BBPU_KEY);
+	regmap_write(rtc->regmap, rtc->addr_base + RTC_WRTGR, 1);
+
+	ret = regmap_read_poll_timeout(rtc->regmap,
+				       rtc->addr_base + RTC_BBPU, val,
+				       !(val & RTC_BBPU_CBUSY),
+				       MTK_RTC_POLL_DELAY_US,
+				       MTK_RTC_POLL_TIMEOUT);
+	if (ret)
+		dev_err(powercon->dev, "failed to write BBPU: %d\n", ret);
+
+	/* Wait some time until system down, otherwise, notice with a warn */
+	mdelay(1000);
+
+	WARN_ONCE(1, "Unable to poweroff system\n");
+}
+
+static int mt6397_rtc_poweroff_probe(struct platform_device *pdev)
+{
+	struct mt6397_rtc *rtc = dev_get_drvdata(pdev->dev.parent);
+	struct mt6397_rtc_powercon *powercon;
+
+	if (!rtc) {
+		dev_err(&pdev->dev, "Can't find RTC as the parent\n");
+		return -ENODEV;
+	}
+
+	powercon = devm_kzalloc(&pdev->dev, sizeof(*powercon), GFP_KERNEL);
+	if (!powercon)
+		return -ENOMEM;
+
+	powercon->dev = &pdev->dev;
+	powercon->rtc = rtc;
+	mt_powercon = powercon;
+
+	pm_power_off = &mt6397_rtc_do_poweroff;
+
+	return 0;
+}
+
+static int mt6397_rtc_poweroff_remove(struct platform_device *pdev)
+{
+	if (pm_power_off == &mt6397_rtc_do_poweroff)
+		pm_power_off = NULL;
+
+	return 0;
+}
+
+static const struct of_device_id mt6397_rtc_poweroff_dt_match[] = {
+	{ .compatible = "mediatek,mt6323-rtc-poweroff" },
+	{ .compatible = "mediatek,mt6397-rtc-poweroff" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, mt6397_rtc_poweroff_dt_match);
+
+static struct platform_driver mt6397_rtc_poweroff_driver = {
+	.probe		= mt6397_rtc_poweroff_probe,
+	.remove		= mt6397_rtc_poweroff_remove,
+	.driver		= {
+		.name	= "mt6397-rtc-poweroff",
+		.of_match_table = mt6397_rtc_poweroff_dt_match,
+	},
+};
+
+module_platform_driver(mt6397_rtc_poweroff_driver);
+
+MODULE_DESCRIPTION("Poweroff driver using MediaTek PMIC RTC");
+MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:mt6397-rtc-poweroff");
diff --git a/include/linux/rtc/mt6397.h b/include/linux/rtc/mt6397.h
index 4b19f51..e618974 100644
--- a/include/linux/rtc/mt6397.h
+++ b/include/linux/rtc/mt6397.h
@@ -17,6 +17,7 @@
 
 #define RTC_BBPU		0x0000
 #define RTC_BBPU_CBUSY		BIT(6)
+#define RTC_BBPU_KEY            (0x43 << 8)
 
 #define RTC_WRTGR		0x003c
 
-- 
2.7.4

WARNING: multiple messages have this Message-ID (diff)
From: <sean.wang@mediatek.com>
To: robh+dt@kernel.org, mark.rutland@arm.com, sre@kernel.org,
	lee.jones@linaro.org, a.zummo@towertech.it,
	alexandre.belloni@free-electrons.com, eddie.huang@mediatek.com
Cc: devicetree@vger.kernel.org, linux-rtc@vger.kernel.org,
	linux-pm@vger.kernel.org, linux-mediatek@lists.infradead.org,
	linux-kernel@vger.kernel.org, Sean Wang <sean.wang@mediatek.com>
Subject: [PATCH v1 14/16] power: reset: mediatek: add a power-off driver using PMIC RTC device
Date: Fri, 23 Mar 2018 17:15:11 +0800	[thread overview]
Message-ID: <ba7cd65b58f335b44896bd671f8b0f851d04fc01.1521794177.git.sean.wang@mediatek.com> (raw)
In-Reply-To: <cover.1521794176.git.sean.wang@mediatek.com>

From: Sean Wang <sean.wang@mediatek.com>

The power device is responsible for externally down or up the power
of the remote MediaTek SoC through the tiny circuit BBPU inside PMIC RTC.

Though it's a part of RTC device, it would be better to be a standalone
driver against existent RTC driver so as to make concentration on works
about power-controlling topic and help gather more improvements while the
subsystem's constantly growing.

Currently, the most basic functionality supported is to just power off the
system by writing to a special bit field in BBPU register after the system
has reached pm_poweroff.

Signed-off-by: Sean Wang <sean.wang@mediatek.com>
---
 drivers/power/reset/Kconfig               |   9 +++
 drivers/power/reset/Makefile              |   1 +
 drivers/power/reset/mt6397-rtc-poweroff.c | 100 ++++++++++++++++++++++++++++++
 include/linux/rtc/mt6397.h                |   1 +
 4 files changed, 111 insertions(+)
 create mode 100644 drivers/power/reset/mt6397-rtc-poweroff.c

diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
index a102e74..0bd4603 100644
--- a/drivers/power/reset/Kconfig
+++ b/drivers/power/reset/Kconfig
@@ -121,6 +121,15 @@ config POWER_RESET_LTC2952
 	  This driver supports an external powerdown trigger and board power
 	  down via the LTC2952. Bindings are made in the device tree.
 
+config POWER_RESET_MT6397_RTC
+	bool "MediaTek MT6397 RTC power-off driver"
+	help
+	  This driver supports turning off a remote MediaTek SoC by
+	  controlling BBPU on MT6397 or MT6323 RTC.
+
+	  Select this if you're building a kernel with your MediaTek SoC
+	  with an equipment with MT6397 or MT6323 PMIC.
+
 config POWER_RESET_QNAP
 	bool "QNAP power-off driver"
 	depends on OF_GPIO && PLAT_ORION
diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile
index dcc92f5..d45099e 100644
--- a/drivers/power/reset/Makefile
+++ b/drivers/power/reset/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o
 obj-$(CONFIG_POWER_RESET_GPIO_RESTART) += gpio-restart.o
 obj-$(CONFIG_POWER_RESET_HISI) += hisi-reboot.o
 obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o
+obj-$(CONFIG_POWER_RESET_MT6397_RTC) += mt6397-rtc-poweroff.o
 obj-$(CONFIG_POWER_RESET_PIIX4_POWEROFF) += piix4-poweroff.o
 obj-$(CONFIG_POWER_RESET_LTC2952) += ltc2952-poweroff.o
 obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o
diff --git a/drivers/power/reset/mt6397-rtc-poweroff.c b/drivers/power/reset/mt6397-rtc-poweroff.c
new file mode 100644
index 0000000..9b57366
--- /dev/null
+++ b/drivers/power/reset/mt6397-rtc-poweroff.c
@@ -0,0 +1,100 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Power-off using MediaTek PMIC RTC device
+ *
+ * Copyright (C) 2018 MediaTek Inc.
+ *
+ * Author: Sean Wang <sean.wang@mediatek.com>
+ *
+ */
+
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/rtc/mt6397.h>
+
+struct mt6397_rtc_powercon {
+	struct device *dev;
+	struct mt6397_rtc *rtc;
+};
+
+static struct mt6397_rtc_powercon *mt_powercon;
+
+static void mt6397_rtc_do_poweroff(void)
+{
+	struct mt6397_rtc_powercon *powercon = mt_powercon;
+	struct mt6397_rtc *rtc = powercon->rtc;
+	unsigned int val;
+	int ret;
+
+	regmap_write(rtc->regmap, rtc->addr_base + RTC_BBPU, RTC_BBPU_KEY);
+	regmap_write(rtc->regmap, rtc->addr_base + RTC_WRTGR, 1);
+
+	ret = regmap_read_poll_timeout(rtc->regmap,
+				       rtc->addr_base + RTC_BBPU, val,
+				       !(val & RTC_BBPU_CBUSY),
+				       MTK_RTC_POLL_DELAY_US,
+				       MTK_RTC_POLL_TIMEOUT);
+	if (ret)
+		dev_err(powercon->dev, "failed to write BBPU: %d\n", ret);
+
+	/* Wait some time until system down, otherwise, notice with a warn */
+	mdelay(1000);
+
+	WARN_ONCE(1, "Unable to poweroff system\n");
+}
+
+static int mt6397_rtc_poweroff_probe(struct platform_device *pdev)
+{
+	struct mt6397_rtc *rtc = dev_get_drvdata(pdev->dev.parent);
+	struct mt6397_rtc_powercon *powercon;
+
+	if (!rtc) {
+		dev_err(&pdev->dev, "Can't find RTC as the parent\n");
+		return -ENODEV;
+	}
+
+	powercon = devm_kzalloc(&pdev->dev, sizeof(*powercon), GFP_KERNEL);
+	if (!powercon)
+		return -ENOMEM;
+
+	powercon->dev = &pdev->dev;
+	powercon->rtc = rtc;
+	mt_powercon = powercon;
+
+	pm_power_off = &mt6397_rtc_do_poweroff;
+
+	return 0;
+}
+
+static int mt6397_rtc_poweroff_remove(struct platform_device *pdev)
+{
+	if (pm_power_off == &mt6397_rtc_do_poweroff)
+		pm_power_off = NULL;
+
+	return 0;
+}
+
+static const struct of_device_id mt6397_rtc_poweroff_dt_match[] = {
+	{ .compatible = "mediatek,mt6323-rtc-poweroff" },
+	{ .compatible = "mediatek,mt6397-rtc-poweroff" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, mt6397_rtc_poweroff_dt_match);
+
+static struct platform_driver mt6397_rtc_poweroff_driver = {
+	.probe		= mt6397_rtc_poweroff_probe,
+	.remove		= mt6397_rtc_poweroff_remove,
+	.driver		= {
+		.name	= "mt6397-rtc-poweroff",
+		.of_match_table = mt6397_rtc_poweroff_dt_match,
+	},
+};
+
+module_platform_driver(mt6397_rtc_poweroff_driver);
+
+MODULE_DESCRIPTION("Poweroff driver using MediaTek PMIC RTC");
+MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:mt6397-rtc-poweroff");
diff --git a/include/linux/rtc/mt6397.h b/include/linux/rtc/mt6397.h
index 4b19f51..e618974 100644
--- a/include/linux/rtc/mt6397.h
+++ b/include/linux/rtc/mt6397.h
@@ -17,6 +17,7 @@
 
 #define RTC_BBPU		0x0000
 #define RTC_BBPU_CBUSY		BIT(6)
+#define RTC_BBPU_KEY            (0x43 << 8)
 
 #define RTC_WRTGR		0x003c
 
-- 
2.7.4

  parent reply	other threads:[~2018-03-23  9:15 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-23  9:14 [PATCH v1 00/16] Add support to MT6323 RTC and its power device sean.wang
2018-03-23  9:14 ` sean.wang
2018-03-23  9:14 ` [PATCH v1 01/16] dt-bindings: power: reset: mediatek: add bindings for " sean.wang
2018-03-23  9:14   ` sean.wang
2018-03-26 22:24   ` Rob Herring
2018-03-27  3:21     ` Sean Wang
2018-03-27  3:21       ` Sean Wang
2018-03-23  9:14 ` [PATCH v1 02/16] dt-bindings: rtc: mediatek: add bindings for PMIC RTC sean.wang
2018-03-23  9:14   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-23  9:41   ` Alexandre Belloni
2018-03-23 10:15     ` Alexandre Belloni
2018-03-23 10:15       ` Alexandre Belloni
2018-03-24 19:36       ` Sean Wang
2018-03-24 19:36         ` Sean Wang
2018-03-27 15:18         ` Alexandre Belloni
2018-03-28  3:53           ` Sean Wang
2018-03-28  3:53             ` Sean Wang
2018-03-28  9:19             ` Alexandre Belloni
2018-03-23  9:15 ` [PATCH v1 03/16] dt-bindings: mfd: mediatek: add a description for MT6323 RTC sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-26 22:24   ` Rob Herring
2018-03-28 11:13   ` Lee Jones
2018-03-23  9:15 ` [PATCH v1 04/16] mfd: mt6397: add MT6323 RTC support into MT6397 driver sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-28 11:15   ` Lee Jones
2018-03-28 11:15     ` Lee Jones
2018-03-23  9:15 ` [PATCH v1 05/16] rtc: mediatek: add MT6323 support to RTC driver sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-23 10:01   ` Alexandre Belloni
2018-03-24  7:06     ` Sean Wang
2018-03-24  7:06       ` Sean Wang
2018-03-23  9:15 ` [PATCH v1 06/16] rtc: mediatek: remove unnecessary parentheses sean.wang
2018-03-23  9:15   ` sean.wang
2018-03-23 10:21   ` Alexandre Belloni
2018-03-24  7:14     ` Sean Wang
2018-03-24  7:14       ` Sean Wang
2018-03-24 18:53       ` Alexandre Belloni
2018-03-24 19:21         ` Sean Wang
2018-03-24 19:21           ` Sean Wang
2018-03-23  9:15 ` [PATCH v1 07/16] rtc: mediatek: replace a poll with regmap_read_poll_timeout sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-23  9:15 ` [PATCH v1 08/16] rtc: mediatek: remove unnecessary irq_dispose_mapping sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-23 10:38   ` Alexandre Belloni
2018-03-26  2:22     ` Sean Wang
2018-03-26  2:22       ` Sean Wang
2018-03-23  9:15 ` [PATCH v1 09/16] rtc: mediatek: convert to use device managed functions sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-23 10:50   ` Alexandre Belloni
2018-03-26  4:07     ` Sean Wang
2018-03-26  4:07       ` Sean Wang
2018-03-27 15:07       ` Alexandre Belloni
2018-03-27 15:07         ` Alexandre Belloni
2018-03-23  9:15 ` [PATCH v1 10/16] rtc: mediatek: add devm_of_platform_populate sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-23  9:15 ` [PATCH v1 11/16] rtc: mediatek: move the declaration into a globally visible header file sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-23  9:57   ` Alexandre Belloni
2018-03-23  9:57     ` Alexandre Belloni
2018-03-24  7:31     ` Sean Wang
2018-03-24  7:31       ` Sean Wang
2018-03-24 18:54       ` Alexandre Belloni
2018-03-24 20:00   ` Fabio Estevam
2018-03-25  3:13     ` Sean Wang
2018-03-25  3:13       ` Sean Wang
2018-03-23  9:15 ` [PATCH v1 12/16] rtc: mediatek: cleanup header files to include sean.wang
2018-03-23  9:15   ` sean.wang
2018-03-25  4:17   ` kbuild test robot
2018-03-25  4:17     ` kbuild test robot
2018-03-25  5:21   ` kbuild test robot
2018-03-25  5:21     ` kbuild test robot
2018-03-23  9:15 ` [PATCH v1 13/16] rtc: mediatek: update license converting to using SPDX identifiers sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-23  9:15 ` sean.wang [this message]
2018-03-23  9:15   ` [PATCH v1 14/16] power: reset: mediatek: add a power-off driver using PMIC RTC device sean.wang
2018-03-23  9:15 ` [PATCH v1 15/16] MAINTAINERS: update entry for ARM/Mediatek RTC DRIVER sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w
2018-03-23  9:15 ` [PATCH v1 16/16] MAINTAINERS: add an entry for MediaTek board level shutdown driver sean.wang
2018-03-23  9:15   ` sean.wang-NuS5LvNUpcJWk0Htik3J/w

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ba7cd65b58f335b44896bd671f8b0f851d04fc01.1521794177.git.sean.wang@mediatek.com \
    --to=sean.wang@mediatek.com \
    --cc=a.zummo@towertech.it \
    --cc=alexandre.belloni@free-electrons.com \
    --cc=devicetree@vger.kernel.org \
    --cc=eddie.huang@mediatek.com \
    --cc=lee.jones@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-rtc@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=robh+dt@kernel.org \
    --cc=sre@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.