linux-headers (unknown)

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