1#include <linux/interrupt.h> 2#include <linux/irq.h> 3#include <linux/gpio.h> 4#include <linux/workqueue.h> 5#include <linux/mutex.h> 6#include <linux/device.h> 7#include <linux/kernel.h> 8#include <linux/spi/spi.h> 9#include <linux/slab.h> 10#include <linux/sysfs.h> 11#include <linux/list.h> 12 13#include "../iio.h" 14#include "../sysfs.h" 15#include "../ring_sw.h" 16#include "accel.h" 17#include "../trigger.h" 18#include "adis16240.h" 19 20static IIO_SCAN_EL_C(supply, ADIS16240_SCAN_SUPPLY, IIO_UNSIGNED(10), 21 ADIS16240_SUPPLY_OUT, NULL); 22static IIO_SCAN_EL_C(accel_x, ADIS16240_SCAN_ACC_X, IIO_SIGNED(10), 23 ADIS16240_XACCL_OUT, NULL); 24static IIO_SCAN_EL_C(accel_y, ADIS16240_SCAN_ACC_Y, IIO_SIGNED(10), 25 ADIS16240_YACCL_OUT, NULL); 26static IIO_SCAN_EL_C(accel_z, ADIS16240_SCAN_ACC_Z, IIO_SIGNED(10), 27 ADIS16240_ZACCL_OUT, NULL); 28static IIO_SCAN_EL_C(aux_adc, ADIS16240_SCAN_AUX_ADC, IIO_UNSIGNED(10), 29 ADIS16240_AUX_ADC, NULL); 30static IIO_SCAN_EL_C(temp, ADIS16240_SCAN_TEMP, IIO_UNSIGNED(10), 31 ADIS16240_TEMP_OUT, NULL); 32 33static IIO_SCAN_EL_TIMESTAMP(6); 34 35static struct attribute *adis16240_scan_el_attrs[] = { 36 &iio_scan_el_supply.dev_attr.attr, 37 &iio_scan_el_accel_x.dev_attr.attr, 38 &iio_scan_el_accel_y.dev_attr.attr, 39 &iio_scan_el_accel_z.dev_attr.attr, 40 &iio_scan_el_aux_adc.dev_attr.attr, 41 &iio_scan_el_temp.dev_attr.attr, 42 &iio_scan_el_timestamp.dev_attr.attr, 43 NULL, 44}; 45 46static struct attribute_group adis16240_scan_el_group = { 47 .attrs = adis16240_scan_el_attrs, 48 .name = "scan_elements", 49}; 50 51/** 52 * adis16240_poll_func_th() top half interrupt handler called by trigger 53 * @private_data: iio_dev 54 **/ 55static void adis16240_poll_func_th(struct iio_dev *indio_dev, s64 time) 56{ 57 struct adis16240_state *st = iio_dev_get_devdata(indio_dev); 58 st->last_timestamp = time; 59 schedule_work(&st->work_trigger_to_ring); 60} 61 62/** 63 * adis16240_read_ring_data() read data registers which will be placed into ring 64 * @dev: device associated with child of actual device (iio_dev or iio_trig) 65 * @rx: somewhere to pass back the value read 66 **/ 67static int adis16240_read_ring_data(struct device *dev, u8 *rx) 68{ 69 struct spi_message msg; 70 struct iio_dev *indio_dev = dev_get_drvdata(dev); 71 struct adis16240_state *st = iio_dev_get_devdata(indio_dev); 72 struct spi_transfer xfers[ADIS16240_OUTPUTS + 1]; 73 int ret; 74 int i; 75 76 mutex_lock(&st->buf_lock); 77 78 spi_message_init(&msg); 79 80 memset(xfers, 0, sizeof(xfers)); 81 for (i = 0; i <= ADIS16240_OUTPUTS; i++) { 82 xfers[i].bits_per_word = 8; 83 xfers[i].cs_change = 1; 84 xfers[i].len = 2; 85 xfers[i].delay_usecs = 30; 86 xfers[i].tx_buf = st->tx + 2 * i; 87 st->tx[2 * i] 88 = ADIS16240_READ_REG(ADIS16240_SUPPLY_OUT + 2 * i); 89 st->tx[2 * i + 1] = 0; 90 if (i >= 1) 91 xfers[i].rx_buf = rx + 2 * (i - 1); 92 spi_message_add_tail(&xfers[i], &msg); 93 } 94 95 ret = spi_sync(st->us, &msg); 96 if (ret) 97 dev_err(&st->us->dev, "problem when burst reading"); 98 99 mutex_unlock(&st->buf_lock); 100 101 return ret; 102} 103 104 105static void adis16240_trigger_bh_to_ring(struct work_struct *work_s) 106{ 107 struct adis16240_state *st 108 = container_of(work_s, struct adis16240_state, 109 work_trigger_to_ring); 110 111 int i = 0; 112 s16 *data; 113 size_t datasize = st->indio_dev 114 ->ring->access.get_bpd(st->indio_dev->ring); 115 116 data = kmalloc(datasize , GFP_KERNEL); 117 if (data == NULL) { 118 dev_err(&st->us->dev, "memory alloc failed in ring bh"); 119 return; 120 } 121 122 if (st->indio_dev->scan_count) 123 if (adis16240_read_ring_data(&st->indio_dev->dev, st->rx) >= 0) 124 for (; i < st->indio_dev->scan_count; i++) 125 data[i] = be16_to_cpup( 126 (__be16 *)&(st->rx[i*2])); 127 128 /* Guaranteed to be aligned with 8 byte boundary */ 129 if (st->indio_dev->scan_timestamp) 130 *((s64 *)(data + ((i + 3)/4)*4)) = st->last_timestamp; 131 132 st->indio_dev->ring->access.store_to(st->indio_dev->ring, 133 (u8 *)data, 134 st->last_timestamp); 135 136 iio_trigger_notify_done(st->indio_dev->trig); 137 kfree(data); 138 139 return; 140} 141 142void adis16240_unconfigure_ring(struct iio_dev *indio_dev) 143{ 144 kfree(indio_dev->pollfunc); 145 iio_sw_rb_free(indio_dev->ring); 146} 147 148int adis16240_configure_ring(struct iio_dev *indio_dev) 149{ 150 int ret = 0; 151 struct adis16240_state *st = indio_dev->dev_data; 152 struct iio_ring_buffer *ring; 153 INIT_WORK(&st->work_trigger_to_ring, adis16240_trigger_bh_to_ring); 154 /* Set default scan mode */ 155 156 iio_scan_mask_set(indio_dev, iio_scan_el_supply.number); 157 iio_scan_mask_set(indio_dev, iio_scan_el_accel_x.number); 158 iio_scan_mask_set(indio_dev, iio_scan_el_accel_y.number); 159 iio_scan_mask_set(indio_dev, iio_scan_el_accel_z.number); 160 iio_scan_mask_set(indio_dev, iio_scan_el_temp.number); 161 iio_scan_mask_set(indio_dev, iio_scan_el_aux_adc.number); 162 indio_dev->scan_timestamp = true; 163 164 indio_dev->scan_el_attrs = &adis16240_scan_el_group; 165 166 ring = iio_sw_rb_allocate(indio_dev); 167 if (!ring) { 168 ret = -ENOMEM; 169 return ret; 170 } 171 indio_dev->ring = ring; 172 /* Effectively select the ring buffer implementation */ 173 iio_ring_sw_register_funcs(&ring->access); 174 ring->bpe = 2; 175 ring->preenable = &iio_sw_ring_preenable; 176 ring->postenable = &iio_triggered_ring_postenable; 177 ring->predisable = &iio_triggered_ring_predisable; 178 ring->owner = THIS_MODULE; 179 180 ret = iio_alloc_pollfunc(indio_dev, NULL, &adis16240_poll_func_th); 181 if (ret) 182 goto error_iio_sw_rb_free; 183 184 indio_dev->modes |= INDIO_RING_TRIGGERED; 185 return 0; 186 187error_iio_sw_rb_free: 188 iio_sw_rb_free(indio_dev->ring); 189 return ret; 190} 191