diff options
| -rw-r--r-- | drivers/hwmon/lis3lv02d.c | 41 | ||||
| -rw-r--r-- | drivers/hwmon/lis3lv02d.h | 1 |
2 files changed, 28 insertions, 14 deletions
diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c index b12ee359d90e..39b9ac8e18ed 100644 --- a/drivers/hwmon/lis3lv02d.c +++ b/drivers/hwmon/lis3lv02d.c | |||
| @@ -50,6 +50,9 @@ | |||
| 50 | * joystick. | 50 | * joystick. |
| 51 | */ | 51 | */ |
| 52 | 52 | ||
| 53 | #define LIS3_PWRON_DELAY_WAI_12B (5000) | ||
| 54 | #define LIS3_PWRON_DELAY_WAI_8B (3000) | ||
| 55 | |||
| 53 | struct lis3lv02d lis3_dev = { | 56 | struct lis3lv02d lis3_dev = { |
| 54 | .misc_wait = __WAIT_QUEUE_HEAD_INITIALIZER(lis3_dev.misc_wait), | 57 | .misc_wait = __WAIT_QUEUE_HEAD_INITIALIZER(lis3_dev.misc_wait), |
| 55 | }; | 58 | }; |
| @@ -112,6 +115,24 @@ static void lis3lv02d_get_xyz(struct lis3lv02d *lis3, int *x, int *y, int *z) | |||
| 112 | *z = lis3lv02d_get_axis(lis3->ac.z, position); | 115 | *z = lis3lv02d_get_axis(lis3->ac.z, position); |
| 113 | } | 116 | } |
| 114 | 117 | ||
| 118 | /* conversion btw sampling rate and the register values */ | ||
| 119 | static int lis3_12_rates[4] = {40, 160, 640, 2560}; | ||
| 120 | static int lis3_8_rates[2] = {100, 400}; | ||
| 121 | |||
| 122 | static int lis3lv02d_get_odr(void) | ||
| 123 | { | ||
| 124 | u8 ctrl; | ||
| 125 | int val; | ||
| 126 | |||
| 127 | lis3_dev.read(&lis3_dev, CTRL_REG1, &ctrl); | ||
| 128 | |||
| 129 | if (lis3_dev.whoami == WAI_12B) | ||
| 130 | val = lis3_12_rates[(ctrl & (CTRL1_DF0 | CTRL1_DF1)) >> 4]; | ||
| 131 | else | ||
| 132 | val = lis3_8_rates[(ctrl & CTRL1_DR) >> 7]; | ||
| 133 | return val; | ||
| 134 | } | ||
| 135 | |||
| 115 | void lis3lv02d_poweroff(struct lis3lv02d *lis3) | 136 | void lis3lv02d_poweroff(struct lis3lv02d *lis3) |
| 116 | { | 137 | { |
| 117 | /* disable X,Y,Z axis and power down */ | 138 | /* disable X,Y,Z axis and power down */ |
| @@ -125,6 +146,9 @@ void lis3lv02d_poweron(struct lis3lv02d *lis3) | |||
| 125 | 146 | ||
| 126 | lis3->init(lis3); | 147 | lis3->init(lis3); |
| 127 | 148 | ||
| 149 | /* LIS3 power on delay is quite long */ | ||
| 150 | msleep(lis3->pwron_delay / lis3lv02d_get_odr()); | ||
| 151 | |||
| 128 | /* | 152 | /* |
| 129 | * Common configuration | 153 | * Common configuration |
| 130 | * BDU: (12 bits sensors only) LSB and MSB values are not updated until | 154 | * BDU: (12 bits sensors only) LSB and MSB values are not updated until |
| @@ -364,23 +388,10 @@ static ssize_t lis3lv02d_calibrate_store(struct device *dev, | |||
| 364 | return count; | 388 | return count; |
| 365 | } | 389 | } |
| 366 | 390 | ||
| 367 | /* conversion btw sampling rate and the register values */ | ||
| 368 | static int lis3_12_rates[4] = {40, 160, 640, 2560}; | ||
| 369 | static int lis3_8_rates[2] = {100, 400}; | ||
| 370 | static ssize_t lis3lv02d_rate_show(struct device *dev, | 391 | static ssize_t lis3lv02d_rate_show(struct device *dev, |
| 371 | struct device_attribute *attr, char *buf) | 392 | struct device_attribute *attr, char *buf) |
| 372 | { | 393 | { |
| 373 | u8 ctrl; | 394 | return sprintf(buf, "%d\n", lis3lv02d_get_odr()); |
| 374 | int val; | ||
| 375 | |||
| 376 | lis3_dev.read(&lis3_dev, CTRL_REG1, &ctrl); | ||
| 377 | |||
| 378 | if (lis3_dev.whoami == WAI_12B) | ||
| 379 | val = lis3_12_rates[(ctrl & (CTRL1_DF0 | CTRL1_DF1)) >> 4]; | ||
| 380 | else | ||
| 381 | val = lis3_8_rates[(ctrl & CTRL1_DR) >> 7]; | ||
| 382 | |||
| 383 | return sprintf(buf, "%d\n", val); | ||
| 384 | } | 395 | } |
| 385 | 396 | ||
| 386 | static DEVICE_ATTR(position, S_IRUGO, lis3lv02d_position_show, NULL); | 397 | static DEVICE_ATTR(position, S_IRUGO, lis3lv02d_position_show, NULL); |
| @@ -430,11 +441,13 @@ int lis3lv02d_init_device(struct lis3lv02d *dev) | |||
| 430 | printk(KERN_INFO DRIVER_NAME ": 12 bits sensor found\n"); | 441 | printk(KERN_INFO DRIVER_NAME ": 12 bits sensor found\n"); |
| 431 | dev->read_data = lis3lv02d_read_12; | 442 | dev->read_data = lis3lv02d_read_12; |
| 432 | dev->mdps_max_val = 2048; | 443 | dev->mdps_max_val = 2048; |
| 444 | dev->pwron_delay = LIS3_PWRON_DELAY_WAI_12B; | ||
| 433 | break; | 445 | break; |
| 434 | case WAI_8B: | 446 | case WAI_8B: |
| 435 | printk(KERN_INFO DRIVER_NAME ": 8 bits sensor found\n"); | 447 | printk(KERN_INFO DRIVER_NAME ": 8 bits sensor found\n"); |
| 436 | dev->read_data = lis3lv02d_read_8; | 448 | dev->read_data = lis3lv02d_read_8; |
| 437 | dev->mdps_max_val = 128; | 449 | dev->mdps_max_val = 128; |
| 450 | dev->pwron_delay = LIS3_PWRON_DELAY_WAI_8B; | ||
| 438 | break; | 451 | break; |
| 439 | default: | 452 | default: |
| 440 | printk(KERN_ERR DRIVER_NAME | 453 | printk(KERN_ERR DRIVER_NAME |
diff --git a/drivers/hwmon/lis3lv02d.h b/drivers/hwmon/lis3lv02d.h index c6ae507e4f1e..c57f21f45676 100644 --- a/drivers/hwmon/lis3lv02d.h +++ b/drivers/hwmon/lis3lv02d.h | |||
| @@ -202,6 +202,7 @@ struct lis3lv02d { | |||
| 202 | u8 whoami; /* indicates measurement precision */ | 202 | u8 whoami; /* indicates measurement precision */ |
| 203 | s16 (*read_data) (struct lis3lv02d *lis3, int reg); | 203 | s16 (*read_data) (struct lis3lv02d *lis3, int reg); |
| 204 | int mdps_max_val; | 204 | int mdps_max_val; |
| 205 | int pwron_delay; | ||
| 205 | 206 | ||
| 206 | struct input_polled_dev *idev; /* input device */ | 207 | struct input_polled_dev *idev; /* input device */ |
| 207 | struct platform_device *pdev; /* platform device */ | 208 | struct platform_device *pdev; /* platform device */ |
