|
@@ -177,6 +177,40 @@ static int twl4030_is_battery_present(struct twl4030_bci *bci)
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * TI provided formulas:
|
|
|
+ * CGAIN == 0: ICHG = (BCIICHG * 1.7) / (2^10 - 1) - 0.85
|
|
|
+ * CGAIN == 1: ICHG = (BCIICHG * 3.4) / (2^10 - 1) - 1.7
|
|
|
+ * Here we use integer approximation of:
|
|
|
+ * CGAIN == 0: val * 1.6618 - 0.85 * 1000
|
|
|
+ * CGAIN == 1: (val * 1.6618 - 0.85 * 1000) * 2
|
|
|
+ */
|
|
|
+/*
|
|
|
+ * convert twl register value for currents into uA
|
|
|
+ */
|
|
|
+static int regval2ua(int regval, bool cgain)
|
|
|
+{
|
|
|
+ if (cgain)
|
|
|
+ return (regval * 16618 - 8500 * 1000) / 5;
|
|
|
+ else
|
|
|
+ return (regval * 16618 - 8500 * 1000) / 10;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * convert uA currents into twl register value
|
|
|
+ */
|
|
|
+static int ua2regval(int ua, bool cgain)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ if (cgain)
|
|
|
+ ua /= 2;
|
|
|
+ ret = (ua * 10 + 8500 * 1000) / 16618;
|
|
|
+ /* rounding problems */
|
|
|
+ if (ret < 512)
|
|
|
+ ret = 512;
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Enable/Disable USB Charge functionality.
|
|
|
*/
|
|
@@ -366,14 +400,6 @@ static int twl4030_bci_usb_ncb(struct notifier_block *nb, unsigned long val,
|
|
|
return NOTIFY_OK;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * TI provided formulas:
|
|
|
- * CGAIN == 0: ICHG = (BCIICHG * 1.7) / (2^10 - 1) - 0.85
|
|
|
- * CGAIN == 1: ICHG = (BCIICHG * 3.4) / (2^10 - 1) - 1.7
|
|
|
- * Here we use integer approximation of:
|
|
|
- * CGAIN == 0: val * 1.6618 - 0.85
|
|
|
- * CGAIN == 1: (val * 1.6618 - 0.85) * 2
|
|
|
- */
|
|
|
static int twl4030_charger_get_current(void)
|
|
|
{
|
|
|
int curr;
|
|
@@ -388,11 +414,7 @@ static int twl4030_charger_get_current(void)
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- ret = (curr * 16618 - 850 * 10000) / 10;
|
|
|
- if (bcictl1 & TWL4030_CGAIN)
|
|
|
- ret *= 2;
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return regval2ua(curr, bcictl1 & TWL4030_CGAIN);
|
|
|
}
|
|
|
|
|
|
/*
|