Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'drm-tda998x-devel' of git://git.armlinux.org.uk/~rmk/linux-arm into drm-next

Please incorporate support for TDA998x I2C driver CEC

Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180424095456.GA32460@rmk-PC.armlinux.org.uk

+750 -27
+3
Documentation/devicetree/bindings/display/bridge/tda998x.txt
··· 27 27 in question is used. The implementation allows one or two DAIs. If two 28 28 DAIs are defined, they must be of different type. 29 29 30 + - nxp,calib-gpios: calibration GPIO, which must correspond with the 31 + gpio used for the TDA998x interrupt pin. 32 + 30 33 [1] Documentation/sound/alsa/soc/DAI.txt 31 34 [2] include/dt-bindings/display/tda998x.h 32 35
+6
drivers/gpu/drm/i2c/Kconfig
··· 22 22 config DRM_I2C_NXP_TDA998X 23 23 tristate "NXP Semiconductors TDA998X HDMI encoder" 24 24 default m if DRM_TILCDC 25 + select CEC_CORE if CEC_NOTIFIER 25 26 select SND_SOC_HDMI_CODEC if SND_SOC 26 27 help 27 28 Support for NXP Semiconductors TDA998X HDMI encoders. 29 + 30 + config DRM_I2C_NXP_TDA9950 31 + tristate "NXP Semiconductors TDA9950/TDA998X HDMI CEC" 32 + select CEC_NOTIFIER 33 + select CEC_CORE 28 34 29 35 endmenu
+1
drivers/gpu/drm/i2c/Makefile
··· 7 7 8 8 tda998x-y := tda998x_drv.o 9 9 obj-$(CONFIG_DRM_I2C_NXP_TDA998X) += tda998x.o 10 + obj-$(CONFIG_DRM_I2C_NXP_TDA9950) += tda9950.o
+509
drivers/gpu/drm/i2c/tda9950.c
··· 1 + /* 2 + * TDA9950 Consumer Electronics Control driver 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + * 8 + * The NXP TDA9950 implements the HDMI Consumer Electronics Control 9 + * interface. The host interface is similar to a mailbox: the data 10 + * registers starting at REG_CDR0 are written to send a command to the 11 + * internal CPU, and replies are read from these registers. 12 + * 13 + * As the data registers represent a mailbox, they must be accessed 14 + * as a single I2C transaction. See the TDA9950 data sheet for details. 15 + */ 16 + #include <linux/delay.h> 17 + #include <linux/i2c.h> 18 + #include <linux/interrupt.h> 19 + #include <linux/module.h> 20 + #include <linux/platform_data/tda9950.h> 21 + #include <linux/slab.h> 22 + #include <drm/drm_edid.h> 23 + #include <media/cec.h> 24 + #include <media/cec-notifier.h> 25 + 26 + enum { 27 + REG_CSR = 0x00, 28 + CSR_BUSY = BIT(7), 29 + CSR_INT = BIT(6), 30 + CSR_ERR = BIT(5), 31 + 32 + REG_CER = 0x01, 33 + 34 + REG_CVR = 0x02, 35 + 36 + REG_CCR = 0x03, 37 + CCR_RESET = BIT(7), 38 + CCR_ON = BIT(6), 39 + 40 + REG_ACKH = 0x04, 41 + REG_ACKL = 0x05, 42 + 43 + REG_CCONR = 0x06, 44 + CCONR_ENABLE_ERROR = BIT(4), 45 + CCONR_RETRY_MASK = 7, 46 + 47 + REG_CDR0 = 0x07, 48 + 49 + CDR1_REQ = 0x00, 50 + CDR1_CNF = 0x01, 51 + CDR1_IND = 0x81, 52 + CDR1_ERR = 0x82, 53 + CDR1_IER = 0x83, 54 + 55 + CDR2_CNF_SUCCESS = 0x00, 56 + CDR2_CNF_OFF_STATE = 0x80, 57 + CDR2_CNF_BAD_REQ = 0x81, 58 + CDR2_CNF_CEC_ACCESS = 0x82, 59 + CDR2_CNF_ARB_ERROR = 0x83, 60 + CDR2_CNF_BAD_TIMING = 0x84, 61 + CDR2_CNF_NACK_ADDR = 0x85, 62 + CDR2_CNF_NACK_DATA = 0x86, 63 + }; 64 + 65 + struct tda9950_priv { 66 + struct i2c_client *client; 67 + struct device *hdmi; 68 + struct cec_adapter *adap; 69 + struct tda9950_glue *glue; 70 + u16 addresses; 71 + struct cec_msg rx_msg; 72 + struct cec_notifier *notify; 73 + bool open; 74 + }; 75 + 76 + static int tda9950_write_range(struct i2c_client *client, u8 addr, u8 *p, int cnt) 77 + { 78 + struct i2c_msg msg; 79 + u8 buf[cnt + 1]; 80 + int ret; 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 + 98 + static void tda9950_write(struct i2c_client *client, u8 addr, u8 val) 99 + { 100 + tda9950_write_range(client, addr, &val, 1); 101 + } 102 + 103 + static 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 + 126 + static 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 + 138 + static 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 + tx_status |= CEC_TX_STATUS_MAX_RETRIES; 192 + cec_transmit_done(priv->adap, tx_status, arb_lost_cnt, 193 + nack_cnt, 0, err_cnt); 194 + break; 195 + 196 + case CDR1_IND: 197 + priv->rx_msg.len = buf[0] - 2; 198 + if (priv->rx_msg.len > CEC_MAX_MSG_SIZE) 199 + priv->rx_msg.len = CEC_MAX_MSG_SIZE; 200 + 201 + memcpy(priv->rx_msg.msg, buf + 2, priv->rx_msg.len); 202 + cec_received_msg(priv->adap, &priv->rx_msg); 203 + break; 204 + 205 + default: /* unknown */ 206 + dev_err(&priv->client->dev, "unknown service id 0x%02x\n", 207 + buf[1]); 208 + break; 209 + } 210 + 211 + return IRQ_HANDLED; 212 + } 213 + 214 + static int tda9950_cec_transmit(struct cec_adapter *adap, u8 attempts, 215 + u32 signal_free_time, struct cec_msg *msg) 216 + { 217 + struct tda9950_priv *priv = adap->priv; 218 + u8 buf[CEC_MAX_MSG_SIZE + 2]; 219 + 220 + buf[0] = 2 + msg->len; 221 + buf[1] = CDR1_REQ; 222 + memcpy(buf + 2, msg->msg, msg->len); 223 + 224 + if (attempts > 5) 225 + attempts = 5; 226 + 227 + tda9950_write(priv->client, REG_CCONR, attempts); 228 + 229 + return tda9950_write_range(priv->client, REG_CDR0, buf, 2 + msg->len); 230 + } 231 + 232 + static int tda9950_cec_adap_log_addr(struct cec_adapter *adap, u8 addr) 233 + { 234 + struct tda9950_priv *priv = adap->priv; 235 + u16 addresses; 236 + u8 buf[2]; 237 + 238 + if (addr == CEC_LOG_ADDR_INVALID) 239 + addresses = priv->addresses = 0; 240 + else 241 + addresses = priv->addresses |= BIT(addr); 242 + 243 + /* TDA9950 doesn't want address 15 set */ 244 + addresses &= 0x7fff; 245 + buf[0] = addresses >> 8; 246 + buf[1] = addresses; 247 + 248 + return tda9950_write_range(priv->client, REG_ACKH, buf, 2); 249 + } 250 + 251 + /* 252 + * When operating as part of the TDA998x, we need additional handling 253 + * to initialise and shut down the TDA9950 part of the device. These 254 + * two hooks are provided to allow the TDA998x code to perform those 255 + * activities. 256 + */ 257 + static int tda9950_glue_open(struct tda9950_priv *priv) 258 + { 259 + int ret = 0; 260 + 261 + if (priv->glue && priv->glue->open) 262 + ret = priv->glue->open(priv->glue->data); 263 + 264 + priv->open = true; 265 + 266 + return ret; 267 + } 268 + 269 + static void tda9950_glue_release(struct tda9950_priv *priv) 270 + { 271 + priv->open = false; 272 + 273 + if (priv->glue && priv->glue->release) 274 + priv->glue->release(priv->glue->data); 275 + } 276 + 277 + static int tda9950_open(struct tda9950_priv *priv) 278 + { 279 + struct i2c_client *client = priv->client; 280 + int ret; 281 + 282 + ret = tda9950_glue_open(priv); 283 + if (ret) 284 + return ret; 285 + 286 + /* Reset the TDA9950, and wait 250ms for it to recover */ 287 + tda9950_write(client, REG_CCR, CCR_RESET); 288 + msleep(250); 289 + 290 + tda9950_cec_adap_log_addr(priv->adap, CEC_LOG_ADDR_INVALID); 291 + 292 + /* Start the command processor */ 293 + tda9950_write(client, REG_CCR, CCR_ON); 294 + 295 + return 0; 296 + } 297 + 298 + static void tda9950_release(struct tda9950_priv *priv) 299 + { 300 + struct i2c_client *client = priv->client; 301 + int timeout = 50; 302 + u8 csr; 303 + 304 + /* Stop the command processor */ 305 + tda9950_write(client, REG_CCR, 0); 306 + 307 + /* Wait up to .5s for it to signal non-busy */ 308 + do { 309 + csr = tda9950_read(client, REG_CSR); 310 + if (!(csr & CSR_BUSY) || --timeout) 311 + break; 312 + msleep(10); 313 + } while (1); 314 + 315 + /* Warn the user that their IRQ may die if it's shared. */ 316 + if (csr & CSR_BUSY) 317 + dev_warn(&client->dev, "command processor failed to stop, irq%d may die (csr=0x%02x)\n", 318 + client->irq, csr); 319 + 320 + tda9950_glue_release(priv); 321 + } 322 + 323 + static int tda9950_cec_adap_enable(struct cec_adapter *adap, bool enable) 324 + { 325 + struct tda9950_priv *priv = adap->priv; 326 + 327 + if (!enable) { 328 + tda9950_release(priv); 329 + return 0; 330 + } else { 331 + return tda9950_open(priv); 332 + } 333 + } 334 + 335 + static const struct cec_adap_ops tda9950_cec_ops = { 336 + .adap_enable = tda9950_cec_adap_enable, 337 + .adap_log_addr = tda9950_cec_adap_log_addr, 338 + .adap_transmit = tda9950_cec_transmit, 339 + }; 340 + 341 + /* 342 + * When operating as part of the TDA998x, we need to claim additional 343 + * resources. These two hooks permit the management of those resources. 344 + */ 345 + static void tda9950_devm_glue_exit(void *data) 346 + { 347 + struct tda9950_glue *glue = data; 348 + 349 + if (glue && glue->exit) 350 + glue->exit(glue->data); 351 + } 352 + 353 + static int tda9950_devm_glue_init(struct device *dev, struct tda9950_glue *glue) 354 + { 355 + int ret; 356 + 357 + if (glue && glue->init) { 358 + ret = glue->init(glue->data); 359 + if (ret) 360 + return ret; 361 + } 362 + 363 + ret = devm_add_action(dev, tda9950_devm_glue_exit, glue); 364 + if (ret) 365 + tda9950_devm_glue_exit(glue); 366 + 367 + return ret; 368 + } 369 + 370 + static void tda9950_cec_del(void *data) 371 + { 372 + struct tda9950_priv *priv = data; 373 + 374 + cec_delete_adapter(priv->adap); 375 + } 376 + 377 + static int tda9950_probe(struct i2c_client *client, 378 + const struct i2c_device_id *id) 379 + { 380 + struct tda9950_glue *glue = client->dev.platform_data; 381 + struct device *dev = &client->dev; 382 + struct tda9950_priv *priv; 383 + unsigned long irqflags; 384 + int ret; 385 + u8 cvr; 386 + 387 + /* 388 + * We must have I2C functionality: our multi-byte accesses 389 + * must be performed as a single contiguous transaction. 390 + */ 391 + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 392 + dev_err(&client->dev, 393 + "adapter does not support I2C functionality\n"); 394 + return -ENXIO; 395 + } 396 + 397 + /* We must have an interrupt to be functional. */ 398 + if (client->irq <= 0) { 399 + dev_err(&client->dev, "driver requires an interrupt\n"); 400 + return -ENXIO; 401 + } 402 + 403 + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 404 + if (!priv) 405 + return -ENOMEM; 406 + 407 + priv->client = client; 408 + priv->glue = glue; 409 + 410 + i2c_set_clientdata(client, priv); 411 + 412 + /* 413 + * If we're part of a TDA998x, we want the class devices to be 414 + * associated with the HDMI Tx so we have a tight relationship 415 + * between the HDMI interface and the CEC interface. 416 + */ 417 + priv->hdmi = dev; 418 + if (glue && glue->parent) 419 + priv->hdmi = glue->parent; 420 + 421 + priv->adap = cec_allocate_adapter(&tda9950_cec_ops, priv, "tda9950", 422 + CEC_CAP_DEFAULTS, 423 + CEC_MAX_LOG_ADDRS); 424 + if (IS_ERR(priv->adap)) 425 + return PTR_ERR(priv->adap); 426 + 427 + ret = devm_add_action(dev, tda9950_cec_del, priv); 428 + if (ret) { 429 + cec_delete_adapter(priv->adap); 430 + return ret; 431 + } 432 + 433 + ret = tda9950_devm_glue_init(dev, glue); 434 + if (ret) 435 + return ret; 436 + 437 + ret = tda9950_glue_open(priv); 438 + if (ret) 439 + return ret; 440 + 441 + cvr = tda9950_read(client, REG_CVR); 442 + 443 + dev_info(&client->dev, 444 + "TDA9950 CEC interface, hardware version %u.%u\n", 445 + cvr >> 4, cvr & 15); 446 + 447 + tda9950_glue_release(priv); 448 + 449 + irqflags = IRQF_TRIGGER_FALLING; 450 + if (glue) 451 + irqflags = glue->irq_flags; 452 + 453 + ret = devm_request_threaded_irq(dev, client->irq, NULL, tda9950_irq, 454 + irqflags | IRQF_SHARED | IRQF_ONESHOT, 455 + dev_name(&client->dev), priv); 456 + if (ret < 0) 457 + return ret; 458 + 459 + priv->notify = cec_notifier_get(priv->hdmi); 460 + if (!priv->notify) 461 + return -ENOMEM; 462 + 463 + ret = cec_register_adapter(priv->adap, priv->hdmi); 464 + if (ret < 0) { 465 + cec_notifier_put(priv->notify); 466 + return ret; 467 + } 468 + 469 + /* 470 + * CEC documentation says we must not call cec_delete_adapter 471 + * after a successful call to cec_register_adapter(). 472 + */ 473 + devm_remove_action(dev, tda9950_cec_del, priv); 474 + 475 + cec_register_cec_notifier(priv->adap, priv->notify); 476 + 477 + return 0; 478 + } 479 + 480 + static int tda9950_remove(struct i2c_client *client) 481 + { 482 + struct tda9950_priv *priv = i2c_get_clientdata(client); 483 + 484 + cec_unregister_adapter(priv->adap); 485 + cec_notifier_put(priv->notify); 486 + 487 + return 0; 488 + } 489 + 490 + static struct i2c_device_id tda9950_ids[] = { 491 + { "tda9950", 0 }, 492 + { }, 493 + }; 494 + MODULE_DEVICE_TABLE(i2c, tda9950_ids); 495 + 496 + static struct i2c_driver tda9950_driver = { 497 + .probe = tda9950_probe, 498 + .remove = tda9950_remove, 499 + .driver = { 500 + .name = "tda9950", 501 + }, 502 + .id_table = tda9950_ids, 503 + }; 504 + 505 + module_i2c_driver(tda9950_driver); 506 + 507 + MODULE_AUTHOR("Russell King <rmk+kernel@armlinux.org.uk>"); 508 + MODULE_DESCRIPTION("TDA9950/TDA998x Consumer Electronics Control Driver"); 509 + MODULE_LICENSE("GPL v2");
+215 -27
drivers/gpu/drm/i2c/tda998x_drv.c
··· 16 16 */ 17 17 18 18 #include <linux/component.h> 19 + #include <linux/gpio/consumer.h> 19 20 #include <linux/hdmi.h> 20 21 #include <linux/module.h> 22 + #include <linux/platform_data/tda9950.h> 21 23 #include <linux/irq.h> 22 24 #include <sound/asoundef.h> 23 25 #include <sound/hdmi-codec.h> ··· 30 28 #include <drm/drm_edid.h> 31 29 #include <drm/drm_of.h> 32 30 #include <drm/i2c/tda998x.h> 31 + 32 + #include <media/cec-notifier.h> 33 33 34 34 #define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__) 35 35 ··· 59 55 struct platform_device *audio_pdev; 60 56 struct mutex audio_mutex; 61 57 58 + struct mutex edid_mutex; 62 59 wait_queue_head_t wq_edid; 63 60 volatile int wq_edid_wait; 64 61 ··· 72 67 struct drm_connector connector; 73 68 74 69 struct tda998x_audio_port audio_port[2]; 70 + struct tda9950_glue cec_glue; 71 + struct gpio_desc *calib; 72 + struct cec_notifier *cec_notify; 75 73 }; 76 74 77 75 #define conn_to_tda998x_priv(x) \ ··· 353 345 #define REG_CEC_INTSTATUS 0xee /* read */ 354 346 # define CEC_INTSTATUS_CEC (1 << 0) 355 347 # define CEC_INTSTATUS_HDMI (1 << 1) 348 + #define REG_CEC_CAL_XOSC_CTRL1 0xf2 349 + # define CEC_CAL_XOSC_CTRL1_ENA_CAL BIT(0) 350 + #define REG_CEC_DES_FREQ2 0xf5 351 + # define CEC_DES_FREQ2_DIS_AUTOCAL BIT(7) 352 + #define REG_CEC_CLK 0xf6 353 + # define CEC_CLK_FRO 0x11 356 354 #define REG_CEC_FRO_IM_CLK_CTRL 0xfb /* read/write */ 357 355 # define CEC_FRO_IM_CLK_CTRL_GHOST_DIS (1 << 7) 358 356 # define CEC_FRO_IM_CLK_CTRL_ENA_OTP (1 << 6) ··· 373 359 # define CEC_RXSHPDLEV_HPD (1 << 1) 374 360 375 361 #define REG_CEC_ENAMODS 0xff /* read/write */ 362 + # define CEC_ENAMODS_EN_CEC_CLK (1 << 7) 376 363 # define CEC_ENAMODS_DIS_FRO (1 << 6) 377 364 # define CEC_ENAMODS_DIS_CCLK (1 << 5) 378 365 # define CEC_ENAMODS_EN_RXSENS (1 << 2) ··· 430 415 } 431 416 432 417 return val; 418 + } 419 + 420 + static void cec_enamods(struct tda998x_priv *priv, u8 mods, bool enable) 421 + { 422 + int val = cec_read(priv, REG_CEC_ENAMODS); 423 + 424 + if (val < 0) 425 + return; 426 + 427 + if (enable) 428 + val |= mods; 429 + else 430 + val &= ~mods; 431 + 432 + cec_write(priv, REG_CEC_ENAMODS, val); 433 + } 434 + 435 + static void tda998x_cec_set_calibration(struct tda998x_priv *priv, bool enable) 436 + { 437 + if (enable) { 438 + u8 val; 439 + 440 + cec_write(priv, 0xf3, 0xc0); 441 + cec_write(priv, 0xf4, 0xd4); 442 + 443 + /* Enable automatic calibration mode */ 444 + val = cec_read(priv, REG_CEC_DES_FREQ2); 445 + val &= ~CEC_DES_FREQ2_DIS_AUTOCAL; 446 + cec_write(priv, REG_CEC_DES_FREQ2, val); 447 + 448 + /* Enable free running oscillator */ 449 + cec_write(priv, REG_CEC_CLK, CEC_CLK_FRO); 450 + cec_enamods(priv, CEC_ENAMODS_DIS_FRO, false); 451 + 452 + cec_write(priv, REG_CEC_CAL_XOSC_CTRL1, 453 + CEC_CAL_XOSC_CTRL1_ENA_CAL); 454 + } else { 455 + cec_write(priv, REG_CEC_CAL_XOSC_CTRL1, 0); 456 + } 457 + } 458 + 459 + /* 460 + * Calibration for the internal oscillator: we need to set calibration mode, 461 + * and then pulse the IRQ line low for a 10ms ± 1% period. 462 + */ 463 + static void tda998x_cec_calibration(struct tda998x_priv *priv) 464 + { 465 + struct gpio_desc *calib = priv->calib; 466 + 467 + mutex_lock(&priv->edid_mutex); 468 + if (priv->hdmi->irq > 0) 469 + disable_irq(priv->hdmi->irq); 470 + gpiod_direction_output(calib, 1); 471 + tda998x_cec_set_calibration(priv, true); 472 + 473 + local_irq_disable(); 474 + gpiod_set_value(calib, 0); 475 + mdelay(10); 476 + gpiod_set_value(calib, 1); 477 + local_irq_enable(); 478 + 479 + tda998x_cec_set_calibration(priv, false); 480 + gpiod_direction_input(calib); 481 + if (priv->hdmi->irq > 0) 482 + enable_irq(priv->hdmi->irq); 483 + mutex_unlock(&priv->edid_mutex); 484 + } 485 + 486 + static int tda998x_cec_hook_init(void *data) 487 + { 488 + struct tda998x_priv *priv = data; 489 + struct gpio_desc *calib; 490 + 491 + calib = gpiod_get(&priv->hdmi->dev, "nxp,calib", GPIOD_ASIS); 492 + if (IS_ERR(calib)) { 493 + dev_warn(&priv->hdmi->dev, "failed to get calibration gpio: %ld\n", 494 + PTR_ERR(calib)); 495 + return PTR_ERR(calib); 496 + } 497 + 498 + priv->calib = calib; 499 + 500 + return 0; 501 + } 502 + 503 + static void tda998x_cec_hook_exit(void *data) 504 + { 505 + struct tda998x_priv *priv = data; 506 + 507 + gpiod_put(priv->calib); 508 + priv->calib = NULL; 509 + } 510 + 511 + static int tda998x_cec_hook_open(void *data) 512 + { 513 + struct tda998x_priv *priv = data; 514 + 515 + cec_enamods(priv, CEC_ENAMODS_EN_CEC_CLK | CEC_ENAMODS_EN_CEC, true); 516 + tda998x_cec_calibration(priv); 517 + 518 + return 0; 519 + } 520 + 521 + static void tda998x_cec_hook_release(void *data) 522 + { 523 + struct tda998x_priv *priv = data; 524 + 525 + cec_enamods(priv, CEC_ENAMODS_EN_CEC_CLK | CEC_ENAMODS_EN_CEC, false); 433 526 } 434 527 435 528 static int ··· 780 657 sta, cec, lvl, flag0, flag1, flag2); 781 658 782 659 if (cec & CEC_RXSHPDINT_HPD) { 783 - if (lvl & CEC_RXSHPDLEV_HPD) 660 + if (lvl & CEC_RXSHPDLEV_HPD) { 784 661 tda998x_edid_delay_start(priv); 785 - else 662 + } else { 786 663 schedule_work(&priv->detect_work); 664 + cec_notifier_set_phys_addr(priv->cec_notify, 665 + CEC_PHYS_ADDR_INVALID); 666 + } 787 667 788 668 handled = true; 789 669 } ··· 1107 981 if (connector->edid_blob_ptr) { 1108 982 struct edid *edid = (void *)connector->edid_blob_ptr->data; 1109 983 984 + cec_notifier_set_phys_addr_from_edid(priv->cec_notify, edid); 985 + 1110 986 priv->sink_has_audio = drm_detect_monitor_audio(edid); 1111 987 } else { 1112 988 priv->sink_has_audio = false; ··· 1152 1024 offset = (blk & 1) ? 128 : 0; 1153 1025 segptr = blk / 2; 1154 1026 1027 + mutex_lock(&priv->edid_mutex); 1028 + 1155 1029 reg_write(priv, REG_DDC_ADDR, 0xa0); 1156 1030 reg_write(priv, REG_DDC_OFFS, offset); 1157 1031 reg_write(priv, REG_DDC_SEGM_ADDR, 0x60); ··· 1173 1043 msecs_to_jiffies(100)); 1174 1044 if (i < 0) { 1175 1045 dev_err(&priv->hdmi->dev, "read edid wait err %d\n", i); 1176 - return i; 1046 + ret = i; 1047 + goto failed; 1177 1048 } 1178 1049 } else { 1179 1050 for (i = 100; i > 0; i--) { 1180 1051 msleep(1); 1181 1052 ret = reg_read(priv, REG_INT_FLAGS_2); 1182 1053 if (ret < 0) 1183 - return ret; 1054 + goto failed; 1184 1055 if (ret & INT_FLAGS_2_EDID_BLK_RD) 1185 1056 break; 1186 1057 } ··· 1189 1058 1190 1059 if (i == 0) { 1191 1060 dev_err(&priv->hdmi->dev, "read edid timeout\n"); 1192 - return -ETIMEDOUT; 1061 + ret = -ETIMEDOUT; 1062 + goto failed; 1193 1063 } 1194 1064 1195 1065 ret = reg_read_range(priv, REG_EDID_DATA_0, buf, length); 1196 1066 if (ret != length) { 1197 1067 dev_err(&priv->hdmi->dev, "failed to read edid block %d: %d\n", 1198 1068 blk, ret); 1199 - return ret; 1069 + goto failed; 1200 1070 } 1201 1071 1202 - return 0; 1072 + ret = 0; 1073 + 1074 + failed: 1075 + mutex_unlock(&priv->edid_mutex); 1076 + return ret; 1203 1077 } 1204 1078 1205 1079 static int tda998x_connector_get_modes(struct drm_connector *connector) ··· 1559 1423 cancel_work_sync(&priv->detect_work); 1560 1424 1561 1425 i2c_unregister_device(priv->cec); 1426 + 1427 + if (priv->cec_notify) 1428 + cec_notifier_put(priv->cec_notify); 1562 1429 } 1563 1430 1564 1431 /* I2C driver functions */ ··· 1611 1472 static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv) 1612 1473 { 1613 1474 struct device_node *np = client->dev.of_node; 1475 + struct i2c_board_info cec_info; 1614 1476 u32 video; 1615 1477 int rev_lo, rev_hi, ret; 1616 1478 1617 - mutex_init(&priv->audio_mutex); /* Protect access from audio thread */ 1479 + mutex_init(&priv->mutex); /* protect the page access */ 1480 + mutex_init(&priv->audio_mutex); /* protect access from audio thread */ 1481 + mutex_init(&priv->edid_mutex); 1482 + init_waitqueue_head(&priv->edid_delay_waitq); 1483 + timer_setup(&priv->edid_delay_timer, tda998x_edid_delay_done, 0); 1484 + INIT_WORK(&priv->detect_work, tda998x_detect_work); 1618 1485 1619 1486 priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(2) | VIP_CNTRL_0_SWAP_B(3); 1620 1487 priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(0) | VIP_CNTRL_1_SWAP_D(1); ··· 1630 1485 priv->cec_addr = 0x34 + (client->addr & 0x03); 1631 1486 priv->current_page = 0xff; 1632 1487 priv->hdmi = client; 1633 - priv->cec = i2c_new_dummy(client->adapter, priv->cec_addr); 1634 - if (!priv->cec) 1635 - return -ENODEV; 1636 - 1637 - mutex_init(&priv->mutex); /* protect the page access */ 1638 - init_waitqueue_head(&priv->edid_delay_waitq); 1639 - timer_setup(&priv->edid_delay_timer, tda998x_edid_delay_done, 0); 1640 - INIT_WORK(&priv->detect_work, tda998x_detect_work); 1641 1488 1642 1489 /* wake up the device: */ 1643 1490 cec_write(priv, REG_CEC_ENAMODS, ··· 1639 1502 1640 1503 /* read version: */ 1641 1504 rev_lo = reg_read(priv, REG_VERSION_LSB); 1505 + if (rev_lo < 0) { 1506 + dev_err(&client->dev, "failed to read version: %d\n", rev_lo); 1507 + return rev_lo; 1508 + } 1509 + 1642 1510 rev_hi = reg_read(priv, REG_VERSION_MSB); 1643 - if (rev_lo < 0 || rev_hi < 0) { 1644 - ret = rev_lo < 0 ? rev_lo : rev_hi; 1645 - goto fail; 1511 + if (rev_hi < 0) { 1512 + dev_err(&client->dev, "failed to read version: %d\n", rev_hi); 1513 + return rev_hi; 1646 1514 } 1647 1515 1648 1516 priv->rev = rev_lo | rev_hi << 8; ··· 1671 1529 default: 1672 1530 dev_err(&client->dev, "found unsupported device: %04x\n", 1673 1531 priv->rev); 1674 - goto fail; 1532 + return -ENXIO; 1675 1533 } 1676 1534 1677 1535 /* after reset, enable DDC: */ ··· 1687 1545 cec_write(priv, REG_CEC_FRO_IM_CLK_CTRL, 1688 1546 CEC_FRO_IM_CLK_CTRL_GHOST_DIS | CEC_FRO_IM_CLK_CTRL_IMCLK_SEL); 1689 1547 1548 + /* ensure interrupts are disabled */ 1549 + cec_write(priv, REG_CEC_RXSHPDINTENA, 0); 1550 + 1551 + /* clear pending interrupts */ 1552 + cec_read(priv, REG_CEC_RXSHPDINT); 1553 + reg_read(priv, REG_INT_FLAGS_0); 1554 + reg_read(priv, REG_INT_FLAGS_1); 1555 + reg_read(priv, REG_INT_FLAGS_2); 1556 + 1690 1557 /* initialize the optional IRQ */ 1691 1558 if (client->irq) { 1692 1559 unsigned long irq_flags; ··· 1703 1552 /* init read EDID waitqueue and HDP work */ 1704 1553 init_waitqueue_head(&priv->wq_edid); 1705 1554 1706 - /* clear pending interrupts */ 1707 - reg_read(priv, REG_INT_FLAGS_0); 1708 - reg_read(priv, REG_INT_FLAGS_1); 1709 - reg_read(priv, REG_INT_FLAGS_2); 1710 - 1711 1555 irq_flags = 1712 1556 irqd_get_trigger_type(irq_get_irq_data(client->irq)); 1557 + 1558 + priv->cec_glue.irq_flags = irq_flags; 1559 + 1713 1560 irq_flags |= IRQF_SHARED | IRQF_ONESHOT; 1714 1561 ret = request_threaded_irq(client->irq, NULL, 1715 1562 tda998x_irq_thread, irq_flags, ··· 1716 1567 dev_err(&client->dev, 1717 1568 "failed to request IRQ#%u: %d\n", 1718 1569 client->irq, ret); 1719 - goto fail; 1570 + goto err_irq; 1720 1571 } 1721 1572 1722 1573 /* enable HPD irq */ 1723 1574 cec_write(priv, REG_CEC_RXSHPDINTENA, CEC_RXSHPDLEV_HPD); 1575 + } 1576 + 1577 + priv->cec_notify = cec_notifier_get(&client->dev); 1578 + if (!priv->cec_notify) { 1579 + ret = -ENOMEM; 1580 + goto fail; 1581 + } 1582 + 1583 + priv->cec_glue.parent = &client->dev; 1584 + priv->cec_glue.data = priv; 1585 + priv->cec_glue.init = tda998x_cec_hook_init; 1586 + priv->cec_glue.exit = tda998x_cec_hook_exit; 1587 + priv->cec_glue.open = tda998x_cec_hook_open; 1588 + priv->cec_glue.release = tda998x_cec_hook_release; 1589 + 1590 + /* 1591 + * Some TDA998x are actually two I2C devices merged onto one piece 1592 + * of silicon: TDA9989 and TDA19989 combine the HDMI transmitter 1593 + * with a slightly modified TDA9950 CEC device. The CEC device 1594 + * is at the TDA9950 address, with the address pins strapped across 1595 + * to the TDA998x address pins. Hence, it always has the same 1596 + * offset. 1597 + */ 1598 + memset(&cec_info, 0, sizeof(cec_info)); 1599 + strlcpy(cec_info.type, "tda9950", sizeof(cec_info.type)); 1600 + cec_info.addr = priv->cec_addr; 1601 + cec_info.platform_data = &priv->cec_glue; 1602 + cec_info.irq = client->irq; 1603 + 1604 + priv->cec = i2c_new_device(client->adapter, &cec_info); 1605 + if (!priv->cec) { 1606 + ret = -ENODEV; 1607 + goto fail; 1724 1608 } 1725 1609 1726 1610 /* enable EDID read irq: */ ··· 1778 1596 tda998x_audio_codec_init(priv, &client->dev); 1779 1597 1780 1598 return 0; 1599 + 1781 1600 fail: 1782 1601 /* if encoder_init fails, the encoder slave is never registered, 1783 1602 * so cleanup here: 1784 1603 */ 1785 1604 i2c_unregister_device(priv->cec); 1786 - return -ENXIO; 1605 + if (priv->cec_notify) 1606 + cec_notifier_put(priv->cec_notify); 1607 + if (client->irq) 1608 + free_irq(client->irq, priv); 1609 + err_irq: 1610 + return ret; 1787 1611 } 1788 1612 1789 1613 static void tda998x_encoder_prepare(struct drm_encoder *encoder)
+16
include/linux/platform_data/tda9950.h
··· 1 + #ifndef LINUX_PLATFORM_DATA_TDA9950_H 2 + #define LINUX_PLATFORM_DATA_TDA9950_H 3 + 4 + struct device; 5 + 6 + struct tda9950_glue { 7 + struct device *parent; 8 + unsigned long irq_flags; 9 + void *data; 10 + int (*init)(void *); 11 + void (*exit)(void *); 12 + int (*open)(void *); 13 + void (*release)(void *); 14 + }; 15 + 16 + #endif