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: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> Link: https://lore.kernel.org/r/20250410105948.25463-4-tzimmermann@suse.de
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 @@ retry:
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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 @@ out:
|
||||
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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user