add support for target 3c24xx (more known as Openmoko GTA02 "Freerunner") and merge...
[openwrt.git] / target / linux / s3c24xx / patches / 0034-pcf506xx.patch.patch
diff --git a/target/linux/s3c24xx/patches/0034-pcf506xx.patch.patch b/target/linux/s3c24xx/patches/0034-pcf506xx.patch.patch
new file mode 100755 (executable)
index 0000000..0eeaf2f
--- /dev/null
@@ -0,0 +1,200 @@
+From 4ced79a6699eb5828c71b5438826fb44e3b41997 Mon Sep 17 00:00:00 2001
+From: mokopatches <mokopatches@openmoko.org>
+Date: Wed, 16 Jul 2008 14:46:56 +0100
+Subject: [PATCH] pcf506xx.patch
+ 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>
+---
+ drivers/i2c/chips/pcf50606.c |   28 +++++++++++++++++++++++++++-
+ include/linux/pcf50606.h     |   23 +++--------------------
+ include/linux/pcf50633.h     |   27 +++------------------------
+ include/linux/pcf506xx.h     |   31 +++++++++++++++++++++++++++++++
+ 4 files changed, 64 insertions(+), 45 deletions(-)
+ create mode 100644 include/linux/pcf506xx.h
+
+diff --git a/drivers/i2c/chips/pcf50606.c b/drivers/i2c/chips/pcf50606.c
+index 6626c68..b530583 100644
+--- a/drivers/i2c/chips/pcf50606.c
++++ b/drivers/i2c/chips/pcf50606.c
+@@ -102,6 +102,7 @@ struct pcf50606_data {
+       int allow_close;
+       int onkey_seconds;
+       int irq;
++      int coldplug_done;
+ #ifdef CONFIG_PM
+       struct {
+               u_int8_t dcdc1, dcdc2;
+@@ -573,6 +574,30 @@ static void pcf50606_work(struct work_struct *work)
+       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]);
+@@ -1642,7 +1667,8 @@ static int pcf50606_detect(struct i2c_adapter *adapter, int address, int kind)
+       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);
+diff --git a/include/linux/pcf50606.h b/include/linux/pcf50606.h
+index bc98e47..167328f 100644
+--- a/include/linux/pcf50606.h
++++ b/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 @@ pcf50606_onoff_set(struct pcf50606_data *pcf,
+ 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
+diff --git a/include/linux/pcf50633.h b/include/linux/pcf50633.h
+index 5f32004..bf50fe4 100644
+--- a/include/linux/pcf50633.h
++++ b/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 @@ pcf50633_usb_curlim_set(struct pcf50633_data *pcf, int ma);
+ 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 */
+diff --git a/include/linux/pcf506xx.h b/include/linux/pcf506xx.h
+new file mode 100644
+index 0000000..33be73e
+--- /dev/null
++++ b/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 */
+-- 
+1.5.6.3
+