1 #include <linux/kernel.h>
\r
2 #include <linux/reboot.h>
\r
5 #include <asm/proc-fns.h>
\r
6 #include <asm/cacheflush.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
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
20 #include <asm/delay.h>
\r
21 #include <asm/tlbflush.h>
\r
22 #include <asm/cacheflush.h>
\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
27 static inline void delay_500ns(void)
\r
37 volatile int testflag;
\r
38 static void __rk29_reset_to_maskrom(void)
\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
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
62 static void pwm2gpiodefault(void)
\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
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
77 extern void __rb( void* );
\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
92 void rk29_arch_reset(int mode, const char *cmd)
\r
97 if (system_state != SYSTEM_RESTART)
\r
98 machine_power_off();
\r
100 local_irq_disable();
\r
101 local_fiq_disable();
\r
104 cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_CPU_MODE_MASK) | CRU_CPU_MODE_SLOW, CRU_MODE_CON);
\r
108 cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_GENERAL_MODE_MASK) | CRU_GENERAL_MODE_SLOW, CRU_MODE_CON);
\r
112 cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_CODEC_MODE_MASK) | CRU_CODEC_MODE_SLOW, CRU_MODE_CON);
\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
122 cru_writel(0, CRU_SOFTRST0_CON);
\r
123 cru_writel(0, CRU_SOFTRST1_CON);
\r
124 cru_writel(0, CRU_SOFTRST2_CON);
\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
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
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
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
139 writel(0, RK29_CPU_AXI_BUS0_PHYS);
\r
140 writel(0, RK29_AXI1_PHYS);
\r
142 //__cpuc_flush_kern_all();
\r
143 //__cpuc_flush_user_all();
\r