From 84a38fd3678b3473c890f7e1b1d7b697afb142a7 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Fri, 25 Jul 2008 23:06:10 +0100 Subject: [PATCH] fix-reduce-wake-reasons-in-pcf50633.patch Currently we are willing to wake from sleep from pcf50633 interrupts we don't actually do anything about even when we wake (somewhat puzzled). Let's disable some of these wake sources. Signed-off-by: Andy Green --- arch/arm/mach-s3c2440/mach-gta02.c | 20 +++++++++++++ drivers/i2c/chips/pcf50633.c | 28 ++++-------------- drivers/i2c/chips/pcf50633.h | 53 ---------------------------------- include/linux/pcf50633.h | 56 ++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 75 deletions(-) diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c index 90b62c1..601f7bc 100644 --- a/arch/arm/mach-s3c2440/mach-gta02.c +++ b/arch/arm/mach-s3c2440/mach-gta02.c @@ -462,6 +462,26 @@ static struct pcf50633_platform_data gta02_pcf_pdata = { .r_fix_batt = 10000, .r_fix_batt_par = 10000, .r_sense_milli = 220, + .resumers = { + [0] = /* PCF50633_INT1_ADPINS | */ + /* PCF50633_INT1_ADPREM | */ + PCF50633_INT1_USBINS | + PCF50633_INT1_USBREM | + PCF50633_INT1_ALARM, + [1] = PCF50633_INT2_ONKEYF, + [2] = /* PCF50633_INT3_BATFULL | */ + /* PCF50633_INT3_CHGHALT | */ + /* PCF50633_INT3_THLIMON | */ + /* PCF50633_INT3_THLIMOFF | */ + /* PCF50633_INT3_USBLIMON | */ + /* PCF50633_INT3_USBLIMOFF | */ + PCF50633_INT3_ONKEY1S , + [3] = 0 /* | + PCF50633_INT4_LOWSYS | */ + /* PCF50633_INT4_LOWBAT | */ + /* PCF50633_INT4_HIGHTMP */, + [4] = 0 + }, .rails = { [PCF50633_REGULATOR_AUTO] = { .name = "io_3v3", diff --git a/drivers/i2c/chips/pcf50633.c b/drivers/i2c/chips/pcf50633.c index d2ff2c1..8ba81d2 100644 --- a/drivers/i2c/chips/pcf50633.c +++ b/drivers/i2c/chips/pcf50633.c @@ -1935,23 +1935,7 @@ int pcf50633_report_resumers(struct pcf50633_data *pcf, char *buf) #ifdef CONFIG_PM -#define INT1M_RESUMERS (PCF50633_INT1_ADPINS | \ - PCF50633_INT1_ADPREM | \ - PCF50633_INT1_USBINS | \ - PCF50633_INT1_USBREM | \ - PCF50633_INT1_ALARM) -#define INT2M_RESUMERS (PCF50633_INT2_ONKEYF) -#define INT3M_RESUMERS (PCF50633_INT3_BATFULL | \ - PCF50633_INT3_CHGHALT | \ - PCF50633_INT3_THLIMON | \ - PCF50633_INT3_THLIMOFF | \ - PCF50633_INT3_USBLIMON | \ - PCF50633_INT3_USBLIMOFF | \ - PCF50633_INT3_ONKEY1S) -#define INT4M_RESUMERS (PCF50633_INT4_LOWSYS | \ - PCF50633_INT4_LOWBAT | \ - PCF50633_INT4_HIGHTMP) -#define INT5M_RESUMERS (0) + static int pcf50633_suspend(struct device *dev, pm_message_t state) { @@ -2010,11 +1994,11 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state) pcf->standby_regs.int3m = __reg_read(pcf, PCF50633_REG_INT3M); pcf->standby_regs.int4m = __reg_read(pcf, PCF50633_REG_INT4M); pcf->standby_regs.int5m = __reg_read(pcf, PCF50633_REG_INT5M); - __reg_write(pcf, PCF50633_REG_INT1M, ~INT1M_RESUMERS & 0xff); - __reg_write(pcf, PCF50633_REG_INT2M, ~INT2M_RESUMERS & 0xff); - __reg_write(pcf, PCF50633_REG_INT3M, ~INT3M_RESUMERS & 0xff); - __reg_write(pcf, PCF50633_REG_INT4M, ~INT4M_RESUMERS & 0xff); - __reg_write(pcf, PCF50633_REG_INT5M, ~INT5M_RESUMERS & 0xff); + __reg_write(pcf, PCF50633_REG_INT1M, ~pcf->pdata->resumers[0]); + __reg_write(pcf, PCF50633_REG_INT2M, ~pcf->pdata->resumers[1]); + __reg_write(pcf, PCF50633_REG_INT3M, ~pcf->pdata->resumers[2]); + __reg_write(pcf, PCF50633_REG_INT4M, ~pcf->pdata->resumers[3]); + __reg_write(pcf, PCF50633_REG_INT5M, ~pcf->pdata->resumers[4]); pcf->have_been_suspended = 1; diff --git a/drivers/i2c/chips/pcf50633.h b/drivers/i2c/chips/pcf50633.h index 93dfd99..5d54131 100644 --- a/drivers/i2c/chips/pcf50633.h +++ b/drivers/i2c/chips/pcf50633.h @@ -125,59 +125,6 @@ enum pfc50633_regs { __NUM_PCF50633_REGS }; -enum pcf50633_reg_int1 { - PCF50633_INT1_ADPINS = 0x01, /* Adapter inserted */ - PCF50633_INT1_ADPREM = 0x02, /* Adapter removed */ - PCF50633_INT1_USBINS = 0x04, /* USB inserted */ - PCF50633_INT1_USBREM = 0x08, /* USB removed */ - /* reserved */ - PCF50633_INT1_ALARM = 0x40, /* RTC alarm time is reached */ - PCF50633_INT1_SECOND = 0x80, /* RTC periodic second interrupt */ -}; - -enum pcf50633_reg_int2 { - PCF50633_INT2_ONKEYR = 0x01, /* ONKEY rising edge */ - PCF50633_INT2_ONKEYF = 0x02, /* ONKEY falling edge */ - PCF50633_INT2_EXTON1R = 0x04, /* EXTON1 rising edge */ - PCF50633_INT2_EXTON1F = 0x08, /* EXTON1 falling edge */ - PCF50633_INT2_EXTON2R = 0x10, /* EXTON2 rising edge */ - PCF50633_INT2_EXTON2F = 0x20, /* EXTON2 falling edge */ - PCF50633_INT2_EXTON3R = 0x40, /* EXTON3 rising edge */ - PCF50633_INT2_EXTON3F = 0x80, /* EXTON3 falling edge */ -}; - -enum pcf50633_reg_int3 { - PCF50633_INT3_BATFULL = 0x01, /* Battery full */ - PCF50633_INT3_CHGHALT = 0x02, /* Charger halt */ - PCF50633_INT3_THLIMON = 0x04, - PCF50633_INT3_THLIMOFF = 0x08, - PCF50633_INT3_USBLIMON = 0x10, - PCF50633_INT3_USBLIMOFF = 0x20, - PCF50633_INT3_ADCRDY = 0x40, /* ADC conversion finished */ - PCF50633_INT3_ONKEY1S = 0x80, /* ONKEY pressed 1 second */ -}; - -enum pcf50633_reg_int4 { - PCF50633_INT4_LOWSYS = 0x01, - PCF50633_INT4_LOWBAT = 0x02, - PCF50633_INT4_HIGHTMP = 0x04, - PCF50633_INT4_AUTOPWRFAIL = 0x08, - PCF50633_INT4_DWN1PWRFAIL = 0x10, - PCF50633_INT4_DWN2PWRFAIL = 0x20, - PCF50633_INT4_LEDPWRFAIL = 0x40, - PCF50633_INT4_LEDOVP = 0x80, -}; - -enum pcf50633_reg_int5 { - PCF50633_INT5_LDO1PWRFAIL = 0x01, - PCF50633_INT5_LDO2PWRFAIL = 0x02, - PCF50633_INT5_LDO3PWRFAIL = 0x04, - PCF50633_INT5_LDO4PWRFAIL = 0x08, - PCF50633_INT5_LDO5PWRFAIL = 0x10, - PCF50633_INT5_LDO6PWRFAIL = 0x20, - PCF50633_INT5_HCLDOPWRFAIL = 0x40, - PCF50633_INT5_HCLDOOVL = 0x80, -}; enum pcf50633_reg_oocshdwn { PCF50633_OOCSHDWN_GOSTDBY = 0x01, diff --git a/include/linux/pcf50633.h b/include/linux/pcf50633.h index 39d919d..c0fdbe8 100644 --- a/include/linux/pcf50633.h +++ b/include/linux/pcf50633.h @@ -20,6 +20,60 @@ enum pcf50633_regulator_id { __NUM_PCF50633_REGULATORS }; +enum pcf50633_reg_int1 { + PCF50633_INT1_ADPINS = 0x01, /* Adapter inserted */ + PCF50633_INT1_ADPREM = 0x02, /* Adapter removed */ + PCF50633_INT1_USBINS = 0x04, /* USB inserted */ + PCF50633_INT1_USBREM = 0x08, /* USB removed */ + /* reserved */ + PCF50633_INT1_ALARM = 0x40, /* RTC alarm time is reached */ + PCF50633_INT1_SECOND = 0x80, /* RTC periodic second interrupt */ +}; + +enum pcf50633_reg_int2 { + PCF50633_INT2_ONKEYR = 0x01, /* ONKEY rising edge */ + PCF50633_INT2_ONKEYF = 0x02, /* ONKEY falling edge */ + PCF50633_INT2_EXTON1R = 0x04, /* EXTON1 rising edge */ + PCF50633_INT2_EXTON1F = 0x08, /* EXTON1 falling edge */ + PCF50633_INT2_EXTON2R = 0x10, /* EXTON2 rising edge */ + PCF50633_INT2_EXTON2F = 0x20, /* EXTON2 falling edge */ + PCF50633_INT2_EXTON3R = 0x40, /* EXTON3 rising edge */ + PCF50633_INT2_EXTON3F = 0x80, /* EXTON3 falling edge */ +}; + +enum pcf50633_reg_int3 { + PCF50633_INT3_BATFULL = 0x01, /* Battery full */ + PCF50633_INT3_CHGHALT = 0x02, /* Charger halt */ + PCF50633_INT3_THLIMON = 0x04, + PCF50633_INT3_THLIMOFF = 0x08, + PCF50633_INT3_USBLIMON = 0x10, + PCF50633_INT3_USBLIMOFF = 0x20, + PCF50633_INT3_ADCRDY = 0x40, /* ADC conversion finished */ + PCF50633_INT3_ONKEY1S = 0x80, /* ONKEY pressed 1 second */ +}; + +enum pcf50633_reg_int4 { + PCF50633_INT4_LOWSYS = 0x01, + PCF50633_INT4_LOWBAT = 0x02, + PCF50633_INT4_HIGHTMP = 0x04, + PCF50633_INT4_AUTOPWRFAIL = 0x08, + PCF50633_INT4_DWN1PWRFAIL = 0x10, + PCF50633_INT4_DWN2PWRFAIL = 0x20, + PCF50633_INT4_LEDPWRFAIL = 0x40, + PCF50633_INT4_LEDOVP = 0x80, +}; + +enum pcf50633_reg_int5 { + PCF50633_INT5_LDO1PWRFAIL = 0x01, + PCF50633_INT5_LDO2PWRFAIL = 0x02, + PCF50633_INT5_LDO3PWRFAIL = 0x04, + PCF50633_INT5_LDO4PWRFAIL = 0x08, + PCF50633_INT5_LDO5PWRFAIL = 0x10, + PCF50633_INT5_LDO6PWRFAIL = 0x20, + PCF50633_INT5_HCLDOPWRFAIL = 0x40, + PCF50633_INT5_HCLDOOVL = 0x80, +}; + struct pcf50633_data; extern struct pcf50633_data *pcf50633_global; @@ -94,6 +148,8 @@ struct pcf50633_platform_data { unsigned int r_fix_batt_par; unsigned int r_sense_milli; + unsigned char resumers[5]; + struct { u_int8_t mbcc3; /* charger voltage / current */ } charger; -- 1.5.6.3