misc: cap_prox: add fail-safe threshold checks
authormakarand.karvekar <makarand.karvekar@motorola.com>
Fri, 14 Jan 2011 23:13:31 +0000 (17:13 -0600)
committerRebecca Schultz Zavin <rebecca@android.com>
Fri, 14 Jan 2011 23:24:45 +0000 (15:24 -0800)
if either of the sensors are in failure mode,
keep device in body proximity detect.

Change-Id: I4e460ac30e3612863a995e73b7869aa619ea5eb6
Signed-off-by: makarand.karvekar <makarand.karvekar@motorola.com>
drivers/misc/cap_prox.c
include/linux/cap_prox.h

index 2d596eb95b9c72189d951d83701981db3f2571c9..c0db5dfd7e5e9f0df8e228739ea7699f74689985 100755 (executable)
@@ -158,32 +158,34 @@ static int cap_prox_read_data(struct cap_prox_data *cp)
        int key1_save_drift = 0;
        int key3_save_drift = 0;
        int save_drift_diff = 0;
+       int key1_key2_signal_drift = 0;
+       int key3_key4_signal_drift = 0;
        uint8_t mesg_buf[sizeof(struct cap_prox_msg)];
 
 
        ret = cap_prox_read(cp, mesg_buf, sizeof(struct cap_prox_msg));
        if (ret) {
                status = CP_STATUS_NUM_KEYS_ENABLED;
-               pr_info("MK: read failed \n");
+               pr_info("%s: read failed \n",  __func__);
                goto read_fail_ret;
        }
        msg = (struct cap_prox_msg *)mesg_buf;
 
        if (cp_dbg & 0x02) {
                pr_info("%s: Cap-Prox data \n", __func__);
-               pr_info(" msg->status 0x%2x \n",msg->status);
-               pr_info(" msg->ref_key1 0x%x \n",msg->ref_key1);
-               pr_info(" msg->ref_key3 0x%x \n",msg->ref_key3);
-               pr_info(" msg->chip_id 0x%2x \n",msg->chip_id);
-               pr_info(" msg->sw_ver 0x%2x \n",msg->sw_ver);
-               pr_info(" msg->signal1 0x%x \n",msg->signal1);
-               pr_info(" msg->signal2 0x%x \n",msg->signal2);
-               pr_info(" msg->signal3 0x%x \n",msg->signal3);
-               pr_info(" msg->signal4 0x%x \n",msg->signal4);
-               pr_info(" msg->save_ref1 0x%x \n",msg->save_ref1);
-               pr_info(" msg->save_ref2 0x%x \n",msg->save_ref2);
-               pr_info(" msg->save_ref3 0x%x \n",msg->save_ref3);
-               pr_info(" msg->save_ref4 0x%x \n\n",msg->save_ref4);
+               pr_info(" msg->status 0x%2x \n", msg->status);
+               pr_info(" msg->ref_key1 %d \n", msg->ref_key1);
+               pr_info(" msg->ref_key3 %d \n", msg->ref_key3);
+               pr_info(" msg->chip_id 0x%2x \n", msg->chip_id);
+               pr_info(" msg->sw_ver 0x%2x \n", msg->sw_ver);
+               pr_info(" msg->signal1 %d \n", msg->signal1);
+               pr_info(" msg->signal2 %d \n", msg->signal2);
+               pr_info(" msg->signal3 %d \n", msg->signal3);
+               pr_info(" msg->signal4 %d \n", msg->signal4);
+               pr_info(" msg->save_ref1 %d \n", msg->save_ref1);
+               pr_info(" msg->save_ref2 %d \n", msg->save_ref2);
+               pr_info(" msg->save_ref3 %d \n", msg->save_ref3);
+               pr_info(" msg->save_ref4 %d \n\n", msg->save_ref4);
        }
 
        key1_ref_drift = abs(msg->ref_key1 - msg->signal1);
@@ -192,6 +194,8 @@ static int cap_prox_read_data(struct cap_prox_data *cp)
        key1_save_drift = abs(msg->save_ref1 - msg->signal1);
        key3_save_drift = abs(msg->save_ref3 - msg->signal3);
        save_drift_diff = abs(key3_save_drift - key1_save_drift);
+       key1_key2_signal_drift = abs(msg->signal1 - msg->signal2);
+       key3_key4_signal_drift = abs(msg->signal3 - msg->signal4);
 
        if (cp_dbg) {
                pr_info("%s: Key1 ref drift %d \n", __func__, key1_ref_drift);
@@ -200,8 +204,12 @@ static int cap_prox_read_data(struct cap_prox_data *cp)
                         __func__, ref_drift_diff);
                pr_info("%s: Key1 save drift %d \n", __func__, key1_save_drift);
                pr_info("%s: key3 save drift %d \n", __func__, key3_save_drift);
-               pr_info("%s: Key1 Key3 drift diff %d \n\n",
+               pr_info("%s: Key1 Key3 saved drift diff %d \n\n",
                         __func__, save_drift_diff);
+               pr_info("%s: Key1 Key2 signal/sheild drift diff %d \n\n",
+                        __func__, key1_key2_signal_drift);
+               pr_info("%s: Key3 Key4 signal/sheild drift diff %d \n\n",
+                        __func__, key3_key4_signal_drift);
        }
 
        switch (msg->status) {
@@ -219,6 +227,18 @@ static int cap_prox_read_data(struct cap_prox_data *cp)
                         (key1_save_drift < cp->pdata->key1_save_drift_thres) &&
                         (key3_save_drift < cp->pdata->key3_save_drift_thres)) {
 
+                       /* Key1 sensor has failed, keep in force detect */
+                       if ((key1_key2_signal_drift >
+                                cp->pdata->key1_failsafe_thres) &&
+                                (msg->signal2 > cp->pdata->key2_signal_thres))
+                               break;
+
+                       /* Key3 sensor has failed, keep in force detect */
+                       if ((key3_key4_signal_drift >
+                                cp->pdata->key3_failsafe_thres) &&
+                                (msg->signal4 > cp->pdata->key4_signal_thres))
+                               break;
+
                        status = msg->status & 0xF0;
                        cap_prox_write(cp,&status,1);
                }
index f8607acd18b231f028f82aa766b8b82b5cf0d557..2222ad1a3179cd8cec72b6f940886c2d013817b9 100755 (executable)
@@ -47,6 +47,10 @@ struct cap_prox_platform_data {
        uint8_t key1_save_drift_thres;
        uint8_t key3_save_drift_thres;
        uint8_t save_drift_diff_thres;
+       uint8_t key1_failsafe_thres;
+       uint8_t key3_failsafe_thres;
+       uint16_t key2_signal_thres;
+       uint16_t key4_signal_thres;
 
        struct cap_prox_cfg     plat_cap_prox_cfg;
 };