xref: /linux/include/drm/display/drm_hdmi_cec_helper.h (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
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