2 * lis3l02dq.c support STMicroelectronics LISD02DQ
3 * 3d 2g Linear Accelerometers via SPI
5 * Copyright (c) 2007 Jonathan Cameron <jic23@cam.ac.uk>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 * 16 bit left justified mode used.
15 #include <linux/interrupt.h>
16 #include <linux/irq.h>
17 #include <linux/gpio.h>
18 #include <linux/workqueue.h>
19 #include <linux/mutex.h>
20 #include <linux/device.h>
21 #include <linux/kernel.h>
22 #include <linux/spi/spi.h>
23 #include <linux/slab.h>
25 #include <linux/sysfs.h>
26 #include <linux/list.h>
30 #include "../ring_generic.h"
31 #include "../ring_sw.h"
35 #include "lis3l02dq.h"
37 /* At the moment the spi framework doesn't allow global setting of cs_change.
38 * It's in the likely to be added comment at the top of spi.h.
39 * This means that use cannot be made of spi_write etc.
43 * lis3l02dq_spi_read_reg_8() - read single byte from a single register
44 * @indio_dev: iio_dev for this actual device
45 * @reg_address: the address of the register to be read
46 * @val: pass back the resulting value
48 int lis3l02dq_spi_read_reg_8(struct iio_dev *indio_dev,
49 u8 reg_address, u8 *val)
51 struct iio_sw_ring_helper_state *h = iio_dev_get_devdata(indio_dev);
52 struct lis3l02dq_state *st = lis3l02dq_h_to_s(h);
53 struct spi_message msg;
55 struct spi_transfer xfer = {
62 mutex_lock(&st->buf_lock);
63 st->tx[0] = LIS3L02DQ_READ_REG(reg_address);
66 spi_message_init(&msg);
67 spi_message_add_tail(&xfer, &msg);
68 ret = spi_sync(st->us, &msg);
70 mutex_unlock(&st->buf_lock);
76 * lis3l02dq_spi_write_reg_8() - write single byte to a register
77 * @indio_dev: iio_dev for this device
78 * @reg_address: the address of the register to be written
79 * @val: the value to write
81 int lis3l02dq_spi_write_reg_8(struct iio_dev *indio_dev,
86 struct iio_sw_ring_helper_state *h
87 = iio_dev_get_devdata(indio_dev);
88 struct lis3l02dq_state *st = lis3l02dq_h_to_s(h);
90 mutex_lock(&st->buf_lock);
91 st->tx[0] = LIS3L02DQ_WRITE_REG(reg_address);
93 ret = spi_write(st->us, st->tx, 2);
94 mutex_unlock(&st->buf_lock);
100 * lisl302dq_spi_write_reg_s16() - write 2 bytes to a pair of registers
101 * @indio_dev: iio_dev for this device
102 * @lower_reg_address: the address of the lower of the two registers.
103 * Second register is assumed to have address one greater.
104 * @value: value to be written
106 static int lis3l02dq_spi_write_reg_s16(struct iio_dev *indio_dev,
107 u8 lower_reg_address,
111 struct spi_message msg;
112 struct iio_sw_ring_helper_state *h
113 = iio_dev_get_devdata(indio_dev);
114 struct lis3l02dq_state *st = lis3l02dq_h_to_s(h);
115 struct spi_transfer xfers[] = { {
121 .tx_buf = st->tx + 2,
127 mutex_lock(&st->buf_lock);
128 st->tx[0] = LIS3L02DQ_WRITE_REG(lower_reg_address);
129 st->tx[1] = value & 0xFF;
130 st->tx[2] = LIS3L02DQ_WRITE_REG(lower_reg_address + 1);
131 st->tx[3] = (value >> 8) & 0xFF;
133 spi_message_init(&msg);
134 spi_message_add_tail(&xfers[0], &msg);
135 spi_message_add_tail(&xfers[1], &msg);
136 ret = spi_sync(st->us, &msg);
137 mutex_unlock(&st->buf_lock);
142 static int lis3l02dq_read_reg_s16(struct iio_dev *indio_dev,
143 u8 lower_reg_address,
146 struct iio_sw_ring_helper_state *h
147 = iio_dev_get_devdata(indio_dev);
148 struct lis3l02dq_state *st = lis3l02dq_h_to_s(h);
150 struct spi_message msg;
153 struct spi_transfer xfers[] = { {
160 .tx_buf = st->tx + 2,
161 .rx_buf = st->rx + 2,
167 mutex_lock(&st->buf_lock);
168 st->tx[0] = LIS3L02DQ_READ_REG(lower_reg_address);
170 st->tx[2] = LIS3L02DQ_READ_REG(lower_reg_address + 1);
173 spi_message_init(&msg);
174 spi_message_add_tail(&xfers[0], &msg);
175 spi_message_add_tail(&xfers[1], &msg);
176 ret = spi_sync(st->us, &msg);
178 dev_err(&st->us->dev, "problem when reading 16 bit register");
181 tempval = (s16)(st->rx[1]) | ((s16)(st->rx[3]) << 8);
185 mutex_unlock(&st->buf_lock);
189 enum lis3l02dq_rm_ind {
195 static u8 lis3l02dq_axis_map[3][3] = {
196 [LIS3L02DQ_ACCEL] = { LIS3L02DQ_REG_OUT_X_L_ADDR,
197 LIS3L02DQ_REG_OUT_Y_L_ADDR,
198 LIS3L02DQ_REG_OUT_Z_L_ADDR },
199 [LIS3L02DQ_GAIN] = { LIS3L02DQ_REG_GAIN_X_ADDR,
200 LIS3L02DQ_REG_GAIN_Y_ADDR,
201 LIS3L02DQ_REG_GAIN_Z_ADDR },
202 [LIS3L02DQ_BIAS] = { LIS3L02DQ_REG_OFFSET_X_ADDR,
203 LIS3L02DQ_REG_OFFSET_Y_ADDR,
204 LIS3L02DQ_REG_OFFSET_Z_ADDR }
207 static int lis3l02dq_read_thresh(struct iio_dev *indio_dev,
211 return lis3l02dq_read_reg_s16(indio_dev, LIS3L02DQ_REG_THS_L_ADDR, val);
214 static int lis3l02dq_write_thresh(struct iio_dev *indio_dev,
219 return lis3l02dq_spi_write_reg_s16(indio_dev,
220 LIS3L02DQ_REG_THS_L_ADDR,
224 static int lis3l02dq_read_raw(struct iio_dev *indio_dev,
225 struct iio_chan_spec const *chan,
237 /* Take the iio_dev status lock */
238 mutex_lock(&indio_dev->mlock);
239 if (indio_dev->currentmode == INDIO_RING_TRIGGERED)
240 ret = lis3l02dq_read_accel_from_ring(indio_dev->ring,
244 reg = lis3l02dq_axis_map
245 [LIS3L02DQ_ACCEL][chan->address];
246 ret = lis3l02dq_read_reg_s16(indio_dev, reg, val);
248 mutex_unlock(&indio_dev->mlock);
250 case (1 << IIO_CHAN_INFO_SCALE_SHARED):
253 return IIO_VAL_INT_PLUS_MICRO;
254 case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE):
255 reg = lis3l02dq_axis_map[LIS3L02DQ_GAIN][chan->address];
256 ret = lis3l02dq_spi_read_reg_8(indio_dev, reg, &utemp);
259 /* to match with what previous code does */
263 case (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE):
264 reg = lis3l02dq_axis_map[LIS3L02DQ_BIAS][chan->address];
265 ret = lis3l02dq_spi_read_reg_8(indio_dev, reg, (u8 *)&stemp);
266 /* to match with what previous code does */
274 static ssize_t lis3l02dq_read_frequency(struct device *dev,
275 struct device_attribute *attr,
278 struct iio_dev *indio_dev = dev_get_drvdata(dev);
281 ret = lis3l02dq_spi_read_reg_8(indio_dev,
282 LIS3L02DQ_REG_CTRL_1_ADDR,
286 t &= LIS3L02DQ_DEC_MASK;
288 case LIS3L02DQ_REG_CTRL_1_DF_128:
289 len = sprintf(buf, "280\n");
291 case LIS3L02DQ_REG_CTRL_1_DF_64:
292 len = sprintf(buf, "560\n");
294 case LIS3L02DQ_REG_CTRL_1_DF_32:
295 len = sprintf(buf, "1120\n");
297 case LIS3L02DQ_REG_CTRL_1_DF_8:
298 len = sprintf(buf, "4480\n");
304 static ssize_t lis3l02dq_write_frequency(struct device *dev,
305 struct device_attribute *attr,
309 struct iio_dev *indio_dev = dev_get_drvdata(dev);
314 ret = strict_strtol(buf, 10, &val);
318 mutex_lock(&indio_dev->mlock);
319 ret = lis3l02dq_spi_read_reg_8(indio_dev,
320 LIS3L02DQ_REG_CTRL_1_ADDR,
323 goto error_ret_mutex;
324 /* Wipe the bits clean */
325 t &= ~LIS3L02DQ_DEC_MASK;
328 t |= LIS3L02DQ_REG_CTRL_1_DF_128;
331 t |= LIS3L02DQ_REG_CTRL_1_DF_64;
334 t |= LIS3L02DQ_REG_CTRL_1_DF_32;
337 t |= LIS3L02DQ_REG_CTRL_1_DF_8;
341 goto error_ret_mutex;
344 ret = lis3l02dq_spi_write_reg_8(indio_dev,
345 LIS3L02DQ_REG_CTRL_1_ADDR,
349 mutex_unlock(&indio_dev->mlock);
351 return ret ? ret : len;
354 static int lis3l02dq_initial_setup(struct lis3l02dq_state *st)
359 st->us->mode = SPI_MODE_3;
363 val = LIS3L02DQ_DEFAULT_CTRL1;
364 /* Write suitable defaults to ctrl1 */
365 ret = lis3l02dq_spi_write_reg_8(st->help.indio_dev,
366 LIS3L02DQ_REG_CTRL_1_ADDR,
369 dev_err(&st->us->dev, "problem with setup control register 1");
372 /* Repeat as sometimes doesn't work first time?*/
373 ret = lis3l02dq_spi_write_reg_8(st->help.indio_dev,
374 LIS3L02DQ_REG_CTRL_1_ADDR,
377 dev_err(&st->us->dev, "problem with setup control register 1");
381 /* Read back to check this has worked acts as loose test of correct
383 ret = lis3l02dq_spi_read_reg_8(st->help.indio_dev,
384 LIS3L02DQ_REG_CTRL_1_ADDR,
386 if (ret || (valtest != val)) {
387 dev_err(&st->help.indio_dev->dev,
388 "device not playing ball %d %d\n", valtest, val);
393 val = LIS3L02DQ_DEFAULT_CTRL2;
394 ret = lis3l02dq_spi_write_reg_8(st->help.indio_dev,
395 LIS3L02DQ_REG_CTRL_2_ADDR,
398 dev_err(&st->us->dev, "problem with setup control register 2");
402 val = LIS3L02DQ_REG_WAKE_UP_CFG_LATCH_SRC;
403 ret = lis3l02dq_spi_write_reg_8(st->help.indio_dev,
404 LIS3L02DQ_REG_WAKE_UP_CFG_ADDR,
407 dev_err(&st->us->dev, "problem with interrupt cfg register");
413 static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
414 lis3l02dq_read_frequency,
415 lis3l02dq_write_frequency);
417 static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("280 560 1120 4480");
419 static irqreturn_t lis3l02dq_event_handler(int irq, void *_int_info)
421 struct iio_interrupt *int_info = _int_info;
422 struct iio_dev *indio_dev = int_info->dev_info;
423 struct iio_sw_ring_helper_state *h
424 = iio_dev_get_devdata(indio_dev);
425 struct lis3l02dq_state *st = lis3l02dq_h_to_s(h);
427 disable_irq_nosync(irq);
428 st->thresh_timestamp = iio_get_time_ns();
429 schedule_work(&st->work_thresh);
434 #define LIS3L02DQ_INFO_MASK \
435 ((1 << IIO_CHAN_INFO_SCALE_SHARED) | \
436 (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) | \
437 (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE))
439 #define LIS3L02DQ_EVENT_MASK \
440 (IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) | \
441 IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING))
443 static struct iio_chan_spec lis3l02dq_channels[] = {
444 IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_X, LIS3L02DQ_INFO_MASK,
445 0, 0, IIO_ST('s', 12, 16, 0),
446 LIS3L02DQ_EVENT_MASK, NULL),
447 IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Y, LIS3L02DQ_INFO_MASK,
448 1, 1, IIO_ST('s', 12, 16, 0),
449 LIS3L02DQ_EVENT_MASK, NULL),
450 IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Z, LIS3L02DQ_INFO_MASK,
451 2, 2, IIO_ST('s', 12, 16, 0),
452 LIS3L02DQ_EVENT_MASK, NULL),
453 IIO_CHAN_SOFT_TIMESTAMP(3)
457 static ssize_t lis3l02dq_read_event_config(struct iio_dev *indio_dev,
463 u8 mask = (1 << (IIO_EVENT_CODE_EXTRACT_MODIFIER(event_code)*2 +
464 (IIO_EVENT_CODE_EXTRACT_DIR(event_code) ==
465 IIO_EV_DIR_RISING)));
466 ret = lis3l02dq_spi_read_reg_8(indio_dev,
467 LIS3L02DQ_REG_WAKE_UP_CFG_ADDR,
472 return !!(val & mask);
475 int lis3l02dq_disable_all_events(struct iio_dev *indio_dev)
477 struct iio_sw_ring_helper_state *h
478 = iio_dev_get_devdata(indio_dev);
479 struct lis3l02dq_state *st = lis3l02dq_h_to_s(h);
484 ret = lis3l02dq_spi_read_reg_8(indio_dev,
485 LIS3L02DQ_REG_CTRL_2_ADDR,
488 irqtofree = !!(control & LIS3L02DQ_REG_CTRL_2_ENABLE_INTERRUPT);
490 control &= ~LIS3L02DQ_REG_CTRL_2_ENABLE_INTERRUPT;
491 ret = lis3l02dq_spi_write_reg_8(indio_dev,
492 LIS3L02DQ_REG_CTRL_2_ADDR,
496 /* Also for consistency clear the mask */
497 ret = lis3l02dq_spi_read_reg_8(indio_dev,
498 LIS3L02DQ_REG_WAKE_UP_CFG_ADDR,
504 ret = lis3l02dq_spi_write_reg_8(indio_dev,
505 LIS3L02DQ_REG_WAKE_UP_CFG_ADDR,
511 free_irq(st->us->irq, indio_dev->interrupts[0]);
518 static int lis3l02dq_write_event_config(struct iio_dev *indio_dev,
520 struct iio_event_handler_list *list_el,
523 struct iio_sw_ring_helper_state *h
524 = iio_dev_get_devdata(indio_dev);
525 struct lis3l02dq_state *st = lis3l02dq_h_to_s(h);
529 bool changed = false;
530 u8 mask = (1 << (IIO_EVENT_CODE_EXTRACT_MODIFIER(event_code)*2 +
531 (IIO_EVENT_CODE_EXTRACT_DIR(event_code) ==
532 IIO_EV_DIR_RISING)));
534 mutex_lock(&indio_dev->mlock);
535 /* read current control */
536 ret = lis3l02dq_spi_read_reg_8(indio_dev,
537 LIS3L02DQ_REG_CTRL_2_ADDR,
541 ret = lis3l02dq_spi_read_reg_8(indio_dev,
542 LIS3L02DQ_REG_WAKE_UP_CFG_ADDR,
546 currentlyset = val & mask;
548 if (!currentlyset && state) {
551 } else if (currentlyset && !state) {
557 if (!(control & LIS3L02DQ_REG_CTRL_2_ENABLE_INTERRUPT)) {
558 ret = request_irq(st->us->irq,
559 &lis3l02dq_event_handler,
562 indio_dev->interrupts[0]);
567 ret = lis3l02dq_spi_write_reg_8(indio_dev,
568 LIS3L02DQ_REG_WAKE_UP_CFG_ADDR,
572 control = val & 0x3f ?
573 (control | LIS3L02DQ_REG_CTRL_2_ENABLE_INTERRUPT) :
574 (control & ~LIS3L02DQ_REG_CTRL_2_ENABLE_INTERRUPT);
575 ret = lis3l02dq_spi_write_reg_8(indio_dev,
576 LIS3L02DQ_REG_CTRL_2_ADDR,
581 /* remove interrupt handler if nothing is still on */
583 free_irq(st->us->irq, indio_dev->interrupts[0]);
587 mutex_unlock(&indio_dev->mlock);
591 /* Unforunately it appears the interrupt won't clear unless you read from the
594 static void lis3l02dq_thresh_handler_bh_no_check(struct work_struct *work_s)
596 struct lis3l02dq_state *st
597 = container_of(work_s,
598 struct lis3l02dq_state, work_thresh);
601 lis3l02dq_spi_read_reg_8(st->help.indio_dev,
602 LIS3L02DQ_REG_WAKE_UP_SRC_ADDR,
605 if (t & LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_Z_HIGH)
606 iio_push_event(st->help.indio_dev, 0,
607 IIO_MOD_EVENT_CODE(IIO_EV_CLASS_ACCEL,
612 st->thresh_timestamp);
614 if (t & LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_Z_LOW)
615 iio_push_event(st->help.indio_dev, 0,
616 IIO_MOD_EVENT_CODE(IIO_EV_CLASS_ACCEL,
621 st->thresh_timestamp);
623 if (t & LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_Y_HIGH)
624 iio_push_event(st->help.indio_dev, 0,
625 IIO_MOD_EVENT_CODE(IIO_EV_CLASS_ACCEL,
630 st->thresh_timestamp);
632 if (t & LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_Y_LOW)
633 iio_push_event(st->help.indio_dev, 0,
634 IIO_MOD_EVENT_CODE(IIO_EV_CLASS_ACCEL,
639 st->thresh_timestamp);
641 if (t & LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_X_HIGH)
642 iio_push_event(st->help.indio_dev, 0,
643 IIO_MOD_EVENT_CODE(IIO_EV_CLASS_ACCEL,
648 st->thresh_timestamp);
650 if (t & LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_X_LOW)
651 iio_push_event(st->help.indio_dev, 0,
652 IIO_MOD_EVENT_CODE(IIO_EV_CLASS_ACCEL,
657 st->thresh_timestamp);
658 /* reenable the irq */
659 enable_irq(st->us->irq);
660 /* Ack and allow for new interrupts */
661 lis3l02dq_spi_read_reg_8(st->help.indio_dev,
662 LIS3L02DQ_REG_WAKE_UP_ACK_ADDR,
668 static IIO_CONST_ATTR_NAME("lis3l02dq");
670 static struct attribute *lis3l02dq_attributes[] = {
671 &iio_dev_attr_sampling_frequency.dev_attr.attr,
672 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
673 &iio_const_attr_name.dev_attr.attr,
677 static const struct attribute_group lis3l02dq_attribute_group = {
678 .attrs = lis3l02dq_attributes,
681 static int __devinit lis3l02dq_probe(struct spi_device *spi)
683 int ret, regdone = 0;
684 struct lis3l02dq_state *st = kzalloc(sizeof *st, GFP_KERNEL);
689 INIT_WORK(&st->work_thresh, lis3l02dq_thresh_handler_bh_no_check);
690 /* this is only used tor removal purposes */
691 spi_set_drvdata(spi, st);
693 /* Allocate the comms buffers */
694 st->rx = kzalloc(sizeof(*st->rx)*LIS3L02DQ_MAX_RX, GFP_KERNEL);
695 if (st->rx == NULL) {
699 st->tx = kzalloc(sizeof(*st->tx)*LIS3L02DQ_MAX_TX, GFP_KERNEL);
700 if (st->tx == NULL) {
705 mutex_init(&st->buf_lock);
706 /* setup the industrialio driver allocated elements */
707 st->help.indio_dev = iio_allocate_device(0);
708 if (st->help.indio_dev == NULL) {
713 st->help.indio_dev->dev.parent = &spi->dev;
714 st->help.indio_dev->num_interrupt_lines = 1;
715 st->help.indio_dev->channels = lis3l02dq_channels;
716 st->help.indio_dev->num_channels = ARRAY_SIZE(lis3l02dq_channels);
717 st->help.indio_dev->read_raw = &lis3l02dq_read_raw;
718 st->help.indio_dev->read_event_value = &lis3l02dq_read_thresh;
719 st->help.indio_dev->write_event_value = &lis3l02dq_write_thresh;
720 st->help.indio_dev->write_event_config = &lis3l02dq_write_event_config;
721 st->help.indio_dev->read_event_config = &lis3l02dq_read_event_config;
722 st->help.indio_dev->attrs = &lis3l02dq_attribute_group;
723 st->help.indio_dev->dev_data = (void *)(&st->help);
724 st->help.indio_dev->driver_module = THIS_MODULE;
725 st->help.indio_dev->modes = INDIO_DIRECT_MODE;
727 ret = lis3l02dq_configure_ring(st->help.indio_dev);
731 ret = iio_device_register(st->help.indio_dev);
733 goto error_unreg_ring_funcs;
736 ret = iio_ring_buffer_register_ex(st->help.indio_dev->ring, 0,
738 ARRAY_SIZE(lis3l02dq_channels));
740 printk(KERN_ERR "failed to initialize the ring\n");
741 goto error_unreg_ring_funcs;
744 if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0) {
746 ret = iio_register_interrupt_line(spi->irq,
752 goto error_uninitialize_ring;
753 ret = lis3l02dq_probe_trigger(st->help.indio_dev);
755 goto error_unregister_line;
758 /* Get the device into a sane initial state */
759 ret = lis3l02dq_initial_setup(st);
761 goto error_remove_trigger;
764 error_remove_trigger:
765 if (st->help.indio_dev->modes & INDIO_RING_TRIGGERED)
766 lis3l02dq_remove_trigger(st->help.indio_dev);
767 error_unregister_line:
768 if (st->help.indio_dev->modes & INDIO_RING_TRIGGERED)
769 iio_unregister_interrupt_line(st->help.indio_dev, 0);
770 error_uninitialize_ring:
771 iio_ring_buffer_unregister(st->help.indio_dev->ring);
772 error_unreg_ring_funcs:
773 lis3l02dq_unconfigure_ring(st->help.indio_dev);
776 iio_device_unregister(st->help.indio_dev);
778 iio_free_device(st->help.indio_dev);
789 /* Power down the device */
790 static int lis3l02dq_stop_device(struct iio_dev *indio_dev)
793 struct iio_sw_ring_helper_state *h
794 = iio_dev_get_devdata(indio_dev);
795 struct lis3l02dq_state *st = lis3l02dq_h_to_s(h);
798 mutex_lock(&indio_dev->mlock);
799 ret = lis3l02dq_spi_write_reg_8(indio_dev,
800 LIS3L02DQ_REG_CTRL_1_ADDR,
803 dev_err(&st->us->dev, "problem with turning device off: ctrl1");
807 ret = lis3l02dq_spi_write_reg_8(indio_dev,
808 LIS3L02DQ_REG_CTRL_2_ADDR,
811 dev_err(&st->us->dev, "problem with turning device off: ctrl2");
813 mutex_unlock(&indio_dev->mlock);
817 /* fixme, confirm ordering in this function */
818 static int lis3l02dq_remove(struct spi_device *spi)
821 struct lis3l02dq_state *st = spi_get_drvdata(spi);
822 struct iio_dev *indio_dev = st->help.indio_dev;
823 ret = lis3l02dq_disable_all_events(indio_dev);
827 ret = lis3l02dq_stop_device(indio_dev);
831 flush_scheduled_work();
833 lis3l02dq_remove_trigger(indio_dev);
834 if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0)
835 iio_unregister_interrupt_line(indio_dev, 0);
837 iio_ring_buffer_unregister(indio_dev->ring);
838 lis3l02dq_unconfigure_ring(indio_dev);
839 iio_device_unregister(indio_dev);
850 static struct spi_driver lis3l02dq_driver = {
853 .owner = THIS_MODULE,
855 .probe = lis3l02dq_probe,
856 .remove = __devexit_p(lis3l02dq_remove),
859 static __init int lis3l02dq_init(void)
861 return spi_register_driver(&lis3l02dq_driver);
863 module_init(lis3l02dq_init);
865 static __exit void lis3l02dq_exit(void)
867 spi_unregister_driver(&lis3l02dq_driver);
869 module_exit(lis3l02dq_exit);
871 MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");
872 MODULE_DESCRIPTION("ST LIS3L02DQ Accelerometer SPI driver");
873 MODULE_LICENSE("GPL v2");