Skip to contentSkip to conversation

drivers: power: reset: add msm restart support

PATCH In review Abhimanyu Kapur 3 participants 3 messages Jul 29, 2013 – Jul 30, 2013

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 drivers: power: reset: add msm restart support

Add support for restart and poweroff functionality present on MSM chipsets with the MPM2 ps-hold hardware.

---
 .../bindings/power_supply/msm-poweroff.txt         | 17 +++++
 drivers/power/reset/Kconfig                        |  6 ++
 drivers/power/reset/Makefile                       |  1 +
 drivers/power/reset/msm-poweroff.c                 | 73 ++++++++++++++++++++++
 4 files changed, 97 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/power_supply/msm-poweroff.txt
 create mode 100644 drivers/power/reset/msm-poweroff.c
Documentation/devicetree/bindings/power_supply/msm-poweroff.txt new file +17 -0
new file mode 100644
index 0000000..de08480
@@ -0,0 +1,17 @@
+MSM Poweroff Driver
+
+A power supply hold (ps-hold) bit is set to power the msm chipsets.
+Clearing that bit enables us to restart/poweroff. The difference
+between poweroff and restart is determined by unique power manager IC
+settings.
+
+Required Properties:
+-compatible: "qcom,pshold"
+-reg: Specifies the physical address of the ps-hold register
+
+Example:
+
+	restart@800820 {
+		compatible = "qcom,pshold";
+		reg = <0x00800820 0x4>;
+	};
drivers/power/reset/Kconfig +6 -0
index 349e9ae..fa6178f 100644
@@ -37,3 +37,9 @@ config POWER_RESET_VEXPRESS
 	help
 	  Power off and reset support for the ARM Ltd. Versatile
 	  Express boards.
+
+config POWER_RESET_MSM
+	bool "Qualcomm MSM power-off driver"
+	depends on POWER_RESET && ARCH_MSM
+	help
+	  Power off and restart support for Qualcomm boards.
drivers/power/reset/Makefile +1 -0
index 372807f..b82288e 100644
@@ -1,4 +1,5 @@
 obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o
+obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o
 obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o
 obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o
 obj-$(CONFIG_POWER_RESET_VEXPRESS) += vexpress-poweroff.o
drivers/power/reset/msm-poweroff.c new file +73 -0

73 lines not on this page · raw message

Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation
#1 lore raw

Documentation/devicetree/bindings/power_supply/msm-poweroff.txt line 4

Quoted 10 lines · Abhimanyu Kapur
Documentation/devicetree/bindings/power_supply/msm-poweroff.txt new file +4 -0
new file mode 100644
index 0000000..de08480
@@ -0,0 +1,17 @@
+MSM Poweroff Driver
+
+A power supply hold (ps-hold) bit is set to power the msm chipsets.
+Clearing that bit enables us to restart/poweroff. The difference

s/enables us/allows us/ perhaps?

Quoted 18 lines
Documentation/devicetree/bindings/power_supply/msm-poweroff.txt new file +13 -0
+between poweroff and restart is determined by unique power manager IC
+settings.
+
+Required Properties:
+-compatible: "qcom,pshold"
+-reg: Specifies the physical address of the ps-hold register
+
+Example:
+
+	restart@800820 {
+		compatible = "qcom,pshold";
+		reg = <0x00800820 0x4>;
+	};
drivers/power/reset/Kconfig +0 -0
index 349e9ae..fa6178f 100644

drivers/power/reset/Kconfig config POWER_RESET_VEXPRESS · line 45

Quoted 9 lines
drivers/power/reset/Kconfig +6 -0
@@ -37,3 +37,9 @@ config POWER_RESET_VEXPRESS
 	help
 	  Power off and reset support for the ARM Ltd. Versatile
 	  Express boards.
+
+config POWER_RESET_MSM
+	bool "Qualcomm MSM power-off driver"
+	depends on POWER_RESET && ARCH_MSM
+	help
+	  Power off and restart support for Qualcomm boards.

It looks like this Kconfig file is trying to be alphabetically ordered. Please make sure that it's maintained.

Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
#2 lore raw
In reply to Abhimanyu Kapur

Hi,

Quoted 4 lines · Abhimanyu Kapur

Add support for restart and poweroff functionality present on MSM chipsets with the MPM2 ps-hold hardware.

Quoted 8 lines
---
 .../bindings/power_supply/msm-poweroff.txt         | 17 +++++
 drivers/power/reset/Kconfig                        |  6 ++
 drivers/power/reset/Makefile                       |  1 +
 drivers/power/reset/msm-poweroff.c                 | 73 ++++++++++++++++++++++
 4 files changed, 97 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/power_supply/msm-poweroff.txt
 create mode 100644 drivers/power/reset/msm-poweroff.c

Thank you for this. I was not aware how important is the reboot command until I get board which did not have reset button :-)

Quoted 13 lines
Documentation/devicetree/bindings/power_supply/msm-poweroff.txt new file +6 -0
new file mode 100644
index 0000000..de08480
@@ -0,0 +1,17 @@
+MSM Poweroff Driver
+
+A power supply hold (ps-hold) bit is set to power the msm chipsets.
+Clearing that bit enables us to restart/poweroff. The difference
+between poweroff and restart is determined by unique power manager IC
+settings.

Documentation/devicetree/bindings/power_supply/msm-poweroff.txt line 16

Quoted 10 lines
Documentation/devicetree/bindings/power_supply/msm-poweroff.txt new file +10 -0
+
+Required Properties:
+-compatible: "qcom,pshold"
+-reg: Specifies the physical address of the ps-hold register
+
+Example:
+
+	restart@800820 {
+		compatible = "qcom,pshold";
+		reg = <0x00800820 0x4>;

It will be nice if this address could be used straight a way. If I use this address module can not be loaded, because:

"can't request region for resource [mem 0x00800820-0x00800823]"

Not sure, but when address is 0xfa107000 my 8074 based dragonboard perform reboot successfully.

Quoted 41 lines
Documentation/devicetree/bindings/power_supply/msm-poweroff.txt new file +1 -0
+	};
drivers/power/reset/Kconfig +6 -0
index 349e9ae..fa6178f 100644
@@ -37,3 +37,9 @@ config POWER_RESET_VEXPRESS
 	help
 	  Power off and reset support for the ARM Ltd. Versatile
 	  Express boards.
+
+config POWER_RESET_MSM
+	bool "Qualcomm MSM power-off driver"
+	depends on POWER_RESET && ARCH_MSM
+	help
+	  Power off and restart support for Qualcomm boards.
drivers/power/reset/Makefile +1 -0
index 372807f..b82288e 100644
@@ -1,4 +1,5 @@
 obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o
+obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o
 obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o
 obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o
 obj-$(CONFIG_POWER_RESET_VEXPRESS) += vexpress-poweroff.o
drivers/power/reset/msm-poweroff.c new file +10 -0
new file mode 100644
index 0000000..0d33d18
@@ -0,0 +1,73 @@
+/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.

drivers/power/reset/msm-poweroff.c line 20

Quoted 10 lines
drivers/power/reset/msm-poweroff.c new file +10 -0
+ *
+ */
+
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>

missing #include <linux/module.h>

drivers/power/reset/msm-poweroff.c line 26

Quoted 6 lines
drivers/power/reset/msm-poweroff.c new file +6 -0
+
+#include <asm/system_misc.h>
+
+static void __iomem *msm_ps_hold;
+
+static void do_msm_restart(char mode, const char *cmd)

the right prototype is:

void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd)

Regards,
Ivan

Quoted 47 lines
drivers/power/reset/msm-poweroff.c new file +47 -0
+{
+	writel(0, msm_ps_hold);
+	mdelay(10000);
+}
+
+static void do_msm_poweroff(void)
+{
+	/* TODO: Add poweroff capability */
+
+	do_msm_restart('p', NULL);
+}
+
+static int msm_restart_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct resource *mem;
+
+	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	msm_ps_hold = devm_ioremap_resource(dev, mem);
+	if (IS_ERR(msm_ps_hold))
+		return PTR_ERR(msm_ps_hold);
+
+	pm_power_off = do_msm_poweroff;
+	arm_pm_restart = do_msm_restart;
+	return 0;
+}
+
+static const struct of_device_id of_msm_restart_match[] = {
+	{ .compatible = "qcom,pshold", },
+	{},
+};
+
+MODULE_DEVICE_TABLE(of, of_msm_restart_match);
+
+static struct platform_driver msm_restart_driver = {
+	.probe = msm_restart_probe,
+	.driver = {
+		.name = "msm-restart",
+		.of_match_table = of_match_ptr(of_msm_restart_match),
+	},
+};
+
+static int __init msm_restart_init(void)
+{
+	return platform_driver_register(&msm_restart_driver);
+}
+device_initcall(msm_restart_init);