提交 d36e3110 编写于 作者: L Linus Torvalds
...@@ -17,8 +17,8 @@ ...@@ -17,8 +17,8 @@
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/io.h>
#include <asm/io.h>
#include <asm/fbio.h> #include <asm/fbio.h>
#include "sbuslib.h" #include "sbuslib.h"
...@@ -33,7 +33,6 @@ static int leo_blank(int, struct fb_info *); ...@@ -33,7 +33,6 @@ static int leo_blank(int, struct fb_info *);
static int leo_mmap(struct fb_info *, struct vm_area_struct *); static int leo_mmap(struct fb_info *, struct vm_area_struct *);
static int leo_ioctl(struct fb_info *, unsigned int, unsigned long); static int leo_ioctl(struct fb_info *, unsigned int, unsigned long);
static int leo_pan_display(struct fb_var_screeninfo *, struct fb_info *);
/* /*
* Frame buffer operations * Frame buffer operations
...@@ -43,7 +42,6 @@ static struct fb_ops leo_ops = { ...@@ -43,7 +42,6 @@ static struct fb_ops leo_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fb_setcolreg = leo_setcolreg, .fb_setcolreg = leo_setcolreg,
.fb_blank = leo_blank, .fb_blank = leo_blank,
.fb_pan_display = leo_pan_display,
.fb_fillrect = cfb_fillrect, .fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea, .fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit, .fb_imageblit = cfb_imageblit,
...@@ -78,7 +76,7 @@ static struct fb_ops leo_ops = { ...@@ -78,7 +76,7 @@ static struct fb_ops leo_ops = {
#define LEO_CUR_TYPE_CMAP 0x00000050 #define LEO_CUR_TYPE_CMAP 0x00000050
struct leo_cursor { struct leo_cursor {
u8 xxx0[16]; u8 xxx0[16];
u32 cur_type; u32 cur_type;
u32 cur_misc; u32 cur_misc;
u32 cur_cursxy; u32 cur_cursxy;
...@@ -105,7 +103,7 @@ struct leo_lx_krn { ...@@ -105,7 +103,7 @@ struct leo_lx_krn {
struct leo_lc_ss0_krn { struct leo_lc_ss0_krn {
u32 misc; u32 misc;
u8 xxx0[0x800-4]; u8 xxx0[0x800-4];
u32 rev; u32 rev;
}; };
...@@ -116,7 +114,7 @@ struct leo_lc_ss0_usr { ...@@ -116,7 +114,7 @@ struct leo_lc_ss0_usr {
u32 fontt; u32 fontt;
u32 extent; u32 extent;
u32 src; u32 src;
u32 dst; u32 dst;
u32 copy; u32 copy;
u32 fill; u32 fill;
}; };
...@@ -129,8 +127,8 @@ struct leo_lc_ss1_usr { ...@@ -129,8 +127,8 @@ struct leo_lc_ss1_usr {
u8 unknown; u8 unknown;
}; };
struct leo_ld { struct leo_ld_ss0 {
u8 xxx0[0xe00]; u8 xxx0[0xe00];
u32 csr; u32 csr;
u32 wid; u32 wid;
u32 wmask; u32 wmask;
...@@ -144,13 +142,13 @@ struct leo_ld { ...@@ -144,13 +142,13 @@ struct leo_ld {
u32 src; /* Copy/Scroll (SS0 only) */ u32 src; /* Copy/Scroll (SS0 only) */
u32 dst; /* Copy/Scroll/Fill (SS0 only) */ u32 dst; /* Copy/Scroll/Fill (SS0 only) */
u32 extent; /* Copy/Scroll/Fill size (SS0 only) */ u32 extent; /* Copy/Scroll/Fill size (SS0 only) */
u32 xxx1[3]; u32 xxx1[3];
u32 setsem; /* SS1 only */ u32 setsem; /* SS1 only */
u32 clrsem; /* SS1 only */ u32 clrsem; /* SS1 only */
u32 clrpick; /* SS1 only */ u32 clrpick; /* SS1 only */
u32 clrdat; /* SS1 only */ u32 clrdat; /* SS1 only */
u32 alpha; /* SS1 only */ u32 alpha; /* SS1 only */
u8 xxx2[0x2c]; u8 xxx2[0x2c];
u32 winbg; u32 winbg;
u32 planemask; u32 planemask;
u32 rop; u32 rop;
...@@ -199,11 +197,12 @@ struct leo_par { ...@@ -199,11 +197,12 @@ struct leo_par {
static void leo_wait(struct leo_lx_krn __iomem *lx_krn) static void leo_wait(struct leo_lx_krn __iomem *lx_krn)
{ {
int i; int i;
for (i = 0; for (i = 0;
(sbus_readl(&lx_krn->krn_csr) & LEO_KRN_CSR_PROGRESS) && i < 300000; (sbus_readl(&lx_krn->krn_csr) & LEO_KRN_CSR_PROGRESS) &&
i < 300000;
i++) i++)
udelay (1); /* Busy wait at most 0.3 sec */ udelay(1); /* Busy wait at most 0.3 sec */
return; return;
} }
...@@ -221,7 +220,7 @@ static int leo_setcolreg(unsigned regno, ...@@ -221,7 +220,7 @@ static int leo_setcolreg(unsigned regno,
unsigned transp, struct fb_info *info) unsigned transp, struct fb_info *info)
{ {
struct leo_par *par = (struct leo_par *) info->par; struct leo_par *par = (struct leo_par *) info->par;
struct leo_lx_krn __iomem *lx_krn = par->lx_krn; struct leo_lx_krn __iomem *lx_krn = par->lx_krn;
unsigned long flags; unsigned long flags;
u32 val; u32 val;
int i; int i;
...@@ -408,7 +407,7 @@ static void leo_wid_put(struct fb_info *info, struct fb_wid_list *wl) ...@@ -408,7 +407,7 @@ static void leo_wid_put(struct fb_info *info, struct fb_wid_list *wl)
leo_wait(lx_krn); leo_wait(lx_krn);
for (i = 0, wi = wl->wl_list; i < wl->wl_count; i++, wi++) { for (i = 0, wi = wl->wl_list; i < wl->wl_count; i++, wi++) {
switch(wi->wi_type) { switch (wi->wi_type) {
case FB_WID_DBL_8: case FB_WID_DBL_8:
j = (wi->wi_index & 0xf) + 0x40; j = (wi->wi_index & 0xf) + 0x40;
break; break;
...@@ -453,13 +452,12 @@ static void leo_init_wids(struct fb_info *info) ...@@ -453,13 +452,12 @@ static void leo_init_wids(struct fb_info *info)
wi.wi_index = 1; wi.wi_index = 1;
wi.wi_values [0] = 0x30; wi.wi_values [0] = 0x30;
leo_wid_put(info, &wl); leo_wid_put(info, &wl);
} }
static void leo_switch_from_graph(struct fb_info *info) static void leo_switch_from_graph(struct fb_info *info)
{ {
struct leo_par *par = (struct leo_par *) info->par; struct leo_par *par = (struct leo_par *) info->par;
struct leo_ld __iomem *ss = (struct leo_ld __iomem *) par->ld_ss0; struct leo_ld_ss0 __iomem *ss = par->ld_ss0;
unsigned long flags; unsigned long flags;
u32 val; u32 val;
...@@ -485,19 +483,13 @@ static void leo_switch_from_graph(struct fb_info *info) ...@@ -485,19 +483,13 @@ static void leo_switch_from_graph(struct fb_info *info)
val = sbus_readl(&par->lc_ss0_usr->csr); val = sbus_readl(&par->lc_ss0_usr->csr);
} while (val & 0x20000000); } while (val & 0x20000000);
spin_unlock_irqrestore(&par->lock, flags); /* setup screen buffer for cfb_* functions */
} sbus_writel(1, &ss->wid);
sbus_writel(0x00ffffff, &ss->planemask);
static int leo_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) sbus_writel(0x310b90, &ss->rop);
{ sbus_writel(0, &par->lc_ss0_usr->addrspace);
/* We just use this to catch switches out of
* graphics mode.
*/
leo_switch_from_graph(info);
if (var->xoffset || var->yoffset || var->vmode) spin_unlock_irqrestore(&par->lock, flags);
return -EINVAL;
return 0;
} }
static void leo_init_hw(struct fb_info *info) static void leo_init_hw(struct fb_info *info)
...@@ -542,7 +534,8 @@ static void leo_unmap_regs(struct of_device *op, struct fb_info *info, ...@@ -542,7 +534,8 @@ static void leo_unmap_regs(struct of_device *op, struct fb_info *info,
of_iounmap(&op->resource[0], info->screen_base, 0x800000); of_iounmap(&op->resource[0], info->screen_base, 0x800000);
} }
static int __devinit leo_probe(struct of_device *op, const struct of_device_id *match) static int __devinit leo_probe(struct of_device *op,
const struct of_device_id *match)
{ {
struct device_node *dp = op->node; struct device_node *dp = op->node;
struct fb_info *info; struct fb_info *info;
...@@ -594,8 +587,9 @@ static int __devinit leo_probe(struct of_device *op, const struct of_device_id * ...@@ -594,8 +587,9 @@ static int __devinit leo_probe(struct of_device *op, const struct of_device_id *
!info->screen_base) !info->screen_base)
goto out_unmap_regs; goto out_unmap_regs;
info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; info->flags = FBINFO_DEFAULT;
info->fbops = &leo_ops; info->fbops = &leo_ops;
info->pseudo_palette = par->clut_data;
leo_init_wids(info); leo_init_wids(info);
leo_init_hw(info); leo_init_hw(info);
...@@ -649,7 +643,7 @@ static int __devexit leo_remove(struct of_device *op) ...@@ -649,7 +643,7 @@ static int __devexit leo_remove(struct of_device *op)
static struct of_device_id leo_match[] = { static struct of_device_id leo_match[] = {
{ {
.name = "leo", .name = "SUNW,leo",
}, },
{}, {},
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册