Exemplo n.º 1
0
int Set_Charging_Commmand(int nCommand)
{
    int nRet = KAL_FALSE;
    mutex_lock(&charging_timer_api_lock);

    if (charger_command_status == CHARGER_COMMAND_STOP)
    {
        switch (nCommand)
        {
            case CHARGING_SET_USB_500_COMMAND :
            case CHARGING_SET_TA_MODE_COMMAND :
            case CHARGING_SET_USB_100_COMMAND :
            case CHARGING_SET_FACTORY_MODE_COMMAND :
            case CHARGING_DEACTIVE_COMMAND :
                charger_command = nCommand;
                charger_command_status = CHARGER_COMMAND_RUN;
                charger_command_execute_index = 0;
                nRet = KAL_TRUE;
                break;
            default :
                charger_command = CHARGING_UNKNOWN_COMMAND;
                charger_command_status = CHARGER_COMMAND_STOP;
                charger_command_execute_index = 0;
                nRet = KAL_FALSE;
                break;
        }
        if (nRet == KAL_TRUE)
        {
            if (charger_command_list[charger_command].cmd_interval[charger_command_execute_index].is_high)
            {
                mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
            }
            else
            {
                mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
            }
            config.u4CompareH = 0;
            config.u4CompareL = charger_command_list[charger_command].cmd_interval[charger_command_execute_index].delay_count;
            charger_command_execute_index++;

/*                                                                                                           */
            GPT_Config(config);
/*                                                                                                           */

            GPT_ClearCount(gpt_num);
            GPT_SetCompare(gpt_num, config.u4CompareL);
            GPT_Restart(gpt_num);
        }
    }

    mutex_unlock(&charging_timer_api_lock);

    return nRet;
}
Exemplo n.º 2
0
void gpt_timer_irq_handler(UINT16 i)
{
    /*
        Do not added printf or log print in the function because it is interrupt service routine.
    */
    spin_lock_irqsave(&g_single_charger_lock, g_single_flags);

    // end command
    if (charger_command_list[charger_command].cmd_interval[charger_command_execute_index].delay_count == 0)
    {
        charger_command = CHARGING_UNKNOWN_COMMAND;
        charger_command_status = CHARGER_COMMAND_STOP;
        charger_command_execute_index = 0;
        spin_unlock_irqrestore(&g_single_charger_lock, g_single_flags);
        return;
    }

    if (charger_command_list[charger_command].cmd_interval[charger_command_execute_index].is_high)
    {
/*                                                                                 */
        mt_set_gpio_pull_select(CHG_EN_SET_N, GPIO_PULL_UP);
/*                                                                                 */
        mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    }
    else
    {
/*                                                                                 */
        mt_set_gpio_pull_select(CHG_EN_SET_N, GPIO_PULL_DOWN);
/*                                                                                 */
        mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    }
    config.u4CompareH = 0;
    config.u4CompareL = charger_command_list[charger_command].cmd_interval[charger_command_execute_index].delay_count;
    charger_command_execute_index++;

/*                                                                                                           */
    GPT_Config(config);
/*                                                                                                           */

    GPT_ClearCount(gpt_num);
    GPT_SetCompare(gpt_num, config.u4CompareL);
    GPT_Restart(gpt_num);

    spin_unlock_irqrestore(&g_single_charger_lock, g_single_flags);
}
Exemplo n.º 3
0
void sc_dpidle_after_wfi(void)
{
#ifdef PROFILE_DPIDLE
    dpidle_tick_pos = GPT_GetCounter(GPT2);
    dpidle_wakeup_src = DRV_Reg32(SC_WAKEUP_SRC);
    if (dpidle_debug_mask & DEBUG_PROFILE) {
#ifdef CONFIG_LOCAL_TIMERS
        dcm_info("[%s]%5d %10u %10u %10u %10u %08x\n", __func__, 
                dpidle_profile_idx, dpidle_tick_pre, dpidle_tick_mid, dpidle_tick_pos,
                dpidle_counter, dpidle_wakeup_src);
#else
        dcm_info("[%s]%5d %10u %10u %10u %10u %10u %10u %08x\n", __func__, 
                dpidle_profile_idx, dpidle_tick_pre, dpidle_tick_mid, dpidle_tick_pos,
                dpidle_counter, dpidle_compare, dpidle_compare_update, dpidle_wakeup_src);

#endif
        dpidle_profile_idx++;
    }
#endif

#ifdef CONFIG_LOCAL_WDT
    wdt_tick_pos = GPT_GetCounter(GPT2);
    if (wdt_counter_pre > (wdt_tick_pos - wdt_tick_pre)) {
        wdt_counter_pos = wdt_counter_pre - (wdt_tick_pos - wdt_tick_pre);
        mpcore_wdt_set_counter(wdt_counter_pos);
    } else {
        dcm_info("[%s]:wdt_counter_pre=%10lu, wdt_tick_pre=%10lu, wdt_tick_pos=%10lu\n", 
                __func__, wdt_counter_pre, wdt_tick_pre, wdt_tick_pos);
        mpcore_wdt_set_counter(1);
    }
#endif

#ifdef CONFIG_LOCAL_TIMERS
    if (GPT_Get_IRQ(WAKEUP_GPT)) {
        /* waked up by WAKEUP_GPT */
        localtimer_set_next_event(1);
    } else {
        /* waked up by other wakeup source */
        unsigned int temp1 = GPT_GetCompare(WAKEUP_GPT);
        unsigned int temp2 = GPT_GetCounter(WAKEUP_GPT);
        if (unlikely(temp1 <= temp2)) {
            dcm_err("[%s]GPT%d: counter = %10u, compare = %10u\n", __func__, temp1, temp2);
            BUG();
        }

        localtimer_set_next_event(temp1-temp2);
        GPT_Stop(WAKEUP_GPT);
        GPT_ClearCount(WAKEUP_GPT);
    }
#endif

    if (get_chip_eco_ver() == CHIP_E1) {
        DRV_SetReg32(WPLL_CON0, 0x1);        
    } else {
        if (mmsys_switched_off) {
            DRV_ClrReg16(MDPLL_CON0, 0x1);
            udelay(20);
            mm_clk_sq2pll();
            mmsys_switched_off = 0;
        }
    }   

#if 0
    /* restore TOP_MISC */
    DRV_WriteReg32(TOP_MISC, topmisc);
#endif

    dpidle_count++;
    if ((dpidle_debug_mask & DEBUG_TRACING)) {
        dpidle_single_count++;
    }
}