X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fvideo%2Fmatrox%2Fmatroxfb_crtc2.c;h=2c9801090faeaa89e95b0c9d2a1ad3822052cc61;hb=refs%2Fremotes%2Fvserver;hp=27221ec48f852527a85880e0b3e48438e1da3be9;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/video/matrox/matroxfb_crtc2.c b/drivers/video/matrox/matroxfb_crtc2.c index 27221ec48..2c9801090 100644 --- a/drivers/video/matrox/matroxfb_crtc2.c +++ b/drivers/video/matrox/matroxfb_crtc2.c @@ -21,7 +21,7 @@ static int mem = 8192; -MODULE_PARM(mem, "i"); +module_param(mem, int, 0); MODULE_PARM_DESC(mem, "Memory size reserved for dualhead (default=8MB)"); /* **************************************************** */ @@ -387,6 +387,7 @@ static int matroxfb_dh_set_par(struct fb_info* info) { up_read(&ACCESS_FBINFO(altout).lock); matroxfb_dh_cfbX_init(m2info); } + m2info->initialized = 1; return 0; #undef m2info } @@ -418,11 +419,10 @@ static int matroxfb_dh_get_vblank(const struct matroxfb_dh_fb_info* m2info, stru return 0; } -static int matroxfb_dh_ioctl(struct inode* inode, - struct file* file, +static int matroxfb_dh_ioctl(struct fb_info *info, unsigned int cmd, - unsigned long arg, - struct fb_info* info) { + unsigned long arg) +{ #define m2info (container_of(info, struct matroxfb_dh_fb_info, fbcon)) MINFO_FROM(m2info->primary_dev); @@ -437,7 +437,7 @@ static int matroxfb_dh_ioctl(struct inode* inode, err = matroxfb_dh_get_vblank(m2info, &vblank); if (err) return err; - if (copy_to_user((struct fb_vblank*)arg, &vblank, sizeof(vblank))) + if (copy_to_user((void __user *)arg, &vblank, sizeof(vblank))) return -EFAULT; return 0; } @@ -445,7 +445,7 @@ static int matroxfb_dh_ioctl(struct inode* inode, { u_int32_t crt; - if (get_user(crt, (u_int32_t *)arg)) + if (get_user(crt, (u_int32_t __user *)arg)) return -EFAULT; if (crt != 0) @@ -456,7 +456,7 @@ static int matroxfb_dh_ioctl(struct inode* inode, case MATROXFB_GET_OUTPUT_MODE: case MATROXFB_GET_ALL_OUTPUTS: { - return ACCESS_FBINFO(fbcon.fbops)->fb_ioctl(inode, file, cmd, arg, &ACCESS_FBINFO(fbcon)); + return ACCESS_FBINFO(fbcon.fbops)->fb_ioctl(&ACCESS_FBINFO(fbcon), cmd, arg); } case MATROXFB_SET_OUTPUT_CONNECTION: { @@ -464,7 +464,7 @@ static int matroxfb_dh_ioctl(struct inode* inode, int out; int changes; - if (get_user(tmp, (u_int32_t*)arg)) + if (get_user(tmp, (u_int32_t __user *)arg)) return -EFAULT; for (out = 0; out < 32; out++) { if (tmp & (1 << out)) { @@ -514,7 +514,7 @@ static int matroxfb_dh_ioctl(struct inode* inode, conn |= 1 << out; } } - if (put_user(conn, (u_int32_t*)arg)) + if (put_user(conn, (u_int32_t __user *)arg)) return -EFAULT; return 0; } @@ -539,7 +539,7 @@ static int matroxfb_dh_ioctl(struct inode* inode, tmp = 0; } } - if (put_user(tmp, (u_int32_t*)arg)) + if (put_user(tmp, (u_int32_t __user *)arg)) return -EFAULT; return 0; } @@ -575,7 +575,6 @@ static struct fb_ops matroxfb_dh_ops = { .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, - .fb_cursor = soft_cursor, }; static struct fb_var_screeninfo matroxfb_dh_defined = { @@ -603,7 +602,8 @@ static int matroxfb_dh_regit(CPMINFO struct matroxfb_dh_fb_info* m2info) { m2info->fbcon.fbops = &matroxfb_dh_ops; m2info->fbcon.flags = FBINFO_FLAG_DEFAULT; - m2info->fbcon.currcon = -1; + m2info->fbcon.flags |= FBINFO_HWACCEL_XPAN | + FBINFO_HWACCEL_YPAN; m2info->fbcon.pseudo_palette = m2info->cmap; fb_alloc_cmap(&m2info->fbcon.cmap, 256, 1); @@ -628,22 +628,12 @@ static int matroxfb_dh_regit(CPMINFO struct matroxfb_dh_fb_info* m2info) { m2info->mmio.vbase = ACCESS_FBINFO(mmio.vbase); m2info->mmio.len = ACCESS_FBINFO(mmio.len); - /* - * If we have unused output, connect CRTC2 to it... - */ - if (ACCESS_FBINFO(outputs[1]).output && - ACCESS_FBINFO(outputs[1]).src == MATROXFB_SRC_NONE && - ACCESS_FBINFO(outputs[2]).src == MATROXFB_SRC_NONE) { - ACCESS_FBINFO(outputs[1]).src = MATROXFB_SRC_CRTC2; - } - matroxfb_dh_init_fix(m2info); if (register_framebuffer(&m2info->fbcon)) { return -ENXIO; } - if (m2info->fbcon.currcon < 0) { + if (!m2info->initialized) fb_set_var(&m2info->fbcon, &matroxfb_dh_defined); - } down_write(&ACCESS_FBINFO(crtc2.lock)); oldcrtc2 = ACCESS_FBINFO(crtc2.info); ACCESS_FBINFO(crtc2.info) = m2info; @@ -704,7 +694,7 @@ static void* matroxfb_crtc2_probe(struct matrox_fb_info* minfo) { /* hardware is CRTC2 incapable... */ if (!ACCESS_FBINFO(devflags.crtc2)) return NULL; - m2info = (struct matroxfb_dh_fb_info*)kmalloc(sizeof(*m2info), GFP_KERNEL); + m2info = kmalloc(sizeof(*m2info), GFP_KERNEL); if (!m2info) { printk(KERN_ERR "matroxfb_crtc2: Not enough memory for CRTC2 control structs\n"); return NULL; @@ -730,6 +720,9 @@ static struct matroxfb_driver crtc2 = { .remove = matroxfb_crtc2_remove }; static int matroxfb_crtc2_init(void) { + if (fb_get_options("matrox_crtc2fb", NULL)) + return -ENODEV; + matroxfb_register_driver(&crtc2); return 0; }