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