power: pm8921-charger: add UVD threshold API
PM8917 has a new register which allows configuring
the falling USB under voltage detection (UVD) threshold
from 3.85V to 4.35V in 100 mV steps.
Add an API that allows to set this value per default and
also only do this for PM8917 chips.
Change-Id: I9b4259b43f148762ac72af40bdc79b895d9b4fc2
Signed-off-by: David Keitel <dkeitel@codeaurora.org>
diff --git a/arch/arm/mach-msm/board-8064-pmic.c b/arch/arm/mach-msm/board-8064-pmic.c
index fc886ed..43a79b5 100644
--- a/arch/arm/mach-msm/board-8064-pmic.c
+++ b/arch/arm/mach-msm/board-8064-pmic.c
@@ -347,6 +347,7 @@
.update_time = 60000,
.max_voltage = MAX_VOLTAGE_MV,
.min_voltage = 3200,
+ .uvd_thresh_voltage = 4050,
.resume_voltage_delta = 100,
.term_current = 100,
.cool_temp = 10,
diff --git a/arch/arm/mach-msm/board-8930-pmic.c b/arch/arm/mach-msm/board-8930-pmic.c
index 5489fd3..a1a4b7c 100644
--- a/arch/arm/mach-msm/board-8930-pmic.c
+++ b/arch/arm/mach-msm/board-8930-pmic.c
@@ -212,6 +212,7 @@
.update_time = 60000,
.max_voltage = MAX_VOLTAGE_MV,
.min_voltage = 3200,
+ .uvd_thresh_voltage = 4050,
.resume_voltage_delta = 100,
.term_current = 100,
.cool_temp = 10,
diff --git a/arch/arm/mach-msm/board-8960-pmic.c b/arch/arm/mach-msm/board-8960-pmic.c
index 19564e9..17b0b6f 100644
--- a/arch/arm/mach-msm/board-8960-pmic.c
+++ b/arch/arm/mach-msm/board-8960-pmic.c
@@ -418,6 +418,7 @@
.update_time = 60000,
.max_voltage = MAX_VOLTAGE_MV,
.min_voltage = 3200,
+ .uvd_thresh_voltage = 4050,
.resume_voltage_delta = 100,
.term_current = 100,
.cool_temp = 10,
diff --git a/drivers/power/pm8921-charger.c b/drivers/power/pm8921-charger.c
index 569e65d..0f7c4c3 100644
--- a/drivers/power/pm8921-charger.c
+++ b/drivers/power/pm8921-charger.c
@@ -78,6 +78,7 @@
#define CHG_TTRIM 0x35C
#define CHG_COMP_OVR 0x20A
#define IUSB_FINE_RES 0x2B6
+#define OVP_USB_UVD 0x2B7
/* check EOC every 10 seconds */
#define EOC_CHECK_PERIOD_MS 10000
@@ -202,6 +203,7 @@
* @update_time: how frequently the userland needs to be updated
* @max_voltage_mv: the max volts the batt should be charged up to
* @min_voltage_mv: the min battery voltage before turning the FETon
+ * @uvd_voltage_mv: (PM8917 only) the falling UVD threshold voltage
* @cool_temp_dc: the cool temp threshold in deciCelcius
* @warm_temp_dc: the warm temp threshold in deciCelcius
* @resume_voltage_delta: the voltage delta from vdd max at which the
@@ -221,6 +223,7 @@
unsigned int update_time;
unsigned int max_voltage_mv;
unsigned int min_voltage_mv;
+ unsigned int uvd_voltage_mv;
int cool_temp_dc;
int warm_temp_dc;
unsigned int temp_check_period;
@@ -587,6 +590,24 @@
return voltage_mv;
}
+#define PM8917_USB_UVD_MIN_MV 3850
+#define PM8917_USB_UVD_MAX_MV 4350
+#define PM8917_USB_UVD_STEP_MV 100
+#define PM8917_USB_UVD_MASK 0x7
+static int pm_chg_uvd_threshold_set(struct pm8921_chg_chip *chip, int thresh_mv)
+{
+ u8 temp;
+
+ if (thresh_mv < PM8917_USB_UVD_MIN_MV
+ || thresh_mv > PM8917_USB_UVD_MAX_MV) {
+ pr_err("bad mV=%d asked to set\n", thresh_mv);
+ return -EINVAL;
+ }
+ temp = (thresh_mv - PM8917_USB_UVD_MIN_MV) / PM8917_USB_UVD_STEP_MV;
+ return pm_chg_masked_write(chip, OVP_USB_UVD,
+ PM8917_USB_UVD_MASK, temp);
+}
+
#define PM8921_CHG_IBATMAX_MIN 325
#define PM8921_CHG_IBATMAX_MAX 2000
#define PM8921_CHG_I_MIN_MA 225
@@ -1740,6 +1761,16 @@
}
EXPORT_SYMBOL(pm8921_disable_input_current_limit);
+int pm8917_set_under_voltage_detection_threshold(int mv)
+{
+ if (!the_chip) {
+ pr_err("called before init\n");
+ return -EINVAL;
+ }
+ return pm_chg_uvd_threshold_set(the_chip, mv);
+}
+EXPORT_SYMBOL(pm8917_set_under_voltage_detection_threshold);
+
int pm8921_set_max_battery_charge_current(int ma)
{
if (!the_chip) {
@@ -3589,8 +3620,17 @@
pm8xxx_writeb(chip->dev->parent, CHG_BUCK_CTRL_TEST3, 0xAC);
/* Enable isub_fine resolution AICL for PM8917 */
- if (pm8xxx_get_version(chip->dev->parent) == PM8XXX_VERSION_8917)
+ if (pm8xxx_get_version(chip->dev->parent) == PM8XXX_VERSION_8917) {
chip->iusb_fine_res = true;
+ if (chip->uvd_voltage_mv)
+ rc = pm_chg_uvd_threshold_set(chip,
+ chip->uvd_voltage_mv);
+ if (rc) {
+ pr_err("Failed to set UVD threshold %drc=%d\n",
+ chip->uvd_voltage_mv, rc);
+ return rc;
+ }
+ }
pm8xxx_writeb(chip->dev->parent, CHG_BUCK_CTRL_TEST3, 0xD9);
@@ -3876,6 +3916,7 @@
chip->update_time = pdata->update_time;
chip->max_voltage_mv = pdata->max_voltage;
chip->min_voltage_mv = pdata->min_voltage;
+ chip->uvd_voltage_mv = pdata->uvd_thresh_voltage;
chip->resume_voltage_delta = pdata->resume_voltage_delta;
chip->term_current = pdata->term_current;
chip->vbat_channel = pdata->charger_cdata.vbat_channel;
diff --git a/include/linux/mfd/pm8xxx/pm8921-charger.h b/include/linux/mfd/pm8xxx/pm8921-charger.h
index 2186903..fca8700 100644
--- a/include/linux/mfd/pm8xxx/pm8921-charger.h
+++ b/include/linux/mfd/pm8xxx/pm8921-charger.h
@@ -67,6 +67,7 @@
* @min_voltage: the voltage (mV) where charging method switches from
* trickle to fast. This is also the minimum voltage the
* system operates at
+ * @uvd_thresh_voltage: the USB falling UVD threshold (mV) (PM8917 only)
* @resume_voltage_delta: the (mV) drop to wait for before resume charging
* after the battery has been fully charged
* @term_current: the charger current (mA) at which EOC happens
@@ -121,6 +122,7 @@
unsigned int update_time;
unsigned int max_voltage;
unsigned int min_voltage;
+ unsigned int uvd_thresh_voltage;
unsigned int resume_voltage_delta;
unsigned int term_current;
int cool_temp;
@@ -301,6 +303,10 @@
{
return -ENXIO;
}
+static inline int pm8917_set_under_voltage_detection_threshold(int mv)
+{
+ return -ENXIO;
+}
static inline int pm8921_disable_input_current_limit(bool disable)
{
return -ENXIO;