9
0
Fork 0

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:
Lucas Stach 2017-03-01 15:31:32 +01:00 committed by Sascha Hauer
parent 63e67a9633
commit 26bf828036
6 changed files with 85 additions and 21 deletions

View File

@ -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);

View File

@ -1 +1 @@
obj-y += core.o mbox.o
obj-y += core.o mbox.o wd.o

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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);