drm/edid: Break out reading block 0 of the EDID
A future change wants to be able to read just block 0 of the EDID, so break it out of drm_do_get_edid() into a sub-function. This is intended to be a no-op change--just code movement. Signed-off-by: Douglas Anderson <dianders@chromium.org> Acked-by: Sam Ravnborg <sam@ravnborg.org> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Link: https://patchwork.freedesktop.org/patch/msgid/20210914132020.v5.2.I62e76a034ac78c994d40a23cd4ec5aeee56fa77c@changeid
This commit is contained in:
		
							parent
							
								
									29145a5668
								
							
						
					
					
						commit
						bac9c29482
					
				| @ -1905,6 +1905,44 @@ int drm_add_override_edid_modes(struct drm_connector *connector) | ||||
| } | ||||
| EXPORT_SYMBOL(drm_add_override_edid_modes); | ||||
| 
 | ||||
| static struct edid *drm_do_get_edid_base_block( | ||||
| 	int (*get_edid_block)(void *data, u8 *buf, unsigned int block, | ||||
| 			      size_t len), | ||||
| 	void *data, bool *edid_corrupt, int *null_edid_counter) | ||||
| { | ||||
| 	int i; | ||||
| 	void *edid; | ||||
| 
 | ||||
| 	edid = kmalloc(EDID_LENGTH, GFP_KERNEL); | ||||
| 	if (edid == NULL) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	/* base block fetch */ | ||||
| 	for (i = 0; i < 4; i++) { | ||||
| 		if (get_edid_block(data, edid, 0, EDID_LENGTH)) | ||||
| 			goto out; | ||||
| 		if (drm_edid_block_valid(edid, 0, false, edid_corrupt)) | ||||
| 			break; | ||||
| 		if (i == 0 && drm_edid_is_zero(edid, EDID_LENGTH)) { | ||||
| 			if (null_edid_counter) | ||||
| 				(*null_edid_counter)++; | ||||
| 			goto carp; | ||||
| 		} | ||||
| 	} | ||||
| 	if (i == 4) | ||||
| 		goto carp; | ||||
| 
 | ||||
| 	return edid; | ||||
| 
 | ||||
| carp: | ||||
| 	kfree(edid); | ||||
| 	return ERR_PTR(-EINVAL); | ||||
| 
 | ||||
| out: | ||||
| 	kfree(edid); | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * drm_do_get_edid - get EDID data using a custom EDID block read function | ||||
|  * @connector: connector we're probing | ||||
| @ -1938,25 +1976,16 @@ struct edid *drm_do_get_edid(struct drm_connector *connector, | ||||
| 	if (override) | ||||
| 		return override; | ||||
| 
 | ||||
| 	if ((edid = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL) | ||||
| 	edid = (u8 *)drm_do_get_edid_base_block(get_edid_block, data, | ||||
| 						&connector->edid_corrupt, | ||||
| 						&connector->null_edid_counter); | ||||
| 	if (IS_ERR_OR_NULL(edid)) { | ||||
| 		if (IS_ERR(edid)) | ||||
| 			connector_bad_edid(connector, edid, 1); | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	/* base block fetch */ | ||||
| 	for (i = 0; i < 4; i++) { | ||||
| 		if (get_edid_block(data, edid, 0, EDID_LENGTH)) | ||||
| 			goto out; | ||||
| 		if (drm_edid_block_valid(edid, 0, false, | ||||
| 					 &connector->edid_corrupt)) | ||||
| 			break; | ||||
| 		if (i == 0 && drm_edid_is_zero(edid, EDID_LENGTH)) { | ||||
| 			connector->null_edid_counter++; | ||||
| 			goto carp; | ||||
| 		} | ||||
| 	} | ||||
| 	if (i == 4) | ||||
| 		goto carp; | ||||
| 
 | ||||
| 	/* if there's no extensions, we're done */ | ||||
| 	/* if there's no extensions or no connector, we're done */ | ||||
| 	valid_extensions = edid[0x7e]; | ||||
| 	if (valid_extensions == 0) | ||||
| 		return (struct edid *)edid; | ||||
| @ -2010,8 +2039,6 @@ struct edid *drm_do_get_edid(struct drm_connector *connector, | ||||
| 
 | ||||
| 	return (struct edid *)edid; | ||||
| 
 | ||||
| carp: | ||||
| 	connector_bad_edid(connector, edid, 1); | ||||
| out: | ||||
| 	kfree(edid); | ||||
| 	return NULL; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user