int __init maxinefb_init(void) { unsigned long fboff; unsigned long fb_start; int i; if (fb_get_options("maxinefb", NULL)) return -ENODEV; /* Validate we're on the proper machine type */ if (mips_machtype != MACH_DS5000_XX) { return -EINVAL; } ; ; /* Framebuffer display memory base address */ fb_start = DS5000_xx_ONBOARD_FBMEM_START; /* Clear screen */ for (fboff = fb_start; fboff < fb_start + 0x1ffff; fboff++) *(volatile unsigned char *)fboff = 0x0; maxinefb_fix.smem_start = fb_start; /* erase hardware cursor */ for (i = 0; i < 512; i++) { maxinefb_ims332_write_register(IMS332_REG_CURSOR_RAM + i, 0); /* if (i&0x8 == 0) maxinefb_ims332_write_register (IMS332_REG_CURSOR_RAM + i, 0x0f); else maxinefb_ims332_write_register (IMS332_REG_CURSOR_RAM + i, 0xf0); */ } fb_info.fbops = &maxinefb_ops; fb_info.screen_base = (char *)maxinefb_fix.smem_start; fb_info.var = maxinefb_defined; fb_info.fix = maxinefb_fix; fb_info.flags = FBINFO_DEFAULT; fb_alloc_cmap(&fb_info.cmap, 256, 0); if (register_framebuffer(&fb_info) < 0) return 1; return 0; }
/* Set the palette */ static int maxinefb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue, unsigned transp, struct fb_info *info) { /* value to be written into the palette reg. */ unsigned long hw_colorvalue = 0; red >>= 8; /* The cmap fields are 16 bits */ green >>= 8; /* wide, but the harware colormap */ blue >>= 8; /* registers are only 8 bits wide */ hw_colorvalue = (blue << 16) + (green << 8) + (red); maxinefb_ims332_write_register(IMS332_REG_COLOR_PALETTE + regno, hw_colorvalue); return 0; }