static uint32 mipi_himax_manufacture_id(void)
{
	struct dsi_buf *rp, *tp;
	struct dsi_cmd_desc *cmd;
	uint32 *lp;
	int i;
	char *cp;

	tp = &himax_tx_buf;
	rp = &himax_rx_buf;
	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);

	cmd = &himax_manufacture_id_cmd;
	mipi_dsi_cmds_rx(tp, rp, cmd, 3);


	cp = (char *)rp->data;
	PR_DISP_DEBUG("rx-data: ");
	for (i = 0; i < rp->len; i++, cp++)
		PR_DISP_DEBUG("%x ", *cp);
	PR_DISP_DEBUG("\n");

	lp = (uint32 *)rp->data;

	PR_DISP_DEBUG("%s: manu_id=%x", __func__, *lp);

	return *lp;
}
예제 #2
0
/**
 * Read a bridge register
 *
 * @param mfd
 *
 * @return register data value
 */
static u32 mipi_d2l_read_reg(struct msm_fb_data_type *mfd, u16 reg)
{
	u32 data;
	int len = 4;
	struct dsi_cmd_desc cmd_read_reg = {
		DTYPE_GEN_READ2, 1, 0, 1, 0, /* cmd 0x24 */
			sizeof(reg), (char *) &reg};

	mipi_dsi_buf_init(&d2l_tx_buf);
	mipi_dsi_buf_init(&d2l_rx_buf);

	mutex_lock(&mfd->dma->ov_mutex);
	len = mipi_dsi_cmds_rx(mfd, &d2l_tx_buf, &d2l_rx_buf,
			       &cmd_read_reg, len);
	mutex_unlock(&mfd->dma->ov_mutex);

	data = *(u32 *)d2l_rx_buf.data;

	if (len != 4)
		pr_err("%s: invalid rlen=%d, expecting 4.\n", __func__, len);

	pr_debug("%s: reg=0x%x.data=0x%08x.\n", __func__, reg, data);


	return data;
}
static uint32 mipi_samsung_manufacture_id(struct msm_fb_data_type *mfd)
{
	struct dsi_buf *rp, *tp;
	struct dsi_cmd_desc *cmd;
	uint32 id_size;
	char id[3];

	mutex_lock(&dsi_tx_mutex);

	id_size = 3;
	tp = &msd.samsung_tx_buf;
	rp = &msd.samsung_rx_buf;
	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);

	cmd = &samsung_manufacture_id1_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, id_size);

	id[0] = *rp->data;
	id[1] = *(rp->data + 1);
	id[2] = *(rp->data + 2);

	mutex_unlock(&dsi_tx_mutex);

	pr_info("%s id0:  0x%x, id1: 0x%x, id2: 0x%x", __func__,
		id[0], id[1], id[2]);

	return id[0] << 16 | id[1] << 8 | id[2] ;
}
예제 #4
0
static uint32 mipi_orise_manufacture_id(void)
{
	struct dsi_buf *rp, *tp;
	struct dsi_cmd_desc *cmd;
	uint32 *lp;

	tp = &orise_tx_buf;
	rp = &orise_rx_buf;
	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);

	cmd = &orise_manufacture_id_cmd;
	mipi_dsi_cmds_rx(tp, rp, cmd, 3);

{
	int i;
	char *cp;

	cp = (char *)rp->data;
	printk("rx-data: ");
	for (i = 0; i < rp->len; i++, cp++)
		printk("%x ", *cp);
	printk("\n");
}

	lp = (uint32 *)rp->data;

	printk("%s: manu_id=%x", __func__, *lp);

	return *lp;
}
예제 #5
0
static int mipi_nt35565_ic_on_disp_on(struct msm_fb_data_type *mfd)
{
	struct mipi_dsi_data *dsi_data;
	struct dsi_controller *pctrl;

	dsi_data = platform_get_drvdata(mfd->panel_pdev);
	if (!dsi_data)
		return -ENODEV;
	pctrl = dsi_data->panel->pctrl;

	if (!dsi_data->panel_detecting) {
		mipi_dsi_op_mode_config(DSI_CMD_MODE);

		if (dsi_data->eco_mode_on && pctrl->display_on_eco_cmds) {
			mipi_dsi_buf_init(&dsi_data->tx_buf);
			mipi_dsi_cmds_tx(mfd, &dsi_data->tx_buf,
				pctrl->display_on_eco_cmds,
				pctrl->display_on_eco_cmds_size);
			dev_info(&mfd->panel_pdev->dev, "ECO MODE ON\n");
		} else {
			mipi_dsi_buf_init(&dsi_data->tx_buf);
			mipi_dsi_cmds_tx(mfd, &dsi_data->tx_buf,
				pctrl->display_on_cmds,
				pctrl->display_on_cmds_size);
			dev_info(&mfd->panel_pdev->dev, "ECO MODE OFF\n");
		}
	}

	return 0;
}
예제 #6
0
/*
 * mipi_dsi_cmds_tx:
 * ov_mutex need to be acquired before call this function.
 */
int mipi_dsi_cmds_tx(struct msm_fb_data_type *mfd,
		struct dsi_buf *tp, struct dsi_cmd_desc *cmds, int cnt)
{
	struct dsi_cmd_desc *cm;
	uint32 dsi_ctrl, ctrl;
	int i, video_mode;
	int length_tx;
	int ret;

	/* turn on cmd mode
	* for video mode, do not send cmds more than
	* one pixel line, since it only transmit it
	* during BLLP.
	*/
	dsi_ctrl = MIPI_INP(MIPI_DSI_BASE + 0x0000);
	video_mode = dsi_ctrl & 0x02; /* VIDEO_MODE_EN */
	if (video_mode) {
		ctrl = dsi_ctrl | 0x04; /* CMD_MODE_EN */
		MIPI_OUTP(MIPI_DSI_BASE + 0x0000, ctrl);
	} else { /* cmd mode */
		/*
		 * during boot up, cmd mode is configured
		 * even it is video mode panel.
		 */
		/* make sure mdp dma is not txing pixel data */
		if (mfd->panel_info.type == MIPI_CMD_PANEL)
			mdp4_dsi_cmd_dma_busy_wait(mfd);
	}

	mipi_dsi_enable_irq();
	cm = cmds;
	mipi_dsi_buf_init(tp);
	for (i = 0; i < cnt; i++) {
		mipi_dsi_buf_init(tp);
		mipi_dsi_cmd_dma_add(tp, cm);
		length_tx = mipi_dsi_cmd_dma_tx(tp);
		if( length_tx < 0 ) // if failed
		{
			pr_err(" mipi_dsi_cmd_dma_tx FAILED, %d/%d(%x %x %x %x)\n",
				i, cnt, cm->payload[0], cm->payload[1], cm->payload[2], cm->payload[3]);
			break;
		}
		if (cm->wait)
			msleep(cm->wait);
		cm++;
	}
	ret = i;
	mipi_dsi_disable_irq();

	if (video_mode)
		MIPI_OUTP(MIPI_DSI_BASE + 0x0000, dsi_ctrl); /* restore */

	return ret;
}
static uint32 mipi_samsung_manufacture_id(struct msm_fb_data_type *mfd)
{
	struct dsi_buf *rp, *tp;
	struct dsi_cmd_desc *cmd;

	tp = &panel_tx_buf;
	rp = &panel_rx_buf;
	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);

	cmd = &samsung_manufacture_id_cmd;
	return 0;
}
예제 #8
0
static int mipi_get_manufacture_icid(struct msm_fb_data_type *mfd)
{
	uint32 icid = 0;
	int i ;
	

	 struct mipi_manufacture_ic mipi_manufacture_icid[3] = {
		{hx8363_setpassword_cmd,ARRAY_SIZE(hx8363_setpassword_cmd),&hx8363_icid_rd_cmd,3,1},
		{nt3511_setpassword_cmd,ARRAY_SIZE(nt3511_setpassword_cmd),&nt3511_icid_rd_cmd,3,0},
		{hx8369_setpassword_cmd,ARRAY_SIZE(hx8369_setpassword_cmd),&hx8369_icid_rd_cmd,3,1},

	 };

	for(i = 0; i < ARRAY_SIZE(mipi_manufacture_icid) ; i++)
	{	lcd_panle_reset();	
		mipi_dsi_buf_init(&lead_tx_buf);
		mipi_dsi_buf_init(&lead_rx_buf);
		mipi_set_tx_power_mode(1);	
		
		mipi_dsi_cmds_tx(mfd, &lead_tx_buf, mipi_manufacture_icid[i].readid_tx,mipi_manufacture_icid[i].readid_len_tx);
		mipi_dsi_cmd_bta_sw_trigger(); 
		
		if(!mipi_manufacture_icid[i].mode)
			mipi_set_tx_power_mode(0);	
		
		mipi_dsi_cmds_rx(mfd,&lead_tx_buf, &lead_rx_buf, mipi_manufacture_icid[i].readid_rx,mipi_manufacture_icid[i].readid_len_rx);

		if(mipi_manufacture_icid[i].mode)
			mipi_set_tx_power_mode(0);
		
		icid = *(uint32 *)(lead_rx_buf.data);
		
		printk("debug read icid is %x\n",icid & 0xffffff);

		switch(icid & 0xffffff){
			case 0x1055:
						return NOVATEK_35510;
			case 0x6383ff:
						return HIMAX_8363;
						
			case 0x6983ff:
						return HIMAX_8369;
						
			default:
						break;			
		}

	}
	return 0;
}
예제 #9
0
int mipi_smd_oled_hd_register_write_cmd( struct msm_fb_data_type *mfd,
        struct msmfb_register_write *data )
{
    char send_data[255];
    struct dsi_cmd_desc param;

    mipi_dsi_buf_init(&smd_oled_hd_tx_buf);


    memcpy(send_data, (char*)(&data->data[0]), data->len);


    param.dtype = (int)data->di;
    param.last  = 1;
    param.vc    = 0;
    param.ack   = 0;
    param.wait  = 0;
    param.dlen  = (int)data->len;
    param.payload = send_data;


    mipi_dsi_cmds_tx(&smd_oled_hd_tx_buf, &param, 1);

    return 0;
}
예제 #10
0
void mipi_dsi_set_tear_off(struct msm_fb_data_type *mfd)
{
	mutex_lock(&mfd->dma->ov_mutex);
	mipi_dsi_buf_init(&dsi_tx_buf);
	mipi_dsi_cmds_tx(mfd, &dsi_tx_buf, &dsi_tear_off_cmd, 1);
	mutex_unlock(&mfd->dma->ov_mutex);
}
static int mipi_r63306_disp_off(struct msm_fb_data_type *mfd)
{
	int ret = 0;
	struct mipi_dsi_data *dsi_data;

	dsi_data = platform_get_drvdata(mfd->panel_pdev);

	if (!dsi_data || !dsi_data->lcd_power)
		return -ENODEV;

	if (!dsi_data->panel_detecting) {
		mipi_dsi_op_mode_config(DSI_CMD_MODE);

		mipi_dsi_buf_init(&dsi_data->tx_buf);
		mipi_dsi_cmds_tx(&dsi_data->tx_buf,
			dsi_data->panel->pctrl->display_off_cmds,
			dsi_data->panel->pctrl->display_off_cmds_size);
#ifdef CONFIG_FB_MSM_RECOVER_PANEL
		mipi_set_tx_power_mode(1);
#endif
		ret = dsi_data->lcd_power(FALSE);
	} else {
		dsi_data->panel_detecting = false;
		ret = 0;
	}

	return ret;
}
예제 #12
0
static int mipi_orise_rd(struct msm_fb_data_type *mfd, char addr)
{
    struct dsi_buf *rp, *tp;
    struct dsi_cmd_desc *cmd;
    int *lp;
    addr_buf[0] = addr;
    tp = &orise_tx_buf;
    rp = &orise_rx_buf;
    mipi_dsi_buf_init(rp);
    mipi_dsi_buf_init(tp);

    cmd = &cmd_mipi_addr_buf;
    mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 4);
    lp = (uint32 *)rp->data;
    pr_info("mipi_orise_rd addr=%x, data=%x\n", addr, *lp);
    return *lp;
}
static int mipi_orise_manufacture_id(struct msm_fb_data_type *mfd)
{


	char retDA = 0;
	struct dsi_buf *tp = &orise_tx_buf;
	struct dsi_buf *rp = &orise_rx_buf;

	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);
	mipi_dsi_cmds_rx(mfd, tp, rp, &orise_ReadDA, 1);
	retDA = *((char *) rp->data);

	printk(KERN_ALERT "[DISPLAY] Panel ID <0x%02x>\n", retDA);
	return retDA;
	
}
void mipi_dsi_set_tear_off(void)
{
    mutex_lock(&dsi_mutex);

    mipi_dsi_buf_init(&dsi_tx_buf);
    mipi_dsi_cmds_tx(&dsi_tx_buf, &dsi_tear_off_cmd, 1);
    mutex_unlock(&dsi_mutex);
}
예제 #15
0
static uint32 mipi_get_commic_panleid(struct msm_fb_data_type *mfd,struct dsi_cmd_desc *para,uint32 len,int mode)
{
	uint32 panelid = 0;
	mipi_dsi_buf_init(&lead_tx_buf);
	mipi_dsi_buf_init(&lead_rx_buf);
	mipi_dsi_cmd_bta_sw_trigger(); 
	if(mode)
		mipi_set_tx_power_mode(1);
	else 
		mipi_set_tx_power_mode(0);
	mipi_dsi_cmds_rx(mfd,&lead_tx_buf, &lead_rx_buf, para,len);
	if(mode)
		mipi_set_tx_power_mode(0);
	panelid = *(uint32 *)(lead_rx_buf.data);
	printk("debug read panelid is %x\n",panelid & 0xffffffff);
	return panelid & 0xff;
}
static int mipi_r63306_disp_on(struct msm_fb_data_type *mfd)
{
	int ret = 0;
	struct mipi_dsi_data *dsi_data;
	struct dsi_controller *pctrl;

	dsi_data = platform_get_drvdata(mfd->panel_pdev);
	if (!dsi_data || !dsi_data->lcd_power) {
		ret = -ENODEV;
		goto disp_on_fail;
	}
	pctrl = dsi_data->panel->pctrl;

	if (!dsi_data->panel_detecting) {
		ret = dsi_data->lcd_power(TRUE);

		if (ret)
			goto disp_on_fail;

		mipi_dsi_op_mode_config(DSI_CMD_MODE);

		if (pctrl->display_init_cmds) {
			mipi_dsi_buf_init(&dsi_data->tx_buf);
			mipi_dsi_cmds_tx(mfd, &dsi_data->tx_buf,
				pctrl->display_init_cmds,
				pctrl->display_init_cmds_size);
		}
		if (dsi_data->eco_mode_on && pctrl->display_on_eco_cmds) {
			mipi_dsi_buf_init(&dsi_data->tx_buf);
			mipi_dsi_cmds_tx(mfd, &dsi_data->tx_buf,
				pctrl->display_on_eco_cmds,
				pctrl->display_on_eco_cmds_size);
			dev_info(&mfd->panel_pdev->dev, "ECO MODE ON\n");
		} else {
			mipi_dsi_buf_init(&dsi_data->tx_buf);
			mipi_dsi_cmds_tx(mfd, &dsi_data->tx_buf,
				pctrl->display_on_cmds,
				pctrl->display_on_cmds_size);
			dev_info(&mfd->panel_pdev->dev, "ECO MODE OFF\n");
		}
	}

disp_on_fail:
	return ret;
}
예제 #17
0
/*
 * mipi_dsi_cmds_tx:
 * ov_mutex need to be acquired before call this function.
 */
int mipi_dsi_cmds_tx(struct msm_fb_data_type *mfd,
		struct dsi_buf *tp, struct dsi_cmd_desc *cmds, int cnt)
{
	struct dsi_cmd_desc *cm;
	uint32 dsi_ctrl, ctrl;
	int i, video_mode;

	/* turn on cmd mode
	* for video mode, do not send cmds more than
	* one pixel line, since it only transmit it
	* during BLLP.
	*/
	dsi_ctrl = MIPI_INP(MIPI_DSI_BASE + 0x0000);
	video_mode = dsi_ctrl & 0x02; /* VIDEO_MODE_EN */
	if (video_mode) {
		ctrl = dsi_ctrl | 0x04; /* CMD_MODE_EN */
		MIPI_OUTP(MIPI_DSI_BASE + 0x0000, ctrl);
	} else { /* cmd mode */
		/*
		 * during boot up, cmd mode is configured
		 * even it is video mode panel.
		 */
		/* make sure mdp dma is not txing pixel data */
#ifndef CONFIG_FB_MSM_MIPI_DSI_MAGNA
		if (mfd->panel_info.type == MIPI_CMD_PANEL)
			mdp4_dsi_cmd_dma_busy_wait(mfd);
#endif
	}

	cm = cmds;
	mipi_dsi_buf_init(tp);
	for (i = 0; i < cnt; i++) {
		mipi_dsi_buf_init(tp);
		mipi_dsi_cmd_dma_add(tp, cm);
		mipi_dsi_cmd_dma_tx(tp);
		if (cm->wait)
			msleep(cm->wait);
		cm++;
	}

	if (video_mode)
		MIPI_OUTP(MIPI_DSI_BASE + 0x0000, dsi_ctrl); /* restore */

	return cnt;
}
static uint32 protou_manufacture_id(struct msm_fb_data_type *mfd)
{
	struct dsi_buf *rp, *tp;
	struct dsi_cmd_desc *cmd;
	uint32 *lp;

	tp = &protou_panel_tx_buf;
	rp = &protou_panel_rx_buf;
	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);

	cmd = &lg_manufacture_id_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 3);
	lp = (uint32 *)rp->data;
	PR_DISP_INFO("%s: manufacture_id=%x\n", __func__, *lp);

	return *lp;
}
static void read_error_register(struct msm_fb_data_type *mfd)
{
	struct dsi_buf *rp, *tp;
#if defined(CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_WVGA_PT)
	char *cmd_lp;
#else
	struct dsi_cmd_desc *cmd;
#endif

	wake_lock(&idle_wake_lock);

#if CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_WVGA_PT
	mutex_lock(&mipi_lp_mutex);
#endif
	mutex_lock(&mfd->dma->ov_mutex);

	mipi_dsi_mdp_busy_wait();

	tp = &msd.samsung_tx_buf;
	rp = &msd.samsung_rx_buf;

	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);

#if defined(CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_WVGA_PT)
	cmd_lp = &error_id2_cmd;
	mipi_dsi_cmds_rx_lp(mfd, tp, rp, cmd_lp, 1);
	error_buf[0] = *rp->data;
	mipi_dsi_cmds_rx_lp(mfd, tp, rp, cmd_lp, 1);

	pr_debug("############ error buf E5 = %x\n", error_buf[0]);
#else
	cmd = &error_id2_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 1);
	error_buf[0] = *rp->data;
	pr_debug("############ error buf E5 %x\n", error_buf[0]);
#endif

	mutex_unlock(&mfd->dma->ov_mutex);
#if CONFIG_FB_MSM_MIPI_SAMSUNG_OLED_VIDEO_WVGA_PT
	mutex_unlock(&mipi_lp_mutex);
#endif
	wake_unlock(&idle_wake_lock);
}
예제 #20
0
static int panel_id_reg_check(struct msm_fb_data_type *mfd, struct dsi_buf *ptx,
			      struct dsi_buf *prx, const struct panel_id* panel)
{
	int i;

	mutex_lock(&mfd->dma->ov_mutex);
	mipi_dsi_buf_init(prx);
	mipi_dsi_buf_init(ptx);
	mipi_dsi_cmds_rx(mfd, ptx, prx, panel->pctrl->read_id_cmds,
			 panel->id_num);
	mutex_unlock(&mfd->dma->ov_mutex);

	for (i = 0; i < panel->id_num; i++) {
		if ((i >= prx->len) ||
			((prx->data[i] != panel->id[i]) &&
				(panel->id[i] != 0xff)))
			return -ENODEV;
	}
	return 0;
}
예제 #21
0
static uint32 mipi_samsung_manufacture_id(struct msm_fb_data_type *mfd)
{
	struct dsi_buf *rp, *tp;
	struct dsi_cmd_desc *cmd;
/* 	uint32 *lp; */

	tp = &ville_panel_tx_buf;
	rp = &ville_panel_rx_buf;
	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);

	cmd = &samsung_manufacture_id_cmd;
/*
//-	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 3);
//-	lp = (uint32 *)rp->data;
//-	PR_DISP_INFO("%s: manufacture_id=%x\n", __func__, *lp);
//-	return *lp;
*/
	return 0;
}
int mipi_dsi_cmds_tx(struct dsi_buf *tp, struct dsi_cmd_desc *cmds, int cnt)
{
    struct dsi_cmd_desc *cm;
    uint32 dsi_ctrl, ctrl;
    int i, video_mode;

    dsi_mutex_lock();
    dsi_busy_check();

    /* turn on cmd mode
     * for video mode, do not send cmds more than
     * one pixel line, since it only transmit it
     * during BLLP.
     */
    dsi_ctrl = MIPI_INP(MIPI_DSI_BASE + 0x0000);
    video_mode = dsi_ctrl & 0x02; /* VIDEO_MODE_EN */
    if (video_mode) {
        ctrl = dsi_ctrl | 0x04; /* CMD_MODE_EN */
        MIPI_OUTP(MIPI_DSI_BASE + 0x0000, ctrl);
    }
    mipi_dsi_enable_irq();

    cm = cmds;
    mipi_dsi_buf_init(tp);
    for (i = 0; i < cnt; i++) {
        mipi_dsi_buf_init(tp);
        mipi_dsi_cmd_dma_add(tp, cm);
        mipi_dsi_cmd_dma_tx(tp);
        if (cm->wait)
            hr_msleep(cm->wait);
        cm++;
    }
    mipi_dsi_disable_irq();

    if (video_mode)
        MIPI_OUTP(MIPI_DSI_BASE + 0x0000, dsi_ctrl); /* restore */

    dsi_mutex_unlock();

    return cnt;
}
예제 #23
0
static int mipi_smd_oled_hd_on( struct platform_device *pdev )
{
    struct msm_fb_data_type *mfd;
    mipi_smd_oled_hd_state_t curr_state;

    printk(KERN_INFO "[In]%s. stat:%d \n", __func__, mipi_smd_oled_hd_state);

    mfd = platform_get_drvdata(pdev);

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

    mipi_dsi_buf_init(&smd_oled_hd_tx_buf);


    curr_state = mipi_smd_oled_hd_state;

    switch (curr_state)
    {
    case MIPI_SMD_OLED_HD_STATE_OFF :

        mipi_smd_oled_hd_initialize_setup(mfd);

        mipi_smd_oled_hd_set_display_on(mfd);


        mipi_smd_oled_hd_state_transition(curr_state, MIPI_SMD_OLED_HD_STATE_NORMAL_MODE);
        break;

    case MIPI_SMD_OLED_HD_STATE_READY :

        printk(KERN_INFO "%s. Driver Status Error. %d.\n", __func__, curr_state);
        break;

    case MIPI_SMD_OLED_HD_STATE_STANDBY :

        printk(KERN_INFO "%s. Driver Status Error. %d.\n", __func__, curr_state);
        break;

    case MIPI_SMD_OLED_HD_STATE_NORMAL_MODE :

        break;

    default :
        printk(KERN_ERR "Invalid Status !! %d\n", __LINE__);
        break;
    }

    printk(KERN_INFO "[Out]%s. stat:%d \n", __func__, mipi_smd_oled_hd_state);
    return 0;
}
예제 #24
0
int mipi_smd_oled_hd_read_dev_reg( struct msm_fb_data_type *mfd, struct msmfb_register_read *data)
{
    const int one_read_size = 4;
    const int loop_limit = 16;
    int read_pos = 0;
    int readed_size = 0;
    int data_cnt = 0;
    int i,j;


    read_target_reg[0] = (char)data->w_data[0];
    packet_size[0] = (char)data->len;


    mipi_dsi_cmds_tx(&smd_oled_hd_tx_buf, &(mipi_smd_oled_hd_packet_size_cmd), 1);

    for (j = 0; j < loop_limit; j++)
    {
        read_position[1] = read_pos;


        if ( mipi_dsi_cmds_tx(&smd_oled_hd_tx_buf, &(mipi_smd_oled_hd_read_pos_cmd), 1) < 1 )
        {
            printk(KERN_ERR "%s. mipi_dsi_cmds_tx FAILED.\n", __func__);
            return -1;
        }

        mipi_dsi_op_mode_config(DSI_CMD_MODE);
        mipi_dsi_sw_reset();

        mipi_dsi_buf_init(&smd_oled_hd_rx_buf);


        readed_size = mipi_dsi_cmds_rx(mfd, &smd_oled_hd_tx_buf, &smd_oled_hd_rx_buf, &mipi_smd_oled_hd_read_reg_cmd, one_read_size);


        for (i = 0; i < readed_size; i++, data_cnt++)
        {
            if( data_cnt < data->len )
                data->r_data[data_cnt] = smd_oled_hd_rx_buf.data[i];
        }

        mipi_dsi_sw_reset();
        mipi_dsi_op_mode_config(DSI_VIDEO_MODE);


        read_pos += readed_size;
        if( read_pos > data->len )
            break;
    }

    return 0;
}
int mipi_mot_panel_off(struct msm_fb_data_type *mfd)
{
	struct dsi_buf *tp = mot_panel->mot_tx_buf;

	mdp4_dsi_cmd_dma_busy_wait(mfd);
	mipi_dsi_mdp_busy_wait(mfd);

	mipi_dsi_buf_init(tp);
	mipi_dsi_cmds_tx(mfd, tp, &mot_display_off_cmd, 1);

	return 0;
}
static uint32 mipi_samsung_manufacture_id(struct msm_fb_data_type *mfd)
{
	struct dsi_buf *rp, *tp;
	struct dsi_cmd_desc *cmd;
	uint32 id, id1;

	tp = &msd.samsung_tx_buf;
	rp = &msd.samsung_rx_buf;

	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);
	/*read Id1 two time since fist time id read is always returning 0*/
	cmd = &samsung_manufacture_id1_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 1);
	id1 = *((uint8 *)rp->data);

	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);
	cmd = &samsung_manufacture_id1_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 1);
	id = *((uint8 *)rp->data) | id1;
	pr_info("%s: manufacture_id1=%x\n", __func__, *rp->data);
	id <<= 8;

	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);
	cmd = &samsung_manufacture_id2_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 1);
	pr_info("%s: manufacture_id2=%x\n", __func__, *rp->data);
	id |= *((uint8 *)rp->data);
	id <<= 8;

	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);
	cmd = &samsung_manufacture_id3_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 1);
	pr_info("%s: manufacture_id3=%x\n", __func__, *rp->data);
	id |= *((uint8 *)rp->data);

	pr_info("%s: manufacture_id=%x\n", __func__, id);

#ifdef FACTORY_TEST
	if (id == 0x00) {
		pr_info("Lcd is not connected\n");
		is_lcd_connected = 0;
	}
#endif
	return id;
}
static uint32 mipi_samsung_manufacture_id(struct msm_fb_data_type *mfd)
{
	struct dsi_buf *rp, *tp;
	struct dsi_cmd_desc *cmd;
	uint32 id = 0;

	tp = &msd.samsung_tx_buf;
	rp = &msd.samsung_rx_buf;
	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);

	if (system_rev == 0) {
		pr_err("[LCD] %s, temp return! for rev00\n", __func__);
		return 0;
	}

	cmd = &samsung_manufacture_id1_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 1);
	pr_info("%s: manufacture_id1=%x\n", __func__, *rp->data);
	id = *rp->data & 0xFF;
	id <<= 8;

	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);
	cmd = &samsung_manufacture_id2_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 1);
	pr_info("%s: manufacture_id2=%x\n", __func__, *rp->data);
	id |= *rp->data & 0xFF;
	id <<= 8;

	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);
	cmd = &samsung_manufacture_id3_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 1);
	pr_info("%s: manufacture_id3=%x\n", __func__, *rp->data);
	id |= *rp->data & 0xFF;
	id <<= 8;

	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);
	cmd = &samsung_manufacture_id4_cmd;
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 1);
	pr_info("%s: manufacture_id4=%x\n", __func__, *rp->data);
	id |= *rp->data & 0xFF;

	pr_info("%s: manufacture_id=%x\n", __func__, id);

	return id;
}
static int32 get_panel_info(struct msm_fb_data_type *mfd,
				struct  mipi_mot_panel *mot_panel,
				struct dsi_cmd_desc *cmd)
{
	struct dsi_buf *rp, *tp;
	uint32 *lp;
	int ret;

	tp = mot_panel->mot_tx_buf;
	rp = mot_panel->mot_rx_buf;
	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);

	ret = mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 1);
	if (!ret)
		ret = -1;
	else {
		lp = (uint32 *)rp->data;
		ret = (int)*lp;
	}

	return ret;
}
예제 #29
0
int mipi_dsi_eco_mode_switch(struct msm_fb_data_type *mfd)
{
	int ret = 0;
	struct mipi_dsi_data *dsi_data;
	struct dsi_controller *pctrl;

	dsi_data = platform_get_drvdata(mfd->panel_pdev);
	if (!dsi_data || !dsi_data->lcd_power) {
		ret = -ENODEV;
		goto eco_mode_switch_fail;
	}
	pctrl = dsi_data->panel->pctrl;

	mipi_set_tx_power_mode(0);

	if (dsi_data->eco_mode_on && pctrl->eco_mode_gamma_cmds) {
		mipi_dsi_buf_init(&dsi_data->tx_buf);
		mipi_dsi_cmds_tx(&dsi_data->tx_buf,
			pctrl->eco_mode_gamma_cmds,
			pctrl->eco_mode_gamma_cmds_size);
		dev_info(&mfd->panel_pdev->dev, "ECO MODE ON\n");
	} else if (pctrl->normal_gamma_cmds) {
		mipi_dsi_buf_init(&dsi_data->tx_buf);
		mipi_dsi_cmds_tx(&dsi_data->tx_buf,
			pctrl->normal_gamma_cmds,
			pctrl->normal_gamma_cmds_size);
		dev_info(&mfd->panel_pdev->dev, "ECO MODE OFF\n");
	}

	mipi_set_tx_power_mode(1);

	return ret;

eco_mode_switch_fail:
	return ret;
}
예제 #30
0
 uint32 nt35590_read_manufacture_id(struct msm_fb_data_type *mfd)
{
    struct dsi_buf *rp, *tp;
    struct dsi_cmd_desc *cmd;
    uint32 *lp;
    uint32 id=0xff;

		printk("==========%s:line%d===========\n",__func__,__LINE__);

	tp = &z5mini_tx_buf;
	rp = &z5mini_rx_buf;
	cmd = nt35590_manufacture_id_cmd;
	
	mipi_dsi_buf_init(rp);
	mipi_dsi_buf_init(tp);	
	mipi_dsi_cmd_bta_sw_trigger(); /* clean up ack_err_status */	
	mipi_dsi_cmds_rx(mfd, tp, rp, cmd, 2);
	
	lp = (uint32 *)rp->data;
//	id=(((*lp)&0xff00)>>8);
	id=(*lp);	
	pr_info("%s: manufacture_id=0x%x,id=0x%x\n", __func__, (*lp)&0xffff ,id);	
	return id;
}