aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/iio/magnetometer/hmc5843.c
diff options
context:
space:
mode:
authorPeter Meerwald <pmeerw@pmeerw.net>2012-05-16 20:28:08 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-17 11:24:55 -0400
commit13f6eb69b15beeeaa720293c1281a14413363876 (patch)
tree05e8e3fb1a7152af198c406e57a3fe2d07676852 /drivers/staging/iio/magnetometer/hmc5843.c
parent64255031bde68bd0f7ec934b83842619d513cf91 (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.c51
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
337static 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
345static ssize_t set_sampling_frequency(struct device *dev, 352static 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;