xref: /openbmc/linux/drivers/gpu/drm/udl/udl_drv.h (revision 1b8db07f)
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 
17*72d73dd3SThomas Zimmermann #include <drm/drm_connector.h>
18*72d73dd3SThomas Zimmermann #include <drm/drm_crtc.h>
19a9dcf380SSam Ravnborg #include <drm/drm_device.h>
20*72d73dd3SThomas Zimmermann #include <drm/drm_encoder.h>
21a9dcf380SSam Ravnborg #include <drm/drm_framebuffer.h>
22a9dcf380SSam Ravnborg #include <drm/drm_gem.h>
23*72d73dd3SThomas Zimmermann #include <drm/drm_plane.h>
24a9dcf380SSam Ravnborg 
25a9dcf380SSam Ravnborg struct drm_mode_create_dumb;
265320918bSDave Airlie 
275320918bSDave Airlie #define DRIVER_NAME		"udl"
285320918bSDave Airlie #define DRIVER_DESC		"DisplayLink"
295320918bSDave Airlie #define DRIVER_DATE		"20120220"
305320918bSDave Airlie 
315320918bSDave Airlie #define DRIVER_MAJOR		0
325320918bSDave Airlie #define DRIVER_MINOR		0
335320918bSDave Airlie #define DRIVER_PATCHLEVEL	1
345320918bSDave Airlie 
355320918bSDave Airlie struct udl_device;
365320918bSDave Airlie 
375320918bSDave Airlie struct urb_node {
385320918bSDave Airlie 	struct list_head entry;
395320918bSDave Airlie 	struct udl_device *dev;
405320918bSDave Airlie 	struct urb *urb;
415320918bSDave Airlie };
425320918bSDave Airlie 
435320918bSDave Airlie struct urb_list {
445320918bSDave Airlie 	struct list_head list;
455320918bSDave Airlie 	spinlock_t lock;
46acd45c56STakashi Iwai 	wait_queue_head_t sleep;
475320918bSDave Airlie 	int available;
485320918bSDave Airlie 	int count;
495320918bSDave Airlie 	size_t size;
505320918bSDave Airlie };
515320918bSDave Airlie 
520862cfd3SThomas Zimmermann struct udl_connector {
530862cfd3SThomas Zimmermann 	struct drm_connector connector;
540862cfd3SThomas Zimmermann 	/* last udl_detect edid */
550862cfd3SThomas Zimmermann 	struct edid *edid;
560862cfd3SThomas Zimmermann };
570862cfd3SThomas Zimmermann 
to_udl_connector(struct drm_connector * connector)580862cfd3SThomas Zimmermann static inline struct udl_connector *to_udl_connector(struct drm_connector *connector)
590862cfd3SThomas Zimmermann {
600862cfd3SThomas Zimmermann 	return container_of(connector, struct udl_connector, connector);
610862cfd3SThomas Zimmermann }
620862cfd3SThomas Zimmermann 
635320918bSDave Airlie struct udl_device {
646ecac85eSDave Airlie 	struct drm_device drm;
655320918bSDave Airlie 	struct device *dev;
66659ab7a4SThomas Zimmermann 	struct device *dmadev;
679fda81e0SThomas Zimmermann 
68*72d73dd3SThomas Zimmermann 	struct drm_plane primary_plane;
69*72d73dd3SThomas Zimmermann 	struct drm_crtc crtc;
70*72d73dd3SThomas Zimmermann 	struct drm_encoder encoder;
715320918bSDave Airlie 
72ae358dacSDaniel Vetter 	struct mutex gem_lock;
73ae358dacSDaniel Vetter 
745320918bSDave Airlie 	int sku_pixel_limit;
755320918bSDave Airlie 
765320918bSDave Airlie 	struct urb_list urbs;
775320918bSDave Airlie };
785320918bSDave Airlie 
796ecac85eSDave Airlie #define to_udl(x) container_of(x, struct udl_device, drm)
80fd96e0dbSDave Airlie 
udl_to_usb_device(struct udl_device * udl)813fb91f56SThomas Zimmermann static inline struct usb_device *udl_to_usb_device(struct udl_device *udl)
823fb91f56SThomas Zimmermann {
833fb91f56SThomas Zimmermann 	return interface_to_usbdev(to_usb_interface(udl->drm.dev));
843fb91f56SThomas Zimmermann }
853fb91f56SThomas Zimmermann 
865320918bSDave Airlie /* modeset */
875320918bSDave Airlie int udl_modeset_init(struct drm_device *dev);
88e829cf0bSThomas Zimmermann struct drm_connector *udl_connector_init(struct drm_device *dev);
895320918bSDave Airlie 
90c5c354a3STakashi Iwai struct urb *udl_get_urb(struct drm_device *dev);
915320918bSDave Airlie 
925320918bSDave Airlie int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len);
93fa47573bSTakashi Iwai void udl_sync_pending_urbs(struct drm_device *dev);
945320918bSDave Airlie void udl_urb_completion(struct urb *urb);
955320918bSDave Airlie 
966ecac85eSDave Airlie int udl_init(struct udl_device *udl);
975320918bSDave Airlie 
9891ba11fbSMikulas Patocka int udl_render_hline(struct drm_device *dev, int log_bpp, struct urb **urb_ptr,
995320918bSDave Airlie 		     const char *front, char **urb_buf_ptr,
100d15e35daSThomas Zimmermann 		     u32 byte_offset, u32 device_byte_offset, u32 byte_width);
1015320918bSDave Airlie 
1025320918bSDave Airlie int udl_drop_usb(struct drm_device *dev);
1031ceef996SThomas Zimmermann int udl_select_std_channel(struct udl_device *udl);
1045320918bSDave Airlie 
1055320918bSDave Airlie #endif
106