From 539eaa322004a7b2a61e75812cb9fc342d380229 Mon Sep 17 00:00:00 2001 From: Wang Zhifeng Date: Fri, 4 May 2012 12:04:22 +0800 Subject: [PATCH] hwmon/lis3dh: make read/write of the range sys entry consistent BZ: 34712 The range sys entry uses different values for reading and writing. This commit changes that to use the same values. Change-Id: If7a017f5fa22a6955e7e08814eb29521ead9544e Signed-off-by: Wang Zhifeng Reviewed-on: http://android.intel.com:8080/47364 Reviewed-by: Chen, Jie D Reviewed-by: Yan, Leo Reviewed-by: Du, Alek Reviewed-by: Tang, HaifengX Tested-by: Tang, HaifengX Reviewed-by: buildbot Tested-by: buildbot --- .../intel-mid/device_libs/platform_lis3dh.c | 1 + drivers/hwmon/lis3dh_acc.c | 48 +++++++++++----------- include/linux/input/lis3dh.h | 7 ---- 3 files changed, 26 insertions(+), 30 deletions(-) diff --git a/arch/x86/platform/intel-mid/device_libs/platform_lis3dh.c b/arch/x86/platform/intel-mid/device_libs/platform_lis3dh.c index 4dcae97..463deea 100644 --- a/arch/x86/platform/intel-mid/device_libs/platform_lis3dh.c +++ b/arch/x86/platform/intel-mid/device_libs/platform_lis3dh.c @@ -21,6 +21,7 @@ void *lis3dh_platform_data(void *info) static struct lis3dh_acc_platform_data lis3dh_pdata; lis3dh_pdata.poll_interval = 200; + lis3dh_pdata.g_range = 2; lis3dh_pdata.negate_x = 1; lis3dh_pdata.negate_y = 0; lis3dh_pdata.negate_z = 0; diff --git a/drivers/hwmon/lis3dh_acc.c b/drivers/hwmon/lis3dh_acc.c index 3fdcf4d..e37409a 100644 --- a/drivers/hwmon/lis3dh_acc.c +++ b/drivers/hwmon/lis3dh_acc.c @@ -74,6 +74,13 @@ #define SENSITIVITY_8G 4 /** mg/LSB */ #define SENSITIVITY_16G 12 /** mg/LSB */ +/* Accelerometer Sensor Full Scale */ +#define LIS3DH_ACC_FS_MASK 0x30 +#define LIS3DH_ACC_G_2G 0x00 +#define LIS3DH_ACC_G_4G 0x10 +#define LIS3DH_ACC_G_8G 0x20 +#define LIS3DH_ACC_G_16G 0x30 + /* Accelerometer Sensor Operating Mode */ #define LIS3DH_ACC_ENABLE 0x01 #define LIS3DH_ACC_DISABLE 0x00 @@ -355,18 +362,23 @@ int lis3dh_acc_update_g_range(struct lis3dh_acc_data *acc, u8 new_g_range) u8 init_val; u8 new_val; u8 mask = LIS3DH_ACC_FS_MASK | HIGH_RESOLUTION; + u8 fs_bits = 0; switch (new_g_range) { - case LIS3DH_ACC_G_2G: + case 2: + fs_bits = LIS3DH_ACC_G_2G; sensitivity = SENSITIVITY_2G; break; - case LIS3DH_ACC_G_4G: + case 4: + fs_bits = LIS3DH_ACC_G_4G; sensitivity = SENSITIVITY_4G; break; - case LIS3DH_ACC_G_8G: + case 8: + fs_bits = LIS3DH_ACC_G_8G; sensitivity = SENSITIVITY_8G; break; - case LIS3DH_ACC_G_16G: + case 16: + fs_bits = LIS3DH_ACC_G_16G; sensitivity = SENSITIVITY_16G; break; default: @@ -382,7 +394,7 @@ int lis3dh_acc_update_g_range(struct lis3dh_acc_data *acc, u8 new_g_range) goto error; init_val = buf; acc->resume_state[RES_CTRL_REG4] = init_val; - new_val = new_g_range | HIGH_RESOLUTION; + new_val = fs_bits | HIGH_RESOLUTION; updated_val = ((mask & new_val) | ((~mask) & init_val)); buf = updated_val; err = lis3dh_acc_i2c_write(acc, CTRL_REG4, &buf, 1); @@ -640,24 +652,10 @@ static ssize_t attr_get_range(struct device *dev, { char val; struct lis3dh_acc_data *acc = dev_get_drvdata(dev); - char range = 2; + char range; mutex_lock(&acc->lock); - val = acc->pdata->g_range ; - switch (val) { - case LIS3DH_ACC_G_2G: - range = 2; - break; - case LIS3DH_ACC_G_4G: - range = 4; - break; - case LIS3DH_ACC_G_8G: - range = 8; - break; - case LIS3DH_ACC_G_16G: - range = 16; - break; - } + range = acc->pdata->g_range ; mutex_unlock(&acc->lock); return sprintf(buf, "%d\n", range); } @@ -672,9 +670,13 @@ static ssize_t attr_set_range(struct device *dev, if (strict_strtoul(buf, 10, &val)) return -EINVAL; + if (val != 2 && val != 4 && val != 8 && val != 16) + return -EINVAL; + + mutex_lock(&acc->lock); - acc->pdata->g_range = val; - lis3dh_acc_update_g_range(acc, val); + acc->pdata->g_range = (u8) val; + lis3dh_acc_update_g_range(acc, acc->pdata->g_range); mutex_unlock(&acc->lock); return size; diff --git a/include/linux/input/lis3dh.h b/include/linux/input/lis3dh.h index 49a7498..87b61a1 100644 --- a/include/linux/input/lis3dh.h +++ b/include/linux/input/lis3dh.h @@ -61,13 +61,6 @@ Revision 1-0-7 26/11/2010 /* Accelerometer defines section */ /************************************************/ -/* Accelerometer Sensor Full Scale */ -#define LIS3DH_ACC_FS_MASK 0x30 -#define LIS3DH_ACC_G_2G 0x00 -#define LIS3DH_ACC_G_4G 0x10 -#define LIS3DH_ACC_G_8G 0x20 -#define LIS3DH_ACC_G_16G 0x30 - /* supported accelerometer model */ enum acc_model { MODEL_LIS3DH, -- 2.7.4