Commit 9a179176 authored by Antonino A. Daplas's avatar Antonino A. Daplas Committed by Linus Torvalds

[PATCH] Detaching fbcon: sdd sysfs class device entry for fbcon

In order for this feature to work, an interface will be needed.  The most
appropriate is sysfs.  However, the framebuffer console has no sysfs entry
yet.  This will create a sysfs class device entry for fbcon under
/sys/class/graphics.

Add a class_device entry 'fbcon' under class 'graphics'.  Console-specific
attributes which where previously under class/graphics/fb[x] are moved to
class/graphics/fbcon.  These attributes, 'con_rotate' and 'con_rotate_all',
are also renamed to 'rotate' and 'rotate_all' respectively.
Signed-off-by: default avatarAntonino Daplas <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent a06630f3
...@@ -4,15 +4,15 @@ ...@@ -4,15 +4,15 @@
# Each configuration option enables a list of files. # Each configuration option enables a list of files.
obj-$(CONFIG_VT) += console/
obj-$(CONFIG_LOGO) += logo/
obj-$(CONFIG_SYSFS) += backlight/
obj-$(CONFIG_FB) += fb.o obj-$(CONFIG_FB) += fb.o
fb-y := fbmem.o fbmon.o fbcmap.o fbsysfs.o \ fb-y := fbmem.o fbmon.o fbcmap.o fbsysfs.o \
modedb.o fbcvt.o modedb.o fbcvt.o
fb-objs := $(fb-y) fb-objs := $(fb-y)
obj-$(CONFIG_VT) += console/
obj-$(CONFIG_LOGO) += logo/
obj-$(CONFIG_SYSFS) += backlight/
obj-$(CONFIG_FB_CFB_FILLRECT) += cfbfillrect.o obj-$(CONFIG_FB_CFB_FILLRECT) += cfbfillrect.o
obj-$(CONFIG_FB_CFB_COPYAREA) += cfbcopyarea.o obj-$(CONFIG_FB_CFB_COPYAREA) += cfbcopyarea.o
obj-$(CONFIG_FB_CFB_IMAGEBLIT) += cfbimgblt.o obj-$(CONFIG_FB_CFB_IMAGEBLIT) += cfbimgblt.o
......
...@@ -195,6 +195,8 @@ static void fbcon_redraw_move(struct vc_data *vc, struct display *p, ...@@ -195,6 +195,8 @@ static void fbcon_redraw_move(struct vc_data *vc, struct display *p,
static void fbcon_modechanged(struct fb_info *info); static void fbcon_modechanged(struct fb_info *info);
static void fbcon_set_all_vcs(struct fb_info *info); static void fbcon_set_all_vcs(struct fb_info *info);
static struct class_device *fbcon_class_device;
#ifdef CONFIG_MAC #ifdef CONFIG_MAC
/* /*
* On the Macintoy, there may or may not be a working VBL int. We need to probe * On the Macintoy, there may or may not be a working VBL int. We need to probe
...@@ -2945,14 +2947,6 @@ static int fbcon_event_notify(struct notifier_block *self, ...@@ -2945,14 +2947,6 @@ static int fbcon_event_notify(struct notifier_block *self,
case FB_EVENT_NEW_MODELIST: case FB_EVENT_NEW_MODELIST:
fbcon_new_modelist(info); fbcon_new_modelist(info);
break; break;
case FB_EVENT_SET_CON_ROTATE:
fbcon_rotate(info, *(int *)event->data);
break;
case FB_EVENT_GET_CON_ROTATE:
ret = fbcon_get_rotate(info);
break;
case FB_EVENT_SET_CON_ROTATE_ALL:
fbcon_rotate_all(info, *(int *)event->data);
} }
return ret; return ret;
...@@ -2992,6 +2986,81 @@ static struct notifier_block fbcon_event_notifier = { ...@@ -2992,6 +2986,81 @@ static struct notifier_block fbcon_event_notifier = {
.notifier_call = fbcon_event_notify, .notifier_call = fbcon_event_notify,
}; };
static ssize_t store_rotate(struct class_device *class_device,
const char *buf, size_t count)
{
struct fb_info *info;
int rotate, idx;
char **last = NULL;
acquire_console_sem();
idx = con2fb_map[fg_console];
if (idx == -1 || registered_fb[idx] == NULL)
goto err;
info = registered_fb[idx];
rotate = simple_strtoul(buf, last, 0);
fbcon_rotate(info, rotate);
err:
release_console_sem();
return count;
}
static ssize_t store_rotate_all(struct class_device *class_device,
const char *buf, size_t count)
{
struct fb_info *info;
int rotate, idx;
char **last = NULL;
acquire_console_sem();
idx = con2fb_map[fg_console];
if (idx == -1 || registered_fb[idx] == NULL)
goto err;
info = registered_fb[idx];
rotate = simple_strtoul(buf, last, 0);
fbcon_rotate_all(info, rotate);
err:
release_console_sem();
return count;
}
static ssize_t show_rotate(struct class_device *class_device, char *buf)
{
struct fb_info *info;
int rotate = 0, idx;
acquire_console_sem();
idx = con2fb_map[fg_console];
if (idx == -1 || registered_fb[idx] == NULL)
goto err;
info = registered_fb[idx];
rotate = fbcon_get_rotate(info);
err:
release_console_sem();
return snprintf(buf, PAGE_SIZE, "%d\n", rotate);
}
static struct class_device_attribute class_device_attrs[] = {
__ATTR(rotate, S_IRUGO|S_IWUSR, show_rotate, store_rotate),
__ATTR(rotate_all, S_IWUSR, NULL, store_rotate_all),
};
static int fbcon_init_class_device(void)
{
int i;
for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++)
class_device_create_file(fbcon_class_device,
&class_device_attrs[i]);
return 0;
}
static int __init fb_console_init(void) static int __init fb_console_init(void)
{ {
int i; int i;
...@@ -3000,6 +3069,18 @@ static int __init fb_console_init(void) ...@@ -3000,6 +3069,18 @@ static int __init fb_console_init(void)
fb_register_client(&fbcon_event_notifier); fb_register_client(&fbcon_event_notifier);
release_console_sem(); release_console_sem();
fbcon_class_device =
class_device_create(fb_class, NULL,
MKDEV(FB_MAJOR, FB_MAX), NULL,
"fbcon");
if (IS_ERR(fbcon_class_device)) {
printk(KERN_WARNING "Unable to create class_device "
"for fbcon; errno = %ld\n",
PTR_ERR(fbcon_class_device));
fbcon_class_device = NULL;
} else
fbcon_init_class_device();
for (i = 0; i < MAX_NR_CONSOLES; i++) for (i = 0; i < MAX_NR_CONSOLES; i++)
con2fb_map[i] = -1; con2fb_map[i] = -1;
...@@ -3020,10 +3101,26 @@ module_init(fb_console_init); ...@@ -3020,10 +3101,26 @@ module_init(fb_console_init);
#ifdef MODULE #ifdef MODULE
static void __exit fbcon_deinit_class_device(void)
{
int i;
for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++)
class_device_remove_file(fbcon_class_device,
&class_device_attrs[i]);
}
static void __exit fbcon_exit(void)
{
fbcon_deinit_class_device();
class_device_destroy(fb_class, MKDEV(FB_MAJOR, FB_MAX));
}
static void __exit fb_console_exit(void) static void __exit fb_console_exit(void)
{ {
acquire_console_sem(); acquire_console_sem();
fb_unregister_client(&fbcon_event_notifier); fb_unregister_client(&fbcon_event_notifier);
fbcon_exit();
release_console_sem(); release_console_sem();
give_up_console(&fb_con); give_up_console(&fb_con);
} }
......
...@@ -175,6 +175,7 @@ extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info); ...@@ -175,6 +175,7 @@ extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info);
#endif #endif
extern void fbcon_set_bitops(struct fbcon_ops *ops); extern void fbcon_set_bitops(struct fbcon_ops *ops);
extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor); extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor);
extern struct class *fb_class;
#define FBCON_ATTRIBUTE_UNDERLINE 1 #define FBCON_ATTRIBUTE_UNDERLINE 1
#define FBCON_ATTRIBUTE_REVERSE 2 #define FBCON_ATTRIBUTE_REVERSE 2
......
...@@ -1276,8 +1276,8 @@ static struct file_operations fb_fops = { ...@@ -1276,8 +1276,8 @@ static struct file_operations fb_fops = {
#endif #endif
}; };
static struct class *fb_class; struct class *fb_class;
EXPORT_SYMBOL(fb_class);
/** /**
* register_framebuffer - registers a frame buffer device * register_framebuffer - registers a frame buffer device
* @fb_info: frame buffer info structure * @fb_info: frame buffer info structure
...@@ -1489,27 +1489,6 @@ int fb_new_modelist(struct fb_info *info) ...@@ -1489,27 +1489,6 @@ int fb_new_modelist(struct fb_info *info)
return err; return err;
} }
/**
* fb_con_duit - user<->fbcon passthrough
* @info: struct fb_info
* @event: notification event to be passed to fbcon
* @data: private data
*
* DESCRIPTION
* This function is an fbcon-user event passing channel
* which bypasses fbdev. This is hopefully temporary
* until a user interface for fbcon is created
*/
int fb_con_duit(struct fb_info *info, int event, void *data)
{
struct fb_event evnt;
evnt.info = info;
evnt.data = data;
return blocking_notifier_call_chain(&fb_notifier_list, event, &evnt);
}
static char *video_options[FB_MAX]; static char *video_options[FB_MAX];
static int ofonly; static int ofonly;
......
...@@ -247,45 +247,6 @@ static ssize_t show_rotate(struct class_device *class_device, char *buf) ...@@ -247,45 +247,6 @@ static ssize_t show_rotate(struct class_device *class_device, char *buf)
return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->var.rotate); return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->var.rotate);
} }
static ssize_t store_con_rotate(struct class_device *class_device,
const char *buf, size_t count)
{
struct fb_info *fb_info = class_get_devdata(class_device);
int rotate;
char **last = NULL;
acquire_console_sem();
rotate = simple_strtoul(buf, last, 0);
fb_con_duit(fb_info, FB_EVENT_SET_CON_ROTATE, &rotate);
release_console_sem();
return count;
}
static ssize_t store_con_rotate_all(struct class_device *class_device,
const char *buf, size_t count)
{
struct fb_info *fb_info = class_get_devdata(class_device);
int rotate;
char **last = NULL;
acquire_console_sem();
rotate = simple_strtoul(buf, last, 0);
fb_con_duit(fb_info, FB_EVENT_SET_CON_ROTATE_ALL, &rotate);
release_console_sem();
return count;
}
static ssize_t show_con_rotate(struct class_device *class_device, char *buf)
{
struct fb_info *fb_info = class_get_devdata(class_device);
int rotate;
acquire_console_sem();
rotate = fb_con_duit(fb_info, FB_EVENT_GET_CON_ROTATE, NULL);
release_console_sem();
return snprintf(buf, PAGE_SIZE, "%d\n", rotate);
}
static ssize_t store_virtual(struct class_device *class_device, static ssize_t store_virtual(struct class_device *class_device,
const char * buf, size_t count) const char * buf, size_t count)
{ {
...@@ -502,8 +463,6 @@ static struct class_device_attribute class_device_attrs[] = { ...@@ -502,8 +463,6 @@ static struct class_device_attribute class_device_attrs[] = {
__ATTR(name, S_IRUGO, show_name, NULL), __ATTR(name, S_IRUGO, show_name, NULL),
__ATTR(stride, S_IRUGO, show_stride, NULL), __ATTR(stride, S_IRUGO, show_stride, NULL),
__ATTR(rotate, S_IRUGO|S_IWUSR, show_rotate, store_rotate), __ATTR(rotate, S_IRUGO|S_IWUSR, show_rotate, store_rotate),
__ATTR(con_rotate, S_IRUGO|S_IWUSR, show_con_rotate, store_con_rotate),
__ATTR(con_rotate_all, S_IWUSR, NULL, store_con_rotate_all),
__ATTR(state, S_IRUGO|S_IWUSR, show_fbstate, store_fbstate), __ATTR(state, S_IRUGO|S_IWUSR, show_fbstate, store_fbstate),
#ifdef CONFIG_FB_BACKLIGHT #ifdef CONFIG_FB_BACKLIGHT
__ATTR(bl_curve, S_IRUGO|S_IWUSR, show_bl_curve, store_bl_curve), __ATTR(bl_curve, S_IRUGO|S_IWUSR, show_bl_curve, store_bl_curve),
......
...@@ -515,12 +515,6 @@ struct fb_cursor_user { ...@@ -515,12 +515,6 @@ struct fb_cursor_user {
/* The resolution of the passed in fb_info about to change and /* The resolution of the passed in fb_info about to change and
all vc's should be changed */ all vc's should be changed */
#define FB_EVENT_MODE_CHANGE_ALL 0x0A #define FB_EVENT_MODE_CHANGE_ALL 0x0A
/* CONSOLE-SPECIFIC: set console rotation */
#define FB_EVENT_SET_CON_ROTATE 0x0B
/* CONSOLE-SPECIFIC: get console rotation */
#define FB_EVENT_GET_CON_ROTATE 0x0C
/* CONSOLE-SPECIFIC: rotate all consoles */
#define FB_EVENT_SET_CON_ROTATE_ALL 0x0D
struct fb_event { struct fb_event {
struct fb_info *info; struct fb_info *info;
...@@ -892,7 +886,6 @@ extern int fb_get_color_depth(struct fb_var_screeninfo *var, ...@@ -892,7 +886,6 @@ extern int fb_get_color_depth(struct fb_var_screeninfo *var,
struct fb_fix_screeninfo *fix); struct fb_fix_screeninfo *fix);
extern int fb_get_options(char *name, char **option); extern int fb_get_options(char *name, char **option);
extern int fb_new_modelist(struct fb_info *info); extern int fb_new_modelist(struct fb_info *info);
extern int fb_con_duit(struct fb_info *info, int event, void *data);
extern struct fb_info *registered_fb[FB_MAX]; extern struct fb_info *registered_fb[FB_MAX];
extern int num_registered_fb; extern int num_registered_fb;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment