/* * 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) */ }
OMAPLFB_UPDATE_MODE OMAPLFBGetUpdateMode(OMAPLFB_DEVINFO *psDevInfo) { #if 0 struct omap_dss_device *psDSSDev = fb2display(psDevInfo->psLINFBInfo); OMAP_DSS_DRIVER(psDSSDrv, psDSSDev); enum omap_dss_update_mode eMode; if (psDSSDrv == NULL || psDSSDrv->get_update_mode == NULL) { DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": %s: Device %u: Can't get update mode\n", __FUNCTION__, psDevInfo->uiFBDevID)); return OMAPLFB_UPDATE_MODE_UNDEFINED; } eMode = psDSSDrv->get_update_mode(psDSSDev); switch(eMode) { case OMAP_DSS_UPDATE_AUTO: return OMAPLFB_UPDATE_MODE_AUTO; case OMAP_DSS_UPDATE_MANUAL: return OMAPLFB_UPDATE_MODE_MANUAL; case OMAP_DSS_UPDATE_DISABLED: return OMAPLFB_UPDATE_MODE_DISABLED; default: DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": %s: Device %u: Unknown update mode (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, eMode)); break; } return OMAPLFB_UPDATE_MODE_UNDEFINED; #endif return OMAPLFB_UPDATE_MODE_AUTO; }
OMAPLFB_BOOL OMAPLFBSetUpdateMode(OMAPLFB_DEVINFO *psDevInfo, OMAPLFB_UPDATE_MODE eMode) { #if 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_INFO DRIVER_PREFIX ": %s: Device %u: Can't set update mode\n", __FUNCTION__, psDevInfo->uiFBDevID)); return OMAPLFB_FALSE; } switch(eMode) { case OMAPLFB_UPDATE_MODE_AUTO: eDSSMode = OMAP_DSS_UPDATE_AUTO; break; case OMAPLFB_UPDATE_MODE_MANUAL: eDSSMode = OMAP_DSS_UPDATE_MANUAL; break; case OMAPLFB_UPDATE_MODE_DISABLED: eDSSMode = OMAP_DSS_UPDATE_DISABLED; break; default: DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": %s: Device %u: Unknown update mode (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, eMode)); return OMAPLFB_FALSE; } res = psDSSDrv->set_update_mode(psDSSDev, eDSSMode); if (res != 0) { DEBUG_PRINTK((KERN_INFO DRIVER_PREFIX ": %s: Device %u: set_update_mode failed (%d)\n", __FUNCTION__, psDevInfo->uiFBDevID, res)); } return (res == 0); #endif return 1; }
/* 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; }