diff options
Diffstat (limited to 'drivers/video/atafb.c')
-rw-r--r-- | drivers/video/atafb.c | 112 |
1 files changed, 48 insertions, 64 deletions
diff --git a/drivers/video/atafb.c b/drivers/video/atafb.c index 77eb8b34fbfa..8058572a7428 100644 --- a/drivers/video/atafb.c +++ b/drivers/video/atafb.c | |||
@@ -122,7 +122,6 @@ static struct atafb_par { | |||
122 | void *screen_base; | 122 | void *screen_base; |
123 | int yres_virtual; | 123 | int yres_virtual; |
124 | u_long next_line; | 124 | u_long next_line; |
125 | u_long next_plane; | ||
126 | #if defined ATAFB_TT || defined ATAFB_STE | 125 | #if defined ATAFB_TT || defined ATAFB_STE |
127 | union { | 126 | union { |
128 | struct { | 127 | struct { |
@@ -149,6 +148,7 @@ static struct atafb_par { | |||
149 | short mono; | 148 | short mono; |
150 | short ste_mode; | 149 | short ste_mode; |
151 | short bpp; | 150 | short bpp; |
151 | u32 pseudo_palette[16]; | ||
152 | } falcon; | 152 | } falcon; |
153 | #endif | 153 | #endif |
154 | /* Nothing needed for external mode */ | 154 | /* Nothing needed for external mode */ |
@@ -614,7 +614,7 @@ static int tt_encode_fix(struct fb_fix_screeninfo *fix, struct atafb_par *par) | |||
614 | fix->xpanstep = 0; | 614 | fix->xpanstep = 0; |
615 | fix->ypanstep = 1; | 615 | fix->ypanstep = 1; |
616 | fix->ywrapstep = 0; | 616 | fix->ywrapstep = 0; |
617 | fix->line_length = 0; | 617 | fix->line_length = par->next_line; |
618 | fix->accel = FB_ACCEL_ATARIBLITT; | 618 | fix->accel = FB_ACCEL_ATARIBLITT; |
619 | return 0; | 619 | return 0; |
620 | } | 620 | } |
@@ -691,6 +691,7 @@ static int tt_decode_var(struct fb_var_screeninfo *var, struct atafb_par *par) | |||
691 | return -EINVAL; | 691 | return -EINVAL; |
692 | par->yres_virtual = yres_virtual; | 692 | par->yres_virtual = yres_virtual; |
693 | par->screen_base = screen_base + var->yoffset * linelen; | 693 | par->screen_base = screen_base + var->yoffset * linelen; |
694 | par->next_line = linelen; | ||
694 | return 0; | 695 | return 0; |
695 | } | 696 | } |
696 | 697 | ||
@@ -884,10 +885,6 @@ static int vdl_prescale[4][3] = { | |||
884 | /* Default hsync timing [mon_type] in picoseconds */ | 885 | /* Default hsync timing [mon_type] in picoseconds */ |
885 | static long h_syncs[4] = { 3000000, 4875000, 4000000, 4875000 }; | 886 | static long h_syncs[4] = { 3000000, 4875000, 4000000, 4875000 }; |
886 | 887 | ||
887 | #ifdef FBCON_HAS_CFB16 | ||
888 | static u16 fbcon_cfb16_cmap[16]; | ||
889 | #endif | ||
890 | |||
891 | static inline int hxx_prescale(struct falcon_hw *hw) | 888 | static inline int hxx_prescale(struct falcon_hw *hw) |
892 | { | 889 | { |
893 | return hw->ste_mode ? 16 | 890 | return hw->ste_mode ? 16 |
@@ -918,7 +915,7 @@ static int falcon_encode_fix(struct fb_fix_screeninfo *fix, | |||
918 | fix->visual = FB_VISUAL_TRUECOLOR; | 915 | fix->visual = FB_VISUAL_TRUECOLOR; |
919 | fix->xpanstep = 2; | 916 | fix->xpanstep = 2; |
920 | } | 917 | } |
921 | fix->line_length = 0; | 918 | fix->line_length = par->next_line; |
922 | fix->accel = FB_ACCEL_ATARIBLITT; | 919 | fix->accel = FB_ACCEL_ATARIBLITT; |
923 | return 0; | 920 | return 0; |
924 | } | 921 | } |
@@ -1394,14 +1391,7 @@ set_screen_base: | |||
1394 | par->screen_base = screen_base + var->yoffset * linelen; | 1391 | par->screen_base = screen_base + var->yoffset * linelen; |
1395 | par->hw.falcon.xoffset = 0; | 1392 | par->hw.falcon.xoffset = 0; |
1396 | 1393 | ||
1397 | // FIXME!!! sort of works, no crash | ||
1398 | //par->next_line = linelen; | ||
1399 | //par->next_plane = yres_virtual * linelen; | ||
1400 | par->next_line = linelen; | 1394 | par->next_line = linelen; |
1401 | par->next_plane = 2; | ||
1402 | // crashes | ||
1403 | //par->next_plane = linelen; | ||
1404 | //par->next_line = yres_virtual * linelen; | ||
1405 | 1395 | ||
1406 | return 0; | 1396 | return 0; |
1407 | } | 1397 | } |
@@ -1735,10 +1725,10 @@ static int falcon_setcolreg(unsigned int regno, unsigned int red, | |||
1735 | (((red & 0xe000) >> 13) | ((red & 0x1000) >> 12) << 8) | | 1725 | (((red & 0xe000) >> 13) | ((red & 0x1000) >> 12) << 8) | |
1736 | (((green & 0xe000) >> 13) | ((green & 0x1000) >> 12) << 4) | | 1726 | (((green & 0xe000) >> 13) | ((green & 0x1000) >> 12) << 4) | |
1737 | ((blue & 0xe000) >> 13) | ((blue & 0x1000) >> 12); | 1727 | ((blue & 0xe000) >> 13) | ((blue & 0x1000) >> 12); |
1738 | #ifdef FBCON_HAS_CFB16 | 1728 | #ifdef ATAFB_FALCON |
1739 | fbcon_cfb16_cmap[regno] = ((red & 0xf800) | | 1729 | ((u32 *)info->pseudo_palette)[regno] = ((red & 0xf800) | |
1740 | ((green & 0xfc00) >> 5) | | 1730 | ((green & 0xfc00) >> 5) | |
1741 | ((blue & 0xf800) >> 11)); | 1731 | ((blue & 0xf800) >> 11)); |
1742 | #endif | 1732 | #endif |
1743 | } | 1733 | } |
1744 | return 0; | 1734 | return 0; |
@@ -1852,7 +1842,7 @@ static int stste_encode_fix(struct fb_fix_screeninfo *fix, | |||
1852 | fix->ypanstep = 0; | 1842 | fix->ypanstep = 0; |
1853 | } | 1843 | } |
1854 | fix->ywrapstep = 0; | 1844 | fix->ywrapstep = 0; |
1855 | fix->line_length = 0; | 1845 | fix->line_length = par->next_line; |
1856 | fix->accel = FB_ACCEL_ATARIBLITT; | 1846 | fix->accel = FB_ACCEL_ATARIBLITT; |
1857 | return 0; | 1847 | return 0; |
1858 | } | 1848 | } |
@@ -1910,6 +1900,7 @@ static int stste_decode_var(struct fb_var_screeninfo *var, | |||
1910 | return -EINVAL; | 1900 | return -EINVAL; |
1911 | par->yres_virtual = yres_virtual; | 1901 | par->yres_virtual = yres_virtual; |
1912 | par->screen_base = screen_base + var->yoffset * linelen; | 1902 | par->screen_base = screen_base + var->yoffset * linelen; |
1903 | par->next_line = linelen; | ||
1913 | return 0; | 1904 | return 0; |
1914 | } | 1905 | } |
1915 | 1906 | ||
@@ -2169,7 +2160,7 @@ static int ext_encode_fix(struct fb_fix_screeninfo *fix, struct atafb_par *par) | |||
2169 | fix->xpanstep = 0; | 2160 | fix->xpanstep = 0; |
2170 | fix->ypanstep = 0; | 2161 | fix->ypanstep = 0; |
2171 | fix->ywrapstep = 0; | 2162 | fix->ywrapstep = 0; |
2172 | fix->line_length = 0; | 2163 | fix->line_length = par->next_line; |
2173 | return 0; | 2164 | return 0; |
2174 | } | 2165 | } |
2175 | 2166 | ||
@@ -2184,6 +2175,8 @@ static int ext_decode_var(struct fb_var_screeninfo *var, struct atafb_par *par) | |||
2184 | var->xoffset > 0 || | 2175 | var->xoffset > 0 || |
2185 | var->yoffset > 0) | 2176 | var->yoffset > 0) |
2186 | return -EINVAL; | 2177 | return -EINVAL; |
2178 | |||
2179 | par->next_line = external_xres_virtual * external_depth / 8; | ||
2187 | return 0; | 2180 | return 0; |
2188 | } | 2181 | } |
2189 | 2182 | ||
@@ -2443,42 +2436,6 @@ static void atafb_set_disp(struct fb_info *info) | |||
2443 | atafb_get_fix(&info->fix, info); | 2436 | atafb_get_fix(&info->fix, info); |
2444 | 2437 | ||
2445 | info->screen_base = (void *)info->fix.smem_start; | 2438 | info->screen_base = (void *)info->fix.smem_start; |
2446 | |||
2447 | switch (info->fix.type) { | ||
2448 | case FB_TYPE_INTERLEAVED_PLANES: | ||
2449 | switch (info->var.bits_per_pixel) { | ||
2450 | case 2: | ||
2451 | // display->dispsw = &fbcon_iplan2p2; | ||
2452 | break; | ||
2453 | case 4: | ||
2454 | // display->dispsw = &fbcon_iplan2p4; | ||
2455 | break; | ||
2456 | case 8: | ||
2457 | // display->dispsw = &fbcon_iplan2p8; | ||
2458 | break; | ||
2459 | } | ||
2460 | break; | ||
2461 | case FB_TYPE_PACKED_PIXELS: | ||
2462 | switch (info->var.bits_per_pixel) { | ||
2463 | #ifdef FBCON_HAS_MFB | ||
2464 | case 1: | ||
2465 | // display->dispsw = &fbcon_mfb; | ||
2466 | break; | ||
2467 | #endif | ||
2468 | #ifdef FBCON_HAS_CFB8 | ||
2469 | case 8: | ||
2470 | // display->dispsw = &fbcon_cfb8; | ||
2471 | break; | ||
2472 | #endif | ||
2473 | #ifdef FBCON_HAS_CFB16 | ||
2474 | case 16: | ||
2475 | // display->dispsw = &fbcon_cfb16; | ||
2476 | // display->dispsw_data = fbcon_cfb16_cmap; | ||
2477 | break; | ||
2478 | #endif | ||
2479 | } | ||
2480 | break; | ||
2481 | } | ||
2482 | } | 2439 | } |
2483 | 2440 | ||
2484 | static int atafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | 2441 | static int atafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, |
@@ -2549,6 +2506,13 @@ static void atafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | |||
2549 | if (!rect->width || !rect->height) | 2506 | if (!rect->width || !rect->height) |
2550 | return; | 2507 | return; |
2551 | 2508 | ||
2509 | #ifdef ATAFB_FALCON | ||
2510 | if (info->var.bits_per_pixel == 16) { | ||
2511 | cfb_fillrect(info, rect); | ||
2512 | return; | ||
2513 | } | ||
2514 | #endif | ||
2515 | |||
2552 | /* | 2516 | /* |
2553 | * We could use hardware clipping but on many cards you get around | 2517 | * We could use hardware clipping but on many cards you get around |
2554 | * hardware clipping by writing to framebuffer directly. | 2518 | * hardware clipping by writing to framebuffer directly. |
@@ -2583,6 +2547,13 @@ static void atafb_copyarea(struct fb_info *info, const struct fb_copyarea *area) | |||
2583 | u32 dx, dy, sx, sy, width, height; | 2547 | u32 dx, dy, sx, sy, width, height; |
2584 | int rev_copy = 0; | 2548 | int rev_copy = 0; |
2585 | 2549 | ||
2550 | #ifdef ATAFB_FALCON | ||
2551 | if (info->var.bits_per_pixel == 16) { | ||
2552 | cfb_copyarea(info, area); | ||
2553 | return; | ||
2554 | } | ||
2555 | #endif | ||
2556 | |||
2586 | /* clip the destination */ | 2557 | /* clip the destination */ |
2587 | x2 = area->dx + area->width; | 2558 | x2 = area->dx + area->width; |
2588 | y2 = area->dy + area->height; | 2559 | y2 = area->dy + area->height; |
@@ -2632,6 +2603,13 @@ static void atafb_imageblit(struct fb_info *info, const struct fb_image *image) | |||
2632 | const char *src; | 2603 | const char *src; |
2633 | u32 dx, dy, width, height, pitch; | 2604 | u32 dx, dy, width, height, pitch; |
2634 | 2605 | ||
2606 | #ifdef ATAFB_FALCON | ||
2607 | if (info->var.bits_per_pixel == 16) { | ||
2608 | cfb_imageblit(info, image); | ||
2609 | return; | ||
2610 | } | ||
2611 | #endif | ||
2612 | |||
2635 | /* | 2613 | /* |
2636 | * We could use hardware clipping but on many cards you get around | 2614 | * We could use hardware clipping but on many cards you get around |
2637 | * hardware clipping by writing to framebuffer directly like we are | 2615 | * hardware clipping by writing to framebuffer directly like we are |
@@ -2676,10 +2654,9 @@ static void atafb_imageblit(struct fb_info *info, const struct fb_image *image) | |||
2676 | src += pitch; | 2654 | src += pitch; |
2677 | } | 2655 | } |
2678 | } else { | 2656 | } else { |
2679 | // only used for logo; broken | 2657 | c2p_iplan2(info->screen_base, image->data, dx, dy, width, |
2680 | c2p(info->screen_base, image->data, dx, dy, width, height, | 2658 | height, par->next_line, image->width, |
2681 | par->next_line, par->next_plane, image->width, | 2659 | info->var.bits_per_pixel); |
2682 | info->var.bits_per_pixel); | ||
2683 | } | 2660 | } |
2684 | } | 2661 | } |
2685 | 2662 | ||
@@ -3098,8 +3075,7 @@ int __init atafb_setup(char *options) | |||
3098 | 3075 | ||
3099 | int __init atafb_init(void) | 3076 | int __init atafb_init(void) |
3100 | { | 3077 | { |
3101 | int pad; | 3078 | int pad, detected_mode, error; |
3102 | int detected_mode; | ||
3103 | unsigned int defmode = 0; | 3079 | unsigned int defmode = 0; |
3104 | unsigned long mem_req; | 3080 | unsigned long mem_req; |
3105 | 3081 | ||
@@ -3139,8 +3115,12 @@ int __init atafb_init(void) | |||
3139 | printk("atafb_init: initializing Falcon hw\n"); | 3115 | printk("atafb_init: initializing Falcon hw\n"); |
3140 | fbhw = &falcon_switch; | 3116 | fbhw = &falcon_switch; |
3141 | atafb_ops.fb_setcolreg = &falcon_setcolreg; | 3117 | atafb_ops.fb_setcolreg = &falcon_setcolreg; |
3142 | request_irq(IRQ_AUTO_4, falcon_vbl_switcher, IRQ_TYPE_PRIO, | 3118 | error = request_irq(IRQ_AUTO_4, falcon_vbl_switcher, |
3143 | "framebuffer/modeswitch", falcon_vbl_switcher); | 3119 | IRQ_TYPE_PRIO, |
3120 | "framebuffer/modeswitch", | ||
3121 | falcon_vbl_switcher); | ||
3122 | if (error) | ||
3123 | return error; | ||
3144 | defmode = DEFMODE_F30; | 3124 | defmode = DEFMODE_F30; |
3145 | break; | 3125 | break; |
3146 | } | 3126 | } |
@@ -3225,6 +3205,10 @@ int __init atafb_init(void) | |||
3225 | // tries to read from HW which may not be initialized yet | 3205 | // tries to read from HW which may not be initialized yet |
3226 | // so set sane var first, then call atafb_set_par | 3206 | // so set sane var first, then call atafb_set_par |
3227 | atafb_get_var(&fb_info.var, &fb_info); | 3207 | atafb_get_var(&fb_info.var, &fb_info); |
3208 | |||
3209 | #ifdef ATAFB_FALCON | ||
3210 | fb_info.pseudo_palette = current_par.hw.falcon.pseudo_palette; | ||
3211 | #endif | ||
3228 | fb_info.flags = FBINFO_FLAG_DEFAULT; | 3212 | fb_info.flags = FBINFO_FLAG_DEFAULT; |
3229 | 3213 | ||
3230 | if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, atafb_modedb, | 3214 | if (!fb_find_mode(&fb_info.var, &fb_info, mode_option, atafb_modedb, |