Commit 0b4346d6 authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

drm/udl: Improve type safety when using struct udl_device



Push upcasts from struct drm_device to struct udl_device outwards
in the call chain; cast earlier and call functions with the upcasted
value. Improves type safety.

Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Link: https://lore.kernel.org/r/20250410105948.25463-4-tzimmermann@suse.de
parent 21c6b386
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -22,13 +22,14 @@ static int udl_usb_suspend(struct usb_interface *interface,
			   pm_message_t message)
{
	struct drm_device *dev = usb_get_intfdata(interface);
	struct udl_device *udl = to_udl(dev);
	int ret;

	ret = drm_mode_config_helper_suspend(dev);
	if (ret)
		return ret;

	udl_sync_pending_urbs(dev);
	udl_sync_pending_urbs(udl);
	return 0;
}

@@ -109,9 +110,10 @@ static int udl_usb_probe(struct usb_interface *interface,
static void udl_usb_disconnect(struct usb_interface *interface)
{
	struct drm_device *dev = usb_get_intfdata(interface);
	struct udl_device *udl = to_udl(dev);

	drm_dev_unplug(dev);
	udl_drop_usb(dev);
	udl_drop_usb(udl);
}

/*
+6 −6
Original line number Diff line number Diff line
@@ -69,22 +69,22 @@ static inline struct usb_device *udl_to_usb_device(struct udl_device *udl)
}

/* modeset */
int udl_modeset_init(struct drm_device *dev);
int udl_modeset_init(struct udl_device *udl);
struct drm_connector *udl_connector_init(struct drm_device *dev);

struct urb *udl_get_urb(struct drm_device *dev);
struct urb *udl_get_urb(struct udl_device *udl);

int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len);
void udl_sync_pending_urbs(struct drm_device *dev);
int udl_submit_urb(struct udl_device *udl, struct urb *urb, size_t len);
void udl_sync_pending_urbs(struct udl_device *udl);
void udl_urb_completion(struct urb *urb);

int udl_init(struct udl_device *udl);

int udl_render_hline(struct drm_device *dev, int log_bpp, struct urb **urb_ptr,
int udl_render_hline(struct udl_device *udl, int log_bpp, struct urb **urb_ptr,
		     const char *front, char **urb_buf_ptr,
		     u32 byte_offset, u32 device_byte_offset, u32 byte_width);

int udl_drop_usb(struct drm_device *dev);
int udl_drop_usb(struct udl_device *udl);
int udl_select_std_channel(struct udl_device *udl);

#endif
+12 −16
Original line number Diff line number Diff line
@@ -145,9 +145,8 @@ void udl_urb_completion(struct urb *urb)
	wake_up(&udl->urbs.sleep);
}

static void udl_free_urb_list(struct drm_device *dev)
static void udl_free_urb_list(struct udl_device *udl)
{
	struct udl_device *udl = to_udl(dev);
	struct urb_node *unode;
	struct urb *urb;

@@ -172,9 +171,8 @@ static void udl_free_urb_list(struct drm_device *dev)
	wake_up_all(&udl->urbs.sleep);
}

static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
static int udl_alloc_urb_list(struct udl_device *udl, int count, size_t size)
{
	struct udl_device *udl = to_udl(dev);
	struct urb *urb;
	struct urb_node *unode;
	char *buf;
@@ -210,7 +208,7 @@ static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size)
			usb_free_urb(urb);
			if (size > PAGE_SIZE) {
				size /= 2;
				udl_free_urb_list(dev);
				udl_free_urb_list(udl);
				goto retry;
			}
			break;
@@ -259,9 +257,8 @@ static struct urb *udl_get_urb_locked(struct udl_device *udl, long timeout)
}

#define GET_URB_TIMEOUT	HZ
struct urb *udl_get_urb(struct drm_device *dev)
struct urb *udl_get_urb(struct udl_device *udl)
{
	struct udl_device *udl = to_udl(dev);
	struct urb *urb;

	spin_lock_irq(&udl->urbs.lock);
@@ -270,9 +267,8 @@ struct urb *udl_get_urb(struct drm_device *dev)
	return urb;
}

int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len)
int udl_submit_urb(struct udl_device *udl, struct urb *urb, size_t len)
{
	struct udl_device *udl = to_udl(dev);
	int ret;

	if (WARN_ON(len > udl->urbs.size)) {
@@ -290,9 +286,9 @@ int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len)
}

/* wait until all pending URBs have been processed */
void udl_sync_pending_urbs(struct drm_device *dev)
void udl_sync_pending_urbs(struct udl_device *udl)
{
	struct udl_device *udl = to_udl(dev);
	struct drm_device *dev = &udl->drm;

	spin_lock_irq(&udl->urbs.lock);
	/* 2 seconds as a sane timeout */
@@ -329,13 +325,13 @@ int udl_init(struct udl_device *udl)
	if (udl_select_std_channel(udl))
		DRM_ERROR("Selecting channel failed\n");

	if (!udl_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
	if (!udl_alloc_urb_list(udl, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
		DRM_ERROR("udl_alloc_urb_list failed\n");
		goto err;
	}

	DRM_DEBUG("\n");
	ret = udl_modeset_init(dev);
	ret = udl_modeset_init(udl);
	if (ret)
		goto err;

@@ -343,14 +339,14 @@ int udl_init(struct udl_device *udl)

err:
	if (udl->urbs.count)
		udl_free_urb_list(dev);
		udl_free_urb_list(udl);
	DRM_ERROR("%d\n", ret);
	return ret;
}

int udl_drop_usb(struct drm_device *dev)
int udl_drop_usb(struct udl_device *udl)
{
	udl_free_urb_list(dev);
	udl_free_urb_list(udl);

	return 0;
}
+12 −9
Original line number Diff line number Diff line
@@ -205,6 +205,7 @@ static int udl_handle_damage(struct drm_framebuffer *fb,
			     const struct drm_rect *clip)
{
	struct drm_device *dev = fb->dev;
	struct udl_device *udl = to_udl(dev);
	void *vaddr = map->vaddr; /* TODO: Use mapping abstraction properly */
	int i, ret;
	char *cmd;
@@ -216,7 +217,7 @@ static int udl_handle_damage(struct drm_framebuffer *fb,
		return ret;
	log_bpp = ret;

	urb = udl_get_urb(dev);
	urb = udl_get_urb(udl);
	if (!urb)
		return -ENOMEM;
	cmd = urb->transfer_buffer;
@@ -226,7 +227,7 @@ static int udl_handle_damage(struct drm_framebuffer *fb,
		const int byte_offset = line_offset + (clip->x1 << log_bpp);
		const int dev_byte_offset = (fb->width * i + clip->x1) << log_bpp;
		const int byte_width = drm_rect_width(clip) << log_bpp;
		ret = udl_render_hline(dev, log_bpp, &urb, (char *)vaddr,
		ret = udl_render_hline(udl, log_bpp, &urb, (char *)vaddr,
				       &cmd, byte_offset, dev_byte_offset,
				       byte_width);
		if (ret)
@@ -239,7 +240,7 @@ static int udl_handle_damage(struct drm_framebuffer *fb,
		if (cmd < (char *)urb->transfer_buffer + urb->transfer_buffer_length)
			*cmd++ = UDL_MSG_BULK;
		len = cmd - (char *)urb->transfer_buffer;
		ret = udl_submit_urb(dev, urb, len);
		ret = udl_submit_urb(udl, urb, len);
	} else {
		udl_urb_completion(urb);
	}
@@ -330,6 +331,7 @@ static const struct drm_plane_funcs udl_primary_plane_funcs = {
static void udl_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *state)
{
	struct drm_device *dev = crtc->dev;
	struct udl_device *udl = to_udl(dev);
	struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
	struct drm_display_mode *mode = &crtc_state->mode;
	struct urb *urb;
@@ -339,7 +341,7 @@ static void udl_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atom
	if (!drm_dev_enter(dev, &idx))
		return;

	urb = udl_get_urb(dev);
	urb = udl_get_urb(udl);
	if (!urb)
		goto out;

@@ -355,7 +357,7 @@ static void udl_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atom
	buf = udl_vidreg_unlock(buf);
	buf = udl_dummy_render(buf);

	udl_submit_urb(dev, urb, buf - (char *)urb->transfer_buffer);
	udl_submit_urb(udl, urb, buf - (char *)urb->transfer_buffer);

out:
	drm_dev_exit(idx);
@@ -364,6 +366,7 @@ static void udl_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atom
static void udl_crtc_helper_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *state)
{
	struct drm_device *dev = crtc->dev;
	struct udl_device *udl = to_udl(dev);
	struct urb *urb;
	char *buf;
	int idx;
@@ -371,7 +374,7 @@ static void udl_crtc_helper_atomic_disable(struct drm_crtc *crtc, struct drm_ato
	if (!drm_dev_enter(dev, &idx))
		return;

	urb = udl_get_urb(dev);
	urb = udl_get_urb(udl);
	if (!urb)
		goto out;

@@ -381,7 +384,7 @@ static void udl_crtc_helper_atomic_disable(struct drm_crtc *crtc, struct drm_ato
	buf = udl_vidreg_unlock(buf);
	buf = udl_dummy_render(buf);

	udl_submit_urb(dev, urb, buf - (char *)urb->transfer_buffer);
	udl_submit_urb(udl, urb, buf - (char *)urb->transfer_buffer);

out:
	drm_dev_exit(idx);
@@ -476,9 +479,9 @@ static const struct drm_mode_config_funcs udl_mode_config_funcs = {
	.atomic_commit = drm_atomic_helper_commit,
};

int udl_modeset_init(struct drm_device *dev)
int udl_modeset_init(struct udl_device *udl)
{
	struct udl_device *udl = to_udl(dev);
	struct drm_device *dev = &udl->drm;
	struct drm_plane *primary_plane;
	struct drm_crtc *crtc;
	struct drm_encoder *encoder;
+3 −3
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@ static void udl_compress_hline16(
 * (that we can only write to, slowly, and can never read), and (optionally)
 * our shadow copy that tracks what's been sent to that hardware buffer.
 */
int udl_render_hline(struct drm_device *dev, int log_bpp, struct urb **urb_ptr,
int udl_render_hline(struct udl_device *udl, int log_bpp, struct urb **urb_ptr,
		     const char *front, char **urb_buf_ptr,
		     u32 byte_offset, u32 device_byte_offset,
		     u32 byte_width)
@@ -199,10 +199,10 @@ int udl_render_hline(struct drm_device *dev, int log_bpp, struct urb **urb_ptr,

		if (cmd >= cmd_end) {
			int len = cmd - (u8 *) urb->transfer_buffer;
			int ret = udl_submit_urb(dev, urb, len);
			int ret = udl_submit_urb(udl, urb, len);
			if (ret)
				return ret;
			urb = udl_get_urb(dev);
			urb = udl_get_urb(udl);
			if (!urb)
				return -EAGAIN;
			*urb_ptr = urb;