diff options
Diffstat (limited to 'drivers/gpu/drm/gma500/framebuffer.c')
-rw-r--r-- | drivers/gpu/drm/gma500/framebuffer.c | 48 |
1 files changed, 16 insertions, 32 deletions
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c index 2d42ce6d3757..2eaf1b31c7bd 100644 --- a/drivers/gpu/drm/gma500/framebuffer.c +++ b/drivers/gpu/drm/gma500/framebuffer.c | |||
@@ -194,9 +194,9 @@ static struct fb_ops psbfb_ops = { | |||
194 | .fb_set_par = drm_fb_helper_set_par, | 194 | .fb_set_par = drm_fb_helper_set_par, |
195 | .fb_blank = drm_fb_helper_blank, | 195 | .fb_blank = drm_fb_helper_blank, |
196 | .fb_setcolreg = psbfb_setcolreg, | 196 | .fb_setcolreg = psbfb_setcolreg, |
197 | .fb_fillrect = cfb_fillrect, | 197 | .fb_fillrect = drm_fb_helper_cfb_fillrect, |
198 | .fb_copyarea = psbfb_copyarea, | 198 | .fb_copyarea = psbfb_copyarea, |
199 | .fb_imageblit = cfb_imageblit, | 199 | .fb_imageblit = drm_fb_helper_cfb_imageblit, |
200 | .fb_mmap = psbfb_mmap, | 200 | .fb_mmap = psbfb_mmap, |
201 | .fb_sync = psbfb_sync, | 201 | .fb_sync = psbfb_sync, |
202 | .fb_ioctl = psbfb_ioctl, | 202 | .fb_ioctl = psbfb_ioctl, |
@@ -208,9 +208,9 @@ static struct fb_ops psbfb_roll_ops = { | |||
208 | .fb_set_par = drm_fb_helper_set_par, | 208 | .fb_set_par = drm_fb_helper_set_par, |
209 | .fb_blank = drm_fb_helper_blank, | 209 | .fb_blank = drm_fb_helper_blank, |
210 | .fb_setcolreg = psbfb_setcolreg, | 210 | .fb_setcolreg = psbfb_setcolreg, |
211 | .fb_fillrect = cfb_fillrect, | 211 | .fb_fillrect = drm_fb_helper_cfb_fillrect, |
212 | .fb_copyarea = cfb_copyarea, | 212 | .fb_copyarea = drm_fb_helper_cfb_copyarea, |
213 | .fb_imageblit = cfb_imageblit, | 213 | .fb_imageblit = drm_fb_helper_cfb_imageblit, |
214 | .fb_pan_display = psbfb_pan, | 214 | .fb_pan_display = psbfb_pan, |
215 | .fb_mmap = psbfb_mmap, | 215 | .fb_mmap = psbfb_mmap, |
216 | .fb_ioctl = psbfb_ioctl, | 216 | .fb_ioctl = psbfb_ioctl, |
@@ -222,9 +222,9 @@ static struct fb_ops psbfb_unaccel_ops = { | |||
222 | .fb_set_par = drm_fb_helper_set_par, | 222 | .fb_set_par = drm_fb_helper_set_par, |
223 | .fb_blank = drm_fb_helper_blank, | 223 | .fb_blank = drm_fb_helper_blank, |
224 | .fb_setcolreg = psbfb_setcolreg, | 224 | .fb_setcolreg = psbfb_setcolreg, |
225 | .fb_fillrect = cfb_fillrect, | 225 | .fb_fillrect = drm_fb_helper_cfb_fillrect, |
226 | .fb_copyarea = cfb_copyarea, | 226 | .fb_copyarea = drm_fb_helper_cfb_copyarea, |
227 | .fb_imageblit = cfb_imageblit, | 227 | .fb_imageblit = drm_fb_helper_cfb_imageblit, |
228 | .fb_mmap = psbfb_mmap, | 228 | .fb_mmap = psbfb_mmap, |
229 | .fb_ioctl = psbfb_ioctl, | 229 | .fb_ioctl = psbfb_ioctl, |
230 | }; | 230 | }; |
@@ -343,7 +343,6 @@ static int psbfb_create(struct psb_fbdev *fbdev, | |||
343 | struct drm_framebuffer *fb; | 343 | struct drm_framebuffer *fb; |
344 | struct psb_framebuffer *psbfb = &fbdev->pfb; | 344 | struct psb_framebuffer *psbfb = &fbdev->pfb; |
345 | struct drm_mode_fb_cmd2 mode_cmd; | 345 | struct drm_mode_fb_cmd2 mode_cmd; |
346 | struct device *device = &dev->pdev->dev; | ||
347 | int size; | 346 | int size; |
348 | int ret; | 347 | int ret; |
349 | struct gtt_range *backing; | 348 | struct gtt_range *backing; |
@@ -409,9 +408,9 @@ static int psbfb_create(struct psb_fbdev *fbdev, | |||
409 | 408 | ||
410 | mutex_lock(&dev->struct_mutex); | 409 | mutex_lock(&dev->struct_mutex); |
411 | 410 | ||
412 | info = framebuffer_alloc(0, device); | 411 | info = drm_fb_helper_alloc_fbi(&fbdev->psb_fb_helper); |
413 | if (!info) { | 412 | if (IS_ERR(info)) { |
414 | ret = -ENOMEM; | 413 | ret = PTR_ERR(info); |
415 | goto out_err1; | 414 | goto out_err1; |
416 | } | 415 | } |
417 | info->par = fbdev; | 416 | info->par = fbdev; |
@@ -426,7 +425,6 @@ static int psbfb_create(struct psb_fbdev *fbdev, | |||
426 | psbfb->fbdev = info; | 425 | psbfb->fbdev = info; |
427 | 426 | ||
428 | fbdev->psb_fb_helper.fb = fb; | 427 | fbdev->psb_fb_helper.fb = fb; |
429 | fbdev->psb_fb_helper.fbdev = info; | ||
430 | 428 | ||
431 | drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth); | 429 | drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth); |
432 | strcpy(info->fix.id, "psbdrmfb"); | 430 | strcpy(info->fix.id, "psbdrmfb"); |
@@ -440,12 +438,6 @@ static int psbfb_create(struct psb_fbdev *fbdev, | |||
440 | } else /* Software */ | 438 | } else /* Software */ |
441 | info->fbops = &psbfb_unaccel_ops; | 439 | info->fbops = &psbfb_unaccel_ops; |
442 | 440 | ||
443 | ret = fb_alloc_cmap(&info->cmap, 256, 0); | ||
444 | if (ret) { | ||
445 | ret = -ENOMEM; | ||
446 | goto out_unref; | ||
447 | } | ||
448 | |||
449 | info->fix.smem_start = dev->mode_config.fb_base; | 441 | info->fix.smem_start = dev->mode_config.fb_base; |
450 | info->fix.smem_len = size; | 442 | info->fix.smem_len = size; |
451 | info->fix.ywrapstep = gtt_roll; | 443 | info->fix.ywrapstep = gtt_roll; |
@@ -456,11 +448,6 @@ static int psbfb_create(struct psb_fbdev *fbdev, | |||
456 | info->screen_size = size; | 448 | info->screen_size = size; |
457 | 449 | ||
458 | if (dev_priv->gtt.stolen_size) { | 450 | if (dev_priv->gtt.stolen_size) { |
459 | info->apertures = alloc_apertures(1); | ||
460 | if (!info->apertures) { | ||
461 | ret = -ENOMEM; | ||
462 | goto out_unref; | ||
463 | } | ||
464 | info->apertures->ranges[0].base = dev->mode_config.fb_base; | 451 | info->apertures->ranges[0].base = dev->mode_config.fb_base; |
465 | info->apertures->ranges[0].size = dev_priv->gtt.stolen_size; | 452 | info->apertures->ranges[0].size = dev_priv->gtt.stolen_size; |
466 | } | 453 | } |
@@ -483,6 +470,8 @@ out_unref: | |||
483 | psb_gtt_free_range(dev, backing); | 470 | psb_gtt_free_range(dev, backing); |
484 | else | 471 | else |
485 | drm_gem_object_unreference(&backing->gem); | 472 | drm_gem_object_unreference(&backing->gem); |
473 | |||
474 | drm_fb_helper_release_fbi(&fbdev->psb_fb_helper); | ||
486 | out_err1: | 475 | out_err1: |
487 | mutex_unlock(&dev->struct_mutex); | 476 | mutex_unlock(&dev->struct_mutex); |
488 | psb_gtt_free_range(dev, backing); | 477 | psb_gtt_free_range(dev, backing); |
@@ -570,16 +559,11 @@ static const struct drm_fb_helper_funcs psb_fb_helper_funcs = { | |||
570 | 559 | ||
571 | static int psb_fbdev_destroy(struct drm_device *dev, struct psb_fbdev *fbdev) | 560 | static int psb_fbdev_destroy(struct drm_device *dev, struct psb_fbdev *fbdev) |
572 | { | 561 | { |
573 | struct fb_info *info; | ||
574 | struct psb_framebuffer *psbfb = &fbdev->pfb; | 562 | struct psb_framebuffer *psbfb = &fbdev->pfb; |
575 | 563 | ||
576 | if (fbdev->psb_fb_helper.fbdev) { | 564 | drm_fb_helper_unregister_fbi(&fbdev->psb_fb_helper); |
577 | info = fbdev->psb_fb_helper.fbdev; | 565 | drm_fb_helper_release_fbi(&fbdev->psb_fb_helper); |
578 | unregister_framebuffer(info); | 566 | |
579 | if (info->cmap.len) | ||
580 | fb_dealloc_cmap(&info->cmap); | ||
581 | framebuffer_release(info); | ||
582 | } | ||
583 | drm_fb_helper_fini(&fbdev->psb_fb_helper); | 567 | drm_fb_helper_fini(&fbdev->psb_fb_helper); |
584 | drm_framebuffer_unregister_private(&psbfb->base); | 568 | drm_framebuffer_unregister_private(&psbfb->base); |
585 | drm_framebuffer_cleanup(&psbfb->base); | 569 | drm_framebuffer_cleanup(&psbfb->base); |