| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * macfb.c: Generic framebuffer for Macs whose colourmaps/modes we |
|---|
| 3 | 4 | * don't know how to set. |
|---|
| .. | .. |
|---|
| 17 | 18 | * |
|---|
| 18 | 19 | * The VideoToolbox "Bugs" web page at |
|---|
| 19 | 20 | * http://rajsky.psych.nyu.edu/Tips/VideoBugs.html |
|---|
| 20 | | - * |
|---|
| 21 | | - * This code is free software. You may copy, modify, and distribute |
|---|
| 22 | | - * it subject to the terms and conditions of the GNU General Public |
|---|
| 23 | | - * License, version 2, or any later version, at your convenience. |
|---|
| 24 | 21 | */ |
|---|
| 25 | 22 | |
|---|
| 26 | 23 | #include <linux/module.h> |
|---|
| .. | .. |
|---|
| 120 | 117 | #define PIXEL_TO_MM(a) (((a)*10)/28) /* width in mm at 72 dpi */ |
|---|
| 121 | 118 | |
|---|
| 122 | 119 | static struct fb_var_screeninfo macfb_defined = { |
|---|
| 123 | | - .bits_per_pixel = 8, |
|---|
| 124 | 120 | .activate = FB_ACTIVATE_NOW, |
|---|
| 125 | | - .width = -1, |
|---|
| 126 | | - .height = -1, |
|---|
| 127 | 121 | .right_margin = 32, |
|---|
| 128 | 122 | .upper_margin = 16, |
|---|
| 129 | 123 | .lower_margin = 4, |
|---|
| .. | .. |
|---|
| 139 | 133 | static void *slot_addr; |
|---|
| 140 | 134 | static struct fb_info fb_info; |
|---|
| 141 | 135 | static u32 pseudo_palette[16]; |
|---|
| 142 | | -static int inverse; |
|---|
| 143 | 136 | static int vidtest; |
|---|
| 144 | 137 | |
|---|
| 145 | 138 | /* |
|---|
| .. | .. |
|---|
| 152 | 145 | unsigned int green, unsigned int blue, |
|---|
| 153 | 146 | struct fb_info *info) |
|---|
| 154 | 147 | { |
|---|
| 155 | | - static int lastreg = -1; |
|---|
| 148 | + static int lastreg = -2; |
|---|
| 156 | 149 | unsigned long flags; |
|---|
| 157 | 150 | |
|---|
| 158 | 151 | local_irq_save(flags); |
|---|
| .. | .. |
|---|
| 201 | 194 | unsigned int bpp = info->var.bits_per_pixel; |
|---|
| 202 | 195 | unsigned long flags; |
|---|
| 203 | 196 | |
|---|
| 204 | | - if (bpp > 8) |
|---|
| 205 | | - return 1; /* failsafe */ |
|---|
| 206 | | - |
|---|
| 207 | 197 | local_irq_save(flags); |
|---|
| 208 | 198 | |
|---|
| 209 | 199 | /* On these chips, the CLUT register numbers are spread out |
|---|
| .. | .. |
|---|
| 233 | 223 | struct fb_info *info) |
|---|
| 234 | 224 | { |
|---|
| 235 | 225 | unsigned long flags; |
|---|
| 236 | | - |
|---|
| 237 | | - if (info->var.bits_per_pixel > 8) |
|---|
| 238 | | - return 1; /* failsafe */ |
|---|
| 239 | 226 | |
|---|
| 240 | 227 | local_irq_save(flags); |
|---|
| 241 | 228 | |
|---|
| .. | .. |
|---|
| 353 | 340 | unsigned long flags; |
|---|
| 354 | 341 | int clut_status; |
|---|
| 355 | 342 | |
|---|
| 356 | | - if (info->var.bits_per_pixel > 8) |
|---|
| 357 | | - return 1; /* failsafe */ |
|---|
| 358 | | - |
|---|
| 359 | 343 | local_irq_save(flags); |
|---|
| 360 | 344 | |
|---|
| 361 | 345 | /* Set the register address */ |
|---|
| .. | .. |
|---|
| 494 | 478 | break; |
|---|
| 495 | 479 | /* |
|---|
| 496 | 480 | * 24-bit colour almost doesn't exist on 68k Macs -- |
|---|
| 497 | | - * http://support.apple.com/kb/TA28634 (Old Article: 10992) |
|---|
| 481 | + * https://support.apple.com/kb/TA28634 (Old Article: 10992) |
|---|
| 498 | 482 | */ |
|---|
| 499 | 483 | case 24: |
|---|
| 500 | 484 | case 32: |
|---|
| .. | .. |
|---|
| 512 | 496 | return 0; |
|---|
| 513 | 497 | } |
|---|
| 514 | 498 | |
|---|
| 515 | | -static struct fb_ops macfb_ops = { |
|---|
| 499 | +static const struct fb_ops macfb_ops = { |
|---|
| 516 | 500 | .owner = THIS_MODULE, |
|---|
| 517 | 501 | .fb_setcolreg = macfb_setcolreg, |
|---|
| 518 | 502 | .fb_fillrect = cfb_fillrect, |
|---|
| .. | .. |
|---|
| 532 | 516 | continue; |
|---|
| 533 | 517 | |
|---|
| 534 | 518 | if (!strcmp(this_opt, "inverse")) |
|---|
| 535 | | - inverse = 1; |
|---|
| 519 | + fb_invert_cmaps(); |
|---|
| 536 | 520 | else |
|---|
| 537 | 521 | if (!strcmp(this_opt, "vidtest")) |
|---|
| 538 | 522 | vidtest = 1; /* enable experimental CLUT code */ |
|---|
| .. | .. |
|---|
| 688 | 672 | case NUBUS_DRHW_APPLE_MDC: |
|---|
| 689 | 673 | strcpy(macfb_fix.id, "Mac Disp. Card"); |
|---|
| 690 | 674 | macfb_setpalette = mdc_setpalette; |
|---|
| 691 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 692 | 675 | break; |
|---|
| 693 | 676 | case NUBUS_DRHW_APPLE_TFB: |
|---|
| 694 | 677 | strcpy(macfb_fix.id, "Toby"); |
|---|
| 695 | 678 | macfb_setpalette = toby_setpalette; |
|---|
| 696 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 697 | 679 | break; |
|---|
| 698 | 680 | case NUBUS_DRHW_APPLE_JET: |
|---|
| 699 | 681 | strcpy(macfb_fix.id, "Jet"); |
|---|
| 700 | 682 | macfb_setpalette = jet_setpalette; |
|---|
| 701 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 702 | 683 | break; |
|---|
| 703 | 684 | default: |
|---|
| 704 | 685 | strcpy(macfb_fix.id, "Generic NuBus"); |
|---|
| .. | .. |
|---|
| 731 | 712 | strcpy(macfb_fix.id, "DAFB"); |
|---|
| 732 | 713 | macfb_setpalette = dafb_setpalette; |
|---|
| 733 | 714 | dafb_cmap_regs = ioremap(DAFB_BASE, 0x1000); |
|---|
| 734 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 735 | 715 | break; |
|---|
| 736 | 716 | |
|---|
| 737 | 717 | /* |
|---|
| .. | .. |
|---|
| 741 | 721 | strcpy(macfb_fix.id, "V8"); |
|---|
| 742 | 722 | macfb_setpalette = v8_brazil_setpalette; |
|---|
| 743 | 723 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); |
|---|
| 744 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 745 | 724 | break; |
|---|
| 746 | 725 | |
|---|
| 747 | 726 | /* |
|---|
| .. | .. |
|---|
| 755 | 734 | strcpy(macfb_fix.id, "Brazil"); |
|---|
| 756 | 735 | macfb_setpalette = v8_brazil_setpalette; |
|---|
| 757 | 736 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); |
|---|
| 758 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 759 | 737 | break; |
|---|
| 760 | 738 | |
|---|
| 761 | 739 | /* |
|---|
| .. | .. |
|---|
| 772 | 750 | strcpy(macfb_fix.id, "Sonora"); |
|---|
| 773 | 751 | macfb_setpalette = v8_brazil_setpalette; |
|---|
| 774 | 752 | v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); |
|---|
| 775 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 776 | 753 | break; |
|---|
| 777 | 754 | |
|---|
| 778 | 755 | /* |
|---|
| .. | .. |
|---|
| 785 | 762 | strcpy(macfb_fix.id, "RBV"); |
|---|
| 786 | 763 | macfb_setpalette = rbv_setpalette; |
|---|
| 787 | 764 | rbv_cmap_regs = ioremap(DAC_BASE, 0x1000); |
|---|
| 788 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 789 | 765 | break; |
|---|
| 790 | 766 | |
|---|
| 791 | 767 | /* |
|---|
| .. | .. |
|---|
| 796 | 772 | strcpy(macfb_fix.id, "Civic"); |
|---|
| 797 | 773 | macfb_setpalette = civic_setpalette; |
|---|
| 798 | 774 | civic_cmap_regs = ioremap(CIVIC_BASE, 0x1000); |
|---|
| 799 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 800 | 775 | break; |
|---|
| 801 | 776 | |
|---|
| 802 | 777 | |
|---|
| .. | .. |
|---|
| 810 | 785 | macfb_setpalette = v8_brazil_setpalette; |
|---|
| 811 | 786 | v8_brazil_cmap_regs = |
|---|
| 812 | 787 | ioremap(DAC_BASE, 0x1000); |
|---|
| 813 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 814 | 788 | } |
|---|
| 815 | 789 | break; |
|---|
| 816 | 790 | |
|---|
| .. | .. |
|---|
| 823 | 797 | macfb_setpalette = v8_brazil_setpalette; |
|---|
| 824 | 798 | v8_brazil_cmap_regs = |
|---|
| 825 | 799 | ioremap(DAC_BASE, 0x1000); |
|---|
| 826 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 827 | 800 | } |
|---|
| 828 | 801 | break; |
|---|
| 829 | 802 | |
|---|
| .. | .. |
|---|
| 892 | 865 | strcpy(macfb_fix.id, "CSC"); |
|---|
| 893 | 866 | macfb_setpalette = csc_setpalette; |
|---|
| 894 | 867 | csc_cmap_regs = ioremap(CSC_BASE, 0x1000); |
|---|
| 895 | | - macfb_defined.activate = FB_ACTIVATE_NOW; |
|---|
| 896 | 868 | break; |
|---|
| 897 | 869 | |
|---|
| 898 | 870 | default: |
|---|