2019-05-27 08:55:01 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2011-11-03 09:39:37 -03:00
/*
* uvc_debugfs . c - - USB Video Class driver - Debugging support
*
* Copyright ( C ) 2011
* Laurent Pinchart ( laurent . pinchart @ ideasonboard . com )
*/
# include <linux/module.h>
# include <linux/debugfs.h>
# include <linux/slab.h>
# include <linux/usb.h>
# include "uvcvideo.h"
2011-11-03 11:40:08 -03:00
/* -----------------------------------------------------------------------------
* Statistics
*/
# define UVC_DEBUGFS_BUF_SIZE 1024
struct uvc_debugfs_buffer {
size_t count ;
char data [ UVC_DEBUGFS_BUF_SIZE ] ;
} ;
static int uvc_debugfs_stats_open ( struct inode * inode , struct file * file )
{
struct uvc_streaming * stream = inode - > i_private ;
struct uvc_debugfs_buffer * buf ;
buf = kmalloc ( sizeof ( * buf ) , GFP_KERNEL ) ;
if ( buf = = NULL )
return - ENOMEM ;
buf - > count = uvc_video_stats_dump ( stream , buf - > data , sizeof ( buf - > data ) ) ;
file - > private_data = buf ;
return 0 ;
}
static ssize_t uvc_debugfs_stats_read ( struct file * file , char __user * user_buf ,
size_t nbytes , loff_t * ppos )
{
struct uvc_debugfs_buffer * buf = file - > private_data ;
return simple_read_from_buffer ( user_buf , nbytes , ppos , buf - > data ,
buf - > count ) ;
}
static int uvc_debugfs_stats_release ( struct inode * inode , struct file * file )
{
kfree ( file - > private_data ) ;
file - > private_data = NULL ;
return 0 ;
}
static const struct file_operations uvc_debugfs_stats_fops = {
. owner = THIS_MODULE ,
. open = uvc_debugfs_stats_open ,
. llseek = no_llseek ,
. read = uvc_debugfs_stats_read ,
. release = uvc_debugfs_stats_release ,
} ;
2011-11-03 09:39:37 -03:00
/* -----------------------------------------------------------------------------
* Global and stream initialization / cleanup
*/
static struct dentry * uvc_debugfs_root_dir ;
2017-01-11 23:31:21 -02:00
void uvc_debugfs_init_stream ( struct uvc_streaming * stream )
2011-11-03 09:39:37 -03:00
{
struct usb_device * udev = stream - > dev - > udev ;
2019-04-28 01:21:13 -04:00
char dir_name [ 33 ] ;
2011-11-03 09:39:37 -03:00
if ( uvc_debugfs_root_dir = = NULL )
2017-01-11 23:31:21 -02:00
return ;
2011-11-03 09:39:37 -03:00
2019-04-28 01:21:13 -04:00
snprintf ( dir_name , sizeof ( dir_name ) , " %u-%u-%u " , udev - > bus - > busnum ,
udev - > devnum , stream - > intfnum ) ;
2011-11-03 09:39:37 -03:00
2020-08-18 15:36:08 +02:00
stream - > debugfs_dir = debugfs_create_dir ( dir_name ,
uvc_debugfs_root_dir ) ;
2011-11-03 09:39:37 -03:00
2020-08-18 15:36:08 +02:00
debugfs_create_file ( " stats " , 0444 , stream - > debugfs_dir , stream ,
& uvc_debugfs_stats_fops ) ;
2011-11-03 09:39:37 -03:00
}
void uvc_debugfs_cleanup_stream ( struct uvc_streaming * stream )
{
debugfs_remove_recursive ( stream - > debugfs_dir ) ;
stream - > debugfs_dir = NULL ;
}
2017-01-11 23:31:21 -02:00
void uvc_debugfs_init ( void )
2011-11-03 09:39:37 -03:00
{
2019-11-12 14:51:47 +08:00
uvc_debugfs_root_dir = debugfs_create_dir ( " uvcvideo " , usb_debug_root ) ;
2011-11-03 09:39:37 -03:00
}
void uvc_debugfs_cleanup ( void )
{
2017-11-12 03:18:59 -05:00
debugfs_remove_recursive ( uvc_debugfs_root_dir ) ;
2011-11-03 09:39:37 -03:00
}