static ssize_t dcm_state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n) { char dcm_mode[20]; dcm_ver("\n=============== DCM State ================\n"); if (sscanf(buf, "%s", dcm_mode) == 1) { if (!strncmp(dcm_mode, "enable", 6)) { dcm_dbg("enable dcm\n"); dcm_enable_all(); dcm_ver("==========================================\n"); return n; } else if (!strncmp(dcm_mode, "disable", 7)) { dcm_dbg("disable dcm\n"); dcm_disable_all(); dcm_ver("==========================================\n"); return n; } else { dcm_err("bad argument!! argument should be \"enable\" or \"disable\"\n"); dcm_ver("==========================================\n"); } } else { dcm_err("bad argument!!\n"); dcm_ver("==========================================\n"); } return -EINVAL; }
static ssize_t idle_state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n) { unsigned int test_mode; dcm_ver("\n=============== Idle State ================\n"); if (sscanf(buf, "%d", &test_mode) == 1) { if (test_mode == TEST_ARCH_IDLE) { #ifdef MODE_SINGLE_CPU_IDLE factory_cpu0_idle_test(); #else factory_cpus_idle_test(); #endif dcm_ver("=========================================\n"); return n; } else { dcm_err("bad argument!!\n"); } } else { dcm_err("bad argument!!\n"); } dcm_ver("=========================================\n"); return -EINVAL; }
void disable_low_power_settings(void) { int ret; dcm_ver("[%s]: entry\n", __func__); // restore interrupt mask ret = mt6577_irq_mask_restore(&mask); if (!ret) { dcm_ver("[%s]: success to restore all irq lines\n", __func__); } else { dcm_err("[%s]: fail to restore all irq lines\n", __func__); } // turn on LCD //#if defined(CONFIG_MTK_FB) #if 0 DISP_PowerEnable(TRUE); DISP_PanelEnable(TRUE); #endif // turn on backlight #if defined(CONFIG_MTK_LEDS) mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_FULL); #endif }
void enable_low_power_settings(void) { int ret; dcm_ver("[%s]: entry\n", __func__); // turn off backlight #if defined(CONFIG_MTK_LEDS) mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, 0); #endif // turn off LCD //#if defined(CONFIG_MTK_FB) #if 0 DISP_PanelEnable(FALSE); DISP_PowerEnable(FALSE); #endif // save interrupt status and mask all interrupt ret = mt6577_irq_mask_all(&mask); if (!ret) { dcm_ver("[%s]: success to mask all irq lines\n", __func__); } else { dcm_err("[%s]: fail to mask all irq lines\n", __func__); } mt6577_irq_unmask_for_sleep(MT6577_KP_IRQ_ID); }
void mt6577_dcm_init(void) { int ret = 0; #ifdef CONFIG_LOCAL_TIMERS GPT_CONFIG gpt_config = { .num = WAKEUP_GPT, .mode = GPT_ONE_SHOT, .clkSrc = GPT_CLK_SRC_SYS, .clkDiv = 0x0000, .bIrqEnable = true, .u4CompareL = 0x0, }; #endif dcm_info("[%s]: enable HW dcm\n", __func__); dcm_enable_all(); chip_ver = (get_chip_eco_ver() == CHIP_E1) ? 1 : 0; memset(dpidle_block_mask, 0, MT65XX_CLOCK_CATEGORY_COUNT * sizeof(unsigned int)); #ifdef CONFIG_LOCAL_TIMERS GPT_Init(gpt_config.num, NULL); if (GPT_Config(gpt_config) == FALSE) { dcm_err("[%s]: config GPT%d failed\n", __func__, gpt_config.num); } #endif ret = sysfs_create_file(power_kobj, &dcm_state_attr.attr); ret = sysfs_create_file(power_kobj, &idle_state_attr.attr); ret = sysfs_create_file(power_kobj, &dpidle_state_attr.attr); if (ret) { dcm_err("[%s]: create sysfs failed\n", __func__); } } void mt6577_dcm_exit(void) { dcm_info("[%s]: disable HW dcm\n", __func__); dcm_disable_all(); }
void mt_dcm_init(void) { int err = 0; dcm_info("[%s]entry!!,ALL_DCM=%d\n", __func__,ALL_DCM); dcm_enable(ALL_DCM); //dcm_enable(ALL_DCM & (~IFR_DCM)); err = sysfs_create_file(power_kobj, &dcm_state_attr.attr); if (err) { dcm_err("[%s]: fail to create sysfs\n", __func__); } }
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++; } }