swj add reboot code
authorroot <root@swj-rockchips.(none)>
Fri, 25 Feb 2011 10:17:12 +0000 (18:17 +0800)
committerroot <root@swj-rockchips.(none)>
Fri, 25 Feb 2011 10:17:12 +0000 (18:17 +0800)
arch/arm/mach-rk29/Makefile [changed mode: 0755->0644]
arch/arm/mach-rk29/include/mach/system.h [changed mode: 0644->0755]
arch/arm/mach-rk29/reset.c [new file with mode: 0644]
arch/arm/mach-rk29/rk29-pl330.c [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index 30d7ecc..d5c001f
@@ -1,4 +1,4 @@
-obj-y += timer.o io.o devices.o iomux.o clock.o rk29-pl330.o dma.o gpio.o ddr.o sram.o memcpy_dma.o
+obj-y += timer.o io.o devices.o iomux.o clock.o rk29-pl330.o dma.o gpio.o ddr.o sram.o memcpy_dma.o reset.o
 obj-$(CONFIG_PM) += pm.o
 obj-$(CONFIG_CPU_FREQ) += cpufreq.o
 obj-$(CONFIG_RK29_VPU) += vpu.o vpu_mem.o
old mode 100644 (file)
new mode 100755 (executable)
index e2a092e..18830e8
@@ -23,6 +23,7 @@
 #else
 #define restart_dbg(format, arg...) do {} while (0)
 #endif
+extern void rk29_arch_reset(int mode, const char *cmd);
 
 static inline void arch_reset(int  mode, const char *cmd)
 {
@@ -31,8 +32,8 @@ static inline void arch_reset(int  mode, const char *cmd)
        *  debug trace
        */
        restart_dbg("%s->%s->%d->mode=%c cmd=%s",__FILE__,__FUNCTION__,__LINE__,mode,cmd);
-       printk("Can't reboot. Please open rk2818 power manage!!\n");
-       for(;;);
+
+       rk29_arch_reset(mode, cmd);
 }
 
 static inline void arch_idle(void)
diff --git a/arch/arm/mach-rk29/reset.c b/arch/arm/mach-rk29/reset.c
new file mode 100644 (file)
index 0000000..77b6fb8
--- /dev/null
@@ -0,0 +1,83 @@
+#include <linux/kernel.h>\r
+#include <asm/io.h>\r
+#include <asm/proc-fns.h>\r
+#include <asm/cacheflush.h>\r
+#include <mach/rk29_iomap.h>\r
+#include <mach/cru.h>\r
+\r
+#define cru_readl(offset)      readl(RK29_CRU_BASE + offset)\r
+#define cru_writel(v, offset)  do { writel(v, RK29_CRU_BASE + offset); readl(RK29_CRU_BASE + offset); } while (0)\r
+\r
+static inline void delay_500ns(void)\r
+{\r
+       int delay = 12;\r
+       while (delay--)\r
+               barrier();\r
+}\r
+\r
+void rk29_arch_reset(int mode, const char *cmd)\r
+{\r
+       u32 pll, reg;\r
+\r
+       local_irq_disable();\r
+       local_fiq_disable();\r
+\r
+       cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_CPU_MODE_MASK) | CRU_CPU_MODE_SLOW, CRU_MODE_CON);\r
+\r
+       delay_500ns();\r
+\r
+       cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_GENERAL_MODE_MASK) | CRU_GENERAL_MODE_SLOW, CRU_MODE_CON);\r
+\r
+       delay_500ns();\r
+\r
+       cru_writel((cru_readl(CRU_MODE_CON) & ~CRU_CODEC_MODE_MASK) | CRU_CODEC_MODE_SLOW, CRU_MODE_CON);\r
+\r
+       delay_500ns();\r
+       \r
+       cru_writel(0, CRU_CLKGATE0_CON);\r
+       cru_writel(0, CRU_CLKGATE1_CON);\r
+       cru_writel(0, CRU_CLKGATE2_CON);\r
+       cru_writel(0, CRU_CLKGATE3_CON);\r
+       delay_500ns();\r
+\r
+       cru_writel(0, CRU_SOFTRST0_CON);\r
+       cru_writel(0, CRU_SOFTRST1_CON);\r
+       cru_writel(0, CRU_SOFTRST2_CON);\r
+       \r
+\r
+       //SPI0 clock source = periph_pll_clk, SPI0 divider=8\r
+       cru_writel((cru_readl(CRU_CLKSEL6_CON) & ~0x1FF) | (7 << 2), CRU_CLKSEL6_CON);\r
+\r
+       //eMMC divider=0x17, SD/MMC0 clock source=arm_pll_clk\r
+       cru_writel((cru_readl(CRU_CLKSEL7_CON) & ~(3 | (0x3f << 18))) | (0x17 << 18), CRU_CLKSEL7_CON);\r
+\r
+       //UART1 clock divider=0, UART1 clk =24MHz , UART0 and UART1 clock source=periph_pll_clk\r
+       cru_writel((cru_readl(CRU_CLKSEL8_CON) & ~(7 | (0x3f << 14) | (3 << 20))) | (2 << 20), CRU_CLKSEL8_CON);\r
+\r
+       writel(readl(RK29_GRF_PHYS + 0xc0) & ~(1 << 21), RK29_GRF_PHYS + 0xc0);\r
+       writel(readl(RK29_GRF_PHYS + 0xbc) & ~(1 << 9), RK29_GRF_PHYS + 0xbc);\r
+\r
+       writel(0, RK29_CPU_AXI_BUS0_PHYS);\r
+       writel(0, RK29_AXI1_PHYS);\r
+\r
+       __cpuc_flush_kern_all();\r
+       __cpuc_flush_user_all();\r
+\r
+       asm("mrc        p15, 0, %0, c1, c0, 0\n\t"\r
+           "bic        r0, %0, #(1 << 13)      @set vector to 0x00000000\n\t"\r
+           "bic        r0, %0, #(1 << 0)       @disable mmu\n\t"\r
+           "bic        r0, %0, #(1 << 12)      @disable I CACHE\n\t"\r
+           "bic        r0, %0, #(1 << 2)       @disable D DACHE\n\t"\r
+           "mcr        p15, 0, %0, c1, c0, 0\n\t"\r
+//         "mcr        p15, 0, %0, c8, c7, 0   @ invalidate whole TLB\n\t"\r
+//         "mcr        p15, 0, %0, c7, c5, 6   @ invalidate BTC\n\t"\r
+           :: "r" (reg));\r
+\r
+       asm("b 1f\n\t"\r
+           ".align 5\n\t"\r
+           "1:\n\t"\r
+           "mcr        p15, 0, %0, c7, c10, 5\n\t"\r
+           "mcr        p15, 0, %0, c7, c10, 4\n\t"\r
+           "mov        pc, #0" : : "r" (reg));\r
+}\r
+\r
old mode 100755 (executable)
new mode 100644 (file)
index 9f9fddb..ec290dd
@@ -1226,72 +1226,6 @@ static int pl330_remove(struct platform_device *pdev)
        return 0;
 }
 
-static int pl330_shutdown(struct platform_device *pdev)
-{
-       struct rk29_pl330_dmac *dmac, *d;
-       struct rk29_pl330_chan *ch;
-       unsigned long flags;
-       int del, found;
-
-       if (!pdev->dev.platform_data)
-               return -EINVAL;
-
-       spin_lock_irqsave(&res_lock, flags);
-
-       found = 0;
-       list_for_each_entry(d, &dmac_list, node)
-               if (d->pi->dev == &pdev->dev) {
-                       found = 1;
-                       break;
-               }
-
-       if (!found) {
-               spin_unlock_irqrestore(&res_lock, flags);
-               return 0;
-       }
-
-       dmac = d;
-
-       /* Remove all Channels that are managed only by this DMAC */
-       list_for_each_entry(ch, &chan_list, node) {
-
-               /* Only channels that are handled by this DMAC */
-               if (iface_of_dmac(dmac, ch->id))
-                       del = 1;
-               else
-                       continue;
-
-               /* Don't remove if some other DMAC has it too */
-               list_for_each_entry(d, &dmac_list, node)
-                       if (d != dmac && iface_of_dmac(d, ch->id)) {
-                               del = 0;
-                               break;
-                       }
-
-               if (del) {
-                       //spin_unlock_irqrestore(&res_lock, flags);
-  
-                                          if (!ch || chan_free(ch))
-                                                goto shutdown_exit;
-  
-
-                       /* Stop any active xfer, Flushe the queue and do callbacks */
-                                   pl330_chan_ctrl(ch->pl330_chan_id, PL330_OP_FLUSH);
-                       //spin_lock_irqsave(&res_lock, flags);
-                       list_del(&ch->node);
-                       kfree(ch);
-               }
-       }
-
-       /* Remove the DMAC */
-       list_del(&dmac->node);
-       kfree(dmac);
-shutdown_exit:
-       spin_unlock_irqrestore(&res_lock, flags);
-
-       return 0;
-}
-
 static struct platform_driver pl330_driver = {
        .driver         = {
                .owner  = THIS_MODULE,
@@ -1299,7 +1233,6 @@ static struct platform_driver pl330_driver = {
        },
        .probe          = pl330_probe,
        .remove         = pl330_remove,
-       .shutdown             = pl330_shutdown,/* test */
 };
 
 static int __init pl330_init(void)