From 57351c5a1f03e9ae884b094ddbde27b1ad6ed8e0 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Mon, 26 May 2008 12:39:29 +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 6d07aa5..2878baa 100644 --- a/drivers/i2c/chips/pcf50633.c +++ b/drivers/i2c/chips/pcf50633.c @@ -1945,23 +1945,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) { @@ -2020,11 +2004,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 be3957f..837037e 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; @@ -95,6 +149,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.5