diff options
Diffstat (limited to 'drivers/video/fbmem.c')
-rw-r--r-- | drivers/video/fbmem.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index cd1407921af5..354711c84aaa 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
@@ -773,6 +773,29 @@ fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var) | |||
773 | return 0; | 773 | return 0; |
774 | } | 774 | } |
775 | 775 | ||
776 | static int fb_check_caps(struct fb_info *info, struct fb_var_screeninfo *var, | ||
777 | u32 activate) | ||
778 | { | ||
779 | struct fb_event event; | ||
780 | struct fb_blit_caps caps, fbcaps; | ||
781 | int err = 0; | ||
782 | |||
783 | memset(&caps, 0, sizeof(caps)); | ||
784 | memset(&fbcaps, 0, sizeof(fbcaps)); | ||
785 | caps.flags = (activate & FB_ACTIVATE_ALL) ? 1 : 0; | ||
786 | event.info = info; | ||
787 | event.data = ∩︀ | ||
788 | fb_notifier_call_chain(FB_EVENT_GET_REQ, &event); | ||
789 | info->fbops->fb_get_caps(info, &fbcaps, var); | ||
790 | |||
791 | if (((fbcaps.x ^ caps.x) & caps.x) || | ||
792 | ((fbcaps.y ^ caps.y) & caps.y) || | ||
793 | (fbcaps.len < caps.len)) | ||
794 | err = -EINVAL; | ||
795 | |||
796 | return err; | ||
797 | } | ||
798 | |||
776 | int | 799 | int |
777 | fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) | 800 | fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) |
778 | { | 801 | { |
@@ -817,7 +840,15 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) | |||
817 | struct fb_videomode mode; | 840 | struct fb_videomode mode; |
818 | int err = 0; | 841 | int err = 0; |
819 | 842 | ||
843 | if (info->fbops->fb_get_caps) { | ||
844 | err = fb_check_caps(info, var, activate); | ||
845 | |||
846 | if (err) | ||
847 | goto done; | ||
848 | } | ||
849 | |||
820 | info->var = *var; | 850 | info->var = *var; |
851 | |||
821 | if (info->fbops->fb_set_par) | 852 | if (info->fbops->fb_set_par) |
822 | info->fbops->fb_set_par(info); | 853 | info->fbops->fb_set_par(info); |
823 | 854 | ||
@@ -843,6 +874,8 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) | |||
843 | } | 874 | } |
844 | } | 875 | } |
845 | } | 876 | } |
877 | |||
878 | done: | ||
846 | return 0; | 879 | return 0; |
847 | } | 880 | } |
848 | 881 | ||