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

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

Jonathan writes:

Third round of new drivers, features and cleanups for IIO in the 3.14 cycle.

One new driver a spot of new functionality and a cleanup.

* New driver for the Capella CM32181 ambient light sensor. This is the first
driver directly from Kevin at Capella with more already in the pipeline.
* Support for configurable predividers on the mxs lradc
* Convert a field to a bitmap in mxs lradc instead of using an array of
unsigned longs to store boolean values.

+611 -3
+1
Documentation/devicetree/bindings/i2c/trivial-devices.txt
··· 16 16 at,24c08 i2c serial eeprom (24cxx) 17 17 atmel,24c02 i2c serial eeprom (24cxx) 18 18 atmel,at97sc3204t i2c trusted platform module (TPM) 19 + capella,cm32181 CM32181: Ambient Light Sensor 19 20 catalyst,24c32 i2c serial eeprom 20 21 dallas,ds1307 64 x 8, Serial, I2C Real-Time Clock 21 22 dallas,ds1338 I2C RTC with 56-Byte NV RAM
+11
drivers/iio/light/Kconfig
··· 27 27 To compile this driver as a module, choose M here: the 28 28 module will be called apds9300. 29 29 30 + config CM32181 31 + depends on I2C 32 + tristate "CM32181 driver" 33 + help 34 + Say Y here if you use cm32181. 35 + This option enables ambient light sensor using 36 + Capella cm32181 device driver. 37 + 38 + To compile this driver as a module, choose M here: 39 + the module will be called cm32181. 40 + 30 41 config CM36651 31 42 depends on I2C 32 43 tristate "CM36651 driver"
+1
drivers/iio/light/Makefile
··· 5 5 # When adding new entries keep the list in alphabetical order 6 6 obj-$(CONFIG_ADJD_S311) += adjd_s311.o 7 7 obj-$(CONFIG_APDS9300) += apds9300.o 8 + obj-$(CONFIG_CM32181) += cm32181.o 8 9 obj-$(CONFIG_CM36651) += cm36651.o 9 10 obj-$(CONFIG_GP2AP020A00F) += gp2ap020a00f.o 10 11 obj-$(CONFIG_HID_SENSOR_ALS) += hid-sensor-als.o
+379
drivers/iio/light/cm32181.c
··· 1 + /* 2 + * Copyright (C) 2013 Capella Microsystems Inc. 3 + * Author: Kevin Tsai <ktsai@capellamicro.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms of the GNU General Public License version 2, as published 7 + * by the Free Software Foundation. 8 + */ 9 + 10 + #include <linux/delay.h> 11 + #include <linux/err.h> 12 + #include <linux/i2c.h> 13 + #include <linux/mutex.h> 14 + #include <linux/module.h> 15 + #include <linux/interrupt.h> 16 + #include <linux/regulator/consumer.h> 17 + #include <linux/iio/iio.h> 18 + #include <linux/iio/sysfs.h> 19 + #include <linux/iio/events.h> 20 + #include <linux/init.h> 21 + 22 + /* Registers Address */ 23 + #define CM32181_REG_ADDR_CMD 0x00 24 + #define CM32181_REG_ADDR_ALS 0x04 25 + #define CM32181_REG_ADDR_STATUS 0x06 26 + #define CM32181_REG_ADDR_ID 0x07 27 + 28 + /* Number of Configurable Registers */ 29 + #define CM32181_CONF_REG_NUM 0x01 30 + 31 + /* CMD register */ 32 + #define CM32181_CMD_ALS_ENABLE 0x00 33 + #define CM32181_CMD_ALS_DISABLE 0x01 34 + #define CM32181_CMD_ALS_INT_EN 0x02 35 + 36 + #define CM32181_CMD_ALS_IT_SHIFT 6 37 + #define CM32181_CMD_ALS_IT_MASK (0x0F << CM32181_CMD_ALS_IT_SHIFT) 38 + #define CM32181_CMD_ALS_IT_DEFAULT (0x00 << CM32181_CMD_ALS_IT_SHIFT) 39 + 40 + #define CM32181_CMD_ALS_SM_SHIFT 11 41 + #define CM32181_CMD_ALS_SM_MASK (0x03 << CM32181_CMD_ALS_SM_SHIFT) 42 + #define CM32181_CMD_ALS_SM_DEFAULT (0x01 << CM32181_CMD_ALS_SM_SHIFT) 43 + 44 + #define CM32181_MLUX_PER_BIT 5 /* ALS_SM=01 IT=800ms */ 45 + #define CM32181_MLUX_PER_BIT_BASE_IT 800000 /* Based on IT=800ms */ 46 + #define CM32181_CALIBSCALE_DEFAULT 1000 47 + #define CM32181_CALIBSCALE_RESOLUTION 1000 48 + #define MLUX_PER_LUX 1000 49 + 50 + static const u8 cm32181_reg[CM32181_CONF_REG_NUM] = { 51 + CM32181_REG_ADDR_CMD, 52 + }; 53 + 54 + static const int als_it_bits[] = {12, 8, 0, 1, 2, 3}; 55 + static const int als_it_value[] = {25000, 50000, 100000, 200000, 400000, 56 + 800000}; 57 + 58 + struct cm32181_chip { 59 + struct i2c_client *client; 60 + struct mutex lock; 61 + u16 conf_regs[CM32181_CONF_REG_NUM]; 62 + int calibscale; 63 + }; 64 + 65 + /** 66 + * cm32181_reg_init() - Initialize CM32181 registers 67 + * @cm32181: pointer of struct cm32181. 68 + * 69 + * Initialize CM32181 ambient light sensor register to default values. 70 + * 71 + * Return: 0 for success; otherwise for error code. 72 + */ 73 + static int cm32181_reg_init(struct cm32181_chip *cm32181) 74 + { 75 + struct i2c_client *client = cm32181->client; 76 + int i; 77 + s32 ret; 78 + 79 + ret = i2c_smbus_read_word_data(client, CM32181_REG_ADDR_ID); 80 + if (ret < 0) 81 + return ret; 82 + 83 + /* check device ID */ 84 + if ((ret & 0xFF) != 0x81) 85 + return -ENODEV; 86 + 87 + /* Default Values */ 88 + cm32181->conf_regs[CM32181_REG_ADDR_CMD] = CM32181_CMD_ALS_ENABLE | 89 + CM32181_CMD_ALS_IT_DEFAULT | CM32181_CMD_ALS_SM_DEFAULT; 90 + cm32181->calibscale = CM32181_CALIBSCALE_DEFAULT; 91 + 92 + /* Initialize registers*/ 93 + for (i = 0; i < CM32181_CONF_REG_NUM; i++) { 94 + ret = i2c_smbus_write_word_data(client, cm32181_reg[i], 95 + cm32181->conf_regs[i]); 96 + if (ret < 0) 97 + return ret; 98 + } 99 + 100 + return 0; 101 + } 102 + 103 + /** 104 + * cm32181_read_als_it() - Get sensor integration time (ms) 105 + * @cm32181: pointer of struct cm32181 106 + * @val: pointer of int to load the als_it value. 107 + * 108 + * Report the current integartion time by millisecond. 109 + * 110 + * Return: IIO_VAL_INT for success, otherwise -EINVAL. 111 + */ 112 + static int cm32181_read_als_it(struct cm32181_chip *cm32181, int *val) 113 + { 114 + u16 als_it; 115 + int i; 116 + 117 + als_it = cm32181->conf_regs[CM32181_REG_ADDR_CMD]; 118 + als_it &= CM32181_CMD_ALS_IT_MASK; 119 + als_it >>= CM32181_CMD_ALS_IT_SHIFT; 120 + for (i = 0; i < ARRAY_SIZE(als_it_bits); i++) { 121 + if (als_it == als_it_bits[i]) { 122 + *val = als_it_value[i]; 123 + return IIO_VAL_INT; 124 + } 125 + } 126 + 127 + return -EINVAL; 128 + } 129 + 130 + /** 131 + * cm32181_write_als_it() - Write sensor integration time 132 + * @cm32181: pointer of struct cm32181. 133 + * @val: integration time by millisecond. 134 + * 135 + * Convert integration time (ms) to sensor value. 136 + * 137 + * Return: i2c_smbus_write_word_data command return value. 138 + */ 139 + static int cm32181_write_als_it(struct cm32181_chip *cm32181, int val) 140 + { 141 + struct i2c_client *client = cm32181->client; 142 + u16 als_it; 143 + int ret, i, n; 144 + 145 + n = ARRAY_SIZE(als_it_value); 146 + for (i = 0; i < n; i++) 147 + if (val <= als_it_value[i]) 148 + break; 149 + if (i >= n) 150 + i = n - 1; 151 + 152 + als_it = als_it_bits[i]; 153 + als_it <<= CM32181_CMD_ALS_IT_SHIFT; 154 + 155 + mutex_lock(&cm32181->lock); 156 + cm32181->conf_regs[CM32181_REG_ADDR_CMD] &= 157 + ~CM32181_CMD_ALS_IT_MASK; 158 + cm32181->conf_regs[CM32181_REG_ADDR_CMD] |= 159 + als_it; 160 + ret = i2c_smbus_write_word_data(client, CM32181_REG_ADDR_CMD, 161 + cm32181->conf_regs[CM32181_REG_ADDR_CMD]); 162 + mutex_unlock(&cm32181->lock); 163 + 164 + return ret; 165 + } 166 + 167 + /** 168 + * cm32181_get_lux() - report current lux value 169 + * @cm32181: pointer of struct cm32181. 170 + * 171 + * Convert sensor raw data to lux. It depends on integration 172 + * time and claibscale variable. 173 + * 174 + * Return: Positive value is lux, otherwise is error code. 175 + */ 176 + static int cm32181_get_lux(struct cm32181_chip *cm32181) 177 + { 178 + struct i2c_client *client = cm32181->client; 179 + int ret; 180 + int als_it; 181 + unsigned long lux; 182 + 183 + ret = cm32181_read_als_it(cm32181, &als_it); 184 + if (ret < 0) 185 + return -EINVAL; 186 + 187 + lux = CM32181_MLUX_PER_BIT; 188 + lux *= CM32181_MLUX_PER_BIT_BASE_IT; 189 + lux /= als_it; 190 + 191 + ret = i2c_smbus_read_word_data(client, CM32181_REG_ADDR_ALS); 192 + if (ret < 0) 193 + return ret; 194 + 195 + lux *= ret; 196 + lux *= cm32181->calibscale; 197 + lux /= CM32181_CALIBSCALE_RESOLUTION; 198 + lux /= MLUX_PER_LUX; 199 + 200 + if (lux > 0xFFFF) 201 + lux = 0xFFFF; 202 + 203 + return lux; 204 + } 205 + 206 + static int cm32181_read_raw(struct iio_dev *indio_dev, 207 + struct iio_chan_spec const *chan, 208 + int *val, int *val2, long mask) 209 + { 210 + struct cm32181_chip *cm32181 = iio_priv(indio_dev); 211 + int ret; 212 + 213 + switch (mask) { 214 + case IIO_CHAN_INFO_PROCESSED: 215 + ret = cm32181_get_lux(cm32181); 216 + if (ret < 0) 217 + return ret; 218 + *val = ret; 219 + return IIO_VAL_INT; 220 + case IIO_CHAN_INFO_CALIBSCALE: 221 + *val = cm32181->calibscale; 222 + return IIO_VAL_INT; 223 + case IIO_CHAN_INFO_INT_TIME: 224 + ret = cm32181_read_als_it(cm32181, val); 225 + return ret; 226 + } 227 + 228 + return -EINVAL; 229 + } 230 + 231 + static int cm32181_write_raw(struct iio_dev *indio_dev, 232 + struct iio_chan_spec const *chan, 233 + int val, int val2, long mask) 234 + { 235 + struct cm32181_chip *cm32181 = iio_priv(indio_dev); 236 + int ret; 237 + 238 + switch (mask) { 239 + case IIO_CHAN_INFO_CALIBSCALE: 240 + cm32181->calibscale = val; 241 + return val; 242 + case IIO_CHAN_INFO_INT_TIME: 243 + ret = cm32181_write_als_it(cm32181, val); 244 + return ret; 245 + } 246 + 247 + return -EINVAL; 248 + } 249 + 250 + /** 251 + * cm32181_get_it_available() - Get available ALS IT value 252 + * @dev: pointer of struct device. 253 + * @attr: pointer of struct device_attribute. 254 + * @buf: pointer of return string buffer. 255 + * 256 + * Display the available integration time values by millisecond. 257 + * 258 + * Return: string length. 259 + */ 260 + static ssize_t cm32181_get_it_available(struct device *dev, 261 + struct device_attribute *attr, char *buf) 262 + { 263 + int i, n, len; 264 + 265 + n = ARRAY_SIZE(als_it_value); 266 + for (i = 0, len = 0; i < n; i++) 267 + len += sprintf(buf + len, "%d ", als_it_value[i]); 268 + return len + sprintf(buf + len, "\n"); 269 + } 270 + 271 + static const struct iio_chan_spec cm32181_channels[] = { 272 + { 273 + .type = IIO_LIGHT, 274 + .info_mask_separate = 275 + BIT(IIO_CHAN_INFO_PROCESSED) | 276 + BIT(IIO_CHAN_INFO_CALIBSCALE) | 277 + BIT(IIO_CHAN_INFO_INT_TIME), 278 + } 279 + }; 280 + 281 + static IIO_DEVICE_ATTR(in_illuminance_integration_time_available, 282 + S_IRUGO, cm32181_get_it_available, NULL, 0); 283 + 284 + static struct attribute *cm32181_attributes[] = { 285 + &iio_dev_attr_in_illuminance_integration_time_available.dev_attr.attr, 286 + NULL, 287 + }; 288 + 289 + static const struct attribute_group cm32181_attribute_group = { 290 + .attrs = cm32181_attributes 291 + }; 292 + 293 + static const struct iio_info cm32181_info = { 294 + .driver_module = THIS_MODULE, 295 + .read_raw = &cm32181_read_raw, 296 + .write_raw = &cm32181_write_raw, 297 + .attrs = &cm32181_attribute_group, 298 + }; 299 + 300 + static int cm32181_probe(struct i2c_client *client, 301 + const struct i2c_device_id *id) 302 + { 303 + struct cm32181_chip *cm32181; 304 + struct iio_dev *indio_dev; 305 + int ret; 306 + 307 + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*cm32181)); 308 + if (!indio_dev) { 309 + dev_err(&client->dev, "devm_iio_device_alloc failed\n"); 310 + return -ENOMEM; 311 + } 312 + 313 + cm32181 = iio_priv(indio_dev); 314 + i2c_set_clientdata(client, indio_dev); 315 + cm32181->client = client; 316 + 317 + mutex_init(&cm32181->lock); 318 + indio_dev->dev.parent = &client->dev; 319 + indio_dev->channels = cm32181_channels; 320 + indio_dev->num_channels = ARRAY_SIZE(cm32181_channels); 321 + indio_dev->info = &cm32181_info; 322 + indio_dev->name = id->name; 323 + indio_dev->modes = INDIO_DIRECT_MODE; 324 + 325 + ret = cm32181_reg_init(cm32181); 326 + if (ret) { 327 + dev_err(&client->dev, 328 + "%s: register init failed\n", 329 + __func__); 330 + return ret; 331 + } 332 + 333 + ret = iio_device_register(indio_dev); 334 + if (ret) { 335 + dev_err(&client->dev, 336 + "%s: regist device failed\n", 337 + __func__); 338 + return ret; 339 + } 340 + 341 + return 0; 342 + } 343 + 344 + static int cm32181_remove(struct i2c_client *client) 345 + { 346 + struct iio_dev *indio_dev = i2c_get_clientdata(client); 347 + 348 + iio_device_unregister(indio_dev); 349 + return 0; 350 + } 351 + 352 + static const struct i2c_device_id cm32181_id[] = { 353 + { "cm32181", 0 }, 354 + { } 355 + }; 356 + 357 + MODULE_DEVICE_TABLE(i2c, cm32181_id); 358 + 359 + static const struct of_device_id cm32181_of_match[] = { 360 + { .compatible = "capella,cm32181" }, 361 + { } 362 + }; 363 + 364 + static struct i2c_driver cm32181_driver = { 365 + .driver = { 366 + .name = "cm32181", 367 + .of_match_table = of_match_ptr(cm32181_of_match), 368 + .owner = THIS_MODULE, 369 + }, 370 + .id_table = cm32181_id, 371 + .probe = cm32181_probe, 372 + .remove = cm32181_remove, 373 + }; 374 + 375 + module_i2c_driver(cm32181_driver); 376 + 377 + MODULE_AUTHOR("Kevin Tsai <ktsai@capellamicro.com>"); 378 + MODULE_DESCRIPTION("CM32181 ambient light sensor driver"); 379 + MODULE_LICENSE("GPL");
+219 -3
drivers/staging/iio/adc/mxs-lradc.c
··· 38 38 #include <linux/clk.h> 39 39 40 40 #include <linux/iio/iio.h> 41 + #include <linux/iio/sysfs.h> 41 42 #include <linux/iio/buffer.h> 42 43 #include <linux/iio/trigger.h> 43 44 #include <linux/iio/trigger_consumer.h> ··· 112 111 struct mxs_lradc_of_config { 113 112 const int irq_count; 114 113 const char * const *irq_name; 114 + const uint32_t *vref_mv; 115 + }; 116 + 117 + #define VREF_MV_BASE 1850 118 + 119 + static const uint32_t mx23_vref_mv[LRADC_MAX_TOTAL_CHANS] = { 120 + VREF_MV_BASE, /* CH0 */ 121 + VREF_MV_BASE, /* CH1 */ 122 + VREF_MV_BASE, /* CH2 */ 123 + VREF_MV_BASE, /* CH3 */ 124 + VREF_MV_BASE, /* CH4 */ 125 + VREF_MV_BASE, /* CH5 */ 126 + VREF_MV_BASE * 2, /* CH6 VDDIO */ 127 + VREF_MV_BASE * 4, /* CH7 VBATT */ 128 + VREF_MV_BASE, /* CH8 Temp sense 0 */ 129 + VREF_MV_BASE, /* CH9 Temp sense 1 */ 130 + VREF_MV_BASE, /* CH10 */ 131 + VREF_MV_BASE, /* CH11 */ 132 + VREF_MV_BASE, /* CH12 USB_DP */ 133 + VREF_MV_BASE, /* CH13 USB_DN */ 134 + VREF_MV_BASE, /* CH14 VBG */ 135 + VREF_MV_BASE * 4, /* CH15 VDD5V */ 136 + }; 137 + 138 + static const uint32_t mx28_vref_mv[LRADC_MAX_TOTAL_CHANS] = { 139 + VREF_MV_BASE, /* CH0 */ 140 + VREF_MV_BASE, /* CH1 */ 141 + VREF_MV_BASE, /* CH2 */ 142 + VREF_MV_BASE, /* CH3 */ 143 + VREF_MV_BASE, /* CH4 */ 144 + VREF_MV_BASE, /* CH5 */ 145 + VREF_MV_BASE, /* CH6 */ 146 + VREF_MV_BASE * 4, /* CH7 VBATT */ 147 + VREF_MV_BASE, /* CH8 Temp sense 0 */ 148 + VREF_MV_BASE, /* CH9 Temp sense 1 */ 149 + VREF_MV_BASE * 2, /* CH10 VDDIO */ 150 + VREF_MV_BASE, /* CH11 VTH */ 151 + VREF_MV_BASE * 2, /* CH12 VDDA */ 152 + VREF_MV_BASE, /* CH13 VDDD */ 153 + VREF_MV_BASE, /* CH14 VBG */ 154 + VREF_MV_BASE * 4, /* CH15 VDD5V */ 115 155 }; 116 156 117 157 static const struct mxs_lradc_of_config mxs_lradc_of_config[] = { 118 158 [IMX23_LRADC] = { 119 159 .irq_count = ARRAY_SIZE(mx23_lradc_irq_names), 120 160 .irq_name = mx23_lradc_irq_names, 161 + .vref_mv = mx23_vref_mv, 121 162 }, 122 163 [IMX28_LRADC] = { 123 164 .irq_count = ARRAY_SIZE(mx28_lradc_irq_names), 124 165 .irq_name = mx28_lradc_irq_names, 166 + .vref_mv = mx28_vref_mv, 125 167 }, 126 168 }; 127 169 ··· 185 141 LRADC_SAMPLE_VALID, 186 142 }; 187 143 144 + enum mxs_lradc_divbytwo { 145 + MXS_LRADC_DIV_DISABLED = 0, 146 + MXS_LRADC_DIV_ENABLED, 147 + }; 148 + 149 + struct mxs_lradc_scale { 150 + unsigned int integer; 151 + unsigned int nano; 152 + }; 153 + 188 154 struct mxs_lradc { 189 155 struct device *dev; 190 156 void __iomem *base; ··· 208 154 struct mutex lock; 209 155 210 156 struct completion completion; 157 + 158 + const uint32_t *vref_mv; 159 + struct mxs_lradc_scale scale_avail[LRADC_MAX_TOTAL_CHANS][2]; 160 + unsigned long is_divided; 211 161 212 162 /* 213 163 * Touchscreen LRADC channels receives a private slot in the CTRL4 ··· 301 243 #define LRADC_CTRL1_LRADC_IRQ_OFFSET 0 302 244 303 245 #define LRADC_CTRL2 0x20 246 + #define LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET 24 304 247 #define LRADC_CTRL2_TEMPSENSE_PWD (1 << 15) 305 248 306 249 #define LRADC_STATUS 0x40 ··· 895 836 const struct iio_chan_spec *chan, 896 837 int *val, int *val2, long m) 897 838 { 839 + struct mxs_lradc *lradc = iio_priv(iio_dev); 840 + 898 841 /* Check for invalid channel */ 899 842 if (chan->channel > LRADC_MAX_TOTAL_CHANS) 900 843 return -EINVAL; ··· 918 857 return IIO_VAL_INT_PLUS_MICRO; 919 858 } 920 859 921 - return -EINVAL; 860 + *val = lradc->vref_mv[chan->channel]; 861 + *val2 = chan->scan_type.realbits - 862 + test_bit(chan->channel, &lradc->is_divided); 863 + return IIO_VAL_FRACTIONAL_LOG2; 922 864 923 865 case IIO_CHAN_INFO_OFFSET: 924 866 if (chan->type == IIO_TEMP) { ··· 944 880 return -EINVAL; 945 881 } 946 882 883 + static int mxs_lradc_write_raw(struct iio_dev *iio_dev, 884 + const struct iio_chan_spec *chan, 885 + int val, int val2, long m) 886 + { 887 + struct mxs_lradc *lradc = iio_priv(iio_dev); 888 + struct mxs_lradc_scale *scale_avail = 889 + lradc->scale_avail[chan->channel]; 890 + int ret; 891 + 892 + ret = mutex_trylock(&lradc->lock); 893 + if (!ret) 894 + return -EBUSY; 895 + 896 + switch (m) { 897 + case IIO_CHAN_INFO_SCALE: 898 + ret = -EINVAL; 899 + if (val == scale_avail[MXS_LRADC_DIV_DISABLED].integer && 900 + val2 == scale_avail[MXS_LRADC_DIV_DISABLED].nano) { 901 + /* divider by two disabled */ 902 + writel(1 << LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET, 903 + lradc->base + LRADC_CTRL2 + STMP_OFFSET_REG_CLR); 904 + clear_bit(chan->channel, &lradc->is_divided); 905 + ret = 0; 906 + } else if (val == scale_avail[MXS_LRADC_DIV_ENABLED].integer && 907 + val2 == scale_avail[MXS_LRADC_DIV_ENABLED].nano) { 908 + /* divider by two enabled */ 909 + writel(1 << LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET, 910 + lradc->base + LRADC_CTRL2 + STMP_OFFSET_REG_SET); 911 + set_bit(chan->channel, &lradc->is_divided); 912 + ret = 0; 913 + } 914 + 915 + break; 916 + default: 917 + ret = -EINVAL; 918 + break; 919 + } 920 + 921 + mutex_unlock(&lradc->lock); 922 + 923 + return ret; 924 + } 925 + 926 + static int mxs_lradc_write_raw_get_fmt(struct iio_dev *iio_dev, 927 + const struct iio_chan_spec *chan, 928 + long m) 929 + { 930 + return IIO_VAL_INT_PLUS_NANO; 931 + } 932 + 933 + static ssize_t mxs_lradc_show_scale_available_ch(struct device *dev, 934 + struct device_attribute *attr, 935 + char *buf, 936 + int ch) 937 + { 938 + struct iio_dev *iio = dev_to_iio_dev(dev); 939 + struct mxs_lradc *lradc = iio_priv(iio); 940 + int i, len = 0; 941 + 942 + for (i = 0; i < ARRAY_SIZE(lradc->scale_avail[ch]); i++) 943 + len += sprintf(buf + len, "%d.%09u ", 944 + lradc->scale_avail[ch][i].integer, 945 + lradc->scale_avail[ch][i].nano); 946 + 947 + len += sprintf(buf + len, "\n"); 948 + 949 + return len; 950 + } 951 + 952 + static ssize_t mxs_lradc_show_scale_available(struct device *dev, 953 + struct device_attribute *attr, 954 + char *buf) 955 + { 956 + struct iio_dev_attr *iio_attr = to_iio_dev_attr(attr); 957 + 958 + return mxs_lradc_show_scale_available_ch(dev, attr, buf, 959 + iio_attr->address); 960 + } 961 + 962 + #define SHOW_SCALE_AVAILABLE_ATTR(ch) \ 963 + static IIO_DEVICE_ATTR(in_voltage##ch##_scale_available, S_IRUGO, \ 964 + mxs_lradc_show_scale_available, NULL, ch) 965 + 966 + SHOW_SCALE_AVAILABLE_ATTR(0); 967 + SHOW_SCALE_AVAILABLE_ATTR(1); 968 + SHOW_SCALE_AVAILABLE_ATTR(2); 969 + SHOW_SCALE_AVAILABLE_ATTR(3); 970 + SHOW_SCALE_AVAILABLE_ATTR(4); 971 + SHOW_SCALE_AVAILABLE_ATTR(5); 972 + SHOW_SCALE_AVAILABLE_ATTR(6); 973 + SHOW_SCALE_AVAILABLE_ATTR(7); 974 + SHOW_SCALE_AVAILABLE_ATTR(8); 975 + SHOW_SCALE_AVAILABLE_ATTR(9); 976 + SHOW_SCALE_AVAILABLE_ATTR(10); 977 + SHOW_SCALE_AVAILABLE_ATTR(11); 978 + SHOW_SCALE_AVAILABLE_ATTR(12); 979 + SHOW_SCALE_AVAILABLE_ATTR(13); 980 + SHOW_SCALE_AVAILABLE_ATTR(14); 981 + SHOW_SCALE_AVAILABLE_ATTR(15); 982 + 983 + static struct attribute *mxs_lradc_attributes[] = { 984 + &iio_dev_attr_in_voltage0_scale_available.dev_attr.attr, 985 + &iio_dev_attr_in_voltage1_scale_available.dev_attr.attr, 986 + &iio_dev_attr_in_voltage2_scale_available.dev_attr.attr, 987 + &iio_dev_attr_in_voltage3_scale_available.dev_attr.attr, 988 + &iio_dev_attr_in_voltage4_scale_available.dev_attr.attr, 989 + &iio_dev_attr_in_voltage5_scale_available.dev_attr.attr, 990 + &iio_dev_attr_in_voltage6_scale_available.dev_attr.attr, 991 + &iio_dev_attr_in_voltage7_scale_available.dev_attr.attr, 992 + &iio_dev_attr_in_voltage8_scale_available.dev_attr.attr, 993 + &iio_dev_attr_in_voltage9_scale_available.dev_attr.attr, 994 + &iio_dev_attr_in_voltage10_scale_available.dev_attr.attr, 995 + &iio_dev_attr_in_voltage11_scale_available.dev_attr.attr, 996 + &iio_dev_attr_in_voltage12_scale_available.dev_attr.attr, 997 + &iio_dev_attr_in_voltage13_scale_available.dev_attr.attr, 998 + &iio_dev_attr_in_voltage14_scale_available.dev_attr.attr, 999 + &iio_dev_attr_in_voltage15_scale_available.dev_attr.attr, 1000 + NULL 1001 + }; 1002 + 1003 + static const struct attribute_group mxs_lradc_attribute_group = { 1004 + .attrs = mxs_lradc_attributes, 1005 + }; 1006 + 947 1007 static const struct iio_info mxs_lradc_iio_info = { 948 1008 .driver_module = THIS_MODULE, 949 1009 .read_raw = mxs_lradc_read_raw, 1010 + .write_raw = mxs_lradc_write_raw, 1011 + .write_raw_get_fmt = mxs_lradc_write_raw_get_fmt, 1012 + .attrs = &mxs_lradc_attribute_group, 950 1013 }; 951 1014 952 1015 static int mxs_lradc_ts_open(struct input_dev *dev) ··· 1380 1189 .type = (chan_type), \ 1381 1190 .indexed = 1, \ 1382 1191 .scan_index = (idx), \ 1383 - .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 1192 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 1193 + BIT(IIO_CHAN_INFO_SCALE), \ 1384 1194 .channel = (idx), \ 1195 + .address = (idx), \ 1385 1196 .scan_type = { \ 1386 1197 .sign = 'u', \ 1387 1198 .realbits = LRADC_RESOLUTION, \ ··· 1529 1336 struct iio_dev *iio; 1530 1337 struct resource *iores; 1531 1338 int ret = 0, touch_ret; 1532 - int i; 1339 + int i, s; 1340 + unsigned int scale_uv; 1533 1341 1534 1342 /* Allocate the IIO device. */ 1535 1343 iio = devm_iio_device_alloc(dev, sizeof(*lradc)); ··· 1575 1381 return ret; 1576 1382 } 1577 1383 1384 + lradc->vref_mv = of_cfg->vref_mv; 1385 + 1578 1386 platform_set_drvdata(pdev, iio); 1579 1387 1580 1388 init_completion(&lradc->completion); ··· 1599 1403 ret = mxs_lradc_trigger_init(iio); 1600 1404 if (ret) 1601 1405 goto err_trig; 1406 + 1407 + /* Populate available ADC input ranges */ 1408 + for (i = 0; i < LRADC_MAX_TOTAL_CHANS; i++) { 1409 + for (s = 0; s < ARRAY_SIZE(lradc->scale_avail[i]); s++) { 1410 + /* 1411 + * [s=0] = optional divider by two disabled (default) 1412 + * [s=1] = optional divider by two enabled 1413 + * 1414 + * The scale is calculated by doing: 1415 + * Vref >> (realbits - s) 1416 + * which multiplies by two on the second component 1417 + * of the array. 1418 + */ 1419 + scale_uv = ((u64)lradc->vref_mv[i] * 100000000) >> 1420 + (iio->channels[i].scan_type.realbits - s); 1421 + lradc->scale_avail[i][s].nano = 1422 + do_div(scale_uv, 100000000) * 10; 1423 + lradc->scale_avail[i][s].integer = scale_uv; 1424 + } 1425 + } 1602 1426 1603 1427 /* Configure the hardware. */ 1604 1428 ret = mxs_lradc_hw_init(lradc);