diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/video/fbmem.c | 50 | ||||
| -rw-r--r-- | drivers/video/fbsysfs.c | 19 | ||||
| -rw-r--r-- | drivers/video/sh_mobile_lcdcfb.c | 10 |
3 files changed, 51 insertions, 28 deletions
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index dacaf74256a3..010d19105ebc 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
| @@ -1108,14 +1108,16 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, | |||
| 1108 | case FBIOPUT_VSCREENINFO: | 1108 | case FBIOPUT_VSCREENINFO: |
| 1109 | if (copy_from_user(&var, argp, sizeof(var))) | 1109 | if (copy_from_user(&var, argp, sizeof(var))) |
| 1110 | return -EFAULT; | 1110 | return -EFAULT; |
| 1111 | if (!lock_fb_info(info)) | ||
| 1112 | return -ENODEV; | ||
| 1113 | console_lock(); | 1111 | console_lock(); |
| 1112 | if (!lock_fb_info(info)) { | ||
| 1113 | console_unlock(); | ||
| 1114 | return -ENODEV; | ||
| 1115 | } | ||
| 1114 | info->flags |= FBINFO_MISC_USEREVENT; | 1116 | info->flags |= FBINFO_MISC_USEREVENT; |
| 1115 | ret = fb_set_var(info, &var); | 1117 | ret = fb_set_var(info, &var); |
| 1116 | info->flags &= ~FBINFO_MISC_USEREVENT; | 1118 | info->flags &= ~FBINFO_MISC_USEREVENT; |
| 1117 | console_unlock(); | ||
| 1118 | unlock_fb_info(info); | 1119 | unlock_fb_info(info); |
| 1120 | console_unlock(); | ||
| 1119 | if (!ret && copy_to_user(argp, &var, sizeof(var))) | 1121 | if (!ret && copy_to_user(argp, &var, sizeof(var))) |
| 1120 | ret = -EFAULT; | 1122 | ret = -EFAULT; |
| 1121 | break; | 1123 | break; |
| @@ -1144,12 +1146,14 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, | |||
| 1144 | case FBIOPAN_DISPLAY: | 1146 | case FBIOPAN_DISPLAY: |
| 1145 | if (copy_from_user(&var, argp, sizeof(var))) | 1147 | if (copy_from_user(&var, argp, sizeof(var))) |
| 1146 | return -EFAULT; | 1148 | return -EFAULT; |
| 1147 | if (!lock_fb_info(info)) | ||
| 1148 | return -ENODEV; | ||
| 1149 | console_lock(); | 1149 | console_lock(); |
| 1150 | if (!lock_fb_info(info)) { | ||
| 1151 | console_unlock(); | ||
| 1152 | return -ENODEV; | ||
| 1153 | } | ||
| 1150 | ret = fb_pan_display(info, &var); | 1154 | ret = fb_pan_display(info, &var); |
| 1151 | console_unlock(); | ||
| 1152 | unlock_fb_info(info); | 1155 | unlock_fb_info(info); |
| 1156 | console_unlock(); | ||
| 1153 | if (ret == 0 && copy_to_user(argp, &var, sizeof(var))) | 1157 | if (ret == 0 && copy_to_user(argp, &var, sizeof(var))) |
| 1154 | return -EFAULT; | 1158 | return -EFAULT; |
| 1155 | break; | 1159 | break; |
| @@ -1184,23 +1188,27 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, | |||
| 1184 | break; | 1188 | break; |
| 1185 | } | 1189 | } |
| 1186 | event.data = &con2fb; | 1190 | event.data = &con2fb; |
| 1187 | if (!lock_fb_info(info)) | ||
| 1188 | return -ENODEV; | ||
| 1189 | console_lock(); | 1191 | console_lock(); |
| 1192 | if (!lock_fb_info(info)) { | ||
| 1193 | console_unlock(); | ||
| 1194 | return -ENODEV; | ||
| 1195 | } | ||
| 1190 | event.info = info; | 1196 | event.info = info; |
| 1191 | ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, &event); | 1197 | ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, &event); |
| 1192 | console_unlock(); | ||
| 1193 | unlock_fb_info(info); | 1198 | unlock_fb_info(info); |
| 1199 | console_unlock(); | ||
| 1194 | break; | 1200 | break; |
| 1195 | case FBIOBLANK: | 1201 | case FBIOBLANK: |
| 1196 | if (!lock_fb_info(info)) | ||
| 1197 | return -ENODEV; | ||
| 1198 | console_lock(); | 1202 | console_lock(); |
| 1203 | if (!lock_fb_info(info)) { | ||
| 1204 | console_unlock(); | ||
| 1205 | return -ENODEV; | ||
| 1206 | } | ||
| 1199 | info->flags |= FBINFO_MISC_USEREVENT; | 1207 | info->flags |= FBINFO_MISC_USEREVENT; |
| 1200 | ret = fb_blank(info, arg); | 1208 | ret = fb_blank(info, arg); |
| 1201 | info->flags &= ~FBINFO_MISC_USEREVENT; | 1209 | info->flags &= ~FBINFO_MISC_USEREVENT; |
| 1202 | console_unlock(); | ||
| 1203 | unlock_fb_info(info); | 1210 | unlock_fb_info(info); |
| 1211 | console_unlock(); | ||
| 1204 | break; | 1212 | break; |
| 1205 | default: | 1213 | default: |
| 1206 | if (!lock_fb_info(info)) | 1214 | if (!lock_fb_info(info)) |
| @@ -1660,12 +1668,15 @@ static int do_register_framebuffer(struct fb_info *fb_info) | |||
| 1660 | registered_fb[i] = fb_info; | 1668 | registered_fb[i] = fb_info; |
| 1661 | 1669 | ||
| 1662 | event.info = fb_info; | 1670 | event.info = fb_info; |
| 1663 | if (!lock_fb_info(fb_info)) | ||
| 1664 | return -ENODEV; | ||
| 1665 | console_lock(); | 1671 | console_lock(); |
| 1672 | if (!lock_fb_info(fb_info)) { | ||
| 1673 | console_unlock(); | ||
| 1674 | return -ENODEV; | ||
| 1675 | } | ||
| 1676 | |||
| 1666 | fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event); | 1677 | fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event); |
| 1667 | console_unlock(); | ||
| 1668 | unlock_fb_info(fb_info); | 1678 | unlock_fb_info(fb_info); |
| 1679 | console_unlock(); | ||
| 1669 | return 0; | 1680 | return 0; |
| 1670 | } | 1681 | } |
| 1671 | 1682 | ||
| @@ -1678,13 +1689,16 @@ static int do_unregister_framebuffer(struct fb_info *fb_info) | |||
| 1678 | if (i < 0 || i >= FB_MAX || registered_fb[i] != fb_info) | 1689 | if (i < 0 || i >= FB_MAX || registered_fb[i] != fb_info) |
| 1679 | return -EINVAL; | 1690 | return -EINVAL; |
| 1680 | 1691 | ||
| 1681 | if (!lock_fb_info(fb_info)) | ||
| 1682 | return -ENODEV; | ||
| 1683 | console_lock(); | 1692 | console_lock(); |
| 1693 | if (!lock_fb_info(fb_info)) { | ||
| 1694 | console_unlock(); | ||
| 1695 | return -ENODEV; | ||
| 1696 | } | ||
| 1697 | |||
| 1684 | event.info = fb_info; | 1698 | event.info = fb_info; |
| 1685 | ret = fb_notifier_call_chain(FB_EVENT_FB_UNBIND, &event); | 1699 | ret = fb_notifier_call_chain(FB_EVENT_FB_UNBIND, &event); |
| 1686 | console_unlock(); | ||
| 1687 | unlock_fb_info(fb_info); | 1700 | unlock_fb_info(fb_info); |
| 1701 | console_unlock(); | ||
| 1688 | 1702 | ||
| 1689 | if (ret) | 1703 | if (ret) |
| 1690 | return -EINVAL; | 1704 | return -EINVAL; |
diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c index ef476b02fbe5..53444ac19fe0 100644 --- a/drivers/video/fbsysfs.c +++ b/drivers/video/fbsysfs.c | |||
| @@ -177,9 +177,12 @@ static ssize_t store_modes(struct device *device, | |||
| 177 | if (i * sizeof(struct fb_videomode) != count) | 177 | if (i * sizeof(struct fb_videomode) != count) |
| 178 | return -EINVAL; | 178 | return -EINVAL; |
| 179 | 179 | ||
| 180 | if (!lock_fb_info(fb_info)) | ||
| 181 | return -ENODEV; | ||
| 182 | console_lock(); | 180 | console_lock(); |
| 181 | if (!lock_fb_info(fb_info)) { | ||
| 182 | console_unlock(); | ||
| 183 | return -ENODEV; | ||
| 184 | } | ||
| 185 | |||
| 183 | list_splice(&fb_info->modelist, &old_list); | 186 | list_splice(&fb_info->modelist, &old_list); |
| 184 | fb_videomode_to_modelist((const struct fb_videomode *)buf, i, | 187 | fb_videomode_to_modelist((const struct fb_videomode *)buf, i, |
| 185 | &fb_info->modelist); | 188 | &fb_info->modelist); |
| @@ -189,8 +192,8 @@ static ssize_t store_modes(struct device *device, | |||
| 189 | } else | 192 | } else |
| 190 | fb_destroy_modelist(&old_list); | 193 | fb_destroy_modelist(&old_list); |
| 191 | 194 | ||
| 192 | console_unlock(); | ||
| 193 | unlock_fb_info(fb_info); | 195 | unlock_fb_info(fb_info); |
| 196 | console_unlock(); | ||
| 194 | 197 | ||
| 195 | return 0; | 198 | return 0; |
| 196 | } | 199 | } |
| @@ -404,12 +407,16 @@ static ssize_t store_fbstate(struct device *device, | |||
| 404 | 407 | ||
| 405 | state = simple_strtoul(buf, &last, 0); | 408 | state = simple_strtoul(buf, &last, 0); |
| 406 | 409 | ||
| 407 | if (!lock_fb_info(fb_info)) | ||
| 408 | return -ENODEV; | ||
| 409 | console_lock(); | 410 | console_lock(); |
| 411 | if (!lock_fb_info(fb_info)) { | ||
| 412 | console_unlock(); | ||
| 413 | return -ENODEV; | ||
| 414 | } | ||
| 415 | |||
| 410 | fb_set_suspend(fb_info, (int)state); | 416 | fb_set_suspend(fb_info, (int)state); |
| 411 | console_unlock(); | 417 | |
| 412 | unlock_fb_info(fb_info); | 418 | unlock_fb_info(fb_info); |
| 419 | console_unlock(); | ||
| 413 | 420 | ||
| 414 | return count; | 421 | return count; |
| 415 | } | 422 | } |
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c index eaeae0fd0962..ab85ad6c25ec 100644 --- a/drivers/video/sh_mobile_lcdcfb.c +++ b/drivers/video/sh_mobile_lcdcfb.c | |||
| @@ -574,8 +574,9 @@ static int sh_mobile_lcdc_display_notify(struct sh_mobile_lcdc_chan *ch, | |||
| 574 | switch (event) { | 574 | switch (event) { |
| 575 | case SH_MOBILE_LCDC_EVENT_DISPLAY_CONNECT: | 575 | case SH_MOBILE_LCDC_EVENT_DISPLAY_CONNECT: |
| 576 | /* HDMI plug in */ | 576 | /* HDMI plug in */ |
| 577 | console_lock(); | ||
| 577 | if (lock_fb_info(info)) { | 578 | if (lock_fb_info(info)) { |
| 578 | console_lock(); | 579 | |
| 579 | 580 | ||
| 580 | ch->display.width = monspec->max_x * 10; | 581 | ch->display.width = monspec->max_x * 10; |
| 581 | ch->display.height = monspec->max_y * 10; | 582 | ch->display.height = monspec->max_y * 10; |
| @@ -594,19 +595,20 @@ static int sh_mobile_lcdc_display_notify(struct sh_mobile_lcdc_chan *ch, | |||
| 594 | fb_set_suspend(info, 0); | 595 | fb_set_suspend(info, 0); |
| 595 | } | 596 | } |
| 596 | 597 | ||
| 597 | console_unlock(); | 598 | |
| 598 | unlock_fb_info(info); | 599 | unlock_fb_info(info); |
| 599 | } | 600 | } |
| 601 | console_unlock(); | ||
| 600 | break; | 602 | break; |
| 601 | 603 | ||
| 602 | case SH_MOBILE_LCDC_EVENT_DISPLAY_DISCONNECT: | 604 | case SH_MOBILE_LCDC_EVENT_DISPLAY_DISCONNECT: |
| 603 | /* HDMI disconnect */ | 605 | /* HDMI disconnect */ |
| 606 | console_lock(); | ||
| 604 | if (lock_fb_info(info)) { | 607 | if (lock_fb_info(info)) { |
| 605 | console_lock(); | ||
| 606 | fb_set_suspend(info, 1); | 608 | fb_set_suspend(info, 1); |
| 607 | console_unlock(); | ||
| 608 | unlock_fb_info(info); | 609 | unlock_fb_info(info); |
| 609 | } | 610 | } |
| 611 | console_unlock(); | ||
| 610 | break; | 612 | break; |
| 611 | 613 | ||
| 612 | case SH_MOBILE_LCDC_EVENT_DISPLAY_MODE: | 614 | case SH_MOBILE_LCDC_EVENT_DISPLAY_MODE: |
