1d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* 2d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * 3d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * 4d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * Copyright (C) 2005 Mike Isely <isely@pobox.com> 5d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * Copyright (C) 2004 Aurelien Alleaume <slts@free.fr> 6d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * 7d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * This program is free software; you can redistribute it and/or modify 8d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * it under the terms of the GNU General Public License as published by 9d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * the Free Software Foundation; either version 2 of the License 10d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * 11d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * This program is distributed in the hope that it will be useful, 12d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * but WITHOUT ANY WARRANTY; without even the implied warranty of 13d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * GNU General Public License for more details. 15d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * 16d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * You should have received a copy of the GNU General Public License 17d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * along with this program; if not, write to the Free Software 18d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * 20d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely */ 21d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 22d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include <linux/kernel.h> 23d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include <linux/errno.h> 24d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include <linux/module.h> 25d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include <linux/usb.h> 26d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include <linux/videodev2.h> 27d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 28d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include "pvrusb2-hdw.h" 29989eb154eafad00c3b5039a3eca03e108dac1df8Mike Isely#include "pvrusb2-devattr.h" 30d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include "pvrusb2-context.h" 31d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include "pvrusb2-debug.h" 32d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include "pvrusb2-v4l2.h" 33d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#ifdef CONFIG_VIDEO_PVRUSB2_SYSFS 34d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include "pvrusb2-sysfs.h" 35d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */ 36d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 37d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#define DRIVER_AUTHOR "Mike Isely <isely@pobox.com>" 38d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#define DRIVER_DESC "Hauppauge WinTV-PVR-USB2 MPEG2 Encoder/Tuner" 39d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#define DRIVER_VERSION "V4L in-tree version" 40d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 41d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#define DEFAULT_DEBUG_MASK (PVR2_TRACE_ERROR_LEGS| \ 42d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely PVR2_TRACE_INFO| \ 4356585386e297c54a65feef55810c13b4313bdf1eMike Isely PVR2_TRACE_STD| \ 44d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely PVR2_TRACE_TOLERANCE| \ 45d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely PVR2_TRACE_TRAP| \ 46d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 0) 47d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 48d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyint pvrusb2_debug = DEFAULT_DEBUG_MASK; 49d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 50d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselymodule_param_named(debug,pvrusb2_debug,int,S_IRUGO|S_IWUSR); 51d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike IselyMODULE_PARM_DESC(debug, "Debug trace mask"); 52d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 53d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#ifdef CONFIG_VIDEO_PVRUSB2_SYSFS 54a0fd1cb171e8b17339a9a18ae7cf09c50022010fMike Iselystatic struct pvr2_sysfs_class *class_ptr = NULL; 55d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */ 56d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 57d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic void pvr_setup_attach(struct pvr2_context *pvr) 58d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{ 59d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely /* Create association with v4l layer */ 60d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr2_v4l2_create(pvr); 6104910bdc5c172af9bc937a8869e7f2907db4443fMichael Krufky#ifdef CONFIG_VIDEO_PVRUSB2_DVB 6204910bdc5c172af9bc937a8869e7f2907db4443fMichael Krufky /* Create association with dvb layer */ 63c5317b17f6ca74531a6c707873dc5d25f1877ac3Mike Isely pvr2_dvb_create(pvr); 6404910bdc5c172af9bc937a8869e7f2907db4443fMichael Krufky#endif 65d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#ifdef CONFIG_VIDEO_PVRUSB2_SYSFS 66d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr2_sysfs_create(pvr,class_ptr); 67d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */ 68d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely} 69d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 70d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic int pvr_probe(struct usb_interface *intf, 71d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely const struct usb_device_id *devid) 72d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{ 73d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely struct pvr2_context *pvr; 74d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 75d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely /* Create underlying hardware interface */ 76d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr = pvr2_context_create(intf,devid,pvr_setup_attach); 77d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely if (!pvr) { 78d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr2_trace(PVR2_TRACE_ERROR_LEGS, 79d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely "Failed to create hdw handler"); 80d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely return -ENOMEM; 81d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely } 82d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 83d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr2_trace(PVR2_TRACE_INIT,"pvr_probe(pvr=%p)",pvr); 84d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 85d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely usb_set_intfdata(intf, pvr); 86d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 87d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely return 0; 88d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely} 89d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 90d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* 91d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * pvr_disconnect() 92d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * 93d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely */ 94d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic void pvr_disconnect(struct usb_interface *intf) 95d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{ 96d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely struct pvr2_context *pvr = usb_get_intfdata(intf); 97d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 98d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr2_trace(PVR2_TRACE_INIT,"pvr_disconnect(pvr=%p) BEGIN",pvr); 99d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 100d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely usb_set_intfdata (intf, NULL); 101d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr2_context_disconnect(pvr); 102d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 103d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr2_trace(PVR2_TRACE_INIT,"pvr_disconnect(pvr=%p) DONE",pvr); 104d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 105d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely} 106d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 107d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic struct usb_driver pvr_driver = { 108a0fd1cb171e8b17339a9a18ae7cf09c50022010fMike Isely .name = "pvrusb2", 109a0fd1cb171e8b17339a9a18ae7cf09c50022010fMike Isely .id_table = pvr2_device_table, 110a0fd1cb171e8b17339a9a18ae7cf09c50022010fMike Isely .probe = pvr_probe, 111a0fd1cb171e8b17339a9a18ae7cf09c50022010fMike Isely .disconnect = pvr_disconnect 112d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely}; 113d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 114d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* 115d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * pvr_init() / pvr_exit() 116d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * 117d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * This code is run to initialize/exit the driver. 118d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely * 119d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely */ 120d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic int __init pvr_init(void) 121d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{ 122d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely int ret; 123d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 124d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr2_trace(PVR2_TRACE_INIT,"pvr_init"); 125d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 126e5be15c63804e05b5a94197524023702a259e308Mike Isely ret = pvr2_context_global_init(); 127e5be15c63804e05b5a94197524023702a259e308Mike Isely if (ret != 0) { 128e5be15c63804e05b5a94197524023702a259e308Mike Isely pvr2_trace(PVR2_TRACE_INIT,"pvr_init failure code=%d",ret); 129e5be15c63804e05b5a94197524023702a259e308Mike Isely return ret; 130e5be15c63804e05b5a94197524023702a259e308Mike Isely } 131e5be15c63804e05b5a94197524023702a259e308Mike Isely 132d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#ifdef CONFIG_VIDEO_PVRUSB2_SYSFS 133d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely class_ptr = pvr2_sysfs_class_create(); 134d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */ 135d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 136d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely ret = usb_register(&pvr_driver); 137d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 138d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely if (ret == 0) 13994b5ff9cf3edf06e0666fea87398a7fff98a15a4Mike Isely printk(KERN_INFO "pvrusb2: " DRIVER_VERSION ":" 140a482f327ff56bc3cf53176a7eb736cea47291a1dGreg Kroah-Hartman DRIVER_DESC "\n"); 141a482f327ff56bc3cf53176a7eb736cea47291a1dGreg Kroah-Hartman if (pvrusb2_debug) 14294b5ff9cf3edf06e0666fea87398a7fff98a15a4Mike Isely printk(KERN_INFO "pvrusb2: Debug mask is %d (0x%x)\n", 143a482f327ff56bc3cf53176a7eb736cea47291a1dGreg Kroah-Hartman pvrusb2_debug,pvrusb2_debug); 144d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 145e5be15c63804e05b5a94197524023702a259e308Mike Isely pvr2_trace(PVR2_TRACE_INIT,"pvr_init complete"); 146e5be15c63804e05b5a94197524023702a259e308Mike Isely 147d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely return ret; 148d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely} 149d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 150d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic void __exit pvr_exit(void) 151d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{ 152d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr2_trace(PVR2_TRACE_INIT,"pvr_exit"); 153d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 1544f663bdc65307e38401aa3b787a7a7569f28b920Mike Isely usb_deregister(&pvr_driver); 1554f663bdc65307e38401aa3b787a7a7569f28b920Mike Isely 156e3a5ee73e7223cda78f2770572c5ad01928496d6Mike Isely pvr2_context_global_done(); 157e3a5ee73e7223cda78f2770572c5ad01928496d6Mike Isely 158d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#ifdef CONFIG_VIDEO_PVRUSB2_SYSFS 159d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely pvr2_sysfs_class_destroy(class_ptr); 160d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */ 161e5be15c63804e05b5a94197524023702a259e308Mike Isely 162e5be15c63804e05b5a94197524023702a259e308Mike Isely pvr2_trace(PVR2_TRACE_INIT,"pvr_exit complete"); 163d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely} 164d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 165d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselymodule_init(pvr_init); 166d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselymodule_exit(pvr_exit); 167d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 168d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike IselyMODULE_AUTHOR(DRIVER_AUTHOR); 169d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike IselyMODULE_DESCRIPTION(DRIVER_DESC); 170d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike IselyMODULE_LICENSE("GPL"); 171083774d8b164b87c5595ead0b752236cfd5bf761Mauro Carvalho ChehabMODULE_VERSION("0.9.1"); 172d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 173d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely 174d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/* 175d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely Stuff for Emacs to see, in order to encourage consistent editing style: 176d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *** Local Variables: *** 177d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *** mode: c *** 178d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *** fill-column: 70 *** 179d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *** tab-width: 8 *** 180d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *** c-basic-offset: 8 *** 181d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *** End: *** 182d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely */ 183