int fbgen_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) { struct fb_info_gen *info2 = (struct fb_info_gen *)info; int err; int oldxres, oldyres, oldbpp, oldxres_virtual, oldyres_virtual, oldyoffset; if ((err = fbgen_do_set_var(var, con == currcon, info2))) return err; if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { oldxres = fb_display[con].var.xres; oldyres = fb_display[con].var.yres; oldxres_virtual = fb_display[con].var.xres_virtual; oldyres_virtual = fb_display[con].var.yres_virtual; oldbpp = fb_display[con].var.bits_per_pixel; oldyoffset = fb_display[con].var.yoffset; fb_display[con].var = *var; if (oldxres != var->xres || oldyres != var->yres || oldxres_virtual != var->xres_virtual || oldyres_virtual != var->yres_virtual || oldbpp != var->bits_per_pixel || oldyoffset != var->yoffset) { fbgen_set_disp(con, info2); if (info->changevar) (*info->changevar)(con); if ((err = fb_alloc_cmap(&fb_display[con].cmap, 0, 0))) return err; fbgen_install_cmap(con, info2); } } var->activate = 0; return 0; }
int __init ipodfb_init(void) { fb_info.gen.fbhw = &ipod_switch; fb_info.gen.fbhw->detect(); strcpy(fb_info.gen.info.modename, "iPod"); fb_info.gen.info.changevar = NULL; fb_info.gen.info.node = -1; fb_info.gen.info.fbops = &ipodfb_ops; fb_info.gen.info.disp = &disp; fb_info.gen.info.switch_con = &fbgen_switch; fb_info.gen.info.updatevar = &fbgen_update_var; fb_info.gen.info.blank = &fbgen_blank; fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT; /* This should give a reasonable default video mode */ fbgen_get_var(&disp.var, -1, &fb_info.gen.info); fbgen_do_set_var(&disp.var, 1, &fb_info.gen); fbgen_set_disp(-1, &fb_info.gen); fbgen_install_cmap(0, &fb_info.gen); if ( register_framebuffer(&fb_info.gen.info) < 0 ) { return -EINVAL; } init_lcd(); printk(KERN_INFO "fb%d: %s frame buffer device\n", GET_FB_IDX(fb_info.gen.info.node), fb_info.gen.info.modename); /* uncomment this if your driver cannot be unloaded */ /* MOD_INC_USE_COUNT; */ return 0; }
int fbgen_switch(int con, struct fb_info *info) { struct fb_info_gen *info2 = (struct fb_info_gen *)info; struct fbgen_hwswitch *fbhw = info2->fbhw; /* Do we have to save the colormap ? */ if (fb_display[currcon].cmap.len) fb_get_cmap(&fb_display[currcon].cmap, 1, fbhw->getcolreg, &info2->info); fbgen_do_set_var(&fb_display[con].var, 1, info2); currcon = con; /* Install new colormap */ fbgen_install_cmap(con, info2); return 0; }
//----------------------------------------------------------------------------- // // Initialise the chip and the frame buffer driver. // //----------------------------------------------------------------------------- int __init rubyfb_init(void) { int i; ///// TESTING int j; ///// TESTING fb_info.FrameBufferAddress = alloc_framebuffer(); if (!fb_info.FrameBufferAddress) { printk ("rubyfb_init: Failed to allocate memory for the framebuffer.\n"); return -EINVAL; } // Clear the allocated memory memset(fb_info.FrameBufferAddress, 0, RUBY_PHYSICAL_MEM_SIZE); // Tell the lower levels what our addresses are ruby_set_addresses(fb_info.FrameBufferAddress, fb_info.FrameBufferDmaAddress); ruby_init_display(); strcpy(fb_info.gen.info.modename, "ruby"); fb_info.gen.info.changevar = NULL; fb_info.gen.info.node = -1; fb_info.gen.info.fbops = &ruby_ops; fb_info.gen.info.disp = &disp; fb_info.gen.info.switch_con = &fbgen_switch; fb_info.gen.info.updatevar = &fbgen_update_var; fb_info.gen.info.blank = &fbgen_blank; strcpy(fb_info.gen.info.fontname, default_fontname); fb_info.gen.parsize = 0; fb_info.gen.info.flags = FBINFO_FLAG_DEFAULT; fb_info.gen.fbhw = &ruby_hwswitch; fb_info.gen.fbhw->detect(); fbgen_get_var(&disp.var, -1, &fb_info.gen.info); disp.var.activate = FB_ACTIVATE_NOW; fbgen_do_set_var(&disp.var, 1, &fb_info.gen); fbgen_set_disp(-1, &fb_info.gen); fbgen_install_cmap(0, &fb_info.gen); if (register_framebuffer(&fb_info.gen.info) < 0) { printk("Failed to register the %s framebuffer device.\n", fb_info.gen.info.modename); free_framebuffer(); return -EINVAL; } if (periodic_flush_enable) { init_timer(&fb_info.ruby_timer); fb_info.ruby_timer.function = ruby_flush; fb_info.ruby_timer.data = 0; fb_info.ruby_timer.expires = (unsigned long) jiffies + HZ + 100; add_timer(&fb_info.ruby_timer); } ///////////////////////////// ////// Display Logo ////// /////////////////////////// ///// ruby_display_logo(); printk("fb%d: %s framebuffer device installed.\n", GET_FB_IDX(fb_info.gen.info.node), fb_info.gen.info.modename); printk("Display %s features %d x %d at %d bpp.\n", fb_info.gen.info.modename, RUBY_DISPLAY_WIDTH, RUBY_DISPLAY_HEIGHT, RUBY_DISPLAY_BPP); return 0; }
static int __init probe(int index) { u32 *phys_reg_addr; struct xilinxfb_info *i; struct page *page, *end_page; switch (index) { #if defined(CONFIG_XILINX_TFT_CNTLR_REF_0_INSTANCE) case 0: phys_reg_addr = (u32 *) CONFIG_XILINX_TFT_CNTLR_REF_0_DCR_BASEADDR; break; #if defined(CONFIG_XILINX_TFT_CNTRLR_REF_1_INSTANCE) case 1: phys_reg_addr = (u32 *) CONFIG_XILINX_TFT_CNTLR_REF_1_DCR_BASEADDR; break; #if defined(CONFIG_XILINX_TFT_CNTRLR_REF_2_INSTANCE) case 2: phys_reg_addr = (u32 *) CONFIG_XILINX_TFT_CNTLR_REF_2_DCR_BASEADDR; break; #if defined(CONFIG_XILINX_TFT_CNTLR_REF_3_INSTANCE) #error Edit this file to add more devices. #endif /* 3 */ #endif /* 2 */ #endif /* 1 */ #endif /* 0 */ default: return -ENODEV; } /* Convert DCR register address to OPB address */ phys_reg_addr = (unsigned *)(((unsigned)phys_reg_addr*4)+0xd0000000); /* Allocate the info and zero it out. */ i = (struct xilinxfb_info *) kmalloc(sizeof (struct xilinxfb_info), GFP_KERNEL); if (!i) { printk(KERN_ERR "Could not allocate Xilinx " "frame buffer #%d information.\n", index); return -ENOMEM; } memset(i, 0, sizeof (struct xilinxfb_info)); /* Make it the head of info_list. */ spin_lock(&info_lock); i->next = info_list; info_list = i; spin_unlock(&info_lock); /* * At this point, things are ok for us to call remove_head_info() to * clean up if we run into any problems; i is on info_list and * all the pointers are zeroed because of the memset above. */ i->fb_virt_start = (unsigned long) consistent_alloc(GFP_KERNEL|GFP_DMA, FB_SIZE, &i->fb_phys); if (!i->fb_virt_start) { printk(KERN_ERR "Could not allocate frame buffer memory " "for Xilinx device #%d.\n", index); remove_head_info(); return -ENOMEM; } /* * The 2.4 PPC version of consistent_alloc does not set the * pages reserved. The pages need to be reserved so that mmap * will work. This means that we need the following code. When * consistent_alloc gets fixed, this will no longer be needed. * Note that in 2.4, consistent_alloc doesn't free up the extra * pages either. This is already fixed in 2.5. */ page = virt_to_page(__va(i->fb_phys)); end_page = page + ((FB_SIZE+PAGE_SIZE-1)/PAGE_SIZE); while (page < end_page) mem_map_reserve(page++); /* Clear the frame buffer. */ memset((void *) i->fb_virt_start, 0, FB_SIZE); /* Map the control registers in. */ i->regs = (u32 *) ioremap((unsigned long) phys_reg_addr, NUM_REGS); /* Tell the hardware where the frame buffer is. */ out_be32(i->regs + REG_FB_ADDR, i->fb_phys); /* Turn on the display. */ out_be32(i->regs + REG_CTRL, REG_CTRL_DEFAULT); current_par.var.xres = XRES; current_par.var.xres_virtual = XRES_VIRTUAL; current_par.var.yres = YRES; current_par.var.yres_virtual = YRES_VIRTUAL; current_par.var.bits_per_pixel = BITS_PER_PIXEL; i->gen.parsize = sizeof (struct xilinxfb_par); i->gen.fbhw = &xilinx_switch; strcpy(i->gen.info.modename, "Xilinx LCD"); i->gen.info.changevar = NULL; i->gen.info.node = -1; i->gen.info.fbops = &xilinxfb_ops; i->gen.info.disp = &i->disp; i->gen.info.switch_con = &fbgen_switch; i->gen.info.updatevar = &fbgen_update_var; i->gen.info.blank = &fbgen_blank; i->gen.info.flags = FBINFO_FLAG_DEFAULT; /* This should give a reasonable default video mode */ fbgen_get_var(&i->disp.var, -1, &i->gen.info); fbgen_do_set_var(&i->disp.var, 1, &i->gen); fbgen_set_disp(-1, &i->gen); fbgen_install_cmap(0, &i->gen); if (register_framebuffer(&i->gen.info) < 0) { printk(KERN_ERR "Could not register frame buffer " "for Xilinx device #%d.\n", index); remove_head_info(); return -EINVAL; } printk(KERN_INFO "fb%d: %s frame buffer at 0x%08X mapped to 0x%08lX\n", GET_FB_IDX(i->gen.info.node), i->gen.info.modename, i->fb_phys, i->fb_virt_start); return 0; }