2019-06-03 07:44:51 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2006-06-26 20:58:46 -03:00
/*
*
* Copyright ( C ) 2005 Mike Isely < isely @ pobox . com >
* Copyright ( C ) 2004 Aurelien Alleaume < slts @ free . fr >
*/
# include <linux/kernel.h>
# include <linux/errno.h>
# include <linux/module.h>
# include <linux/usb.h>
# include <linux/videodev2.h>
# include "pvrusb2-hdw.h"
2007-11-26 01:53:12 -03:00
# include "pvrusb2-devattr.h"
2006-06-26 20:58:46 -03:00
# include "pvrusb2-context.h"
# include "pvrusb2-debug.h"
# include "pvrusb2-v4l2.h"
# ifdef CONFIG_VIDEO_PVRUSB2_SYSFS
# include "pvrusb2-sysfs.h"
# endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */
# define DRIVER_AUTHOR "Mike Isely <isely@pobox.com>"
# define DRIVER_DESC "Hauppauge WinTV-PVR-USB2 MPEG2 Encoder / Tuner"
# define DRIVER_VERSION "V4L in-tree version"
# define DEFAULT_DEBUG_MASK (PVR2_TRACE_ERROR_LEGS| \
PVR2_TRACE_INFO | \
2007-09-08 22:32:12 -03:00
PVR2_TRACE_STD | \
2006-06-26 20:58:46 -03:00
PVR2_TRACE_TOLERANCE | \
PVR2_TRACE_TRAP | \
0 )
int pvrusb2_debug = DEFAULT_DEBUG_MASK ;
module_param_named ( debug , pvrusb2_debug , int , S_IRUGO | S_IWUSR ) ;
MODULE_PARM_DESC ( debug , " Debug trace mask " ) ;
# ifdef CONFIG_VIDEO_PVRUSB2_SYSFS
2006-06-30 11:35:28 -03:00
static struct pvr2_sysfs_class * class_ptr = NULL ;
2006-06-26 20:58:46 -03:00
# endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */
static void pvr_setup_attach ( struct pvr2_context * pvr )
{
/* Create association with v4l layer */
pvr2_v4l2_create ( pvr ) ;
2008-02-03 23:46:16 -03:00
# ifdef CONFIG_VIDEO_PVRUSB2_DVB
/* Create association with dvb layer */
2008-02-09 19:47:07 -03:00
pvr2_dvb_create ( pvr ) ;
2008-02-03 23:46:16 -03:00
# endif
2006-06-26 20:58:46 -03:00
# ifdef CONFIG_VIDEO_PVRUSB2_SYSFS
pvr2_sysfs_create ( pvr , class_ptr ) ;
# endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */
}
static int pvr_probe ( struct usb_interface * intf ,
const struct usb_device_id * devid )
{
struct pvr2_context * pvr ;
/* Create underlying hardware interface */
pvr = pvr2_context_create ( intf , devid , pvr_setup_attach ) ;
if ( ! pvr ) {
pvr2_trace ( PVR2_TRACE_ERROR_LEGS ,
" Failed to create hdw handler " ) ;
return - ENOMEM ;
}
pvr2_trace ( PVR2_TRACE_INIT , " pvr_probe(pvr=%p) " , pvr ) ;
usb_set_intfdata ( intf , pvr ) ;
return 0 ;
}
/*
* pvr_disconnect ( )
*
*/
static void pvr_disconnect ( struct usb_interface * intf )
{
struct pvr2_context * pvr = usb_get_intfdata ( intf ) ;
pvr2_trace ( PVR2_TRACE_INIT , " pvr_disconnect(pvr=%p) BEGIN " , pvr ) ;
usb_set_intfdata ( intf , NULL ) ;
pvr2_context_disconnect ( pvr ) ;
pvr2_trace ( PVR2_TRACE_INIT , " pvr_disconnect(pvr=%p) DONE " , pvr ) ;
}
static struct usb_driver pvr_driver = {
2006-06-30 11:35:28 -03:00
. name = " pvrusb2 " ,
. id_table = pvr2_device_table ,
. probe = pvr_probe ,
. disconnect = pvr_disconnect
2006-06-26 20:58:46 -03:00
} ;
/*
* pvr_init ( ) / pvr_exit ( )
*
* This code is run to initialize / exit the driver .
*
*/
static int __init pvr_init ( void )
{
int ret ;
pvr2_trace ( PVR2_TRACE_INIT , " pvr_init " ) ;
2008-04-07 02:22:04 -03:00
ret = pvr2_context_global_init ( ) ;
if ( ret ! = 0 ) {
pvr2_trace ( PVR2_TRACE_INIT , " pvr_init failure code=%d " , ret ) ;
return ret ;
}
2006-06-26 20:58:46 -03:00
# ifdef CONFIG_VIDEO_PVRUSB2_SYSFS
class_ptr = pvr2_sysfs_class_create ( ) ;
# endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */
ret = usb_register ( & pvr_driver ) ;
if ( ret = = 0 )
2018-10-08 08:06:47 -04:00
pr_info ( " pvrusb2: " DRIVER_VERSION " : "
2008-10-10 05:08:23 -03:00
DRIVER_DESC " \n " ) ;
if ( pvrusb2_debug )
2018-10-08 08:06:47 -04:00
pr_info ( " pvrusb2: Debug mask is %d (0x%x) \n " ,
2008-10-10 05:08:23 -03:00
pvrusb2_debug , pvrusb2_debug ) ;
2006-06-26 20:58:46 -03:00
2008-04-07 02:22:04 -03:00
pvr2_trace ( PVR2_TRACE_INIT , " pvr_init complete " ) ;
2006-06-26 20:58:46 -03:00
return ret ;
}
static void __exit pvr_exit ( void )
{
pvr2_trace ( PVR2_TRACE_INIT , " pvr_exit " ) ;
2007-11-03 00:06:42 -03:00
usb_deregister ( & pvr_driver ) ;
2010-05-15 00:30:29 -03:00
pvr2_context_global_done ( ) ;
2006-06-26 20:58:46 -03:00
# ifdef CONFIG_VIDEO_PVRUSB2_SYSFS
pvr2_sysfs_class_destroy ( class_ptr ) ;
# endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */
2008-04-07 02:22:04 -03:00
pvr2_trace ( PVR2_TRACE_INIT , " pvr_exit complete " ) ;
2006-06-26 20:58:46 -03:00
}
module_init ( pvr_init ) ;
module_exit ( pvr_exit ) ;
MODULE_AUTHOR ( DRIVER_AUTHOR ) ;
MODULE_DESCRIPTION ( DRIVER_DESC ) ;
MODULE_LICENSE ( " GPL " ) ;
2011-06-25 13:34:24 -03:00
MODULE_VERSION ( " 0.9.1 " ) ;