//*****************************************************************************
//
// Function Name: DISPDRV__Open
// 
// Description:   Open Sub Drivers
//
//*****************************************************************************
Int32 DISPDRV_Open ( 
    const void*         params,
    DISPDRV_HANDLE_T*   drvH 
    )
{
    Int32                         res = 0;
    UInt32                        busId; 
    const DISPDRV_OPEN_PARM_T*    pOpenParm;
    DISPDRV_PANEL_T         *pPanel;


    //busCh - NA to DSI interface
    pOpenParm = (DISPDRV_OPEN_PARM_T*) params;
    busId     = pOpenParm->busCh;
    // for now, override input for DSI bus no, we're on DSI bus 0
    busId     = 0;

    #define BUS_ID_MAX  1

    if( busId > BUS_ID_MAX )
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: ERROR Invalid DSI Bus[%d]\n\r",
            __FUNCTION__, (unsigned int)busId );
        return ( -1 );
    }

    pPanel = &panel[busId];

    if( pPanel->drvState == DRV_STATE_OPEN )
    {
        *drvH = (DISPDRV_HANDLE_T) pPanel;
        LCD_DBG ( LCD_DBG_INIT_ID, "[DISPDRV] %s: Returning Handle, "
            "Already Open\n\r", __FUNCTION__ );
        return ( res );
    }

    if ( pPanel->drvState != DRV_STATE_INIT )
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: ERROR Not Init\n\r",
            __FUNCTION__ );
        return ( -1 );
    }    
    
    DISPDRV_dsiCfg.bus = busId;
    
    pPanel->isTE = DISPDRV_VcCmCfg.teCfg.teInType != DSI_TE_NONE;
    
#ifdef __KERNEL__
    pPanel->pFb = pPanel->pFbA = (void*)pOpenParm->busId;
#else
    pPanel->pFb = pPanel->pFbA = (void*)&FrameBuff[busId];
#endif
   

        pPanel->teIn   = TE_VC4L_IN_1_DSI0;
        pPanel->teOut  = TE_VC4L_OUT_DSI0_TE0;


    if( DISPDRV_TeOn ( pPanel ) ==  -1 )
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: "
            "Failed To Configure TE Input\n", __FUNCTION__ ); 
        return ( -1 );
    }
    
    if ( CSL_DSI_Init( &DISPDRV_dsiCfg ) != CSL_LCD_OK )
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: ERROR, DSI CSL Init "
            "Failed\n\r", __FUNCTION__ );
        return ( -1 );
    }
    
    if ( CSL_DSI_OpenClient ( busId, &pPanel->clientH ) != CSL_LCD_OK )
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: ERROR, CSL_DSI_OpenClient "
            "Failed\n\r", __FUNCTION__);
        return ( -1 );
    }
    
    if ( CSL_DSI_OpenCmVc ( pPanel->clientH, &DISPDRV_VcCmCfg, &pPanel->dsiCmVcHandle ) 
            != CSL_LCD_OK )
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: CSL_DSI_OpenCmVc Failed\n\r",
            __FUNCTION__);
        return ( -1 );
    }

	#ifdef UNDER_LINUX
    if (csl_dma_vc4lite_init() != DMA_VC4LITE_STATUS_SUCCESS)
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: csl_dma_vc4lite_init Failed\n\r",
            __FUNCTION__);
        return ( -1 );
    }
	#endif
	
    pPanel->busId      = busId; 
    
    pPanel->win.left   = 0;  
    pPanel->win.right  = Disp_Info.width-1; 
    pPanel->win.top    = 0;  
    pPanel->win.bottom = Disp_Info.height-1;
    pPanel->win.width  = Disp_Info.width; 
    pPanel->win.height = Disp_Info.height;
    
    pPanel->drvState   = DRV_STATE_OPEN;
    
    *drvH = (DISPDRV_HANDLE_T) pPanel;

    LCD_DBG ( LCD_DBG_INIT_ID, "[DISPDRV] %s: OK\n\r", __FUNCTION__ );
    
    return ( res );
}
Int32 dsic_open ( 
    const void*         params,
    DISPDRV_HANDLE_T*   drvH 
    )
#endif
{
    Int32                         res = 0;
    UInt32                        busId; 
    const DISPDRV_OPEN_PARM_T*    pOpenParm;
    dsic_panel_t         *pPanel;
    printk("dsic_open() ");

    //busCh - NA to DSI interface
    pOpenParm = (DISPDRV_OPEN_PARM_T*) params;
    busId     = pOpenParm->busCh;

    #define BUS_ID_MAX  0

    if( busId > BUS_ID_MAX )
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: ERROR Invalid DSI Bus[%d]\n\r",
            __FUNCTION__, (unsigned int)busId );
        return ( -1 );
    }

    pPanel = &panel[busId];

    if( pPanel->drvState == DRV_STATE_OPEN )
    {
        *drvH = (DISPDRV_HANDLE_T) pPanel;
        LCD_DBG ( LCD_DBG_INIT_ID, "[DISPDRV] %s: Returning Handle, "
            "Already Open\n\r", __FUNCTION__ );
        return ( res );
    }

    if ( pPanel->drvState != DRV_STATE_INIT )
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: ERROR Not Init\n\r",
            __FUNCTION__ );
        return ( -1 );
    }    
    
    //DISPDRV_Reset( FALSE );
    
    dsiCfg.bus = busId;
    
    
    pPanel->pFb = pPanel->pFbA = (void*)pOpenParm->busId;

	if(alexVcCmCfg.teCfg.teInType != DSI_TE_NONE)
	{
    	if( dsi_teon( pPanel ) ==  -1 )
    	{
        	LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: "
            	"Failed To Configure TE Input\n", __FUNCTION__ ); 
        	return ( -1 );
    	}
	}
#ifndef _BRCM_8BYTE_MSG_CONSTRAINT
	if ( CSL_DSI_Init(NULL, &dsiCfg,ptr ) != CSL_LCD_OK )
#else
    if ( CSL_DSI_Init(NULL, &dsiCfg ) != CSL_LCD_OK )
#endif	//_BRCM_8BYTE_MSG_CONSTRAINT
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: ERROR, DSI CSL Init "
            "Failed\n\r", __FUNCTION__ );
        return ( -1 );
    }
    
    if ( CSL_DSI_OpenClient ( busId, &pPanel->clientH ) != CSL_LCD_OK )
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: ERROR, CSL_DSI_OpenClient "
            "Failed\n\r", __FUNCTION__);
        return ( -1 );
    }
    
    if ( CSL_DSI_OpenCmVc ( pPanel->clientH, &alexVcCmCfg, &pPanel->dsiCmVcHandle ) 
            != CSL_LCD_OK )
    {
        LCD_DBG ( LCD_DBG_ERR_ID, "[DISPDRV] %s: CSL_DSI_OpenCmVc Failed\n\r",
            __FUNCTION__);
        return ( -1 );
    }

    pPanel->busId      = busId; 
    
    pPanel->win.left   = 0;  
    pPanel->win.right  = PANEL_WIDTH-1; 
    pPanel->win.top    = 0;  
    pPanel->win.bottom = PANEL_HEIGHT-1;
    pPanel->win.width  = PANEL_WIDTH; 
    pPanel->win.height = PANEL_HEIGHT;
    
    pPanel->drvState   = DRV_STATE_OPEN;
    
    *drvH = (DISPDRV_HANDLE_T) pPanel;
    LCD_DBG ( LCD_DBG_INIT_ID, "[DISPDRV] %s: OK\n\r", __FUNCTION__ );

    return ( res );
}
//*****************************************************************************
//
// Function Name: DISPDRV__Open
// 
// Description:   Open Sub Drivers
//
//*****************************************************************************
Int32 DISPDRV_Open(DISPDRV_HANDLE_T drvH)
{
	Int32 res = 0;
	DISPDRV_PANEL_T *pPanel;

	pPanel = (DISPDRV_PANEL_T *)drvH;

	if (pPanel->drvState != DRV_STATE_INIT) {
		LCD_DBG(LCD_DBG_ERR_ID, "[DISPDRV] %s: ERROR Not Init\n\r",
			__FUNCTION__);
		return (-1);
	}

    if(isFirstboot)
    {
         /* Firstboot skip RESET */
    }
    else
    {
	DISPDRV_Reset(drvH);
    }	

	if (brcm_enable_dsi_pll_clocks(pPanel->busNo,
				       DISPDRV_dsiCfg.hsBitClk.clkIn_MHz *
				       1000000,
				       DISPDRV_dsiCfg.hsBitClk.clkInDiv,
				       DISPDRV_dsiCfg.escClk.clkIn_MHz *
				       1000000 /
				       DISPDRV_dsiCfg.escClk.clkInDiv)) {
		LCD_DBG(LCD_DBG_ERR_ID,
			"[DISPDRV] %s: ERROR to enable the pll clock\n",
			__FUNCTION__);
		return (-1);
	}

	if (pPanel->isTE && DISPDRV_TeOn(pPanel) == -1) {
		LCD_DBG(LCD_DBG_ERR_ID, "[DISPDRV] %s: "
			"Failed To Configure TE Input\n", __FUNCTION__);
		return (-1);
	}

	if (CSL_DSI_Init(pPanel->dsi_cfg) != CSL_LCD_OK) {
		LCD_DBG(LCD_DBG_ERR_ID, "[DISPDRV] %s: ERROR, DSI CSL Init "
			"Failed\n\r", __FUNCTION__);
		return (-1);
	}

	if (CSL_DSI_OpenClient(pPanel->busNo, &pPanel->clientH) != CSL_LCD_OK) {
		LCD_DBG(LCD_DBG_ERR_ID,
			"[DISPDRV] %s: ERROR, CSL_DSI_OpenClient " "Failed\n\r",
			__FUNCTION__);
		return (-1);
	}

	if (CSL_DSI_OpenCmVc
	    (pPanel->clientH, pPanel->cmnd_mode, &pPanel->dsiCmVcHandle)
	    != CSL_LCD_OK) {
		LCD_DBG(LCD_DBG_ERR_ID,
			"[DISPDRV] %s: CSL_DSI_OpenCmVc Failed\n\r",
			__FUNCTION__);
		return (-1);
	}
#ifdef UNDER_LINUX
	if (csl_dma_vc4lite_init() != DMA_VC4LITE_STATUS_SUCCESS) {
		LCD_DBG(LCD_DBG_ERR_ID,
			"[DISPDRV] %s: csl_dma_vc4lite_init Failed\n\r",
			__FUNCTION__);
		return (-1);
	}
#endif
   

	pPanel->win.left = 0;
	pPanel->win.right = Disp_Info.width - 1;
	pPanel->win.top = 0;
	pPanel->win.bottom = Disp_Info.height - 1;
	pPanel->win.width = Disp_Info.width;
	pPanel->win.height = Disp_Info.height;

	pPanel->drvState = DRV_STATE_OPEN;

	LCD_DBG(LCD_DBG_INIT_ID, "[DISPDRV] %s: OK\n\r", __FUNCTION__);

	return (res);
}
/*
 *
 *  Function Name: DSI_Open
 *
 *  Description:   disp bus ON
 *
 */
Int32 DSI_Open(DISPDRV_HANDLE_T drvH)
{
	Int32 res = 0;
	DispDrv_PANEL_t	*pPanel;

	pPanel = (DispDrv_PANEL_t *) drvH;

	DSI_INFO("enter\n");

	if (pPanel->drvState !=	DRV_STATE_INIT)	{
		DSI_ERR("ERROR State != Init\n");
		return -1;
	}

	if (brcm_enable_dsi_pll_clocks(pPanel->busNo,
		pPanel->dsi_cfg->hsBitClk.clkIn_MHz * 1000000,
		pPanel->dsi_cfg->hsBitClk.clkInDiv,
		pPanel->disp_info->desense_offset,
		pPanel->dsi_cfg->escClk.clkIn_MHz   * 1000000
		/ pPanel->dsi_cfg->escClk.clkInDiv)) {

		DSI_ERR("ERROR enabling clock\n");
	}

	if (pPanel->isTE && DSI_TeOn(pPanel) == -1) {
		DSI_ERR("Failed to Configure TE Input\n");
		goto err_te_on;
	}

	if (CSL_DSI_Init(pPanel->dsi_cfg) != CSL_LCD_OK) {
		DSI_ERR("DSI CSL Init Failed\n");
		goto err_dsi_init;
	}

	if (CSL_DSI_OpenClient(pPanel->busNo, &pPanel->clientH)	!= CSL_LCD_OK) {
		DSI_ERR("CSL_DSI_OpenClient Failed\n");
		goto err_dsi_open_cl;
	}

	if (CSL_DSI_OpenCmVc(pPanel->clientH,
		pPanel->cmnd_mode, &pPanel->dsiCmVcHandle) != CSL_LCD_OK) {

		DSI_ERR("CSL_DSI_OpenCmVc Failed\n");
		goto err_dsi_open_cm;
	}

	if (!pPanel->dsi_cfg->dispEngine && pPanel->dsi_cfg->pixTxporter) {
		DSI_ERR("Cannot transfer pixels via MMDMA to DispEngine 0.");
		DSI_ERR("Default to Display Engine 1\n");
		pPanel->dsi_cfg->dispEngine = 1;
	}

	if (pPanel->dsi_cfg->dispEngine && pPanel->dsi_cfg->pixTxporter) {
		if (csl_dma_vc4lite_init() != DMA_VC4LITE_STATUS_SUCCESS) {
			DSI_ERR("csl_dma_vc4lite_init Failed\n");
			goto err_dma_init;
		}
	}
	if (!disp_reg) {
		/*CAM2 LDO */
		disp_reg = regulator_get(NULL, pPanel->disp_info->reg_name);
		if (IS_ERR_OR_NULL(disp_reg)) {
			DSI_ERR("Failed to get disp_reg\n");
			goto err_reg_init;
		}
		if (g_display_enabled)
			regulator_enable(disp_reg); /* Turn ON disp_reg to increase use count */
	}
	res = gpio_request(pPanel->disp_info->rst->gpio, "LCD_RST");
	if (res < 0) {
		DSI_ERR("gpio_request failed %ld\n", res);
		goto err_gpio_request;
	}

	if (!g_display_enabled)
		hw_reset(drvH, FALSE);
#if 0	// SS & DS not used
	if (DSI_ReadPanelID(pPanel) < 0) {
		DSI_ERR("ID read failed\n");
		goto err_id_read;
	}
#endif
	pPanel->win_dim.l = 0;
	pPanel->win_dim.r = pPanel->disp_info->width-1;
	pPanel->win_dim.t = 0;
	pPanel->win_dim.b = pPanel->disp_info->height-1;
	pPanel->win_dim.w = pPanel->disp_info->width;
	pPanel->win_dim.h = pPanel->disp_info->height;

	pPanel->drvState = DRV_STATE_OPEN;

	DSI_INFO("OK\n");

	return res;
#if 0
err_id_read:
	gpio_free(pPanel->disp_info->rst->gpio);
#endif
err_gpio_request:
err_reg_init:
err_dma_init:
	CSL_DSI_CloseCmVc(pPanel->dsiCmVcHandle);
err_dsi_open_cm:
	CSL_DSI_CloseClient(pPanel->clientH);
err_dsi_open_cl:
	CSL_DSI_Close(pPanel->busNo);
err_dsi_init:
	if (pPanel->isTE)
		DSI_TeOff(pPanel);
err_te_on:
	return -1;
}