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 delayed_work release_urb_work; 385320918bSDave Airlie struct urb *urb; 395320918bSDave Airlie }; 405320918bSDave Airlie 415320918bSDave Airlie struct urb_list { 425320918bSDave Airlie struct list_head list; 435320918bSDave Airlie spinlock_t lock; 445320918bSDave Airlie struct semaphore limit_sem; 455320918bSDave Airlie int available; 465320918bSDave Airlie int count; 475320918bSDave Airlie size_t size; 485320918bSDave Airlie }; 495320918bSDave Airlie 505320918bSDave Airlie struct udl_device { 516ecac85eSDave Airlie struct drm_device drm; 525320918bSDave Airlie struct device *dev; 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 68*3fb91f56SThomas Zimmermann static inline struct usb_device *udl_to_usb_device(struct udl_device *udl) 69*3fb91f56SThomas Zimmermann { 70*3fb91f56SThomas Zimmermann return interface_to_usbdev(to_usb_interface(udl->drm.dev)); 71*3fb91f56SThomas Zimmermann } 72*3fb91f56SThomas 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 775320918bSDave Airlie struct urb *udl_get_urb(struct drm_device *dev); 785320918bSDave Airlie 795320918bSDave Airlie int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len); 805320918bSDave Airlie void udl_urb_completion(struct urb *urb); 815320918bSDave Airlie 826ecac85eSDave Airlie int udl_init(struct udl_device *udl); 835320918bSDave Airlie 8491ba11fbSMikulas Patocka int udl_render_hline(struct drm_device *dev, int log_bpp, struct urb **urb_ptr, 855320918bSDave Airlie const char *front, char **urb_buf_ptr, 86d15e35daSThomas Zimmermann u32 byte_offset, u32 device_byte_offset, u32 byte_width); 875320918bSDave Airlie 885320918bSDave Airlie int udl_drop_usb(struct drm_device *dev); 895320918bSDave Airlie 905320918bSDave Airlie #define CMD_WRITE_RAW8 "\xAF\x60" /**< 8 bit raw write command. */ 915320918bSDave Airlie #define CMD_WRITE_RL8 "\xAF\x61" /**< 8 bit run length command. */ 925320918bSDave Airlie #define CMD_WRITE_COPY8 "\xAF\x62" /**< 8 bit copy command. */ 935320918bSDave Airlie #define CMD_WRITE_RLX8 "\xAF\x63" /**< 8 bit extended run length command. */ 945320918bSDave Airlie 955320918bSDave Airlie #define CMD_WRITE_RAW16 "\xAF\x68" /**< 16 bit raw write command. */ 965320918bSDave Airlie #define CMD_WRITE_RL16 "\xAF\x69" /**< 16 bit run length command. */ 975320918bSDave Airlie #define CMD_WRITE_COPY16 "\xAF\x6A" /**< 16 bit copy command. */ 985320918bSDave Airlie #define CMD_WRITE_RLX16 "\xAF\x6B" /**< 16 bit extended run length command. */ 995320918bSDave Airlie 100997d33c3SThomas Zimmermann /* On/Off for driving the DisplayLink framebuffer to the display */ 101997d33c3SThomas Zimmermann #define UDL_REG_BLANK_MODE 0x1f 102997d33c3SThomas Zimmermann 103997d33c3SThomas Zimmermann #define UDL_BLANK_MODE_ON 0x00 /* hsync and vsync on, visible */ 104997d33c3SThomas Zimmermann #define UDL_BLANK_MODE_BLANKED 0x01 /* hsync and vsync on, blanked */ 105997d33c3SThomas Zimmermann #define UDL_BLANK_MODE_VSYNC_OFF 0x03 /* vsync off, blanked */ 106997d33c3SThomas Zimmermann #define UDL_BLANK_MODE_HSYNC_OFF 0x05 /* hsync off, blanked */ 107997d33c3SThomas Zimmermann #define UDL_BLANK_MODE_POWERDOWN 0x07 /* powered off; requires modeset */ 108997d33c3SThomas Zimmermann 1095320918bSDave Airlie #endif 110