Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+37 -36
+4 -2
drivers/gpu/drm/udl/udl_drv.c
··· 22 22 pm_message_t message) 23 23 { 24 24 struct drm_device *dev = usb_get_intfdata(interface); 25 + struct udl_device *udl = to_udl(dev); 25 26 int ret; 26 27 27 28 ret = drm_mode_config_helper_suspend(dev); 28 29 if (ret) 29 30 return ret; 30 31 31 - udl_sync_pending_urbs(dev); 32 + udl_sync_pending_urbs(udl); 32 33 return 0; 33 34 } 34 35 ··· 110 109 static void udl_usb_disconnect(struct usb_interface *interface) 111 110 { 112 111 struct drm_device *dev = usb_get_intfdata(interface); 112 + struct udl_device *udl = to_udl(dev); 113 113 114 114 drm_dev_unplug(dev); 115 - udl_drop_usb(dev); 115 + udl_drop_usb(udl); 116 116 } 117 117 118 118 /*
+6 -6
drivers/gpu/drm/udl/udl_drv.h
··· 69 69 } 70 70 71 71 /* modeset */ 72 - int udl_modeset_init(struct drm_device *dev); 72 + int udl_modeset_init(struct udl_device *udl); 73 73 struct drm_connector *udl_connector_init(struct drm_device *dev); 74 74 75 - struct urb *udl_get_urb(struct drm_device *dev); 75 + struct urb *udl_get_urb(struct udl_device *udl); 76 76 77 - int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len); 78 - void udl_sync_pending_urbs(struct drm_device *dev); 77 + int udl_submit_urb(struct udl_device *udl, struct urb *urb, size_t len); 78 + void udl_sync_pending_urbs(struct udl_device *udl); 79 79 void udl_urb_completion(struct urb *urb); 80 80 81 81 int udl_init(struct udl_device *udl); 82 82 83 - int udl_render_hline(struct drm_device *dev, int log_bpp, struct urb **urb_ptr, 83 + int udl_render_hline(struct udl_device *udl, int log_bpp, struct urb **urb_ptr, 84 84 const char *front, char **urb_buf_ptr, 85 85 u32 byte_offset, u32 device_byte_offset, u32 byte_width); 86 86 87 - int udl_drop_usb(struct drm_device *dev); 87 + int udl_drop_usb(struct udl_device *udl); 88 88 int udl_select_std_channel(struct udl_device *udl); 89 89 90 90 #endif
+12 -16
drivers/gpu/drm/udl/udl_main.c
··· 145 145 wake_up(&udl->urbs.sleep); 146 146 } 147 147 148 - static void udl_free_urb_list(struct drm_device *dev) 148 + static void udl_free_urb_list(struct udl_device *udl) 149 149 { 150 - struct udl_device *udl = to_udl(dev); 151 150 struct urb_node *unode; 152 151 struct urb *urb; 153 152 ··· 171 172 wake_up_all(&udl->urbs.sleep); 172 173 } 173 174 174 - static int udl_alloc_urb_list(struct drm_device *dev, int count, size_t size) 175 + static int udl_alloc_urb_list(struct udl_device *udl, int count, size_t size) 175 176 { 176 - struct udl_device *udl = to_udl(dev); 177 177 struct urb *urb; 178 178 struct urb_node *unode; 179 179 char *buf; ··· 208 210 usb_free_urb(urb); 209 211 if (size > PAGE_SIZE) { 210 212 size /= 2; 211 - udl_free_urb_list(dev); 213 + udl_free_urb_list(udl); 212 214 goto retry; 213 215 } 214 216 break; ··· 257 259 } 258 260 259 261 #define GET_URB_TIMEOUT HZ 260 - struct urb *udl_get_urb(struct drm_device *dev) 262 + struct urb *udl_get_urb(struct udl_device *udl) 261 263 { 262 - struct udl_device *udl = to_udl(dev); 263 264 struct urb *urb; 264 265 265 266 spin_lock_irq(&udl->urbs.lock); ··· 267 270 return urb; 268 271 } 269 272 270 - int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len) 273 + int udl_submit_urb(struct udl_device *udl, struct urb *urb, size_t len) 271 274 { 272 - struct udl_device *udl = to_udl(dev); 273 275 int ret; 274 276 275 277 if (WARN_ON(len > udl->urbs.size)) { ··· 286 290 } 287 291 288 292 /* wait until all pending URBs have been processed */ 289 - void udl_sync_pending_urbs(struct drm_device *dev) 293 + void udl_sync_pending_urbs(struct udl_device *udl) 290 294 { 291 - struct udl_device *udl = to_udl(dev); 295 + struct drm_device *dev = &udl->drm; 292 296 293 297 spin_lock_irq(&udl->urbs.lock); 294 298 /* 2 seconds as a sane timeout */ ··· 325 329 if (udl_select_std_channel(udl)) 326 330 DRM_ERROR("Selecting channel failed\n"); 327 331 328 - if (!udl_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) { 332 + if (!udl_alloc_urb_list(udl, WRITES_IN_FLIGHT, MAX_TRANSFER)) { 329 333 DRM_ERROR("udl_alloc_urb_list failed\n"); 330 334 goto err; 331 335 } 332 336 333 337 DRM_DEBUG("\n"); 334 - ret = udl_modeset_init(dev); 338 + ret = udl_modeset_init(udl); 335 339 if (ret) 336 340 goto err; 337 341 ··· 339 343 340 344 err: 341 345 if (udl->urbs.count) 342 - udl_free_urb_list(dev); 346 + udl_free_urb_list(udl); 343 347 DRM_ERROR("%d\n", ret); 344 348 return ret; 345 349 } 346 350 347 - int udl_drop_usb(struct drm_device *dev) 351 + int udl_drop_usb(struct udl_device *udl) 348 352 { 349 - udl_free_urb_list(dev); 353 + udl_free_urb_list(udl); 350 354 351 355 return 0; 352 356 }
+12 -9
drivers/gpu/drm/udl/udl_modeset.c
··· 205 205 const struct drm_rect *clip) 206 206 { 207 207 struct drm_device *dev = fb->dev; 208 + struct udl_device *udl = to_udl(dev); 208 209 void *vaddr = map->vaddr; /* TODO: Use mapping abstraction properly */ 209 210 int i, ret; 210 211 char *cmd; ··· 217 216 return ret; 218 217 log_bpp = ret; 219 218 220 - urb = udl_get_urb(dev); 219 + urb = udl_get_urb(udl); 221 220 if (!urb) 222 221 return -ENOMEM; 223 222 cmd = urb->transfer_buffer; ··· 227 226 const int byte_offset = line_offset + (clip->x1 << log_bpp); 228 227 const int dev_byte_offset = (fb->width * i + clip->x1) << log_bpp; 229 228 const int byte_width = drm_rect_width(clip) << log_bpp; 230 - ret = udl_render_hline(dev, log_bpp, &urb, (char *)vaddr, 229 + ret = udl_render_hline(udl, log_bpp, &urb, (char *)vaddr, 231 230 &cmd, byte_offset, dev_byte_offset, 232 231 byte_width); 233 232 if (ret) ··· 240 239 if (cmd < (char *)urb->transfer_buffer + urb->transfer_buffer_length) 241 240 *cmd++ = UDL_MSG_BULK; 242 241 len = cmd - (char *)urb->transfer_buffer; 243 - ret = udl_submit_urb(dev, urb, len); 242 + ret = udl_submit_urb(udl, urb, len); 244 243 } else { 245 244 udl_urb_completion(urb); 246 245 } ··· 331 330 static void udl_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *state) 332 331 { 333 332 struct drm_device *dev = crtc->dev; 333 + struct udl_device *udl = to_udl(dev); 334 334 struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); 335 335 struct drm_display_mode *mode = &crtc_state->mode; 336 336 struct urb *urb; ··· 341 339 if (!drm_dev_enter(dev, &idx)) 342 340 return; 343 341 344 - urb = udl_get_urb(dev); 342 + urb = udl_get_urb(udl); 345 343 if (!urb) 346 344 goto out; 347 345 ··· 357 355 buf = udl_vidreg_unlock(buf); 358 356 buf = udl_dummy_render(buf); 359 357 360 - udl_submit_urb(dev, urb, buf - (char *)urb->transfer_buffer); 358 + udl_submit_urb(udl, urb, buf - (char *)urb->transfer_buffer); 361 359 362 360 out: 363 361 drm_dev_exit(idx); ··· 366 364 static void udl_crtc_helper_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *state) 367 365 { 368 366 struct drm_device *dev = crtc->dev; 367 + struct udl_device *udl = to_udl(dev); 369 368 struct urb *urb; 370 369 char *buf; 371 370 int idx; ··· 374 371 if (!drm_dev_enter(dev, &idx)) 375 372 return; 376 373 377 - urb = udl_get_urb(dev); 374 + urb = udl_get_urb(udl); 378 375 if (!urb) 379 376 goto out; 380 377 ··· 384 381 buf = udl_vidreg_unlock(buf); 385 382 buf = udl_dummy_render(buf); 386 383 387 - udl_submit_urb(dev, urb, buf - (char *)urb->transfer_buffer); 384 + udl_submit_urb(udl, urb, buf - (char *)urb->transfer_buffer); 388 385 389 386 out: 390 387 drm_dev_exit(idx); ··· 479 476 .atomic_commit = drm_atomic_helper_commit, 480 477 }; 481 478 482 - int udl_modeset_init(struct drm_device *dev) 479 + int udl_modeset_init(struct udl_device *udl) 483 480 { 484 - struct udl_device *udl = to_udl(dev); 481 + struct drm_device *dev = &udl->drm; 485 482 struct drm_plane *primary_plane; 486 483 struct drm_crtc *crtc; 487 484 struct drm_encoder *encoder;
+3 -3
drivers/gpu/drm/udl/udl_transfer.c
··· 170 170 * (that we can only write to, slowly, and can never read), and (optionally) 171 171 * our shadow copy that tracks what's been sent to that hardware buffer. 172 172 */ 173 - int udl_render_hline(struct drm_device *dev, int log_bpp, struct urb **urb_ptr, 173 + int udl_render_hline(struct udl_device *udl, int log_bpp, struct urb **urb_ptr, 174 174 const char *front, char **urb_buf_ptr, 175 175 u32 byte_offset, u32 device_byte_offset, 176 176 u32 byte_width) ··· 199 199 200 200 if (cmd >= cmd_end) { 201 201 int len = cmd - (u8 *) urb->transfer_buffer; 202 - int ret = udl_submit_urb(dev, urb, len); 202 + int ret = udl_submit_urb(udl, urb, len); 203 203 if (ret) 204 204 return ret; 205 - urb = udl_get_urb(dev); 205 + urb = udl_get_urb(udl); 206 206 if (!urb) 207 207 return -EAGAIN; 208 208 *urb_ptr = urb;