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