File Index
Files and directories
Sign in
FILE

pvrusb2-main.c

File preview with syntax highlighting.

linux-6.19.14/drivers/media/usb/pvrusb2/pvrusb2-main.c C
  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
 32int pvrusb2_debug = DEFAULT_DEBUG_MASK;
 33
 34module_param_named(debug,pvrusb2_debug,int,S_IRUGO|S_IWUSR);
 35MODULE_PARM_DESC(debug, "Debug trace mask");
 36
 37static 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
 48static 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 */
 72static 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
 85static 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 */
 98static 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
126static 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
139module_init(pvr_init);
140module_exit(pvr_exit);
141
142MODULE_AUTHOR(DRIVER_AUTHOR);
143MODULE_DESCRIPTION(DRIVER_DESC);
144MODULE_LICENSE("GPL");
145MODULE_VERSION("0.9.1");
~/ Read-only file preview.