diff options
author | Jonathan Cameron <jic23@cam.ac.uk> | 2011-08-12 12:47:58 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-08-23 16:32:48 -0400 |
commit | 494c6b150a3170b27b65969de83ec1ab580de701 (patch) | |
tree | 58763cd0193f79b26d5ee476dfc74e1345df82ba /drivers/staging/iio/magnetometer | |
parent | 584c81fbee8d549d68679e42fa56540cc74148da (diff) |
staging:iio:magnetometer:hmc5843 iio_chan_spec conversion.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/iio/magnetometer')
-rw-r--r-- | drivers/staging/iio/magnetometer/hmc5843.c | 96 |
1 files changed, 51 insertions, 45 deletions
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c index b44c273a91a..1bb71864d58 100644 --- a/drivers/staging/iio/magnetometer/hmc5843.c +++ b/drivers/staging/iio/magnetometer/hmc5843.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/types.h> | 24 | #include <linux/types.h> |
25 | #include "../iio.h" | 25 | #include "../iio.h" |
26 | #include "../sysfs.h" | 26 | #include "../sysfs.h" |
27 | #include "magnet.h" | ||
28 | 27 | ||
29 | #define HMC5843_I2C_ADDRESS 0x1E | 28 | #define HMC5843_I2C_ADDRESS 0x1E |
30 | 29 | ||
@@ -62,9 +61,9 @@ | |||
62 | /* | 61 | /* |
63 | * Device status | 62 | * Device status |
64 | */ | 63 | */ |
65 | #define DATA_READY 0x01 | 64 | #define DATA_READY 0x01 |
66 | #define DATA_OUTPUT_LOCK 0x02 | 65 | #define DATA_OUTPUT_LOCK 0x02 |
67 | #define VOLTAGE_REGULATOR_ENABLED 0x04 | 66 | #define VOLTAGE_REGULATOR_ENABLED 0x04 |
68 | 67 | ||
69 | /* | 68 | /* |
70 | * Mode register configuration | 69 | * Mode register configuration |
@@ -89,22 +88,16 @@ | |||
89 | /* | 88 | /* |
90 | * Device Configutration | 89 | * Device Configutration |
91 | */ | 90 | */ |
92 | #define CONF_NORMAL 0x00 | 91 | #define CONF_NORMAL 0x00 |
93 | #define CONF_POSITIVE_BIAS 0x01 | 92 | #define CONF_POSITIVE_BIAS 0x01 |
94 | #define CONF_NEGATIVE_BIAS 0x02 | 93 | #define CONF_NEGATIVE_BIAS 0x02 |
95 | #define CONF_NOT_USED 0x03 | 94 | #define CONF_NOT_USED 0x03 |
96 | #define MEAS_CONF_MASK 0x03 | 95 | #define MEAS_CONF_MASK 0x03 |
97 | 96 | ||
98 | static const char *regval_to_scale[] = { | 97 | static int hmc5843_regval_to_nanoscale[] = { |
99 | "0.0000006173", | 98 | 6173, 7692, 10309, 12821, 18868, 21739, 25641, 35714 |
100 | "0.0000007692", | ||
101 | "0.0000010309", | ||
102 | "0.0000012821", | ||
103 | "0.0000018868", | ||
104 | "0.0000021739", | ||
105 | "0.0000025641", | ||
106 | "0.0000035714", | ||
107 | }; | 99 | }; |
100 | |||
108 | static const int regval_to_input_field_mg[] = { | 101 | static const int regval_to_input_field_mg[] = { |
109 | 700, | 102 | 700, |
110 | 1000, | 103 | 1000, |
@@ -115,7 +108,7 @@ static const int regval_to_input_field_mg[] = { | |||
115 | 4500, | 108 | 4500, |
116 | 6500 | 109 | 6500 |
117 | }; | 110 | }; |
118 | static const char *regval_to_samp_freq[] = { | 111 | static const char * const regval_to_samp_freq[] = { |
119 | "0.5", | 112 | "0.5", |
120 | "1", | 113 | "1", |
121 | "2", | 114 | "2", |
@@ -150,37 +143,28 @@ static s32 hmc5843_configure(struct i2c_client *client, | |||
150 | } | 143 | } |
151 | 144 | ||
152 | /* Return the measurement value from the specified channel */ | 145 | /* Return the measurement value from the specified channel */ |
153 | static ssize_t hmc5843_read_measurement(struct device *dev, | 146 | static int hmc5843_read_measurement(struct iio_dev *indio_dev, |
154 | struct device_attribute *attr, | 147 | int address, |
155 | char *buf) | 148 | int *val) |
156 | { | 149 | { |
157 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | ||
158 | struct i2c_client *client = to_i2c_client(indio_dev->dev.parent); | 150 | struct i2c_client *client = to_i2c_client(indio_dev->dev.parent); |
159 | s16 coordinate_val; | ||
160 | struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); | ||
161 | struct hmc5843_data *data = iio_priv(indio_dev); | 151 | struct hmc5843_data *data = iio_priv(indio_dev); |
162 | s32 result; | 152 | s32 result; |
163 | 153 | ||
164 | mutex_lock(&data->lock); | 154 | mutex_lock(&data->lock); |
165 | |||
166 | result = i2c_smbus_read_byte_data(client, HMC5843_STATUS_REG); | 155 | result = i2c_smbus_read_byte_data(client, HMC5843_STATUS_REG); |
167 | while (!(result & DATA_READY)) | 156 | while (!(result & DATA_READY)) |
168 | result = i2c_smbus_read_byte_data(client, HMC5843_STATUS_REG); | 157 | result = i2c_smbus_read_byte_data(client, HMC5843_STATUS_REG); |
169 | 158 | ||
170 | result = i2c_smbus_read_word_data(client, this_attr->address); | 159 | result = i2c_smbus_read_word_data(client, address); |
171 | mutex_unlock(&data->lock); | 160 | mutex_unlock(&data->lock); |
172 | if (result < 0) | 161 | if (result < 0) |
173 | return -EINVAL; | 162 | return -EINVAL; |
174 | 163 | ||
175 | coordinate_val = (s16)swab16((u16)result); | 164 | *val = (s16)swab16((u16)result); |
176 | return sprintf(buf, "%d\n", coordinate_val); | 165 | return IIO_VAL_INT; |
177 | } | 166 | } |
178 | static IIO_DEV_ATTR_MAGN_X(hmc5843_read_measurement, | 167 | |
179 | HMC5843_DATA_OUT_X_MSB_REG); | ||
180 | static IIO_DEV_ATTR_MAGN_Y(hmc5843_read_measurement, | ||
181 | HMC5843_DATA_OUT_Y_MSB_REG); | ||
182 | static IIO_DEV_ATTR_MAGN_Z(hmc5843_read_measurement, | ||
183 | HMC5843_DATA_OUT_Z_MSB_REG); | ||
184 | 168 | ||
185 | /* | 169 | /* |
186 | * From the datasheet | 170 | * From the datasheet |
@@ -336,7 +320,7 @@ static s32 hmc5843_set_rate(struct i2c_client *client, | |||
336 | reg_val = (data->meas_conf) | (rate << RATE_OFFSET); | 320 | reg_val = (data->meas_conf) | (rate << RATE_OFFSET); |
337 | if (rate >= RATE_NOT_USED) { | 321 | if (rate >= RATE_NOT_USED) { |
338 | dev_err(&client->dev, | 322 | dev_err(&client->dev, |
339 | "This data output rate is not supported \n"); | 323 | "This data output rate is not supported\n"); |
340 | return -EINVAL; | 324 | return -EINVAL; |
341 | } | 325 | } |
342 | return i2c_smbus_write_byte_data(client, HMC5843_CONFIG_REG_A, reg_val); | 326 | return i2c_smbus_write_byte_data(client, HMC5843_CONFIG_REG_A, reg_val); |
@@ -467,28 +451,46 @@ static IIO_DEVICE_ATTR(magn_range, | |||
467 | set_range, | 451 | set_range, |
468 | HMC5843_CONFIG_REG_B); | 452 | HMC5843_CONFIG_REG_B); |
469 | 453 | ||
470 | static ssize_t show_scale(struct device *dev, | 454 | static int hmc5843_read_raw(struct iio_dev *indio_dev, |
471 | struct device_attribute *attr, | 455 | struct iio_chan_spec const *chan, |
472 | char *buf) | 456 | int *val, int *val2, |
457 | long mask) | ||
473 | { | 458 | { |
474 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | ||
475 | struct hmc5843_data *data = iio_priv(indio_dev); | 459 | struct hmc5843_data *data = iio_priv(indio_dev); |
476 | return strlen(strcpy(buf, regval_to_scale[data->range])); | 460 | |
461 | switch (mask) { | ||
462 | case 0: | ||
463 | return hmc5843_read_measurement(indio_dev, | ||
464 | chan->address, | ||
465 | val); | ||
466 | case (1 << IIO_CHAN_INFO_SCALE_SHARED): | ||
467 | *val = 0; | ||
468 | *val2 = hmc5843_regval_to_nanoscale[data->range]; | ||
469 | return IIO_VAL_INT_PLUS_NANO; | ||
470 | }; | ||
471 | return -EINVAL; | ||
477 | } | 472 | } |
478 | static IIO_DEVICE_ATTR(magn_scale, | 473 | |
479 | S_IRUGO, | 474 | #define HMC5843_CHANNEL(axis, add) \ |
480 | show_scale, | 475 | { \ |
481 | NULL , 0); | 476 | .type = IIO_MAGN, \ |
477 | .modified = 1, \ | ||
478 | .channel2 = IIO_MOD_##axis, \ | ||
479 | .info_mask = (1 << IIO_CHAN_INFO_SCALE_SHARED), \ | ||
480 | .address = add \ | ||
481 | } | ||
482 | |||
483 | static const struct iio_chan_spec hmc5843_channels[] = { | ||
484 | HMC5843_CHANNEL(X, HMC5843_DATA_OUT_X_MSB_REG), | ||
485 | HMC5843_CHANNEL(Y, HMC5843_DATA_OUT_Y_MSB_REG), | ||
486 | HMC5843_CHANNEL(Z, HMC5843_DATA_OUT_Z_MSB_REG), | ||
487 | }; | ||
482 | 488 | ||
483 | static struct attribute *hmc5843_attributes[] = { | 489 | static struct attribute *hmc5843_attributes[] = { |
484 | &iio_dev_attr_meas_conf.dev_attr.attr, | 490 | &iio_dev_attr_meas_conf.dev_attr.attr, |
485 | &iio_dev_attr_operating_mode.dev_attr.attr, | 491 | &iio_dev_attr_operating_mode.dev_attr.attr, |
486 | &iio_dev_attr_sampling_frequency.dev_attr.attr, | 492 | &iio_dev_attr_sampling_frequency.dev_attr.attr, |
487 | &iio_dev_attr_magn_range.dev_attr.attr, | 493 | &iio_dev_attr_magn_range.dev_attr.attr, |
488 | &iio_dev_attr_magn_scale.dev_attr.attr, | ||
489 | &iio_dev_attr_magn_x_raw.dev_attr.attr, | ||
490 | &iio_dev_attr_magn_y_raw.dev_attr.attr, | ||
491 | &iio_dev_attr_magn_z_raw.dev_attr.attr, | ||
492 | &iio_const_attr_sampling_frequency_available.dev_attr.attr, | 494 | &iio_const_attr_sampling_frequency_available.dev_attr.attr, |
493 | NULL | 495 | NULL |
494 | }; | 496 | }; |
@@ -530,6 +532,7 @@ static void hmc5843_init_client(struct i2c_client *client) | |||
530 | 532 | ||
531 | static const struct iio_info hmc5843_info = { | 533 | static const struct iio_info hmc5843_info = { |
532 | .attrs = &hmc5843_group, | 534 | .attrs = &hmc5843_group, |
535 | .read_raw = &hmc5843_read_raw, | ||
533 | .driver_module = THIS_MODULE, | 536 | .driver_module = THIS_MODULE, |
534 | }; | 537 | }; |
535 | 538 | ||
@@ -558,6 +561,9 @@ static int hmc5843_probe(struct i2c_client *client, | |||
558 | hmc5843_init_client(client); | 561 | hmc5843_init_client(client); |
559 | 562 | ||
560 | indio_dev->info = &hmc5843_info; | 563 | indio_dev->info = &hmc5843_info; |
564 | indio_dev->name = id->name; | ||
565 | indio_dev->channels = hmc5843_channels; | ||
566 | indio_dev->num_channels = ARRAY_SIZE(hmc5843_channels); | ||
561 | indio_dev->dev.parent = &client->dev; | 567 | indio_dev->dev.parent = &client->dev; |
562 | indio_dev->modes = INDIO_DIRECT_MODE; | 568 | indio_dev->modes = INDIO_DIRECT_MODE; |
563 | err = iio_device_register(indio_dev); | 569 | err = iio_device_register(indio_dev); |