Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/connector: add CEC-related fields

As a preparation to adding HDMI CEC helper code, add CEC-related fields
to the struct drm_connector. The callbacks abstract CEC infrastructure
in order to support CEC adapters and CEC notifiers in a universal way.

CEC data is a void pointer as it allows us to make CEC data
helper-specific. For example, currently it will be either cec_notifier
or cec_adapter + drm_connector_hdmi_cec_funcs. Later cec-pin might store
platform callbacks here. DP CEC might need to store AUX pointer, etc.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://lore.kernel.org/r/20250517-drm-hdmi-connector-cec-v6-3-35651db6f19b@oss.qualcomm.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>

+89
+41
drivers/gpu/drm/drm_connector.c
··· 279 279 INIT_LIST_HEAD(&connector->probed_modes); 280 280 INIT_LIST_HEAD(&connector->modes); 281 281 mutex_init(&connector->mutex); 282 + mutex_init(&connector->cec.mutex); 282 283 mutex_init(&connector->eld_mutex); 283 284 mutex_init(&connector->edid_override_mutex); 284 285 mutex_init(&connector->hdmi.infoframes.lock); ··· 701 700 list_del(&mode->head); 702 701 drm_mode_destroy(connector->dev, mode); 703 702 } 703 + 704 + /** 705 + * drm_connector_cec_phys_addr_invalidate - invalidate CEC physical address 706 + * @connector: connector undergoing CEC operation 707 + * 708 + * Invalidated CEC physical address set for this DRM connector. 709 + */ 710 + void drm_connector_cec_phys_addr_invalidate(struct drm_connector *connector) 711 + { 712 + mutex_lock(&connector->cec.mutex); 713 + 714 + if (connector->cec.funcs && 715 + connector->cec.funcs->phys_addr_invalidate) 716 + connector->cec.funcs->phys_addr_invalidate(connector); 717 + 718 + mutex_unlock(&connector->cec.mutex); 719 + } 720 + EXPORT_SYMBOL(drm_connector_cec_phys_addr_invalidate); 721 + 722 + /** 723 + * drm_connector_cec_phys_addr_set - propagate CEC physical address 724 + * @connector: connector undergoing CEC operation 725 + * 726 + * Propagate CEC physical address from the display_info to this DRM connector. 727 + */ 728 + void drm_connector_cec_phys_addr_set(struct drm_connector *connector) 729 + { 730 + u16 addr; 731 + 732 + mutex_lock(&connector->cec.mutex); 733 + 734 + addr = connector->display_info.source_physical_address; 735 + 736 + if (connector->cec.funcs && 737 + connector->cec.funcs->phys_addr_set) 738 + connector->cec.funcs->phys_addr_set(connector, addr); 739 + 740 + mutex_unlock(&connector->cec.mutex); 741 + } 742 + EXPORT_SYMBOL(drm_connector_cec_phys_addr_set); 704 743 705 744 /** 706 745 * drm_connector_cleanup - cleans up an initialised connector
+48
include/drm/drm_connector.h
··· 1191 1191 bool enable, int direction); 1192 1192 }; 1193 1193 1194 + void drm_connector_cec_phys_addr_invalidate(struct drm_connector *connector); 1195 + void drm_connector_cec_phys_addr_set(struct drm_connector *connector); 1196 + 1197 + /** 1198 + * struct drm_connector_cec_funcs - drm_hdmi_connector control functions 1199 + */ 1200 + struct drm_connector_cec_funcs { 1201 + /** 1202 + * @phys_addr_invalidate: mark CEC physical address as invalid 1203 + * 1204 + * The callback to mark CEC physical address as invalid, abstracting 1205 + * the operation. 1206 + */ 1207 + void (*phys_addr_invalidate)(struct drm_connector *connector); 1208 + 1209 + /** 1210 + * @phys_addr_set: set CEC physical address 1211 + * 1212 + * The callback to set CEC physical address, abstracting the operation. 1213 + */ 1214 + void (*phys_addr_set)(struct drm_connector *connector, u16 addr); 1215 + }; 1216 + 1194 1217 /** 1195 1218 * struct drm_connector_hdmi_funcs - drm_hdmi_connector control functions 1196 1219 */ ··· 1856 1833 }; 1857 1834 1858 1835 /** 1836 + * struct drm_connector_cec - DRM Connector CEC-related structure 1837 + */ 1838 + struct drm_connector_cec { 1839 + /** 1840 + * @mutex: protects all fields in this structure. 1841 + */ 1842 + struct mutex mutex; 1843 + 1844 + /** 1845 + * @funcs: CEC Control Functions 1846 + */ 1847 + const struct drm_connector_cec_funcs *funcs; 1848 + 1849 + /** 1850 + * @data: CEC implementation-specific data 1851 + */ 1852 + void *data; 1853 + }; 1854 + 1855 + /** 1859 1856 * struct drm_connector - central DRM connector control structure 1860 1857 * 1861 1858 * Each connector may be connected to one or more CRTCs, or may be clonable by ··· 2296 2253 * @hdmi_audio: HDMI codec properties and non-DRM state. 2297 2254 */ 2298 2255 struct drm_connector_hdmi_audio hdmi_audio; 2256 + 2257 + /** 2258 + * @cec: CEC-related data. 2259 + */ 2260 + struct drm_connector_cec cec; 2299 2261 }; 2300 2262 2301 2263 #define obj_to_connector(x) container_of(x, struct drm_connector, base)