From 4efb08969e884f4bcb8a409dc9a3f8d4132727f3 Mon Sep 17 00:00:00 2001 From: "makarand.karvekar" Date: Fri, 14 Jan 2011 17:13:31 -0600 Subject: [PATCH] misc: cap_prox: add fail-safe threshold checks if either of the sensors are in failure mode, keep device in body proximity detect. Change-Id: I4e460ac30e3612863a995e73b7869aa619ea5eb6 Signed-off-by: makarand.karvekar --- drivers/misc/cap_prox.c | 50 ++++++++++++++++++++++++++++------------ include/linux/cap_prox.h | 4 ++++ 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/drivers/misc/cap_prox.c b/drivers/misc/cap_prox.c index 2d596eb95b9c..c0db5dfd7e5e 100755 --- a/drivers/misc/cap_prox.c +++ b/drivers/misc/cap_prox.c @@ -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); } diff --git a/include/linux/cap_prox.h b/include/linux/cap_prox.h index f8607acd18b2..2222ad1a3179 100755 --- a/include/linux/cap_prox.h +++ b/include/linux/cap_prox.h @@ -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; }; -- 2.34.1