Commit dc762c4f authored by Javier M. Mellid's avatar Javier M. Mellid Committed by Greg Kroah-Hartman

staging: sm7xx: Use kernel framebuffer mode setting

This patch implements dynamic framebuffer mode setting.

Previous code works with mode setting in a hard code way. Previous hard
code configuration is used as default configuration if dynamic mode
setting or boot mode setting (via sm712vga_setup) is not used.

Tested with SM712 supporting 1024x600x16 as default hardware resolution.

Changes:

- Implement fb_check_var and fb_set_par callbacks
- Remove __maybe_unused decorator in function being used (sm712vga_setup)
- Minor cleanup on initialization structs related with mode settings
- Updated author copyright
- Updated TODO file
Signed-off-by: default avatarJavier M. Mellid <jmunhoz@igalia.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 4ce0a41f
...@@ -3,7 +3,6 @@ TODO: ...@@ -3,7 +3,6 @@ TODO:
- 2D acceleration support - 2D acceleration support
- use kernel coding style - use kernel coding style
- refine the code and remove unused code - refine the code and remove unused code
- use kernel framebuffer mode setting instead of hard code
- move it to drivers/video/sm7xx/ or make it be drivers/video/sm7xxfb.c - move it to drivers/video/sm7xx/ or make it be drivers/video/sm7xxfb.c
Please send any patches to Greg Kroah-Hartman <greg@kroah.com> and Please send any patches to Greg Kroah-Hartman <greg@kroah.com> and
......
...@@ -8,6 +8,9 @@ ...@@ -8,6 +8,9 @@
* Copyright (C) 2009 Lemote, Inc. * Copyright (C) 2009 Lemote, Inc.
* Author: Wu Zhangjin, wuzhangjin@gmail.com * 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 * 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 * License. See the file COPYING in the main directory of this archive for
* more details. * more details.
...@@ -39,16 +42,16 @@ ...@@ -39,16 +42,16 @@
#include <linux/pm.h> #include <linux/pm.h>
#endif #endif
struct screen_info smtc_screen_info;
#include "smtcfb.h" #include "smtcfb.h"
#ifdef DEBUG #ifdef DEBUG
#define smdbg(format, arg...) printk(KERN_DEBUG format , ## arg) #define smdbg(format, arg...) printk(KERN_DEBUG format , ## arg)
#else #else
#define smdbg(format, arg...) #define smdbg(format, arg...)
#endif #endif
struct screen_info smtc_screen_info;
/* /*
* Private structure * Private structure
*/ */
...@@ -127,6 +130,29 @@ u16 smtc_ChipIDs[] = { ...@@ -127,6 +130,29 @@ u16 smtc_ChipIDs[] = {
#define numSMTCchipIDs (sizeof(smtc_ChipIDs) / sizeof(u16)) #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, static void sm712_set_timing(struct smtcfb_info *sfb,
struct par_info *ppar_info) struct par_info *ppar_info)
{ {
...@@ -268,29 +294,6 @@ static void smtc_set_timing(struct smtcfb_info *sfb, struct par_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 /* chan_to_field
* *
* convert a colour value into a field position * 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, ...@@ -604,20 +607,6 @@ smtcfb_write(struct fb_info *info, const char __user *buf, size_t count,
} }
#endif /* ! __BIG_ENDIAN */ #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) void smtcfb_setmode(struct smtcfb_info *sfb)
{ {
switch (sfb->fb.var.bits_per_pixel) { switch (sfb->fb.var.bits_per_pixel) {
...@@ -676,6 +665,47 @@ void smtcfb_setmode(struct smtcfb_info *sfb) ...@@ -676,6 +665,47 @@ void smtcfb_setmode(struct smtcfb_info *sfb)
smtc_set_timing(sfb, &hw); 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 * Alloc struct smtcfb_info and assign the default value
*/ */
...@@ -796,7 +826,7 @@ static void smtc_free_fb_info(struct smtcfb_info *sfb) ...@@ -796,7 +826,7 @@ static void smtc_free_fb_info(struct smtcfb_info *sfb)
* Returns zero. * Returns zero.
* *
*/ */
static int __init __maybe_unused sm712vga_setup(char *options) static int __init sm712vga_setup(char *options)
{ {
int index; int index;
......
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