summaryrefslogtreecommitdiff
path: root/target/linux/s3c24xx/patches-2.6.24/1187-fix-pcf50633-use-i2c-bulk-autoincrement.patch.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/s3c24xx/patches-2.6.24/1187-fix-pcf50633-use-i2c-bulk-autoincrement.patch.patch')
-rw-r--r--target/linux/s3c24xx/patches-2.6.24/1187-fix-pcf50633-use-i2c-bulk-autoincrement.patch.patch222
1 files changed, 0 insertions, 222 deletions
diff --git a/target/linux/s3c24xx/patches-2.6.24/1187-fix-pcf50633-use-i2c-bulk-autoincrement.patch.patch b/target/linux/s3c24xx/patches-2.6.24/1187-fix-pcf50633-use-i2c-bulk-autoincrement.patch.patch
deleted file mode 100644
index b04e60d..0000000
--- a/target/linux/s3c24xx/patches-2.6.24/1187-fix-pcf50633-use-i2c-bulk-autoincrement.patch.patch
+++ /dev/null
@@ -1,222 +0,0 @@
-From 8a2d04c222684e3278dd28d11f57a05fe0865183 Mon Sep 17 00:00:00 2001
-From: Andy Green <andy@openmoko.com>
-Date: Wed, 2 Jul 2008 22:40:12 +0100
-Subject: [PATCH] fix-pcf50633-use-i2c-bulk-autoincrement.patch
-
-Simplify and speed up bulk sequential I2C actions in pcf50633
-the time savings are pretty considerable and so is the simplification
-
-Signed-off-by: Andy Green <andy@openmoko.com>
----
- drivers/i2c/chips/pcf50633.c | 117 +++++++++++++++++++++++++-----------------
- 1 files changed, 70 insertions(+), 47 deletions(-)
-
-diff --git a/drivers/i2c/chips/pcf50633.c b/drivers/i2c/chips/pcf50633.c
-index 1f88c32..96857a3 100644
---- a/drivers/i2c/chips/pcf50633.c
-+++ b/drivers/i2c/chips/pcf50633.c
-@@ -156,14 +156,14 @@ struct pcf50633_data {
-
- #ifdef CONFIG_PM
- struct {
-- u_int8_t int1m, int2m, int3m, int4m, int5m;
- u_int8_t ooctim2;
-- u_int8_t autoout, autoena, automxc;
-- u_int8_t down1out, down1mxc;
-- u_int8_t down2out, down2ena;
-- u_int8_t memldoout, memldoena;
-- u_int8_t ledout, ledena, leddim;
-- u_int8_t ldo[__NUM_PCF50633_REGS][2];
-+ /* enables are always [1] below
-+ * I2C has limit of 32 sequential regs, so done in two lumps
-+ * because it covers 33 register extent otherwise
-+ */
-+ u_int8_t misc[PCF50633_REG_LEDDIM - PCF50633_REG_AUTOOUT + 1];
-+ /* skip 1 reserved reg here */
-+ u_int8_t ldo[PCF50633_REG_HCLDOENA - PCF50633_REG_LDO1OUT + 1];
- } standby_regs;
-
- struct resume_dependency resume_dependency;
-@@ -1737,6 +1737,8 @@ static int pcf50633bl_set_intensity(struct backlight_device *bd)
- int old_intensity = reg_read(pcf, PCF50633_REG_LEDOUT);
- int ret;
-
-+ dev_info(&pcf->client.dev, "pcf50633bl_set_intensity\n");
-+
- if (!(reg_read(pcf, PCF50633_REG_LEDENA) & 1))
- old_intensity = 0;
-
-@@ -2221,6 +2223,9 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state)
- int i;
- int ret;
- u_int8_t tmp;
-+ u_int8_t res[5];
-+
-+ dev_err(dev, "pcf50633_suspend\n");
-
- /* we suspend once (!) as late as possible in the suspend sequencing */
-
-@@ -2228,30 +2233,26 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state)
- return 0;
-
- /* The general idea is to power down all unused power supplies,
-- * and then mask all PCF50606 interrup sources but EXTONR, ONKEYF
-+ * and then mask all PCF50633 interrupt sources but EXTONR, ONKEYF
- * and ALARM */
-
- mutex_lock(&pcf->lock);
-
- /* Save all registers that don't "survive" standby state */
- pcf->standby_regs.ooctim2 = __reg_read(pcf, PCF50633_REG_OOCTIM2);
-- pcf->standby_regs.autoout = __reg_read(pcf, PCF50633_REG_AUTOOUT);
-- pcf->standby_regs.autoena = __reg_read(pcf, PCF50633_REG_AUTOENA);
-- pcf->standby_regs.automxc = __reg_read(pcf, PCF50633_REG_AUTOMXC);
-- pcf->standby_regs.down1out = __reg_read(pcf, PCF50633_REG_DOWN1OUT);
-- pcf->standby_regs.down1mxc = __reg_read(pcf, PCF50633_REG_DOWN1MXC);
-- pcf->standby_regs.down2out = __reg_read(pcf, PCF50633_REG_DOWN2OUT);
-- pcf->standby_regs.down2ena = __reg_read(pcf, PCF50633_REG_DOWN2ENA);
-- pcf->standby_regs.memldoout = __reg_read(pcf, PCF50633_REG_MEMLDOOUT);
-- pcf->standby_regs.memldoena = __reg_read(pcf, PCF50633_REG_MEMLDOENA);
-- pcf->standby_regs.ledout = __reg_read(pcf, PCF50633_REG_LEDOUT);
-- pcf->standby_regs.ledena = __reg_read(pcf, PCF50633_REG_LEDENA);
-- pcf->standby_regs.leddim = __reg_read(pcf, PCF50633_REG_LEDDIM);
-+
-+ ret = i2c_smbus_read_i2c_block_data(&pcf->client,
-+ PCF50633_REG_AUTOOUT,
-+ sizeof(pcf->standby_regs.misc),
-+ &pcf->standby_regs.misc[0]);
-+ if (ret != 18)
-+ dev_err(dev, "Failed to save misc levels and enables :-(\n");
-
- /* regulator voltages and enable states */
- ret = i2c_smbus_read_i2c_block_data(&pcf->client,
-- PCF50633_REG_LDO1OUT, 14,
-- &pcf->standby_regs.ldo[0][0]);
-+ PCF50633_REG_LDO1OUT,
-+ sizeof(pcf->standby_regs.ldo),
-+ &pcf->standby_regs.ldo[0]);
- if (ret != 14)
- dev_err(dev, "Failed to save LDO levels and enables :-(\n");
-
-@@ -2261,11 +2262,16 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state)
- continue;
-
- dev_dbg(dev, "disabling regulator %u\n", i);
-- /* we cannot use pcf50633_onoff_set() because we're
-- * already under the mutex */
-- tmp = __reg_read(pcf, regulator_registers[i]+1);
-- tmp &= 0xfe;
-- __reg_write(pcf, regulator_registers[i]+1, tmp);
-+
-+ /* we can save ourselves the read part of a read-modify-write
-+ * here because we captured all these already
-+ */
-+ if (i < 4)
-+ tmp = pcf->standby_regs.misc[i * 4 + 1];
-+ else
-+ tmp = pcf->standby_regs.ldo[(i - 4) * 2 + 1];
-+
-+ __reg_write(pcf, regulator_registers[i] + 1, tmp & 0xfe);
- }
-
- /* turn off the backlight */
-@@ -2276,11 +2282,14 @@ static int pcf50633_suspend(struct device *dev, pm_message_t state)
- /* set interrupt masks so only those sources we want to wake
- * us are able to
- */
-- __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]);
-+ for (i = 0; i < 5; i++)
-+ res[i] = ~pcf->pdata->resumers[i];
-+
-+ ret = i2c_smbus_write_i2c_block_data(&pcf->client,
-+ PCF50633_REG_INT1M,
-+ 5, &res[0]);
-+ if (ret)
-+ dev_err(dev, "Failed to set wake masks :-( %d\n", ret);
-
- pcf->have_been_suspended = 1;
-
-@@ -2312,9 +2321,12 @@ EXPORT_SYMBOL_GPL(pcf50633_ready);
- void pcf50633_backlight_resume(struct pcf50633_data *pcf)
- {
- /* we force the backlight on in fact */
-- __reg_write(pcf, PCF50633_REG_LEDOUT, pcf->standby_regs.ledout);
-- __reg_write(pcf, PCF50633_REG_LEDENA, pcf->standby_regs.ledena | 0x01);
-- __reg_write(pcf, PCF50633_REG_LEDDIM, pcf->standby_regs.leddim);
-+ __reg_write(pcf, PCF50633_REG_LEDOUT, pcf->standby_regs.misc[
-+ PCF50633_REG_LEDOUT - PCF50633_REG_AUTOOUT]);
-+ __reg_write(pcf, PCF50633_REG_LEDENA, pcf->standby_regs.misc[
-+ PCF50633_REG_LEDENA - PCF50633_REG_AUTOOUT] | 1);
-+ __reg_write(pcf, PCF50633_REG_LEDDIM, pcf->standby_regs.misc[
-+ PCF50633_REG_LEDDIM - PCF50633_REG_AUTOOUT]);
- }
- EXPORT_SYMBOL_GPL(pcf50633_backlight_resume);
-
-@@ -2324,7 +2336,10 @@ static int pcf50633_resume(struct device *dev)
- struct i2c_client *client = to_i2c_client(dev);
- struct pcf50633_data *pcf = i2c_get_clientdata(client);
- int ret;
-+ u8 res[5];
-
-+ dev_info(dev, "pcf50633_resume suspended on entry = %d\n",
-+ pcf->have_been_suspended);
- mutex_lock(&pcf->lock);
-
- pcf->have_been_suspended = 2; /* resuming */
-@@ -2332,14 +2347,14 @@ static int pcf50633_resume(struct device *dev)
- /* these guys get reset while pcf50633 is suspend state, refresh */
-
- __reg_write(pcf, PCF50633_REG_OOCTIM2, pcf->standby_regs.ooctim2);
-- __reg_write(pcf, PCF50633_REG_AUTOOUT, pcf->standby_regs.autoout);
-- __reg_write(pcf, PCF50633_REG_AUTOMXC, pcf->standby_regs.automxc);
-- __reg_write(pcf, PCF50633_REG_DOWN1OUT, pcf->standby_regs.down1out);
-- __reg_write(pcf, PCF50633_REG_DOWN1MXC, pcf->standby_regs.down1mxc);
-- __reg_write(pcf, PCF50633_REG_DOWN2OUT, pcf->standby_regs.down2out);
-- __reg_write(pcf, PCF50633_REG_DOWN2ENA, pcf->standby_regs.down2ena);
-- __reg_write(pcf, PCF50633_REG_MEMLDOOUT, pcf->standby_regs.memldoout);
-- __reg_write(pcf, PCF50633_REG_MEMLDOENA, pcf->standby_regs.memldoena);
-+
-+ /* regulator voltages and enable states */
-+ ret = i2c_smbus_write_i2c_block_data(&pcf->client,
-+ PCF50633_REG_AUTOOUT,
-+ sizeof(pcf->standby_regs.misc) - 4,
-+ &pcf->standby_regs.misc[0]);
-+ if (ret)
-+ dev_err(dev, "Failed to restore misc :-( %d\n", ret);
-
- /* platform can choose to defer backlight bringup */
- if (!pcf->pdata->defer_resume_backlight)
-@@ -2347,14 +2362,22 @@ static int pcf50633_resume(struct device *dev)
-
- /* regulator voltages and enable states */
- ret = i2c_smbus_write_i2c_block_data(&pcf->client,
-- PCF50633_REG_LDO1OUT, 14,
-- &pcf->standby_regs.ldo[0][0]);
-+ PCF50633_REG_LDO1OUT,
-+ sizeof(pcf->standby_regs.ldo),
-+ &pcf->standby_regs.ldo[0]);
- if (ret)
- dev_err(dev, "Failed to restore LDOs :-( %d\n", ret);
-
-- mutex_unlock(&pcf->lock);
-+ memset(res, 0, sizeof(res));
-+ ret = i2c_smbus_write_i2c_block_data(&pcf->client,
-+ PCF50633_REG_INT1M,
-+ 5, &res[0]);
-+ if (ret)
-+ dev_err(dev, "Failed to set int masks :-( %d\n", ret);
-
-- pcf50633_irq(pcf->irq, pcf);
-+ pcf->have_been_suspended = 3; /* resume completed */
-+
-+ mutex_unlock(&pcf->lock);
-
- callback_all_resume_dependencies(&pcf->resume_dependency);
-
---
-1.5.6.5
-