static int32_t dsih_init(struct panel_spec *panel) { dsih_error_t result = OK; dsih_ctrl_t* dsi_instance = &(autotst_dsi_ctx.dsi_inst); dphy_t *phy = &(dsi_instance->phy_instance); struct info_mipi * mipi = panel->info.mipi; int i = 0; #ifdef FB_DSIH_VERSION_1P21A dsi_core_write_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_INT_MSK0, 0x1fffff); dsi_core_write_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_INT_MSK1, 0x3ffff); #else dsi_core_write_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_ERROR_MSK0, 0x1fffff); dsi_core_write_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_ERROR_MSK1, 0x3ffff); #endif if(SPRDFB_MIPI_MODE_CMD == mipi->work_mode){ dsi_edpi_init(); } #ifndef FB_DSIH_VERSION_1P21A dsi_instance->phy_feq = panel->info.mipi->phy_feq; #endif result = mipi_dsih_open(dsi_instance); if(OK != result){ printk(KERN_ERR "autotst_dsi: [%s]: mipi_dsih_open fail (%d)!\n", __FUNCTION__, result); autotst_dsi_ctx.status = 1; return -1; } result = mipi_dsih_dphy_configure(phy, mipi->lan_number, mipi->phy_feq); if(OK != result){ printk(KERN_ERR "autotst_dsi: [%s]: mipi_dsih_dphy_configure fail (%d)!\n", __FUNCTION__, result); autotst_dsi_ctx.status = 1; return -1; } while(5 != (dsi_core_read_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_PHY_STATUS) & 5)){ if(0x0 == ++i%500000){ printk("autotst_dsi: [%s] warning: busy waiting!\n", __FUNCTION__); } } if(SPRDFB_MIPI_MODE_CMD == mipi->work_mode){ dsi_edpi_setbuswidth(mipi); } result = mipi_dsih_enable_rx(dsi_instance, 1); if(OK != result){ printk(KERN_ERR "autotst_dsi: [%s]: mipi_dsih_enable_rx fail (%d)!\n", __FUNCTION__, result); autotst_dsi_ctx.status = 1; return -1; } result = mipi_dsih_ecc_rx(dsi_instance, 1); if(OK != result){ printk(KERN_ERR "autotst_dsi: [%s]: mipi_dsih_ecc_rx fail (%d)!\n", __FUNCTION__, result); autotst_dsi_ctx.status = 1; return -1; } result = mipi_dsih_eotp_rx(dsi_instance, 1); if(OK != result){ printk(KERN_ERR "autotst_dsi: [%s]: mipi_dsih_eotp_rx fail (%d)!\n", __FUNCTION__, result); autotst_dsi_ctx.status = 1; return -1; } result = mipi_dsih_eotp_tx(dsi_instance, 1); if(OK != result){ printk(KERN_ERR "autotst_dsi: [%s]: mipi_dsih_eotp_tx fail (%d)!\n", __FUNCTION__, result); autotst_dsi_ctx.status = 1; return -1; } if(SPRDFB_MIPI_MODE_VIDEO == mipi->work_mode){ dsi_dpi_init(panel); } #ifdef FB_DSIH_VERSION_1P21A mipi_dsih_dphy_enable_nc_clk(&(dsi_instance->phy_instance), false); #endif autotst_dsi_ctx.status = 0; return 0; }
int32_t sprdfb_dsih_init(struct sprdfb_device *dev) { dsih_error_t result = OK; dsih_ctrl_t* dsi_instance = &(dsi_ctx.dsi_inst); dphy_t *phy = &(dsi_instance->phy_instance); struct info_mipi * mipi = dev->panel->info.mipi; int i = 0; #ifdef FB_DSIH_VERSION_1P21A dsi_core_write_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_INT_MSK0, 0x1fffff); dsi_core_write_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_INT_MSK1, 0x3ffff); #else dsi_core_write_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_ERROR_MSK0, 0x1fffff); dsi_core_write_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_ERROR_MSK1, 0x3ffff); #endif if(SPRDFB_MIPI_MODE_CMD == mipi->work_mode){ dsi_edpi_init(); }/*else{ dsi_dpi_init(dev->panel); }*/ /* result = mipi_dsih_unregister_all_events(dsi_instance); if(OK != result){ printk(KERN_ERR "sprdfb: [%s]: mipi_dsih_unregister_all_events fail (%d)!\n", __FUNCTION__, result); return -1; } */ // dsi_core_write_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_ERROR_MSK0, 0x1fffff); // dsi_core_write_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_ERROR_MSK1, 0x3ffff); #ifndef FB_DSIH_VERSION_1P21A dsi_instance->phy_feq = dev->panel->info.mipi->phy_feq; #endif result = mipi_dsih_open(dsi_instance); if(OK != result){ printk(KERN_ERR "sprdfb: [%s]: mipi_dsih_open fail (%d)!\n", __FUNCTION__, result); dsi_ctx.status = 1; return -1; } result = mipi_dsih_dphy_configure(phy, mipi->lan_number, mipi->phy_feq); if(OK != result){ printk(KERN_ERR "sprdfb: [%s]: mipi_dsih_dphy_configure fail (%d)!\n", __FUNCTION__, result); dsi_ctx.status = 1; return -1; } while(5 != (dsi_core_read_function(SPRD_MIPI_DSIC_BASE, R_DSI_HOST_PHY_STATUS) & 5)){ if(0x0 == ++i%500000){ dsi_print_global_config(); printk("sprdfb: [%s] warning: busy waiting!\n", __FUNCTION__); break; } } if(SPRDFB_MIPI_MODE_CMD == mipi->work_mode){ dsi_edpi_setbuswidth(mipi); } result = mipi_dsih_enable_rx(dsi_instance, 1); if(OK != result){ printk(KERN_ERR "sprdfb: [%s]: mipi_dsih_enable_rx fail (%d)!\n", __FUNCTION__, result); dsi_ctx.status = 1; return -1; } result = mipi_dsih_ecc_rx(dsi_instance, 1); if(OK != result){ printk(KERN_ERR "sprdfb: [%s]: mipi_dsih_ecc_rx fail (%d)!\n", __FUNCTION__, result); dsi_ctx.status = 1; return -1; } result = mipi_dsih_eotp_rx(dsi_instance, 1); if(OK != result){ printk(KERN_ERR "sprdfb: [%s]: mipi_dsih_eotp_rx fail (%d)!\n", __FUNCTION__, result); dsi_ctx.status = 1; return -1; } result = mipi_dsih_eotp_tx(dsi_instance, 1); if(OK != result){ printk(KERN_ERR "sprdfb: [%s]: mipi_dsih_eotp_tx fail (%d)!\n", __FUNCTION__, result); dsi_ctx.status = 1; return -1; } if(SPRDFB_MIPI_MODE_VIDEO == mipi->work_mode){ dsi_dpi_init(dev); } #ifdef FB_DSIH_VERSION_1P21A #ifndef CONFIG_LCD_MIPI_CONTINOUS_CLK mipi_dsih_dphy_enable_nc_clk(&(dsi_instance->phy_instance), 1); #endif #endif dsi_ctx.status = 0; return 0; }