drm/kms: add a function that can add the mode for the output device without EDID
Add a function that can be used to add the default mode for the output device without EDID. It will add the default mode that meets with the requirements of given hdisplay/vdisplay limit. Signed-off-by: Zhao Yakui <yakui.zhao@intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
		
							parent
							
								
									559ee21d26
								
							
						
					
					
						commit
						f0fda0a47b
					
				| @ -1215,3 +1215,49 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) | ||||
| 	return num_modes; | ||||
| } | ||||
| EXPORT_SYMBOL(drm_add_edid_modes); | ||||
| 
 | ||||
| /**
 | ||||
|  * drm_add_modes_noedid - add modes for the connectors without EDID | ||||
|  * @connector: connector we're probing | ||||
|  * @hdisplay: the horizontal display limit | ||||
|  * @vdisplay: the vertical display limit | ||||
|  * | ||||
|  * Add the specified modes to the connector's mode list. Only when the | ||||
|  * hdisplay/vdisplay is not beyond the given limit, it will be added. | ||||
|  * | ||||
|  * Return number of modes added or 0 if we couldn't find any. | ||||
|  */ | ||||
| int drm_add_modes_noedid(struct drm_connector *connector, | ||||
| 			int hdisplay, int vdisplay) | ||||
| { | ||||
| 	int i, count, num_modes = 0; | ||||
| 	struct drm_display_mode *mode, *ptr; | ||||
| 	struct drm_device *dev = connector->dev; | ||||
| 
 | ||||
| 	count = sizeof(drm_dmt_modes) / sizeof(struct drm_display_mode); | ||||
| 	if (hdisplay < 0) | ||||
| 		hdisplay = 0; | ||||
| 	if (vdisplay < 0) | ||||
| 		vdisplay = 0; | ||||
| 
 | ||||
| 	for (i = 0; i < count; i++) { | ||||
| 		ptr = &drm_dmt_modes[i]; | ||||
| 		if (hdisplay && vdisplay) { | ||||
| 			/*
 | ||||
| 			 * Only when two are valid, they will be used to check | ||||
| 			 * whether the mode should be added to the mode list of | ||||
| 			 * the connector. | ||||
| 			 */ | ||||
| 			if (ptr->hdisplay > hdisplay || | ||||
| 					ptr->vdisplay > vdisplay) | ||||
| 				continue; | ||||
| 		} | ||||
| 		mode = drm_mode_duplicate(dev, ptr); | ||||
| 		if (mode) { | ||||
| 			drm_mode_probed_add(connector, mode); | ||||
| 			num_modes++; | ||||
| 		} | ||||
| 	} | ||||
| 	return num_modes; | ||||
| } | ||||
| EXPORT_SYMBOL(drm_add_modes_noedid); | ||||
|  | ||||
| @ -750,4 +750,6 @@ extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, | ||||
| extern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev, | ||||
| 				int hdisplay, int vdisplay, int vrefresh, | ||||
| 				bool interlaced, int margins); | ||||
| extern int drm_add_modes_noedid(struct drm_connector *connector, | ||||
| 				int hdisplay, int vdisplay); | ||||
| #endif /* __DRM_CRTC_H__ */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user