/* * Wait for screen to update. If the screen is in manual or auto update * mode, we can call this function to wait for the screen to update. */ OMAPLFB_BOOL OMAPLFBManualSync(OMAPLFB_DEVINFO *psDevInfo) { #if defined(PVR_OMAPLFB_DRM_FB) struct drm_connector *psConnector; for (psConnector = NULL; (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL; ) { /* Try manual sync first, then try wait for vsync */ if (omap_connector_sync(psConnector) != 0) { (void) omap_encoder_wait_for_vsync(psConnector->encoder); } } return OMAPLFB_TRUE; #else /* defined(PVR_OMAPLFB_DRM_FB) */ #if 0 struct omap_dss_device *psDSSDev = fb2display(psDevInfo->psLINFBInfo); OMAP_DSS_DRIVER(psDSSDrv, psDSSDev); if (psDSSDrv != NULL && psDSSDrv->sync != NULL) { int res = psDSSDrv->sync(psDSSDev); if (res != 0) { printk(KERN_ERR DRIVER_PREFIX ": %s: Device %u: Sync failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, res); return OMAPLFB_FALSE; } } #endif return OMAPLFB_TRUE; #endif /* defined(PVR_OMAPLFB_DRM_FB) */ }
/* Wait for VSync */ OMAPLFB_BOOL OMAPLFBWaitForVSync(OMAPLFB_DEVINFO *psDevInfo) { #if defined(PVR_OMAPLFB_DRM_FB) struct drm_connector *psConnector; for (psConnector = NULL; (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL;) { (void) omap_encoder_wait_for_vsync(psConnector->encoder); } return OMAPLFB_TRUE; #else /* defined(PVR_OMAPLFB_DRM_FB) */ #if FBDEV_PRESENT struct omap_dss_device *psDSSDev = fb2display(psDevInfo->psLINFBInfo); OMAP_DSS_MANAGER(psDSSMan, psDSSDev); if (psDSSMan != NULL && WAIT_FOR_VSYNC(psDSSMan) != NULL) { int res = WAIT_FOR_VSYNC(psDSSMan)(psDSSMan); if (res != 0) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Wait for vsync failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, res)); return OMAPLFB_FALSE; } } #endif return OMAPLFB_TRUE; #endif /* defined(PVR_OMAPLFB_DRM_FB) */ }
void OMAPLFBPrintInfo(OMAPLFB_DEVINFO *psDevInfo) { #if defined(PVR_OMAPLFB_DRM_FB) struct drm_connector *psConnector; unsigned uConnectors; unsigned uConnector; DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: DRM framebuffer\n", psDevInfo->uiFBDevID)); for (psConnector = NULL, uConnectors = 0; (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL;) { uConnectors++; } DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Number of screens (DRM connectors): %u\n", psDevInfo->uiFBDevID, uConnectors)); if (uConnectors == 0) { return; } for (psConnector = NULL, uConnector = 0; (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL; uConnector++) { enum omap_dss_update_mode eMode = omap_connector_get_update_mode(psConnector); DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: Screen %u: %s (%d)\n", psDevInfo->uiFBDevID, uConnector, OMAPLFBDSSUpdateModeToString(eMode), (int)eMode)); } #else /* defined(PVR_OMAPLFB_DRM_FB) */ //#if defined(PVR_OMAPLFB_HAS_UPDATE_MODE) OMAPLFB_UPDATE_MODE eMode = OMAPLFBGetUpdateMode(psDevInfo); //DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: %s\n", psDevInfo->uiFBDevID, OMAPLFBUpdateModeToString(eMode))); //#endif DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": Device %u: non-DRM framebuffer\n", psDevInfo->uiFBDevID)); #endif /* defined(PVR_OMAPLFB_DRM_FB) */ }
/* Set display update mode */ OMAPLFB_BOOL OMAPLFBSetUpdateMode(OMAPLFB_DEVINFO *psDevInfo, OMAPLFB_UPDATE_MODE eMode) { #if defined(PVR_OMAPLFB_DRM_FB) struct drm_connector *psConnector; enum omap_dss_update_mode eDSSMode; OMAPLFB_BOOL bSuccess = OMAPLFB_FALSE; OMAPLFB_BOOL bFailure = OMAPLFB_FALSE; if (!OMAPLFBValidateUpdateMode(eMode)) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Unknown update mode (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, (int)eMode)); return OMAPLFB_FALSE; } eDSSMode = OMAPLFBToDSSUpdateMode(eMode); for (psConnector = NULL; (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL;) { int iRes = omap_connector_set_update_mode(psConnector, eDSSMode); OMAPLFB_BOOL bRes = (iRes == 0); bSuccess |= bRes; bFailure |= !bRes; } if (!bFailure) { if (!bSuccess) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: No screens\n", __FUNCTION__, psDevInfo->uiFBDevID)); } return OMAPLFB_TRUE; } if (!bSuccess) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Couldn't set %s for any screen\n", __FUNCTION__, psDevInfo->uiFBDevID, OMAPLFBUpdateModeToString(eMode))); return OMAPLFB_FALSE; } if (eMode == OMAPLFB_UPDATE_MODE_AUTO) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Couldn't set %s for all screens\n", __FUNCTION__, psDevInfo->uiFBDevID, OMAPLFBUpdateModeToString(eMode))); return OMAPLFB_FALSE; } DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": %s: Device %u: %s set for some screens\n", __FUNCTION__, psDevInfo->uiFBDevID, OMAPLFBUpdateModeToString(eMode))); return OMAPLFB_TRUE; #else /* defined(PVR_OMAPLFB_DRM_FB) */ #if LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0) struct omap_dss_device *psDSSDev = fb2display(psDevInfo->psLINFBInfo); OMAP_DSS_DRIVER(psDSSDrv, psDSSDev); enum omap_dss_update_mode eDSSMode; int res; if (psDSSDrv == NULL || psDSSDrv->set_update_mode == NULL) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Can't set update mode\n", __FUNCTION__, psDevInfo->uiFBDevID)); return OMAPLFB_FALSE; } if (!OMAPLFBValidateUpdateMode(eMode)) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Unknown update mode (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, (int)eMode)); return OMAPLFB_FALSE; } eDSSMode = OMAPLFBToDSSUpdateMode(eMode); res = psDSSDrv->set_update_mode(psDSSDev, eDSSMode); if (res != 0) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: set_update_mode (%s) failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, OMAPLFBDSSUpdateModeToString(eDSSMode), res)); } return (res == 0); #else return 1; #endif #endif /* defined(PVR_OMAPLFB_DRM_FB) */ }
/* * Get display update mode. * If the mode is AUTO, we can wait for VSync, if desired. */ OMAPLFB_UPDATE_MODE OMAPLFBGetUpdateMode(OMAPLFB_DEVINFO *psDevInfo) { #if defined(PVR_OMAPLFB_DRM_FB) struct drm_connector *psConnector; OMAPLFB_UPDATE_MODE eMode = OMAPLFB_UPDATE_MODE_UNDEFINED; /* * There may be multiple displays connected. If at least one * display is manual update mode, report all screens as being * in that mode. */ for (psConnector = NULL; (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL;) { switch(omap_connector_get_update_mode(psConnector)) { case OMAP_DSS_UPDATE_MANUAL: eMode = OMAPLFB_UPDATE_MODE_MANUAL; break; case OMAP_DSS_UPDATE_DISABLED: if (eMode == OMAPLFB_UPDATE_MODE_UNDEFINED) { eMode = OMAPLFB_UPDATE_MODE_DISABLED; } break; case OMAP_DSS_UPDATE_AUTO: /* Fall through to default case */ default: /* Asssume auto update is possible */ if (eMode != OMAPLFB_UPDATE_MODE_MANUAL) { eMode = OMAPLFB_UPDATE_MODE_AUTO; } break; } } return eMode; #else /* defined(PVR_OMAPLFB_DRM_FB) */ #if LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0) struct omap_dss_device *psDSSDev = fb2display(psDevInfo->psLINFBInfo); OMAP_DSS_DRIVER(psDSSDrv, psDSSDev); enum omap_dss_update_mode eMode; if (psDSSDrv == NULL) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: No DSS device\n", __FUNCTION__, psDevInfo->uiFBDevID)); return OMAPLFB_UPDATE_MODE_UNDEFINED; } if (psDSSDrv->get_update_mode == NULL) { if (strcmp(psDSSDev->name, "hdmi") == 0) { return OMAPLFB_UPDATE_MODE_AUTO; } // DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: No get_update_mode function\n", __FUNCTION__, psDevInfo->uiFBDevID)); // return OMAPLFB_UPDATE_MODE_UNDEFINED; return OMAPLFB_UPDATE_MODE_AUTO; } eMode = psDSSDrv->get_update_mode(psDSSDev); if (!OMAPLFBValidateDSSUpdateMode(eMode)) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Unknown update mode (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, (int)eMode)); } return OMAPLFBFromDSSUpdateMode(eMode); #else return OMAPLFB_UPDATE_MODE_AUTO; #endif #endif /* defined(PVR_OMAPLFB_DRM_FB) */ }
OMAPLFB_UPDATE_MODE OMAPLFBGetUpdateMode(OMAPLFB_DEVINFO *psDevInfo) { #if 0 #if defined(PVR_OMAPLFB_DRM_FB) struct drm_connector *psConnector; OMAPLFB_UPDATE_MODE eMode = OMAPLFB_UPDATE_MODE_UNDEFINED; for (psConnector = NULL; (psConnector = omap_fbdev_get_next_connector(psDevInfo->psLINFBInfo, psConnector)) != NULL;) { switch(omap_connector_get_update_mode(psConnector)) { case OMAP_DSS_UPDATE_MANUAL: eMode = OMAPLFB_UPDATE_MODE_MANUAL; break; case OMAP_DSS_UPDATE_DISABLED: if (eMode == OMAPLFB_UPDATE_MODE_UNDEFINED) { eMode = OMAPLFB_UPDATE_MODE_DISABLED; } break; case OMAP_DSS_UPDATE_AUTO: default: if (eMode != OMAPLFB_UPDATE_MODE_MANUAL) { eMode = OMAPLFB_UPDATE_MODE_AUTO; } break; } } return eMode; #else struct omap_dss_device *psDSSDev = fb2display(psDevInfo->psLINFBInfo); OMAP_DSS_DRIVER(psDSSDrv, psDSSDev); enum omap_dss_update_mode eMode; if (psDSSDrv == NULL) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: No DSS device\n", __FUNCTION__, psDevInfo->uiFBDevID)); return OMAPLFB_UPDATE_MODE_UNDEFINED; } if (psDSSDrv->get_update_mode == NULL) { if (strcmp(psDSSDev->name, "hdmi") == 0) { return OMAPLFB_UPDATE_MODE_AUTO; } DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: No get_update_mode function\n", __FUNCTION__, psDevInfo->uiFBDevID)); return OMAPLFB_UPDATE_MODE_UNDEFINED; } eMode = psDSSDrv->get_update_mode(psDSSDev); if (!OMAPLFBValidateDSSUpdateMode(eMode)) { DEBUG_PRINTK((KERN_WARNING DRIVER_PREFIX ": %s: Device %u: Unknown update mode (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, (int)eMode)); } return OMAPLFBFromDSSUpdateMode(eMode); #endif #endif return OMAPLFB_UPDATE_MODE_AUTO; }