2 * ADXRS450 Digital Output Gyroscope Driver
4 * Copyright 2011 Analog Devices Inc.
6 * Licensed under the GPL-2.
9 #include <linux/interrupt.h>
10 #include <linux/irq.h>
11 #include <linux/gpio.h>
12 #include <linux/delay.h>
13 #include <linux/mutex.h>
14 #include <linux/device.h>
15 #include <linux/kernel.h>
16 #include <linux/spi/spi.h>
17 #include <linux/slab.h>
18 #include <linux/sysfs.h>
19 #include <linux/list.h>
24 #include "../adc/adc.h"
29 * adxrs450_spi_read_reg_16() - read 2 bytes from a register pair
30 * @dev: device associated with child of actual iio_dev
31 * @reg_address: the address of the lower of the two registers,which should be an even address,
32 * Second register's address is reg_address + 1.
33 * @val: somewhere to pass back the value read
35 static int adxrs450_spi_read_reg_16(struct device
*dev
,
39 struct spi_message msg
;
40 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
41 struct adxrs450_state
*st
= iio_dev_get_devdata(indio_dev
);
43 struct spi_transfer xfers
[] = {
56 mutex_lock(&st
->buf_lock
);
57 st
->tx
[0] = ADXRS450_READ_DATA
| (reg_address
>> 7);
58 st
->tx
[1] = reg_address
<< 1;
62 spi_message_init(&msg
);
63 spi_message_add_tail(&xfers
[0], &msg
);
64 spi_message_add_tail(&xfers
[1], &msg
);
65 ret
= spi_sync(st
->us
, &msg
);
67 dev_err(&st
->us
->dev
, "problem while reading 16 bit register 0x%02x\n",
72 *val
= (be32_to_cpu(*(u32
*)st
->rx
) >> 5) & 0xFFFF;
75 mutex_unlock(&st
->buf_lock
);
80 * adxrs450_spi_write_reg_16() - write 2 bytes data to a register pair
81 * @dev: device associated with child of actual actual iio_dev
82 * @reg_address: the address of the lower of the two registers,which should be an even address,
83 * Second register's address is reg_address + 1.
84 * @val: value to be written.
86 static int adxrs450_spi_write_reg_16(struct device
*dev
,
90 struct spi_message msg
;
91 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
92 struct adxrs450_state
*st
= iio_dev_get_devdata(indio_dev
);
94 struct spi_transfer xfers
= {
101 mutex_lock(&st
->buf_lock
);
102 st
->tx
[0] = ADXRS450_WRITE_DATA
| reg_address
>> 7;
103 st
->tx
[1] = reg_address
<< 1 | val
>> 15;
104 st
->tx
[2] = val
>> 7;
105 st
->tx
[3] = val
<< 1;
106 spi_message_init(&msg
);
107 spi_message_add_tail(&xfers
, &msg
);
108 ret
= spi_sync(st
->us
, &msg
);
110 dev_err(&st
->us
->dev
, "problem while writing 16 bit register 0x%02x\n",
112 mutex_unlock(&st
->buf_lock
);
117 * adxrs450_spi_sensor_data() - read 2 bytes sensor data
118 * @dev: device associated with child of actual iio_dev
119 * @val: somewhere to pass back the value read
121 static int adxrs450_spi_sensor_data(struct device
*dev
, u16
*val
)
123 struct spi_message msg
;
124 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
125 struct adxrs450_state
*st
= iio_dev_get_devdata(indio_dev
);
127 struct spi_transfer xfers
[] = {
140 mutex_lock(&st
->buf_lock
);
141 st
->tx
[0] = ADXRS450_SENSOR_DATA
;
146 spi_message_init(&msg
);
147 spi_message_add_tail(&xfers
[0], &msg
);
148 spi_message_add_tail(&xfers
[1], &msg
);
149 ret
= spi_sync(st
->us
, &msg
);
151 dev_err(&st
->us
->dev
, "Problem while reading sensor data\n");
155 *val
= (be32_to_cpu(*(u32
*)st
->rx
) >> 10) & 0xFFFF;
158 mutex_unlock(&st
->buf_lock
);
163 * adxrs450_spi_initial() - use for initializing procedure.
164 * @st: device instance specific data
165 * @val: somewhere to pass back the value read
167 static int adxrs450_spi_initial(struct adxrs450_state
*st
,
170 struct spi_message msg
;
172 struct spi_transfer xfers
= {
179 mutex_lock(&st
->buf_lock
);
180 st
->tx
[0] = ADXRS450_SENSOR_DATA
;
185 st
->tx
[3] |= (ADXRS450_CHK
| ADXRS450_P
);
186 spi_message_init(&msg
);
187 spi_message_add_tail(&xfers
, &msg
);
188 ret
= spi_sync(st
->us
, &msg
);
190 dev_err(&st
->us
->dev
, "Problem while reading initializing data\n");
194 *val
= be32_to_cpu(*(u32
*)st
->rx
);
197 mutex_unlock(&st
->buf_lock
);
201 static ssize_t
adxrs450_read_temp(struct device
*dev
,
202 struct device_attribute
*attr
,
207 ret
= adxrs450_spi_read_reg_16(dev
,
212 return sprintf(buf
, "%d\n", t
);
215 static ssize_t
adxrs450_read_quad(struct device
*dev
,
216 struct device_attribute
*attr
,
221 ret
= adxrs450_spi_read_reg_16(dev
,
226 return sprintf(buf
, "%d\n", t
);
229 static ssize_t
adxrs450_write_dnc(struct device
*dev
,
230 struct device_attribute
*attr
,
237 ret
= strict_strtol(buf
, 10, &val
);
240 ret
= adxrs450_spi_write_reg_16(dev
,
244 return ret
? ret
: len
;
247 static ssize_t
adxrs450_read_sensor_data(struct device
*dev
,
248 struct device_attribute
*attr
,
254 ret
= adxrs450_spi_sensor_data(dev
, &t
);
258 return sprintf(buf
, "%d\n", t
);
261 /* Recommended Startup Sequence by spec */
262 static int adxrs450_initial_setup(struct adxrs450_state
*st
)
267 struct device
*dev
= &st
->indio_dev
->dev
;
269 msleep(ADXRS450_STARTUP_DELAY
*2);
270 ret
= adxrs450_spi_initial(st
, &t
, 1);
274 dev_err(&st
->us
->dev
, "The initial response is not correct!\n");
279 msleep(ADXRS450_STARTUP_DELAY
);
280 ret
= adxrs450_spi_initial(st
, &t
, 0);
284 msleep(ADXRS450_STARTUP_DELAY
);
285 ret
= adxrs450_spi_initial(st
, &t
, 0);
288 if (((t
& 0xff) | 0x01) != 0xff || ADXRS450_GET_ST(t
) != 2) {
289 dev_err(&st
->us
->dev
, "The second response is not correct!\n");
293 ret
= adxrs450_spi_initial(st
, &t
, 0);
296 if (((t
& 0xff) | 0x01) != 0xff || ADXRS450_GET_ST(t
) != 2) {
297 dev_err(&st
->us
->dev
, "The third response is not correct!\n");
301 ret
= adxrs450_spi_read_reg_16(dev
, ADXRS450_FAULT1
, &data
);
305 dev_err(&st
->us
->dev
, "The device is not in normal status!\n");
308 ret
= adxrs450_spi_read_reg_16(dev
, ADXRS450_PID1
, &data
);
311 dev_info(&st
->us
->dev
, "The Part ID is 0x%x\n", data
);
313 ret
= adxrs450_spi_read_reg_16(dev
, ADXRS450_SNL
, &data
);
317 ret
= adxrs450_spi_read_reg_16(dev
, ADXRS450_SNH
, &data
);
321 dev_info(&st
->us
->dev
, "The Serial Number is 0x%x\n", t
);
326 static IIO_DEV_ATTR_GYRO_Z(adxrs450_read_sensor_data
, 0);
327 static IIO_DEV_ATTR_TEMP_RAW(adxrs450_read_temp
);
328 static IIO_DEV_ATTR_GYRO_Z_QUADRATURE_CORRECTION(adxrs450_read_quad
, 0);
329 static IIO_DEV_ATTR_GYRO_Z_CALIBBIAS(S_IWUSR
,
330 NULL
, adxrs450_write_dnc
, 0);
331 static IIO_CONST_ATTR(name
, "adxrs450");
333 static struct attribute
*adxrs450_attributes
[] = {
334 &iio_dev_attr_gyro_z_raw
.dev_attr
.attr
,
335 &iio_dev_attr_temp_raw
.dev_attr
.attr
,
336 &iio_dev_attr_gyro_z_quadrature_correction_raw
.dev_attr
.attr
,
337 &iio_dev_attr_gyro_z_calibbias
.dev_attr
.attr
,
338 &iio_const_attr_name
.dev_attr
.attr
,
342 static const struct attribute_group adxrs450_attribute_group
= {
343 .attrs
= adxrs450_attributes
,
346 static int __devinit
adxrs450_probe(struct spi_device
*spi
)
348 int ret
, regdone
= 0;
349 struct adxrs450_state
*st
= kzalloc(sizeof *st
, GFP_KERNEL
);
354 /* This is only used for removal purposes */
355 spi_set_drvdata(spi
, st
);
357 /* Allocate the comms buffers */
358 st
->rx
= kzalloc(sizeof(*st
->rx
)*ADXRS450_MAX_RX
, GFP_KERNEL
);
359 if (st
->rx
== NULL
) {
363 st
->tx
= kzalloc(sizeof(*st
->tx
)*ADXRS450_MAX_TX
, GFP_KERNEL
);
364 if (st
->tx
== NULL
) {
369 mutex_init(&st
->buf_lock
);
370 /* setup the industrialio driver allocated elements */
371 st
->indio_dev
= iio_allocate_device(0);
372 if (st
->indio_dev
== NULL
) {
377 st
->indio_dev
->dev
.parent
= &spi
->dev
;
378 st
->indio_dev
->attrs
= &adxrs450_attribute_group
;
379 st
->indio_dev
->dev_data
= (void *)(st
);
380 st
->indio_dev
->driver_module
= THIS_MODULE
;
381 st
->indio_dev
->modes
= INDIO_DIRECT_MODE
;
383 ret
= iio_device_register(st
->indio_dev
);
388 /* Get the device into a sane initial state */
389 ret
= adxrs450_initial_setup(st
);
397 iio_device_unregister(st
->indio_dev
);
399 iio_free_device(st
->indio_dev
);
410 static int adxrs450_remove(struct spi_device
*spi
)
412 struct adxrs450_state
*st
= spi_get_drvdata(spi
);
414 iio_device_unregister(st
->indio_dev
);
422 static struct spi_driver adxrs450_driver
= {
425 .owner
= THIS_MODULE
,
427 .probe
= adxrs450_probe
,
428 .remove
= __devexit_p(adxrs450_remove
),
431 static __init
int adxrs450_init(void)
433 return spi_register_driver(&adxrs450_driver
);
435 module_init(adxrs450_init
);
437 static __exit
void adxrs450_exit(void)
439 spi_unregister_driver(&adxrs450_driver
);
441 module_exit(adxrs450_exit
);
443 MODULE_AUTHOR("Cliff Cai <cliff.cai@xxxxxxxxxx>");
444 MODULE_DESCRIPTION("Analog Devices ADXRS450 Gyroscope SPI driver");
445 MODULE_LICENSE("GPL v2");