112eb90f1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 25320918bSDave Airlie /* 35320918bSDave Airlie * Copyright (C) 2012 Red Hat 45320918bSDave Airlie * 55320918bSDave Airlie * based in parts on udlfb.c: 65320918bSDave Airlie * Copyright (C) 2009 Roberto De Ioris <roberto@unbit.it> 75320918bSDave Airlie * Copyright (C) 2009 Jaya Kumar <jayakumar.lkml@gmail.com> 85320918bSDave Airlie * Copyright (C) 2009 Bernie Thompson <bernie@plugable.com> 95320918bSDave Airlie */ 105320918bSDave Airlie 115320918bSDave Airlie #ifndef UDL_DRV_H 125320918bSDave Airlie #define UDL_DRV_H 135320918bSDave Airlie 143c5f134aSSouptick Joarder #include <linux/mm_types.h> 15a9dcf380SSam Ravnborg #include <linux/usb.h> 16a9dcf380SSam Ravnborg 17a9dcf380SSam Ravnborg #include <drm/drm_device.h> 18a9dcf380SSam Ravnborg #include <drm/drm_framebuffer.h> 19a9dcf380SSam Ravnborg #include <drm/drm_gem.h> 209fda81e0SThomas Zimmermann #include <drm/drm_simple_kms_helper.h> 21a9dcf380SSam Ravnborg 22a9dcf380SSam Ravnborg struct drm_mode_create_dumb; 235320918bSDave Airlie 245320918bSDave Airlie #define DRIVER_NAME "udl" 255320918bSDave Airlie #define DRIVER_DESC "DisplayLink" 265320918bSDave Airlie #define DRIVER_DATE "20120220" 275320918bSDave Airlie 285320918bSDave Airlie #define DRIVER_MAJOR 0 295320918bSDave Airlie #define DRIVER_MINOR 0 305320918bSDave Airlie #define DRIVER_PATCHLEVEL 1 315320918bSDave Airlie 325320918bSDave Airlie struct udl_device; 335320918bSDave Airlie 345320918bSDave Airlie struct urb_node { 355320918bSDave Airlie struct list_head entry; 365320918bSDave Airlie struct udl_device *dev; 375320918bSDave Airlie struct urb *urb; 385320918bSDave Airlie }; 395320918bSDave Airlie 405320918bSDave Airlie struct urb_list { 415320918bSDave Airlie struct list_head list; 425320918bSDave Airlie spinlock_t lock; 43*acd45c56STakashi Iwai wait_queue_head_t sleep; 445320918bSDave Airlie int available; 455320918bSDave Airlie int count; 465320918bSDave Airlie size_t size; 475320918bSDave Airlie }; 485320918bSDave Airlie 495320918bSDave Airlie struct udl_device { 506ecac85eSDave Airlie struct drm_device drm; 515320918bSDave Airlie struct device *dev; 52659ab7a4SThomas Zimmermann struct device *dmadev; 539fda81e0SThomas Zimmermann 549fda81e0SThomas Zimmermann struct drm_simple_display_pipe display_pipe; 555320918bSDave Airlie 56ae358dacSDaniel Vetter struct mutex gem_lock; 57ae358dacSDaniel Vetter 585320918bSDave Airlie int sku_pixel_limit; 595320918bSDave Airlie 605320918bSDave Airlie struct urb_list urbs; 615320918bSDave Airlie 625320918bSDave Airlie char mode_buf[1024]; 635320918bSDave Airlie uint32_t mode_buf_len; 645320918bSDave Airlie }; 655320918bSDave Airlie 666ecac85eSDave Airlie #define to_udl(x) container_of(x, struct udl_device, drm) 67fd96e0dbSDave Airlie 683fb91f56SThomas Zimmermann static inline struct usb_device *udl_to_usb_device(struct udl_device *udl) 693fb91f56SThomas Zimmermann { 703fb91f56SThomas Zimmermann return interface_to_usbdev(to_usb_interface(udl->drm.dev)); 713fb91f56SThomas Zimmermann } 723fb91f56SThomas Zimmermann 735320918bSDave Airlie /* modeset */ 745320918bSDave Airlie int udl_modeset_init(struct drm_device *dev); 75e829cf0bSThomas Zimmermann struct drm_connector *udl_connector_init(struct drm_device *dev); 765320918bSDave Airlie 77*acd45c56STakashi Iwai struct urb *udl_get_urb_timeout(struct drm_device *dev, long timeout); 78*acd45c56STakashi Iwai 79*acd45c56STakashi Iwai #define GET_URB_TIMEOUT HZ 80*acd45c56STakashi Iwai static inline struct urb *udl_get_urb(struct drm_device *dev) 81*acd45c56STakashi Iwai { 82*acd45c56STakashi Iwai return udl_get_urb_timeout(dev, GET_URB_TIMEOUT); 83*acd45c56STakashi Iwai } 845320918bSDave Airlie 855320918bSDave Airlie int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len); 865320918bSDave Airlie void udl_urb_completion(struct urb *urb); 875320918bSDave Airlie 886ecac85eSDave Airlie int udl_init(struct udl_device *udl); 895320918bSDave Airlie 9091ba11fbSMikulas Patocka int udl_render_hline(struct drm_device *dev, int log_bpp, struct urb **urb_ptr, 915320918bSDave Airlie const char *front, char **urb_buf_ptr, 92d15e35daSThomas Zimmermann u32 byte_offset, u32 device_byte_offset, u32 byte_width); 935320918bSDave Airlie 945320918bSDave Airlie int udl_drop_usb(struct drm_device *dev); 955320918bSDave Airlie 965320918bSDave Airlie #define CMD_WRITE_RAW8 "\xAF\x60" /**< 8 bit raw write command. */ 975320918bSDave Airlie #define CMD_WRITE_RL8 "\xAF\x61" /**< 8 bit run length command. */ 985320918bSDave Airlie #define CMD_WRITE_COPY8 "\xAF\x62" /**< 8 bit copy command. */ 995320918bSDave Airlie #define CMD_WRITE_RLX8 "\xAF\x63" /**< 8 bit extended run length command. */ 1005320918bSDave Airlie 1015320918bSDave Airlie #define CMD_WRITE_RAW16 "\xAF\x68" /**< 16 bit raw write command. */ 1025320918bSDave Airlie #define CMD_WRITE_RL16 "\xAF\x69" /**< 16 bit run length command. */ 1035320918bSDave Airlie #define CMD_WRITE_COPY16 "\xAF\x6A" /**< 16 bit copy command. */ 1045320918bSDave Airlie #define CMD_WRITE_RLX16 "\xAF\x6B" /**< 16 bit extended run length command. */ 1055320918bSDave Airlie 106997d33c3SThomas Zimmermann /* On/Off for driving the DisplayLink framebuffer to the display */ 107997d33c3SThomas Zimmermann #define UDL_REG_BLANK_MODE 0x1f 108997d33c3SThomas Zimmermann 109997d33c3SThomas Zimmermann #define UDL_BLANK_MODE_ON 0x00 /* hsync and vsync on, visible */ 110997d33c3SThomas Zimmermann #define UDL_BLANK_MODE_BLANKED 0x01 /* hsync and vsync on, blanked */ 111997d33c3SThomas Zimmermann #define UDL_BLANK_MODE_VSYNC_OFF 0x03 /* vsync off, blanked */ 112997d33c3SThomas Zimmermann #define UDL_BLANK_MODE_HSYNC_OFF 0x05 /* hsync off, blanked */ 113997d33c3SThomas Zimmermann #define UDL_BLANK_MODE_POWERDOWN 0x07 /* powered off; requires modeset */ 114997d33c3SThomas Zimmermann 1155320918bSDave Airlie #endif 116