static int tegra_fb_set_par(struct fb_info *info) { struct tegra_fb_info *tegra_fb = info->par; struct fb_var_screeninfo *var = &info->var; if (var->bits_per_pixel) { /* we only support RGB ordering for now */ switch (var->bits_per_pixel) { case 32: var->red.offset = 0; var->red.length = 8; var->green.offset = 8; var->green.length = 8; var->blue.offset = 16; var->blue.length = 8; var->transp.offset = 24; var->transp.length = 8; tegra_fb->win->fmt = TEGRA_WIN_FMT_R8G8B8A8; break; case 16: var->red.offset = 11; var->red.length = 5; var->green.offset = 5; var->green.length = 6; var->blue.offset = 0; var->blue.length = 5; tegra_fb->win->fmt = TEGRA_WIN_FMT_B5G6R5; break; default: return -EINVAL; } /* if line_length unset, then pad the stride */ if (!info->fix.line_length) { info->fix.line_length = var->xres * var->bits_per_pixel / 8; info->fix.line_length = round_up(info->fix.line_length, TEGRA_LINEAR_PITCH_ALIGNMENT); } tegra_fb->win->stride = info->fix.line_length; tegra_fb->win->stride_uv = 0; tegra_fb->win->phys_addr_u = 0; tegra_fb->win->phys_addr_v = 0; } if (var->pixclock) { bool stereo; struct fb_videomode m; fb_var_to_videomode(&m, var); info->mode = (struct fb_videomode *) fb_find_nearest_mode(&m, &info->modelist); if (!info->mode) { dev_warn(&tegra_fb->ndev->dev, "can't match video mode\n"); return -EINVAL; } /* * only enable stereo if the mode supports it and * client requests it */ stereo = !!(var->vmode & info->mode->vmode & #ifndef CONFIG_TEGRA_HDMI_74MHZ_LIMIT FB_VMODE_STEREO_FRAME_PACK); #else FB_VMODE_STEREO_LEFT_RIGHT); #endif tegra_dc_set_fb_mode(tegra_fb->win->dc, info->mode, stereo); tegra_fb->win->w.full = dfixed_const(info->mode->xres); tegra_fb->win->h.full = dfixed_const(info->mode->yres); tegra_fb->win->out_w = info->mode->xres; tegra_fb->win->out_h = info->mode->yres; }
static int tegra_fb_set_par(struct fb_info *info) { struct tegra_fb_info *tegra_fb = info->par; struct fb_var_screeninfo *var = &info->var; struct tegra_dc *dc = tegra_fb->win->dc; if (var->bits_per_pixel) { /* we only support RGB ordering for now */ switch (var->bits_per_pixel) { case 32: var->red.offset = 0; var->red.length = 8; var->green.offset = 8; var->green.length = 8; var->blue.offset = 16; var->blue.length = 8; var->transp.offset = 24; var->transp.length = 8; tegra_fb->win->fmt = TEGRA_WIN_FMT_R8G8B8A8; break; case 16: var->red.offset = 11; var->red.length = 5; var->green.offset = 5; var->green.length = 6; var->blue.offset = 0; var->blue.length = 5; tegra_fb->win->fmt = TEGRA_WIN_FMT_B5G6R5; break; default: return -EINVAL; } /* if line_length unset, then pad the stride */ if (!info->fix.line_length) { info->fix.line_length = var->xres * var->bits_per_pixel / 8; info->fix.line_length = round_up(info->fix.line_length, TEGRA_LINEAR_PITCH_ALIGNMENT); } tegra_fb->win->stride = info->fix.line_length; tegra_fb->win->stride_uv = 0; tegra_fb->win->phys_addr_u = 0; tegra_fb->win->phys_addr_v = 0; } if (var->pixclock) { bool stereo; unsigned old_len = 0; struct fb_videomode m; struct fb_videomode *old_mode = NULL; fb_var_to_videomode(&m, var); /* Load framebuffer info with new mode details*/ old_mode = info->mode; old_len = info->fix.line_length; info->mode = (struct fb_videomode *) fb_find_nearest_mode(&m, &info->modelist); if (!info->mode) { dev_warn(&tegra_fb->ndev->dev, "can't match video mode\n"); info->mode = old_mode; return -EINVAL; } /* Update fix line_length and window stride as per new mode */ info->fix.line_length = var->xres * var->bits_per_pixel / 8; info->fix.line_length = round_up(info->fix.line_length, TEGRA_LINEAR_PITCH_ALIGNMENT); tegra_fb->win->stride = info->fix.line_length; /* * only enable stereo if the mode supports it and * client requests it */ stereo = !!(var->vmode & info->mode->vmode & #ifndef CONFIG_TEGRA_HDMI_74MHZ_LIMIT FB_VMODE_STEREO_FRAME_PACK); #else FB_VMODE_STEREO_LEFT_RIGHT); #endif /* Configure DC with new mode */ if (tegra_dc_set_fb_mode(dc, info->mode, stereo)) { /* Error while configuring DC, fallback to old mode */ dev_warn(&tegra_fb->ndev->dev, "can't configure dc with mode %ux%u\n", info->mode->xres, info->mode->yres); info->mode = old_mode; info->fix.line_length = old_len; tegra_fb->win->stride = old_len; return -EINVAL; } tegra_fb->win->w.full = dfixed_const(info->mode->xres); tegra_fb->win->h.full = dfixed_const(info->mode->yres); tegra_fb->win->out_w = info->mode->xres; tegra_fb->win->out_h = info->mode->yres; }
static int _tegra_dc_set_default_videomode(struct tegra_dc *dc) { return tegra_dc_set_fb_mode(dc, &tegra_dc_hdmi_fallback_mode, 0); }