[PATCH] ffb: New framebuffer_alloc API and class_dev changes

DORMANTno replies

From: Kronos <hidden>
Date: 2003-09-15 19:54:04

Hi,
this patch converts driver/video/ffb.c to framebuffer_alloc:

======== drivers/video/ffb.c 1.9 ========
D 1.9 03/09/13 23:29:53+02:00 kronos@kronoz.cjb.net 13 12 56/56/976
P drivers/video/ffb.c
C convert driver to framebuffer_alloc
------------------------------------------------

===== drivers/video/ffb.c 1.8 vs 1.9 =====
--- 1.8/drivers/video/ffb.c	Fri Aug 22 08:34:52 2003
+++ 1.9/drivers/video/ffb.c	Sat Sep 13 23:29:53 2003
@@ -41,6 +41,7 @@
 static int ffb_ioctl(struct inode *, struct file *, unsigned int,
 		     unsigned long, struct fb_info *);
 static int ffb_pan_display(struct fb_var_screeninfo *, struct fb_info *);
+static void release_ffb(struct fb_info *info);
 
 /*
  *  Frame buffer operations
@@ -359,6 +360,7 @@
 	int			prom_parent_node;
 	int			dac_rev;
 	int			board_type;
+	struct fb_info		*info;
 	struct list_head	list;
 };
 
@@ -868,12 +870,6 @@
 	return 1;
 }
 
-struct all_info {
-	struct fb_info info;
-	struct ffb_par par;
-	u32 pseudo_palette[256];
-	struct list_head list;
-};
 static LIST_HEAD(ffb_list);
 
 static void ffb_init_one(int node, int parent)
@@ -881,7 +877,8 @@
 	struct linux_prom64_registers regs[2*PROMREG_MAX];
 	struct ffb_fbc *fbc;
 	struct ffb_dac *dac;
-	struct all_info *all;
+	struct fb_info *info;
+	struct ffb_par *par;
 
 	if (prom_getproperty(node, "reg", (void *) regs, sizeof(regs)) <= 0) {
 		printk("ffb: Cannot get reg device node property.\n");
@@ -893,86 +890,87 @@
 		return;
 	}
 
-	all = kmalloc(sizeof(*all), GFP_KERNEL);
-	if (!all) {
+	info = framebuffer_alloc(sizeof(struct ffb_par) + 32 * 256, NULL);
+	if (!info) {
 		printk(KERN_ERR "ffb: Cannot allocate memory.\n");
 		return;
 	}
-	memset(all, 0, sizeof(*all));
-
-	INIT_LIST_HEAD(&all->list);	
-
-	spin_lock_init(&all->par.lock);
-	all->par.fbc = (struct ffb_fbc *)(regs[0].phys_addr + FFB_FBC_REGS_POFF);
-	all->par.dac = (struct ffb_dac *)(regs[0].phys_addr + FFB_DAC_POFF);
-	all->par.rop_cache = FFB_ROP_NEW;
-	all->par.physbase = regs[0].phys_addr;
-	all->par.prom_node = node;
-	all->par.prom_parent_node = parent;
-
-	all->info.flags = FBINFO_FLAG_DEFAULT;
-	all->info.fbops = &ffb_ops;
-	all->info.screen_base = (char *) all->par.physbase + FFB_DFB24_POFF;
-	all->info.par = &all->par;
-	all->info.pseudo_palette = all->pseudo_palette;
-
-	sbusfb_fill_var(&all->info.var, all->par.prom_node, 32);
-	all->par.fbsize = PAGE_ALIGN(all->info.var.xres *
-				     all->info.var.yres *
+	par = info->par;
+	par->info = info;
+	info->release = &release_ffb;
+	
+	INIT_LIST_HEAD(&par->list);	
+
+	spin_lock_init(&par->lock);
+	par->fbc = (struct ffb_fbc *)(regs[0].phys_addr + FFB_FBC_REGS_POFF);
+	par->dac = (struct ffb_dac *)(regs[0].phys_addr + FFB_DAC_POFF);
+	par->rop_cache = FFB_ROP_NEW;
+	par->physbase = regs[0].phys_addr;
+	par->prom_node = node;
+	par->prom_parent_node = parent;
+
+	info->flags = FBINFO_FLAG_DEFAULT;
+	info->fbops = &ffb_ops;
+	info->screen_base = (char *) par->physbase + FFB_DFB24_POFF;
+	info->pseudo_palette = (void *)(par + 1);
+
+	sbusfb_fill_var(&info->var, par->prom_node, 32);
+	par->fbsize = PAGE_ALIGN(info->var.xres *
+				     info->var.yres *
 				     4);
-	ffb_fixup_var_rgb(&all->info.var);
+	ffb_fixup_var_rgb(&info->var);
 
-	all->info.var.accel_flags = FB_ACCELF_TEXT;
+	info->var.accel_flags = FB_ACCELF_TEXT;
 
-	prom_getstring(node, "name", all->par.name, sizeof(all->par.name));
-	if (!strcmp(all->par.name, "SUNW,afb"))
-		all->par.flags |= FFB_FLAG_AFB;
+	prom_getstring(node, "name", par->name, sizeof(par->name));
+	if (!strcmp(par->name, "SUNW,afb"))
+		par->flags |= FFB_FLAG_AFB;
 
-	all->par.board_type = prom_getintdefault(node, "board_type", 0);
+	par->board_type = prom_getintdefault(node, "board_type", 0);
 
-	fbc = all->par.fbc;
+	fbc = par->fbc;
 	if((upa_readl(&fbc->ucsr) & FFB_UCSR_ALL_ERRORS) != 0)
 		upa_writel(FFB_UCSR_ALL_ERRORS, &fbc->ucsr);
 
-	ffb_switch_from_graph(&all->par);
+	ffb_switch_from_graph(par);
 
-	dac = all->par.dac;
+	dac = par->dac;
 	upa_writel(0x8000, &dac->type);
-	all->par.dac_rev = upa_readl(&dac->value) >> 0x1c;
+	par->dac_rev = upa_readl(&dac->value) >> 0x1c;
 
 	/* Elite3D has different DAC revision numbering, and no DAC revisions
 	 * have the reversed meaning of cursor enable.
 	 */
-	if (all->par.flags & FFB_FLAG_AFB)
-		all->par.dac_rev = 10;
+	if (par->flags & FFB_FLAG_AFB)
+		par->dac_rev = 10;
 
 	/* Unblank it just to be sure.  When there are multiple
 	 * FFB/AFB cards in the system, or it is not the OBP
 	 * chosen console, it will have video outputs off in
 	 * the DAC.
 	 */
-	ffb_blank(0, &all->info);
+	ffb_blank(0, info);
 
-	if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
+	if (fb_alloc_cmap(&info->cmap, 256, 0)) {
 		printk(KERN_ERR "ffb: Could not allocate color map.\n");
-		kfree(all);
+		kfree(info);
 		return;
 	}
 
-	ffb_init_fix(&all->info);
+	ffb_init_fix(info);
 
-	if (register_framebuffer(&all->info) < 0) {
+	if (register_framebuffer(info) < 0) {
 		printk(KERN_ERR "ffb: Could not register framebuffer.\n");
-		fb_dealloc_cmap(&all->info.cmap);
-		kfree(all);
+		fb_dealloc_cmap(&info->cmap);
+		kfree(info);
 		return;
 	}
 
-	list_add(&all->list, &ffb_list);
+	list_add(&par->list, &ffb_list);
 
 	printk("ffb: %s at %016lx type %d DAC %d\n",
-	       ((all->par.flags & FFB_FLAG_AFB) ? "AFB" : "FFB"),
-	       regs[0].phys_addr, all->par.board_type, all->par.dac_rev);
+	       ((par->flags & FFB_FLAG_AFB) ? "AFB" : "FFB"),
+	       regs[0].phys_addr, par->board_type, par->dac_rev);
 }
 
 static void ffb_scan_siblings(int root)
@@ -1002,16 +1000,18 @@
 	return 0;
 }
 
+static void release_ffb(struct fb_info *info) {
+	fb_dealloc_cmap(&info->cmap);
+}
+
 void __exit ffb_exit(void)
 {
 	struct list_head *pos, *tmp;
 
 	list_for_each_safe(pos, tmp, &ffb_list) {
-		struct all_info *all = list_entry(pos, typeof(*all), list);
+		struct ffb_par *par = list_entry(pos, typeof(*par), list);
 
-		unregister_framebuffer(&all->info);
-		fb_dealloc_cmap(&all->info.cmap);
-		kfree(all);
+		unregister_framebuffer(par->info);
 	}
 }
 
Luca
-- 
Reply-To: kronos@kronoz.cjb.net
Home: http://kronoz.cjb.net
Tentare e` il primo passo verso il fallimento.
Homer J. Simpson


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help