diff options
-rw-r--r-- | drivers/video/console/fbcon.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 7888e319f9e1..b7e143efa81d 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -152,6 +152,7 @@ static int fbcon_set_origin(struct vc_data *); | |||
152 | #define DEFAULT_CURSOR_BLINK_RATE (20) | 152 | #define DEFAULT_CURSOR_BLINK_RATE (20) |
153 | 153 | ||
154 | static int vbl_cursor_cnt; | 154 | static int vbl_cursor_cnt; |
155 | static int fbcon_cursor_noblink; | ||
155 | 156 | ||
156 | #define divides(a, b) ((!(a) || (b)%(a)) ? 0 : 1) | 157 | #define divides(a, b) ((!(a) || (b)%(a)) ? 0 : 1) |
157 | 158 | ||
@@ -441,7 +442,8 @@ static void fbcon_add_cursor_timer(struct fb_info *info) | |||
441 | struct fbcon_ops *ops = info->fbcon_par; | 442 | struct fbcon_ops *ops = info->fbcon_par; |
442 | 443 | ||
443 | if ((!info->queue.func || info->queue.func == fb_flashcursor) && | 444 | if ((!info->queue.func || info->queue.func == fb_flashcursor) && |
444 | !(ops->flags & FBCON_FLAGS_CURSOR_TIMER)) { | 445 | !(ops->flags & FBCON_FLAGS_CURSOR_TIMER) && |
446 | !fbcon_cursor_noblink) { | ||
445 | if (!info->queue.func) | 447 | if (!info->queue.func) |
446 | INIT_WORK(&info->queue, fb_flashcursor); | 448 | INIT_WORK(&info->queue, fb_flashcursor); |
447 | 449 | ||
@@ -1349,6 +1351,11 @@ static void fbcon_cursor(struct vc_data *vc, int mode) | |||
1349 | if (fbcon_is_inactive(vc, info) || vc->vc_deccm != 1) | 1351 | if (fbcon_is_inactive(vc, info) || vc->vc_deccm != 1) |
1350 | return; | 1352 | return; |
1351 | 1353 | ||
1354 | if (vc->vc_cursor_type & 0x10) | ||
1355 | fbcon_del_cursor_timer(info); | ||
1356 | else | ||
1357 | fbcon_add_cursor_timer(info); | ||
1358 | |||
1352 | ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1; | 1359 | ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1; |
1353 | if (mode & CM_SOFTBACK) { | 1360 | if (mode & CM_SOFTBACK) { |
1354 | mode &= ~CM_SOFTBACK; | 1361 | mode &= ~CM_SOFTBACK; |
@@ -3308,9 +3315,74 @@ err: | |||
3308 | return snprintf(buf, PAGE_SIZE, "%d\n", rotate); | 3315 | return snprintf(buf, PAGE_SIZE, "%d\n", rotate); |
3309 | } | 3316 | } |
3310 | 3317 | ||
3318 | static ssize_t show_cursor_blink(struct class_device *class_device, char *buf) | ||
3319 | { | ||
3320 | struct fb_info *info; | ||
3321 | struct fbcon_ops *ops; | ||
3322 | int idx, blink = -1; | ||
3323 | |||
3324 | if (fbcon_has_exited) | ||
3325 | return 0; | ||
3326 | |||
3327 | acquire_console_sem(); | ||
3328 | idx = con2fb_map[fg_console]; | ||
3329 | |||
3330 | if (idx == -1 || registered_fb[idx] == NULL) | ||
3331 | goto err; | ||
3332 | |||
3333 | info = registered_fb[idx]; | ||
3334 | ops = info->fbcon_par; | ||
3335 | |||
3336 | if (!ops) | ||
3337 | goto err; | ||
3338 | |||
3339 | blink = (ops->flags & FBCON_FLAGS_CURSOR_TIMER) ? 1 : 0; | ||
3340 | err: | ||
3341 | release_console_sem(); | ||
3342 | return snprintf(buf, PAGE_SIZE, "%d\n", blink); | ||
3343 | } | ||
3344 | |||
3345 | static ssize_t store_cursor_blink(struct class_device *clas_device, | ||
3346 | const char *buf, size_t count) | ||
3347 | { | ||
3348 | struct fb_info *info; | ||
3349 | int blink, idx; | ||
3350 | char **last = NULL; | ||
3351 | |||
3352 | if (fbcon_has_exited) | ||
3353 | return count; | ||
3354 | |||
3355 | acquire_console_sem(); | ||
3356 | idx = con2fb_map[fg_console]; | ||
3357 | |||
3358 | if (idx == -1 || registered_fb[idx] == NULL) | ||
3359 | goto err; | ||
3360 | |||
3361 | info = registered_fb[idx]; | ||
3362 | |||
3363 | if (!info->fbcon_par) | ||
3364 | goto err; | ||
3365 | |||
3366 | blink = simple_strtoul(buf, last, 0); | ||
3367 | |||
3368 | if (blink) { | ||
3369 | fbcon_cursor_noblink = 0; | ||
3370 | fbcon_add_cursor_timer(info); | ||
3371 | } else { | ||
3372 | fbcon_cursor_noblink = 1; | ||
3373 | fbcon_del_cursor_timer(info); | ||
3374 | } | ||
3375 | |||
3376 | err: | ||
3377 | release_console_sem(); | ||
3378 | return count; | ||
3379 | } | ||
3380 | |||
3311 | static struct class_device_attribute class_device_attrs[] = { | 3381 | static struct class_device_attribute class_device_attrs[] = { |
3312 | __ATTR(rotate, S_IRUGO|S_IWUSR, show_rotate, store_rotate), | 3382 | __ATTR(rotate, S_IRUGO|S_IWUSR, show_rotate, store_rotate), |
3313 | __ATTR(rotate_all, S_IWUSR, NULL, store_rotate_all), | 3383 | __ATTR(rotate_all, S_IWUSR, NULL, store_rotate_all), |
3384 | __ATTR(cursor_blink, S_IRUGO|S_IWUSR, show_cursor_blink, | ||
3385 | store_cursor_blink), | ||
3314 | }; | 3386 | }; |
3315 | 3387 | ||
3316 | static int fbcon_init_class_device(void) | 3388 | static int fbcon_init_class_device(void) |