Lines Matching +full:charge +full:- +full:delay
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Battery and Power Management code for the Sharp SL-C7xx and SL-Cxx00
6 * Copyright (c) 2004-2005 Richard Purdie
17 #include <linux/apm-emulation.h>
19 #include <linux/delay.h>
25 #include <asm/mach-types.h>
27 #include <mach/pxa2xx-regs.h>
28 #include "regs-rtc.h"
177 /* max1111 accepts channels from 0-3, however, in sharpsl_pm_pxa_read_max1111()
178 * it is encoded from 0-7 here in the code. in sharpsl_pm_pxa_read_max1111()
185 int i = sharpsl_pm.machinfo->bat_levels - 1; in get_percentage()
186 …int bl_status = sharpsl_pm.machinfo->backlight_get_status ? sharpsl_pm.machinfo->backlight_get_sta… in get_percentage()
190 …thresh = bl_status ? sharpsl_pm.machinfo->bat_levels_acin_bl : sharpsl_pm.machinfo->bat_levels_aci… in get_percentage()
192 …thresh = bl_status ? sharpsl_pm.machinfo->bat_levels_noac_bl : sharpsl_pm.machinfo->bat_levels_noa… in get_percentage()
195 i--; in get_percentage()
205 high_thresh = sharpsl_pm.machinfo->status_high_acin; in get_apm_status()
206 low_thresh = sharpsl_pm.machinfo->status_low_acin; in get_apm_status()
208 high_thresh = sharpsl_pm.machinfo->status_high_noac; in get_apm_status()
209 low_thresh = sharpsl_pm.machinfo->status_low_noac; in get_apm_status()
231 …sharpsl_pm.battstat.ac_status = (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN) ? APM_AC_O… in sharpsl_battery_thread()
234 if (!sharpsl_pm.machinfo->batfull_irq && (sharpsl_pm.charge_mode == CHRG_ON) in sharpsl_battery_thread()
239 voltage = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT); in sharpsl_battery_thread()
244 voltage = sharpsl_pm.machinfo->bat_levels_noac[0].voltage; in sharpsl_battery_thread()
282 dev_dbg(sharpsl_pm.dev, "Charge LED On\n"); in sharpsl_pm_led()
285 dev_dbg(sharpsl_pm.dev, "Charge LED Off\n"); in sharpsl_pm_led()
304 sharpsl_pm.machinfo->charge(0); in sharpsl_charge_off()
314 sharpsl_pm.machinfo->charge(0); in sharpsl_charge_error()
322 if (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN)) { in sharpsl_charge_toggle()
331 sharpsl_pm.machinfo->charge(0); in sharpsl_charge_toggle()
333 sharpsl_pm.machinfo->charge(1); in sharpsl_charge_toggle()
340 int acin = sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN); in sharpsl_ac_timer()
356 /* Delay the event slightly to debounce */ in sharpsl_ac_isr()
357 /* Must be a smaller delay than the chrg_full_isr below */ in sharpsl_ac_isr()
365 dev_dbg(sharpsl_pm.dev, "Charge Full at time: %lx\n", jiffies); in sharpsl_chrg_full_timer()
369 if (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN)) { in sharpsl_chrg_full_timer()
370 dev_dbg(sharpsl_pm.dev, "Charge Full: AC removed - stop charging!\n"); in sharpsl_chrg_full_timer()
374 dev_dbg(sharpsl_pm.dev, "Charge Full: Count too low\n"); in sharpsl_chrg_full_timer()
377 dev_dbg(sharpsl_pm.dev, "Charge Full: Interrupt generated too slowly - retry.\n"); in sharpsl_chrg_full_timer()
382 dev_dbg(sharpsl_pm.dev, "Charge Full: Charging Finished\n"); in sharpsl_chrg_full_timer()
388 delay until after that has been processed */
394 /* delay until after any ac interrupt */ in sharpsl_chrg_full_isr()
404 if (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) { in sharpsl_fatal_isr()
409 if (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_FATAL)) { in sharpsl_fatal_isr()
446 for (i = 0; i < (SHARPSL_CNV_VALUE_NUM-1); i++) in sharpsl_average_value()
448 sharpsl_ad_index = SHARPSL_CNV_VALUE_NUM - 1; in sharpsl_average_value()
477 for (i = 3; i >= 0; i--) { in get_select_val()
500 sharpsl_pm.machinfo->measure_temp(1); in sharpsl_check_battery_temp()
502 buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_TEMP); in sharpsl_check_battery_temp()
503 sharpsl_pm.machinfo->measure_temp(0); in sharpsl_check_battery_temp()
509 if (val > sharpsl_pm.machinfo->charge_on_temp) { in sharpsl_check_battery_temp()
511 return -1; in sharpsl_check_battery_temp()
522 /* disable charge, enable discharge */ in sharpsl_check_battery_voltage()
523 sharpsl_pm.machinfo->charge(0); in sharpsl_check_battery_voltage()
524 sharpsl_pm.machinfo->discharge(1); in sharpsl_check_battery_voltage()
527 if (sharpsl_pm.machinfo->discharge1) in sharpsl_check_battery_voltage()
528 sharpsl_pm.machinfo->discharge1(1); in sharpsl_check_battery_voltage()
532 buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT); in sharpsl_check_battery_voltage()
536 if (sharpsl_pm.machinfo->discharge1) in sharpsl_check_battery_voltage()
537 sharpsl_pm.machinfo->discharge1(0); in sharpsl_check_battery_voltage()
539 sharpsl_pm.machinfo->discharge(0); in sharpsl_check_battery_voltage()
544 if (val < sharpsl_pm.machinfo->charge_on_volt) in sharpsl_check_battery_voltage()
545 return -1; in sharpsl_check_battery_voltage()
556 buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_ACIN_VOLT); in sharpsl_ac_check()
563 …if ((temp > sharpsl_pm.machinfo->charge_acin_high) || (temp < sharpsl_pm.machinfo->charge_acin_low… in sharpsl_ac_check()
565 return -1; in sharpsl_ac_check()
601 …dev_dbg(sharpsl_pm.dev, "Offline Charge Activate = %d\n", sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CH… in corgi_goto_sleep()
602 /* not charging and AC-IN! */ in corgi_goto_sleep()
604 …if ((sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG) && (sharpsl_pm.machinfo->read_devdata(SHARPSL_STA… in corgi_goto_sleep()
611 sharpsl_pm.machinfo->presuspend(); in corgi_goto_sleep()
616 …if ((sharpsl_pm.charge_mode == CHRG_ON) && ((alarm_enable && ((alarm_time - RCNR) > (SHARPSL_BATCH… in corgi_goto_sleep()
631 sharpsl_pm.machinfo->postsuspend(); in corgi_goto_sleep()
638 …if (!sharpsl_pm.machinfo->should_wakeup(!(sharpsl_pm.flags & SHARPSL_ALARM_ACTIVE) && alarm_enable… in corgi_enter_suspend()
652 if ((!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) || in corgi_enter_suspend()
653 (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_FATAL))) { in corgi_enter_suspend()
674 if (sharpsl_pm.machinfo->earlyresume) in corgi_pxa_pm_enter()
675 sharpsl_pm.machinfo->earlyresume(); in corgi_pxa_pm_enter()
685 sharpsl_pm.machinfo->charge(0); in sharpsl_off_charge_error()
693 * Return 1 - go straight to sleep
694 * Return 0 - sleep or wakeup depending on other factors
700 dev_dbg(sharpsl_pm.dev, "Charge Mode: %d\n", sharpsl_pm.charge_mode); in sharpsl_off_charge_battery()
711 sharpsl_pm.machinfo->charge(0); in sharpsl_off_charge_battery()
713 sharpsl_pm.machinfo->charge(1); in sharpsl_off_charge_battery()
731 sharpsl_pm.machinfo->charge(0); in sharpsl_off_charge_battery()
733 sharpsl_pm.machinfo->charge(1); in sharpsl_off_charge_battery()
741 if (sharpsl_pm.machinfo->charger_wakeup()) in sharpsl_off_charge_battery()
744 if ((RCNR - time) > SHARPSL_WAIT_CO_TIME) in sharpsl_off_charge_battery()
746 if (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_CHRGFULL)) { in sharpsl_off_charge_battery()
747 dev_dbg(sharpsl_pm.dev, "Offline Charger: Charge full occurred. Retrying to check\n"); in sharpsl_off_charge_battery()
749 sharpsl_pm.machinfo->charge(0); in sharpsl_off_charge_battery()
751 sharpsl_pm.machinfo->charge(1); in sharpsl_off_charge_battery()
764 if (sharpsl_pm.machinfo->charger_wakeup()) in sharpsl_off_charge_battery()
767 if ((RCNR-time) > SHARPSL_WAIT_CO_TIME) { in sharpsl_off_charge_battery()
775 if (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_CHRGFULL)) { in sharpsl_off_charge_battery()
778 sharpsl_pm.machinfo->charge(0); in sharpsl_off_charge_battery()
806 info->ac_line_status = sharpsl_pm.battstat.ac_status; in sharpsl_apm_get_power_status()
809 info->battery_status = APM_BATTERY_STATUS_CHARGING; in sharpsl_apm_get_power_status()
811 info->battery_status = sharpsl_pm.battstat.mainbat_status; in sharpsl_apm_get_power_status()
813 info->battery_flag = (1 << info->battery_status); in sharpsl_apm_get_power_status()
814 info->battery_life = sharpsl_pm.battstat.mainbat_percent; in sharpsl_apm_get_power_status()
830 if (!pdev->dev.platform_data) in sharpsl_pm_probe()
831 return -EINVAL; in sharpsl_pm_probe()
833 sharpsl_pm.dev = &pdev->dev; in sharpsl_pm_probe()
834 sharpsl_pm.machinfo = pdev->dev.platform_data; in sharpsl_pm_probe()
842 led_trigger_register_simple("sharpsl-charge", &sharpsl_charge_led_trigger); in sharpsl_pm_probe()
844 sharpsl_pm.machinfo->init(); in sharpsl_pm_probe()
846 gpio_request(sharpsl_pm.machinfo->gpio_acin, "AC IN"); in sharpsl_pm_probe()
847 gpio_direction_input(sharpsl_pm.machinfo->gpio_acin); in sharpsl_pm_probe()
848 gpio_request(sharpsl_pm.machinfo->gpio_batfull, "Battery Full"); in sharpsl_pm_probe()
849 gpio_direction_input(sharpsl_pm.machinfo->gpio_batfull); in sharpsl_pm_probe()
850 gpio_request(sharpsl_pm.machinfo->gpio_batlock, "Battery Lock"); in sharpsl_pm_probe()
851 gpio_direction_input(sharpsl_pm.machinfo->gpio_batlock); in sharpsl_pm_probe()
854 irq = gpio_to_irq(sharpsl_pm.machinfo->gpio_acin); in sharpsl_pm_probe()
859 irq = gpio_to_irq(sharpsl_pm.machinfo->gpio_batlock); in sharpsl_pm_probe()
864 if (sharpsl_pm.machinfo->gpio_fatal) { in sharpsl_pm_probe()
865 irq = gpio_to_irq(sharpsl_pm.machinfo->gpio_fatal); in sharpsl_pm_probe()
871 if (sharpsl_pm.machinfo->batfull_irq) { in sharpsl_pm_probe()
873 irq = gpio_to_irq(sharpsl_pm.machinfo->gpio_batfull); in sharpsl_pm_probe()
879 ret = device_create_file(&pdev->dev, &dev_attr_battery_percentage); in sharpsl_pm_probe()
880 ret |= device_create_file(&pdev->dev, &dev_attr_battery_voltage); in sharpsl_pm_probe()
882 dev_warn(&pdev->dev, "Failed to register attributes (%d)\n", ret); in sharpsl_pm_probe()
899 device_remove_file(&pdev->dev, &dev_attr_battery_percentage); in sharpsl_pm_remove()
900 device_remove_file(&pdev->dev, &dev_attr_battery_voltage); in sharpsl_pm_remove()
904 free_irq(gpio_to_irq(sharpsl_pm.machinfo->gpio_acin), sharpsl_ac_isr); in sharpsl_pm_remove()
905 free_irq(gpio_to_irq(sharpsl_pm.machinfo->gpio_batlock), sharpsl_fatal_isr); in sharpsl_pm_remove()
907 if (sharpsl_pm.machinfo->gpio_fatal) in sharpsl_pm_remove()
908 free_irq(gpio_to_irq(sharpsl_pm.machinfo->gpio_fatal), sharpsl_fatal_isr); in sharpsl_pm_remove()
910 if (sharpsl_pm.machinfo->batfull_irq) in sharpsl_pm_remove()
911 free_irq(gpio_to_irq(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr); in sharpsl_pm_remove()
913 gpio_free(sharpsl_pm.machinfo->gpio_batlock); in sharpsl_pm_remove()
914 gpio_free(sharpsl_pm.machinfo->gpio_batfull); in sharpsl_pm_remove()
915 gpio_free(sharpsl_pm.machinfo->gpio_acin); in sharpsl_pm_remove()
917 if (sharpsl_pm.machinfo->exit) in sharpsl_pm_remove()
918 sharpsl_pm.machinfo->exit(); in sharpsl_pm_remove()
932 .name = "sharpsl-pm",