diff options
Diffstat (limited to 'drivers/staging/iio/addac/adt7316.c')
-rw-r--r-- | drivers/staging/iio/addac/adt7316.c | 502 |
1 files changed, 173 insertions, 329 deletions
diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c index d1b5b13629d..7097deb0f30 100644 --- a/drivers/staging/iio/addac/adt7316.c +++ b/drivers/staging/iio/addac/adt7316.c @@ -174,10 +174,7 @@ */ struct adt7316_chip_info { - const char *name; struct iio_dev *indio_dev; - struct work_struct thresh_work; - s64 last_timestamp; struct adt7316_bus bus; u16 ldac_pin; u16 int_mask; /* 0x2f */ @@ -403,7 +400,7 @@ static ssize_t adt7316_show_ad_channel(struct device *dev, return sprintf(buf, "5 - AIN4\n"); default: return sprintf(buf, "N/A\n"); - }; + } } static ssize_t adt7316_store_ad_channel(struct device *dev, @@ -465,7 +462,7 @@ static ssize_t adt7316_show_all_ad_channels(struct device *dev, if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) return sprintf(buf, "0 - VDD\n1 - Internal Temperature\n" - "2 - External Temperature or AIN2\n" + "2 - External Temperature or AIN1\n" "3 - AIN2\n4 - AIN3\n5 - AIN4\n"); else return sprintf(buf, "0 - VDD\n1 - Internal Temperature\n" @@ -893,7 +890,7 @@ static ssize_t adt7316_show_DAC_update_mode(struct device *dev, return sprintf(buf, "2 - auto at MSB DAC ABCD writing\n"); default: /* ADT7316_DA_EN_MODE_LDAC */ return sprintf(buf, "3 - manual\n"); - }; + } } } @@ -1205,7 +1202,7 @@ static ssize_t adt7316_show_ad(struct adt7316_chip_info *chip, return sprintf(buf, "%d\n", data); else break; - }; + } if (data & ADT7316_T_VALUE_SIGN) { /* convert supplement to positive value */ @@ -1674,18 +1671,6 @@ static ssize_t adt7316_show_bus_type(struct device *dev, static IIO_DEVICE_ATTR(bus_type, S_IRUGO, adt7316_show_bus_type, NULL, 0); -static ssize_t adt7316_show_name(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; - - return sprintf(buf, "%s\n", chip->name); -} - -static IIO_DEVICE_ATTR(name, S_IRUGO, adt7316_show_name, NULL, 0); - static struct attribute *adt7316_attributes[] = { &iio_dev_attr_all_modes.dev_attr.attr, &iio_dev_attr_mode.dev_attr.attr, @@ -1722,7 +1707,6 @@ static struct attribute *adt7316_attributes[] = { &iio_dev_attr_manufactorer_id.dev_attr.attr, &iio_dev_attr_device_rev.dev_attr.attr, &iio_dev_attr_bus_type.dev_attr.attr, - &iio_dev_attr_name.dev_attr.attr, NULL, }; @@ -1771,7 +1755,6 @@ static struct attribute *adt7516_attributes[] = { &iio_dev_attr_manufactorer_id.dev_attr.attr, &iio_dev_attr_device_rev.dev_attr.attr, &iio_dev_attr_bus_type.dev_attr.attr, - &iio_dev_attr_name.dev_attr.attr, NULL, }; @@ -1779,70 +1762,77 @@ static const struct attribute_group adt7516_attribute_group = { .attrs = adt7516_attributes, }; - -/* - * temperature bound events - */ - -#define IIO_EVENT_CODE_ADT7316_IN_TEMP_HIGH IIO_BUFFER_EVENT_CODE(0) -#define IIO_EVENT_CODE_ADT7316_IN_TEMP_LOW IIO_BUFFER_EVENT_CODE(1) -#define IIO_EVENT_CODE_ADT7316_EX_TEMP_HIGH IIO_BUFFER_EVENT_CODE(2) -#define IIO_EVENT_CODE_ADT7316_EX_TEMP_LOW IIO_BUFFER_EVENT_CODE(3) -#define IIO_EVENT_CODE_ADT7316_EX_TEMP_FAULT IIO_BUFFER_EVENT_CODE(4) -#define IIO_EVENT_CODE_ADT7516_AIN1 IIO_BUFFER_EVENT_CODE(5) -#define IIO_EVENT_CODE_ADT7516_AIN2 IIO_BUFFER_EVENT_CODE(6) -#define IIO_EVENT_CODE_ADT7516_AIN3 IIO_BUFFER_EVENT_CODE(7) -#define IIO_EVENT_CODE_ADT7516_AIN4 IIO_BUFFER_EVENT_CODE(8) -#define IIO_EVENT_CODE_ADT7316_VDD IIO_BUFFER_EVENT_CODE(9) - -static void adt7316_interrupt_bh(struct work_struct *work_s) -{ - struct adt7316_chip_info *chip = - container_of(work_s, struct adt7316_chip_info, thresh_work); +static irqreturn_t adt7316_event_handler(int irq, void *private) +{ + struct iio_dev *indio_dev = private; + struct adt7316_chip_info *chip = iio_dev_get_devdata(indio_dev); u8 stat1, stat2; - int i, ret, count; + int ret; + s64 time; ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT1, &stat1); if (!ret) { - if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) - count = 8; - else - count = 5; + if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX) + stat1 &= 0x1F; - for (i = 0; i < count; i++) { - if (stat1 & (1 << i)) - iio_push_event(chip->indio_dev, 0, - IIO_EVENT_CODE_ADT7316_IN_TEMP_HIGH + i, - chip->last_timestamp); + time = iio_get_time_ns(); + if (stat1 & (1 << 0)) + iio_push_event(chip->indio_dev, 0, + IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0, + IIO_EV_TYPE_THRESH, + IIO_EV_DIR_RISING), + time); + if (stat1 & (1 << 1)) + iio_push_event(chip->indio_dev, 0, + IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0, + IIO_EV_TYPE_THRESH, + IIO_EV_DIR_FALLING), + time); + if (stat1 & (1 << 2)) + iio_push_event(chip->indio_dev, 0, + IIO_UNMOD_EVENT_CODE(IIO_TEMP, 1, + IIO_EV_TYPE_THRESH, + IIO_EV_DIR_RISING), + time); + if (stat1 & (1 << 3)) + iio_push_event(chip->indio_dev, 0, + IIO_UNMOD_EVENT_CODE(IIO_TEMP, 1, + IIO_EV_TYPE_THRESH, + IIO_EV_DIR_FALLING), + time); + if (stat1 & (1 << 5)) + iio_push_event(chip->indio_dev, 0, + IIO_UNMOD_EVENT_CODE(IIO_IN, 1, + IIO_EV_TYPE_THRESH, + IIO_EV_DIR_EITHER), + time); + if (stat1 & (1 << 6)) + iio_push_event(chip->indio_dev, 0, + IIO_UNMOD_EVENT_CODE(IIO_IN, 2, + IIO_EV_TYPE_THRESH, + IIO_EV_DIR_EITHER), + time); + if (stat1 & (1 << 7)) + iio_push_event(chip->indio_dev, 0, + IIO_UNMOD_EVENT_CODE(IIO_IN, 3, + IIO_EV_TYPE_THRESH, + IIO_EV_DIR_EITHER), + time); } - } - ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT2, &stat2); if (!ret) { if (stat2 & ADT7316_INT_MASK2_VDD) iio_push_event(chip->indio_dev, 0, - IIO_EVENT_CODE_ADT7316_VDD, - chip->last_timestamp); + IIO_UNMOD_EVENT_CODE(IIO_IN, + 0, + IIO_EV_TYPE_THRESH, + IIO_EV_DIR_RISING), + iio_get_time_ns()); } - enable_irq(chip->bus.irq); -} - -static int adt7316_interrupt(struct iio_dev *dev_info, - int index, - s64 timestamp, - int no_test) -{ - struct adt7316_chip_info *chip = dev_info->dev_data; - - chip->last_timestamp = timestamp; - schedule_work(&chip->thresh_work); - - return 0; + return IRQ_HANDLED; } -IIO_EVENT_SH(adt7316, &adt7316_interrupt); - /* * Show mask of enabled interrupts in Hex. */ @@ -1901,9 +1891,9 @@ static ssize_t adt7316_set_int_mask(struct device *dev, } static inline ssize_t adt7316_show_ad_bound(struct device *dev, struct device_attribute *attr, - u8 bound_reg, char *buf) { + struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *dev_info = dev_get_drvdata(dev); struct adt7316_chip_info *chip = dev_info->dev_data; u8 val; @@ -1911,10 +1901,10 @@ static inline ssize_t adt7316_show_ad_bound(struct device *dev, int ret; if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX && - bound_reg > ADT7316_EX_TEMP_LOW) + this_attr->address > ADT7316_EX_TEMP_LOW) return -EPERM; - ret = chip->bus.read(chip->bus.client, bound_reg, &val); + ret = chip->bus.read(chip->bus.client, this_attr->address, &val); if (ret) return -EIO; @@ -1931,10 +1921,10 @@ static inline ssize_t adt7316_show_ad_bound(struct device *dev, static inline ssize_t adt7316_set_ad_bound(struct device *dev, struct device_attribute *attr, - u8 bound_reg, const char *buf, size_t len) { + struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *dev_info = dev_get_drvdata(dev); struct adt7316_chip_info *chip = dev_info->dev_data; long data; @@ -1942,7 +1932,7 @@ static inline ssize_t adt7316_set_ad_bound(struct device *dev, int ret; if ((chip->id & ID_FAMILY_MASK) == ID_ADT73XX && - bound_reg > ADT7316_EX_TEMP_LOW) + this_attr->address > ADT7316_EX_TEMP_LOW) return -EPERM; ret = strict_strtol(buf, 10, &data); @@ -1963,183 +1953,13 @@ static inline ssize_t adt7316_set_ad_bound(struct device *dev, val = (u8)data; - ret = chip->bus.write(chip->bus.client, bound_reg, val); + ret = chip->bus.write(chip->bus.client, this_attr->address, val); if (ret) return -EIO; return len; } -static ssize_t adt7316_show_in_temp_high(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return adt7316_show_ad_bound(dev, attr, - ADT7316_IN_TEMP_HIGH, buf); -} - -static inline ssize_t adt7316_set_in_temp_high(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - return adt7316_set_ad_bound(dev, attr, - ADT7316_IN_TEMP_HIGH, buf, len); -} - -static ssize_t adt7316_show_in_temp_low(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return adt7316_show_ad_bound(dev, attr, - ADT7316_IN_TEMP_LOW, buf); -} - -static inline ssize_t adt7316_set_in_temp_low(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - return adt7316_set_ad_bound(dev, attr, - ADT7316_IN_TEMP_LOW, buf, len); -} - -static ssize_t adt7316_show_ex_temp_ain1_high(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return adt7316_show_ad_bound(dev, attr, - ADT7316_EX_TEMP_HIGH, buf); -} - -static inline ssize_t adt7316_set_ex_temp_ain1_high(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - return adt7316_set_ad_bound(dev, attr, - ADT7316_EX_TEMP_HIGH, buf, len); -} - -static ssize_t adt7316_show_ex_temp_ain1_low(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return adt7316_show_ad_bound(dev, attr, - ADT7316_EX_TEMP_LOW, buf); -} - -static inline ssize_t adt7316_set_ex_temp_ain1_low(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - return adt7316_set_ad_bound(dev, attr, - ADT7316_EX_TEMP_LOW, buf, len); -} - -static ssize_t adt7316_show_ain2_high(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return adt7316_show_ad_bound(dev, attr, - ADT7516_AIN2_HIGH, buf); -} - -static inline ssize_t adt7316_set_ain2_high(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - return adt7316_set_ad_bound(dev, attr, - ADT7516_AIN2_HIGH, buf, len); -} - -static ssize_t adt7316_show_ain2_low(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return adt7316_show_ad_bound(dev, attr, - ADT7516_AIN2_LOW, buf); -} - -static inline ssize_t adt7316_set_ain2_low(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - return adt7316_set_ad_bound(dev, attr, - ADT7516_AIN2_LOW, buf, len); -} - -static ssize_t adt7316_show_ain3_high(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return adt7316_show_ad_bound(dev, attr, - ADT7516_AIN3_HIGH, buf); -} - -static inline ssize_t adt7316_set_ain3_high(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - return adt7316_set_ad_bound(dev, attr, - ADT7516_AIN3_HIGH, buf, len); -} - -static ssize_t adt7316_show_ain3_low(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return adt7316_show_ad_bound(dev, attr, - ADT7516_AIN3_LOW, buf); -} - -static inline ssize_t adt7316_set_ain3_low(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - return adt7316_set_ad_bound(dev, attr, - ADT7516_AIN3_LOW, buf, len); -} - -static ssize_t adt7316_show_ain4_high(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return adt7316_show_ad_bound(dev, attr, - ADT7516_AIN4_HIGH, buf); -} - -static inline ssize_t adt7316_set_ain4_high(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - return adt7316_set_ad_bound(dev, attr, - ADT7516_AIN4_HIGH, buf, len); -} - -static ssize_t adt7316_show_ain4_low(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - return adt7316_show_ad_bound(dev, attr, - ADT7516_AIN4_LOW, buf); -} - -static inline ssize_t adt7316_set_ain4_low(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - return adt7316_set_ad_bound(dev, attr, - ADT7516_AIN4_LOW, buf, len); -} - static ssize_t adt7316_show_int_enabled(struct device *dev, struct device_attribute *attr, char *buf) @@ -2173,47 +1993,72 @@ static ssize_t adt7316_set_int_enabled(struct device *dev, return len; } - -IIO_EVENT_ATTR_SH(int_mask, iio_event_adt7316, - adt7316_show_int_mask, adt7316_set_int_mask, 0); -IIO_EVENT_ATTR_SH(in_temp_high, iio_event_adt7316, - adt7316_show_in_temp_high, adt7316_set_in_temp_high, 0); -IIO_EVENT_ATTR_SH(in_temp_low, iio_event_adt7316, - adt7316_show_in_temp_low, adt7316_set_in_temp_low, 0); -IIO_EVENT_ATTR_SH(ex_temp_high, iio_event_adt7316, - adt7316_show_ex_temp_ain1_high, - adt7316_set_ex_temp_ain1_high, 0); -IIO_EVENT_ATTR_SH(ex_temp_low, iio_event_adt7316, - adt7316_show_ex_temp_ain1_low, - adt7316_set_ex_temp_ain1_low, 0); -IIO_EVENT_ATTR_SH(ex_temp_ain1_high, iio_event_adt7316, - adt7316_show_ex_temp_ain1_high, - adt7316_set_ex_temp_ain1_high, 0); -IIO_EVENT_ATTR_SH(ex_temp_ain1_low, iio_event_adt7316, - adt7316_show_ex_temp_ain1_low, - adt7316_set_ex_temp_ain1_low, 0); -IIO_EVENT_ATTR_SH(ain2_high, iio_event_adt7316, - adt7316_show_ain2_high, adt7316_set_ain2_high, 0); -IIO_EVENT_ATTR_SH(ain2_low, iio_event_adt7316, - adt7316_show_ain2_low, adt7316_set_ain2_low, 0); -IIO_EVENT_ATTR_SH(ain3_high, iio_event_adt7316, - adt7316_show_ain3_high, adt7316_set_ain3_high, 0); -IIO_EVENT_ATTR_SH(ain3_low, iio_event_adt7316, - adt7316_show_ain3_low, adt7316_set_ain3_low, 0); -IIO_EVENT_ATTR_SH(ain4_high, iio_event_adt7316, - adt7316_show_ain4_high, adt7316_set_ain4_high, 0); -IIO_EVENT_ATTR_SH(ain4_low, iio_event_adt7316, - adt7316_show_ain4_low, adt7316_set_ain4_low, 0); -IIO_EVENT_ATTR_SH(int_enabled, iio_event_adt7316, - adt7316_show_int_enabled, adt7316_set_int_enabled, 0); +static IIO_DEVICE_ATTR(int_mask, + S_IRUGO | S_IWUSR, + adt7316_show_int_mask, adt7316_set_int_mask, + 0); +static IIO_DEVICE_ATTR(in_temp_high_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7316_IN_TEMP_HIGH); +static IIO_DEVICE_ATTR(in_temp_low_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7316_IN_TEMP_LOW); +static IIO_DEVICE_ATTR(ex_temp_high_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7316_EX_TEMP_HIGH); +static IIO_DEVICE_ATTR(ex_temp_low_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7316_EX_TEMP_LOW); + +/* NASTY duplication to be fixed */ +static IIO_DEVICE_ATTR(ex_temp_ain1_high_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7316_EX_TEMP_HIGH); +static IIO_DEVICE_ATTR(ex_temp_ain1_low_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7316_EX_TEMP_LOW); +static IIO_DEVICE_ATTR(ain2_high_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7516_AIN2_HIGH); +static IIO_DEVICE_ATTR(ain2_low_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7516_AIN2_LOW); +static IIO_DEVICE_ATTR(ain3_high_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7516_AIN3_HIGH); +static IIO_DEVICE_ATTR(ain3_low_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7516_AIN3_LOW); +static IIO_DEVICE_ATTR(ain4_high_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7516_AIN4_HIGH); +static IIO_DEVICE_ATTR(ain4_low_value, + S_IRUGO | S_IWUSR, + adt7316_show_ad_bound, adt7316_set_ad_bound, + ADT7516_AIN4_LOW); +static IIO_DEVICE_ATTR(int_enabled, + S_IRUGO | S_IWUSR, + adt7316_show_int_enabled, + adt7316_set_int_enabled, 0); static struct attribute *adt7316_event_attributes[] = { - &iio_event_attr_int_mask.dev_attr.attr, - &iio_event_attr_in_temp_high.dev_attr.attr, - &iio_event_attr_in_temp_low.dev_attr.attr, - &iio_event_attr_ex_temp_high.dev_attr.attr, - &iio_event_attr_ex_temp_low.dev_attr.attr, - &iio_event_attr_int_enabled.dev_attr.attr, + &iio_dev_attr_int_mask.dev_attr.attr, + &iio_dev_attr_in_temp_high_value.dev_attr.attr, + &iio_dev_attr_in_temp_low_value.dev_attr.attr, + &iio_dev_attr_ex_temp_high_value.dev_attr.attr, + &iio_dev_attr_ex_temp_low_value.dev_attr.attr, + &iio_dev_attr_int_enabled.dev_attr.attr, NULL, }; @@ -2222,18 +2067,18 @@ static struct attribute_group adt7316_event_attribute_group = { }; static struct attribute *adt7516_event_attributes[] = { - &iio_event_attr_int_mask.dev_attr.attr, - &iio_event_attr_in_temp_high.dev_attr.attr, - &iio_event_attr_in_temp_low.dev_attr.attr, - &iio_event_attr_ex_temp_ain1_high.dev_attr.attr, - &iio_event_attr_ex_temp_ain1_low.dev_attr.attr, - &iio_event_attr_ain2_high.dev_attr.attr, - &iio_event_attr_ain2_low.dev_attr.attr, - &iio_event_attr_ain3_high.dev_attr.attr, - &iio_event_attr_ain3_low.dev_attr.attr, - &iio_event_attr_ain4_high.dev_attr.attr, - &iio_event_attr_ain4_low.dev_attr.attr, - &iio_event_attr_int_enabled.dev_attr.attr, + &iio_dev_attr_int_mask.dev_attr.attr, + &iio_dev_attr_in_temp_high_value.dev_attr.attr, + &iio_dev_attr_in_temp_low_value.dev_attr.attr, + &iio_dev_attr_ex_temp_ain1_high_value.dev_attr.attr, + &iio_dev_attr_ex_temp_ain1_low_value.dev_attr.attr, + &iio_dev_attr_ain2_high_value.dev_attr.attr, + &iio_dev_attr_ain2_low_value.dev_attr.attr, + &iio_dev_attr_ain3_high_value.dev_attr.attr, + &iio_dev_attr_ain3_low_value.dev_attr.attr, + &iio_dev_attr_ain4_high_value.dev_attr.attr, + &iio_dev_attr_ain4_low_value.dev_attr.attr, + &iio_dev_attr_int_enabled.dev_attr.attr, NULL, }; @@ -2261,6 +2106,20 @@ int adt7316_enable(struct device *dev) EXPORT_SYMBOL(adt7316_enable); #endif +static const struct iio_info adt7316_info = { + .attrs = &adt7316_attribute_group, + .num_interrupt_lines = 1, + .event_attrs = &adt7316_event_attribute_group, + .driver_module = THIS_MODULE, +}; + +static const struct iio_info adt7516_info = { + .attrs = &adt7516_attribute_group, + .num_interrupt_lines = 1, + .event_attrs = &adt7516_event_attribute_group, + .driver_module = THIS_MODULE, +}; + /* * device probe and remove */ @@ -2280,7 +2139,6 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, dev_set_drvdata(dev, chip); chip->bus = *bus; - chip->name = name; if (name[4] == '3') chip->id = ID_ADT7316 + (name[6] - '6'); @@ -2299,23 +2157,19 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) chip->int_mask |= ADT7516_AIN_INT_MASK; - chip->indio_dev = iio_allocate_device(); + chip->indio_dev = iio_allocate_device(0); if (chip->indio_dev == NULL) { ret = -ENOMEM; goto error_free_chip; } chip->indio_dev->dev.parent = dev; - if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) { - chip->indio_dev->attrs = &adt7516_attribute_group; - chip->indio_dev->event_attrs = &adt7516_event_attribute_group; - } else { - chip->indio_dev->attrs = &adt7316_attribute_group; - chip->indio_dev->event_attrs = &adt7316_event_attribute_group; - } + if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) + chip->indio_dev->info = &adt7516_info; + else + chip->indio_dev->info = &adt7316_info; + chip->indio_dev->name = name; chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->driver_module = THIS_MODULE; - chip->indio_dev->num_interrupt_lines = 1; chip->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->indio_dev); @@ -2326,24 +2180,15 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, if (adt7316_platform_data[0]) chip->bus.irq_flags = adt7316_platform_data[0]; - ret = iio_register_interrupt_line(chip->bus.irq, - chip->indio_dev, - 0, - chip->bus.irq_flags, - chip->name); + ret = request_threaded_irq(chip->bus.irq, + NULL, + &adt7316_event_handler, + chip->bus.irq_flags | IRQF_ONESHOT, + chip->indio_dev->name, + chip->indio_dev); if (ret) goto error_unreg_dev; - /* - * The event handler list element refer to iio_event_adt7316. - * All event attributes bind to the same event handler. - * So, only register event handler once. - */ - iio_add_event_to_list(&iio_event_adt7316, - &chip->indio_dev->interrupts[0]->ev_list); - - INIT_WORK(&chip->thresh_work, adt7316_interrupt_bh); - if (chip->bus.irq_flags & IRQF_TRIGGER_HIGH) chip->config1 |= ADT7316_INT_POLARITY; } @@ -2361,12 +2206,12 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, } dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n", - chip->name); + chip->indio_dev->name); return 0; error_unreg_irq: - iio_unregister_interrupt_line(chip->indio_dev, 0); + free_irq(chip->bus.irq, chip->indio_dev); error_unreg_dev: iio_device_unregister(chip->indio_dev); error_free_dev: @@ -2383,12 +2228,11 @@ int __devexit adt7316_remove(struct device *dev) struct iio_dev *dev_info = dev_get_drvdata(dev); struct adt7316_chip_info *chip = dev_info->dev_data; - struct iio_dev *indio_dev = chip->indio_dev; dev_set_drvdata(dev, NULL); if (chip->bus.irq) - iio_unregister_interrupt_line(indio_dev, 0); - iio_device_unregister(indio_dev); + free_irq(chip->bus.irq, chip->indio_dev); + iio_device_unregister(chip->indio_dev); iio_free_device(chip->indio_dev); kfree(chip); |