Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'iio-for-3.16b' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-next

Jonathan writes:

Second set of IIO new drivers, cleanups and functionality for the 3.16 cycle.

This set contains a change to the ABI for the hid-sensors drivers to bring them
in line with the long published documentation. Unfortunately, rather than
reporting true scale and offset values via sysfs they were reporting
some magic numbers that could only be converted to anything useful using
the HID sensors specification. I missed this entirely through the introduction
of a number of drivers, only picking up on it recently. Srinivas has had
user feedback about this as well. The patch set is too large to go as a fix
at this stage in the cycle and is not a regression fix as this was never
right and so will have to wait for the next merge window. Srinivas assures
me that there are relatively few pieces of hardware out there and he has
had a number of people contact him to point out that the drivers did not
obey the ABI. Hence hopefully the fallout of this, if any will be minor.
If we don't fix it now, it will only get worse going forward. There is no
sensible way of maintaining the incorrect ABI as it is simply returning
the wrong values through the standard interfaces.

Non IIO elements
* Introduce devm_kmemdup. Does what it says on the tin.

New drivers:
* hid-sensors rotation devices (output as quaternion)
* Freescale MPL115A2 presure and temperature sensor.
* Melexis mlx90614 contactless infrared sensor.
* Freescale MMA8452Q 3-axis accelerometer.

New functionality:
* Addition of multiple element callback to allow for sysfs interfaces to access
elements such as quaternions which have no useful meaning if all 4 elements
are not presented together. Other future usecases for this include
rotation matrices.
* Support for multiple element buffer entries for exactly the same uses as
the sysfs related elements described above.
* Quaternion support via the quaternion IIO modifier.
* TEMP_AMBIENT and TEMP_OBJECT modifiers to distinguish cases with thermopile
devices.
* hid-sensors gain sysfs access to the sensor readings. Previously these
drivers used the buffered interface only. This change involves some
additional hid-sensors core support to read poll values back from the devices
to allow the drivers to know roughly how long to wait for a result when
polling the sensor. There is also an associated hid-sensors abi to allow
the devices to be turned off between reads and powered up on demand.

Cleanups and fixes
* Hid sensors fix as described above. Result is to make the _scale and _offset
attributes applicable in the same way as for all other IIO drivers.
* Some additional documentation - mostly covering stuff that graduated from
staging without managing to take it's ABI docs with it.
* A series of little tidy ups to the exynos_adc driver that make the code
nicer to read and improve handling of some corner cases.
* A tidy up to mag3110 (logical fix rather than a real one ;). Also enable
user offset calibration for this device.
* Drop some left over IS_ERR() checks from ad799x that snuck through during
the cleanup in the last IIO patch set.
* Fix a naming issue from clashing patches in ak8975 - note the clash only
occured in the last IIO patch set, hence the fix needs to go through this
tree.
* A format string missmatch fix in ad7280.c. Unlikely to have ever had an
impact so not worth rushing through.

+1851 -186
+36 -2
Documentation/ABI/testing/sysfs-bus-iio
··· 114 114 What: /sys/bus/iio/devices/iio:deviceX/in_tempX_raw 115 115 What: /sys/bus/iio/devices/iio:deviceX/in_temp_x_raw 116 116 What: /sys/bus/iio/devices/iio:deviceX/in_temp_y_raw 117 - What: /sys/bus/iio/devices/iio:deviceX/in_temp_z_raw 117 + What: /sys/bus/iio/devices/iio:deviceX/in_temp_ambient_raw 118 + What: /sys/bus/iio/devices/iio:deviceX/in_temp_object_raw 118 119 KernelVersion: 2.6.35 119 120 Contact: linux-iio@vger.kernel.org 120 121 Description: 121 122 Raw (unscaled no bias removal etc.) temperature measurement. 122 123 If an axis is specified it generally means that the temperature 123 124 sensor is associated with one part of a compound device (e.g. 124 - a gyroscope axis). Units after application of scale and offset 125 + a gyroscope axis). The ambient and object modifiers distinguish 126 + between ambient (reference) and distant temperature for contact- 127 + less measurements. Units after application of scale and offset 125 128 are milli degrees Celsius. 126 129 127 130 What: /sys/bus/iio/devices/iio:deviceX/in_tempX_input ··· 795 792 What: /sys/.../iio:deviceX/scan_elements/in_incli_y_en 796 793 What: /sys/.../iio:deviceX/scan_elements/in_pressureY_en 797 794 What: /sys/.../iio:deviceX/scan_elements/in_pressure_en 795 + What: /sys/.../iio:deviceX/scan_elements/in_rot_quaternion_en 798 796 KernelVersion: 2.6.37 799 797 Contact: linux-iio@vger.kernel.org 800 798 Description: ··· 811 807 What: /sys/.../iio:deviceX/scan_elements/in_timestamp_type 812 808 What: /sys/.../iio:deviceX/scan_elements/in_pressureY_type 813 809 What: /sys/.../iio:deviceX/scan_elements/in_pressure_type 810 + What: /sys/.../iio:deviceX/scan_elements/in_rot_quaternion_type 814 811 KernelVersion: 2.6.37 815 812 Contact: linux-iio@vger.kernel.org 816 813 Description: ··· 858 853 What: /sys/.../iio:deviceX/scan_elements/in_timestamp_index 859 854 What: /sys/.../iio:deviceX/scan_elements/in_pressureY_index 860 855 What: /sys/.../iio:deviceX/scan_elements/in_pressure_index 856 + What: /sys/.../iio:deviceX/scan_elements/in_rot_quaternion_index 861 857 KernelVersion: 2.6.37 862 858 Contact: linux-iio@vger.kernel.org 863 859 Description: ··· 895 889 on-chip EEPROM. After power-up or chip reset the device will 896 890 automatically load the saved configuration. 897 891 892 + What: /sys/.../iio:deviceX/in_illuminanceY_input 893 + What: /sys/.../iio:deviceX/in_illuminanceY_raw 894 + What: /sys/.../iio:deviceX/in_illuminanceY_mean_raw 895 + KernelVersion: 3.4 896 + Contact: linux-iio@vger.kernel.org 897 + Description: 898 + Illuminance measurement, units after application of scale 899 + and offset are lux. 900 + 901 + What: /sys/.../iio:deviceX/in_intensityY_raw 902 + What: /sys/.../iio:deviceX/in_intensityY_ir_raw 903 + What: /sys/.../iio:deviceX/in_intensityY_both_raw 904 + KernelVersion: 3.4 905 + Contact: linux-iio@vger.kernel.org 906 + Description: 907 + Unit-less light intensity. Modifiers both and ir indicate 908 + that measurements contains visible and infrared light 909 + components or just infrared light, respectively. 910 + 898 911 What: /sys/.../iio:deviceX/in_intensity_red_integration_time 899 912 What: /sys/.../iio:deviceX/in_intensity_green_integration_time 900 913 What: /sys/.../iio:deviceX/in_intensity_blue_integration_time ··· 924 899 Description: 925 900 This attribute is used to get/set the integration time in 926 901 seconds. 902 + 903 + What: /sys/bus/iio/devices/iio:deviceX/in_rot_quaternion_raw 904 + KernelVersion: 3.15 905 + Contact: linux-iio@vger.kernel.org 906 + Description: 907 + Raw value of quaternion components using a format 908 + x y z w. Here x, y, and z component represents the axis about 909 + which a rotation will occur and w component represents the 910 + amount of rotation.
+1
Documentation/driver-model/devres.txt
··· 236 236 MEM 237 237 devm_kzalloc() 238 238 devm_kfree() 239 + devm_kmemdup() 239 240 240 241 IIO 241 242 devm_iio_device_alloc()
+21
drivers/base/devres.c
··· 831 831 WARN_ON(rc); 832 832 } 833 833 EXPORT_SYMBOL_GPL(devm_kfree); 834 + 835 + /** 836 + * devm_kmemdup - Resource-managed kmemdup 837 + * @dev: Device this memory belongs to 838 + * @src: Memory region to duplicate 839 + * @len: Memory region length 840 + * @gfp: GFP mask to use 841 + * 842 + * Duplicate region of a memory using resource managed kmalloc 843 + */ 844 + void *devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp) 845 + { 846 + void *p; 847 + 848 + p = devm_kmalloc(dev, len, gfp); 849 + if (p) 850 + memcpy(p, src, len); 851 + 852 + return p; 853 + } 854 + EXPORT_SYMBOL_GPL(devm_kmemdup);
+12
drivers/iio/accel/Kconfig
··· 65 65 Say yes here to build support for the Kionix KXSD9 accelerometer. 66 66 Currently this only supports the device via an SPI interface. 67 67 68 + config MMA8452 69 + tristate "Freescale MMA8452Q Accelerometer Driver" 70 + depends on I2C 71 + select IIO_BUFFER 72 + select IIO_TRIGGERED_BUFFER 73 + help 74 + Say yes here to build support for the Freescale MMA8452Q 3-axis 75 + accelerometer. 76 + 77 + To compile this driver as a module, choose M here: the module 78 + will be called mma8452. 79 + 68 80 endmenu
+1
drivers/iio/accel/Makefile
··· 6 6 obj-$(CONFIG_BMA180) += bma180.o 7 7 obj-$(CONFIG_HID_SENSOR_ACCEL_3D) += hid-sensor-accel-3d.o 8 8 obj-$(CONFIG_KXSD9) += kxsd9.o 9 + obj-$(CONFIG_MMA8452) += mma8452.o 9 10 10 11 obj-$(CONFIG_IIO_ST_ACCEL_3AXIS) += st_accel.o 11 12 st_accel-y := st_accel_core.o
+34 -11
drivers/iio/accel/hid-sensor-accel-3d.c
··· 22 22 #include <linux/interrupt.h> 23 23 #include <linux/irq.h> 24 24 #include <linux/slab.h> 25 + #include <linux/delay.h> 25 26 #include <linux/hid-sensor-hub.h> 26 27 #include <linux/iio/iio.h> 27 28 #include <linux/iio/sysfs.h> ··· 43 42 struct hid_sensor_common common_attributes; 44 43 struct hid_sensor_hub_attribute_info accel[ACCEL_3D_CHANNEL_MAX]; 45 44 u32 accel_val[ACCEL_3D_CHANNEL_MAX]; 45 + int scale_pre_decml; 46 + int scale_post_decml; 47 + int scale_precision; 48 + int value_offset; 46 49 }; 47 50 48 51 static const u32 accel_3d_addresses[ACCEL_3D_CHANNEL_MAX] = { ··· 61 56 .type = IIO_ACCEL, 62 57 .modified = 1, 63 58 .channel2 = IIO_MOD_X, 59 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 64 60 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 65 61 BIT(IIO_CHAN_INFO_SCALE) | 66 62 BIT(IIO_CHAN_INFO_SAMP_FREQ) | ··· 71 65 .type = IIO_ACCEL, 72 66 .modified = 1, 73 67 .channel2 = IIO_MOD_Y, 68 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 74 69 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 75 70 BIT(IIO_CHAN_INFO_SCALE) | 76 71 BIT(IIO_CHAN_INFO_SAMP_FREQ) | ··· 81 74 .type = IIO_ACCEL, 82 75 .modified = 1, 83 76 .channel2 = IIO_MOD_Z, 77 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 84 78 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 85 79 BIT(IIO_CHAN_INFO_SCALE) | 86 80 BIT(IIO_CHAN_INFO_SAMP_FREQ) | ··· 112 104 u32 address; 113 105 int ret; 114 106 int ret_type; 107 + s32 poll_value; 115 108 116 109 *val = 0; 117 110 *val2 = 0; 118 111 switch (mask) { 119 112 case 0: 113 + poll_value = hid_sensor_read_poll_value( 114 + &accel_state->common_attributes); 115 + if (poll_value < 0) 116 + return -EINVAL; 117 + 118 + hid_sensor_power_state(&accel_state->common_attributes, true); 119 + msleep_interruptible(poll_value * 2); 120 120 report_id = accel_state->accel[chan->scan_index].report_id; 121 121 address = accel_3d_addresses[chan->scan_index]; 122 122 if (report_id >= 0) 123 123 *val = sensor_hub_input_attr_get_raw_value( 124 - accel_state->common_attributes.hsdev, 125 - HID_USAGE_SENSOR_ACCEL_3D, address, 126 - report_id); 124 + accel_state->common_attributes.hsdev, 125 + HID_USAGE_SENSOR_ACCEL_3D, address, 126 + report_id); 127 127 else { 128 128 *val = 0; 129 + hid_sensor_power_state(&accel_state->common_attributes, 130 + false); 129 131 return -EINVAL; 130 132 } 133 + hid_sensor_power_state(&accel_state->common_attributes, false); 131 134 ret_type = IIO_VAL_INT; 132 135 break; 133 136 case IIO_CHAN_INFO_SCALE: 134 - *val = accel_state->accel[CHANNEL_SCAN_INDEX_X].units; 135 - ret_type = IIO_VAL_INT; 137 + *val = accel_state->scale_pre_decml; 138 + *val2 = accel_state->scale_post_decml; 139 + ret_type = accel_state->scale_precision; 136 140 break; 137 141 case IIO_CHAN_INFO_OFFSET: 138 - *val = hid_sensor_convert_exponent( 139 - accel_state->accel[CHANNEL_SCAN_INDEX_X].unit_expo); 142 + *val = accel_state->value_offset; 140 143 ret_type = IIO_VAL_INT; 141 144 break; 142 145 case IIO_CHAN_INFO_SAMP_FREQ: ··· 216 197 struct iio_dev *indio_dev = platform_get_drvdata(priv); 217 198 struct accel_3d_state *accel_state = iio_priv(indio_dev); 218 199 219 - dev_dbg(&indio_dev->dev, "accel_3d_proc_event [%d]\n", 220 - accel_state->common_attributes.data_ready); 221 - if (accel_state->common_attributes.data_ready) 200 + dev_dbg(&indio_dev->dev, "accel_3d_proc_event\n"); 201 + if (atomic_read(&accel_state->common_attributes.data_ready)) 222 202 hid_sensor_push_data(indio_dev, 223 203 accel_state->accel_val, 224 204 sizeof(accel_state->accel_val)); ··· 279 261 st->accel[0].report_id, 280 262 st->accel[1].index, st->accel[1].report_id, 281 263 st->accel[2].index, st->accel[2].report_id); 264 + 265 + st->scale_precision = hid_sensor_format_scale( 266 + HID_USAGE_SENSOR_ACCEL_3D, 267 + &st->accel[CHANNEL_SCAN_INDEX_X], 268 + &st->scale_pre_decml, &st->scale_post_decml); 282 269 283 270 /* Set Sensitivity field ids, when there is no individual modifier */ 284 271 if (st->common_attributes.sensitivity.index < 0) { ··· 356 333 dev_err(&pdev->dev, "failed to initialize trigger buffer\n"); 357 334 goto error_free_dev_mem; 358 335 } 359 - accel_state->common_attributes.data_ready = false; 336 + atomic_set(&accel_state->common_attributes.data_ready, 0); 360 337 ret = hid_sensor_setup_trigger(indio_dev, name, 361 338 &accel_state->common_attributes); 362 339 if (ret < 0) {
+439
drivers/iio/accel/mma8452.c
··· 1 + /* 2 + * mma8452.c - Support for Freescale MMA8452Q 3-axis 12-bit accelerometer 3 + * 4 + * Copyright 2014 Peter Meerwald <pmeerw@pmeerw.net> 5 + * 6 + * This file is subject to the terms and conditions of version 2 of 7 + * the GNU General Public License. See the file COPYING in the main 8 + * directory of this archive for more details. 9 + * 10 + * 7-bit I2C slave address 0x1c/0x1d (pin selectable) 11 + * 12 + * TODO: interrupt, thresholding, orientation / freefall events, autosleep 13 + */ 14 + 15 + #include <linux/module.h> 16 + #include <linux/i2c.h> 17 + #include <linux/iio/iio.h> 18 + #include <linux/iio/sysfs.h> 19 + #include <linux/iio/trigger_consumer.h> 20 + #include <linux/iio/buffer.h> 21 + #include <linux/iio/triggered_buffer.h> 22 + #include <linux/delay.h> 23 + 24 + #define MMA8452_STATUS 0x00 25 + #define MMA8452_OUT_X 0x01 /* MSB first, 12-bit */ 26 + #define MMA8452_OUT_Y 0x03 27 + #define MMA8452_OUT_Z 0x05 28 + #define MMA8452_WHO_AM_I 0x0d 29 + #define MMA8452_DATA_CFG 0x0e 30 + #define MMA8452_OFF_X 0x2f 31 + #define MMA8452_OFF_Y 0x30 32 + #define MMA8452_OFF_Z 0x31 33 + #define MMA8452_CTRL_REG1 0x2a 34 + #define MMA8452_CTRL_REG2 0x2b 35 + 36 + #define MMA8452_STATUS_DRDY (BIT(2) | BIT(1) | BIT(0)) 37 + 38 + #define MMA8452_CTRL_DR_MASK (BIT(5) | BIT(4) | BIT(3)) 39 + #define MMA8452_CTRL_DR_SHIFT 3 40 + #define MMA8452_CTRL_DR_DEFAULT 0x4 /* 50 Hz sample frequency */ 41 + #define MMA8452_CTRL_ACTIVE BIT(0) 42 + 43 + #define MMA8452_DATA_CFG_FS_MASK (BIT(1) | BIT(0)) 44 + #define MMA8452_DATA_CFG_FS_2G 0 45 + #define MMA8452_DATA_CFG_FS_4G 1 46 + #define MMA8452_DATA_CFG_FS_8G 2 47 + 48 + #define MMA8452_DEVICE_ID 0x2a 49 + 50 + struct mma8452_data { 51 + struct i2c_client *client; 52 + struct mutex lock; 53 + u8 ctrl_reg1; 54 + u8 data_cfg; 55 + }; 56 + 57 + static int mma8452_drdy(struct mma8452_data *data) 58 + { 59 + int tries = 150; 60 + 61 + while (tries-- > 0) { 62 + int ret = i2c_smbus_read_byte_data(data->client, 63 + MMA8452_STATUS); 64 + if (ret < 0) 65 + return ret; 66 + if ((ret & MMA8452_STATUS_DRDY) == MMA8452_STATUS_DRDY) 67 + return 0; 68 + msleep(20); 69 + } 70 + 71 + dev_err(&data->client->dev, "data not ready\n"); 72 + return -EIO; 73 + } 74 + 75 + static int mma8452_read(struct mma8452_data *data, __be16 buf[3]) 76 + { 77 + int ret = mma8452_drdy(data); 78 + if (ret < 0) 79 + return ret; 80 + return i2c_smbus_read_i2c_block_data(data->client, 81 + MMA8452_OUT_X, 3 * sizeof(__be16), (u8 *) buf); 82 + } 83 + 84 + static ssize_t mma8452_show_int_plus_micros(char *buf, 85 + const int (*vals)[2], int n) 86 + { 87 + size_t len = 0; 88 + 89 + while (n-- > 0) 90 + len += scnprintf(buf + len, PAGE_SIZE - len, 91 + "%d.%06d ", vals[n][0], vals[n][1]); 92 + 93 + /* replace trailing space by newline */ 94 + buf[len - 1] = '\n'; 95 + 96 + return len; 97 + } 98 + 99 + static int mma8452_get_int_plus_micros_index(const int (*vals)[2], int n, 100 + int val, int val2) 101 + { 102 + while (n-- > 0) 103 + if (val == vals[n][0] && val2 == vals[n][1]) 104 + return n; 105 + 106 + return -EINVAL; 107 + } 108 + 109 + static const int mma8452_samp_freq[8][2] = { 110 + {800, 0}, {400, 0}, {200, 0}, {100, 0}, {50, 0}, {12, 500000}, 111 + {6, 250000}, {1, 560000} 112 + }; 113 + 114 + static const int mma8452_scales[3][2] = { 115 + {0, 977}, {0, 1953}, {0, 3906} 116 + }; 117 + 118 + static ssize_t mma8452_show_samp_freq_avail(struct device *dev, 119 + struct device_attribute *attr, char *buf) 120 + { 121 + return mma8452_show_int_plus_micros(buf, mma8452_samp_freq, 122 + ARRAY_SIZE(mma8452_samp_freq)); 123 + } 124 + 125 + static ssize_t mma8452_show_scale_avail(struct device *dev, 126 + struct device_attribute *attr, char *buf) 127 + { 128 + return mma8452_show_int_plus_micros(buf, mma8452_scales, 129 + ARRAY_SIZE(mma8452_scales)); 130 + } 131 + 132 + static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(mma8452_show_samp_freq_avail); 133 + static IIO_DEVICE_ATTR(in_accel_scale_available, S_IRUGO, 134 + mma8452_show_scale_avail, NULL, 0); 135 + 136 + static int mma8452_get_samp_freq_index(struct mma8452_data *data, 137 + int val, int val2) 138 + { 139 + return mma8452_get_int_plus_micros_index(mma8452_samp_freq, 140 + ARRAY_SIZE(mma8452_samp_freq), val, val2); 141 + } 142 + 143 + static int mma8452_get_scale_index(struct mma8452_data *data, 144 + int val, int val2) 145 + { 146 + return mma8452_get_int_plus_micros_index(mma8452_scales, 147 + ARRAY_SIZE(mma8452_scales), val, val2); 148 + } 149 + 150 + static int mma8452_read_raw(struct iio_dev *indio_dev, 151 + struct iio_chan_spec const *chan, 152 + int *val, int *val2, long mask) 153 + { 154 + struct mma8452_data *data = iio_priv(indio_dev); 155 + __be16 buffer[3]; 156 + int i, ret; 157 + 158 + switch (mask) { 159 + case IIO_CHAN_INFO_RAW: 160 + if (iio_buffer_enabled(indio_dev)) 161 + return -EBUSY; 162 + 163 + mutex_lock(&data->lock); 164 + ret = mma8452_read(data, buffer); 165 + mutex_unlock(&data->lock); 166 + if (ret < 0) 167 + return ret; 168 + *val = sign_extend32( 169 + be16_to_cpu(buffer[chan->scan_index]) >> 4, 11); 170 + return IIO_VAL_INT; 171 + case IIO_CHAN_INFO_SCALE: 172 + i = data->data_cfg & MMA8452_DATA_CFG_FS_MASK; 173 + *val = mma8452_scales[i][0]; 174 + *val2 = mma8452_scales[i][1]; 175 + return IIO_VAL_INT_PLUS_MICRO; 176 + case IIO_CHAN_INFO_SAMP_FREQ: 177 + i = (data->ctrl_reg1 & MMA8452_CTRL_DR_MASK) >> 178 + MMA8452_CTRL_DR_SHIFT; 179 + *val = mma8452_samp_freq[i][0]; 180 + *val2 = mma8452_samp_freq[i][1]; 181 + return IIO_VAL_INT_PLUS_MICRO; 182 + case IIO_CHAN_INFO_CALIBBIAS: 183 + ret = i2c_smbus_read_byte_data(data->client, MMA8452_OFF_X + 184 + chan->scan_index); 185 + if (ret < 0) 186 + return ret; 187 + *val = sign_extend32(ret, 7); 188 + return IIO_VAL_INT; 189 + } 190 + return -EINVAL; 191 + } 192 + 193 + static int mma8452_standby(struct mma8452_data *data) 194 + { 195 + return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG1, 196 + data->ctrl_reg1 & ~MMA8452_CTRL_ACTIVE); 197 + } 198 + 199 + static int mma8452_active(struct mma8452_data *data) 200 + { 201 + return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG1, 202 + data->ctrl_reg1); 203 + } 204 + 205 + static int mma8452_change_config(struct mma8452_data *data, u8 reg, u8 val) 206 + { 207 + int ret; 208 + 209 + mutex_lock(&data->lock); 210 + 211 + /* config can only be changed when in standby */ 212 + ret = mma8452_standby(data); 213 + if (ret < 0) 214 + goto fail; 215 + 216 + ret = i2c_smbus_write_byte_data(data->client, reg, val); 217 + if (ret < 0) 218 + goto fail; 219 + 220 + ret = mma8452_active(data); 221 + if (ret < 0) 222 + goto fail; 223 + 224 + ret = 0; 225 + fail: 226 + mutex_unlock(&data->lock); 227 + return ret; 228 + } 229 + 230 + static int mma8452_write_raw(struct iio_dev *indio_dev, 231 + struct iio_chan_spec const *chan, 232 + int val, int val2, long mask) 233 + { 234 + struct mma8452_data *data = iio_priv(indio_dev); 235 + int i; 236 + 237 + if (iio_buffer_enabled(indio_dev)) 238 + return -EBUSY; 239 + 240 + switch (mask) { 241 + case IIO_CHAN_INFO_SAMP_FREQ: 242 + i = mma8452_get_samp_freq_index(data, val, val2); 243 + if (i < 0) 244 + return -EINVAL; 245 + 246 + data->ctrl_reg1 &= ~MMA8452_CTRL_DR_MASK; 247 + data->ctrl_reg1 |= i << MMA8452_CTRL_DR_SHIFT; 248 + return mma8452_change_config(data, MMA8452_CTRL_REG1, 249 + data->ctrl_reg1); 250 + case IIO_CHAN_INFO_SCALE: 251 + i = mma8452_get_scale_index(data, val, val2); 252 + if (i < 0) 253 + return -EINVAL; 254 + data->data_cfg &= ~MMA8452_DATA_CFG_FS_MASK; 255 + data->data_cfg |= i; 256 + return mma8452_change_config(data, MMA8452_DATA_CFG, 257 + data->data_cfg); 258 + case IIO_CHAN_INFO_CALIBBIAS: 259 + if (val < -128 || val > 127) 260 + return -EINVAL; 261 + return mma8452_change_config(data, MMA8452_OFF_X + 262 + chan->scan_index, val); 263 + default: 264 + return -EINVAL; 265 + } 266 + } 267 + 268 + static irqreturn_t mma8452_trigger_handler(int irq, void *p) 269 + { 270 + struct iio_poll_func *pf = p; 271 + struct iio_dev *indio_dev = pf->indio_dev; 272 + struct mma8452_data *data = iio_priv(indio_dev); 273 + u8 buffer[16]; /* 3 16-bit channels + padding + ts */ 274 + int ret; 275 + 276 + ret = mma8452_read(data, (__be16 *) buffer); 277 + if (ret < 0) 278 + goto done; 279 + 280 + iio_push_to_buffers_with_timestamp(indio_dev, buffer, 281 + iio_get_time_ns()); 282 + 283 + done: 284 + iio_trigger_notify_done(indio_dev->trig); 285 + return IRQ_HANDLED; 286 + } 287 + 288 + #define MMA8452_CHANNEL(axis, idx) { \ 289 + .type = IIO_ACCEL, \ 290 + .modified = 1, \ 291 + .channel2 = IIO_MOD_##axis, \ 292 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 293 + BIT(IIO_CHAN_INFO_CALIBBIAS), \ 294 + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ 295 + BIT(IIO_CHAN_INFO_SCALE), \ 296 + .scan_index = idx, \ 297 + .scan_type = { \ 298 + .sign = 's', \ 299 + .realbits = 12, \ 300 + .storagebits = 16, \ 301 + .shift = 4, \ 302 + .endianness = IIO_BE, \ 303 + }, \ 304 + } 305 + 306 + static const struct iio_chan_spec mma8452_channels[] = { 307 + MMA8452_CHANNEL(X, 0), 308 + MMA8452_CHANNEL(Y, 1), 309 + MMA8452_CHANNEL(Z, 2), 310 + IIO_CHAN_SOFT_TIMESTAMP(3), 311 + }; 312 + 313 + static struct attribute *mma8452_attributes[] = { 314 + &iio_dev_attr_sampling_frequency_available.dev_attr.attr, 315 + &iio_dev_attr_in_accel_scale_available.dev_attr.attr, 316 + NULL 317 + }; 318 + 319 + static const struct attribute_group mma8452_group = { 320 + .attrs = mma8452_attributes, 321 + }; 322 + 323 + static const struct iio_info mma8452_info = { 324 + .attrs = &mma8452_group, 325 + .read_raw = &mma8452_read_raw, 326 + .write_raw = &mma8452_write_raw, 327 + .driver_module = THIS_MODULE, 328 + }; 329 + 330 + static const unsigned long mma8452_scan_masks[] = {0x7, 0}; 331 + 332 + static int mma8452_probe(struct i2c_client *client, 333 + const struct i2c_device_id *id) 334 + { 335 + struct mma8452_data *data; 336 + struct iio_dev *indio_dev; 337 + int ret; 338 + 339 + ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I); 340 + if (ret < 0) 341 + return ret; 342 + if (ret != MMA8452_DEVICE_ID) 343 + return -ENODEV; 344 + 345 + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); 346 + if (!indio_dev) 347 + return -ENOMEM; 348 + 349 + data = iio_priv(indio_dev); 350 + data->client = client; 351 + mutex_init(&data->lock); 352 + 353 + i2c_set_clientdata(client, indio_dev); 354 + indio_dev->info = &mma8452_info; 355 + indio_dev->name = id->name; 356 + indio_dev->dev.parent = &client->dev; 357 + indio_dev->modes = INDIO_DIRECT_MODE; 358 + indio_dev->channels = mma8452_channels; 359 + indio_dev->num_channels = ARRAY_SIZE(mma8452_channels); 360 + indio_dev->available_scan_masks = mma8452_scan_masks; 361 + 362 + data->ctrl_reg1 = MMA8452_CTRL_ACTIVE | 363 + (MMA8452_CTRL_DR_DEFAULT << MMA8452_CTRL_DR_SHIFT); 364 + ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG1, 365 + data->ctrl_reg1); 366 + if (ret < 0) 367 + return ret; 368 + 369 + data->data_cfg = MMA8452_DATA_CFG_FS_2G; 370 + ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG, 371 + data->data_cfg); 372 + if (ret < 0) 373 + return ret; 374 + 375 + ret = iio_triggered_buffer_setup(indio_dev, NULL, 376 + mma8452_trigger_handler, NULL); 377 + if (ret < 0) 378 + return ret; 379 + 380 + ret = iio_device_register(indio_dev); 381 + if (ret < 0) 382 + goto buffer_cleanup; 383 + return 0; 384 + 385 + buffer_cleanup: 386 + iio_triggered_buffer_cleanup(indio_dev); 387 + return ret; 388 + } 389 + 390 + static int mma8452_remove(struct i2c_client *client) 391 + { 392 + struct iio_dev *indio_dev = i2c_get_clientdata(client); 393 + 394 + iio_device_unregister(indio_dev); 395 + iio_triggered_buffer_cleanup(indio_dev); 396 + mma8452_standby(iio_priv(indio_dev)); 397 + 398 + return 0; 399 + } 400 + 401 + #ifdef CONFIG_PM_SLEEP 402 + static int mma8452_suspend(struct device *dev) 403 + { 404 + return mma8452_standby(iio_priv(i2c_get_clientdata( 405 + to_i2c_client(dev)))); 406 + } 407 + 408 + static int mma8452_resume(struct device *dev) 409 + { 410 + return mma8452_active(iio_priv(i2c_get_clientdata( 411 + to_i2c_client(dev)))); 412 + } 413 + 414 + static SIMPLE_DEV_PM_OPS(mma8452_pm_ops, mma8452_suspend, mma8452_resume); 415 + #define MMA8452_PM_OPS (&mma8452_pm_ops) 416 + #else 417 + #define MMA8452_PM_OPS NULL 418 + #endif 419 + 420 + static const struct i2c_device_id mma8452_id[] = { 421 + { "mma8452", 0 }, 422 + { } 423 + }; 424 + MODULE_DEVICE_TABLE(i2c, mma8452_id); 425 + 426 + static struct i2c_driver mma8452_driver = { 427 + .driver = { 428 + .name = "mma8452", 429 + .pm = MMA8452_PM_OPS, 430 + }, 431 + .probe = mma8452_probe, 432 + .remove = mma8452_remove, 433 + .id_table = mma8452_id, 434 + }; 435 + module_i2c_driver(mma8452_driver); 436 + 437 + MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>"); 438 + MODULE_DESCRIPTION("Freescale MMA8452 accelerometer driver"); 439 + MODULE_LICENSE("GPL");
+6 -9
drivers/iio/adc/ad799x.c
··· 717 717 ret = iio_triggered_buffer_setup(indio_dev, NULL, 718 718 &ad799x_trigger_handler, NULL); 719 719 if (ret) 720 - goto error_disable_reg; 720 + goto error_disable_vref; 721 721 722 722 if (client->irq > 0) { 723 723 ret = devm_request_threaded_irq(&client->dev, ··· 739 739 740 740 error_cleanup_ring: 741 741 iio_triggered_buffer_cleanup(indio_dev); 742 + error_disable_vref: 743 + regulator_disable(st->vref); 742 744 error_disable_reg: 743 - if (!IS_ERR(st->vref)) 744 - regulator_disable(st->vref); 745 - if (!IS_ERR(st->reg)) 746 - regulator_disable(st->reg); 745 + regulator_disable(st->reg); 747 746 748 747 return ret; 749 748 } ··· 755 756 iio_device_unregister(indio_dev); 756 757 757 758 iio_triggered_buffer_cleanup(indio_dev); 758 - if (!IS_ERR(st->vref)) 759 - regulator_disable(st->vref); 760 - if (!IS_ERR(st->reg)) 761 - regulator_disable(st->reg); 759 + regulator_disable(st->vref); 760 + regulator_disable(st->reg); 762 761 kfree(st->rx_buf); 763 762 764 763 return 0;
+71 -60
drivers/iio/adc/exynos_adc.c
··· 82 82 #define ADC_CON_EN_START (1u << 0) 83 83 #define ADC_DATX_MASK 0xFFF 84 84 85 - #define EXYNOS_ADC_TIMEOUT (msecs_to_jiffies(1000)) 85 + #define EXYNOS_ADC_TIMEOUT (msecs_to_jiffies(100)) 86 86 87 87 struct exynos_adc { 88 88 void __iomem *regs; ··· 112 112 return (unsigned int)match->data; 113 113 } 114 114 115 + static void exynos_adc_hw_init(struct exynos_adc *info) 116 + { 117 + u32 con1, con2; 118 + 119 + if (info->version == ADC_V2) { 120 + con1 = ADC_V2_CON1_SOFT_RESET; 121 + writel(con1, ADC_V2_CON1(info->regs)); 122 + 123 + con2 = ADC_V2_CON2_OSEL | ADC_V2_CON2_ESEL | 124 + ADC_V2_CON2_HIGHF | ADC_V2_CON2_C_TIME(0); 125 + writel(con2, ADC_V2_CON2(info->regs)); 126 + 127 + /* Enable interrupts */ 128 + writel(1, ADC_V2_INT_EN(info->regs)); 129 + } else { 130 + /* set default prescaler values and Enable prescaler */ 131 + con1 = ADC_V1_CON_PRSCLV(49) | ADC_V1_CON_PRSCEN; 132 + 133 + /* Enable 12-bit ADC resolution */ 134 + con1 |= ADC_V1_CON_RES; 135 + writel(con1, ADC_V1_CON(info->regs)); 136 + } 137 + } 138 + 115 139 static int exynos_read_raw(struct iio_dev *indio_dev, 116 140 struct iio_chan_spec const *chan, 117 141 int *val, ··· 145 121 struct exynos_adc *info = iio_priv(indio_dev); 146 122 unsigned long timeout; 147 123 u32 con1, con2; 124 + int ret; 148 125 149 126 if (mask != IIO_CHAN_INFO_RAW) 150 127 return -EINVAL; 151 128 152 129 mutex_lock(&indio_dev->mlock); 130 + reinit_completion(&info->completion); 153 131 154 132 /* Select the channel to be used and Trigger conversion */ 155 133 if (info->version == ADC_V2) { ··· 171 145 ADC_V1_CON(info->regs)); 172 146 } 173 147 174 - timeout = wait_for_completion_interruptible_timeout 148 + timeout = wait_for_completion_timeout 175 149 (&info->completion, EXYNOS_ADC_TIMEOUT); 176 - *val = info->value; 150 + if (timeout == 0) { 151 + dev_warn(&indio_dev->dev, "Conversion timed out! Resetting\n"); 152 + exynos_adc_hw_init(info); 153 + ret = -ETIMEDOUT; 154 + } else { 155 + *val = info->value; 156 + *val2 = 0; 157 + ret = IIO_VAL_INT; 158 + } 177 159 178 160 mutex_unlock(&indio_dev->mlock); 179 161 180 - if (timeout == 0) 181 - return -ETIMEDOUT; 182 - 183 - return IIO_VAL_INT; 162 + return ret; 184 163 } 185 164 186 165 static irqreturn_t exynos_adc_isr(int irq, void *dev_id) ··· 257 226 return 0; 258 227 } 259 228 260 - static void exynos_adc_hw_init(struct exynos_adc *info) 261 - { 262 - u32 con1, con2; 263 - 264 - if (info->version == ADC_V2) { 265 - con1 = ADC_V2_CON1_SOFT_RESET; 266 - writel(con1, ADC_V2_CON1(info->regs)); 267 - 268 - con2 = ADC_V2_CON2_OSEL | ADC_V2_CON2_ESEL | 269 - ADC_V2_CON2_HIGHF | ADC_V2_CON2_C_TIME(0); 270 - writel(con2, ADC_V2_CON2(info->regs)); 271 - 272 - /* Enable interrupts */ 273 - writel(1, ADC_V2_INT_EN(info->regs)); 274 - } else { 275 - /* set default prescaler values and Enable prescaler */ 276 - con1 = ADC_V1_CON_PRSCLV(49) | ADC_V1_CON_PRSCEN; 277 - 278 - /* Enable 12-bit ADC resolution */ 279 - con1 |= ADC_V1_CON_RES; 280 - writel(con1, ADC_V1_CON(info->regs)); 281 - } 282 - } 283 - 284 229 static int exynos_adc_probe(struct platform_device *pdev) 285 230 { 286 231 struct exynos_adc *info = NULL; ··· 297 290 298 291 init_completion(&info->completion); 299 292 300 - ret = request_irq(info->irq, exynos_adc_isr, 301 - 0, dev_name(&pdev->dev), info); 302 - if (ret < 0) { 303 - dev_err(&pdev->dev, "failed requesting irq, irq = %d\n", 304 - info->irq); 305 - return ret; 306 - } 307 - 308 - writel(1, info->enable_reg); 309 - 310 293 info->clk = devm_clk_get(&pdev->dev, "adc"); 311 294 if (IS_ERR(info->clk)) { 312 295 dev_err(&pdev->dev, "failed getting clock, err = %ld\n", 313 296 PTR_ERR(info->clk)); 314 - ret = PTR_ERR(info->clk); 315 - goto err_irq; 297 + return PTR_ERR(info->clk); 316 298 } 317 299 318 300 info->vdd = devm_regulator_get(&pdev->dev, "vdd"); 319 301 if (IS_ERR(info->vdd)) { 320 302 dev_err(&pdev->dev, "failed getting regulator, err = %ld\n", 321 303 PTR_ERR(info->vdd)); 322 - ret = PTR_ERR(info->vdd); 323 - goto err_irq; 304 + return PTR_ERR(info->vdd); 324 305 } 306 + 307 + ret = regulator_enable(info->vdd); 308 + if (ret) 309 + return ret; 310 + 311 + ret = clk_prepare_enable(info->clk); 312 + if (ret) 313 + goto err_disable_reg; 314 + 315 + writel(1, info->enable_reg); 325 316 326 317 info->version = exynos_adc_get_version(pdev); 327 318 ··· 337 332 else 338 333 indio_dev->num_channels = MAX_ADC_V2_CHANNELS; 339 334 335 + ret = request_irq(info->irq, exynos_adc_isr, 336 + 0, dev_name(&pdev->dev), info); 337 + if (ret < 0) { 338 + dev_err(&pdev->dev, "failed requesting irq, irq = %d\n", 339 + info->irq); 340 + goto err_disable_clk; 341 + } 342 + 340 343 ret = iio_device_register(indio_dev); 341 344 if (ret) 342 345 goto err_irq; 343 - 344 - ret = regulator_enable(info->vdd); 345 - if (ret) 346 - goto err_iio_dev; 347 - 348 - clk_prepare_enable(info->clk); 349 346 350 347 exynos_adc_hw_init(info); 351 348 ··· 362 355 err_of_populate: 363 356 device_for_each_child(&pdev->dev, NULL, 364 357 exynos_adc_remove_devices); 365 - regulator_disable(info->vdd); 366 - clk_disable_unprepare(info->clk); 367 - err_iio_dev: 368 358 iio_device_unregister(indio_dev); 369 359 err_irq: 370 360 free_irq(info->irq, info); 361 + err_disable_clk: 362 + writel(0, info->enable_reg); 363 + clk_disable_unprepare(info->clk); 364 + err_disable_reg: 365 + regulator_disable(info->vdd); 371 366 return ret; 372 367 } 373 368 ··· 380 371 381 372 device_for_each_child(&pdev->dev, NULL, 382 373 exynos_adc_remove_devices); 383 - regulator_disable(info->vdd); 384 - clk_disable_unprepare(info->clk); 385 - writel(0, info->enable_reg); 386 374 iio_device_unregister(indio_dev); 387 375 free_irq(info->irq, info); 376 + writel(0, info->enable_reg); 377 + clk_disable_unprepare(info->clk); 378 + regulator_disable(info->vdd); 388 379 389 380 return 0; 390 381 } ··· 406 397 writel(con, ADC_V1_CON(info->regs)); 407 398 } 408 399 409 - clk_disable_unprepare(info->clk); 410 400 writel(0, info->enable_reg); 401 + clk_disable_unprepare(info->clk); 411 402 regulator_disable(info->vdd); 412 403 413 404 return 0; ··· 423 414 if (ret) 424 415 return ret; 425 416 426 - writel(1, info->enable_reg); 427 - clk_prepare_enable(info->clk); 417 + ret = clk_prepare_enable(info->clk); 418 + if (ret) 419 + return ret; 428 420 421 + writel(1, info->enable_reg); 429 422 exynos_adc_hw_init(info); 430 423 431 424 return 0;
+134
drivers/iio/common/hid-sensors/hid-sensor-attributes.c
··· 26 26 #include <linux/iio/iio.h> 27 27 #include <linux/iio/sysfs.h> 28 28 29 + struct { 30 + u32 usage_id; 31 + int unit; /* 0 for default others from HID sensor spec */ 32 + int scale_val0; /* scale, whole number */ 33 + int scale_val1; /* scale, fraction in micros */ 34 + } static unit_conversion[] = { 35 + {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650}, 36 + {HID_USAGE_SENSOR_ACCEL_3D, 37 + HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD, 1, 0}, 38 + {HID_USAGE_SENSOR_ACCEL_3D, 39 + HID_USAGE_SENSOR_UNITS_G, 9, 806650}, 40 + 41 + {HID_USAGE_SENSOR_GYRO_3D, 0, 0, 17453}, 42 + {HID_USAGE_SENSOR_GYRO_3D, 43 + HID_USAGE_SENSOR_UNITS_RADIANS_PER_SECOND, 1, 0}, 44 + {HID_USAGE_SENSOR_GYRO_3D, 45 + HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND, 0, 17453}, 46 + 47 + {HID_USAGE_SENSOR_COMPASS_3D, 0, 0, 1000}, 48 + {HID_USAGE_SENSOR_COMPASS_3D, HID_USAGE_SENSOR_UNITS_GAUSS, 1, 0}, 49 + 50 + {HID_USAGE_SENSOR_INCLINOMETER_3D, 0, 0, 17453}, 51 + {HID_USAGE_SENSOR_INCLINOMETER_3D, 52 + HID_USAGE_SENSOR_UNITS_DEGREES, 0, 17453}, 53 + {HID_USAGE_SENSOR_INCLINOMETER_3D, 54 + HID_USAGE_SENSOR_UNITS_RADIANS, 1, 0}, 55 + 56 + {HID_USAGE_SENSOR_ALS, 0, 1, 0}, 57 + {HID_USAGE_SENSOR_ALS, HID_USAGE_SENSOR_UNITS_LUX, 1, 0}, 58 + 59 + {HID_USAGE_SENSOR_PRESSURE, 0, 100000, 0}, 60 + {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 1, 0}, 61 + }; 62 + 29 63 static int pow_10(unsigned power) 30 64 { 31 65 int i; ··· 146 112 147 113 return value; 148 114 } 115 + 116 + s32 hid_sensor_read_poll_value(struct hid_sensor_common *st) 117 + { 118 + s32 value = 0; 119 + int ret; 120 + 121 + ret = sensor_hub_get_feature(st->hsdev, 122 + st->poll.report_id, 123 + st->poll.index, &value); 124 + 125 + if (ret < 0 || value < 0) { 126 + return -EINVAL; 127 + } else { 128 + if (st->poll.units == HID_USAGE_SENSOR_UNITS_SECOND) 129 + value = value * 1000; 130 + } 131 + 132 + return value; 133 + } 134 + EXPORT_SYMBOL(hid_sensor_read_poll_value); 149 135 150 136 int hid_sensor_read_samp_freq_value(struct hid_sensor_common *st, 151 137 int *val1, int *val2) ··· 262 208 return ret; 263 209 } 264 210 EXPORT_SYMBOL(hid_sensor_write_raw_hyst_value); 211 + 212 + /* 213 + * This fuction applies the unit exponent to the scale. 214 + * For example: 215 + * 9.806650 ->exp:2-> val0[980]val1[665000] 216 + * 9.000806 ->exp:2-> val0[900]val1[80600] 217 + * 0.174535 ->exp:2-> val0[17]val1[453500] 218 + * 1.001745 ->exp:0-> val0[1]val1[1745] 219 + * 1.001745 ->exp:2-> val0[100]val1[174500] 220 + * 1.001745 ->exp:4-> val0[10017]val1[450000] 221 + * 9.806650 ->exp:-2-> val0[0]val1[98066] 222 + */ 223 + static void adjust_exponent_micro(int *val0, int *val1, int scale0, 224 + int scale1, int exp) 225 + { 226 + int i; 227 + int x; 228 + int res; 229 + int rem; 230 + 231 + if (exp > 0) { 232 + *val0 = scale0 * pow_10(exp); 233 + res = 0; 234 + if (exp > 6) { 235 + *val1 = 0; 236 + return; 237 + } 238 + for (i = 0; i < exp; ++i) { 239 + x = scale1 / pow_10(5 - i); 240 + res += (pow_10(exp - 1 - i) * x); 241 + scale1 = scale1 % pow_10(5 - i); 242 + } 243 + *val0 += res; 244 + *val1 = scale1 * pow_10(exp); 245 + } else if (exp < 0) { 246 + exp = abs(exp); 247 + if (exp > 6) { 248 + *val0 = *val1 = 0; 249 + return; 250 + } 251 + *val0 = scale0 / pow_10(exp); 252 + rem = scale0 % pow_10(exp); 253 + res = 0; 254 + for (i = 0; i < (6 - exp); ++i) { 255 + x = scale1 / pow_10(5 - i); 256 + res += (pow_10(5 - exp - i) * x); 257 + scale1 = scale1 % pow_10(5 - i); 258 + } 259 + *val1 = rem * pow_10(6 - exp) + res; 260 + } else { 261 + *val0 = scale0; 262 + *val1 = scale1; 263 + } 264 + } 265 + 266 + int hid_sensor_format_scale(u32 usage_id, 267 + struct hid_sensor_hub_attribute_info *attr_info, 268 + int *val0, int *val1) 269 + { 270 + int i; 271 + int exp; 272 + 273 + *val0 = 1; 274 + *val1 = 0; 275 + 276 + for (i = 0; ARRAY_SIZE(unit_conversion); ++i) { 277 + if (unit_conversion[i].usage_id == usage_id && 278 + unit_conversion[i].unit == attr_info->units) { 279 + exp = hid_sensor_convert_exponent( 280 + attr_info->unit_expo); 281 + adjust_exponent_micro(val0, val1, 282 + unit_conversion[i].scale_val0, 283 + unit_conversion[i].scale_val1, exp); 284 + break; 285 + } 286 + } 287 + 288 + return IIO_VAL_INT_PLUS_MICRO; 289 + } 290 + EXPORT_SYMBOL(hid_sensor_format_scale); 265 291 266 292 int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, 267 293 u32 usage_id,
+13 -4
drivers/iio/common/hid-sensors/hid-sensor-trigger.c
··· 28 28 #include <linux/iio/sysfs.h> 29 29 #include "hid-sensor-trigger.h" 30 30 31 - static int hid_sensor_data_rdy_trigger_set_state(struct iio_trigger *trig, 32 - bool state) 31 + int hid_sensor_power_state(struct hid_sensor_common *st, bool state) 33 32 { 34 - struct hid_sensor_common *st = iio_trigger_get_drvdata(trig); 35 33 int state_val; 36 34 int report_val; 37 35 38 36 if (state) { 39 37 if (sensor_hub_device_open(st->hsdev)) 40 38 return -EIO; 39 + 40 + atomic_inc(&st->data_ready); 41 + 41 42 state_val = hid_sensor_get_usage_index(st->hsdev, 42 43 st->power_state.report_id, 43 44 st->power_state.index, ··· 48 47 st->report_state.index, 49 48 HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM); 50 49 } else { 50 + if (!atomic_dec_and_test(&st->data_ready)) 51 + return 0; 51 52 sensor_hub_device_close(st->hsdev); 52 53 state_val = hid_sensor_get_usage_index(st->hsdev, 53 54 st->power_state.report_id, ··· 60 57 st->report_state.index, 61 58 HID_USAGE_SENSOR_PROP_REPORTING_STATE_NO_EVENTS_ENUM); 62 59 } 63 - st->data_ready = state; 64 60 65 61 if (state_val >= 0) { 66 62 state_val += st->power_state.logical_minimum; ··· 76 74 } 77 75 78 76 return 0; 77 + } 78 + EXPORT_SYMBOL(hid_sensor_power_state); 79 + 80 + static int hid_sensor_data_rdy_trigger_set_state(struct iio_trigger *trig, 81 + bool state) 82 + { 83 + return hid_sensor_power_state(iio_trigger_get_drvdata(trig), state); 79 84 } 80 85 81 86 void hid_sensor_remove_trigger(struct hid_sensor_common *attrb)
+1
drivers/iio/common/hid-sensors/hid-sensor-trigger.h
··· 22 22 int hid_sensor_setup_trigger(struct iio_dev *indio_dev, const char *name, 23 23 struct hid_sensor_common *attrb); 24 24 void hid_sensor_remove_trigger(struct hid_sensor_common *attrb); 25 + int hid_sensor_power_state(struct hid_sensor_common *st, bool state); 25 26 26 27 #endif
+34 -11
drivers/iio/gyro/hid-sensor-gyro-3d.c
··· 22 22 #include <linux/interrupt.h> 23 23 #include <linux/irq.h> 24 24 #include <linux/slab.h> 25 + #include <linux/delay.h> 25 26 #include <linux/hid-sensor-hub.h> 26 27 #include <linux/iio/iio.h> 27 28 #include <linux/iio/sysfs.h> ··· 43 42 struct hid_sensor_common common_attributes; 44 43 struct hid_sensor_hub_attribute_info gyro[GYRO_3D_CHANNEL_MAX]; 45 44 u32 gyro_val[GYRO_3D_CHANNEL_MAX]; 45 + int scale_pre_decml; 46 + int scale_post_decml; 47 + int scale_precision; 48 + int value_offset; 46 49 }; 47 50 48 51 static const u32 gyro_3d_addresses[GYRO_3D_CHANNEL_MAX] = { ··· 61 56 .type = IIO_ANGL_VEL, 62 57 .modified = 1, 63 58 .channel2 = IIO_MOD_X, 59 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 64 60 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 65 61 BIT(IIO_CHAN_INFO_SCALE) | 66 62 BIT(IIO_CHAN_INFO_SAMP_FREQ) | ··· 71 65 .type = IIO_ANGL_VEL, 72 66 .modified = 1, 73 67 .channel2 = IIO_MOD_Y, 68 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 74 69 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 75 70 BIT(IIO_CHAN_INFO_SCALE) | 76 71 BIT(IIO_CHAN_INFO_SAMP_FREQ) | ··· 81 74 .type = IIO_ANGL_VEL, 82 75 .modified = 1, 83 76 .channel2 = IIO_MOD_Z, 77 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 84 78 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 85 79 BIT(IIO_CHAN_INFO_SCALE) | 86 80 BIT(IIO_CHAN_INFO_SAMP_FREQ) | ··· 112 104 u32 address; 113 105 int ret; 114 106 int ret_type; 107 + s32 poll_value; 115 108 116 109 *val = 0; 117 110 *val2 = 0; 118 111 switch (mask) { 119 112 case 0: 113 + poll_value = hid_sensor_read_poll_value( 114 + &gyro_state->common_attributes); 115 + if (poll_value < 0) 116 + return -EINVAL; 117 + 118 + hid_sensor_power_state(&gyro_state->common_attributes, true); 119 + msleep_interruptible(poll_value * 2); 120 120 report_id = gyro_state->gyro[chan->scan_index].report_id; 121 121 address = gyro_3d_addresses[chan->scan_index]; 122 122 if (report_id >= 0) 123 123 *val = sensor_hub_input_attr_get_raw_value( 124 - gyro_state->common_attributes.hsdev, 125 - HID_USAGE_SENSOR_GYRO_3D, address, 126 - report_id); 124 + gyro_state->common_attributes.hsdev, 125 + HID_USAGE_SENSOR_GYRO_3D, address, 126 + report_id); 127 127 else { 128 128 *val = 0; 129 + hid_sensor_power_state(&gyro_state->common_attributes, 130 + false); 129 131 return -EINVAL; 130 132 } 133 + hid_sensor_power_state(&gyro_state->common_attributes, false); 131 134 ret_type = IIO_VAL_INT; 132 135 break; 133 136 case IIO_CHAN_INFO_SCALE: 134 - *val = gyro_state->gyro[CHANNEL_SCAN_INDEX_X].units; 135 - ret_type = IIO_VAL_INT; 137 + *val = gyro_state->scale_pre_decml; 138 + *val2 = gyro_state->scale_post_decml; 139 + ret_type = gyro_state->scale_precision; 136 140 break; 137 141 case IIO_CHAN_INFO_OFFSET: 138 - *val = hid_sensor_convert_exponent( 139 - gyro_state->gyro[CHANNEL_SCAN_INDEX_X].unit_expo); 142 + *val = gyro_state->value_offset; 140 143 ret_type = IIO_VAL_INT; 141 144 break; 142 145 case IIO_CHAN_INFO_SAMP_FREQ: ··· 216 197 struct iio_dev *indio_dev = platform_get_drvdata(priv); 217 198 struct gyro_3d_state *gyro_state = iio_priv(indio_dev); 218 199 219 - dev_dbg(&indio_dev->dev, "gyro_3d_proc_event [%d]\n", 220 - gyro_state->common_attributes.data_ready); 221 - if (gyro_state->common_attributes.data_ready) 200 + dev_dbg(&indio_dev->dev, "gyro_3d_proc_event\n"); 201 + if (atomic_read(&gyro_state->common_attributes.data_ready)) 222 202 hid_sensor_push_data(indio_dev, 223 203 gyro_state->gyro_val, 224 204 sizeof(gyro_state->gyro_val)); ··· 279 261 st->gyro[0].report_id, 280 262 st->gyro[1].index, st->gyro[1].report_id, 281 263 st->gyro[2].index, st->gyro[2].report_id); 264 + 265 + st->scale_precision = hid_sensor_format_scale( 266 + HID_USAGE_SENSOR_GYRO_3D, 267 + &st->gyro[CHANNEL_SCAN_INDEX_X], 268 + &st->scale_pre_decml, &st->scale_post_decml); 282 269 283 270 /* Set Sensitivity field ids, when there is no individual modifier */ 284 271 if (st->common_attributes.sensitivity.index < 0) { ··· 353 330 dev_err(&pdev->dev, "failed to initialize trigger buffer\n"); 354 331 goto error_free_dev_mem; 355 332 } 356 - gyro_state->common_attributes.data_ready = false; 333 + atomic_set(&gyro_state->common_attributes.data_ready, 0); 357 334 ret = hid_sensor_setup_trigger(indio_dev, name, 358 335 &gyro_state->common_attributes); 359 336 if (ret < 0) {
+1 -1
drivers/iio/iio_core.h
··· 35 35 struct list_head *attr_list); 36 36 void iio_free_chan_devattr_list(struct list_head *attr_list); 37 37 38 - ssize_t iio_format_value(char *buf, unsigned int type, int val, int val2); 38 + ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals); 39 39 40 40 /* Event interface flags */ 41 41 #define IIO_BUSY_BIT_POS 1
+35 -6
drivers/iio/industrialio-buffer.c
··· 150 150 type = IIO_BE; 151 151 #endif 152 152 } 153 - return sprintf(buf, "%s:%c%d/%d>>%u\n", 153 + if (this_attr->c->scan_type.repeat > 1) 154 + return sprintf(buf, "%s:%c%d/%dX%d>>%u\n", 155 + iio_endian_prefix[type], 156 + this_attr->c->scan_type.sign, 157 + this_attr->c->scan_type.realbits, 158 + this_attr->c->scan_type.storagebits, 159 + this_attr->c->scan_type.repeat, 160 + this_attr->c->scan_type.shift); 161 + else 162 + return sprintf(buf, "%s:%c%d/%d>>%u\n", 154 163 iio_endian_prefix[type], 155 164 this_attr->c->scan_type.sign, 156 165 this_attr->c->scan_type.realbits, ··· 484 475 for_each_set_bit(i, mask, 485 476 indio_dev->masklength) { 486 477 ch = iio_find_channel_from_si(indio_dev, i); 487 - length = ch->scan_type.storagebits / 8; 478 + if (ch->scan_type.repeat > 1) 479 + length = ch->scan_type.storagebits / 8 * 480 + ch->scan_type.repeat; 481 + else 482 + length = ch->scan_type.storagebits / 8; 488 483 bytes = ALIGN(bytes, length); 489 484 bytes += length; 490 485 } 491 486 if (timestamp) { 492 487 ch = iio_find_channel_from_si(indio_dev, 493 488 indio_dev->scan_index_timestamp); 494 - length = ch->scan_type.storagebits / 8; 489 + if (ch->scan_type.repeat > 1) 490 + length = ch->scan_type.storagebits / 8 * 491 + ch->scan_type.repeat; 492 + else 493 + length = ch->scan_type.storagebits / 8; 495 494 bytes = ALIGN(bytes, length); 496 495 bytes += length; 497 496 } ··· 976 959 indio_dev->masklength, 977 960 in_ind + 1); 978 961 ch = iio_find_channel_from_si(indio_dev, in_ind); 979 - length = ch->scan_type.storagebits/8; 962 + if (ch->scan_type.repeat > 1) 963 + length = ch->scan_type.storagebits / 8 * 964 + ch->scan_type.repeat; 965 + else 966 + length = ch->scan_type.storagebits / 8; 980 967 /* Make sure we are aligned */ 981 968 in_loc += length; 982 969 if (in_loc % length) ··· 992 971 goto error_clear_mux_table; 993 972 } 994 973 ch = iio_find_channel_from_si(indio_dev, in_ind); 995 - length = ch->scan_type.storagebits/8; 974 + if (ch->scan_type.repeat > 1) 975 + length = ch->scan_type.storagebits / 8 * 976 + ch->scan_type.repeat; 977 + else 978 + length = ch->scan_type.storagebits / 8; 996 979 if (out_loc % length) 997 980 out_loc += length - out_loc % length; 998 981 if (in_loc % length) ··· 1017 992 } 1018 993 ch = iio_find_channel_from_si(indio_dev, 1019 994 indio_dev->scan_index_timestamp); 1020 - length = ch->scan_type.storagebits/8; 995 + if (ch->scan_type.repeat > 1) 996 + length = ch->scan_type.storagebits / 8 * 997 + ch->scan_type.repeat; 998 + else 999 + length = ch->scan_type.storagebits / 8; 1021 1000 if (out_loc % length) 1022 1001 out_loc += length - out_loc % length; 1023 1002 if (in_loc % length)
+46 -22
drivers/iio/industrialio-core.c
··· 84 84 [IIO_MOD_LIGHT_RED] = "red", 85 85 [IIO_MOD_LIGHT_GREEN] = "green", 86 86 [IIO_MOD_LIGHT_BLUE] = "blue", 87 + [IIO_MOD_QUATERNION] = "quaternion", 88 + [IIO_MOD_TEMP_AMBIENT] = "ambient", 89 + [IIO_MOD_TEMP_OBJECT] = "object", 87 90 }; 88 91 89 92 /* relies on pairs of these shared then separate */ ··· 376 373 * @buf: The buffer to which the formated value gets written 377 374 * @type: One of the IIO_VAL_... constants. This decides how the val and val2 378 375 * parameters are formatted. 379 - * @val: First part of the value, exact meaning depends on the type parameter. 380 - * @val2: Second part of the value, exact meaning depends on the type parameter. 376 + * @vals: pointer to the values, exact meaning depends on the type parameter. 381 377 */ 382 - ssize_t iio_format_value(char *buf, unsigned int type, int val, int val2) 378 + ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals) 383 379 { 384 380 unsigned long long tmp; 385 381 bool scale_db = false; 386 382 387 383 switch (type) { 388 384 case IIO_VAL_INT: 389 - return sprintf(buf, "%d\n", val); 385 + return sprintf(buf, "%d\n", vals[0]); 390 386 case IIO_VAL_INT_PLUS_MICRO_DB: 391 387 scale_db = true; 392 388 case IIO_VAL_INT_PLUS_MICRO: 393 - if (val2 < 0) 394 - return sprintf(buf, "-%ld.%06u%s\n", abs(val), -val2, 389 + if (vals[1] < 0) 390 + return sprintf(buf, "-%ld.%06u%s\n", abs(vals[0]), 391 + -vals[1], 395 392 scale_db ? " dB" : ""); 396 393 else 397 - return sprintf(buf, "%d.%06u%s\n", val, val2, 394 + return sprintf(buf, "%d.%06u%s\n", vals[0], vals[1], 398 395 scale_db ? " dB" : ""); 399 396 case IIO_VAL_INT_PLUS_NANO: 400 - if (val2 < 0) 401 - return sprintf(buf, "-%ld.%09u\n", abs(val), -val2); 397 + if (vals[1] < 0) 398 + return sprintf(buf, "-%ld.%09u\n", abs(vals[0]), 399 + -vals[1]); 402 400 else 403 - return sprintf(buf, "%d.%09u\n", val, val2); 401 + return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); 404 402 case IIO_VAL_FRACTIONAL: 405 - tmp = div_s64((s64)val * 1000000000LL, val2); 406 - val2 = do_div(tmp, 1000000000LL); 407 - val = tmp; 408 - return sprintf(buf, "%d.%09u\n", val, val2); 403 + tmp = div_s64((s64)vals[0] * 1000000000LL, vals[1]); 404 + vals[1] = do_div(tmp, 1000000000LL); 405 + vals[0] = tmp; 406 + return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); 409 407 case IIO_VAL_FRACTIONAL_LOG2: 410 - tmp = (s64)val * 1000000000LL >> val2; 411 - val2 = do_div(tmp, 1000000000LL); 412 - val = tmp; 413 - return sprintf(buf, "%d.%09u\n", val, val2); 408 + tmp = (s64)vals[0] * 1000000000LL >> vals[1]; 409 + vals[1] = do_div(tmp, 1000000000LL); 410 + vals[0] = tmp; 411 + return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); 412 + case IIO_VAL_INT_MULTIPLE: 413 + { 414 + int i; 415 + int len = 0; 416 + 417 + for (i = 0; i < size; ++i) 418 + len += snprintf(&buf[len], PAGE_SIZE - len, "%d ", 419 + vals[i]); 420 + len += snprintf(&buf[len], PAGE_SIZE - len, "\n"); 421 + return len; 422 + } 414 423 default: 415 424 return 0; 416 425 } ··· 434 419 { 435 420 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 436 421 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 437 - int val, val2; 438 - int ret = indio_dev->info->read_raw(indio_dev, this_attr->c, 439 - &val, &val2, this_attr->address); 422 + int vals[INDIO_MAX_RAW_ELEMENTS]; 423 + int ret; 424 + int val_len = 2; 425 + 426 + if (indio_dev->info->read_raw_multi) 427 + ret = indio_dev->info->read_raw_multi(indio_dev, this_attr->c, 428 + INDIO_MAX_RAW_ELEMENTS, 429 + vals, &val_len, 430 + this_attr->address); 431 + else 432 + ret = indio_dev->info->read_raw(indio_dev, this_attr->c, 433 + &vals[0], &vals[1], this_attr->address); 440 434 441 435 if (ret < 0) 442 436 return ret; 443 437 444 - return iio_format_value(buf, ret, val, val2); 438 + return iio_format_value(buf, ret, val_len, vals); 445 439 } 446 440 447 441 /**
+4 -2
drivers/iio/industrialio-event.c
··· 270 270 { 271 271 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 272 272 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 273 - int val, val2; 273 + int val, val2, val_arr[2]; 274 274 int ret; 275 275 276 276 ret = indio_dev->info->read_event_value(indio_dev, ··· 279 279 &val, &val2); 280 280 if (ret < 0) 281 281 return ret; 282 - return iio_format_value(buf, ret, val, val2); 282 + val_arr[0] = val; 283 + val_arr[1] = val2; 284 + return iio_format_value(buf, ret, 2, val_arr); 283 285 } 284 286 285 287 static ssize_t iio_ev_value_store(struct device *dev,
+14 -2
drivers/iio/inkern.c
··· 417 417 enum iio_chan_info_enum info) 418 418 { 419 419 int unused; 420 + int vals[INDIO_MAX_RAW_ELEMENTS]; 421 + int ret; 422 + int val_len = 2; 420 423 421 424 if (val2 == NULL) 422 425 val2 = &unused; 423 426 424 - return chan->indio_dev->info->read_raw(chan->indio_dev, chan->channel, 425 - val, val2, info); 427 + if (chan->indio_dev->info->read_raw_multi) { 428 + ret = chan->indio_dev->info->read_raw_multi(chan->indio_dev, 429 + chan->channel, INDIO_MAX_RAW_ELEMENTS, 430 + vals, &val_len, info); 431 + *val = vals[0]; 432 + *val2 = vals[1]; 433 + } else 434 + ret = chan->indio_dev->info->read_raw(chan->indio_dev, 435 + chan->channel, val, val2, info); 436 + 437 + return ret; 426 438 } 427 439 428 440 int iio_read_channel_raw(struct iio_channel *chan, int *val)
+4 -4
drivers/iio/light/gp2ap020a00f.c
··· 5 5 * IIO features supported by the driver: 6 6 * 7 7 * Read-only raw channels: 8 - * - illiminance_clear [lux] 9 - * - illiminance_ir 8 + * - illuminance_clear [lux] 9 + * - illuminance_ir 10 10 * - proximity 11 11 * 12 12 * Triggered buffer: 13 - * - illiminance_clear 14 - * - illiminance_ir 13 + * - illuminance_clear 14 + * - illuminance_ir 15 15 * - proximity 16 16 * 17 17 * Events:
+35 -13
drivers/iio/light/hid-sensor-als.c
··· 22 22 #include <linux/interrupt.h> 23 23 #include <linux/irq.h> 24 24 #include <linux/slab.h> 25 + #include <linux/delay.h> 25 26 #include <linux/hid-sensor-hub.h> 26 27 #include <linux/iio/iio.h> 27 28 #include <linux/iio/sysfs.h> ··· 38 37 struct hid_sensor_common common_attributes; 39 38 struct hid_sensor_hub_attribute_info als_illum; 40 39 u32 illum; 40 + int scale_pre_decml; 41 + int scale_post_decml; 42 + int scale_precision; 43 + int value_offset; 41 44 }; 42 45 43 46 /* Channel definitions */ ··· 50 45 .type = IIO_INTENSITY, 51 46 .modified = 1, 52 47 .channel2 = IIO_MOD_LIGHT_BOTH, 48 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 53 49 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 54 50 BIT(IIO_CHAN_INFO_SCALE) | 55 51 BIT(IIO_CHAN_INFO_SAMP_FREQ) | ··· 81 75 u32 address; 82 76 int ret; 83 77 int ret_type; 78 + s32 poll_value; 84 79 85 80 *val = 0; 86 81 *val2 = 0; ··· 97 90 report_id = -1; 98 91 break; 99 92 } 100 - if (report_id >= 0) 93 + if (report_id >= 0) { 94 + poll_value = hid_sensor_read_poll_value( 95 + &als_state->common_attributes); 96 + if (poll_value < 0) 97 + return -EINVAL; 98 + 99 + hid_sensor_power_state(&als_state->common_attributes, 100 + true); 101 + msleep_interruptible(poll_value * 2); 102 + 101 103 *val = sensor_hub_input_attr_get_raw_value( 102 - als_state->common_attributes.hsdev, 103 - HID_USAGE_SENSOR_ALS, address, 104 - report_id); 105 - else { 104 + als_state->common_attributes.hsdev, 105 + HID_USAGE_SENSOR_ALS, address, 106 + report_id); 107 + hid_sensor_power_state(&als_state->common_attributes, 108 + false); 109 + } else { 106 110 *val = 0; 107 111 return -EINVAL; 108 112 } 109 113 ret_type = IIO_VAL_INT; 110 114 break; 111 115 case IIO_CHAN_INFO_SCALE: 112 - *val = als_state->als_illum.units; 113 - ret_type = IIO_VAL_INT; 116 + *val = als_state->scale_pre_decml; 117 + *val2 = als_state->scale_post_decml; 118 + ret_type = als_state->scale_precision; 114 119 break; 115 120 case IIO_CHAN_INFO_OFFSET: 116 - *val = hid_sensor_convert_exponent( 117 - als_state->als_illum.unit_expo); 121 + *val = als_state->value_offset; 118 122 ret_type = IIO_VAL_INT; 119 123 break; 120 124 case IIO_CHAN_INFO_SAMP_FREQ: ··· 194 176 struct iio_dev *indio_dev = platform_get_drvdata(priv); 195 177 struct als_state *als_state = iio_priv(indio_dev); 196 178 197 - dev_dbg(&indio_dev->dev, "als_proc_event [%d]\n", 198 - als_state->common_attributes.data_ready); 199 - if (als_state->common_attributes.data_ready) 179 + dev_dbg(&indio_dev->dev, "als_proc_event\n"); 180 + if (atomic_read(&als_state->common_attributes.data_ready)) 200 181 hid_sensor_push_data(indio_dev, 201 182 &als_state->illum, 202 183 sizeof(als_state->illum)); ··· 245 228 246 229 dev_dbg(&pdev->dev, "als %x:%x\n", st->als_illum.index, 247 230 st->als_illum.report_id); 231 + 232 + st->scale_precision = hid_sensor_format_scale( 233 + HID_USAGE_SENSOR_ALS, 234 + &st->als_illum, 235 + &st->scale_pre_decml, &st->scale_post_decml); 248 236 249 237 /* Set Sensitivity field ids, when there is no individual modifier */ 250 238 if (st->common_attributes.sensitivity.index < 0) { ··· 318 296 dev_err(&pdev->dev, "failed to initialize trigger buffer\n"); 319 297 goto error_free_dev_mem; 320 298 } 321 - als_state->common_attributes.data_ready = false; 299 + atomic_set(&als_state->common_attributes.data_ready, 0); 322 300 ret = hid_sensor_setup_trigger(indio_dev, name, 323 301 &als_state->common_attributes); 324 302 if (ret < 0) {
+19 -6
drivers/iio/light/hid-sensor-prox.c
··· 21 21 #include <linux/interrupt.h> 22 22 #include <linux/irq.h> 23 23 #include <linux/slab.h> 24 + #include <linux/delay.h> 24 25 #include <linux/hid-sensor-hub.h> 25 26 #include <linux/iio/iio.h> 26 27 #include <linux/iio/sysfs.h> ··· 76 75 u32 address; 77 76 int ret; 78 77 int ret_type; 78 + s32 poll_value; 79 79 80 80 *val = 0; 81 81 *val2 = 0; ··· 92 90 report_id = -1; 93 91 break; 94 92 } 95 - if (report_id >= 0) 93 + if (report_id >= 0) { 94 + poll_value = hid_sensor_read_poll_value( 95 + &prox_state->common_attributes); 96 + if (poll_value < 0) 97 + return -EINVAL; 98 + 99 + hid_sensor_power_state(&prox_state->common_attributes, 100 + true); 101 + 102 + msleep_interruptible(poll_value * 2); 103 + 96 104 *val = sensor_hub_input_attr_get_raw_value( 97 105 prox_state->common_attributes.hsdev, 98 106 HID_USAGE_SENSOR_PROX, address, 99 107 report_id); 100 - else { 108 + hid_sensor_power_state(&prox_state->common_attributes, 109 + false); 110 + } else { 101 111 *val = 0; 102 112 return -EINVAL; 103 113 } ··· 190 176 struct iio_dev *indio_dev = platform_get_drvdata(priv); 191 177 struct prox_state *prox_state = iio_priv(indio_dev); 192 178 193 - dev_dbg(&indio_dev->dev, "prox_proc_event [%d]\n", 194 - prox_state->common_attributes.data_ready); 195 - if (prox_state->common_attributes.data_ready) 179 + dev_dbg(&indio_dev->dev, "prox_proc_event\n"); 180 + if (atomic_read(&prox_state->common_attributes.data_ready)) 196 181 hid_sensor_push_data(indio_dev, 197 182 &prox_state->human_presence, 198 183 sizeof(prox_state->human_presence)); ··· 310 297 dev_err(&pdev->dev, "failed to initialize trigger buffer\n"); 311 298 goto error_free_dev_mem; 312 299 } 313 - prox_state->common_attributes.data_ready = false; 300 + atomic_set(&prox_state->common_attributes.data_ready, 0); 314 301 ret = hid_sensor_setup_trigger(indio_dev, name, 315 302 &prox_state->common_attributes); 316 303 if (ret) {
-1
drivers/iio/magnetometer/ak8975.c
··· 569 569 indio_dev->channels = ak8975_channels; 570 570 indio_dev->num_channels = ARRAY_SIZE(ak8975_channels); 571 571 indio_dev->info = &ak8975_info; 572 - indio_dev->name = id->name; 573 572 indio_dev->modes = INDIO_DIRECT_MODE; 574 573 indio_dev->name = name; 575 574 err = iio_device_register(indio_dev);
+32 -8
drivers/iio/magnetometer/hid-sensor-magn-3d.c
··· 22 22 #include <linux/interrupt.h> 23 23 #include <linux/irq.h> 24 24 #include <linux/slab.h> 25 + #include <linux/delay.h> 25 26 #include <linux/hid-sensor-hub.h> 26 27 #include <linux/iio/iio.h> 27 28 #include <linux/iio/sysfs.h> ··· 43 42 struct hid_sensor_common common_attributes; 44 43 struct hid_sensor_hub_attribute_info magn[MAGN_3D_CHANNEL_MAX]; 45 44 u32 magn_val[MAGN_3D_CHANNEL_MAX]; 45 + int scale_pre_decml; 46 + int scale_post_decml; 47 + int scale_precision; 48 + int value_offset; 46 49 }; 47 50 48 51 static const u32 magn_3d_addresses[MAGN_3D_CHANNEL_MAX] = { ··· 61 56 .type = IIO_MAGN, 62 57 .modified = 1, 63 58 .channel2 = IIO_MOD_X, 59 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 64 60 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 65 61 BIT(IIO_CHAN_INFO_SCALE) | 66 62 BIT(IIO_CHAN_INFO_SAMP_FREQ) | ··· 71 65 .type = IIO_MAGN, 72 66 .modified = 1, 73 67 .channel2 = IIO_MOD_Y, 68 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 74 69 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 75 70 BIT(IIO_CHAN_INFO_SCALE) | 76 71 BIT(IIO_CHAN_INFO_SAMP_FREQ) | ··· 81 74 .type = IIO_MAGN, 82 75 .modified = 1, 83 76 .channel2 = IIO_MOD_Z, 77 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 84 78 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 85 79 BIT(IIO_CHAN_INFO_SCALE) | 86 80 BIT(IIO_CHAN_INFO_SAMP_FREQ) | ··· 112 104 u32 address; 113 105 int ret; 114 106 int ret_type; 107 + s32 poll_value; 115 108 116 109 *val = 0; 117 110 *val2 = 0; 118 111 switch (mask) { 119 112 case 0: 113 + poll_value = hid_sensor_read_poll_value( 114 + &magn_state->common_attributes); 115 + if (poll_value < 0) 116 + return -EINVAL; 117 + 118 + hid_sensor_power_state(&magn_state->common_attributes, true); 119 + msleep_interruptible(poll_value * 2); 120 + 120 121 report_id = 121 122 magn_state->magn[chan->scan_index].report_id; 122 123 address = magn_3d_addresses[chan->scan_index]; ··· 136 119 report_id); 137 120 else { 138 121 *val = 0; 122 + hid_sensor_power_state(&magn_state->common_attributes, 123 + false); 139 124 return -EINVAL; 140 125 } 126 + hid_sensor_power_state(&magn_state->common_attributes, false); 141 127 ret_type = IIO_VAL_INT; 142 128 break; 143 129 case IIO_CHAN_INFO_SCALE: 144 - *val = magn_state->magn[CHANNEL_SCAN_INDEX_X].units; 145 - ret_type = IIO_VAL_INT; 130 + *val = magn_state->scale_pre_decml; 131 + *val2 = magn_state->scale_post_decml; 132 + ret_type = magn_state->scale_precision; 146 133 break; 147 134 case IIO_CHAN_INFO_OFFSET: 148 - *val = hid_sensor_convert_exponent( 149 - magn_state->magn[CHANNEL_SCAN_INDEX_X].unit_expo); 135 + *val = magn_state->value_offset; 150 136 ret_type = IIO_VAL_INT; 151 137 break; 152 138 case IIO_CHAN_INFO_SAMP_FREQ: ··· 218 198 struct iio_dev *indio_dev = platform_get_drvdata(priv); 219 199 struct magn_3d_state *magn_state = iio_priv(indio_dev); 220 200 221 - dev_dbg(&indio_dev->dev, "magn_3d_proc_event [%d]\n", 222 - magn_state->common_attributes.data_ready); 223 - if (magn_state->common_attributes.data_ready) 201 + dev_dbg(&indio_dev->dev, "magn_3d_proc_event\n"); 202 + if (atomic_read(&magn_state->common_attributes.data_ready)) 224 203 hid_sensor_push_data(indio_dev, 225 204 magn_state->magn_val, 226 205 sizeof(magn_state->magn_val)); ··· 281 262 st->magn[0].report_id, 282 263 st->magn[1].index, st->magn[1].report_id, 283 264 st->magn[2].index, st->magn[2].report_id); 265 + 266 + st->scale_precision = hid_sensor_format_scale( 267 + HID_USAGE_SENSOR_COMPASS_3D, 268 + &st->magn[CHANNEL_SCAN_INDEX_X], 269 + &st->scale_pre_decml, &st->scale_post_decml); 284 270 285 271 /* Set Sensitivity field ids, when there is no individual modifier */ 286 272 if (st->common_attributes.sensitivity.index < 0) { ··· 358 334 dev_err(&pdev->dev, "failed to initialize trigger buffer\n"); 359 335 goto error_free_dev_mem; 360 336 } 361 - magn_state->common_attributes.data_ready = false; 337 + atomic_set(&magn_state->common_attributes.data_ready, 0); 362 338 ret = hid_sensor_setup_trigger(indio_dev, name, 363 339 &magn_state->common_attributes); 364 340 if (ret < 0) {
+16 -3
drivers/iio/magnetometer/mag3110.c
··· 199 199 *val = mag3110_samp_freq[i][0]; 200 200 *val2 = mag3110_samp_freq[i][1]; 201 201 return IIO_VAL_INT_PLUS_MICRO; 202 + case IIO_CHAN_INFO_CALIBBIAS: 203 + ret = i2c_smbus_read_word_swapped(data->client, 204 + MAG3110_OFF_X + 2 * chan->scan_index); 205 + if (ret < 0) 206 + return ret; 207 + *val = sign_extend32(ret >> 1, 14); 208 + return IIO_VAL_INT; 202 209 } 203 210 return -EINVAL; 204 211 } ··· 230 223 data->ctrl_reg1 |= rate << MAG3110_CTRL_DR_SHIFT; 231 224 return i2c_smbus_write_byte_data(data->client, 232 225 MAG3110_CTRL_REG1, data->ctrl_reg1); 226 + case IIO_CHAN_INFO_CALIBBIAS: 227 + if (val < -10000 || val > 10000) 228 + return -EINVAL; 229 + return i2c_smbus_write_word_swapped(data->client, 230 + MAG3110_OFF_X + 2 * chan->scan_index, val << 1); 233 231 default: 234 232 return -EINVAL; 235 233 } ··· 272 260 .type = IIO_MAGN, \ 273 261 .modified = 1, \ 274 262 .channel2 = IIO_MOD_##axis, \ 275 - .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 263 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 264 + BIT(IIO_CHAN_INFO_CALIBBIAS), \ 276 265 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ 277 266 BIT(IIO_CHAN_INFO_SCALE), \ 278 267 .scan_index = idx, \ ··· 351 338 indio_dev->num_channels = ARRAY_SIZE(mag3110_channels); 352 339 indio_dev->available_scan_masks = mag3110_scan_masks; 353 340 354 - data->ctrl_reg1 = MAG3110_CTRL_DR_DEFAULT; 341 + data->ctrl_reg1 = MAG3110_CTRL_DR_DEFAULT << MAG3110_CTRL_DR_SHIFT; 355 342 ret = i2c_smbus_write_byte_data(client, MAG3110_CTRL_REG1, 356 343 data->ctrl_reg1); 357 344 if (ret < 0) 358 345 return ret; 359 346 360 347 ret = i2c_smbus_write_byte_data(client, MAG3110_CTRL_REG2, 361 - MAG3110_CTRL_AUTO_MRST_EN | MAG3110_CTRL_RAW); 348 + MAG3110_CTRL_AUTO_MRST_EN); 362 349 if (ret < 0) 363 350 return ret; 364 351
+12
drivers/iio/orientation/Kconfig
··· 16 16 Say yes here to build support for the HID SENSOR 17 17 Inclinometer 3D. 18 18 19 + config HID_SENSOR_DEVICE_ROTATION 20 + depends on HID_SENSOR_HUB 21 + select IIO_BUFFER 22 + select IIO_TRIGGERED_BUFFER 23 + select HID_SENSOR_IIO_COMMON 24 + select HID_SENSOR_IIO_TRIGGER 25 + tristate "HID Device Rotation" 26 + help 27 + Say yes here to build support for the HID SENSOR 28 + device rotation. The output of a device rotation sensor 29 + is presented using quaternion format. 30 + 19 31 endmenu
+1
drivers/iio/orientation/Makefile
··· 4 4 5 5 # When adding new entries keep the list in alphabetical order 6 6 obj-$(CONFIG_HID_SENSOR_INCLINOMETER_3D) += hid-sensor-incl-3d.o 7 + obj-$(CONFIG_HID_SENSOR_DEVICE_ROTATION) += hid-sensor-rotation.o
+29 -8
drivers/iio/orientation/hid-sensor-incl-3d.c
··· 22 22 #include <linux/interrupt.h> 23 23 #include <linux/irq.h> 24 24 #include <linux/slab.h> 25 + #include <linux/delay.h> 25 26 #include <linux/hid-sensor-hub.h> 26 27 #include <linux/iio/iio.h> 27 28 #include <linux/iio/sysfs.h> ··· 43 42 struct hid_sensor_common common_attributes; 44 43 struct hid_sensor_hub_attribute_info incl[INCLI_3D_CHANNEL_MAX]; 45 44 u32 incl_val[INCLI_3D_CHANNEL_MAX]; 45 + int scale_pre_decml; 46 + int scale_post_decml; 47 + int scale_precision; 48 + int value_offset; 46 49 }; 47 50 48 51 static const u32 incl_3d_addresses[INCLI_3D_CHANNEL_MAX] = { ··· 111 106 int report_id = -1; 112 107 u32 address; 113 108 int ret_type; 109 + s32 poll_value; 114 110 115 111 *val = 0; 116 112 *val2 = 0; 117 113 switch (mask) { 118 114 case IIO_CHAN_INFO_RAW: 115 + poll_value = hid_sensor_read_poll_value( 116 + &incl_state->common_attributes); 117 + if (poll_value < 0) 118 + return -EINVAL; 119 + 120 + hid_sensor_power_state(&incl_state->common_attributes, true); 121 + msleep_interruptible(poll_value * 2); 122 + 119 123 report_id = 120 124 incl_state->incl[chan->scan_index].report_id; 121 125 address = incl_3d_addresses[chan->scan_index]; ··· 134 120 HID_USAGE_SENSOR_INCLINOMETER_3D, address, 135 121 report_id); 136 122 else { 123 + hid_sensor_power_state(&incl_state->common_attributes, 124 + false); 137 125 return -EINVAL; 138 126 } 127 + hid_sensor_power_state(&incl_state->common_attributes, false); 139 128 ret_type = IIO_VAL_INT; 140 129 break; 141 130 case IIO_CHAN_INFO_SCALE: 142 - *val = incl_state->incl[CHANNEL_SCAN_INDEX_X].units; 143 - ret_type = IIO_VAL_INT; 131 + *val = incl_state->scale_pre_decml; 132 + *val2 = incl_state->scale_post_decml; 133 + ret_type = incl_state->scale_precision; 144 134 break; 145 135 case IIO_CHAN_INFO_OFFSET: 146 - *val = hid_sensor_convert_exponent( 147 - incl_state->incl[CHANNEL_SCAN_INDEX_X].unit_expo); 136 + *val = incl_state->value_offset; 148 137 ret_type = IIO_VAL_INT; 149 138 break; 150 139 case IIO_CHAN_INFO_SAMP_FREQ: ··· 213 196 struct iio_dev *indio_dev = platform_get_drvdata(priv); 214 197 struct incl_3d_state *incl_state = iio_priv(indio_dev); 215 198 216 - dev_dbg(&indio_dev->dev, "incl_3d_proc_event [%d]\n", 217 - incl_state->common_attributes.data_ready); 218 - if (incl_state->common_attributes.data_ready) 199 + dev_dbg(&indio_dev->dev, "incl_3d_proc_event\n"); 200 + if (atomic_read(&incl_state->common_attributes.data_ready)) 219 201 hid_sensor_push_data(indio_dev, 220 202 (u8 *)incl_state->incl_val, 221 203 sizeof(incl_state->incl_val)); ··· 295 279 st->incl[1].index, st->incl[1].report_id, 296 280 st->incl[2].index, st->incl[2].report_id); 297 281 282 + st->scale_precision = hid_sensor_format_scale( 283 + HID_USAGE_SENSOR_INCLINOMETER_3D, 284 + &st->incl[CHANNEL_SCAN_INDEX_X], 285 + &st->scale_pre_decml, &st->scale_post_decml); 286 + 298 287 /* Set Sensitivity field ids, when there is no individual modifier */ 299 288 if (st->common_attributes.sensitivity.index < 0) { 300 289 sensor_hub_input_get_attribute_info(hsdev, ··· 370 349 dev_err(&pdev->dev, "failed to initialize trigger buffer\n"); 371 350 goto error_free_dev_mem; 372 351 } 373 - incl_state->common_attributes.data_ready = false; 352 + atomic_set(&incl_state->common_attributes.data_ready, 0); 374 353 ret = hid_sensor_setup_trigger(indio_dev, name, 375 354 &incl_state->common_attributes); 376 355 if (ret) {
+346
drivers/iio/orientation/hid-sensor-rotation.c
··· 1 + /* 2 + * HID Sensors Driver 3 + * Copyright (c) 2014, Intel Corporation. 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms and conditions of the GNU General Public License, 7 + * version 2, as published by the Free Software Foundation. 8 + * 9 + * This program is distributed in the hope it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + */ 14 + 15 + #include <linux/device.h> 16 + #include <linux/platform_device.h> 17 + #include <linux/module.h> 18 + #include <linux/interrupt.h> 19 + #include <linux/irq.h> 20 + #include <linux/slab.h> 21 + #include <linux/hid-sensor-hub.h> 22 + #include <linux/iio/iio.h> 23 + #include <linux/iio/sysfs.h> 24 + #include <linux/iio/buffer.h> 25 + #include <linux/iio/trigger_consumer.h> 26 + #include <linux/iio/triggered_buffer.h> 27 + #include "../common/hid-sensors/hid-sensor-trigger.h" 28 + 29 + struct dev_rot_state { 30 + struct hid_sensor_hub_callbacks callbacks; 31 + struct hid_sensor_common common_attributes; 32 + struct hid_sensor_hub_attribute_info quaternion; 33 + u32 sampled_vals[4]; 34 + }; 35 + 36 + /* Channel definitions */ 37 + static const struct iio_chan_spec dev_rot_channels[] = { 38 + { 39 + .type = IIO_ROT, 40 + .modified = 1, 41 + .channel2 = IIO_MOD_QUATERNION, 42 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 43 + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | 44 + BIT(IIO_CHAN_INFO_HYSTERESIS) 45 + } 46 + }; 47 + 48 + /* Adjust channel real bits based on report descriptor */ 49 + static void dev_rot_adjust_channel_bit_mask(struct iio_chan_spec *chan, 50 + int size) 51 + { 52 + chan->scan_type.sign = 's'; 53 + /* Real storage bits will change based on the report desc. */ 54 + chan->scan_type.realbits = size * 8; 55 + /* Maximum size of a sample to capture is u32 */ 56 + chan->scan_type.storagebits = sizeof(u32) * 8; 57 + chan->scan_type.repeat = 4; 58 + } 59 + 60 + /* Channel read_raw handler */ 61 + static int dev_rot_read_raw(struct iio_dev *indio_dev, 62 + struct iio_chan_spec const *chan, 63 + int size, int *vals, int *val_len, 64 + long mask) 65 + { 66 + struct dev_rot_state *rot_state = iio_priv(indio_dev); 67 + int ret_type; 68 + int i; 69 + 70 + vals[0] = 0; 71 + vals[1] = 0; 72 + 73 + switch (mask) { 74 + case IIO_CHAN_INFO_RAW: 75 + if (size >= 4) { 76 + for (i = 0; i < 4; ++i) 77 + vals[i] = rot_state->sampled_vals[i]; 78 + ret_type = IIO_VAL_INT_MULTIPLE; 79 + *val_len = 4; 80 + } else 81 + ret_type = -EINVAL; 82 + break; 83 + case IIO_CHAN_INFO_SAMP_FREQ: 84 + ret_type = hid_sensor_read_samp_freq_value( 85 + &rot_state->common_attributes, &vals[0], &vals[1]); 86 + break; 87 + case IIO_CHAN_INFO_HYSTERESIS: 88 + ret_type = hid_sensor_read_raw_hyst_value( 89 + &rot_state->common_attributes, &vals[0], &vals[1]); 90 + break; 91 + default: 92 + ret_type = -EINVAL; 93 + break; 94 + } 95 + 96 + return ret_type; 97 + } 98 + 99 + /* Channel write_raw handler */ 100 + static int dev_rot_write_raw(struct iio_dev *indio_dev, 101 + struct iio_chan_spec const *chan, 102 + int val, 103 + int val2, 104 + long mask) 105 + { 106 + struct dev_rot_state *rot_state = iio_priv(indio_dev); 107 + int ret; 108 + 109 + switch (mask) { 110 + case IIO_CHAN_INFO_SAMP_FREQ: 111 + ret = hid_sensor_write_samp_freq_value( 112 + &rot_state->common_attributes, val, val2); 113 + break; 114 + case IIO_CHAN_INFO_HYSTERESIS: 115 + ret = hid_sensor_write_raw_hyst_value( 116 + &rot_state->common_attributes, val, val2); 117 + break; 118 + default: 119 + ret = -EINVAL; 120 + } 121 + 122 + return ret; 123 + } 124 + 125 + static const struct iio_info dev_rot_info = { 126 + .driver_module = THIS_MODULE, 127 + .read_raw_multi = &dev_rot_read_raw, 128 + .write_raw = &dev_rot_write_raw, 129 + }; 130 + 131 + /* Function to push data to buffer */ 132 + static void hid_sensor_push_data(struct iio_dev *indio_dev, u8 *data, int len) 133 + { 134 + dev_dbg(&indio_dev->dev, "hid_sensor_push_data >>\n"); 135 + iio_push_to_buffers(indio_dev, (u8 *)data); 136 + dev_dbg(&indio_dev->dev, "hid_sensor_push_data <<\n"); 137 + 138 + } 139 + 140 + /* Callback handler to send event after all samples are received and captured */ 141 + static int dev_rot_proc_event(struct hid_sensor_hub_device *hsdev, 142 + unsigned usage_id, 143 + void *priv) 144 + { 145 + struct iio_dev *indio_dev = platform_get_drvdata(priv); 146 + struct dev_rot_state *rot_state = iio_priv(indio_dev); 147 + 148 + dev_dbg(&indio_dev->dev, "dev_rot_proc_event\n"); 149 + if (atomic_read(&rot_state->common_attributes.data_ready)) 150 + hid_sensor_push_data(indio_dev, 151 + (u8 *)rot_state->sampled_vals, 152 + sizeof(rot_state->sampled_vals)); 153 + 154 + return 0; 155 + } 156 + 157 + /* Capture samples in local storage */ 158 + static int dev_rot_capture_sample(struct hid_sensor_hub_device *hsdev, 159 + unsigned usage_id, 160 + size_t raw_len, char *raw_data, 161 + void *priv) 162 + { 163 + struct iio_dev *indio_dev = platform_get_drvdata(priv); 164 + struct dev_rot_state *rot_state = iio_priv(indio_dev); 165 + 166 + if (usage_id == HID_USAGE_SENSOR_ORIENT_QUATERNION) { 167 + memcpy(rot_state->sampled_vals, raw_data, 168 + sizeof(rot_state->sampled_vals)); 169 + dev_dbg(&indio_dev->dev, "Recd Quat len:%zu::%zu\n", raw_len, 170 + sizeof(rot_state->sampled_vals)); 171 + } 172 + 173 + return 0; 174 + } 175 + 176 + /* Parse report which is specific to an usage id*/ 177 + static int dev_rot_parse_report(struct platform_device *pdev, 178 + struct hid_sensor_hub_device *hsdev, 179 + struct iio_chan_spec *channels, 180 + unsigned usage_id, 181 + struct dev_rot_state *st) 182 + { 183 + int ret; 184 + 185 + ret = sensor_hub_input_get_attribute_info(hsdev, 186 + HID_INPUT_REPORT, 187 + usage_id, 188 + HID_USAGE_SENSOR_ORIENT_QUATERNION, 189 + &st->quaternion); 190 + if (ret) 191 + return ret; 192 + 193 + dev_rot_adjust_channel_bit_mask(&channels[0], 194 + st->quaternion.size / 4); 195 + 196 + dev_dbg(&pdev->dev, "dev_rot %x:%x\n", st->quaternion.index, 197 + st->quaternion.report_id); 198 + 199 + dev_dbg(&pdev->dev, "dev_rot: attrib size %d\n", 200 + st->quaternion.size); 201 + 202 + /* Set Sensitivity field ids, when there is no individual modifier */ 203 + if (st->common_attributes.sensitivity.index < 0) { 204 + sensor_hub_input_get_attribute_info(hsdev, 205 + HID_FEATURE_REPORT, usage_id, 206 + HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS | 207 + HID_USAGE_SENSOR_DATA_ORIENTATION, 208 + &st->common_attributes.sensitivity); 209 + dev_dbg(&pdev->dev, "Sensitivity index:report %d:%d\n", 210 + st->common_attributes.sensitivity.index, 211 + st->common_attributes.sensitivity.report_id); 212 + } 213 + 214 + return 0; 215 + } 216 + 217 + /* Function to initialize the processing for usage id */ 218 + static int hid_dev_rot_probe(struct platform_device *pdev) 219 + { 220 + int ret; 221 + static char *name = "dev_rotation"; 222 + struct iio_dev *indio_dev; 223 + struct dev_rot_state *rot_state; 224 + struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; 225 + struct iio_chan_spec *channels; 226 + 227 + indio_dev = devm_iio_device_alloc(&pdev->dev, 228 + sizeof(struct dev_rot_state)); 229 + if (indio_dev == NULL) 230 + return -ENOMEM; 231 + 232 + platform_set_drvdata(pdev, indio_dev); 233 + 234 + rot_state = iio_priv(indio_dev); 235 + rot_state->common_attributes.hsdev = hsdev; 236 + rot_state->common_attributes.pdev = pdev; 237 + 238 + ret = hid_sensor_parse_common_attributes(hsdev, 239 + HID_USAGE_SENSOR_DEVICE_ORIENTATION, 240 + &rot_state->common_attributes); 241 + if (ret) { 242 + dev_err(&pdev->dev, "failed to setup common attributes\n"); 243 + return ret; 244 + } 245 + 246 + channels = devm_kmemdup(&pdev->dev, dev_rot_channels, 247 + sizeof(dev_rot_channels), GFP_KERNEL); 248 + if (!channels) { 249 + dev_err(&pdev->dev, "failed to duplicate channels\n"); 250 + return -ENOMEM; 251 + } 252 + 253 + ret = dev_rot_parse_report(pdev, hsdev, channels, 254 + HID_USAGE_SENSOR_DEVICE_ORIENTATION, rot_state); 255 + if (ret) { 256 + dev_err(&pdev->dev, "failed to setup attributes\n"); 257 + return ret; 258 + } 259 + 260 + indio_dev->channels = channels; 261 + indio_dev->num_channels = ARRAY_SIZE(dev_rot_channels); 262 + indio_dev->dev.parent = &pdev->dev; 263 + indio_dev->info = &dev_rot_info; 264 + indio_dev->name = name; 265 + indio_dev->modes = INDIO_DIRECT_MODE; 266 + 267 + ret = iio_triggered_buffer_setup(indio_dev, &iio_pollfunc_store_time, 268 + NULL, NULL); 269 + if (ret) { 270 + dev_err(&pdev->dev, "failed to initialize trigger buffer\n"); 271 + return ret; 272 + } 273 + atomic_set(&rot_state->common_attributes.data_ready, 0); 274 + ret = hid_sensor_setup_trigger(indio_dev, name, 275 + &rot_state->common_attributes); 276 + if (ret) { 277 + dev_err(&pdev->dev, "trigger setup failed\n"); 278 + goto error_unreg_buffer_funcs; 279 + } 280 + 281 + ret = iio_device_register(indio_dev); 282 + if (ret) { 283 + dev_err(&pdev->dev, "device register failed\n"); 284 + goto error_remove_trigger; 285 + } 286 + 287 + rot_state->callbacks.send_event = dev_rot_proc_event; 288 + rot_state->callbacks.capture_sample = dev_rot_capture_sample; 289 + rot_state->callbacks.pdev = pdev; 290 + ret = sensor_hub_register_callback(hsdev, 291 + HID_USAGE_SENSOR_DEVICE_ORIENTATION, 292 + &rot_state->callbacks); 293 + if (ret) { 294 + dev_err(&pdev->dev, "callback reg failed\n"); 295 + goto error_iio_unreg; 296 + } 297 + 298 + return 0; 299 + 300 + error_iio_unreg: 301 + iio_device_unregister(indio_dev); 302 + error_remove_trigger: 303 + hid_sensor_remove_trigger(&rot_state->common_attributes); 304 + error_unreg_buffer_funcs: 305 + iio_triggered_buffer_cleanup(indio_dev); 306 + return ret; 307 + } 308 + 309 + /* Function to deinitialize the processing for usage id */ 310 + static int hid_dev_rot_remove(struct platform_device *pdev) 311 + { 312 + struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; 313 + struct iio_dev *indio_dev = platform_get_drvdata(pdev); 314 + struct dev_rot_state *rot_state = iio_priv(indio_dev); 315 + 316 + sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_DEVICE_ORIENTATION); 317 + iio_device_unregister(indio_dev); 318 + hid_sensor_remove_trigger(&rot_state->common_attributes); 319 + iio_triggered_buffer_cleanup(indio_dev); 320 + 321 + return 0; 322 + } 323 + 324 + static struct platform_device_id hid_dev_rot_ids[] = { 325 + { 326 + /* Format: HID-SENSOR-usage_id_in_hex_lowercase */ 327 + .name = "HID-SENSOR-20008a", 328 + }, 329 + { /* sentinel */ } 330 + }; 331 + MODULE_DEVICE_TABLE(platform, hid_dev_rot_ids); 332 + 333 + static struct platform_driver hid_dev_rot_platform_driver = { 334 + .id_table = hid_dev_rot_ids, 335 + .driver = { 336 + .name = KBUILD_MODNAME, 337 + .owner = THIS_MODULE, 338 + }, 339 + .probe = hid_dev_rot_probe, 340 + .remove = hid_dev_rot_remove, 341 + }; 342 + module_platform_driver(hid_dev_rot_platform_driver); 343 + 344 + MODULE_DESCRIPTION("HID Sensor Device Rotation"); 345 + MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>"); 346 + MODULE_LICENSE("GPL");
+10
drivers/iio/pressure/Kconfig
··· 19 19 To compile this driver as a module, choose M here: the module 20 20 will be called hid-sensor-press. 21 21 22 + config MPL115 23 + tristate "Freescale MPL115A2 pressure sensor driver" 24 + depends on I2C 25 + help 26 + Say yes here to build support for the Freescale MPL115A2 27 + pressure sensor connected via I2C. 28 + 29 + To compile this driver as a module, choose M here: the module 30 + will be called mpl115. 31 + 22 32 config MPL3115 23 33 tristate "Freescale MPL3115A2 pressure sensor driver" 24 34 depends on I2C
+1
drivers/iio/pressure/Makefile
··· 4 4 5 5 # When adding new entries keep the list in alphabetical order 6 6 obj-$(CONFIG_HID_SENSOR_PRESS) += hid-sensor-press.o 7 + obj-$(CONFIG_MPL115) += mpl115.o 7 8 obj-$(CONFIG_MPL3115) += mpl3115.o 8 9 obj-$(CONFIG_IIO_ST_PRESS) += st_pressure.o 9 10 st_pressure-y := st_pressure_core.o
+31 -10
drivers/iio/pressure/hid-sensor-press.c
··· 21 21 #include <linux/interrupt.h> 22 22 #include <linux/irq.h> 23 23 #include <linux/slab.h> 24 + #include <linux/delay.h> 24 25 #include <linux/hid-sensor-hub.h> 25 26 #include <linux/iio/iio.h> 26 27 #include <linux/iio/sysfs.h> ··· 37 36 struct hid_sensor_common common_attributes; 38 37 struct hid_sensor_hub_attribute_info press_attr; 39 38 u32 press_data; 39 + int scale_pre_decml; 40 + int scale_post_decml; 41 + int scale_precision; 42 + int value_offset; 40 43 }; 41 44 42 45 /* Channel definitions */ ··· 80 75 u32 address; 81 76 int ret; 82 77 int ret_type; 78 + s32 poll_value; 83 79 84 80 *val = 0; 85 81 *val2 = 0; ··· 96 90 report_id = -1; 97 91 break; 98 92 } 99 - if (report_id >= 0) 93 + if (report_id >= 0) { 94 + poll_value = hid_sensor_read_poll_value( 95 + &press_state->common_attributes); 96 + if (poll_value < 0) 97 + return -EINVAL; 98 + hid_sensor_power_state(&press_state->common_attributes, 99 + true); 100 + 101 + msleep_interruptible(poll_value * 2); 102 + 100 103 *val = sensor_hub_input_attr_get_raw_value( 101 104 press_state->common_attributes.hsdev, 102 105 HID_USAGE_SENSOR_PRESSURE, address, 103 106 report_id); 104 - else { 107 + hid_sensor_power_state(&press_state->common_attributes, 108 + false); 109 + } else { 105 110 *val = 0; 106 111 return -EINVAL; 107 112 } 108 113 ret_type = IIO_VAL_INT; 109 114 break; 110 115 case IIO_CHAN_INFO_SCALE: 111 - *val = press_state->press_attr.units; 112 - ret_type = IIO_VAL_INT; 116 + *val = press_state->scale_pre_decml; 117 + *val2 = press_state->scale_post_decml; 118 + ret_type = press_state->scale_precision; 113 119 break; 114 120 case IIO_CHAN_INFO_OFFSET: 115 - *val = hid_sensor_convert_exponent( 116 - press_state->press_attr.unit_expo); 121 + *val = press_state->value_offset; 117 122 ret_type = IIO_VAL_INT; 118 123 break; 119 124 case IIO_CHAN_INFO_SAMP_FREQ: ··· 193 176 struct iio_dev *indio_dev = platform_get_drvdata(priv); 194 177 struct press_state *press_state = iio_priv(indio_dev); 195 178 196 - dev_dbg(&indio_dev->dev, "press_proc_event [%d]\n", 197 - press_state->common_attributes.data_ready); 198 - if (press_state->common_attributes.data_ready) 179 + dev_dbg(&indio_dev->dev, "press_proc_event\n"); 180 + if (atomic_read(&press_state->common_attributes.data_ready)) 199 181 hid_sensor_push_data(indio_dev, 200 182 &press_state->press_data, 201 183 sizeof(press_state->press_data)); ··· 244 228 245 229 dev_dbg(&pdev->dev, "press %x:%x\n", st->press_attr.index, 246 230 st->press_attr.report_id); 231 + 232 + st->scale_precision = hid_sensor_format_scale( 233 + HID_USAGE_SENSOR_PRESSURE, 234 + &st->press_attr, 235 + &st->scale_pre_decml, &st->scale_post_decml); 247 236 248 237 /* Set Sensitivity field ids, when there is no individual modifier */ 249 238 if (st->common_attributes.sensitivity.index < 0) { ··· 319 298 dev_err(&pdev->dev, "failed to initialize trigger buffer\n"); 320 299 goto error_free_dev_mem; 321 300 } 322 - press_state->common_attributes.data_ready = false; 301 + atomic_set(&press_state->common_attributes.data_ready, 0); 323 302 ret = hid_sensor_setup_trigger(indio_dev, name, 324 303 &press_state->common_attributes); 325 304 if (ret) {
+211
drivers/iio/pressure/mpl115.c
··· 1 + /* 2 + * mpl115.c - Support for Freescale MPL115A2 pressure/temperature sensor 3 + * 4 + * Copyright (c) 2014 Peter Meerwald <pmeerw@pmeerw.net> 5 + * 6 + * This file is subject to the terms and conditions of version 2 of 7 + * the GNU General Public License. See the file COPYING in the main 8 + * directory of this archive for more details. 9 + * 10 + * (7-bit I2C slave address 0x60) 11 + * 12 + * TODO: shutdown pin 13 + * 14 + */ 15 + 16 + #include <linux/module.h> 17 + #include <linux/i2c.h> 18 + #include <linux/iio/iio.h> 19 + #include <linux/delay.h> 20 + 21 + #define MPL115_PADC 0x00 /* pressure ADC output value, MSB first, 10 bit */ 22 + #define MPL115_TADC 0x02 /* temperature ADC output value, MSB first, 10 bit */ 23 + #define MPL115_A0 0x04 /* 12 bit integer, 3 bit fraction */ 24 + #define MPL115_B1 0x06 /* 2 bit integer, 13 bit fraction */ 25 + #define MPL115_B2 0x08 /* 1 bit integer, 14 bit fraction */ 26 + #define MPL115_C12 0x0a /* 0 bit integer, 13 bit fraction */ 27 + #define MPL115_CONVERT 0x12 /* convert temperature and pressure */ 28 + 29 + struct mpl115_data { 30 + struct i2c_client *client; 31 + struct mutex lock; 32 + s16 a0; 33 + s16 b1, b2; 34 + s16 c12; 35 + }; 36 + 37 + static int mpl115_request(struct mpl115_data *data) 38 + { 39 + int ret = i2c_smbus_write_byte_data(data->client, MPL115_CONVERT, 0); 40 + if (ret < 0) 41 + return ret; 42 + 43 + usleep_range(3000, 4000); 44 + 45 + return 0; 46 + } 47 + 48 + static int mpl115_comp_pressure(struct mpl115_data *data, int *val, int *val2) 49 + { 50 + int ret; 51 + u16 padc, tadc; 52 + int a1, y1, pcomp; 53 + unsigned kpa; 54 + 55 + mutex_lock(&data->lock); 56 + ret = mpl115_request(data); 57 + if (ret < 0) 58 + goto done; 59 + 60 + ret = i2c_smbus_read_word_swapped(data->client, MPL115_PADC); 61 + if (ret < 0) 62 + goto done; 63 + padc = ret >> 6; 64 + 65 + ret = i2c_smbus_read_word_swapped(data->client, MPL115_TADC); 66 + if (ret < 0) 67 + goto done; 68 + tadc = ret >> 6; 69 + 70 + /* see Freescale AN3785 */ 71 + a1 = data->b1 + ((data->c12 * tadc) >> 11); 72 + y1 = (data->a0 << 10) + a1 * padc; 73 + 74 + /* compensated pressure with 4 fractional bits */ 75 + pcomp = (y1 + ((data->b2 * (int) tadc) >> 1)) >> 9; 76 + 77 + kpa = pcomp * (115 - 50) / 1023 + (50 << 4); 78 + *val = kpa >> 4; 79 + *val2 = (kpa & 15) * (1000000 >> 4); 80 + done: 81 + mutex_unlock(&data->lock); 82 + return ret; 83 + } 84 + 85 + static int mpl115_read_temp(struct mpl115_data *data) 86 + { 87 + int ret; 88 + 89 + mutex_lock(&data->lock); 90 + ret = mpl115_request(data); 91 + if (ret < 0) 92 + goto done; 93 + ret = i2c_smbus_read_word_swapped(data->client, MPL115_TADC); 94 + done: 95 + mutex_unlock(&data->lock); 96 + return ret; 97 + } 98 + 99 + static int mpl115_read_raw(struct iio_dev *indio_dev, 100 + struct iio_chan_spec const *chan, 101 + int *val, int *val2, long mask) 102 + { 103 + struct mpl115_data *data = iio_priv(indio_dev); 104 + int ret; 105 + 106 + switch (mask) { 107 + case IIO_CHAN_INFO_PROCESSED: 108 + ret = mpl115_comp_pressure(data, val, val2); 109 + if (ret < 0) 110 + return ret; 111 + return IIO_VAL_INT_PLUS_MICRO; 112 + case IIO_CHAN_INFO_RAW: 113 + /* temperature -5.35 C / LSB, 472 LSB is 25 C */ 114 + ret = mpl115_read_temp(data); 115 + if (ret < 0) 116 + return ret; 117 + *val = ret >> 6; 118 + return IIO_VAL_INT; 119 + case IIO_CHAN_INFO_OFFSET: 120 + *val = 605; 121 + *val2 = 750000; 122 + return IIO_VAL_INT_PLUS_MICRO; 123 + case IIO_CHAN_INFO_SCALE: 124 + *val = -186; 125 + *val2 = 915888; 126 + return IIO_VAL_INT_PLUS_MICRO; 127 + } 128 + return -EINVAL; 129 + } 130 + 131 + static const struct iio_chan_spec mpl115_channels[] = { 132 + { 133 + .type = IIO_PRESSURE, 134 + .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), 135 + }, 136 + { 137 + .type = IIO_TEMP, 138 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 139 + BIT(IIO_CHAN_INFO_OFFSET) | BIT(IIO_CHAN_INFO_SCALE), 140 + }, 141 + }; 142 + 143 + static const struct iio_info mpl115_info = { 144 + .read_raw = &mpl115_read_raw, 145 + .driver_module = THIS_MODULE, 146 + }; 147 + 148 + static int mpl115_probe(struct i2c_client *client, 149 + const struct i2c_device_id *id) 150 + { 151 + struct mpl115_data *data; 152 + struct iio_dev *indio_dev; 153 + int ret; 154 + 155 + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA)) 156 + return -ENODEV; 157 + 158 + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); 159 + if (!indio_dev) 160 + return -ENOMEM; 161 + 162 + data = iio_priv(indio_dev); 163 + data->client = client; 164 + mutex_init(&data->lock); 165 + 166 + i2c_set_clientdata(client, indio_dev); 167 + indio_dev->info = &mpl115_info; 168 + indio_dev->name = id->name; 169 + indio_dev->dev.parent = &client->dev; 170 + indio_dev->modes = INDIO_DIRECT_MODE; 171 + indio_dev->channels = mpl115_channels; 172 + indio_dev->num_channels = ARRAY_SIZE(mpl115_channels); 173 + 174 + ret = i2c_smbus_read_word_swapped(data->client, MPL115_A0); 175 + if (ret < 0) 176 + return ret; 177 + data->a0 = ret; 178 + ret = i2c_smbus_read_word_swapped(data->client, MPL115_B1); 179 + if (ret < 0) 180 + return ret; 181 + data->b1 = ret; 182 + ret = i2c_smbus_read_word_swapped(data->client, MPL115_B2); 183 + if (ret < 0) 184 + return ret; 185 + data->b2 = ret; 186 + ret = i2c_smbus_read_word_swapped(data->client, MPL115_C12); 187 + if (ret < 0) 188 + return ret; 189 + data->c12 = ret; 190 + 191 + return devm_iio_device_register(&client->dev, indio_dev); 192 + } 193 + 194 + static const struct i2c_device_id mpl115_id[] = { 195 + { "mpl115", 0 }, 196 + { } 197 + }; 198 + MODULE_DEVICE_TABLE(i2c, mpl115_id); 199 + 200 + static struct i2c_driver mpl115_driver = { 201 + .driver = { 202 + .name = "mpl115", 203 + }, 204 + .probe = mpl115_probe, 205 + .id_table = mpl115_id, 206 + }; 207 + module_i2c_driver(mpl115_driver); 208 + 209 + MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>"); 210 + MODULE_DESCRIPTION("Freescale MPL115 pressure/temperature driver"); 211 + MODULE_LICENSE("GPL");
+10
drivers/iio/temperature/Kconfig
··· 3 3 # 4 4 menu "Temperature sensors" 5 5 6 + config MLX90614 7 + tristate "MLX90614 contact-less infrared sensor" 8 + depends on I2C 9 + help 10 + If you say yes here you get support for the Melexis 11 + MLX90614 contact-less infrared sensor connected with I2C. 12 + 13 + This driver can also be built as a module. If so, the module will 14 + be called mlx90614. 15 + 6 16 config TMP006 7 17 tristate "TMP006 infrared thermopile sensor" 8 18 depends on I2C
+1
drivers/iio/temperature/Makefile
··· 2 2 # Makefile for industrial I/O temperature drivers 3 3 # 4 4 5 + obj-$(CONFIG_MLX90614) += mlx90614.o 5 6 obj-$(CONFIG_TMP006) += tmp006.o
+150
drivers/iio/temperature/mlx90614.c
··· 1 + /* 2 + * mlx90614.c - Support for Melexis MLX90614 contactless IR temperature sensor 3 + * 4 + * Copyright (c) 2014 Peter Meerwald <pmeerw@pmeerw.net> 5 + * 6 + * This file is subject to the terms and conditions of version 2 of 7 + * the GNU General Public License. See the file COPYING in the main 8 + * directory of this archive for more details. 9 + * 10 + * Driver for the Melexis MLX90614 I2C 16-bit IR thermopile sensor 11 + * 12 + * (7-bit I2C slave address 0x5a, 100KHz bus speed only!) 13 + * 14 + * TODO: sleep mode, configuration EEPROM 15 + */ 16 + 17 + #include <linux/err.h> 18 + #include <linux/i2c.h> 19 + #include <linux/module.h> 20 + 21 + #include <linux/iio/iio.h> 22 + 23 + #define MLX90614_OP_RAM 0x00 24 + 25 + /* RAM offsets with 16-bit data, MSB first */ 26 + #define MLX90614_TA 0x06 /* ambient temperature */ 27 + #define MLX90614_TOBJ1 0x07 /* object temperature */ 28 + 29 + struct mlx90614_data { 30 + struct i2c_client *client; 31 + }; 32 + 33 + static int mlx90614_read_raw(struct iio_dev *indio_dev, 34 + struct iio_chan_spec const *channel, int *val, 35 + int *val2, long mask) 36 + { 37 + struct mlx90614_data *data = iio_priv(indio_dev); 38 + s32 ret; 39 + 40 + switch (mask) { 41 + case IIO_CHAN_INFO_RAW: /* 0.02K / LSB */ 42 + switch (channel->channel2) { 43 + case IIO_MOD_TEMP_AMBIENT: 44 + ret = i2c_smbus_read_word_data(data->client, 45 + MLX90614_OP_RAM | MLX90614_TA); 46 + if (ret < 0) 47 + return ret; 48 + break; 49 + case IIO_MOD_TEMP_OBJECT: 50 + ret = i2c_smbus_read_word_data(data->client, 51 + MLX90614_OP_RAM | MLX90614_TOBJ1); 52 + if (ret < 0) 53 + return ret; 54 + break; 55 + default: 56 + return -EINVAL; 57 + } 58 + *val = ret; 59 + return IIO_VAL_INT; 60 + case IIO_CHAN_INFO_OFFSET: 61 + *val = 13657; 62 + *val2 = 500000; 63 + return IIO_VAL_INT_PLUS_MICRO; 64 + case IIO_CHAN_INFO_SCALE: 65 + *val = 20; 66 + return IIO_VAL_INT; 67 + default: 68 + return -EINVAL; 69 + } 70 + } 71 + 72 + static const struct iio_chan_spec mlx90614_channels[] = { 73 + { 74 + .type = IIO_TEMP, 75 + .modified = 1, 76 + .channel2 = IIO_MOD_TEMP_AMBIENT, 77 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 78 + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 79 + BIT(IIO_CHAN_INFO_SCALE), 80 + }, 81 + { 82 + .type = IIO_TEMP, 83 + .modified = 1, 84 + .channel2 = IIO_MOD_TEMP_OBJECT, 85 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 86 + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 87 + BIT(IIO_CHAN_INFO_SCALE), 88 + }, 89 + }; 90 + 91 + static const struct iio_info mlx90614_info = { 92 + .read_raw = mlx90614_read_raw, 93 + .driver_module = THIS_MODULE, 94 + }; 95 + 96 + static int mlx90614_probe(struct i2c_client *client, 97 + const struct i2c_device_id *id) 98 + { 99 + struct iio_dev *indio_dev; 100 + struct mlx90614_data *data; 101 + 102 + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA)) 103 + return -ENODEV; 104 + 105 + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); 106 + if (!indio_dev) 107 + return -ENOMEM; 108 + 109 + data = iio_priv(indio_dev); 110 + i2c_set_clientdata(client, indio_dev); 111 + data->client = client; 112 + 113 + indio_dev->dev.parent = &client->dev; 114 + indio_dev->name = id->name; 115 + indio_dev->modes = INDIO_DIRECT_MODE; 116 + indio_dev->info = &mlx90614_info; 117 + 118 + indio_dev->channels = mlx90614_channels; 119 + indio_dev->num_channels = ARRAY_SIZE(mlx90614_channels); 120 + 121 + return iio_device_register(indio_dev); 122 + } 123 + 124 + static int mlx90614_remove(struct i2c_client *client) 125 + { 126 + iio_device_unregister(i2c_get_clientdata(client)); 127 + 128 + return 0; 129 + } 130 + 131 + static const struct i2c_device_id mlx90614_id[] = { 132 + { "mlx90614", 0 }, 133 + { } 134 + }; 135 + MODULE_DEVICE_TABLE(i2c, mlx90614_id); 136 + 137 + static struct i2c_driver mlx90614_driver = { 138 + .driver = { 139 + .name = "mlx90614", 140 + .owner = THIS_MODULE, 141 + }, 142 + .probe = mlx90614_probe, 143 + .remove = mlx90614_remove, 144 + .id_table = mlx90614_id, 145 + }; 146 + module_i2c_driver(mlx90614_driver); 147 + 148 + MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>"); 149 + MODULE_DESCRIPTION("Melexis MLX90614 contactless IR temperature sensor driver"); 150 + MODULE_LICENSE("GPL");
+2 -2
drivers/staging/iio/adc/ad7280a.c
··· 443 443 444 444 msecs = (ret >> 3) * 71500; 445 445 446 - return sprintf(buf, "%d\n", msecs); 446 + return sprintf(buf, "%u\n", msecs); 447 447 } 448 448 449 449 static ssize_t ad7280_store_balance_timer(struct device *dev, ··· 619 619 return -EINVAL; 620 620 } 621 621 622 - return sprintf(buf, "%d\n", val); 622 + return sprintf(buf, "%u\n", val); 623 623 } 624 624 625 625 static ssize_t ad7280_write_channel_config(struct device *dev,
+2
include/linux/device.h
··· 623 623 } 624 624 extern void devm_kfree(struct device *dev, void *p); 625 625 extern char *devm_kstrdup(struct device *dev, const char *s, gfp_t gfp); 626 + extern void *devm_kmemdup(struct device *dev, const void *src, size_t len, 627 + gfp_t gfp); 626 628 627 629 void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res); 628 630 void __iomem *devm_request_and_ioremap(struct device *dev,
+7 -1
include/linux/hid-sensor-hub.h
··· 189 189 struct hid_sensor_hub_device *hsdev; 190 190 struct platform_device *pdev; 191 191 unsigned usage_id; 192 - bool data_ready; 192 + atomic_t data_ready; 193 193 struct iio_trigger *trigger; 194 194 struct hid_sensor_hub_attribute_info poll; 195 195 struct hid_sensor_hub_attribute_info report_state; ··· 222 222 223 223 int hid_sensor_get_usage_index(struct hid_sensor_hub_device *hsdev, 224 224 u32 report_id, int field_index, u32 usage_id); 225 + 226 + int hid_sensor_format_scale(u32 usage_id, 227 + struct hid_sensor_hub_attribute_info *attr_info, 228 + int *val0, int *val1); 229 + 230 + s32 hid_sensor_read_poll_value(struct hid_sensor_common *st); 225 231 226 232 #endif
+1
include/linux/hid-sensor-ids.h
··· 76 76 #define HID_USAGE_SENSOR_ORIENT_TILT_Y 0x200480 77 77 #define HID_USAGE_SENSOR_ORIENT_TILT_Z 0x200481 78 78 79 + #define HID_USAGE_SENSOR_DEVICE_ORIENTATION 0x20008A 79 80 #define HID_USAGE_SENSOR_ORIENT_ROTATION_MATRIX 0x200482 80 81 #define HID_USAGE_SENSOR_ORIENT_QUATERNION 0x200483 81 82 #define HID_USAGE_SENSOR_ORIENT_MAGN_FLUX 0x200484
+24
include/linux/iio/iio.h
··· 177 177 * shift: Shift right by this before masking out 178 178 * realbits. 179 179 * endianness: little or big endian 180 + * repeat: Number of times real/storage bits 181 + * repeats. When the repeat element is 182 + * more than 1, then the type element in 183 + * sysfs will show a repeat value. 184 + * Otherwise, the number of repetitions is 185 + * omitted. 180 186 * @info_mask_separate: What information is to be exported that is specific to 181 187 * this channel. 182 188 * @info_mask_shared_by_type: What information is to be exported that is shared ··· 225 219 u8 realbits; 226 220 u8 storagebits; 227 221 u8 shift; 222 + u8 repeat; 228 223 enum iio_endian endianness; 229 224 } scan_type; 230 225 long info_mask_separate; ··· 295 288 #define INDIO_ALL_BUFFER_MODES \ 296 289 (INDIO_BUFFER_TRIGGERED | INDIO_BUFFER_HARDWARE) 297 290 291 + #define INDIO_MAX_RAW_ELEMENTS 4 292 + 298 293 struct iio_trigger; /* forward declaration */ 299 294 struct iio_dev; 300 295 ··· 311 302 * the channel in question. Return value will specify the 312 303 * type of value returned by the device. val and val2 will 313 304 * contain the elements making up the returned value. 305 + * @read_raw_multi: function to return values from the device. 306 + * mask specifies which value. Note 0 means a reading of 307 + * the channel in question. Return value will specify the 308 + * type of value returned by the device. vals pointer 309 + * contain the elements making up the returned value. 310 + * max_len specifies maximum number of elements 311 + * vals pointer can contain. val_len is used to return 312 + * length of valid elements in vals. 314 313 * @write_raw: function to write a value to the device. 315 314 * Parameters are the same as for read_raw. 316 315 * @write_raw_get_fmt: callback function to query the expected ··· 343 326 struct iio_chan_spec const *chan, 344 327 int *val, 345 328 int *val2, 329 + long mask); 330 + 331 + int (*read_raw_multi)(struct iio_dev *indio_dev, 332 + struct iio_chan_spec const *chan, 333 + int max_len, 334 + int *vals, 335 + int *val_len, 346 336 long mask); 347 337 348 338 int (*write_raw)(struct iio_dev *indio_dev,
+4
include/linux/iio/types.h
··· 53 53 IIO_MOD_LIGHT_RED, 54 54 IIO_MOD_LIGHT_GREEN, 55 55 IIO_MOD_LIGHT_BLUE, 56 + IIO_MOD_QUATERNION, 57 + IIO_MOD_TEMP_AMBIENT, 58 + IIO_MOD_TEMP_OBJECT, 56 59 }; 57 60 58 61 enum iio_event_type { ··· 82 79 #define IIO_VAL_INT_PLUS_MICRO 2 83 80 #define IIO_VAL_INT_PLUS_NANO 3 84 81 #define IIO_VAL_INT_PLUS_MICRO_DB 4 82 + #define IIO_VAL_INT_MULTIPLE 5 85 83 #define IIO_VAL_FRACTIONAL 10 86 84 #define IIO_VAL_FRACTIONAL_LOG2 11 87 85