Move the logic from drm_probe_ddc() into drm_edid_probe_custom(), which receives the EDID read function as argument. Allows drivers without DDC to implement similar functionality without duplicating the code. Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx> --- drivers/gpu/drm/drm_edid.c | 22 +++++++++++++++++++--- include/drm/drm_edid.h | 3 +++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index ea77577a37864..a3e9333f9177a 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -2608,6 +2608,24 @@ void drm_edid_free(const struct drm_edid *drm_edid) } EXPORT_SYMBOL(drm_edid_free); +/** + * drm_edid_probe_custom() - probe DDC presence + * @read_block: EDID block read function + * @context: Private data passed to the block read function + * + * Probes for EDID data. Only reads enough data to detect the presence + * of the EDID channel. + * + * Return: True on success, false on failure. + */ +bool drm_edid_probe_custom(read_block_fn read_block, void *context) +{ + unsigned char out; + + return (read_block(context, &out, 0, 1) == 0); +} +EXPORT_SYMBOL(drm_edid_probe_custom); + /** * drm_probe_ddc() - probe DDC presence * @adapter: I2C adapter to probe @@ -2617,9 +2635,7 @@ EXPORT_SYMBOL(drm_edid_free); bool drm_probe_ddc(struct i2c_adapter *adapter) { - unsigned char out; - - return (drm_do_probe_ddc_edid(adapter, &out, 0, 1) == 0); + return drm_edid_probe_custom(drm_do_probe_ddc_edid, adapter); } EXPORT_SYMBOL(drm_probe_ddc); diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index 6f65bbf655a1f..4d1797ade5f1d 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -410,6 +410,9 @@ static inline void drm_edid_decode_panel_id(u32 panel_id, char vend[4], u16 *pro drm_edid_decode_mfg_id(panel_id >> 16, vend); } +bool +drm_edid_probe_custom(int (*read_block)(void *context, u8 *buf, unsigned int block, size_t len), + void *context); bool drm_probe_ddc(struct i2c_adapter *adapter); struct edid *drm_do_get_edid(struct drm_connector *connector, int (*get_edid_block)(void *data, u8 *buf, unsigned int block, -- 2.44.0