⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leo.c

📁 Linux Kernel 2.6.9 for OMAP1710
💻 C
📖 第 1 页 / 共 2 页
字号:
		.size	= 0x1000	},	{		.voff	= LEO_LX_KRN_MAP,		.poff	= LEO_OFF_LX_KRN,		.size	= 0x1000	},	{		.voff	= LEO_LC_SS0_KRN_MAP,		.poff	= LEO_OFF_LC_SS0_KRN,		.size	= 0x1000	},	{		.voff	= LEO_LC_SS1_KRN_MAP,		.poff	= LEO_OFF_LC_SS1_KRN,		.size	= 0x1000	},	{		.voff	= LEO_LD_GBL_MAP,		.poff	= LEO_OFF_LD_GBL,		.size	= 0x1000	},	{		.voff	= LEO_UNK2_MAP,		.poff	= LEO_OFF_UNK2,		.size	= 0x100000	},	{ .size = 0 }};static int leo_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma){	struct leo_par *par = (struct leo_par *)info->par;	return sbusfb_mmap_helper(leo_mmap_map,				  par->physbase, par->fbsize,				  par->sdev->reg_addrs[0].which_io,				  vma);}static int leo_ioctl(struct inode *inode, struct file *file, unsigned int cmd,		     unsigned long arg, struct fb_info *info){	struct leo_par *par = (struct leo_par *) info->par;	return sbusfb_ioctl_helper(cmd, arg, info,				   FBTYPE_SUNLEO, 32, par->fbsize);}/* *  Initialisation */static voidleo_init_fix(struct fb_info *info){	struct leo_par *par = (struct leo_par *)info->par;	strlcpy(info->fix.id, par->sdev->prom_name, sizeof(info->fix.id));	info->fix.type = FB_TYPE_PACKED_PIXELS;	info->fix.visual = FB_VISUAL_TRUECOLOR;	info->fix.line_length = 8192;	info->fix.accel = FB_ACCEL_SUN_LEO;}static void leo_wid_put(struct fb_info *info, struct fb_wid_list *wl){	struct leo_par *par = (struct leo_par *) info->par;	struct leo_lx_krn *lx_krn = par->lx_krn;	struct fb_wid_item *wi;	unsigned long flags;	u32 val;	int i, j;	spin_lock_irqsave(&par->lock, flags);	leo_wait(lx_krn);	for (i = 0, wi = wl->wl_list; i < wl->wl_count; i++, wi++) {		switch(wi->wi_type) {		case FB_WID_DBL_8:			j = (wi->wi_index & 0xf) + 0x40;			break;		case FB_WID_DBL_24:			j = wi->wi_index & 0x3f;			break;		default:			continue;		};		sbus_writel(0x5800 + j, &lx_krn->krn_type);		sbus_writel(wi->wi_values[0], &lx_krn->krn_value);	}	sbus_writel(LEO_KRN_TYPE_WID, &lx_krn->krn_type);	val = sbus_readl(&lx_krn->krn_csr);	val |= (LEO_KRN_CSR_UNK | LEO_KRN_CSR_UNK2);	sbus_writel(val, &lx_krn->krn_csr);	spin_unlock_irqrestore(&par->lock, flags);}static void leo_init_wids(struct fb_info *info){	struct fb_wid_item wi;	struct fb_wid_list wl;	wl.wl_count = 1;	wl.wl_list = &wi;	wi.wi_type = FB_WID_DBL_8;	wi.wi_index = 0;	wi.wi_values [0] = 0x2c0;	leo_wid_put(info, &wl);	wi.wi_index = 1;	wi.wi_values [0] = 0x30;	leo_wid_put(info, &wl);	wi.wi_index = 2;	wi.wi_values [0] = 0x20;	leo_wid_put(info, &wl);	wi.wi_type = FB_WID_DBL_24;	wi.wi_index = 1;	wi.wi_values [0] = 0x30;	leo_wid_put(info, &wl);}static void leo_switch_from_graph(struct fb_info *info){	struct leo_par *par = (struct leo_par *) info->par;	struct leo_ld *ss = (struct leo_ld *) par->ld_ss0;	unsigned long flags;	u32 val;	spin_lock_irqsave(&par->lock, flags);	par->extent = ((info->var.xres - 1) |		       ((info->var.yres - 1) << 16));	sbus_writel(0xffffffff, &ss->wid);	sbus_writel(0xffff, &ss->wmask);	sbus_writel(0, &ss->vclipmin);	sbus_writel(par->extent, &ss->vclipmax);	sbus_writel(0, &ss->fg);	sbus_writel(0xff000000, &ss->planemask);	sbus_writel(0x310850, &ss->rop);	sbus_writel(0, &ss->widclip);	sbus_writel((info->var.xres-1) | ((info->var.yres-1) << 11),		    &par->lc_ss0_usr->extent);	sbus_writel(4, &par->lc_ss0_usr->addrspace);	sbus_writel(0x80000000, &par->lc_ss0_usr->fill);	sbus_writel(0, &par->lc_ss0_usr->fontt);	do {		val = sbus_readl(&par->lc_ss0_usr->csr);	} while (val & 0x20000000);	spin_unlock_irqrestore(&par->lock, flags);}static int leo_pan_display(struct fb_var_screeninfo *var, struct fb_info *info){	/* We just use this to catch switches out of	 * graphics mode.	 */	leo_switch_from_graph(info);	if (var->xoffset || var->yoffset || var->vmode)		return -EINVAL;	return 0;}static void leo_init_hw(struct fb_info *info){	struct leo_par *par = (struct leo_par *) info->par;	u32 val;	val = sbus_readl(&par->ld_ss1->ss1_misc);	val |= LEO_SS1_MISC_ENABLE;	sbus_writel(val, &par->ld_ss1->ss1_misc);	leo_switch_from_graph(info);}static void leo_fixup_var_rgb(struct fb_var_screeninfo *var){	var->red.offset = 0;	var->red.length = 8;	var->green.offset = 8;	var->green.length = 8;	var->blue.offset = 16;	var->blue.length = 8;	var->transp.offset = 0;	var->transp.length = 0;}struct all_info {	struct fb_info info;	struct leo_par par;	struct list_head list;};static LIST_HEAD(leo_list);static void leo_init_one(struct sbus_dev *sdev){	struct all_info *all;	int linebytes;	all = kmalloc(sizeof(*all), GFP_KERNEL);	if (!all) {		printk(KERN_ERR "leo: Cannot allocate memory.\n");		return;	}	memset(all, 0, sizeof(*all));	INIT_LIST_HEAD(&all->list);	spin_lock_init(&all->par.lock);	all->par.sdev = sdev;	all->par.physbase = sdev->reg_addrs[0].phys_addr;	sbusfb_fill_var(&all->info.var, sdev->prom_node, 32);	leo_fixup_var_rgb(&all->info.var);	linebytes = prom_getintdefault(sdev->prom_node, "linebytes",				       all->info.var.xres);	all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres);#ifdef CONFIG_SPARC32	all->info.screen_base = (char *)		prom_getintdefault(sdev->prom_node, "address", 0);#endif	if (!all->info.screen_base)		all->info.screen_base = (char *)			sbus_ioremap(&sdev->resource[0], LEO_OFF_SS0,				     0x800000, "leo ram");	all->par.lc_ss0_usr = (struct leo_lc_ss0_usr *)		sbus_ioremap(&sdev->resource[0], LEO_OFF_LC_SS0_USR,			     0x1000, "leolc ss0usr");	all->par.ld_ss0 = (struct leo_ld_ss0 *)		sbus_ioremap(&sdev->resource[0], LEO_OFF_LD_SS0,			     0x1000, "leold ss0");	all->par.ld_ss1 = (struct leo_ld_ss1 *)		sbus_ioremap(&sdev->resource[0], LEO_OFF_LD_SS1,			     0x1000, "leold ss1");	all->par.lx_krn = (struct leo_lx_krn *)		sbus_ioremap(&sdev->resource[0], LEO_OFF_LX_KRN,			     0x1000, "leolx krn");	all->par.cursor = (struct leo_cursor *)		sbus_ioremap(&sdev->resource[0], LEO_OFF_LX_CURSOR,			     sizeof(struct leo_cursor), "leolx cursor");	all->info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;	all->info.fbops = &leo_ops;	all->info.currcon = -1;	all->info.par = &all->par;	leo_init_wids(&all->info);	leo_init_hw(&all->info);	leo_blank(0, &all->info);	if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {		printk(KERN_ERR "leo: Could not allocate color map.\n");		kfree(all);		return;	}	leo_init_fix(&all->info);	if (register_framebuffer(&all->info) < 0) {		printk(KERN_ERR "leo: Could not register framebuffer.\n");		fb_dealloc_cmap(&all->info.cmap);		kfree(all);		return;	}	list_add(&all->list, &leo_list);	printk("leo: %s at %lx:%lx\n",	       sdev->prom_name,	       (long) sdev->reg_addrs[0].which_io,	       (long) sdev->reg_addrs[0].phys_addr);}int __init leo_init(void){	struct sbus_bus *sbus;	struct sbus_dev *sdev;	if (fb_get_options("leofb", NULL))		return -ENODEV;	for_all_sbusdev(sdev, sbus) {		if (!strcmp(sdev->prom_name, "leo"))			leo_init_one(sdev);	}	return 0;}void __exit leo_exit(void){	struct list_head *pos, *tmp;	list_for_each_safe(pos, tmp, &leo_list) {		struct all_info *all = list_entry(pos, typeof(*all), list);		unregister_framebuffer(&all->info);		fb_dealloc_cmap(&all->info.cmap);		kfree(all);	}}int __initleo_setup(char *arg){	/* No cmdline options yet... */	return 0;}module_init(leo_init);#ifdef MODULEmodule_exit(leo_exit);#endifMODULE_DESCRIPTION("framebuffer driver for LEO chipsets");MODULE_AUTHOR("David S. Miller <davem@redhat.com>");MODULE_LICENSE("GPL");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -