From 825154a75730a9505750384cda1dc47c6edb3a1d Mon Sep 17 00:00:00 2001 From: mokopatches Date: Fri, 4 Apr 2008 11:36:10 +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 --- 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 + + /* 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 + + /* 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.5