diff options
author | Peter Meerwald <pmeerw@pmeerw.net> | 2012-05-16 20:28:08 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-05-17 11:24:55 -0400 |
commit | 13f6eb69b15beeeaa720293c1281a14413363876 (patch) | |
tree | 05e8e3fb1a7152af198c406e57a3fe2d07676852 /drivers/staging/iio/magnetometer/hmc5843.c | |
parent | 64255031bde68bd0f7ec934b83842619d513cf91 (diff) |
staging: iio: rework sampling rate setting in hmc5843
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/iio/magnetometer/hmc5843.c')
-rw-r--r-- | drivers/staging/iio/magnetometer/hmc5843.c | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c index 27c5521b4e2..cf2bab84871 100644 --- a/drivers/staging/iio/magnetometer/hmc5843.c +++ b/drivers/staging/iio/magnetometer/hmc5843.c | |||
@@ -85,14 +85,6 @@ | |||
85 | */ | 85 | */ |
86 | #define HMC5843_RATE_OFFSET 0x02 | 86 | #define HMC5843_RATE_OFFSET 0x02 |
87 | #define HMC5843_RATE_BITMASK 0x1C | 87 | #define HMC5843_RATE_BITMASK 0x1C |
88 | #define RATE_5 0x00 | ||
89 | #define RATE_10 0x01 | ||
90 | #define RATE_20 0x02 | ||
91 | #define RATE_50 0x03 | ||
92 | #define RATE_100 0x04 | ||
93 | #define RATE_200 0x05 | ||
94 | #define RATE_500 0x06 | ||
95 | |||
96 | #define HMC5843_RATE_NOT_USED 0x07 | 88 | #define HMC5843_RATE_NOT_USED 0x07 |
97 | 89 | ||
98 | /* | 90 | /* |
@@ -342,6 +334,21 @@ static s32 hmc5843_set_rate(struct i2c_client *client, | |||
342 | return i2c_smbus_write_byte_data(client, HMC5843_CONFIG_REG_A, reg_val); | 334 | return i2c_smbus_write_byte_data(client, HMC5843_CONFIG_REG_A, reg_val); |
343 | } | 335 | } |
344 | 336 | ||
337 | static int hmc5843_check_sampling_frequency(struct hmc5843_data *data, | ||
338 | const char *buf) | ||
339 | { | ||
340 | const char * const *samp_freq = regval_to_samp_freq; | ||
341 | int i; | ||
342 | |||
343 | for (i = 0; i < HMC5843_RATE_NOT_USED; i++) { | ||
344 | if (strncmp(buf, samp_freq[i], | ||
345 | strlen(samp_freq[i])) == 0) | ||
346 | return i; | ||
347 | } | ||
348 | |||
349 | return -EINVAL; | ||
350 | } | ||
351 | |||
345 | static ssize_t set_sampling_frequency(struct device *dev, | 352 | static ssize_t set_sampling_frequency(struct device *dev, |
346 | struct device_attribute *attr, | 353 | struct device_attribute *attr, |
347 | const char *buf, size_t count) | 354 | const char *buf, size_t count) |
@@ -350,27 +357,17 @@ static ssize_t set_sampling_frequency(struct device *dev, | |||
350 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | 357 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); |
351 | struct i2c_client *client = to_i2c_client(indio_dev->dev.parent); | 358 | struct i2c_client *client = to_i2c_client(indio_dev->dev.parent); |
352 | struct hmc5843_data *data = iio_priv(indio_dev); | 359 | struct hmc5843_data *data = iio_priv(indio_dev); |
353 | unsigned long rate = 0; | 360 | int rate; |
354 | 361 | ||
355 | if (strncmp(buf, "0.5" , 3) == 0) | 362 | rate = hmc5843_check_sampling_frequency(data, buf); |
356 | rate = RATE_5; | 363 | if (rate < 0) { |
357 | else if (strncmp(buf, "1" , 1) == 0) | 364 | dev_err(&client->dev, |
358 | rate = RATE_10; | 365 | "sampling frequency is not supported\n"); |
359 | else if (strncmp(buf, "2", 1) == 0) | 366 | return rate; |
360 | rate = RATE_20; | 367 | } |
361 | else if (strncmp(buf, "5", 1) == 0) | ||
362 | rate = RATE_50; | ||
363 | else if (strncmp(buf, "10", 2) == 0) | ||
364 | rate = RATE_100; | ||
365 | else if (strncmp(buf, "20" , 2) == 0) | ||
366 | rate = RATE_200; | ||
367 | else if (strncmp(buf, "50" , 2) == 0) | ||
368 | rate = RATE_500; | ||
369 | else | ||
370 | return -EINVAL; | ||
371 | 368 | ||
372 | mutex_lock(&data->lock); | 369 | mutex_lock(&data->lock); |
373 | dev_dbg(dev, "set rate to %lu\n", rate); | 370 | dev_dbg(dev, "set rate to %d\n", rate); |
374 | if (hmc5843_set_rate(client, rate)) { | 371 | if (hmc5843_set_rate(client, rate)) { |
375 | count = -EINVAL; | 372 | count = -EINVAL; |
376 | goto exit; | 373 | goto exit; |