static void max8998_set_cable(struct max8998_charger_callbacks *ptr, enum cable_type_t status) { struct chg_data *chg = container_of(ptr, struct chg_data, callbacks); chg->cable_status = status; chg->lowbat_warning = false; if (chg->esafe == MAX8998_ESAFE_ALLOFF) chg->esafe = MAX8998_USB_VBUS_AP_ON; bat_info("%s : cable_status = %d\n", __func__, status); #ifdef __VZW_AUTH_CHECK__ /* debug info */ if ((status != CABLE_TYPE_NONE) && (chg->bat_info.batt_health == POWER_SUPPLY_HEALTH_UNSPEC_FAILURE)) { int i; printk("/BATT_ID/ rom code ="); for (i = 0; i < 8; i++) printk(" %d", vzw_rcode[i]); printk("\n"); printk("/BATT_ID/ rom code crc = %d\n", vzw_crc1); printk("/BATT_ID/ crc = %d", vzw_crc2); } #endif if (lpm_charging_mode && (max8998_check_vdcin(chg) != 1) && pm_power_off) pm_power_off(); power_supply_changed(&chg->psy_ac); power_supply_changed(&chg->psy_usb); wake_lock(&chg->work_wake_lock); queue_work(chg->monitor_wqueue, &chg->bat_work); }
static void lpm_mode_check(struct battery_data *battery) { extern int charging_mode_from_boot; pr_info("%s : charging_mode_from_boot(%d), ta_connected(%d)\n", __func__, charging_mode_from_boot, check_ta_conn(battery)); if (!charging_mode_from_boot) return; if (check_ta_conn(battery)) { battery->charging_mode_booting = 1; lpm_mode_flag = 1; pr_info("%s : charging_mode_booting(%d)\n", __func__, battery->charging_mode_booting); } else { pr_info("%s: ta no longer connected, powering off\n", __func__); if (pm_power_off) { #ifdef CONFIG_KERNEL_DEBUG_SEC kernel_sec_upload_cause_type upload_cause = kernel_sec_get_upload_cause(); if (upload_cause == UPLOAD_CAUSE_INIT) /* Clear the magic number because it's normal reboot */ kernel_sec_clear_upload_magic_number(); #endif pm_power_off(); } } }
/* * Power-off simply requires that the secondary CPUs stop performing any * activity (executing tasks, handling interrupts). smp_send_stop() * achieves this. When the system power is turned off, it will take all CPUs * with it. */ void machine_power_off(void) { local_irq_disable(); smp_send_stop(); if (pm_power_off) pm_power_off(); }
static void rk29_adc_battery_lowpower_check(struct rk29_adc_battery_data *bat) { int i; int level, oldlevel; struct rk29_adc_battery_platform_data *pdata = bat->pdata; printk("%s--%d:\n", __FUNCTION__, __LINE__); old_charge_level = -1; pSamples = bat->adc_samples; adc_sync_read(bat->client); //start adc sample level = oldlevel = rk29_adc_battery_status_samples(bat); //init charge status /* Fill sample buffer with values */ bat->full_times = 0; for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++) //0.3 s { mdelay(1); rk29_adc_battery_voltage_samples(bat); //get voltage //level = rk29_adc_battery_status_samples(bat); //check charge status level = rk29_adc_battery_get_charge_level(bat); if (oldlevel != level) { oldlevel = level; //if charge status changed, reset sample i = 0; } } bat->bat_capacity = rk29_adc_battery_voltage_to_capacity(bat, bat->bat_voltageAvg); bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING; if (rk29_adc_battery_get_charge_level(bat)) { bat->bat_status = POWER_SUPPLY_STATUS_CHARGING; if (pdata->charge_ok_pin != INVALID_GPIO) { if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level) { bat->bat_status = POWER_SUPPLY_STATUS_FULL; bat->bat_capacity = 100; } } } #if 0 rk29_adc_battery_poweron_capacity_check(); #else poweron_check = 1; #endif /* Immediate power off for battery protection */ if (bat->bat_voltageAvg <= (pdata->adc_bat_levels[BATT_ZERO_VOL_IDX] + 50)) { printk("%umV -> low battery: powerdown (%u)\n", bat->bat_voltageAvg, pdata->adc_bat_levels[BATT_ZERO_VOL_IDX]+50); system_state = SYSTEM_POWER_OFF; pm_power_off(); } }
static void thermal_power_off(struct work_struct *work) { struct ab8500_temp *data = container_of(work, struct ab8500_temp, power_off_work.work); dev_warn(&data->pdev->dev, "Power off due to AB8500 thermal warning\n"); pm_power_off(); }
void machine_power_off(void) { /* We really want to get pending console data out before we die. */ xencons_force_flush(); if (pm_power_off) pm_power_off(); HYPERVISOR_shutdown(SHUTDOWN_poweroff); }
void machine_power_off(void) { /* We really want to get pending console data out before we die. */ xencons_force_flush(); #if defined(__i386__) || defined(__x86_64__) if (pm_power_off) pm_power_off(); #endif HYPERVISOR_shutdown(SHUTDOWN_poweroff); }
static void native_machine_power_off(void) { if (pm_power_off) { if (!reboot_force) machine_shutdown(); pm_power_off(); } /* A fallback in case there is no PM info available */ tboot_shutdown(TB_SHUTDOWN_HALT); }
static void wisky_boot_charge_poweroff(void) { if(KEY_SHUTDOWN_PIN != INVALID_GPIO){ gpio_request(KEY_SHUTDOWN_PIN, "poweronpin"); gpio_direction_output(KEY_SHUTDOWN_PIN, GPIO_LOW); gpio_set_value(KEY_SHUTDOWN_PIN, GPIO_LOW); } if(pm_power_off){ pm_power_off(); } }
static void check_lpm_charging_mode(struct chg_data *chg) { if (readl(S5P_INFORM5)) { lpm_charging_mode = 1; if (max8998_check_vdcin(chg) != 1) if (pm_power_off) pm_power_off(); } else lpm_charging_mode = 0; pr_info("%s : lpm_charging_mode(%d)\n", __func__, lpm_charging_mode); }
void machine_power_off(void) { if (pm_power_off) pm_power_off(); #ifdef CONFIG_SMP preempt_disable(); smp_send_stop(); #endif local_irq_disable(); while (1); }
static void max8998_set_cable(struct max8998_charger_callbacks *ptr, enum cable_type_t status) { struct chg_data *chg = container_of(ptr, struct chg_data, callbacks); chg->cable_status = status; if (lpm_charging_mode && (max8998_check_vdcin(chg) != 1) && pm_power_off) pm_power_off(); power_supply_changed(&chg->psy_ac); power_supply_changed(&chg->psy_usb); wake_lock(&chg->work_wake_lock); queue_work(chg->monitor_wqueue, &chg->bat_work); }
/* * This routine is called from sys_reboot to actually turn off the * machine */ void machine_power_off(void) { /* If there is a registered power off handler, call it. */ if(pm_power_off) pm_power_off(); /* Put the soft power button back under hardware control. * If the user had already pressed the power button, the * following call will immediately power off. */ pdc_soft_power_button(0); /* It seems we have no way to power the system off via * software. The user has to press the button himself. */ printk(KERN_EMERG "System shut down completed.\n" KERN_EMERG "Please power this system off now."); }
void rockchip_tsadc_auto_ht_work(struct work_struct *work) { int ret,val; // printk("%s,line=%d\n", __func__,__LINE__); mutex_lock(&tsadc_mutex); val = tsadc_readl(TSADC_INT_PD); tsadc_writel(val &(~ (1 <<8) ), TSADC_INT_PD); ret = tsadc_readl(TSADC_INT_PD); tsadc_writel(ret | 0xff, TSADC_INT_PD); //clr irq status if ((val & 0x0f) != 0){ printk("rockchip tsadc is over temp . %s,line=%d\n", __func__,__LINE__); pm_power_off(); //power_off } mutex_unlock(&tsadc_mutex); }
static void native_machine_power_off(void) { #ifdef CONFIG_X86_INTEL_CE_GEN3 machine_shutdown(); while (1) { outb(0x4, 0xcf9); udelay(50); } #else if (pm_power_off) { if (!reboot_force) machine_shutdown(); pm_power_off(); } /* A fallback in case there is no PM info available */ tboot_shutdown(TB_SHUTDOWN_HALT); #endif }
void p1_lpm_mode_check(struct chg_data *chg) { if(get_boot_charger_info()) { printk("%s : VDCIN (%d)\n", __func__, get_charging_status(chg)); if(get_charging_status(chg)) { charging_mode_set(chg, 1); } else { if (pm_power_off) pm_power_off(); } } else { charging_mode_set(chg, 0); } }
static void process_shutdown(void) { if (shutdown_timer == 0) printk(KERN_ALERT KTHREAD_NAME ": Shutdown requested...\n"); shutdown_timer++; /* */ if (shutdown_timer == (POWERSWITCH_DOWN_SEC*POWERSWITCH_POLL_PER_SEC)) { static const char msg[] = "Shutting down..."; printk(KERN_INFO KTHREAD_NAME ": %s\n", msg); lcd_print(msg); /* */ if (kill_cad_pid(SIGINT, 1)) { /* */ if (pm_power_off) pm_power_off(); } } }
static void lpm_mode_check(struct battery_data *battery) { extern int charging_mode_from_boot; pr_info("%s : charging_mode_from_boot(%d), ta_connected(%d)\n", __func__, charging_mode_from_boot, check_ta_conn(battery)); if (!charging_mode_from_boot) return; if (check_ta_conn(battery)) { battery->charging_mode_booting = 1; lpm_mode_flag = 1; pr_info("%s : charging_mode_booting(%d)\n", __func__, battery->charging_mode_booting); } else { pr_info("%s: ta no longer connected, powering off\n", __func__); if (pm_power_off) pm_power_off(); } }
/* check, give feedback and start shutdown after one second */ static void process_shutdown(void) { if (shutdown_timer == 0) printk(KERN_ALERT KTHREAD_NAME ": Shutdown requested...\n"); shutdown_timer++; /* wait until the button was pressed for 1 second */ if (shutdown_timer == (POWERSWITCH_DOWN_SEC*POWERSWITCH_POLL_PER_SEC)) { static const char msg[] = "Shutting down..."; printk(KERN_INFO KTHREAD_NAME ": %s\n", msg); lcd_print(msg); /* send kill signal */ if (kill_cad_pid(SIGINT, 1)) { /* just in case killing init process failed */ if (pm_power_off) pm_power_off(); } } }
static void __suspend_enter(enum suspend_state_t state) { __record_dbg_status(PM_SUSPEND_ENTER | 5); if (HAL_Wakeup_SetSrc(1)) return ; __record_dbg_status(PM_SUSPEND_ENTER | 6); debug_jtag_deinit(); PM_LOGN("device info. rst:%x clk:%x\n", CCM->BUS_PERIPH_RST_CTRL, CCM->BUS_PERIPH_CLK_CTRL); /* debug info. */ PM_SetCPUBootArg((uint32_t)&vault_arm_registers); if (state >= PM_MODE_HIBERNATION) { __record_dbg_status(PM_SUSPEND_ENTER | 7); PM_SetCPUBootArg(PM_MODE_MAGIC | state); #ifdef __CONFIG_ARCH_APP_CORE HAL_Wakeup_SetIOHold((1 << WAKEUP_IO_MAX) - 1); #endif pm_power_off(PM_SHUTDOWN); /* never return */ } else if (state < PM_MODE_STANDBY) { __record_dbg_status(PM_SUSPEND_ENTER | 8); /* TODO: set system bus to low freq */ __cpu_sleep(state); /* TODO: restore system bus to normal freq */ } else { __record_dbg_status(PM_SUSPEND_ENTER | 9); __cpu_suspend(state); } PM_BUG_ON(!PM_IRQ_GET_FLAGS()); __record_dbg_status(PM_SUSPEND_ENTER | 0xa); debug_jtag_init(); __record_dbg_status(PM_SUSPEND_ENTER | 0xb); HAL_Wakeup_ClrSrc(1); }
static void max8998_set_cable(struct max8998_charger_callbacks *ptr, enum cable_type_t status) { struct chg_data *chg = container_of(ptr, struct chg_data, callbacks); chg->cable_status = status; chg->lowbat_warning = false; if (chg->esafe == MAX8998_ESAFE_ALLOFF) chg->esafe = MAX8998_USB_VBUS_AP_ON; bat_info("%s : cable_status(%d) esafe(%d)\n", __func__, status, chg->esafe); if (lpm_charging_mode && (max8998_check_vdcin(chg) != 1) && pm_power_off) pm_power_off(); power_supply_changed(&chg->psy_ac); power_supply_changed(&chg->psy_usb); wake_lock(&chg->work_wake_lock); queue_work(chg->monitor_wqueue, &chg->bat_work); }
static void native_machine_power_off(void) { if (pm_power_off) pm_power_off(); }
static void xen_machine_power_off(void) { if (pm_power_off) pm_power_off(); xen_reboot(SHUTDOWN_poweroff); }
void machine_power_off(void) { machine_shutdown(); if (pm_power_off) pm_power_off(); }
void machine_power_off(void) { if (pm_power_off) pm_power_off(); }
static int s3c_cable_status_update(struct chg_data *chg) { int ret; bool vdc_status; ktime_t ktime; struct timespec cur_time; /* if max8998 has detected vdcin */ if (max8998_check_vdcin(chg)) { vdc_status = 1; if (chg->bat_info.dis_reason) { pr_info("%s : battery status discharging : %d\n", __func__, chg->bat_info.dis_reason); /* have vdcin, but cannot charge */ chg->charging = false; ret = max8998_charging_control(chg); if (ret < 0) goto err; chg->bat_info.charging_status = chg->bat_info.batt_is_full ? POWER_SUPPLY_STATUS_FULL : POWER_SUPPLY_STATUS_NOT_CHARGING; chg->discharging_time = 0; chg->set_batt_full = 0; goto update; } else if (chg->discharging_time == 0) { ktime = alarm_get_elapsed_realtime(); cur_time = ktime_to_timespec(ktime); chg->discharging_time = chg->bat_info.batt_is_full || chg->set_charge_timeout ? cur_time.tv_sec + TOTAL_RECHARGING_TIME : cur_time.tv_sec + TOTAL_CHARGING_TIME; } /* able to charge */ chg->charging = true; ret = max8998_charging_control(chg); if (ret < 0) goto err; chg->bat_info.charging_status = chg->bat_info.batt_is_full ? POWER_SUPPLY_STATUS_FULL : POWER_SUPPLY_STATUS_CHARGING; } else { /* no vdc in, not able to charge */ vdc_status = 0; chg->charging = false; ret = max8998_charging_control(chg); if (ret < 0) goto err; chg->bat_info.charging_status = POWER_SUPPLY_STATUS_DISCHARGING; chg->bat_info.batt_is_full = false; chg->set_charge_timeout = false; chg->set_batt_full = 0; chg->bat_info.dis_reason = 0; chg->discharging_time = 0; if (lpm_charging_mode && pm_power_off) pm_power_off(); } update: if ((chg->cable_status == CABLE_TYPE_USB) && vdc_status) wake_lock(&chg->vbus_wake_lock); else wake_lock_timeout(&chg->vbus_wake_lock, HZ / 2); return 0; err: return ret; }
void machine_halt(void) { pm_power_off(); }
static int s3c_cable_status_update(struct chg_data *chg) { int ret; bool vdc_status; ktime_t ktime; struct timespec cur_time; static bool prev_vdc_status = 0; /* if max8998 has detected vdcin */ if (max8998_check_vdcin(chg) == 1) { vdc_status = 1; if (chg->bat_info.dis_reason) { /* have vdcin, but cannot charge */ chg->charging = 0; ret = max8998_charging_control(chg); if (ret < 0) goto err; if (chg->bat_info.dis_reason & (DISCONNECT_TEMP_OVERHEAT | DISCONNECT_TEMP_FREEZE)) chg->set_batt_full = false; chg->bat_info.charging_status = chg->set_batt_full ? POWER_SUPPLY_STATUS_FULL : POWER_SUPPLY_STATUS_NOT_CHARGING; chg->discharging_time = 0; chg->bat_info.batt_is_full = false; goto update; } else if (chg->discharging_time == 0) { ktime = alarm_get_elapsed_realtime(); cur_time = ktime_to_timespec(ktime); chg->discharging_time = (chg->set_batt_full || chg->set_charge_timeout) ? cur_time.tv_sec + TOTAL_RECHARGING_TIME : cur_time.tv_sec + TOTAL_CHARGING_TIME; } /* able to charge */ chg->charging = 1; ret = max8998_charging_control(chg); if (ret < 0) goto err; chg->bat_info.charging_status = chg->set_batt_full ? POWER_SUPPLY_STATUS_FULL : POWER_SUPPLY_STATUS_CHARGING; } else { vdc_status = 0; /* no vdc in, not able to charge */ chg->charging = 0; ret = max8998_charging_control(chg); if (ret < 0) goto err; chg->bat_info.charging_status = POWER_SUPPLY_STATUS_DISCHARGING; chg->bat_info.batt_is_full = false; chg->set_charge_timeout = false; chg->set_batt_full = false; chg->bat_info.dis_reason = 0; chg->discharging_time = 0; if (lpm_charging_mode && pm_power_off) pm_power_off(); } update: if (vdc_status) wake_lock(&chg->vbus_wake_lock); else wake_lock_timeout(&chg->vbus_wake_lock, HZ / 5); if (vdc_status != prev_vdc_status) { set_tsp_for_ta_detect(vdc_status); prev_vdc_status = vdc_status; } return 0; err: return ret; }
void machine_power_off(void) { pm_power_off(); }
/** * Temperature handler. * @int cpu_num: CPU number. * Read sensor1, because the sensor0 * can't read out right value. * * If open MODULE_ACTION, the halt and * warning value will be activation. * * Warning temperature: 70 * Poweroff temerature: 85 */ static void temp_handler(int cpu_num) { unsigned char temp[4]; unsigned char WARNING_TEMP = 70; unsigned char POWEROFF_TEMP = 85; if ((read_c0_prid() & 0xf) == (PRID_IMP_LOONGSON3B1500 & 0xf)) { WARNING_TEMP = 255; POWEROFF_TEMP = 255; } if (cpu_num == 1) { temp[0] = *((volatile unsigned char *)temp_device.resource[0].end); if (temp[0] >= WARNING_TEMP) printk(KERN_INFO "Warning!! High CPU temperature! %d C\n", temp[0]); #if MODULE_ACTION if (temp[0] >= POWEROFF_TEMP) goto poweroff; #endif } else if (cpu_num == 2) { temp[0] = *((volatile unsigned char *)temp_device.resource[0].end); temp[1] = *((volatile unsigned char *)temp_device.resource[1].end); if (temp[0] >= WARNING_TEMP || temp[1] >= WARNING_TEMP) printk(KERN_INFO "Warning!! High CPU temperature! " "CPU0 %d C CPU1 %d C\n", temp[0], temp[1]); #if MODULE_ACTION if (temp[0] >= POWEROFF_TEMP || temp[1] >= POWEROFF_TEMP) goto poweroff; #endif } else if (cpu_num == 4) { temp[0] = *((volatile unsigned char *)temp_device.resource[0].end); temp[1] = *((volatile unsigned char *)temp_device.resource[1].end); temp[2] = *((volatile unsigned char *)temp_device.resource[2].end); temp[3] = *((volatile unsigned char *)temp_device.resource[3].end); if (temp[0] >= WARNING_TEMP || temp[1] >= WARNING_TEMP || temp[2] >= WARNING_TEMP || temp[3] >= WARNING_TEMP) printk(KERN_INFO "Warning!! High CPU temperature! " "CPU0 %d C CPU1 %d C CPU2 %d C CPU3 %d C\n", temp[0], temp[1], temp[2], temp[3]); #if MODULE_ACTION if (temp[0] >= POWEROFF_TEMP || temp[1] >= POWEROFF_TEMP || temp[2] >= POWEROFF_TEMP || temp[3] >= POWEROFF_TEMP) goto poweroff; #endif } #if PROC_PRINT if (cpu_num == 1) { cpu_temp.cpu_num = 1; cpu_temp.temp[0] = *((volatile unsigned char *)temp_device.resource[0].end); } else if (cpu_num == 2) { cpu_temp.cpu_num = 2; cpu_temp.temp[0] = *((volatile unsigned char *)temp_device.resource[0].end); cpu_temp.temp[1] = *((volatile unsigned char *)temp_device.resource[1].end); } else if (cpu_num == 4) { cpu_temp.cpu_num = 4; cpu_temp.temp[0] = *((volatile unsigned char *)temp_device.resource[0].end); cpu_temp.temp[1] = *((volatile unsigned char *)temp_device.resource[1].end); cpu_temp.temp[2] = *((volatile unsigned char *)temp_device.resource[2].end); cpu_temp.temp[3] = *((volatile unsigned char *)temp_device.resource[3].end); } #endif mod_timer(&timer_temp, jiffies + 3 * HZ); return; #if MODULE_ACTION poweroff: printk(KERN_INFO "System will be poweroff.\n"); pm_power_off(); #endif }