summaryrefslogtreecommitdiffstats
path: root/drivers/video/cgthreefb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/cgthreefb.c')
-rw-r--r--drivers/video/cgthreefb.c78
1 files changed, 56 insertions, 22 deletions
diff --git a/drivers/video/cgthreefb.c b/drivers/video/cgthreefb.c
index e8cb95e59..5e4d45a9e 100644
--- a/drivers/video/cgthreefb.c
+++ b/drivers/video/cgthreefb.c
@@ -1,4 +1,4 @@
-/* $Id: cgthreefb.c,v 1.5 1999/08/10 15:56:04 davem Exp $
+/* $Id: cgthreefb.c,v 1.8 1999/11/19 09:57:08 davem Exp $
* cgthreefb.c: CGthree frame buffer driver
*
* Copyright (C) 1996,1998 Jakub Jelinek (jj@ultra.linux.cz)
@@ -71,8 +71,8 @@ struct cg3_regs {
};
/* Offset of interesting structures in the OBIO space */
-#define CG3_REGS_OFFSET 0x400000
-#define CG3_RAM_OFFSET 0x800000
+#define CG3_REGS_OFFSET 0x400000UL
+#define CG3_RAM_OFFSET 0x800000UL
static struct sbus_mmap_map cg3_mmap_map[] = {
{ CG3_MMAP_OFFSET, CG3_RAM_OFFSET, SBUS_MMAP_FBSIZE(1) },
@@ -88,30 +88,55 @@ static struct sbus_mmap_map cg3_mmap_map[] = {
static void cg3_loadcmap (struct fb_info_sbusfb *fb, struct display *p, int index, int count)
{
struct bt_regs *bt = &fb->s.cg3.regs->cmap;
+ unsigned long flags;
u32 *i;
+ volatile u8 *regp;
int steps;
+ spin_lock_irqsave(&fb->lock, flags);
+
i = (((u32 *)fb->color_map) + D4M3(index));
steps = D4M3(index+count-1) - D4M3(index)+3;
- *(volatile u8 *)&bt->addr = (u8)D4M4(index);
- while (steps--)
- bt->color_map = *i++;
+ regp = (volatile u8 *)&bt->addr;
+ sbus_writeb(D4M4(index), regp);
+ while (steps--) {
+ u32 val = *i++;
+ sbus_writel(val, &bt->color_map);
+ }
+
+ spin_unlock_irqrestore(&fb->lock, flags);
}
static void cg3_blank (struct fb_info_sbusfb *fb)
{
- fb->s.cg3.regs->control &= ~CG3_CR_ENABLE_VIDEO;
+ unsigned long flags;
+ u8 tmp;
+
+ spin_lock_irqsave(&fb->lock, flags);
+ tmp = sbus_readl(&fb->s.cg3.regs->control);
+ tmp &= ~CG3_CR_ENABLE_VIDEO;
+ sbus_writel(tmp, &fb->s.cg3.regs->control);
+ spin_unlock_irqrestore(&fb->lock, flags);
}
static void cg3_unblank (struct fb_info_sbusfb *fb)
{
- fb->s.cg3.regs->control |= CG3_CR_ENABLE_VIDEO;
+ unsigned long flags;
+ u8 tmp;
+
+ spin_lock_irqsave(&fb->lock, flags);
+ tmp = sbus_readl(&fb->s.cg3.regs->control);
+ tmp |= CG3_CR_ENABLE_VIDEO;
+ sbus_writel(tmp, &fb->s.cg3.regs->control);
+ spin_unlock_irqrestore(&fb->lock, flags);
}
-static void cg3_margins (struct fb_info_sbusfb *fb, struct display *p, int x_margin, int y_margin)
+static void cg3_margins (struct fb_info_sbusfb *fb, struct display *p,
+ int x_margin, int y_margin)
{
- p->screen_base += (y_margin - fb->y_margin) * p->line_length + (x_margin - fb->x_margin);
+ p->screen_base += (y_margin - fb->y_margin) *
+ p->line_length + (x_margin - fb->x_margin);
}
static u8 cg3regvals_66hz[] __initdata = { /* 1152 x 900, 66 Hz */
@@ -150,7 +175,8 @@ char __init *cgthreefb_init(struct fb_info_sbusfb *fb)
struct fb_fix_screeninfo *fix = &fb->fix;
struct display *disp = &fb->disp;
struct fbtype *type = &fb->type;
- unsigned long phys = fb->sbdp->reg_addrs[0].phys_addr;
+ struct sbus_dev *sdev = fb->sbdp;
+ unsigned long phys = sdev->reg_addrs[0].phys_addr;
int cgRDI = strstr(fb->sbdp->prom_name, "cgRDI") != NULL;
#ifndef FBCON_HAS_CFB8
@@ -158,8 +184,9 @@ char __init *cgthreefb_init(struct fb_info_sbusfb *fb)
#endif
if (!fb->s.cg3.regs) {
- fb->s.cg3.regs = (struct cg3_regs *)sparc_alloc_io(phys+CG3_REGS_OFFSET, 0,
- sizeof(struct cg3_regs), "cg3_regs", fb->iospace, 0);
+ fb->s.cg3.regs = (struct cg3_regs *)
+ sbus_ioremap(&sdev->resource[0], CG3_REGS_OFFSET,
+ sizeof(struct cg3_regs), "cg3 regs");
if (cgRDI) {
char buffer[40];
char *p;
@@ -189,9 +216,11 @@ char __init *cgthreefb_init(struct fb_info_sbusfb *fb)
fix->accel = FB_ACCEL_SUN_CGTHREE;
disp->scrollmode = SCROLL_YREDRAW;
- if (!disp->screen_base)
- disp->screen_base = (char *)sparc_alloc_io(phys+CG3_RAM_OFFSET, 0,
- type->fb_size, "cg3_ram", fb->iospace, 0);
+ if (!disp->screen_base) {
+ disp->screen_base = (char *)
+ sbus_ioremap(&sdev->resource[0], CG3_RAM_OFFSET,
+ type->fb_size, "cg3 ram");
+ }
disp->screen_base += fix->line_length * fb->y_margin + fb->x_margin;
fb->dispsw = fbcon_cfb8;
@@ -219,7 +248,7 @@ char __init *cgthreefb_init(struct fb_info_sbusfb *fb)
if (cgRDI)
type = CG3_RDI;
else {
- u8 status = fb->s.cg3.regs->status, mon;
+ u8 status = sbus_readb(&fb->s.cg3.regs->status), mon;
if ((status & CG3_SR_ID_MASK) == CG3_SR_ID_COLOR) {
mon = status & CG3_SR_RES_MASK;
if (mon == CG3_SR_1152_900_76_A ||
@@ -235,12 +264,17 @@ char __init *cgthreefb_init(struct fb_info_sbusfb *fb)
}
}
- for (p = cg3_regvals[type]; *p; p += 2)
- ((u8 *)fb->s.cg3.regs)[p[0]] = p[1];
-
+ for (p = cg3_regvals[type]; *p; p += 2) {
+ u8 *regp = &((u8 *)fb->s.cg3.regs)[p[0]];
+ sbus_writeb(p[1], regp);
+ }
for (p = cg3_dacvals; *p; p += 2) {
- *(volatile u8 *)&fb->s.cg3.regs->cmap.addr = p[0];
- *(volatile u8 *)&fb->s.cg3.regs->cmap.control = p[1];
+ volatile u8 *regp;
+
+ regp = (volatile u8 *)&fb->s.cg3.regs->cmap.addr;
+ sbus_writeb(p[0], regp);
+ regp = (volatile u8 *)&fb->s.cg3.regs->cmap.control;
+ sbus_writeb(p[1], regp);
}
}