diff options
Diffstat (limited to 'drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c')
| -rw-r--r-- | drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c | 107 |
1 files changed, 11 insertions, 96 deletions
diff --git a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c index eef9954088b..d4106ad5071 100644 --- a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c +++ b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c @@ -7,7 +7,9 @@ * * Licensed under the GPL-2. */ -#define WAKE_STATS_DEBUG_INFO + +/* #define DEBUG */ + #include <linux/kernel.h> #include <linux/device.h> #include <linux/module.h> @@ -36,7 +38,7 @@ #define ST_LSM6DS3_TAP_SRC_Z_AXIS_MASK (1<<0) #define ST_LSM6DS3_6D_SRC_ADDR 0x1d -#define ST_LSM6DS3_6D_SRC_DETECTED_MASK (1<<6) + static struct workqueue_struct *st_lsm6ds3_wq; @@ -61,81 +63,6 @@ irqreturn_t st_lsm6ds3_save_timestamp(int irq, void *private) return IRQ_HANDLED; } -#ifdef WAKE_STATS_DEBUG_INFO -static int wakeup_irq_count = 0; -static int wakeup_irq_stayawake_count = 0; -static int wakeup_irq_keepawake_count = 0; -#define MAX_ORIENTATIONS 6 -static int wake_up_orient_count[MAX_ORIENTATIONS] = {0}; -static long wake_up_orient_times[MAX_ORIENTATIONS] = {0}; -s64 last_orient_change_time_ns = 0; -int last_orient; - - -static void update_orient_stats(u8 d6d_src_reg, s64 ctime_ns) -{ - s64 delta = 0; - int orient_val; - d6d_src_reg &= SIXD_MASK_VALID_BITS; - orient_val = __ffs(d6d_src_reg); - if( orient_val >= MAX_ORIENTATIONS){ - return; - } - - wake_up_orient_count[orient_val]++; - if(last_orient_change_time_ns != 0){ - delta = ctime_ns - last_orient_change_time_ns; - do_div(delta, 1E6); //down to milliseconds - wake_up_orient_times[last_orient] += delta; - } - last_orient_change_time_ns = ctime_ns; - last_orient = orient_val; -} - -static void print_wake_stats(struct lsm6ds3_data *cdata) -{ - struct timespec monotonic, boot, misc; - s64 mon_ns, boot_ns, misc_ns, tot_ms=0; - int i; - - get_monotonic_boottime(&monotonic); - ktime_get_ts(&boot); - getnstimeofday(&misc); - mon_ns = timespec_to_ns(&monotonic); - boot_ns = timespec_to_ns(&boot); - misc_ns = timespec_to_ns(&misc); - do_div(mon_ns,1E9); - do_div(boot_ns,1E9); - do_div(misc_ns,1E9); - - dev_info(cdata->dev, "wkstat: unignored/total/keepawake: \t%i\t%i\t%i", wakeup_irq_stayawake_count, wakeup_irq_count, - wakeup_irq_keepawake_count); - dev_info(cdata->dev, "wkstat times: tot:\t%lld\tawake:\t%lld", mon_ns, boot_ns); - dev_info(cdata->dev, "wkstat all orient count: 5-0 %i\t%i\t%i\t%i\t%i\t%i", - wake_up_orient_count[5], - wake_up_orient_count[4], - wake_up_orient_count[3], - wake_up_orient_count[2], - wake_up_orient_count[1], - wake_up_orient_count[0]); - - for(i=0; i<MAX_ORIENTATIONS; i++) - tot_ms += wake_up_orient_times[i]; - - dev_info(cdata->dev, "wkstat orient times(uS): 5-0 %ld\t%ld\t%ld\t%ld\t%ld\t%ld\ttot:%lld", - wake_up_orient_times[5], - wake_up_orient_times[4], - wake_up_orient_times[3], - wake_up_orient_times[2], - wake_up_orient_times[1], - wake_up_orient_times[0], tot_ms); - -} -#endif /* WAKE_STATS_DEBUG_INFO */ - - - - static void st_lsm6ds3_irq_management(struct work_struct *data_work) { struct lsm6ds3_data *cdata; @@ -146,10 +73,13 @@ static void st_lsm6ds3_irq_management(struct work_struct *data_work) int wake_irq; int ignore_event = 0; + + cdata = container_of((struct work_struct *)data_work, struct lsm6ds3_data, data_work); wake_irq = last_wakeup_reason_test(cdata->irq); + mutex_lock(&cdata->fifo_lock); cdata->tf->read(cdata, ST_LSM6DS3_6D_SRC_ADDR, 1, &d6d_src_reg, true); cdata->tf->read(cdata, ST_LSM6DS3_TAP_SRC_ADDR, 1, &tap_src_reg, true); @@ -159,9 +89,7 @@ static void st_lsm6ds3_irq_management(struct work_struct *data_work) dev_dbg(cdata->dev, "ST irq start :src_value, 6d, tap:%x %x %x",src_value, d6d_src_reg, tap_src_reg); - if(d6d_src_reg & ST_LSM6DS3_6D_SRC_DETECTED_MASK){ - update_orient_stats(d6d_src_reg, cdata->timestamp); - + if(d6d_src_reg & (1<<6)){ dev_info(cdata->dev, "D6D IRQ val:0x%x mask:0x%x", SIXD_MASK_VALID_BITS & d6d_src_reg, cdata->sixd_mask); if(cdata->sixd_mask & d6d_src_reg){ d6d_event = 1; @@ -185,9 +113,7 @@ static void st_lsm6ds3_irq_management(struct work_struct *data_work) } } if(cdata->first_irq_from_resume && wake_irq){ -#ifdef WAKE_STATS_DEBUG_INFO - wakeup_irq_count++; -#endif + dev_info(cdata->dev, "First IRQ from a RESUME"); if(!d6d_event && !tap_event && !ignore_event){ dev_info(cdata->dev, "No event from first resume, assuming lost TAP"); tap_event = 1; @@ -198,16 +124,8 @@ static void st_lsm6ds3_irq_management(struct work_struct *data_work) } if(!ignore_event && (tap_event || d6d_event) && cdata->first_irq_from_resume){ - wake_lock_timeout(&cdata->tap_wlock,msecs_to_jiffies(500)); -#ifdef WAKE_STATS_DEBUG_INFO - wakeup_irq_stayawake_count++; -#endif - } - else if(d6d_event && !ignore_event){//negative roll - wake_lock_timeout(&cdata->tap_wlock,msecs_to_jiffies(200)); -#ifdef WAKE_STATS_DEBUG_INFO - wakeup_irq_keepawake_count++; -#endif + dev_info(cdata->dev, "Setting wake lock"); + wake_lock_timeout(&cdata->tap_wlock,msecs_to_jiffies(1500)); } //significant motion event processing if(tap_event){ @@ -261,9 +179,6 @@ static void st_lsm6ds3_irq_management(struct work_struct *data_work) if(cdata->first_irq_from_resume){ cdata->first_irq_from_resume = 0; st_lsm6ds3_reconfigure_fifo(cdata, false); -#ifdef WAKE_STATS_DEBUG_INFO - print_wake_stats(cdata); -#endif } enable_irq(cdata->irq); return; |