- Move *_blank function earlier in the file.
- Correctly limit acornfb virtual y resolution.
/* Find int 'y', such that y * fll == s * sam < maxsize
* y = s * sam / fll; s = maxsize / sam
*/
- for (size = current_par.screen_size; min_size <= size;
+ for (size = current_par.screen_size;
+ nr_y = size / font_line_len, min_size <= size;
size -= sam_size) {
- nr_y = size / font_line_len;
-
if (nr_y * font_line_len == size)
break;
}
+ nr_y *= fontht;
if (var->accel_flags & FB_ACCELF_TEXT) {
if (min_size > size) {
size = current_par.screen_size;
var->yres_virtual = size / (font_line_len / fontht);
} else
- var->yres_virtual = nr_y * fontht;
- }
+ var->yres_virtual = nr_y;
+ } else if (var->yres_virtual > nr_y)
+ var->yres_virtual = nr_y;
current_par.screen_end = current_par.screen_base_p + size;
return 0;
}
+static int
+acornfb_blank(int blank, struct fb_info *info)
+{
+ union palette p;
+ int i, bpp = fb_display[info->currcon].var.bits_per_pixel;
+
+#ifdef FBCON_HAS_CFB16
+ if (bpp == 16) {
+ p.p = 0;
+
+ for (i = 0; i < 256; i++) {
+ if (blank)
+ p = acornfb_palette_encode(i, 0, 0, 0, 0);
+ else {
+ p.vidc20.red = current_par.palette[ i & 31].vidc20.red;
+ p.vidc20.green = current_par.palette[(i >> 1) & 31].vidc20.green;
+ p.vidc20.blue = current_par.palette[(i >> 2) & 31].vidc20.blue;
+ }
+ acornfb_palette_write(i, current_par.palette[i]);
+ }
+ } else
+#endif
+ {
+ for (i = 0; i < current_par.palette_size; i++) {
+ if (blank)
+ p = acornfb_palette_encode(i, 0, 0, 0, 0);
+ else
+ p = current_par.palette[i];
+
+ acornfb_palette_write(i, p);
+ }
+ }
+ return 0;
+}
+
/*
* Note that we are entered with the kernel locked.
*/
fb_set_var: acornfb_set_var,
fb_get_cmap: acornfb_get_cmap,
fb_set_cmap: gen_set_cmap,
- fb_set_colreg: acornfb_setcolreg,
+ fb_setcolreg: acornfb_setcolreg,
fb_pan_display: acornfb_pan_display,
fb_blank: acornfb_blank,
fb_mmap: acornfb_mmap,
return 0;
}
-static int
-acornfb_blank(int blank, struct fb_info *info)
-{
- union palette p;
- int i, bpp = fb_display[info->currcon].var.bits_per_pixel;
-
-#ifdef FBCON_HAS_CFB16
- if (bpp == 16) {
- p.p = 0;
-
- for (i = 0; i < 256; i++) {
- if (blank)
- p = acornfb_palette_encode(i, 0, 0, 0, 0);
- else {
- p.vidc20.red = current_par.palette[ i & 31].vidc20.red;
- p.vidc20.green = current_par.palette[(i >> 1) & 31].vidc20.green;
- p.vidc20.blue = current_par.palette[(i >> 2) & 31].vidc20.blue;
- }
- acornfb_palette_write(i, current_par.palette[i]);
- }
- } else
-#endif
- {
- for (i = 0; i < current_par.palette_size; i++) {
- if (blank)
- p = acornfb_palette_encode(i, 0, 0, 0, 0);
- else
- p = current_par.palette[i];
-
- acornfb_palette_write(i, p);
- }
- }
- return 0;
-}
-
/*
* Everything after here is initialisation!!!
*/
return 0;
}
+static int clps7111fb_blank(int blank, struct fb_info *info)
+{
+ if (blank) {
+ if (machine_is_edb7211()) {
+ int i;
+
+ /* Turn off the LCD backlight. */
+ clps_writeb(clps_readb(PDDR) & ~EDB_PD3_LCDBL, PDDR);
+
+ /* Power off the LCD DC-DC converter. */
+ clps_writeb(clps_readb(PDDR) & ~EDB_PD1_LCD_DC_DC_EN, PDDR);
+
+ /* Delay for a little while (half a second). */
+ for (i=0; i<65536*4; i++);
+
+ /* Power off the LCD panel. */
+ clps_writeb(clps_readb(PDDR) & ~EDB_PD2_LCDEN, PDDR);
+
+ /* Power off the LCD controller. */
+ clps_writel(clps_readl(SYSCON1) & ~SYSCON1_LCDEN,
+ SYSCON1);
+ }
+ } else {
+ if (machine_is_edb7211()) {
+ int i;
+
+ /* Power up the LCD controller. */
+ clps_writel(clps_readl(SYSCON1) | SYSCON1_LCDEN,
+ SYSCON1);
+
+ /* Power up the LCD panel. */
+ clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
+
+ /* Delay for a little while. */
+ for (i=0; i<65536*4; i++);
+
+ /* Power up the LCD DC-DC converter. */
+ clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN,
+ PDDR);
+
+ /* Turn on the LCD backlight. */
+ clps_writeb(clps_readb(PDDR) | EDB_PD3_LCDBL, PDDR);
+ }
+ }
+ return 0;
+}
+
static struct fb_ops clps7111fb_ops = {
owner: THIS_MODULE,
fb_set_var: clps7111fb_set_var,
return -EINVAL;
}
-static int clps7111fb_blank(int blank, struct fb_info *info)
-{
- if (blank) {
- if (machine_is_edb7211()) {
- int i;
-
- /* Turn off the LCD backlight. */
- clps_writeb(clps_readb(PDDR) & ~EDB_PD3_LCDBL, PDDR);
-
- /* Power off the LCD DC-DC converter. */
- clps_writeb(clps_readb(PDDR) & ~EDB_PD1_LCD_DC_DC_EN, PDDR);
-
- /* Delay for a little while (half a second). */
- for (i=0; i<65536*4; i++);
-
- /* Power off the LCD panel. */
- clps_writeb(clps_readb(PDDR) & ~EDB_PD2_LCDEN, PDDR);
-
- /* Power off the LCD controller. */
- clps_writel(clps_readl(SYSCON1) & ~SYSCON1_LCDEN,
- SYSCON1);
- }
- } else {
- if (machine_is_edb7211()) {
- int i;
-
- /* Power up the LCD controller. */
- clps_writel(clps_readl(SYSCON1) | SYSCON1_LCDEN,
- SYSCON1);
-
- /* Power up the LCD panel. */
- clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
-
- /* Delay for a little while. */
- for (i=0; i<65536*4; i++);
-
- /* Power up the LCD DC-DC converter. */
- clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN,
- PDDR);
-
- /* Turn on the LCD backlight. */
- clps_writeb(clps_readb(PDDR) | EDB_PD3_LCDBL, PDDR);
- }
- }
- return 0;
-}
-
static int
clps7111fb_proc_backlight_read(char *page, char **start, off_t off,
int count, int *eof, void *data)
clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
/* Delay for a little while. */
- for (i=0; i<65536*4; i++);
+ udelay(100);
/* Power up the LCD DC-DC converter. */
clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN, PDDR);
module_init(clps711xfb_init);
#endif
module_exit(clps711xfb_exit);
+
+MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
+MODULE_DESCRIPTION("CLPS711x framebuffer driver");
+MODULE_LICENSE("GPL");
return 0;
}
-static struct fb_ops sa1100fb_ops = {
- owner: THIS_MODULE,
- fb_get_fix: sa1100fb_get_fix,
- fb_get_var: sa1100fb_get_var,
- fb_set_var: sa1100fb_set_var,
- fb_get_cmap: sa1100fb_get_cmap,
- fb_set_cmap: sa1100fb_set_cmap,
- fb_setcolreg: sa1100fb_setcolreg,
- fb_blank: sa1100fb_blank,
-};
-
-/*
- * sa1100fb_switch():
- * Change to the specified console. Palette and video mode
- * are changed to the console's stored parameters.
- *
- * Uh oh, this can be called from a tasklet (IRQ)
- */
-static int sa1100fb_switch(int con, struct fb_info *info)
-{
- struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
- struct display *disp;
- struct fb_cmap *cmap;
-
- DPRINTK("con=%d info->modename=%s\n", con, fbi->fb.modename);
-
- if (con == info->currcon)
- return 0;
-
- if (info->currcon >= 0) {
- disp = fb_display + info->currcon;
-
- /*
- * Save the old colormap and video mode.
- */
- disp->var = fbi->fb.var;
-
- if (disp->cmap.len)
- fb_copy_cmap(&fbi->fb.cmap, &disp->cmap, 0);
- }
-
- info->currcon = con;
- disp = fb_display + con;
-
- /*
- * Make sure that our colourmap contains 256 entries.
- */
- fb_alloc_cmap(&fbi->fb.cmap, 256, 0);
-
- if (disp->cmap.len)
- cmap = &disp->cmap;
- else
- cmap = fb_default_cmap(1 << disp->var.bits_per_pixel);
-
- fb_copy_cmap(cmap, &fbi->fb.cmap, 0);
-
- fbi->fb.var = disp->var;
- fbi->fb.var.activate = FB_ACTIVATE_NOW;
-
- sa1100fb_set_var(&fbi->fb.var, con, info);
- return 0;
-}
-
/*
* Formal definition of the VESA spec:
* On
return 0;
}
+static struct fb_ops sa1100fb_ops = {
+ owner: THIS_MODULE,
+ fb_get_fix: sa1100fb_get_fix,
+ fb_get_var: sa1100fb_get_var,
+ fb_set_var: sa1100fb_set_var,
+ fb_get_cmap: sa1100fb_get_cmap,
+ fb_set_cmap: sa1100fb_set_cmap,
+ fb_setcolreg: sa1100fb_setcolreg,
+ fb_blank: sa1100fb_blank,
+};
+
+/*
+ * sa1100fb_switch():
+ * Change to the specified console. Palette and video mode
+ * are changed to the console's stored parameters.
+ *
+ * Uh oh, this can be called from a tasklet (IRQ)
+ */
+static int sa1100fb_switch(int con, struct fb_info *info)
+{
+ struct sa1100fb_info *fbi = (struct sa1100fb_info *)info;
+ struct display *disp;
+ struct fb_cmap *cmap;
+
+ DPRINTK("con=%d info->modename=%s\n", con, fbi->fb.modename);
+
+ if (con == info->currcon)
+ return 0;
+
+ if (info->currcon >= 0) {
+ disp = fb_display + info->currcon;
+
+ /*
+ * Save the old colormap and video mode.
+ */
+ disp->var = fbi->fb.var;
+
+ if (disp->cmap.len)
+ fb_copy_cmap(&fbi->fb.cmap, &disp->cmap, 0);
+ }
+
+ info->currcon = con;
+ disp = fb_display + con;
+
+ /*
+ * Make sure that our colourmap contains 256 entries.
+ */
+ fb_alloc_cmap(&fbi->fb.cmap, 256, 0);
+
+ if (disp->cmap.len)
+ cmap = &disp->cmap;
+ else
+ cmap = fb_default_cmap(1 << disp->var.bits_per_pixel);
+
+ fb_copy_cmap(cmap, &fbi->fb.cmap, 0);
+
+ fbi->fb.var = disp->var;
+ fbi->fb.var.activate = FB_ACTIVATE_NOW;
+
+ sa1100fb_set_var(&fbi->fb.var, con, info);
+ return 0;
+}
+
static int sa1100fb_updatevar(int con, struct fb_info *info)
{
DPRINTK("entered\n");