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

drm/omapdrm: Run DRM default client setup

Rework fbdev probing to support fbdev_probe in struct drm_driver
and remove the old fb_probe callback. Provide an initializer macro
for struct drm_driver that sets the callback according to the kernel
configuration.

Call drm_client_setup() to run the kernel's default client setup
for DRM. Set fbdev_probe in struct drm_driver, so that the client
setup can start the common fbdev client.

The omapdrm driver specifies a preferred color mode of 32. As this
is the default if no format has been given, leave it out entirely.

v5:
- select DRM_CLIENT_SELECTION

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Acked-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240924071734.98201-81-tzimmermann@suse.de

+39 -102
+1
drivers/gpu/drm/omapdrm/Kconfig
··· 4 4 depends on MMU 5 5 depends on DRM && OF 6 6 depends on ARCH_OMAP2PLUS || (COMPILE_TEST && PAGE_SIZE_LESS_THAN_64KB) 7 + select DRM_CLIENT_SELECTION 7 8 select DRM_KMS_HELPER 8 9 select DRM_DISPLAY_HELPER 9 10 select DRM_BRIDGE_CONNECTOR
+1
drivers/gpu/drm/omapdrm/omap_drv.c
··· 647 647 .gem_prime_import = omap_gem_prime_import, 648 648 .dumb_create = omap_gem_dumb_create, 649 649 .dumb_map_offset = omap_gem_dumb_map_offset, 650 + OMAP_FBDEV_DRIVER_OPS, 650 651 .ioctls = ioctls, 651 652 .num_ioctls = DRM_OMAP_NUM_IOCTLS, 652 653 .fops = &omapdriver_fops,
+29 -102
drivers/gpu/drm/omapdrm/omap_fbdev.c
··· 6 6 7 7 #include <linux/fb.h> 8 8 9 + #include <drm/drm_client_setup.h> 9 10 #include <drm/drm_drv.h> 10 11 #include <drm/drm_crtc_helper.h> 11 12 #include <drm/drm_fb_helper.h> ··· 125 124 .fb_destroy = omap_fbdev_fb_destroy, 126 125 }; 127 126 128 - static int omap_fbdev_create(struct drm_fb_helper *helper, 129 - struct drm_fb_helper_surface_size *sizes) 127 + static int omap_fbdev_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip) 128 + { 129 + if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2)) 130 + return 0; 131 + 132 + if (helper->fb->funcs->dirty) 133 + return helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1); 134 + 135 + return 0; 136 + } 137 + 138 + static const struct drm_fb_helper_funcs omap_fbdev_helper_funcs = { 139 + .fb_dirty = omap_fbdev_dirty, 140 + }; 141 + 142 + static struct drm_fb_helper *get_fb(struct fb_info *fbi) 143 + { 144 + if (!fbi || strcmp(fbi->fix.id, MODULE_NAME)) { 145 + /* these are not the fb's you're looking for */ 146 + return NULL; 147 + } 148 + return fbi->par; 149 + } 150 + 151 + int omap_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, 152 + struct drm_fb_helper_surface_size *sizes) 130 153 { 131 154 struct drm_device *dev = helper->dev; 132 155 struct omap_drm_private *priv = dev->dev_private; ··· 232 207 233 208 DBG("fbi=%p, dev=%p", fbi, dev); 234 209 210 + helper->funcs = &omap_fbdev_helper_funcs; 235 211 helper->fb = fb; 236 212 237 213 fbi->fbops = &omap_fb_ops; ··· 279 253 return ret; 280 254 } 281 255 282 - static int omap_fbdev_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip) 283 - { 284 - if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2)) 285 - return 0; 286 - 287 - if (helper->fb->funcs->dirty) 288 - return helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1); 289 - 290 - return 0; 291 - } 292 - 293 - static const struct drm_fb_helper_funcs omap_fb_helper_funcs = { 294 - .fb_probe = omap_fbdev_create, 295 - .fb_dirty = omap_fbdev_dirty, 296 - }; 297 - 298 - static struct drm_fb_helper *get_fb(struct fb_info *fbi) 299 - { 300 - if (!fbi || strcmp(fbi->fix.id, MODULE_NAME)) { 301 - /* these are not the fb's you're looking for */ 302 - return NULL; 303 - } 304 - return fbi->par; 305 - } 306 - 307 - /* 308 - * struct drm_client 309 - */ 310 - 311 - static void omap_fbdev_client_unregister(struct drm_client_dev *client) 312 - { 313 - struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); 314 - 315 - if (fb_helper->info) { 316 - drm_fb_helper_unregister_info(fb_helper); 317 - } else { 318 - drm_client_release(&fb_helper->client); 319 - drm_fb_helper_unprepare(fb_helper); 320 - kfree(fb_helper); 321 - } 322 - } 323 - 324 - static int omap_fbdev_client_restore(struct drm_client_dev *client) 325 - { 326 - drm_fb_helper_lastclose(client->dev); 327 - 328 - return 0; 329 - } 330 - 331 - static int omap_fbdev_client_hotplug(struct drm_client_dev *client) 332 - { 333 - struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); 334 - struct drm_device *dev = client->dev; 335 - int ret; 336 - 337 - if (dev->fb_helper) 338 - return drm_fb_helper_hotplug_event(dev->fb_helper); 339 - 340 - ret = drm_fb_helper_init(dev, fb_helper); 341 - if (ret) 342 - goto err_drm_err; 343 - 344 - ret = drm_fb_helper_initial_config(fb_helper); 345 - if (ret) 346 - goto err_drm_fb_helper_fini; 347 - 348 - return 0; 349 - 350 - err_drm_fb_helper_fini: 351 - drm_fb_helper_fini(fb_helper); 352 - err_drm_err: 353 - drm_err(dev, "Failed to setup fbdev emulation (ret=%d)\n", ret); 354 - return ret; 355 - } 356 - 357 - static const struct drm_client_funcs omap_fbdev_client_funcs = { 358 - .owner = THIS_MODULE, 359 - .unregister = omap_fbdev_client_unregister, 360 - .restore = omap_fbdev_client_restore, 361 - .hotplug = omap_fbdev_client_hotplug, 362 - }; 363 - 364 256 void omap_fbdev_setup(struct drm_device *dev) 365 257 { 366 258 struct omap_drm_private *priv = dev->dev_private; 367 259 struct omap_fbdev *fbdev; 368 - struct drm_fb_helper *helper; 369 - int ret; 370 260 371 261 drm_WARN(dev, !dev->registered, "Device has not been registered.\n"); 372 262 drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n"); ··· 295 353 296 354 priv->fbdev = fbdev; 297 355 298 - helper = kzalloc(sizeof(*helper), GFP_KERNEL); 299 - if (!helper) 300 - return; 301 - drm_fb_helper_prepare(dev, helper, 32, &omap_fb_helper_funcs); 302 - 303 - ret = drm_client_init(dev, &helper->client, "fbdev", &omap_fbdev_client_funcs); 304 - if (ret) 305 - goto err_drm_client_init; 306 - 307 - drm_client_register(&helper->client); 308 - 309 - return; 310 - 311 - err_drm_client_init: 312 - drm_fb_helper_unprepare(helper); 313 - kfree(helper); 356 + drm_client_setup(dev, NULL); 314 357 }
+8
drivers/gpu/drm/omapdrm/omap_fbdev.h
··· 10 10 #define __OMAPDRM_FBDEV_H__ 11 11 12 12 struct drm_device; 13 + struct drm_fb_helper; 14 + struct drm_fb_helper_surface_size; 13 15 14 16 #ifdef CONFIG_DRM_FBDEV_EMULATION 17 + int omap_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, 18 + struct drm_fb_helper_surface_size *sizes); 19 + #define OMAP_FBDEV_DRIVER_OPS \ 20 + .fbdev_probe = omap_fbdev_driver_fbdev_probe 15 21 void omap_fbdev_setup(struct drm_device *dev); 16 22 #else 23 + #define OMAP_FBDEV_DRIVER_OPS \ 24 + .fbdev_probe = NULL 17 25 static inline void omap_fbdev_setup(struct drm_device *dev) 18 26 { 19 27 }