/* * Copyright (C) 2012 Realtek Semiconductor Corp. * All Rights Reserved. * * This program is the proprietary software of Realtek Semiconductor * Corporation and/or its licensors, and only be used, duplicated, * modified or distributed under the authorized license from Realtek. * * ANY USE OF THE SOFTWARE OTHER THAN AS AUTHORIZED UNDER * THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. * * $Revision: * $Date: 2013-05-03 17:35:27 +0800 (Fri, 03 May 2013) $ * * Purpose : Definition those public Interrupt APIs and its data type in the SDK. * * Feature : The file have include the following module and sub-modules * (1) Interrupt parameter settings */ /* * Include Files */ #include #include #include #include /* * Symbol Definition */ /* * Data Declaration */ static uint32 intr_init = {INIT_NOT_COMPLETED}; static uint32 intr_reg_ims_field[] = { IMS_LINK_CHGf, IMS_METER_EXCEEDf, IMS_L2_LRN_OVERf, IMS_SPE_CHGf, IMS_SPE_CONGESTf, IMS_LOOPf, IMS_RTCTf, IMS_ACLf, IMS_GPHYf, IMS_SERDESf, IMS_GPONf, IMS_EPONf, IMS_PTPf, IMS_DYING_GASPf, IMS_THERMAL_ALARMf, IMS_ADC_ALARMf, }; static uint32 intr_reg_imr_field[] = { IMR_LINK_CHGf, IMR_METER_EXCEEDf, IMR_L2_LRN_OVERf, IMR_SPE_CHGf, IMR_SPE_CONGESTf, IMR_LOOPf, IMR_RTCTf, IMR_ACLf, IMR_GPHYf, IMR_SERDESf, IMR_GPONf, IMR_EPONf, IMR_PTPf, IMR_DYING_GASPf, IMR_THERMAL_ALARMf, IMR_ADC_ALARMf, }; /* * Function Declaration */ /* Function Name: * dal_apollo_intr_init * Description: * Initialize interrupt module. * Input: * None * Output: * None * Return: * RT_ERR_OK * RT_ERR_FAILED * Note: * Must initialize interrupt module before calling any interrupt APIs. */ int32 dal_apollo_intr_init(void) { int32 ret; RT_DBG(LOG_DEBUG, (MOD_DAL|MOD_INTR),"%s",__FUNCTION__); intr_init = INIT_COMPLETED; /*reset interrupt mask register*/ if((ret=dal_apollo_intr_imr_set(INTR_TYPE_ALL,DISABLED)) != RT_ERR_OK) { RT_ERR(ret, (MOD_DAL|MOD_INTR),""); intr_init = INIT_NOT_COMPLETED; return ret; } /*clear all of interrupt status*/ if((ret=dal_apollo_intr_ims_clear(INTR_TYPE_ALL)) != RT_ERR_OK) { RT_ERR(ret, (MOD_DAL|MOD_INTR),""); intr_init = INIT_NOT_COMPLETED; return ret; } /*clear port speed shange status*/ if((ret=dal_apollo_intr_speedChangeStatus_clear()) != RT_ERR_OK) { RT_ERR(ret, (MOD_DAL|MOD_INTR),""); intr_init = INIT_NOT_COMPLETED; return ret; } /*clear port linkup status*/ if((ret=dal_apollo_intr_linkupStatus_clear()) != RT_ERR_OK) { RT_ERR(ret, (MOD_DAL|MOD_INTR),""); intr_init = INIT_NOT_COMPLETED; return ret; } /*clear port linkdown status*/ if((ret=dal_apollo_intr_linkdownStatus_clear()) != RT_ERR_OK) { RT_ERR(ret, (MOD_DAL|MOD_INTR),""); intr_init = INIT_NOT_COMPLETED; return ret; } /*clear gphy status*/ if((ret=dal_apollo_intr_gphyStatus_clear()) != RT_ERR_OK) { RT_ERR(ret, (MOD_DAL|MOD_INTR),""); intr_init = INIT_NOT_COMPLETED; return ret; } return RT_ERR_OK; } /* end of dal_apollo_intr_init */ /* Function Name: * dal_apollo_intr_polarity_set * Description: * Set interrupt polarity mode * Input: * mode - Interrupt polarity mode. * Output: * None * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_INPUT - Invalid input parameters. * Note: * The API can set Interrupt polarity mode. * The modes that can be set as following: * - INTR_POLAR_HIGH * - INTR_POLAR_LOW */ int32 dal_apollo_intr_polarity_set(rtk_intr_polarity_t polar) { int32 ret; uint32 ipolar; RT_DBG(LOG_DEBUG, (MOD_DAL|MOD_INTR),"%s",__FUNCTION__); /* check Init status */ RT_INIT_CHK(intr_init); /* parameter check */ RT_PARAM_CHK((INTR_POLAR_END <= polar), RT_ERR_OUT_OF_RANGE); ipolar = polar; if((ret = reg_field_write(INTR_CTRLr,INTR_POLARITYf, &ipolar) ) != RT_ERR_OK) { RT_ERR(ret, (MOD_DAL|MOD_INTR),""); return ret; } return RT_ERR_OK; } /* end of dal_apollo_intr_polarity_set */ /* Function Name: * dal_apollo_intr_polarity_mode_get * Description: * Get Interrupt polarity mode * Input: * None * Output: * pMode - Interrupt polarity mode * Return: * RT_ERR_OK - OK * RT_ERR_FAILED - Failed * RT_ERR_INPUT - Invalid input parameters. * Note: * The API can get Interrupt polarity mode. * The modes that can be got as following: * - INTR_POLAR_HIGH * - INTR_POLAR_LOW */ int32 dal_apollo_intr_polarity_get(rtk_intr_polarity_t *pPolar) { int32 ret; uint32 ipolar; RT_DBG(LOG_DEBUG, (MOD_DAL|MOD_INTR),"%s",__FUNCTION__); /* check Init status */ RT_INIT_CHK(intr_init); /* parameter check */ RT_PARAM_CHK((NULL == pPolar), RT_ERR_NULL_POINTER); if ((ret = reg_field_read(INTR_CTRLr, INTR_POLARITYf, &ipolar)) != RT_ERR_OK) { RT_ERR(ret, (MOD_DAL|MOD_INTR), ""); return ret; } *pPolar = ipolar; return RT_ERR_OK; } /* end of dal_apollo_intr_polarity_get */ /* Function Name: * dal_apollo_intr_imr_set * Description: * Set interrupt mask. * Input: * intr - interrupt type * enable - interrupt state * * Output: * None * Return: * RT_ERR_OK * RT_ERR_FAILED * RT_ERR_OUT_OF_RANGE * Note: * None. */ int32 dal_apollo_intr_imr_set(rtk_intr_type_t intr, rtk_enable_t enable) { int32 ret,i; uint32 regValue; RT_DBG(LOG_DEBUG, (MOD_DAL|MOD_INTR),"%s",__FUNCTION__); RT_INIT_CHK(intr_init); /* parameter check */ RT_PARAM_CHK((INTR_TYPE_END <= intr), RT_ERR_OUT_OF_RANGE); RT_PARAM_CHK((RTK_ENABLE_END <= enable), RT_ERR_OUT_OF_RANGE); if(INTR_TYPE_ALL == intr) { regValue = 0; for(i = 0; i < INTR_TYPE_ALL; i++) { regValue |= ((enable&0x1)<