diff options
| author | Evan Wilson <evan@oliodevices.com> | 2015-10-02 00:59:39 +0000 | 
|---|---|---|
| committer | Gerrit Code Review <gerrit2@ip-172-31-25-77.us-west-1.compute.internal> | 2015-04-16 10:08:13 +0000 | 
| commit | cf37981b4c9c4bfceab735aa210e2a8531c86954 (patch) | |
| tree | 483313781e4394ab1404a38f1c41624168e61be9 | |
| parent | 9f4a3e0461cb4037dcf64176a8e4dca8a4c0223c (diff) | |
| parent | 78446d6a6582f3925658cbc90d2b5f7fb5f9b981 (diff) | |
| download | olio-linux-3.10-cf37981b4c9c4bfceab735aa210e2a8531c86954.tar.xz olio-linux-3.10-cf37981b4c9c4bfceab735aa210e2a8531c86954.zip | |
Merge "Revert "Updated wake check mechanism - faster decisions."" into android-3.10-bringup
| -rw-r--r-- | drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_buffer.c | 1 | ||||
| -rw-r--r-- | drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c | 35 | ||||
| -rw-r--r-- | drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c | 107 | 
3 files changed, 14 insertions, 129 deletions
| diff --git a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_buffer.c b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_buffer.c index 75d3e3aaca2..f28fa07270f 100644 --- a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_buffer.c +++ b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_buffer.c @@ -8,6 +8,7 @@   * Licensed under the GPL-2.   */ +/* #define DEBUG */  #include <linux/module.h>  #include <linux/kernel.h> diff --git a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c index aca1924a38b..b0df8009aa8 100644 --- a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c +++ b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c @@ -7,7 +7,7 @@   *   * Licensed under the GPL-2.   */ -//#define DEBUG +  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/slab.h> @@ -1841,34 +1841,6 @@ ssize_t st_lsm6ds3_sysfs_get_irq_src(struct device *dev,  } -static ssize_t st_lsm6ds3_sysfs_ack_wakeup_irq(struct device *dev, -		struct device_attribute *attr, const char *buf, size_t size) -{ -	int ret; -	struct lsm6ds3_sensor_data *sdata = iio_priv(dev_get_drvdata(dev)); -	uint32_t i; -	struct timespec ts; -	s64 ack_time; - -	ret = sscanf(buf, "%i", &i); -	if(ret != 1 || i != 1){ -		dev_err(sdata->cdata->dev,"error, write 1 to ack"); -		return -EINVAL; -	} - -	mutex_lock(&sdata->cdata->fifo_lock);		 -#define ACK_TIME_DEBUG 1 -#if ACK_TIME_DEBUG -	get_monotonic_boottime(&ts); -	ack_time = timespec_to_ns(&ts);	 -	dev_info(sdata->cdata->dev, "IRQ acked from android@%lld", ack_time); -#endif  -	wake_unlock(&sdata->cdata->tap_wlock); -	 -	mutex_unlock(&sdata->cdata->fifo_lock);		 -	return size; -} -  static ssize_t st_lsm6ds3_sysfs_write_reg(struct device *dev,  		struct device_attribute *attr, const char *buf, size_t size)  { @@ -1999,8 +1971,6 @@ static IIO_DEVICE_ATTR(irq_source, S_IRUGO,  static IIO_DEVICE_ATTR(write_reg, S_IWUSR,  				NULL, st_lsm6ds3_sysfs_write_reg, 0); -static IIO_DEVICE_ATTR(ack_wakeup_irq, S_IWUSR, -				NULL, st_lsm6ds3_sysfs_ack_wakeup_irq, 0);  static IIO_DEVICE_ATTR(read_reg, S_IRUGO | S_IWUSR,  		st_lsm6ds3_sysfs_read_reg_get,			 @@ -2027,7 +1997,6 @@ static struct attribute *st_lsm6ds3_accel_attributes[] = {  	&iio_dev_attr_read_reg.dev_attr.attr,  	&iio_dev_attr_sixd_wake_mask.dev_attr.attr,  	&iio_dev_attr_suspend_samples.dev_attr.attr, -	&iio_dev_attr_ack_wakeup_irq.dev_attr.attr,  	NULL,  }; @@ -2180,7 +2149,7 @@ int st_lsm6ds3_common_probe(struct lsm6ds3_data *cdata, int irq)  		dev_info(cdata->dev, "driver use DRDY int pin 1\n");  	} -	cdata->sixd_mask = 0x21; +	cdata->sixd_mask = SIXD_MASK_VALID_BITS;  	cdata->indio_dev[ST_INDIO_DEV_ACCEL]->name =  		kasprintf(GFP_KERNEL, "%s_%s", cdata->name, 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; |