Moved shared PMU code from pcf50606.h and pcf50633.h (which prevented inclusion
of both at the same time) to pcf506xx.h

- include/linux/pcf50606.h (struct pmu_voltage_rail, enum pmu_event, pmu_cb):
  moved to pcf506xx.h
- include/linux/pcf50633.h (struct pmu_voltage_rail, enum pmu_event, pmu_cb):
  moved to pcf506xx.h

Signed off-by: Werner Almesberger <werner@openmoko.org>

Index: linux-2.6.24/include/linux/pcf50606.h
===================================================================
--- linux-2.6.24.orig/include/linux/pcf50606.h
+++ linux-2.6.24/include/linux/pcf50606.h
@@ -1,6 +1,9 @@
 #ifndef _LINUX_PCF50606_H
 #define _LINUX_PCF50606_H
 
+#include <linux/pcf506xx.h>
+
+
 /* public in-kernel pcf50606 api */
 enum pcf50606_regulator_id {
 	PCF50606_REGULATOR_DCD,
@@ -48,26 +51,6 @@
 extern void
 pcf50606_charge_fast(struct pcf50606_data *pcf, int on);
 
-#define PMU_VRAIL_F_SUSPEND_ON	0x00000001	/* Remains on during suspend */
-#define PMU_VRAIL_F_UNUSED	0x00000002	/* This rail is not used */
-struct pmu_voltage_rail {
-	char *name;
-	unsigned int flags;
-	struct {
-		unsigned int init;
-		unsigned int max;
-	} voltage;
-};
-
-enum pmu_event {
-	PMU_EVT_NONE,
-	PMU_EVT_INSERT,
-	PMU_EVT_REMOVE,
-	__NUM_PMU_EVTS
-};
-
-typedef int pmu_cb(struct device *dev, unsigned int feature,
-		   enum pmu_event event);
 
 #define PCF50606_FEAT_EXTON	0x00000001	/* not yet supported */
 #define PCF50606_FEAT_MBC	0x00000002
Index: linux-2.6.24/include/linux/pcf50633.h
===================================================================
--- linux-2.6.24.orig/include/linux/pcf50633.h
+++ linux-2.6.24/include/linux/pcf50633.h
@@ -1,6 +1,9 @@
 #ifndef _LINUX_PCF50633_H
 #define _LINUX_PCF50633_H
 
+#include <linux/pcf506xx.h>
+
+
 /* public in-kernel pcf50633 api */
 enum pcf50633_regulator_id {
 	PCF50633_REGULATOR_AUTO,
@@ -57,30 +60,6 @@
 extern void
 pcf50633_charge_enable(struct pcf50633_data *pcf, int on);
 
-/* FIXME: sharded with pcf50606 */
-#define PMU_VRAIL_F_SUSPEND_ON	0x00000001	/* Remains on during suspend */
-#define PMU_VRAIL_F_UNUSED	0x00000002	/* This rail is not used */
-struct pmu_voltage_rail {
-	char *name;
-	unsigned int flags;
-	struct {
-		unsigned int init;
-		unsigned int max;
-	} voltage;
-};
-
-enum pmu_event {
-	PMU_EVT_NONE,
-	PMU_EVT_INSERT,
-	PMU_EVT_REMOVE,
-	PMU_EVT_USB_INSERT,
-	PMU_EVT_USB_REMOVE,
-	__NUM_PMU_EVTS
-};
-
-typedef int pmu_cb(struct device *dev, unsigned int feature,
-		   enum pmu_event event);
-
 #define PCF50633_FEAT_EXTON	0x00000001	/* not yet supported */
 #define PCF50633_FEAT_MBC	0x00000002
 #define PCF50633_FEAT_BBC	0x00000004	/* not yet supported */
Index: linux-2.6.24/include/linux/pcf506xx.h
===================================================================
--- /dev/null
+++ linux-2.6.24/include/linux/pcf506xx.h
@@ -0,0 +1,31 @@
+#ifndef _LINUX_PCF506XX_H
+#define _LINUX_PCF506XX_H
+
+
+#define PMU_VRAIL_F_SUSPEND_ON	0x00000001	/* Remains on during suspend */
+#define PMU_VRAIL_F_UNUSED	0x00000002	/* This rail is not used */
+struct pmu_voltage_rail {
+	char *name;
+	unsigned int flags;
+	struct {
+		unsigned int init;
+		unsigned int max;
+	} voltage;
+};
+
+enum pmu_event {
+	PMU_EVT_NONE,
+	PMU_EVT_INSERT,
+	PMU_EVT_REMOVE,
+#ifdef CONFIG_SENSORS_PCF50633
+	PMU_EVT_USB_INSERT,
+	PMU_EVT_USB_REMOVE,
+#endif
+	__NUM_PMU_EVTS
+};
+
+typedef int pmu_cb(struct device *dev, unsigned int feature,
+		   enum pmu_event event);
+
+
+#endif /* !_LINUX_PCF506XX_H */
Index: linux-2.6.24/drivers/i2c/chips/pcf50606.c
===================================================================
--- linux-2.6.24.orig/drivers/i2c/chips/pcf50606.c
+++ linux-2.6.24/drivers/i2c/chips/pcf50606.c
@@ -102,6 +102,7 @@
 	int allow_close;
 	int onkey_seconds;
 	int irq;
+	int coldplug_done;
 #ifdef CONFIG_PM
 	struct {
 		u_int8_t dcdc1, dcdc2;
@@ -572,6 +573,30 @@
 	if (ret != 3)
 		DEBUGPC("Oh crap PMU IRQ register read failed %d\n", ret);
 
+	if (!pcf->coldplug_done) {
+		DEBUGPC("PMU Coldplug init\n");
+
+		/* we used SECOND to kick ourselves started -- turn it off */
+		pcfirq[0] &= ~PCF50606_INT1_SECOND;
+		reg_set_bit_mask(pcf, PCF50606_REG_INT1M, PCF50606_INT1_SECOND,
+				 PCF50606_INT1_SECOND);
+
+		/* coldplug the USB if present */
+		if (__reg_read(pcf, PCF50606_REG_OOCS) & PCF50606_OOCS_EXTON) {
+			/* Charger inserted */
+			DEBUGPC("COLD CHGINS ");
+			input_report_key(pcf->input_dev, KEY_BATTERY, 1);
+			apm_queue_event(APM_POWER_STATUS_CHANGE);
+			pcf->flags |= PCF50606_F_CHG_PRESENT;
+			if (pcf->pdata->cb)
+				pcf->pdata->cb(&pcf->client.dev,
+					PCF50606_FEAT_MBC, PMU_EVT_INSERT);
+		}
+
+		pcf->coldplug_done = 1;
+	}
+
+
 	dev_dbg(&pcf->client.dev, "INT1=0x%02x INT2=0x%02x INT3=0x%02x:",
 		pcfirq[0], pcfirq[1], pcfirq[2]);
 
@@ -1644,7 +1669,8 @@
 	pm_power_off = &pcf50606_go_standby;
 
 	/* configure interrupt mask */
-	reg_write(data, PCF50606_REG_INT1M, PCF50606_INT1_SECOND);
+	/* we don't mask SECOND here, because we want one to do coldplug with */
+	reg_write(data, PCF50606_REG_INT1M, 0x00);
 	reg_write(data, PCF50606_REG_INT2M, 0x00);
 	reg_write(data, PCF50606_REG_INT3M, PCF50606_INT3_TSCPRES);
 
