Add sram-reboot-mode driver, which enables reboot modes to be specified from sram subnodes. Cc: Andy Yan <andy.yan@xxxxxxxxxxxxxx> Cc: Rob Herring <robh@xxxxxxxxxx> Cc: Arnd Bergmann <arnd@xxxxxxxx> Cc: Thierry Reding <treding@xxxxxxxxxx> Cc: Heiko Stübner <heiko@xxxxxxxxx> Cc: Caesar Wang <wxt@xxxxxxxxxxxxxx> Cc: Kees Cook <keescook@xxxxxxxxxxxx> Cc: Guodong Xu <guodong.xu@xxxxxxxxxx> Cc: Haojian Zhuang <haojian.zhuang@xxxxxxxxxx> Cc: Vishal Bhoj <vishal.bhoj@xxxxxxxxxx> Cc: Bjorn Andersson <bjorn.andersson@xxxxxxxxxx> Cc: devicetree@xxxxxxxxxxxxxxx Cc: Android Kernel Team <kernel-team@xxxxxxxxxxx> Signed-off-by: John Stultz <john.stultz@xxxxxxxxxx> --- drivers/power/reset/Kconfig | 9 +++++ drivers/power/reset/Makefile | 1 + drivers/power/reset/sram-reboot-mode.c | 66 ++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 drivers/power/reset/sram-reboot-mode.c diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig index 76a6251..b033922 100644 --- a/drivers/power/reset/Kconfig +++ b/drivers/power/reset/Kconfig @@ -182,5 +182,14 @@ config SYSCON_REBOOT_MODE register, then the bootloader can read it to take different action according to the mode. +config SRAM_REBOOT_MODE + bool "Generic SRAM reboot mode driver" + select REBOOT_MODE + help + Say y here will enable reboot mode driver. This will + get reboot mode arguments and store it in an SRAM + address, then the bootloader can read it to take different + action according to the mode. + endif diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile index afd05e9..4780f20 100644 --- a/drivers/power/reset/Makefile +++ b/drivers/power/reset/Makefile @@ -21,4 +21,5 @@ obj-$(CONFIG_POWER_RESET_SYSCON_POWEROFF) += syscon-poweroff.o obj-$(CONFIG_POWER_RESET_RMOBILE) += rmobile-reset.o obj-$(CONFIG_REBOOT_MODE) += reboot-mode.o obj-$(CONFIG_SYSCON_REBOOT_MODE) += syscon-reboot-mode.o +obj-$(CONFIG_SRAM_REBOOT_MODE) += sram-reboot-mode.o diff --git a/drivers/power/reset/sram-reboot-mode.c b/drivers/power/reset/sram-reboot-mode.c new file mode 100644 index 0000000..065c3a8 --- /dev/null +++ b/drivers/power/reset/sram-reboot-mode.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2016, Linaro Limited + * Based on syscon-reboot-mode.c + * Copyright (c) 2016, Fuzhou Rockchip Electronics Co., Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ +#include <linux/init.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/io.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/platform_device.h> +#include <linux/reboot.h> +#include <linux/regmap.h> +#include "reboot-mode.h" + +static void __iomem *reboot_reason_val_addr; + +static int sram_reboot_mode_write(int magic) +{ + writel(magic, reboot_reason_val_addr); + return 0; +} + +static int sram_reboot_mode_probe(struct platform_device *pdev) +{ + struct resource *res; + int ret; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return PTR_ERR(res); + + reboot_reason_val_addr = devm_ioremap(&pdev->dev, res->start, resource_size(res)); + if (IS_ERR(reboot_reason_val_addr)) + return PTR_ERR(reboot_reason_val_addr); + + ret = reboot_mode_register(&pdev->dev, sram_reboot_mode_write); + if (ret) + dev_err(&pdev->dev, "can't register reboot mode\n"); + + return ret; +} + +static const struct of_device_id sram_reboot_mode_of_match[] = { + { .compatible = "sram-reboot-mode" }, + {} +}; + +static struct platform_driver sram_reboot_mode_driver = { + .probe = sram_reboot_mode_probe, + .driver = { + .name = "sram-reboot-mode", + .of_match_table = sram_reboot_mode_of_match, + }, +}; +module_platform_driver(sram_reboot_mode_driver); + +MODULE_AUTHOR("John Stultz <john.stultz@xxxxxxxxxx>"); +MODULE_DESCRIPTION("SRAM reboot mode driver"); +MODULE_LICENSE("GPL v2"); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html