/*************************************************************************** * Copyright (c) 2003-2006, Broadcom Corporation * All Rights Reserved * Confidential Property of Broadcom Corporation * * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. * * $brcm_Workfile: $ * $brcm_Revision: $ * $brcm_Date: $ * * Module Description: * * Revision History: * * $brcm_Log: $ * ***************************************************************************/ #include "bsettop.h" #include "bstd.h" #include "gist.h" #include "bchp_timer.h" #if (BCHP_CHIP!=7552) #include "bchp_clk.h" #endif #ifdef CONFIG_WATCHDOG #include "bchp_int_id_timer.h" #endif BDBG_MODULE(bsettop); bool initialized = false; /* Summary: Watchdog ISR. Description: Service the watchdog interrupt. */ #ifdef CONFIG_WATCHDOG static BINT_CallbackHandle h_wd_callback; static void bsettop_wd_isr(void *data, int param) { unsigned int reg = BREG_Read32(GetREG(), BCHP_TIMER_TIMER_IS); if (reg & BCHP_TIMER_TIMER_IS_WDINT_MASK) { /* Re write start sequence */ BREG_Write32(GetREG(), BCHP_TIMER_WDCMD,0xFF00); BREG_Write32(GetREG(), BCHP_TIMER_WDCMD,0x00FF); } #if 0 else if (g_p_dsp->timer_isr) { g_p_dsp->timer_isr(data); } #endif } #endif /* Summary: To turn off power on unused modules to save powers. Description: */ bresult bsettop_pm_off(void) { #if (BCHP_CHIP!=7552) uint32_t val; BDBG_WRN(("%s: enter", __func__)); val = BREG_Read32(GetREG(), BCHP_CLK_PM_CTRL); val |= BCHP_CLK_PM_CTRL_DIS_USB_216M_CLK_MASK; /* turn off USB */ //val |= BCHP_CLK_PM_CTRL_DIS_BVN_ENET_216M_CLK_MASK; /* turn off ethernet */ val |= BCHP_CLK_PM_CTRL_DIS_DDR23_ALT_216M_CLK_MASK; /* turn off ALT DDR23 */ val |= BCHP_CLK_PM_CTRL_DIS_MEMC_ALT_216M_CLK_MASK; /* turn off ALT MEMC */ val |= BCHP_CLK_PM_CTRL_DIS_HDMI_ALT_216M_CLK_MASK; /* turn off ALT HDMI */ BREG_Write32(GetREG(), BCHP_CLK_PM_CTRL, val); val = BREG_Read32(GetREG(), BCHP_CLK_PM_CTRL_1); val |= BCHP_CLK_PM_CTRL_1_DIS_MEMC_108M_CLK_MASK; val |= BCHP_CLK_PM_CTRL_1_DIS_USB_108M_CLK_MASK; val |= BCHP_CLK_PM_CTRL_1_DIS_DDR23_108M_CLK_MASK; val |= BCHP_CLK_PM_CTRL_1_DIS_DDR23_ALT_108M_CLK_MASK; val |= BCHP_CLK_PM_CTRL_1_DIS_HDMI_ALT_108M_CLK_MASK; val |= BCHP_CLK_PM_CTRL_1_DIS_MEMC_ALT_108M_CLK_MASK; //val |= BCHP_CLK_PM_CTRL_1_DIS_VEC_ALT_108M_CLK_MASK; BREG_Write32(GetREG(), BCHP_CLK_PM_CTRL_1, val); val = BREG_Read32(GetREG(), BCHP_CLK_PM_CTRL_2); val |= BCHP_CLK_PM_CTRL_2_DIS_ENET_25M_CLK_MASK; val |= BCHP_CLK_PM_CTRL_2_DIS_JOTP_9M_CLK_MASK; val |= BCHP_CLK_PM_CTRL_2_DIS_HIF_54M_CLK_MASK; BREG_Write32(GetREG(), BCHP_CLK_PM_CTRL_2, val); #endif return b_ok; } /* Summary: Initializes the settop API. Description: Required before any other call. If you don't call it, some key functions will fail; others will succeed but will result in undefined behavior. Use the BSETTOP_VERSION macro to pass the correct version. This verifies at run-time that the correct shared library is being used. */ bresult bsettop_init(bsettop_version version) { if (initialized) { BDBG_MSG(("\n\n### bsettop_init already initialized ###\n\n")); return b_ok; } // now in ram_init so it is called earlier in the initialization process - gist_init(); // bsettop_pm_off(); #ifdef CONFIG_WATCHDOG /* Start watchdog timer */ if (BREG_Read32(GetREG(), BCHP_TIMER_WDCRS) == BCHP_TIMER_WDCRS_WDCR_MASK) { BDBG_MSG(("\n\n### WATCHDOG TIMER OCCURED ###\n\n")); /* Clear the reset status register */ BREG_Write32(GetREG(), BCHP_TIMER_WDCRS,BCHP_TIMER_WDCRS_WDCR_MASK); /* Possible TODO put extra debug code here to determine cause of reset*/ } BINT_CreateCallback(&h_wd_callback, GetINT(), BCHP_INT_ID_WDINT, bsettop_wd_isr, NULL, 0); BINT_EnableCallback(h_wd_callback); BREG_Write32(GetREG(), BCHP_TIMER_WDTIMEOUT,0x1FFFFFFF); BREG_Write32(GetREG(), BCHP_TIMER_TIMER_IE0,BCHP_TIMER_TIMER_IE0_WDINTMASK_MASK); /* Write start sequence */ BREG_Write32(GetREG(), BCHP_TIMER_WDCMD,0xFF00); BREG_Write32(GetREG(), BCHP_TIMER_WDCMD,0x00FF); #endif initialized = true; return b_ok; } /* Summary: Releases resources Description: This function is used to release resources allocated during bsettop_init. User should call this function before exit from an application. */ void bsettop_uninit(void) { } /* Summary: Perform periodic power monitoring functions */ void bsettop_pvt(void) { #ifdef CONFIG_MONITOR_PVT BCHP_AvsSettings avs; BDBG_MSG(("%s Execute BCHP_Monitor_Pvt\n",__FUNCTION__)); avs.hardStopOffset = 2; avs.maxVoltageStopOffset = 4; BCHP_MonitorPvt(GetCHP(), &avs); #endif }