コード例 #1
0
void mipi_sony_panel_type_detect(struct mipi_panel_info *mipi)
{
	if (panel_type == PANEL_ID_PRIMODS_SONY) {
		PR_DISP_INFO("%s: panel_type=PANEL_ID_PRIMODS_SONY\n", __func__);
		strcat(ptype, "PANEL_ID_PRIMODS_SONY");

		mipi_power_on_cmd = primods_sony_cmd_on_cmds;
		mipi_power_on_cmd_size = ARRAY_SIZE(primods_sony_cmd_on_cmds);

		mipi_power_off_cmd = sony_display_off_cmds;
		mipi_power_off_cmd_size = ARRAY_SIZE(sony_display_off_cmds);
	} else if (panel_type == PANEL_ID_PRIMODD_SONY) {
		PR_DISP_INFO("%s: panel_type=PANEL_ID_PRIMODD_SONY\n", __func__);
		strcat(ptype, "PANEL_ID_PRIMODD_SONY");

		mipi_power_on_cmd = primods_sony_cmd_on_cmds;
		mipi_power_on_cmd_size = ARRAY_SIZE(primods_sony_cmd_on_cmds);

		mipi_power_off_cmd = sony_display_off_cmds;
		mipi_power_off_cmd_size = ARRAY_SIZE(sony_display_off_cmds);
	} else {
		printk(KERN_ERR "%s: panel_type=0x%x not support\n", __func__, panel_type);
		strcat(ptype, "PANEL_ID_NONE");
	}
	return;
}
コード例 #2
0
int mipi_dsi_cmd_reg_tx(uint32 data)
{
#ifdef DSI_HOST_DEBUG
    int i;
    char *bp;

    bp = (char *)&data;
    PR_DISP_INFO("%s: ", __func__);
    for (i = 0; i < 4; i++)
        PR_DISP_INFO("%x ", *bp++);

    PR_DISP_INFO("\n");
#endif

    MIPI_OUTP(MIPI_DSI_BASE + 0x0080, 0x04);/* sw trigger */
    MIPI_OUTP(MIPI_DSI_BASE + 0x0, 0x135);

    wmb();

    MIPI_OUTP(MIPI_DSI_BASE + 0x038, data);
    wmb();
    MIPI_OUTP(MIPI_DSI_BASE + 0x08c, 0x01);	/* trigger */
    wmb();

    udelay(300);

    return 4;
}
コード例 #3
0
/*
TODO:
1.find a better way to handle msm_fb_resources, to avoid passing it across file.
2.error handling
 */
int __init golfu_init_panel(void)
{
	int ret = 0;
	if ((panel_type == PANEL_ID_PIO_SAMSUNG) ||
		(panel_type == PANEL_ID_PIO_SAMSUNG_C2))

		mipi_dsi_cmd_hvga_panel_device.name = "mipi_samsung";

	else if (panel_type == PANEL_ID_GOLFU_AUO ||
			panel_type == PANEL_ID_GOLFU_AUO_C2 ||
			panel_type == PANEL_ID_GOLFU_AUO_C3 ||
			panel_type == PANEL_ID_GOLFU_AUO_C4)
		mipi_dsi_cmd_hvga_panel_device.name = "mipi_orise";
	else
		golfu_panel_power(0);

	PR_DISP_INFO("panel_type= 0x%x\n", panel_type);
	PR_DISP_INFO("%s: %s\n", __func__, mipi_dsi_cmd_hvga_panel_device.name);

	mipi_golfu_panel_data.shrink_pwm = golfu_shrink_pwm;


	ret = platform_device_register(&msm_fb_device);
	ret = platform_device_register(&mipi_dsi_cmd_hvga_panel_device);

	msm_fb_add_devices();

	return 0;
}
コード例 #4
0
static int __init deluxe_j_panel_init(void)
{
	int ret;

	if(panel_type == PANEL_ID_NONE)	{
		PR_DISP_INFO("%s panel ID = PANEL_ID_NONE\n", __func__);
		return 0;
	}

	ret = i2c_add_driver(&pwm_i2c_driver);

	if (ret)
		pr_err(KERN_ERR "%s: failed to add i2c driver\n", __func__);

	mipi_dsi_buf_alloc(&deluxe_j_panel_tx_buf, DSI_BUF_SIZE);
	mipi_dsi_buf_alloc(&deluxe_j_panel_rx_buf, DSI_BUF_SIZE);

	if (panel_type == PANEL_ID_DLXJ_SHARP_RENESAS) {
		mipi_video_sharp_init();
		PR_DISP_INFO("%s panel ID = PANEL_ID_DLXJ_SHARP_RENESAS\n", __func__);
	} else if (panel_type == PANEL_ID_DLXJ_SONY_RENESAS) {
		mipi_video_sony_init();
		PR_DISP_INFO("%s panel ID = PANEL_ID_DLXJ_SONY_RENESAS\n", __func__);
	} else {
		PR_DISP_ERR("%s: panel not supported!!\n", __func__);
		return -ENODEV;
	}

	PR_DISP_INFO("%s\n", __func__);

	return platform_driver_register(&this_driver);
}
static int __init impression_j_panel_init(void)
{

	if(panel_type == PANEL_ID_NONE)	{
		PR_DISP_INFO("%s panel ID = PANEL_ID_NONE\n", __func__);
		return 0;
	}

	mipi_dsi_buf_alloc(&impression_j_panel_tx_buf, DSI_BUF_SIZE);
	mipi_dsi_buf_alloc(&impression_j_panel_rx_buf, DSI_BUF_SIZE);

	if (panel_type == PANEL_ID_IMN_SHARP_HX) {
		mipi_cmd_sharp_init();
		PR_DISP_INFO("%s panel ID = PANEL_ID_IMN_SHARP_HX\n", __func__);
	} else if (panel_type == PANEL_ID_IMN_SHARP_NT) {
		mipi_video_sharp_nt_720p_pt_init();
		PR_DISP_INFO("%s panel ID = PANEL_ID_IMN_SHARP_NT\n", __func__);

	} else {
		PR_DISP_ERR("%s: panel not supported!!\n", __func__);
		return -ENODEV;
	}

	PR_DISP_INFO("%s\n", __func__);

	return platform_driver_register(&this_driver);
}
コード例 #6
0
static int ville_samsung_acl_enable(int on, struct msm_fb_data_type *mfd)
{
	static int first_time = 1;
	static unsigned long last_autobkl_stat = 0, cur_autobkl_stat = 0;

	
	if(cur_bl_level > 245)
		cur_autobkl_stat = 8;
	else
		cur_autobkl_stat = on;

	if(cur_autobkl_stat == last_autobkl_stat)
		return 0;

	last_autobkl_stat = cur_autobkl_stat;

	if (cur_autobkl_stat == 8 && !first_time) {
		if (panel_type == PANEL_ID_VILLE_SAMSUNG_SG || panel_type == PANEL_ID_VILLE_SAMSUNG_SG_C2) {
			mipi_dsi_cmds_tx(&ville_panel_tx_buf, samsung_acl_off_cmd,
				ARRAY_SIZE(samsung_acl_off_cmd));
			acl_enable = 0;
			PR_DISP_INFO("%s acl disable", __func__);
		}
	} else if (cur_autobkl_stat == 12) {
		if (panel_type == PANEL_ID_VILLE_SAMSUNG_SG || panel_type == PANEL_ID_VILLE_SAMSUNG_SG_C2) {
			mipi_dsi_cmds_tx(&ville_panel_tx_buf, samsung_acl_on_cmd,
				ARRAY_SIZE(samsung_acl_on_cmd));
			acl_enable = 1;
			PR_DISP_INFO("%s acl enable", __func__);
		}
	}
	first_time = 0;

	return 0;
}
コード例 #7
0
void mipi_samsung_panel_type_detect(struct mipi_panel_info *mipi)
{
	if (panel_type == PANEL_ID_PIO_SAMSUNG) {
		PR_DISP_INFO("%s: panel_type=PANEL_ID_PIO_SAMSUNG\n", __func__);
		strcat(ptype, "PANEL_ID_PIO_SAMSUNG");
		if (mipi->mode == DSI_VIDEO_MODE) {
			mipi_power_on_cmd = pico_samsung_cmd_on_cmds;
			mipi_power_on_cmd_size = ARRAY_SIZE(pico_samsung_cmd_on_cmds);
		} else {
			mipi_power_on_cmd = pico_samsung_cmd_on_cmds;
			mipi_power_on_cmd_size = ARRAY_SIZE(pico_samsung_cmd_on_cmds);
		}
		mipi_power_off_cmd = samsung_display_off_cmds;
		mipi_power_off_cmd_size = ARRAY_SIZE(samsung_display_off_cmds);
	} else if (panel_type == PANEL_ID_PIO_SAMSUNG_C2) {
		PR_DISP_INFO("%s: panel_type=PANEL_ID_PIO_SAMSUNG_C2\n", __func__);
		strcat(ptype, "PANEL_ID_PIO_SAMSUNG_C2");
		if (mipi->mode == DSI_VIDEO_MODE) {
			mipi_power_on_cmd = pico_samsung_C2_cmd_on_cmds;
			mipi_power_on_cmd_size = ARRAY_SIZE(pico_samsung_C2_cmd_on_cmds);
		} else {
			mipi_power_on_cmd = pico_samsung_C2_cmd_on_cmds;
			mipi_power_on_cmd_size = ARRAY_SIZE(pico_samsung_C2_cmd_on_cmds);
		}
		mipi_power_off_cmd = samsung_display_off_cmds;
		mipi_power_off_cmd_size = ARRAY_SIZE(samsung_display_off_cmds);
	} else {
		printk(KERN_ERR "%s: panel_type=0x%x not support\n", __func__, panel_type);
		strcat(ptype, "PANEL_ID_NONE");
	}
	return;
}
コード例 #8
0
static int deluxe_j_detect_panel(const char *name)
{
#if 0
	if (panel_type == PANEL_ID_DLX_SONY_RENESAS) {
		if (!strncmp(name, MIPI_RENESAS_PANEL_NAME,
			strnlen(MIPI_RENESAS_PANEL_NAME,
				PANEL_NAME_MAX_LEN))){
			PR_DISP_INFO("deluxe_j_%s\n", name);
			return 0;
		}
	} else if (panel_type == PANEL_ID_DLX_SHARP_RENESAS) {
		if (!strncmp(name, MIPI_RENESAS_PANEL_NAME,
			strnlen(MIPI_RENESAS_PANEL_NAME,
				PANEL_NAME_MAX_LEN))){
			PR_DISP_INFO("deluxe_j_%s\n", name);
			return 0;
		}
	}
#endif
	if (!strncmp(name, HDMI_PANEL_NAME,
		strnlen(HDMI_PANEL_NAME,
			PANEL_NAME_MAX_LEN)))
		return 0;

	return -ENODEV;
}
コード例 #9
0
static int lcdc_off(struct platform_device *pdev)
{
	int ret = 0;
	struct msm_fb_data_type *mfd;

	PR_DISP_INFO("+ %s\n", __func__);
	mfd = platform_get_drvdata(pdev);
	ret = panel_next_off(pdev);

	clk_disable(pixel_mdp_clk);
	clk_disable(pixel_lcdc_clk);

	if (lcdc_pdata && lcdc_pdata->lcdc_power_save)
		lcdc_pdata->lcdc_power_save(0);

	if (lcdc_pdata && lcdc_pdata->lcdc_gpio_config)
		ret = lcdc_pdata->lcdc_gpio_config(0);

#ifndef CONFIG_MSM_BUS_SCALING
	if (mfd->ebi1_clk)
		clk_disable(mfd->ebi1_clk);
#else
	mdp_bus_scale_update_request(0);
#endif
	PR_DISP_INFO("- %s\n", __func__);
	return ret;
}
コード例 #10
0
static int htc_hiaaero_panel_power_on(struct mdss_panel_data *pdata, int enable)
{
	int ret;

	struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
	struct dsi_power_data *pwrdata = NULL;

	PR_DISP_INFO("%s: en=%d\n", __func__, enable);
	if (pdata == NULL) {
		PR_DISP_ERR("%s: Invalid input data\n", __func__);
		return -EINVAL;
	}

	ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data);
	pwrdata = ctrl_pdata->dsi_pwrctrl_data;

	if (!pwrdata) {
		PR_DISP_ERR("%s: pwrdata not initialized\n", __func__);
		return -EINVAL;
	}

	if (enable) {
		
		ret = regulator_set_optimum_mode(pwrdata->vci, 100000);
		if (ret < 0) {
			PR_DISP_ERR("%s: vdda set opt mode failed.\n",
				__func__);
			return ret;
		}
		ret = regulator_enable(pwrdata->vci);
		if (ret) {
			PR_DISP_ERR("%s: Failed to enable regulator.\n",__func__);
			return ret;
		}
		usleep_range(1000,1500);
		
		gpio_set_value(pwrdata->vdd1v8, 1);
	} else {
		
		gpio_set_value(pwrdata->vdd1v8, 0);
		
		
		ret = regulator_disable(pwrdata->vci);
		if (ret) {
			PR_DISP_ERR("%s: Failed to disable vdda regulator.\n",
				__func__);
			return ret;
		}
		ret = regulator_set_optimum_mode(pwrdata->vci, 100);
		if (ret < 0) {
			PR_DISP_ERR("%s: vddpll_vreg set opt mode failed.\n",
				__func__);
			return ret;
		}
	}
	PR_DISP_INFO("%s: en=%d done\n", __func__, enable);

	return 0;
}
コード例 #11
0
static int lcdc_on(struct platform_device *pdev)
{
	int ret = 0;
	struct msm_fb_data_type *mfd;
	unsigned long panel_pixclock_freq = 0;
#ifndef CONFIG_MSM_BUS_SCALING
	unsigned long pm_qos_rate;
#endif
	PR_DISP_INFO("+ %s\n", __func__);
	mfd = platform_get_drvdata(pdev);

	if (lcdc_pdata && lcdc_pdata->lcdc_get_clk)
		panel_pixclock_freq = lcdc_pdata->lcdc_get_clk();

	if (!panel_pixclock_freq)
		panel_pixclock_freq = mfd->fbi->var.pixclock;
#ifdef CONFIG_MSM_BUS_SCALING
	mdp_bus_scale_update_request(2);
#else
#ifdef CONFIG_MSM_NPA_SYSTEM_BUS
	pm_qos_rate = MSM_AXI_FLOW_MDP_LCDC_WVGA_2BPP;
#else
	if (panel_pixclock_freq > 65000000)
		/* pm_qos_rate should be in Khz */
		pm_qos_rate = panel_pixclock_freq / 1000 ;
	else
		pm_qos_rate = 65000;
#endif

	if (mfd->ebi1_clk) {
		clk_set_rate(mfd->ebi1_clk, pm_qos_rate * 1000);
		clk_enable(mfd->ebi1_clk);
	}
#endif
	mfd = platform_get_drvdata(pdev);

	mfd->fbi->var.pixclock = clk_round_rate(pixel_mdp_clk,
					mfd->fbi->var.pixclock);
	ret = clk_set_rate(pixel_mdp_clk, mfd->fbi->var.pixclock);
	if (ret) {
		pr_err("%s: Can't set MDP LCDC pixel clock to rate %u\n",
			__func__, mfd->fbi->var.pixclock);
		goto out;
	}

	clk_enable(pixel_mdp_clk);
	clk_enable(pixel_lcdc_clk);

	if (lcdc_pdata && lcdc_pdata->lcdc_power_save)
		lcdc_pdata->lcdc_power_save(1);
	if (lcdc_pdata && lcdc_pdata->lcdc_gpio_config)
		ret = lcdc_pdata->lcdc_gpio_config(1);

	ret = panel_next_on(pdev);

out:
	PR_DISP_INFO("- %s\n", __func__);
	return ret;
}
コード例 #12
0
/*
 * mutex need to be acquired by caller
 */
void mipi_dsi_controller_cfg(int enable, int cmd, int video)
{

    uint32 dsi_ctrl;
    uint32 status, mask;
    int cnt;

    mask = 0x02;		/* CMD_MODE_DMA_BUSY */

    if (!cmd || !video) {
        if (cmd)
            mask |= 0x08; /* VIDEO_MODE_ENGINE_BUSY */
        else
            mask |= 0x04; /* CMD_MODE_MDP_BUSY */
    }

    cnt = 16;
    while (cnt--) {
        status = MIPI_INP(MIPI_DSI_BASE + 0x0004);
        status &= mask;
        if (status == 0)
            break;
        usleep(1000);
    }
    if (cnt == 0)
        PR_DISP_INFO("%s: DSI status=%x failed\n", __func__, status);

    cnt = 16;
    while (cnt--) {
        status = MIPI_INP(MIPI_DSI_BASE + 0x0008);
        status &= 0x11111000;	/* x_HS_FIFO_EMPTY */
        if (status == 0x11111000)	/* all empty */
            break;
        usleep(1000);
    }

    if (cnt == 0)
        PR_DISP_INFO("%s: FIFO status=%x failed\n", __func__, status);

    dsi_ctrl = MIPI_INP(MIPI_DSI_BASE + 0x0000);
    if (enable)
        dsi_ctrl |= 0x01;
    else
        dsi_ctrl &= ~0x01;

    if (cmd && video) {
        dsi_ctrl |= 0x06;
    } else if (cmd) {
        dsi_ctrl &= ~0x02;
        dsi_ctrl |= 0x04;
    } else if (video) {
        dsi_ctrl &= ~0x04;
        dsi_ctrl |= 0x02;
    }

    MIPI_OUTP(MIPI_DSI_BASE + 0x0000, dsi_ctrl);
    wmb();
}
コード例 #13
0
int mdp_dsi_video_off(struct platform_device *pdev)
{
	int ret = 0;
	int retry_cnt = 0;
	struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)platform_get_drvdata(pdev);
	PR_DISP_INFO("%s\n", __func__);

	if (panel_type == PANEL_ID_PROTOU_LG || panel_type == PANEL_ID_PROTODCG_LG) {
		if(!mfd) {
			PR_DISP_ERR("mdp_dsi_video_off: mfd is NULL\n");
			return -ENODEV;
		}

		do {
			memset(mfd->fbi->screen_base, 0x00, mfd->fbi->fix.smem_len);
			hr_msleep(80);

#ifdef CONFIG_MACH_DUMMY
			ret = protodcg_lcd_off2(pdev);
#elif defined CONFIG_MACH_PROTOU
			ret = protou_lcd_off2(pdev);
#else
#endif

			if (ret < 0) {
				panel_next_off(pdev);
				hr_msleep(2);
				panel_next_on(pdev);
				hr_msleep(5);
				retry_cnt++;
			} else {
				ret = 0;
				break;
			}
		} while (retry_cnt < 10);
		PR_DISP_INFO("%s : mipi_lg_lcd_off retry_cnt = %d\n", __func__, retry_cnt);
		hr_msleep(20);
	}

	mdp_histogram_ctrl_all(FALSE);
	
	mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
	MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 0);
	
	mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
	
	mdp_pipe_ctrl(MDP_DMA2_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);

	ret = panel_next_off(pdev);

	atomic_set(&vsync_cntrl.suspend, 1);
	atomic_set(&vsync_cntrl.vsync_resume, 0);
	complete_all(&vsync_cntrl.vsync_wait);
	
	msleep(20);

	return ret;
}
コード例 #14
0
// -----------------------------------------------------------------------------
//                         Common Routine Implementation
// -----------------------------------------------------------------------------
static int mipi_himax_lcd_on(struct platform_device *pdev)
{
	struct msm_fb_data_type *mfd;
	struct mipi_panel_info *mipi;

	mfd = platform_get_drvdata(pdev);
	if (!mfd)
		return -ENODEV;
	if (mfd->key != MFD_KEY)
		return -EINVAL;

	mipi  = &mfd->panel_info.mipi;
	if (panel_type == PANEL_ID_VIG_SHARP_HX_C2)
		PR_DISP_INFO("Panel type = PANEL_ID_VIG_SHARP_HX_C2\n");
	else if (panel_type == PANEL_ID_VIG_SHARP_HX)
		PR_DISP_INFO("Panel type = PANEL_ID_VIG_SHARP_HX\n");
	else if (panel_type == PANEL_ID_VIG_CHIMEI_HX)
		PR_DISP_INFO("Panel type = PANEL_ID_VIG_CHIMEI_HX\n");





	mutex_lock(&cmdlock);
	if (mipi->mode == DSI_VIDEO_MODE) {
		PR_DISP_INFO("DSI_VIDEO_MODE.%s",__func__);
		if (panel_type == PANEL_ID_VIG_CHIMEI_HX)
		{
			mipi_dsi_cmds_tx(&himax_tx_buf, himax_CMI_video_on_cmds,
				ARRAY_SIZE(himax_CMI_video_on_cmds));
		}else
		{
			mipi_dsi_cmds_tx(&himax_tx_buf, himax_video_on_cmds,
				ARRAY_SIZE(himax_video_on_cmds));
		}
         } else {
		PR_DISP_INFO("DSI_CMD_MODE.%s",__func__);
		if (panel_type == PANEL_ID_VIG_CHIMEI_HX)
		{
			mipi_dsi_cmds_tx(&himax_tx_buf, himax_CMI_cmd_on_cmds,
				ARRAY_SIZE(himax_CMI_cmd_on_cmds));
		}else
		{
			mipi_dsi_cmds_tx(&himax_tx_buf, himax_cmd_on_cmds,
				ARRAY_SIZE(himax_cmd_on_cmds));
		}

		mipi_dsi_cmd_bta_sw_trigger();
		mipi_himax_manufacture_id();
	}
	mutex_unlock(&cmdlock);
	return 0;
}
コード例 #15
0
static  int mdp4_dsi_video_do_blt(struct msm_fb_data_type *mfd, int enable)
{
	unsigned long flag;
	unsigned int data;
	int change = 0;
	void mdp4_overlay_dsi_video_wait4dmap(struct msm_fb_data_type *mfd);

	PR_DISP_INFO("%s: enable=%d addr=%x base=%x\n", __func__, enable, (int)dsi_pipe->blt_addr, (int)dsi_pipe->blt_base);

	spin_lock_irqsave(&mdp_spin_lock, flag);
	if (enable && dsi_pipe->blt_addr == 0) {
		dsi_pipe->blt_addr = dsi_pipe->blt_base;
		change++;
	} else if (enable == 0 && dsi_pipe->blt_addr) {
		dsi_pipe->blt_addr = 0;
		change++;
	}
	dsi_pipe->blt_cnt = 0;
	spin_unlock_irqrestore(&mdp_spin_lock, flag);

	if (!change)
		return 0;

	mutex_lock(&cmdlock);
	PR_DISP_INFO("%s: start\n", __func__);
	data = inpdw(MDP_BASE + DSI_VIDEO_BASE);
	data &= 0x01;
	if (data) {		/* timing generator enabled */
		mdp4_overlay_dsi_video_wait4dmap(mfd);
		MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 0);
		mdelay(17);	/* make sure last frame is finished */
		mipi_dsi_controller_cfg(0, 0, 0);
	}

	mdp4_overlayproc_cfg(dsi_pipe);
	mdp4_overlay_dmap_xy(dsi_pipe);

	if (data) {		/* timing generator enabled */
		MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 1);
		mdp4_overlay_dsi_video_wait4dmap(mfd);
		mdp4_overlay_dsi_video_wait4dmap(mfd);
		MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 0);
		mipi_dsi_sw_reset();
		mipi_dsi_controller_cfg(1, 0, 0);
		MDP_OUTP(MDP_BASE + DSI_VIDEO_BASE, 1);
	}
	PR_DISP_INFO("%s: done\n", __func__);
	mutex_unlock(&cmdlock);


	return 0;
}
コード例 #16
0
static void mdp4_dsi_overlay_busy_wait(struct msm_fb_data_type *mfd)
{
    unsigned long flag;
    int need_wait = 0;
#if 1 /* HTC_CSP_START */
    int retry_count = 0;
    long timeout;
#endif /* HTC_CSP_END */

    spin_lock_irqsave(&mdp_spin_lock, flag);
    if (mfd->dma->busy == TRUE) {
        INIT_COMPLETION(mfd->dma->comp);
        need_wait++;
    }
    spin_unlock_irqrestore(&mdp_spin_lock, flag);
    if (need_wait) {
#if 1 /* HTC_CSP_START */
        mdp4_stat.busywait1++;
        timeout = wait_for_completion_timeout(&mfd->dma->comp, HZ/5);
        mdp4_stat.busywait1--;
        while (!timeout && retry_count++ < 15) {
            rmb();
            if (mfd->dma->busy == FALSE) {
                PR_DISP_INFO("%s(%d)timeout but dma not busy now\n", __func__, __LINE__);
                break;
            } else {
                PR_DISP_INFO("%s(%d)timeout but dma still busy\n", __func__, __LINE__);
                PR_DISP_INFO("### need_wait:%d pending pid=%d dsi_clk_on=%d\n", need_wait, current->pid, mipi_dsi_clk_on);

                mdp4_dump_status();

                mdp4_stat.busywait1++;
                timeout = wait_for_completion_timeout(&mfd->dma->comp, HZ/5);
                mdp4_stat.busywait1--;
            }
        }

        if (retry_count >= 15) {
            PR_DISP_INFO("###mdp busy wait retry timed out, mfd->dma->busy:%d\n",  mfd->dma->busy);
            spin_lock_irqsave(&mdp_spin_lock, flag);
            mfd->dma->busy = FALSE;
            spin_unlock_irqrestore(&mdp_spin_lock, flag);
        }
#else /* HTC_CSP_END */
        mdp4_stat.busywait1++;
        wait_for_completion(&mfd->dma->comp);
        mdp4_stat.busywait1--;
#endif
    }
}
コード例 #17
0
static int protou_lcd_on(struct platform_device *pdev)
{
	struct msm_fb_data_type *mfd;
	struct msm_fb_panel_data *pdata = NULL;
	struct mipi_panel_info *mipi;

	mfd = platform_get_drvdata(pdev);
	if (!mfd)
		return -ENODEV;
	pdata = (struct msm_fb_panel_data *)mfd->pdev->dev.platform_data;

	if (mfd->key != MFD_KEY)
		return -EINVAL;

	mipi  = &mfd->panel_info.mipi;

	if (mfd->init_mipi_lcd == 0) {
		PR_DISP_INFO("Display On - 1st time\n");

		if (panel_type == PANEL_ID_PROTOU_SHARP || panel_type == PANEL_ID_PROTOU_SHARP_C1)
			mipi_dsi_cmds_tx(mfd, &protou_panel_tx_buf, protou_power_on_cmd,
					protou_power_on_cmd_size);

		mfd->init_mipi_lcd = 1;

	} else {
		PR_DISP_INFO("Display On \n");
		if (panel_type != PANEL_ID_NONE) {
			PR_DISP_INFO("%s\n", ptype);

			htc_mdp_sem_down(current, &mfd->dma->mutex);
			mipi_dsi_cmds_tx(mfd, &protou_panel_tx_buf, protou_power_on_cmd,
				protou_power_on_cmd_size);
			htc_mdp_sem_up(&mfd->dma->mutex);
#if 0 /* mipi read command verify */
			/* clean up ack_err_status */
			mdelay(1000);
			mipi_dsi_cmd_bta_sw_trigger();
			protou_manufacture_id(mfd);
#endif
		} else {
			printk(KERN_ERR "panel_type=0x%x not support at power on\n", panel_type);
			return -EINVAL;
		}
	}
	PR_DISP_DEBUG("Init done!\n");

	return 0;
}
コード例 #18
0
int mipi_dsi_cmd_dma_tx(struct dsi_buf *tp)
{
    int len;
    long timeout;

#ifdef DSI_HOST_DEBUG
    int i;
    char *bp;

    bp = tp->data;

    PR_DISP_INFO("%s: ", __func__);
    for (i = 0; i < tp->len; i++)
        PR_DISP_INFO("%x ", *bp++);

    PR_DISP_INFO("\n");
#endif

    len = tp->len;
    len += 3;
    len &= ~0x03;	/* multipled by 4 */

    tp->dmap = dma_map_single(&dsi_dev, tp->data, len, DMA_TO_DEVICE);
    if (dma_mapping_error(&dsi_dev, tp->dmap))
        PR_DISP_ERR("%s: dmap mapp failed\n", __func__);

    INIT_COMPLETION(dsi_dma_comp);

    MIPI_OUTP(MIPI_DSI_BASE + 0x044, tp->dmap);
    MIPI_OUTP(MIPI_DSI_BASE + 0x048, len);
    wmb();
    MIPI_OUTP(MIPI_DSI_BASE + 0x08c, 0x01);	/* trigger */
    wmb();

    timeout = wait_for_completion_timeout(&dsi_dma_comp, HZ/10);

    if (!timeout) {
        u32 isr = MIPI_INP(MIPI_DSI_BASE + 0x010c);
        MIPI_OUTP(MIPI_DSI_BASE + 0x010c, isr);
        PR_DISP_ERR("%s timeout, isr=0x%08x\n", __func__, isr);
        mipi_dsi_read_status_reg();
        mipi_dsi_sw_reset();
        atomic_set(&need_soft_reset, 1);
    }

    dma_unmap_single(&dsi_dev, tp->dmap, len, DMA_TO_DEVICE);
    tp->dmap = 0;
    return tp->len;
}
コード例 #19
0
static int lcdc_resume(struct msm_panel_data *fb_panel)
{
	struct mdp_lcdc_info *lcdc = panel_to_lcdc(fb_panel);
	struct msm_lcdc_panel_ops *panel_ops = lcdc->pdata->panel_ops;

	PR_DISP_INFO("%s: resuming\n", __func__);

	if (panel_ops->init) {
		if (panel_ops->init(panel_ops) < 0)
			PR_DISP_ERR("LCD init fail!\n");
	}

	clk_enable(lcdc->mdp_clk);
	clk_enable(lcdc->pclk);
	clk_enable(lcdc->pad_pclk);
#if defined(CONFIG_ARCH_MSM7227)
	writel(0x1, LCDC_MUX_CTL);
	D("resume_lcdc_mux_ctl = %x\n", readl(LCDC_MUX_CTL));
#endif

	mdp_writel(lcdc->mdp, 1, MDP_LCDC_EN);
#ifdef CONFIG_PANEL_SELF_REFRESH
	if (lcdc->mdp->mdp_dev.overrides & MSM_MDP_RGB_PANEL_SELE_REFRESH) {
		mutex_lock(&panel_icm->icm_lock);
		panel_icm->icm_doable = true;
		panel_icm->clock_enabled = true;
		panel_icm->icm_suspend = false;
		mutex_unlock(&panel_icm->icm_lock);
	}
#endif

	return 0;
}
コード例 #20
0
ファイル: shooter_u-panel.c プロジェクト: anryl/shooteru_HTC
static ssize_t store_3D_mode(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	enum MODE_3D val = buf[0] - '0';

	if (val < 0 || val >= BARRIER_END) {
		pr_err("%s: unsupport value %c\n", __func__, val);
		return -EINVAL;
	}

	if (val == atomic_read(&g_3D_mode)) {
		printk(KERN_NOTICE "%s: status is same(%d)\n", __func__, val);
		return count;
	}

	atomic_set(&g_3D_mode, val);
	PR_DISP_INFO("%s mode = %d\n", __func__, val);
	switch (val) {
	case BARRIER_OFF:
		shooter_u_3Dpanel_off();
		break;
	case BARRIER_LANDSCAPE:
		shooter_u_3Dpanel_on(true);
		break;
	case BARRIER_PORTRAIT:
		shooter_u_3Dpanel_on(false);
		break;
	default:
		break;
	}

	return count;
}
コード例 #21
0
ファイル: shooter_u-panel.c プロジェクト: anryl/shooteru_HTC
int shooter_u_mdp_gamma(void)
{
	PR_DISP_INFO("%s\n", __func__);
	mdp4_dsi_color_enhancement(mdp_sharp_barrier_off, ARRAY_SIZE(mdp_sharp_barrier_off));

	return 0;
}
コード例 #22
0
ファイル: shooter_u-panel.c プロジェクト: anryl/shooteru_HTC
int shooter_u_mdp_color_enhance(void)
{
	PR_DISP_INFO("%s\n", __func__);
	/* mdp4_dsi_color_enhancement(shooter_u_color_v11, ARRAY_SIZE(shooter_u_color_v11)); */

	return 0;
}
コード例 #23
0
static void ville_display_on(struct msm_fb_data_type *mfd)
{
	printk(KERN_INFO "%s ++\n", __func__);
	mutex_lock(&mfd->dma->ov_mutex);



	if (mfd->panel_info.type == MIPI_CMD_PANEL) {
		mdp4_dsi_cmd_dma_busy_wait(mfd);
		mdp4_dsi_blt_dmap_busy_wait(mfd);
		mipi_dsi_mdp_busy_wait(mfd);
	}

	if (panel_type == PANEL_ID_VILLE_SAMSUNG_SG || panel_type == PANEL_ID_VILLE_SAMSUNG_SG_C2)
		mipi_dsi_cmds_tx(mfd, &ville_panel_tx_buf, samsung_display_on_cmds,
			ARRAY_SIZE(samsung_display_on_cmds));
	else if (panel_type == PANEL_ID_VILLE_AUO)
		mipi_dsi_cmds_tx(mfd, &ville_panel_tx_buf, samsung_display_on_cmds,
			ARRAY_SIZE(auo_display_on_cmds));

	cur_bl_level = 0;

	if (acl_enable) {
		mipi_dsi_cmds_tx(mfd, &ville_panel_tx_buf, samsung_acl_on_cmd,
			ARRAY_SIZE(samsung_acl_on_cmd));
		acl_enable = 1;
		PR_DISP_INFO("%s acl enable", __func__);
	}
	mutex_unlock(&mfd->dma->ov_mutex);
	printk(KERN_INFO "%s --\n", __func__);
}
コード例 #24
0
int mdp4_dtv_off(struct platform_device *pdev)
{
	int ret = 0;

	ret = panel_next_off(pdev);

	/* disable DTV block */
	mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
	MDP_OUTP(MDP_BASE + DTV_BASE, 0);
	mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);

	mdp_pipe_ctrl(MDP_OVERLAY1_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);

	/* delay to make sure the last frame finishes */
	msleep(100);

	/* We also delay to turn writeback mode off after new overlay_set finishes */
	atomic_set(&mdp_dtv_on, false);

	PR_DISP_INFO("%s\n", __func__);

	/* dis-engage rgb2 from mixer1 */
	if (dtv_pipe)
		mdp4_mixer_stage_down(dtv_pipe);

	return ret;
}
コード例 #25
0
static void golfu_panel_power(int on)
{

	PR_DISP_INFO("%s: power %s.\n", __func__, on ? "on" : "off");

	if (on) {
		gpio_set_value(GOLFU_GPIO_LCD_RST_N, 1);
		hr_msleep(1);
		gpio_set_value(GOLFU_GPIO_LCM_1v8_EN, 1);
		hr_msleep(5);
		gpio_set_value(GOLFU_GPIO_LCM_2v85_EN, 1);
		hr_msleep(1);
		gpio_set_value(GOLFU_GPIO_LCD_RST_N, 1);
		hr_msleep(1);
		gpio_set_value(GOLFU_GPIO_LCD_RST_N, 0);
		udelay(50);
		gpio_set_value(GOLFU_GPIO_LCD_RST_N, 1);
		udelay(50);
	} else {
		gpio_set_value(GOLFU_GPIO_LCM_2v85_EN, 0);

		gpio_set_value(GOLFU_GPIO_LCM_1v8_EN, 0);
		hr_msleep(300);
		gpio_set_value(GOLFU_GPIO_LCD_RST_N, 0);
	}
}
コード例 #26
0
static int mipi_dsi_set_backlight(struct msm_fb_data_type *mfd)
{
	struct mipi_panel_info *mipi;
	mutex_lock(&cmdlock);
	mipi  = &mfd->panel_info.mipi;
	PR_DISP_INFO("%s+:bl=%d status=%d\n", __func__, mfd->bl_level, mipi_status);
	if (mipi_status == 0)
		goto end;
	if (mipi_himax_pdata && mipi_himax_pdata->shrink_pwm)
		led_pwm1[1] = mipi_himax_pdata->shrink_pwm(mfd->bl_level);
	else
		led_pwm1[1] = (unsigned char)(mfd->bl_level);

	if(mfd->bl_level == 0 || board_mfg_mode() == 4 || board_mfg_mode() == 5)
		led_pwm1[1] = 0;

	if (mipi->mode == DSI_VIDEO_MODE) {
		mipi_dsi_cmds_tx(&himax_tx_buf, himax_cmd_backlight_cmds,
			ARRAY_SIZE(himax_cmd_backlight_cmds));
	} else {
		mipi_dsi_op_mode_config(DSI_CMD_MODE);
		mipi_dsi_cmds_tx(&himax_tx_buf, himax_cmd_backlight_cmds,
			ARRAY_SIZE(himax_cmd_backlight_cmds));
	}
	bl_level_prevset = mfd->bl_level;
end:
	mutex_unlock(&cmdlock);
	return 0;
}
コード例 #27
0
static void icm_force_leave(void)
{
	struct msm_lcdc_panel_ops *panel_ops;
	unsigned long irq_flags = 0;

	panel_ops = panel_icm->lcdc->pdata->panel_ops;

	mutex_lock(&panel_icm->icm_lock);
	ICM_DBG("Force Leave ICM: icm_mode=%d icm_doable=%d \n", panel_icm->icm_mode, panel_icm->icm_doable);
	if (panel_icm->icm_mode == true) {
		clk_enable(panel_icm->lcdc->mdp_clk);
		clk_enable(panel_icm->lcdc->pclk);
		clk_enable(panel_icm->lcdc->pad_pclk);
		mdp_writel(panel_icm->lcdc->mdp, 1, MDP_LCDC_EN);
		panel_icm->clock_enabled = true;
		if (panel_ops->refresh_disable)
			panel_ops->refresh_disable(panel_ops);
		panel_icm->icm_mode = false;
		panel_icm->icm_doable = true;
                PR_DISP_INFO("ForceLeaveICM: leave ICM MODE done !!!\n");
	}
	spin_lock_irqsave(&panel_icm->lock, irq_flags);
        panel_icm->panel_update = 0;
        spin_unlock_irqrestore(&panel_icm->lock, irq_flags);
	mutex_unlock(&panel_icm->icm_lock);
}
コード例 #28
0
static void himax_self_refresh_switch(int on)
{
	PR_DISP_INFO("%s %d \n", __func__, on);

	if (on) {
		mutex_lock(&cmdlock);
		mipi_set_tx_power_mode(0);
		mipi_dsi_cmds_tx(&himax_tx_buf, video_to_cmd,
			ARRAY_SIZE(video_to_cmd));
		mipi_set_tx_power_mode(1);
		disable_video_mode_clk();
		mutex_unlock(&cmdlock);
	} else {
		mutex_lock(&cmdlock);
		mipi_set_tx_power_mode(0);
		enable_irq(vsync_irq);
		mipi_dsi_cmds_tx(&himax_tx_buf, cmd_to_video,
			ARRAY_SIZE(cmd_to_video));
		wait_vsync = 1;
		wait_event_timeout(himax_vsync_wait, himax_vsync_gpio ||
					gpio_get_value(28), HZ/2);
		disable_irq(vsync_irq);
		wait_vsync = 0;
		himax_vsync_gpio = 0;
		udelay(100);
		mipi_dsi_cmds_tx(&himax_tx_buf, vsync_hsync_cmds,
			ARRAY_SIZE(vsync_hsync_cmds));
		mutex_unlock(&cmdlock);
		enable_video_mode_clk();
	}
}
コード例 #29
0
static unsigned char cp5_wl_shrink_pwm(int val)
{
	unsigned int pwm_min, pwm_default, pwm_max;
	unsigned char shrink_br = BRI_SETTING_MAX;

	pwm_min = 11;
	pwm_default = 79;
	pwm_max = 255;

	if (val <= 0) {
		shrink_br = 0;
	} else if (val > 0 && (val < BRI_SETTING_MIN)) {
			shrink_br = pwm_min;
	} else if ((val >= BRI_SETTING_MIN) && (val <= BRI_SETTING_DEF)) {
			shrink_br = (val - BRI_SETTING_MIN) * (pwm_default - pwm_min) /
		(BRI_SETTING_DEF - BRI_SETTING_MIN) + pwm_min;
	} else if (val > BRI_SETTING_DEF && val <= BRI_SETTING_MAX) {
			shrink_br = (val - BRI_SETTING_DEF) * (pwm_max - pwm_default) /
		(BRI_SETTING_MAX - BRI_SETTING_DEF) + pwm_default;
	} else if (val > BRI_SETTING_MAX)
			shrink_br = pwm_max;

	PR_DISP_INFO("brightness orig=%d, transformed=%d\n", val, shrink_br);

	return shrink_br;
}
コード例 #30
0
void htc_8974_panel_reset(struct mdss_panel_data *pdata, int enable)
{
    struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;

    if (pdata == NULL) {
        pr_err("%s: Invalid input data\n", __func__);
        return;
    }

    ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
                              panel_data);

    if (!gpio_is_valid(ctrl_pdata->disp_en_gpio)) {
        pr_debug("%s:%d, reset line not configured\n",
                 __func__, __LINE__);
    }

    if (!gpio_is_valid(ctrl_pdata->rst_gpio)) {
        pr_debug("%s:%d, reset line not configured\n",
                 __func__, __LINE__);
        return;
    }

    pr_debug("%s: enable = %d\n", __func__, enable);

    if (enable) {
        if (pdata->panel_info.first_power_on == 1) {
            PR_DISP_INFO("reset already on in first time\n");
            return;
        }

        if (pdata->panel_info.panel_id == 1) {
            gpio_set_value((ctrl_pdata->rst_gpio), 1);
            msleep(10);
            gpio_set_value((ctrl_pdata->rst_gpio), 0);
            msleep(10);
            gpio_set_value((ctrl_pdata->rst_gpio), 1);
            msleep(10);
        } else {
            gpio_set_value((ctrl_pdata->rst_gpio), 0);
            msleep(10);
            gpio_set_value((ctrl_pdata->rst_gpio), 1);
            msleep(10);
        }

        if (gpio_is_valid(ctrl_pdata->disp_en_gpio))
            gpio_set_value((ctrl_pdata->disp_en_gpio), 1);
        if (ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_INIT) {
            pr_debug("%s: Panel Not properly turned OFF\n",
                     __func__);
            ctrl_pdata->ctrl_state &= ~CTRL_STATE_PANEL_INIT;
            pr_debug("%s: Reset panel done\n", __func__);
        }
    } else {
        gpio_set_value((ctrl_pdata->rst_gpio), 0);
        if (gpio_is_valid(ctrl_pdata->disp_en_gpio))
            gpio_set_value((ctrl_pdata->disp_en_gpio), 0);
    }

}