ARM: rpi: convert watchdog/reset to regular driver
This way it can be probed from DT later on. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
63e67a9633
commit
26bf828036
|
@ -326,6 +326,7 @@ static int rpi_env_init(void)
|
|||
static int rpi_devices_init(void)
|
||||
{
|
||||
rpi_model_init();
|
||||
bcm2835_register_wd();
|
||||
bcm2835_register_mci();
|
||||
bcm2835_register_fb();
|
||||
armlinux_set_architecture(MACH_TYPE_BCM2708);
|
||||
|
|
|
@ -1 +1 @@
|
|||
obj-y += core.o mbox.o
|
||||
obj-y += core.o mbox.o wd.o
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
|
||||
#include <common.h>
|
||||
#include <init.h>
|
||||
#include <restart.h>
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clkdev.h>
|
||||
|
@ -29,7 +28,6 @@
|
|||
#include <linux/sizes.h>
|
||||
|
||||
#include <mach/platform.h>
|
||||
#include <mach/wd.h>
|
||||
#include <mach/core.h>
|
||||
#include <linux/amba/bus.h>
|
||||
|
||||
|
@ -64,25 +62,10 @@ void bcm2835_add_device_sdram(u32 size)
|
|||
|
||||
arm_add_mem_device("ram0", BCM2835_SDRAM_BASE, size);
|
||||
}
|
||||
#define RESET_TIMEOUT 10
|
||||
|
||||
static void __noreturn bcm2835_restart_soc(struct restart_handler *rst)
|
||||
{
|
||||
uint32_t rstc;
|
||||
|
||||
rstc = readl(PM_RSTC);
|
||||
rstc &= ~PM_RSTC_WRCFG_SET;
|
||||
rstc |= PM_RSTC_WRCFG_FULL_RESET;
|
||||
writel(PM_PASSWORD | RESET_TIMEOUT, PM_WDOG);
|
||||
writel(PM_PASSWORD | rstc, PM_RSTC);
|
||||
|
||||
hang();
|
||||
}
|
||||
|
||||
static int bcm2835_dev_init(void)
|
||||
{
|
||||
add_generic_device("bcm2835-gpio", 0, NULL, BCM2835_GPIO_BASE, 0xB0, IORESOURCE_MEM, NULL);
|
||||
restart_handler_register_fn(bcm2835_restart_soc);
|
||||
return 0;
|
||||
}
|
||||
coredevice_initcall(bcm2835_dev_init);
|
||||
|
|
|
@ -37,5 +37,10 @@ static void inline bcm2835_register_mbox(void)
|
|||
add_generic_device("bcm2835_mbox", 0, NULL, BCM2835_MBOX_BASE, 0x40,
|
||||
IORESOURCE_MEM, NULL);
|
||||
}
|
||||
static void inline bcm2835_register_wd(void)
|
||||
{
|
||||
add_generic_device("bcm2835_wd", 0, NULL, BCM2835_PM_BASE, 0x28,
|
||||
IORESOURCE_MEM, NULL);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -21,9 +21,9 @@
|
|||
/*
|
||||
* Watchdog
|
||||
*/
|
||||
#define PM_RSTC (BCM2835_PM_BASE+0x1c)
|
||||
#define PM_RSTS (BCM2835_PM_BASE+0x20)
|
||||
#define PM_WDOG (BCM2835_PM_BASE+0x24)
|
||||
#define PM_RSTC 0x1c
|
||||
#define PM_RSTS 0x20
|
||||
#define PM_WDOG 0x24
|
||||
|
||||
#define PM_WDOG_RESET 0000000000
|
||||
#define PM_PASSWORD 0x5a000000
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* Copyright (C) 2017 Pengutronix, Lucas Stach <l.stach@pengutronix.de>
|
||||
*
|
||||
* Based on code from Carlo Caione <carlo@carlocaione.org>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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 <common.h>
|
||||
#include <init.h>
|
||||
#include <io.h>
|
||||
#include <restart.h>
|
||||
|
||||
#include <mach/wd.h>
|
||||
|
||||
static void __iomem *wd_base;
|
||||
|
||||
#define RESET_TIMEOUT 10
|
||||
|
||||
static void __noreturn bcm2835_restart_soc(struct restart_handler *rst)
|
||||
{
|
||||
uint32_t rstc;
|
||||
|
||||
rstc = readl(wd_base + PM_RSTC);
|
||||
rstc &= ~PM_RSTC_WRCFG_SET;
|
||||
rstc |= PM_RSTC_WRCFG_FULL_RESET;
|
||||
writel(PM_PASSWORD | RESET_TIMEOUT, wd_base + PM_WDOG);
|
||||
writel(PM_PASSWORD | rstc, wd_base + PM_RSTC);
|
||||
|
||||
hang();
|
||||
}
|
||||
|
||||
static int bcm2835_wd_probe(struct device_d *dev)
|
||||
{
|
||||
struct resource *iores;
|
||||
|
||||
iores = dev_request_mem_resource(dev, 0);
|
||||
if (IS_ERR(iores)) {
|
||||
dev_err(dev, "could not get memory region\n");
|
||||
return PTR_ERR(iores);
|
||||
}
|
||||
wd_base = IOMEM(iores->start);
|
||||
|
||||
restart_handler_register_fn(bcm2835_restart_soc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __maybe_unused struct of_device_id bcm2835_wd_dt_ids[] = {
|
||||
{
|
||||
.compatible = "brcm,bcm2835-pm-wdt",
|
||||
}, {
|
||||
/* sentinel */
|
||||
},
|
||||
};
|
||||
|
||||
static struct driver_d bcm2835_wd_driver = {
|
||||
.name = "bcm2835_wd",
|
||||
.of_compatible = DRV_OF_COMPAT(bcm2835_wd_dt_ids),
|
||||
.probe = bcm2835_wd_probe,
|
||||
};
|
||||
|
||||
static int __init bcm2835_wd_init(void)
|
||||
{
|
||||
return platform_driver_register(&bcm2835_wd_driver);
|
||||
}
|
||||
device_initcall(bcm2835_wd_init);
|
Loading…
Reference in New Issue