forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/drivers/video/fbdev/vesafb.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * framebuffer driver for VBE 2.0 compliant graphic boards
34 *
....@@ -31,6 +32,7 @@
3132 struct vesafb_par {
3233 u32 pseudo_palette[256];
3334 int wc_cookie;
35
+ struct resource *region;
3436 };
3537
3638 static struct fb_var_screeninfo vesafb_defined = {
....@@ -336,8 +338,8 @@
336338 printk(KERN_INFO "vesafb: pmi: set display start = %p, set palette = %p\n",pmi_start,pmi_pal);
337339 if (pmi_base[3]) {
338340 printk(KERN_INFO "vesafb: pmi: ports = ");
339
- for (i = pmi_base[3]/2; pmi_base[i] != 0xffff; i++)
340
- printk("%x ",pmi_base[i]);
341
+ for (i = pmi_base[3]/2; pmi_base[i] != 0xffff; i++)
342
+ printk("%x ", pmi_base[i]);
341343 printk("\n");
342344 if (pmi_base[i] != 0xffff) {
343345 /*
....@@ -410,7 +412,7 @@
410412
411413 /* request failure does not faze us, as vgacon probably has this
412414 * region already (FIXME) */
413
- request_region(0x3c0, 32, "vesafb");
415
+ par->region = request_region(0x3c0, 32, "vesafb");
414416
415417 if (mtrr == 3) {
416418 unsigned int temp_size = size_total;
....@@ -438,7 +440,7 @@
438440 "vesafb: abort, cannot ioremap video memory 0x%x @ 0x%lx\n",
439441 vesafb_fix.smem_len, vesafb_fix.smem_start);
440442 err = -EIO;
441
- goto err;
443
+ goto err_release_region;
442444 }
443445
444446 printk(KERN_INFO "vesafb: framebuffer at 0x%lx, mapped to 0x%p, "
....@@ -446,30 +448,33 @@
446448 vesafb_fix.smem_start, info->screen_base,
447449 size_remap/1024, size_total/1024);
448450
451
+ if (!ypan)
452
+ vesafb_ops.fb_pan_display = NULL;
453
+
449454 info->fbops = &vesafb_ops;
450455 info->var = vesafb_defined;
451456 info->fix = vesafb_fix;
452457 info->flags = FBINFO_FLAG_DEFAULT | FBINFO_MISC_FIRMWARE |
453458 (ypan ? FBINFO_HWACCEL_YPAN : 0);
454459
455
- if (!ypan)
456
- info->fbops->fb_pan_display = NULL;
457
-
458460 if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
459461 err = -ENOMEM;
460
- goto err;
462
+ goto err_release_region;
461463 }
462464 if (register_framebuffer(info)<0) {
463465 err = -EINVAL;
464466 fb_dealloc_cmap(&info->cmap);
465
- goto err;
467
+ goto err_release_region;
466468 }
467469 fb_info(info, "%s frame buffer device\n", info->fix.id);
468470 return 0;
469
-err:
471
+err_release_region:
470472 arch_phys_wc_del(par->wc_cookie);
471473 if (info->screen_base)
472474 iounmap(info->screen_base);
475
+ if (par->region)
476
+ release_region(0x3c0, 32);
477
+err:
473478 framebuffer_release(info);
474479 release_mem_region(vesafb_fix.smem_start, size_total);
475480 return err;
....@@ -480,6 +485,8 @@
480485 struct fb_info *info = platform_get_drvdata(pdev);
481486
482487 unregister_framebuffer(info);
488
+ if (((struct vesafb_par *)(info->par))->region)
489
+ release_region(0x3c0, 32);
483490 framebuffer_release(info);
484491
485492 return 0;