1 --- linus-2.6/drivers/video/sgivwfb.c 2004-02-18 20:59:08.000000000 -0800
2 +++ fbdev-2.6/drivers/video/sgivwfb.c 2004-02-19 16:11:44.000000000 -0800
6 #define INCLUDE_TIMING_TABLE_DATA
7 -#define DBE_REG_BASE default_par.regs
8 +#define DBE_REG_BASE par->regs
9 #include <video/sgivw.h>
13 extern unsigned long sgivwfb_mem_phys;
14 extern unsigned long sgivwfb_mem_size;
16 -static struct sgivw_par default_par;
17 -static u32 pseudo_palette[17];
18 -static struct fb_info fb_info;
26 -static void dbe_TurnOffDma(void)
27 +static void dbe_TurnOffDma(struct sgivw_par *par)
33 * Setup flatpanel related registers.
35 -static void sgivwfb_setup_flatpanel(struct dbe_timing_info *currentTiming)
36 +static void sgivwfb_setup_flatpanel(struct sgivw_par *par, struct dbe_timing_info *currentTiming)
38 int fp_wid, fp_hgt, fp_vbs, fp_vbe;
41 /* Turn on dotclock PLL */
42 DBE_SETREG(ctrlstat, 0x20000000);
45 + dbe_TurnOffDma(par);
47 /* dbe_CalculateScreenParams(); */
48 maxPixelsPerTileX = 512 / bytesPerPixel;
50 DBE_SETREG(vt_xy, 0x00000000);
54 + dbe_TurnOffDma(par);
57 for (i = 0; i < 256; i++) {
59 DBE_SETREG(vt_hcmap, outputVal);
61 if (flatpanel_id != -1)
62 - sgivwfb_setup_flatpanel(currentTiming);
63 + sgivwfb_setup_flatpanel(par, currentTiming);
66 temp = currentTiming->vblank_start - currentTiming->vblank_end - 1;
71 -int __init sgivwfb_init(void)
72 +static void sgivwfb_release(struct device *device)
76 +static int __init sgivwfb_probe(struct device *device)
78 + struct platform_device *dev = to_platform_device(device);
79 + struct sgivw_par *par;
80 + struct fb_info *info;
83 + info = framebuffer_alloc(sizeof(struct sgivw_par) + sizeof(u32) * 256, &dev->dev);
88 if (!request_mem_region(DBE_REG_PHYS, DBE_REG_SIZE, "sgivwfb")) {
89 printk(KERN_ERR "sgivwfb: couldn't reserve mmio region\n");
90 + framebuffer_release(info);
93 - default_par.regs = (struct asregs *) ioremap_nocache(DBE_REG_PHYS, DBE_REG_SIZE);
94 - if (!default_par.regs) {
96 + par->regs = (struct asregs *) ioremap_nocache(DBE_REG_PHYS, DBE_REG_SIZE);
98 printk(KERN_ERR "sgivwfb: couldn't ioremap registers\n");
99 goto fail_ioremap_regs;
101 @@ -773,66 +784,110 @@
102 sgivwfb_fix.ywrapstep = ywrap;
103 sgivwfb_fix.ypanstep = ypan;
105 - fb_info.fix = sgivwfb_fix;
106 + info->fix = sgivwfb_fix;
108 switch (flatpanel_id) {
109 case FLATPANEL_SGI_1600SW:
110 - fb_info.var = sgivwfb_var1600sw;
111 + info->var = sgivwfb_var1600sw;
112 monitor = "SGI 1600SW flatpanel";
115 - fb_info.var = sgivwfb_var;
116 + info->var = sgivwfb_var;
120 printk(KERN_INFO "sgivwfb: %s monitor selected\n", monitor);
122 - fb_info.fbops = &sgivwfb_ops;
123 - fb_info.pseudo_palette = pseudo_palette;
124 - fb_info.par = &default_par;
125 - fb_info.flags = FBINFO_FLAG_DEFAULT;
126 + info->fbops = &sgivwfb_ops;
127 + info->pseudo_palette = (void *) (par + 1);
128 + info->flags = FBINFO_FLAG_DEFAULT;
130 - fb_info.screen_base = ioremap_nocache((unsigned long) sgivwfb_mem_phys, sgivwfb_mem_size);
131 - if (!fb_info.screen_base) {
132 + info->screen_base = ioremap_nocache((unsigned long) sgivwfb_mem_phys, sgivwfb_mem_size);
133 + if (!info->screen_base) {
134 printk(KERN_ERR "sgivwfb: couldn't ioremap screen_base\n");
135 goto fail_ioremap_fbmem;
138 - fb_alloc_cmap(&fb_info.cmap, 256, 0);
139 + if (fb_alloc_cmap(&info->cmap, 256, 0) < 0)
140 + goto fail_color_map;
142 - if (register_framebuffer(&fb_info) < 0) {
143 + if (register_framebuffer(info) < 0) {
144 printk(KERN_ERR "sgivwfb: couldn't register framebuffer\n");
145 goto fail_register_framebuffer;
148 + dev_set_drvdata(&dev->dev, info);
150 printk(KERN_INFO "fb%d: SGI DBE frame buffer device, using %ldK of video memory at %#lx\n",
151 - fb_info.node, sgivwfb_mem_size >> 10, sgivwfb_mem_phys);
152 + info->node, sgivwfb_mem_size >> 10, sgivwfb_mem_phys);
156 fail_register_framebuffer:
157 - iounmap((char *) fb_info.screen_base);
158 + fb_dealloc_cmap(&info->cmap);
160 + iounmap((char *) info->screen_base);
162 - iounmap(default_par.regs);
163 + iounmap(par->regs);
165 release_mem_region(DBE_REG_PHYS, DBE_REG_SIZE);
166 + framebuffer_release(info);
171 -MODULE_LICENSE("GPL");
172 +static int sgivwfb_remove(struct device *device)
174 + struct fb_info *info = dev_get_drvdata(device);
177 + struct sgivw_par *par = info->par;
179 + unregister_framebuffer(info);
180 + dbe_TurnOffDma(par);
181 + iounmap(par->regs);
182 + iounmap(info->screen_base);
183 + release_mem_region(DBE_REG_PHYS, DBE_REG_SIZE);
188 +static struct device_driver sgivwfb_driver = {
190 + .bus = &platform_bus_type,
191 + .probe = sgivwfb_probe,
192 + .remove = sgivwfb_remove,
195 +static struct platform_device sgivwfb_device = {
199 + .release = sgivwfb_release,
203 -int init_module(void)
204 +int __init sgivwfb_init(void)
206 - return sgivwfb_init();
209 + ret = driver_register(&sgivwfb_driver);
211 + ret = platform_device_register(&sgivwfb_device);
213 + driver_unregister(&sgivwfb_driver);
218 -void cleanup_module(void)
220 +MODULE_LICENSE("GPL");
222 +static void __exit sgivwfb_exit(void)
224 - unregister_framebuffer(&fb_info);
227 - iounmap(&fb_info.screen_base);
228 - release_mem_region(DBE_REG_PHYS, DBE_REG_SIZE);
229 + platform_device_unregister(&sgivwfb_device);
230 + driver_unregister(&sgivwfb_driver);
233 +module_init(sgivwfb_init);
234 +module_exit(sgivwfb_exit);