static int mem = 8192;
-MODULE_PARM(mem, "i");
+module_param(mem, int, 0);
MODULE_PARM_DESC(mem, "Memory size reserved for dualhead (default=8MB)");
/* **************************************************** */
up_read(&ACCESS_FBINFO(altout).lock);
matroxfb_dh_cfbX_init(m2info);
}
+ m2info->initialized = 1;
return 0;
#undef m2info
}
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);
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;
}
{
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)
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:
{
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)) {
conn |= 1 << out;
}
}
- if (put_user(conn, (u_int32_t*)arg))
+ if (put_user(conn, (u_int32_t __user *)arg))
return -EFAULT;
return 0;
}
tmp = 0;
}
}
- if (put_user(tmp, (u_int32_t*)arg))
+ if (put_user(tmp, (u_int32_t __user *)arg))
return -EFAULT;
return 0;
}
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
- .fb_cursor = soft_cursor,
};
static struct fb_var_screeninfo matroxfb_dh_defined = {
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);
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;
/* 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;
.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;
}