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