diff options
Diffstat (limited to 'drivers/video/console/fbcon.c')
-rw-r--r-- | drivers/video/console/fbcon.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index e829ba18e0a5..e7802ffe549a 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -193,6 +193,8 @@ static void fbcon_preset_disp(struct fb_info *info, struct fb_var_screeninfo *va | |||
193 | int unit); | 193 | int unit); |
194 | static void fbcon_redraw_move(struct vc_data *vc, struct display *p, | 194 | static void fbcon_redraw_move(struct vc_data *vc, struct display *p, |
195 | int line, int count, int dy); | 195 | int line, int count, int dy); |
196 | static void fbcon_modechanged(struct fb_info *info); | ||
197 | static void fbcon_set_all_vcs(struct fb_info *info); | ||
196 | 198 | ||
197 | #ifdef CONFIG_MAC | 199 | #ifdef CONFIG_MAC |
198 | /* | 200 | /* |
@@ -218,6 +220,51 @@ static inline void fbcon_set_rotation(struct fb_info *info, struct display *p) | |||
218 | else | 220 | else |
219 | ops->rotate = 0; | 221 | ops->rotate = 0; |
220 | } | 222 | } |
223 | |||
224 | static void fbcon_rotate(struct fb_info *info, u32 rotate) | ||
225 | { | ||
226 | struct fbcon_ops *ops= info->fbcon_par; | ||
227 | struct fb_info *fb_info; | ||
228 | |||
229 | if (!ops || ops->currcon == -1) | ||
230 | return; | ||
231 | |||
232 | fb_info = registered_fb[con2fb_map[ops->currcon]]; | ||
233 | |||
234 | if (info == fb_info) { | ||
235 | struct display *p = &fb_display[ops->currcon]; | ||
236 | |||
237 | if (rotate < 4) | ||
238 | p->con_rotate = rotate; | ||
239 | else | ||
240 | p->con_rotate = 0; | ||
241 | |||
242 | fbcon_modechanged(info); | ||
243 | } | ||
244 | } | ||
245 | |||
246 | static void fbcon_rotate_all(struct fb_info *info, u32 rotate) | ||
247 | { | ||
248 | struct fbcon_ops *ops = info->fbcon_par; | ||
249 | struct vc_data *vc; | ||
250 | struct display *p; | ||
251 | int i; | ||
252 | |||
253 | if (!ops || ops->currcon < 0 || rotate > 3) | ||
254 | return; | ||
255 | |||
256 | for (i = 0; i < MAX_NR_CONSOLES; i++) { | ||
257 | vc = vc_cons[i].d; | ||
258 | if (!vc || vc->vc_mode != KD_TEXT || | ||
259 | registered_fb[con2fb_map[i]] != info) | ||
260 | continue; | ||
261 | |||
262 | p = &fb_display[vc->vc_num]; | ||
263 | p->con_rotate = rotate; | ||
264 | } | ||
265 | |||
266 | fbcon_set_all_vcs(info); | ||
267 | } | ||
221 | #else | 268 | #else |
222 | static inline void fbcon_set_rotation(struct fb_info *info, struct display *p) | 269 | static inline void fbcon_set_rotation(struct fb_info *info, struct display *p) |
223 | { | 270 | { |
@@ -225,8 +272,25 @@ static inline void fbcon_set_rotation(struct fb_info *info, struct display *p) | |||
225 | 272 | ||
226 | ops->rotate = FB_ROTATE_UR; | 273 | ops->rotate = FB_ROTATE_UR; |
227 | } | 274 | } |
275 | |||
276 | static void fbcon_rotate(struct fb_info *info, u32 rotate) | ||
277 | { | ||
278 | return; | ||
279 | } | ||
280 | |||
281 | static void fbcon_rotate_all(struct fb_info *info, u32 rotate) | ||
282 | { | ||
283 | return; | ||
284 | } | ||
228 | #endif /* CONFIG_FRAMEBUFFER_CONSOLE_ROTATION */ | 285 | #endif /* CONFIG_FRAMEBUFFER_CONSOLE_ROTATION */ |
229 | 286 | ||
287 | static int fbcon_get_rotate(struct fb_info *info) | ||
288 | { | ||
289 | struct fbcon_ops *ops = info->fbcon_par; | ||
290 | |||
291 | return (ops) ? ops->rotate : 0; | ||
292 | } | ||
293 | |||
230 | static inline int fbcon_is_inactive(struct vc_data *vc, struct fb_info *info) | 294 | static inline int fbcon_is_inactive(struct vc_data *vc, struct fb_info *info) |
231 | { | 295 | { |
232 | struct fbcon_ops *ops = info->fbcon_par; | 296 | struct fbcon_ops *ops = info->fbcon_par; |
@@ -2864,6 +2928,14 @@ static int fbcon_event_notify(struct notifier_block *self, | |||
2864 | case FB_EVENT_NEW_MODELIST: | 2928 | case FB_EVENT_NEW_MODELIST: |
2865 | fbcon_new_modelist(info); | 2929 | fbcon_new_modelist(info); |
2866 | break; | 2930 | break; |
2931 | case FB_EVENT_SET_CON_ROTATE: | ||
2932 | fbcon_rotate(info, *(int *)event->data); | ||
2933 | break; | ||
2934 | case FB_EVENT_GET_CON_ROTATE: | ||
2935 | ret = fbcon_get_rotate(info); | ||
2936 | break; | ||
2937 | case FB_EVENT_SET_CON_ROTATE_ALL: | ||
2938 | fbcon_rotate_all(info, *(int *)event->data); | ||
2867 | } | 2939 | } |
2868 | 2940 | ||
2869 | return ret; | 2941 | return ret; |