diff mbox

drivers: power: reset: add msm restart support

Message ID 1375136906-22501-1-git-send-email-abhimany@codeaurora.org (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Abhimanyu Kapur July 29, 2013, 10:28 p.m. UTC
Add support for restart and poweroff functionality present on MSM
chipsets with the MPM2 ps-hold hardware.

Signed-off-by: Abhimanyu Kapur <abhimany@codeaurora.org>
---
 .../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

Comments

Stephen Boyd July 30, 2013, 12:20 a.m. UTC | #1
On 07/29, Abhimanyu Kapur wrote:
> diff --git a/Documentation/devicetree/bindings/power_supply/msm-poweroff.txt b/Documentation/devicetree/bindings/power_supply/msm-poweroff.txt
> new file mode 100644
> index 0000000..de08480
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power_supply/msm-poweroff.txt
> @@ -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?

> +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>;
> +	};
> diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
> index 349e9ae..fa6178f 100644
> --- a/drivers/power/reset/Kconfig
> +++ b/drivers/power/reset/Kconfig
> @@ -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.
Ivan T. Ivanov July 30, 2013, 7:10 a.m. UTC | #2
Hi, 

On Mon, 2013-07-29 at 15:28 -0700, Abhimanyu Kapur wrote:
> Add support for restart and poweroff functionality present on MSM
> chipsets with the MPM2 ps-hold hardware.
> 
> Signed-off-by: Abhimanyu Kapur <abhimany@codeaurora.org>
> ---
>  .../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 :-)

> 
> diff --git a/Documentation/devicetree/bindings/power_supply/msm-poweroff.txt b/Documentation/devicetree/bindings/power_supply/msm-poweroff.txt
> new file mode 100644
> index 0000000..de08480
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power_supply/msm-poweroff.txt
> @@ -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>;

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.

> +	};
> diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
> index 349e9ae..fa6178f 100644
> --- a/drivers/power/reset/Kconfig
> +++ b/drivers/power/reset/Kconfig
> @@ -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.
> diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile
> index 372807f..b82288e 100644
> --- a/drivers/power/reset/Makefile
> +++ b/drivers/power/reset/Makefile
> @@ -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
> diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c
> new file mode 100644
> index 0000000..0d33d18
> --- /dev/null
> +++ b/drivers/power/reset/msm-poweroff.c
> @@ -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.
> + *
> + */
> +
> +#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>

> +
> +#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

> +{
> +	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);


--
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/power_supply/msm-poweroff.txt b/Documentation/devicetree/bindings/power_supply/msm-poweroff.txt
new file mode 100644
index 0000000..de08480
--- /dev/null
+++ b/Documentation/devicetree/bindings/power_supply/msm-poweroff.txt
@@ -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>;
+	};
diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
index 349e9ae..fa6178f 100644
--- a/drivers/power/reset/Kconfig
+++ b/drivers/power/reset/Kconfig
@@ -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.
diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile
index 372807f..b82288e 100644
--- a/drivers/power/reset/Makefile
+++ b/drivers/power/reset/Makefile
@@ -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
diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c
new file mode 100644
index 0000000..0d33d18
--- /dev/null
+++ b/drivers/power/reset/msm-poweroff.c
@@ -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.
+ *
+ */
+
+#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>
+
+#include <asm/system_misc.h>
+
+static void __iomem *msm_ps_hold;
+
+static void do_msm_restart(char mode, const char *cmd)
+{
+	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);