static __inline__ void sdio_init( void )
{
int resp;
int temp;
int no_resp;
int resp_vld;
int ccs;
int i;
__arch_putl(0x0,0x91004010); /*stop clock*/
__arch_putl(0x80202000,0x9100402c); /*updata clock*/
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);/*wait updata clock*/
__arch_putl(8,0x910040a0); /*ahb 8 400k*/
__arch_putl(128,0x91004008); /*div0 16*/
__arch_putl(0x0,0x9100400c); /*clock 0*/
__arch_putl(0x0,0x91004018); /*ctype 1*/
__arch_putl(0x80202000,0x9100402c); /*updata clock*/
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);/*wait updata clock*/
__arch_putl(0x1,0x91004010); /*enable clock*/
__arch_putl(0x80202000,0x9100402c); /*updata clock*/
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);/*wait updata clock*/
printf("SDMMCInit cmd0\n");
__arch_putl(0x0,0x91004028);/*cmd0*/
__arch_putl(0x80008000,0x9100402c);
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
__arch_putl(__arch_getl(0x91004044),0x91004044);
printf("resp_cmd0 = 0x%08x\n",__arch_getl(0x91004030));/*cuo wei*/
printf("SDMMCInit cmd8\n");
__arch_putl(0x1aa,0x91004028); /*cmd8*/
__arch_putl(0x80002148,0x9100402c);
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
__arch_putl(__arch_getl(0x91004044),0x91004044);
printf("resp_cmd8 = 0x%08x\n",__arch_getl(0x91004030));
do{
printf("SDMMCInit cmd55\n");
__arch_putl(0x0,0x91004028); /*cmd55*/
__arch_putl(0x80002177,0x9100402c);
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
__arch_putl(__arch_getl(0x91004044),0x91004044);
printf("resp_cmd55 = 0x%08x\n",__arch_getl(0x91004030));
printf("SDMMCInit cmd41\n");
__arch_putl(0x40300000,0x91004028);/*acmd41*/
__arch_putl(0x80002069,0x9100402c);
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
__arch_putl(__arch_getl(0x91004044),0x91004044);
printf("resp_cmd41 = 0x%08x\n",__arch_getl(0x91004030));
resp = __arch_getl(0x91004030);
resp = resp & 0x80000000;
}while(resp != 0x80000000);
printf("SDMMCInit cmd2\n");
__arch_putl(0x0,0x91004028);/*cmd2*/
__arch_putl(0x800021c2,0x9100402c);
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
__arch_putl(__arch_getl(0x91004044),0x91004044);
printf("resp_cmd2 = 0x%08x\n",__arch_getl(0x9100403c));
printf("resp_cmd2 = 0x%08x\n",__arch_getl(0x91004038));
printf("resp_cmd2 = 0x%08x\n",__arch_getl(0x91004034));
printf("resp_cmd2 = 0x%08x\n",__arch_getl(0x91004030));
printf("SDMMCInit cmd3\n");
__arch_putl(0x0,0x91004028);/*cmd3*/
__arch_putl(0x80002143,0x9100402c);
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
__arch_putl(__arch_getl(0x91004044),0x91004044);
resp = __arch_getl(0x91004030);
printf("resp_cmd3 = 0x%08x\n",__arch_getl(0x91004030));
gRCA = resp >> 16;
printf("SDMMCInit cmd7\n");
__arch_putl(gRCA<<16,0x91004028);/*cmd7*/
__arch_putl(0x80002147,0x9100402c);
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
printf("resp_cmd7 = 0x%08x\n",__arch_getl(0x91004030));
__arch_putl(__arch_getl(0x91004044),0x91004044);
printf("stop clock to update to 50M\n");
__arch_putl(0x0,0x91004010); /*stop clock*/
__arch_putl(0x80202000,0x9100402c); /*updata clock*/
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);/*wait updata clock*/
__arch_putl(0x1,0x910040a0); /*ahb 1 50Mhz*/
__arch_putl(0x2,0x91004008); /*div0 1*/
__arch_putl(0x0,0x9100400c); /*clock 0*/
__arch_putl(0x1,0x91004018); /*bus 4*/
__arch_putl(0x80202000,0x9100402c); /*updata clock*/
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);/*wait updata clock*/
__arch_putl(0x1,0x91004010); /*enable clock*/
__arch_putl(0x80202000,0x9100402c); /*updata clock*/
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);/*wait updata clock*/
printf("clock update over\n");
printf("cmd 55\n");
temp = gRCA<<16;
temp = temp & 0xffff0000;
__arch_putl(temp,0x91004028); /*cmd55*/
__arch_putl(0x80000177,0x9100402c);
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
__arch_putl(__arch_getl(0x91004044),0x91004044);
printf("resp_cmd55 = 0x%08x\n",__arch_getl(0x91004030));
printf("cmd 6\n");
__arch_putl(0x2,0x91004028); /*cmd6 switch 4 bus*/
__arch_putl(0x80002146,0x9100402c);
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
__arch_putl(__arch_getl(0x91004044),0x91004044);
printf("resp_cmd6 = 0x%08x\n",__arch_getl(0x91004030));
printf("SDMMCInit out\n");
}
static inline void dma_transfer(void)
{
printf("dma_transfer into\n");
*(unsigned int *)0x30000000 = 0x80000018; /*des0*/
*(unsigned int *)0x30000004 = 0x3000; /*des1*/
*(unsigned int *)0x30000008 = 0x30001000; /*des2*/
*(unsigned int *)0x30000010 = 0x80000010; /*des0*/
*(unsigned int *)0x30000014 = 0x3000; /*des1*/
*(unsigned int *)0x30000018 = 0x30004000; /*des2*/
*(unsigned int *)0x30000020 = 0x80000010; /*des0*/
*(unsigned int *)0x30000024 = 0x3000; /*des1*/
*(unsigned int *)0x30000028 = 0x30007000; /*des2*/
*(unsigned int *)0x30000030 = 0x80000014; /*des0*/
*(unsigned int *)0x30000034 = 0x3000; /*des1*/
*(unsigned int *)0x30000038 = 0x3000a000; /*des2*/
*(unsigned int *)0x3000000c = 0x30000010; /*des3*/
*(unsigned int *)0x3000001c = 0x30000020; /*des3*/
*(unsigned int *)0x3000002c = 0x30000030; /*des3*/
*(unsigned int *)0x3000003c = 0; /*des3*/
__arch_putl(0x30000000,0x91004088); /*first dma struct address*/
__arch_putl(0x82,0x91004080); /*open dma*/
printf("dma_transfer out\n");
}
static __inline__ void sd_init(void)
{
int temp,resp,ready_for_data;
printf("sd init\n");
__arch_putl(0x22000037,0x91004000); /*ctrl*/
__arch_putl(0x20070008,0x9100404c); /*fifo*/
__arch_putl(0x3ffff,0x91004044); /*RINTSTS*/
sdio_init();
do{
__arch_putl(gRCA<<16,0x91004028);
__arch_putl(0x8000014d,0x9100402c);
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
temp = __arch_getl(0x91004044);
__arch_putl(temp,0x91004044);
resp = __arch_getl(0x91004030);
resp = resp & 0x100;
printf("resp_cmd13 = 0x%08x\n",resp);
}while(resp !=0x100);
#if 1
printf("cmd_16\n");
__arch_putl(0x200,0x91004028);
__arch_putl(0x80002150,0x9100402c); /*cmd 16*/
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);/*cmd done*/
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
__arch_putl(__arch_getl(0x91004044),0x91004044);
printf("resp_cmd16=0x%08x\n",__arch_getl(0x91004030));
#endif
__arch_putl(0x200,0x9100401c); /*blksize*/
__arch_putl(0xc000,0x91004020); /*48k*/
dma_transfer();
printf("cmd_18\n");
__arch_putl(0x0,0x91004028); /*address 0*/
__arch_putl(0x80002352,0x9100402c); /*cmd 18*/
while((__arch_getl(0x9100402c)&0x80000000)==0x80000000);/*cmd done*/
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x4;
}while(temp != 0x4);
__arch_putl(temp,0x91004044);
printf("resp_cmd18=0x%08x\n",__arch_getl(0x91004030));
printf("RINTSTS=0x%08x\n",__arch_getl(0x91004044));
printf("cmd transfer over\n");
do{
temp = __arch_getl(0x91004044);
temp = temp & 0x8;
}while(temp != 0x8);
__arch_putl(__arch_getl(0x91004044),0x91004044);
printf("sd data transfer over\n");
printf("DATA=0x%08x\n",__arch_getl(0x91004100));
printf("RINTSTS=0x%08x\n",__arch_getl(0x91004044));
printf("IDSTS=0x%08x\n",__arch_getl(0x9100408c));
printf("DMA=0x%08x\n",__arch_getl(0x91004094));
printf("BUF=0x%08x\n",__arch_getl(0x91004098));
printf("IDSTS=0x%08x\n",__arch_getl(0x9100408c));
printf("BMOD=0x%08x\n",__arch_getl(0x91004080));
printf("TBBCNT=0x%08x\n",__arch_getl(0x91004060));
printf("0x30001000=0x%08x\n",*(unsigned int *)0x30001000);
printf("0x30004000=0x%08x\n",*(unsigned int *)0x30004000);
printf("0x30007000=0x%08x\n",*(unsigned int *)0x30007000);
printf("0x3000a000=0x%08x\n",*(unsigned int *)0x3000a000);
}