2019-06-04 11:11:33 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2011-08-12 20:56:03 +04:00
/* The industrial I/O core function defs.
*
* Copyright ( c ) 2008 Jonathan Cameron
*
2011-08-30 15:41:10 +04:00
* These definitions are meant for use only within the IIO core , not individual
2011-08-12 20:56:03 +04:00
* drivers .
*/
2011-08-30 15:32:47 +04:00
# ifndef _IIO_CORE_H_
# define _IIO_CORE_H_
2012-04-13 13:24:20 +04:00
# include <linux/kernel.h>
# include <linux/device.h>
2021-02-15 13:40:32 +03:00
struct iio_buffer ;
2012-04-13 13:24:20 +04:00
struct iio_chan_spec ;
struct iio_dev ;
2013-02-07 21:09:00 +04:00
extern struct device_type iio_device_type ;
2011-08-30 15:32:47 +04:00
2021-02-15 13:40:35 +03:00
struct iio_dev_buffer_pair {
struct iio_dev * indio_dev ;
struct iio_buffer * buffer ;
} ;
2020-09-24 11:41:55 +03:00
# define IIO_IOCTL_UNHANDLED 1
struct iio_ioctl_handler {
struct list_head entry ;
long ( * ioctl ) ( struct iio_dev * indio_dev , struct file * filp ,
unsigned int cmd , unsigned long arg ) ;
} ;
long iio_device_ioctl ( struct iio_dev * indio_dev , struct file * filp ,
unsigned int cmd , unsigned long arg ) ;
void iio_device_ioctl_handler_register ( struct iio_dev * indio_dev ,
struct iio_ioctl_handler * h ) ;
void iio_device_ioctl_handler_unregister ( struct iio_ioctl_handler * h ) ;
2011-08-12 20:56:03 +04:00
int __iio_add_chan_devattr ( const char * postfix ,
struct iio_chan_spec const * chan ,
ssize_t ( * func ) ( struct device * dev ,
struct device_attribute * attr ,
char * buf ) ,
ssize_t ( * writefunc ) ( struct device * dev ,
struct device_attribute * attr ,
const char * buf ,
size_t len ) ,
2011-09-02 20:14:41 +04:00
u64 mask ,
2013-09-08 17:57:00 +04:00
enum iio_shared_by shared_by ,
2011-08-12 20:56:03 +04:00
struct device * dev ,
2021-02-15 13:40:32 +03:00
struct iio_buffer * buffer ,
2011-08-12 20:56:03 +04:00
struct list_head * attr_list ) ;
2013-10-07 15:50:00 +04:00
void iio_free_chan_devattr_list ( struct list_head * attr_list ) ;
2011-08-12 20:56:03 +04:00
2021-02-15 13:40:29 +03:00
int iio_device_register_sysfs_group ( struct iio_dev * indio_dev ,
const struct attribute_group * group ) ;
2014-04-29 03:51:00 +04:00
ssize_t iio_format_value ( char * buf , unsigned int type , int size , int * vals ) ;
2013-10-07 18:11:00 +04:00
2011-08-12 20:56:03 +04:00
/* Event interface flags */
# define IIO_BUSY_BIT_POS 1
2011-08-30 15:32:47 +04:00
2011-09-21 14:15:55 +04:00
# ifdef CONFIG_IIO_BUFFER
2011-08-30 15:32:47 +04:00
struct poll_table_struct ;
iio: buffer: add ioctl() to support opening extra buffers for IIO device
With this change, an ioctl() call is added to open a character device for a
buffer. The ioctl() number is 'i' 0x91, which follows the
IIO_GET_EVENT_FD_IOCTL ioctl.
The ioctl() will return an FD for the requested buffer index. The indexes
are the same from the /sys/iio/devices/iio:deviceX/bufferY (i.e. the Y
variable).
Since there doesn't seem to be a sane way to return the FD for buffer0 to
be the same FD for the /dev/iio:deviceX, this ioctl() will return another
FD for buffer0 (or the first buffer). This duplicate FD will be able to
access the same buffer object (for buffer0) as accessing directly the
/dev/iio:deviceX chardev.
Also, there is no IIO_BUFFER_GET_BUFFER_COUNT ioctl() implemented, as the
index for each buffer (and the count) can be deduced from the
'/sys/bus/iio/devices/iio:deviceX/bufferY' folders (i.e the number of
bufferY folders).
Used following C code to test this:
-------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h"
#include <errno.h>
#define IIO_BUFFER_GET_FD_IOCTL _IOWR('i', 0x91, int)
int main(int argc, char *argv[])
{
int fd;
int fd1;
int ret;
if ((fd = open("/dev/iio:device0", O_RDWR))<0) {
fprintf(stderr, "Error open() %d errno %d\n",fd, errno);
return -1;
}
fprintf(stderr, "Using FD %d\n", fd);
fd1 = atoi(argv[1]);
ret = ioctl(fd, IIO_BUFFER_GET_FD_IOCTL, &fd1);
if (ret < 0) {
fprintf(stderr, "Error for buffer %d ioctl() %d errno %d\n", fd1, ret, errno);
close(fd);
return -1;
}
fprintf(stderr, "Got FD %d\n", fd1);
close(fd1);
close(fd);
return 0;
}
-------------------------------------------------------------------
Results are:
-------------------------------------------------------------------
# ./test 0
Using FD 3
Got FD 4
# ./test 1
Using FD 3
Got FD 4
# ./test 2
Using FD 3
Got FD 4
# ./test 3
Using FD 3
Got FD 4
# ls /sys/bus/iio/devices/iio\:device0
buffer buffer0 buffer1 buffer2 buffer3 dev
in_voltage_sampling_frequency in_voltage_scale
in_voltage_scale_available
name of_node power scan_elements subsystem uevent
-------------------------------------------------------------------
iio:device0 has some fake kfifo buffers attached to an IIO device.
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Link: https://lore.kernel.org/r/20210215104043.91251-21-alexandru.ardelean@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
2021-02-15 13:40:39 +03:00
__poll_t iio_buffer_poll_wrapper ( struct file * filp ,
struct poll_table_struct * wait ) ;
ssize_t iio_buffer_read_wrapper ( struct file * filp , char __user * buf ,
size_t n , loff_t * f_ps ) ;
2011-08-30 15:32:47 +04:00
2021-02-15 13:40:38 +03:00
int iio_buffers_alloc_sysfs_and_mask ( struct iio_dev * indio_dev ) ;
void iio_buffers_free_sysfs_and_mask ( struct iio_dev * indio_dev ) ;
2011-08-30 15:32:47 +04:00
iio: buffer: add ioctl() to support opening extra buffers for IIO device
With this change, an ioctl() call is added to open a character device for a
buffer. The ioctl() number is 'i' 0x91, which follows the
IIO_GET_EVENT_FD_IOCTL ioctl.
The ioctl() will return an FD for the requested buffer index. The indexes
are the same from the /sys/iio/devices/iio:deviceX/bufferY (i.e. the Y
variable).
Since there doesn't seem to be a sane way to return the FD for buffer0 to
be the same FD for the /dev/iio:deviceX, this ioctl() will return another
FD for buffer0 (or the first buffer). This duplicate FD will be able to
access the same buffer object (for buffer0) as accessing directly the
/dev/iio:deviceX chardev.
Also, there is no IIO_BUFFER_GET_BUFFER_COUNT ioctl() implemented, as the
index for each buffer (and the count) can be deduced from the
'/sys/bus/iio/devices/iio:deviceX/bufferY' folders (i.e the number of
bufferY folders).
Used following C code to test this:
-------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h"
#include <errno.h>
#define IIO_BUFFER_GET_FD_IOCTL _IOWR('i', 0x91, int)
int main(int argc, char *argv[])
{
int fd;
int fd1;
int ret;
if ((fd = open("/dev/iio:device0", O_RDWR))<0) {
fprintf(stderr, "Error open() %d errno %d\n",fd, errno);
return -1;
}
fprintf(stderr, "Using FD %d\n", fd);
fd1 = atoi(argv[1]);
ret = ioctl(fd, IIO_BUFFER_GET_FD_IOCTL, &fd1);
if (ret < 0) {
fprintf(stderr, "Error for buffer %d ioctl() %d errno %d\n", fd1, ret, errno);
close(fd);
return -1;
}
fprintf(stderr, "Got FD %d\n", fd1);
close(fd1);
close(fd);
return 0;
}
-------------------------------------------------------------------
Results are:
-------------------------------------------------------------------
# ./test 0
Using FD 3
Got FD 4
# ./test 1
Using FD 3
Got FD 4
# ./test 2
Using FD 3
Got FD 4
# ./test 3
Using FD 3
Got FD 4
# ls /sys/bus/iio/devices/iio\:device0
buffer buffer0 buffer1 buffer2 buffer3 dev
in_voltage_sampling_frequency in_voltage_scale
in_voltage_scale_available
name of_node power scan_elements subsystem uevent
-------------------------------------------------------------------
iio:device0 has some fake kfifo buffers attached to an IIO device.
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Link: https://lore.kernel.org/r/20210215104043.91251-21-alexandru.ardelean@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
2021-02-15 13:40:39 +03:00
# define iio_buffer_poll_addr (&iio_buffer_poll_wrapper)
# define iio_buffer_read_outer_addr (&iio_buffer_read_wrapper)
2011-08-30 15:32:47 +04:00
2013-09-19 00:02:00 +04:00
void iio_disable_all_buffers ( struct iio_dev * indio_dev ) ;
2013-10-04 15:07:00 +04:00
void iio_buffer_wakeup_poll ( struct iio_dev * indio_dev ) ;
2021-03-07 21:54:44 +03:00
void iio_device_detach_buffers ( struct iio_dev * indio_dev ) ;
2013-09-19 00:02:00 +04:00
2011-08-30 15:32:47 +04:00
# else
2011-09-21 14:15:57 +04:00
# define iio_buffer_poll_addr NULL
2019-12-11 13:43:00 +03:00
# define iio_buffer_read_outer_addr NULL
2011-08-30 15:32:47 +04:00
2021-02-15 13:40:38 +03:00
static inline int iio_buffers_alloc_sysfs_and_mask ( struct iio_dev * indio_dev )
2014-11-26 20:55:12 +03:00
{
return 0 ;
}
2021-02-15 13:40:38 +03:00
static inline void iio_buffers_free_sysfs_and_mask ( struct iio_dev * indio_dev ) { }
2014-11-26 20:55:12 +03:00
2013-09-19 00:02:00 +04:00
static inline void iio_disable_all_buffers ( struct iio_dev * indio_dev ) { }
2013-10-04 15:07:00 +04:00
static inline void iio_buffer_wakeup_poll ( struct iio_dev * indio_dev ) { }
2021-03-07 21:54:44 +03:00
static inline void iio_device_detach_buffers ( struct iio_dev * indio_dev ) { }
2013-09-19 00:02:00 +04:00
2011-08-30 15:32:47 +04:00
# endif
2012-01-03 17:59:38 +04:00
int iio_device_register_eventset ( struct iio_dev * indio_dev ) ;
void iio_device_unregister_eventset ( struct iio_dev * indio_dev ) ;
2013-10-04 15:07:00 +04:00
void iio_device_wakeup_eventset ( struct iio_dev * indio_dev ) ;
2012-01-03 17:59:38 +04:00
2016-03-09 21:05:49 +03:00
struct iio_event_interface ;
bool iio_event_enabled ( const struct iio_event_interface * ev_int ) ;
2011-08-30 15:32:47 +04:00
# endif