1 /* 2 * SGI GBE frame buffer driver 3 * 4 * Copyright (C) 1999 Silicon Graphics, Inc. - Jeffrey Newquist 5 * Copyright (C) 2002 Vivien Chappelier <vivien.chappelier@linux-mips.org> 6 * 7 * This file is subject to the terms and conditions of the GNU General Public 8 * License. See the file COPYING in the main directory of this archive for 9 * more details. 10 */ 11 12 #include <linux/delay.h> 13 #include <linux/platform_device.h> 14 #include <linux/dma-mapping.h> 15 #include <linux/errno.h> 16 #include <linux/gfp.h> 17 #include <linux/fb.h> 18 #include <linux/init.h> 19 #include <linux/interrupt.h> 20 #include <linux/kernel.h> 21 #include <linux/mm.h> 22 #include <linux/module.h> 23 #include <linux/io.h> 24 25 #ifdef CONFIG_X86 26 #include <asm/mtrr.h> 27 #endif 28 #ifdef CONFIG_MIPS 29 #include <asm/addrspace.h> 30 #endif 31 #include <asm/byteorder.h> 32 #include <asm/tlbflush.h> 33 34 #include <video/gbe.h> 35 36 static struct sgi_gbe *gbe; 37 38 struct gbefb_par { 39 struct fb_var_screeninfo var; 40 struct gbe_timing_info timing; 41 int valid; 42 }; 43 44 #ifdef CONFIG_SGI_IP32 45 #define GBE_BASE 0x16000000 /* SGI O2 */ 46 #endif 47 48 /* macro for fastest write-though access to the framebuffer */ 49 #ifdef CONFIG_MIPS 50 #ifdef CONFIG_CPU_R10000 51 #define pgprot_fb(_prot) (((_prot) & (~_CACHE_MASK)) | _CACHE_UNCACHED_ACCELERATED) 52 #else 53 #define pgprot_fb(_prot) (((_prot) & (~_CACHE_MASK)) | _CACHE_CACHABLE_NO_WA) 54 #endif 55 #endif 56 #ifdef CONFIG_X86 57 #define pgprot_fb(_prot) ((_prot) | _PAGE_PCD) 58 #endif 59 60 /* 61 * RAM we reserve for the frame buffer. This defines the maximum screen 62 * size 63 */ 64 #if CONFIG_FB_GBE_MEM > 8 65 #error GBE Framebuffer cannot use more than 8MB of memory 66 #endif 67 68 #define TILE_SHIFT 16 69 #define TILE_SIZE (1 << TILE_SHIFT) 70 #define TILE_MASK (TILE_SIZE - 1) 71 72 static unsigned int gbe_mem_size = CONFIG_FB_GBE_MEM * 1024*1024; 73 static void *gbe_mem; 74 static dma_addr_t gbe_dma_addr; 75 static unsigned long gbe_mem_phys; 76 77 static struct { 78 uint16_t *cpu; 79 dma_addr_t dma; 80 } gbe_tiles; 81 82 static int gbe_revision; 83 84 static int ypan, ywrap; 85 86 static uint32_t pseudo_palette[16]; 87 static uint32_t gbe_cmap[256]; 88 static int gbe_turned_on; /* 0 turned off, 1 turned on */ 89 90 static char *mode_option = NULL; 91 92 /* default CRT mode */ 93 static struct fb_var_screeninfo default_var_CRT = { 94 /* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */ 95 .xres = 640, 96 .yres = 480, 97 .xres_virtual = 640, 98 .yres_virtual = 480, 99 .xoffset = 0, 100 .yoffset = 0, 101 .bits_per_pixel = 8, 102 .grayscale = 0, 103 .red = { 0, 8, 0 }, 104 .green = { 0, 8, 0 }, 105 .blue = { 0, 8, 0 }, 106 .transp = { 0, 0, 0 }, 107 .nonstd = 0, 108 .activate = 0, 109 .height = -1, 110 .width = -1, 111 .accel_flags = 0, 112 .pixclock = 39722, /* picoseconds */ 113 .left_margin = 48, 114 .right_margin = 16, 115 .upper_margin = 33, 116 .lower_margin = 10, 117 .hsync_len = 96, 118 .vsync_len = 2, 119 .sync = 0, 120 .vmode = FB_VMODE_NONINTERLACED, 121 }; 122 123 /* default LCD mode */ 124 static struct fb_var_screeninfo default_var_LCD = { 125 /* 1600x1024, 8 bpp */ 126 .xres = 1600, 127 .yres = 1024, 128 .xres_virtual = 1600, 129 .yres_virtual = 1024, 130 .xoffset = 0, 131 .yoffset = 0, 132 .bits_per_pixel = 8, 133 .grayscale = 0, 134 .red = { 0, 8, 0 }, 135 .green = { 0, 8, 0 }, 136 .blue = { 0, 8, 0 }, 137 .transp = { 0, 0, 0 }, 138 .nonstd = 0, 139 .activate = 0, 140 .height = -1, 141 .width = -1, 142 .accel_flags = 0, 143 .pixclock = 9353, 144 .left_margin = 20, 145 .right_margin = 30, 146 .upper_margin = 37, 147 .lower_margin = 3, 148 .hsync_len = 20, 149 .vsync_len = 3, 150 .sync = 0, 151 .vmode = FB_VMODE_NONINTERLACED 152 }; 153 154 /* default modedb mode */ 155 /* 640x480, 60 Hz, Non-Interlaced (25.172 MHz dotclock) */ 156 static struct fb_videomode default_mode_CRT = { 157 .refresh = 60, 158 .xres = 640, 159 .yres = 480, 160 .pixclock = 39722, 161 .left_margin = 48, 162 .right_margin = 16, 163 .upper_margin = 33, 164 .lower_margin = 10, 165 .hsync_len = 96, 166 .vsync_len = 2, 167 .sync = 0, 168 .vmode = FB_VMODE_NONINTERLACED, 169 }; 170 /* 1600x1024 SGI flatpanel 1600sw */ 171 static struct fb_videomode default_mode_LCD = { 172 /* 1600x1024, 8 bpp */ 173 .xres = 1600, 174 .yres = 1024, 175 .pixclock = 9353, 176 .left_margin = 20, 177 .right_margin = 30, 178 .upper_margin = 37, 179 .lower_margin = 3, 180 .hsync_len = 20, 181 .vsync_len = 3, 182 .vmode = FB_VMODE_NONINTERLACED, 183 }; 184 185 static struct fb_videomode *default_mode = &default_mode_CRT; 186 static struct fb_var_screeninfo *default_var = &default_var_CRT; 187 188 static int flat_panel_enabled = 0; 189 190 static void gbe_reset(void) 191 { 192 /* Turn on dotclock PLL */ 193 gbe->ctrlstat = 0x300aa000; 194 } 195 196 197 /* 198 * Function: gbe_turn_off 199 * Parameters: (None) 200 * Description: This should turn off the monitor and gbe. This is used 201 * when switching between the serial console and the graphics 202 * console. 203 */ 204 205 static void gbe_turn_off(void) 206 { 207 int i; 208 unsigned int val, x, y, vpixen_off; 209 210 gbe_turned_on = 0; 211 212 /* check if pixel counter is on */ 213 val = gbe->vt_xy; 214 if (GET_GBE_FIELD(VT_XY, FREEZE, val) == 1) 215 return; 216 217 /* turn off DMA */ 218 val = gbe->ovr_control; 219 SET_GBE_FIELD(OVR_CONTROL, OVR_DMA_ENABLE, val, 0); 220 gbe->ovr_control = val; 221 udelay(1000); 222 val = gbe->frm_control; 223 SET_GBE_FIELD(FRM_CONTROL, FRM_DMA_ENABLE, val, 0); 224 gbe->frm_control = val; 225 udelay(1000); 226 val = gbe->did_control; 227 SET_GBE_FIELD(DID_CONTROL, DID_DMA_ENABLE, val, 0); 228 gbe->did_control = val; 229 udelay(1000); 230 231 /* We have to wait through two vertical retrace periods before 232 * the pixel DMA is turned off for sure. */ 233 for (i = 0; i < 10000; i++) { 234 val = gbe->frm_inhwctrl; 235 if (GET_GBE_FIELD(FRM_INHWCTRL, FRM_DMA_ENABLE, val)) { 236 udelay(10); 237 } else { 238 val = gbe->ovr_inhwctrl; 239 if (GET_GBE_FIELD(OVR_INHWCTRL, OVR_DMA_ENABLE, val)) { 240 udelay(10); 241 } else { 242 val = gbe->did_inhwctrl; 243 if (GET_GBE_FIELD(DID_INHWCTRL, DID_DMA_ENABLE, val)) { 244 udelay(10); 245 } else 246 break; 247 } 248 } 249 } 250 if (i == 10000) 251 printk(KERN_ERR "gbefb: turn off DMA timed out\n"); 252 253 /* wait for vpixen_off */ 254 val = gbe->vt_vpixen; 255 vpixen_off = GET_GBE_FIELD(VT_VPIXEN, VPIXEN_OFF, val); 256 257 for (i = 0; i < 100000; i++) { 258 val = gbe->vt_xy; 259 x = GET_GBE_FIELD(VT_XY, X, val); 260 y = GET_GBE_FIELD(VT_XY, Y, val); 261 if (y < vpixen_off) 262 break; 263 udelay(1); 264 } 265 if (i == 100000) 266 printk(KERN_ERR 267 "gbefb: wait for vpixen_off timed out\n"); 268 for (i = 0; i < 10000; i++) { 269 val = gbe->vt_xy; 270 x = GET_GBE_FIELD(VT_XY, X, val); 271 y = GET_GBE_FIELD(VT_XY, Y, val); 272 if (y > vpixen_off) 273 break; 274 udelay(1); 275 } 276 if (i == 10000) 277 printk(KERN_ERR "gbefb: wait for vpixen_off timed out\n"); 278 279 /* turn off pixel counter */ 280 val = 0; 281 SET_GBE_FIELD(VT_XY, FREEZE, val, 1); 282 gbe->vt_xy = val; 283 udelay(10000); 284 for (i = 0; i < 10000; i++) { 285 val = gbe->vt_xy; 286 if (GET_GBE_FIELD(VT_XY, FREEZE, val) != 1) 287 udelay(10); 288 else 289 break; 290 } 291 if (i == 10000) 292 printk(KERN_ERR "gbefb: turn off pixel clock timed out\n"); 293 294 /* turn off dot clock */ 295 val = gbe->dotclock; 296 SET_GBE_FIELD(DOTCLK, RUN, val, 0); 297 gbe->dotclock = val; 298 udelay(10000); 299 for (i = 0; i < 10000; i++) { 300 val = gbe->dotclock; 301 if (GET_GBE_FIELD(DOTCLK, RUN, val)) 302 udelay(10); 303 else 304 break; 305 } 306 if (i == 10000) 307 printk(KERN_ERR "gbefb: turn off dotclock timed out\n"); 308 309 /* reset the frame DMA FIFO */ 310 val = gbe->frm_size_tile; 311 SET_GBE_FIELD(FRM_SIZE_TILE, FRM_FIFO_RESET, val, 1); 312 gbe->frm_size_tile = val; 313 SET_GBE_FIELD(FRM_SIZE_TILE, FRM_FIFO_RESET, val, 0); 314 gbe->frm_size_tile = val; 315 } 316 317 static void gbe_turn_on(void) 318 { 319 unsigned int val, i; 320 321 /* 322 * Check if pixel counter is off, for unknown reason this 323 * code hangs Visual Workstations 324 */ 325 if (gbe_revision < 2) { 326 val = gbe->vt_xy; 327 if (GET_GBE_FIELD(VT_XY, FREEZE, val) == 0) 328 return; 329 } 330 331 /* turn on dot clock */ 332 val = gbe->dotclock; 333 SET_GBE_FIELD(DOTCLK, RUN, val, 1); 334 gbe->dotclock = val; 335 udelay(10000); 336 for (i = 0; i < 10000; i++) { 337 val = gbe->dotclock; 338 if (GET_GBE_FIELD(DOTCLK, RUN, val) != 1) 339 udelay(10); 340 else 341 break; 342 } 343 if (i == 10000) 344 printk(KERN_ERR "gbefb: turn on dotclock timed out\n"); 345 346 /* turn on pixel counter */ 347 val = 0; 348 SET_GBE_FIELD(VT_XY, FREEZE, val, 0); 349 gbe->vt_xy = val; 350 udelay(10000); 351 for (i = 0; i < 10000; i++) { 352 val = gbe->vt_xy; 353 if (GET_GBE_FIELD(VT_XY, FREEZE, val)) 354 udelay(10); 355 else 356 break; 357 } 358 if (i == 10000) 359 printk(KERN_ERR "gbefb: turn on pixel clock timed out\n"); 360 361 /* turn on DMA */ 362 val = gbe->frm_control; 363 SET_GBE_FIELD(FRM_CONTROL, FRM_DMA_ENABLE, val, 1); 364 gbe->frm_control = val; 365 udelay(1000); 366 for (i = 0; i < 10000; i++) { 367 val = gbe->frm_inhwctrl; 368 if (GET_GBE_FIELD(FRM_INHWCTRL, FRM_DMA_ENABLE, val) != 1) 369 udelay(10); 370 else 371 break; 372 } 373 if (i == 10000) 374 printk(KERN_ERR "gbefb: turn on DMA timed out\n"); 375 376 gbe_turned_on = 1; 377 } 378 379 static void gbe_loadcmap(void) 380 { 381 int i, j; 382 383 for (i = 0; i < 256; i++) { 384 for (j = 0; j < 1000 && gbe->cm_fifo >= 63; j++) 385 udelay(10); 386 if (j == 1000) 387 printk(KERN_ERR "gbefb: cmap FIFO timeout\n"); 388 389 gbe->cmap[i] = gbe_cmap[i]; 390 } 391 } 392 393 /* 394 * Blank the display. 395 */ 396 static int gbefb_blank(int blank, struct fb_info *info) 397 { 398 /* 0 unblank, 1 blank, 2 no vsync, 3 no hsync, 4 off */ 399 switch (blank) { 400 case FB_BLANK_UNBLANK: /* unblank */ 401 gbe_turn_on(); 402 gbe_loadcmap(); 403 break; 404 405 case FB_BLANK_NORMAL: /* blank */ 406 gbe_turn_off(); 407 break; 408 409 default: 410 /* Nothing */ 411 break; 412 } 413 return 0; 414 } 415 416 /* 417 * Setup flatpanel related registers. 418 */ 419 static void gbefb_setup_flatpanel(struct gbe_timing_info *timing) 420 { 421 int fp_wid, fp_hgt, fp_vbs, fp_vbe; 422 u32 outputVal = 0; 423 424 SET_GBE_FIELD(VT_FLAGS, HDRV_INVERT, outputVal, 425 (timing->flags & FB_SYNC_HOR_HIGH_ACT) ? 0 : 1); 426 SET_GBE_FIELD(VT_FLAGS, VDRV_INVERT, outputVal, 427 (timing->flags & FB_SYNC_VERT_HIGH_ACT) ? 0 : 1); 428 gbe->vt_flags = outputVal; 429 430 /* Turn on the flat panel */ 431 fp_wid = 1600; 432 fp_hgt = 1024; 433 fp_vbs = 0; 434 fp_vbe = 1600; 435 timing->pll_m = 4; 436 timing->pll_n = 1; 437 timing->pll_p = 0; 438 439 outputVal = 0; 440 SET_GBE_FIELD(FP_DE, ON, outputVal, fp_vbs); 441 SET_GBE_FIELD(FP_DE, OFF, outputVal, fp_vbe); 442 gbe->fp_de = outputVal; 443 outputVal = 0; 444 SET_GBE_FIELD(FP_HDRV, OFF, outputVal, fp_wid); 445 gbe->fp_hdrv = outputVal; 446 outputVal = 0; 447 SET_GBE_FIELD(FP_VDRV, ON, outputVal, 1); 448 SET_GBE_FIELD(FP_VDRV, OFF, outputVal, fp_hgt + 1); 449 gbe->fp_vdrv = outputVal; 450 } 451 452 struct gbe_pll_info { 453 int clock_rate; 454 int fvco_min; 455 int fvco_max; 456 }; 457 458 static struct gbe_pll_info gbe_pll_table[2] = { 459 { 20, 80, 220 }, 460 { 27, 80, 220 }, 461 }; 462 463 static int compute_gbe_timing(struct fb_var_screeninfo *var, 464 struct gbe_timing_info *timing) 465 { 466 int pll_m, pll_n, pll_p, error, best_m, best_n, best_p, best_error; 467 int pixclock; 468 struct gbe_pll_info *gbe_pll; 469 470 if (gbe_revision < 2) 471 gbe_pll = &gbe_pll_table[0]; 472 else 473 gbe_pll = &gbe_pll_table[1]; 474 475 /* Determine valid resolution and timing 476 * GBE crystal runs at 20Mhz or 27Mhz 477 * pll_m, pll_n, pll_p define the following frequencies 478 * fvco = pll_m * 20Mhz / pll_n 479 * fout = fvco / (2**pll_p) */ 480 best_error = 1000000000; 481 best_n = best_m = best_p = 0; 482 for (pll_p = 0; pll_p < 4; pll_p++) 483 for (pll_m = 1; pll_m < 256; pll_m++) 484 for (pll_n = 1; pll_n < 64; pll_n++) { 485 pixclock = (1000000 / gbe_pll->clock_rate) * 486 (pll_n << pll_p) / pll_m; 487 488 error = var->pixclock - pixclock; 489 490 if (error < 0) 491 error = -error; 492 493 if (error < best_error && 494 pll_m / pll_n > 495 gbe_pll->fvco_min / gbe_pll->clock_rate && 496 pll_m / pll_n < 497 gbe_pll->fvco_max / gbe_pll->clock_rate) { 498 best_error = error; 499 best_m = pll_m; 500 best_n = pll_n; 501 best_p = pll_p; 502 } 503 } 504 505 if (!best_n || !best_m) 506 return -EINVAL; /* Resolution to high */ 507 508 pixclock = (1000000 / gbe_pll->clock_rate) * 509 (best_n << best_p) / best_m; 510 511 /* set video timing information */ 512 if (timing) { 513 timing->width = var->xres; 514 timing->height = var->yres; 515 timing->pll_m = best_m; 516 timing->pll_n = best_n; 517 timing->pll_p = best_p; 518 timing->cfreq = gbe_pll->clock_rate * 1000 * timing->pll_m / 519 (timing->pll_n << timing->pll_p); 520 timing->htotal = var->left_margin + var->xres + 521 var->right_margin + var->hsync_len; 522 timing->vtotal = var->upper_margin + var->yres + 523 var->lower_margin + var->vsync_len; 524 timing->fields_sec = 1000 * timing->cfreq / timing->htotal * 525 1000 / timing->vtotal; 526 timing->hblank_start = var->xres; 527 timing->vblank_start = var->yres; 528 timing->hblank_end = timing->htotal; 529 timing->hsync_start = var->xres + var->right_margin + 1; 530 timing->hsync_end = timing->hsync_start + var->hsync_len; 531 timing->vblank_end = timing->vtotal; 532 timing->vsync_start = var->yres + var->lower_margin + 1; 533 timing->vsync_end = timing->vsync_start + var->vsync_len; 534 } 535 536 return pixclock; 537 } 538 539 static void gbe_set_timing_info(struct gbe_timing_info *timing) 540 { 541 int temp; 542 unsigned int val; 543 544 /* setup dot clock PLL */ 545 val = 0; 546 SET_GBE_FIELD(DOTCLK, M, val, timing->pll_m - 1); 547 SET_GBE_FIELD(DOTCLK, N, val, timing->pll_n - 1); 548 SET_GBE_FIELD(DOTCLK, P, val, timing->pll_p); 549 SET_GBE_FIELD(DOTCLK, RUN, val, 0); /* do not start yet */ 550 gbe->dotclock = val; 551 udelay(10000); 552 553 /* setup pixel counter */ 554 val = 0; 555 SET_GBE_FIELD(VT_XYMAX, MAXX, val, timing->htotal); 556 SET_GBE_FIELD(VT_XYMAX, MAXY, val, timing->vtotal); 557 gbe->vt_xymax = val; 558 559 /* setup video timing signals */ 560 val = 0; 561 SET_GBE_FIELD(VT_VSYNC, VSYNC_ON, val, timing->vsync_start); 562 SET_GBE_FIELD(VT_VSYNC, VSYNC_OFF, val, timing->vsync_end); 563 gbe->vt_vsync = val; 564 val = 0; 565 SET_GBE_FIELD(VT_HSYNC, HSYNC_ON, val, timing->hsync_start); 566 SET_GBE_FIELD(VT_HSYNC, HSYNC_OFF, val, timing->hsync_end); 567 gbe->vt_hsync = val; 568 val = 0; 569 SET_GBE_FIELD(VT_VBLANK, VBLANK_ON, val, timing->vblank_start); 570 SET_GBE_FIELD(VT_VBLANK, VBLANK_OFF, val, timing->vblank_end); 571 gbe->vt_vblank = val; 572 val = 0; 573 SET_GBE_FIELD(VT_HBLANK, HBLANK_ON, val, 574 timing->hblank_start - 5); 575 SET_GBE_FIELD(VT_HBLANK, HBLANK_OFF, val, 576 timing->hblank_end - 3); 577 gbe->vt_hblank = val; 578 579 /* setup internal timing signals */ 580 val = 0; 581 SET_GBE_FIELD(VT_VCMAP, VCMAP_ON, val, timing->vblank_start); 582 SET_GBE_FIELD(VT_VCMAP, VCMAP_OFF, val, timing->vblank_end); 583 gbe->vt_vcmap = val; 584 val = 0; 585 SET_GBE_FIELD(VT_HCMAP, HCMAP_ON, val, timing->hblank_start); 586 SET_GBE_FIELD(VT_HCMAP, HCMAP_OFF, val, timing->hblank_end); 587 gbe->vt_hcmap = val; 588 589 val = 0; 590 temp = timing->vblank_start - timing->vblank_end - 1; 591 if (temp > 0) 592 temp = -temp; 593 594 if (flat_panel_enabled) 595 gbefb_setup_flatpanel(timing); 596 597 SET_GBE_FIELD(DID_START_XY, DID_STARTY, val, (u32) temp); 598 if (timing->hblank_end >= 20) 599 SET_GBE_FIELD(DID_START_XY, DID_STARTX, val, 600 timing->hblank_end - 20); 601 else 602 SET_GBE_FIELD(DID_START_XY, DID_STARTX, val, 603 timing->htotal - (20 - timing->hblank_end)); 604 gbe->did_start_xy = val; 605 606 val = 0; 607 SET_GBE_FIELD(CRS_START_XY, CRS_STARTY, val, (u32) (temp + 1)); 608 if (timing->hblank_end >= GBE_CRS_MAGIC) 609 SET_GBE_FIELD(CRS_START_XY, CRS_STARTX, val, 610 timing->hblank_end - GBE_CRS_MAGIC); 611 else 612 SET_GBE_FIELD(CRS_START_XY, CRS_STARTX, val, 613 timing->htotal - (GBE_CRS_MAGIC - 614 timing->hblank_end)); 615 gbe->crs_start_xy = val; 616 617 val = 0; 618 SET_GBE_FIELD(VC_START_XY, VC_STARTY, val, (u32) temp); 619 SET_GBE_FIELD(VC_START_XY, VC_STARTX, val, timing->hblank_end - 4); 620 gbe->vc_start_xy = val; 621 622 val = 0; 623 temp = timing->hblank_end - GBE_PIXEN_MAGIC_ON; 624 if (temp < 0) 625 temp += timing->htotal; /* allow blank to wrap around */ 626 627 SET_GBE_FIELD(VT_HPIXEN, HPIXEN_ON, val, temp); 628 SET_GBE_FIELD(VT_HPIXEN, HPIXEN_OFF, val, 629 ((temp + timing->width - 630 GBE_PIXEN_MAGIC_OFF) % timing->htotal)); 631 gbe->vt_hpixen = val; 632 633 val = 0; 634 SET_GBE_FIELD(VT_VPIXEN, VPIXEN_ON, val, timing->vblank_end); 635 SET_GBE_FIELD(VT_VPIXEN, VPIXEN_OFF, val, timing->vblank_start); 636 gbe->vt_vpixen = val; 637 638 /* turn off sync on green */ 639 val = 0; 640 SET_GBE_FIELD(VT_FLAGS, SYNC_LOW, val, 1); 641 gbe->vt_flags = val; 642 } 643 644 /* 645 * Set the hardware according to 'par'. 646 */ 647 648 static int gbefb_set_par(struct fb_info *info) 649 { 650 int i; 651 unsigned int val; 652 int wholeTilesX, partTilesX, maxPixelsPerTileX; 653 int height_pix; 654 int xpmax, ypmax; /* Monitor resolution */ 655 int bytesPerPixel; /* Bytes per pixel */ 656 struct gbefb_par *par = (struct gbefb_par *) info->par; 657 658 compute_gbe_timing(&info->var, &par->timing); 659 660 bytesPerPixel = info->var.bits_per_pixel / 8; 661 info->fix.line_length = info->var.xres_virtual * bytesPerPixel; 662 xpmax = par->timing.width; 663 ypmax = par->timing.height; 664 665 /* turn off GBE */ 666 gbe_turn_off(); 667 668 /* set timing info */ 669 gbe_set_timing_info(&par->timing); 670 671 /* initialize DIDs */ 672 val = 0; 673 switch (bytesPerPixel) { 674 case 1: 675 SET_GBE_FIELD(WID, TYP, val, GBE_CMODE_I8); 676 info->fix.visual = FB_VISUAL_PSEUDOCOLOR; 677 break; 678 case 2: 679 SET_GBE_FIELD(WID, TYP, val, GBE_CMODE_ARGB5); 680 info->fix.visual = FB_VISUAL_TRUECOLOR; 681 break; 682 case 4: 683 SET_GBE_FIELD(WID, TYP, val, GBE_CMODE_RGB8); 684 info->fix.visual = FB_VISUAL_TRUECOLOR; 685 break; 686 } 687 SET_GBE_FIELD(WID, BUF, val, GBE_BMODE_BOTH); 688 689 for (i = 0; i < 32; i++) 690 gbe->mode_regs[i] = val; 691 692 /* Initialize interrupts */ 693 gbe->vt_intr01 = 0xffffffff; 694 gbe->vt_intr23 = 0xffffffff; 695 696 /* HACK: 697 The GBE hardware uses a tiled memory to screen mapping. Tiles are 698 blocks of 512x128, 256x128 or 128x128 pixels, respectively for 8bit, 699 16bit and 32 bit modes (64 kB). They cover the screen with partial 700 tiles on the right and/or bottom of the screen if needed. 701 For example in 640x480 8 bit mode the mapping is: 702 703 <-------- 640 -----> 704 <---- 512 ----><128|384 offscreen> 705 ^ ^ 706 | 128 [tile 0] [tile 1] 707 | v 708 ^ 709 4 128 [tile 2] [tile 3] 710 8 v 711 0 ^ 712 128 [tile 4] [tile 5] 713 | v 714 | ^ 715 v 96 [tile 6] [tile 7] 716 32 offscreen 717 718 Tiles have the advantage that they can be allocated individually in 719 memory. However, this mapping is not linear at all, which is not 720 really convenient. In order to support linear addressing, the GBE 721 DMA hardware is fooled into thinking the screen is only one tile 722 large and but has a greater height, so that the DMA transfer covers 723 the same region. 724 Tiles are still allocated as independent chunks of 64KB of 725 continuous physical memory and remapped so that the kernel sees the 726 framebuffer as a continuous virtual memory. The GBE tile table is 727 set up so that each tile references one of these 64k blocks: 728 729 GBE -> tile list framebuffer TLB <------------ CPU 730 [ tile 0 ] -> [ 64KB ] <- [ 16x 4KB page entries ] ^ 731 ... ... ... linear virtual FB 732 [ tile n ] -> [ 64KB ] <- [ 16x 4KB page entries ] v 733 734 735 The GBE hardware is then told that the buffer is 512*tweaked_height, 736 with tweaked_height = real_width*real_height/pixels_per_tile. 737 Thus the GBE hardware will scan the first tile, filing the first 64k 738 covered region of the screen, and then will proceed to the next 739 tile, until the whole screen is covered. 740 741 Here is what would happen at 640x480 8bit: 742 743 normal tiling linear 744 ^ 11111111111111112222 11111111111111111111 ^ 745 128 11111111111111112222 11111111111111111111 102 lines 746 11111111111111112222 11111111111111111111 v 747 V 11111111111111112222 11111111222222222222 748 33333333333333334444 22222222222222222222 749 33333333333333334444 22222222222222222222 750 < 512 > < 256 > 102*640+256 = 64k 751 752 NOTE: The only mode for which this is not working is 800x600 8bit, 753 as 800*600/512 = 937.5 which is not integer and thus causes 754 flickering. 755 I guess this is not so important as one can use 640x480 8bit or 756 800x600 16bit anyway. 757 */ 758 759 /* Tell gbe about the tiles table location */ 760 /* tile_ptr -> [ tile 1 ] -> FB mem */ 761 /* [ tile 2 ] -> FB mem */ 762 /* ... */ 763 val = 0; 764 SET_GBE_FIELD(FRM_CONTROL, FRM_TILE_PTR, val, gbe_tiles.dma >> 9); 765 SET_GBE_FIELD(FRM_CONTROL, FRM_DMA_ENABLE, val, 0); /* do not start */ 766 SET_GBE_FIELD(FRM_CONTROL, FRM_LINEAR, val, 0); 767 gbe->frm_control = val; 768 769 maxPixelsPerTileX = 512 / bytesPerPixel; 770 wholeTilesX = 1; 771 partTilesX = 0; 772 773 /* Initialize the framebuffer */ 774 val = 0; 775 SET_GBE_FIELD(FRM_SIZE_TILE, FRM_WIDTH_TILE, val, wholeTilesX); 776 SET_GBE_FIELD(FRM_SIZE_TILE, FRM_RHS, val, partTilesX); 777 778 switch (bytesPerPixel) { 779 case 1: 780 SET_GBE_FIELD(FRM_SIZE_TILE, FRM_DEPTH, val, 781 GBE_FRM_DEPTH_8); 782 break; 783 case 2: 784 SET_GBE_FIELD(FRM_SIZE_TILE, FRM_DEPTH, val, 785 GBE_FRM_DEPTH_16); 786 break; 787 case 4: 788 SET_GBE_FIELD(FRM_SIZE_TILE, FRM_DEPTH, val, 789 GBE_FRM_DEPTH_32); 790 break; 791 } 792 gbe->frm_size_tile = val; 793 794 /* compute tweaked height */ 795 height_pix = xpmax * ypmax / maxPixelsPerTileX; 796 797 val = 0; 798 SET_GBE_FIELD(FRM_SIZE_PIXEL, FB_HEIGHT_PIX, val, height_pix); 799 gbe->frm_size_pixel = val; 800 801 /* turn off DID and overlay DMA */ 802 gbe->did_control = 0; 803 gbe->ovr_width_tile = 0; 804 805 /* Turn off mouse cursor */ 806 gbe->crs_ctl = 0; 807 808 /* Turn on GBE */ 809 gbe_turn_on(); 810 811 /* Initialize the gamma map */ 812 udelay(10); 813 for (i = 0; i < 256; i++) 814 gbe->gmap[i] = (i << 24) | (i << 16) | (i << 8); 815 816 /* Initialize the color map */ 817 for (i = 0; i < 256; i++) 818 gbe_cmap[i] = (i << 8) | (i << 16) | (i << 24); 819 820 gbe_loadcmap(); 821 822 return 0; 823 } 824 825 static void gbefb_encode_fix(struct fb_fix_screeninfo *fix, 826 struct fb_var_screeninfo *var) 827 { 828 memset(fix, 0, sizeof(struct fb_fix_screeninfo)); 829 strcpy(fix->id, "SGI GBE"); 830 fix->smem_start = (unsigned long) gbe_mem; 831 fix->smem_len = gbe_mem_size; 832 fix->type = FB_TYPE_PACKED_PIXELS; 833 fix->type_aux = 0; 834 fix->accel = FB_ACCEL_NONE; 835 switch (var->bits_per_pixel) { 836 case 8: 837 fix->visual = FB_VISUAL_PSEUDOCOLOR; 838 break; 839 default: 840 fix->visual = FB_VISUAL_TRUECOLOR; 841 break; 842 } 843 fix->ywrapstep = 0; 844 fix->xpanstep = 0; 845 fix->ypanstep = 0; 846 fix->line_length = var->xres_virtual * var->bits_per_pixel / 8; 847 fix->mmio_start = GBE_BASE; 848 fix->mmio_len = sizeof(struct sgi_gbe); 849 } 850 851 /* 852 * Set a single color register. The values supplied are already 853 * rounded down to the hardware's capabilities (according to the 854 * entries in the var structure). Return != 0 for invalid regno. 855 */ 856 857 static int gbefb_setcolreg(unsigned regno, unsigned red, unsigned green, 858 unsigned blue, unsigned transp, 859 struct fb_info *info) 860 { 861 int i; 862 863 if (regno > 255) 864 return 1; 865 red >>= 8; 866 green >>= 8; 867 blue >>= 8; 868 869 if (info->var.bits_per_pixel <= 8) { 870 gbe_cmap[regno] = (red << 24) | (green << 16) | (blue << 8); 871 if (gbe_turned_on) { 872 /* wait for the color map FIFO to have a free entry */ 873 for (i = 0; i < 1000 && gbe->cm_fifo >= 63; i++) 874 udelay(10); 875 if (i == 1000) { 876 printk(KERN_ERR "gbefb: cmap FIFO timeout\n"); 877 return 1; 878 } 879 gbe->cmap[regno] = gbe_cmap[regno]; 880 } 881 } else if (regno < 16) { 882 switch (info->var.bits_per_pixel) { 883 case 15: 884 case 16: 885 red >>= 3; 886 green >>= 3; 887 blue >>= 3; 888 pseudo_palette[regno] = 889 (red << info->var.red.offset) | 890 (green << info->var.green.offset) | 891 (blue << info->var.blue.offset); 892 break; 893 case 32: 894 pseudo_palette[regno] = 895 (red << info->var.red.offset) | 896 (green << info->var.green.offset) | 897 (blue << info->var.blue.offset); 898 break; 899 } 900 } 901 902 return 0; 903 } 904 905 /* 906 * Check video mode validity, eventually modify var to best match. 907 */ 908 static int gbefb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) 909 { 910 unsigned int line_length; 911 struct gbe_timing_info timing; 912 int ret; 913 914 /* Limit bpp to 8, 16, and 32 */ 915 if (var->bits_per_pixel <= 8) 916 var->bits_per_pixel = 8; 917 else if (var->bits_per_pixel <= 16) 918 var->bits_per_pixel = 16; 919 else if (var->bits_per_pixel <= 32) 920 var->bits_per_pixel = 32; 921 else 922 return -EINVAL; 923 924 /* Check the mode can be mapped linearly with the tile table trick. */ 925 /* This requires width x height x bytes/pixel be a multiple of 512 */ 926 if ((var->xres * var->yres * var->bits_per_pixel) & 4095) 927 return -EINVAL; 928 929 var->grayscale = 0; /* No grayscale for now */ 930 931 ret = compute_gbe_timing(var, &timing); 932 var->pixclock = ret; 933 if (ret < 0) 934 return -EINVAL; 935 936 /* Adjust virtual resolution, if necessary */ 937 if (var->xres > var->xres_virtual || (!ywrap && !ypan)) 938 var->xres_virtual = var->xres; 939 if (var->yres > var->yres_virtual || (!ywrap && !ypan)) 940 var->yres_virtual = var->yres; 941 942 if (var->vmode & FB_VMODE_CONUPDATE) { 943 var->vmode |= FB_VMODE_YWRAP; 944 var->xoffset = info->var.xoffset; 945 var->yoffset = info->var.yoffset; 946 } 947 948 /* No grayscale for now */ 949 var->grayscale = 0; 950 951 /* Memory limit */ 952 line_length = var->xres_virtual * var->bits_per_pixel / 8; 953 if (line_length * var->yres_virtual > gbe_mem_size) 954 return -ENOMEM; /* Virtual resolution too high */ 955 956 switch (var->bits_per_pixel) { 957 case 8: 958 var->red.offset = 0; 959 var->red.length = 8; 960 var->green.offset = 0; 961 var->green.length = 8; 962 var->blue.offset = 0; 963 var->blue.length = 8; 964 var->transp.offset = 0; 965 var->transp.length = 0; 966 break; 967 case 16: /* RGB 1555 */ 968 var->red.offset = 10; 969 var->red.length = 5; 970 var->green.offset = 5; 971 var->green.length = 5; 972 var->blue.offset = 0; 973 var->blue.length = 5; 974 var->transp.offset = 0; 975 var->transp.length = 0; 976 break; 977 case 32: /* RGB 8888 */ 978 var->red.offset = 24; 979 var->red.length = 8; 980 var->green.offset = 16; 981 var->green.length = 8; 982 var->blue.offset = 8; 983 var->blue.length = 8; 984 var->transp.offset = 0; 985 var->transp.length = 8; 986 break; 987 } 988 var->red.msb_right = 0; 989 var->green.msb_right = 0; 990 var->blue.msb_right = 0; 991 var->transp.msb_right = 0; 992 993 var->left_margin = timing.htotal - timing.hsync_end; 994 var->right_margin = timing.hsync_start - timing.width; 995 var->upper_margin = timing.vtotal - timing.vsync_end; 996 var->lower_margin = timing.vsync_start - timing.height; 997 var->hsync_len = timing.hsync_end - timing.hsync_start; 998 var->vsync_len = timing.vsync_end - timing.vsync_start; 999 1000 return 0; 1001 } 1002 1003 static int gbefb_mmap(struct fb_info *info, 1004 struct vm_area_struct *vma) 1005 { 1006 unsigned long size = vma->vm_end - vma->vm_start; 1007 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; 1008 unsigned long addr; 1009 unsigned long phys_addr, phys_size; 1010 u16 *tile; 1011 1012 /* check range */ 1013 if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) 1014 return -EINVAL; 1015 if (size > gbe_mem_size) 1016 return -EINVAL; 1017 if (offset > gbe_mem_size - size) 1018 return -EINVAL; 1019 1020 /* remap using the fastest write-through mode on architecture */ 1021 /* try not polluting the cache when possible */ 1022 pgprot_val(vma->vm_page_prot) = 1023 pgprot_fb(pgprot_val(vma->vm_page_prot)); 1024 1025 /* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by remap_pfn_range() */ 1026 1027 /* look for the starting tile */ 1028 tile = &gbe_tiles.cpu[offset >> TILE_SHIFT]; 1029 addr = vma->vm_start; 1030 offset &= TILE_MASK; 1031 1032 /* remap each tile separately */ 1033 do { 1034 phys_addr = (((unsigned long) (*tile)) << TILE_SHIFT) + offset; 1035 if ((offset + size) < TILE_SIZE) 1036 phys_size = size; 1037 else 1038 phys_size = TILE_SIZE - offset; 1039 1040 if (remap_pfn_range(vma, addr, phys_addr >> PAGE_SHIFT, 1041 phys_size, vma->vm_page_prot)) 1042 return -EAGAIN; 1043 1044 offset = 0; 1045 size -= phys_size; 1046 addr += phys_size; 1047 tile++; 1048 } while (size); 1049 1050 return 0; 1051 } 1052 1053 static struct fb_ops gbefb_ops = { 1054 .owner = THIS_MODULE, 1055 .fb_check_var = gbefb_check_var, 1056 .fb_set_par = gbefb_set_par, 1057 .fb_setcolreg = gbefb_setcolreg, 1058 .fb_mmap = gbefb_mmap, 1059 .fb_blank = gbefb_blank, 1060 .fb_fillrect = cfb_fillrect, 1061 .fb_copyarea = cfb_copyarea, 1062 .fb_imageblit = cfb_imageblit, 1063 }; 1064 1065 /* 1066 * sysfs 1067 */ 1068 1069 static ssize_t gbefb_show_memsize(struct device *dev, struct device_attribute *attr, char *buf) 1070 { 1071 return snprintf(buf, PAGE_SIZE, "%u\n", gbe_mem_size); 1072 } 1073 1074 static DEVICE_ATTR(size, S_IRUGO, gbefb_show_memsize, NULL); 1075 1076 static ssize_t gbefb_show_rev(struct device *device, struct device_attribute *attr, char *buf) 1077 { 1078 return snprintf(buf, PAGE_SIZE, "%d\n", gbe_revision); 1079 } 1080 1081 static DEVICE_ATTR(revision, S_IRUGO, gbefb_show_rev, NULL); 1082 1083 static void gbefb_remove_sysfs(struct device *dev) 1084 { 1085 device_remove_file(dev, &dev_attr_size); 1086 device_remove_file(dev, &dev_attr_revision); 1087 } 1088 1089 static void gbefb_create_sysfs(struct device *dev) 1090 { 1091 device_create_file(dev, &dev_attr_size); 1092 device_create_file(dev, &dev_attr_revision); 1093 } 1094 1095 /* 1096 * Initialization 1097 */ 1098 1099 static int gbefb_setup(char *options) 1100 { 1101 char *this_opt; 1102 1103 if (!options || !*options) 1104 return 0; 1105 1106 while ((this_opt = strsep(&options, ",")) != NULL) { 1107 if (!strncmp(this_opt, "monitor:", 8)) { 1108 if (!strncmp(this_opt + 8, "crt", 3)) { 1109 flat_panel_enabled = 0; 1110 default_var = &default_var_CRT; 1111 default_mode = &default_mode_CRT; 1112 } else if (!strncmp(this_opt + 8, "1600sw", 6) || 1113 !strncmp(this_opt + 8, "lcd", 3)) { 1114 flat_panel_enabled = 1; 1115 default_var = &default_var_LCD; 1116 default_mode = &default_mode_LCD; 1117 } 1118 } else if (!strncmp(this_opt, "mem:", 4)) { 1119 gbe_mem_size = memparse(this_opt + 4, &this_opt); 1120 if (gbe_mem_size > CONFIG_FB_GBE_MEM * 1024 * 1024) 1121 gbe_mem_size = CONFIG_FB_GBE_MEM * 1024 * 1024; 1122 if (gbe_mem_size < TILE_SIZE) 1123 gbe_mem_size = TILE_SIZE; 1124 } else 1125 mode_option = this_opt; 1126 } 1127 return 0; 1128 } 1129 1130 static int gbefb_probe(struct platform_device *p_dev) 1131 { 1132 int i, ret = 0; 1133 struct fb_info *info; 1134 struct gbefb_par *par; 1135 #ifndef MODULE 1136 char *options = NULL; 1137 #endif 1138 1139 info = framebuffer_alloc(sizeof(struct gbefb_par), &p_dev->dev); 1140 if (!info) 1141 return -ENOMEM; 1142 1143 #ifndef MODULE 1144 if (fb_get_options("gbefb", &options)) { 1145 ret = -ENODEV; 1146 goto out_release_framebuffer; 1147 } 1148 gbefb_setup(options); 1149 #endif 1150 1151 if (!request_mem_region(GBE_BASE, sizeof(struct sgi_gbe), "GBE")) { 1152 printk(KERN_ERR "gbefb: couldn't reserve mmio region\n"); 1153 ret = -EBUSY; 1154 goto out_release_framebuffer; 1155 } 1156 1157 gbe = (struct sgi_gbe *) devm_ioremap(&p_dev->dev, GBE_BASE, 1158 sizeof(struct sgi_gbe)); 1159 if (!gbe) { 1160 printk(KERN_ERR "gbefb: couldn't map mmio region\n"); 1161 ret = -ENXIO; 1162 goto out_release_mem_region; 1163 } 1164 gbe_revision = gbe->ctrlstat & 15; 1165 1166 gbe_tiles.cpu = 1167 dma_alloc_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t), 1168 &gbe_tiles.dma, GFP_KERNEL); 1169 if (!gbe_tiles.cpu) { 1170 printk(KERN_ERR "gbefb: couldn't allocate tiles table\n"); 1171 ret = -ENOMEM; 1172 goto out_release_mem_region; 1173 } 1174 1175 if (gbe_mem_phys) { 1176 /* memory was allocated at boot time */ 1177 gbe_mem = devm_ioremap_nocache(&p_dev->dev, gbe_mem_phys, 1178 gbe_mem_size); 1179 if (!gbe_mem) { 1180 printk(KERN_ERR "gbefb: couldn't map framebuffer\n"); 1181 ret = -ENOMEM; 1182 goto out_tiles_free; 1183 } 1184 1185 gbe_dma_addr = 0; 1186 } else { 1187 /* try to allocate memory with the classical allocator 1188 * this has high chance to fail on low memory machines */ 1189 gbe_mem = dma_alloc_coherent(NULL, gbe_mem_size, &gbe_dma_addr, 1190 GFP_KERNEL); 1191 if (!gbe_mem) { 1192 printk(KERN_ERR "gbefb: couldn't allocate framebuffer memory\n"); 1193 ret = -ENOMEM; 1194 goto out_tiles_free; 1195 } 1196 1197 gbe_mem_phys = (unsigned long) gbe_dma_addr; 1198 } 1199 1200 #ifdef CONFIG_X86 1201 mtrr_add(gbe_mem_phys, gbe_mem_size, MTRR_TYPE_WRCOMB, 1); 1202 #endif 1203 1204 /* map framebuffer memory into tiles table */ 1205 for (i = 0; i < (gbe_mem_size >> TILE_SHIFT); i++) 1206 gbe_tiles.cpu[i] = (gbe_mem_phys >> TILE_SHIFT) + i; 1207 1208 info->fbops = &gbefb_ops; 1209 info->pseudo_palette = pseudo_palette; 1210 info->flags = FBINFO_DEFAULT; 1211 info->screen_base = gbe_mem; 1212 fb_alloc_cmap(&info->cmap, 256, 0); 1213 1214 /* reset GBE */ 1215 gbe_reset(); 1216 1217 par = info->par; 1218 /* turn on default video mode */ 1219 if (fb_find_mode(&par->var, info, mode_option, NULL, 0, 1220 default_mode, 8) == 0) 1221 par->var = *default_var; 1222 info->var = par->var; 1223 gbefb_check_var(&par->var, info); 1224 gbefb_encode_fix(&info->fix, &info->var); 1225 1226 if (register_framebuffer(info) < 0) { 1227 printk(KERN_ERR "gbefb: couldn't register framebuffer\n"); 1228 ret = -ENXIO; 1229 goto out_gbe_unmap; 1230 } 1231 1232 platform_set_drvdata(p_dev, info); 1233 gbefb_create_sysfs(&p_dev->dev); 1234 1235 fb_info(info, "%s rev %d @ 0x%08x using %dkB memory\n", 1236 info->fix.id, gbe_revision, (unsigned)GBE_BASE, 1237 gbe_mem_size >> 10); 1238 1239 return 0; 1240 1241 out_gbe_unmap: 1242 if (gbe_dma_addr) 1243 dma_free_coherent(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys); 1244 out_tiles_free: 1245 dma_free_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t), 1246 (void *)gbe_tiles.cpu, gbe_tiles.dma); 1247 out_release_mem_region: 1248 release_mem_region(GBE_BASE, sizeof(struct sgi_gbe)); 1249 out_release_framebuffer: 1250 framebuffer_release(info); 1251 1252 return ret; 1253 } 1254 1255 static int gbefb_remove(struct platform_device* p_dev) 1256 { 1257 struct fb_info *info = platform_get_drvdata(p_dev); 1258 1259 unregister_framebuffer(info); 1260 gbe_turn_off(); 1261 if (gbe_dma_addr) 1262 dma_free_coherent(NULL, gbe_mem_size, gbe_mem, gbe_mem_phys); 1263 dma_free_coherent(NULL, GBE_TLB_SIZE * sizeof(uint16_t), 1264 (void *)gbe_tiles.cpu, gbe_tiles.dma); 1265 release_mem_region(GBE_BASE, sizeof(struct sgi_gbe)); 1266 gbefb_remove_sysfs(&p_dev->dev); 1267 framebuffer_release(info); 1268 1269 return 0; 1270 } 1271 1272 static struct platform_driver gbefb_driver = { 1273 .probe = gbefb_probe, 1274 .remove = gbefb_remove, 1275 .driver = { 1276 .name = "gbefb", 1277 }, 1278 }; 1279 1280 static struct platform_device *gbefb_device; 1281 1282 static int __init gbefb_init(void) 1283 { 1284 int ret = platform_driver_register(&gbefb_driver); 1285 if (!ret) { 1286 gbefb_device = platform_device_alloc("gbefb", 0); 1287 if (gbefb_device) { 1288 ret = platform_device_add(gbefb_device); 1289 } else { 1290 ret = -ENOMEM; 1291 } 1292 if (ret) { 1293 platform_device_put(gbefb_device); 1294 platform_driver_unregister(&gbefb_driver); 1295 } 1296 } 1297 return ret; 1298 } 1299 1300 static void __exit gbefb_exit(void) 1301 { 1302 platform_device_unregister(gbefb_device); 1303 platform_driver_unregister(&gbefb_driver); 1304 } 1305 1306 module_init(gbefb_init); 1307 module_exit(gbefb_exit); 1308 1309 MODULE_LICENSE("GPL"); 1310