1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/module.h>
24#include <linux/kernel.h>
25#include <linux/slab.h>
26#include <linux/i2c.h>
27#include <linux/err.h>
28#include <linux/mutex.h>
29#include <linux/delay.h>
30
31#include <linux/gpio.h>
32
33#include "../iio.h"
34#include "../sysfs.h"
35
36
37
38
39#define AK8975_REG_WIA 0x00
40#define AK8975_DEVICE_ID 0x48
41
42#define AK8975_REG_INFO 0x01
43
44#define AK8975_REG_ST1 0x02
45#define AK8975_REG_ST1_DRDY_SHIFT 0
46#define AK8975_REG_ST1_DRDY_MASK (1 << AK8975_REG_ST1_DRDY_SHIFT)
47
48#define AK8975_REG_HXL 0x03
49#define AK8975_REG_HXH 0x04
50#define AK8975_REG_HYL 0x05
51#define AK8975_REG_HYH 0x06
52#define AK8975_REG_HZL 0x07
53#define AK8975_REG_HZH 0x08
54#define AK8975_REG_ST2 0x09
55#define AK8975_REG_ST2_DERR_SHIFT 2
56#define AK8975_REG_ST2_DERR_MASK (1 << AK8975_REG_ST2_DERR_SHIFT)
57
58#define AK8975_REG_ST2_HOFL_SHIFT 3
59#define AK8975_REG_ST2_HOFL_MASK (1 << AK8975_REG_ST2_HOFL_SHIFT)
60
61#define AK8975_REG_CNTL 0x0A
62#define AK8975_REG_CNTL_MODE_SHIFT 0
63#define AK8975_REG_CNTL_MODE_MASK (0xF << AK8975_REG_CNTL_MODE_SHIFT)
64#define AK8975_REG_CNTL_MODE_POWER_DOWN 0
65#define AK8975_REG_CNTL_MODE_ONCE 1
66#define AK8975_REG_CNTL_MODE_SELF_TEST 8
67#define AK8975_REG_CNTL_MODE_FUSE_ROM 0xF
68
69#define AK8975_REG_RSVC 0x0B
70#define AK8975_REG_ASTC 0x0C
71#define AK8975_REG_TS1 0x0D
72#define AK8975_REG_TS2 0x0E
73#define AK8975_REG_I2CDIS 0x0F
74#define AK8975_REG_ASAX 0x10
75#define AK8975_REG_ASAY 0x11
76#define AK8975_REG_ASAZ 0x12
77
78#define AK8975_MAX_REGS AK8975_REG_ASAZ
79
80
81
82
83#define AK8975_MAX_CONVERSION_TIMEOUT 500
84#define AK8975_CONVERSION_DONE_POLL_TIME 10
85
86
87
88
89struct ak8975_data {
90 struct i2c_client *client;
91 struct attribute_group attrs;
92 struct mutex lock;
93 u8 asa[3];
94 long raw_to_gauss[3];
95 bool mode;
96 u8 reg_cache[AK8975_MAX_REGS];
97 int eoc_gpio;
98 int eoc_irq;
99};
100
101static const int ak8975_index_to_reg[] = {
102 AK8975_REG_HXL, AK8975_REG_HYL, AK8975_REG_HZL,
103};
104
105
106
107
108static int ak8975_write_data(struct i2c_client *client,
109 u8 reg, u8 val, u8 mask, u8 shift)
110{
111 struct ak8975_data *data = i2c_get_clientdata(client);
112 u8 regval;
113 int ret;
114
115 regval = (data->reg_cache[reg] & ~mask) | (val << shift);
116 ret = i2c_smbus_write_byte_data(client, reg, regval);
117 if (ret < 0) {
118 dev_err(&client->dev, "Write to device fails status %x\n", ret);
119 return ret;
120 }
121 data->reg_cache[reg] = regval;
122
123 return 0;
124}
125
126
127
128
129static int ak8975_read_data(struct i2c_client *client,
130 u8 reg, u8 length, u8 *buffer)
131{
132 int ret;
133 struct i2c_msg msg[2] = {
134 {
135 .addr = client->addr,
136 .flags = I2C_M_NOSTART,
137 .len = 1,
138 .buf = ®,
139 }, {
140 .addr = client->addr,
141 .flags = I2C_M_RD,
142 .len = length,
143 .buf = buffer,
144 }
145 };
146
147 ret = i2c_transfer(client->adapter, msg, 2);
148 if (ret < 0) {
149 dev_err(&client->dev, "Read from device fails\n");
150 return ret;
151 }
152
153 return 0;
154}
155
156
157
158
159
160static int ak8975_setup(struct i2c_client *client)
161{
162 struct ak8975_data *data = i2c_get_clientdata(client);
163 u8 device_id;
164 int ret;
165
166
167 ret = ak8975_read_data(client, AK8975_REG_WIA, 1, &device_id);
168 if (ret < 0) {
169 dev_err(&client->dev, "Error reading WIA\n");
170 return ret;
171 }
172 if (device_id != AK8975_DEVICE_ID) {
173 dev_err(&client->dev, "Device ak8975 not found\n");
174 return -ENODEV;
175 }
176
177
178 ret = ak8975_write_data(client,
179 AK8975_REG_CNTL,
180 AK8975_REG_CNTL_MODE_FUSE_ROM,
181 AK8975_REG_CNTL_MODE_MASK,
182 AK8975_REG_CNTL_MODE_SHIFT);
183 if (ret < 0) {
184 dev_err(&client->dev, "Error in setting fuse access mode\n");
185 return ret;
186 }
187
188
189 ret = ak8975_read_data(client, AK8975_REG_ASAX, 3, data->asa);
190 if (ret < 0) {
191 dev_err(&client->dev, "Not able to read asa data\n");
192 return ret;
193 }
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230 data->raw_to_gauss[0] = ((data->asa[0] + 128) * 30) >> 8;
231 data->raw_to_gauss[1] = ((data->asa[1] + 128) * 30) >> 8;
232 data->raw_to_gauss[2] = ((data->asa[2] + 128) * 30) >> 8;
233
234 return 0;
235}
236
237
238
239
240static ssize_t show_mode(struct device *dev, struct device_attribute *devattr,
241 char *buf)
242{
243 struct iio_dev *indio_dev = dev_get_drvdata(dev);
244 struct ak8975_data *data = iio_priv(indio_dev);
245
246 return sprintf(buf, "%u\n", data->mode);
247}
248
249
250
251
252
253static ssize_t store_mode(struct device *dev, struct device_attribute *devattr,
254 const char *buf, size_t count)
255{
256 struct iio_dev *indio_dev = dev_get_drvdata(dev);
257 struct ak8975_data *data = iio_priv(indio_dev);
258 struct i2c_client *client = data->client;
259 bool value;
260 int ret;
261
262
263
264 ret = strtobool(buf, &value);
265 if (ret < 0)
266 return ret;
267
268 mutex_lock(&data->lock);
269
270
271 if (data->mode != value) {
272 ret = ak8975_write_data(client,
273 AK8975_REG_CNTL,
274 (u8)value,
275 AK8975_REG_CNTL_MODE_MASK,
276 AK8975_REG_CNTL_MODE_SHIFT);
277
278 if (ret < 0) {
279 dev_err(&client->dev, "Error in setting mode\n");
280 mutex_unlock(&data->lock);
281 return ret;
282 }
283 data->mode = value;
284 }
285
286 mutex_unlock(&data->lock);
287
288 return count;
289}
290
291static int wait_conversion_complete_gpio(struct ak8975_data *data)
292{
293 struct i2c_client *client = data->client;
294 u8 read_status;
295 u32 timeout_ms = AK8975_MAX_CONVERSION_TIMEOUT;
296 int ret;
297
298
299 while (timeout_ms) {
300 msleep(AK8975_CONVERSION_DONE_POLL_TIME);
301 if (gpio_get_value(data->eoc_gpio))
302 break;
303 timeout_ms -= AK8975_CONVERSION_DONE_POLL_TIME;
304 }
305 if (!timeout_ms) {
306 dev_err(&client->dev, "Conversion timeout happened\n");
307 return -EINVAL;
308 }
309
310 ret = ak8975_read_data(client, AK8975_REG_ST1, 1, &read_status);
311 if (ret < 0) {
312 dev_err(&client->dev, "Error in reading ST1\n");
313 return ret;
314 }
315 return read_status;
316}
317
318static int wait_conversion_complete_polled(struct ak8975_data *data)
319{
320 struct i2c_client *client = data->client;
321 u8 read_status;
322 u32 timeout_ms = AK8975_MAX_CONVERSION_TIMEOUT;
323 int ret;
324
325
326 while (timeout_ms) {
327 msleep(AK8975_CONVERSION_DONE_POLL_TIME);
328 ret = ak8975_read_data(client, AK8975_REG_ST1, 1, &read_status);
329 if (ret < 0) {
330 dev_err(&client->dev, "Error in reading ST1\n");
331 return ret;
332 }
333 if (read_status)
334 break;
335 timeout_ms -= AK8975_CONVERSION_DONE_POLL_TIME;
336 }
337 if (!timeout_ms) {
338 dev_err(&client->dev, "Conversion timeout happened\n");
339 return -EINVAL;
340 }
341 return read_status;
342}
343
344
345
346
347static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
348{
349 struct ak8975_data *data = iio_priv(indio_dev);
350 struct i2c_client *client = data->client;
351 u16 meas_reg;
352 s16 raw;
353 u8 read_status;
354 int ret;
355
356 mutex_lock(&data->lock);
357
358 if (data->mode == 0) {
359 dev_err(&client->dev, "Operating mode is in power down mode\n");
360 ret = -EBUSY;
361 goto exit;
362 }
363
364
365 ret = ak8975_write_data(client,
366 AK8975_REG_CNTL,
367 AK8975_REG_CNTL_MODE_ONCE,
368 AK8975_REG_CNTL_MODE_MASK,
369 AK8975_REG_CNTL_MODE_SHIFT);
370 if (ret < 0) {
371 dev_err(&client->dev, "Error in setting operating mode\n");
372 goto exit;
373 }
374
375
376 if (gpio_is_valid(data->eoc_gpio))
377 ret = wait_conversion_complete_gpio(data);
378 else
379 ret = wait_conversion_complete_polled(data);
380 if (ret < 0)
381 goto exit;
382
383 read_status = ret;
384
385 if (read_status & AK8975_REG_ST1_DRDY_MASK) {
386 ret = ak8975_read_data(client, AK8975_REG_ST2, 1, &read_status);
387 if (ret < 0) {
388 dev_err(&client->dev, "Error in reading ST2\n");
389 goto exit;
390 }
391 if (read_status & (AK8975_REG_ST2_DERR_MASK |
392 AK8975_REG_ST2_HOFL_MASK)) {
393 dev_err(&client->dev, "ST2 status error 0x%x\n",
394 read_status);
395 ret = -EINVAL;
396 goto exit;
397 }
398 }
399
400
401
402 ret = ak8975_read_data(client, ak8975_index_to_reg[index],
403 2, (u8 *)&meas_reg);
404 if (ret < 0) {
405 dev_err(&client->dev, "Read axis data fails\n");
406 goto exit;
407 }
408
409 mutex_unlock(&data->lock);
410
411
412 raw = (s16) (le16_to_cpu(meas_reg));
413
414
415 raw = clamp_t(s16, raw, -4096, 4095);
416 *val = raw;
417 return IIO_VAL_INT;
418
419exit:
420 mutex_unlock(&data->lock);
421 return ret;
422}
423
424static int ak8975_read_raw(struct iio_dev *indio_dev,
425 struct iio_chan_spec const *chan,
426 int *val, int *val2,
427 long mask)
428{
429 struct ak8975_data *data = iio_priv(indio_dev);
430
431 switch (mask) {
432 case 0:
433 return ak8975_read_axis(indio_dev, chan->address, val);
434 case IIO_CHAN_INFO_SCALE:
435 *val = data->raw_to_gauss[chan->address];
436 return IIO_VAL_INT;
437 }
438 return -EINVAL;
439}
440
441#define AK8975_CHANNEL(axis, index) \
442 { \
443 .type = IIO_MAGN, \
444 .modified = 1, \
445 .channel2 = IIO_MOD_##axis, \
446 .info_mask = IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \
447 .address = index, \
448 }
449
450static const struct iio_chan_spec ak8975_channels[] = {
451 AK8975_CHANNEL(X, 0), AK8975_CHANNEL(Y, 1), AK8975_CHANNEL(Z, 2),
452};
453
454static IIO_DEVICE_ATTR(mode, S_IRUGO | S_IWUSR, show_mode, store_mode, 0);
455
456static struct attribute *ak8975_attr[] = {
457 &iio_dev_attr_mode.dev_attr.attr,
458 NULL
459};
460
461static struct attribute_group ak8975_attr_group = {
462 .attrs = ak8975_attr,
463};
464
465static const struct iio_info ak8975_info = {
466 .attrs = &ak8975_attr_group,
467 .read_raw = &ak8975_read_raw,
468 .driver_module = THIS_MODULE,
469};
470
471static int ak8975_probe(struct i2c_client *client,
472 const struct i2c_device_id *id)
473{
474 struct ak8975_data *data;
475 struct iio_dev *indio_dev;
476 int eoc_gpio;
477 int err;
478
479
480 if (client->dev.platform_data == NULL)
481 eoc_gpio = -1;
482 else
483 eoc_gpio = *(int *)(client->dev.platform_data);
484
485
486
487 if (gpio_is_valid(eoc_gpio)) {
488 err = gpio_request(eoc_gpio, "ak_8975");
489 if (err < 0) {
490 dev_err(&client->dev,
491 "failed to request GPIO %d, error %d\n",
492 eoc_gpio, err);
493 goto exit;
494 }
495
496 err = gpio_direction_input(eoc_gpio);
497 if (err < 0) {
498 dev_err(&client->dev,
499 "Failed to configure input direction for GPIO %d, error %d\n",
500 eoc_gpio, err);
501 goto exit_gpio;
502 }
503 }
504
505
506 indio_dev = iio_allocate_device(sizeof(*data));
507 if (indio_dev == NULL) {
508 err = -ENOMEM;
509 goto exit_gpio;
510 }
511 data = iio_priv(indio_dev);
512
513 err = ak8975_setup(client);
514 if (err < 0) {
515 dev_err(&client->dev, "AK8975 initialization fails\n");
516 goto exit_free_iio;
517 }
518
519 i2c_set_clientdata(client, indio_dev);
520 data->client = client;
521 mutex_init(&data->lock);
522 data->eoc_irq = client->irq;
523 data->eoc_gpio = eoc_gpio;
524 indio_dev->dev.parent = &client->dev;
525 indio_dev->channels = ak8975_channels;
526 indio_dev->num_channels = ARRAY_SIZE(ak8975_channels);
527 indio_dev->info = &ak8975_info;
528 indio_dev->modes = INDIO_DIRECT_MODE;
529
530 err = iio_device_register(indio_dev);
531 if (err < 0)
532 goto exit_free_iio;
533
534 return 0;
535
536exit_free_iio:
537 iio_free_device(indio_dev);
538exit_gpio:
539 if (gpio_is_valid(eoc_gpio))
540 gpio_free(eoc_gpio);
541exit:
542 return err;
543}
544
545static int ak8975_remove(struct i2c_client *client)
546{
547 struct iio_dev *indio_dev = i2c_get_clientdata(client);
548 struct ak8975_data *data = iio_priv(indio_dev);
549
550 iio_device_unregister(indio_dev);
551
552 if (gpio_is_valid(data->eoc_gpio))
553 gpio_free(data->eoc_gpio);
554
555 iio_free_device(indio_dev);
556
557 return 0;
558}
559
560static const struct i2c_device_id ak8975_id[] = {
561 {"ak8975", 0},
562 {}
563};
564
565MODULE_DEVICE_TABLE(i2c, ak8975_id);
566
567static struct i2c_driver ak8975_driver = {
568 .driver = {
569 .name = "ak8975",
570 },
571 .probe = ak8975_probe,
572 .remove = __devexit_p(ak8975_remove),
573 .id_table = ak8975_id,
574};
575module_i2c_driver(ak8975_driver);
576
577MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
578MODULE_DESCRIPTION("AK8975 magnetometer driver");
579MODULE_LICENSE("GPL");
580