summaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/patches-2.6.26/1222-fix-pcf50633-only-do-platform-callback-once-per-even.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/s3c24xx/patches-2.6.26/1222-fix-pcf50633-only-do-platform-callback-once-per-even.patch')
-rwxr-xr-xtarget/linux/s3c24xx/patches-2.6.26/1222-fix-pcf50633-only-do-platform-callback-once-per-even.patch74
1 files changed, 74 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/patches-2.6.26/1222-fix-pcf50633-only-do-platform-callback-once-per-even.patch b/target/linux/s3c24xx/patches-2.6.26/1222-fix-pcf50633-only-do-platform-callback-once-per-even.patch
new file mode 100755
index 000000000..c2b249bd8
--- /dev/null
+++ b/target/linux/s3c24xx/patches-2.6.26/1222-fix-pcf50633-only-do-platform-callback-once-per-even.patch
@@ -0,0 +1,74 @@
+From 91536c74c12a312e9d2e045daf4f7345ba6f2362 Mon Sep 17 00:00:00 2001
+From: Andy Green <andy@openmoko.com>
+Date: Fri, 25 Jul 2008 23:06:21 +0100
+Subject: [PATCH] fix-pcf50633-only-do-platform-callback-once-per-event.patch
+ Reported-by: Holger Freyther <zecke@openmoko.org>
+
+We harmlessly repeated PMU platform callbacks about charging state twice.
+Clean it up and leave it to pcf50633_charge_enable() to report once.
+
+Also tidies the sequencing so we set current limit before we enable
+charger now.
+
+Signed-off-by: Andy Green <andy@openmoko.com>
+---
+ drivers/i2c/chips/pcf50633.c | 27 ++++++++++++++-------------
+ 1 files changed, 14 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/i2c/chips/pcf50633.c b/drivers/i2c/chips/pcf50633.c
+index a5efb4e..01ffa1d 100644
+--- a/drivers/i2c/chips/pcf50633.c
++++ b/drivers/i2c/chips/pcf50633.c
+@@ -1391,6 +1391,7 @@ static DEVICE_ATTR(voltage_hcldo, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
+ static void pcf50633_usb_curlim_set(struct pcf50633_data *pcf, int ma)
+ {
+ u_int8_t bits;
++ int active = 0;
+
+ pcf->last_curlim_set = ma;
+
+@@ -1406,17 +1407,16 @@ static void pcf50633_usb_curlim_set(struct pcf50633_data *pcf, int ma)
+ else
+ bits = PCF50633_MBCC7_USB_SUSPEND;
+
+- DEBUGPC("pcf50633_usb_curlim_set -> %dmA\n", ma);
+-
+- if (!pcf->pdata->cb)
+- goto set_it;
++ /* set the nearest charging limit */
++ reg_set_bit_mask(pcf, PCF50633_REG_MBCC7, PCF56033_MBCC7_USB_MASK,
++ bits);
+
++ /* with this charging limit, is charging actually meaningful? */
+ switch (bits) {
+- case PCF50633_MBCC7_USB_100mA:
+- case PCF50633_MBCC7_USB_SUSPEND:
+- /* no charging is gonna be happening */
+- pcf->pdata->cb(&pcf->client.dev,
+- PCF50633_FEAT_MBC, PMU_EVT_CHARGER_IDLE);
++ case PCF50633_MBCC7_USB_500mA:
++ case PCF50633_MBCC7_USB_1000mA:
++ /* yes with this charging limit, we can do real charging */
++ active = 1;
+ break;
+ default: /* right charging context that if there is power, we charge */
+ if (pcf->flags & PCF50633_F_USB_PRESENT)
+@@ -1424,10 +1424,11 @@ static void pcf50633_usb_curlim_set(struct pcf50633_data *pcf, int ma)
+ PCF50633_FEAT_MBC, PMU_EVT_CHARGER_ACTIVE);
+ break;
+ }
+-
+-set_it:
+- reg_set_bit_mask(pcf, PCF50633_REG_MBCC7, PCF56033_MBCC7_USB_MASK,
+- bits);
++ /*
++ * enable or disable charging according to current limit -- this will
++ * also throw a platform notification callback about it
++ */
++ pcf50633_charge_enable(pcf50633_global, active);
+
+ /* clear batfull */
+ reg_set_bit_mask(pcf, PCF50633_REG_MBCC1,
+--
+1.5.6.3
+