openwrt/target/linux/s3c24xx/patches/0034-pcf506xx.patch.patch

201 lines
5.7 KiB
Diff
Executable File

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