xref: /openbmc/linux/include/media/cec-notifier.h (revision aeb64ff3)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * cec-notifier.h - notify CEC drivers of physical address changes
4  *
5  * Copyright 2016 Russell King <rmk+kernel@arm.linux.org.uk>
6  * Copyright 2016-2017 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
7  */
8 
9 #ifndef LINUX_CEC_NOTIFIER_H
10 #define LINUX_CEC_NOTIFIER_H
11 
12 #include <linux/err.h>
13 #include <media/cec.h>
14 
15 struct device;
16 struct edid;
17 struct cec_adapter;
18 struct cec_notifier;
19 
20 #if IS_REACHABLE(CONFIG_CEC_CORE) && IS_ENABLED(CONFIG_CEC_NOTIFIER)
21 
22 /**
23  * cec_notifier_get_conn - find or create a new cec_notifier for the given
24  * device and connector tuple.
25  * @dev: device that sends the events.
26  * @conn: the connector name from which the event occurs
27  *
28  * If a notifier for device @dev already exists, then increase the refcount
29  * and return that notifier.
30  *
31  * If it doesn't exist, then allocate a new notifier struct and return a
32  * pointer to that new struct.
33  *
34  * Return NULL if the memory could not be allocated.
35  */
36 struct cec_notifier *cec_notifier_get_conn(struct device *dev,
37 					   const char *conn);
38 
39 /**
40  * cec_notifier_put - decrease refcount and delete when the refcount reaches 0.
41  * @n: notifier
42  */
43 void cec_notifier_put(struct cec_notifier *n);
44 
45 /**
46  * cec_notifier_conn_register - find or create a new cec_notifier for the given
47  * HDMI device and connector tuple.
48  * @hdmi_dev: HDMI device that sends the events.
49  * @conn_name: the connector name from which the event occurs. May be NULL
50  * if there is always only one HDMI connector created by the HDMI device.
51  * @conn_info: the connector info from which the event occurs (may be NULL)
52  *
53  * If a notifier for device @dev and connector @conn_name already exists, then
54  * increase the refcount and return that notifier.
55  *
56  * If it doesn't exist, then allocate a new notifier struct and return a
57  * pointer to that new struct.
58  *
59  * Return NULL if the memory could not be allocated.
60  */
61 struct cec_notifier *
62 cec_notifier_conn_register(struct device *hdmi_dev, const char *conn_name,
63 			   const struct cec_connector_info *conn_info);
64 
65 /**
66  * cec_notifier_conn_unregister - decrease refcount and delete when the
67  * refcount reaches 0.
68  * @n: notifier. If NULL, then this function does nothing.
69  */
70 void cec_notifier_conn_unregister(struct cec_notifier *n);
71 
72 /**
73  * cec_notifier_cec_adap_register - find or create a new cec_notifier for the
74  * given device.
75  * @hdmi_dev: HDMI device that sends the events.
76  * @conn_name: the connector name from which the event occurs. May be NULL
77  * if there is always only one HDMI connector created by the HDMI device.
78  * @adap: the cec adapter that registered this notifier.
79  *
80  * If a notifier for device @dev and connector @conn_name already exists, then
81  * increase the refcount and return that notifier.
82  *
83  * If it doesn't exist, then allocate a new notifier struct and return a
84  * pointer to that new struct.
85  *
86  * Return NULL if the memory could not be allocated.
87  */
88 struct cec_notifier *
89 cec_notifier_cec_adap_register(struct device *hdmi_dev, const char *conn_name,
90 			       struct cec_adapter *adap);
91 
92 /**
93  * cec_notifier_cec_adap_unregister - decrease refcount and delete when the
94  * refcount reaches 0.
95  * @n: notifier. If NULL, then this function does nothing.
96  * @adap: the cec adapter that registered this notifier.
97  */
98 void cec_notifier_cec_adap_unregister(struct cec_notifier *n,
99 				      struct cec_adapter *adap);
100 
101 /**
102  * cec_notifier_set_phys_addr - set a new physical address.
103  * @n: the CEC notifier
104  * @pa: the CEC physical address
105  *
106  * Set a new CEC physical address.
107  * Does nothing if @n == NULL.
108  */
109 void cec_notifier_set_phys_addr(struct cec_notifier *n, u16 pa);
110 
111 /**
112  * cec_notifier_set_phys_addr_from_edid - set parse the PA from the EDID.
113  * @n: the CEC notifier
114  * @edid: the struct edid pointer
115  *
116  * Parses the EDID to obtain the new CEC physical address and set it.
117  * Does nothing if @n == NULL.
118  */
119 void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n,
120 					  const struct edid *edid);
121 
122 /**
123  * cec_notifier_parse_hdmi_phandle - find the hdmi device from "hdmi-phandle"
124  * @dev: the device with the "hdmi-phandle" device tree property
125  *
126  * Returns the device pointer referenced by the "hdmi-phandle" property.
127  * Note that the refcount of the returned device is not incremented.
128  * This device pointer is only used as a key value in the notifier
129  * list, but it is never accessed by the CEC driver.
130  */
131 struct device *cec_notifier_parse_hdmi_phandle(struct device *dev);
132 
133 #else
134 static inline struct cec_notifier *cec_notifier_get_conn(struct device *dev,
135 							 const char *conn)
136 {
137 	/* A non-NULL pointer is expected on success */
138 	return (struct cec_notifier *)0xdeadfeed;
139 }
140 
141 static inline void cec_notifier_put(struct cec_notifier *n)
142 {
143 }
144 
145 static inline struct cec_notifier *
146 cec_notifier_conn_register(struct device *hdmi_dev, const char *conn_name,
147 			   const struct cec_connector_info *conn_info)
148 {
149 	/* A non-NULL pointer is expected on success */
150 	return (struct cec_notifier *)0xdeadfeed;
151 }
152 
153 static inline void cec_notifier_conn_unregister(struct cec_notifier *n)
154 {
155 }
156 
157 static inline struct cec_notifier *
158 cec_notifier_cec_adap_register(struct device *hdmi_dev, const char *conn_name,
159 			       struct cec_adapter *adap)
160 {
161 	/* A non-NULL pointer is expected on success */
162 	return (struct cec_notifier *)0xdeadfeed;
163 }
164 
165 static inline void cec_notifier_cec_adap_unregister(struct cec_notifier *n,
166 						    struct cec_adapter *adap)
167 {
168 }
169 
170 static inline void cec_notifier_set_phys_addr(struct cec_notifier *n, u16 pa)
171 {
172 }
173 
174 static inline void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n,
175 							const struct edid *edid)
176 {
177 }
178 
179 static inline struct device *cec_notifier_parse_hdmi_phandle(struct device *dev)
180 {
181 	return ERR_PTR(-ENODEV);
182 }
183 
184 #endif
185 
186 /**
187  * cec_notifier_get - find or create a new cec_notifier for the given device.
188  * @dev: device that sends the events.
189  *
190  * If a notifier for device @dev already exists, then increase the refcount
191  * and return that notifier.
192  *
193  * If it doesn't exist, then allocate a new notifier struct and return a
194  * pointer to that new struct.
195  *
196  * Return NULL if the memory could not be allocated.
197  */
198 static inline struct cec_notifier *cec_notifier_get(struct device *dev)
199 {
200 	return cec_notifier_get_conn(dev, NULL);
201 }
202 
203 /**
204  * cec_notifier_phys_addr_invalidate() - set the physical address to INVALID
205  *
206  * @n: the CEC notifier
207  *
208  * This is a simple helper function to invalidate the physical
209  * address. Does nothing if @n == NULL.
210  */
211 static inline void cec_notifier_phys_addr_invalidate(struct cec_notifier *n)
212 {
213 	cec_notifier_set_phys_addr(n, CEC_PHYS_ADDR_INVALID);
214 }
215 
216 #endif
217