summaryrefslogtreecommitdiff
path: root/drivers/input
diff options
context:
space:
mode:
authorZorro Liu <lyx@rock-chips.com>2019-01-02 10:00:48 +0800
committerTao Huang <huangtao@rock-chips.com>2019-01-10 16:33:00 +0800
commit6395f07d895fda8cd4871d82c66c19c35c15df6f (patch)
treebd864290c05c495cec663b9e8d01ef9c294ffeea /drivers/input
parent62b7ebee85557452900dd59aea27f1ebe46e5838 (diff)
driver: input: sensors: fix mma8452 gsensor data convert err
Change-Id: Icd754e9606dc8b0d1d44e932dd19cf113c79c3d6 Signed-off-by: Zorro Liu <lyx@rock-chips.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/sensors/accel/mma8452.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/drivers/input/sensors/accel/mma8452.c b/drivers/input/sensors/accel/mma8452.c
index 81e251738ea8..a061bbd886e6 100644
--- a/drivers/input/sensors/accel/mma8452.c
+++ b/drivers/input/sensors/accel/mma8452.c
@@ -109,26 +109,26 @@
Gravity_step: gravity value indicated by per count
*/
#define FREAD_MASK 0 /* enabled(1<<1) only if reading MSB 8bits*/
-#define MMA845X_RANGE 2000000
+#define MMA845X_RANGE (16384 * 2)
/* mma8451 */
#define MMA8451_PRECISION 14
#define MMA8451_BOUNDARY (0x1 << (MMA8451_PRECISION - 1))
-#define MMA8451_GRAVITY_STEP MMA845X_RANGE / MMA8451_BOUNDARY
+#define MMA8451_GRAVITY_STEP (MMA845X_RANGE / MMA8451_BOUNDARY)
/* mma8452 */
#define MMA8452_PRECISION 12
#define MMA8452_BOUNDARY (0x1 << (MMA8452_PRECISION - 1))
-#define MMA8452_GRAVITY_STEP MMA845X_RANGE / MMA8452_BOUNDARY
+#define MMA8452_GRAVITY_STEP (MMA845X_RANGE / MMA8452_BOUNDARY)
/* mma8453 */
#define MMA8453_PRECISION 10
#define MMA8453_BOUNDARY (0x1 << (MMA8453_PRECISION - 1))
-#define MMA8453_GRAVITY_STEP MMA845X_RANGE / MMA8453_BOUNDARY
+#define MMA8453_GRAVITY_STEP (MMA845X_RANGE / MMA8453_BOUNDARY)
/* mma8653 */
#define MMA8653_PRECISION 10
#define MMA8653_BOUNDARY (0x1 << (MMA8653_PRECISION - 1))
-#define MMA8653_GRAVITY_STEP MMA845X_RANGE / MMA8653_BOUNDARY
+#define MMA8653_GRAVITY_STEP (MMA845X_RANGE / MMA8653_BOUNDARY)
#define MMA8451_DEVID 0x1a
@@ -250,28 +250,44 @@ static int sensor_convert_data(struct i2c_client *client, char high_byte, char l
swap(high_byte,low_byte);
result = ((int)high_byte << (MMA8451_PRECISION-8))
| ((int)low_byte >> (16-MMA8451_PRECISION));
- result *= 4;
+ if (result < MMA8451_BOUNDARY)
+ result = result * MMA8451_GRAVITY_STEP;
+ else
+ result = ~(((~result & (0x7fff >> (16 - MMA8451_PRECISION))) + 1)
+ * MMA8451_GRAVITY_STEP) + 1;
break;
case MMA8452_DEVID:
swap(high_byte,low_byte);
result = ((int)high_byte << (MMA8452_PRECISION-8))
| ((int)low_byte >> (16-MMA8452_PRECISION));
- result *= 16;
+ if (result < MMA8452_BOUNDARY)
+ result = result * MMA8452_GRAVITY_STEP;
+ else
+ result = ~(((~result & (0x7fff >> (16 - MMA8452_PRECISION))) + 1)
+ * MMA8452_GRAVITY_STEP) + 1;
break;
case MMA8453_DEVID:
swap(high_byte,low_byte);
result = ((int)high_byte << (MMA8453_PRECISION-8))
| ((int)low_byte >> (16-MMA8453_PRECISION));
- result *= 64;
+ if (result < MMA8453_BOUNDARY)
+ result = result * MMA8453_GRAVITY_STEP;
+ else
+ result = ~(((~result & (0x7fff >> (16 - MMA8453_PRECISION))) + 1)
+ * MMA8453_GRAVITY_STEP) + 1;
break;
case MMA8653_DEVID:
swap(high_byte,low_byte);
result = ((int)high_byte << (MMA8653_PRECISION-8))
| ((int)low_byte >> (16-MMA8653_PRECISION));
- result *= 64;
+ if (result < MMA8653_BOUNDARY)
+ result = result * MMA8653_GRAVITY_STEP;
+ else
+ result = ~(((~result & (0x7fff >> (16 - MMA8653_PRECISION))) + 1)
+ * MMA8653_GRAVITY_STEP) + 1;
break;
default:
@@ -364,7 +380,7 @@ struct sensor_operate gsensor_mma8452_ops = {
.precision = MMA8452_PRECISION,
.ctrl_reg = MMA8452_REG_CTRL_REG1,
.int_status_reg = MMA8452_REG_INTSRC,
- .range = {-32768, 32768},
+ .range = {-MMA845X_RANGE, MMA845X_RANGE},
.trig = IRQF_TRIGGER_LOW | IRQF_ONESHOT,
.active = sensor_active,
.init = sensor_init,