1*8b1a8f8bSDmitry Baryshkov /* SPDX-License-Identifier: MIT */ 2*8b1a8f8bSDmitry Baryshkov 3*8b1a8f8bSDmitry Baryshkov #ifndef DRM_DISPLAY_HDMI_CEC_HELPER 4*8b1a8f8bSDmitry Baryshkov #define DRM_DISPLAY_HDMI_CEC_HELPER 5*8b1a8f8bSDmitry Baryshkov 6*8b1a8f8bSDmitry Baryshkov #include <linux/types.h> 7*8b1a8f8bSDmitry Baryshkov 8*8b1a8f8bSDmitry Baryshkov struct drm_connector; 9*8b1a8f8bSDmitry Baryshkov 10*8b1a8f8bSDmitry Baryshkov struct cec_msg; 11*8b1a8f8bSDmitry Baryshkov struct device; 12*8b1a8f8bSDmitry Baryshkov 13*8b1a8f8bSDmitry Baryshkov struct drm_connector_hdmi_cec_funcs { 14*8b1a8f8bSDmitry Baryshkov /** 15*8b1a8f8bSDmitry Baryshkov * @init: perform hardware-specific initialization before registering the CEC adapter 16*8b1a8f8bSDmitry Baryshkov */ 17*8b1a8f8bSDmitry Baryshkov int (*init)(struct drm_connector *connector); 18*8b1a8f8bSDmitry Baryshkov 19*8b1a8f8bSDmitry Baryshkov /** 20*8b1a8f8bSDmitry Baryshkov * @uninit: perform hardware-specific teardown for the CEC adapter 21*8b1a8f8bSDmitry Baryshkov */ 22*8b1a8f8bSDmitry Baryshkov void (*uninit)(struct drm_connector *connector); 23*8b1a8f8bSDmitry Baryshkov 24*8b1a8f8bSDmitry Baryshkov /** 25*8b1a8f8bSDmitry Baryshkov * @enable: enable or disable CEC adapter 26*8b1a8f8bSDmitry Baryshkov */ 27*8b1a8f8bSDmitry Baryshkov int (*enable)(struct drm_connector *connector, bool enable); 28*8b1a8f8bSDmitry Baryshkov 29*8b1a8f8bSDmitry Baryshkov /** 30*8b1a8f8bSDmitry Baryshkov * @log_addr: set adapter's logical address, can be called multiple 31*8b1a8f8bSDmitry Baryshkov * times if adapter supports several LAs 32*8b1a8f8bSDmitry Baryshkov */ 33*8b1a8f8bSDmitry Baryshkov int (*log_addr)(struct drm_connector *connector, u8 logical_addr); 34*8b1a8f8bSDmitry Baryshkov 35*8b1a8f8bSDmitry Baryshkov /** 36*8b1a8f8bSDmitry Baryshkov * @transmit: start transmission of the specified CEC message 37*8b1a8f8bSDmitry Baryshkov */ 38*8b1a8f8bSDmitry Baryshkov int (*transmit)(struct drm_connector *connector, u8 attempts, 39*8b1a8f8bSDmitry Baryshkov u32 signal_free_time, struct cec_msg *msg); 40*8b1a8f8bSDmitry Baryshkov }; 41*8b1a8f8bSDmitry Baryshkov 42*8b1a8f8bSDmitry Baryshkov int drmm_connector_hdmi_cec_register(struct drm_connector *connector, 43*8b1a8f8bSDmitry Baryshkov const struct drm_connector_hdmi_cec_funcs *funcs, 44*8b1a8f8bSDmitry Baryshkov const char *name, 45*8b1a8f8bSDmitry Baryshkov u8 available_las, 46*8b1a8f8bSDmitry Baryshkov struct device *dev); 47*8b1a8f8bSDmitry Baryshkov 48*8b1a8f8bSDmitry Baryshkov void drm_connector_hdmi_cec_received_msg(struct drm_connector *connector, 49*8b1a8f8bSDmitry Baryshkov struct cec_msg *msg); 50*8b1a8f8bSDmitry Baryshkov 51*8b1a8f8bSDmitry Baryshkov void drm_connector_hdmi_cec_transmit_done(struct drm_connector *connector, 52*8b1a8f8bSDmitry Baryshkov u8 status, 53*8b1a8f8bSDmitry Baryshkov u8 arb_lost_cnt, u8 nack_cnt, 54*8b1a8f8bSDmitry Baryshkov u8 low_drive_cnt, u8 error_cnt); 55*8b1a8f8bSDmitry Baryshkov 56*8b1a8f8bSDmitry Baryshkov void drm_connector_hdmi_cec_transmit_attempt_done(struct drm_connector *connector, 57*8b1a8f8bSDmitry Baryshkov u8 status); 58*8b1a8f8bSDmitry Baryshkov 59*8b1a8f8bSDmitry Baryshkov #if IS_ENABLED(CONFIG_DRM_DISPLAY_HDMI_CEC_NOTIFIER_HELPER) 60*8b1a8f8bSDmitry Baryshkov int drmm_connector_hdmi_cec_notifier_register(struct drm_connector *connector, 61*8b1a8f8bSDmitry Baryshkov const char *port_name, 62*8b1a8f8bSDmitry Baryshkov struct device *dev); 63*8b1a8f8bSDmitry Baryshkov #else 64*8b1a8f8bSDmitry Baryshkov static inline int drmm_connector_hdmi_cec_notifier_register(struct drm_connector *connector, 65*8b1a8f8bSDmitry Baryshkov const char *port_name, 66*8b1a8f8bSDmitry Baryshkov struct device *dev) 67*8b1a8f8bSDmitry Baryshkov { 68*8b1a8f8bSDmitry Baryshkov return 0; 69*8b1a8f8bSDmitry Baryshkov } 70*8b1a8f8bSDmitry Baryshkov #endif 71*8b1a8f8bSDmitry Baryshkov 72*8b1a8f8bSDmitry Baryshkov #endif 73