162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2012 Red Hat 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * based in parts on udlfb.c: 662306a36Sopenharmony_ci * Copyright (C) 2009 Roberto De Ioris <roberto@unbit.it> 762306a36Sopenharmony_ci * Copyright (C) 2009 Jaya Kumar <jayakumar.lkml@gmail.com> 862306a36Sopenharmony_ci * Copyright (C) 2009 Bernie Thompson <bernie@plugable.com> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifndef UDL_DRV_H 1262306a36Sopenharmony_ci#define UDL_DRV_H 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/mm_types.h> 1562306a36Sopenharmony_ci#include <linux/usb.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include <drm/drm_connector.h> 1862306a36Sopenharmony_ci#include <drm/drm_crtc.h> 1962306a36Sopenharmony_ci#include <drm/drm_device.h> 2062306a36Sopenharmony_ci#include <drm/drm_encoder.h> 2162306a36Sopenharmony_ci#include <drm/drm_framebuffer.h> 2262306a36Sopenharmony_ci#include <drm/drm_gem.h> 2362306a36Sopenharmony_ci#include <drm/drm_plane.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistruct drm_mode_create_dumb; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define DRIVER_NAME "udl" 2862306a36Sopenharmony_ci#define DRIVER_DESC "DisplayLink" 2962306a36Sopenharmony_ci#define DRIVER_DATE "20120220" 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define DRIVER_MAJOR 0 3262306a36Sopenharmony_ci#define DRIVER_MINOR 0 3362306a36Sopenharmony_ci#define DRIVER_PATCHLEVEL 1 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistruct udl_device; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistruct urb_node { 3862306a36Sopenharmony_ci struct list_head entry; 3962306a36Sopenharmony_ci struct udl_device *dev; 4062306a36Sopenharmony_ci struct urb *urb; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct urb_list { 4462306a36Sopenharmony_ci struct list_head list; 4562306a36Sopenharmony_ci spinlock_t lock; 4662306a36Sopenharmony_ci wait_queue_head_t sleep; 4762306a36Sopenharmony_ci int available; 4862306a36Sopenharmony_ci int count; 4962306a36Sopenharmony_ci size_t size; 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct udl_connector { 5362306a36Sopenharmony_ci struct drm_connector connector; 5462306a36Sopenharmony_ci /* last udl_detect edid */ 5562306a36Sopenharmony_ci struct edid *edid; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic inline struct udl_connector *to_udl_connector(struct drm_connector *connector) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci return container_of(connector, struct udl_connector, connector); 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct udl_device { 6462306a36Sopenharmony_ci struct drm_device drm; 6562306a36Sopenharmony_ci struct device *dev; 6662306a36Sopenharmony_ci struct device *dmadev; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci struct drm_plane primary_plane; 6962306a36Sopenharmony_ci struct drm_crtc crtc; 7062306a36Sopenharmony_ci struct drm_encoder encoder; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci struct mutex gem_lock; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci int sku_pixel_limit; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci struct urb_list urbs; 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#define to_udl(x) container_of(x, struct udl_device, drm) 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic inline struct usb_device *udl_to_usb_device(struct udl_device *udl) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci return interface_to_usbdev(to_usb_interface(udl->drm.dev)); 8462306a36Sopenharmony_ci} 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/* modeset */ 8762306a36Sopenharmony_ciint udl_modeset_init(struct drm_device *dev); 8862306a36Sopenharmony_cistruct drm_connector *udl_connector_init(struct drm_device *dev); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistruct urb *udl_get_urb(struct drm_device *dev); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ciint udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len); 9362306a36Sopenharmony_civoid udl_sync_pending_urbs(struct drm_device *dev); 9462306a36Sopenharmony_civoid udl_urb_completion(struct urb *urb); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ciint udl_init(struct udl_device *udl); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ciint udl_render_hline(struct drm_device *dev, int log_bpp, struct urb **urb_ptr, 9962306a36Sopenharmony_ci const char *front, char **urb_buf_ptr, 10062306a36Sopenharmony_ci u32 byte_offset, u32 device_byte_offset, u32 byte_width); 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ciint udl_drop_usb(struct drm_device *dev); 10362306a36Sopenharmony_ciint udl_select_std_channel(struct udl_device *udl); 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#endif 106