File Index
Files and directories
Sign in
FILE

adt7316.c

File preview with syntax highlighting.

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