| .. | .. |
|---|
| 74 | 74 | static int bpp = 8; |
|---|
| 75 | 75 | static int reverse_i2c; |
|---|
| 76 | 76 | static bool nomtrr = false; |
|---|
| 77 | | -#ifdef CONFIG_PMAC_BACKLIGHT |
|---|
| 78 | | -static int backlight = 1; |
|---|
| 79 | | -#else |
|---|
| 80 | | -static int backlight = 0; |
|---|
| 81 | | -#endif |
|---|
| 77 | +static int backlight = IS_BUILTIN(CONFIG_PMAC_BACKLIGHT); |
|---|
| 82 | 78 | |
|---|
| 83 | 79 | static char *mode_option = NULL; |
|---|
| 84 | 80 | |
|---|
| .. | .. |
|---|
| 168 | 164 | { |
|---|
| 169 | 165 | int tweak = 0; |
|---|
| 170 | 166 | |
|---|
| 171 | | - if (par->paneltweak) { |
|---|
| 172 | | - tweak = par->paneltweak; |
|---|
| 173 | | - } else { |
|---|
| 174 | | - /* begin flat panel hacks */ |
|---|
| 175 | | - /* This is unfortunate, but some chips need this register |
|---|
| 176 | | - tweaked or else you get artifacts where adjacent pixels are |
|---|
| 177 | | - swapped. There are no hard rules for what to set here so all |
|---|
| 178 | | - we can do is experiment and apply hacks. */ |
|---|
| 167 | + if (par->paneltweak) { |
|---|
| 168 | + tweak = par->paneltweak; |
|---|
| 169 | + } else { |
|---|
| 170 | + /* Begin flat panel hacks. |
|---|
| 171 | + * This is unfortunate, but some chips need this register |
|---|
| 172 | + * tweaked or else you get artifacts where adjacent pixels are |
|---|
| 173 | + * swapped. There are no hard rules for what to set here so all |
|---|
| 174 | + * we can do is experiment and apply hacks. |
|---|
| 175 | + */ |
|---|
| 176 | + if (((par->Chipset & 0xffff) == 0x0328) && (state->bpp == 32)) { |
|---|
| 177 | + /* At least one NV34 laptop needs this workaround. */ |
|---|
| 178 | + tweak = -1; |
|---|
| 179 | + } |
|---|
| 179 | 180 | |
|---|
| 180 | | - if(((par->Chipset & 0xffff) == 0x0328) && (state->bpp == 32)) { |
|---|
| 181 | | - /* At least one NV34 laptop needs this workaround. */ |
|---|
| 182 | | - tweak = -1; |
|---|
| 183 | | - } |
|---|
| 181 | + if ((par->Chipset & 0xfff0) == 0x0310) |
|---|
| 182 | + tweak = 1; |
|---|
| 183 | + /* end flat panel hacks */ |
|---|
| 184 | + } |
|---|
| 184 | 185 | |
|---|
| 185 | | - if((par->Chipset & 0xfff0) == 0x0310) { |
|---|
| 186 | | - tweak = 1; |
|---|
| 187 | | - } |
|---|
| 188 | | - /* end flat panel hacks */ |
|---|
| 189 | | - } |
|---|
| 190 | | - |
|---|
| 191 | | - return tweak; |
|---|
| 186 | + return tweak; |
|---|
| 192 | 187 | } |
|---|
| 193 | 188 | |
|---|
| 194 | 189 | static void nvidia_screen_off(struct nvidia_par *par, int on) |
|---|
| .. | .. |
|---|
| 607 | 602 | return 0; |
|---|
| 608 | 603 | } |
|---|
| 609 | 604 | |
|---|
| 605 | +static struct fb_ops nvidia_fb_ops; |
|---|
| 606 | + |
|---|
| 610 | 607 | static int nvidiafb_set_par(struct fb_info *info) |
|---|
| 611 | 608 | { |
|---|
| 612 | 609 | struct nvidia_par *par = info->par; |
|---|
| .. | .. |
|---|
| 660 | 657 | info->fix.line_length = (info->var.xres_virtual * |
|---|
| 661 | 658 | info->var.bits_per_pixel) >> 3; |
|---|
| 662 | 659 | if (info->var.accel_flags) { |
|---|
| 663 | | - info->fbops->fb_imageblit = nvidiafb_imageblit; |
|---|
| 664 | | - info->fbops->fb_fillrect = nvidiafb_fillrect; |
|---|
| 665 | | - info->fbops->fb_copyarea = nvidiafb_copyarea; |
|---|
| 666 | | - info->fbops->fb_sync = nvidiafb_sync; |
|---|
| 660 | + nvidia_fb_ops.fb_imageblit = nvidiafb_imageblit; |
|---|
| 661 | + nvidia_fb_ops.fb_fillrect = nvidiafb_fillrect; |
|---|
| 662 | + nvidia_fb_ops.fb_copyarea = nvidiafb_copyarea; |
|---|
| 663 | + nvidia_fb_ops.fb_sync = nvidiafb_sync; |
|---|
| 667 | 664 | info->pixmap.scan_align = 4; |
|---|
| 668 | 665 | info->flags &= ~FBINFO_HWACCEL_DISABLED; |
|---|
| 669 | 666 | info->flags |= FBINFO_READS_FAST; |
|---|
| 670 | 667 | NVResetGraphics(info); |
|---|
| 671 | 668 | } else { |
|---|
| 672 | | - info->fbops->fb_imageblit = cfb_imageblit; |
|---|
| 673 | | - info->fbops->fb_fillrect = cfb_fillrect; |
|---|
| 674 | | - info->fbops->fb_copyarea = cfb_copyarea; |
|---|
| 675 | | - info->fbops->fb_sync = NULL; |
|---|
| 669 | + nvidia_fb_ops.fb_imageblit = cfb_imageblit; |
|---|
| 670 | + nvidia_fb_ops.fb_fillrect = cfb_fillrect; |
|---|
| 671 | + nvidia_fb_ops.fb_copyarea = cfb_copyarea; |
|---|
| 672 | + nvidia_fb_ops.fb_sync = NULL; |
|---|
| 676 | 673 | info->pixmap.scan_align = 1; |
|---|
| 677 | 674 | info->flags |= FBINFO_HWACCEL_DISABLED; |
|---|
| 678 | 675 | info->flags &= ~FBINFO_READS_FAST; |
|---|
| .. | .. |
|---|
| 1040 | 1037 | .fb_sync = nvidiafb_sync, |
|---|
| 1041 | 1038 | }; |
|---|
| 1042 | 1039 | |
|---|
| 1043 | | -#ifdef CONFIG_PM |
|---|
| 1044 | | -static int nvidiafb_suspend(struct pci_dev *dev, pm_message_t mesg) |
|---|
| 1040 | +static int nvidiafb_suspend_late(struct device *dev, pm_message_t mesg) |
|---|
| 1045 | 1041 | { |
|---|
| 1046 | | - struct fb_info *info = pci_get_drvdata(dev); |
|---|
| 1042 | + struct fb_info *info = dev_get_drvdata(dev); |
|---|
| 1047 | 1043 | struct nvidia_par *par = info->par; |
|---|
| 1048 | 1044 | |
|---|
| 1049 | 1045 | if (mesg.event == PM_EVENT_PRETHAW) |
|---|
| .. | .. |
|---|
| 1055 | 1051 | fb_set_suspend(info, 1); |
|---|
| 1056 | 1052 | nvidiafb_blank(FB_BLANK_POWERDOWN, info); |
|---|
| 1057 | 1053 | nvidia_write_regs(par, &par->SavedReg); |
|---|
| 1058 | | - pci_save_state(dev); |
|---|
| 1059 | | - pci_disable_device(dev); |
|---|
| 1060 | | - pci_set_power_state(dev, pci_choose_state(dev, mesg)); |
|---|
| 1061 | 1054 | } |
|---|
| 1062 | | - dev->dev.power.power_state = mesg; |
|---|
| 1055 | + dev->power.power_state = mesg; |
|---|
| 1063 | 1056 | |
|---|
| 1064 | 1057 | console_unlock(); |
|---|
| 1065 | 1058 | return 0; |
|---|
| 1066 | 1059 | } |
|---|
| 1067 | 1060 | |
|---|
| 1068 | | -static int nvidiafb_resume(struct pci_dev *dev) |
|---|
| 1061 | +static int __maybe_unused nvidiafb_suspend(struct device *dev) |
|---|
| 1069 | 1062 | { |
|---|
| 1070 | | - struct fb_info *info = pci_get_drvdata(dev); |
|---|
| 1063 | + return nvidiafb_suspend_late(dev, PMSG_SUSPEND); |
|---|
| 1064 | +} |
|---|
| 1065 | + |
|---|
| 1066 | +static int __maybe_unused nvidiafb_hibernate(struct device *dev) |
|---|
| 1067 | +{ |
|---|
| 1068 | + return nvidiafb_suspend_late(dev, PMSG_HIBERNATE); |
|---|
| 1069 | +} |
|---|
| 1070 | + |
|---|
| 1071 | +static int __maybe_unused nvidiafb_freeze(struct device *dev) |
|---|
| 1072 | +{ |
|---|
| 1073 | + return nvidiafb_suspend_late(dev, PMSG_FREEZE); |
|---|
| 1074 | +} |
|---|
| 1075 | + |
|---|
| 1076 | +static int __maybe_unused nvidiafb_resume(struct device *dev) |
|---|
| 1077 | +{ |
|---|
| 1078 | + struct fb_info *info = dev_get_drvdata(dev); |
|---|
| 1071 | 1079 | struct nvidia_par *par = info->par; |
|---|
| 1072 | 1080 | |
|---|
| 1073 | 1081 | console_lock(); |
|---|
| 1074 | | - pci_set_power_state(dev, PCI_D0); |
|---|
| 1075 | | - |
|---|
| 1076 | | - if (par->pm_state != PM_EVENT_FREEZE) { |
|---|
| 1077 | | - pci_restore_state(dev); |
|---|
| 1078 | | - |
|---|
| 1079 | | - if (pci_enable_device(dev)) |
|---|
| 1080 | | - goto fail; |
|---|
| 1081 | | - |
|---|
| 1082 | | - pci_set_master(dev); |
|---|
| 1083 | | - } |
|---|
| 1084 | 1082 | |
|---|
| 1085 | 1083 | par->pm_state = PM_EVENT_ON; |
|---|
| 1086 | 1084 | nvidiafb_set_par(info); |
|---|
| 1087 | 1085 | fb_set_suspend (info, 0); |
|---|
| 1088 | 1086 | nvidiafb_blank(FB_BLANK_UNBLANK, info); |
|---|
| 1089 | 1087 | |
|---|
| 1090 | | -fail: |
|---|
| 1091 | 1088 | console_unlock(); |
|---|
| 1092 | 1089 | return 0; |
|---|
| 1093 | 1090 | } |
|---|
| 1094 | | -#else |
|---|
| 1095 | | -#define nvidiafb_suspend NULL |
|---|
| 1096 | | -#define nvidiafb_resume NULL |
|---|
| 1097 | | -#endif |
|---|
| 1091 | + |
|---|
| 1092 | +static const struct dev_pm_ops nvidiafb_pm_ops = { |
|---|
| 1093 | +#ifdef CONFIG_PM_SLEEP |
|---|
| 1094 | + .suspend = nvidiafb_suspend, |
|---|
| 1095 | + .resume = nvidiafb_resume, |
|---|
| 1096 | + .freeze = nvidiafb_freeze, |
|---|
| 1097 | + .thaw = nvidiafb_resume, |
|---|
| 1098 | + .poweroff = nvidiafb_hibernate, |
|---|
| 1099 | + .restore = nvidiafb_resume, |
|---|
| 1100 | +#endif /* CONFIG_PM_SLEEP */ |
|---|
| 1101 | +}; |
|---|
| 1098 | 1102 | |
|---|
| 1099 | 1103 | static int nvidia_set_fbinfo(struct fb_info *info) |
|---|
| 1100 | 1104 | { |
|---|
| .. | .. |
|---|
| 1165 | 1169 | info->pixmap.flags = FB_PIXMAP_SYSTEM; |
|---|
| 1166 | 1170 | |
|---|
| 1167 | 1171 | if (!hwcur) |
|---|
| 1168 | | - info->fbops->fb_cursor = NULL; |
|---|
| 1172 | + nvidia_fb_ops.fb_cursor = NULL; |
|---|
| 1169 | 1173 | |
|---|
| 1170 | 1174 | info->var.accel_flags = (!noaccel); |
|---|
| 1171 | 1175 | |
|---|
| .. | .. |
|---|
| 1495 | 1499 | #endif /* !MODULE */ |
|---|
| 1496 | 1500 | |
|---|
| 1497 | 1501 | static struct pci_driver nvidiafb_driver = { |
|---|
| 1498 | | - .name = "nvidiafb", |
|---|
| 1499 | | - .id_table = nvidiafb_pci_tbl, |
|---|
| 1500 | | - .probe = nvidiafb_probe, |
|---|
| 1501 | | - .suspend = nvidiafb_suspend, |
|---|
| 1502 | | - .resume = nvidiafb_resume, |
|---|
| 1503 | | - .remove = nvidiafb_remove, |
|---|
| 1502 | + .name = "nvidiafb", |
|---|
| 1503 | + .id_table = nvidiafb_pci_tbl, |
|---|
| 1504 | + .probe = nvidiafb_probe, |
|---|
| 1505 | + .driver.pm = &nvidiafb_pm_ops, |
|---|
| 1506 | + .remove = nvidiafb_remove, |
|---|
| 1504 | 1507 | }; |
|---|
| 1505 | 1508 | |
|---|
| 1506 | 1509 | /* ------------------------------------------------------------------------- * |
|---|