forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/staging/sm750fb/sm750.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 #include <linux/kernel.h>
23 #include <linux/module.h>
34 #include <linux/errno.h>
....@@ -296,6 +297,62 @@
296297 return hw_sm750_pan_display(crtc, var, info);
297298 }
298299
300
+static inline void lynxfb_set_visual_mode(struct fb_info *info)
301
+{
302
+ switch (info->var.bits_per_pixel) {
303
+ case 8:
304
+ info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
305
+ break;
306
+ case 16:
307
+ case 24:
308
+ case 32:
309
+ info->fix.visual = FB_VISUAL_TRUECOLOR;
310
+ break;
311
+ default:
312
+ break;
313
+ }
314
+}
315
+
316
+static inline int lynxfb_set_color_offsets(struct fb_info *info)
317
+{
318
+ lynxfb_set_visual_mode(info);
319
+
320
+ switch (info->var.bits_per_pixel) {
321
+ case 8:
322
+ info->var.red.offset = 0;
323
+ info->var.red.length = 8;
324
+ info->var.green.offset = 0;
325
+ info->var.green.length = 8;
326
+ info->var.blue.offset = 0;
327
+ info->var.blue.length = 8;
328
+ info->var.transp.length = 0;
329
+ info->var.transp.offset = 0;
330
+ break;
331
+ case 16:
332
+ info->var.red.offset = 11;
333
+ info->var.red.length = 5;
334
+ info->var.green.offset = 5;
335
+ info->var.green.length = 6;
336
+ info->var.blue.offset = 0;
337
+ info->var.blue.length = 5;
338
+ info->var.transp.length = 0;
339
+ info->var.transp.offset = 0;
340
+ break;
341
+ case 24:
342
+ case 32:
343
+ info->var.red.offset = 16;
344
+ info->var.red.length = 8;
345
+ info->var.green.offset = 8;
346
+ info->var.green.length = 8;
347
+ info->var.blue.offset = 0;
348
+ info->var.blue.length = 8;
349
+ break;
350
+ default:
351
+ return -EINVAL;
352
+ }
353
+ return 0;
354
+}
355
+
299356 static int lynxfb_ops_set_par(struct fb_info *info)
300357 {
301358 struct lynxfb_par *par;
....@@ -327,48 +384,13 @@
327384 * and these data should be set before setcolreg routine
328385 */
329386
330
- switch (var->bits_per_pixel) {
331
- case 8:
332
- fix->visual = FB_VISUAL_PSEUDOCOLOR;
333
- var->red.offset = 0;
334
- var->red.length = 8;
335
- var->green.offset = 0;
336
- var->green.length = 8;
337
- var->blue.offset = 0;
338
- var->blue.length = 8;
339
- var->transp.length = 0;
340
- var->transp.offset = 0;
341
- break;
342
- case 16:
343
- var->red.offset = 11;
344
- var->red.length = 5;
345
- var->green.offset = 5;
346
- var->green.length = 6;
347
- var->blue.offset = 0;
348
- var->blue.length = 5;
349
- var->transp.length = 0;
350
- var->transp.offset = 0;
351
- fix->visual = FB_VISUAL_TRUECOLOR;
352
- break;
353
- case 24:
354
- case 32:
355
- var->red.offset = 16;
356
- var->red.length = 8;
357
- var->green.offset = 8;
358
- var->green.length = 8;
359
- var->blue.offset = 0;
360
- var->blue.length = 8;
361
- fix->visual = FB_VISUAL_TRUECOLOR;
362
- break;
363
- default:
364
- ret = -EINVAL;
365
- break;
366
- }
387
+ ret = lynxfb_set_color_offsets(info);
388
+
367389 var->height = var->width = -1;
368390 var->accel_flags = 0;/*FB_ACCELF_TEXT;*/
369391
370392 if (ret) {
371
- pr_err("pixel bpp format not satisfied\n.");
393
+ pr_err("bpp %d not supported\n", var->bits_per_pixel);
372394 return ret;
373395 }
374396 ret = hw_sm750_crtc_setMode(crtc, var, fix);
....@@ -385,61 +407,30 @@
385407 return chan << bf->offset;
386408 }
387409
388
-#ifdef CONFIG_PM
389
-static int lynxfb_suspend(struct pci_dev *pdev, pm_message_t mesg)
410
+static int __maybe_unused lynxfb_suspend(struct device *dev)
390411 {
391412 struct fb_info *info;
392413 struct sm750_dev *sm750_dev;
393
- int ret;
394414
395
- if (mesg.event == pdev->dev.power.power_state.event)
396
- return 0;
397
-
398
- ret = 0;
399
- sm750_dev = pci_get_drvdata(pdev);
400
- switch (mesg.event) {
401
- case PM_EVENT_FREEZE:
402
- case PM_EVENT_PRETHAW:
403
- pdev->dev.power.power_state = mesg;
404
- return 0;
405
- }
415
+ sm750_dev = dev_get_drvdata(dev);
406416
407417 console_lock();
408
- if (mesg.event & PM_EVENT_SLEEP) {
409
- info = sm750_dev->fbinfo[0];
410
- if (info)
411
- /* 1 means do suspend */
412
- fb_set_suspend(info, 1);
413
- info = sm750_dev->fbinfo[1];
414
- if (info)
415
- /* 1 means do suspend */
416
- fb_set_suspend(info, 1);
418
+ info = sm750_dev->fbinfo[0];
419
+ if (info)
420
+ /* 1 means do suspend */
421
+ fb_set_suspend(info, 1);
422
+ info = sm750_dev->fbinfo[1];
423
+ if (info)
424
+ /* 1 means do suspend */
425
+ fb_set_suspend(info, 1);
417426
418
- ret = pci_save_state(pdev);
419
- if (ret) {
420
- dev_err(&pdev->dev,
421
- "error:%d occurred in pci_save_state\n", ret);
422
- goto lynxfb_suspend_err;
423
- }
424
-
425
- ret = pci_set_power_state(pdev, pci_choose_state(pdev, mesg));
426
- if (ret) {
427
- dev_err(&pdev->dev,
428
- "error:%d occurred in pci_set_power_state\n",
429
- ret);
430
- goto lynxfb_suspend_err;
431
- }
432
- }
433
-
434
- pdev->dev.power.power_state = mesg;
435
-
436
-lynxfb_suspend_err:
437427 console_unlock();
438
- return ret;
428
+ return 0;
439429 }
440430
441
-static int lynxfb_resume(struct pci_dev *pdev)
431
+static int __maybe_unused lynxfb_resume(struct device *dev)
442432 {
433
+ struct pci_dev *pdev = to_pci_dev(dev);
443434 struct fb_info *info;
444435 struct sm750_dev *sm750_dev;
445436
....@@ -447,31 +438,9 @@
447438 struct lynxfb_crtc *crtc;
448439 struct lynx_cursor *cursor;
449440
450
- int ret;
451
-
452
- ret = 0;
453441 sm750_dev = pci_get_drvdata(pdev);
454442
455443 console_lock();
456
-
457
- ret = pci_set_power_state(pdev, PCI_D0);
458
- if (ret) {
459
- dev_err(&pdev->dev,
460
- "error:%d occurred in pci_set_power_state\n", ret);
461
- goto lynxfb_resume_err;
462
- }
463
-
464
- if (pdev->dev.power.power_state.event != PM_EVENT_FREEZE) {
465
- pci_restore_state(pdev);
466
- ret = pci_enable_device(pdev);
467
- if (ret) {
468
- dev_err(&pdev->dev,
469
- "error:%d occurred in pci_enable_device\n",
470
- ret);
471
- goto lynxfb_resume_err;
472
- }
473
- pci_set_master(pdev);
474
- }
475444
476445 hw_sm750_inithw(sm750_dev, pdev);
477446
....@@ -501,19 +470,19 @@
501470
502471 pdev->dev.power.power_state.event = PM_EVENT_RESUME;
503472
504
-lynxfb_resume_err:
505473 console_unlock();
506
- return ret;
474
+ return 0;
507475 }
508
-#endif
509476
510477 static int lynxfb_ops_check_var(struct fb_var_screeninfo *var,
511478 struct fb_info *info)
512479 {
480
+ int ret;
513481 struct lynxfb_par *par;
514482 struct lynxfb_crtc *crtc;
515483 resource_size_t request;
516484
485
+ ret = 0;
517486 par = info->par;
518487 crtc = &par->crtc;
519488
....@@ -522,47 +491,17 @@
522491 var->yres,
523492 var->bits_per_pixel);
524493
525
- switch (var->bits_per_pixel) {
526
- case 8:
527
- info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
528
- var->red.offset = 0;
529
- var->red.length = 8;
530
- var->green.offset = 0;
531
- var->green.length = 8;
532
- var->blue.offset = 0;
533
- var->blue.length = 8;
534
- var->transp.length = 0;
535
- var->transp.offset = 0;
536
- break;
537
- case 16:
538
- var->red.offset = 11;
539
- var->red.length = 5;
540
- var->green.offset = 5;
541
- var->green.length = 6;
542
- var->blue.offset = 0;
543
- var->blue.length = 5;
544
- var->transp.length = 0;
545
- var->transp.offset = 0;
546
- info->fix.visual = FB_VISUAL_TRUECOLOR;
547
- break;
548
- case 24:
549
- case 32:
550
- var->red.offset = 16;
551
- var->red.length = 8;
552
- var->green.offset = 8;
553
- var->green.length = 8;
554
- var->blue.offset = 0;
555
- var->blue.length = 8;
556
- info->fix.visual = FB_VISUAL_TRUECOLOR;
557
- break;
558
- default:
494
+ ret = lynxfb_set_color_offsets(info);
495
+
496
+ if (ret) {
559497 pr_err("bpp %d not supported\n", var->bits_per_pixel);
560
- return -EINVAL;
498
+ return ret;
561499 }
500
+
562501 var->height = var->width = -1;
563502 var->accel_flags = 0;/* FB_ACCELF_TEXT; */
564503
565
- /* check if current fb's video memory big enought to hold the onscreen*/
504
+ /* check if current fb's video memory big enough to hold the onscreen*/
566505 request = var->xres_virtual * (var->bits_per_pixel >> 3);
567506 /* defaulty crtc->channel go with par->index */
568507
....@@ -695,7 +634,7 @@
695634 output->paths = sm750_crt;
696635 crtc->channel = sm750_secondary;
697636 /* not consider of padding stuffs for oScreen,need fix */
698
- crtc->oScreen = (sm750_dev->vidmem_size >> 1);
637
+ crtc->oScreen = sm750_dev->vidmem_size >> 1;
699638 crtc->vScreen = sm750_dev->pvMem + crtc->oScreen;
700639 }
701640 break;
....@@ -708,8 +647,10 @@
708647 } else {
709648 output->paths = sm750_crt;
710649 crtc->channel = sm750_primary;
711
- /* not consider of padding stuffs for oScreen,need fix */
712
- crtc->oScreen = (sm750_dev->vidmem_size >> 1);
650
+ /* not consider of padding stuffs for oScreen,
651
+ * need fix
652
+ */
653
+ crtc->oScreen = sm750_dev->vidmem_size >> 1;
713654 crtc->vScreen = sm750_dev->pvMem + crtc->oScreen;
714655 }
715656 break;
....@@ -747,7 +688,7 @@
747688 lynx750_ext, NULL, vesa_modes,
748689 };
749690 int cdb[] = {ARRAY_SIZE(lynx750_ext), 0, VESA_MODEDB_SIZE};
750
- static const char *mdb_desc[] = {
691
+ static const char * const mdb_desc[] = {
751692 "driver prepared modes",
752693 "kernel prepared default modedb",
753694 "kernel HELPERS prepared vesa_modes",
....@@ -892,16 +833,8 @@
892833 pr_info("fix->mmio_start = %lx\n", fix->mmio_start);
893834 fix->mmio_len = sm750_dev->vidreg_size;
894835 pr_info("fix->mmio_len = %x\n", fix->mmio_len);
895
- switch (var->bits_per_pixel) {
896
- case 8:
897
- fix->visual = FB_VISUAL_PSEUDOCOLOR;
898
- break;
899
- case 16:
900
- case 24:
901
- case 32:
902
- fix->visual = FB_VISUAL_TRUECOLOR;
903
- break;
904
- }
836
+
837
+ lynxfb_set_visual_mode(info);
905838
906839 /* set var */
907840 var->activate = FB_ACTIVATE_NOW;
....@@ -1008,7 +941,7 @@
1008941 }
1009942 }
1010943
1011
-static void sm750fb_frambuffer_release(struct sm750_dev *sm750_dev)
944
+static void sm750fb_framebuffer_release(struct sm750_dev *sm750_dev)
1012945 {
1013946 struct fb_info *fb_info;
1014947
....@@ -1020,7 +953,7 @@
1020953 }
1021954 }
1022955
1023
-static int sm750fb_frambuffer_alloc(struct sm750_dev *sm750_dev, int fbidx)
956
+static int sm750fb_framebuffer_alloc(struct sm750_dev *sm750_dev, int fbidx)
1024957 {
1025958 struct fb_info *fb_info;
1026959 struct lynxfb_par *par;
....@@ -1138,7 +1071,7 @@
11381071 /* allocate frame buffer info structures according to g_dualview */
11391072 max_fb = g_dualview ? 2 : 1;
11401073 for (fbidx = 0; fbidx < max_fb; fbidx++) {
1141
- err = sm750fb_frambuffer_alloc(sm750_dev, fbidx);
1074
+ err = sm750fb_framebuffer_alloc(sm750_dev, fbidx);
11421075 if (err)
11431076 goto release_fb;
11441077 }
....@@ -1146,7 +1079,7 @@
11461079 return 0;
11471080
11481081 release_fb:
1149
- sm750fb_frambuffer_release(sm750_dev);
1082
+ sm750fb_framebuffer_release(sm750_dev);
11501083 return err;
11511084 }
11521085
....@@ -1156,7 +1089,7 @@
11561089
11571090 sm750_dev = pci_get_drvdata(pdev);
11581091
1159
- sm750fb_frambuffer_release(sm750_dev);
1092
+ sm750fb_framebuffer_release(sm750_dev);
11601093 arch_phys_wc_del(sm750_dev->mtrr.vram);
11611094
11621095 iounmap(sm750_dev->pvReg);
....@@ -1222,15 +1155,14 @@
12221155
12231156 MODULE_DEVICE_TABLE(pci, smi_pci_table);
12241157
1158
+static SIMPLE_DEV_PM_OPS(lynxfb_pm_ops, lynxfb_suspend, lynxfb_resume);
1159
+
12251160 static struct pci_driver lynxfb_driver = {
12261161 .name = "sm750fb",
12271162 .id_table = smi_pci_table,
12281163 .probe = lynxfb_pci_probe,
12291164 .remove = lynxfb_pci_remove,
1230
-#ifdef CONFIG_PM
1231
- .suspend = lynxfb_suspend,
1232
- .resume = lynxfb_resume,
1233
-#endif
1165
+ .driver.pm = &lynxfb_pm_ops,
12341166 };
12351167
12361168 static int __init lynxfb_init(void)