|
@@ -8,6 +8,9 @@
|
|
|
* Copyright (C) 2009 Lemote, Inc.
|
|
|
* Author: Wu Zhangjin, wuzhangjin@gmail.com
|
|
|
*
|
|
|
+ * Copyright (C) 2011 Igalia, S.L.
|
|
|
+ * Author: Javier M. Mellid <jmunhoz@igalia.com>
|
|
|
+ *
|
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
|
* License. See the file COPYING in the main directory of this archive for
|
|
|
* more details.
|
|
@@ -39,16 +42,16 @@
|
|
|
#include <linux/pm.h>
|
|
|
#endif
|
|
|
|
|
|
-struct screen_info smtc_screen_info;
|
|
|
-
|
|
|
#include "smtcfb.h"
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
-#define smdbg(format, arg...) printk(KERN_DEBUG format , ## arg)
|
|
|
+#define smdbg(format, arg...) printk(KERN_DEBUG format , ## arg)
|
|
|
#else
|
|
|
#define smdbg(format, arg...)
|
|
|
#endif
|
|
|
|
|
|
+struct screen_info smtc_screen_info;
|
|
|
+
|
|
|
/*
|
|
|
* Private structure
|
|
|
*/
|
|
@@ -127,6 +130,29 @@ u16 smtc_ChipIDs[] = {
|
|
|
|
|
|
#define numSMTCchipIDs (sizeof(smtc_ChipIDs) / sizeof(u16))
|
|
|
|
|
|
+static struct fb_var_screeninfo smtcfb_var = {
|
|
|
+ .xres = 1024,
|
|
|
+ .yres = 600,
|
|
|
+ .xres_virtual = 1024,
|
|
|
+ .yres_virtual = 600,
|
|
|
+ .bits_per_pixel = 16,
|
|
|
+ .red = {16, 8, 0},
|
|
|
+ .green = {8, 8, 0},
|
|
|
+ .blue = {0, 8, 0},
|
|
|
+ .activate = FB_ACTIVATE_NOW,
|
|
|
+ .height = -1,
|
|
|
+ .width = -1,
|
|
|
+ .vmode = FB_VMODE_NONINTERLACED,
|
|
|
+};
|
|
|
+
|
|
|
+static struct fb_fix_screeninfo smtcfb_fix = {
|
|
|
+ .id = "sm712fb",
|
|
|
+ .type = FB_TYPE_PACKED_PIXELS,
|
|
|
+ .visual = FB_VISUAL_TRUECOLOR,
|
|
|
+ .line_length = 800 * 3,
|
|
|
+ .accel = FB_ACCEL_SMI_LYNX,
|
|
|
+};
|
|
|
+
|
|
|
static void sm712_set_timing(struct smtcfb_info *sfb,
|
|
|
struct par_info *ppar_info)
|
|
|
{
|
|
@@ -268,29 +294,6 @@ static void smtc_set_timing(struct smtcfb_info *sfb, struct par_info
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static struct fb_var_screeninfo smtcfb_var = {
|
|
|
- .xres = 1024,
|
|
|
- .yres = 600,
|
|
|
- .xres_virtual = 1024,
|
|
|
- .yres_virtual = 600,
|
|
|
- .bits_per_pixel = 16,
|
|
|
- .red = {16, 8, 0},
|
|
|
- .green = {8, 8, 0},
|
|
|
- .blue = {0, 8, 0},
|
|
|
- .activate = FB_ACTIVATE_NOW,
|
|
|
- .height = -1,
|
|
|
- .width = -1,
|
|
|
- .vmode = FB_VMODE_NONINTERLACED,
|
|
|
-};
|
|
|
-
|
|
|
-static struct fb_fix_screeninfo smtcfb_fix = {
|
|
|
- .id = "sm712fb",
|
|
|
- .type = FB_TYPE_PACKED_PIXELS,
|
|
|
- .visual = FB_VISUAL_TRUECOLOR,
|
|
|
- .line_length = 800 * 3,
|
|
|
- .accel = FB_ACCEL_SMI_LYNX,
|
|
|
-};
|
|
|
-
|
|
|
/* chan_to_field
|
|
|
*
|
|
|
* convert a colour value into a field position
|
|
@@ -604,20 +607,6 @@ smtcfb_write(struct fb_info *info, const char __user *buf, size_t count,
|
|
|
}
|
|
|
#endif /* ! __BIG_ENDIAN */
|
|
|
|
|
|
-static struct fb_ops smtcfb_ops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .fb_setcolreg = smtc_setcolreg,
|
|
|
- .fb_blank = cfb_blank,
|
|
|
- .fb_fillrect = cfb_fillrect,
|
|
|
- .fb_imageblit = cfb_imageblit,
|
|
|
- .fb_copyarea = cfb_copyarea,
|
|
|
-#ifdef __BIG_ENDIAN
|
|
|
- .fb_read = smtcfb_read,
|
|
|
- .fb_write = smtcfb_write,
|
|
|
-#endif
|
|
|
-
|
|
|
-};
|
|
|
-
|
|
|
void smtcfb_setmode(struct smtcfb_info *sfb)
|
|
|
{
|
|
|
switch (sfb->fb.var.bits_per_pixel) {
|
|
@@ -676,6 +665,47 @@ void smtcfb_setmode(struct smtcfb_info *sfb)
|
|
|
smtc_set_timing(sfb, &hw);
|
|
|
}
|
|
|
|
|
|
+static int smtc_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
|
|
+{
|
|
|
+ /* sanity checks */
|
|
|
+ if (var->xres_virtual < var->xres)
|
|
|
+ var->xres_virtual = var->xres;
|
|
|
+
|
|
|
+ if (var->yres_virtual < var->yres)
|
|
|
+ var->yres_virtual = var->yres;
|
|
|
+
|
|
|
+ /* set valid default bpp */
|
|
|
+ if ((var->bits_per_pixel != 8) && (var->bits_per_pixel != 16) &&
|
|
|
+ (var->bits_per_pixel != 24) && (var->bits_per_pixel != 32))
|
|
|
+ var->bits_per_pixel = 16;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int smtc_set_par(struct fb_info *info)
|
|
|
+{
|
|
|
+ struct smtcfb_info *sfb = (struct smtcfb_info *)info;
|
|
|
+
|
|
|
+ smtcfb_setmode(sfb);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static struct fb_ops smtcfb_ops = {
|
|
|
+ .owner = THIS_MODULE,
|
|
|
+ .fb_check_var = smtc_check_var,
|
|
|
+ .fb_set_par = smtc_set_par,
|
|
|
+ .fb_setcolreg = smtc_setcolreg,
|
|
|
+ .fb_blank = cfb_blank,
|
|
|
+ .fb_fillrect = cfb_fillrect,
|
|
|
+ .fb_imageblit = cfb_imageblit,
|
|
|
+ .fb_copyarea = cfb_copyarea,
|
|
|
+#ifdef __BIG_ENDIAN
|
|
|
+ .fb_read = smtcfb_read,
|
|
|
+ .fb_write = smtcfb_write,
|
|
|
+#endif
|
|
|
+};
|
|
|
+
|
|
|
/*
|
|
|
* Alloc struct smtcfb_info and assign the default value
|
|
|
*/
|
|
@@ -796,7 +826,7 @@ static void smtc_free_fb_info(struct smtcfb_info *sfb)
|
|
|
* Returns zero.
|
|
|
*
|
|
|
*/
|
|
|
-static int __init __maybe_unused sm712vga_setup(char *options)
|
|
|
+static int __init sm712vga_setup(char *options)
|
|
|
{
|
|
|
int index;
|
|
|
|