void __sramfunc sram_printhex(unsigned int hex) { int i = 8; sram_printch('0'); sram_printch('x'); while (i--) { unsigned char c = (hex & 0xF0000000) >> 28; sram_printch(c < 0xa ? c + '0' : c - 0xa + 'a'); hex <<= 4; } }
void __sramfunc sram_printascii(const char *s) { while (*s) { sram_printch(*s); s++; } }
void __sramfunc sram_i2c_send_start(void) { unsigned int con = readl_relaxed(SRAM_I2C_ADDRBASE + I2C_CON); con |= I2C_CON_START; if(con & I2C_CON_STOP) sram_printch('E'); writel_relaxed(con, SRAM_I2C_ADDRBASE + I2C_CON); }
__weak void __sramfunc sram_printch(char byte) { sram_log_char(byte); #ifdef DEBUG_UART_BASE writel_relaxed(byte, DEBUG_UART_BASE); dsb(); /* loop check LSR[6], Transmitter Empty bit */ while (!(readl_relaxed(DEBUG_UART_BASE + 0x14) & 0x40)) barrier(); if (byte == '\n') sram_printch('\r'); #endif }
void __sramfunc sram_i2c_get_ipd_event(int type) { int time = 2000; unsigned int con = readl_relaxed(SRAM_I2C_ADDRBASE + I2C_IPD); writel_relaxed(type, SRAM_I2C_ADDRBASE + I2C_IEN); do{ sram_udelay(10); con = readl_relaxed(SRAM_I2C_ADDRBASE + I2C_IPD); }while(((--time) & (~(con & type)))); writel_relaxed(type,SRAM_I2C_ADDRBASE + I2C_IPD); if(time <= 0){ sram_printch('T'); } }
int ddr_reconfig(int mode) { int baklcdctrl; int count =0; int i; unsigned int ret =0; unsigned int con3save, flags; unsigned int tmo =0; mode &=0xf; if((pDDR_Reg->MMGCR ==0) &&(mode <2)) { pDDR_Reg->PQCR[0] =(mode ==0) ?0x0e000000 : 0x0e00f000; pDDR_Reg->PQCR[1] =(mode ==0) ?0x0e000000 : 0x0e03f000; pDDR_Reg->PQCR[2] =(mode ==0) ?0x0e000000 : 0x0e00f000; pGRF_Reg->GRF_MEM_CON = (pGRF_Reg->GRF_MEM_CON & ~0x3FF) | ((mode ==0) ?((2<<0)|(1<<2)|(0<<4)|(1<<6)|(2<<8)):((0<<0)|(2<<2)|(1<<4)|(2<<6)|(2<<8))); return 1; } local_irq_save(flags); sram_printch('1'); /* if(mode ==2) { tmp =*(unsigned long volatile *)(0xf50080bc); pDDR_Reg->PQCR[0] =0x0e03f000; pDDR_Reg->PQCR[1] =0x0e01f000; pDDR_Reg->PQCR[2] =0x0e00f000; pDDR_Reg->MMGCR =(mode ==0) ?0 : 2; } */ // asm volatile ("cpsid if"); { __cpuc_flush_kern_all(); __cpuc_flush_user_all(); dsb(); //some risk: if a common to lcdc is going, then a read form 0xf410c0000 may retrun an old val con3save =pSCU_Reg->CRU_CLKGATE_CON[3]; pSCU_Reg->CRU_CLKGATE_CON[3] =con3save |(1<<3); pGRF_Reg->GRF_SOC_CON[0] |=(1<<0); { gpu_suspended =0; gpu_power =0; gpu_clock =0; if((*(unsigned long volatile *)(RK29_PMU_BASE +0x10) &0x40) ==0) { gpu_power =1; if((0xf<<14) !=(pSCU_Reg->CRU_CLKGATE_CON[3] &(0xf<<14))) { gpu_clock =1; if(*(unsigned long volatile *)(RK29_GPU_BASE +0x4) !=0x7fffffff) { //clock enable and not at idle gpu_suspended =1; #if 1 #if 1 int chktime =0; for(chktime =0; chktime<32; chktime++ ) { if(*(unsigned long volatile *)(RK29_GPU_BASE +0x4) !=0x7ffffffe) { chktime =0; // if((tmo =tmodelay1us(tmo)) >10) #if 0 //RECONFIG_DEBUG while(1); #else goto ddr_reconfig_cancel; #endif } } #if RECONFIG_DEBUG if(tmo >maxtimeout) { maxtimeout =tmo; printk("maxtimout %d\n", maxtimeout); } #endif { unsigned int i,tmp; currcmdbufadr =*(unsigned long volatile *)(RK29_GPU_BASE +0x664); if((currcmdbufadr&0xfff0) ==0) for(i =0; i<6; i++) { tmp =*(unsigned long volatile *)(RK29_GPU_BASE +0x664); if(((tmp >currcmdbufadr) &&((tmp -currcmdbufadr) >0x10)) ||((tmp <currcmdbufadr) &&((currcmdbufadr -tmp) >0x10))) { printk("gpu:cmdbuffer base reg read error 0x%x !=0x%x\n", tmp, currcmdbufadr); i =0; } else delayus(1); currcmdbufadr =tmp; } } #if 0 for(i =0; i<0x1000; i++) { unsigned int tmp; if(currcmdbufadr >(tmp =*(unsigned long volatile *)(0xf4120664))) currcmdbufadr =tmp; } #else if(*(int *)(currcmdbufadr +0x60000000) !=0x380000c8) //0x60000000 assume VA =PA +0x60000000 { currcmdbufadr -=8; if(*(int *)(currcmdbufadr +0x60000000) !=0x380000c8) { currcmdbufadr -=8; if(*(int *)(currcmdbufadr +0x60000000) !=0x380000c8) #if RECONFIG_DEBUG while(1); #else goto ddr_reconfig_cancel; #endif } } #endif #if 0 //RECONFIG_DEBUG if((currcmdbufadr &0xffffe000) !=0x736ce000) while(1); { int i; for(i =0; i<16; i++) mem[i] =*(int *)(currcmdbufadr +0x60000000 +(i-4)*4); } #endif #endif *(unsigned long volatile *)(RK29_GPU_BASE +0x658) =0x2; dsb(); while(*(unsigned long volatile *)(RK29_GPU_BASE +0x4) !=0x7fffffff) delayus(1); // #else gpuctl =*(unsigned long volatile *)(RK29_GPU_BASE +0x0); *(unsigned long volatile *)(RK29_GPU_BASE +0x0) =gpususpendcmd; delayus(100); #endif } } } sram_printch('5'); if(!(gpu_clock &gpu_power)) { unsigned int tmoadd1ms =tmo +3000; sram_printch('c'); // if(tmo==0) if(pGRF_Reg->GRF_OS_REG[3] ==0xff) while(1); pSCU_Reg->CRU_CLKGATE_CON[3] =(con3save |(1<<3)) &0xfffc3fff; clksel17 =pSCU_Reg->CRU_CLKSEL_CON[17]; pSCU_Reg->CRU_CLKSEL_CON[17]&=~(3<<14); dsb(); *(unsigned long volatile *)(RK29_PMU_BASE +0x10) &=~0x40; dsb(); while((tmo =tmodelay1us(tmo)) <tmoadd1ms); pSCU_Reg->CRU_CLKGATE_CON[3] =(con3save |(1<<3)) &0xfffc3fff; } } sram_printch('6'); //status check //3 VIP clock con2[22,18](0x20000064) VIPCTL[0](0x10108010) 0==stop while(((0)==(pSCU_Reg->CRU_CLKGATE_CON[2] &((0x1<<18)|(0x1<<22)))) &&((0)!=(*(unsigned long volatile *)(RK29_VIP_BASE +0x10) &(1<<0))) &&((1)!=(*(unsigned long volatile *)(RK29_VIP_BASE +0x2c) &(1<<0)))) if((tmo =tmodelay1us(tmo)) >20) #if RECONFIG_DEBUG // goto ddr_reconfig_cancel2; while(1); #else goto ddr_reconfig_cancel2; #endif sram_printch('7'); //1 IPP clock_con3[5:4](0x20000068) INT_ST[6](0x10110010) 1 ==working if(((0)==(pSCU_Reg->CRU_CLKGATE_CON[3] &(0x3<<4))) && ((0)!=(*(unsigned long volatile *)(RK29_IPP_BASE +0x10) &(1<<6)))) if((tmo =tmodelay1us(tmo)) >200000) #if RECONFIG_DEBUG while(1); #else goto ddr_reconfig_cancel2; #endif sram_printch('8'); //2 SDMA0 clock con0[10](0x2000005c) DSR[3:0](0x20180000) 0 ==stop // i2sxfer =*(unsigned long volatile *)(RK29_I2S0_BASE +0x28); // *(unsigned long volatile *)(RK29_I2S0_BASE +0x28) =0; while(((0)==(pSCU_Reg->CRU_CLKGATE_CON[0] &(0x1<<10))) &&(((0)!=(*(unsigned long volatile *)(RK29_SDMAC0_BASE +0x0) &(0xf<<0))) ||(((0)!=(*(unsigned long volatile *)(RK29_SDMAC0_BASE +0x100) &(0xf<<0)))/*&& ((0x27)!=(*(unsigned long volatile *)(RK29_SDMAC0_BASE +0x100) &(0xff<<0)))*/) ||((0)!=(*(unsigned long volatile *)(RK29_SDMAC0_BASE +0x108) &(0xf<<0))) ||((0)!=(*(unsigned long volatile *)(RK29_SDMAC0_BASE +0x110) &(0xf<<0))) ||((0)!=(*(unsigned long volatile *)(RK29_SDMAC0_BASE +0x118) &(0xf<<0))))) if((tmo =tmodelay1us(tmo)) >200000) #if RECONFIG_DEBUG while(1); #else goto ddr_reconfig_cancel2; #endif sram_printch('9'); //2 DMA0 clock con0[9](0x2000005c) DSR[3:0](0x201C0000) 0 ==stop while(((0)==(pSCU_Reg->CRU_CLKGATE_CON[0] &(0x1<<9))) &&(((0)!=(*(unsigned long volatile *)(RK29_DMAC0_BASE +0x0) &(0xf<<0))) ||((0)!=(*(unsigned long volatile *)(RK29_DMAC0_BASE +0x100) &(0xf<<0))) ||((0)!=(*(unsigned long volatile *)(RK29_DMAC0_BASE +0x108) &(0xf<<0))) ||((0)!=(*(unsigned long volatile *)(RK29_DMAC0_BASE +0x110) &(0xf<<0))) ||((0)!=(*(unsigned long volatile *)(RK29_DMAC0_BASE +0x118) &(0xf<<0))))) if((tmo =tmodelay1us(tmo)) >200000) #if RECONFIG_DEBUG while(1); #else goto ddr_reconfig_cancel2; #endif sram_printch('a'); //2 DMA1 clock con1[5](0x20000060) DSR[3:0](0x20078000) 0 ==stop while(((0)==(pSCU_Reg->CRU_CLKGATE_CON[1] &(0x1<<5))) &&(((0)!=(*(unsigned long volatile *)(RK29_DMAC1_BASE +0x0) &(0xf<<0))) ||((0)!=(*(unsigned long volatile *)(RK29_DMAC1_BASE +0x100) &(0xf<<0))) ||((0)!=(*(unsigned long volatile *)(RK29_DMAC1_BASE +0x108) &(0xf<<0))) ||((0)!=(*(unsigned long volatile *)(RK29_DMAC1_BASE +0x110) &(0xf<<0))) ||((0)!=(*(unsigned long volatile *)(RK29_DMAC1_BASE +0x118) &(0xf<<0))))) if((tmo =tmodelay1us(tmo)) >200000) #if RECONFIG_DEBUG while(1); #else goto ddr_reconfig_cancel2; #endif sram_printch('b'); /* //4 USB if(((0)==(*(unsigned long volatile *)(0xf5000068) &(0x3<<4))) && ((0)==(*(unsigned long volatile *)(0xf4110010) &(1<<6)))) while(1); */ //5 VPU when select VDPU clk VDPU clock con2[19,13:12]else con2[18,11:10] (0x20000068) wreg[1](0x10104204) 0==stop //wreg24[0] 0==stop { int clkgatemask; clkgatemask =((0x1<<18)|(0x3<<10))<<((((pGRF_Reg->GRF_SOC_CON[0]))>>23) &1); if((0)==(pSCU_Reg->CRU_CLKGATE_CON[3] &clkgatemask)) while((((0)!=(*(unsigned long volatile *)(RK29_VCODEC_BASE +0x204) &(1<<0))) &&((0)==(*(unsigned long volatile *)(RK29_VCODEC_BASE +0x204) &(1<<13)))) //until idle or buff_int ||((0)!=(*(unsigned long volatile *)(RK29_VCODEC_BASE +0x38) &(1<<0)))) if((tmo =tmodelay1us(tmo)) >200000) #if RECONFIG_DEBUG while(1); #else goto ddr_reconfig_cancel2; #endif } // while(((0xf<<14)!=(pSCU_Reg->CRU_CLKGATE_CON[3] &(0xf<<14))) && // (*(unsigned long volatile *)(0xf4120004) !=0x7fffffff)); sram_printch('2'); { static unsigned long save_sp; DDR_SAVE_SP(save_sp); { __ddr_reconfig(mode); } DDR_RESTORE_SP(save_sp); } // do_ddr_reconfig(mode); /////////////////////////////////////////////////////////// sram_printch('3'); ret =1; // *(unsigned long volatile *)(RK29_I2S0_BASE +0x28) =i2sxfer; if(gpu_suspended) { #if 1 *(unsigned long volatile *)(RK29_GPU_BASE +0x654) =currcmdbufadr; *(unsigned long volatile *)(RK29_GPU_BASE +0x658) =0x10002; dsb(); while(*(unsigned long volatile *)(RK29_GPU_BASE +0x4) !=0x7ffffffe); #if RECONFIG_DEBUG mem[34] =*(unsigned long volatile *)(RK29_GPU_BASE +0x660); mem[35] =*(unsigned long volatile *)(RK29_GPU_BASE +0x664); mem[36] =*(unsigned long volatile *)(RK29_GPU_BASE +0x668); mem[37] =*(unsigned long volatile *)(RK29_GPU_BASE +0x66c); { int i; for(i =0; i<16; i++) mem[i+16] =*(int *)(currcmdbufadr +0x60000000 +(i-4)*4); } mem[32] =currcmdbufadr; mem[33]++; // printk("reconfig 0x%x ,0x%x ,0x%x ,0x%x ,", *(unsigned int volatile *)(0xf4120660), // *(unsigned int volatile *)(0xf4120664),*(unsigned int volatile *)(0xf4120668), // *(unsigned int volatile *)(0xf412066c)); #endif #else *(unsigned long volatile *)(RK29_GPU_BASE +0x0) =gpuctl; #endif } #if RECONFIG_DEBUG printk("clkgate =0x%x, 0x%x\n",pSCU_Reg->CRU_CLKGATE_CON[3],tmo); #endif count++; ddr_reconfig_cancel2: if(!gpu_clock ) pSCU_Reg->CRU_CLKSEL_CON[17] =clksel17; if(!gpu_power) *(unsigned long volatile *)(RK29_PMU_BASE +0x10) |=0x40; dsb(); #if RECONFIG_DEBUG if((gpu_power ==0) &&( 1 ==gpu_clock)) while(1); #endif ddr_reconfig_cancel: pSCU_Reg->CRU_CLKGATE_CON[3] =con3save; pGRF_Reg->GRF_SOC_CON[0]&=~(1<<0); } local_irq_restore(flags); sram_printch('4'); return ret; }