2 * Copyright (c) 2011 Picochip Ltd., Jamie Iles
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
8 * All enquiries to support@picochip.com
10 #include <linux/delay.h>
11 #include <linux/irq.h>
12 #include <linux/irqdomain.h>
14 #include <linux/of_address.h>
15 #include <linux/of_irq.h>
16 #include <linux/of_platform.h>
18 #include <asm/mach/arch.h>
19 #include <asm/hardware/vic.h>
20 #include <asm/mach/map.h>
23 #include <mach/picoxcell_soc.h>
27 #define WDT_CTRL_REG_EN_MASK (1 << 0)
28 #define WDT_CTRL_REG_OFFS (0x00)
29 #define WDT_TIMEOUT_REG_OFFS (0x04)
30 static void __iomem
*wdt_regs
;
33 * The machine restart method can be called from an atomic context so we won't
34 * be able to ioremap the regs then.
36 static void picoxcell_setup_restart(void)
38 struct device_node
*np
= of_find_compatible_node(NULL
, NULL
,
40 if (WARN(!np
, "unable to setup watchdog restart"))
43 wdt_regs
= of_iomap(np
, 0);
44 WARN(!wdt_regs
, "failed to remap watchdog regs");
47 static struct map_desc io_map __initdata
= {
48 .virtual = PHYS_TO_IO(PICOXCELL_PERIPH_BASE
),
49 .pfn
= __phys_to_pfn(PICOXCELL_PERIPH_BASE
),
50 .length
= PICOXCELL_PERIPH_LENGTH
,
54 static void __init
picoxcell_map_io(void)
56 iotable_init(&io_map
, 1);
59 static void __init
picoxcell_init_machine(void)
61 of_platform_populate(NULL
, of_default_bus_match_table
, NULL
, NULL
);
62 picoxcell_setup_restart();
65 static const char *picoxcell_dt_match
[] = {
71 static const struct of_device_id vic_of_match
[] __initconst
= {
72 { .compatible
= "arm,pl192-vic", .data
= vic_of_init
, },
76 static void __init
picoxcell_init_irq(void)
78 of_irq_init(vic_of_match
);
81 static void picoxcell_wdt_restart(char mode
, const char *cmd
)
84 * Configure the watchdog to reset with the shortest possible timeout
85 * and give it chance to do the reset.
88 writel_relaxed(WDT_CTRL_REG_EN_MASK
, wdt_regs
+ WDT_CTRL_REG_OFFS
);
89 writel_relaxed(0, wdt_regs
+ WDT_TIMEOUT_REG_OFFS
);
90 /* No sleeping, possibly atomic. */
95 DT_MACHINE_START(PICOXCELL
, "Picochip picoXcell")
96 .map_io
= picoxcell_map_io
,
97 .nr_irqs
= NR_IRQS_LEGACY
,
98 .init_irq
= picoxcell_init_irq
,
99 .handle_irq
= vic_handle_irq
,
100 .timer
= &picoxcell_timer
,
101 .init_machine
= picoxcell_init_machine
,
102 .dt_compat
= picoxcell_dt_match
,
103 .restart
= picoxcell_wdt_restart
,