1*4882a593Smuzhiyun /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * cec - HDMI Consumer Electronics Control public header
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #ifndef _CEC_UAPI_H
9*4882a593Smuzhiyun #define _CEC_UAPI_H
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/types.h>
12*4882a593Smuzhiyun #include <linux/string.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #define CEC_MAX_MSG_SIZE 16
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun /**
17*4882a593Smuzhiyun * struct cec_msg - CEC message structure.
18*4882a593Smuzhiyun * @tx_ts: Timestamp in nanoseconds using CLOCK_MONOTONIC. Set by the
19*4882a593Smuzhiyun * driver when the message transmission has finished.
20*4882a593Smuzhiyun * @rx_ts: Timestamp in nanoseconds using CLOCK_MONOTONIC. Set by the
21*4882a593Smuzhiyun * driver when the message was received.
22*4882a593Smuzhiyun * @len: Length in bytes of the message.
23*4882a593Smuzhiyun * @timeout: The timeout (in ms) that is used to timeout CEC_RECEIVE.
24*4882a593Smuzhiyun * Set to 0 if you want to wait forever. This timeout can also be
25*4882a593Smuzhiyun * used with CEC_TRANSMIT as the timeout for waiting for a reply.
26*4882a593Smuzhiyun * If 0, then it will use a 1 second timeout instead of waiting
27*4882a593Smuzhiyun * forever as is done with CEC_RECEIVE.
28*4882a593Smuzhiyun * @sequence: The framework assigns a sequence number to messages that are
29*4882a593Smuzhiyun * sent. This can be used to track replies to previously sent
30*4882a593Smuzhiyun * messages.
31*4882a593Smuzhiyun * @flags: Set to 0.
32*4882a593Smuzhiyun * @msg: The message payload.
33*4882a593Smuzhiyun * @reply: This field is ignored with CEC_RECEIVE and is only used by
34*4882a593Smuzhiyun * CEC_TRANSMIT. If non-zero, then wait for a reply with this
35*4882a593Smuzhiyun * opcode. Set to CEC_MSG_FEATURE_ABORT if you want to wait for
36*4882a593Smuzhiyun * a possible ABORT reply. If there was an error when sending the
37*4882a593Smuzhiyun * msg or FeatureAbort was returned, then reply is set to 0.
38*4882a593Smuzhiyun * If reply is non-zero upon return, then len/msg are set to
39*4882a593Smuzhiyun * the received message.
40*4882a593Smuzhiyun * If reply is zero upon return and status has the
41*4882a593Smuzhiyun * CEC_TX_STATUS_FEATURE_ABORT bit set, then len/msg are set to
42*4882a593Smuzhiyun * the received feature abort message.
43*4882a593Smuzhiyun * If reply is zero upon return and status has the
44*4882a593Smuzhiyun * CEC_TX_STATUS_MAX_RETRIES bit set, then no reply was seen at
45*4882a593Smuzhiyun * all. If reply is non-zero for CEC_TRANSMIT and the message is a
46*4882a593Smuzhiyun * broadcast, then -EINVAL is returned.
47*4882a593Smuzhiyun * if reply is non-zero, then timeout is set to 1000 (the required
48*4882a593Smuzhiyun * maximum response time).
49*4882a593Smuzhiyun * @rx_status: The message receive status bits. Set by the driver.
50*4882a593Smuzhiyun * @tx_status: The message transmit status bits. Set by the driver.
51*4882a593Smuzhiyun * @tx_arb_lost_cnt: The number of 'Arbitration Lost' events. Set by the driver.
52*4882a593Smuzhiyun * @tx_nack_cnt: The number of 'Not Acknowledged' events. Set by the driver.
53*4882a593Smuzhiyun * @tx_low_drive_cnt: The number of 'Low Drive Detected' events. Set by the
54*4882a593Smuzhiyun * driver.
55*4882a593Smuzhiyun * @tx_error_cnt: The number of 'Error' events. Set by the driver.
56*4882a593Smuzhiyun */
57*4882a593Smuzhiyun struct cec_msg {
58*4882a593Smuzhiyun __u64 tx_ts;
59*4882a593Smuzhiyun __u64 rx_ts;
60*4882a593Smuzhiyun __u32 len;
61*4882a593Smuzhiyun __u32 timeout;
62*4882a593Smuzhiyun __u32 sequence;
63*4882a593Smuzhiyun __u32 flags;
64*4882a593Smuzhiyun __u8 msg[CEC_MAX_MSG_SIZE];
65*4882a593Smuzhiyun __u8 reply;
66*4882a593Smuzhiyun __u8 rx_status;
67*4882a593Smuzhiyun __u8 tx_status;
68*4882a593Smuzhiyun __u8 tx_arb_lost_cnt;
69*4882a593Smuzhiyun __u8 tx_nack_cnt;
70*4882a593Smuzhiyun __u8 tx_low_drive_cnt;
71*4882a593Smuzhiyun __u8 tx_error_cnt;
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun /**
75*4882a593Smuzhiyun * cec_msg_initiator - return the initiator's logical address.
76*4882a593Smuzhiyun * @msg: the message structure
77*4882a593Smuzhiyun */
cec_msg_initiator(const struct cec_msg * msg)78*4882a593Smuzhiyun static inline __u8 cec_msg_initiator(const struct cec_msg *msg)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun return msg->msg[0] >> 4;
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun /**
84*4882a593Smuzhiyun * cec_msg_destination - return the destination's logical address.
85*4882a593Smuzhiyun * @msg: the message structure
86*4882a593Smuzhiyun */
cec_msg_destination(const struct cec_msg * msg)87*4882a593Smuzhiyun static inline __u8 cec_msg_destination(const struct cec_msg *msg)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun return msg->msg[0] & 0xf;
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun /**
93*4882a593Smuzhiyun * cec_msg_opcode - return the opcode of the message, -1 for poll
94*4882a593Smuzhiyun * @msg: the message structure
95*4882a593Smuzhiyun */
cec_msg_opcode(const struct cec_msg * msg)96*4882a593Smuzhiyun static inline int cec_msg_opcode(const struct cec_msg *msg)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun return msg->len > 1 ? msg->msg[1] : -1;
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun /**
102*4882a593Smuzhiyun * cec_msg_is_broadcast - return true if this is a broadcast message.
103*4882a593Smuzhiyun * @msg: the message structure
104*4882a593Smuzhiyun */
cec_msg_is_broadcast(const struct cec_msg * msg)105*4882a593Smuzhiyun static inline int cec_msg_is_broadcast(const struct cec_msg *msg)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun return (msg->msg[0] & 0xf) == 0xf;
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun /**
111*4882a593Smuzhiyun * cec_msg_init - initialize the message structure.
112*4882a593Smuzhiyun * @msg: the message structure
113*4882a593Smuzhiyun * @initiator: the logical address of the initiator
114*4882a593Smuzhiyun * @destination:the logical address of the destination (0xf for broadcast)
115*4882a593Smuzhiyun *
116*4882a593Smuzhiyun * The whole structure is zeroed, the len field is set to 1 (i.e. a poll
117*4882a593Smuzhiyun * message) and the initiator and destination are filled in.
118*4882a593Smuzhiyun */
cec_msg_init(struct cec_msg * msg,__u8 initiator,__u8 destination)119*4882a593Smuzhiyun static inline void cec_msg_init(struct cec_msg *msg,
120*4882a593Smuzhiyun __u8 initiator, __u8 destination)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun memset(msg, 0, sizeof(*msg));
123*4882a593Smuzhiyun msg->msg[0] = (initiator << 4) | destination;
124*4882a593Smuzhiyun msg->len = 1;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun /**
128*4882a593Smuzhiyun * cec_msg_set_reply_to - fill in destination/initiator in a reply message.
129*4882a593Smuzhiyun * @msg: the message structure for the reply
130*4882a593Smuzhiyun * @orig: the original message structure
131*4882a593Smuzhiyun *
132*4882a593Smuzhiyun * Set the msg destination to the orig initiator and the msg initiator to the
133*4882a593Smuzhiyun * orig destination. Note that msg and orig may be the same pointer, in which
134*4882a593Smuzhiyun * case the change is done in place.
135*4882a593Smuzhiyun */
cec_msg_set_reply_to(struct cec_msg * msg,struct cec_msg * orig)136*4882a593Smuzhiyun static inline void cec_msg_set_reply_to(struct cec_msg *msg,
137*4882a593Smuzhiyun struct cec_msg *orig)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun /* The destination becomes the initiator and vice versa */
140*4882a593Smuzhiyun msg->msg[0] = (cec_msg_destination(orig) << 4) |
141*4882a593Smuzhiyun cec_msg_initiator(orig);
142*4882a593Smuzhiyun msg->reply = msg->timeout = 0;
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun /* cec_msg flags field */
146*4882a593Smuzhiyun #define CEC_MSG_FL_REPLY_TO_FOLLOWERS (1 << 0)
147*4882a593Smuzhiyun #define CEC_MSG_FL_RAW (1 << 1)
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun /* cec_msg tx/rx_status field */
150*4882a593Smuzhiyun #define CEC_TX_STATUS_OK (1 << 0)
151*4882a593Smuzhiyun #define CEC_TX_STATUS_ARB_LOST (1 << 1)
152*4882a593Smuzhiyun #define CEC_TX_STATUS_NACK (1 << 2)
153*4882a593Smuzhiyun #define CEC_TX_STATUS_LOW_DRIVE (1 << 3)
154*4882a593Smuzhiyun #define CEC_TX_STATUS_ERROR (1 << 4)
155*4882a593Smuzhiyun #define CEC_TX_STATUS_MAX_RETRIES (1 << 5)
156*4882a593Smuzhiyun #define CEC_TX_STATUS_ABORTED (1 << 6)
157*4882a593Smuzhiyun #define CEC_TX_STATUS_TIMEOUT (1 << 7)
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun #define CEC_RX_STATUS_OK (1 << 0)
160*4882a593Smuzhiyun #define CEC_RX_STATUS_TIMEOUT (1 << 1)
161*4882a593Smuzhiyun #define CEC_RX_STATUS_FEATURE_ABORT (1 << 2)
162*4882a593Smuzhiyun #define CEC_RX_STATUS_ABORTED (1 << 3)
163*4882a593Smuzhiyun
cec_msg_status_is_ok(const struct cec_msg * msg)164*4882a593Smuzhiyun static inline int cec_msg_status_is_ok(const struct cec_msg *msg)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun if (msg->tx_status && !(msg->tx_status & CEC_TX_STATUS_OK))
167*4882a593Smuzhiyun return 0;
168*4882a593Smuzhiyun if (msg->rx_status && !(msg->rx_status & CEC_RX_STATUS_OK))
169*4882a593Smuzhiyun return 0;
170*4882a593Smuzhiyun if (!msg->tx_status && !msg->rx_status)
171*4882a593Smuzhiyun return 0;
172*4882a593Smuzhiyun return !(msg->rx_status & CEC_RX_STATUS_FEATURE_ABORT);
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun #define CEC_LOG_ADDR_INVALID 0xff
176*4882a593Smuzhiyun #define CEC_PHYS_ADDR_INVALID 0xffff
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun /*
179*4882a593Smuzhiyun * The maximum number of logical addresses one device can be assigned to.
180*4882a593Smuzhiyun * The CEC 2.0 spec allows for only 2 logical addresses at the moment. The
181*4882a593Smuzhiyun * Analog Devices CEC hardware supports 3. So let's go wild and go for 4.
182*4882a593Smuzhiyun */
183*4882a593Smuzhiyun #define CEC_MAX_LOG_ADDRS 4
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun /* The logical addresses defined by CEC 2.0 */
186*4882a593Smuzhiyun #define CEC_LOG_ADDR_TV 0
187*4882a593Smuzhiyun #define CEC_LOG_ADDR_RECORD_1 1
188*4882a593Smuzhiyun #define CEC_LOG_ADDR_RECORD_2 2
189*4882a593Smuzhiyun #define CEC_LOG_ADDR_TUNER_1 3
190*4882a593Smuzhiyun #define CEC_LOG_ADDR_PLAYBACK_1 4
191*4882a593Smuzhiyun #define CEC_LOG_ADDR_AUDIOSYSTEM 5
192*4882a593Smuzhiyun #define CEC_LOG_ADDR_TUNER_2 6
193*4882a593Smuzhiyun #define CEC_LOG_ADDR_TUNER_3 7
194*4882a593Smuzhiyun #define CEC_LOG_ADDR_PLAYBACK_2 8
195*4882a593Smuzhiyun #define CEC_LOG_ADDR_RECORD_3 9
196*4882a593Smuzhiyun #define CEC_LOG_ADDR_TUNER_4 10
197*4882a593Smuzhiyun #define CEC_LOG_ADDR_PLAYBACK_3 11
198*4882a593Smuzhiyun #define CEC_LOG_ADDR_BACKUP_1 12
199*4882a593Smuzhiyun #define CEC_LOG_ADDR_BACKUP_2 13
200*4882a593Smuzhiyun #define CEC_LOG_ADDR_SPECIFIC 14
201*4882a593Smuzhiyun #define CEC_LOG_ADDR_UNREGISTERED 15 /* as initiator address */
202*4882a593Smuzhiyun #define CEC_LOG_ADDR_BROADCAST 15 /* as destination address */
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun /* The logical address types that the CEC device wants to claim */
205*4882a593Smuzhiyun #define CEC_LOG_ADDR_TYPE_TV 0
206*4882a593Smuzhiyun #define CEC_LOG_ADDR_TYPE_RECORD 1
207*4882a593Smuzhiyun #define CEC_LOG_ADDR_TYPE_TUNER 2
208*4882a593Smuzhiyun #define CEC_LOG_ADDR_TYPE_PLAYBACK 3
209*4882a593Smuzhiyun #define CEC_LOG_ADDR_TYPE_AUDIOSYSTEM 4
210*4882a593Smuzhiyun #define CEC_LOG_ADDR_TYPE_SPECIFIC 5
211*4882a593Smuzhiyun #define CEC_LOG_ADDR_TYPE_UNREGISTERED 6
212*4882a593Smuzhiyun /*
213*4882a593Smuzhiyun * Switches should use UNREGISTERED.
214*4882a593Smuzhiyun * Processors should use SPECIFIC.
215*4882a593Smuzhiyun */
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun #define CEC_LOG_ADDR_MASK_TV (1 << CEC_LOG_ADDR_TV)
218*4882a593Smuzhiyun #define CEC_LOG_ADDR_MASK_RECORD ((1 << CEC_LOG_ADDR_RECORD_1) | \
219*4882a593Smuzhiyun (1 << CEC_LOG_ADDR_RECORD_2) | \
220*4882a593Smuzhiyun (1 << CEC_LOG_ADDR_RECORD_3))
221*4882a593Smuzhiyun #define CEC_LOG_ADDR_MASK_TUNER ((1 << CEC_LOG_ADDR_TUNER_1) | \
222*4882a593Smuzhiyun (1 << CEC_LOG_ADDR_TUNER_2) | \
223*4882a593Smuzhiyun (1 << CEC_LOG_ADDR_TUNER_3) | \
224*4882a593Smuzhiyun (1 << CEC_LOG_ADDR_TUNER_4))
225*4882a593Smuzhiyun #define CEC_LOG_ADDR_MASK_PLAYBACK ((1 << CEC_LOG_ADDR_PLAYBACK_1) | \
226*4882a593Smuzhiyun (1 << CEC_LOG_ADDR_PLAYBACK_2) | \
227*4882a593Smuzhiyun (1 << CEC_LOG_ADDR_PLAYBACK_3))
228*4882a593Smuzhiyun #define CEC_LOG_ADDR_MASK_AUDIOSYSTEM (1 << CEC_LOG_ADDR_AUDIOSYSTEM)
229*4882a593Smuzhiyun #define CEC_LOG_ADDR_MASK_BACKUP ((1 << CEC_LOG_ADDR_BACKUP_1) | \
230*4882a593Smuzhiyun (1 << CEC_LOG_ADDR_BACKUP_2))
231*4882a593Smuzhiyun #define CEC_LOG_ADDR_MASK_SPECIFIC (1 << CEC_LOG_ADDR_SPECIFIC)
232*4882a593Smuzhiyun #define CEC_LOG_ADDR_MASK_UNREGISTERED (1 << CEC_LOG_ADDR_UNREGISTERED)
233*4882a593Smuzhiyun
cec_has_tv(__u16 log_addr_mask)234*4882a593Smuzhiyun static inline int cec_has_tv(__u16 log_addr_mask)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun return log_addr_mask & CEC_LOG_ADDR_MASK_TV;
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun
cec_has_record(__u16 log_addr_mask)239*4882a593Smuzhiyun static inline int cec_has_record(__u16 log_addr_mask)
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun return log_addr_mask & CEC_LOG_ADDR_MASK_RECORD;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun
cec_has_tuner(__u16 log_addr_mask)244*4882a593Smuzhiyun static inline int cec_has_tuner(__u16 log_addr_mask)
245*4882a593Smuzhiyun {
246*4882a593Smuzhiyun return log_addr_mask & CEC_LOG_ADDR_MASK_TUNER;
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun
cec_has_playback(__u16 log_addr_mask)249*4882a593Smuzhiyun static inline int cec_has_playback(__u16 log_addr_mask)
250*4882a593Smuzhiyun {
251*4882a593Smuzhiyun return log_addr_mask & CEC_LOG_ADDR_MASK_PLAYBACK;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun
cec_has_audiosystem(__u16 log_addr_mask)254*4882a593Smuzhiyun static inline int cec_has_audiosystem(__u16 log_addr_mask)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun return log_addr_mask & CEC_LOG_ADDR_MASK_AUDIOSYSTEM;
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun
cec_has_backup(__u16 log_addr_mask)259*4882a593Smuzhiyun static inline int cec_has_backup(__u16 log_addr_mask)
260*4882a593Smuzhiyun {
261*4882a593Smuzhiyun return log_addr_mask & CEC_LOG_ADDR_MASK_BACKUP;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
cec_has_specific(__u16 log_addr_mask)264*4882a593Smuzhiyun static inline int cec_has_specific(__u16 log_addr_mask)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun return log_addr_mask & CEC_LOG_ADDR_MASK_SPECIFIC;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
cec_is_unregistered(__u16 log_addr_mask)269*4882a593Smuzhiyun static inline int cec_is_unregistered(__u16 log_addr_mask)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun return log_addr_mask & CEC_LOG_ADDR_MASK_UNREGISTERED;
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun
cec_is_unconfigured(__u16 log_addr_mask)274*4882a593Smuzhiyun static inline int cec_is_unconfigured(__u16 log_addr_mask)
275*4882a593Smuzhiyun {
276*4882a593Smuzhiyun return log_addr_mask == 0;
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun /*
280*4882a593Smuzhiyun * Use this if there is no vendor ID (CEC_G_VENDOR_ID) or if the vendor ID
281*4882a593Smuzhiyun * should be disabled (CEC_S_VENDOR_ID)
282*4882a593Smuzhiyun */
283*4882a593Smuzhiyun #define CEC_VENDOR_ID_NONE 0xffffffff
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun /* The message handling modes */
286*4882a593Smuzhiyun /* Modes for initiator */
287*4882a593Smuzhiyun #define CEC_MODE_NO_INITIATOR (0x0 << 0)
288*4882a593Smuzhiyun #define CEC_MODE_INITIATOR (0x1 << 0)
289*4882a593Smuzhiyun #define CEC_MODE_EXCL_INITIATOR (0x2 << 0)
290*4882a593Smuzhiyun #define CEC_MODE_INITIATOR_MSK 0x0f
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun /* Modes for follower */
293*4882a593Smuzhiyun #define CEC_MODE_NO_FOLLOWER (0x0 << 4)
294*4882a593Smuzhiyun #define CEC_MODE_FOLLOWER (0x1 << 4)
295*4882a593Smuzhiyun #define CEC_MODE_EXCL_FOLLOWER (0x2 << 4)
296*4882a593Smuzhiyun #define CEC_MODE_EXCL_FOLLOWER_PASSTHRU (0x3 << 4)
297*4882a593Smuzhiyun #define CEC_MODE_MONITOR_PIN (0xd << 4)
298*4882a593Smuzhiyun #define CEC_MODE_MONITOR (0xe << 4)
299*4882a593Smuzhiyun #define CEC_MODE_MONITOR_ALL (0xf << 4)
300*4882a593Smuzhiyun #define CEC_MODE_FOLLOWER_MSK 0xf0
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun /* Userspace has to configure the physical address */
303*4882a593Smuzhiyun #define CEC_CAP_PHYS_ADDR (1 << 0)
304*4882a593Smuzhiyun /* Userspace has to configure the logical addresses */
305*4882a593Smuzhiyun #define CEC_CAP_LOG_ADDRS (1 << 1)
306*4882a593Smuzhiyun /* Userspace can transmit messages (and thus become follower as well) */
307*4882a593Smuzhiyun #define CEC_CAP_TRANSMIT (1 << 2)
308*4882a593Smuzhiyun /*
309*4882a593Smuzhiyun * Passthrough all messages instead of processing them.
310*4882a593Smuzhiyun */
311*4882a593Smuzhiyun #define CEC_CAP_PASSTHROUGH (1 << 3)
312*4882a593Smuzhiyun /* Supports remote control */
313*4882a593Smuzhiyun #define CEC_CAP_RC (1 << 4)
314*4882a593Smuzhiyun /* Hardware can monitor all messages, not just directed and broadcast. */
315*4882a593Smuzhiyun #define CEC_CAP_MONITOR_ALL (1 << 5)
316*4882a593Smuzhiyun /* Hardware can use CEC only if the HDMI HPD pin is high. */
317*4882a593Smuzhiyun #define CEC_CAP_NEEDS_HPD (1 << 6)
318*4882a593Smuzhiyun /* Hardware can monitor CEC pin transitions */
319*4882a593Smuzhiyun #define CEC_CAP_MONITOR_PIN (1 << 7)
320*4882a593Smuzhiyun /* CEC_ADAP_G_CONNECTOR_INFO is available */
321*4882a593Smuzhiyun #define CEC_CAP_CONNECTOR_INFO (1 << 8)
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun /**
324*4882a593Smuzhiyun * struct cec_caps - CEC capabilities structure.
325*4882a593Smuzhiyun * @driver: name of the CEC device driver.
326*4882a593Smuzhiyun * @name: name of the CEC device. @driver + @name must be unique.
327*4882a593Smuzhiyun * @available_log_addrs: number of available logical addresses.
328*4882a593Smuzhiyun * @capabilities: capabilities of the CEC adapter.
329*4882a593Smuzhiyun * @version: version of the CEC adapter framework.
330*4882a593Smuzhiyun */
331*4882a593Smuzhiyun struct cec_caps {
332*4882a593Smuzhiyun char driver[32];
333*4882a593Smuzhiyun char name[32];
334*4882a593Smuzhiyun __u32 available_log_addrs;
335*4882a593Smuzhiyun __u32 capabilities;
336*4882a593Smuzhiyun __u32 version;
337*4882a593Smuzhiyun };
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun /**
340*4882a593Smuzhiyun * struct cec_log_addrs - CEC logical addresses structure.
341*4882a593Smuzhiyun * @log_addr: the claimed logical addresses. Set by the driver.
342*4882a593Smuzhiyun * @log_addr_mask: current logical address mask. Set by the driver.
343*4882a593Smuzhiyun * @cec_version: the CEC version that the adapter should implement. Set by the
344*4882a593Smuzhiyun * caller.
345*4882a593Smuzhiyun * @num_log_addrs: how many logical addresses should be claimed. Set by the
346*4882a593Smuzhiyun * caller.
347*4882a593Smuzhiyun * @vendor_id: the vendor ID of the device. Set by the caller.
348*4882a593Smuzhiyun * @flags: flags.
349*4882a593Smuzhiyun * @osd_name: the OSD name of the device. Set by the caller.
350*4882a593Smuzhiyun * @primary_device_type: the primary device type for each logical address.
351*4882a593Smuzhiyun * Set by the caller.
352*4882a593Smuzhiyun * @log_addr_type: the logical address types. Set by the caller.
353*4882a593Smuzhiyun * @all_device_types: CEC 2.0: all device types represented by the logical
354*4882a593Smuzhiyun * address. Set by the caller.
355*4882a593Smuzhiyun * @features: CEC 2.0: The logical address features. Set by the caller.
356*4882a593Smuzhiyun */
357*4882a593Smuzhiyun struct cec_log_addrs {
358*4882a593Smuzhiyun __u8 log_addr[CEC_MAX_LOG_ADDRS];
359*4882a593Smuzhiyun __u16 log_addr_mask;
360*4882a593Smuzhiyun __u8 cec_version;
361*4882a593Smuzhiyun __u8 num_log_addrs;
362*4882a593Smuzhiyun __u32 vendor_id;
363*4882a593Smuzhiyun __u32 flags;
364*4882a593Smuzhiyun char osd_name[15];
365*4882a593Smuzhiyun __u8 primary_device_type[CEC_MAX_LOG_ADDRS];
366*4882a593Smuzhiyun __u8 log_addr_type[CEC_MAX_LOG_ADDRS];
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun /* CEC 2.0 */
369*4882a593Smuzhiyun __u8 all_device_types[CEC_MAX_LOG_ADDRS];
370*4882a593Smuzhiyun __u8 features[CEC_MAX_LOG_ADDRS][12];
371*4882a593Smuzhiyun };
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun /* Allow a fallback to unregistered */
374*4882a593Smuzhiyun #define CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK (1 << 0)
375*4882a593Smuzhiyun /* Passthrough RC messages to the input subsystem */
376*4882a593Smuzhiyun #define CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU (1 << 1)
377*4882a593Smuzhiyun /* CDC-Only device: supports only CDC messages */
378*4882a593Smuzhiyun #define CEC_LOG_ADDRS_FL_CDC_ONLY (1 << 2)
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun /**
381*4882a593Smuzhiyun * struct cec_drm_connector_info - tells which drm connector is
382*4882a593Smuzhiyun * associated with the CEC adapter.
383*4882a593Smuzhiyun * @card_no: drm card number
384*4882a593Smuzhiyun * @connector_id: drm connector ID
385*4882a593Smuzhiyun */
386*4882a593Smuzhiyun struct cec_drm_connector_info {
387*4882a593Smuzhiyun __u32 card_no;
388*4882a593Smuzhiyun __u32 connector_id;
389*4882a593Smuzhiyun };
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun #define CEC_CONNECTOR_TYPE_NO_CONNECTOR 0
392*4882a593Smuzhiyun #define CEC_CONNECTOR_TYPE_DRM 1
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun /**
395*4882a593Smuzhiyun * struct cec_connector_info - tells if and which connector is
396*4882a593Smuzhiyun * associated with the CEC adapter.
397*4882a593Smuzhiyun * @type: connector type (if any)
398*4882a593Smuzhiyun * @drm: drm connector info
399*4882a593Smuzhiyun */
400*4882a593Smuzhiyun struct cec_connector_info {
401*4882a593Smuzhiyun __u32 type;
402*4882a593Smuzhiyun union {
403*4882a593Smuzhiyun struct cec_drm_connector_info drm;
404*4882a593Smuzhiyun __u32 raw[16];
405*4882a593Smuzhiyun };
406*4882a593Smuzhiyun };
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun /* Events */
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun /* Event that occurs when the adapter state changes */
411*4882a593Smuzhiyun #define CEC_EVENT_STATE_CHANGE 1
412*4882a593Smuzhiyun /*
413*4882a593Smuzhiyun * This event is sent when messages are lost because the application
414*4882a593Smuzhiyun * didn't empty the message queue in time
415*4882a593Smuzhiyun */
416*4882a593Smuzhiyun #define CEC_EVENT_LOST_MSGS 2
417*4882a593Smuzhiyun #define CEC_EVENT_PIN_CEC_LOW 3
418*4882a593Smuzhiyun #define CEC_EVENT_PIN_CEC_HIGH 4
419*4882a593Smuzhiyun #define CEC_EVENT_PIN_HPD_LOW 5
420*4882a593Smuzhiyun #define CEC_EVENT_PIN_HPD_HIGH 6
421*4882a593Smuzhiyun #define CEC_EVENT_PIN_5V_LOW 7
422*4882a593Smuzhiyun #define CEC_EVENT_PIN_5V_HIGH 8
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun #define CEC_EVENT_FL_INITIAL_STATE (1 << 0)
425*4882a593Smuzhiyun #define CEC_EVENT_FL_DROPPED_EVENTS (1 << 1)
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun /**
428*4882a593Smuzhiyun * struct cec_event_state_change - used when the CEC adapter changes state.
429*4882a593Smuzhiyun * @phys_addr: the current physical address
430*4882a593Smuzhiyun * @log_addr_mask: the current logical address mask
431*4882a593Smuzhiyun * @have_conn_info: if non-zero, then HDMI connector information is available.
432*4882a593Smuzhiyun * This field is only valid if CEC_CAP_CONNECTOR_INFO is set. If that
433*4882a593Smuzhiyun * capability is set and @have_conn_info is zero, then that indicates
434*4882a593Smuzhiyun * that the HDMI connector device is not instantiated, either because
435*4882a593Smuzhiyun * the HDMI driver is still configuring the device or because the HDMI
436*4882a593Smuzhiyun * device was unbound.
437*4882a593Smuzhiyun */
438*4882a593Smuzhiyun struct cec_event_state_change {
439*4882a593Smuzhiyun __u16 phys_addr;
440*4882a593Smuzhiyun __u16 log_addr_mask;
441*4882a593Smuzhiyun __u16 have_conn_info;
442*4882a593Smuzhiyun };
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun /**
445*4882a593Smuzhiyun * struct cec_event_lost_msgs - tells you how many messages were lost.
446*4882a593Smuzhiyun * @lost_msgs: how many messages were lost.
447*4882a593Smuzhiyun */
448*4882a593Smuzhiyun struct cec_event_lost_msgs {
449*4882a593Smuzhiyun __u32 lost_msgs;
450*4882a593Smuzhiyun };
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun /**
453*4882a593Smuzhiyun * struct cec_event - CEC event structure
454*4882a593Smuzhiyun * @ts: the timestamp of when the event was sent.
455*4882a593Smuzhiyun * @event: the event.
456*4882a593Smuzhiyun * array.
457*4882a593Smuzhiyun * @state_change: the event payload for CEC_EVENT_STATE_CHANGE.
458*4882a593Smuzhiyun * @lost_msgs: the event payload for CEC_EVENT_LOST_MSGS.
459*4882a593Smuzhiyun * @raw: array to pad the union.
460*4882a593Smuzhiyun */
461*4882a593Smuzhiyun struct cec_event {
462*4882a593Smuzhiyun __u64 ts;
463*4882a593Smuzhiyun __u32 event;
464*4882a593Smuzhiyun __u32 flags;
465*4882a593Smuzhiyun union {
466*4882a593Smuzhiyun struct cec_event_state_change state_change;
467*4882a593Smuzhiyun struct cec_event_lost_msgs lost_msgs;
468*4882a593Smuzhiyun __u32 raw[16];
469*4882a593Smuzhiyun };
470*4882a593Smuzhiyun };
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun /* ioctls */
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun /* Adapter capabilities */
475*4882a593Smuzhiyun #define CEC_ADAP_G_CAPS _IOWR('a', 0, struct cec_caps)
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun /*
478*4882a593Smuzhiyun * phys_addr is either 0 (if this is the CEC root device)
479*4882a593Smuzhiyun * or a valid physical address obtained from the sink's EDID
480*4882a593Smuzhiyun * as read by this CEC device (if this is a source device)
481*4882a593Smuzhiyun * or a physical address obtained and modified from a sink
482*4882a593Smuzhiyun * EDID and used for a sink CEC device.
483*4882a593Smuzhiyun * If nothing is connected, then phys_addr is 0xffff.
484*4882a593Smuzhiyun * See HDMI 1.4b, section 8.7 (Physical Address).
485*4882a593Smuzhiyun *
486*4882a593Smuzhiyun * The CEC_ADAP_S_PHYS_ADDR ioctl may not be available if that is handled
487*4882a593Smuzhiyun * internally.
488*4882a593Smuzhiyun */
489*4882a593Smuzhiyun #define CEC_ADAP_G_PHYS_ADDR _IOR('a', 1, __u16)
490*4882a593Smuzhiyun #define CEC_ADAP_S_PHYS_ADDR _IOW('a', 2, __u16)
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun /*
493*4882a593Smuzhiyun * Configure the CEC adapter. It sets the device type and which
494*4882a593Smuzhiyun * logical types it will try to claim. It will return which
495*4882a593Smuzhiyun * logical addresses it could actually claim.
496*4882a593Smuzhiyun * An error is returned if the adapter is disabled or if there
497*4882a593Smuzhiyun * is no physical address assigned.
498*4882a593Smuzhiyun */
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun #define CEC_ADAP_G_LOG_ADDRS _IOR('a', 3, struct cec_log_addrs)
501*4882a593Smuzhiyun #define CEC_ADAP_S_LOG_ADDRS _IOWR('a', 4, struct cec_log_addrs)
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun /* Transmit/receive a CEC command */
504*4882a593Smuzhiyun #define CEC_TRANSMIT _IOWR('a', 5, struct cec_msg)
505*4882a593Smuzhiyun #define CEC_RECEIVE _IOWR('a', 6, struct cec_msg)
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun /* Dequeue CEC events */
508*4882a593Smuzhiyun #define CEC_DQEVENT _IOWR('a', 7, struct cec_event)
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun /*
511*4882a593Smuzhiyun * Get and set the message handling mode for this filehandle.
512*4882a593Smuzhiyun */
513*4882a593Smuzhiyun #define CEC_G_MODE _IOR('a', 8, __u32)
514*4882a593Smuzhiyun #define CEC_S_MODE _IOW('a', 9, __u32)
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun /* Get the connector info */
517*4882a593Smuzhiyun #define CEC_ADAP_G_CONNECTOR_INFO _IOR('a', 10, struct cec_connector_info)
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun /* set cec into standby mode */
520*4882a593Smuzhiyun #define CEC_STANDBY _IOW('a', 10, __u8)
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun /* set cec wake up function enable */
523*4882a593Smuzhiyun #define CEC_FUNC_EN _IOW('a', 11, int)
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun /*
526*4882a593Smuzhiyun * The remainder of this header defines all CEC messages and operands.
527*4882a593Smuzhiyun * The format matters since it the cec-ctl utility parses it to generate
528*4882a593Smuzhiyun * code for implementing all these messages.
529*4882a593Smuzhiyun *
530*4882a593Smuzhiyun * Comments ending with 'Feature' group messages for each feature.
531*4882a593Smuzhiyun * If messages are part of multiple features, then the "Has also"
532*4882a593Smuzhiyun * comment is used to list the previously defined messages that are
533*4882a593Smuzhiyun * supported by the feature.
534*4882a593Smuzhiyun *
535*4882a593Smuzhiyun * Before operands are defined a comment is added that gives the
536*4882a593Smuzhiyun * name of the operand and in brackets the variable name of the
537*4882a593Smuzhiyun * corresponding argument in the cec-funcs.h function.
538*4882a593Smuzhiyun */
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun /* Messages */
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun /* One Touch Play Feature */
543*4882a593Smuzhiyun #define CEC_MSG_ACTIVE_SOURCE 0x82
544*4882a593Smuzhiyun #define CEC_MSG_IMAGE_VIEW_ON 0x04
545*4882a593Smuzhiyun #define CEC_MSG_TEXT_VIEW_ON 0x0d
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun /* Routing Control Feature */
549*4882a593Smuzhiyun
550*4882a593Smuzhiyun /*
551*4882a593Smuzhiyun * Has also:
552*4882a593Smuzhiyun * CEC_MSG_ACTIVE_SOURCE
553*4882a593Smuzhiyun */
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun #define CEC_MSG_INACTIVE_SOURCE 0x9d
556*4882a593Smuzhiyun #define CEC_MSG_REQUEST_ACTIVE_SOURCE 0x85
557*4882a593Smuzhiyun #define CEC_MSG_ROUTING_CHANGE 0x80
558*4882a593Smuzhiyun #define CEC_MSG_ROUTING_INFORMATION 0x81
559*4882a593Smuzhiyun #define CEC_MSG_SET_STREAM_PATH 0x86
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun /* Standby Feature */
563*4882a593Smuzhiyun #define CEC_MSG_STANDBY 0x36
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun
566*4882a593Smuzhiyun /* One Touch Record Feature */
567*4882a593Smuzhiyun #define CEC_MSG_RECORD_OFF 0x0b
568*4882a593Smuzhiyun #define CEC_MSG_RECORD_ON 0x09
569*4882a593Smuzhiyun /* Record Source Type Operand (rec_src_type) */
570*4882a593Smuzhiyun #define CEC_OP_RECORD_SRC_OWN 1
571*4882a593Smuzhiyun #define CEC_OP_RECORD_SRC_DIGITAL 2
572*4882a593Smuzhiyun #define CEC_OP_RECORD_SRC_ANALOG 3
573*4882a593Smuzhiyun #define CEC_OP_RECORD_SRC_EXT_PLUG 4
574*4882a593Smuzhiyun #define CEC_OP_RECORD_SRC_EXT_PHYS_ADDR 5
575*4882a593Smuzhiyun /* Service Identification Method Operand (service_id_method) */
576*4882a593Smuzhiyun #define CEC_OP_SERVICE_ID_METHOD_BY_DIG_ID 0
577*4882a593Smuzhiyun #define CEC_OP_SERVICE_ID_METHOD_BY_CHANNEL 1
578*4882a593Smuzhiyun /* Digital Service Broadcast System Operand (dig_bcast_system) */
579*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN 0x00
580*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN 0x01
581*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN 0x02
582*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS 0x08
583*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS 0x09
584*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_T 0x0a
585*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE 0x10
586*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_SAT 0x11
587*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_T 0x12
588*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_C 0x18
589*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S 0x19
590*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S2 0x1a
591*4882a593Smuzhiyun #define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_T 0x1b
592*4882a593Smuzhiyun /* Analogue Broadcast Type Operand (ana_bcast_type) */
593*4882a593Smuzhiyun #define CEC_OP_ANA_BCAST_TYPE_CABLE 0
594*4882a593Smuzhiyun #define CEC_OP_ANA_BCAST_TYPE_SATELLITE 1
595*4882a593Smuzhiyun #define CEC_OP_ANA_BCAST_TYPE_TERRESTRIAL 2
596*4882a593Smuzhiyun /* Broadcast System Operand (bcast_system) */
597*4882a593Smuzhiyun #define CEC_OP_BCAST_SYSTEM_PAL_BG 0x00
598*4882a593Smuzhiyun #define CEC_OP_BCAST_SYSTEM_SECAM_LQ 0x01 /* SECAM L' */
599*4882a593Smuzhiyun #define CEC_OP_BCAST_SYSTEM_PAL_M 0x02
600*4882a593Smuzhiyun #define CEC_OP_BCAST_SYSTEM_NTSC_M 0x03
601*4882a593Smuzhiyun #define CEC_OP_BCAST_SYSTEM_PAL_I 0x04
602*4882a593Smuzhiyun #define CEC_OP_BCAST_SYSTEM_SECAM_DK 0x05
603*4882a593Smuzhiyun #define CEC_OP_BCAST_SYSTEM_SECAM_BG 0x06
604*4882a593Smuzhiyun #define CEC_OP_BCAST_SYSTEM_SECAM_L 0x07
605*4882a593Smuzhiyun #define CEC_OP_BCAST_SYSTEM_PAL_DK 0x08
606*4882a593Smuzhiyun #define CEC_OP_BCAST_SYSTEM_OTHER 0x1f
607*4882a593Smuzhiyun /* Channel Number Format Operand (channel_number_fmt) */
608*4882a593Smuzhiyun #define CEC_OP_CHANNEL_NUMBER_FMT_1_PART 0x01
609*4882a593Smuzhiyun #define CEC_OP_CHANNEL_NUMBER_FMT_2_PART 0x02
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun #define CEC_MSG_RECORD_STATUS 0x0a
612*4882a593Smuzhiyun /* Record Status Operand (rec_status) */
613*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_CUR_SRC 0x01
614*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_DIG_SERVICE 0x02
615*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_ANA_SERVICE 0x03
616*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_EXT_INPUT 0x04
617*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_NO_DIG_SERVICE 0x05
618*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_NO_ANA_SERVICE 0x06
619*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_NO_SERVICE 0x07
620*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_INVALID_EXT_PLUG 0x09
621*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_INVALID_EXT_PHYS_ADDR 0x0a
622*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_UNSUP_CA 0x0b
623*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_NO_CA_ENTITLEMENTS 0x0c
624*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_CANT_COPY_SRC 0x0d
625*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_NO_MORE_COPIES 0x0e
626*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_NO_MEDIA 0x10
627*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_PLAYING 0x11
628*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_ALREADY_RECORDING 0x12
629*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_MEDIA_PROT 0x13
630*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_NO_SIGNAL 0x14
631*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_MEDIA_PROBLEM 0x15
632*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_NO_SPACE 0x16
633*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_PARENTAL_LOCK 0x17
634*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_TERMINATED_OK 0x1a
635*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_ALREADY_TERM 0x1b
636*4882a593Smuzhiyun #define CEC_OP_RECORD_STATUS_OTHER 0x1f
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun #define CEC_MSG_RECORD_TV_SCREEN 0x0f
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun /* Timer Programming Feature */
642*4882a593Smuzhiyun #define CEC_MSG_CLEAR_ANALOGUE_TIMER 0x33
643*4882a593Smuzhiyun /* Recording Sequence Operand (recording_seq) */
644*4882a593Smuzhiyun #define CEC_OP_REC_SEQ_SUNDAY 0x01
645*4882a593Smuzhiyun #define CEC_OP_REC_SEQ_MONDAY 0x02
646*4882a593Smuzhiyun #define CEC_OP_REC_SEQ_TUESDAY 0x04
647*4882a593Smuzhiyun #define CEC_OP_REC_SEQ_WEDNESDAY 0x08
648*4882a593Smuzhiyun #define CEC_OP_REC_SEQ_THURSDAY 0x10
649*4882a593Smuzhiyun #define CEC_OP_REC_SEQ_FRIDAY 0x20
650*4882a593Smuzhiyun #define CEC_OP_REC_SEQ_SATERDAY 0x40
651*4882a593Smuzhiyun #define CEC_OP_REC_SEQ_ONCE_ONLY 0x00
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun #define CEC_MSG_CLEAR_DIGITAL_TIMER 0x99
654*4882a593Smuzhiyun
655*4882a593Smuzhiyun #define CEC_MSG_CLEAR_EXT_TIMER 0xa1
656*4882a593Smuzhiyun /* External Source Specifier Operand (ext_src_spec) */
657*4882a593Smuzhiyun #define CEC_OP_EXT_SRC_PLUG 0x04
658*4882a593Smuzhiyun #define CEC_OP_EXT_SRC_PHYS_ADDR 0x05
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun #define CEC_MSG_SET_ANALOGUE_TIMER 0x34
661*4882a593Smuzhiyun #define CEC_MSG_SET_DIGITAL_TIMER 0x97
662*4882a593Smuzhiyun #define CEC_MSG_SET_EXT_TIMER 0xa2
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun #define CEC_MSG_SET_TIMER_PROGRAM_TITLE 0x67
665*4882a593Smuzhiyun #define CEC_MSG_TIMER_CLEARED_STATUS 0x43
666*4882a593Smuzhiyun /* Timer Cleared Status Data Operand (timer_cleared_status) */
667*4882a593Smuzhiyun #define CEC_OP_TIMER_CLR_STAT_RECORDING 0x00
668*4882a593Smuzhiyun #define CEC_OP_TIMER_CLR_STAT_NO_MATCHING 0x01
669*4882a593Smuzhiyun #define CEC_OP_TIMER_CLR_STAT_NO_INFO 0x02
670*4882a593Smuzhiyun #define CEC_OP_TIMER_CLR_STAT_CLEARED 0x80
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun #define CEC_MSG_TIMER_STATUS 0x35
673*4882a593Smuzhiyun /* Timer Overlap Warning Operand (timer_overlap_warning) */
674*4882a593Smuzhiyun #define CEC_OP_TIMER_OVERLAP_WARNING_NO_OVERLAP 0
675*4882a593Smuzhiyun #define CEC_OP_TIMER_OVERLAP_WARNING_OVERLAP 1
676*4882a593Smuzhiyun /* Media Info Operand (media_info) */
677*4882a593Smuzhiyun #define CEC_OP_MEDIA_INFO_UNPROT_MEDIA 0
678*4882a593Smuzhiyun #define CEC_OP_MEDIA_INFO_PROT_MEDIA 1
679*4882a593Smuzhiyun #define CEC_OP_MEDIA_INFO_NO_MEDIA 2
680*4882a593Smuzhiyun /* Programmed Indicator Operand (prog_indicator) */
681*4882a593Smuzhiyun #define CEC_OP_PROG_IND_NOT_PROGRAMMED 0
682*4882a593Smuzhiyun #define CEC_OP_PROG_IND_PROGRAMMED 1
683*4882a593Smuzhiyun /* Programmed Info Operand (prog_info) */
684*4882a593Smuzhiyun #define CEC_OP_PROG_INFO_ENOUGH_SPACE 0x08
685*4882a593Smuzhiyun #define CEC_OP_PROG_INFO_NOT_ENOUGH_SPACE 0x09
686*4882a593Smuzhiyun #define CEC_OP_PROG_INFO_MIGHT_NOT_BE_ENOUGH_SPACE 0x0b
687*4882a593Smuzhiyun #define CEC_OP_PROG_INFO_NONE_AVAILABLE 0x0a
688*4882a593Smuzhiyun /* Not Programmed Error Info Operand (prog_error) */
689*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_NO_FREE_TIMER 0x01
690*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_DATE_OUT_OF_RANGE 0x02
691*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_REC_SEQ_ERROR 0x03
692*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_INV_EXT_PLUG 0x04
693*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_INV_EXT_PHYS_ADDR 0x05
694*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_CA_UNSUPP 0x06
695*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_INSUF_CA_ENTITLEMENTS 0x07
696*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_RESOLUTION_UNSUPP 0x08
697*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_PARENTAL_LOCK 0x09
698*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_CLOCK_FAILURE 0x0a
699*4882a593Smuzhiyun #define CEC_OP_PROG_ERROR_DUPLICATE 0x0e
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun /* System Information Feature */
703*4882a593Smuzhiyun #define CEC_MSG_CEC_VERSION 0x9e
704*4882a593Smuzhiyun /* CEC Version Operand (cec_version) */
705*4882a593Smuzhiyun #define CEC_OP_CEC_VERSION_1_3A 4
706*4882a593Smuzhiyun #define CEC_OP_CEC_VERSION_1_4 5
707*4882a593Smuzhiyun #define CEC_OP_CEC_VERSION_2_0 6
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun #define CEC_MSG_GET_CEC_VERSION 0x9f
710*4882a593Smuzhiyun #define CEC_MSG_GIVE_PHYSICAL_ADDR 0x83
711*4882a593Smuzhiyun #define CEC_MSG_GET_MENU_LANGUAGE 0x91
712*4882a593Smuzhiyun #define CEC_MSG_REPORT_PHYSICAL_ADDR 0x84
713*4882a593Smuzhiyun /* Primary Device Type Operand (prim_devtype) */
714*4882a593Smuzhiyun #define CEC_OP_PRIM_DEVTYPE_TV 0
715*4882a593Smuzhiyun #define CEC_OP_PRIM_DEVTYPE_RECORD 1
716*4882a593Smuzhiyun #define CEC_OP_PRIM_DEVTYPE_TUNER 3
717*4882a593Smuzhiyun #define CEC_OP_PRIM_DEVTYPE_PLAYBACK 4
718*4882a593Smuzhiyun #define CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM 5
719*4882a593Smuzhiyun #define CEC_OP_PRIM_DEVTYPE_SWITCH 6
720*4882a593Smuzhiyun #define CEC_OP_PRIM_DEVTYPE_PROCESSOR 7
721*4882a593Smuzhiyun
722*4882a593Smuzhiyun #define CEC_MSG_SET_MENU_LANGUAGE 0x32
723*4882a593Smuzhiyun #define CEC_MSG_REPORT_FEATURES 0xa6 /* HDMI 2.0 */
724*4882a593Smuzhiyun /* All Device Types Operand (all_device_types) */
725*4882a593Smuzhiyun #define CEC_OP_ALL_DEVTYPE_TV 0x80
726*4882a593Smuzhiyun #define CEC_OP_ALL_DEVTYPE_RECORD 0x40
727*4882a593Smuzhiyun #define CEC_OP_ALL_DEVTYPE_TUNER 0x20
728*4882a593Smuzhiyun #define CEC_OP_ALL_DEVTYPE_PLAYBACK 0x10
729*4882a593Smuzhiyun #define CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM 0x08
730*4882a593Smuzhiyun #define CEC_OP_ALL_DEVTYPE_SWITCH 0x04
731*4882a593Smuzhiyun /*
732*4882a593Smuzhiyun * And if you wondering what happened to PROCESSOR devices: those should
733*4882a593Smuzhiyun * be mapped to a SWITCH.
734*4882a593Smuzhiyun */
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun /* Valid for RC Profile and Device Feature operands */
737*4882a593Smuzhiyun #define CEC_OP_FEAT_EXT 0x80 /* Extension bit */
738*4882a593Smuzhiyun /* RC Profile Operand (rc_profile) */
739*4882a593Smuzhiyun #define CEC_OP_FEAT_RC_TV_PROFILE_NONE 0x00
740*4882a593Smuzhiyun #define CEC_OP_FEAT_RC_TV_PROFILE_1 0x02
741*4882a593Smuzhiyun #define CEC_OP_FEAT_RC_TV_PROFILE_2 0x06
742*4882a593Smuzhiyun #define CEC_OP_FEAT_RC_TV_PROFILE_3 0x0a
743*4882a593Smuzhiyun #define CEC_OP_FEAT_RC_TV_PROFILE_4 0x0e
744*4882a593Smuzhiyun #define CEC_OP_FEAT_RC_SRC_HAS_DEV_ROOT_MENU 0x50
745*4882a593Smuzhiyun #define CEC_OP_FEAT_RC_SRC_HAS_DEV_SETUP_MENU 0x48
746*4882a593Smuzhiyun #define CEC_OP_FEAT_RC_SRC_HAS_CONTENTS_MENU 0x44
747*4882a593Smuzhiyun #define CEC_OP_FEAT_RC_SRC_HAS_MEDIA_TOP_MENU 0x42
748*4882a593Smuzhiyun #define CEC_OP_FEAT_RC_SRC_HAS_MEDIA_CONTEXT_MENU 0x41
749*4882a593Smuzhiyun /* Device Feature Operand (dev_features) */
750*4882a593Smuzhiyun #define CEC_OP_FEAT_DEV_HAS_RECORD_TV_SCREEN 0x40
751*4882a593Smuzhiyun #define CEC_OP_FEAT_DEV_HAS_SET_OSD_STRING 0x20
752*4882a593Smuzhiyun #define CEC_OP_FEAT_DEV_HAS_DECK_CONTROL 0x10
753*4882a593Smuzhiyun #define CEC_OP_FEAT_DEV_HAS_SET_AUDIO_RATE 0x08
754*4882a593Smuzhiyun #define CEC_OP_FEAT_DEV_SINK_HAS_ARC_TX 0x04
755*4882a593Smuzhiyun #define CEC_OP_FEAT_DEV_SOURCE_HAS_ARC_RX 0x02
756*4882a593Smuzhiyun
757*4882a593Smuzhiyun #define CEC_MSG_GIVE_FEATURES 0xa5 /* HDMI 2.0 */
758*4882a593Smuzhiyun
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun /* Deck Control Feature */
761*4882a593Smuzhiyun #define CEC_MSG_DECK_CONTROL 0x42
762*4882a593Smuzhiyun /* Deck Control Mode Operand (deck_control_mode) */
763*4882a593Smuzhiyun #define CEC_OP_DECK_CTL_MODE_SKIP_FWD 1
764*4882a593Smuzhiyun #define CEC_OP_DECK_CTL_MODE_SKIP_REV 2
765*4882a593Smuzhiyun #define CEC_OP_DECK_CTL_MODE_STOP 3
766*4882a593Smuzhiyun #define CEC_OP_DECK_CTL_MODE_EJECT 4
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun #define CEC_MSG_DECK_STATUS 0x1b
769*4882a593Smuzhiyun /* Deck Info Operand (deck_info) */
770*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_PLAY 0x11
771*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_RECORD 0x12
772*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_PLAY_REV 0x13
773*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_STILL 0x14
774*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_SLOW 0x15
775*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_SLOW_REV 0x16
776*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_FAST_FWD 0x17
777*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_FAST_REV 0x18
778*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_NO_MEDIA 0x19
779*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_STOP 0x1a
780*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_SKIP_FWD 0x1b
781*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_SKIP_REV 0x1c
782*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_INDEX_SEARCH_FWD 0x1d
783*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_INDEX_SEARCH_REV 0x1e
784*4882a593Smuzhiyun #define CEC_OP_DECK_INFO_OTHER 0x1f
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun #define CEC_MSG_GIVE_DECK_STATUS 0x1a
787*4882a593Smuzhiyun /* Status Request Operand (status_req) */
788*4882a593Smuzhiyun #define CEC_OP_STATUS_REQ_ON 1
789*4882a593Smuzhiyun #define CEC_OP_STATUS_REQ_OFF 2
790*4882a593Smuzhiyun #define CEC_OP_STATUS_REQ_ONCE 3
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun #define CEC_MSG_PLAY 0x41
793*4882a593Smuzhiyun /* Play Mode Operand (play_mode) */
794*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_FWD 0x24
795*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_REV 0x20
796*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_STILL 0x25
797*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_FAST_FWD_MIN 0x05
798*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_FAST_FWD_MED 0x06
799*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_FAST_FWD_MAX 0x07
800*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_FAST_REV_MIN 0x09
801*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_FAST_REV_MED 0x0a
802*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_FAST_REV_MAX 0x0b
803*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_SLOW_FWD_MIN 0x15
804*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_SLOW_FWD_MED 0x16
805*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_SLOW_FWD_MAX 0x17
806*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_SLOW_REV_MIN 0x19
807*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_SLOW_REV_MED 0x1a
808*4882a593Smuzhiyun #define CEC_OP_PLAY_MODE_PLAY_SLOW_REV_MAX 0x1b
809*4882a593Smuzhiyun
810*4882a593Smuzhiyun
811*4882a593Smuzhiyun /* Tuner Control Feature */
812*4882a593Smuzhiyun #define CEC_MSG_GIVE_TUNER_DEVICE_STATUS 0x08
813*4882a593Smuzhiyun #define CEC_MSG_SELECT_ANALOGUE_SERVICE 0x92
814*4882a593Smuzhiyun #define CEC_MSG_SELECT_DIGITAL_SERVICE 0x93
815*4882a593Smuzhiyun #define CEC_MSG_TUNER_DEVICE_STATUS 0x07
816*4882a593Smuzhiyun /* Recording Flag Operand (rec_flag) */
817*4882a593Smuzhiyun #define CEC_OP_REC_FLAG_NOT_USED 0
818*4882a593Smuzhiyun #define CEC_OP_REC_FLAG_USED 1
819*4882a593Smuzhiyun /* Tuner Display Info Operand (tuner_display_info) */
820*4882a593Smuzhiyun #define CEC_OP_TUNER_DISPLAY_INFO_DIGITAL 0
821*4882a593Smuzhiyun #define CEC_OP_TUNER_DISPLAY_INFO_NONE 1
822*4882a593Smuzhiyun #define CEC_OP_TUNER_DISPLAY_INFO_ANALOGUE 2
823*4882a593Smuzhiyun
824*4882a593Smuzhiyun #define CEC_MSG_TUNER_STEP_DECREMENT 0x06
825*4882a593Smuzhiyun #define CEC_MSG_TUNER_STEP_INCREMENT 0x05
826*4882a593Smuzhiyun
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun /* Vendor Specific Commands Feature */
829*4882a593Smuzhiyun
830*4882a593Smuzhiyun /*
831*4882a593Smuzhiyun * Has also:
832*4882a593Smuzhiyun * CEC_MSG_CEC_VERSION
833*4882a593Smuzhiyun * CEC_MSG_GET_CEC_VERSION
834*4882a593Smuzhiyun */
835*4882a593Smuzhiyun #define CEC_MSG_DEVICE_VENDOR_ID 0x87
836*4882a593Smuzhiyun #define CEC_MSG_GIVE_DEVICE_VENDOR_ID 0x8c
837*4882a593Smuzhiyun #define CEC_MSG_VENDOR_COMMAND 0x89
838*4882a593Smuzhiyun #define CEC_MSG_VENDOR_COMMAND_WITH_ID 0xa0
839*4882a593Smuzhiyun #define CEC_MSG_VENDOR_REMOTE_BUTTON_DOWN 0x8a
840*4882a593Smuzhiyun #define CEC_MSG_VENDOR_REMOTE_BUTTON_UP 0x8b
841*4882a593Smuzhiyun
842*4882a593Smuzhiyun
843*4882a593Smuzhiyun /* OSD Display Feature */
844*4882a593Smuzhiyun #define CEC_MSG_SET_OSD_STRING 0x64
845*4882a593Smuzhiyun /* Display Control Operand (disp_ctl) */
846*4882a593Smuzhiyun #define CEC_OP_DISP_CTL_DEFAULT 0x00
847*4882a593Smuzhiyun #define CEC_OP_DISP_CTL_UNTIL_CLEARED 0x40
848*4882a593Smuzhiyun #define CEC_OP_DISP_CTL_CLEAR 0x80
849*4882a593Smuzhiyun
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun /* Device OSD Transfer Feature */
852*4882a593Smuzhiyun #define CEC_MSG_GIVE_OSD_NAME 0x46
853*4882a593Smuzhiyun #define CEC_MSG_SET_OSD_NAME 0x47
854*4882a593Smuzhiyun
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun /* Device Menu Control Feature */
857*4882a593Smuzhiyun #define CEC_MSG_MENU_REQUEST 0x8d
858*4882a593Smuzhiyun /* Menu Request Type Operand (menu_req) */
859*4882a593Smuzhiyun #define CEC_OP_MENU_REQUEST_ACTIVATE 0x00
860*4882a593Smuzhiyun #define CEC_OP_MENU_REQUEST_DEACTIVATE 0x01
861*4882a593Smuzhiyun #define CEC_OP_MENU_REQUEST_QUERY 0x02
862*4882a593Smuzhiyun
863*4882a593Smuzhiyun #define CEC_MSG_MENU_STATUS 0x8e
864*4882a593Smuzhiyun /* Menu State Operand (menu_state) */
865*4882a593Smuzhiyun #define CEC_OP_MENU_STATE_ACTIVATED 0x00
866*4882a593Smuzhiyun #define CEC_OP_MENU_STATE_DEACTIVATED 0x01
867*4882a593Smuzhiyun
868*4882a593Smuzhiyun #define CEC_MSG_USER_CONTROL_PRESSED 0x44
869*4882a593Smuzhiyun /* UI Command Operand (ui_cmd) */
870*4882a593Smuzhiyun #define CEC_OP_UI_CMD_SELECT 0x00
871*4882a593Smuzhiyun #define CEC_OP_UI_CMD_UP 0x01
872*4882a593Smuzhiyun #define CEC_OP_UI_CMD_DOWN 0x02
873*4882a593Smuzhiyun #define CEC_OP_UI_CMD_LEFT 0x03
874*4882a593Smuzhiyun #define CEC_OP_UI_CMD_RIGHT 0x04
875*4882a593Smuzhiyun #define CEC_OP_UI_CMD_RIGHT_UP 0x05
876*4882a593Smuzhiyun #define CEC_OP_UI_CMD_RIGHT_DOWN 0x06
877*4882a593Smuzhiyun #define CEC_OP_UI_CMD_LEFT_UP 0x07
878*4882a593Smuzhiyun #define CEC_OP_UI_CMD_LEFT_DOWN 0x08
879*4882a593Smuzhiyun #define CEC_OP_UI_CMD_DEVICE_ROOT_MENU 0x09
880*4882a593Smuzhiyun #define CEC_OP_UI_CMD_DEVICE_SETUP_MENU 0x0a
881*4882a593Smuzhiyun #define CEC_OP_UI_CMD_CONTENTS_MENU 0x0b
882*4882a593Smuzhiyun #define CEC_OP_UI_CMD_FAVORITE_MENU 0x0c
883*4882a593Smuzhiyun #define CEC_OP_UI_CMD_BACK 0x0d
884*4882a593Smuzhiyun #define CEC_OP_UI_CMD_MEDIA_TOP_MENU 0x10
885*4882a593Smuzhiyun #define CEC_OP_UI_CMD_MEDIA_CONTEXT_SENSITIVE_MENU 0x11
886*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_ENTRY_MODE 0x1d
887*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_11 0x1e
888*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_12 0x1f
889*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_0_OR_NUMBER_10 0x20
890*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_1 0x21
891*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_2 0x22
892*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_3 0x23
893*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_4 0x24
894*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_5 0x25
895*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_6 0x26
896*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_7 0x27
897*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_8 0x28
898*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NUMBER_9 0x29
899*4882a593Smuzhiyun #define CEC_OP_UI_CMD_DOT 0x2a
900*4882a593Smuzhiyun #define CEC_OP_UI_CMD_ENTER 0x2b
901*4882a593Smuzhiyun #define CEC_OP_UI_CMD_CLEAR 0x2c
902*4882a593Smuzhiyun #define CEC_OP_UI_CMD_NEXT_FAVORITE 0x2f
903*4882a593Smuzhiyun #define CEC_OP_UI_CMD_CHANNEL_UP 0x30
904*4882a593Smuzhiyun #define CEC_OP_UI_CMD_CHANNEL_DOWN 0x31
905*4882a593Smuzhiyun #define CEC_OP_UI_CMD_PREVIOUS_CHANNEL 0x32
906*4882a593Smuzhiyun #define CEC_OP_UI_CMD_SOUND_SELECT 0x33
907*4882a593Smuzhiyun #define CEC_OP_UI_CMD_INPUT_SELECT 0x34
908*4882a593Smuzhiyun #define CEC_OP_UI_CMD_DISPLAY_INFORMATION 0x35
909*4882a593Smuzhiyun #define CEC_OP_UI_CMD_HELP 0x36
910*4882a593Smuzhiyun #define CEC_OP_UI_CMD_PAGE_UP 0x37
911*4882a593Smuzhiyun #define CEC_OP_UI_CMD_PAGE_DOWN 0x38
912*4882a593Smuzhiyun #define CEC_OP_UI_CMD_POWER 0x40
913*4882a593Smuzhiyun #define CEC_OP_UI_CMD_VOLUME_UP 0x41
914*4882a593Smuzhiyun #define CEC_OP_UI_CMD_VOLUME_DOWN 0x42
915*4882a593Smuzhiyun #define CEC_OP_UI_CMD_MUTE 0x43
916*4882a593Smuzhiyun #define CEC_OP_UI_CMD_PLAY 0x44
917*4882a593Smuzhiyun #define CEC_OP_UI_CMD_STOP 0x45
918*4882a593Smuzhiyun #define CEC_OP_UI_CMD_PAUSE 0x46
919*4882a593Smuzhiyun #define CEC_OP_UI_CMD_RECORD 0x47
920*4882a593Smuzhiyun #define CEC_OP_UI_CMD_REWIND 0x48
921*4882a593Smuzhiyun #define CEC_OP_UI_CMD_FAST_FORWARD 0x49
922*4882a593Smuzhiyun #define CEC_OP_UI_CMD_EJECT 0x4a
923*4882a593Smuzhiyun #define CEC_OP_UI_CMD_SKIP_FORWARD 0x4b
924*4882a593Smuzhiyun #define CEC_OP_UI_CMD_SKIP_BACKWARD 0x4c
925*4882a593Smuzhiyun #define CEC_OP_UI_CMD_STOP_RECORD 0x4d
926*4882a593Smuzhiyun #define CEC_OP_UI_CMD_PAUSE_RECORD 0x4e
927*4882a593Smuzhiyun #define CEC_OP_UI_CMD_ANGLE 0x50
928*4882a593Smuzhiyun #define CEC_OP_UI_CMD_SUB_PICTURE 0x51
929*4882a593Smuzhiyun #define CEC_OP_UI_CMD_VIDEO_ON_DEMAND 0x52
930*4882a593Smuzhiyun #define CEC_OP_UI_CMD_ELECTRONIC_PROGRAM_GUIDE 0x53
931*4882a593Smuzhiyun #define CEC_OP_UI_CMD_TIMER_PROGRAMMING 0x54
932*4882a593Smuzhiyun #define CEC_OP_UI_CMD_INITIAL_CONFIGURATION 0x55
933*4882a593Smuzhiyun #define CEC_OP_UI_CMD_SELECT_BROADCAST_TYPE 0x56
934*4882a593Smuzhiyun #define CEC_OP_UI_CMD_SELECT_SOUND_PRESENTATION 0x57
935*4882a593Smuzhiyun #define CEC_OP_UI_CMD_AUDIO_DESCRIPTION 0x58
936*4882a593Smuzhiyun #define CEC_OP_UI_CMD_INTERNET 0x59
937*4882a593Smuzhiyun #define CEC_OP_UI_CMD_3D_MODE 0x5a
938*4882a593Smuzhiyun #define CEC_OP_UI_CMD_PLAY_FUNCTION 0x60
939*4882a593Smuzhiyun #define CEC_OP_UI_CMD_PAUSE_PLAY_FUNCTION 0x61
940*4882a593Smuzhiyun #define CEC_OP_UI_CMD_RECORD_FUNCTION 0x62
941*4882a593Smuzhiyun #define CEC_OP_UI_CMD_PAUSE_RECORD_FUNCTION 0x63
942*4882a593Smuzhiyun #define CEC_OP_UI_CMD_STOP_FUNCTION 0x64
943*4882a593Smuzhiyun #define CEC_OP_UI_CMD_MUTE_FUNCTION 0x65
944*4882a593Smuzhiyun #define CEC_OP_UI_CMD_RESTORE_VOLUME_FUNCTION 0x66
945*4882a593Smuzhiyun #define CEC_OP_UI_CMD_TUNE_FUNCTION 0x67
946*4882a593Smuzhiyun #define CEC_OP_UI_CMD_SELECT_MEDIA_FUNCTION 0x68
947*4882a593Smuzhiyun #define CEC_OP_UI_CMD_SELECT_AV_INPUT_FUNCTION 0x69
948*4882a593Smuzhiyun #define CEC_OP_UI_CMD_SELECT_AUDIO_INPUT_FUNCTION 0x6a
949*4882a593Smuzhiyun #define CEC_OP_UI_CMD_POWER_TOGGLE_FUNCTION 0x6b
950*4882a593Smuzhiyun #define CEC_OP_UI_CMD_POWER_OFF_FUNCTION 0x6c
951*4882a593Smuzhiyun #define CEC_OP_UI_CMD_POWER_ON_FUNCTION 0x6d
952*4882a593Smuzhiyun #define CEC_OP_UI_CMD_F1_BLUE 0x71
953*4882a593Smuzhiyun #define CEC_OP_UI_CMD_F2_RED 0x72
954*4882a593Smuzhiyun #define CEC_OP_UI_CMD_F3_GREEN 0x73
955*4882a593Smuzhiyun #define CEC_OP_UI_CMD_F4_YELLOW 0x74
956*4882a593Smuzhiyun #define CEC_OP_UI_CMD_F5 0x75
957*4882a593Smuzhiyun #define CEC_OP_UI_CMD_DATA 0x76
958*4882a593Smuzhiyun /* UI Broadcast Type Operand (ui_bcast_type) */
959*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_TOGGLE_ALL 0x00
960*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_TOGGLE_DIG_ANA 0x01
961*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_ANALOGUE 0x10
962*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_ANALOGUE_T 0x20
963*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_ANALOGUE_CABLE 0x30
964*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_ANALOGUE_SAT 0x40
965*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_DIGITAL 0x50
966*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_DIGITAL_T 0x60
967*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_DIGITAL_CABLE 0x70
968*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_DIGITAL_SAT 0x80
969*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_DIGITAL_COM_SAT 0x90
970*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_DIGITAL_COM_SAT2 0x91
971*4882a593Smuzhiyun #define CEC_OP_UI_BCAST_TYPE_IP 0xa0
972*4882a593Smuzhiyun /* UI Sound Presentation Control Operand (ui_snd_pres_ctl) */
973*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_DUAL_MONO 0x10
974*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_KARAOKE 0x20
975*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_DOWNMIX 0x80
976*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_REVERB 0x90
977*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_EQUALIZER 0xa0
978*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_BASS_UP 0xb1
979*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_BASS_NEUTRAL 0xb2
980*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_BASS_DOWN 0xb3
981*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_TREBLE_UP 0xc1
982*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_TREBLE_NEUTRAL 0xc2
983*4882a593Smuzhiyun #define CEC_OP_UI_SND_PRES_CTL_TREBLE_DOWN 0xc3
984*4882a593Smuzhiyun
985*4882a593Smuzhiyun #define CEC_MSG_USER_CONTROL_RELEASED 0x45
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun
988*4882a593Smuzhiyun /* Remote Control Passthrough Feature */
989*4882a593Smuzhiyun
990*4882a593Smuzhiyun /*
991*4882a593Smuzhiyun * Has also:
992*4882a593Smuzhiyun * CEC_MSG_USER_CONTROL_PRESSED
993*4882a593Smuzhiyun * CEC_MSG_USER_CONTROL_RELEASED
994*4882a593Smuzhiyun */
995*4882a593Smuzhiyun
996*4882a593Smuzhiyun
997*4882a593Smuzhiyun /* Power Status Feature */
998*4882a593Smuzhiyun #define CEC_MSG_GIVE_DEVICE_POWER_STATUS 0x8f
999*4882a593Smuzhiyun #define CEC_MSG_REPORT_POWER_STATUS 0x90
1000*4882a593Smuzhiyun /* Power Status Operand (pwr_state) */
1001*4882a593Smuzhiyun #define CEC_OP_POWER_STATUS_ON 0
1002*4882a593Smuzhiyun #define CEC_OP_POWER_STATUS_STANDBY 1
1003*4882a593Smuzhiyun #define CEC_OP_POWER_STATUS_TO_ON 2
1004*4882a593Smuzhiyun #define CEC_OP_POWER_STATUS_TO_STANDBY 3
1005*4882a593Smuzhiyun
1006*4882a593Smuzhiyun
1007*4882a593Smuzhiyun /* General Protocol Messages */
1008*4882a593Smuzhiyun #define CEC_MSG_FEATURE_ABORT 0x00
1009*4882a593Smuzhiyun /* Abort Reason Operand (reason) */
1010*4882a593Smuzhiyun #define CEC_OP_ABORT_UNRECOGNIZED_OP 0
1011*4882a593Smuzhiyun #define CEC_OP_ABORT_INCORRECT_MODE 1
1012*4882a593Smuzhiyun #define CEC_OP_ABORT_NO_SOURCE 2
1013*4882a593Smuzhiyun #define CEC_OP_ABORT_INVALID_OP 3
1014*4882a593Smuzhiyun #define CEC_OP_ABORT_REFUSED 4
1015*4882a593Smuzhiyun #define CEC_OP_ABORT_UNDETERMINED 5
1016*4882a593Smuzhiyun
1017*4882a593Smuzhiyun #define CEC_MSG_ABORT 0xff
1018*4882a593Smuzhiyun
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun /* System Audio Control Feature */
1021*4882a593Smuzhiyun
1022*4882a593Smuzhiyun /*
1023*4882a593Smuzhiyun * Has also:
1024*4882a593Smuzhiyun * CEC_MSG_USER_CONTROL_PRESSED
1025*4882a593Smuzhiyun * CEC_MSG_USER_CONTROL_RELEASED
1026*4882a593Smuzhiyun */
1027*4882a593Smuzhiyun #define CEC_MSG_GIVE_AUDIO_STATUS 0x71
1028*4882a593Smuzhiyun #define CEC_MSG_GIVE_SYSTEM_AUDIO_MODE_STATUS 0x7d
1029*4882a593Smuzhiyun #define CEC_MSG_REPORT_AUDIO_STATUS 0x7a
1030*4882a593Smuzhiyun /* Audio Mute Status Operand (aud_mute_status) */
1031*4882a593Smuzhiyun #define CEC_OP_AUD_MUTE_STATUS_OFF 0
1032*4882a593Smuzhiyun #define CEC_OP_AUD_MUTE_STATUS_ON 1
1033*4882a593Smuzhiyun
1034*4882a593Smuzhiyun #define CEC_MSG_REPORT_SHORT_AUDIO_DESCRIPTOR 0xa3
1035*4882a593Smuzhiyun #define CEC_MSG_REQUEST_SHORT_AUDIO_DESCRIPTOR 0xa4
1036*4882a593Smuzhiyun #define CEC_MSG_SET_SYSTEM_AUDIO_MODE 0x72
1037*4882a593Smuzhiyun /* System Audio Status Operand (sys_aud_status) */
1038*4882a593Smuzhiyun #define CEC_OP_SYS_AUD_STATUS_OFF 0
1039*4882a593Smuzhiyun #define CEC_OP_SYS_AUD_STATUS_ON 1
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun #define CEC_MSG_SYSTEM_AUDIO_MODE_REQUEST 0x70
1042*4882a593Smuzhiyun #define CEC_MSG_SYSTEM_AUDIO_MODE_STATUS 0x7e
1043*4882a593Smuzhiyun /* Audio Format ID Operand (audio_format_id) */
1044*4882a593Smuzhiyun #define CEC_OP_AUD_FMT_ID_CEA861 0
1045*4882a593Smuzhiyun #define CEC_OP_AUD_FMT_ID_CEA861_CXT 1
1046*4882a593Smuzhiyun
1047*4882a593Smuzhiyun
1048*4882a593Smuzhiyun /* Audio Rate Control Feature */
1049*4882a593Smuzhiyun #define CEC_MSG_SET_AUDIO_RATE 0x9a
1050*4882a593Smuzhiyun /* Audio Rate Operand (audio_rate) */
1051*4882a593Smuzhiyun #define CEC_OP_AUD_RATE_OFF 0
1052*4882a593Smuzhiyun #define CEC_OP_AUD_RATE_WIDE_STD 1
1053*4882a593Smuzhiyun #define CEC_OP_AUD_RATE_WIDE_FAST 2
1054*4882a593Smuzhiyun #define CEC_OP_AUD_RATE_WIDE_SLOW 3
1055*4882a593Smuzhiyun #define CEC_OP_AUD_RATE_NARROW_STD 4
1056*4882a593Smuzhiyun #define CEC_OP_AUD_RATE_NARROW_FAST 5
1057*4882a593Smuzhiyun #define CEC_OP_AUD_RATE_NARROW_SLOW 6
1058*4882a593Smuzhiyun
1059*4882a593Smuzhiyun
1060*4882a593Smuzhiyun /* Audio Return Channel Control Feature */
1061*4882a593Smuzhiyun #define CEC_MSG_INITIATE_ARC 0xc0
1062*4882a593Smuzhiyun #define CEC_MSG_REPORT_ARC_INITIATED 0xc1
1063*4882a593Smuzhiyun #define CEC_MSG_REPORT_ARC_TERMINATED 0xc2
1064*4882a593Smuzhiyun #define CEC_MSG_REQUEST_ARC_INITIATION 0xc3
1065*4882a593Smuzhiyun #define CEC_MSG_REQUEST_ARC_TERMINATION 0xc4
1066*4882a593Smuzhiyun #define CEC_MSG_TERMINATE_ARC 0xc5
1067*4882a593Smuzhiyun
1068*4882a593Smuzhiyun
1069*4882a593Smuzhiyun /* Dynamic Audio Lipsync Feature */
1070*4882a593Smuzhiyun /* Only for CEC 2.0 and up */
1071*4882a593Smuzhiyun #define CEC_MSG_REQUEST_CURRENT_LATENCY 0xa7
1072*4882a593Smuzhiyun #define CEC_MSG_REPORT_CURRENT_LATENCY 0xa8
1073*4882a593Smuzhiyun /* Low Latency Mode Operand (low_latency_mode) */
1074*4882a593Smuzhiyun #define CEC_OP_LOW_LATENCY_MODE_OFF 0
1075*4882a593Smuzhiyun #define CEC_OP_LOW_LATENCY_MODE_ON 1
1076*4882a593Smuzhiyun /* Audio Output Compensated Operand (audio_out_compensated) */
1077*4882a593Smuzhiyun #define CEC_OP_AUD_OUT_COMPENSATED_NA 0
1078*4882a593Smuzhiyun #define CEC_OP_AUD_OUT_COMPENSATED_DELAY 1
1079*4882a593Smuzhiyun #define CEC_OP_AUD_OUT_COMPENSATED_NO_DELAY 2
1080*4882a593Smuzhiyun #define CEC_OP_AUD_OUT_COMPENSATED_PARTIAL_DELAY 3
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyun
1083*4882a593Smuzhiyun /* Capability Discovery and Control Feature */
1084*4882a593Smuzhiyun #define CEC_MSG_CDC_MESSAGE 0xf8
1085*4882a593Smuzhiyun /* Ethernet-over-HDMI: nobody ever does this... */
1086*4882a593Smuzhiyun #define CEC_MSG_CDC_HEC_INQUIRE_STATE 0x00
1087*4882a593Smuzhiyun #define CEC_MSG_CDC_HEC_REPORT_STATE 0x01
1088*4882a593Smuzhiyun /* HEC Functionality State Operand (hec_func_state) */
1089*4882a593Smuzhiyun #define CEC_OP_HEC_FUNC_STATE_NOT_SUPPORTED 0
1090*4882a593Smuzhiyun #define CEC_OP_HEC_FUNC_STATE_INACTIVE 1
1091*4882a593Smuzhiyun #define CEC_OP_HEC_FUNC_STATE_ACTIVE 2
1092*4882a593Smuzhiyun #define CEC_OP_HEC_FUNC_STATE_ACTIVATION_FIELD 3
1093*4882a593Smuzhiyun /* Host Functionality State Operand (host_func_state) */
1094*4882a593Smuzhiyun #define CEC_OP_HOST_FUNC_STATE_NOT_SUPPORTED 0
1095*4882a593Smuzhiyun #define CEC_OP_HOST_FUNC_STATE_INACTIVE 1
1096*4882a593Smuzhiyun #define CEC_OP_HOST_FUNC_STATE_ACTIVE 2
1097*4882a593Smuzhiyun /* ENC Functionality State Operand (enc_func_state) */
1098*4882a593Smuzhiyun #define CEC_OP_ENC_FUNC_STATE_EXT_CON_NOT_SUPPORTED 0
1099*4882a593Smuzhiyun #define CEC_OP_ENC_FUNC_STATE_EXT_CON_INACTIVE 1
1100*4882a593Smuzhiyun #define CEC_OP_ENC_FUNC_STATE_EXT_CON_ACTIVE 2
1101*4882a593Smuzhiyun /* CDC Error Code Operand (cdc_errcode) */
1102*4882a593Smuzhiyun #define CEC_OP_CDC_ERROR_CODE_NONE 0
1103*4882a593Smuzhiyun #define CEC_OP_CDC_ERROR_CODE_CAP_UNSUPPORTED 1
1104*4882a593Smuzhiyun #define CEC_OP_CDC_ERROR_CODE_WRONG_STATE 2
1105*4882a593Smuzhiyun #define CEC_OP_CDC_ERROR_CODE_OTHER 3
1106*4882a593Smuzhiyun /* HEC Support Operand (hec_support) */
1107*4882a593Smuzhiyun #define CEC_OP_HEC_SUPPORT_NO 0
1108*4882a593Smuzhiyun #define CEC_OP_HEC_SUPPORT_YES 1
1109*4882a593Smuzhiyun /* HEC Activation Operand (hec_activation) */
1110*4882a593Smuzhiyun #define CEC_OP_HEC_ACTIVATION_ON 0
1111*4882a593Smuzhiyun #define CEC_OP_HEC_ACTIVATION_OFF 1
1112*4882a593Smuzhiyun
1113*4882a593Smuzhiyun #define CEC_MSG_CDC_HEC_SET_STATE_ADJACENT 0x02
1114*4882a593Smuzhiyun #define CEC_MSG_CDC_HEC_SET_STATE 0x03
1115*4882a593Smuzhiyun /* HEC Set State Operand (hec_set_state) */
1116*4882a593Smuzhiyun #define CEC_OP_HEC_SET_STATE_DEACTIVATE 0
1117*4882a593Smuzhiyun #define CEC_OP_HEC_SET_STATE_ACTIVATE 1
1118*4882a593Smuzhiyun
1119*4882a593Smuzhiyun #define CEC_MSG_CDC_HEC_REQUEST_DEACTIVATION 0x04
1120*4882a593Smuzhiyun #define CEC_MSG_CDC_HEC_NOTIFY_ALIVE 0x05
1121*4882a593Smuzhiyun #define CEC_MSG_CDC_HEC_DISCOVER 0x06
1122*4882a593Smuzhiyun /* Hotplug Detect messages */
1123*4882a593Smuzhiyun #define CEC_MSG_CDC_HPD_SET_STATE 0x10
1124*4882a593Smuzhiyun /* HPD State Operand (hpd_state) */
1125*4882a593Smuzhiyun #define CEC_OP_HPD_STATE_CP_EDID_DISABLE 0
1126*4882a593Smuzhiyun #define CEC_OP_HPD_STATE_CP_EDID_ENABLE 1
1127*4882a593Smuzhiyun #define CEC_OP_HPD_STATE_CP_EDID_DISABLE_ENABLE 2
1128*4882a593Smuzhiyun #define CEC_OP_HPD_STATE_EDID_DISABLE 3
1129*4882a593Smuzhiyun #define CEC_OP_HPD_STATE_EDID_ENABLE 4
1130*4882a593Smuzhiyun #define CEC_OP_HPD_STATE_EDID_DISABLE_ENABLE 5
1131*4882a593Smuzhiyun #define CEC_MSG_CDC_HPD_REPORT_STATE 0x11
1132*4882a593Smuzhiyun /* HPD Error Code Operand (hpd_error) */
1133*4882a593Smuzhiyun #define CEC_OP_HPD_ERROR_NONE 0
1134*4882a593Smuzhiyun #define CEC_OP_HPD_ERROR_INITIATOR_NOT_CAPABLE 1
1135*4882a593Smuzhiyun #define CEC_OP_HPD_ERROR_INITIATOR_WRONG_STATE 2
1136*4882a593Smuzhiyun #define CEC_OP_HPD_ERROR_OTHER 3
1137*4882a593Smuzhiyun #define CEC_OP_HPD_ERROR_NONE_NO_VIDEO 4
1138*4882a593Smuzhiyun
1139*4882a593Smuzhiyun /* End of Messages */
1140*4882a593Smuzhiyun
1141*4882a593Smuzhiyun /* Helper functions to identify the 'special' CEC devices */
1142*4882a593Smuzhiyun
cec_is_2nd_tv(const struct cec_log_addrs * las)1143*4882a593Smuzhiyun static inline int cec_is_2nd_tv(const struct cec_log_addrs *las)
1144*4882a593Smuzhiyun {
1145*4882a593Smuzhiyun /*
1146*4882a593Smuzhiyun * It is a second TV if the logical address is 14 or 15 and the
1147*4882a593Smuzhiyun * primary device type is a TV.
1148*4882a593Smuzhiyun */
1149*4882a593Smuzhiyun return las->num_log_addrs &&
1150*4882a593Smuzhiyun las->log_addr[0] >= CEC_LOG_ADDR_SPECIFIC &&
1151*4882a593Smuzhiyun las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_TV;
1152*4882a593Smuzhiyun }
1153*4882a593Smuzhiyun
cec_is_processor(const struct cec_log_addrs * las)1154*4882a593Smuzhiyun static inline int cec_is_processor(const struct cec_log_addrs *las)
1155*4882a593Smuzhiyun {
1156*4882a593Smuzhiyun /*
1157*4882a593Smuzhiyun * It is a processor if the logical address is 12-15 and the
1158*4882a593Smuzhiyun * primary device type is a Processor.
1159*4882a593Smuzhiyun */
1160*4882a593Smuzhiyun return las->num_log_addrs &&
1161*4882a593Smuzhiyun las->log_addr[0] >= CEC_LOG_ADDR_BACKUP_1 &&
1162*4882a593Smuzhiyun las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_PROCESSOR;
1163*4882a593Smuzhiyun }
1164*4882a593Smuzhiyun
cec_is_switch(const struct cec_log_addrs * las)1165*4882a593Smuzhiyun static inline int cec_is_switch(const struct cec_log_addrs *las)
1166*4882a593Smuzhiyun {
1167*4882a593Smuzhiyun /*
1168*4882a593Smuzhiyun * It is a switch if the logical address is 15 and the
1169*4882a593Smuzhiyun * primary device type is a Switch and the CDC-Only flag is not set.
1170*4882a593Smuzhiyun */
1171*4882a593Smuzhiyun return las->num_log_addrs == 1 &&
1172*4882a593Smuzhiyun las->log_addr[0] == CEC_LOG_ADDR_UNREGISTERED &&
1173*4882a593Smuzhiyun las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_SWITCH &&
1174*4882a593Smuzhiyun !(las->flags & CEC_LOG_ADDRS_FL_CDC_ONLY);
1175*4882a593Smuzhiyun }
1176*4882a593Smuzhiyun
cec_is_cdc_only(const struct cec_log_addrs * las)1177*4882a593Smuzhiyun static inline int cec_is_cdc_only(const struct cec_log_addrs *las)
1178*4882a593Smuzhiyun {
1179*4882a593Smuzhiyun /*
1180*4882a593Smuzhiyun * It is a CDC-only device if the logical address is 15 and the
1181*4882a593Smuzhiyun * primary device type is a Switch and the CDC-Only flag is set.
1182*4882a593Smuzhiyun */
1183*4882a593Smuzhiyun return las->num_log_addrs == 1 &&
1184*4882a593Smuzhiyun las->log_addr[0] == CEC_LOG_ADDR_UNREGISTERED &&
1185*4882a593Smuzhiyun las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_SWITCH &&
1186*4882a593Smuzhiyun (las->flags & CEC_LOG_ADDRS_FL_CDC_ONLY);
1187*4882a593Smuzhiyun }
1188*4882a593Smuzhiyun
1189*4882a593Smuzhiyun #endif
1190