ssize_t modem_reset_set(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int state; char* endp; if (!bsp_reset_is_connect_ril()) { pr_err("<modem_reset_set>: modem reset not to be connected to ril\n"); return count; } dev_info(dev, "Power set to %s\n", buf); state = simple_strtol(buf, &endp, 10); /*10 means read as dec*/ pr_err("endp = 0x%x\n", *(int*)endp); pr_err("count = %lu\n", (unsigned long)count); if (*buf == '\0' || *buf == *endp)/* return 0 means match failed */ { return count; } if (state == BALONG_MODEM_RESET) { bsp_modem_reset(); pr_err("modem reset %d\n", BALONG_MODEM_RESET); return count; } else if(state == BALONG_MODEM_OFF) { /*To make modem poweroff called only once when there are two rilds.*/ if(modem_power_off_flag) { pr_err("Balong_power: modem power off has been called! \n"); return count; } bsp_modem_power_off(); pr_err("modem power off %d\n", BALONG_MODEM_OFF); modem_power_off_flag = 1; return count; } else if(state == BALONG_MODEM_ON) /* TODO: 是否需要上电,根HIFI什么关系 */ { bsp_modem_power_on(); pr_err("modem power on %d\n", BALONG_MODEM_ON); } else if(state == BALONG_MODEM_RILD_SYS_ERR) { hisi_system_error(HISI_RDR_MOD_CP_RILD, 0, 0, NULL, 0); pr_err("modem reset using hisi_system_error by rild %d\n", BALONG_MODEM_RILD_SYS_ERR); } else if(state == BALONG_MODEM_3RD_SYS_ERR) { hisi_system_error(HISI_RDR_MOD_CP_3RD, 0, 0, NULL, 0); pr_err("modem reset using hisi_system_error by 3rd modem %d\n", HISI_RDR_MOD_CP_3RD); } else { pr_err("Balong_power : invalid code to balong power !!!!\n"); return count; } return count; }
/****************************************************************************** * Function: bsp_drv_power_reboot_direct * Description: * Input: * None * Output: * None * Return: * None * Note : 直接重启 ********************************************************************************/ void bsp_drv_power_reboot_direct( void ) { #ifndef HI_ONOFF_PHONE power_off_reboot_operation(); #else printk(KERN_ERR"bsp_drv_power_reboot_direct is called, modem reset...\n"); bsp_modem_reset(); #endif }
/****************************************************************************** * Function: drv_shut_down * Description: start the power off process. * Input: * eReason : shutdown reason. * Output: * None * Return: * None * Note : 底层调用关机接口,启用定时器,上报事件给应用。 * 超时时间内应用不关机,由底层强制关机。 ********************************************************************************/ void drv_shut_down( DRV_SHUTDOWN_REASON_ENUM enReason ) { #ifndef HI_ONOFF_PHONE power_off_ctrl.off_timer.func = (softtimer_func)power_off_timeout_isr; if( DRV_SHUTDOWN_CHARGE_REMOVE == enReason ) { if( DRV_START_MODE_NORMAL == bsp_start_mode_get() ) { /* In normal mode, don't handle the charge remove message */ return ; } } if( DRV_SHUTDOWN_BUTT == enReason ) { return ; /* the shutdown been handled, ignore this call */ } /* save the reason and drv_power_off need it */ power_off_ctrl.reason = enReason; power_off_ctrl.off_timer.para = (u32)0; power_off_ctrl.off_timer.timeout = POWER_OFF_MONOTER_TIMEROUT; power_off_ctrl.off_timer.wake_type = SOFTTIMER_WAKE; if (bsp_softtimer_create(&power_off_ctrl.off_timer)) { pr_dbg("create softtimer failed \n"); } bsp_softtimer_add(&power_off_ctrl.off_timer); /* 针对由底层上报关机事件,由应用执行关机的场景 */ /* TO DO */ power_off_log_save(); #else if (DRV_SHUTDOWN_RESET == enReason) { pr_dbg("drv_shut_down is called, modem reset..."); bsp_modem_reset(); } #endif /* Notify the monitor task */ }
/****************************************************************************** * Function: bsp_drv_power_reboot * Description: same as drv_power_off, the public API * Input: * None * Output: * None * Return: * None * Note : 应用调用重启时调用,at+cfun=6 ********************************************************************************/ void bsp_drv_power_reboot( void ) { #ifndef HI_ONOFF_PHONE /*Set shutdown reason to reset.*/ power_off_ctrl.reason = DRV_SHUTDOWN_RESET; pr_dbg( "power reboot process triggered \n"); power_off_log_save(); power_on_wdt_cnt_set(); power_off_set_flag_and_reboot((power_off_reboot_flag)(power_off_ctrl.reason)); #else printk(KERN_ERR"bsp_drv_power_reboot_direct is called, modem reset...\n"); bsp_modem_reset(); #endif }