static int amutt_backoff(int level) { int ret; if (level == 0) { // no throttle ret = exec_ccci_kern_func_by_md_id(MD_SYS1, ID_THROTTLING_CFG, (char*) &amutt_param[level], 4); mtk_cooler_amutt_dprintk_always("[%s] unlimit\n", __func__); } else if (level >= 1 && level <= COOLER_STEPS-1) { ret = exec_ccci_kern_func_by_md_id(MD_SYS1, ID_THROTTLING_CFG, (char*) &amutt_param[level], 4); mtk_cooler_amutt_dprintk_always("[%s] limit %x\n", __func__, amutt_param[level]); } else { // error... ret = -1; mtk_cooler_amutt_dprintk_always("[%s] ouf of range\n", __func__); } return ret; }
static void mtkts_crystal_notify(int time) { unsigned int retbuf; retbuf = time; // short duration exec_ccci_kern_func_by_md_id(0, ID_SEND_TSX_TEMP, (char *)&retbuf, sizeof(retbuf)); mtktscpu_dprintk("notify to modem duration =%d ms",time); }
void md_fast_dormancy(int md_id) { #if defined (FEATURE_MD_FAST_DORMANCY) #ifdef CONFIG_MTK_FD_SUPPORT exec_ccci_kern_func_by_md_id(md_id, ID_CCCI_DORMANCY, NULL, 0); #endif #endif }
static wake_reason_t spm_output_wake_reason(struct wake_status *wakesta, struct pcm_desc *pcmdesc) { wake_reason_t wr; wr = __spm_output_wake_reason(wakesta, pcmdesc, false); if (wakesta->r12 & WAKE_SRC_CLDMA_MD) exec_ccci_kern_func_by_md_id(0, ID_GET_MD_WAKEUP_SRC, NULL, 0); return wr; }
static int send_get_md_all_msg(void) { char mode[1]; if(!(is_meta_mode() | is_advanced_meta_mode())){ mode[0] = MTK_THERMAL_GET_TX_POWER; #ifdef MTK_ENABLE_MD1 exec_ccci_kern_func_by_md_id(0, ID_GET_TXPOWER, mode, 0); #endif #ifdef MTK_ENABLE_MD2 exec_ccci_kern_func_by_md_id(1, ID_GET_TXPOWER, mode, 0); #endif } mode[0] = MTK_THERMAL_GET_RF_TEMP_2G; #ifdef MTK_ENABLE_MD1 exec_ccci_kern_func_by_md_id(0, ID_GET_TXPOWER, mode, 0); #endif #ifdef MTK_ENABLE_MD2 exec_ccci_kern_func_by_md_id(1, ID_GET_TXPOWER, mode, 0); #endif mode[0] = MTK_THERMAL_GET_RF_TEMP_3G; #ifdef MTK_ENABLE_MD1 exec_ccci_kern_func_by_md_id(0, ID_GET_TXPOWER, mode, 0); #endif #ifdef MTK_ENABLE_MD2 exec_ccci_kern_func_by_md_id(1, ID_GET_TXPOWER, mode, 0); #endif return 0; }
static wake_reason_t spm_output_wake_reason(struct wake_status *wakesta, struct pcm_desc *pcmdesc) { wake_reason_t wr; wr = __spm_output_wake_reason(wakesta, pcmdesc, true); #if 1 memcpy(&suspend_info[log_wakesta_cnt], wakesta, sizeof(struct wake_status)); suspend_info[log_wakesta_cnt].log_index = log_wakesta_index; log_wakesta_cnt++; log_wakesta_index++; if (10 <= log_wakesta_cnt) { log_wakesta_cnt = 0; spm_snapshot_golden_setting = 0; } #if 0 else { if (2 != spm_snapshot_golden_setting) { if ((0x90100000 == wakesta->event_reg) && (0x140001f == wakesta->debug_flag)) spm_snapshot_golden_setting = 1; } } #endif if (0xFFFFFFF0 <= log_wakesta_index) log_wakesta_index = 0; #endif spm_crit2("big core = %d, suspend dormant state = %d, chip = %d\n", SPM_CTRL_BIG_CPU, spm_dormant_sta, mt_get_chip_sw_ver()); if (0 != spm_ap_mdsrc_req_cnt) spm_crit2("warning: spm_ap_mdsrc_req_cnt = %d, r7[ap_mdsrc_req] = 0x%x\n", spm_ap_mdsrc_req_cnt, spm_read(SPM_POWER_ON_VAL1) & (1<<17)); if (wakesta->r12 & WAKE_SRC_EINT) mt_eint_print_status(); if (wakesta->r12 & WAKE_SRC_CLDMA_MD) exec_ccci_kern_func_by_md_id(0, ID_GET_MD_WAKEUP_SRC, NULL, 0); return wr; }
int eemcs_helper_pm_restore_noirq(struct device *device) { pr_debug("calling %s()\n", __func__); /*Not ready, need to check more details*/ #if 0 // CCIF AP0 mt_irq_set_sens(CCIF0_AP_IRQ_ID, MT_LEVEL_SENSITIVE); mt_irq_set_polarity(CCIF0_AP_IRQ_ID, MT_POLARITY_LOW); // MD1 WDT mt_irq_set_sens(MD_WDT_IRQ_ID, MT_EDGE_SENSITIVE); mt_irq_set_polarity(MD_WDT_IRQ_ID, MT_POLARITY_LOW); // MD1 exec_ccci_kern_func_by_md_id(0, ID_IPO_H_RESTORE_CB, NULL, 0); #endif return 0; }
static int send_get_md_all_msg(void) { char mode[1]; if (!(is_meta_mode() | is_advanced_meta_mode())) { mode[0] = MTK_THERMAL_GET_TX_POWER; /* #ifdef CONFIG_MTK_ENABLE_MD1 */ if (get_modem_is_enabled(0)) exec_ccci_kern_func_by_md_id(0, ID_GET_TXPOWER, mode, 0); /* #endif */ /* #ifdef CONFIG_MTK_ENABLE_MD2 */ if (get_modem_is_enabled(1)) exec_ccci_kern_func_by_md_id(1, ID_GET_TXPOWER, mode, 0); /* #endif */ } mode[0] = MTK_THERMAL_GET_RF_TEMP_2G; /* #ifdef CONFIG_MTK_ENABLE_MD1 */ if (get_modem_is_enabled(0)) exec_ccci_kern_func_by_md_id(0, ID_GET_TXPOWER, mode, 0); /* #endif */ /* #ifdef CONFIG_MTK_ENABLE_MD2 */ if (get_modem_is_enabled(1)) exec_ccci_kern_func_by_md_id(1, ID_GET_TXPOWER, mode, 0); /* #endif */ mode[0] = MTK_THERMAL_GET_RF_TEMP_3G; /* #ifdef CONFIG_MTK_ENABLE_MD1 */ if (get_modem_is_enabled(0)) exec_ccci_kern_func_by_md_id(0, ID_GET_TXPOWER, mode, 0); /* #endif */ /* #ifdef CONFIG_MTK_ENABLE_MD2 */ if (get_modem_is_enabled(1)) exec_ccci_kern_func_by_md_id(1, ID_GET_TXPOWER, mode, 0); /* #endif */ return 0; }
void md_fast_dormancy(int md_id) { #ifdef MTK_FD_SUPPORT exec_ccci_kern_func_by_md_id(md_id, ID_CCCI_DORMANCY, NULL, 0); #endif }
static wake_reason_t spm_output_wake_reason(const wake_status_t *wakesta, bool dpidle) { char str[200] = { 0 }; wake_reason_t wr = WR_NONE; if (wakesta->debug_reg != 0) { spm_error2("PCM ASSERT AND PC = %u (0x%x)(0x%x)\n", wakesta->debug_reg, wakesta->r13, wakesta->event_reg); return WR_PCM_ASSERT; } if (dpidle) { /* bypass wakeup event check */ spm_info("[DP] r12 = 0x%x, r13 = 0x%x, r7 = 0x%x (0x%x)\n", wakesta->r12, wakesta->r13, spm_read(SPM_PCM_REG7_DATA), spm_read(SPM_POWER_ON_VAL1)); return WR_WAKE_SRC; } if (wakesta->r12 & (1U << 0)) { if (!(wakesta->isr & ISR_TWAM) && !wakesta->cpu_wake) { strcat(str, "PCM_TIMER "); wr = WR_PCM_TIMER; } else { if (wakesta->isr & ISR_TWAM) { strcat(str, "TWAM "); wr = WR_WAKE_SRC; } if (wakesta->cpu_wake) { strcat(str, "CPU "); wr = WR_WAKE_SRC; } } } if (wakesta->r12 & WAKE_SRC_TS) { strcat(str, "TS "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_KP) { strcat(str, "KP "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_WDT) { strcat(str, "WDT "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_GPT) { strcat(str, "GPT "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_EINT) { strcat(str, "EINT "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_CONN_WDT) { strcat(str, "CONN_WDT "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_CCIF_MD) { strcat(str, "CCIF_MD "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_LOW_BAT) { strcat(str, "LOW_BAT "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_CONN) { strcat(str, "CONN "); wr = WR_WAKE_SRC; } if (wakesta->r12 & (1U << 13)) { strcat(str, "PCM_WDT "); wr = WR_PCM_WDT; } if (wakesta->r12 & WAKE_SRC_USB_CD) { strcat(str, "USB_CD "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_USB_PDN) { strcat(str, "USB_PDN "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_DBGSYS) { strcat(str, "DBGSYS "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_UART0) { strcat(str, "UART0 "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_AFE) { strcat(str, "AFE "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_THERM) { strcat(str, "THERM "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_CIRQ) { strcat(str, "CIRQ "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_SYSPWREQ) { strcat(str, "SYSPWREQ "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_MD_WDT) { strcat(str, "MD_WDT "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_CPU0_IRQ) { strcat(str, "CPU0_IRQ "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_CPU1_IRQ) { strcat(str, "CPU1_IRQ "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_CPU2_IRQ) { strcat(str, "CPU2_IRQ "); wr = WR_WAKE_SRC; } if (wakesta->r12 & WAKE_SRC_CPU3_IRQ) { strcat(str, "CPU3_IRQ "); wr = WR_WAKE_SRC; } if (wr == WR_NONE) { strcat(str, "UNKNOWN "); wr = WR_UNKNOWN; } spm_crit2("wake up by %s(0x%x)(0x%x)(%u)\n", str, wakesta->r12, wakesta->raw_sta, wakesta->timer_out); spm_crit2("event_reg = 0x%x, isr = 0x%x, r13 = 0x%x\n", wakesta->event_reg, wakesta->isr, wakesta->r13); if (wakesta->r12 & WAKE_SRC_EINT) mt_eint_print_status(); if (wakesta->r12 & WAKE_SRC_CCIF_MD) exec_ccci_kern_func_by_md_id(0, ID_GET_MD_WAKEUP_SRC, NULL, 0); return wr; }
static long emd_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret = 0; unsigned int sim_mode=0, boot_mode=0; int value; emd_dev_client_t *client=(emd_dev_client_t *)file->private_data; switch (cmd) { case CCCI_IOC_GET_MD_STATE: EMD_MSG_INF("chr", "Get md state ioctl called by %s\n", current->comm); if(arg!=0) { value = get_curr_emd_state(); value+='0'; // Make number to charactor ret = put_user((unsigned int)value, (unsigned int __user *)arg); }else{ EMD_MSG_INF("chr", "Get md state ioctl: arg is null\n"); } break; case CCCI_IOC_DO_START_MD: EMD_MSG_INF("chr", "Start md ioctl called by %s\n", current->comm); if(copy_from_user(&boot_mode, (void __user *)arg, sizeof(unsigned int))) { EMD_MSG_INF("chr", "CCCI_IOC_DO_START_MD: copy_from_user fail!\n"); ret = -EFAULT; } else { ret = emd_power_on(boot_mode); EMD_MSG_INF("chr", "CCCI_IOC_DO_START_MD,%d\n",boot_mode); } break; case CCCI_IOC_ENTER_MD_DL_MODE: EMD_MSG_INF("chr", "Enter md download md ioctl called by %s\n", current->comm); ret = enter_md_download_mode(); break; case CCCI_IOC_MD_RESET: EMD_MSG_INF("chr", "Reset on md ioctl called by %s\n", current->comm); ret = emd_request_reset(); break; case CCCI_IOC_POWER_ON_MD: EMD_MSG_INF("chr", "Power on md ioctl called by %s\n", current->comm); if(copy_from_user(&boot_mode, (void __user *)arg, sizeof(unsigned int))) { EMD_MSG_INF("chr", "CCCI_IOC_POWER_ON_MD: copy_from_user fail!\n"); ret = -EFAULT; } else { ret = emd_power_on(boot_mode); EMD_MSG_INF("chr", "CCCI_IOC_POWER_ON_MD(%x): %d\n", boot_mode, ret); } break; case CCCI_IOC_ENTER_DEEP_FLIGHT: EMD_MSG_INF("chr", "Enter MD flight mode ioctl called by %s\n", current->comm); ret = emd_send_enter_flight_mode(); break; case CCCI_IOC_LEAVE_DEEP_FLIGHT: EMD_MSG_INF("chr","Leave MD flight mode ioctl called by %s\n", current->comm); ret = emd_send_leave_flight_mode(); break; case CCCI_IOC_GET_MD_ASSERTLOG: emd_aseert_log_wait_timeout=0; EMD_MSG_INF("chr","CCCI_IOC_GET_MD_ASSERTLOG ioctl called by %s, sub_dev=%d\n", current->comm,client->sub_dev_id); if(wait_event_interruptible(emd_aseert_log_wait, emd_aseert_log_wait_timeout) == -ERESTARTSYS) ret = -EINTR; else { EMD_MSG_INF("chr","sub_dev=%d call CCCI_IOC_GET_MD_ASSERTLOG is exit\n", client->sub_dev_id); emd_aseert_log_wait_timeout = 0; } break; case CCCI_IOC_GET_MD_ASSERTLOG_STATUS: EMD_MSG_INF("chr","CCCI_IOC_GET_MD_ASSERTLOG_STATUS ioctl called by %s, sub_dev=%d\n", current->comm,client->sub_dev_id); value = cm_get_assertlog_status(); if (copy_to_user((int *)arg, &value, sizeof(int))) { return -EACCES; } EMD_MSG_INF("chr", "CCCI_IOC_GET_MD_ASSERTLOG_STATUS %d\n", value); break; case CCCI_IOC_SIM_SWITCH: if(copy_from_user(&sim_mode, (void __user *)arg, sizeof(unsigned int))) { EMD_MSG_INF("chr", "IOC_SIM_SWITCH: copy_from_user fail!\n"); ret = -EFAULT; } else { ret = switch_sim_mode(0,(char*)&sim_mode,sizeof(unsigned int));//switch_sim_mode(sim_mode); EMD_MSG_INF("chr", "IOC_SIM_SWITCH(%x): %d\n", sim_mode, ret); } break; case CCCI_IOC_SIM_SWITCH_TYPE: value = get_sim_switch_type(); ret = put_user(value, (unsigned int __user *)arg); break; case CCCI_IOC_STORE_SIM_MODE: EMD_MSG_INF("chr","store sim mode ioctl called by %s!\n", current->comm); if(copy_from_user(&sim_mode, (void __user *)arg, sizeof(unsigned int))) { EMD_MSG_INF("chr","store sim mode fail: copy_from_user fail!\n"); ret = -EFAULT; } else { EMD_MSG_INF("chr","storing sim mode(%d) in kernel space!\n", sim_mode); exec_ccci_kern_func_by_md_id(0, ID_STORE_SIM_SWITCH_MODE, (char *)&sim_mode, sizeof(unsigned int)); } break; case CCCI_IOC_GET_SIM_MODE: EMD_MSG_INF("chr", "get sim mode ioctl called by %s\n", current->comm); exec_ccci_kern_func_by_md_id(0, ID_GET_SIM_SWITCH_MODE, (char *)&sim_mode, sizeof(unsigned int)); ret = put_user(sim_mode, (unsigned int __user *)arg); break; case CCCI_IOC_IGNORE_MD_EXCP: EMD_MSG_INF("chr", "ignore md excp ioctl called by %s\n", current->comm); cm_disable_ext_md_wdt_irq(); cm_disable_ext_md_wakeup_irq(); cm_disable_ext_md_exp_irq(); break; default: ret = -EMD_ERR_UN_DEF_CMD; EMD_MSG_INF("chr","undefined ioctl called by %s\n", current->comm); break; } return ret; }