aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-omap-2.6.39/mfd/0013-MFD-TWL4030-optimizing-resource-configuration.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/linux-omap-2.6.39/mfd/0013-MFD-TWL4030-optimizing-resource-configuration.patch')
-rw-r--r--recipes-kernel/linux/linux-omap-2.6.39/mfd/0013-MFD-TWL4030-optimizing-resource-configuration.patch184
1 files changed, 184 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-omap-2.6.39/mfd/0013-MFD-TWL4030-optimizing-resource-configuration.patch b/recipes-kernel/linux/linux-omap-2.6.39/mfd/0013-MFD-TWL4030-optimizing-resource-configuration.patch
new file mode 100644
index 0000000000..8904f8de96
--- /dev/null
+++ b/recipes-kernel/linux/linux-omap-2.6.39/mfd/0013-MFD-TWL4030-optimizing-resource-configuration.patch
@@ -0,0 +1,184 @@
+From bf171753a162d07753208c6bcfae8ca1e5c94af3 Mon Sep 17 00:00:00 2001
+From: Lesly A M <leslyam@ti.com>
+Date: Wed, 1 Jun 2011 14:57:05 -0700
+Subject: [PATCH 13/13] MFD: TWL4030: optimizing resource configuration
+
+Skip the i2c register writes in twl4030_configure_resource() if the new value
+is same as the old value, for devgrp/type/remap regs.
+
+Suggested by David Derrick <dderrick@ti.com>
+
+Signed-off-by: Lesly A M <leslyam@ti.com>
+Cc: Nishanth Menon <nm@ti.com>
+Cc: David Derrick <dderrick@ti.com>
+Cc: Samuel Ortiz <sameo@linux.intel.com>
+---
+ drivers/mfd/twl4030-power.c | 126 ++++++++++++++++++++++++------------------
+ 1 files changed, 72 insertions(+), 54 deletions(-)
+
+diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c
+index 8af3fe3..d82632f 100644
+--- a/drivers/mfd/twl4030-power.c
++++ b/drivers/mfd/twl4030-power.c
+@@ -335,9 +335,9 @@ static int twl4030_configure_resource(struct twl4030_resconfig *rconfig)
+ {
+ int rconfig_addr;
+ int err;
+- u8 type;
+- u8 grp;
+- u8 remap;
++ u8 type, type_value;
++ u8 grp, grp_value;
++ u8 remap, remap_value;
+
+ if (rconfig->resource > TOTAL_RESOURCES) {
+ pr_err("TWL4030 Resource %d does not exist\n",
+@@ -348,76 +348,94 @@ static int twl4030_configure_resource(struct twl4030_resconfig *rconfig)
+ rconfig_addr = res_config_addrs[rconfig->resource];
+
+ /* Set resource group */
+- err = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &grp,
++ if (rconfig->devgroup != TWL4030_RESCONFIG_UNDEF) {
++ err = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &grp,
+ rconfig_addr + DEV_GRP_OFFSET);
+- if (err) {
+- pr_err("TWL4030 Resource %d group could not be read\n",
+- rconfig->resource);
+- return err;
+- }
++ if (err) {
++ pr_err("TWL4030 Resource %d group could not be read\n",
++ rconfig->resource);
++ return err;
++ }
+
+- if (rconfig->devgroup != TWL4030_RESCONFIG_UNDEF) {
+- grp &= ~DEV_GRP_MASK;
+- grp |= rconfig->devgroup << DEV_GRP_SHIFT;
+- err = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
++ grp_value = (grp & DEV_GRP_MASK) >> DEV_GRP_SHIFT;
++
++ if (rconfig->devgroup != grp_value) {
++ grp &= ~DEV_GRP_MASK;
++ grp |= rconfig->devgroup << DEV_GRP_SHIFT;
++ err = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+ grp, rconfig_addr + DEV_GRP_OFFSET);
+- if (err < 0) {
+- pr_err("TWL4030 failed to program devgroup\n");
+- return err;
++ if (err < 0) {
++ pr_err("TWL4030 failed to program devgroup\n");
++ return err;
++ }
+ }
+ }
+
+ /* Set resource types */
+- err = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &type,
++ if ((rconfig->type != TWL4030_RESCONFIG_UNDEF) ||
++ (rconfig->type2 != TWL4030_RESCONFIG_UNDEF)) {
++
++ err = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &type,
+ rconfig_addr + TYPE_OFFSET);
+- if (err < 0) {
+- pr_err("TWL4030 Resource %d type could not be read\n",
+- rconfig->resource);
+- return err;
+- }
++ if (err < 0) {
++ pr_err("TWL4030 Resource %d type could not be read\n",
++ rconfig->resource);
++ return err;
++ }
+
+- if (rconfig->type != TWL4030_RESCONFIG_UNDEF) {
+- type &= ~TYPE_MASK;
+- type |= rconfig->type << TYPE_SHIFT;
+- }
++ type_value = type;
+
+- if (rconfig->type2 != TWL4030_RESCONFIG_UNDEF) {
+- type &= ~TYPE2_MASK;
+- type |= rconfig->type2 << TYPE2_SHIFT;
+- }
++ if (rconfig->type != TWL4030_RESCONFIG_UNDEF) {
++ type &= ~TYPE_MASK;
++ type |= rconfig->type << TYPE_SHIFT;
++ }
+
+- err = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
++ if (rconfig->type2 != TWL4030_RESCONFIG_UNDEF) {
++ type &= ~TYPE2_MASK;
++ type |= rconfig->type2 << TYPE2_SHIFT;
++ }
++
++ if (type != type_value) {
++ err = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+ type, rconfig_addr + TYPE_OFFSET);
+- if (err < 0) {
+- pr_err("TWL4030 failed to program resource type\n");
+- return err;
++ if (err < 0) {
++ pr_err("TWL4030 failed to program resource type\n");
++ return err;
++ }
++ }
+ }
+
+ /* Set remap states */
+- err = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &remap,
++ if ((rconfig->remap_off != TWL4030_RESCONFIG_UNDEF) ||
++ (rconfig->remap_sleep != TWL4030_RESCONFIG_UNDEF)) {
++ err = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &remap,
+ rconfig_addr + REMAP_OFFSET);
+- if (err < 0) {
+- pr_err("TWL4030 Resource %d remap could not be read\n",
+- rconfig->resource);
+- return err;
+- }
++ if (err < 0) {
++ pr_err("TWL4030 Resource %d remap could not be read\n",
++ rconfig->resource);
++ return err;
++ }
+
+- if (rconfig->remap_off != TWL4030_RESCONFIG_UNDEF) {
+- remap &= ~OFF_STATE_MASK;
+- remap |= rconfig->remap_off << OFF_STATE_SHIFT;
+- }
++ remap_value = remap;
+
+- if (rconfig->remap_sleep != TWL4030_RESCONFIG_UNDEF) {
+- remap &= ~SLEEP_STATE_MASK;
+- remap |= rconfig->remap_sleep << SLEEP_STATE_SHIFT;
+- }
++ if (rconfig->remap_off != TWL4030_RESCONFIG_UNDEF) {
++ remap &= ~OFF_STATE_MASK;
++ remap |= rconfig->remap_off << OFF_STATE_SHIFT;
++ }
+
+- err = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+- remap,
+- rconfig_addr + REMAP_OFFSET);
+- if (err < 0) {
+- pr_err("TWL4030 failed to program remap\n");
+- return err;
++ if (rconfig->remap_sleep != TWL4030_RESCONFIG_UNDEF) {
++ remap &= ~SLEEP_STATE_MASK;
++ remap |= rconfig->remap_sleep << SLEEP_STATE_SHIFT;
++ }
++
++ if (remap != remap_value) {
++ err = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
++ remap, rconfig_addr + REMAP_OFFSET);
++ if (err < 0) {
++ pr_err("TWL4030 failed to program remap\n");
++ return err;
++ }
++ }
+ }
+
+ return 0;
+--
+1.6.6.1
+