PageRenderTime 84ms CodeModel.GetById 22ms app.highlight 55ms RepoModel.GetById 0ms app.codeStats 1ms

/drivers/staging/iio/addac/adt7316.c

https://bitbucket.org/wisechild/galaxy-nexus
C | 2246 lines | 1804 code | 383 blank | 59 comment | 217 complexity | 67f5fb66e236f1d316630ea599995121 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0

Large files files are truncated, but you can click here to view the full file

   1/*
   2 * ADT7316 digital temperature sensor driver supporting ADT7316/7/8 ADT7516/7/9
   3 *
   4 *
   5 * Copyright 2010 Analog Devices Inc.
   6 *
   7 * Licensed under the GPL-2 or later.
   8 */
   9
  10#include <linux/interrupt.h>
  11#include <linux/gpio.h>
  12#include <linux/workqueue.h>
  13#include <linux/device.h>
  14#include <linux/kernel.h>
  15#include <linux/slab.h>
  16#include <linux/sysfs.h>
  17#include <linux/list.h>
  18#include <linux/i2c.h>
  19#include <linux/rtc.h>
  20
  21#include "../iio.h"
  22#include "../sysfs.h"
  23#include "adt7316.h"
  24
  25/*
  26 * ADT7316 registers definition
  27 */
  28#define ADT7316_INT_STAT1		0x0
  29#define ADT7316_INT_STAT2		0x1
  30#define ADT7316_LSB_IN_TEMP_VDD		0x3
  31#define ADT7316_LSB_IN_TEMP_MASK	0x3
  32#define ADT7316_LSB_VDD_MASK		0xC
  33#define ADT7316_LSB_VDD_OFFSET		2
  34#define ADT7316_LSB_EX_TEMP_AIN		0x4
  35#define ADT7316_LSB_EX_TEMP_MASK	0x3
  36#define ADT7516_LSB_AIN_SHIFT		2
  37#define ADT7316_AD_MSB_DATA_BASE        0x6
  38#define ADT7316_AD_MSB_DATA_REGS        3
  39#define ADT7516_AD_MSB_DATA_REGS        6
  40#define ADT7316_MSB_VDD			0x6
  41#define ADT7316_MSB_IN_TEMP		0x7
  42#define ADT7316_MSB_EX_TEMP		0x8
  43#define ADT7516_MSB_AIN1		0x8
  44#define ADT7516_MSB_AIN2		0x9
  45#define ADT7516_MSB_AIN3		0xA
  46#define ADT7516_MSB_AIN4		0xB
  47#define ADT7316_DA_DATA_BASE		0x10
  48#define ADT7316_DA_MSB_DATA_REGS	4
  49#define ADT7316_LSB_DAC_A		0x10
  50#define ADT7316_MSB_DAC_A		0x11
  51#define ADT7316_LSB_DAC_B		0x12
  52#define ADT7316_MSB_DAC_B		0x13
  53#define ADT7316_LSB_DAC_C		0x14
  54#define ADT7316_MSB_DAC_C		0x15
  55#define ADT7316_LSB_DAC_D		0x16
  56#define ADT7316_MSB_DAC_D		0x17
  57#define ADT7316_CONFIG1			0x18
  58#define ADT7316_CONFIG2			0x19
  59#define ADT7316_CONFIG3			0x1A
  60#define ADT7316_LDAC_CONFIG		0x1B
  61#define ADT7316_DAC_CONFIG		0x1C
  62#define ADT7316_INT_MASK1		0x1D
  63#define ADT7316_INT_MASK2		0x1E
  64#define ADT7316_IN_TEMP_OFFSET		0x1F
  65#define ADT7316_EX_TEMP_OFFSET		0x20
  66#define ADT7316_IN_ANALOG_TEMP_OFFSET	0x21
  67#define ADT7316_EX_ANALOG_TEMP_OFFSET	0x22
  68#define ADT7316_VDD_HIGH		0x23
  69#define ADT7316_VDD_LOW			0x24
  70#define ADT7316_IN_TEMP_HIGH		0x25
  71#define ADT7316_IN_TEMP_LOW		0x26
  72#define ADT7316_EX_TEMP_HIGH		0x27
  73#define ADT7316_EX_TEMP_LOW		0x28
  74#define ADT7516_AIN2_HIGH		0x2B
  75#define ADT7516_AIN2_LOW		0x2C
  76#define ADT7516_AIN3_HIGH		0x2D
  77#define ADT7516_AIN3_LOW		0x2E
  78#define ADT7516_AIN4_HIGH		0x2F
  79#define ADT7516_AIN4_LOW		0x30
  80#define ADT7316_DEVICE_ID		0x4D
  81#define ADT7316_MANUFACTURE_ID		0x4E
  82#define ADT7316_DEVICE_REV		0x4F
  83#define ADT7316_SPI_LOCK_STAT		0x7F
  84
  85/*
  86 * ADT7316 config1
  87 */
  88#define ADT7316_EN			0x1
  89#define ADT7516_SEL_EX_TEMP		0x4
  90#define ADT7516_SEL_AIN1_2_EX_TEMP_MASK	0x6
  91#define ADT7516_SEL_AIN3		0x8
  92#define ADT7316_INT_EN			0x20
  93#define ADT7316_INT_POLARITY		0x40
  94#define ADT7316_PD			0x80
  95
  96/*
  97 * ADT7316 config2
  98 */
  99#define ADT7316_AD_SINGLE_CH_MASK	0x3
 100#define ADT7516_AD_SINGLE_CH_MASK	0x7
 101#define ADT7316_AD_SINGLE_CH_VDD	0
 102#define ADT7316_AD_SINGLE_CH_IN		1
 103#define ADT7316_AD_SINGLE_CH_EX		2
 104#define ADT7516_AD_SINGLE_CH_AIN1	2
 105#define ADT7516_AD_SINGLE_CH_AIN2	3
 106#define ADT7516_AD_SINGLE_CH_AIN3	4
 107#define ADT7516_AD_SINGLE_CH_AIN4	5
 108#define ADT7316_AD_SINGLE_CH_MODE	0x10
 109#define ADT7316_DISABLE_AVERAGING	0x20
 110#define ADT7316_EN_SMBUS_TIMEOUT	0x40
 111#define ADT7316_RESET			0x80
 112
 113/*
 114 * ADT7316 config3
 115 */
 116#define ADT7316_ADCLK_22_5		0x1
 117#define ADT7316_DA_HIGH_RESOLUTION	0x2
 118#define ADT7316_DA_EN_VIA_DAC_LDCA	0x4
 119#define ADT7516_AIN_IN_VREF		0x10
 120#define ADT7316_EN_IN_TEMP_PROP_DACA	0x20
 121#define ADT7316_EN_EX_TEMP_PROP_DACB	0x40
 122
 123/*
 124 * ADT7316 DAC config
 125 */
 126#define ADT7316_DA_2VREF_CH_MASK	0xF
 127#define ADT7316_DA_EN_MODE_MASK		0x30
 128#define ADT7316_DA_EN_MODE_SINGLE	0x00
 129#define ADT7316_DA_EN_MODE_AB_CD	0x10
 130#define ADT7316_DA_EN_MODE_ABCD		0x20
 131#define ADT7316_DA_EN_MODE_LDAC		0x30
 132#define ADT7316_VREF_BYPASS_DAC_AB	0x40
 133#define ADT7316_VREF_BYPASS_DAC_CD	0x80
 134
 135/*
 136 * ADT7316 LDAC config
 137 */
 138#define ADT7316_LDAC_EN_DA_MASK		0xF
 139#define ADT7316_DAC_IN_VREF		0x10
 140#define ADT7516_DAC_AB_IN_VREF		0x10
 141#define ADT7516_DAC_CD_IN_VREF		0x20
 142#define ADT7516_DAC_IN_VREF_OFFSET	4
 143#define ADT7516_DAC_IN_VREF_MASK	0x30
 144
 145/*
 146 * ADT7316 INT_MASK2
 147 */
 148#define ADT7316_INT_MASK2_VDD		0x10
 149
 150/*
 151 * ADT7316 value masks
 152 */
 153#define ADT7316_VALUE_MASK		0xfff
 154#define ADT7316_T_VALUE_SIGN		0x400
 155#define ADT7316_T_VALUE_FLOAT_OFFSET	2
 156#define ADT7316_T_VALUE_FLOAT_MASK	0x2
 157
 158/*
 159 * Chip ID
 160 */
 161#define ID_ADT7316		0x1
 162#define ID_ADT7317		0x2
 163#define ID_ADT7318		0x3
 164#define ID_ADT7516		0x11
 165#define ID_ADT7517		0x12
 166#define ID_ADT7519		0x14
 167
 168#define ID_FAMILY_MASK		0xF0
 169#define ID_ADT73XX		0x0
 170#define ID_ADT75XX		0x10
 171
 172/*
 173 * struct adt7316_chip_info - chip specifc information
 174 */
 175
 176struct adt7316_chip_info {
 177	struct iio_dev		*indio_dev;
 178	struct adt7316_bus	bus;
 179	u16			ldac_pin;
 180	u16			int_mask;	/* 0x2f */
 181	u8			config1;
 182	u8			config2;
 183	u8			config3;
 184	u8			dac_config;	/* DAC config */
 185	u8			ldac_config;	/* LDAC config */
 186	u8			dac_bits;	/* 8, 10, 12 */
 187	u8			id;		/* chip id */
 188};
 189
 190/*
 191 * Logic interrupt mask for user application to enable
 192 * interrupts.
 193 */
 194#define ADT7316_IN_TEMP_HIGH_INT_MASK	0x1
 195#define ADT7316_IN_TEMP_LOW_INT_MASK	0x2
 196#define ADT7316_EX_TEMP_HIGH_INT_MASK	0x4
 197#define ADT7316_EX_TEMP_LOW_INT_MASK	0x8
 198#define ADT7316_EX_TEMP_FAULT_INT_MASK	0x10
 199#define ADT7516_AIN1_INT_MASK		0x4
 200#define ADT7516_AIN2_INT_MASK		0x20
 201#define ADT7516_AIN3_INT_MASK		0x40
 202#define ADT7516_AIN4_INT_MASK		0x80
 203#define ADT7316_VDD_INT_MASK		0x100
 204#define ADT7316_TEMP_INT_MASK		0x1F
 205#define ADT7516_AIN_INT_MASK		0xE0
 206#define ADT7316_TEMP_AIN_INT_MASK	\
 207	(ADT7316_TEMP_INT_MASK | ADT7316_TEMP_INT_MASK)
 208
 209/*
 210 * struct adt7316_chip_info - chip specifc information
 211 */
 212
 213struct adt7316_limit_regs {
 214	u16	data_high;
 215	u16	data_low;
 216};
 217
 218static ssize_t adt7316_show_enabled(struct device *dev,
 219		struct device_attribute *attr,
 220		char *buf)
 221{
 222	struct iio_dev *dev_info = dev_get_drvdata(dev);
 223	struct adt7316_chip_info *chip = dev_info->dev_data;
 224
 225	return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_EN));
 226}
 227
 228static ssize_t _adt7316_store_enabled(struct adt7316_chip_info *chip,
 229		int enable)
 230{
 231	u8 config1;
 232	int ret;
 233
 234	if (enable)
 235		config1 = chip->config1 | ADT7316_EN;
 236	else
 237		config1 = chip->config1 & ~ADT7316_EN;
 238
 239	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
 240	if (ret)
 241		return -EIO;
 242
 243	chip->config1 = config1;
 244
 245	return ret;
 246
 247}
 248
 249static ssize_t adt7316_store_enabled(struct device *dev,
 250		struct device_attribute *attr,
 251		const char *buf,
 252		size_t len)
 253{
 254	struct iio_dev *dev_info = dev_get_drvdata(dev);
 255	struct adt7316_chip_info *chip = dev_info->dev_data;
 256	int enable;
 257
 258	if (!memcmp(buf, "1", 1))
 259		enable = 1;
 260	else
 261		enable = 0;
 262
 263	if (_adt7316_store_enabled(chip, enable) < 0)
 264		return -EIO;
 265	else
 266		return len;
 267}
 268
 269static IIO_DEVICE_ATTR(enabled, S_IRUGO | S_IWUSR,
 270		adt7316_show_enabled,
 271		adt7316_store_enabled,
 272		0);
 273
 274static ssize_t adt7316_show_select_ex_temp(struct device *dev,
 275		struct device_attribute *attr,
 276		char *buf)
 277{
 278	struct iio_dev *dev_info = dev_get_drvdata(dev);
 279	struct adt7316_chip_info *chip = dev_info->dev_data;
 280
 281	if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
 282		return -EPERM;
 283
 284	return sprintf(buf, "%d\n", !!(chip->config1 & ADT7516_SEL_EX_TEMP));
 285}
 286
 287static ssize_t adt7316_store_select_ex_temp(struct device *dev,
 288		struct device_attribute *attr,
 289		const char *buf,
 290		size_t len)
 291{
 292	struct iio_dev *dev_info = dev_get_drvdata(dev);
 293	struct adt7316_chip_info *chip = dev_info->dev_data;
 294	u8 config1;
 295	int ret;
 296
 297	if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
 298		return -EPERM;
 299
 300	config1 = chip->config1 & (~ADT7516_SEL_EX_TEMP);
 301	if (!memcmp(buf, "1", 1))
 302		config1 |= ADT7516_SEL_EX_TEMP;
 303
 304	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
 305	if (ret)
 306		return -EIO;
 307
 308	chip->config1 = config1;
 309
 310	return len;
 311}
 312
 313static IIO_DEVICE_ATTR(select_ex_temp, S_IRUGO | S_IWUSR,
 314		adt7316_show_select_ex_temp,
 315		adt7316_store_select_ex_temp,
 316		0);
 317
 318static ssize_t adt7316_show_mode(struct device *dev,
 319		struct device_attribute *attr,
 320		char *buf)
 321{
 322	struct iio_dev *dev_info = dev_get_drvdata(dev);
 323	struct adt7316_chip_info *chip = dev_info->dev_data;
 324
 325	if (chip->config2 & ADT7316_AD_SINGLE_CH_MODE)
 326		return sprintf(buf, "single_channel\n");
 327	else
 328		return sprintf(buf, "round_robin\n");
 329}
 330
 331static ssize_t adt7316_store_mode(struct device *dev,
 332		struct device_attribute *attr,
 333		const char *buf,
 334		size_t len)
 335{
 336	struct iio_dev *dev_info = dev_get_drvdata(dev);
 337	struct adt7316_chip_info *chip = dev_info->dev_data;
 338	u8 config2;
 339	int ret;
 340
 341	config2 = chip->config2 & (~ADT7316_AD_SINGLE_CH_MODE);
 342	if (!memcmp(buf, "single_channel", 14))
 343		config2 |= ADT7316_AD_SINGLE_CH_MODE;
 344
 345	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
 346	if (ret)
 347		return -EIO;
 348
 349	chip->config2 = config2;
 350
 351	return len;
 352}
 353
 354static IIO_DEVICE_ATTR(mode, S_IRUGO | S_IWUSR,
 355		adt7316_show_mode,
 356		adt7316_store_mode,
 357		0);
 358
 359static ssize_t adt7316_show_all_modes(struct device *dev,
 360		struct device_attribute *attr,
 361		char *buf)
 362{
 363	return sprintf(buf, "single_channel\nround_robin\n");
 364}
 365
 366static IIO_DEVICE_ATTR(all_modes, S_IRUGO, adt7316_show_all_modes, NULL, 0);
 367
 368static ssize_t adt7316_show_ad_channel(struct device *dev,
 369		struct device_attribute *attr,
 370		char *buf)
 371{
 372	struct iio_dev *dev_info = dev_get_drvdata(dev);
 373	struct adt7316_chip_info *chip = dev_info->dev_data;
 374
 375	if (!(chip->config2 & ADT7316_AD_SINGLE_CH_MODE))
 376		return -EPERM;
 377
 378	switch (chip->config2 & ADT7516_AD_SINGLE_CH_MASK) {
 379	case ADT7316_AD_SINGLE_CH_VDD:
 380		return sprintf(buf, "0 - VDD\n");
 381	case ADT7316_AD_SINGLE_CH_IN:
 382		return sprintf(buf, "1 - Internal Temperature\n");
 383	case ADT7316_AD_SINGLE_CH_EX:
 384		if (((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) &&
 385			(chip->config1 & ADT7516_SEL_AIN1_2_EX_TEMP_MASK) == 0)
 386			return sprintf(buf, "2 - AIN1\n");
 387		else
 388			return sprintf(buf, "2 - External Temperature\n");
 389	case ADT7516_AD_SINGLE_CH_AIN2:
 390		if ((chip->config1 & ADT7516_SEL_AIN1_2_EX_TEMP_MASK) == 0)
 391			return sprintf(buf, "3 - AIN2\n");
 392		else
 393			return sprintf(buf, "N/A\n");
 394	case ADT7516_AD_SINGLE_CH_AIN3:
 395		if (chip->config1 & ADT7516_SEL_AIN3)
 396			return sprintf(buf, "4 - AIN3\n");
 397		else
 398			return sprintf(buf, "N/A\n");
 399	case ADT7516_AD_SINGLE_CH_AIN4:
 400		return sprintf(buf, "5 - AIN4\n");
 401	default:
 402		return sprintf(buf, "N/A\n");
 403	}
 404}
 405
 406static ssize_t adt7316_store_ad_channel(struct device *dev,
 407		struct device_attribute *attr,
 408		const char *buf,
 409		size_t len)
 410{
 411	struct iio_dev *dev_info = dev_get_drvdata(dev);
 412	struct adt7316_chip_info *chip = dev_info->dev_data;
 413	u8 config2;
 414	unsigned long data = 0;
 415	int ret;
 416
 417	if (!(chip->config2 & ADT7316_AD_SINGLE_CH_MODE))
 418		return -EPERM;
 419
 420	ret = strict_strtoul(buf, 10, &data);
 421	if (ret)
 422		return -EINVAL;
 423
 424	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) {
 425		if (data > 5)
 426			return -EINVAL;
 427
 428		config2 = chip->config2 & (~ADT7516_AD_SINGLE_CH_MASK);
 429	} else {
 430		if (data > 2)
 431			return -EINVAL;
 432
 433		config2 = chip->config2 & (~ADT7316_AD_SINGLE_CH_MASK);
 434	}
 435
 436
 437	config2 |= data;
 438
 439	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
 440	if (ret)
 441		return -EIO;
 442
 443	chip->config2 = config2;
 444
 445	return len;
 446}
 447
 448static IIO_DEVICE_ATTR(ad_channel, S_IRUGO | S_IWUSR,
 449		adt7316_show_ad_channel,
 450		adt7316_store_ad_channel,
 451		0);
 452
 453static ssize_t adt7316_show_all_ad_channels(struct device *dev,
 454		struct device_attribute *attr,
 455		char *buf)
 456{
 457	struct iio_dev *dev_info = dev_get_drvdata(dev);
 458	struct adt7316_chip_info *chip = dev_info->dev_data;
 459
 460	if (!(chip->config2 & ADT7316_AD_SINGLE_CH_MODE))
 461		return -EPERM;
 462
 463	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
 464		return sprintf(buf, "0 - VDD\n1 - Internal Temperature\n"
 465				"2 - External Temperature or AIN1\n"
 466				"3 - AIN2\n4 - AIN3\n5 - AIN4\n");
 467	else
 468		return sprintf(buf, "0 - VDD\n1 - Internal Temperature\n"
 469				"2 - External Temperature\n");
 470}
 471
 472static IIO_DEVICE_ATTR(all_ad_channels, S_IRUGO,
 473		adt7316_show_all_ad_channels, NULL, 0);
 474
 475static ssize_t adt7316_show_disable_averaging(struct device *dev,
 476		struct device_attribute *attr,
 477		char *buf)
 478{
 479	struct iio_dev *dev_info = dev_get_drvdata(dev);
 480	struct adt7316_chip_info *chip = dev_info->dev_data;
 481
 482	return sprintf(buf, "%d\n",
 483		!!(chip->config2 & ADT7316_DISABLE_AVERAGING));
 484}
 485
 486static ssize_t adt7316_store_disable_averaging(struct device *dev,
 487		struct device_attribute *attr,
 488		const char *buf,
 489		size_t len)
 490{
 491	struct iio_dev *dev_info = dev_get_drvdata(dev);
 492	struct adt7316_chip_info *chip = dev_info->dev_data;
 493	u8 config2;
 494	int ret;
 495
 496	config2 = chip->config2 & (~ADT7316_DISABLE_AVERAGING);
 497	if (!memcmp(buf, "1", 1))
 498		config2 |= ADT7316_DISABLE_AVERAGING;
 499
 500	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
 501	if (ret)
 502		return -EIO;
 503
 504	chip->config2 = config2;
 505
 506	return len;
 507}
 508
 509static IIO_DEVICE_ATTR(disable_averaging, S_IRUGO | S_IWUSR,
 510		adt7316_show_disable_averaging,
 511		adt7316_store_disable_averaging,
 512		0);
 513
 514static ssize_t adt7316_show_enable_smbus_timeout(struct device *dev,
 515		struct device_attribute *attr,
 516		char *buf)
 517{
 518	struct iio_dev *dev_info = dev_get_drvdata(dev);
 519	struct adt7316_chip_info *chip = dev_info->dev_data;
 520
 521	return sprintf(buf, "%d\n",
 522		!!(chip->config2 & ADT7316_EN_SMBUS_TIMEOUT));
 523}
 524
 525static ssize_t adt7316_store_enable_smbus_timeout(struct device *dev,
 526		struct device_attribute *attr,
 527		const char *buf,
 528		size_t len)
 529{
 530	struct iio_dev *dev_info = dev_get_drvdata(dev);
 531	struct adt7316_chip_info *chip = dev_info->dev_data;
 532	u8 config2;
 533	int ret;
 534
 535	config2 = chip->config2 & (~ADT7316_EN_SMBUS_TIMEOUT);
 536	if (!memcmp(buf, "1", 1))
 537		config2 |= ADT7316_EN_SMBUS_TIMEOUT;
 538
 539	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
 540	if (ret)
 541		return -EIO;
 542
 543	chip->config2 = config2;
 544
 545	return len;
 546}
 547
 548static IIO_DEVICE_ATTR(enable_smbus_timeout, S_IRUGO | S_IWUSR,
 549		adt7316_show_enable_smbus_timeout,
 550		adt7316_store_enable_smbus_timeout,
 551		0);
 552
 553
 554static ssize_t adt7316_store_reset(struct device *dev,
 555		struct device_attribute *attr,
 556		const char *buf,
 557		size_t len)
 558{
 559	struct iio_dev *dev_info = dev_get_drvdata(dev);
 560	struct adt7316_chip_info *chip = dev_info->dev_data;
 561	u8 config2;
 562	int ret;
 563
 564	config2 = chip->config2 | ADT7316_RESET;
 565
 566	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG2, config2);
 567	if (ret)
 568		return -EIO;
 569
 570	return len;
 571}
 572
 573static IIO_DEVICE_ATTR(reset, S_IWUSR,
 574		NULL,
 575		adt7316_store_reset,
 576		0);
 577
 578static ssize_t adt7316_show_powerdown(struct device *dev,
 579		struct device_attribute *attr,
 580		char *buf)
 581{
 582	struct iio_dev *dev_info = dev_get_drvdata(dev);
 583	struct adt7316_chip_info *chip = dev_info->dev_data;
 584
 585	return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_PD));
 586}
 587
 588static ssize_t adt7316_store_powerdown(struct device *dev,
 589		struct device_attribute *attr,
 590		const char *buf,
 591		size_t len)
 592{
 593	struct iio_dev *dev_info = dev_get_drvdata(dev);
 594	struct adt7316_chip_info *chip = dev_info->dev_data;
 595	u8 config1;
 596	int ret;
 597
 598	config1 = chip->config1 & (~ADT7316_PD);
 599	if (!memcmp(buf, "1", 1))
 600		config1 |= ADT7316_PD;
 601
 602	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
 603	if (ret)
 604		return -EIO;
 605
 606	chip->config1 = config1;
 607
 608	return len;
 609}
 610
 611static IIO_DEVICE_ATTR(powerdown, S_IRUGO | S_IWUSR,
 612		adt7316_show_powerdown,
 613		adt7316_store_powerdown,
 614		0);
 615
 616static ssize_t adt7316_show_fast_ad_clock(struct device *dev,
 617		struct device_attribute *attr,
 618		char *buf)
 619{
 620	struct iio_dev *dev_info = dev_get_drvdata(dev);
 621	struct adt7316_chip_info *chip = dev_info->dev_data;
 622
 623	return sprintf(buf, "%d\n", !!(chip->config3 & ADT7316_ADCLK_22_5));
 624}
 625
 626static ssize_t adt7316_store_fast_ad_clock(struct device *dev,
 627		struct device_attribute *attr,
 628		const char *buf,
 629		size_t len)
 630{
 631	struct iio_dev *dev_info = dev_get_drvdata(dev);
 632	struct adt7316_chip_info *chip = dev_info->dev_data;
 633	u8 config3;
 634	int ret;
 635
 636	config3 = chip->config3 & (~ADT7316_ADCLK_22_5);
 637	if (!memcmp(buf, "1", 1))
 638		config3 |= ADT7316_ADCLK_22_5;
 639
 640	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
 641	if (ret)
 642		return -EIO;
 643
 644	chip->config3 = config3;
 645
 646	return len;
 647}
 648
 649static IIO_DEVICE_ATTR(fast_ad_clock, S_IRUGO | S_IWUSR,
 650		adt7316_show_fast_ad_clock,
 651		adt7316_store_fast_ad_clock,
 652		0);
 653
 654static ssize_t adt7316_show_da_high_resolution(struct device *dev,
 655		struct device_attribute *attr,
 656		char *buf)
 657{
 658	struct iio_dev *dev_info = dev_get_drvdata(dev);
 659	struct adt7316_chip_info *chip = dev_info->dev_data;
 660
 661	if (chip->config3 & ADT7316_DA_HIGH_RESOLUTION) {
 662		if (chip->id == ID_ADT7316 || chip->id == ID_ADT7516)
 663			return sprintf(buf, "1 (12 bits)\n");
 664		else if (chip->id == ID_ADT7317 || chip->id == ID_ADT7517)
 665			return sprintf(buf, "1 (10 bits)\n");
 666	}
 667
 668	return sprintf(buf, "0 (8 bits)\n");
 669}
 670
 671static ssize_t adt7316_store_da_high_resolution(struct device *dev,
 672		struct device_attribute *attr,
 673		const char *buf,
 674		size_t len)
 675{
 676	struct iio_dev *dev_info = dev_get_drvdata(dev);
 677	struct adt7316_chip_info *chip = dev_info->dev_data;
 678	u8 config3;
 679	int ret;
 680
 681	chip->dac_bits = 8;
 682
 683	if (!memcmp(buf, "1", 1)) {
 684		config3 = chip->config3 | ADT7316_DA_HIGH_RESOLUTION;
 685		if (chip->id == ID_ADT7316 || chip->id == ID_ADT7516)
 686			chip->dac_bits = 12;
 687		else if (chip->id == ID_ADT7317 || chip->id == ID_ADT7517)
 688			chip->dac_bits = 10;
 689	} else
 690		config3 = chip->config3 & (~ADT7316_DA_HIGH_RESOLUTION);
 691
 692	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
 693	if (ret)
 694		return -EIO;
 695
 696	chip->config3 = config3;
 697
 698	return len;
 699}
 700
 701static IIO_DEVICE_ATTR(da_high_resolution, S_IRUGO | S_IWUSR,
 702		adt7316_show_da_high_resolution,
 703		adt7316_store_da_high_resolution,
 704		0);
 705
 706static ssize_t adt7316_show_AIN_internal_Vref(struct device *dev,
 707		struct device_attribute *attr,
 708		char *buf)
 709{
 710	struct iio_dev *dev_info = dev_get_drvdata(dev);
 711	struct adt7316_chip_info *chip = dev_info->dev_data;
 712
 713	if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
 714		return -EPERM;
 715
 716	return sprintf(buf, "%d\n",
 717		!!(chip->config3 & ADT7516_AIN_IN_VREF));
 718}
 719
 720static ssize_t adt7316_store_AIN_internal_Vref(struct device *dev,
 721		struct device_attribute *attr,
 722		const char *buf,
 723		size_t len)
 724{
 725	struct iio_dev *dev_info = dev_get_drvdata(dev);
 726	struct adt7316_chip_info *chip = dev_info->dev_data;
 727	u8 config3;
 728	int ret;
 729
 730	if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
 731		return -EPERM;
 732
 733	if (memcmp(buf, "1", 1))
 734		config3 = chip->config3 & (~ADT7516_AIN_IN_VREF);
 735	else
 736		config3 = chip->config3 | ADT7516_AIN_IN_VREF;
 737
 738	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
 739	if (ret)
 740		return -EIO;
 741
 742	chip->config3 = config3;
 743
 744	return len;
 745}
 746
 747static IIO_DEVICE_ATTR(AIN_internal_Vref, S_IRUGO | S_IWUSR,
 748		adt7316_show_AIN_internal_Vref,
 749		adt7316_store_AIN_internal_Vref,
 750		0);
 751
 752
 753static ssize_t adt7316_show_enable_prop_DACA(struct device *dev,
 754		struct device_attribute *attr,
 755		char *buf)
 756{
 757	struct iio_dev *dev_info = dev_get_drvdata(dev);
 758	struct adt7316_chip_info *chip = dev_info->dev_data;
 759
 760	return sprintf(buf, "%d\n",
 761		!!(chip->config3 & ADT7316_EN_IN_TEMP_PROP_DACA));
 762}
 763
 764static ssize_t adt7316_store_enable_prop_DACA(struct device *dev,
 765		struct device_attribute *attr,
 766		const char *buf,
 767		size_t len)
 768{
 769	struct iio_dev *dev_info = dev_get_drvdata(dev);
 770	struct adt7316_chip_info *chip = dev_info->dev_data;
 771	u8 config3;
 772	int ret;
 773
 774	config3 = chip->config3 & (~ADT7316_EN_IN_TEMP_PROP_DACA);
 775	if (!memcmp(buf, "1", 1))
 776		config3 |= ADT7316_EN_IN_TEMP_PROP_DACA;
 777
 778	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
 779	if (ret)
 780		return -EIO;
 781
 782	chip->config3 = config3;
 783
 784	return len;
 785}
 786
 787static IIO_DEVICE_ATTR(enable_proportion_DACA, S_IRUGO | S_IWUSR,
 788		adt7316_show_enable_prop_DACA,
 789		adt7316_store_enable_prop_DACA,
 790		0);
 791
 792static ssize_t adt7316_show_enable_prop_DACB(struct device *dev,
 793		struct device_attribute *attr,
 794		char *buf)
 795{
 796	struct iio_dev *dev_info = dev_get_drvdata(dev);
 797	struct adt7316_chip_info *chip = dev_info->dev_data;
 798
 799	return sprintf(buf, "%d\n",
 800		!!(chip->config3 & ADT7316_EN_EX_TEMP_PROP_DACB));
 801}
 802
 803static ssize_t adt7316_store_enable_prop_DACB(struct device *dev,
 804		struct device_attribute *attr,
 805		const char *buf,
 806		size_t len)
 807{
 808	struct iio_dev *dev_info = dev_get_drvdata(dev);
 809	struct adt7316_chip_info *chip = dev_info->dev_data;
 810	u8 config3;
 811	int ret;
 812
 813	config3 = chip->config3 & (~ADT7316_EN_EX_TEMP_PROP_DACB);
 814	if (!memcmp(buf, "1", 1))
 815		config3 |= ADT7316_EN_EX_TEMP_PROP_DACB;
 816
 817	ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, config3);
 818	if (ret)
 819		return -EIO;
 820
 821	chip->config3 = config3;
 822
 823	return len;
 824}
 825
 826static IIO_DEVICE_ATTR(enable_proportion_DACB, S_IRUGO | S_IWUSR,
 827		adt7316_show_enable_prop_DACB,
 828		adt7316_store_enable_prop_DACB,
 829		0);
 830
 831static ssize_t adt7316_show_DAC_2Vref_ch_mask(struct device *dev,
 832		struct device_attribute *attr,
 833		char *buf)
 834{
 835	struct iio_dev *dev_info = dev_get_drvdata(dev);
 836	struct adt7316_chip_info *chip = dev_info->dev_data;
 837
 838	return sprintf(buf, "0x%x\n",
 839		chip->dac_config & ADT7316_DA_2VREF_CH_MASK);
 840}
 841
 842static ssize_t adt7316_store_DAC_2Vref_ch_mask(struct device *dev,
 843		struct device_attribute *attr,
 844		const char *buf,
 845		size_t len)
 846{
 847	struct iio_dev *dev_info = dev_get_drvdata(dev);
 848	struct adt7316_chip_info *chip = dev_info->dev_data;
 849	u8 dac_config;
 850	unsigned long data = 0;
 851	int ret;
 852
 853	ret = strict_strtoul(buf, 16, &data);
 854	if (ret || data > ADT7316_DA_2VREF_CH_MASK)
 855		return -EINVAL;
 856
 857	dac_config = chip->dac_config & (~ADT7316_DA_2VREF_CH_MASK);
 858	dac_config |= data;
 859
 860	ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
 861	if (ret)
 862		return -EIO;
 863
 864	chip->dac_config = dac_config;
 865
 866	return len;
 867}
 868
 869static IIO_DEVICE_ATTR(DAC_2Vref_channels_mask, S_IRUGO | S_IWUSR,
 870		adt7316_show_DAC_2Vref_ch_mask,
 871		adt7316_store_DAC_2Vref_ch_mask,
 872		0);
 873
 874static ssize_t adt7316_show_DAC_update_mode(struct device *dev,
 875		struct device_attribute *attr,
 876		char *buf)
 877{
 878	struct iio_dev *dev_info = dev_get_drvdata(dev);
 879	struct adt7316_chip_info *chip = dev_info->dev_data;
 880
 881	if (!(chip->config3 & ADT7316_DA_EN_VIA_DAC_LDCA))
 882		return sprintf(buf, "manual\n");
 883	else {
 884		switch (chip->dac_config & ADT7316_DA_EN_MODE_MASK) {
 885		case ADT7316_DA_EN_MODE_SINGLE:
 886			return sprintf(buf, "0 - auto at any MSB DAC writing\n");
 887		case ADT7316_DA_EN_MODE_AB_CD:
 888			return sprintf(buf, "1 - auto at MSB DAC AB and CD writing\n");
 889		case ADT7316_DA_EN_MODE_ABCD:
 890			return sprintf(buf, "2 - auto at MSB DAC ABCD writing\n");
 891		default: /* ADT7316_DA_EN_MODE_LDAC */
 892			return sprintf(buf, "3 - manual\n");
 893		}
 894	}
 895}
 896
 897static ssize_t adt7316_store_DAC_update_mode(struct device *dev,
 898		struct device_attribute *attr,
 899		const char *buf,
 900		size_t len)
 901{
 902	struct iio_dev *dev_info = dev_get_drvdata(dev);
 903	struct adt7316_chip_info *chip = dev_info->dev_data;
 904	u8 dac_config;
 905	unsigned long data;
 906	int ret;
 907
 908	if (!(chip->config3 & ADT7316_DA_EN_VIA_DAC_LDCA))
 909		return -EPERM;
 910
 911	ret = strict_strtoul(buf, 10, &data);
 912	if (ret || data > ADT7316_DA_EN_MODE_MASK)
 913		return -EINVAL;
 914
 915	dac_config = chip->dac_config & (~ADT7316_DA_EN_MODE_MASK);
 916	dac_config |= data;
 917
 918	ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
 919	if (ret)
 920		return -EIO;
 921
 922	chip->dac_config = dac_config;
 923
 924	return len;
 925}
 926
 927static IIO_DEVICE_ATTR(DAC_update_mode, S_IRUGO | S_IWUSR,
 928		adt7316_show_DAC_update_mode,
 929		adt7316_store_DAC_update_mode,
 930		0);
 931
 932static ssize_t adt7316_show_all_DAC_update_modes(struct device *dev,
 933		struct device_attribute *attr,
 934		char *buf)
 935{
 936	struct iio_dev *dev_info = dev_get_drvdata(dev);
 937	struct adt7316_chip_info *chip = dev_info->dev_data;
 938
 939	if (chip->config3 & ADT7316_DA_EN_VIA_DAC_LDCA)
 940		return sprintf(buf, "0 - auto at any MSB DAC writing\n"
 941				"1 - auto at MSB DAC AB and CD writing\n"
 942				"2 - auto at MSB DAC ABCD writing\n"
 943				"3 - manual\n");
 944	else
 945		return sprintf(buf, "manual\n");
 946}
 947
 948static IIO_DEVICE_ATTR(all_DAC_update_modes, S_IRUGO,
 949		adt7316_show_all_DAC_update_modes, NULL, 0);
 950
 951
 952static ssize_t adt7316_store_update_DAC(struct device *dev,
 953		struct device_attribute *attr,
 954		const char *buf,
 955		size_t len)
 956{
 957	struct iio_dev *dev_info = dev_get_drvdata(dev);
 958	struct adt7316_chip_info *chip = dev_info->dev_data;
 959	u8 ldac_config;
 960	unsigned long data;
 961	int ret;
 962
 963	if (chip->config3 & ADT7316_DA_EN_VIA_DAC_LDCA) {
 964		if ((chip->dac_config & ADT7316_DA_EN_MODE_MASK) !=
 965			ADT7316_DA_EN_MODE_LDAC)
 966			return -EPERM;
 967
 968		ret = strict_strtoul(buf, 16, &data);
 969		if (ret || data > ADT7316_LDAC_EN_DA_MASK)
 970			return -EINVAL;
 971
 972		ldac_config = chip->ldac_config & (~ADT7316_LDAC_EN_DA_MASK);
 973		ldac_config |= data;
 974
 975		ret = chip->bus.write(chip->bus.client, ADT7316_LDAC_CONFIG,
 976			ldac_config);
 977		if (ret)
 978			return -EIO;
 979	} else {
 980		gpio_set_value(chip->ldac_pin, 0);
 981		gpio_set_value(chip->ldac_pin, 1);
 982	}
 983
 984	return len;
 985}
 986
 987static IIO_DEVICE_ATTR(update_DAC, S_IRUGO | S_IWUSR,
 988		NULL,
 989		adt7316_store_update_DAC,
 990		0);
 991
 992static ssize_t adt7316_show_DA_AB_Vref_bypass(struct device *dev,
 993		struct device_attribute *attr,
 994		char *buf)
 995{
 996	struct iio_dev *dev_info = dev_get_drvdata(dev);
 997	struct adt7316_chip_info *chip = dev_info->dev_data;
 998
 999	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
1000		return -EPERM;
1001
1002	return sprintf(buf, "%d\n",
1003		!!(chip->dac_config & ADT7316_VREF_BYPASS_DAC_AB));
1004}
1005
1006static ssize_t adt7316_store_DA_AB_Vref_bypass(struct device *dev,
1007		struct device_attribute *attr,
1008		const char *buf,
1009		size_t len)
1010{
1011	struct iio_dev *dev_info = dev_get_drvdata(dev);
1012	struct adt7316_chip_info *chip = dev_info->dev_data;
1013	u8 dac_config;
1014	int ret;
1015
1016	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
1017		return -EPERM;
1018
1019	dac_config = chip->dac_config & (~ADT7316_VREF_BYPASS_DAC_AB);
1020	if (!memcmp(buf, "1", 1))
1021		dac_config |= ADT7316_VREF_BYPASS_DAC_AB;
1022
1023	ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
1024	if (ret)
1025		return -EIO;
1026
1027	chip->dac_config = dac_config;
1028
1029	return len;
1030}
1031
1032static IIO_DEVICE_ATTR(DA_AB_Vref_bypass, S_IRUGO | S_IWUSR,
1033		adt7316_show_DA_AB_Vref_bypass,
1034		adt7316_store_DA_AB_Vref_bypass,
1035		0);
1036
1037static ssize_t adt7316_show_DA_CD_Vref_bypass(struct device *dev,
1038		struct device_attribute *attr,
1039		char *buf)
1040{
1041	struct iio_dev *dev_info = dev_get_drvdata(dev);
1042	struct adt7316_chip_info *chip = dev_info->dev_data;
1043
1044	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
1045		return -EPERM;
1046
1047	return sprintf(buf, "%d\n",
1048		!!(chip->dac_config & ADT7316_VREF_BYPASS_DAC_CD));
1049}
1050
1051static ssize_t adt7316_store_DA_CD_Vref_bypass(struct device *dev,
1052		struct device_attribute *attr,
1053		const char *buf,
1054		size_t len)
1055{
1056	struct iio_dev *dev_info = dev_get_drvdata(dev);
1057	struct adt7316_chip_info *chip = dev_info->dev_data;
1058	u8 dac_config;
1059	int ret;
1060
1061	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
1062		return -EPERM;
1063
1064	dac_config = chip->dac_config & (~ADT7316_VREF_BYPASS_DAC_CD);
1065	if (!memcmp(buf, "1", 1))
1066		dac_config |= ADT7316_VREF_BYPASS_DAC_CD;
1067
1068	ret = chip->bus.write(chip->bus.client, ADT7316_DAC_CONFIG, dac_config);
1069	if (ret)
1070		return -EIO;
1071
1072	chip->dac_config = dac_config;
1073
1074	return len;
1075}
1076
1077static IIO_DEVICE_ATTR(DA_CD_Vref_bypass, S_IRUGO | S_IWUSR,
1078		adt7316_show_DA_CD_Vref_bypass,
1079		adt7316_store_DA_CD_Vref_bypass,
1080		0);
1081
1082static ssize_t adt7316_show_DAC_internal_Vref(struct device *dev,
1083		struct device_attribute *attr,
1084		char *buf)
1085{
1086	struct iio_dev *dev_info = dev_get_drvdata(dev);
1087	struct adt7316_chip_info *chip = dev_info->dev_data;
1088
1089	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
1090		return sprintf(buf, "0x%x\n",
1091			(chip->dac_config & ADT7516_DAC_IN_VREF_MASK) >>
1092			ADT7516_DAC_IN_VREF_OFFSET);
1093	else
1094		return sprintf(buf, "%d\n",
1095			!!(chip->dac_config & ADT7316_DAC_IN_VREF));
1096}
1097
1098static ssize_t adt7316_store_DAC_internal_Vref(struct device *dev,
1099		struct device_attribute *attr,
1100		const char *buf,
1101		size_t len)
1102{
1103	struct iio_dev *dev_info = dev_get_drvdata(dev);
1104	struct adt7316_chip_info *chip = dev_info->dev_data;
1105	u8 ldac_config;
1106	unsigned long data;
1107	int ret;
1108
1109	if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) {
1110		ret = strict_strtoul(buf, 16, &data);
1111		if (ret || data > 3)
1112			return -EINVAL;
1113
1114		ldac_config = chip->ldac_config & (~ADT7516_DAC_IN_VREF_MASK);
1115		if (data & 0x1)
1116			ldac_config |= ADT7516_DAC_AB_IN_VREF;
1117		else if (data & 0x2)
1118			ldac_config |= ADT7516_DAC_CD_IN_VREF;
1119	} else {
1120		ret = strict_strtoul(buf, 16, &data);
1121		if (ret)
1122			return -EINVAL;
1123
1124		ldac_config = chip->ldac_config & (~ADT7316_DAC_IN_VREF);
1125		if (data)
1126			ldac_config = chip->ldac_config | ADT7316_DAC_IN_VREF;
1127	}
1128
1129	ret = chip->bus.write(chip->bus.client, ADT7316_LDAC_CONFIG, ldac_config);
1130	if (ret)
1131		return -EIO;
1132
1133	chip->ldac_config = ldac_config;
1134
1135	return len;
1136}
1137
1138static IIO_DEVICE_ATTR(DAC_internal_Vref, S_IRUGO | S_IWUSR,
1139		adt7316_show_DAC_internal_Vref,
1140		adt7316_store_DAC_internal_Vref,
1141		0);
1142
1143static ssize_t adt7316_show_ad(struct adt7316_chip_info *chip,
1144		int channel, char *buf)
1145{
1146	u16 data;
1147	u8 msb, lsb;
1148	char sign = ' ';
1149	int ret;
1150
1151	if ((chip->config2 & ADT7316_AD_SINGLE_CH_MODE) &&
1152		channel != (chip->config2 & ADT7516_AD_SINGLE_CH_MASK))
1153		return -EPERM;
1154
1155	switch (channel) {
1156	case ADT7316_AD_SINGLE_CH_IN:
1157		ret = chip->bus.read(chip->bus.client,
1158			ADT7316_LSB_IN_TEMP_VDD, &lsb);
1159		if (ret)
1160			return -EIO;
1161
1162		ret = chip->bus.read(chip->bus.client,
1163			ADT7316_AD_MSB_DATA_BASE + channel, &msb);
1164		if (ret)
1165			return -EIO;
1166
1167		data = msb << ADT7316_T_VALUE_FLOAT_OFFSET;
1168		data |= lsb & ADT7316_LSB_IN_TEMP_MASK;
1169		break;
1170	case ADT7316_AD_SINGLE_CH_VDD:
1171		ret = chip->bus.read(chip->bus.client,
1172			ADT7316_LSB_IN_TEMP_VDD, &lsb);
1173		if (ret)
1174			return -EIO;
1175
1176		ret = chip->bus.read(chip->bus.client,
1177
1178			ADT7316_AD_MSB_DATA_BASE + channel, &msb);
1179		if (ret)
1180			return -EIO;
1181
1182		data = msb << ADT7316_T_VALUE_FLOAT_OFFSET;
1183		data |= (lsb & ADT7316_LSB_VDD_MASK) >> ADT7316_LSB_VDD_OFFSET;
1184		return sprintf(buf, "%d\n", data);
1185	default: /* ex_temp and ain */
1186		ret = chip->bus.read(chip->bus.client,
1187			ADT7316_LSB_EX_TEMP_AIN, &lsb);
1188		if (ret)
1189			return -EIO;
1190
1191		ret = chip->bus.read(chip->bus.client,
1192			ADT7316_AD_MSB_DATA_BASE + channel, &msb);
1193		if (ret)
1194			return -EIO;
1195
1196		data = msb << ADT7316_T_VALUE_FLOAT_OFFSET;
1197		data |= lsb & (ADT7316_LSB_EX_TEMP_MASK <<
1198			(ADT7516_LSB_AIN_SHIFT * (channel -
1199			(ADT7316_MSB_EX_TEMP - ADT7316_AD_MSB_DATA_BASE))));
1200
1201		if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
1202			return sprintf(buf, "%d\n", data);
1203		else
1204			break;
1205	}
1206
1207	if (data & ADT7316_T_VALUE_SIGN) {
1208		/* convert supplement to positive value */
1209		data = (ADT7316_T_VALUE_SIGN << 1) - data;
1210		sign = '-';
1211	}
1212
1213	return sprintf(buf, "%c%d.%.2d\n", sign,
1214		(data >> ADT7316_T_VALUE_FLOAT_OFFSET),
1215		(data & ADT7316_T_VALUE_FLOAT_MASK) * 25);
1216}
1217
1218static ssize_t adt7316_show_VDD(struct device *dev,
1219		struct device_attribute *attr,
1220		char *buf)
1221{
1222	struct iio_dev *dev_info = dev_get_drvdata(dev);
1223	struct adt7316_chip_info *chip = dev_info->dev_data;
1224
1225	return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_VDD, buf);
1226}
1227static IIO_DEVICE_ATTR(VDD, S_IRUGO, adt7316_show_VDD, NULL, 0);
1228
1229static ssize_t adt7316_show_in_temp(struct device *dev,
1230		struct device_attribute *attr,
1231		char *buf)
1232{
1233	struct iio_dev *dev_info = dev_get_drvdata(dev);
1234	struct adt7316_chip_info *chip = dev_info->dev_data;
1235
1236	return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_IN, buf);
1237}
1238
1239static IIO_DEVICE_ATTR(in_temp, S_IRUGO, adt7316_show_in_temp, NULL, 0);
1240
1241static ssize_t adt7316_show_ex_temp_AIN1(struct device *dev,
1242		struct device_attribute *attr,
1243		char *buf)
1244{
1245	struct iio_dev *dev_info = dev_get_drvdata(dev);
1246	struct adt7316_chip_info *chip = dev_info->dev_data;
1247
1248	return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_EX, buf);
1249}
1250
1251static IIO_DEVICE_ATTR(ex_temp_AIN1, S_IRUGO, adt7316_show_ex_temp_AIN1, NULL, 0);
1252static IIO_DEVICE_ATTR(ex_temp, S_IRUGO, adt7316_show_ex_temp_AIN1, NULL, 0);
1253
1254static ssize_t adt7316_show_AIN2(struct device *dev,
1255		struct device_attribute *attr,
1256		char *buf)
1257{
1258	struct iio_dev *dev_info = dev_get_drvdata(dev);
1259	struct adt7316_chip_info *chip = dev_info->dev_data;
1260
1261	return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN2, buf);
1262}
1263static IIO_DEVICE_ATTR(AIN2, S_IRUGO, adt7316_show_AIN2, NULL, 0);
1264
1265static ssize_t adt7316_show_AIN3(struct device *dev,
1266		struct device_attribute *attr,
1267		char *buf)
1268{
1269	struct iio_dev *dev_info = dev_get_drvdata(dev);
1270	struct adt7316_chip_info *chip = dev_info->dev_data;
1271
1272	return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN3, buf);
1273}
1274static IIO_DEVICE_ATTR(AIN3, S_IRUGO, adt7316_show_AIN3, NULL, 0);
1275
1276static ssize_t adt7316_show_AIN4(struct device *dev,
1277		struct device_attribute *attr,
1278		char *buf)
1279{
1280	struct iio_dev *dev_info = dev_get_drvdata(dev);
1281	struct adt7316_chip_info *chip = dev_info->dev_data;
1282
1283	return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN4, buf);
1284}
1285static IIO_DEVICE_ATTR(AIN4, S_IRUGO, adt7316_show_AIN4, NULL, 0);
1286
1287static ssize_t adt7316_show_temp_offset(struct adt7316_chip_info *chip,
1288		int offset_addr, char *buf)
1289{
1290	int data;
1291	u8 val;
1292	int ret;
1293
1294	ret = chip->bus.read(chip->bus.client, offset_addr, &val);
1295	if (ret)
1296		return -EIO;
1297
1298	data = (int)val;
1299	if (val & 0x80)
1300		data -= 256;
1301
1302	return sprintf(buf, "%d\n", data);
1303}
1304
1305static ssize_t adt7316_store_temp_offset(struct adt7316_chip_info *chip,
1306		int offset_addr, const char *buf, size_t len)
1307{
1308	long data;
1309	u8 val;
1310	int ret;
1311
1312	ret = strict_strtol(buf, 10, &data);
1313	if (ret || data > 127 || data < -128)
1314		return -EINVAL;
1315
1316	if (data < 0)
1317		data += 256;
1318
1319	val = (u8)data;
1320
1321	ret = chip->bus.write(chip->bus.client, offset_addr, val);
1322	if (ret)
1323		return -EIO;
1324
1325	return len;
1326}
1327
1328static ssize_t adt7316_show_in_temp_offset(struct device *dev,
1329		struct device_attribute *attr,
1330		char *buf)
1331{
1332	struct iio_dev *dev_info = dev_get_drvdata(dev);
1333	struct adt7316_chip_info *chip = dev_info->dev_data;
1334
1335	return adt7316_show_temp_offset(chip, ADT7316_IN_TEMP_OFFSET, buf);
1336}
1337
1338static ssize_t adt7316_store_in_temp_offset(struct device *dev,
1339		struct device_attribute *attr,
1340		const char *buf,
1341		size_t len)
1342{
1343	struct iio_dev *dev_info = dev_get_drvdata(dev);
1344	struct adt7316_chip_info *chip = dev_info->dev_data;
1345
1346	return adt7316_store_temp_offset(chip, ADT7316_IN_TEMP_OFFSET, buf, len);
1347}
1348
1349static IIO_DEVICE_ATTR(in_temp_offset, S_IRUGO | S_IWUSR,
1350		adt7316_show_in_temp_offset,
1351		adt7316_store_in_temp_offset, 0);
1352
1353static ssize_t adt7316_show_ex_temp_offset(struct device *dev,
1354		struct device_attribute *attr,
1355		char *buf)
1356{
1357	struct iio_dev *dev_info = dev_get_drvdata(dev);
1358	struct adt7316_chip_info *chip = dev_info->dev_data;
1359
1360	return adt7316_show_temp_offset(chip, ADT7316_EX_TEMP_OFFSET, buf);
1361}
1362
1363static ssize_t adt7316_store_ex_temp_offset(struct device *dev,
1364		struct device_attribute *attr,
1365		const char *buf,
1366		size_t len)
1367{
1368	struct iio_dev *dev_info = dev_get_drvdata(dev);
1369	struct adt7316_chip_info *chip = dev_info->dev_data;
1370
1371	return adt7316_store_temp_offset(chip, ADT7316_EX_TEMP_OFFSET, buf, len);
1372}
1373
1374static IIO_DEVICE_ATTR(ex_temp_offset, S_IRUGO | S_IWUSR,
1375		adt7316_show_ex_temp_offset,
1376		adt7316_store_ex_temp_offset, 0);
1377
1378static ssize_t adt7316_show_in_analog_temp_offset(struct device *dev,
1379		struct device_attribute *attr,
1380		char *buf)
1381{
1382	struct iio_dev *dev_info = dev_get_drvdata(dev);
1383	struct adt7316_chip_info *chip = dev_info->dev_data;
1384
1385	return adt7316_show_temp_offset(chip,
1386			ADT7316_IN_ANALOG_TEMP_OFFSET, buf);
1387}
1388
1389static ssize_t adt7316_store_in_analog_temp_offset(struct device *dev,
1390		struct device_attribute *attr,
1391		const char *buf,
1392		size_t len)
1393{
1394	struct iio_dev *dev_info = dev_get_drvdata(dev);
1395	struct adt7316_chip_info *chip = dev_info->dev_data;
1396
1397	return adt7316_store_temp_offset(chip,
1398			ADT7316_IN_ANALOG_TEMP_OFFSET, buf, len);
1399}
1400
1401static IIO_DEVICE_ATTR(in_analog_temp_offset, S_IRUGO | S_IWUSR,
1402		adt7316_show_in_analog_temp_offset,
1403		adt7316_store_in_analog_temp_offset, 0);
1404
1405static ssize_t adt7316_show_ex_analog_temp_offset(struct device *dev,
1406		struct device_attribute *attr,
1407		char *buf)
1408{
1409	struct iio_dev *dev_info = dev_get_drvdata(dev);
1410	struct adt7316_chip_info *chip = dev_info->dev_data;
1411
1412	return adt7316_show_temp_offset(chip,
1413			ADT7316_EX_ANALOG_TEMP_OFFSET, buf);
1414}
1415
1416static ssize_t adt7316_store_ex_analog_temp_offset(struct device *dev,
1417		struct device_attribute *attr,
1418		const char *buf,
1419		size_t len)
1420{
1421	struct iio_dev *dev_info = dev_get_drvdata(dev);
1422	struct adt7316_chip_info *chip = dev_info->dev_data;
1423
1424	return adt7316_store_temp_offset(chip,
1425			ADT7316_EX_ANALOG_TEMP_OFFSET, buf, len);
1426}
1427
1428static IIO_DEVICE_ATTR(ex_analog_temp_offset, S_IRUGO | S_IWUSR,
1429		adt7316_show_ex_analog_temp_offset,
1430		adt7316_store_ex_analog_temp_offset, 0);
1431
1432static ssize_t adt7316_show_DAC(struct adt7316_chip_info *chip,
1433		int channel, char *buf)
1434{
1435	u16 data;
1436	u8 msb, lsb, offset;
1437	int ret;
1438
1439	if (channel >= ADT7316_DA_MSB_DATA_REGS ||
1440		(channel == 0 &&
1441		(chip->config3 & ADT7316_EN_IN_TEMP_PROP_DACA)) ||
1442		(channel == 1 &&
1443		(chip->config3 & ADT7316_EN_EX_TEMP_PROP_DACB)))
1444		return -EPERM;
1445
1446	offset = chip->dac_bits - 8;
1447
1448	if (chip->dac_bits > 8) {
1449		ret = chip->bus.read(chip->bus.client,
1450			ADT7316_DA_DATA_BASE + channel * 2, &lsb);
1451		if (ret)
1452			return -EIO;
1453	}
1454
1455	ret = chip->bus.read(chip->bus.client,
1456		ADT7316_DA_DATA_BASE + 1 + channel * 2, &msb);
1457	if (ret)
1458		return -EIO;
1459
1460	data = (msb << offset) + (lsb & ((1 << offset) - 1));
1461
1462	return sprintf(buf, "%d\n", data);
1463}
1464
1465static ssize_t adt7316_store_DAC(struct adt7316_chip_info *chip,
1466		int channel, const char *buf, size_t len)
1467{
1468	u8 msb, lsb, offset;
1469	unsigned long data;
1470	int ret;
1471
1472	if (channel >= ADT7316_DA_MSB_DATA_REGS ||
1473		(channel == 0 &&
1474		(chip->config3 & ADT7316_EN_IN_TEMP_PROP_DACA)) ||
1475		(channel == 1 &&
1476		(chip->config3 & ADT7316_EN_EX_TEMP_PROP_DACB)))
1477		return -EPERM;
1478
1479	offset = chip->dac_bits - 8;
1480
1481	ret = strict_strtoul(buf, 10, &data);
1482	if (ret || data >= (1 << chip->dac_bits))
1483		return -EINVAL;
1484
1485	if (chip->dac_bits > 8) {
1486		lsb = data & (1 << offset);
1487		ret = chip->bus.write(chip->bus.client,
1488			ADT7316_DA_DATA_BASE + channel * 2, lsb);
1489		if (ret)
1490			return -EIO;
1491	}
1492
1493	msb = data >> offset;
1494	ret = chip->bus.write(chip->bus.client,
1495		ADT7316_DA_DATA_BASE + 1 + channel * 2, msb);
1496	if (ret)
1497		return -EIO;
1498
1499	return len;
1500}
1501
1502static ssize_t adt7316_show_DAC_A(struct device *dev,
1503		struct device_attribute *attr,
1504		char *buf)
1505{
1506	struct iio_dev *dev_info = dev_get_drvdata(dev);
1507	struct adt7316_chip_info *chip = dev_info->dev_data;
1508
1509	return adt7316_show_DAC(chip, 0, buf);
1510}
1511
1512static ssize_t adt7316_store_DAC_A(struct device *dev,
1513		struct device_attribute *attr,
1514		const char *buf,
1515		size_t len)
1516{
1517	struct iio_dev *dev_info = dev_get_drvdata(dev);
1518	struct adt7316_chip_info *chip = dev_info->dev_data;
1519
1520	return adt7316_store_DAC(chip, 0, buf, len);
1521}
1522
1523static IIO_DEVICE_ATTR(DAC_A, S_IRUGO | S_IWUSR, adt7316_show_DAC_A,
1524		adt7316_store_DAC_A, 0);
1525
1526static ssize_t adt7316_show_DAC_B(struct device *dev,
1527		struct device_attribute *attr,
1528		char *buf)
1529{
1530	struct iio_dev *dev_info = dev_get_drvdata(dev);
1531	struct adt7316_chip_info *chip = dev_info->dev_data;
1532
1533	return adt7316_show_DAC(chip, 1, buf);
1534}
1535
1536static ssize_t adt7316_store_DAC_B(struct device *dev,
1537		struct device_attribute *attr,
1538		const char *buf,
1539		size_t len)
1540{
1541	struct iio_dev *dev_info = dev_get_drvdata(dev);
1542	struct adt7316_chip_info *chip = dev_info->dev_data;
1543
1544	return adt7316_store_DAC(chip, 1, buf, len);
1545}
1546
1547static IIO_DEVICE_ATTR(DAC_B, S_IRUGO | S_IWUSR, adt7316_show_DAC_B,
1548		adt7316_store_DAC_B, 0);
1549
1550static ssize_t adt7316_show_DAC_C(struct device *dev,
1551		struct device_attribute *attr,
1552		char *buf)
1553{
1554	struct iio_dev *dev_info = dev_get_drvdata(dev);
1555	struct adt7316_chip_info *chip = dev_info->dev_data;
1556
1557	return adt7316_show_DAC(chip, 2, buf);
1558}
1559
1560static ssize_t adt7316_store_DAC_C(struct device *dev,
1561		struct device_attribute *attr,
1562		const char *buf,
1563		size_t len)
1564{
1565	struct iio_dev *dev_info = dev_get_drvdata(dev);
1566	struct adt7316_chip_info *chip = dev_info->dev_data;
1567
1568	return adt7316_store_DAC(chip, 2, buf, len);
1569}
1570
1571static IIO_DEVICE_ATTR(DAC_C, S_IRUGO | S_IWUSR, adt7316_show_DAC_C,
1572		adt7316_store_DAC_C, 0);
1573
1574static ssize_t adt7316_show_DAC_D(struct device *dev,
1575		struct device_attribute *attr,
1576		char *buf)
1577{
1578	struct iio_dev *dev_info = dev_get_drvdata(dev);
1579	struct adt7316_chip_info *chip = dev_info->dev_data;
1580
1581	return adt7316_show_DAC(chip, 3, buf);
1582}
1583
1584static ssize_t adt7316_store_DAC_D(struct device *dev,
1585		struct device_attribute *attr,
1586		const char *buf,
1587		size_t len)
1588{
1589	struct iio_dev *dev_info = dev_get_drvdata(dev);
1590	struct adt7316_chip_info *chip = dev_info->dev_data;
1591
1592	return adt7316_store_DAC(chip, 3, buf, len);
1593}
1594
1595static IIO_DEVICE_ATTR(DAC_D, S_IRUGO | S_IWUSR, adt7316_show_DAC_D,
1596		adt7316_store_DAC_D, 0);
1597
1598static ssize_t adt7316_show_device_id(struct device *dev,
1599		struct device_attribute *attr,
1600		char *buf)
1601{
1602	struct iio_dev *dev_info = dev_get_drvdata(dev);
1603	struct adt7316_chip_info *chip = dev_info->dev_data;
1604	u8 id;
1605	int ret;
1606
1607	ret = chip->bus.read(chip->bus.client, ADT7316_DEVICE_ID, &id);
1608	if (ret)
1609		return -EIO;
1610
1611	return sprintf(buf, "%d\n", id);
1612}
1613
1614static IIO_DEVICE_ATTR(device_id, S_IRUGO, adt7316_show_device_id, NULL, 0);
1615
1616static ssize_t adt7316_show_manufactorer_id(struct device *dev,
1617		struct device_attribute *attr,
1618		char *buf)
1619{
1620	struct iio_dev *dev_info = dev_get_drvdata(dev);
1621	struct adt7316_chip_info *chip = dev_info->dev_data;
1622	u8 id;
1623	int ret;
1624
1625	ret = chip->bus.read(chip->bus.client, ADT7316_MANUFACTURE_ID, &id);
1626	if (ret)
1627		return -EIO;
1628
1629	return sprintf(buf, "%d\n", id);
1630}
1631
1632static IIO_DEVICE_ATTR(manufactorer_id, S_IRUGO,
1633		adt7316_show_manufactorer_id, NULL, 0);
1634
1635static ssize_t adt7316_show_device_rev(struct device *dev,
1636		struct device_attribute *attr,
1637		char *buf)
1638{
1639	struct iio_dev *dev_info = dev_get_drvdata(dev);
1640	struct adt7316_chip_info *chip = dev_info->dev_data;
1641	u8 rev;
1642	int ret;
1643
1644	ret = chip->bus.read(chip->bus.client, ADT7316_DEVICE_REV, &rev);
1645	if (ret)
1646		return -EIO;
1647
1648	return sprintf(buf, "%d\n", rev);
1649}
1650
1651static IIO_DEVICE_ATTR(device_rev, S_IRUGO, adt7316_show_device_rev, NULL, 0);
1652
1653static ssize_t adt7316_show_bus_type(struct device *dev,
1654		struct device_attribute *attr,
1655		char *buf)
1656{
1657	struct iio_dev *dev_info = dev_get_drvdata(dev);
1658	struct adt7316_chip_info *chip = dev_info->dev_data;
1659	u8 stat;
1660	int ret;
1661
1662	ret = chip->bus.read(chip->bus.client, ADT7316_SPI_LOCK_STAT, &stat);
1663	if (ret)
1664		return -EIO;
1665
1666	if (stat)
1667		return sprintf(buf, "spi\n");
1668	else
1669		return sprintf(buf, "i2c\n");
1670}
1671
1672static IIO_DEVICE_ATTR(bus_type, S_IRUGO, adt7316_show_bus_type, NULL, 0);
1673
1674static struct attribute *adt7316_attributes[] = {
1675	&iio_dev_attr_all_modes.dev_attr.attr,
1676	&iio_dev_attr_mode.dev_attr.attr,
1677	&iio_dev_attr_reset.dev_attr.attr,
1678	&iio_dev_attr_enabled.dev_attr.attr,
1679	&iio_dev_attr_ad_channel.dev_attr.attr,
1680	&iio_dev_attr_all_ad_channels.dev_attr.attr,
1681	&iio_dev_attr_disable_averaging.dev_attr.attr,
1682	&iio_dev_attr_enable_smbus_timeout.dev_attr.attr,
1683	&iio_dev_attr_powerdown.dev_attr.attr,
1684	&iio_dev_attr_fast_ad_clock.dev_attr.attr,
1685	&iio_dev_attr_da_high_resolution.dev_attr.attr,
1686	&iio_dev_attr_enable_proportion_DACA.dev_attr.attr,
1687	&iio_dev_attr_enable_proportion_DACB.dev_attr.attr,
1688	&iio_dev_attr_DAC_2Vref_channels_mask.dev_attr.attr,
1689	&iio_dev_attr_DAC_update_mode.dev_attr.attr,
1690	&iio_dev_attr_all_DAC_update_modes.dev_attr.attr,
1691	&iio_dev_attr_update_DAC.dev_attr.attr,
1692	&iio_dev_attr_DA_AB_Vref_bypass.dev_attr.attr,
1693	&iio_dev_attr_DA_CD_Vref_bypass.dev_attr.attr,
1694	&iio_dev_attr_DAC_internal_Vref.dev_attr.attr,
1695	&iio_dev_attr_VDD.dev_attr.attr,
1696	&iio_dev_attr_in_temp.dev_attr.attr,
1697	&iio_dev_attr_ex_temp.dev_attr.attr,
1698	&iio_dev_attr_in_temp_offset.dev_attr.attr,
1699	&iio_dev_attr_ex_temp_offset.dev_attr.attr,
1700	&iio_dev_attr_in_analog_temp_offset.dev_attr.attr,
1701	&iio_dev_attr_ex_analog_temp_offset.dev_attr.attr,
1702	&iio_dev_attr_DAC_A.dev_attr.attr,
1703	&iio_dev_attr_DAC_B.dev_attr.attr,
1704	&iio_dev_attr_DAC_C.dev_attr.attr,
1705	&iio_dev_attr_DAC_D.dev_attr.attr,
1706	&iio_dev_attr_device_id.dev_attr.attr,
1707	&iio_dev_attr_manufactorer_id.dev_attr.attr,
1708	&iio_dev_attr_device_rev.dev_attr.attr,
1709	&iio_dev_attr_bus_type.dev_attr.attr,
1710	NULL,
1711};
1712
1713static const struct attribute_group adt7316_attribute_group = {
1714	.attrs = adt7316_attributes,
1715};
1716
1717static struct attribute *adt7516_attributes[] = {
1718	&iio_dev_attr_all_modes.dev_attr.attr,
1719	&iio_dev_attr_mode.dev_attr.attr,
1720	&iio_dev_attr_select_ex_temp.dev_attr.attr,
1721	&iio_dev_attr_reset.dev_attr.attr,
1722	&iio_dev_attr_enabled.dev_attr.attr,
1723	&iio_dev_attr_ad_channel.dev_attr.attr,
1724	&iio_dev_attr_all_ad_channels.dev_attr.attr,
1725	&iio_dev_attr_disable_averaging.dev_attr.attr,
1726	&iio_dev_attr_enable_smbus_timeout.dev_attr.attr,
1727	&iio_dev_attr_powerdown.dev_attr.attr,
1728	&iio_dev_attr_fast_ad_clock.dev_attr.attr,
1729	&iio_dev_attr_AIN_internal_Vref.dev_attr.attr,
1730	&iio_dev_attr_da_high_resolution.dev_attr.attr,
1731	&iio_dev_attr_enable_proportion_DACA.dev_attr.attr,
1732	&iio_dev_attr_enable_proportion_DACB.dev_attr.attr,
1733	&iio_dev_attr_DAC_2Vref_channels_mask.dev_attr.attr,
1734	&iio_dev_attr_DAC_update_mode.dev_attr.attr,
1735	&iio_dev_attr_all_DAC_update_modes.dev_attr.attr,
1736	&iio_dev_attr_update_DAC.dev_attr.attr,
1737	&iio_dev_attr_DA_AB_Vref_bypass.dev_attr.attr,
1738	&iio_dev_attr_DA_CD_Vref_bypass.dev_attr.attr,
1739	&iio_dev_attr_DAC_internal_Vref.dev_attr.attr,
1740	&iio_dev_attr_VDD.dev_attr.attr,
1741	&iio_dev_attr_in_temp.dev_attr.attr,
1742	&iio_dev_attr_ex_temp_AIN1.dev_attr.attr,
1743	&iio_dev_attr_AIN2.dev_attr.attr,
1744	&iio_dev_attr_AIN3.dev_attr.attr,
1745	&iio_dev_attr_AIN4.dev_attr.attr,
1746	&iio_dev_attr_in_temp_offset.dev_attr.attr,
1747	&iio_dev_attr_ex_temp_offset.dev_attr.attr,
1748	&iio_dev_attr_in_analog_temp_offset.dev_attr.attr,
1749	&iio_dev_attr_ex_analog_temp_offset.dev_attr.attr,
1750	&iio_dev_attr_DAC_A.dev_attr.attr,
1751	&iio_dev_attr_DAC_B.dev_attr.attr,
1752	&iio_dev_attr_DAC_C.dev_attr.attr,
1753	&iio_dev_attr_DAC_D.dev_attr.attr,
1754	&iio_dev_attr_device_id.dev_attr.attr,
1755	&iio_dev_attr_manufactorer_id.dev_attr.attr,
1756	&iio_dev_attr_device_rev.dev_attr.attr,
1757	&iio_dev_attr_bus_type.dev_attr.attr,
1758	NULL,
1759};
1760
1761static const struct attribute_group adt7516_attribute_group = {
1762	.attrs = adt7516_attributes,
1763};
1764
1765static irqreturn_t adt7316_event_handler(int irq, void *private)
1766{
1767	struct iio_dev *indio_dev = private;
1768	struct adt7316_chip_info *chip = iio_dev_get_devdata(indio_dev);
1769	u8 stat1, stat2;
1770	int ret;
1771	s64 time;
1772
1773	ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT1, &stat1);
1774	if (!ret) {
1775		if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX)
1776			stat1 &= 0x1F;
1777
1778		time = iio_get_time_ns();
1779		if (stat1 & (1 << 0))
1780			iio_push_event(chip->indio_dev, 0,
1781				       IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
1782							    IIO_EV_TYPE_THRESH,
1783							    IIO_EV_DIR_RISING),
1784				       time);
1785		if (stat1 & (1 << 1))
1786			iio_push_event(chip->indio_dev, 0,
1787				       IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
1788							    IIO_EV_TYPE_THRESH,
1789							    IIO_EV_DIR_FALLING),
1790				       time);
1791		if (stat1 & (1 << 2))
1792			iio_push_event(chip->indio_dev, 0,
1793				       IIO_UNMOD_EVENT_CODE(IIO_TEMP, 1,
1794							    IIO_EV_TYPE_THRESH,
1795							    IIO_EV_DIR_RISING),
1796				       time);
1797		if (stat1 & (1 << 3))
1798			iio_push_event(chip->indio_dev, 0,
1799				       IIO_UNMOD_EVENT_CODE(IIO_TEMP, 1,
1800							    IIO_EV_TYPE_THRESH,
1801							    IIO_EV_DIR_FALLING),
1802				       time);
1803		if (stat1 & (1 << 5))
1804			iio_push_event(chip->indio_dev, 0,
1805				       IIO_UNMOD_EVENT_CODE(IIO_IN, 1,
1806							    IIO_EV_TYPE_THRESH,
1807							    IIO_EV_DIR_EITHER),
1808				       time);
1809		if (stat1 & (1 << 6))
1810			iio_push_event(chip->indio_dev, 0,
1811				       IIO_UNMOD_EVENT_CODE(IIO_IN, 2,
1812							    IIO_EV_TYPE_THRESH,
1813							    IIO_EV_DIR_EITHER),
1814				       time);
1815		if (stat1 & (1 << 7))
1816			iio_push_event(chip->indio_dev, 0,
1817				       IIO_UNMOD_EVENT_CODE(IIO_IN, 3,
1818							    IIO_EV_TYPE_THRESH,
1819							    IIO_EV_DIR_EITHER),
1820				       time);
1821		}
1822	ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT2, &stat2);
1823	if (!ret) {
1824		if (stat2 & ADT7316_INT_MASK2_VDD)
1825			iio_push_event(chip->indio_dev, 0,
1826				       IIO_UNMOD_EVENT_CODE(IIO_IN,
1827							    0,
1828							    IIO_EV_TYPE_THRESH,
1829							    IIO_EV_DIR_RISING),
1830				       iio_get_time_ns());
1831	}
1832
1833	return IRQ_HANDLED;
1834}
1835
1836/*
1837 * Show mask of enabled interrupts in Hex.
1838 */
1839static ssize_t adt7316_show_int_mask(struct device *dev,
1840		struct device_attribute *attr,
1841		char *buf)
1842{
1843	struct iio_dev *dev_info = dev_get_drvdata(dev);
1844	struct adt7316_chip_info *chip = dev_info->dev_data;
1845
1846	return sprintf(buf, "0x%x\n", chip->int_mask);
1847}
1848
1849/*
1850 * Set 1 to the mask in Hex to enabled interrupts.
1851 */
1852static ssize_t adt7316_set_int_mask(struct device *dev,
1853		struct device_attribute *attr,
1854		const char *buf,
1855		size_t len)
1856{
1857	struct iio_dev *dev_info = dev_get_drvdata(dev);
1858	struct adt7316_chip_info *chip = dev_info->dev_data;
1859	unsigned long data;
1860	int ret;
1861	u8 mask;
1862
1863	ret = strict_strtoul(buf, 16, &data);
1864	if (ret || data >= ADT7316_VDD_INT_MASK + 1)
1865		return -EINVAL;
1866
1867	if (data & ADT7316_VDD_INT_MASK)
1868		mask = 0;			/* enable vdd int */
1869	else
1870		mask = ADT7316_INT_MASK2_VDD;	/* disable vdd int */
1871
1872	ret = chip->bus.write(chip->bus.client, ADT7316_INT_MASK2, mask);
1873	if (!ret) {
1874		chip->int_mask &= ~ADT7316_VDD_INT_MASK;
1875		chip->int_mask |= data & ADT7316_VDD_INT_MASK;
1876	}
1877
1878	if (data & ADT7316_TEMP_AIN_INT_MASK) {
1879		if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX)
1880			/* mask in reg is opposite, set 1 to disable */
1881			mask = (~data) & ADT7316_TEMP_INT_MASK;
1882		else
1883			/* mask in reg is opposite, set 1 to disable */
1884			mask = (~data) & ADT7316_TEMP_AIN_INT_MASK;
1885	}
1886	ret = chip->bus.write(chip->bus.client, ADT7316_INT_MASK1, mask);
1887
1888	chip->int_mask = mask;
1889
1890	return len;
1891}
1892static inline ssize_t adt7316_show_ad_bound(struct device *dev,
1893		struct device_attribute *attr,
1894		char *buf)
1895{
1896	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
1897	struct iio_dev *dev_info = dev_get_drvdata(dev);
1898	struct adt7316_chip_info *chip = dev_info->dev_data;
1899	u8 val;
1900	int data;
1901	int ret;
1902
1903	if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX &&
1904		this_attr->address > ADT7316_EX_TEMP_LOW)
1905		return -EPERM;
1906
1907	ret = chip->bus.read(chip->bus.client, this_attr->address, &val);
1908	if (ret)
1909		return -EIO;
1910
1911	data = (int)val;
1912
1913	if (!((chip->id & ID_FAMILY_MASK) == ID_ADT75XX &&
1914		(chip->config1 & ADT7516_SEL_AIN1_2_EX_TEMP_MASK) == 0)) {
1915		if (data & 0x80)
1916			data -= 256;
1917	}
1918
1919	return sprintf(buf, "%d\n", data);
1920}
1921
1922static inline ssize_t adt7316_set_ad_bound(struct device *dev,
1923		struct device_attribute *attr,
1924		const char *buf,
1925		size_t len)
1926{
1927	struct iio_dev_attr *this_attr = to_iio_d

Large files files are truncated, but you can click here to view the full file