Commit 138a451cce3a48792b4c785557578138dc8a5cc3
Committed by
Linus Torvalds
1 parent
45f169ec81
Exists in
master
and in
20 other branches
pm2fb: Permedia 2V initialization fixes
This patch: - initializes correctly the Permedia2V chip if it is not initialized by BIOS - puts back clock frequency for the ELSA WINNER board to 100kHz - fixes returned error values from setcolreg() function - uses more general classes for PCI ids Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl> Signed-off-by: Antonino Daplas <adaplas@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 2 changed files with 19 additions and 24 deletions Side-by-side Diff
drivers/video/pm2fb.c
... | ... | @@ -343,7 +343,7 @@ |
343 | 343 | |
344 | 344 | static void reset_config(struct pm2fb_par* p) |
345 | 345 | { |
346 | - WAIT_FIFO(p, 52); | |
346 | + WAIT_FIFO(p, 53); | |
347 | 347 | pm2_WR(p, PM2R_CHIP_CONFIG, pm2_RD(p, PM2R_CHIP_CONFIG) & |
348 | 348 | ~(PM2F_VGA_ENABLE | PM2F_VGA_FIXED)); |
349 | 349 | pm2_WR(p, PM2R_BYPASS_WRITE_MASK, ~(0L)); |
... | ... | @@ -380,6 +380,7 @@ |
380 | 380 | pm2_WR(p, PM2R_STATISTICS_MODE, 0); |
381 | 381 | pm2_WR(p, PM2R_SCISSOR_MODE, 0); |
382 | 382 | pm2_WR(p, PM2R_FILTER_MODE, PM2F_SYNCHRONIZATION); |
383 | + pm2_WR(p, PM2R_RD_PIXEL_MASK, 0xff); | |
383 | 384 | switch (p->type) { |
384 | 385 | case PM2_TYPE_PERMEDIA2: |
385 | 386 | pm2_RDAC_WR(p, PM2I_RD_MODE_CONTROL, 0); /* no overlay */ |
... | ... | @@ -393,11 +394,6 @@ |
393 | 394 | break; |
394 | 395 | case PM2_TYPE_PERMEDIA2V: |
395 | 396 | pm2v_RDAC_WR(p, PM2VI_RD_MISC_CONTROL, 1); /* 8bit */ |
396 | - pm2v_RDAC_WR(p, PM2I_RD_COLOR_KEY_CONTROL, 0); | |
397 | - pm2v_RDAC_WR(p, PM2I_RD_OVERLAY_KEY, 0); | |
398 | - pm2v_RDAC_WR(p, PM2I_RD_RED_KEY, 0); | |
399 | - pm2v_RDAC_WR(p, PM2I_RD_GREEN_KEY, 0); | |
400 | - pm2v_RDAC_WR(p, PM2I_RD_BLUE_KEY, 0); | |
401 | 397 | break; |
402 | 398 | } |
403 | 399 | } |
... | ... | @@ -532,7 +528,7 @@ |
532 | 528 | vsync &= ~(PM2F_HSYNC_MASK | PM2F_VSYNC_MASK); |
533 | 529 | vsync |= PM2F_HSYNC_ACT_HIGH | PM2F_VSYNC_ACT_HIGH; |
534 | 530 | |
535 | - WAIT_FIFO(p, 5); | |
531 | + WAIT_FIFO(p, 3); | |
536 | 532 | pm2_WR(p, PM2R_VIDEO_CONTROL, vsync); |
537 | 533 | |
538 | 534 | switch (p->type) { |
... | ... | @@ -551,7 +547,6 @@ |
551 | 547 | if ((video & PM2F_VSYNC_MASK) == PM2F_VSYNC_ACT_LOW) |
552 | 548 | tmp |= 4; /* invert vsync */ |
553 | 549 | pm2v_RDAC_WR(p, PM2VI_RD_SYNC_CONTROL, tmp); |
554 | - pm2v_RDAC_WR(p, PM2VI_RD_MISC_CONTROL, 1); | |
555 | 550 | break; |
556 | 551 | } |
557 | 552 | } |
... | ... | @@ -686,6 +681,7 @@ |
686 | 681 | u32 txtmap = 0; |
687 | 682 | u32 pixsize = 0; |
688 | 683 | u32 clrformat = 0; |
684 | + u32 misc = 1; /* 8-bit DAC */ | |
689 | 685 | u32 xres = (info->var.xres + 31) & ~31; |
690 | 686 | int data64; |
691 | 687 | |
... | ... | @@ -767,7 +763,7 @@ |
767 | 763 | switch (depth) { |
768 | 764 | case 8: |
769 | 765 | pm2_WR(par, PM2R_FB_READ_PIXEL, 0); |
770 | - clrformat = 0x0e; | |
766 | + clrformat = 0x2e; | |
771 | 767 | break; |
772 | 768 | case 16: |
773 | 769 | pm2_WR(par, PM2R_FB_READ_PIXEL, 1); |
... | ... | @@ -775,6 +771,7 @@ |
775 | 771 | txtmap = PM2F_TEXTEL_SIZE_16; |
776 | 772 | pixsize = 1; |
777 | 773 | clrformat = 0x70; |
774 | + misc |= 8; | |
778 | 775 | break; |
779 | 776 | case 32: |
780 | 777 | pm2_WR(par, PM2R_FB_READ_PIXEL, 2); |
... | ... | @@ -782,6 +779,7 @@ |
782 | 779 | txtmap = PM2F_TEXTEL_SIZE_32; |
783 | 780 | pixsize = 2; |
784 | 781 | clrformat = 0x20; |
782 | + misc |= 8; | |
785 | 783 | break; |
786 | 784 | case 24: |
787 | 785 | pm2_WR(par, PM2R_FB_READ_PIXEL, 4); |
... | ... | @@ -789,6 +787,7 @@ |
789 | 787 | txtmap = PM2F_TEXTEL_SIZE_24; |
790 | 788 | pixsize = 4; |
791 | 789 | clrformat = 0x20; |
790 | + misc |= 8; | |
792 | 791 | break; |
793 | 792 | } |
794 | 793 | pm2_WR(par, PM2R_FB_WRITE_MODE, PM2F_FB_WRITE_ENABLE); |
... | ... | @@ -813,7 +812,7 @@ |
813 | 812 | pm2_WR(par, PM2R_SCREEN_BASE, base); |
814 | 813 | wmb(); |
815 | 814 | set_video(par, video); |
816 | - WAIT_FIFO(par, 6); | |
815 | + WAIT_FIFO(par, 10); | |
817 | 816 | switch (par->type) { |
818 | 817 | case PM2_TYPE_PERMEDIA2: |
819 | 818 | pm2_RDAC_WR(par, PM2I_RD_COLOR_MODE, clrmode); |
820 | 819 | |
... | ... | @@ -821,10 +820,11 @@ |
821 | 820 | (depth == 8) ? 0 : PM2F_COLOR_KEY_TEST_OFF); |
822 | 821 | break; |
823 | 822 | case PM2_TYPE_PERMEDIA2V: |
823 | + pm2v_RDAC_WR(par, PM2VI_RD_DAC_CONTROL, 0); | |
824 | 824 | pm2v_RDAC_WR(par, PM2VI_RD_PIXEL_SIZE, pixsize); |
825 | 825 | pm2v_RDAC_WR(par, PM2VI_RD_COLOR_FORMAT, clrformat); |
826 | - pm2v_RDAC_WR(par, PM2I_RD_COLOR_KEY_CONTROL, | |
827 | - (depth == 8) ? 0 : PM2F_COLOR_KEY_TEST_OFF); | |
826 | + pm2v_RDAC_WR(par, PM2VI_RD_MISC_CONTROL, misc); | |
827 | + pm2v_RDAC_WR(par, PM2VI_RD_OVERLAY_KEY, 0); | |
828 | 828 | break; |
829 | 829 | } |
830 | 830 | set_pixclock(par, pixclock); |
... | ... | @@ -855,7 +855,7 @@ |
855 | 855 | struct pm2fb_par *par = info->par; |
856 | 856 | |
857 | 857 | if (regno >= info->cmap.len) /* no. of hw registers */ |
858 | - return 1; | |
858 | + return -EINVAL; | |
859 | 859 | /* |
860 | 860 | * Program hardware... do anything you want with transp |
861 | 861 | */ |
... | ... | @@ -914,7 +914,7 @@ |
914 | 914 | u32 v; |
915 | 915 | |
916 | 916 | if (regno >= 16) |
917 | - return 1; | |
917 | + return -EINVAL; | |
918 | 918 | |
919 | 919 | v = (red << info->var.red.offset) | |
920 | 920 | (green << info->var.green.offset) | |
... | ... | @@ -1341,7 +1341,7 @@ |
1341 | 1341 | DPRINTK("We have not been initialized by VGA BIOS " |
1342 | 1342 | "and are running on an Elsa Winner 2000 Office\n"); |
1343 | 1343 | DPRINTK("Initializing card timings manually...\n"); |
1344 | - default_par->memclock = 70000; | |
1344 | + default_par->memclock = 100000; | |
1345 | 1345 | } |
1346 | 1346 | if (pdev->subsystem_vendor == 0x3d3d && |
1347 | 1347 | pdev->subsystem_device == 0x0100) { |
1348 | 1348 | |
1349 | 1349 | |
... | ... | @@ -1491,17 +1491,11 @@ |
1491 | 1491 | |
1492 | 1492 | static struct pci_device_id pm2fb_id_table[] = { |
1493 | 1493 | { PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TVP4020, |
1494 | - PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16, | |
1495 | - 0xff0000, 0 }, | |
1494 | + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, | |
1496 | 1495 | { PCI_VENDOR_ID_3DLABS, PCI_DEVICE_ID_3DLABS_PERMEDIA2, |
1497 | - PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16, | |
1498 | - 0xff0000, 0 }, | |
1496 | + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, | |
1499 | 1497 | { PCI_VENDOR_ID_3DLABS, PCI_DEVICE_ID_3DLABS_PERMEDIA2V, |
1500 | - PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16, | |
1501 | - 0xff0000, 0 }, | |
1502 | - { PCI_VENDOR_ID_3DLABS, PCI_DEVICE_ID_3DLABS_PERMEDIA2V, | |
1503 | - PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NOT_DEFINED_VGA << 8, | |
1504 | - 0xff00, 0 }, | |
1498 | + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, | |
1505 | 1499 | { 0, } |
1506 | 1500 | }; |
1507 | 1501 |
include/video/permedia2.h
... | ... | @@ -153,6 +153,7 @@ |
153 | 153 | #define PM2VI_RD_CURSOR_Y_HIGH 0x00A |
154 | 154 | #define PM2VI_RD_CURSOR_X_HOT 0x00B |
155 | 155 | #define PM2VI_RD_CURSOR_Y_HOT 0x00C |
156 | +#define PM2VI_RD_OVERLAY_KEY 0x00D | |
156 | 157 | #define PM2VI_RD_CLK0_PRESCALE 0x201 |
157 | 158 | #define PM2VI_RD_CLK0_FEEDBACK 0x202 |
158 | 159 | #define PM2VI_RD_CLK0_POSTSCALE 0x203 |