linux/drivers/gpu/drm/i2c/tda9950.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *  TDA9950 Consumer Electronics Control driver
   4 *
   5 * The NXP TDA9950 implements the HDMI Consumer Electronics Control
   6 * interface.  The host interface is similar to a mailbox: the data
   7 * registers starting at REG_CDR0 are written to send a command to the
   8 * internal CPU, and replies are read from these registers.
   9 *
  10 * As the data registers represent a mailbox, they must be accessed
  11 * as a single I2C transaction.  See the TDA9950 data sheet for details.
  12 */
  13#include <linux/delay.h>
  14#include <linux/i2c.h>
  15#include <linux/interrupt.h>
  16#include <linux/module.h>
  17#include <linux/platform_data/tda9950.h>
  18#include <linux/slab.h>
  19#include <drm/drm_edid.h>
  20#include <media/cec.h>
  21#include <media/cec-notifier.h>
  22
  23enum {
  24        REG_CSR = 0x00,
  25        CSR_BUSY = BIT(7),
  26        CSR_INT  = BIT(6),
  27        CSR_ERR  = BIT(5),
  28
  29        REG_CER = 0x01,
  30
  31        REG_CVR = 0x02,
  32
  33        REG_CCR = 0x03,
  34        CCR_RESET = BIT(7),
  35        CCR_ON    = BIT(6),
  36
  37        REG_ACKH = 0x04,
  38        REG_ACKL = 0x05,
  39
  40        REG_CCONR = 0x06,
  41        CCONR_ENABLE_ERROR = BIT(4),
  42        CCONR_RETRY_MASK = 7,
  43
  44        REG_CDR0 = 0x07,
  45
  46        CDR1_REQ = 0x00,
  47        CDR1_CNF = 0x01,
  48        CDR1_IND = 0x81,
  49        CDR1_ERR = 0x82,
  50        CDR1_IER = 0x83,
  51
  52        CDR2_CNF_SUCCESS    = 0x00,
  53        CDR2_CNF_OFF_STATE  = 0x80,
  54        CDR2_CNF_BAD_REQ    = 0x81,
  55        CDR2_CNF_CEC_ACCESS = 0x82,
  56        CDR2_CNF_ARB_ERROR  = 0x83,
  57        CDR2_CNF_BAD_TIMING = 0x84,
  58        CDR2_CNF_NACK_ADDR  = 0x85,
  59        CDR2_CNF_NACK_DATA  = 0x86,
  60};
  61
  62struct tda9950_priv {
  63        struct i2c_client *client;
  64        struct device *hdmi;
  65        struct cec_adapter *adap;
  66        struct tda9950_glue *glue;
  67        u16 addresses;
  68        struct cec_msg rx_msg;
  69        struct cec_notifier *notify;
  70        bool open;
  71};
  72
  73static int tda9950_write_range(struct i2c_client *client, u8 addr, u8 *p, int cnt)
  74{
  75        struct i2c_msg msg;
  76        u8 buf[CEC_MAX_MSG_SIZE + 3];
  77        int ret;
  78
  79        if (WARN_ON(cnt > sizeof(buf) - 1))
  80                return -EINVAL;
  81
  82        buf[0] = addr;
  83        memcpy(buf + 1, p, cnt);
  84
  85        msg.addr = client->addr;
  86        msg.flags = 0;
  87        msg.len = cnt + 1;
  88        msg.buf = buf;
  89
  90        dev_dbg(&client->dev, "wr 0x%02x: %*ph\n", addr, cnt, p);
  91
  92        ret = i2c_transfer(client->adapter, &msg, 1);
  93        if (ret < 0)
  94                dev_err(&client->dev, "Error %d writing to cec:0x%x\n", ret, addr);
  95        return ret < 0 ? ret : 0;
  96}
  97
  98static void tda9950_write(struct i2c_client *client, u8 addr, u8 val)
  99{
 100        tda9950_write_range(client, addr, &val, 1);
 101}
 102
 103static int tda9950_read_range(struct i2c_client *client, u8 addr, u8 *p, int cnt)
 104{
 105        struct i2c_msg msg[2];
 106        int ret;
 107
 108        msg[0].addr = client->addr;
 109        msg[0].flags = 0;
 110        msg[0].len = 1;
 111        msg[0].buf = &addr;
 112        msg[1].addr = client->addr;
 113        msg[1].flags = I2C_M_RD;
 114        msg[1].len = cnt;
 115        msg[1].buf = p;
 116
 117        ret = i2c_transfer(client->adapter, msg, 2);
 118        if (ret < 0)
 119                dev_err(&client->dev, "Error %d reading from cec:0x%x\n", ret, addr);
 120
 121        dev_dbg(&client->dev, "rd 0x%02x: %*ph\n", addr, cnt, p);
 122
 123        return ret;
 124}
 125
 126static u8 tda9950_read(struct i2c_client *client, u8 addr)
 127{
 128        int ret;
 129        u8 val;
 130
 131        ret = tda9950_read_range(client, addr, &val, 1);
 132        if (ret < 0)
 133                val = 0;
 134
 135        return val;
 136}
 137
 138static irqreturn_t tda9950_irq(int irq, void *data)
 139{
 140        struct tda9950_priv *priv = data;
 141        unsigned int tx_status;
 142        u8 csr, cconr, buf[19];
 143        u8 arb_lost_cnt, nack_cnt, err_cnt;
 144
 145        if (!priv->open)
 146                return IRQ_NONE;
 147
 148        csr = tda9950_read(priv->client, REG_CSR);
 149        if (!(csr & CSR_INT))
 150                return IRQ_NONE;
 151
 152        cconr = tda9950_read(priv->client, REG_CCONR) & CCONR_RETRY_MASK;
 153
 154        tda9950_read_range(priv->client, REG_CDR0, buf, sizeof(buf));
 155
 156        /*
 157         * This should never happen: the data sheet says that there will
 158         * always be a valid message if the interrupt line is asserted.
 159         */
 160        if (buf[0] == 0) {
 161                dev_warn(&priv->client->dev, "interrupt pending, but no message?\n");
 162                return IRQ_NONE;
 163        }
 164
 165        switch (buf[1]) {
 166        case CDR1_CNF: /* transmit result */
 167                arb_lost_cnt = nack_cnt = err_cnt = 0;
 168                switch (buf[2]) {
 169                case CDR2_CNF_SUCCESS:
 170                        tx_status = CEC_TX_STATUS_OK;
 171                        break;
 172
 173                case CDR2_CNF_ARB_ERROR:
 174                        tx_status = CEC_TX_STATUS_ARB_LOST;
 175                        arb_lost_cnt = cconr;
 176                        break;
 177
 178                case CDR2_CNF_NACK_ADDR:
 179                        tx_status = CEC_TX_STATUS_NACK;
 180                        nack_cnt = cconr;
 181                        break;
 182
 183                default: /* some other error, refer to TDA9950 docs */
 184                        dev_err(&priv->client->dev, "CNF reply error 0x%02x\n",
 185                                buf[2]);
 186                        tx_status = CEC_TX_STATUS_ERROR;
 187                        err_cnt = cconr;
 188                        break;
 189                }
 190                /* TDA9950 executes all retries for us */
 191                if (tx_status != CEC_TX_STATUS_OK)
 192                        tx_status |= CEC_TX_STATUS_MAX_RETRIES;
 193                cec_transmit_done(priv->adap, tx_status, arb_lost_cnt,
 194                                  nack_cnt, 0, err_cnt);
 195                break;
 196
 197        case CDR1_IND:
 198                priv->rx_msg.len = buf[0] - 2;
 199                if (priv->rx_msg.len > CEC_MAX_MSG_SIZE)
 200                        priv->rx_msg.len = CEC_MAX_MSG_SIZE;
 201
 202                memcpy(priv->rx_msg.msg, buf + 2, priv->rx_msg.len);
 203                cec_received_msg(priv->adap, &priv->rx_msg);
 204                break;
 205
 206        default: /* unknown */
 207                dev_err(&priv->client->dev, "unknown service id 0x%02x\n",
 208                        buf[1]);
 209                break;
 210        }
 211
 212        return IRQ_HANDLED;
 213}
 214
 215static int tda9950_cec_transmit(struct cec_adapter *adap, u8 attempts,
 216                                u32 signal_free_time, struct cec_msg *msg)
 217{
 218        struct tda9950_priv *priv = adap->priv;
 219        u8 buf[CEC_MAX_MSG_SIZE + 2];
 220
 221        buf[0] = 2 + msg->len;
 222        buf[1] = CDR1_REQ;
 223        memcpy(buf + 2, msg->msg, msg->len);
 224
 225        if (attempts > 5)
 226                attempts = 5;
 227
 228        tda9950_write(priv->client, REG_CCONR, attempts);
 229
 230        return tda9950_write_range(priv->client, REG_CDR0, buf, 2 + msg->len);
 231}
 232
 233static int tda9950_cec_adap_log_addr(struct cec_adapter *adap, u8 addr)
 234{
 235        struct tda9950_priv *priv = adap->priv;
 236        u16 addresses;
 237        u8 buf[2];
 238
 239        if (addr == CEC_LOG_ADDR_INVALID)
 240                addresses = priv->addresses = 0;
 241        else
 242                addresses = priv->addresses |= BIT(addr);
 243
 244        /* TDA9950 doesn't want address 15 set */
 245        addresses &= 0x7fff;
 246        buf[0] = addresses >> 8;
 247        buf[1] = addresses;
 248
 249        return tda9950_write_range(priv->client, REG_ACKH, buf, 2);
 250}
 251
 252/*
 253 * When operating as part of the TDA998x, we need additional handling
 254 * to initialise and shut down the TDA9950 part of the device.  These
 255 * two hooks are provided to allow the TDA998x code to perform those
 256 * activities.
 257 */
 258static int tda9950_glue_open(struct tda9950_priv *priv)
 259{
 260        int ret = 0;
 261
 262        if (priv->glue && priv->glue->open)
 263                ret = priv->glue->open(priv->glue->data);
 264
 265        priv->open = true;
 266
 267        return ret;
 268}
 269
 270static void tda9950_glue_release(struct tda9950_priv *priv)
 271{
 272        priv->open = false;
 273
 274        if (priv->glue && priv->glue->release)
 275                priv->glue->release(priv->glue->data);
 276}
 277
 278static int tda9950_open(struct tda9950_priv *priv)
 279{
 280        struct i2c_client *client = priv->client;
 281        int ret;
 282
 283        ret = tda9950_glue_open(priv);
 284        if (ret)
 285                return ret;
 286
 287        /* Reset the TDA9950, and wait 250ms for it to recover */
 288        tda9950_write(client, REG_CCR, CCR_RESET);
 289        msleep(250);
 290
 291        tda9950_cec_adap_log_addr(priv->adap, CEC_LOG_ADDR_INVALID);
 292
 293        /* Start the command processor */
 294        tda9950_write(client, REG_CCR, CCR_ON);
 295
 296        return 0;
 297}
 298
 299static void tda9950_release(struct tda9950_priv *priv)
 300{
 301        struct i2c_client *client = priv->client;
 302        int timeout = 50;
 303        u8 csr;
 304
 305        /* Stop the command processor */
 306        tda9950_write(client, REG_CCR, 0);
 307
 308        /* Wait up to .5s for it to signal non-busy */
 309        do {
 310                csr = tda9950_read(client, REG_CSR);
 311                if (!(csr & CSR_BUSY) || !--timeout)
 312                        break;
 313                msleep(10);
 314        } while (1);
 315
 316        /* Warn the user that their IRQ may die if it's shared. */
 317        if (csr & CSR_BUSY)
 318                dev_warn(&client->dev, "command processor failed to stop, irq%d may die (csr=0x%02x)\n",
 319                         client->irq, csr);
 320
 321        tda9950_glue_release(priv);
 322}
 323
 324static int tda9950_cec_adap_enable(struct cec_adapter *adap, bool enable)
 325{
 326        struct tda9950_priv *priv = adap->priv;
 327
 328        if (!enable) {
 329                tda9950_release(priv);
 330                return 0;
 331        } else {
 332                return tda9950_open(priv);
 333        }
 334}
 335
 336static const struct cec_adap_ops tda9950_cec_ops = {
 337        .adap_enable = tda9950_cec_adap_enable,
 338        .adap_log_addr = tda9950_cec_adap_log_addr,
 339        .adap_transmit = tda9950_cec_transmit,
 340};
 341
 342/*
 343 * When operating as part of the TDA998x, we need to claim additional
 344 * resources.  These two hooks permit the management of those resources.
 345 */
 346static void tda9950_devm_glue_exit(void *data)
 347{
 348        struct tda9950_glue *glue = data;
 349
 350        if (glue && glue->exit)
 351                glue->exit(glue->data);
 352}
 353
 354static int tda9950_devm_glue_init(struct device *dev, struct tda9950_glue *glue)
 355{
 356        int ret;
 357
 358        if (glue && glue->init) {
 359                ret = glue->init(glue->data);
 360                if (ret)
 361                        return ret;
 362        }
 363
 364        ret = devm_add_action(dev, tda9950_devm_glue_exit, glue);
 365        if (ret)
 366                tda9950_devm_glue_exit(glue);
 367
 368        return ret;
 369}
 370
 371static void tda9950_cec_del(void *data)
 372{
 373        struct tda9950_priv *priv = data;
 374
 375        cec_delete_adapter(priv->adap);
 376}
 377
 378static int tda9950_probe(struct i2c_client *client,
 379                         const struct i2c_device_id *id)
 380{
 381        struct tda9950_glue *glue = client->dev.platform_data;
 382        struct device *dev = &client->dev;
 383        struct tda9950_priv *priv;
 384        unsigned long irqflags;
 385        int ret;
 386        u8 cvr;
 387
 388        /*
 389         * We must have I2C functionality: our multi-byte accesses
 390         * must be performed as a single contiguous transaction.
 391         */
 392        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
 393                dev_err(&client->dev,
 394                        "adapter does not support I2C functionality\n");
 395                return -ENXIO;
 396        }
 397
 398        /* We must have an interrupt to be functional. */
 399        if (client->irq <= 0) {
 400                dev_err(&client->dev, "driver requires an interrupt\n");
 401                return -ENXIO;
 402        }
 403
 404        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
 405        if (!priv)
 406                return -ENOMEM;
 407
 408        priv->client = client;
 409        priv->glue = glue;
 410
 411        i2c_set_clientdata(client, priv);
 412
 413        /*
 414         * If we're part of a TDA998x, we want the class devices to be
 415         * associated with the HDMI Tx so we have a tight relationship
 416         * between the HDMI interface and the CEC interface.
 417         */
 418        priv->hdmi = dev;
 419        if (glue && glue->parent)
 420                priv->hdmi = glue->parent;
 421
 422        priv->adap = cec_allocate_adapter(&tda9950_cec_ops, priv, "tda9950",
 423                                          CEC_CAP_DEFAULTS |
 424                                          CEC_CAP_CONNECTOR_INFO,
 425                                          CEC_MAX_LOG_ADDRS);
 426        if (IS_ERR(priv->adap))
 427                return PTR_ERR(priv->adap);
 428
 429        ret = devm_add_action(dev, tda9950_cec_del, priv);
 430        if (ret) {
 431                cec_delete_adapter(priv->adap);
 432                return ret;
 433        }
 434
 435        ret = tda9950_devm_glue_init(dev, glue);
 436        if (ret)
 437                return ret;
 438
 439        ret = tda9950_glue_open(priv);
 440        if (ret)
 441                return ret;
 442
 443        cvr = tda9950_read(client, REG_CVR);
 444
 445        dev_info(&client->dev,
 446                 "TDA9950 CEC interface, hardware version %u.%u\n",
 447                 cvr >> 4, cvr & 15);
 448
 449        tda9950_glue_release(priv);
 450
 451        irqflags = IRQF_TRIGGER_FALLING;
 452        if (glue)
 453                irqflags = glue->irq_flags;
 454
 455        ret = devm_request_threaded_irq(dev, client->irq, NULL, tda9950_irq,
 456                                        irqflags | IRQF_SHARED | IRQF_ONESHOT,
 457                                        dev_name(&client->dev), priv);
 458        if (ret < 0)
 459                return ret;
 460
 461        priv->notify = cec_notifier_cec_adap_register(priv->hdmi, NULL,
 462                                                      priv->adap);
 463        if (!priv->notify)
 464                return -ENOMEM;
 465
 466        ret = cec_register_adapter(priv->adap, priv->hdmi);
 467        if (ret < 0) {
 468                cec_notifier_cec_adap_unregister(priv->notify, priv->adap);
 469                return ret;
 470        }
 471
 472        /*
 473         * CEC documentation says we must not call cec_delete_adapter
 474         * after a successful call to cec_register_adapter().
 475         */
 476        devm_remove_action(dev, tda9950_cec_del, priv);
 477
 478        return 0;
 479}
 480
 481static int tda9950_remove(struct i2c_client *client)
 482{
 483        struct tda9950_priv *priv = i2c_get_clientdata(client);
 484
 485        cec_notifier_cec_adap_unregister(priv->notify, priv->adap);
 486        cec_unregister_adapter(priv->adap);
 487
 488        return 0;
 489}
 490
 491static struct i2c_device_id tda9950_ids[] = {
 492        { "tda9950", 0 },
 493        { },
 494};
 495MODULE_DEVICE_TABLE(i2c, tda9950_ids);
 496
 497static struct i2c_driver tda9950_driver = {
 498        .probe = tda9950_probe,
 499        .remove = tda9950_remove,
 500        .driver = {
 501                .name = "tda9950",
 502        },
 503        .id_table = tda9950_ids,
 504};
 505
 506module_i2c_driver(tda9950_driver);
 507
 508MODULE_AUTHOR("Russell King <rmk+kernel@armlinux.org.uk>");
 509MODULE_DESCRIPTION("TDA9950/TDA998x Consumer Electronics Control Driver");
 510MODULE_LICENSE("GPL v2");
 511