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/irqchip.h>
13 #include <linux/irqdomain.h>
15 #include <linux/of_address.h>
16 #include <linux/of_irq.h>
17 #include <linux/of_platform.h>
18 #include <linux/dw_apb_timer.h>
20 #include <asm/mach/arch.h>
21 #include <asm/mach/map.h>
25 #define PHYS_TO_IO(x) (((x) & 0x00ffffff) | 0xfe000000)
26 #define PICOXCELL_PERIPH_BASE 0x80000000
27 #define PICOXCELL_PERIPH_LENGTH SZ_4M
29 #define WDT_CTRL_REG_EN_MASK (1 << 0)
30 #define WDT_CTRL_REG_OFFS (0x00)
31 #define WDT_TIMEOUT_REG_OFFS (0x04)
32 static void __iomem
*wdt_regs
;
35 * The machine restart method can be called from an atomic context so we won't
36 * be able to ioremap the regs then.
38 static void picoxcell_setup_restart(void)
40 struct device_node
*np
= of_find_compatible_node(NULL
, NULL
,
42 if (WARN(!np
, "unable to setup watchdog restart"))
45 wdt_regs
= of_iomap(np
, 0);
46 WARN(!wdt_regs
, "failed to remap watchdog regs");
49 static struct map_desc io_map __initdata
= {
50 .virtual = PHYS_TO_IO(PICOXCELL_PERIPH_BASE
),
51 .pfn
= __phys_to_pfn(PICOXCELL_PERIPH_BASE
),
52 .length
= PICOXCELL_PERIPH_LENGTH
,
56 static void __init
picoxcell_map_io(void)
58 iotable_init(&io_map
, 1);
61 static void __init
picoxcell_init_machine(void)
63 of_platform_populate(NULL
, of_default_bus_match_table
, NULL
, NULL
);
64 picoxcell_setup_restart();
67 static const char *picoxcell_dt_match
[] = {
73 static void picoxcell_wdt_restart(char mode
, const char *cmd
)
76 * Configure the watchdog to reset with the shortest possible timeout
77 * and give it chance to do the reset.
80 writel_relaxed(WDT_CTRL_REG_EN_MASK
, wdt_regs
+ WDT_CTRL_REG_OFFS
);
81 writel_relaxed(0, wdt_regs
+ WDT_TIMEOUT_REG_OFFS
);
82 /* No sleeping, possibly atomic. */
87 DT_MACHINE_START(PICOXCELL
, "Picochip picoXcell")
88 .map_io
= picoxcell_map_io
,
89 .nr_irqs
= NR_IRQS_LEGACY
,
90 .init_irq
= irqchip_init
,
91 .init_time
= dw_apb_timer_init
,
92 .init_machine
= picoxcell_init_machine
,
93 .dt_compat
= picoxcell_dt_match
,
94 .restart
= picoxcell_wdt_restart
,