forked from rpms/kernel
		
	
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From: =?UTF-8?q?=C3=89ric=20Piel?= <eric.piel@tremplin-utc.net>
 | |
| Date: Thu, 3 Nov 2011 16:22:40 +0100
 | |
| Subject: [PATCH] lis3: improve handling of null rate
 | |
| 
 | |
| When obtaining a rate of 0, we would disable the device supposely
 | |
| because it seems to behave incorectly. It actually only comes from the
 | |
| fact that the device is off and on lis3dc it's reflected in the rate.
 | |
| So handle this nicely by just waiting a safe time, and then using the
 | |
| device as normally.
 | |
| 
 | |
| Bugzilla: 785814
 | |
| Upstream-status: ??
 | |
| 
 | |
| Signed-off-by: ??ric Piel <eric.piel@tremplin-utc.net>
 | |
| ---
 | |
|  drivers/misc/lis3lv02d/lis3lv02d.c | 16 ++++++++--------
 | |
|  1 file changed, 8 insertions(+), 8 deletions(-)
 | |
| 
 | |
| diff --git a/drivers/misc/lis3lv02d/lis3lv02d.c b/drivers/misc/lis3lv02d/lis3lv02d.c
 | |
| index fb8705fc3aca..50c2b93c1273 100644
 | |
| --- a/drivers/misc/lis3lv02d/lis3lv02d.c
 | |
| +++ b/drivers/misc/lis3lv02d/lis3lv02d.c
 | |
| @@ -216,7 +216,8 @@ static void lis3lv02d_get_xyz(struct lis3lv02d *lis3, int *x, int *y, int *z)
 | |
|  /* conversion btw sampling rate and the register values */
 | |
|  static int lis3_12_rates[4] = {40, 160, 640, 2560};
 | |
|  static int lis3_8_rates[2] = {100, 400};
 | |
| -static int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000};
 | |
| +/* LIS3DC: 0 = power off, above 9 = undefined */
 | |
| +static int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000, -1, -1, -1, -1, -1, -1};
 | |
|  static int lis3_3dlh_rates[4] = {50, 100, 400, 1000};
 | |
|  
 | |
|  /* ODR is Output Data Rate */
 | |
| @@ -231,12 +232,11 @@ static int lis3lv02d_get_odr(struct lis3lv02d *lis3)
 | |
|  	return lis3->odrs[(ctrl >> shift)];
 | |
|  }
 | |
|  
 | |
| -static int lis3lv02d_get_pwron_wait(struct lis3lv02d *lis3)
 | |
| +static int lis3lv02d_wait_pwron(struct lis3lv02d *lis3)
 | |
|  {
 | |
|  	int div = lis3lv02d_get_odr(lis3);
 | |
| -
 | |
| -	if (WARN_ONCE(div == 0, "device returned spurious data"))
 | |
| -		return -ENXIO;
 | |
| +	if (div <= 0)
 | |
| +		div = 1; /* maximum delay */
 | |
|  
 | |
|  	/* LIS3 power on delay is quite long */
 | |
|  	msleep(lis3->pwron_delay / div);
 | |
| @@ -303,7 +303,7 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
 | |
|  
 | |
|  	lis3->read(lis3, ctlreg, ®);
 | |
|  	lis3->write(lis3, ctlreg, (reg | selftest));
 | |
| -	ret = lis3lv02d_get_pwron_wait(lis3);
 | |
| +	ret = lis3lv02d_wait_pwron(lis3);
 | |
|  	if (ret)
 | |
|  		goto fail;
 | |
|  
 | |
| @@ -314,7 +314,7 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
 | |
|  
 | |
|  	/* back to normal settings */
 | |
|  	lis3->write(lis3, ctlreg, reg);
 | |
| -	ret = lis3lv02d_get_pwron_wait(lis3);
 | |
| +	ret = lis3lv02d_wait_pwron(lis3);
 | |
|  	if (ret)
 | |
|  		goto fail;
 | |
|  
 | |
| @@ -434,7 +434,7 @@ int lis3lv02d_poweron(struct lis3lv02d *lis3)
 | |
|  		}
 | |
|  	}
 | |
|  
 | |
| -	err = lis3lv02d_get_pwron_wait(lis3);
 | |
| +	err = lis3lv02d_wait_pwron(lis3);
 | |
|  	if (err)
 | |
|  		return err;
 | |
|  
 |