Пример #1
0
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);
}
Пример #2
0
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();
		}
	}
}
Пример #3
0
/*
 * 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();
}
Пример #4
0
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();
	}
}
Пример #5
0
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();
}
Пример #6
0
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);
}
Пример #7
0
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);
}
Пример #8
0
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);
}
Пример #9
0
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();
	}
}
Пример #10
0
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);
}
Пример #11
0
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);
}
Пример #12
0
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);
}
Пример #13
0
/*
 * 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.");
}
Пример #14
0
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);
}
Пример #15
0
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
}
Пример #16
0
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);
    }
}
Пример #17
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();
	}
}
Пример #19
0
/* 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();
		}
	}
}
Пример #20
0
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);
}
Пример #21
0
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);
}
Пример #22
0
static void native_machine_power_off(void)
{
	if (pm_power_off)
		pm_power_off();
}
Пример #23
0
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();
}
Пример #25
0
void machine_power_off(void)
{
	if (pm_power_off)
		pm_power_off();
}
Пример #26
0
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;
}
Пример #27
0
void machine_halt(void)
{
	pm_power_off();
}
Пример #28
0
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;
}
Пример #29
0
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
}