Merge tag 'drm-intel-next-2019-10-07' of git://anongit.freedesktop.org/drm/drm-intel...
[linux-2.6-microblaze.git] / include / media / cec-notifier.h
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  */
97 void cec_notifier_cec_adap_unregister(struct cec_notifier *n);
98
99 /**
100  * cec_notifier_set_phys_addr - set a new physical address.
101  * @n: the CEC notifier
102  * @pa: the CEC physical address
103  *
104  * Set a new CEC physical address.
105  * Does nothing if @n == NULL.
106  */
107 void cec_notifier_set_phys_addr(struct cec_notifier *n, u16 pa);
108
109 /**
110  * cec_notifier_set_phys_addr_from_edid - set parse the PA from the EDID.
111  * @n: the CEC notifier
112  * @edid: the struct edid pointer
113  *
114  * Parses the EDID to obtain the new CEC physical address and set it.
115  * Does nothing if @n == NULL.
116  */
117 void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n,
118                                           const struct edid *edid);
119
120 /**
121  * cec_notifier_parse_hdmi_phandle - find the hdmi device from "hdmi-phandle"
122  * @dev: the device with the "hdmi-phandle" device tree property
123  *
124  * Returns the device pointer referenced by the "hdmi-phandle" property.
125  * Note that the refcount of the returned device is not incremented.
126  * This device pointer is only used as a key value in the notifier
127  * list, but it is never accessed by the CEC driver.
128  */
129 struct device *cec_notifier_parse_hdmi_phandle(struct device *dev);
130
131 #else
132 static inline struct cec_notifier *cec_notifier_get_conn(struct device *dev,
133                                                          const char *conn)
134 {
135         /* A non-NULL pointer is expected on success */
136         return (struct cec_notifier *)0xdeadfeed;
137 }
138
139 static inline void cec_notifier_put(struct cec_notifier *n)
140 {
141 }
142
143 static inline struct cec_notifier *
144 cec_notifier_conn_register(struct device *hdmi_dev, const char *conn_name,
145                            const struct cec_connector_info *conn_info)
146 {
147         /* A non-NULL pointer is expected on success */
148         return (struct cec_notifier *)0xdeadfeed;
149 }
150
151 static inline void cec_notifier_conn_unregister(struct cec_notifier *n)
152 {
153 }
154
155 static inline struct cec_notifier *
156 cec_notifier_cec_adap_register(struct device *hdmi_dev, const char *conn_name,
157                                struct cec_adapter *adap)
158 {
159         /* A non-NULL pointer is expected on success */
160         return (struct cec_notifier *)0xdeadfeed;
161 }
162
163 static inline void cec_notifier_cec_adap_unregister(struct cec_notifier *n)
164 {
165 }
166
167 static inline void cec_notifier_set_phys_addr(struct cec_notifier *n, u16 pa)
168 {
169 }
170
171 static inline void cec_notifier_set_phys_addr_from_edid(struct cec_notifier *n,
172                                                         const struct edid *edid)
173 {
174 }
175
176 static inline struct device *cec_notifier_parse_hdmi_phandle(struct device *dev)
177 {
178         return ERR_PTR(-ENODEV);
179 }
180
181 #endif
182
183 /**
184  * cec_notifier_get - find or create a new cec_notifier for the given device.
185  * @dev: device that sends the events.
186  *
187  * If a notifier for device @dev already exists, then increase the refcount
188  * and return that notifier.
189  *
190  * If it doesn't exist, then allocate a new notifier struct and return a
191  * pointer to that new struct.
192  *
193  * Return NULL if the memory could not be allocated.
194  */
195 static inline struct cec_notifier *cec_notifier_get(struct device *dev)
196 {
197         return cec_notifier_get_conn(dev, NULL);
198 }
199
200 /**
201  * cec_notifier_phys_addr_invalidate() - set the physical address to INVALID
202  *
203  * @n: the CEC notifier
204  *
205  * This is a simple helper function to invalidate the physical
206  * address. Does nothing if @n == NULL.
207  */
208 static inline void cec_notifier_phys_addr_invalidate(struct cec_notifier *n)
209 {
210         cec_notifier_set_phys_addr(n, CEC_PHYS_ADDR_INVALID);
211 }
212
213 #endif