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