コード例 #1
0
/**
 * s3c_fb_release_win() - release resources for a framebuffer window.
 * @win: The window to cleanup the resources for.
 *
 * Release the resources that where claimed for the hardware window,
 * such as the framebuffer instance and any memory claimed for it.
 */
static void s3c_fb_release_win(struct s3c_fb *sfb, struct s3c_fb_win *win)
{
	if (win->fbinfo) {
		unregister_framebuffer(win->fbinfo);
		fb_dealloc_cmap(&win->fbinfo->cmap);
		s3c_fb_free_memory(sfb, win);
		framebuffer_release(win->fbinfo);
	}
}
コード例 #2
0
ファイル: s3c-fb.c プロジェクト: antonywcl/AR-5315u_PLD
/**
 * s3c_fb_probe_win() - register an hardware window
 * @sfb: The base resources for the hardware
 * @res: Pointer to where to place the resultant window.
 *
 * Allocate and do the basic initialisation for one of the hardware's graphics
 * windows.
 */
static int __devinit s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no,
                                      struct s3c_fb_win **res)
{
    struct fb_var_screeninfo *var;
    struct fb_videomode *initmode;
    struct s3c_fb_pd_win *windata;
    struct s3c_fb_win *win;
    struct fb_info *fbinfo;
    int palette_size;
    int ret;

    dev_dbg(sfb->dev, "probing window %d\n", win_no);

    palette_size = s3c_fb_win_pal_size(win_no);

    fbinfo = framebuffer_alloc(sizeof(struct s3c_fb_win) +
                               palette_size * sizeof(u32), sfb->dev);
    if (!fbinfo) {
        dev_err(sfb->dev, "failed to allocate framebuffer\n");
        return -ENOENT;
    }

    windata = sfb->pdata->win[win_no];
    initmode = &windata->win_mode;

    WARN_ON(windata->max_bpp == 0);
    WARN_ON(windata->win_mode.xres == 0);
    WARN_ON(windata->win_mode.yres == 0);

    win = fbinfo->par;
    var = &fbinfo->var;
    win->fbinfo = fbinfo;
    win->parent = sfb;
    win->windata = windata;
    win->index = win_no;
    win->palette_buffer = (u32 *)(win + 1);

    ret = s3c_fb_alloc_memory(sfb, win);
    if (ret) {
        dev_err(sfb->dev, "failed to allocate display memory\n");
        goto err_framebuffer;
    }

    /* setup the r/b/g positions for the window's palette */
    s3c_fb_init_palette(win_no, &win->palette);

    /* setup the initial video mode from the window */
    fb_videomode_to_var(&fbinfo->var, initmode);

    fbinfo->fix.type	= FB_TYPE_PACKED_PIXELS;
    fbinfo->fix.accel	= FB_ACCEL_NONE;
    fbinfo->var.activate	= FB_ACTIVATE_NOW;
    fbinfo->var.vmode	= FB_VMODE_NONINTERLACED;
    fbinfo->var.bits_per_pixel = windata->default_bpp;
    fbinfo->fbops		= &s3c_fb_ops;
    fbinfo->flags		= FBINFO_FLAG_DEFAULT;
    fbinfo->pseudo_palette  = &win->pseudo_palette;

    /* prepare to actually start the framebuffer */

    ret = s3c_fb_check_var(&fbinfo->var, fbinfo);
    if (ret < 0) {
        dev_err(sfb->dev, "check_var failed on initial video params\n");
        goto err_alloc_mem;
    }

    /* create initial colour map */

    ret = fb_alloc_cmap(&fbinfo->cmap, s3c_fb_win_pal_size(win_no), 1);
    if (ret == 0)
        fb_set_cmap(&fbinfo->cmap, fbinfo);
    else
        dev_err(sfb->dev, "failed to allocate fb cmap\n");

    s3c_fb_set_par(fbinfo);

    dev_dbg(sfb->dev, "about to register framebuffer\n");

    /* run the check_var and set_par on our configuration. */

    ret = register_framebuffer(fbinfo);
    if (ret < 0) {
        dev_err(sfb->dev, "failed to register framebuffer\n");
        goto err_alloc_mem;
    }

    *res = win;
    dev_info(sfb->dev, "window %d: fb %s\n", win_no, fbinfo->fix.id);

    return 0;

err_alloc_mem:
    s3c_fb_free_memory(sfb, win);

err_framebuffer:
    unregister_framebuffer(fbinfo);
    return ret;
}