381
375
static IIO_DEVICE_ATTR(value, S_IRUGO, adt7310_show_value, NULL, 0);
383
static ssize_t adt7310_show_name(struct device *dev,
384
struct device_attribute *attr,
387
struct iio_dev *dev_info = dev_get_drvdata(dev);
388
struct adt7310_chip_info *chip = dev_info->dev_data;
389
return sprintf(buf, "%s\n", chip->name);
392
static IIO_DEVICE_ATTR(name, S_IRUGO, adt7310_show_name, NULL, 0);
394
377
static struct attribute *adt7310_attributes[] = {
395
378
&iio_dev_attr_available_modes.dev_attr.attr,
396
379
&iio_dev_attr_mode.dev_attr.attr,
397
380
&iio_dev_attr_resolution.dev_attr.attr,
398
381
&iio_dev_attr_id.dev_attr.attr,
399
382
&iio_dev_attr_value.dev_attr.attr,
400
&iio_dev_attr_name.dev_attr.attr,
405
387
.attrs = adt7310_attributes,
409
* temperature bound events
412
#define IIO_EVENT_CODE_ADT7310_ABOVE_ALARM IIO_BUFFER_EVENT_CODE(0)
413
#define IIO_EVENT_CODE_ADT7310_BELLOW_ALARM IIO_BUFFER_EVENT_CODE(1)
414
#define IIO_EVENT_CODE_ADT7310_ABOVE_CRIT IIO_BUFFER_EVENT_CODE(2)
416
static void adt7310_interrupt_bh(struct work_struct *work_s)
390
static irqreturn_t adt7310_event_handler(int irq, void *private)
418
struct adt7310_chip_info *chip =
419
container_of(work_s, struct adt7310_chip_info, thresh_work);
392
struct iio_dev *indio_dev = private;
393
struct adt7310_chip_info *chip = iio_dev_get_devdata(indio_dev);
394
s64 timestamp = iio_get_time_ns();
422
if (adt7310_spi_read_byte(chip, ADT7310_STATUS, &status))
398
ret = adt7310_spi_read_byte(chip, ADT7310_STATUS, &status);
425
402
if (status & ADT7310_STAT_T_HIGH)
426
iio_push_event(chip->indio_dev, 0,
427
IIO_EVENT_CODE_ADT7310_ABOVE_ALARM,
428
chip->last_timestamp);
403
iio_push_event(indio_dev, 0,
404
IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
429
408
if (status & ADT7310_STAT_T_LOW)
430
iio_push_event(chip->indio_dev, 0,
431
IIO_EVENT_CODE_ADT7310_BELLOW_ALARM,
432
chip->last_timestamp);
409
iio_push_event(indio_dev, 0,
410
IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
433
414
if (status & ADT7310_STAT_T_CRIT)
434
iio_push_event(chip->indio_dev, 0,
435
IIO_EVENT_CODE_ADT7310_ABOVE_CRIT,
436
chip->last_timestamp);
439
static int adt7310_interrupt(struct iio_dev *dev_info,
444
struct adt7310_chip_info *chip = dev_info->dev_data;
446
chip->last_timestamp = timestamp;
447
schedule_work(&chip->thresh_work);
452
IIO_EVENT_SH(adt7310, &adt7310_interrupt);
453
IIO_EVENT_SH(adt7310_ct, &adt7310_interrupt);
415
iio_push_event(indio_dev, 0,
416
IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0,
455
423
static ssize_t adt7310_show_event_mode(struct device *dev,
456
424
struct device_attribute *attr,
732
IIO_EVENT_ATTR_SH(event_mode, iio_event_adt7310,
733
adt7310_show_event_mode, adt7310_set_event_mode, 0);
734
IIO_EVENT_ATTR_SH(available_event_modes, iio_event_adt7310,
735
adt7310_show_available_event_modes, NULL, 0);
736
IIO_EVENT_ATTR_SH(fault_queue, iio_event_adt7310,
737
adt7310_show_fault_queue, adt7310_set_fault_queue, 0);
738
IIO_EVENT_ATTR_SH(t_alarm_high, iio_event_adt7310,
739
adt7310_show_t_alarm_high, adt7310_set_t_alarm_high, 0);
740
IIO_EVENT_ATTR_SH(t_alarm_low, iio_event_adt7310,
741
adt7310_show_t_alarm_low, adt7310_set_t_alarm_low, 0);
742
IIO_EVENT_ATTR_SH(t_crit, iio_event_adt7310_ct,
743
adt7310_show_t_crit, adt7310_set_t_crit, 0);
744
IIO_EVENT_ATTR_SH(t_hyst, iio_event_adt7310,
745
adt7310_show_t_hyst, adt7310_set_t_hyst, 0);
700
static IIO_DEVICE_ATTR(event_mode,
702
adt7310_show_event_mode, adt7310_set_event_mode, 0);
703
static IIO_DEVICE_ATTR(available_event_modes,
705
adt7310_show_available_event_modes, NULL, 0);
706
static IIO_DEVICE_ATTR(fault_queue,
708
adt7310_show_fault_queue, adt7310_set_fault_queue, 0);
709
static IIO_DEVICE_ATTR(t_alarm_high,
711
adt7310_show_t_alarm_high, adt7310_set_t_alarm_high, 0);
712
static IIO_DEVICE_ATTR(t_alarm_low,
714
adt7310_show_t_alarm_low, adt7310_set_t_alarm_low, 0);
715
static IIO_DEVICE_ATTR(t_crit,
717
adt7310_show_t_crit, adt7310_set_t_crit, 0);
718
static IIO_DEVICE_ATTR(t_hyst,
720
adt7310_show_t_hyst, adt7310_set_t_hyst, 0);
747
722
static struct attribute *adt7310_event_int_attributes[] = {
748
&iio_event_attr_event_mode.dev_attr.attr,
749
&iio_event_attr_available_event_modes.dev_attr.attr,
750
&iio_event_attr_fault_queue.dev_attr.attr,
751
&iio_event_attr_t_alarm_high.dev_attr.attr,
752
&iio_event_attr_t_alarm_low.dev_attr.attr,
753
&iio_event_attr_t_hyst.dev_attr.attr,
723
&iio_dev_attr_event_mode.dev_attr.attr,
724
&iio_dev_attr_available_event_modes.dev_attr.attr,
725
&iio_dev_attr_fault_queue.dev_attr.attr,
726
&iio_dev_attr_t_alarm_high.dev_attr.attr,
727
&iio_dev_attr_t_alarm_low.dev_attr.attr,
728
&iio_dev_attr_t_hyst.dev_attr.attr,
757
732
static struct attribute *adt7310_event_ct_attributes[] = {
758
&iio_event_attr_event_mode.dev_attr.attr,
759
&iio_event_attr_available_event_modes.dev_attr.attr,
760
&iio_event_attr_fault_queue.dev_attr.attr,
761
&iio_event_attr_t_crit.dev_attr.attr,
762
&iio_event_attr_t_hyst.dev_attr.attr,
733
&iio_dev_attr_event_mode.dev_attr.attr,
734
&iio_dev_attr_available_event_modes.dev_attr.attr,
735
&iio_dev_attr_fault_queue.dev_attr.attr,
736
&iio_dev_attr_t_crit.dev_attr.attr,
737
&iio_dev_attr_t_hyst.dev_attr.attr,
766
741
static struct attribute_group adt7310_event_attribute_group[ADT7310_IRQS] = {
768
743
.attrs = adt7310_event_int_attributes,
771
745
.attrs = adt7310_event_ct_attributes,
749
static const struct iio_info adt7310_info = {
750
.attrs = &adt7310_attribute_group,
751
.num_interrupt_lines = ADT7310_IRQS,
752
.event_attrs = adt7310_event_attribute_group,
753
.driver_module = THIS_MODULE,
776
757
* device probe and remove
792
773
dev_set_drvdata(&spi_dev->dev, chip);
794
775
chip->spi_dev = spi_dev;
795
chip->name = spi_dev->modalias;
797
chip->indio_dev = iio_allocate_device();
777
chip->indio_dev = iio_allocate_device(0);
798
778
if (chip->indio_dev == NULL) {
800
780
goto error_free_chip;
803
783
chip->indio_dev->dev.parent = &spi_dev->dev;
804
chip->indio_dev->attrs = &adt7310_attribute_group;
805
chip->indio_dev->event_attrs = adt7310_event_attribute_group;
784
chip->indio_dev->name = spi_get_device_id(spi_dev)->name;
785
chip->indio_dev->info = &adt7310_info;
806
786
chip->indio_dev->dev_data = (void *)chip;
807
chip->indio_dev->driver_module = THIS_MODULE;
808
chip->indio_dev->num_interrupt_lines = ADT7310_IRQS;
809
787
chip->indio_dev->modes = INDIO_DIRECT_MODE;
811
789
ret = iio_device_register(chip->indio_dev);
818
796
irq_flags = adt7310_platform_data[2];
820
798
irq_flags = IRQF_TRIGGER_LOW;
821
ret = iio_register_interrupt_line(spi_dev->irq,
799
ret = request_threaded_irq(spi_dev->irq,
801
&adt7310_event_handler,
803
chip->indio_dev->name,
827
806
goto error_unreg_dev;
830
* The event handler list element refer to iio_event_adt7310.
831
* All event attributes bind to the same event handler.
832
* One event handler can only be added to one event list.
834
iio_add_event_to_list(&iio_event_adt7310,
835
&chip->indio_dev->interrupts[0]->ev_list);
838
809
/* INT bound temperature alarm event. line 1 */
839
810
if (adt7310_platform_data[0]) {
840
ret = iio_register_interrupt_line(adt7310_platform_data[0],
843
adt7310_platform_data[1],
811
ret = request_threaded_irq(adt7310_platform_data[0],
813
&adt7310_event_handler,
814
adt7310_platform_data[1],
815
chip->indio_dev->name,
846
818
goto error_unreg_ct_irq;
849
* The event handler list element refer to iio_event_adt7310.
850
* All event attributes bind to the same event handler.
851
* One event handler can only be added to one event list.
853
iio_add_event_to_list(&iio_event_adt7310_ct,
854
&chip->indio_dev->interrupts[1]->ev_list);
857
821
if (spi_dev->irq && adt7310_platform_data[0]) {
858
INIT_WORK(&chip->thresh_work, adt7310_interrupt_bh);
860
822
ret = adt7310_spi_read_byte(chip, ADT7310_CONFIG, &chip->config);