コード例 #1
0
int create_link_hdmi(struct decon_device *decon)
{
	int i, ret = 0;
	int n_pad = decon->n_sink_pad + decon->n_src_pad;
	int flags = 0;
	char err[80];

	if (!strcmp(decon->output_sd->name, "s5p-hdmi-sd"))
		flags = MEDIA_LNK_FL_ENABLED;
	for (i = decon->n_sink_pad; i < n_pad ; i++) {
		ret = media_entity_create_link(&decon->sd.entity, i,
				&decon->output_sd->entity, 0, flags);
		if (ret) {
			snprintf(err, sizeof(err), "%s --> %s",
					decon->sd.entity.name,
					decon->output_sd->entity.name);
			return ret;
		}
		decon_info("%s[%d] --> [0]%s link is created successfully\n",
				decon->sd.entity.name, i,
				decon->output_sd->entity.name);
	}

	return ret;
}
コード例 #2
0
void decon_to_init_param(struct decon_device *decon, struct decon_init_param *p)
{
	struct decon_lcd *lcd_info = decon->lcd_info;
	struct v4l2_mbus_framefmt mbus_fmt;
	int ret = 0;

	mbus_fmt.width = 0;
	mbus_fmt.height = 0;
	mbus_fmt.code = 0;
	mbus_fmt.field = 0;
	mbus_fmt.colorspace = 0;

	if (decon->out_type == DECON_OUT_HDMI) {
		ret = v4l2_subdev_call(decon->output_sd, video, g_mbus_fmt,
								&mbus_fmt);
		if (ret)
			decon_warn("failed to get mbus_fmt for hdmi\n");
		p->lcd_info = find_porch(mbus_fmt);
		decon_info("find porch %dx%d@%dHz\n", p->lcd_info->xres,
				p->lcd_info->yres, p->lcd_info->fps);
	} else {
		p->lcd_info = lcd_info;
	}
	decon->lcd_info = p->lcd_info;
	p->psr.psr_mode = decon->pdata->psr_mode;
	p->psr.trig_mode = decon->pdata->trig_mode;
	p->psr.out_type = decon->out_type;
	p->nr_windows = decon->pdata->max_win;
}
コード例 #3
0
ファイル: decon_t.c プロジェクト: GAXUSXX/G935FGaXusKernel2
int decon_t_set_lcd_info(struct decon_device *decon)
{
	struct decon_lcd *lcd_info;

	if (decon->lcd_info != NULL)
		return 0;

	lcd_info = kzalloc(sizeof(struct decon_lcd), GFP_KERNEL);
	if (!lcd_info) {
		decon_err("could not allocate decon_lcd for wb\n");
		return -ENOMEM;
	}

	decon->lcd_info = lcd_info;
	decon->lcd_info->width = 1920;
	decon->lcd_info->height = 1080;
	decon->lcd_info->xres = 1920;
	decon->lcd_info->yres = 1080;
	decon->lcd_info->vfp = 2;
	decon->lcd_info->vbp = 20;
	decon->lcd_info->hfp = 20;
	decon->lcd_info->hbp = 20;
	decon->lcd_info->vsa = 2;
	decon->lcd_info->hsa = 20;
	decon->lcd_info->fps = 60;
	decon->pdata->out_type = DECON_OUT_WB;

	decon_info("decon_%d output size for writeback %dx%d\n", decon->id,
			decon->lcd_info->width, decon->lcd_info->height);

	return 0;
}
コード例 #4
0
int create_link_mipi(struct decon_device *decon)
{
	int i, ret = 0;
	int n_pad = decon->n_sink_pad + decon->n_src_pad;
	int flags = 0;
	char err[80];
	struct exynos_md *md = decon->mdev;

	if (IS_ERR_OR_NULL(md->dsim_sd[decon->id])) {
		decon_err("failed to get subdev of dsim%d\n", decon->id);
		return -EINVAL;
	}

	flags = MEDIA_LNK_FL_ENABLED;
	for (i = decon->n_sink_pad; i < n_pad ; i++) {
		ret = media_entity_create_link(&decon->sd.entity, i,
				&md->dsim_sd[decon->id]->entity, 0, flags);
		if (ret) {
			snprintf(err, sizeof(err), "%s --> %s",
					decon->sd.entity.name,
					decon->output_sd->entity.name);
			return ret;
		}

		decon_info("%s[%d] --> [0]%s link is created successfully\n",
				decon->sd.entity.name, i,
				decon->output_sd->entity.name);
	}

	return ret;
}
コード例 #5
0
int find_subdev_hdmi(struct decon_device *decon)
{
	struct v4l2_subdev *output_sd;

	output_sd = (struct v4l2_subdev *)module_name_to_driver_data("s5p-hdmi");
	if (!output_sd) {
		decon_err("failed to get hdmi device\n");
		return -ENODEV;
	}

	decon->output_sd = output_sd;
	decon->out_type = DECON_OUT_HDMI;
	decon_info("%s entity get successfully\n", output_sd->name);

	return 0;
}
コード例 #6
0
void decon_int_set_clocks(struct decon_device *decon)
{
	struct device *dev = decon->dev;
	u32 clk_val_dpll = decon->pdata->disp_pll_clk;
	u32 clk_val_vclk, clk_val_pclk, clk_val_eclk, clk_val_aclk;

	if (!clk_val_dpll) {
		decon_info("setting predefined clock values\n");

		/* predefined values */
		decon_clk_set_rate(dev, "disp_pll", 267 * MHZ);
		decon_clk_set_rate(dev, "d_pclk_disp", 134 * MHZ);

		decon_clk_set_parent(dev, "m_decon0_eclk", "disp_pll");
		decon_clk_set_rate(dev, "d_decon0_eclk", 134 * MHZ);

		decon_clk_set_parent(dev, "m_decon0_vclk", "disp_pll");
		decon_clk_set_rate(dev, "d_decon0_vclk", 134 * MHZ);
	} else {
		clk_val_vclk = clk_val_dpll>>1;
		clk_val_eclk = (clk_val_vclk * 12) / 10;
		clk_val_aclk = clk_get_rate(decon->res.aclk_disp_200);
		clk_val_pclk = clk_val_aclk>>1;

		decon_info("setting pll to %dMHz\n", clk_val_dpll/MHZ);
		decon_info("setting clk_val_vclk %dMHz\n", clk_val_vclk/MHZ);
		decon_info("setting clk_val_eclk %dMHz\n", clk_val_eclk/MHZ);
		decon_info("setting clk_val_aclk %dMHz\n", clk_val_aclk/MHZ);
		decon_info("setting clk_val_pclk %dMHz\n", clk_val_pclk/MHZ);

		/* values based on DT input */
		decon_clk_set_rate(dev, "disp_pll", clk_val_dpll);
		decon_clk_set_rate(dev, "d_pclk_disp", clk_val_pclk);

		decon_clk_set_parent(dev, "m_decon0_eclk", "m_eclk_user");
		decon_clk_set_parent(dev, "m_eclk_user_a",
				"m_bus_pll_top_user");

		decon_clk_set_rate(dev, "d_sclk_decon0_eclk", clk_val_eclk);
		decon_clk_set_rate(dev, "d_decon0_eclk", clk_val_eclk);

		decon_clk_set_parent(dev, "m_decon0_vclk", "disp_pll");
		decon_clk_set_rate(dev, "d_decon0_vclk", clk_val_vclk);
	}
}