Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754228AbbLVJPf (ORCPT ); Tue, 22 Dec 2015 04:15:35 -0500 Received: from regular1.263xmail.com ([211.150.99.140]:44583 "EHLO regular1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751166AbbLVJPb (ORCPT ); Tue, 22 Dec 2015 04:15:31 -0500 X-263anti-spam: KSV:0; X-MAIL-GRAY: 0 X-MAIL-DELIVERY: 1 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: andy.yan@rock-chips.com X-FST-TO: robh+dt@kernel.org X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: andy.yan@rock-chips.com X-UNIQUE-TAG: <85df883c700a0d3a755e060812905192> X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 From: Andy Yan To: robh+dt@kernel.org, heiko@sntech.de, arnd@arndb.de, john.stultz@linaro.org Cc: sjg@chromium.org, alexandre.belloni@free-electrons.com, treding@nvidia.com, galak@codeaurora.org, ijc+devicetree@hellion.org.uk, wxt@rock-chips.com, catalin.marinas@arm.com, olof@lixom.net, geert+renesas@glider.be, linux-rockchip@lists.infradead.org, dbaryshkov@gmail.com, sre@kernel.org, jun.nie@linaro.org, pawel.moll@arm.com, will.deacon@arm.com, akpm@linux-foundation.org, devicetree@vger.kernel.org, linux@arm.linux.org.uk, gregkh@linuxfoundation.org, joel@jms.id.au, linux-arm-kernel@lists.infradead.org, lorenzo.pieralisi@arm.com, khilman@linaro.org, moritz.fischer@ettus.com, linux-kernel@vger.kernel.org, mark.rutland@arm.com, Andy Yan Subject: [PATCH v1 4/6] soc: rockchip: add reboot mode driver Date: Tue, 22 Dec 2015 17:13:19 +0800 Message-Id: <1450775599-24127-1-git-send-email-andy.yan@rock-chips.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1450774949-23901-1-git-send-email-andy.yan@rock-chips.com> References: <1450774949-23901-1-git-send-email-andy.yan@rock-chips.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5300 Lines: 170 rockchip platform have a protocol to pass the kernel reboot mode to bootloader by some special registers when system reboot. By this way the bootloader can take different action according to the different kernel reboot mode, for example, command "reboot loader" will reboot the board to rockusb mode, this is a very convenient way to get the board enter download mode. Signed-off-by: Andy Yan --- Changes in v1: - fix the embarrassed compile warning - correct the maskrom magic number - check for the normal reboot drivers/soc/rockchip/Kconfig | 9 ++++ drivers/soc/rockchip/Makefile | 1 + drivers/soc/rockchip/reboot.c | 68 ++++++++++++++++++++++++++++ include/dt-bindings/soc/rockchip_boot-mode.h | 30 ++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 drivers/soc/rockchip/reboot.c create mode 100644 include/dt-bindings/soc/rockchip_boot-mode.h diff --git a/drivers/soc/rockchip/Kconfig b/drivers/soc/rockchip/Kconfig index 7140ff8..42525f8 100644 --- a/drivers/soc/rockchip/Kconfig +++ b/drivers/soc/rockchip/Kconfig @@ -15,4 +15,13 @@ config ROCKCHIP_PM_DOMAINS If unsure, say N. +config ROCKCHIP_REBOOT + bool "Rockchip reboot mode driver" + select REBOOT_MODE + help + Say y here will enable reboot mode driver. This will + get reboot mode arguments from userspace and store it + in special register, then the bootloader will read it + to take different action according to the mode. + endif diff --git a/drivers/soc/rockchip/Makefile b/drivers/soc/rockchip/Makefile index 3d73d06..9817496 100644 --- a/drivers/soc/rockchip/Makefile +++ b/drivers/soc/rockchip/Makefile @@ -2,3 +2,4 @@ # Rockchip Soc drivers # obj-$(CONFIG_ROCKCHIP_PM_DOMAINS) += pm_domains.o +obj-$(CONFIG_ROCKCHIP_REBOOT) += reboot.o diff --git a/drivers/soc/rockchip/reboot.c b/drivers/soc/rockchip/reboot.c new file mode 100644 index 0000000..7024532 --- /dev/null +++ b/drivers/soc/rockchip/reboot.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2014, 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static struct regmap *map; +static u32 offset; + +static int rockchip_reboot_mode_write(int magic) +{ + if (!magic) + magic = BOOT_NORMAL; + + regmap_write(map, offset, magic); + + return 0; +} + +static int rockchip_reboot_probe(struct platform_device *pdev) +{ + int ret; + + map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, + "rockchip,regmap"); + if (IS_ERR(map)) + return PTR_ERR(map); + + if (of_property_read_u32(pdev->dev.of_node, "offset", &offset)) + return -EINVAL; + + ret = reboot_mode_register(&pdev->dev, rockchip_reboot_mode_write); + if (ret) + dev_err(&pdev->dev, "can't register reboot mode\n"); + + return ret; +} + +static const struct of_device_id rockchip_reboot_of_match[] = { + { .compatible = "rockchip,reboot-mode" }, + {} +}; + +static struct platform_driver rockchip_reboot_driver = { + .probe = rockchip_reboot_probe, + .driver = { + .name = "rockchip-reboot", + .of_match_table = rockchip_reboot_of_match, + }, +}; +module_platform_driver(rockchip_reboot_driver); + +MODULE_AUTHOR("Andy Yan