201 lines
5.7 KiB
Diff
201 lines
5.7 KiB
Diff
|
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
|
||
|
|