Commit 90f79e76 authored by Jonathan Cameron's avatar Jonathan Cameron Committed by Greg Kroah-Hartman

staging:iio:adt7316 get rid of legacy event handling code.

Note this driver is still a long way from being abi compliant.
What I have done here cleans up a few corners, but primarily gets
it away from using the infrastructure that is going away.

Untested
Signed-off-by: default avatarJonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent ce298d40
......@@ -176,8 +176,6 @@
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 */
......@@ -1795,10 +1793,10 @@ static const struct attribute_group adt7516_attribute_group = {
#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)
static irqreturn_t adt7316_event_handler(int irq, void *private)
{
struct adt7316_chip_info *chip =
container_of(work_s, struct adt7316_chip_info, thresh_work);
struct iio_dev *indio_dev = private;
struct adt7316_chip_info *chip = iio_dev_get_devdata(indio_dev);
u8 stat1, stat2;
int i, ret, count;
......@@ -1813,7 +1811,7 @@ static void adt7316_interrupt_bh(struct work_struct *work_s)
if (stat1 & (1 << i))
iio_push_event(chip->indio_dev, 0,
IIO_EVENT_CODE_ADT7316_IN_TEMP_HIGH + i,
chip->last_timestamp);
iio_get_time_ns());
}
}
......@@ -1822,27 +1820,12 @@ static void adt7316_interrupt_bh(struct work_struct *work_s)
if (stat2 & ADT7316_INT_MASK2_VDD)
iio_push_event(chip->indio_dev, 0,
IIO_EVENT_CODE_ADT7316_VDD,
chip->last_timestamp);
iio_get_time_ns());
}
enable_irq(chip->bus.irq);
return IRQ_HANDLED;
}
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;
}
IIO_EVENT_SH(adt7316, &adt7316_interrupt);
/*
* Show mask of enabled interrupts in Hex.
*/
......@@ -1901,9 +1884,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 +1894,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 +1914,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 +1925,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 +1946,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 +1986,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 +2060,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,
};
......@@ -2326,24 +2164,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->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;
}
......@@ -2366,7 +2195,7 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus,
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 +2212,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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment