/****************************************************************************** * pwrap_hal.c - Linux pmic_wrapper Driver,hardware_dependent driver * * * DESCRIPTION: * This file provid the other drivers PMIC wrapper relative functions * ******************************************************************************/ #include #include #include #include #include #include #ifdef CONFIG_OF #include #include #include #endif #include #include #include "pwrap_hal.h" #define PMIC_WRAP_DEVICE "pmic_wrap" /*-----start-- global variable-------------------------------------------------*/ #ifdef CONFIG_OF void __iomem *pwrap_base; static void __iomem *topckgen_base; static void __iomem *infracfg_ao_base; #endif static struct mt_pmic_wrap_driver *mt_wrp; static spinlock_t wrp_lock = __SPIN_LOCK_UNLOCKED(lock); //spinlock_t wrp_lock = __SPIN_LOCK_UNLOCKED(lock); //----------interral API ------------------------ static S32 _pwrap_init_dio( U32 dio_en ); static S32 _pwrap_init_cipher( void ); static S32 _pwrap_init_reg_clock( U32 regck_sel ); static S32 _pwrap_wacs2_nochk( U32 write, U32 adr, U32 wdata, U32 *rdata ); S32 pwrap_write_nochk( U32 adr, U32 wdata ); S32 pwrap_read_nochk( U32 adr, U32 *rdata ); #ifdef CONFIG_OF static int pwrap_of_iomap(void); static void pwrap_of_iounmap(void); #endif #ifdef PMIC_WRAP_NO_PMIC /*-pwrap debug--------------------------------------------------------------------------*/ static inline void pwrap_dump_all_register(void) { return; } /********************************************************************************************/ //extern API for PMIC driver, INT related control, this INT is for PMIC chip to AP /********************************************************************************************/ U32 mt_pmic_wrap_eint_status(void) { PWRAPLOG("[PMIC2]first of all PMIC_WRAP_STAUPD_GRPEN=0x%x\n", WRAP_RD32(PMIC_WRAP_STAUPD_GRPEN)); PWRAPLOG("[PMIC2]first of all PMIC_WRAP_EINT_STA=0x%x\n", WRAP_RD32(PMIC_WRAP_EINT_STA)); return WRAP_RD32(PMIC_WRAP_EINT_STA); } void mt_pmic_wrap_eint_clr(int offset) { if((offset<0)||(offset>3)) { PWRAPERR("clear EINT flag error, only 0-3 bit\n"); }else { WRAP_WR32(PMIC_WRAP_EINT_CLR,(1<wfdle-->WFVLDCLR;write:FSM_REQ-->idle switch ( GET_WACS0_FSM( reg_rdata ) ) { case WACS_FSM_WFVLDCLR: WRAP_WR32(wacs_vldclr_register , 1); PWRAPERR("WACS_FSM = PMIC_WRAP_WACS_VLDCLR\n"); break; case WACS_FSM_WFDLE: PWRAPERR("WACS_FSM = WACS_FSM_WFDLE\n"); break; case WACS_FSM_REQ: PWRAPERR("WACS_FSM = WACS_FSM_REQ\n"); break; default: break; } }while( fp(reg_rdata)); //IDLE State if(read_reg) *read_reg=reg_rdata; return 0; } static inline U32 wait_for_state_idle(loop_condition_fp fp,U32 timeout_us,void *wacs_register,void *wacs_vldclr_register,U32 *read_reg) { U64 start_time_ns=0, timeout_ns=0; U32 reg_rdata; start_time_ns = _pwrap_get_current_time(); timeout_ns = _pwrap_time2ns(timeout_us); do { if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) { PWRAPERR("wait_for_state_idle timeout when waiting for idle\n"); pwrap_dump_ap_register(); //pwrap_trace_wacs2(); //BUG_ON(1); return E_PWR_WAIT_IDLE_TIMEOUT; } reg_rdata = WRAP_RD32(wacs_register); if( GET_INIT_DONE0( reg_rdata ) != WACS_INIT_DONE) { PWRAPERR("initialization isn't finished \n"); return E_PWR_NOT_INIT_DONE; } //if last read command timeout,clear vldclr bit //read command state machine:FSM_REQ-->wfdle-->WFVLDCLR;write:FSM_REQ-->idle switch ( GET_WACS0_FSM( reg_rdata ) ) { case WACS_FSM_WFVLDCLR: WRAP_WR32(wacs_vldclr_register , 1); PWRAPERR("WACS_FSM = PMIC_WRAP_WACS_VLDCLR\n"); break; case WACS_FSM_WFDLE: PWRAPERR("WACS_FSM = WACS_FSM_WFDLE\n"); break; case WACS_FSM_REQ: PWRAPERR("WACS_FSM = WACS_FSM_REQ\n"); break; default: break; } }while( fp(reg_rdata)); //IDLE State if(read_reg) *read_reg=reg_rdata; return 0; } /********************************************************************************************/ //extern API for PMIC driver, INT related control, this INT is for PMIC chip to AP /********************************************************************************************/ U32 mt_pmic_wrap_eint_status(void) { return WRAP_RD32(PMIC_WRAP_EINT_STA); } void mt_pmic_wrap_eint_clr(int offset) { if((offset<0)||(offset>3)) { PWRAPERR("clear EINT flag error, only 0-3 bit\n"); }else { WRAP_WR32(PMIC_WRAP_EINT_CLR,(1<pid,wdata); BUG_ON(1); } } // Check IDLE & INIT_DONE in advance return_value=wait_for_state_idle(wait_for_fsm_idle,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,PMIC_WRAP_WACS2_VLDCLR,0); if(return_value!=0) { PWRAPERR("wait_for_fsm_idle fail,return_value=%d\n",return_value); goto FAIL; } wacs_write = write << 31; wacs_adr = (adr >> 1) << 16; wacs_cmd= wacs_write | wacs_adr | wdata; WRAP_WR32(PMIC_WRAP_WACS2_CMD,wacs_cmd); if( write == 0 ) { if (NULL == rdata) { PWRAPERR("rdata is a NULL pointer\n"); return_value= E_PWR_INVALID_ARG; goto FAIL; } return_value=wait_for_state_ready(wait_for_fsm_vldclr,TIMEOUT_READ,PMIC_WRAP_WACS2_RDATA,®_rdata); if(return_value!=0) { PWRAPERR("wait_for_fsm_vldclr fail,return_value=%d\n",return_value); return_value+=1;//E_PWR_NOT_INIT_DONE_READ or E_PWR_WAIT_IDLE_TIMEOUT_READ goto FAIL; } *rdata = GET_WACS0_RDATA( reg_rdata ); WRAP_WR32(PMIC_WRAP_WACS2_VLDCLR , 1); } //spin_unlock_irqrestore(&wrp_lock,flags); FAIL: spin_unlock_irqrestore(&wrp_lock,flags); if(return_value!=0) { PWRAPERR("pwrap_wacs2_hal fail,return_value=%d\n",return_value); PWRAPERR("timeout:BUG_ON here\n"); //BUG_ON(1); } //wrap_access_time=sched_clock(); //pwrap_trace(wrap_access_time,return_value,write, adr, wdata,(U32)rdata); return return_value; } //S32 pwrap_wacs2( U32 write, U32 adr, U32 wdata, U32 *rdata ) //{ // return pwrap_wacs2_hal(write, adr,wdata,rdata ); //} //EXPORT_SYMBOL(pwrap_wacs2); //S32 pwrap_read( U32 adr, U32 *rdata ) //{ // return pwrap_wacs2( PWRAP_READ, adr,0,rdata ); //} //EXPORT_SYMBOL(pwrap_read); // //S32 pwrap_write( U32 adr, U32 wdata ) //{ // return pwrap_wacs2( PWRAP_WRITE, adr,wdata,0 ); //} //EXPORT_SYMBOL(pwrap_write); //****************************************************************************** //--internal API for pwrap_init------------------------------------------------- //****************************************************************************** //-------------------------------------------------------- // Function : _pwrap_wacs2_nochk() // Description : // Parameter : // Return : //-------------------------------------------------------- //static S32 pwrap_read_nochk( U32 adr, U32 *rdata ) S32 pwrap_read_nochk( U32 adr, U32 *rdata ) { return _pwrap_wacs2_nochk( 0, adr, 0, rdata ); } /*EXPORT_SYMBOL(pwrap_read_nochk);*/ S32 pwrap_write_nochk( U32 adr, U32 wdata ) { return _pwrap_wacs2_nochk( 1, adr,wdata,0 ); } /*EXPORT_SYMBOL(pwrap_write_nochk);*/ static S32 _pwrap_wacs2_nochk( U32 write, U32 adr, U32 wdata, U32 *rdata ) { U32 reg_rdata=0x0; U32 wacs_write=0x0; U32 wacs_adr=0x0; U32 wacs_cmd=0x0; U32 return_value=0x0; //PWRAPFUC(); // Check argument validation if(0 != write && 0xa==adr){ if(0 == (wdata & (1<<11)) || 1==(wdata & (1<<10))){ PWRAPERR("_pwrap_wacs2_nochk check 0xa err pid=%d, wdata=0x%x\n",current->pid,wdata); BUG_ON(1); } } if( (write & ~(0x1)) != 0) return E_PWR_INVALID_RW; if( (adr & ~(0xffff)) != 0) return E_PWR_INVALID_ADDR; if( (wdata & ~(0xffff)) != 0) return E_PWR_INVALID_WDAT; // Check IDLE return_value=wait_for_state_ready_init(wait_for_fsm_idle,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0); if(return_value!=0) { PWRAPERR("_pwrap_wacs2_nochk write command fail,return_value=%x\n", return_value); return return_value; } wacs_write = write << 31; wacs_adr = (adr >> 1) << 16; wacs_cmd = wacs_write | wacs_adr | wdata; WRAP_WR32(PMIC_WRAP_WACS2_CMD,wacs_cmd); if( write == 0 ) { if (NULL == rdata) return E_PWR_INVALID_ARG; // wait for read data ready return_value=wait_for_state_ready_init(wait_for_fsm_vldclr,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,®_rdata); if(return_value!=0) { PWRAPERR("_pwrap_wacs2_nochk read fail,return_value=%x\n", return_value); return return_value; } *rdata = GET_WACS0_RDATA( reg_rdata ); WRAP_WR32(PMIC_WRAP_WACS2_VLDCLR , 1); } return 0; } //-------------------------------------------------------- // Function : _pwrap_init_dio() // Description :call it in pwrap_init,mustn't check init done // Parameter : // Return : //-------------------------------------------------------- static S32 _pwrap_init_dio( U32 dio_en ) { U32 arb_en_backup=0x0; U32 rdata=0x0; U32 return_value=0; //PWRAPFUC(); arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN); WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , WACS2); // only WACS2 #ifdef SLV_6328 pwrap_write_nochk(MT6328_DEW_DIO_EN, (dio_en)); #endif #ifdef SLV_6332 pwrap_write_nochk(MT6332_DEW_DIO_EN, (dio_en>>1)); #endif // Check IDLE & INIT_DONE in advance return_value=wait_for_state_ready_init(wait_for_idle_and_sync,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0); if(return_value!=0) { PWRAPERR("_pwrap_init_dio fail,return_value=%x\n", return_value); return return_value; } //enable AP DIO mode WRAP_WR32(PMIC_WRAP_DIO_EN , dio_en); // Read Test #ifdef SLV_6328 pwrap_read_nochk(MT6328_DEW_READ_TEST, &rdata); if( rdata != MT6328_DEFAULT_VALUE_READ_TEST ) { PWRAPERR("[Dio_mode][Read Test] fail,dio_en = %x, READ_TEST rdata=%x, exp=0x5aa5\n", dio_en, rdata); return E_PWR_READ_TEST_FAIL; } #endif #ifdef SLV_6332 pwrap_read_nochk(MT6332_DEW_READ_TEST, &rdata); if( rdata != MT6332_DEFAULT_VALUE_READ_TEST ) { PWRAPERR("[Dio_mode][Read Test] fail,dio_en = %x, READ_TEST rdata=%x, exp=0xa55a\n", dio_en, rdata); return E_PWR_READ_TEST_FAIL; } #endif WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , arb_en_backup); return 0; } //-------------------------------------------------------- // Function : _pwrap_init_cipher() // Description : // Parameter : // Return : //-------------------------------------------------------- static S32 _pwrap_init_cipher( void ) { U32 arb_en_backup=0; U32 rdata=0; U32 return_value=0; U32 start_time_ns=0, timeout_ns=0; //PWRAPFUC(); arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN); WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN ,WACS2); // only WACS0 WRAP_WR32(PMIC_WRAP_CIPHER_SWRST , 1); WRAP_WR32(PMIC_WRAP_CIPHER_SWRST , 0); WRAP_WR32(PMIC_WRAP_CIPHER_KEY_SEL , 1); WRAP_WR32(PMIC_WRAP_CIPHER_IV_SEL , 2); WRAP_WR32(PMIC_WRAP_CIPHER_EN , 1); //Config CIPHER @ PMIC #ifdef SLV_6328 pwrap_write_nochk(MT6328_DEW_CIPHER_SWRST, 0x1); pwrap_write_nochk(MT6328_DEW_CIPHER_SWRST, 0x0); pwrap_write_nochk(MT6328_DEW_CIPHER_KEY_SEL, 0x1); pwrap_write_nochk(MT6328_DEW_CIPHER_IV_SEL, 0x2); pwrap_write_nochk(MT6328_DEW_CIPHER_EN, 0x1); #endif #ifdef SLV_6332 pwrap_write_nochk(MT6332_DEW_CIPHER_SWRST, 0x1); pwrap_write_nochk(MT6332_DEW_CIPHER_SWRST, 0x0); pwrap_write_nochk(MT6332_DEW_CIPHER_KEY_SEL, 0x1); pwrap_write_nochk(MT6332_DEW_CIPHER_IV_SEL, 0x2); pwrap_write_nochk(MT6332_DEW_CIPHER_EN, 0x1); #endif PWRAPLOG("mt_pwrap_init---- debug7\n"); //wait for cipher data ready@AP return_value=wait_for_state_ready_init(wait_for_cipher_ready,TIMEOUT_WAIT_IDLE,PMIC_WRAP_CIPHER_RDY,0); if(return_value!=0) { PWRAPERR("wait for cipher data ready@AP fail,return_value=%x\n", return_value); return return_value; } PWRAPLOG("mt_pwrap_init---- debug8\n"); //wait for cipher data ready@PMIC #ifdef SLV_6328 start_time_ns = _pwrap_get_current_time(); timeout_ns = _pwrap_time2ns(0xFFFFFF); do { if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) { PWRAPERR("wait for cipher data ready@PMIC\n"); //pwrap_dump_all_register(); //return E_PWR_WAIT_IDLE_TIMEOUT; } pwrap_read_nochk(MT6328_DEW_CIPHER_RDY,&rdata); } while( rdata != 0x1 ); //cipher_ready pwrap_write_nochk(MT6328_DEW_CIPHER_MODE, 0x1); PWRAPLOG("mt_pwrap_init---- debug9\n"); #endif #ifdef SLV_6332 start_time_ns = _pwrap_get_current_time(); timeout_ns = _pwrap_time2ns(0xFFFFFF); do { if (_pwrap_timeout_ns(start_time_ns, timeout_ns)) { PWRAPERR("wait for cipher data ready@PMIC\n"); //pwrap_dump_all_register(); //return E_PWR_WAIT_IDLE_TIMEOUT; } pwrap_read_nochk(MT6332_DEW_CIPHER_RDY,&rdata); } while( rdata != 0x1 ); //cipher_ready pwrap_write_nochk(MT6332_DEW_CIPHER_MODE, 0x1); #endif //wait for cipher mode idle return_value=wait_for_state_ready_init(wait_for_idle_and_sync,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0); if(return_value!=0) { PWRAPERR("wait for cipher mode idle fail,return_value=%x\n", return_value); return return_value; } WRAP_WR32(PMIC_WRAP_CIPHER_MODE , 1); // Read Test #ifdef SLV_6328 pwrap_read_nochk(MT6328_DEW_READ_TEST, &rdata); if( rdata != MT6328_DEFAULT_VALUE_READ_TEST ) { PWRAPERR("_pwrap_init_cipher,read test error,error code=%x, rdata=%x\n", 1, rdata); return E_PWR_READ_TEST_FAIL; } #endif #ifdef SLV_6332 pwrap_read_nochk(MT6332_DEW_READ_TEST, &rdata); if( rdata != MT6332_DEFAULT_VALUE_READ_TEST ) { PWRAPERR("_pwrap_init_cipher,read test error,error code=%x, rdata=%x\n", 1, rdata); return E_PWR_READ_TEST_FAIL; } #endif WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , arb_en_backup); return 0; } //-------------------------------------------------------- // Function : _pwrap_init_sistrobe() // Description : Initialize SI_CK_CON and SIDLY // Parameter : // Return : //-------------------------------------------------------- static S32 _pwrap_init_sistrobe( void ) { U32 arb_en_backup=0; U32 rdata=0; U32 i=0; S32 ind=0; U32 tmp1=0; U32 tmp2=0; U32 result_faulty=0; U32 result[2]={0,0}; S32 leading_one[2]={-1,-1}; S32 tailing_one[2]={-1,-1}; arb_en_backup = WRAP_RD32(PMIC_WRAP_HIPRIO_ARB_EN); WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN ,WACS2); // only WACS2 //--------------------------------------------------------------------- // Scan all possible input strobe by READ_TEST //--------------------------------------------------------------------- for( ind=0; ind<24; ind++) // 24 sampling clock edge { WRAP_WR32(PMIC_WRAP_SI_CK_CON , (ind >> 2) & 0x7); WRAP_WR32(PMIC_WRAP_SIDLY ,0x3 - (ind & 0x3)); #ifdef SLV_6328 _pwrap_wacs2_nochk(0, MT6328_DEW_READ_TEST, 0, &rdata); if( rdata == MT6328_DEFAULT_VALUE_READ_TEST ) { PWRAPLOG("_pwrap_init_sistrobe [Read Test of MT6328] pass,index=%d rdata=%x\n", ind,rdata); result[0] |= (0x1 << ind); }else { PWRAPLOG("_pwrap_init_sistrobe [Read Test of MT6328] tuning,index=%d rdata=%x\n", ind,rdata); } #endif #ifdef SLV_6332 _pwrap_wacs2_nochk(0, MT6332_DEW_READ_TEST, 0, &rdata); if( rdata == MT6332_DEFAULT_VALUE_READ_TEST ) { PWRAPLOG("_pwrap_init_sistrobe [Read Test of MT6332] pass,index=%d rdata=%x\n", ind,rdata); result[1] |= (0x1 << ind); }else { PWRAPLOG("_pwrap_init_sistrobe [Read Test of MT6332] tuning,index=%d rdata=%x\n", ind,rdata); } #endif } #ifndef SLV_6328 result[0] = result[1]; #endif #ifndef SLV_6332 result[1] = result[0]; #endif //--------------------------------------------------------------------- // Locate the leading one and trailing one of PMIC 1/2 //--------------------------------------------------------------------- for( ind=23 ; ind>=0 ; ind-- ) { if( (result[0] & (0x1 << ind)) && leading_one[0] == -1){ leading_one[0] = ind; } if(leading_one[0] > 0) { break;} } for( ind=23 ; ind>=0 ; ind-- ) { if( (result[1] & (0x1 << ind)) && leading_one[1] == -1){ leading_one[1] = ind; } if(leading_one[1] > 0) { break;} } for( ind=0 ; ind<24 ; ind++ ) { if( (result[0] & (0x1 << ind)) && tailing_one[0] == -1){ tailing_one[0] = ind; } if(tailing_one[0] > 0) { break;} } for( ind=0 ; ind<24 ; ind++ ) { if( (result[1] & (0x1 << ind)) && tailing_one[1] == -1){ tailing_one[1] = ind; } if(tailing_one[1] > 0) { break;} } //--------------------------------------------------------------------- // Check the continuity of pass range //--------------------------------------------------------------------- for( i=0; i<2; i++) { tmp1 = (0x1 << (leading_one[i]+1)) - 1; tmp2 = (0x1 << tailing_one[i]) - 1; if( (tmp1 - tmp2) != result[i] ) { /*TERR = "[DrvPWRAP_InitSiStrobe] Fail at PMIC %d, result = %x, leading_one:%d, tailing_one:%d" , i+1, result[i], leading_one[i], tailing_one[i]*/ PWRAPERR("_pwrap_init_sistrobe Fail at PMIC %d, result = %x, leading_one:%d, tailing_one:%d\n", i+1, result[i], leading_one[i], tailing_one[i]); result_faulty = 0x1; } } //--------------------------------------------------------------------- // Config SICK and SIDLY to the middle point of pass range //--------------------------------------------------------------------- if( result_faulty == 0 ) { // choose the best point in the interaction of PMIC1's pass range and PMIC2's pass range ind = ( (leading_one[0] + tailing_one[0])/2 + (leading_one[1] + tailing_one[1])/2 )/2; /*TINFO = "The best point in the interaction area is %d, ind"*/ WRAP_WR32(PMIC_WRAP_SI_CK_CON , (ind >> 2) & 0x7); WRAP_WR32(PMIC_WRAP_SIDLY , 0x3 - (ind & 0x3)); //--------------------------------------------------------------------- // Restore //--------------------------------------------------------------------- WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , arb_en_backup); return 0; } else { PWRAPERR("_pwrap_init_sistrobe Fail,result_faulty=%x\n", result_faulty); return result_faulty; } } //-------------------------------------------------------- // Function : _pwrap_reset_spislv() // Description : // Parameter : // Return : //-------------------------------------------------------- static S32 _pwrap_reset_spislv( void ) { U32 ret=0; U32 return_value=0; //PWRAPFUC(); // This driver does not using _pwrap_switch_mux // because the remaining requests are expected to fail anyway WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN , DISABLE_ALL); WRAP_WR32(PMIC_WRAP_WRAP_EN , DISABLE); WRAP_WR32(PMIC_WRAP_MUX_SEL , MANUAL_MODE); WRAP_WR32(PMIC_WRAP_MAN_EN ,ENABLE); WRAP_WR32(PMIC_WRAP_DIO_EN ,DISABLE); WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_CSL << 8));//0x2100 WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8)); //0x2800//to reset counter WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_CSH << 8));//0x2000 WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8)); WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8)); WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8)); WRAP_WR32(PMIC_WRAP_MAN_CMD , (OP_WR << 13) | (OP_OUTS << 8)); return_value=wait_for_state_ready_init(wait_for_sync,TIMEOUT_WAIT_IDLE,PMIC_WRAP_WACS2_RDATA,0); if(return_value!=0) { PWRAPERR("_pwrap_reset_spislv fail,return_value=%x\n", return_value); ret=E_PWR_TIMEOUT; goto timeout; } WRAP_WR32(PMIC_WRAP_MAN_EN ,DISABLE); WRAP_WR32(PMIC_WRAP_MUX_SEL ,WRAPPER_MODE); timeout: WRAP_WR32(PMIC_WRAP_MAN_EN ,DISABLE); WRAP_WR32(PMIC_WRAP_MUX_SEL ,WRAPPER_MODE); return ret; } static S32 _pwrap_init_reg_clock( U32 regck_sel ) { //U32 wdata=0; //U32 rdata=0; PWRAPFUC(); // Set Dummy cycle 6328 and 6332 (assume 12MHz) #ifdef SLV_6328 pwrap_write_nochk(MT6328_DEW_RDDMY_NO, 0x8); #endif #ifdef SLV_6332 pwrap_write_nochk(MT6332_DEW_RDDMY_NO, 0x8); #endif WRAP_WR32(PMIC_WRAP_RDDMY ,0x88); // Config SPI Waveform according to reg clk if( regck_sel == 1 ) { // 6MHz in 6323 => no support ; 18MHz in 6320 WRAP_WR32(PMIC_WRAP_CSHEXT_READ , 0x0); // for 6320, slave need enough time (4T of PMIC reg_ck) to back idle state WRAP_WR32(PMIC_WRAP_CSHEXT_WRITE , 0x6);// wait data written into register => 3T_PMIC: consists of CSLEXT_END(1T) + CSHEXT(6T) WRAP_WR32(PMIC_WRAP_CSLEXT_START , 0x0); WRAP_WR32(PMIC_WRAP_CSLEXT_END , 0x0); } else { //Safe mode WRAP_WR32(PMIC_WRAP_CSHEXT_WRITE , 0xff); WRAP_WR32(PMIC_WRAP_CSHEXT_READ , 0xff); WRAP_WR32(PMIC_WRAP_CSLEXT_START , 0xf); WRAP_WR32(PMIC_WRAP_CSLEXT_END , 0xf); } return 0; } //-------------------------------------------------------- // Function : DrvPWRAP_Switch_Strobe_Setting() // Description : used to switch input data calibration setting before system sleep or after system wakeup // no use since SPI_CK (26MHz) is always kept unchanged // Parameter : // Return : //-------------------------------------------------------- //void DrvPWRAP_Switch_Strobe_Setting (int si_ck_con, int sidly) //{ // int reg_rdata; // // turn off spi_wrap // *PMIC_WRAP_WRAP_EN = 0; // // wait for WRAP to be in idle state // // and no remaining rdata to be received // do // { // reg_rdata = *PMIC_WRAP_WRAP_STA; // } while ( (GET_WRAP_FSM(reg_rdata) != 0) || // (GET_WRAP_CH_DLE_RESTCNT(reg_rdata)) != 0 ); // // *PMIC_WRAP_SI_CK_CON = si_ck_con; // *PMIC_WRAP_SIDLY = sidly; // // // turn on spi_wrap // *PMIC_WRAP_WRAP_EN = 1; //} static S32 _pwrap_init_signature( U8 path ) { int ret; U32 rdata=0x0; PWRAPFUC(); if(path == 1){ //############################### // Signature Checking - Using Write Test Register // should be the last to modify WRITE_TEST //############################### _pwrap_wacs2_nochk(1, MT6328_DEW_WRITE_TEST, 0x5678, &rdata); WRAP_WR32(PMIC_WRAP_SIG_ADR,MT6328_DEW_WRITE_TEST); WRAP_WR32(PMIC_WRAP_SIG_VALUE,0x5678); WRAP_WR32(PMIC_WRAP_SIG_MODE, 0x1); }else{ //############################### // Signature Checking using CRC and EINT update // should be the last to modify WRITE_TEST //############################### #ifdef SLV_6328 ret = pwrap_write_nochk(MT6328_DEW_CRC_EN, ENABLE); if( ret != 0 ) { PWRAPERR("MT6328 enable CRC fail,ret=%x\n", ret); return E_PWR_INIT_ENABLE_CRC; } WRAP_WR32(PMIC_WRAP_SIG_ADR,WRAP_RD32(PMIC_WRAP_SIG_ADR)|MT6328_DEW_CRC_VAL); //WRAP_WR32(PMIC_WRAP_EINT_STA0_ADR,MT6328_INT_STA); WRAP_WR32(PMIC_WRAP_STAUPD_GRPEN,WRAP_RD32(PMIC_WRAP_STAUPD_GRPEN)|0x35); #endif #ifdef SLV_6332 ret = pwrap_write_nochk(MT6332_DEW_CRC_EN, ENABLE); if( ret != 0 ) { PWRAPERR("MT6332 enable CRC fail,ret=%x\n", ret); return E_PWR_INIT_ENABLE_CRC; } WRAP_WR32(PMIC_WRAP_SIG_ADR,WRAP_RD32(PMIC_WRAP_SIG_ADR)|(MT6332_DEW_CRC_VAL<<16)); WRAP_WR32(PMIC_WRAP_EINT_STA1_ADR,MT6332_INT_STA); WRAP_WR32(PMIC_WRAP_STAUPD_GRPEN,WRAP_RD32(PMIC_WRAP_STAUPD_GRPEN)|0xa); #endif } WRAP_WR32(PMIC_WRAP_CRC_EN, ENABLE); return 0; } /* *pmic_wrap init,init wrap interface * */ S32 pwrap_init ( void ) { S32 sub_return=0; S32 sub_return1=0; //S32 ret=0; U32 rdata=0x0; //U32 regValue; //U32 timeout=0; //u32 cg_mask = 0; //u32 backup = 0; PWRAPFUC(); #ifdef CONFIG_OF sub_return = pwrap_of_iomap(); if (sub_return) return sub_return; #endif PWRAPLOG("mt_pwrap_init---- debug2\n"); //############################### //toggle PMIC_WRAP and pwrap_spictl reset //############################### // WRAP_SET_BIT(0x80,INFRA_GLOBALCON_RST0); // WRAP_CLR_BIT(0x80,INFRA_GLOBALCON_RST0); __pwrap_soft_reset(); PWRAPLOG("mt_pwrap_init---- debug3\n"); //############################### // Set SPI_CK_freq = 26MHz //############################### WRAP_WR32(CLK_CFG_4_CLR,CLK_SPI_CK_26M); //############################### //toggle PERI_PWRAP_BRIDGE reset //############################### //WRAP_SET_BIT(0x04,PERI_GLOBALCON_RST1); //WRAP_CLR_BIT(0x04,PERI_GLOBALCON_RST1); //############################### //Enable DCM //############################### //WRAP_WR32(PMIC_WRAP_DCM_EN , ENABLE); WRAP_WR32(PMIC_WRAP_DCM_EN , 3);//enable CRC DCM and Pwrap DCM WRAP_WR32(PMIC_WRAP_DCM_DBC_PRD ,DISABLE); //no debounce PWRAPLOG("mt_pwrap_init---- debug4\n"); //############################### //Reset SPISLV //############################### sub_return=_pwrap_reset_spislv(); if( sub_return != 0 ) { PWRAPERR("error,_pwrap_reset_spislv fail,sub_return=%x\n",sub_return); return E_PWR_INIT_RESET_SPI; } //############################### // Enable WACS2 //############################### WRAP_WR32(PMIC_WRAP_WRAP_EN,ENABLE);//enable wrap WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN,WACS2); //Only WACS2 WRAP_WR32(PMIC_WRAP_WACS2_EN,ENABLE); PWRAPLOG("mt_pwrap_init---- debug5\n"); //############################### // Input data calibration flow; //############################### sub_return = _pwrap_init_sistrobe(); if( sub_return != 0 ) { PWRAPERR("error,DrvPWRAP_InitSiStrobe fail,sub_return=%x\n",sub_return); return E_PWR_INIT_SIDLY; } PWRAPLOG("mt_pwrap_init---- debug6\n"); //############################### // SPI Waveform Configuration //############################### //0:safe mode, 1:18MHz sub_return = _pwrap_init_reg_clock(1); if( sub_return != 0) { PWRAPERR("error,_pwrap_init_reg_clock fail,sub_return=%x\n",sub_return); return E_PWR_INIT_REG_CLOCK; } //############################### // Enable DIO mode //############################### //PMIC2 dual io not ready ///TODO: Fix me //for early porting #if 1 sub_return = _pwrap_init_dio(1); if( sub_return != 0 ) { PWRAPERR("_pwrap_init_dio test error,error code=%x, sub_return=%x\n", 0x11, sub_return); return E_PWR_INIT_DIO; } #endif //############################### // Enable Encryption //############################### PWRAPLOG("have cipher\n"); sub_return = _pwrap_init_cipher(); if( sub_return != 0 ) { PWRAPERR("Enable Encryption fail, return=%x\n", sub_return); return E_PWR_INIT_CIPHER; } //############################### // Write test using WACS2 //############################### //check Wtiet test default value #ifdef SLV_6328 sub_return = pwrap_write_nochk(MT6328_DEW_WRITE_TEST, MT6328_WRITE_TEST_VALUE); sub_return1 = pwrap_read_nochk(MT6328_DEW_WRITE_TEST, &rdata); if( rdata != MT6328_WRITE_TEST_VALUE ) { PWRAPERR("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n", rdata,sub_return,sub_return1); return E_PWR_INIT_WRITE_TEST; } #endif #ifdef SLV_6332 sub_return = pwrap_write_nochk(MT6332_DEW_WRITE_TEST, MT6332_WRITE_TEST_VALUE); sub_return1 = pwrap_read_nochk(MT6332_DEW_WRITE_TEST, &rdata); if( rdata != MT6332_WRITE_TEST_VALUE ) { PWRAPERR("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n", rdata,sub_return,sub_return1); return E_PWR_INIT_WRITE_TEST; } #endif //############################### // Signature Checking - Using CRC // should be the last to modify WRITE_TEST //############################### PWRAPLOG("mt_pwrap_init---- debug10\n"); ///TODO: Fix me //for early porting really no need? #if 0 sub_return = _pwrap_init_signature(0); if( sub_return != 0 ) { PWRAPERR("Enable CRC fail, return=%x\n", sub_return); return E_PWR_INIT_ENABLE_CRC; } #endif #if 1 // ADC init WRAP_WR32(PMIC_WRAP_ADC_CMD_ADDR,MT6328_AUXADC_RQST1_SET); WRAP_WR32(PMIC_WRAP_PWRAP_ADC_CMD,0x0100); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR_LATEST , MT6328_AUXADC_ADC32); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR_WP , MT6328_AUXADC_MDBG_1); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR0 , MT6328_AUXADC_BUF0); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR1 , MT6328_AUXADC_BUF1); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR2 , MT6328_AUXADC_BUF2); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR3 , MT6328_AUXADC_BUF3); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR4 , MT6328_AUXADC_BUF4); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR5 , MT6328_AUXADC_BUF5); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR6 , MT6328_AUXADC_BUF6); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR7 , MT6328_AUXADC_BUF7); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR8 , MT6328_AUXADC_BUF8); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR9 , MT6328_AUXADC_BUF9); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR10 , MT6328_AUXADC_BUF10); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR11 , MT6328_AUXADC_BUF11); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR12 , MT6328_AUXADC_BUF12); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR13 , MT6328_AUXADC_BUF13); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR14 , MT6328_AUXADC_BUF14); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR15 , MT6328_AUXADC_BUF15); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR16 , MT6328_AUXADC_BUF16); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR17 , MT6328_AUXADC_BUF17); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR18 , MT6328_AUXADC_BUF18); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR19 , MT6328_AUXADC_BUF19); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR20 , MT6328_AUXADC_BUF20); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR21 , MT6328_AUXADC_BUF21); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR22 , MT6328_AUXADC_BUF22); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR23 , MT6328_AUXADC_BUF23); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR24 , MT6328_AUXADC_BUF24); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR25 , MT6328_AUXADC_BUF25); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR26 , MT6328_AUXADC_BUF26); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR27 , MT6328_AUXADC_BUF27); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR28 , MT6328_AUXADC_BUF28); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR29 , MT6328_AUXADC_BUF29); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR30 , MT6328_AUXADC_BUF30); WRAP_WR32(PMIC_WRAP_MD_ADC_RDATA_ADDR31 , MT6328_AUXADC_BUF31); #endif // adc 6328 setting pwrap_write_nochk(MT6328_AUXADC_MDBG_0, (0x40|(1<<15))); pwrap_write_nochk(MT6328_AUXADC_MDRT_0, (0x40|(1<<15))); pwrap_write_nochk(MT6328_AUXADC_MDRT_2, 0x04); PWRAPLOG("mt_pwrap_init---- debug11 with adc &6328 adc\n"); //############################### // PMIC_WRAP enables //############################### #if defined(CONFIG_ARCH_MT6735M) WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN,0xff); //D2 change PWRAPLOG("mt_pwrap_init---- use D2\n"); #else WRAP_WR32(PMIC_WRAP_HIPRIO_ARB_EN,0x3ff); #endif WRAP_WR32(PMIC_WRAP_WACS0_EN,ENABLE); WRAP_WR32(PMIC_WRAP_WACS1_EN,ENABLE); #if defined(CONFIG_ARCH_MT6735M) // not enable wacs3 D2 change #else WRAP_WR32(PMIC_WRAP_WACS3_EN,ENABLE); #endif PWRAPLOG("mt_pwrap_init---- debug12 ok \n"); WRAP_WR32(PMIC_WRAP_STAUPD_PRD, 0x5); //0x1:20us,for concurrence test,MP:0x5; //100us WRAP_WR32(PMIC_WRAP_WDT_UNIT,0xf); WRAP_WR32(PMIC_WRAP_WDT_SRC_EN,0xfffffbff); WRAP_WR32(PMIC_WRAP_TIMER_EN,0x1); WRAP_WR32(PMIC_WRAP_INT_EN,0xfffffbff); PWRAPLOG("mt_pwrap_init---- debug12++ \n"); //no ok //############################### // Initialization Done //############################### WRAP_WR32(PMIC_WRAP_INIT_DONE0 ,ENABLE); WRAP_WR32(PMIC_WRAP_INIT_DONE2 , ENABLE); PWRAPLOG("mt_pwrap_init---- debug13\n"); #if defined(CONFIG_ARCH_MT6735M) // not enable wacs3 D2 change #else WRAP_WR32(PMIC_WRAP_INIT_DONE3 , ENABLE); #endif //WRAP_WR32(PMIC_WRAP_INIT_DONE1 , ENABLE); PWRAPLOG("mt_pwrap_init---- debug14\n"); WRAP_WR32(PMIC_WRAP_EINT_STA0_ADR,MT6328_INT_STA); #ifdef CONFIG_OF pwrap_of_iounmap(); #endif PWRAPLOG("mt_pwrap_init---- debug15,%x\n",WRAP_RD32(PMIC_WRAP_EINT_STA0_ADR)); return 0; } //EXPORT_SYMBOL(pwrap_init); /*Interrupt handler function*/ static int g_wrap_wdt_irq_count=0; static int g_case_flag =0; static irqreturn_t mt_pmic_wrap_irq(int irqno, void *dev_id) { unsigned long flags=0; PWRAPFUC(); PWRAPREG("dump pwrap register\n"); if((WRAP_RD32(PMIC_WRAP_INT_FLG)&0x01) == 0x01 ) { g_wrap_wdt_irq_count++; g_case_flag=0; PWRAPREG("g_wrap_wdt_irq_count=%d\n",g_wrap_wdt_irq_count); } else { g_case_flag= 1; } spin_lock_irqsave(&wrp_lock,flags); //*----------------------------------------------------------------------- PWRAPREG("infra clock1=0x%x\n",WRAP_RD32(infracfg_ao_base+0x48)); pwrap_dump_all_register(); //raise the priority of WACS2 for AP WRAP_WR32(PMIC_WRAP_HARB_HPRIO,1<<3); //*----------------------------------------------------------------------- //clear interrupt flag WRAP_WR32(PMIC_WRAP_INT_CLR, 0xffffffff); PWRAPREG("INT flag 0x%x\n",WRAP_RD32(PMIC_WRAP_INT_EN)); PWRAPREG("infra clock2=0x%x\n",WRAP_RD32(infracfg_ao_base+0x48)); if(10==g_wrap_wdt_irq_count || 1==g_case_flag){ BUG_ON(1); } spin_unlock_irqrestore(&wrp_lock,flags); return IRQ_HANDLED; } static U32 pwrap_read_test(void) { U32 rdata=0; U32 return_value=0; // Read Test #ifdef SLV_6328 return_value=pwrap_read(MT6328_DEW_READ_TEST,&rdata); if( rdata != MT6328_DEFAULT_VALUE_READ_TEST ) { PWRAPREG("Read Test fail,rdata=0x%x, exp=0x5aa5,return_value=0x%x\n", rdata,return_value); return E_PWR_READ_TEST_FAIL; } else { PWRAPREG("Read 6328 Test pass,return_value=%d\n",return_value); //return 0; } #endif #ifdef SLV_6332 return_value=pwrap_read(MT6332_DEW_READ_TEST,&rdata); if( rdata != MT6332_DEFAULT_VALUE_READ_TEST ) { PWRAPREG("Read Test fail,rdata=0x%x, exp=0x5aa5,return_value=0x%x\n", rdata,return_value); return E_PWR_READ_TEST_FAIL; } else { PWRAPREG("Read Test pass,return_value=%d\n",return_value); return 0; } #endif return 0; } static U32 pwrap_write_test(void) { U32 rdata=0; U32 sub_return=0; U32 sub_return1=0; //############################### // Write test using WACS2 //############################### #ifdef SLV_6328 sub_return = pwrap_write(MT6328_DEW_WRITE_TEST, MT6328_WRITE_TEST_VALUE); PWRAPREG("after MT6328 pwrap_write\n"); sub_return1 = pwrap_read(MT6328_DEW_WRITE_TEST,&rdata); if(( rdata != MT6328_WRITE_TEST_VALUE )||( sub_return != 0 )||( sub_return1 != 0 )) { PWRAPREG("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n", rdata,sub_return,sub_return1); return E_PWR_INIT_WRITE_TEST; } else { PWRAPREG("write MT6328 Test pass\n"); //return 0; } #endif #ifdef SLV_6332 sub_return = pwrap_write(MT6332_DEW_WRITE_TEST, MT6332_WRITE_TEST_VALUE); PWRAPREG("after MT6332 pwrap_write\n"); sub_return1 = pwrap_read(MT6332_DEW_WRITE_TEST,&rdata); if(( rdata != MT6332_WRITE_TEST_VALUE )||( sub_return != 0 )||( sub_return1 != 0 )) { PWRAPREG("write test error,rdata=0x%x,exp=0xa55a,sub_return=0x%x,sub_return1=0x%x\n", rdata,sub_return,sub_return1); return E_PWR_INIT_WRITE_TEST; } else { PWRAPREG("write MT6332 Test pass\n"); return 0; } #endif return 0; } static void pwrap_int_test(void) { U32 rdata1=0; U32 rdata2=0; while(1) { #ifdef SLV_6328 rdata1 = WRAP_RD32(PMIC_WRAP_EINT_STA); pwrap_read(MT6328_INT_STA,&rdata2); PWRAPREG("Pwrap INT status check,PMIC_WRAP_EINT_STA=0x%x,MT6328_INT_STA[0x01B4]=0x%x\n", rdata1,rdata2); #endif #ifdef SLV_6332 rdata1 = WRAP_RD32(PMIC_WRAP_EINT_STA); pwrap_read(MT6332_INT_STA,&rdata2); PWRAPREG("Pwrap INT status check,PMIC_WRAP_EINT_STA=0x%x,MT6332_INT_STA[0x8112]=0x%x\n", rdata1,rdata2); #endif msleep(500); } } static void pwrap_ut(U32 ut_test) { switch(ut_test) { case 1: //pwrap_wacs2_para_test(); pwrap_write_test(); break; case 2: //pwrap_wacs2_para_test(); pwrap_read_test(); break; default: PWRAPREG ( "default test.\n" ); break; } return; } /*---------------------------------------------------------------------------*/ static S32 mt_pwrap_show_hal(char *buf) { PWRAPFUC(); return snprintf(buf, PAGE_SIZE, "%s\n","no implement" ); } /*---------------------------------------------------------------------------*/ static S32 mt_pwrap_store_hal(const char *buf,size_t count) { U32 reg_value=0; U32 reg_addr=0; U32 return_value=0; U32 ut_test=0; if(!strncmp(buf, "-h", 2)) { PWRAPREG("PWRAP debug: [-dump_reg][-trace_wacs2][-init][-rdap][-wrap][-rdpmic][-wrpmic][-readtest][-writetest]\n"); PWRAPREG("PWRAP UT: [1][2]\n"); } //--------------------------------------pwrap debug------------------------------------------------------------- else if(!strncmp(buf, "-dump_reg", 9)) { pwrap_dump_all_register(); } else if(!strncmp(buf, "-trace_wacs2", 12)) { //pwrap_trace_wacs2(); } else if(!strncmp(buf, "-init", 5)) { return_value=pwrap_init(); if(return_value==0) PWRAPREG("pwrap_init pass,return_value=%d\n",return_value); else PWRAPREG("pwrap_init fail,return_value=%d\n",return_value); } else if (!strncmp(buf, "-rdap", 5) && (1 == sscanf(buf+5, "%x", ®_addr))) { //pwrap_read_reg_on_ap(reg_addr); } else if (!strncmp(buf, "-wrap", 5) && (2 == sscanf(buf+5, "%x %x", ®_addr,®_value))) { //pwrap_write_reg_on_ap(reg_addr,reg_value); } else if (!strncmp(buf, "-rdpmic", 7) && (1 == sscanf(buf+7, "%x", ®_addr))) { //pwrap_read_reg_on_pmic(reg_addr); } else if (!strncmp(buf, "-wrpmic", 7) && (2 == sscanf(buf+7, "%x %x", ®_addr,®_value))) { //pwrap_write_reg_on_pmic(reg_addr,reg_value); } else if(!strncmp(buf, "-readtest", 9)) { pwrap_read_test(); } else if(!strncmp(buf, "-writetest", 10)) { pwrap_write_test(); } else if(!strncmp(buf, "-int", 4)) { pwrap_int_test(); } //--------------------------------------pwrap UT------------------------------------------------------------- else if (!strncmp(buf, "-ut", 3) && (1 == sscanf(buf+3, "%d", &ut_test))) { pwrap_ut(ut_test); }else{ PWRAPREG("wrong parameter\n"); } return count; } /*---------------------------------------------------------------------------*/ #endif //endif PMIC_WRAP_NO_PMIC #ifdef CONFIG_OF static int pwrap_of_iomap(void) { /* * Map the address of the following register base: * INFRACFG_AO, TOPCKGEN, SCP_CLK_CTRL, SCP_PMICWP2P */ struct device_node *infracfg_ao_node; struct device_node *topckgen_node; infracfg_ao_node = of_find_compatible_node(NULL, NULL, "mediatek,INFRACFG_AO"); if (!infracfg_ao_node) { pr_warn("get INFRACFG_AO failed\n"); return -ENODEV; } infracfg_ao_base = of_iomap(infracfg_ao_node, 0); if (!infracfg_ao_base) { pr_warn("INFRACFG_AO iomap failed\n"); return -ENOMEM; } topckgen_node = of_find_compatible_node(NULL, NULL, "mediatek,CKSYS"); if (!topckgen_node) { pr_warn("get TOPCKGEN failed\n"); return -ENODEV; } topckgen_base = of_iomap(topckgen_node, 0); if (!topckgen_base) { pr_warn("TOPCKGEN iomap failed\n"); return -ENOMEM; } return 0; } static void pwrap_of_iounmap(void) { //iounmap(infracfg_ao_base); iounmap(topckgen_base); } #endif #define VERSION "$Revision$" static int is_pwrap_init_done(void) { int ret=0; ret = WRAP_RD32(PMIC_WRAP_INIT_DONE2); PWRAPLOG("is_pwrap_init_done %d \n",ret); if(ret!=0) return 0; ret = pwrap_init(); if(ret!=0){ PWRAPERR("init error (%d)\n", ret); pwrap_dump_all_register(); return ret; } PWRAPLOG("init successfully done (%d)\n\n", ret); return ret; } static int __init pwrap_hal_init(void) { S32 ret = 0; #ifdef CONFIG_OF u32 pwrap_irq; struct device_node *pwrap_node; PWRAPLOG("mt_pwrap_init++++ \n"); pwrap_node = of_find_compatible_node(NULL, NULL, "mediatek,PWRAP"); if (!pwrap_node) { pr_warn("PWRAP get node failed\n"); return -ENODEV; } pwrap_base = of_iomap(pwrap_node, 0); if (!pwrap_base) { pr_warn("PWRAP iomap failed\n"); return -ENOMEM; } pwrap_irq = irq_of_parse_and_map(pwrap_node, 0); if (!pwrap_irq) { pr_warn("PWRAP get irq fail\n"); return -ENODEV; } pr_warn("PWRAP reg: 0x%p, irq: %d\n", pwrap_base, pwrap_irq); #endif PWRAPLOG("real init: version %s\n", VERSION); mt_wrp = get_mt_pmic_wrap_drv(); mt_wrp->store_hal = mt_pwrap_store_hal; mt_wrp->show_hal = mt_pwrap_show_hal; mt_wrp->wacs2_hal = pwrap_wacs2_hal; PWRAPLOG("mt_pwrap_init---- debug1\n"); pwrap_of_iomap(); if(is_pwrap_init_done()==0){ #ifdef PMIC_WRAP_NO_PMIC #else ret = request_irq(MT_PMIC_WRAP_IRQ_ID, mt_pmic_wrap_irq, IRQF_TRIGGER_HIGH, PMIC_WRAP_DEVICE,0); #endif if (ret) { PWRAPERR("register IRQ failed (%d)\n", ret); return ret; } }else{ PWRAPERR("not init (%d)\n", ret); } pwrap_ut(1); pwrap_ut(2); PWRAPLOG("mt_pwrap_init----\n"); return ret; } postcore_initcall(pwrap_hal_init);