14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/errno.h>
17 #include <linux/string.h>
19 #include <linux/tty.h>
20 #include <linux/slab.h>
25 #include <linux/pci.h>
49 { 0, {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0}, 0,
51 { 4, {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0}, 0,
53 { 4, {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0}, 1,
55 { 8, {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0}, 0,
57 {16, {10, 5, 0}, {5, 5, 0}, {0, 5, 0}, {0, 0, 0}, 0,
59 {16, {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0}, 0,
61 {24, {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {0, 0, 0}, 0,
63 {32, {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {0, 0, 0}, 0,
78 static const struct vga_regset ark_v_total_regs[] = {{0x06, 0, 7}, {0x07, 0, 0}, {0x07, 5, 5}, {0x40, 7, 7},
VGA_REGSET_END};
79 static const struct vga_regset ark_v_display_regs[] = {{0x12, 0, 7}, {0x07, 1, 1}, {0x07, 6, 6}, {0x40, 6, 6},
VGA_REGSET_END};
80 static const struct vga_regset ark_v_blank_start_regs[] = {{0x15, 0, 7}, {0x07, 3, 3}, {0x09, 5, 5}, {0x40, 5, 5},
VGA_REGSET_END};
83 static const struct vga_regset ark_v_sync_start_regs[] = {{0x10, 0, 7}, {0x07, 2, 2}, {0x07, 7, 7}, {0x40, 4, 4},
VGA_REGSET_END};
87 static const struct vga_regset ark_start_address_regs[] = {{0x0d, 0, 7}, {0x0c, 0, 7}, {0x40, 0, 2},
VGA_REGSET_END};
91 ark_h_total_regs, ark_h_display_regs, ark_h_blank_start_regs,
92 ark_h_blank_end_regs, ark_h_sync_start_regs, ark_h_sync_end_regs,
93 ark_v_total_regs, ark_v_display_regs, ark_v_blank_start_regs,
94 ark_v_blank_end_regs, ark_v_sync_start_regs, ark_v_sync_end_regs,
120 MODULE_PARM_DESC(mtrr,
"Enable write-combining with MTRR (1=enable, 0=disable, default=1)");
132 static void arkfb_settile(
struct fb_info *
info,
struct fb_tilemap *
map)
134 const u8 *font = map->data;
138 if ((map->width != 8) || (map->height != 16) ||
139 (map->depth != 1) || (map->length != 256)) {
141 "height %d, depth %d, length %d\n", info->
node,
142 map->width, map->height, map->depth, map->length);
147 for (
c = 0;
c < map->length;
c++) {
148 for (i = 0; i < map->height; i++) {
150 fb_writeb(font[i], &fb[i * 4 + (128 * 8)]);
161 static void arkfb_tilecursor(
struct fb_info *info,
struct fb_tilecursor *cursor)
168 static struct fb_tile_ops arkfb_tile_ops = {
169 .fb_settile = arkfb_settile,
173 .fb_tilecursor = arkfb_tilecursor,
182 static inline u32 expand_color(
u32 c)
184 return ((c & 1) | ((c & 2) << 7) | ((c & 4) << 14) | ((c & 8) << 21)) * 0xFF;
192 const u8 *src1, *
src;
200 + ((image->
dx / 8) * 4);
202 for (y = 0; y < image->
height; y++) {
205 for (x = 0; x < image->
width; x += 8) {
206 val = *(src++) * 0x01010101;
207 val = (val & fg) | (~val & bg);
210 src1 += image->
width / 8;
211 dst1 += info->
fix.line_length;
217 static void arkfb_iplan_fillrect(
struct fb_info *info,
const struct fb_fillrect *rect)
225 + ((rect->
dx / 8) * 4);
227 for (y = 0; y < rect->
height; y++) {
229 for (x = 0; x < rect->
width; x += 8) {
232 dst1 += info->
fix.line_length;
239 static inline u32 expand_pixel(
u32 c)
241 return (((c & 1) << 24) | ((c & 2) << 27) | ((c & 4) << 14) | ((c & 8) << 17) |
242 ((c & 16) << 4) | ((c & 32) << 7) | ((c & 64) >> 6) | ((c & 128) >> 3)) * 0xF;
246 static void arkfb_cfb4_imageblit(
struct fb_info *info,
const struct fb_image *image)
250 const u8 *src1, *
src;
258 + ((image->
dx / 8) * 4);
260 for (y = 0; y < image->
height; y++) {
263 for (x = 0; x < image->
width; x += 8) {
264 val = expand_pixel(*(src++));
265 val = (val & fg) | (~val & bg);
268 src1 += image->
width / 8;
269 dst1 += info->
fix.line_length;
274 static void arkfb_imageblit(
struct fb_info *info,
const struct fb_image *image)
276 if ((info->
var.bits_per_pixel == 4) && (image->
depth == 1)
277 && ((image->
width % 8) == 0) && ((image->
dx % 8) == 0)) {
279 arkfb_iplan_imageblit(info, image);
281 arkfb_cfb4_imageblit(info, image);
288 if ((info->
var.bits_per_pixel == 4)
289 && ((rect->
width % 8) == 0) && ((rect->
dx % 8) == 0)
291 arkfb_iplan_fillrect(info, rect);
337 u8 code[2] = {
reg, 0};
342 static inline void dac_read_regs(
struct dac_info *info,
u8 *code,
int count)
347 static inline void dac_write_reg(
struct dac_info *info,
u8 reg,
u8 val)
349 u8 code[2] = {
reg, val};
353 static inline void dac_write_regs(
struct dac_info *info,
u8 *code,
int count)
360 return info->
dacops->dac_set_mode(info, mode);
365 return info->
dacops->dac_set_freq(info, channel, freq);
370 info->
dacops->dac_release(info);
385 #define DAC_PAR(info) ((struct ics5342_info *) info)
388 static const u8 ics5342_mode_table[
DAC_MAX] = {
394 static int ics5342_set_mode(
struct dac_info *info,
int mode)
401 code = ics5342_mode_table[
mode];
406 dac_write_reg(info, 6, code & 0xF0);
412 static const struct svga_pll ics5342_pll = {3, 129, 3, 33, 0, 3,
413 60000, 250000, 14318};
416 static const struct svga_pll ics5342_pll_pd4 = {3, 129, 3, 33, 2, 2,
417 60000, 335000, 14318};
422 static int ics5342_set_freq(
struct dac_info *info,
int channel,
u32 freq)
428 ? &ics5342_pll_pd4 : &ics5342_pll,
429 freq, &m, &n, &r, 0);
434 u8 code[6] = {4, 3, 5, m-2, 5, (n-2) | (r << 5)};
435 dac_write_regs(info, code, 3);
440 static void ics5342_release(
struct dac_info *info)
446 static struct dac_ops ics5342_ops = {
447 .dac_set_mode = ics5342_set_mode,
448 .dac_set_freq = ics5342_set_freq,
449 .dac_release = ics5342_release
460 info->
dacops = &ics5342_ops;
472 static unsigned short dac_regs[4] = {0x3c8, 0x3c9, 0x3c6, 0x3c7};
474 static void ark_dac_read_regs(
void *data,
u8 *code,
int count)
481 regval = vga_rseq(par->
state.vgabase, 0x1C);
484 vga_wseq(par->
state.vgabase, 0x1C, regval | (code[0] & 4 ? 0x80 : 0));
485 code[1] = vga_r(par->
state.vgabase, dac_regs[code[0] & 3]);
490 vga_wseq(par->
state.vgabase, 0x1C, regval);
493 static void ark_dac_write_regs(
void *data,
u8 *code,
int count)
500 regval = vga_rseq(par->
state.vgabase, 0x1C);
503 vga_wseq(par->
state.vgabase, 0x1C, regval | (code[0] & 4 ? 0x80 : 0));
504 vga_w(par->
state.vgabase, dac_regs[code[0] & 3], code[1]);
509 vga_wseq(par->
state.vgabase, 0x1C, regval);
513 static void ark_set_pixclock(
struct fb_info *info,
u32 pixclock)
518 int rv = dac_set_freq(par->
dac, 0, 1000000000 / pixclock);
520 printk(
KERN_ERR "fb%d: cannot set requested pixclock, keeping old value\n", info->
node);
532 static int arkfb_open(
struct fb_info *info,
int user)
541 par->
state.vgabase = vgabase;
543 par->
state.num_crtc = 0x60;
544 par->
state.num_seq = 0x30;
556 static int arkfb_release(
struct fb_info *info,
int user)
599 step = arkfb_formats[rv].
xresstep - 1;
607 printk(
KERN_ERR "fb%d: not enough framebuffer memory (%d kB requested , %d kB available)\n", info->
node, mem >> 10, (
unsigned int) (info->
screen_size >> 10));
627 static int arkfb_set_par(
struct fb_info *info)
635 info->
fix.ypanstep = 1;
636 info->
fix.line_length = (info->
var.xres_virtual *
bpp) / 8;
639 info->tileops =
NULL;
642 info->
pixmap.blit_x = (bpp == 4) ? (1 << (8 - 1)) : (~(
u32)0);
645 offset_value = (info->
var.xres_virtual *
bpp) / 64;
646 screen_size = info->
var.yres_virtual * info->
fix.line_length;
648 info->
fix.ypanstep = 16;
649 info->
fix.line_length = 0;
652 info->tileops = &arkfb_tile_ops;
655 info->
pixmap.blit_x = 1 << (8 - 1);
656 info->
pixmap.blit_y = 1 << (16 - 1);
658 offset_value = info->
var.xres_virtual / 16;
659 screen_size = (info->
var.xres_virtual * info->
var.yres_virtual) / 64;
662 info->
var.xoffset = 0;
663 info->
var.yoffset = 0;
667 svga_wcrt_mask(par->
state.vgabase, 0x11, 0x00, 0x80);
670 svga_wseq_mask(par->
state.vgabase, 0x01, 0x20, 0x20);
671 svga_wcrt_mask(par->
state.vgabase, 0x17, 0x00, 0x80);
682 svga_wseq_mask(par->
state.vgabase, 0x10, 0x1F, 0x1F);
683 svga_wseq_mask(par->
state.vgabase, 0x12, 0x03, 0x03);
685 vga_wseq(par->
state.vgabase, 0x13, info->
fix.smem_start >> 16);
686 vga_wseq(par->
state.vgabase, 0x14, info->
fix.smem_start >> 24);
687 vga_wseq(par->
state.vgabase, 0x15, 0);
688 vga_wseq(par->
state.vgabase, 0x16, 0);
693 vga_wseq(par->
state.vgabase, 0x18, regval);
696 pr_debug(
"fb%d: offset register : %d\n", info->
node, offset_value);
700 svga_wcrt_mask(par->
state.vgabase, 0x40, 0x08, 0x08);
703 svga_wcrt_mask(par->
state.vgabase, 0x09, 0x80, 0x80);
705 svga_wcrt_mask(par->
state.vgabase, 0x09, 0x00, 0x80);
708 svga_wcrt_mask(par->
state.vgabase, 0x44, 0x04, 0x04);
710 svga_wcrt_mask(par->
state.vgabase, 0x44, 0x00, 0x04);
722 vga_wseq(par->
state.vgabase, 0x11, 0x10);
723 svga_wcrt_mask(par->
state.vgabase, 0x46, 0x00, 0x04);
731 vga_wseq(par->
state.vgabase, 0x11, 0x10);
732 svga_wcrt_mask(par->
state.vgabase, 0x46, 0x00, 0x04);
736 pr_debug(
"fb%d: 4 bit pseudocolor, planar\n", info->
node);
738 vga_wseq(par->
state.vgabase, 0x11, 0x10);
739 svga_wcrt_mask(par->
state.vgabase, 0x46, 0x00, 0x04);
745 vga_wseq(par->
state.vgabase, 0x11, 0x16);
747 if (info->
var.pixclock > 20000) {
749 svga_wcrt_mask(par->
state.vgabase, 0x46, 0x00, 0x04);
753 svga_wcrt_mask(par->
state.vgabase, 0x46, 0x04, 0x04);
761 vga_wseq(par->
state.vgabase, 0x11, 0x1A);
762 svga_wcrt_mask(par->
state.vgabase, 0x46, 0x04, 0x04);
768 vga_wseq(par->
state.vgabase, 0x11, 0x1A);
769 svga_wcrt_mask(par->
state.vgabase, 0x46, 0x04, 0x04);
775 vga_wseq(par->
state.vgabase, 0x11, 0x16);
776 svga_wcrt_mask(par->
state.vgabase, 0x46, 0x04, 0x04);
784 vga_wseq(par->
state.vgabase, 0x11, 0x1E);
785 svga_wcrt_mask(par->
state.vgabase, 0x46, 0x04, 0x04);
794 ark_set_pixclock(info, (hdiv * info->
var.pixclock) / hmul);
801 value = info->
var.xres + info->
var.left_margin + info->
var.right_margin + info->
var.hsync_len;
802 value = ((value * hmul / hdiv) / 8) - 5;
803 vga_wcrt(par->
state.vgabase, 0x42, (value + 1) / 2);
807 svga_wcrt_mask(par->
state.vgabase, 0x17, 0x80, 0x80);
808 svga_wseq_mask(par->
state.vgabase, 0x01, 0x00, 0x20);
818 switch (fb->
var.bits_per_pixel) {
824 if ((fb->
var.bits_per_pixel == 4) &&
825 (fb->
var.nonstd == 0)) {
850 if (fb->
var.green.length == 5)
852 ((green & 0xF800) >> 6) | ((blue & 0xF800) >> 11);
853 else if (fb->
var.green.length == 6)
855 ((green & 0xFC00) >> 5) | ((blue & 0xF800) >> 11);
865 (green & 0xFF00) | ((blue & 0xFF00) >> 8);
876 static int arkfb_blank(
int blank_mode,
struct fb_info *info)
880 switch (blank_mode) {
883 svga_wseq_mask(par->
state.vgabase, 0x01, 0x00, 0x20);
884 svga_wcrt_mask(par->
state.vgabase, 0x17, 0x80, 0x80);
888 svga_wseq_mask(par->
state.vgabase, 0x01, 0x20, 0x20);
889 svga_wcrt_mask(par->
state.vgabase, 0x17, 0x80, 0x80);
895 svga_wseq_mask(par->
state.vgabase, 0x01, 0x20, 0x20);
896 svga_wcrt_mask(par->
state.vgabase, 0x17, 0x00, 0x80);
911 if (info->
var.bits_per_pixel == 0) {
912 offset = (var->
yoffset / 16) * (info->
var.xres_virtual / 2)
914 offset = offset >> 2;
916 offset = (var->
yoffset * info->
fix.line_length) +
917 (var->
xoffset * info->
var.bits_per_pixel / 8);
918 offset = offset >> ((info->
var.bits_per_pixel == 4) ? 2 : 3);
933 static struct fb_ops arkfb_ops = {
935 .fb_open = arkfb_open,
936 .fb_release = arkfb_release,
937 .fb_check_var = arkfb_check_var,
938 .fb_set_par = arkfb_set_par,
939 .fb_setcolreg = arkfb_setcolreg,
940 .fb_blank = arkfb_blank,
941 .fb_pan_display = arkfb_pan_display,
942 .fb_fillrect = arkfb_fillrect,
944 .fb_imageblit = arkfb_imageblit,
963 if (! svga_primary_device(dev)) {
964 dev_info(&(dev->
dev),
"ignoring secondary device\n");
971 dev_err(&(dev->
dev),
"cannot allocate memory\n");
979 info->
fbops = &arkfb_ops;
985 goto err_enable_device;
990 dev_err(info->
device,
"cannot reserve framebuffer region\n");
991 goto err_request_regions;
994 par->
dac = ics5342_init(ark_dac_read_regs, ark_dac_write_regs, info);
1013 bus_reg.end = 64 * 1024;
1022 regval = vga_rseq(par->
state.vgabase, 0x10);
1027 info->
fix.mmio_start = 0;
1028 info->
fix.mmio_len = 0;
1031 info->
fix.ypanstep = 0;
1037 if (! ((rc == 1) || (rc == 2))) {
1046 goto err_alloc_cmap;
1056 pci_name(dev), info->
fix.smem_len >> 20);
1059 pci_set_drvdata(dev, info);
1077 dac_release(par->
dac);
1080 err_request_regions:
1091 struct fb_info *info = pci_get_drvdata(dev);
1103 dac_release(par->
dac);
1111 pci_set_drvdata(dev,
NULL);
1122 struct fb_info *info = pci_get_drvdata(dev);
1153 struct fb_info *info = pci_get_drvdata(dev);
1172 arkfb_set_par(info);
1181 #define ark_pci_suspend NULL
1182 #define ark_pci_resume NULL
1189 {0, 0, 0, 0, 0, 0, 0}
1195 static struct pci_driver arkfb_pci_driver = {
1197 .id_table = ark_devices,
1198 .probe = ark_pci_probe,
1206 static void __exit arkfb_cleanup(
void)
1214 static int __init arkfb_init(
void)
1223 if (option && *option)
1228 return pci_register_driver(&arkfb_pci_driver);