--- /dev/null
+#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
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,
},
.probe = pl330_probe,
.remove = pl330_remove,
- .shutdown = pl330_shutdown,/* test */
};
static int __init pl330_init(void)