1  // SPDX-License-Identifier: GPL-2.0-only
2  /*
3   *
4   *  Copyright (C) 2005 Mike Isely <isely@pobox.com>
5   *  Copyright (C) 2004 Aurelien Alleaume <slts@free.fr>
6   */
7  
8  #include <linux/kernel.h>
9  #include <linux/errno.h>
10  #include <linux/module.h>
11  #include <linux/usb.h>
12  #include <linux/videodev2.h>
13  
14  #include "pvrusb2-hdw.h"
15  #include "pvrusb2-devattr.h"
16  #include "pvrusb2-context.h"
17  #include "pvrusb2-debug.h"
18  #include "pvrusb2-v4l2.h"
19  #include "pvrusb2-sysfs.h"
20  
21  #define DRIVER_AUTHOR "Mike Isely <isely@pobox.com>"
22  #define DRIVER_DESC "Hauppauge WinTV-PVR-USB2 MPEG2 Encoder/Tuner"
23  #define DRIVER_VERSION "V4L in-tree version"
24  
25  #define DEFAULT_DEBUG_MASK (PVR2_TRACE_ERROR_LEGS| \
26  			    PVR2_TRACE_INFO| \
27  			    PVR2_TRACE_STD| \
28  			    PVR2_TRACE_TOLERANCE| \
29  			    PVR2_TRACE_TRAP| \
30  			    0)
31  
32  int pvrusb2_debug = DEFAULT_DEBUG_MASK;
33  
34  module_param_named(debug,pvrusb2_debug,int,S_IRUGO|S_IWUSR);
35  MODULE_PARM_DESC(debug, "Debug trace mask");
36  
pvr_setup_attach(struct pvr2_context * pvr)37  static void pvr_setup_attach(struct pvr2_context *pvr)
38  {
39  	/* Create association with v4l layer */
40  	pvr2_v4l2_create(pvr);
41  #ifdef CONFIG_VIDEO_PVRUSB2_DVB
42  	/* Create association with dvb layer */
43  	pvr2_dvb_create(pvr);
44  #endif
45  	pvr2_sysfs_create(pvr);
46  }
47  
pvr_probe(struct usb_interface * intf,const struct usb_device_id * devid)48  static int pvr_probe(struct usb_interface *intf,
49  		     const struct usb_device_id *devid)
50  {
51  	struct pvr2_context *pvr;
52  
53  	/* Create underlying hardware interface */
54  	pvr = pvr2_context_create(intf,devid,pvr_setup_attach);
55  	if (!pvr) {
56  		pvr2_trace(PVR2_TRACE_ERROR_LEGS,
57  			   "Failed to create hdw handler");
58  		return -ENOMEM;
59  	}
60  
61  	pvr2_trace(PVR2_TRACE_INIT,"pvr_probe(pvr=%p)",pvr);
62  
63  	usb_set_intfdata(intf, pvr);
64  
65  	return 0;
66  }
67  
68  /*
69   * pvr_disconnect()
70   *
71   */
pvr_disconnect(struct usb_interface * intf)72  static void pvr_disconnect(struct usb_interface *intf)
73  {
74  	struct pvr2_context *pvr = usb_get_intfdata(intf);
75  
76  	pvr2_trace(PVR2_TRACE_INIT,"pvr_disconnect(pvr=%p) BEGIN",pvr);
77  
78  	usb_set_intfdata (intf, NULL);
79  	pvr2_context_disconnect(pvr);
80  
81  	pvr2_trace(PVR2_TRACE_INIT,"pvr_disconnect(pvr=%p) DONE",pvr);
82  
83  }
84  
85  static struct usb_driver pvr_driver = {
86  	.name =         "pvrusb2",
87  	.id_table =     pvr2_device_table,
88  	.probe =        pvr_probe,
89  	.disconnect =   pvr_disconnect
90  };
91  
92  /*
93   * pvr_init() / pvr_exit()
94   *
95   * This code is run to initialize/exit the driver.
96   *
97   */
pvr_init(void)98  static int __init pvr_init(void)
99  {
100  	int ret;
101  
102  	pvr2_trace(PVR2_TRACE_INIT,"pvr_init");
103  
104  	ret = pvr2_context_global_init();
105  	if (ret != 0) {
106  		pvr2_trace(PVR2_TRACE_INIT,"pvr_init failure code=%d",ret);
107  		return ret;
108  	}
109  
110  	pvr2_sysfs_class_create();
111  
112  	ret = usb_register(&pvr_driver);
113  
114  	if (ret == 0)
115  		pr_info("pvrusb2: " DRIVER_VERSION ":"
116  		       DRIVER_DESC "\n");
117  	if (pvrusb2_debug)
118  		pr_info("pvrusb2: Debug mask is %d (0x%x)\n",
119  		       pvrusb2_debug,pvrusb2_debug);
120  
121  	pvr2_trace(PVR2_TRACE_INIT,"pvr_init complete");
122  
123  	return ret;
124  }
125  
pvr_exit(void)126  static void __exit pvr_exit(void)
127  {
128  	pvr2_trace(PVR2_TRACE_INIT,"pvr_exit");
129  
130  	usb_deregister(&pvr_driver);
131  
132  	pvr2_context_global_done();
133  
134  	pvr2_sysfs_class_destroy();
135  
136  	pvr2_trace(PVR2_TRACE_INIT,"pvr_exit complete");
137  }
138  
139  module_init(pvr_init);
140  module_exit(pvr_exit);
141  
142  MODULE_AUTHOR(DRIVER_AUTHOR);
143  MODULE_DESCRIPTION(DRIVER_DESC);
144  MODULE_LICENSE("GPL");
145  MODULE_VERSION("0.9.1");
146