linux/drivers/media/cec/usb/pulse8/pulse8-cec.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Pulse Eight HDMI CEC driver
   4 *
   5 * Copyright 2016 Hans Verkuil <hverkuil@xs4all.nl
   6 */
   7
   8/*
   9 * Notes:
  10 *
  11 * - Devices with firmware version < 2 do not store their configuration in
  12 *   EEPROM.
  13 *
  14 * - In autonomous mode, only messages from a TV will be acknowledged, even
  15 *   polling messages. Upon receiving a message from a TV, the dongle will
  16 *   respond to messages from any logical address.
  17 *
  18 * - In autonomous mode, the dongle will by default reply Feature Abort
  19 *   [Unrecognized Opcode] when it receives Give Device Vendor ID. It will
  20 *   however observe vendor ID's reported by other devices and possibly
  21 *   alter this behavior. When TV's (and TV's only) report that their vendor ID
  22 *   is LG (0x00e091), the dongle will itself reply that it has the same vendor
  23 *   ID, and it will respond to at least one vendor specific command.
  24 *
  25 * - In autonomous mode, the dongle is known to attempt wakeup if it receives
  26 *   <User Control Pressed> ["Power On"], ["Power] or ["Power Toggle"], or if it
  27 *   receives <Set Stream Path> with its own physical address. It also does this
  28 *   if it receives <Vendor Specific Command> [0x03 0x00] from an LG TV.
  29 */
  30
  31#include <linux/completion.h>
  32#include <linux/init.h>
  33#include <linux/interrupt.h>
  34#include <linux/kernel.h>
  35#include <linux/module.h>
  36#include <linux/workqueue.h>
  37#include <linux/serio.h>
  38#include <linux/slab.h>
  39#include <linux/time.h>
  40#include <linux/delay.h>
  41
  42#include <media/cec.h>
  43
  44MODULE_AUTHOR("Hans Verkuil <hverkuil@xs4all.nl>");
  45MODULE_DESCRIPTION("Pulse Eight HDMI CEC driver");
  46MODULE_LICENSE("GPL");
  47
  48static int debug;
  49static int persistent_config;
  50module_param(debug, int, 0644);
  51module_param(persistent_config, int, 0644);
  52MODULE_PARM_DESC(debug, "debug level (0-2)");
  53MODULE_PARM_DESC(persistent_config, "read config from persistent memory (0-1)");
  54
  55enum pulse8_msgcodes {
  56        MSGCODE_NOTHING = 0,
  57        MSGCODE_PING,
  58        MSGCODE_TIMEOUT_ERROR,
  59        MSGCODE_HIGH_ERROR,
  60        MSGCODE_LOW_ERROR,
  61        MSGCODE_FRAME_START,
  62        MSGCODE_FRAME_DATA,
  63        MSGCODE_RECEIVE_FAILED,
  64        MSGCODE_COMMAND_ACCEPTED,       /* 0x08 */
  65        MSGCODE_COMMAND_REJECTED,
  66        MSGCODE_SET_ACK_MASK,
  67        MSGCODE_TRANSMIT,
  68        MSGCODE_TRANSMIT_EOM,
  69        MSGCODE_TRANSMIT_IDLETIME,
  70        MSGCODE_TRANSMIT_ACK_POLARITY,
  71        MSGCODE_TRANSMIT_LINE_TIMEOUT,
  72        MSGCODE_TRANSMIT_SUCCEEDED,     /* 0x10 */
  73        MSGCODE_TRANSMIT_FAILED_LINE,
  74        MSGCODE_TRANSMIT_FAILED_ACK,
  75        MSGCODE_TRANSMIT_FAILED_TIMEOUT_DATA,
  76        MSGCODE_TRANSMIT_FAILED_TIMEOUT_LINE,
  77        MSGCODE_FIRMWARE_VERSION,
  78        MSGCODE_START_BOOTLOADER,
  79        MSGCODE_GET_BUILDDATE,
  80        MSGCODE_SET_CONTROLLED,         /* 0x18 */
  81        MSGCODE_GET_AUTO_ENABLED,
  82        MSGCODE_SET_AUTO_ENABLED,
  83        MSGCODE_GET_DEFAULT_LOGICAL_ADDRESS,
  84        MSGCODE_SET_DEFAULT_LOGICAL_ADDRESS,
  85        MSGCODE_GET_LOGICAL_ADDRESS_MASK,
  86        MSGCODE_SET_LOGICAL_ADDRESS_MASK,
  87        MSGCODE_GET_PHYSICAL_ADDRESS,
  88        MSGCODE_SET_PHYSICAL_ADDRESS,   /* 0x20 */
  89        MSGCODE_GET_DEVICE_TYPE,
  90        MSGCODE_SET_DEVICE_TYPE,
  91        MSGCODE_GET_HDMI_VERSION,
  92        MSGCODE_SET_HDMI_VERSION,
  93        MSGCODE_GET_OSD_NAME,
  94        MSGCODE_SET_OSD_NAME,
  95        MSGCODE_WRITE_EEPROM,
  96        MSGCODE_GET_ADAPTER_TYPE,       /* 0x28 */
  97        MSGCODE_SET_ACTIVE_SOURCE,
  98
  99        MSGCODE_FRAME_EOM = 0x80,
 100        MSGCODE_FRAME_ACK = 0x40,
 101};
 102
 103static const char * const pulse8_msgnames[] = {
 104        "NOTHING",
 105        "PING",
 106        "TIMEOUT_ERROR",
 107        "HIGH_ERROR",
 108        "LOW_ERROR",
 109        "FRAME_START",
 110        "FRAME_DATA",
 111        "RECEIVE_FAILED",
 112        "COMMAND_ACCEPTED",
 113        "COMMAND_REJECTED",
 114        "SET_ACK_MASK",
 115        "TRANSMIT",
 116        "TRANSMIT_EOM",
 117        "TRANSMIT_IDLETIME",
 118        "TRANSMIT_ACK_POLARITY",
 119        "TRANSMIT_LINE_TIMEOUT",
 120        "TRANSMIT_SUCCEEDED",
 121        "TRANSMIT_FAILED_LINE",
 122        "TRANSMIT_FAILED_ACK",
 123        "TRANSMIT_FAILED_TIMEOUT_DATA",
 124        "TRANSMIT_FAILED_TIMEOUT_LINE",
 125        "FIRMWARE_VERSION",
 126        "START_BOOTLOADER",
 127        "GET_BUILDDATE",
 128        "SET_CONTROLLED",
 129        "GET_AUTO_ENABLED",
 130        "SET_AUTO_ENABLED",
 131        "GET_DEFAULT_LOGICAL_ADDRESS",
 132        "SET_DEFAULT_LOGICAL_ADDRESS",
 133        "GET_LOGICAL_ADDRESS_MASK",
 134        "SET_LOGICAL_ADDRESS_MASK",
 135        "GET_PHYSICAL_ADDRESS",
 136        "SET_PHYSICAL_ADDRESS",
 137        "GET_DEVICE_TYPE",
 138        "SET_DEVICE_TYPE",
 139        "GET_HDMI_VERSION",
 140        "SET_HDMI_VERSION",
 141        "GET_OSD_NAME",
 142        "SET_OSD_NAME",
 143        "WRITE_EEPROM",
 144        "GET_ADAPTER_TYPE",
 145        "SET_ACTIVE_SOURCE",
 146};
 147
 148static const char *pulse8_msgname(u8 cmd)
 149{
 150        static char unknown_msg[5];
 151
 152        if ((cmd & 0x3f) < ARRAY_SIZE(pulse8_msgnames))
 153                return pulse8_msgnames[cmd & 0x3f];
 154        snprintf(unknown_msg, sizeof(unknown_msg), "0x%02x", cmd);
 155        return unknown_msg;
 156}
 157
 158#define MSGSTART        0xff
 159#define MSGEND          0xfe
 160#define MSGESC          0xfd
 161#define MSGOFFSET       3
 162
 163#define DATA_SIZE 256
 164
 165#define PING_PERIOD     (15 * HZ)
 166
 167#define NUM_MSGS 8
 168
 169struct pulse8 {
 170        struct device *dev;
 171        struct serio *serio;
 172        struct cec_adapter *adap;
 173        unsigned int vers;
 174
 175        struct delayed_work ping_eeprom_work;
 176
 177        struct work_struct irq_work;
 178        struct cec_msg rx_msg[NUM_MSGS];
 179        unsigned int rx_msg_cur_idx, rx_msg_num;
 180        /* protect rx_msg_cur_idx and rx_msg_num */
 181        spinlock_t msg_lock;
 182        u8 new_rx_msg[CEC_MAX_MSG_SIZE];
 183        u8 new_rx_msg_len;
 184
 185        struct work_struct tx_work;
 186        u32 tx_done_status;
 187        u32 tx_signal_free_time;
 188        struct cec_msg tx_msg;
 189        bool tx_msg_is_bcast;
 190
 191        struct completion cmd_done;
 192        u8 data[DATA_SIZE];
 193        unsigned int len;
 194        u8 buf[DATA_SIZE];
 195        unsigned int idx;
 196        bool escape;
 197        bool started;
 198
 199        /* locks access to the adapter */
 200        struct mutex lock;
 201        bool config_pending;
 202        bool restoring_config;
 203        bool autonomous;
 204};
 205
 206static int pulse8_send(struct serio *serio, const u8 *command, u8 cmd_len)
 207{
 208        int err = 0;
 209
 210        err = serio_write(serio, MSGSTART);
 211        if (err)
 212                return err;
 213        for (; !err && cmd_len; command++, cmd_len--) {
 214                if (*command >= MSGESC) {
 215                        err = serio_write(serio, MSGESC);
 216                        if (!err)
 217                                err = serio_write(serio, *command - MSGOFFSET);
 218                } else {
 219                        err = serio_write(serio, *command);
 220                }
 221        }
 222        if (!err)
 223                err = serio_write(serio, MSGEND);
 224
 225        return err;
 226}
 227
 228static int pulse8_send_and_wait_once(struct pulse8 *pulse8,
 229                                     const u8 *cmd, u8 cmd_len,
 230                                     u8 response, u8 size)
 231{
 232        int err;
 233
 234        if (debug > 1)
 235                dev_info(pulse8->dev, "transmit %s: %*ph\n",
 236                         pulse8_msgname(cmd[0]), cmd_len, cmd);
 237        init_completion(&pulse8->cmd_done);
 238
 239        err = pulse8_send(pulse8->serio, cmd, cmd_len);
 240        if (err)
 241                return err;
 242
 243        if (!wait_for_completion_timeout(&pulse8->cmd_done, HZ))
 244                return -ETIMEDOUT;
 245        if ((pulse8->data[0] & 0x3f) == MSGCODE_COMMAND_REJECTED &&
 246            cmd[0] != MSGCODE_SET_CONTROLLED &&
 247            cmd[0] != MSGCODE_SET_AUTO_ENABLED &&
 248            cmd[0] != MSGCODE_GET_BUILDDATE)
 249                return -ENOTTY;
 250        if (response &&
 251            ((pulse8->data[0] & 0x3f) != response || pulse8->len < size + 1)) {
 252                dev_info(pulse8->dev, "transmit %s failed with %s\n",
 253                         pulse8_msgname(cmd[0]),
 254                         pulse8_msgname(pulse8->data[0]));
 255                return -EIO;
 256        }
 257        return 0;
 258}
 259
 260static int pulse8_send_and_wait(struct pulse8 *pulse8,
 261                                const u8 *cmd, u8 cmd_len, u8 response, u8 size)
 262{
 263        u8 cmd_sc[2];
 264        int err;
 265
 266        err = pulse8_send_and_wait_once(pulse8, cmd, cmd_len, response, size);
 267        if (err != -ENOTTY)
 268                return err;
 269
 270        cmd_sc[0] = MSGCODE_SET_CONTROLLED;
 271        cmd_sc[1] = 1;
 272        err = pulse8_send_and_wait_once(pulse8, cmd_sc, 2,
 273                                        MSGCODE_COMMAND_ACCEPTED, 1);
 274        if (!err)
 275                err = pulse8_send_and_wait_once(pulse8, cmd, cmd_len,
 276                                                response, size);
 277        return err == -ENOTTY ? -EIO : err;
 278}
 279
 280static void pulse8_tx_work_handler(struct work_struct *work)
 281{
 282        struct pulse8 *pulse8 = container_of(work, struct pulse8, tx_work);
 283        struct cec_msg *msg = &pulse8->tx_msg;
 284        unsigned int i;
 285        u8 cmd[2];
 286        int err;
 287
 288        if (msg->len == 0)
 289                return;
 290
 291        mutex_lock(&pulse8->lock);
 292        cmd[0] = MSGCODE_TRANSMIT_IDLETIME;
 293        cmd[1] = pulse8->tx_signal_free_time;
 294        err = pulse8_send_and_wait(pulse8, cmd, 2,
 295                                   MSGCODE_COMMAND_ACCEPTED, 1);
 296        cmd[0] = MSGCODE_TRANSMIT_ACK_POLARITY;
 297        cmd[1] = cec_msg_is_broadcast(msg);
 298        pulse8->tx_msg_is_bcast = cec_msg_is_broadcast(msg);
 299        if (!err)
 300                err = pulse8_send_and_wait(pulse8, cmd, 2,
 301                                           MSGCODE_COMMAND_ACCEPTED, 1);
 302        cmd[0] = msg->len == 1 ? MSGCODE_TRANSMIT_EOM : MSGCODE_TRANSMIT;
 303        cmd[1] = msg->msg[0];
 304        if (!err)
 305                err = pulse8_send_and_wait(pulse8, cmd, 2,
 306                                           MSGCODE_COMMAND_ACCEPTED, 1);
 307        if (!err && msg->len > 1) {
 308                for (i = 1; !err && i < msg->len; i++) {
 309                        cmd[0] = ((i == msg->len - 1)) ?
 310                                MSGCODE_TRANSMIT_EOM : MSGCODE_TRANSMIT;
 311                        cmd[1] = msg->msg[i];
 312                        err = pulse8_send_and_wait(pulse8, cmd, 2,
 313                                                   MSGCODE_COMMAND_ACCEPTED, 1);
 314                }
 315        }
 316        if (err && debug)
 317                dev_info(pulse8->dev, "%s(0x%02x) failed with error %d for msg %*ph\n",
 318                         pulse8_msgname(cmd[0]), cmd[1],
 319                         err, msg->len, msg->msg);
 320        msg->len = 0;
 321        mutex_unlock(&pulse8->lock);
 322        if (err)
 323                cec_transmit_attempt_done(pulse8->adap, CEC_TX_STATUS_ERROR);
 324}
 325
 326static void pulse8_irq_work_handler(struct work_struct *work)
 327{
 328        struct pulse8 *pulse8 =
 329                container_of(work, struct pulse8, irq_work);
 330        unsigned long flags;
 331        u32 status;
 332
 333        spin_lock_irqsave(&pulse8->msg_lock, flags);
 334        while (pulse8->rx_msg_num) {
 335                spin_unlock_irqrestore(&pulse8->msg_lock, flags);
 336                if (debug)
 337                        dev_info(pulse8->dev, "adap received %*ph\n",
 338                                 pulse8->rx_msg[pulse8->rx_msg_cur_idx].len,
 339                                 pulse8->rx_msg[pulse8->rx_msg_cur_idx].msg);
 340                cec_received_msg(pulse8->adap,
 341                                 &pulse8->rx_msg[pulse8->rx_msg_cur_idx]);
 342                spin_lock_irqsave(&pulse8->msg_lock, flags);
 343                if (pulse8->rx_msg_num)
 344                        pulse8->rx_msg_num--;
 345                pulse8->rx_msg_cur_idx =
 346                        (pulse8->rx_msg_cur_idx + 1) % NUM_MSGS;
 347        }
 348        spin_unlock_irqrestore(&pulse8->msg_lock, flags);
 349
 350        mutex_lock(&pulse8->lock);
 351        status = pulse8->tx_done_status;
 352        pulse8->tx_done_status = 0;
 353        mutex_unlock(&pulse8->lock);
 354        if (status)
 355                cec_transmit_attempt_done(pulse8->adap, status);
 356}
 357
 358static irqreturn_t pulse8_interrupt(struct serio *serio, unsigned char data,
 359                                    unsigned int flags)
 360{
 361        struct pulse8 *pulse8 = serio_get_drvdata(serio);
 362        unsigned long irq_flags;
 363        unsigned int idx;
 364
 365        if (!pulse8->started && data != MSGSTART)
 366                return IRQ_HANDLED;
 367        if (data == MSGESC) {
 368                pulse8->escape = true;
 369                return IRQ_HANDLED;
 370        }
 371        if (pulse8->escape) {
 372                data += MSGOFFSET;
 373                pulse8->escape = false;
 374        } else if (data == MSGEND) {
 375                u8 msgcode = pulse8->buf[0];
 376
 377                if (debug > 1)
 378                        dev_info(pulse8->dev, "received %s: %*ph\n",
 379                                 pulse8_msgname(msgcode),
 380                                 pulse8->idx, pulse8->buf);
 381                switch (msgcode & 0x3f) {
 382                case MSGCODE_FRAME_START:
 383                        /*
 384                         * Test if we are receiving a new msg when a previous
 385                         * message is still pending.
 386                         */
 387                        if (!(msgcode & MSGCODE_FRAME_EOM)) {
 388                                pulse8->new_rx_msg_len = 1;
 389                                pulse8->new_rx_msg[0] = pulse8->buf[1];
 390                                break;
 391                        }
 392                        /* fall through */
 393                case MSGCODE_FRAME_DATA:
 394                        if (pulse8->new_rx_msg_len < CEC_MAX_MSG_SIZE)
 395                                pulse8->new_rx_msg[pulse8->new_rx_msg_len++] =
 396                                        pulse8->buf[1];
 397                        if (!(msgcode & MSGCODE_FRAME_EOM))
 398                                break;
 399
 400                        spin_lock_irqsave(&pulse8->msg_lock, irq_flags);
 401                        idx = (pulse8->rx_msg_cur_idx + pulse8->rx_msg_num) %
 402                                NUM_MSGS;
 403                        if (pulse8->rx_msg_num == NUM_MSGS) {
 404                                dev_warn(pulse8->dev,
 405                                         "message queue is full, dropping %*ph\n",
 406                                         pulse8->new_rx_msg_len,
 407                                         pulse8->new_rx_msg);
 408                                spin_unlock_irqrestore(&pulse8->msg_lock,
 409                                                       irq_flags);
 410                                pulse8->new_rx_msg_len = 0;
 411                                break;
 412                        }
 413                        pulse8->rx_msg_num++;
 414                        memcpy(pulse8->rx_msg[idx].msg, pulse8->new_rx_msg,
 415                               pulse8->new_rx_msg_len);
 416                        pulse8->rx_msg[idx].len = pulse8->new_rx_msg_len;
 417                        spin_unlock_irqrestore(&pulse8->msg_lock, irq_flags);
 418                        schedule_work(&pulse8->irq_work);
 419                        pulse8->new_rx_msg_len = 0;
 420                        break;
 421                case MSGCODE_TRANSMIT_SUCCEEDED:
 422                        WARN_ON(pulse8->tx_done_status);
 423                        pulse8->tx_done_status = CEC_TX_STATUS_OK;
 424                        schedule_work(&pulse8->irq_work);
 425                        break;
 426                case MSGCODE_TRANSMIT_FAILED_ACK:
 427                        /*
 428                         * A NACK for a broadcast message makes no sense, these
 429                         * seem to be spurious messages and are skipped.
 430                         */
 431                        if (pulse8->tx_msg_is_bcast)
 432                                break;
 433                        WARN_ON(pulse8->tx_done_status);
 434                        pulse8->tx_done_status = CEC_TX_STATUS_NACK;
 435                        schedule_work(&pulse8->irq_work);
 436                        break;
 437                case MSGCODE_TRANSMIT_FAILED_LINE:
 438                case MSGCODE_TRANSMIT_FAILED_TIMEOUT_DATA:
 439                case MSGCODE_TRANSMIT_FAILED_TIMEOUT_LINE:
 440                        WARN_ON(pulse8->tx_done_status);
 441                        pulse8->tx_done_status = CEC_TX_STATUS_ERROR;
 442                        schedule_work(&pulse8->irq_work);
 443                        break;
 444                case MSGCODE_HIGH_ERROR:
 445                case MSGCODE_LOW_ERROR:
 446                case MSGCODE_RECEIVE_FAILED:
 447                case MSGCODE_TIMEOUT_ERROR:
 448                        pulse8->new_rx_msg_len = 0;
 449                        break;
 450                case MSGCODE_COMMAND_ACCEPTED:
 451                case MSGCODE_COMMAND_REJECTED:
 452                default:
 453                        if (pulse8->idx == 0)
 454                                break;
 455                        memcpy(pulse8->data, pulse8->buf, pulse8->idx);
 456                        pulse8->len = pulse8->idx;
 457                        complete(&pulse8->cmd_done);
 458                        break;
 459                }
 460                pulse8->idx = 0;
 461                pulse8->started = false;
 462                return IRQ_HANDLED;
 463        } else if (data == MSGSTART) {
 464                pulse8->idx = 0;
 465                pulse8->started = true;
 466                return IRQ_HANDLED;
 467        }
 468
 469        if (pulse8->idx >= DATA_SIZE) {
 470                dev_dbg(pulse8->dev,
 471                        "throwing away %d bytes of garbage\n", pulse8->idx);
 472                pulse8->idx = 0;
 473        }
 474        pulse8->buf[pulse8->idx++] = data;
 475        return IRQ_HANDLED;
 476}
 477
 478static int pulse8_cec_adap_enable(struct cec_adapter *adap, bool enable)
 479{
 480        struct pulse8 *pulse8 = cec_get_drvdata(adap);
 481        u8 cmd[16];
 482        int err;
 483
 484        mutex_lock(&pulse8->lock);
 485        cmd[0] = MSGCODE_SET_CONTROLLED;
 486        cmd[1] = enable;
 487        err = pulse8_send_and_wait(pulse8, cmd, 2,
 488                                   MSGCODE_COMMAND_ACCEPTED, 1);
 489        if (!enable) {
 490                pulse8->rx_msg_num = 0;
 491                pulse8->tx_done_status = 0;
 492        }
 493        mutex_unlock(&pulse8->lock);
 494        return enable ? err : 0;
 495}
 496
 497static int pulse8_cec_adap_log_addr(struct cec_adapter *adap, u8 log_addr)
 498{
 499        struct pulse8 *pulse8 = cec_get_drvdata(adap);
 500        u16 mask = 0;
 501        u16 pa = adap->phys_addr;
 502        u8 cmd[16];
 503        int err = 0;
 504
 505        mutex_lock(&pulse8->lock);
 506        if (log_addr != CEC_LOG_ADDR_INVALID)
 507                mask = 1 << log_addr;
 508        cmd[0] = MSGCODE_SET_ACK_MASK;
 509        cmd[1] = mask >> 8;
 510        cmd[2] = mask & 0xff;
 511        err = pulse8_send_and_wait(pulse8, cmd, 3,
 512                                   MSGCODE_COMMAND_ACCEPTED, 0);
 513        if ((err && mask != 0) || pulse8->restoring_config)
 514                goto unlock;
 515
 516        cmd[0] = MSGCODE_SET_AUTO_ENABLED;
 517        cmd[1] = log_addr == CEC_LOG_ADDR_INVALID ? 0 : 1;
 518        err = pulse8_send_and_wait(pulse8, cmd, 2,
 519                                   MSGCODE_COMMAND_ACCEPTED, 0);
 520        if (err)
 521                goto unlock;
 522        pulse8->autonomous = cmd[1];
 523        if (log_addr == CEC_LOG_ADDR_INVALID)
 524                goto unlock;
 525
 526        cmd[0] = MSGCODE_SET_DEVICE_TYPE;
 527        cmd[1] = adap->log_addrs.primary_device_type[0];
 528        err = pulse8_send_and_wait(pulse8, cmd, 2,
 529                                   MSGCODE_COMMAND_ACCEPTED, 0);
 530        if (err)
 531                goto unlock;
 532
 533        switch (adap->log_addrs.primary_device_type[0]) {
 534        case CEC_OP_PRIM_DEVTYPE_TV:
 535                mask = CEC_LOG_ADDR_MASK_TV;
 536                break;
 537        case CEC_OP_PRIM_DEVTYPE_RECORD:
 538                mask = CEC_LOG_ADDR_MASK_RECORD;
 539                break;
 540        case CEC_OP_PRIM_DEVTYPE_TUNER:
 541                mask = CEC_LOG_ADDR_MASK_TUNER;
 542                break;
 543        case CEC_OP_PRIM_DEVTYPE_PLAYBACK:
 544                mask = CEC_LOG_ADDR_MASK_PLAYBACK;
 545                break;
 546        case CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM:
 547                mask = CEC_LOG_ADDR_MASK_AUDIOSYSTEM;
 548                break;
 549        case CEC_OP_PRIM_DEVTYPE_SWITCH:
 550                mask = CEC_LOG_ADDR_MASK_UNREGISTERED;
 551                break;
 552        case CEC_OP_PRIM_DEVTYPE_PROCESSOR:
 553                mask = CEC_LOG_ADDR_MASK_SPECIFIC;
 554                break;
 555        default:
 556                mask = 0;
 557                break;
 558        }
 559        cmd[0] = MSGCODE_SET_LOGICAL_ADDRESS_MASK;
 560        cmd[1] = mask >> 8;
 561        cmd[2] = mask & 0xff;
 562        err = pulse8_send_and_wait(pulse8, cmd, 3,
 563                                   MSGCODE_COMMAND_ACCEPTED, 0);
 564        if (err)
 565                goto unlock;
 566
 567        cmd[0] = MSGCODE_SET_DEFAULT_LOGICAL_ADDRESS;
 568        cmd[1] = log_addr;
 569        err = pulse8_send_and_wait(pulse8, cmd, 2,
 570                                   MSGCODE_COMMAND_ACCEPTED, 0);
 571        if (err)
 572                goto unlock;
 573
 574        cmd[0] = MSGCODE_SET_PHYSICAL_ADDRESS;
 575        cmd[1] = pa >> 8;
 576        cmd[2] = pa & 0xff;
 577        err = pulse8_send_and_wait(pulse8, cmd, 3,
 578                                   MSGCODE_COMMAND_ACCEPTED, 0);
 579        if (err)
 580                goto unlock;
 581
 582        cmd[0] = MSGCODE_SET_HDMI_VERSION;
 583        cmd[1] = adap->log_addrs.cec_version;
 584        err = pulse8_send_and_wait(pulse8, cmd, 2,
 585                                   MSGCODE_COMMAND_ACCEPTED, 0);
 586        if (err)
 587                goto unlock;
 588
 589        if (adap->log_addrs.osd_name[0]) {
 590                size_t osd_len = strlen(adap->log_addrs.osd_name);
 591                char *osd_str = cmd + 1;
 592
 593                cmd[0] = MSGCODE_SET_OSD_NAME;
 594                strscpy(cmd + 1, adap->log_addrs.osd_name, sizeof(cmd) - 1);
 595                if (osd_len < 4) {
 596                        memset(osd_str + osd_len, ' ', 4 - osd_len);
 597                        osd_len = 4;
 598                        osd_str[osd_len] = '\0';
 599                        strscpy(adap->log_addrs.osd_name, osd_str,
 600                                sizeof(adap->log_addrs.osd_name));
 601                }
 602                err = pulse8_send_and_wait(pulse8, cmd, 1 + osd_len,
 603                                           MSGCODE_COMMAND_ACCEPTED, 0);
 604                if (err)
 605                        goto unlock;
 606        }
 607
 608unlock:
 609        if (pulse8->restoring_config)
 610                pulse8->restoring_config = false;
 611        else
 612                pulse8->config_pending = true;
 613        mutex_unlock(&pulse8->lock);
 614        return log_addr == CEC_LOG_ADDR_INVALID ? 0 : err;
 615}
 616
 617static int pulse8_cec_adap_transmit(struct cec_adapter *adap, u8 attempts,
 618                                    u32 signal_free_time, struct cec_msg *msg)
 619{
 620        struct pulse8 *pulse8 = cec_get_drvdata(adap);
 621
 622        pulse8->tx_msg = *msg;
 623        if (debug)
 624                dev_info(pulse8->dev, "adap transmit %*ph\n",
 625                         msg->len, msg->msg);
 626        pulse8->tx_signal_free_time = signal_free_time;
 627        schedule_work(&pulse8->tx_work);
 628        return 0;
 629}
 630
 631static void pulse8_cec_adap_free(struct cec_adapter *adap)
 632{
 633        struct pulse8 *pulse8 = cec_get_drvdata(adap);
 634
 635        cancel_delayed_work_sync(&pulse8->ping_eeprom_work);
 636        cancel_work_sync(&pulse8->irq_work);
 637        cancel_work_sync(&pulse8->tx_work);
 638        kfree(pulse8);
 639}
 640
 641static const struct cec_adap_ops pulse8_cec_adap_ops = {
 642        .adap_enable = pulse8_cec_adap_enable,
 643        .adap_log_addr = pulse8_cec_adap_log_addr,
 644        .adap_transmit = pulse8_cec_adap_transmit,
 645        .adap_free = pulse8_cec_adap_free,
 646};
 647
 648static void pulse8_disconnect(struct serio *serio)
 649{
 650        struct pulse8 *pulse8 = serio_get_drvdata(serio);
 651
 652        cec_unregister_adapter(pulse8->adap);
 653        pulse8->serio = NULL;
 654        serio_set_drvdata(serio, NULL);
 655        serio_close(serio);
 656}
 657
 658static int pulse8_setup(struct pulse8 *pulse8, struct serio *serio,
 659                        struct cec_log_addrs *log_addrs, u16 *pa)
 660{
 661        u8 *data = pulse8->data + 1;
 662        u8 cmd[2];
 663        int err;
 664        time64_t date;
 665
 666        pulse8->vers = 0;
 667
 668        cmd[0] = MSGCODE_FIRMWARE_VERSION;
 669        err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 2);
 670        if (err)
 671                return err;
 672        pulse8->vers = (data[0] << 8) | data[1];
 673        dev_info(pulse8->dev, "Firmware version %04x\n", pulse8->vers);
 674        if (pulse8->vers < 2) {
 675                *pa = CEC_PHYS_ADDR_INVALID;
 676                return 0;
 677        }
 678
 679        cmd[0] = MSGCODE_GET_BUILDDATE;
 680        err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 4);
 681        if (err)
 682                return err;
 683        date = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
 684        dev_info(pulse8->dev, "Firmware build date %ptT\n", &date);
 685
 686        dev_dbg(pulse8->dev, "Persistent config:\n");
 687        cmd[0] = MSGCODE_GET_AUTO_ENABLED;
 688        err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 1);
 689        if (err)
 690                return err;
 691        pulse8->autonomous = data[0];
 692        dev_dbg(pulse8->dev, "Autonomous mode: %s",
 693                data[0] ? "on" : "off");
 694
 695        cmd[0] = MSGCODE_GET_DEVICE_TYPE;
 696        err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 1);
 697        if (err)
 698                return err;
 699        log_addrs->primary_device_type[0] = data[0];
 700        dev_dbg(pulse8->dev, "Primary device type: %d\n", data[0]);
 701        switch (log_addrs->primary_device_type[0]) {
 702        case CEC_OP_PRIM_DEVTYPE_TV:
 703                log_addrs->log_addr_type[0] = CEC_LOG_ADDR_TYPE_TV;
 704                log_addrs->all_device_types[0] = CEC_OP_ALL_DEVTYPE_TV;
 705                break;
 706        case CEC_OP_PRIM_DEVTYPE_RECORD:
 707                log_addrs->log_addr_type[0] = CEC_LOG_ADDR_TYPE_RECORD;
 708                log_addrs->all_device_types[0] = CEC_OP_ALL_DEVTYPE_RECORD;
 709                break;
 710        case CEC_OP_PRIM_DEVTYPE_TUNER:
 711                log_addrs->log_addr_type[0] = CEC_LOG_ADDR_TYPE_TUNER;
 712                log_addrs->all_device_types[0] = CEC_OP_ALL_DEVTYPE_TUNER;
 713                break;
 714        case CEC_OP_PRIM_DEVTYPE_PLAYBACK:
 715                log_addrs->log_addr_type[0] = CEC_LOG_ADDR_TYPE_PLAYBACK;
 716                log_addrs->all_device_types[0] = CEC_OP_ALL_DEVTYPE_PLAYBACK;
 717                break;
 718        case CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM:
 719                log_addrs->log_addr_type[0] = CEC_LOG_ADDR_TYPE_PLAYBACK;
 720                log_addrs->all_device_types[0] = CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM;
 721                break;
 722        case CEC_OP_PRIM_DEVTYPE_SWITCH:
 723                log_addrs->log_addr_type[0] = CEC_LOG_ADDR_TYPE_UNREGISTERED;
 724                log_addrs->all_device_types[0] = CEC_OP_ALL_DEVTYPE_SWITCH;
 725                break;
 726        case CEC_OP_PRIM_DEVTYPE_PROCESSOR:
 727                log_addrs->log_addr_type[0] = CEC_LOG_ADDR_TYPE_SPECIFIC;
 728                log_addrs->all_device_types[0] = CEC_OP_ALL_DEVTYPE_SWITCH;
 729                break;
 730        default:
 731                log_addrs->log_addr_type[0] = CEC_LOG_ADDR_TYPE_UNREGISTERED;
 732                log_addrs->all_device_types[0] = CEC_OP_ALL_DEVTYPE_SWITCH;
 733                dev_info(pulse8->dev, "Unknown Primary Device Type: %d\n",
 734                         log_addrs->primary_device_type[0]);
 735                break;
 736        }
 737
 738        cmd[0] = MSGCODE_GET_LOGICAL_ADDRESS_MASK;
 739        err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 2);
 740        if (err)
 741                return err;
 742        log_addrs->log_addr_mask = (data[0] << 8) | data[1];
 743        dev_dbg(pulse8->dev, "Logical address ACK mask: %x\n",
 744                log_addrs->log_addr_mask);
 745        if (log_addrs->log_addr_mask)
 746                log_addrs->num_log_addrs = 1;
 747
 748        cmd[0] = MSGCODE_GET_PHYSICAL_ADDRESS;
 749        err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 1);
 750        if (err)
 751                return err;
 752        *pa = (data[0] << 8) | data[1];
 753        dev_dbg(pulse8->dev, "Physical address: %x.%x.%x.%x\n",
 754                cec_phys_addr_exp(*pa));
 755
 756        cmd[0] = MSGCODE_GET_HDMI_VERSION;
 757        err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 1);
 758        if (err)
 759                return err;
 760        log_addrs->cec_version = data[0];
 761        dev_dbg(pulse8->dev, "CEC version: %d\n", log_addrs->cec_version);
 762
 763        cmd[0] = MSGCODE_GET_OSD_NAME;
 764        err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 0);
 765        if (err)
 766                return err;
 767        strscpy(log_addrs->osd_name, data, sizeof(log_addrs->osd_name));
 768        dev_dbg(pulse8->dev, "OSD name: %s\n", log_addrs->osd_name);
 769
 770        return 0;
 771}
 772
 773static int pulse8_apply_persistent_config(struct pulse8 *pulse8,
 774                                          struct cec_log_addrs *log_addrs,
 775                                          u16 pa)
 776{
 777        int err;
 778
 779        err = cec_s_log_addrs(pulse8->adap, log_addrs, false);
 780        if (err)
 781                return err;
 782
 783        cec_s_phys_addr(pulse8->adap, pa, false);
 784
 785        return 0;
 786}
 787
 788static void pulse8_ping_eeprom_work_handler(struct work_struct *work)
 789{
 790        struct pulse8 *pulse8 =
 791                container_of(work, struct pulse8, ping_eeprom_work.work);
 792        u8 cmd;
 793
 794        mutex_lock(&pulse8->lock);
 795        cmd = MSGCODE_PING;
 796        pulse8_send_and_wait(pulse8, &cmd, 1,
 797                             MSGCODE_COMMAND_ACCEPTED, 0);
 798
 799        if (pulse8->vers < 2)
 800                goto unlock;
 801
 802        if (pulse8->config_pending && persistent_config) {
 803                dev_dbg(pulse8->dev, "writing pending config to EEPROM\n");
 804                cmd = MSGCODE_WRITE_EEPROM;
 805                if (pulse8_send_and_wait(pulse8, &cmd, 1,
 806                                         MSGCODE_COMMAND_ACCEPTED, 0))
 807                        dev_info(pulse8->dev, "failed to write pending config to EEPROM\n");
 808                else
 809                        pulse8->config_pending = false;
 810        }
 811unlock:
 812        schedule_delayed_work(&pulse8->ping_eeprom_work, PING_PERIOD);
 813        mutex_unlock(&pulse8->lock);
 814}
 815
 816static int pulse8_connect(struct serio *serio, struct serio_driver *drv)
 817{
 818        u32 caps = CEC_CAP_DEFAULTS | CEC_CAP_PHYS_ADDR | CEC_CAP_MONITOR_ALL;
 819        struct pulse8 *pulse8;
 820        int err = -ENOMEM;
 821        struct cec_log_addrs log_addrs = {};
 822        u16 pa = CEC_PHYS_ADDR_INVALID;
 823
 824        pulse8 = kzalloc(sizeof(*pulse8), GFP_KERNEL);
 825
 826        if (!pulse8)
 827                return -ENOMEM;
 828
 829        pulse8->serio = serio;
 830        pulse8->adap = cec_allocate_adapter(&pulse8_cec_adap_ops, pulse8,
 831                                            dev_name(&serio->dev), caps, 1);
 832        err = PTR_ERR_OR_ZERO(pulse8->adap);
 833        if (err < 0)
 834                goto free_device;
 835
 836        pulse8->dev = &serio->dev;
 837        serio_set_drvdata(serio, pulse8);
 838        INIT_WORK(&pulse8->irq_work, pulse8_irq_work_handler);
 839        INIT_WORK(&pulse8->tx_work, pulse8_tx_work_handler);
 840        INIT_DELAYED_WORK(&pulse8->ping_eeprom_work,
 841                          pulse8_ping_eeprom_work_handler);
 842        mutex_init(&pulse8->lock);
 843        spin_lock_init(&pulse8->msg_lock);
 844        pulse8->config_pending = false;
 845
 846        err = serio_open(serio, drv);
 847        if (err)
 848                goto delete_adap;
 849
 850        err = pulse8_setup(pulse8, serio, &log_addrs, &pa);
 851        if (err)
 852                goto close_serio;
 853
 854        err = cec_register_adapter(pulse8->adap, &serio->dev);
 855        if (err < 0)
 856                goto close_serio;
 857
 858        pulse8->dev = &pulse8->adap->devnode.dev;
 859
 860        if (persistent_config && pulse8->autonomous) {
 861                err = pulse8_apply_persistent_config(pulse8, &log_addrs, pa);
 862                if (err)
 863                        goto close_serio;
 864                pulse8->restoring_config = true;
 865        }
 866
 867        schedule_delayed_work(&pulse8->ping_eeprom_work, PING_PERIOD);
 868
 869        return 0;
 870
 871close_serio:
 872        pulse8->serio = NULL;
 873        serio_set_drvdata(serio, NULL);
 874        serio_close(serio);
 875delete_adap:
 876        cec_delete_adapter(pulse8->adap);
 877free_device:
 878        kfree(pulse8);
 879        return err;
 880}
 881
 882static const struct serio_device_id pulse8_serio_ids[] = {
 883        {
 884                .type   = SERIO_RS232,
 885                .proto  = SERIO_PULSE8_CEC,
 886                .id     = SERIO_ANY,
 887                .extra  = SERIO_ANY,
 888        },
 889        { 0 }
 890};
 891
 892MODULE_DEVICE_TABLE(serio, pulse8_serio_ids);
 893
 894static struct serio_driver pulse8_drv = {
 895        .driver         = {
 896                .name   = "pulse8-cec",
 897        },
 898        .description    = "Pulse Eight HDMI CEC driver",
 899        .id_table       = pulse8_serio_ids,
 900        .interrupt      = pulse8_interrupt,
 901        .connect        = pulse8_connect,
 902        .disconnect     = pulse8_disconnect,
 903};
 904
 905module_serio_driver(pulse8_drv);
 906