10cca81fe05a9dcb414ec79c70c7c55e59acec42
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk29 / reset.c
1 #include <linux/kernel.h>\r
2 #include <linux/reboot.h>\r
3 \r
4 #include <asm/io.h>\r
5 #include <asm/proc-fns.h>\r
6 #include <asm/cacheflush.h>\r
7 #include <asm/tlb.h>\r
8 #include <asm/traps.h>\r
9 #include <asm/sections.h>\r
10 #include <asm/mach/arch.h>\r
11 #include <asm/mach/map.h>\r
12 #include <asm/stacktrace.h>\r
13 \r
14 #include <mach/rk29_iomap.h>\r
15 #include <mach/cru.h>\r
16 #include <mach/memory.h>\r
17 #include <mach/sram.h>\r
18 #include <linux/clk.h>\r
19 \r
20 #include <asm/delay.h>\r
21 #include <asm/tlbflush.h>\r
22 #include <asm/cacheflush.h>\r
23 \r
24 #define cru_readl(offset)       readl(RK29_CRU_BASE + offset)\r
25 #define cru_writel(v, offset)   do { writel(v, RK29_CRU_BASE + offset); readl(RK29_CRU_BASE + offset); } while (0)\r
26 \r
27 static inline void delay_500ns(void)\r
28 {\r
29         int delay = 13;\r
30         barrier();\r
31         while (delay--)\r
32                 barrier();\r
33 }\r
34 \r
35 \r
36 #if 0\r
37 volatile int testflag;\r
38 static void  __rk29_reset_to_maskrom(void)\r
39 {\r
40         u32 reg;\r
41     asm("mrc    p15, 0, %0, c1, c0, 0\n\t"\r
42         "bic    %0, %0, #(1 << 13)  @set vector to 0x00000000\n\t"\r
43         "bic    %0, %0, #(1 << 0)   @disable mmu\n\t"\r
44         "bic    %0, %0, #(1 << 12)  @disable I CACHE\n\t"\r
45         "bic    %0, %0, #(1 << 2)   @disable D DACHE\n\t"\r
46         "bic    %0, %0, #(1 << 11)      @disable \n\t"\r
47         "bic    %0, %0, #(1 << 28)      @disable \n\t"\r
48         "mcr    p15, 0, %0, c1, c0, 0\n\t"\r
49     //      "mcr    p15, 0, %0, c8, c7, 0   @ invalidate whole TLB\n\t"\r
50     //      "mcr    p15, 0, %0, c7, c5, 6   @ invalidate BTC\n\t"\r
51         : "=r" (reg));\r
52 \r
53     asm("b 1f\n\t"\r
54         ".align 5\n\t"\r
55         "1:\n\t"\r
56         "mcr    p15, 0, %0, c7, c10, 5\n\t"\r
57         "mcr    p15, 0, %0, c7, c10, 4\n\t"\r
58         "mov    pc, #0" : : "r" (reg));\r
59\r
60 #endif\r
61 \r
62 static void  pwm2gpiodefault(void)\r
63 {\r
64         #define     REG_FILE_BASE_ADDR         RK29_GRF_BASE\r
65         volatile unsigned int * pGRF_GPIO2L_IOMUX =  (volatile unsigned int *)(REG_FILE_BASE_ADDR + 0x58);\r
66         #define     GPIO2_BASE_ADDR            RK29_GPIO2_BASE\r
67         volatile unsigned int *pGPIO2_DIR = (volatile unsigned int *)(GPIO2_BASE_ADDR + 0x4);\r
68 \r
69         // iomux pwm2 to gpio2_a[3]\r
70         *pGRF_GPIO2L_IOMUX &= ~(0x3<<6);\r
71         // set gpio to input\r
72         *pGPIO2_DIR &= ~(0x1<<3);\r
73 //      testflag =1;\r
74\r
75 \r
76 \r
77 extern void __rb( void*  );\r
78 void rb( void )\r
79 {\r
80     void(*cb)(void* ) ;\r
81     \r
82     void * uart_base = (unsigned int *)ioremap( RK29_UART1_PHYS , RK29_UART1_SIZE );\r
83     local_irq_disable();\r
84     cb =  (void(*)(void* ))__pa(__rb);\r
85     __cpuc_flush_kern_all();\r
86     __cpuc_flush_user_all();\r
87     //printk("begin to jump to reboot,uart1 va=0x%p\n" , uart_base);\r
88     //while(testflag);    \r
89     cb( uart_base );\r
90 }\r
91 \r
92 void  rk29_arch_reset(int mode, const char *cmd)\r
93 {\r
94         u32 reg;\r
95 \r
96         /* from panic? */\r
97         if (system_state != SYSTEM_RESTART)\r
98                 machine_power_off();\r
99 \r
100         local_irq_disable();\r
101         local_fiq_disable();\r
102         pwm2gpiodefault();\r
103 \r
104         cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_CPU_MODE_MASK) | CRU_CPU_MODE_SLOW, CRU_MODE_CON);\r
105 \r
106         delay_500ns();\r
107 \r
108         cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_GENERAL_MODE_MASK) | CRU_GENERAL_MODE_SLOW, CRU_MODE_CON);\r
109 \r
110         delay_500ns();\r
111 \r
112         cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_CODEC_MODE_MASK) | CRU_CODEC_MODE_SLOW, CRU_MODE_CON);\r
113 \r
114         delay_500ns();\r
115         \r
116         cru_writel(0, CRU_CLKGATE0_CON);\r
117         cru_writel(0, CRU_CLKGATE1_CON);\r
118         cru_writel(0, CRU_CLKGATE2_CON);\r
119         cru_writel(0, CRU_CLKGATE3_CON);\r
120         delay_500ns();\r
121 \r
122         cru_writel(0, CRU_SOFTRST0_CON);\r
123         cru_writel(0, CRU_SOFTRST1_CON);\r
124         cru_writel(0, CRU_SOFTRST2_CON);\r
125         \r
126 \r
127         //SPI0 clock source = periph_pll_clk, SPI0 divider=8\r
128         cru_writel((cru_readl(CRU_CLKSEL6_CON) & ~0x1FF) | (7 << 2), CRU_CLKSEL6_CON);\r
129 \r
130         //eMMC divider=0x17, SD/MMC0 clock source=arm_pll_clk\r
131         cru_writel((cru_readl(CRU_CLKSEL7_CON) & ~(3 | (0x3f << 18))) | (0x17 << 18), CRU_CLKSEL7_CON);\r
132 \r
133         //UART1 clock divider=0, UART1 clk =24MHz , UART0 and UART1 clock source=periph_pll_clk\r
134         cru_writel((cru_readl(CRU_CLKSEL8_CON) & ~(7 | (0x3f << 14) | (3 << 20))) | (2 << 20), CRU_CLKSEL8_CON);\r
135 \r
136         writel(readl(RK29_GRF_PHYS + 0xc0) & ~(1 << 21), RK29_GRF_PHYS + 0xc0);\r
137         writel(readl(RK29_GRF_PHYS + 0xbc) & ~(1 << 9), RK29_GRF_PHYS + 0xbc);\r
138 \r
139         writel(0, RK29_CPU_AXI_BUS0_PHYS);\r
140         writel(0, RK29_AXI1_PHYS);\r
141 \r
142         //__cpuc_flush_kern_all();\r
143         //__cpuc_flush_user_all();\r
144         \r
145     rb();\r
146 \r
147 }\r
148 \r
149 \r