1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * include/linux/uio_driver.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright(C) 2005, Benedikt Spranger <b.spranger@linutronix.de> 6*4882a593Smuzhiyun * Copyright(C) 2005, Thomas Gleixner <tglx@linutronix.de> 7*4882a593Smuzhiyun * Copyright(C) 2006, Hans J. Koch <hjk@hansjkoch.de> 8*4882a593Smuzhiyun * Copyright(C) 2006, Greg Kroah-Hartman <greg@kroah.com> 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Userspace IO driver. 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #ifndef _UIO_DRIVER_H_ 14*4882a593Smuzhiyun #define _UIO_DRIVER_H_ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include <linux/device.h> 17*4882a593Smuzhiyun #include <linux/fs.h> 18*4882a593Smuzhiyun #include <linux/interrupt.h> 19*4882a593Smuzhiyun #include <linux/android_kabi.h> 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun struct module; 22*4882a593Smuzhiyun struct uio_map; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /** 25*4882a593Smuzhiyun * struct uio_mem - description of a UIO memory region 26*4882a593Smuzhiyun * @name: name of the memory region for identification 27*4882a593Smuzhiyun * @addr: address of the device's memory rounded to page 28*4882a593Smuzhiyun * size (phys_addr is used since addr can be 29*4882a593Smuzhiyun * logical, virtual, or physical & phys_addr_t 30*4882a593Smuzhiyun * should always be large enough to handle any of 31*4882a593Smuzhiyun * the address types) 32*4882a593Smuzhiyun * @offs: offset of device memory within the page 33*4882a593Smuzhiyun * @size: size of IO (multiple of page size) 34*4882a593Smuzhiyun * @memtype: type of memory addr points to 35*4882a593Smuzhiyun * @internal_addr: ioremap-ped version of addr, for driver internal use 36*4882a593Smuzhiyun * @map: for use by the UIO core only. 37*4882a593Smuzhiyun */ 38*4882a593Smuzhiyun struct uio_mem { 39*4882a593Smuzhiyun const char *name; 40*4882a593Smuzhiyun phys_addr_t addr; 41*4882a593Smuzhiyun unsigned long offs; 42*4882a593Smuzhiyun resource_size_t size; 43*4882a593Smuzhiyun int memtype; 44*4882a593Smuzhiyun void __iomem *internal_addr; 45*4882a593Smuzhiyun struct uio_map *map; 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define MAX_UIO_MAPS 5 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun struct uio_portio; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /** 53*4882a593Smuzhiyun * struct uio_port - description of a UIO port region 54*4882a593Smuzhiyun * @name: name of the port region for identification 55*4882a593Smuzhiyun * @start: start of port region 56*4882a593Smuzhiyun * @size: size of port region 57*4882a593Smuzhiyun * @porttype: type of port (see UIO_PORT_* below) 58*4882a593Smuzhiyun * @portio: for use by the UIO core only. 59*4882a593Smuzhiyun */ 60*4882a593Smuzhiyun struct uio_port { 61*4882a593Smuzhiyun const char *name; 62*4882a593Smuzhiyun unsigned long start; 63*4882a593Smuzhiyun unsigned long size; 64*4882a593Smuzhiyun int porttype; 65*4882a593Smuzhiyun struct uio_portio *portio; 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define MAX_UIO_PORT_REGIONS 5 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun struct uio_device { 71*4882a593Smuzhiyun struct module *owner; 72*4882a593Smuzhiyun struct device dev; 73*4882a593Smuzhiyun int minor; 74*4882a593Smuzhiyun atomic_t event; 75*4882a593Smuzhiyun struct fasync_struct *async_queue; 76*4882a593Smuzhiyun wait_queue_head_t wait; 77*4882a593Smuzhiyun struct uio_info *info; 78*4882a593Smuzhiyun struct mutex info_lock; 79*4882a593Smuzhiyun struct kobject *map_dir; 80*4882a593Smuzhiyun struct kobject *portio_dir; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1); 83*4882a593Smuzhiyun }; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /** 86*4882a593Smuzhiyun * struct uio_info - UIO device capabilities 87*4882a593Smuzhiyun * @uio_dev: the UIO device this info belongs to 88*4882a593Smuzhiyun * @name: device name 89*4882a593Smuzhiyun * @version: device driver version 90*4882a593Smuzhiyun * @mem: list of mappable memory regions, size==0 for end of list 91*4882a593Smuzhiyun * @port: list of port regions, size==0 for end of list 92*4882a593Smuzhiyun * @irq: interrupt number or UIO_IRQ_CUSTOM 93*4882a593Smuzhiyun * @irq_flags: flags for request_irq() 94*4882a593Smuzhiyun * @priv: optional private data 95*4882a593Smuzhiyun * @handler: the device's irq handler 96*4882a593Smuzhiyun * @mmap: mmap operation for this uio device 97*4882a593Smuzhiyun * @open: open operation for this uio device 98*4882a593Smuzhiyun * @release: release operation for this uio device 99*4882a593Smuzhiyun * @irqcontrol: disable/enable irqs when 0/1 is written to /dev/uioX 100*4882a593Smuzhiyun */ 101*4882a593Smuzhiyun struct uio_info { 102*4882a593Smuzhiyun struct uio_device *uio_dev; 103*4882a593Smuzhiyun const char *name; 104*4882a593Smuzhiyun const char *version; 105*4882a593Smuzhiyun struct uio_mem mem[MAX_UIO_MAPS]; 106*4882a593Smuzhiyun struct uio_port port[MAX_UIO_PORT_REGIONS]; 107*4882a593Smuzhiyun long irq; 108*4882a593Smuzhiyun unsigned long irq_flags; 109*4882a593Smuzhiyun void *priv; 110*4882a593Smuzhiyun irqreturn_t (*handler)(int irq, struct uio_info *dev_info); 111*4882a593Smuzhiyun int (*mmap)(struct uio_info *info, struct vm_area_struct *vma); 112*4882a593Smuzhiyun int (*open)(struct uio_info *info, struct inode *inode); 113*4882a593Smuzhiyun int (*release)(struct uio_info *info, struct inode *inode); 114*4882a593Smuzhiyun int (*irqcontrol)(struct uio_info *info, s32 irq_on); 115*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1); 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun extern int __must_check 119*4882a593Smuzhiyun __uio_register_device(struct module *owner, 120*4882a593Smuzhiyun struct device *parent, 121*4882a593Smuzhiyun struct uio_info *info); 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /* use a define to avoid include chaining to get THIS_MODULE */ 124*4882a593Smuzhiyun #define uio_register_device(parent, info) \ 125*4882a593Smuzhiyun __uio_register_device(THIS_MODULE, parent, info) 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun extern void uio_unregister_device(struct uio_info *info); 128*4882a593Smuzhiyun extern void uio_event_notify(struct uio_info *info); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun extern int __must_check 131*4882a593Smuzhiyun __devm_uio_register_device(struct module *owner, 132*4882a593Smuzhiyun struct device *parent, 133*4882a593Smuzhiyun struct uio_info *info); 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun /* use a define to avoid include chaining to get THIS_MODULE */ 136*4882a593Smuzhiyun #define devm_uio_register_device(parent, info) \ 137*4882a593Smuzhiyun __devm_uio_register_device(THIS_MODULE, parent, info) 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* defines for uio_info->irq */ 140*4882a593Smuzhiyun #define UIO_IRQ_CUSTOM -1 141*4882a593Smuzhiyun #define UIO_IRQ_NONE 0 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /* defines for uio_mem->memtype */ 144*4882a593Smuzhiyun #define UIO_MEM_NONE 0 145*4882a593Smuzhiyun #define UIO_MEM_PHYS 1 146*4882a593Smuzhiyun #define UIO_MEM_LOGICAL 2 147*4882a593Smuzhiyun #define UIO_MEM_VIRTUAL 3 148*4882a593Smuzhiyun #define UIO_MEM_IOVA 4 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* defines for uio_port->porttype */ 151*4882a593Smuzhiyun #define UIO_PORT_NONE 0 152*4882a593Smuzhiyun #define UIO_PORT_X86 1 153*4882a593Smuzhiyun #define UIO_PORT_GPIO 2 154*4882a593Smuzhiyun #define UIO_PORT_OTHER 3 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #endif /* _LINUX_UIO_DRIVER_H_ */ 157