//***************************************************************************** // // 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; }