Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: core: move event interface on the opaque struct

Same as with other private fields, this moves the event interface reference
to the opaque IIO device object, to be invisible to drivers.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Alexandru Ardelean and committed by
Jonathan Cameron
fa83c3ba 6a8c6b26

+45 -33
+3 -2
drivers/iio/industrialio-core.c
··· 211 211 int iio_device_set_clock(struct iio_dev *indio_dev, clockid_t clock_id) 212 212 { 213 213 int ret; 214 - const struct iio_event_interface *ev_int = indio_dev->event_interface; 214 + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); 215 + const struct iio_event_interface *ev_int = iio_dev_opaque->event_interface; 215 216 216 217 ret = mutex_lock_interruptible(&indio_dev->mlock); 217 218 if (ret) ··· 1443 1442 attrcount += ret; 1444 1443 } 1445 1444 1446 - if (indio_dev->event_interface) 1445 + if (iio_dev_opaque->event_interface) 1447 1446 clk = &dev_attr_current_timestamp_clock.attr; 1448 1447 1449 1448 if (indio_dev->name)
+40 -28
drivers/iio/industrialio-event.c
··· 18 18 #include <linux/uaccess.h> 19 19 #include <linux/wait.h> 20 20 #include <linux/iio/iio.h> 21 + #include <linux/iio/iio-opaque.h> 21 22 #include "iio_core.h" 22 23 #include <linux/iio/sysfs.h> 23 24 #include <linux/iio/events.h> ··· 63 62 **/ 64 63 int iio_push_event(struct iio_dev *indio_dev, u64 ev_code, s64 timestamp) 65 64 { 66 - struct iio_event_interface *ev_int = indio_dev->event_interface; 65 + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); 66 + struct iio_event_interface *ev_int = iio_dev_opaque->event_interface; 67 67 struct iio_event_data ev; 68 68 int copied; 69 69 ··· 98 96 struct poll_table_struct *wait) 99 97 { 100 98 struct iio_dev *indio_dev = filep->private_data; 101 - struct iio_event_interface *ev_int = indio_dev->event_interface; 99 + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); 100 + struct iio_event_interface *ev_int = iio_dev_opaque->event_interface; 102 101 __poll_t events = 0; 103 102 104 103 if (!indio_dev->info) ··· 119 116 loff_t *f_ps) 120 117 { 121 118 struct iio_dev *indio_dev = filep->private_data; 122 - struct iio_event_interface *ev_int = indio_dev->event_interface; 119 + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); 120 + struct iio_event_interface *ev_int = iio_dev_opaque->event_interface; 123 121 unsigned int copied; 124 122 int ret; 125 123 ··· 169 165 static int iio_event_chrdev_release(struct inode *inode, struct file *filep) 170 166 { 171 167 struct iio_dev *indio_dev = filep->private_data; 172 - struct iio_event_interface *ev_int = indio_dev->event_interface; 168 + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); 169 + struct iio_event_interface *ev_int = iio_dev_opaque->event_interface; 173 170 174 171 clear_bit(IIO_BUSY_BIT_POS, &ev_int->flags); 175 172 ··· 189 184 190 185 int iio_event_getfd(struct iio_dev *indio_dev) 191 186 { 192 - struct iio_event_interface *ev_int = indio_dev->event_interface; 187 + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); 188 + struct iio_event_interface *ev_int = iio_dev_opaque->event_interface; 193 189 int fd; 194 190 195 191 if (ev_int == NULL) ··· 349 343 enum iio_event_type type, enum iio_event_direction dir, 350 344 enum iio_shared_by shared_by, const unsigned long *mask) 351 345 { 346 + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); 352 347 ssize_t (*show)(struct device *, struct device_attribute *, char *); 353 348 ssize_t (*store)(struct device *, struct device_attribute *, 354 349 const char *, size_t); ··· 383 376 384 377 ret = __iio_add_chan_devattr(postfix, chan, show, store, 385 378 (i << 16) | spec_index, shared_by, &indio_dev->dev, 386 - &indio_dev->event_interface->dev_attr_list); 379 + &iio_dev_opaque->event_interface->dev_attr_list); 387 380 kfree(postfix); 388 381 389 382 if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE)) ··· 476 469 static const char *iio_event_group_name = "events"; 477 470 int iio_device_register_eventset(struct iio_dev *indio_dev) 478 471 { 472 + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); 479 473 struct iio_dev_attr *p; 480 474 int ret = 0, attrcount_orig = 0, attrcount, attrn; 481 475 struct attribute **attr; ··· 485 477 iio_check_for_dynamic_events(indio_dev))) 486 478 return 0; 487 479 488 - indio_dev->event_interface = 480 + iio_dev_opaque->event_interface = 489 481 kzalloc(sizeof(struct iio_event_interface), GFP_KERNEL); 490 - if (indio_dev->event_interface == NULL) 482 + if (iio_dev_opaque->event_interface == NULL) 491 483 return -ENOMEM; 492 484 493 - INIT_LIST_HEAD(&indio_dev->event_interface->dev_attr_list); 485 + INIT_LIST_HEAD(&iio_dev_opaque->event_interface->dev_attr_list); 494 486 495 - iio_setup_ev_int(indio_dev->event_interface); 487 + iio_setup_ev_int(iio_dev_opaque->event_interface); 496 488 if (indio_dev->info->event_attrs != NULL) { 497 489 attr = indio_dev->info->event_attrs->attrs; 498 490 while (*attr++ != NULL) ··· 506 498 attrcount += ret; 507 499 } 508 500 509 - indio_dev->event_interface->group.name = iio_event_group_name; 510 - indio_dev->event_interface->group.attrs = kcalloc(attrcount + 1, 511 - sizeof(indio_dev->event_interface->group.attrs[0]), 501 + iio_dev_opaque->event_interface->group.name = iio_event_group_name; 502 + iio_dev_opaque->event_interface->group.attrs = kcalloc(attrcount + 1, 503 + sizeof(iio_dev_opaque->event_interface->group.attrs[0]), 512 504 GFP_KERNEL); 513 - if (indio_dev->event_interface->group.attrs == NULL) { 505 + if (iio_dev_opaque->event_interface->group.attrs == NULL) { 514 506 ret = -ENOMEM; 515 507 goto error_free_setup_event_lines; 516 508 } 517 509 if (indio_dev->info->event_attrs) 518 - memcpy(indio_dev->event_interface->group.attrs, 510 + memcpy(iio_dev_opaque->event_interface->group.attrs, 519 511 indio_dev->info->event_attrs->attrs, 520 - sizeof(indio_dev->event_interface->group.attrs[0]) 512 + sizeof(iio_dev_opaque->event_interface->group.attrs[0]) 521 513 *attrcount_orig); 522 514 attrn = attrcount_orig; 523 515 /* Add all elements from the list. */ 524 516 list_for_each_entry(p, 525 - &indio_dev->event_interface->dev_attr_list, 517 + &iio_dev_opaque->event_interface->dev_attr_list, 526 518 l) 527 - indio_dev->event_interface->group.attrs[attrn++] = 519 + iio_dev_opaque->event_interface->group.attrs[attrn++] = 528 520 &p->dev_attr.attr; 529 521 indio_dev->groups[indio_dev->groupcounter++] = 530 - &indio_dev->event_interface->group; 522 + &iio_dev_opaque->event_interface->group; 531 523 532 524 return 0; 533 525 534 526 error_free_setup_event_lines: 535 - iio_free_chan_devattr_list(&indio_dev->event_interface->dev_attr_list); 536 - kfree(indio_dev->event_interface); 537 - indio_dev->event_interface = NULL; 527 + iio_free_chan_devattr_list(&iio_dev_opaque->event_interface->dev_attr_list); 528 + kfree(iio_dev_opaque->event_interface); 529 + iio_dev_opaque->event_interface = NULL; 538 530 return ret; 539 531 } 540 532 ··· 547 539 */ 548 540 void iio_device_wakeup_eventset(struct iio_dev *indio_dev) 549 541 { 550 - if (indio_dev->event_interface == NULL) 542 + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); 543 + 544 + if (iio_dev_opaque->event_interface == NULL) 551 545 return; 552 - wake_up(&indio_dev->event_interface->wait); 546 + wake_up(&iio_dev_opaque->event_interface->wait); 553 547 } 554 548 555 549 void iio_device_unregister_eventset(struct iio_dev *indio_dev) 556 550 { 557 - if (indio_dev->event_interface == NULL) 551 + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); 552 + 553 + if (iio_dev_opaque->event_interface == NULL) 558 554 return; 559 - iio_free_chan_devattr_list(&indio_dev->event_interface->dev_attr_list); 560 - kfree(indio_dev->event_interface->group.attrs); 561 - kfree(indio_dev->event_interface); 555 + iio_free_chan_devattr_list(&iio_dev_opaque->event_interface->dev_attr_list); 556 + kfree(iio_dev_opaque->event_interface->group.attrs); 557 + kfree(iio_dev_opaque->event_interface); 562 558 }
+2
include/linux/iio/iio-opaque.h
··· 6 6 /** 7 7 * struct iio_dev_opaque - industrial I/O device opaque information 8 8 * @indio_dev: public industrial I/O device information 9 + * @event_interface: event chrdevs associated with interrupt lines 9 10 * @buffer_list: list of all buffers currently attached 10 11 * @channel_attr_list: keep track of automatically created channel 11 12 * attributes ··· 18 17 */ 19 18 struct iio_dev_opaque { 20 19 struct iio_dev indio_dev; 20 + struct iio_event_interface *event_interface; 21 21 struct list_head buffer_list; 22 22 struct list_head channel_attr_list; 23 23 struct attribute_group chan_attr_group;
-3
include/linux/iio/iio.h
··· 488 488 * @currentmode: [DRIVER] current operating mode 489 489 * @dev: [DRIVER] device structure, should be assigned a parent 490 490 * and owner 491 - * @event_interface: [INTERN] event chrdevs associated with interrupt lines 492 491 * @buffer: [DRIVER] any buffer present 493 492 * @scan_bytes: [INTERN] num bytes captured to be fed to buffer demux 494 493 * @mlock: [INTERN] lock used to prevent simultaneous device state ··· 525 526 int modes; 526 527 int currentmode; 527 528 struct device dev; 528 - 529 - struct iio_event_interface *event_interface; 530 529 531 530 struct iio_buffer *buffer; 532 531 int scan_bytes;