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