2019-05-27 09:55:21 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2009-12-09 14:39:56 +03:00
/*
* Media device node
*
* Copyright ( C ) 2010 Nokia Corporation
*
* Contacts : Laurent Pinchart < laurent . pinchart @ ideasonboard . com >
* Sakari Ailus < sakari . ailus @ iki . fi >
*
* - -
*
* Common functions for media - related drivers to register and unregister media
* device nodes .
*/
# ifndef _MEDIA_DEVNODE_H
# define _MEDIA_DEVNODE_H
# include <linux/poll.h>
# include <linux/fs.h>
# include <linux/device.h>
# include <linux/cdev.h>
2016-04-28 01:28:26 +03:00
struct media_device ;
2009-12-09 14:39:56 +03:00
/*
* Flag to mark the media_devnode struct as registered . Drivers must not touch
* this flag directly , it will be set and cleared by media_devnode_register and
* media_devnode_unregister .
*/
# define MEDIA_FLAG_REGISTERED 0
2015-12-13 14:00:00 +03:00
/**
* struct media_file_operations - Media device file operations
*
* @ owner : should be filled with % THIS_MODULE
* @ read : pointer to the function that implements read ( ) syscall
* @ write : pointer to the function that implements write ( ) syscall
* @ poll : pointer to the function that implements poll ( ) syscall
* @ ioctl : pointer to the function that implements ioctl ( ) syscall
* @ compat_ioctl : pointer to the function that will handle 32 bits userspace
2020-07-15 01:05:50 +03:00
* calls to the ioctl ( ) syscall on a Kernel compiled with 64 bits .
2015-12-13 14:00:00 +03:00
* @ open : pointer to the function that implements open ( ) syscall
* @ release : pointer to the function that will release the resources allocated
* by the @ open function .
*/
2009-12-09 14:39:56 +03:00
struct media_file_operations {
struct module * owner ;
ssize_t ( * read ) ( struct file * , char __user * , size_t , loff_t * ) ;
ssize_t ( * write ) ( struct file * , const char __user * , size_t , loff_t * ) ;
2017-07-03 05:22:01 +03:00
__poll_t ( * poll ) ( struct file * , struct poll_table_struct * ) ;
2009-12-09 14:39:56 +03:00
long ( * ioctl ) ( struct file * , unsigned int , unsigned long ) ;
2013-01-22 19:27:55 +04:00
long ( * compat_ioctl ) ( struct file * , unsigned int , unsigned long ) ;
2009-12-09 14:39:56 +03:00
int ( * open ) ( struct file * ) ;
int ( * release ) ( struct file * ) ;
} ;
/**
* struct media_devnode - Media device node
2016-06-16 14:04:40 +03:00
* @ media_dev : pointer to struct & media_device
2015-12-13 14:00:00 +03:00
* @ fops : pointer to struct & media_file_operations with media device ops
2016-06-16 14:04:40 +03:00
* @ dev : pointer to struct & device containing the media controller device
2015-08-22 10:45:03 +03:00
* @ cdev : struct cdev pointer character device
2009-12-09 14:39:56 +03:00
* @ parent : parent device
* @ minor : device node minor number
2016-08-29 22:09:11 +03:00
* @ flags : flags , combination of the ` ` MEDIA_FLAG_ * ` ` constants
2016-09-08 15:57:24 +03:00
* @ release : release callback called at the end of ` ` media_devnode_release ( ) ` `
* routine at media - device . c .
2009-12-09 14:39:56 +03:00
*
* This structure represents a media - related device node .
*
* The @ parent is a physical device . It must be set by core or device drivers
* before registering the node .
*/
struct media_devnode {
2016-04-28 01:28:26 +03:00
struct media_device * media_dev ;
2009-12-09 14:39:56 +03:00
/* device ops */
const struct media_file_operations * fops ;
/* sysfs */
struct device dev ; /* media device */
struct cdev cdev ; /* character device */
struct device * parent ; /* device parent */
/* device info */
int minor ;
unsigned long flags ; /* Use bitops to access flags */
/* callbacks */
2016-03-23 17:22:57 +03:00
void ( * release ) ( struct media_devnode * devnode ) ;
2009-12-09 14:39:56 +03:00
} ;
/* dev to media_devnode */
# define to_media_devnode(cd) container_of(cd, struct media_devnode, dev)
2015-12-13 13:40:45 +03:00
/**
* media_devnode_register - register a media device node
*
2016-06-16 14:04:40 +03:00
* @ mdev : struct media_device we want to register a device node
2016-03-23 17:22:57 +03:00
* @ devnode : media device node structure we want to register
2015-12-13 13:40:45 +03:00
* @ owner : should be filled with % THIS_MODULE
*
* The registration code assigns minor numbers and registers the new device node
* with the kernel . An error is returned if no free minor number can be found ,
* or if the registration of the device node fails .
*
* Zero is returned on success .
*
* Note that if the media_devnode_register call fails , the release ( ) callback of
* the media_devnode structure is * not * called , so the caller is responsible for
* freeing any data .
*/
2016-04-28 01:28:26 +03:00
int __must_check media_devnode_register ( struct media_device * mdev ,
struct media_devnode * devnode ,
2013-12-12 19:38:17 +04:00
struct module * owner ) ;
2015-12-13 13:40:45 +03:00
2016-06-10 20:37:23 +03:00
/**
* media_devnode_unregister_prepare - clear the media device node register bit
* @ devnode : the device node to prepare for unregister
*
* This clears the passed device register bit . Future open calls will be met
* with errors . Should be called before media_devnode_unregister ( ) to avoid
* races with unregister and device file open calls .
*
* This function can safely be called if the device node has never been
* registered or has already been unregistered .
*/
void media_devnode_unregister_prepare ( struct media_devnode * devnode ) ;
2015-12-13 13:40:45 +03:00
/**
* media_devnode_unregister - unregister a media device node
2016-03-23 17:22:57 +03:00
* @ devnode : the device node to unregister
2015-12-13 13:40:45 +03:00
*
* This unregisters the passed device . Future open calls will be met with
* errors .
*
2016-06-10 20:37:23 +03:00
* Should be called after media_devnode_unregister_prepare ( )
2015-12-13 13:40:45 +03:00
*/
2016-03-23 17:22:57 +03:00
void media_devnode_unregister ( struct media_devnode * devnode ) ;
2009-12-09 14:39:56 +03:00
2015-12-13 14:00:00 +03:00
/**
* media_devnode_data - returns a pointer to the & media_devnode
*
* @ filp : pointer to struct & file
*/
2009-12-09 14:39:56 +03:00
static inline struct media_devnode * media_devnode_data ( struct file * filp )
{
return filp - > private_data ;
}
2015-12-13 14:00:00 +03:00
/**
* media_devnode_is_registered - returns true if & media_devnode is registered ;
* false otherwise .
*
2016-03-23 17:22:57 +03:00
* @ devnode : pointer to struct & media_devnode .
2016-04-28 01:28:26 +03:00
*
* Note : If mdev is NULL , it also returns false .
2015-12-13 14:00:00 +03:00
*/
2016-03-23 17:22:57 +03:00
static inline int media_devnode_is_registered ( struct media_devnode * devnode )
2009-12-09 14:39:56 +03:00
{
2016-04-28 01:28:26 +03:00
if ( ! devnode )
return false ;
2016-03-23 17:22:57 +03:00
return test_bit ( MEDIA_FLAG_REGISTERED , & devnode - > flags ) ;
2009-12-09 14:39:56 +03:00
}
# endif /* _MEDIA_DEVNODE_H */