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