diff options
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/vgem/vgem_drv.c | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/drivers/gpu/drm/vgem/vgem_drv.c b/drivers/gpu/drm/vgem/vgem_drv.c index c9381d457a03..4b23ba049632 100644 --- a/drivers/gpu/drm/vgem/vgem_drv.c +++ b/drivers/gpu/drm/vgem/vgem_drv.c | |||
| @@ -42,7 +42,10 @@ | |||
| 42 | #define DRIVER_MAJOR 1 | 42 | #define DRIVER_MAJOR 1 |
| 43 | #define DRIVER_MINOR 0 | 43 | #define DRIVER_MINOR 0 |
| 44 | 44 | ||
| 45 | static struct platform_device *vgem_platform; | 45 | static struct vgem_device { |
| 46 | struct drm_device drm; | ||
| 47 | struct platform_device *platform; | ||
| 48 | } *vgem_device; | ||
| 46 | 49 | ||
| 47 | static void vgem_gem_free_object(struct drm_gem_object *obj) | 50 | static void vgem_gem_free_object(struct drm_gem_object *obj) |
| 48 | { | 51 | { |
| @@ -307,7 +310,9 @@ static struct sg_table *vgem_prime_get_sg_table(struct drm_gem_object *obj) | |||
| 307 | static struct drm_gem_object* vgem_prime_import(struct drm_device *dev, | 310 | static struct drm_gem_object* vgem_prime_import(struct drm_device *dev, |
| 308 | struct dma_buf *dma_buf) | 311 | struct dma_buf *dma_buf) |
| 309 | { | 312 | { |
| 310 | return drm_gem_prime_import_dev(dev, dma_buf, &vgem_platform->dev); | 313 | struct vgem_device *vgem = container_of(dev, typeof(*vgem), drm); |
| 314 | |||
| 315 | return drm_gem_prime_import_dev(dev, dma_buf, &vgem->platform->dev); | ||
| 311 | } | 316 | } |
| 312 | 317 | ||
| 313 | static struct drm_gem_object *vgem_prime_import_sg_table(struct drm_device *dev, | 318 | static struct drm_gem_object *vgem_prime_import_sg_table(struct drm_device *dev, |
| @@ -377,8 +382,19 @@ static int vgem_prime_mmap(struct drm_gem_object *obj, | |||
| 377 | return 0; | 382 | return 0; |
| 378 | } | 383 | } |
| 379 | 384 | ||
| 385 | static void vgem_release(struct drm_device *dev) | ||
| 386 | { | ||
| 387 | struct vgem_device *vgem = container_of(dev, typeof(*vgem), drm); | ||
| 388 | |||
| 389 | platform_device_unregister(vgem->platform); | ||
| 390 | drm_dev_fini(&vgem->drm); | ||
| 391 | |||
| 392 | kfree(vgem); | ||
| 393 | } | ||
| 394 | |||
| 380 | static struct drm_driver vgem_driver = { | 395 | static struct drm_driver vgem_driver = { |
| 381 | .driver_features = DRIVER_GEM | DRIVER_PRIME, | 396 | .driver_features = DRIVER_GEM | DRIVER_PRIME, |
| 397 | .release = vgem_release, | ||
| 382 | .open = vgem_open, | 398 | .open = vgem_open, |
| 383 | .postclose = vgem_postclose, | 399 | .postclose = vgem_postclose, |
| 384 | .gem_free_object_unlocked = vgem_gem_free_object, | 400 | .gem_free_object_unlocked = vgem_gem_free_object, |
| @@ -408,45 +424,48 @@ static struct drm_driver vgem_driver = { | |||
| 408 | .minor = DRIVER_MINOR, | 424 | .minor = DRIVER_MINOR, |
| 409 | }; | 425 | }; |
| 410 | 426 | ||
| 411 | static struct drm_device *vgem_device; | ||
| 412 | |||
| 413 | static int __init vgem_init(void) | 427 | static int __init vgem_init(void) |
| 414 | { | 428 | { |
| 415 | int ret; | 429 | int ret; |
| 416 | 430 | ||
| 417 | vgem_device = drm_dev_alloc(&vgem_driver, NULL); | 431 | vgem_device = kzalloc(sizeof(*vgem_device), GFP_KERNEL); |
| 418 | if (IS_ERR(vgem_device)) | 432 | if (!vgem_device) |
| 419 | return PTR_ERR(vgem_device); | 433 | return -ENOMEM; |
| 420 | 434 | ||
| 421 | vgem_platform = platform_device_register_simple("vgem", | 435 | ret = drm_dev_init(&vgem_device->drm, &vgem_driver, NULL); |
| 422 | -1, NULL, 0); | 436 | if (ret) |
| 437 | goto out_free; | ||
| 423 | 438 | ||
| 424 | if (!vgem_platform) { | 439 | vgem_device->platform = |
| 440 | platform_device_register_simple("vgem", -1, NULL, 0); | ||
| 441 | if (!vgem_device->platform) { | ||
| 425 | ret = -ENODEV; | 442 | ret = -ENODEV; |
| 426 | goto out; | 443 | goto out_fini; |
| 427 | } | 444 | } |
| 428 | 445 | ||
| 429 | dma_coerce_mask_and_coherent(&vgem_platform->dev, | 446 | dma_coerce_mask_and_coherent(&vgem_device->platform->dev, |
| 430 | DMA_BIT_MASK(64)); | 447 | DMA_BIT_MASK(64)); |
| 431 | 448 | ||
| 432 | ret = drm_dev_register(vgem_device, 0); | 449 | /* Final step: expose the device/driver to userspace */ |
| 450 | ret = drm_dev_register(&vgem_device->drm, 0); | ||
| 433 | if (ret) | 451 | if (ret) |
| 434 | goto out_unref; | 452 | goto out_unregister; |
| 435 | 453 | ||
| 436 | return 0; | 454 | return 0; |
| 437 | 455 | ||
| 438 | out_unref: | 456 | out_unregister: |
| 439 | platform_device_unregister(vgem_platform); | 457 | platform_device_unregister(vgem_device->platform); |
| 440 | out: | 458 | out_fini: |
| 441 | drm_dev_unref(vgem_device); | 459 | drm_dev_fini(&vgem_device->drm); |
| 460 | out_free: | ||
| 461 | kfree(vgem_device); | ||
| 442 | return ret; | 462 | return ret; |
| 443 | } | 463 | } |
| 444 | 464 | ||
| 445 | static void __exit vgem_exit(void) | 465 | static void __exit vgem_exit(void) |
| 446 | { | 466 | { |
| 447 | platform_device_unregister(vgem_platform); | 467 | drm_dev_unregister(&vgem_device->drm); |
| 448 | drm_dev_unregister(vgem_device); | 468 | drm_dev_unref(&vgem_device->drm); |
| 449 | drm_dev_unref(vgem_device); | ||
| 450 | } | 469 | } |
| 451 | 470 | ||
| 452 | module_init(vgem_init); | 471 | module_init(vgem_init); |
