linux/drivers/staging/iio/addac/adt7316.c
<<
>>
Prefs
   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#include <linux/module.h>
  21
  22#include "../iio.h"
  23#include "../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_MSB_DATA_REGS        4
  50#define ADT7316_LSB_DAC_A               0x10
  51#define ADT7316_MSB_DAC_A               0x11
  52#define ADT7316_LSB_DAC_B               0x12
  53#define ADT7316_MSB_DAC_B               0x13
  54#define ADT7316_LSB_DAC_C               0x14
  55#define ADT7316_MSB_DAC_C               0x15
  56#define ADT7316_LSB_DAC_D               0x16
  57#define ADT7316_MSB_DAC_D               0x17
  58#define ADT7316_CONFIG1                 0x18
  59#define ADT7316_CONFIG2                 0x19
  60#define ADT7316_CONFIG3                 0x1A
  61#define ADT7316_LDAC_CONFIG             0x1B
  62#define ADT7316_DAC_CONFIG              0x1C
  63#define ADT7316_INT_MASK1               0x1D
  64#define ADT7316_INT_MASK2               0x1E
  65#define ADT7316_IN_TEMP_OFFSET          0x1F
  66#define ADT7316_EX_TEMP_OFFSET          0x20
  67#define ADT7316_IN_ANALOG_TEMP_OFFSET   0x21
  68#define ADT7316_EX_ANALOG_TEMP_OFFSET   0x22
  69#define ADT7316_VDD_HIGH                0x23
  70#define ADT7316_VDD_LOW                 0x24
  71#define ADT7316_IN_TEMP_HIGH            0x25
  72#define ADT7316_IN_TEMP_LOW             0x26
  73#define ADT7316_EX_TEMP_HIGH            0x27
  74#define ADT7316_EX_TEMP_LOW             0x28
  75#define ADT7516_AIN2_HIGH               0x2B
  76#define ADT7516_AIN2_LOW                0x2C
  77#define ADT7516_AIN3_HIGH               0x2D
  78#define ADT7516_AIN3_LOW                0x2E
  79#define ADT7516_AIN4_HIGH               0x2F
  80#define ADT7516_AIN4_LOW                0x30
  81#define ADT7316_DEVICE_ID               0x4D
  82#define ADT7316_MANUFACTURE_ID          0x4E
  83#define ADT7316_DEVICE_REV              0x4F
  84#define ADT7316_SPI_LOCK_STAT           0x7F
  85
  86/*
  87 * ADT7316 config1
  88 */
  89#define ADT7316_EN                      0x1
  90#define ADT7516_SEL_EX_TEMP             0x4
  91#define ADT7516_SEL_AIN1_2_EX_TEMP_MASK 0x6
  92#define ADT7516_SEL_AIN3                0x8
  93#define ADT7316_INT_EN                  0x20
  94#define ADT7316_INT_POLARITY            0x40
  95#define ADT7316_PD                      0x80
  96
  97/*
  98 * ADT7316 config2
  99 */
 100#define ADT7316_AD_SINGLE_CH_MASK       0x3
 101#define ADT7516_AD_SINGLE_CH_MASK       0x7
 102#define ADT7316_AD_SINGLE_CH_VDD        0
 103#define ADT7316_AD_SINGLE_CH_IN         1
 104#define ADT7316_AD_SINGLE_CH_EX         2
 105#define ADT7516_AD_SINGLE_CH_AIN1       2
 106#define ADT7516_AD_SINGLE_CH_AIN2       3
 107#define ADT7516_AD_SINGLE_CH_AIN3       4
 108#define ADT7516_AD_SINGLE_CH_AIN4       5
 109#define ADT7316_AD_SINGLE_CH_MODE       0x10
 110#define ADT7316_DISABLE_AVERAGING       0x20
 111#define ADT7316_EN_SMBUS_TIMEOUT        0x40
 112#define ADT7316_RESET                   0x80
 113
 114/*
 115 * ADT7316 config3
 116 */
 117#define ADT7316_ADCLK_22_5              0x1
 118#define ADT7316_DA_HIGH_RESOLUTION      0x2
 119#define ADT7316_DA_EN_VIA_DAC_LDCA      0x4
 120#define ADT7516_AIN_IN_VREF             0x10
 121#define ADT7316_EN_IN_TEMP_PROP_DACA    0x20
 122#define ADT7316_EN_EX_TEMP_PROP_DACB    0x40
 123
 124/*
 125 * ADT7316 DAC config
 126 */
 127#define ADT7316_DA_2VREF_CH_MASK        0xF
 128#define ADT7316_DA_EN_MODE_MASK         0x30
 129#define ADT7316_DA_EN_MODE_SINGLE       0x00
 130#define ADT7316_DA_EN_MODE_AB_CD        0x10
 131#define ADT7316_DA_EN_MODE_ABCD         0x20
 132#define ADT7316_DA_EN_MODE_LDAC         0x30
 133#define ADT7316_VREF_BYPASS_DAC_AB      0x40
 134#define ADT7316_VREF_BYPASS_DAC_CD      0x80
 135
 136/*
 137 * ADT7316 LDAC config
 138 */
 139#define ADT7316_LDAC_EN_DA_MASK         0xF
 140#define ADT7316_DAC_IN_VREF             0x10
 141#define ADT7516_DAC_AB_IN_VREF          0x10
 142#define ADT7516_DAC_CD_IN_VREF          0x20
 143#define ADT7516_DAC_IN_VREF_OFFSET      4
 144#define ADT7516_DAC_IN_VREF_MASK        0x30
 145
 146/*
 147 * ADT7316 INT_MASK2
 148 */
 149#define ADT7316_INT_MASK2_VDD           0x10
 150
 151/*
 152 * ADT7316 value masks
 153 */
 154#define ADT7316_VALUE_MASK              0xfff
 155#define ADT7316_T_VALUE_SIGN            0x400
 156#define ADT7316_T_VALUE_FLOAT_OFFSET    2
 157#define ADT7316_T_VALUE_FLOAT_MASK      0x2
 158
 159/*
 160 * Chip ID
 161 */
 162#define ID_ADT7316              0x1
 163#define ID_ADT7317              0x2
 164#define ID_ADT7318              0x3
 165#define ID_ADT7516              0x11
 166#define ID_ADT7517              0x12
 167#define ID_ADT7519              0x14
 168
 169#define ID_FAMILY_MASK          0xF0
 170#define ID_ADT73XX              0x0
 171#define ID_ADT75XX              0x10
 172
 173/*
 174 * struct adt7316_chip_info - chip specifc information
 175 */
 176
 177struct adt7316_chip_info {
 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)
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
 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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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_priv(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(indio_dev,
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(indio_dev,
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(indio_dev,
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(indio_dev,
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(indio_dev,
1805                                       IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 1,
1806                                                            IIO_EV_TYPE_THRESH,
1807                                                            IIO_EV_DIR_EITHER),
1808                                       time);
1809                if (stat1 & (1 << 6))
1810                        iio_push_event(indio_dev,
1811                                       IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 2,
1812                                                            IIO_EV_TYPE_THRESH,
1813                                                            IIO_EV_DIR_EITHER),
1814                                       time);
1815                if (stat1 & (1 << 7))
1816                        iio_push_event(indio_dev,
1817                                       IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 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(indio_dev,
1826                                       IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE,
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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 = iio_priv(dev_info);
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_dev_attr(attr);
1928        struct iio_dev *dev_info = dev_get_drvdata(dev);
1929        struct adt7316_chip_info *chip = iio_priv(dev_info);
1930        long data;
1931        u8 val;
1932        int ret;
1933
1934        if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX &&
1935                this_attr->address > ADT7316_EX_TEMP_LOW)
1936                return -EPERM;
1937
1938        ret = strict_strtol(buf, 10, &data);
1939        if (ret)
1940                return -EINVAL;
1941
1942        if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX &&
1943                (chip->config1 & ADT7516_SEL_AIN1_2_EX_TEMP_MASK) == 0) {
1944                if (data > 255 || data < 0)
1945                        return -EINVAL;
1946        } else {
1947                if (data > 127 || data < -128)
1948                        return -EINVAL;
1949
1950                if (data < 0)
1951                        data += 256;
1952        }
1953
1954        val = (u8)data;
1955
1956        ret = chip->bus.write(chip->bus.client, this_attr->address, val);
1957        if (ret)
1958                return -EIO;
1959
1960        return len;
1961}
1962
1963static ssize_t adt7316_show_int_enabled(struct device *dev,
1964                struct device_attribute *attr,
1965                char *buf)
1966{
1967        struct iio_dev *dev_info = dev_get_drvdata(dev);
1968        struct adt7316_chip_info *chip = iio_priv(dev_info);
1969
1970        return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_INT_EN));
1971}
1972
1973static ssize_t adt7316_set_int_enabled(struct device *dev,
1974                struct device_attribute *attr,
1975                const char *buf,
1976                size_t len)
1977{
1978        struct iio_dev *dev_info = dev_get_drvdata(dev);
1979        struct adt7316_chip_info *chip = iio_priv(dev_info);
1980        u8 config1;
1981        int ret;
1982
1983        config1 = chip->config1 & (~ADT7316_INT_EN);
1984        if (!memcmp(buf, "1", 1))
1985                config1 |= ADT7316_INT_EN;
1986
1987        ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, config1);
1988        if (ret)
1989                return -EIO;
1990
1991        chip->config1 = config1;
1992
1993        return len;
1994}
1995
1996static IIO_DEVICE_ATTR(int_mask,
1997                       S_IRUGO | S_IWUSR,
1998                       adt7316_show_int_mask, adt7316_set_int_mask,
1999                       0);
2000static IIO_DEVICE_ATTR(in_temp_high_value,
2001                       S_IRUGO | S_IWUSR,
2002                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2003                       ADT7316_IN_TEMP_HIGH);
2004static IIO_DEVICE_ATTR(in_temp_low_value,
2005                       S_IRUGO | S_IWUSR,
2006                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2007                       ADT7316_IN_TEMP_LOW);
2008static IIO_DEVICE_ATTR(ex_temp_high_value,
2009                       S_IRUGO | S_IWUSR,
2010                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2011                       ADT7316_EX_TEMP_HIGH);
2012static IIO_DEVICE_ATTR(ex_temp_low_value,
2013                       S_IRUGO | S_IWUSR,
2014                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2015                       ADT7316_EX_TEMP_LOW);
2016
2017/* NASTY duplication to be fixed */
2018static IIO_DEVICE_ATTR(ex_temp_ain1_high_value,
2019                       S_IRUGO | S_IWUSR,
2020                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2021                       ADT7316_EX_TEMP_HIGH);
2022static IIO_DEVICE_ATTR(ex_temp_ain1_low_value,
2023                       S_IRUGO | S_IWUSR,
2024                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2025                       ADT7316_EX_TEMP_LOW);
2026static IIO_DEVICE_ATTR(ain2_high_value,
2027                       S_IRUGO | S_IWUSR,
2028                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2029                       ADT7516_AIN2_HIGH);
2030static IIO_DEVICE_ATTR(ain2_low_value,
2031                       S_IRUGO | S_IWUSR,
2032                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2033                       ADT7516_AIN2_LOW);
2034static IIO_DEVICE_ATTR(ain3_high_value,
2035                       S_IRUGO | S_IWUSR,
2036                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2037                       ADT7516_AIN3_HIGH);
2038static IIO_DEVICE_ATTR(ain3_low_value,
2039                       S_IRUGO | S_IWUSR,
2040                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2041                       ADT7516_AIN3_LOW);
2042static IIO_DEVICE_ATTR(ain4_high_value,
2043                       S_IRUGO | S_IWUSR,
2044                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2045                       ADT7516_AIN4_HIGH);
2046static IIO_DEVICE_ATTR(ain4_low_value,
2047                       S_IRUGO | S_IWUSR,
2048                       adt7316_show_ad_bound, adt7316_set_ad_bound,
2049                       ADT7516_AIN4_LOW);
2050static IIO_DEVICE_ATTR(int_enabled,
2051                       S_IRUGO | S_IWUSR,
2052                       adt7316_show_int_enabled,
2053                       adt7316_set_int_enabled, 0);
2054
2055static struct attribute *adt7316_event_attributes[] = {
2056        &iio_dev_attr_int_mask.dev_attr.attr,
2057        &iio_dev_attr_in_temp_high_value.dev_attr.attr,
2058        &iio_dev_attr_in_temp_low_value.dev_attr.attr,
2059        &iio_dev_attr_ex_temp_high_value.dev_attr.attr,
2060        &iio_dev_attr_ex_temp_low_value.dev_attr.attr,
2061        &iio_dev_attr_int_enabled.dev_attr.attr,
2062        NULL,
2063};
2064
2065static struct attribute_group adt7316_event_attribute_group = {
2066        .attrs = adt7316_event_attributes,
2067        .name = "events",
2068};
2069
2070static struct attribute *adt7516_event_attributes[] = {
2071        &iio_dev_attr_int_mask.dev_attr.attr,
2072        &iio_dev_attr_in_temp_high_value.dev_attr.attr,
2073        &iio_dev_attr_in_temp_low_value.dev_attr.attr,
2074        &iio_dev_attr_ex_temp_ain1_high_value.dev_attr.attr,
2075        &iio_dev_attr_ex_temp_ain1_low_value.dev_attr.attr,
2076        &iio_dev_attr_ain2_high_value.dev_attr.attr,
2077        &iio_dev_attr_ain2_low_value.dev_attr.attr,
2078        &iio_dev_attr_ain3_high_value.dev_attr.attr,
2079        &iio_dev_attr_ain3_low_value.dev_attr.attr,
2080        &iio_dev_attr_ain4_high_value.dev_attr.attr,
2081        &iio_dev_attr_ain4_low_value.dev_attr.attr,
2082        &iio_dev_attr_int_enabled.dev_attr.attr,
2083        NULL,
2084};
2085
2086static struct attribute_group adt7516_event_attribute_group = {
2087        .attrs = adt7516_event_attributes,
2088        .name = "events",
2089};
2090
2091#ifdef CONFIG_PM
2092int adt7316_disable(struct device *dev)
2093{
2094        struct iio_dev *dev_info = dev_get_drvdata(dev);
2095        struct adt7316_chip_info *chip = iio_priv(dev_info);
2096
2097        return _adt7316_store_enabled(chip, 0);
2098}
2099EXPORT_SYMBOL(adt7316_disable);
2100
2101int adt7316_enable(struct device *dev)
2102{
2103        struct iio_dev *dev_info = dev_get_drvdata(dev);
2104        struct adt7316_chip_info *chip = iio_priv(dev_info);
2105
2106        return _adt7316_store_enabled(chip, 1);
2107}
2108EXPORT_SYMBOL(adt7316_enable);
2109#endif
2110
2111static const struct iio_info adt7316_info = {
2112        .attrs = &adt7316_attribute_group,
2113        .event_attrs = &adt7316_event_attribute_group,
2114        .driver_module = THIS_MODULE,
2115};
2116
2117static const struct iio_info adt7516_info = {
2118        .attrs = &adt7516_attribute_group,
2119        .event_attrs = &adt7516_event_attribute_group,
2120        .driver_module = THIS_MODULE,
2121};
2122
2123/*
2124 * device probe and remove
2125 */
2126int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus,
2127                const char *name)
2128{
2129        struct adt7316_chip_info *chip;
2130        struct iio_dev *indio_dev;
2131        unsigned short *adt7316_platform_data = dev->platform_data;
2132        int ret = 0;
2133
2134        indio_dev = iio_allocate_device(sizeof(*chip));
2135        if (indio_dev == NULL) {
2136                ret = -ENOMEM;
2137                goto error_ret;
2138        }
2139        chip = iio_priv(indio_dev);
2140        /* this is only used for device removal purposes */
2141        dev_set_drvdata(dev, indio_dev);
2142
2143        chip->bus = *bus;
2144
2145        if (name[4] == '3')
2146                chip->id = ID_ADT7316 + (name[6] - '6');
2147        else if (name[4] == '5')
2148                chip->id = ID_ADT7516 + (name[6] - '6');
2149        else
2150                return -ENODEV;
2151
2152        chip->ldac_pin = adt7316_platform_data[1];
2153        if (chip->ldac_pin) {
2154                chip->config3 |= ADT7316_DA_EN_VIA_DAC_LDCA;
2155                if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
2156                        chip->config1 |= ADT7516_SEL_AIN3;
2157        }
2158        chip->int_mask = ADT7316_TEMP_INT_MASK | ADT7316_VDD_INT_MASK;
2159        if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
2160                chip->int_mask |= ADT7516_AIN_INT_MASK;
2161
2162        indio_dev->dev.parent = dev;
2163        if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
2164                indio_dev->info = &adt7516_info;
2165        else
2166                indio_dev->info = &adt7316_info;
2167        indio_dev->name = name;
2168        indio_dev->modes = INDIO_DIRECT_MODE;
2169
2170        if (chip->bus.irq > 0) {
2171                if (adt7316_platform_data[0])
2172                        chip->bus.irq_flags = adt7316_platform_data[0];
2173
2174                ret = request_threaded_irq(chip->bus.irq,
2175                                           NULL,
2176                                           &adt7316_event_handler,
2177                                           chip->bus.irq_flags | IRQF_ONESHOT,
2178                                           indio_dev->name,
2179                                           indio_dev);
2180                if (ret)
2181                        goto error_free_dev;
2182
2183                if (chip->bus.irq_flags & IRQF_TRIGGER_HIGH)
2184                        chip->config1 |= ADT7316_INT_POLARITY;
2185        }
2186
2187        ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, chip->config1);
2188        if (ret) {
2189                ret = -EIO;
2190                goto error_unreg_irq;
2191        }
2192
2193        ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, chip->config3);
2194        if (ret) {
2195                ret = -EIO;
2196                goto error_unreg_irq;
2197        }
2198
2199        ret = iio_device_register(indio_dev);
2200        if (ret)
2201                goto error_unreg_irq;
2202
2203        dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n",
2204                        indio_dev->name);
2205
2206        return 0;
2207
2208error_unreg_irq:
2209        free_irq(chip->bus.irq, indio_dev);
2210error_free_dev:
2211        iio_free_device(indio_dev);
2212error_ret:
2213        return ret;
2214}
2215EXPORT_SYMBOL(adt7316_probe);
2216
2217int __devexit adt7316_remove(struct device *dev)
2218{
2219        struct iio_dev *indio_dev = dev_get_drvdata(dev);
2220        struct adt7316_chip_info *chip = iio_priv(indio_dev);
2221
2222        iio_device_unregister(indio_dev);
2223        if (chip->bus.irq)
2224                free_irq(chip->bus.irq, indio_dev);
2225        iio_free_device(indio_dev);
2226
2227        return 0;
2228}
2229EXPORT_SYMBOL(adt7316_remove);
2230
2231MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
2232MODULE_DESCRIPTION("Analog Devices ADT7316/7/8 and ADT7516/7/9 digital"
2233                        " temperature sensor, ADC and DAC driver");
2234MODULE_LICENSE("GPL v2");
2235
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.