- patches.suse/slab-handle-memoryless-nodes-v2a.patch: Refresh.
[linux-flexiantxendom0-3.2.10.git] / drivers / mfd / twl4030-power.c
index d423e0c..0815292 100644 (file)
@@ -26,7 +26,7 @@
 
 #include <linux/module.h>
 #include <linux/pm.h>
-#include <linux/i2c/twl4030.h>
+#include <linux/i2c/twl.h>
 #include <linux/platform_device.h>
 
 #include <asm/mach-types.h>
@@ -67,19 +67,35 @@ static u8 twl4030_start_script_address = 0x2b;
 #define R_KEY_1                        0xC0
 #define R_KEY_2                        0x0C
 
-/* resource configuration registers */
-
-#define DEVGROUP_OFFSET                0
+/* resource configuration registers
+   <RESOURCE>_DEV_GRP   at address 'n+0'
+   <RESOURCE>_TYPE      at address 'n+1'
+   <RESOURCE>_REMAP     at address 'n+2'
+   <RESOURCE>_DEDICATED at address 'n+3'
+*/
+#define DEV_GRP_OFFSET         0
 #define TYPE_OFFSET            1
+#define REMAP_OFFSET           2
+#define DEDICATED_OFFSET       3
+
+/* Bit positions in the registers */
+
+/* <RESOURCE>_DEV_GRP */
+#define DEV_GRP_SHIFT          5
+#define DEV_GRP_MASK           (7 << DEV_GRP_SHIFT)
 
-/* Bit positions */
-#define DEVGROUP_SHIFT         5
-#define DEVGROUP_MASK          (7 << DEVGROUP_SHIFT)
+/* <RESOURCE>_TYPE */
 #define TYPE_SHIFT             0
 #define TYPE_MASK              (7 << TYPE_SHIFT)
 #define TYPE2_SHIFT            3
 #define TYPE2_MASK             (3 << TYPE2_SHIFT)
 
+/* <RESOURCE>_REMAP */
+#define SLEEP_STATE_SHIFT      0
+#define SLEEP_STATE_MASK       (0xf << SLEEP_STATE_SHIFT)
+#define OFF_STATE_SHIFT                4
+#define OFF_STATE_MASK         (0xf << OFF_STATE_SHIFT)
+
 static u8 res_config_addrs[] = {
        [RES_VAUX1]     = 0x17,
        [RES_VAUX2]     = 0x1b,
@@ -115,11 +131,11 @@ static int __init twl4030_write_script_byte(u8 address, u8 byte)
 {
        int err;
 
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, address,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, address,
                                R_MEMORY_ADDRESS);
        if (err)
                goto out;
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, byte,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, byte,
                                R_MEMORY_DATA);
 out:
        return err;
@@ -176,18 +192,18 @@ static int __init twl4030_config_wakeup3_sequence(u8 address)
        u8 data;
 
        /* Set SLEEP to ACTIVE SEQ address for P3 */
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, address,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, address,
                                R_SEQ_ADD_S2A3);
        if (err)
                goto out;
 
        /* P3 LVL_WAKEUP should be on LEVEL */
-       err = twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &data,
+       err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &data,
                                R_P3_SW_EVENTS);
        if (err)
                goto out;
        data |= LVL_WAKEUP;
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, data,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, data,
                                R_P3_SW_EVENTS);
 out:
        if (err)
@@ -201,42 +217,42 @@ static int __init twl4030_config_wakeup12_sequence(u8 address)
        u8 data;
 
        /* Set SLEEP to ACTIVE SEQ address for P1 and P2 */
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, address,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, address,
                                R_SEQ_ADD_S2A12);
        if (err)
                goto out;
 
        /* P1/P2 LVL_WAKEUP should be on LEVEL */
-       err = twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &data,
+       err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &data,
                                R_P1_SW_EVENTS);
        if (err)
                goto out;
 
        data |= LVL_WAKEUP;
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, data,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, data,
                                R_P1_SW_EVENTS);
        if (err)
                goto out;
 
-       err = twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &data,
+       err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &data,
                                R_P2_SW_EVENTS);
        if (err)
                goto out;
 
        data |= LVL_WAKEUP;
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, data,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, data,
                                R_P2_SW_EVENTS);
        if (err)
                goto out;
 
        if (machine_is_omap_3430sdp() || machine_is_omap_ldp()) {
                /* Disabling AC charger effect on sleep-active transitions */
-               err = twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &data,
+               err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &data,
                                        R_CFG_P1_TRANSITION);
                if (err)
                        goto out;
                data &= ~(1<<1);
-               err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, data ,
+               err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, data ,
                                        R_CFG_P1_TRANSITION);
                if (err)
                        goto out;
@@ -254,7 +270,7 @@ static int __init twl4030_config_sleep_sequence(u8 address)
        int err;
 
        /* Set ACTIVE to SLEEP SEQ address in T2 memory*/
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, address,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, address,
                                R_SEQ_ADD_A2S);
 
        if (err)
@@ -269,41 +285,41 @@ static int __init twl4030_config_warmreset_sequence(u8 address)
        u8 rd_data;
 
        /* Set WARM RESET SEQ address for P1 */
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, address,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, address,
                                R_SEQ_ADD_WARM);
        if (err)
                goto out;
 
        /* P1/P2/P3 enable WARMRESET */
-       err = twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &rd_data,
+       err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &rd_data,
                                R_P1_SW_EVENTS);
        if (err)
                goto out;
 
        rd_data |= ENABLE_WARMRESET;
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, rd_data,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, rd_data,
                                R_P1_SW_EVENTS);
        if (err)
                goto out;
 
-       err = twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &rd_data,
+       err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &rd_data,
                                R_P2_SW_EVENTS);
        if (err)
                goto out;
 
        rd_data |= ENABLE_WARMRESET;
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, rd_data,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, rd_data,
                                R_P2_SW_EVENTS);
        if (err)
                goto out;
 
-       err = twl4030_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &rd_data,
+       err = twl_i2c_read_u8(TWL4030_MODULE_PM_MASTER, &rd_data,
                                R_P3_SW_EVENTS);
        if (err)
                goto out;
 
        rd_data |= ENABLE_WARMRESET;
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, rd_data,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, rd_data,
                                R_P3_SW_EVENTS);
 out:
        if (err)
@@ -317,6 +333,7 @@ static int __init twl4030_configure_resource(struct twl4030_resconfig *rconfig)
        int err;
        u8 type;
        u8 grp;
+       u8 remap;
 
        if (rconfig->resource > TOTAL_RESOURCES) {
                pr_err("TWL4030 Resource %d does not exist\n",
@@ -327,19 +344,19 @@ static int __init twl4030_configure_resource(struct twl4030_resconfig *rconfig)
        rconfig_addr = res_config_addrs[rconfig->resource];
 
        /* Set resource group */
-       err = twl4030_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &grp,
-                               rconfig_addr + DEVGROUP_OFFSET);
+       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 (rconfig->devgroup >= 0) {
-               grp &= ~DEVGROUP_MASK;
-               grp |= rconfig->devgroup << DEVGROUP_SHIFT;
-               err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
-                                       grp, rconfig_addr + DEVGROUP_OFFSET);
+       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, rconfig_addr + DEV_GRP_OFFSET);
                if (err < 0) {
                        pr_err("TWL4030 failed to program devgroup\n");
                        return err;
@@ -347,7 +364,7 @@ static int __init twl4030_configure_resource(struct twl4030_resconfig *rconfig)
        }
 
        /* Set resource types */
-       err = twl4030_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &type,
+       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",
@@ -355,23 +372,50 @@ static int __init twl4030_configure_resource(struct twl4030_resconfig *rconfig)
                return err;
        }
 
-       if (rconfig->type >= 0) {
+       if (rconfig->type != TWL4030_RESCONFIG_UNDEF) {
                type &= ~TYPE_MASK;
                type |= rconfig->type << TYPE_SHIFT;
        }
 
-       if (rconfig->type2 >= 0) {
+       if (rconfig->type2 != TWL4030_RESCONFIG_UNDEF) {
                type &= ~TYPE2_MASK;
                type |= rconfig->type2 << TYPE2_SHIFT;
        }
 
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+       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;
        }
 
+       /* Set remap states */
+       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 (rconfig->remap_off != TWL4030_RESCONFIG_UNDEF) {
+               remap &= ~OFF_STATE_MASK;
+               remap |= rconfig->remap_off << OFF_STATE_SHIFT;
+       }
+
+       if (rconfig->remap_sleep != TWL4030_RESCONFIG_UNDEF) {
+               remap &= ~SLEEP_STATE_MASK;
+               remap |= rconfig->remap_off << SLEEP_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;
+       }
+
        return 0;
 }
 
@@ -424,12 +468,12 @@ void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts)
        struct twl4030_resconfig *resconfig;
        u8 address = twl4030_start_script_address;
 
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, R_KEY_1,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, R_KEY_1,
                                R_PROTECT_KEY);
        if (err)
                goto unlock;
 
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, R_KEY_2,
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, R_KEY_2,
                                R_PROTECT_KEY);
        if (err)
                goto unlock;
@@ -452,7 +496,7 @@ void __init twl4030_power_init(struct twl4030_power_data *twl4030_scripts)
                }
        }
 
-       err = twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0, R_PROTECT_KEY);
+       err = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0, R_PROTECT_KEY);
        if (err)
                pr_err("TWL4030 Unable to relock registers\n");
        return;