xref: /minix/minix/kernel/arch/earm/bsp/ti/omap_reset.c (revision cd34841d)
1 #include <assert.h>
2 #include <sys/types.h>
3 #include <machine/cpu.h>
4 #include <minix/type.h>
5 #include <minix/board.h>
6 #include <io.h>
7 
8 #include "kernel/kernel.h"
9 #include "kernel/proc.h"
10 #include "kernel/vm.h"
11 #include "kernel/proto.h"
12 #include "arch_proto.h"
13 #include "bsp_reset.h"
14 
15 #include "omap_timer_registers.h"
16 #include "omap_rtc.h"
17 
18 #define AM335X_CM_BASE 0x44E00000
19 #define AM335X_CM_SIZE 0x1000
20 
21 #define AM335X_PRM_DEVICE_OFFSET 0xf00
22 #define AM335X_PRM_RSTCTRL_REG 0x00
23 #define AM335X_RST_GLOBAL_WARM_SW_BIT 0
24 
25 #define DM37XX_CM_BASE 0x48307000
26 #define DM37XX_CM_SIZE 0x1000
27 #define DM37XX_PRM_RSTCTRL_REG 0x250
28 #define DM37XX_RST_DPLL3_BIT 2
29 
30 struct omap_reset
31 {
32 	vir_bytes base;
33 	vir_bytes size;
34 };
35 
36 static struct omap_reset omap_reset;
37 
38 static kern_phys_map reset_phys_map;
39 
40 void
41 bsp_reset_init(void)
42 {
43 	if (BOARD_IS_BBXM(machine.board_id)) {
44 		omap_reset.base = DM37XX_CM_BASE;
45 		omap_reset.size = DM37XX_CM_SIZE;
46 	} else if (BOARD_IS_BB(machine.board_id)) {
47 		omap_reset.base = AM335X_CM_BASE;
48 		omap_reset.size = AM335X_CM_SIZE;
49 	}
50 
51 	kern_phys_map_ptr(omap_reset.base, omap_reset.size,
52 	    VMMF_UNCACHED | VMMF_WRITE,
53 	    &reset_phys_map, (vir_bytes) & omap_reset.base);
54 }
55 
56 void
57 bsp_reset(void)
58 {
59 	if (BOARD_IS_BBXM(machine.board_id)) {
60 		mmio_set((omap_reset.base + DM37XX_PRM_RSTCTRL_REG),
61 		    (1 << DM37XX_RST_DPLL3_BIT));
62 	} else if (BOARD_IS_BB(machine.board_id)) {
63 		mmio_set((omap_reset.base + AM335X_PRM_DEVICE_OFFSET +
64 			AM335X_PRM_RSTCTRL_REG),
65 		    (1 << AM335X_RST_GLOBAL_WARM_SW_BIT));
66 	}
67 }
68 
69 void
70 bsp_poweroff(void)
71 {
72 
73 /*
74  * The am335x can signal an external power management chip to cut the power
75  * by toggling the PMIC_POWER_EN pin. It might fail if there isn't an
76  * external PMIC or if the PMIC hasn't been configured to respond to toggles.
77  * The only way to pull the pin low is via ALARM2 (see TRM 20.3.3.8).
78  * At this point PM should have already signaled readclock to set the alarm.
79  */
80 	if (BOARD_IS_BB(machine.board_id)) {
81 		/* rtc was frozen to prevent premature power-off, unfreeze it
82 		 * now */
83 		omap3_rtc_run();
84 
85 		/* wait for the alarm to go off and PMIC to disable power to
86 		 * SoC */
87 		while (1);
88 	}
89 }
90 
91 void bsp_disable_watchdog(void)
92 {
93         if(BOARD_IS_BB(machine.board_id)) {
94 		mmio_write(AM335X_WDT_BASE+AM335X_WDT_WSPR, 0xAAAA);
95 		while(mmio_read(AM335X_WDT_BASE+AM335X_WDT_WWPS) != 0) ;
96 		mmio_write(AM335X_WDT_BASE+AM335X_WDT_WSPR, 0x5555);
97 		while(mmio_read(AM335X_WDT_BASE+AM335X_WDT_WWPS) != 0) ;
98 	}
99 }
100 
101