2010-12-15 07:14:24 +10:00
/*
* Copyright ( C ) 2012 Red Hat
*
* This file is subject to the terms and conditions of the GNU General Public
* License v2 . See the file COPYING in the main directory of this archive for
* more details .
*/
# include <linux/module.h>
2014-08-29 12:12:45 +02:00
# include <drm/drmP.h>
2012-10-02 18:01:07 +01:00
# include <drm/drm_crtc_helper.h>
2010-12-15 07:14:24 +10:00
# include "udl_drv.h"
2016-08-30 14:50:21 -07:00
static int udl_usb_suspend ( struct usb_interface * interface ,
pm_message_t message )
{
return 0 ;
}
static int udl_usb_resume ( struct usb_interface * interface )
{
struct drm_device * dev = usb_get_intfdata ( interface ) ;
udl_modeset_restore ( dev ) ;
return 0 ;
}
2012-05-17 13:27:22 +02:00
static const struct vm_operations_struct udl_gem_vm_ops = {
2010-12-15 07:14:24 +10:00
. fault = udl_gem_fault ,
. open = drm_gem_vm_open ,
. close = drm_gem_vm_close ,
} ;
static const struct file_operations udl_driver_fops = {
. owner = THIS_MODULE ,
. open = drm_open ,
2012-03-31 13:29:25 +04:00
. mmap = udl_drm_gem_mmap ,
2010-12-15 07:14:24 +10:00
. poll = drm_poll ,
. read = drm_read ,
. unlocked_ioctl = drm_ioctl ,
. release = drm_release ,
2012-07-09 15:40:07 -07:00
. compat_ioctl = drm_compat_ioctl ,
2010-12-15 07:14:24 +10:00
. llseek = noop_llseek ,
} ;
static struct drm_driver driver = {
2011-12-21 11:23:44 +00:00
. driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME ,
2010-12-15 07:14:24 +10:00
. load = udl_driver_load ,
. unload = udl_driver_unload ,
/* gem hooks */
. gem_free_object = udl_gem_free_object ,
. gem_vm_ops = & udl_gem_vm_ops ,
. dumb_create = udl_dumb_create ,
. dumb_map_offset = udl_gem_mmap ,
. fops = & udl_driver_fops ,
2011-12-21 11:23:44 +00:00
2014-11-12 18:33:53 -08:00
. prime_handle_to_fd = drm_gem_prime_handle_to_fd ,
2011-12-21 11:23:44 +00:00
. prime_fd_to_handle = drm_gem_prime_fd_to_handle ,
2014-11-12 18:33:53 -08:00
. gem_prime_export = udl_gem_prime_export ,
2011-12-21 11:23:44 +00:00
. gem_prime_import = udl_gem_prime_import ,
2010-12-15 07:14:24 +10:00
. name = DRIVER_NAME ,
. desc = DRIVER_DESC ,
. date = DRIVER_DATE ,
. major = DRIVER_MAJOR ,
. minor = DRIVER_MINOR ,
. patchlevel = DRIVER_PATCHLEVEL ,
} ;
2014-08-29 12:12:45 +02:00
static int udl_usb_probe ( struct usb_interface * interface ,
const struct usb_device_id * id )
{
struct usb_device * udev = interface_to_usbdev ( interface ) ;
struct drm_device * dev ;
int r ;
dev = drm_dev_alloc ( & driver , & interface - > dev ) ;
2016-09-21 16:59:19 +02:00
if ( IS_ERR ( dev ) )
return PTR_ERR ( dev ) ;
2014-08-29 12:12:45 +02:00
r = drm_dev_register ( dev , ( unsigned long ) udev ) ;
if ( r )
goto err_free ;
usb_set_intfdata ( interface , dev ) ;
DRM_INFO ( " Initialized udl on minor %d \n " , dev - > primary - > index ) ;
return 0 ;
err_free :
drm_dev_unref ( dev ) ;
return r ;
}
static void udl_usb_disconnect ( struct usb_interface * interface )
{
struct drm_device * dev = usb_get_intfdata ( interface ) ;
drm_kms_helper_poll_disable ( dev ) ;
udl_fbdev_unplug ( dev ) ;
udl_drop_usb ( dev ) ;
2017-08-02 13:56:02 +02:00
drm_dev_unplug ( dev ) ;
2014-08-29 12:12:45 +02:00
}
/*
* There are many DisplayLink - based graphics products , all with unique PIDs .
* So we match on DisplayLink ' s VID + Vendor - Defined Interface Class ( 0xff )
* We also require a match on SubClass ( 0x00 ) and Protocol ( 0x00 ) ,
* which is compatible with all known USB 2.0 era graphics chips and firmware ,
* but allows DisplayLink to increment those for any future incompatible chips
*/
2017-08-12 14:05:19 +05:30
static const struct usb_device_id id_table [ ] = {
2014-08-29 12:12:45 +02:00
{ . idVendor = 0x17e9 , . bInterfaceClass = 0xff ,
. bInterfaceSubClass = 0x00 ,
. bInterfaceProtocol = 0x00 ,
. match_flags = USB_DEVICE_ID_MATCH_VENDOR |
USB_DEVICE_ID_MATCH_INT_CLASS |
USB_DEVICE_ID_MATCH_INT_SUBCLASS |
USB_DEVICE_ID_MATCH_INT_PROTOCOL , } ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( usb , id_table ) ;
2010-12-15 07:14:24 +10:00
static struct usb_driver udl_driver = {
. name = " udl " ,
. probe = udl_usb_probe ,
. disconnect = udl_usb_disconnect ,
2016-08-30 14:50:21 -07:00
. suspend = udl_usb_suspend ,
. resume = udl_usb_resume ,
2010-12-15 07:14:24 +10:00
. id_table = id_table ,
} ;
2016-02-17 17:43:27 +05:30
module_usb_driver ( udl_driver ) ;
2014-08-29 12:12:45 +02:00
MODULE_LICENSE ( " GPL " ) ;