/* Copyright (c) 2011, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ /* * Qualcomm PMIC PM8xxx Battery Alarm driver * */ #ifndef __MFD_PM8XXX_BATT_ALARM_H__ #define __MFD_PM8XXX_BATT_ALARM_H__ #include #include #include #define PM8XXX_BATT_ALARM_DEV_NAME "pm8xxx-batt-alarm" /** * enum pm8xxx_batt_alarm_core_data - PMIC core specific core passed into the * batter alarm driver as platform data * @irq_name: * @reg_addr_batt_alarm_threshold: PMIC threshold register address * @reg_addr_batt_alarm_ctrl1: PMIC control 1 register address * @reg_addr_batt_alarm_ctrl2: PMIC control 2 register address * @reg_addr_batt_alarm_pwm_ctrl: PMIC PWM control register address */ struct pm8xxx_batt_alarm_core_data { char *irq_name; u16 reg_addr_threshold; u16 reg_addr_ctrl1; u16 reg_addr_ctrl2; u16 reg_addr_pwm_ctrl; }; /** * enum pm8xxx_batt_alarm_comparator - battery alarm comparator ID values */ enum pm8xxx_batt_alarm_comparator { PM8XXX_BATT_ALARM_LOWER_COMPARATOR, PM8XXX_BATT_ALARM_UPPER_COMPARATOR, }; /** * enum pm8xxx_batt_alarm_hold_time - hold time required for out of range * battery voltage needed to trigger a status change. Enum names denote * hold time in milliseconds. */ enum pm8xxx_batt_alarm_hold_time { PM8XXX_BATT_ALARM_HOLD_TIME_0p125_MS = 0, PM8XXX_BATT_ALARM_HOLD_TIME_0p25_MS, PM8XXX_BATT_ALARM_HOLD_TIME_0p5_MS, PM8XXX_BATT_ALARM_HOLD_TIME_1_MS, PM8XXX_BATT_ALARM_HOLD_TIME_2_MS, PM8XXX_BATT_ALARM_HOLD_TIME_4_MS, PM8XXX_BATT_ALARM_HOLD_TIME_8_MS, PM8XXX_BATT_ALARM_HOLD_TIME_16_MS, }; /* * Bits that are set in the return value of pm8xxx_batt_alarm_status_read * to indicate crossing of the upper or lower threshold. */ #define PM8XXX_BATT_ALARM_STATUS_BELOW_LOWER BIT(0) #define PM8XXX_BATT_ALARM_STATUS_ABOVE_UPPER BIT(1) #if defined(CONFIG_MFD_PM8XXX_BATT_ALARM) \ || defined(CONFIG_MFD_PM8XXX_BATT_ALARM_MODULE) /** * pm8xxx_batt_alarm_enable - enable one of the battery voltage threshold * comparators * @comparator: selects which comparator to enable * * RETURNS: an appropriate -ERRNO error value on error, or zero for success. */ int pm8xxx_batt_alarm_enable(enum pm8xxx_batt_alarm_comparator comparator); /** * pm8xxx_batt_alarm_disable - disable one of the battery voltage threshold * comparators * @comparator: selects which comparator to disable * * RETURNS: an appropriate -ERRNO error value on error, or zero for success. */ int pm8xxx_batt_alarm_disable(enum pm8xxx_batt_alarm_comparator comparator); /** * pm8xxx_batt_alarm_threshold_set - set the lower and upper alarm thresholds * @comparator: selects which comparator to set the threshold of * @threshold_mV: battery voltage threshold in millivolts * set points = 2500-5675 mV in 25 mV steps * * RETURNS: an appropriate -ERRNO error value on error, or zero for success. */ int pm8xxx_batt_alarm_threshold_set( enum pm8xxx_batt_alarm_comparator comparator, int threshold_mV); /** * pm8xxx_batt_alarm_status_read - get status of both threshold comparators * * RETURNS: < 0 = error * 0 = battery voltage ok * BIT(0) set = battery voltage below lower threshold * BIT(1) set = battery voltage above upper threshold */ int pm8xxx_batt_alarm_status_read(void); /** * pm8xxx_batt_alarm_register_notifier - register a notifier to run when a * battery voltage change interrupt fires * @nb: notifier block containing callback function to register * * nb->notifier_call must point to a function of this form - * int (*notifier_call)(struct notifier_block *nb, unsigned long status, * void *unused); * "status" will receive the battery alarm status; "unused" will be NULL. * * RETURNS: an appropriate -ERRNO error value on error, or zero for success. */ int pm8xxx_batt_alarm_register_notifier(struct notifier_block *nb); /** * pm8xxx_batt_alarm_unregister_notifier - unregister a notifier that is run * when a battery voltage change interrupt fires * @nb: notifier block containing callback function to unregister * * RETURNS: an appropriate -ERRNO error value on error, or zero for success. */ int pm8xxx_batt_alarm_unregister_notifier(struct notifier_block *nb); /** * pm8xxx_batt_alarm_hold_time_set - set hold time of interrupt output * * @hold_time: amount of time that battery voltage must remain outside of the * threshold range before the battery alarm interrupt triggers * * RETURNS: an appropriate -ERRNO error value on error, or zero for success. */ int pm8xxx_batt_alarm_hold_time_set(enum pm8xxx_batt_alarm_hold_time hold_time); /** * pm8xxx_batt_alarm_pwm_rate_set - set battery alarm update rate * * @use_pwm: 1 = use PWM update rate, 0 = comparators always active * @clock_scaler: PWM clock scaler = 2 to 9 * @clock_divider: PWM clock divider = 2 to 8 * * This function sets the rate at which the battery alarm module enables * the threshold comparators. The rate is determined by the following equation: * * f_update = (1024 Hz) / (clock_divider * (2 ^ clock_scaler)) * * Thus, the update rate can range from 0.25 Hz to 128 Hz. * * RETURNS: an appropriate -ERRNO error value on error, or zero for success. */ int pm8xxx_batt_alarm_pwm_rate_set(int use_pwm, int clock_scaler, int clock_divider); #else static inline int pm8xxx_batt_alarm_enable(enum pm8xxx_batt_alarm_comparator comparator) { return -ENODEV; } static inline int pm8xxx_batt_alarm_disable(enum pm8xxx_batt_alarm_comparator comparator) { return -ENODEV; } static inline int pm8xxx_batt_alarm_threshold_set(enum pm8xxx_batt_alarm_comparator comparator, int threshold_mV) { return -ENODEV; } static inline int pm8xxx_batt_alarm_status_read(void) { return -ENODEV; } static inline int pm8xxx_batt_alarm_register_notifier(struct notifier_block *nb) { return -ENODEV; } static inline int pm8xxx_batt_alarm_unregister_notifier(struct notifier_block *nb) { return -ENODEV; } static inline int pm8xxx_batt_alarm_hold_time_set(enum pm8xxx_batt_alarm_hold_time hold_time) { return -ENODEV; } static inline int pm8xxx_batt_alarm_pwm_rate_set(int use_pwm, int clock_scaler, int clock_divider) { return -ENODEV; } #endif #endif /* __MFD_PM8XXX_BATT_ALARM_H__ */