Ejemplo n.º 1
0
static int mdp_lcdc_probe(struct platform_device *pdev)
{
	struct msm_lcdc_platform_data *pdata = pdev->dev.platform_data;
	struct mdp_lcdc_info *lcdc;
	int ret = 0;
#ifdef CONFIG_MSM_MDP40
	struct mdp4_overlay_pipe *pipe;
	int ptype;
#endif

	if (!pdata) {
		PR_DISP_ERR("%s: no LCDC platform data found\n", __func__);
		return -EINVAL;
	}

	lcdc = kzalloc(sizeof(struct mdp_lcdc_info), GFP_KERNEL);
	if (!lcdc)
		return -ENOMEM;

	/* We don't actually own the clocks, the mdp does. */
	lcdc->mdp_clk = clk_get(mdp_dev->dev.parent, "mdp_clk");
	if (IS_ERR(lcdc->mdp_clk)) {
		PR_DISP_ERR("%s: failed to get mdp_clk\n", __func__);
		ret = PTR_ERR(lcdc->mdp_clk);
		goto err_get_mdp_clk;
	}

	lcdc->pclk = clk_get(mdp_dev->dev.parent, "lcdc_pclk_clk");
	if (IS_ERR(lcdc->pclk)) {
		PR_DISP_ERR("%s: failed to get lcdc_pclk\n", __func__);
		ret = PTR_ERR(lcdc->pclk);
		goto err_get_pclk;
	}

	lcdc->pad_pclk = clk_get(mdp_dev->dev.parent, "lcdc_pad_pclk_clk");
	if (IS_ERR(lcdc->pad_pclk)) {
		PR_DISP_ERR("%s: failed to get lcdc_pad_pclk\n", __func__);
		ret = PTR_ERR(lcdc->pad_pclk);
		goto err_get_pad_pclk;
	}

	init_waitqueue_head(&lcdc->vsync_waitq);
	lcdc->pdata = pdata;
	lcdc->frame_start_cb.func = lcdc_frame_start;

	platform_set_drvdata(pdev, lcdc);
#ifdef CONFIG_MSM_MDP40
	mdp_out_if_register(mdp_dev, MSM_LCDC_INTERFACE, lcdc, INTR_OVERLAY0_DONE,
			    lcdc_overlay_start);
#else
	mdp_out_if_register(mdp_dev, MSM_LCDC_INTERFACE, lcdc, MDP_DMA_P_DONE,
			    lcdc_dma_start);
#endif
	lcdc->mdp = container_of(mdp_dev, struct mdp_info, mdp_dev);
	precompute_timing_parms(lcdc);

	lcdc->fb_start = pdata->fb_resource->start;
	//lcdc->mdp = container_of(mdp_dev, struct mdp_info, mdp_dev);
	if(lcdc->mdp->mdp_dev.color_format)
		lcdc->color_format = lcdc->mdp->mdp_dev.color_format;
	else
		lcdc->color_format = MSM_MDP_OUT_IF_FMT_RGB565;

#ifdef CONFIG_MSM_MDP40
	if (lcdc_pipe == NULL) {
		ptype = mdp4_overlay_format2type(MDP_RGB_565);
		pipe = mdp4_overlay_pipe_alloc(ptype, false);
		if (!pipe)
			goto err_mdp4_overlay_pipe_alloc;
		pipe->mixer_stage  = MDP4_MIXER_STAGE_BASE;
		pipe->pipe_used = 1;
		pipe->mixer_num  = MDP4_MIXER0;
		pipe->src_format = MDP_RGB_565;
		mdp4_overlay_format2pipe(pipe);
		pipe->mdp = lcdc->mdp;

		lcdc_pipe = pipe; /* keep it */
	} else {
		pipe = lcdc_pipe;
	}

	pipe->src_height = pdata->fb_data->yres;
	pipe->src_width = pdata->fb_data->xres;
	pipe->src_h = pdata->fb_data->yres;
	pipe->src_w = pdata->fb_data->xres;
	pipe->src_y = 0;
	pipe->src_x = 0;
	pipe->srcp0_addr = (uint32_t) lcdc->fb_start;

	pipe->srcp0_ystride = pdata->fb_data->xres * 2;

	mdp4_overlay_rgb_setup(pipe);
	mdp4_mixer_stage_up(pipe);
#endif

	lcdc->fb_panel_data.suspend = lcdc_suspend;
	lcdc->fb_panel_data.resume = lcdc_resume;
	lcdc->fb_panel_data.wait_vsync = lcdc_wait_vsync;
	lcdc->fb_panel_data.request_vsync = lcdc_request_vsync;
	lcdc->fb_panel_data.clear_vsync = lcdc_clear_vsync;
	lcdc->fb_panel_data.blank = lcdc_blank;
	lcdc->fb_panel_data.unblank = lcdc_unblank;
	lcdc->fb_panel_data.fb_data = pdata->fb_data;
	lcdc->fb_panel_data.interface_type = MSM_LCDC_INTERFACE;
	lcdc->fb_panel_data.shutdown = lcdc_shutdown;
	ret = lcdc_hw_init(lcdc);
	if (ret) {
		PR_DISP_ERR("%s: Cannot initialize the mdp_lcdc\n", __func__);
		goto err_hw_init;
	}
	lcdc->fb_pdev.name = "msm_panel";
	lcdc->fb_pdev.id = pdata->fb_id;
	lcdc->fb_pdev.resource = pdata->fb_resource;
	lcdc->fb_pdev.num_resources = 1;
	lcdc->fb_pdev.dev.platform_data = &lcdc->fb_panel_data;


	ret = platform_device_register(&lcdc->fb_pdev);
	if (ret) {
		PR_DISP_ERR("%s: Cannot register msm_panel pdev\n", __func__);
		goto err_plat_dev_reg;
	}

	PR_DISP_INFO("%s: initialized\n", __func__);
#ifdef CONFIG_PANEL_SELF_REFRESH
	if (lcdc->mdp->mdp_dev.overrides & MSM_MDP_RGB_PANEL_SELE_REFRESH) {
		ret = icm_init(lcdc);
		if (ret) {
			PR_DISP_ERR("%s: Cannot init dispaly selfrefresh \n", __func__);
			goto err_plat_dev_reg;
		}
	}
#endif

	return 0;

err_plat_dev_reg:
err_hw_init:
#ifdef CONFIG_MSM_MDP40
err_mdp4_overlay_pipe_alloc:
#endif
	platform_set_drvdata(pdev, NULL);
	clk_put(lcdc->pad_pclk);
err_get_pad_pclk:
	clk_put(lcdc->pclk);
err_get_pclk:
	clk_put(lcdc->mdp_clk);
err_get_mdp_clk:
	kfree(lcdc);
	return ret;
}
Ejemplo n.º 2
0
/**
 * \brief Application entry point for ICM example.
 *
 * \return Unused (ANSI-C compatibility).
 */
int main(void)
{
	/* ICM configuration */
	struct icm_config icm_cfg;

	/* Initialize the SAM system */
	sysclk_init();
	board_init();
	sleepmgr_init();

	/* Initialize the console uart */
	configure_console();

	/* Output example information */
	printf("-- ICM Example --\r\n");
	printf("-- %s\n\r", BOARD_NAME);
	printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);

	/* ICM initialization */
	icm_cfg.is_write_back= false;
	icm_cfg.is_dis_end_mon = false;
	icm_cfg.is_sec_list_branch = false;
	icm_cfg.bbc = 0;
	icm_cfg.is_auto_mode = false;
	icm_cfg.is_dual_buf = false;
	icm_cfg.is_user_hash = false;
	icm_cfg.ualgo = ICM_SHA_1;
	icm_cfg.hash_area_val = 0;
	icm_cfg.des_area_val = 0;
	icm_init(ICM, &icm_cfg);

	/* Set region0 descriptor */
	reg_descriptor[0].start_addr = (uint32_t)message_sha_0;
	reg_descriptor[0].cfg.is_compare_mode = false;
	reg_descriptor[0].cfg.is_wrap = false;
	reg_descriptor[0].cfg.is_end_mon = false;
	reg_descriptor[0].cfg.reg_hash_int_en = false;
	reg_descriptor[0].cfg.dig_mis_int_en = false;
	reg_descriptor[0].cfg.bus_err_int_en = false;
	reg_descriptor[0].cfg.wrap_con_int_en = false;
	reg_descriptor[0].cfg.ebit_con_int_en = false;
	reg_descriptor[0].cfg.status_upt_con_int_en = false;
	reg_descriptor[0].cfg.is_pro_dly = false;
	reg_descriptor[0].cfg.mem_reg_val = 0;
	reg_descriptor[0].cfg.algo = ICM_SHA_1;
	reg_descriptor[0].tran_size = 0;
	reg_descriptor[0].next_addr = 0;

	/* Set region1 descriptor in main list */
	reg_descriptor[1].start_addr = (uint32_t)message_sha_1_main;
	reg_descriptor[1].cfg.is_compare_mode = false;
	reg_descriptor[1].cfg.is_wrap = false;
	reg_descriptor[1].cfg.is_end_mon = true;
	reg_descriptor[1].cfg.reg_hash_int_en = false;
	reg_descriptor[1].cfg.dig_mis_int_en = false;
	reg_descriptor[1].cfg.bus_err_int_en = false;
	reg_descriptor[1].cfg.wrap_con_int_en = false;
	reg_descriptor[1].cfg.ebit_con_int_en = false;
	reg_descriptor[1].cfg.status_upt_con_int_en = false;
	reg_descriptor[1].cfg.is_pro_dly = false;
	reg_descriptor[1].cfg.mem_reg_val = 0;
	reg_descriptor[1].cfg.algo = ICM_SHA_1;
	reg_descriptor[1].tran_size = 0;
	reg_descriptor[1].next_addr = &reg_descriptor_sec;

	/* Set region1 descriptor in secondary list */
	reg_descriptor_sec.start_addr = (uint32_t)message_sha_1_sec;
	reg_descriptor_sec.tran_size = 0;
	reg_descriptor_sec.next_addr = 0;

	/* Set region descriptor start address */
	icm_set_reg_des_addr(ICM, (uint32_t)&reg_descriptor[0]);

	/* Set hash area start address */
	icm_set_hash_area_addr(ICM, (uint32_t)output_sha);

	/* Enable ICM */
	icm_enable(ICM);

	delay_ms(200);

	/* Set region monitoring mode to compare mode */
	reg_descriptor[0].cfg.is_compare_mode = true;
	reg_descriptor[1].cfg.is_compare_mode = true;

	/* Set callback function for digest mismatch interrupt handler */
	icm_set_callback(ICM, reg_dig_mismatch_handler, ICM_REGION_NUM_0,
			ICM_INTERRUPT_RDM, 1);
	icm_set_callback(ICM, reg_dig_mismatch_handler, ICM_REGION_NUM_1,
			ICM_INTERRUPT_RDM, 1);

	/* Modify memory region value */
	message_sha_0[0] = 0x12345678;
	message_sha_1_sec[0] = 0x12345678;

	/* Enable ICM */
	icm_enable(ICM);

	while (1) {
	}
}