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

drm/bridge: synopsys: Add DW HDMI QP TX Controller support library

The Synopsys DesignWare HDMI 2.1 Quad-Pixel (QP) TX Controller IP
supports the following features, among others:

* Fixed Rate Link (FRL)
* Display Stream Compression (DSC)
* 4K@120Hz and 8K@60Hz video modes
* Variable Refresh Rate (VRR) including Quick Media Switching (QMS), aka
Cinema VRR
* Fast Vactive (FVA), aka Quick Frame Transport (QFT)
* SCDC I2C DDC access
* TMDS Scrambler enabling 2160p@60Hz with RGB/YCbCr4:4:4
* YCbCr4:2:0 enabling 2160p@60Hz at lower HDMI link speeds
* Multi-stream audio
* Enhanced Audio Return Channel (EARC)

Add library containing common helpers to enable basic support, i.e. RGB
output up to 4K@30Hz, without audio, CEC or any HDMI 2.1 specific
features.

Co-developed-by: Algea Cao <algea.cao@rock-chips.com>
Signed-off-by: Algea Cao <algea.cao@rock-chips.com>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
Acked-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20241016-b4-rk3588-bridge-upstream-v10-1-87ef92a6d14e@collabora.com
Signed-off-by: Maxime Ripard <mripard@kernel.org>

authored by

Cristian Ciocaltea and committed by
Maxime Ripard
5bd0d8e6 134e71bd

+1523
+8
drivers/gpu/drm/bridge/synopsys/Kconfig
··· 46 46 Support the CE interface which is part of the Synopsys 47 47 Designware HDMI block. 48 48 49 + config DRM_DW_HDMI_QP 50 + tristate 51 + select DRM_DISPLAY_HDMI_HELPER 52 + select DRM_DISPLAY_HDMI_STATE_HELPER 53 + select DRM_DISPLAY_HELPER 54 + select DRM_KMS_HELPER 55 + select REGMAP_MMIO 56 + 49 57 config DRM_DW_MIPI_DSI 50 58 tristate 51 59 select DRM_KMS_HELPER
+2
drivers/gpu/drm/bridge/synopsys/Makefile
··· 5 5 obj-$(CONFIG_DRM_DW_HDMI_I2S_AUDIO) += dw-hdmi-i2s-audio.o 6 6 obj-$(CONFIG_DRM_DW_HDMI_CEC) += dw-hdmi-cec.o 7 7 8 + obj-$(CONFIG_DRM_DW_HDMI_QP) += dw-hdmi-qp.o 9 + 8 10 obj-$(CONFIG_DRM_DW_MIPI_DSI) += dw-mipi-dsi.o
+647
drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + /* 3 + * Copyright (c) 2021-2022 Rockchip Electronics Co., Ltd. 4 + * Copyright (c) 2024 Collabora Ltd. 5 + * 6 + * Author: Algea Cao <algea.cao@rock-chips.com> 7 + * Author: Cristian Ciocaltea <cristian.ciocaltea@collabora.com> 8 + */ 9 + #include <linux/completion.h> 10 + #include <linux/hdmi.h> 11 + #include <linux/i2c.h> 12 + #include <linux/irq.h> 13 + #include <linux/module.h> 14 + #include <linux/mutex.h> 15 + #include <linux/of.h> 16 + #include <linux/workqueue.h> 17 + 18 + #include <drm/bridge/dw_hdmi_qp.h> 19 + #include <drm/display/drm_hdmi_helper.h> 20 + #include <drm/display/drm_hdmi_state_helper.h> 21 + #include <drm/drm_atomic.h> 22 + #include <drm/drm_atomic_helper.h> 23 + #include <drm/drm_bridge.h> 24 + #include <drm/drm_connector.h> 25 + #include <drm/drm_edid.h> 26 + #include <drm/drm_modes.h> 27 + 28 + #include <sound/hdmi-codec.h> 29 + 30 + #include "dw-hdmi-qp.h" 31 + 32 + #define DDC_CI_ADDR 0x37 33 + #define DDC_SEGMENT_ADDR 0x30 34 + 35 + #define HDMI14_MAX_TMDSCLK 340000000 36 + 37 + #define SCRAMB_POLL_DELAY_MS 3000 38 + 39 + struct dw_hdmi_qp_i2c { 40 + struct i2c_adapter adap; 41 + 42 + struct mutex lock; /* used to serialize data transfers */ 43 + struct completion cmp; 44 + u8 stat; 45 + 46 + u8 slave_reg; 47 + bool is_regaddr; 48 + bool is_segment; 49 + }; 50 + 51 + struct dw_hdmi_qp { 52 + struct drm_bridge bridge; 53 + 54 + struct device *dev; 55 + struct dw_hdmi_qp_i2c *i2c; 56 + 57 + struct { 58 + const struct dw_hdmi_qp_phy_ops *ops; 59 + void *data; 60 + } phy; 61 + 62 + struct regmap *regm; 63 + }; 64 + 65 + static void dw_hdmi_qp_write(struct dw_hdmi_qp *hdmi, unsigned int val, 66 + int offset) 67 + { 68 + regmap_write(hdmi->regm, offset, val); 69 + } 70 + 71 + static unsigned int dw_hdmi_qp_read(struct dw_hdmi_qp *hdmi, int offset) 72 + { 73 + unsigned int val = 0; 74 + 75 + regmap_read(hdmi->regm, offset, &val); 76 + 77 + return val; 78 + } 79 + 80 + static void dw_hdmi_qp_mod(struct dw_hdmi_qp *hdmi, unsigned int data, 81 + unsigned int mask, unsigned int reg) 82 + { 83 + regmap_update_bits(hdmi->regm, reg, mask, data); 84 + } 85 + 86 + static int dw_hdmi_qp_i2c_read(struct dw_hdmi_qp *hdmi, 87 + unsigned char *buf, unsigned int length) 88 + { 89 + struct dw_hdmi_qp_i2c *i2c = hdmi->i2c; 90 + int stat; 91 + 92 + if (!i2c->is_regaddr) { 93 + dev_dbg(hdmi->dev, "set read register address to 0\n"); 94 + i2c->slave_reg = 0x00; 95 + i2c->is_regaddr = true; 96 + } 97 + 98 + while (length--) { 99 + reinit_completion(&i2c->cmp); 100 + 101 + dw_hdmi_qp_mod(hdmi, i2c->slave_reg++ << 12, I2CM_ADDR, 102 + I2CM_INTERFACE_CONTROL0); 103 + 104 + if (i2c->is_segment) 105 + dw_hdmi_qp_mod(hdmi, I2CM_EXT_READ, I2CM_WR_MASK, 106 + I2CM_INTERFACE_CONTROL0); 107 + else 108 + dw_hdmi_qp_mod(hdmi, I2CM_FM_READ, I2CM_WR_MASK, 109 + I2CM_INTERFACE_CONTROL0); 110 + 111 + stat = wait_for_completion_timeout(&i2c->cmp, HZ / 10); 112 + if (!stat) { 113 + dev_err(hdmi->dev, "i2c read timed out\n"); 114 + dw_hdmi_qp_write(hdmi, 0x01, I2CM_CONTROL0); 115 + return -EAGAIN; 116 + } 117 + 118 + /* Check for error condition on the bus */ 119 + if (i2c->stat & I2CM_NACK_RCVD_IRQ) { 120 + dev_err(hdmi->dev, "i2c read error\n"); 121 + dw_hdmi_qp_write(hdmi, 0x01, I2CM_CONTROL0); 122 + return -EIO; 123 + } 124 + 125 + *buf++ = dw_hdmi_qp_read(hdmi, I2CM_INTERFACE_RDDATA_0_3) & 0xff; 126 + dw_hdmi_qp_mod(hdmi, 0, I2CM_WR_MASK, I2CM_INTERFACE_CONTROL0); 127 + } 128 + 129 + i2c->is_segment = false; 130 + 131 + return 0; 132 + } 133 + 134 + static int dw_hdmi_qp_i2c_write(struct dw_hdmi_qp *hdmi, 135 + unsigned char *buf, unsigned int length) 136 + { 137 + struct dw_hdmi_qp_i2c *i2c = hdmi->i2c; 138 + int stat; 139 + 140 + if (!i2c->is_regaddr) { 141 + /* Use the first write byte as register address */ 142 + i2c->slave_reg = buf[0]; 143 + length--; 144 + buf++; 145 + i2c->is_regaddr = true; 146 + } 147 + 148 + while (length--) { 149 + reinit_completion(&i2c->cmp); 150 + 151 + dw_hdmi_qp_write(hdmi, *buf++, I2CM_INTERFACE_WRDATA_0_3); 152 + dw_hdmi_qp_mod(hdmi, i2c->slave_reg++ << 12, I2CM_ADDR, 153 + I2CM_INTERFACE_CONTROL0); 154 + dw_hdmi_qp_mod(hdmi, I2CM_FM_WRITE, I2CM_WR_MASK, 155 + I2CM_INTERFACE_CONTROL0); 156 + 157 + stat = wait_for_completion_timeout(&i2c->cmp, HZ / 10); 158 + if (!stat) { 159 + dev_err(hdmi->dev, "i2c write time out!\n"); 160 + dw_hdmi_qp_write(hdmi, 0x01, I2CM_CONTROL0); 161 + return -EAGAIN; 162 + } 163 + 164 + /* Check for error condition on the bus */ 165 + if (i2c->stat & I2CM_NACK_RCVD_IRQ) { 166 + dev_err(hdmi->dev, "i2c write nack!\n"); 167 + dw_hdmi_qp_write(hdmi, 0x01, I2CM_CONTROL0); 168 + return -EIO; 169 + } 170 + 171 + dw_hdmi_qp_mod(hdmi, 0, I2CM_WR_MASK, I2CM_INTERFACE_CONTROL0); 172 + } 173 + 174 + return 0; 175 + } 176 + 177 + static int dw_hdmi_qp_i2c_xfer(struct i2c_adapter *adap, 178 + struct i2c_msg *msgs, int num) 179 + { 180 + struct dw_hdmi_qp *hdmi = i2c_get_adapdata(adap); 181 + struct dw_hdmi_qp_i2c *i2c = hdmi->i2c; 182 + u8 addr = msgs[0].addr; 183 + int i, ret = 0; 184 + 185 + if (addr == DDC_CI_ADDR) 186 + /* 187 + * The internal I2C controller does not support the multi-byte 188 + * read and write operations needed for DDC/CI. 189 + * FIXME: Blacklist the DDC/CI address until we filter out 190 + * unsupported I2C operations. 191 + */ 192 + return -EOPNOTSUPP; 193 + 194 + for (i = 0; i < num; i++) { 195 + if (msgs[i].len == 0) { 196 + dev_err(hdmi->dev, 197 + "unsupported transfer %d/%d, no data\n", 198 + i + 1, num); 199 + return -EOPNOTSUPP; 200 + } 201 + } 202 + 203 + guard(mutex)(&i2c->lock); 204 + 205 + /* Unmute DONE and ERROR interrupts */ 206 + dw_hdmi_qp_mod(hdmi, I2CM_NACK_RCVD_MASK_N | I2CM_OP_DONE_MASK_N, 207 + I2CM_NACK_RCVD_MASK_N | I2CM_OP_DONE_MASK_N, 208 + MAINUNIT_1_INT_MASK_N); 209 + 210 + /* Set slave device address taken from the first I2C message */ 211 + if (addr == DDC_SEGMENT_ADDR && msgs[0].len == 1) 212 + addr = DDC_ADDR; 213 + 214 + dw_hdmi_qp_mod(hdmi, addr << 5, I2CM_SLVADDR, I2CM_INTERFACE_CONTROL0); 215 + 216 + /* Set slave device register address on transfer */ 217 + i2c->is_regaddr = false; 218 + 219 + /* Set segment pointer for I2C extended read mode operation */ 220 + i2c->is_segment = false; 221 + 222 + for (i = 0; i < num; i++) { 223 + if (msgs[i].addr == DDC_SEGMENT_ADDR && msgs[i].len == 1) { 224 + i2c->is_segment = true; 225 + dw_hdmi_qp_mod(hdmi, DDC_SEGMENT_ADDR, I2CM_SEG_ADDR, 226 + I2CM_INTERFACE_CONTROL1); 227 + dw_hdmi_qp_mod(hdmi, *msgs[i].buf << 7, I2CM_SEG_PTR, 228 + I2CM_INTERFACE_CONTROL1); 229 + } else { 230 + if (msgs[i].flags & I2C_M_RD) 231 + ret = dw_hdmi_qp_i2c_read(hdmi, msgs[i].buf, 232 + msgs[i].len); 233 + else 234 + ret = dw_hdmi_qp_i2c_write(hdmi, msgs[i].buf, 235 + msgs[i].len); 236 + } 237 + if (ret < 0) 238 + break; 239 + } 240 + 241 + if (!ret) 242 + ret = num; 243 + 244 + /* Mute DONE and ERROR interrupts */ 245 + dw_hdmi_qp_mod(hdmi, 0, I2CM_OP_DONE_MASK_N | I2CM_NACK_RCVD_MASK_N, 246 + MAINUNIT_1_INT_MASK_N); 247 + 248 + return ret; 249 + } 250 + 251 + static u32 dw_hdmi_qp_i2c_func(struct i2c_adapter *adapter) 252 + { 253 + return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; 254 + } 255 + 256 + static const struct i2c_algorithm dw_hdmi_qp_algorithm = { 257 + .master_xfer = dw_hdmi_qp_i2c_xfer, 258 + .functionality = dw_hdmi_qp_i2c_func, 259 + }; 260 + 261 + static struct i2c_adapter *dw_hdmi_qp_i2c_adapter(struct dw_hdmi_qp *hdmi) 262 + { 263 + struct dw_hdmi_qp_i2c *i2c; 264 + struct i2c_adapter *adap; 265 + int ret; 266 + 267 + i2c = devm_kzalloc(hdmi->dev, sizeof(*i2c), GFP_KERNEL); 268 + if (!i2c) 269 + return ERR_PTR(-ENOMEM); 270 + 271 + mutex_init(&i2c->lock); 272 + init_completion(&i2c->cmp); 273 + 274 + adap = &i2c->adap; 275 + adap->owner = THIS_MODULE; 276 + adap->dev.parent = hdmi->dev; 277 + adap->algo = &dw_hdmi_qp_algorithm; 278 + strscpy(adap->name, "DesignWare HDMI QP", sizeof(adap->name)); 279 + 280 + i2c_set_adapdata(adap, hdmi); 281 + 282 + ret = devm_i2c_add_adapter(hdmi->dev, adap); 283 + if (ret) { 284 + dev_warn(hdmi->dev, "cannot add %s I2C adapter\n", adap->name); 285 + devm_kfree(hdmi->dev, i2c); 286 + return ERR_PTR(ret); 287 + } 288 + 289 + hdmi->i2c = i2c; 290 + dev_info(hdmi->dev, "registered %s I2C bus driver\n", adap->name); 291 + 292 + return adap; 293 + } 294 + 295 + static int dw_hdmi_qp_config_avi_infoframe(struct dw_hdmi_qp *hdmi, 296 + const u8 *buffer, size_t len) 297 + { 298 + u32 val, i, j; 299 + 300 + if (len != HDMI_INFOFRAME_SIZE(AVI)) { 301 + dev_err(hdmi->dev, "failed to configure avi infoframe\n"); 302 + return -EINVAL; 303 + } 304 + 305 + /* 306 + * DW HDMI QP IP uses a different byte format from standard AVI info 307 + * frames, though generally the bits are in the correct bytes. 308 + */ 309 + val = buffer[1] << 8 | buffer[2] << 16; 310 + dw_hdmi_qp_write(hdmi, val, PKT_AVI_CONTENTS0); 311 + 312 + for (i = 0; i < 4; i++) { 313 + for (j = 0; j < 4; j++) { 314 + if (i * 4 + j >= 14) 315 + break; 316 + if (!j) 317 + val = buffer[i * 4 + j + 3]; 318 + val |= buffer[i * 4 + j + 3] << (8 * j); 319 + } 320 + 321 + dw_hdmi_qp_write(hdmi, val, PKT_AVI_CONTENTS1 + i * 4); 322 + } 323 + 324 + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_AVI_FIELDRATE, PKTSCHED_PKT_CONFIG1); 325 + 326 + dw_hdmi_qp_mod(hdmi, PKTSCHED_AVI_TX_EN | PKTSCHED_GCP_TX_EN, 327 + PKTSCHED_AVI_TX_EN | PKTSCHED_GCP_TX_EN, PKTSCHED_PKT_EN); 328 + 329 + return 0; 330 + } 331 + 332 + static int dw_hdmi_qp_config_drm_infoframe(struct dw_hdmi_qp *hdmi, 333 + const u8 *buffer, size_t len) 334 + { 335 + u32 val, i; 336 + 337 + if (len != HDMI_INFOFRAME_SIZE(DRM)) { 338 + dev_err(hdmi->dev, "failed to configure drm infoframe\n"); 339 + return -EINVAL; 340 + } 341 + 342 + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_DRMI_TX_EN, PKTSCHED_PKT_EN); 343 + 344 + val = buffer[1] << 8 | buffer[2] << 16; 345 + dw_hdmi_qp_write(hdmi, val, PKT_DRMI_CONTENTS0); 346 + 347 + for (i = 0; i <= buffer[2]; i++) { 348 + if (i % 4 == 0) 349 + val = buffer[3 + i]; 350 + val |= buffer[3 + i] << ((i % 4) * 8); 351 + 352 + if ((i % 4 == 3) || i == buffer[2]) 353 + dw_hdmi_qp_write(hdmi, val, 354 + PKT_DRMI_CONTENTS1 + ((i / 4) * 4)); 355 + } 356 + 357 + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_DRMI_FIELDRATE, PKTSCHED_PKT_CONFIG1); 358 + dw_hdmi_qp_mod(hdmi, PKTSCHED_DRMI_TX_EN, PKTSCHED_DRMI_TX_EN, 359 + PKTSCHED_PKT_EN); 360 + 361 + return 0; 362 + } 363 + 364 + static int dw_hdmi_qp_bridge_atomic_check(struct drm_bridge *bridge, 365 + struct drm_bridge_state *bridge_state, 366 + struct drm_crtc_state *crtc_state, 367 + struct drm_connector_state *conn_state) 368 + { 369 + struct dw_hdmi_qp *hdmi = bridge->driver_private; 370 + int ret; 371 + 372 + ret = drm_atomic_helper_connector_hdmi_check(conn_state->connector, 373 + conn_state->state); 374 + if (ret) 375 + dev_dbg(hdmi->dev, "%s failed: %d\n", __func__, ret); 376 + 377 + return ret; 378 + } 379 + 380 + static void dw_hdmi_qp_bridge_atomic_enable(struct drm_bridge *bridge, 381 + struct drm_bridge_state *old_state) 382 + { 383 + struct dw_hdmi_qp *hdmi = bridge->driver_private; 384 + struct drm_atomic_state *state = old_state->base.state; 385 + struct drm_connector_state *conn_state; 386 + struct drm_connector *connector; 387 + unsigned int op_mode; 388 + 389 + connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder); 390 + if (WARN_ON(!connector)) 391 + return; 392 + 393 + conn_state = drm_atomic_get_new_connector_state(state, connector); 394 + if (WARN_ON(!conn_state)) 395 + return; 396 + 397 + if (connector->display_info.is_hdmi) { 398 + dev_dbg(hdmi->dev, "%s mode=HDMI rate=%llu\n", 399 + __func__, conn_state->hdmi.tmds_char_rate); 400 + op_mode = 0; 401 + } else { 402 + dev_dbg(hdmi->dev, "%s mode=DVI\n", __func__); 403 + op_mode = OPMODE_DVI; 404 + } 405 + 406 + hdmi->phy.ops->init(hdmi, hdmi->phy.data); 407 + 408 + dw_hdmi_qp_mod(hdmi, HDCP2_BYPASS, HDCP2_BYPASS, HDCP2LOGIC_CONFIG0); 409 + dw_hdmi_qp_mod(hdmi, op_mode, OPMODE_DVI, LINK_CONFIG0); 410 + 411 + drm_atomic_helper_connector_hdmi_update_infoframes(connector, state); 412 + } 413 + 414 + static void dw_hdmi_qp_bridge_atomic_disable(struct drm_bridge *bridge, 415 + struct drm_bridge_state *old_state) 416 + { 417 + struct dw_hdmi_qp *hdmi = bridge->driver_private; 418 + 419 + hdmi->phy.ops->disable(hdmi, hdmi->phy.data); 420 + } 421 + 422 + static enum drm_connector_status 423 + dw_hdmi_qp_bridge_detect(struct drm_bridge *bridge) 424 + { 425 + struct dw_hdmi_qp *hdmi = bridge->driver_private; 426 + 427 + return hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data); 428 + } 429 + 430 + static const struct drm_edid * 431 + dw_hdmi_qp_bridge_edid_read(struct drm_bridge *bridge, 432 + struct drm_connector *connector) 433 + { 434 + struct dw_hdmi_qp *hdmi = bridge->driver_private; 435 + const struct drm_edid *drm_edid; 436 + 437 + drm_edid = drm_edid_read_ddc(connector, bridge->ddc); 438 + if (!drm_edid) 439 + dev_dbg(hdmi->dev, "failed to get edid\n"); 440 + 441 + return drm_edid; 442 + } 443 + 444 + static enum drm_mode_status 445 + dw_hdmi_qp_bridge_mode_valid(struct drm_bridge *bridge, 446 + const struct drm_display_info *info, 447 + const struct drm_display_mode *mode) 448 + { 449 + struct dw_hdmi_qp *hdmi = bridge->driver_private; 450 + unsigned long long rate; 451 + 452 + rate = drm_hdmi_compute_mode_clock(mode, 8, HDMI_COLORSPACE_RGB); 453 + if (rate > HDMI14_MAX_TMDSCLK) { 454 + dev_dbg(hdmi->dev, "Unsupported mode clock: %d\n", mode->clock); 455 + return MODE_CLOCK_HIGH; 456 + } 457 + 458 + return MODE_OK; 459 + } 460 + 461 + static int dw_hdmi_qp_bridge_clear_infoframe(struct drm_bridge *bridge, 462 + enum hdmi_infoframe_type type) 463 + { 464 + struct dw_hdmi_qp *hdmi = bridge->driver_private; 465 + 466 + switch (type) { 467 + case HDMI_INFOFRAME_TYPE_AVI: 468 + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_AVI_TX_EN | PKTSCHED_GCP_TX_EN, 469 + PKTSCHED_PKT_EN); 470 + break; 471 + 472 + case HDMI_INFOFRAME_TYPE_DRM: 473 + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_DRMI_TX_EN, PKTSCHED_PKT_EN); 474 + break; 475 + 476 + default: 477 + dev_dbg(hdmi->dev, "Unsupported infoframe type %x\n", type); 478 + } 479 + 480 + return 0; 481 + } 482 + 483 + static int dw_hdmi_qp_bridge_write_infoframe(struct drm_bridge *bridge, 484 + enum hdmi_infoframe_type type, 485 + const u8 *buffer, size_t len) 486 + { 487 + struct dw_hdmi_qp *hdmi = bridge->driver_private; 488 + 489 + dw_hdmi_qp_bridge_clear_infoframe(bridge, type); 490 + 491 + switch (type) { 492 + case HDMI_INFOFRAME_TYPE_AVI: 493 + return dw_hdmi_qp_config_avi_infoframe(hdmi, buffer, len); 494 + 495 + case HDMI_INFOFRAME_TYPE_DRM: 496 + return dw_hdmi_qp_config_drm_infoframe(hdmi, buffer, len); 497 + 498 + default: 499 + dev_dbg(hdmi->dev, "Unsupported infoframe type %x\n", type); 500 + return 0; 501 + } 502 + } 503 + 504 + static const struct drm_bridge_funcs dw_hdmi_qp_bridge_funcs = { 505 + .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, 506 + .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, 507 + .atomic_reset = drm_atomic_helper_bridge_reset, 508 + .atomic_check = dw_hdmi_qp_bridge_atomic_check, 509 + .atomic_enable = dw_hdmi_qp_bridge_atomic_enable, 510 + .atomic_disable = dw_hdmi_qp_bridge_atomic_disable, 511 + .detect = dw_hdmi_qp_bridge_detect, 512 + .edid_read = dw_hdmi_qp_bridge_edid_read, 513 + .mode_valid = dw_hdmi_qp_bridge_mode_valid, 514 + .hdmi_clear_infoframe = dw_hdmi_qp_bridge_clear_infoframe, 515 + .hdmi_write_infoframe = dw_hdmi_qp_bridge_write_infoframe, 516 + }; 517 + 518 + static irqreturn_t dw_hdmi_qp_main_hardirq(int irq, void *dev_id) 519 + { 520 + struct dw_hdmi_qp *hdmi = dev_id; 521 + struct dw_hdmi_qp_i2c *i2c = hdmi->i2c; 522 + u32 stat; 523 + 524 + stat = dw_hdmi_qp_read(hdmi, MAINUNIT_1_INT_STATUS); 525 + 526 + i2c->stat = stat & (I2CM_OP_DONE_IRQ | I2CM_READ_REQUEST_IRQ | 527 + I2CM_NACK_RCVD_IRQ); 528 + 529 + if (i2c->stat) { 530 + dw_hdmi_qp_write(hdmi, i2c->stat, MAINUNIT_1_INT_CLEAR); 531 + complete(&i2c->cmp); 532 + } 533 + 534 + if (stat) 535 + return IRQ_HANDLED; 536 + 537 + return IRQ_NONE; 538 + } 539 + 540 + static const struct regmap_config dw_hdmi_qp_regmap_config = { 541 + .reg_bits = 32, 542 + .val_bits = 32, 543 + .reg_stride = 4, 544 + .max_register = EARCRX_1_INT_FORCE, 545 + }; 546 + 547 + static void dw_hdmi_qp_init_hw(struct dw_hdmi_qp *hdmi) 548 + { 549 + dw_hdmi_qp_write(hdmi, 0, MAINUNIT_0_INT_MASK_N); 550 + dw_hdmi_qp_write(hdmi, 0, MAINUNIT_1_INT_MASK_N); 551 + dw_hdmi_qp_write(hdmi, 428571429, TIMER_BASE_CONFIG0); 552 + 553 + /* Software reset */ 554 + dw_hdmi_qp_write(hdmi, 0x01, I2CM_CONTROL0); 555 + 556 + dw_hdmi_qp_write(hdmi, 0x085c085c, I2CM_FM_SCL_CONFIG0); 557 + 558 + dw_hdmi_qp_mod(hdmi, 0, I2CM_FM_EN, I2CM_INTERFACE_CONTROL0); 559 + 560 + /* Clear DONE and ERROR interrupts */ 561 + dw_hdmi_qp_write(hdmi, I2CM_OP_DONE_CLEAR | I2CM_NACK_RCVD_CLEAR, 562 + MAINUNIT_1_INT_CLEAR); 563 + 564 + if (hdmi->phy.ops->setup_hpd) 565 + hdmi->phy.ops->setup_hpd(hdmi, hdmi->phy.data); 566 + } 567 + 568 + struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev, 569 + struct drm_encoder *encoder, 570 + const struct dw_hdmi_qp_plat_data *plat_data) 571 + { 572 + struct device *dev = &pdev->dev; 573 + struct dw_hdmi_qp *hdmi; 574 + void __iomem *regs; 575 + int ret; 576 + 577 + if (!plat_data->phy_ops || !plat_data->phy_ops->init || 578 + !plat_data->phy_ops->disable || !plat_data->phy_ops->read_hpd) { 579 + dev_err(dev, "Missing platform PHY ops\n"); 580 + return ERR_PTR(-ENODEV); 581 + } 582 + 583 + hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL); 584 + if (!hdmi) 585 + return ERR_PTR(-ENOMEM); 586 + 587 + hdmi->dev = dev; 588 + 589 + regs = devm_platform_ioremap_resource(pdev, 0); 590 + if (IS_ERR(regs)) 591 + return ERR_CAST(regs); 592 + 593 + hdmi->regm = devm_regmap_init_mmio(dev, regs, &dw_hdmi_qp_regmap_config); 594 + if (IS_ERR(hdmi->regm)) { 595 + dev_err(dev, "Failed to configure regmap\n"); 596 + return ERR_CAST(hdmi->regm); 597 + } 598 + 599 + hdmi->phy.ops = plat_data->phy_ops; 600 + hdmi->phy.data = plat_data->phy_data; 601 + 602 + dw_hdmi_qp_init_hw(hdmi); 603 + 604 + ret = devm_request_threaded_irq(dev, plat_data->main_irq, 605 + dw_hdmi_qp_main_hardirq, NULL, 606 + IRQF_SHARED, dev_name(dev), hdmi); 607 + if (ret) 608 + return ERR_PTR(ret); 609 + 610 + hdmi->bridge.driver_private = hdmi; 611 + hdmi->bridge.funcs = &dw_hdmi_qp_bridge_funcs; 612 + hdmi->bridge.ops = DRM_BRIDGE_OP_DETECT | 613 + DRM_BRIDGE_OP_EDID | 614 + DRM_BRIDGE_OP_HDMI | 615 + DRM_BRIDGE_OP_HPD; 616 + hdmi->bridge.of_node = pdev->dev.of_node; 617 + hdmi->bridge.type = DRM_MODE_CONNECTOR_HDMIA; 618 + hdmi->bridge.vendor = "Synopsys"; 619 + hdmi->bridge.product = "DW HDMI QP TX"; 620 + 621 + hdmi->bridge.ddc = dw_hdmi_qp_i2c_adapter(hdmi); 622 + if (IS_ERR(hdmi->bridge.ddc)) 623 + return ERR_CAST(hdmi->bridge.ddc); 624 + 625 + ret = devm_drm_bridge_add(dev, &hdmi->bridge); 626 + if (ret) 627 + return ERR_PTR(ret); 628 + 629 + ret = drm_bridge_attach(encoder, &hdmi->bridge, NULL, 630 + DRM_BRIDGE_ATTACH_NO_CONNECTOR); 631 + if (ret) 632 + return ERR_PTR(ret); 633 + 634 + return hdmi; 635 + } 636 + EXPORT_SYMBOL_GPL(dw_hdmi_qp_bind); 637 + 638 + void dw_hdmi_qp_resume(struct device *dev, struct dw_hdmi_qp *hdmi) 639 + { 640 + dw_hdmi_qp_init_hw(hdmi); 641 + } 642 + EXPORT_SYMBOL_GPL(dw_hdmi_qp_resume); 643 + 644 + MODULE_AUTHOR("Algea Cao <algea.cao@rock-chips.com>"); 645 + MODULE_AUTHOR("Cristian Ciocaltea <cristian.ciocaltea@collabora.com>"); 646 + MODULE_DESCRIPTION("DW HDMI QP transmitter library"); 647 + MODULE_LICENSE("GPL");
+834
drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) Rockchip Electronics Co.Ltd 4 + * Author: 5 + * Algea Cao <algea.cao@rock-chips.com> 6 + */ 7 + #ifndef __DW_HDMI_QP_H__ 8 + #define __DW_HDMI_QP_H__ 9 + 10 + #include <linux/bits.h> 11 + 12 + /* Main Unit Registers */ 13 + #define CORE_ID 0x0 14 + #define VER_NUMBER 0x4 15 + #define VER_TYPE 0x8 16 + #define CONFIG_REG 0xc 17 + #define CONFIG_CEC BIT(28) 18 + #define CONFIG_AUD_UD BIT(23) 19 + #define CORE_TIMESTAMP_HHMM 0x14 20 + #define CORE_TIMESTAMP_MMDD 0x18 21 + #define CORE_TIMESTAMP_YYYY 0x1c 22 + /* Reset Manager Registers */ 23 + #define GLOBAL_SWRESET_REQUEST 0x40 24 + #define EARCRX_CMDC_SWINIT_P BIT(27) 25 + #define AVP_DATAPATH_PACKET_AUDIO_SWINIT_P BIT(10) 26 + #define GLOBAL_SWDISABLE 0x44 27 + #define CEC_SWDISABLE BIT(17) 28 + #define AVP_DATAPATH_PACKET_AUDIO_SWDISABLE BIT(10) 29 + #define AVP_DATAPATH_VIDEO_SWDISABLE BIT(6) 30 + #define RESET_MANAGER_CONFIG0 0x48 31 + #define RESET_MANAGER_STATUS0 0x50 32 + #define RESET_MANAGER_STATUS1 0x54 33 + #define RESET_MANAGER_STATUS2 0x58 34 + /* Timer Base Registers */ 35 + #define TIMER_BASE_CONFIG0 0x80 36 + #define TIMER_BASE_STATUS0 0x84 37 + /* CMU Registers */ 38 + #define CMU_CONFIG0 0xa0 39 + #define CMU_CONFIG1 0xa4 40 + #define CMU_CONFIG2 0xa8 41 + #define CMU_CONFIG3 0xac 42 + #define CMU_STATUS 0xb0 43 + #define DISPLAY_CLK_MONITOR 0x3f 44 + #define DISPLAY_CLK_LOCKED 0X15 45 + #define EARC_BPCLK_OFF BIT(9) 46 + #define AUDCLK_OFF BIT(7) 47 + #define LINKQPCLK_OFF BIT(5) 48 + #define VIDQPCLK_OFF BIT(3) 49 + #define IPI_CLK_OFF BIT(1) 50 + #define CMU_IPI_CLK_FREQ 0xb4 51 + #define CMU_VIDQPCLK_FREQ 0xb8 52 + #define CMU_LINKQPCLK_FREQ 0xbc 53 + #define CMU_AUDQPCLK_FREQ 0xc0 54 + #define CMU_EARC_BPCLK_FREQ 0xc4 55 + /* I2CM Registers */ 56 + #define I2CM_SM_SCL_CONFIG0 0xe0 57 + #define I2CM_FM_SCL_CONFIG0 0xe4 58 + #define I2CM_CONFIG0 0xe8 59 + #define I2CM_CONTROL0 0xec 60 + #define I2CM_STATUS0 0xf0 61 + #define I2CM_INTERFACE_CONTROL0 0xf4 62 + #define I2CM_ADDR 0xff000 63 + #define I2CM_SLVADDR 0xfe0 64 + #define I2CM_WR_MASK 0x1e 65 + #define I2CM_EXT_READ BIT(4) 66 + #define I2CM_SHORT_READ BIT(3) 67 + #define I2CM_FM_READ BIT(2) 68 + #define I2CM_FM_WRITE BIT(1) 69 + #define I2CM_FM_EN BIT(0) 70 + #define I2CM_INTERFACE_CONTROL1 0xf8 71 + #define I2CM_SEG_PTR 0x7f80 72 + #define I2CM_SEG_ADDR 0x7f 73 + #define I2CM_INTERFACE_WRDATA_0_3 0xfc 74 + #define I2CM_INTERFACE_WRDATA_4_7 0x100 75 + #define I2CM_INTERFACE_WRDATA_8_11 0x104 76 + #define I2CM_INTERFACE_WRDATA_12_15 0x108 77 + #define I2CM_INTERFACE_RDDATA_0_3 0x10c 78 + #define I2CM_INTERFACE_RDDATA_4_7 0x110 79 + #define I2CM_INTERFACE_RDDATA_8_11 0x114 80 + #define I2CM_INTERFACE_RDDATA_12_15 0x118 81 + /* SCDC Registers */ 82 + #define SCDC_CONFIG0 0x140 83 + #define SCDC_I2C_FM_EN BIT(12) 84 + #define SCDC_UPD_FLAGS_AUTO_CLR BIT(6) 85 + #define SCDC_UPD_FLAGS_POLL_EN BIT(4) 86 + #define SCDC_CONTROL0 0x148 87 + #define SCDC_STATUS0 0x150 88 + #define STATUS_UPDATE BIT(0) 89 + #define FRL_START BIT(4) 90 + #define FLT_UPDATE BIT(5) 91 + /* FLT Registers */ 92 + #define FLT_CONFIG0 0x160 93 + #define FLT_CONFIG1 0x164 94 + #define FLT_CONFIG2 0x168 95 + #define FLT_CONTROL0 0x170 96 + /* Main Unit 2 Registers */ 97 + #define MAINUNIT_STATUS0 0x180 98 + /* Video Interface Registers */ 99 + #define VIDEO_INTERFACE_CONFIG0 0x800 100 + #define VIDEO_INTERFACE_CONFIG1 0x804 101 + #define VIDEO_INTERFACE_CONFIG2 0x808 102 + #define VIDEO_INTERFACE_CONTROL0 0x80c 103 + #define VIDEO_INTERFACE_STATUS0 0x814 104 + /* Video Packing Registers */ 105 + #define VIDEO_PACKING_CONFIG0 0x81c 106 + /* Audio Interface Registers */ 107 + #define AUDIO_INTERFACE_CONFIG0 0x820 108 + #define AUD_IF_SEL_MSK 0x3 109 + #define AUD_IF_SPDIF 0x2 110 + #define AUD_IF_I2S 0x1 111 + #define AUD_IF_PAI 0x0 112 + #define AUD_FIFO_INIT_ON_OVF_MSK BIT(2) 113 + #define AUD_FIFO_INIT_ON_OVF_EN BIT(2) 114 + #define I2S_LINES_EN_MSK GENMASK(7, 4) 115 + #define I2S_LINES_EN(x) BIT((x) + 4) 116 + #define I2S_BPCUV_RCV_MSK BIT(12) 117 + #define I2S_BPCUV_RCV_EN BIT(12) 118 + #define I2S_BPCUV_RCV_DIS 0 119 + #define SPDIF_LINES_EN GENMASK(19, 16) 120 + #define AUD_FORMAT_MSK GENMASK(26, 24) 121 + #define AUD_3DOBA (0x7 << 24) 122 + #define AUD_3DASP (0x6 << 24) 123 + #define AUD_MSOBA (0x5 << 24) 124 + #define AUD_MSASP (0x4 << 24) 125 + #define AUD_HBR (0x3 << 24) 126 + #define AUD_DST (0x2 << 24) 127 + #define AUD_OBA (0x1 << 24) 128 + #define AUD_ASP (0x0 << 24) 129 + #define AUDIO_INTERFACE_CONFIG1 0x824 130 + #define AUDIO_INTERFACE_CONTROL0 0x82c 131 + #define AUDIO_FIFO_CLR_P BIT(0) 132 + #define AUDIO_INTERFACE_STATUS0 0x834 133 + /* Frame Composer Registers */ 134 + #define FRAME_COMPOSER_CONFIG0 0x840 135 + #define FRAME_COMPOSER_CONFIG1 0x844 136 + #define FRAME_COMPOSER_CONFIG2 0x848 137 + #define FRAME_COMPOSER_CONFIG3 0x84c 138 + #define FRAME_COMPOSER_CONFIG4 0x850 139 + #define FRAME_COMPOSER_CONFIG5 0x854 140 + #define FRAME_COMPOSER_CONFIG6 0x858 141 + #define FRAME_COMPOSER_CONFIG7 0x85c 142 + #define FRAME_COMPOSER_CONFIG8 0x860 143 + #define FRAME_COMPOSER_CONFIG9 0x864 144 + #define FRAME_COMPOSER_CONTROL0 0x86c 145 + /* Video Monitor Registers */ 146 + #define VIDEO_MONITOR_CONFIG0 0x880 147 + #define VIDEO_MONITOR_STATUS0 0x884 148 + #define VIDEO_MONITOR_STATUS1 0x888 149 + #define VIDEO_MONITOR_STATUS2 0x88c 150 + #define VIDEO_MONITOR_STATUS3 0x890 151 + #define VIDEO_MONITOR_STATUS4 0x894 152 + #define VIDEO_MONITOR_STATUS5 0x898 153 + #define VIDEO_MONITOR_STATUS6 0x89c 154 + /* HDCP2 Logic Registers */ 155 + #define HDCP2LOGIC_CONFIG0 0x8e0 156 + #define HDCP2_BYPASS BIT(0) 157 + #define HDCP2LOGIC_ESM_GPIO_IN 0x8e4 158 + #define HDCP2LOGIC_ESM_GPIO_OUT 0x8e8 159 + /* HDCP14 Registers */ 160 + #define HDCP14_CONFIG0 0x900 161 + #define HDCP14_CONFIG1 0x904 162 + #define HDCP14_CONFIG2 0x908 163 + #define HDCP14_CONFIG3 0x90c 164 + #define HDCP14_KEY_SEED 0x914 165 + #define HDCP14_KEY_H 0x918 166 + #define HDCP14_KEY_L 0x91c 167 + #define HDCP14_KEY_STATUS 0x920 168 + #define HDCP14_AKSV_H 0x924 169 + #define HDCP14_AKSV_L 0x928 170 + #define HDCP14_AN_H 0x92c 171 + #define HDCP14_AN_L 0x930 172 + #define HDCP14_STATUS0 0x934 173 + #define HDCP14_STATUS1 0x938 174 + /* Scrambler Registers */ 175 + #define SCRAMB_CONFIG0 0x960 176 + /* Video Configuration Registers */ 177 + #define LINK_CONFIG0 0x968 178 + #define OPMODE_FRL_4LANES BIT(8) 179 + #define OPMODE_DVI BIT(4) 180 + #define OPMODE_FRL BIT(0) 181 + /* TMDS FIFO Registers */ 182 + #define TMDS_FIFO_CONFIG0 0x970 183 + #define TMDS_FIFO_CONTROL0 0x974 184 + /* FRL RSFEC Registers */ 185 + #define FRL_RSFEC_CONFIG0 0xa20 186 + #define FRL_RSFEC_STATUS0 0xa30 187 + /* FRL Packetizer Registers */ 188 + #define FRL_PKTZ_CONFIG0 0xa40 189 + #define FRL_PKTZ_CONTROL0 0xa44 190 + #define FRL_PKTZ_CONTROL1 0xa50 191 + #define FRL_PKTZ_STATUS1 0xa54 192 + /* Packet Scheduler Registers */ 193 + #define PKTSCHED_CONFIG0 0xa80 194 + #define PKTSCHED_PRQUEUE0_CONFIG0 0xa84 195 + #define PKTSCHED_PRQUEUE1_CONFIG0 0xa88 196 + #define PKTSCHED_PRQUEUE2_CONFIG0 0xa8c 197 + #define PKTSCHED_PRQUEUE2_CONFIG1 0xa90 198 + #define PKTSCHED_PRQUEUE2_CONFIG2 0xa94 199 + #define PKTSCHED_PKT_CONFIG0 0xa98 200 + #define PKTSCHED_PKT_CONFIG1 0xa9c 201 + #define PKTSCHED_DRMI_FIELDRATE BIT(13) 202 + #define PKTSCHED_AVI_FIELDRATE BIT(12) 203 + #define PKTSCHED_PKT_CONFIG2 0xaa0 204 + #define PKTSCHED_PKT_CONFIG3 0xaa4 205 + #define PKTSCHED_PKT_EN 0xaa8 206 + #define PKTSCHED_DRMI_TX_EN BIT(17) 207 + #define PKTSCHED_AUDI_TX_EN BIT(15) 208 + #define PKTSCHED_AVI_TX_EN BIT(13) 209 + #define PKTSCHED_EMP_CVTEM_TX_EN BIT(10) 210 + #define PKTSCHED_AMD_TX_EN BIT(8) 211 + #define PKTSCHED_GCP_TX_EN BIT(3) 212 + #define PKTSCHED_AUDS_TX_EN BIT(2) 213 + #define PKTSCHED_ACR_TX_EN BIT(1) 214 + #define PKTSCHED_NULL_TX_EN BIT(0) 215 + #define PKTSCHED_PKT_CONTROL0 0xaac 216 + #define PKTSCHED_PKT_SEND 0xab0 217 + #define PKTSCHED_PKT_STATUS0 0xab4 218 + #define PKTSCHED_PKT_STATUS1 0xab8 219 + #define PKT_NULL_CONTENTS0 0xb00 220 + #define PKT_NULL_CONTENTS1 0xb04 221 + #define PKT_NULL_CONTENTS2 0xb08 222 + #define PKT_NULL_CONTENTS3 0xb0c 223 + #define PKT_NULL_CONTENTS4 0xb10 224 + #define PKT_NULL_CONTENTS5 0xb14 225 + #define PKT_NULL_CONTENTS6 0xb18 226 + #define PKT_NULL_CONTENTS7 0xb1c 227 + #define PKT_ACP_CONTENTS0 0xb20 228 + #define PKT_ACP_CONTENTS1 0xb24 229 + #define PKT_ACP_CONTENTS2 0xb28 230 + #define PKT_ACP_CONTENTS3 0xb2c 231 + #define PKT_ACP_CONTENTS4 0xb30 232 + #define PKT_ACP_CONTENTS5 0xb34 233 + #define PKT_ACP_CONTENTS6 0xb38 234 + #define PKT_ACP_CONTENTS7 0xb3c 235 + #define PKT_ISRC1_CONTENTS0 0xb40 236 + #define PKT_ISRC1_CONTENTS1 0xb44 237 + #define PKT_ISRC1_CONTENTS2 0xb48 238 + #define PKT_ISRC1_CONTENTS3 0xb4c 239 + #define PKT_ISRC1_CONTENTS4 0xb50 240 + #define PKT_ISRC1_CONTENTS5 0xb54 241 + #define PKT_ISRC1_CONTENTS6 0xb58 242 + #define PKT_ISRC1_CONTENTS7 0xb5c 243 + #define PKT_ISRC2_CONTENTS0 0xb60 244 + #define PKT_ISRC2_CONTENTS1 0xb64 245 + #define PKT_ISRC2_CONTENTS2 0xb68 246 + #define PKT_ISRC2_CONTENTS3 0xb6c 247 + #define PKT_ISRC2_CONTENTS4 0xb70 248 + #define PKT_ISRC2_CONTENTS5 0xb74 249 + #define PKT_ISRC2_CONTENTS6 0xb78 250 + #define PKT_ISRC2_CONTENTS7 0xb7c 251 + #define PKT_GMD_CONTENTS0 0xb80 252 + #define PKT_GMD_CONTENTS1 0xb84 253 + #define PKT_GMD_CONTENTS2 0xb88 254 + #define PKT_GMD_CONTENTS3 0xb8c 255 + #define PKT_GMD_CONTENTS4 0xb90 256 + #define PKT_GMD_CONTENTS5 0xb94 257 + #define PKT_GMD_CONTENTS6 0xb98 258 + #define PKT_GMD_CONTENTS7 0xb9c 259 + #define PKT_AMD_CONTENTS0 0xba0 260 + #define PKT_AMD_CONTENTS1 0xba4 261 + #define PKT_AMD_CONTENTS2 0xba8 262 + #define PKT_AMD_CONTENTS3 0xbac 263 + #define PKT_AMD_CONTENTS4 0xbb0 264 + #define PKT_AMD_CONTENTS5 0xbb4 265 + #define PKT_AMD_CONTENTS6 0xbb8 266 + #define PKT_AMD_CONTENTS7 0xbbc 267 + #define PKT_VSI_CONTENTS0 0xbc0 268 + #define PKT_VSI_CONTENTS1 0xbc4 269 + #define PKT_VSI_CONTENTS2 0xbc8 270 + #define PKT_VSI_CONTENTS3 0xbcc 271 + #define PKT_VSI_CONTENTS4 0xbd0 272 + #define PKT_VSI_CONTENTS5 0xbd4 273 + #define PKT_VSI_CONTENTS6 0xbd8 274 + #define PKT_VSI_CONTENTS7 0xbdc 275 + #define PKT_AVI_CONTENTS0 0xbe0 276 + #define HDMI_FC_AVICONF0_ACTIVE_FMT_INFO_PRESENT BIT(4) 277 + #define HDMI_FC_AVICONF0_BAR_DATA_VERT_BAR 0x04 278 + #define HDMI_FC_AVICONF0_BAR_DATA_HORIZ_BAR 0x08 279 + #define HDMI_FC_AVICONF2_IT_CONTENT_VALID 0x80 280 + #define PKT_AVI_CONTENTS1 0xbe4 281 + #define PKT_AVI_CONTENTS2 0xbe8 282 + #define PKT_AVI_CONTENTS3 0xbec 283 + #define PKT_AVI_CONTENTS4 0xbf0 284 + #define PKT_AVI_CONTENTS5 0xbf4 285 + #define PKT_AVI_CONTENTS6 0xbf8 286 + #define PKT_AVI_CONTENTS7 0xbfc 287 + #define PKT_SPDI_CONTENTS0 0xc00 288 + #define PKT_SPDI_CONTENTS1 0xc04 289 + #define PKT_SPDI_CONTENTS2 0xc08 290 + #define PKT_SPDI_CONTENTS3 0xc0c 291 + #define PKT_SPDI_CONTENTS4 0xc10 292 + #define PKT_SPDI_CONTENTS5 0xc14 293 + #define PKT_SPDI_CONTENTS6 0xc18 294 + #define PKT_SPDI_CONTENTS7 0xc1c 295 + #define PKT_AUDI_CONTENTS0 0xc20 296 + #define PKT_AUDI_CONTENTS1 0xc24 297 + #define PKT_AUDI_CONTENTS2 0xc28 298 + #define PKT_AUDI_CONTENTS3 0xc2c 299 + #define PKT_AUDI_CONTENTS4 0xc30 300 + #define PKT_AUDI_CONTENTS5 0xc34 301 + #define PKT_AUDI_CONTENTS6 0xc38 302 + #define PKT_AUDI_CONTENTS7 0xc3c 303 + #define PKT_NVI_CONTENTS0 0xc40 304 + #define PKT_NVI_CONTENTS1 0xc44 305 + #define PKT_NVI_CONTENTS2 0xc48 306 + #define PKT_NVI_CONTENTS3 0xc4c 307 + #define PKT_NVI_CONTENTS4 0xc50 308 + #define PKT_NVI_CONTENTS5 0xc54 309 + #define PKT_NVI_CONTENTS6 0xc58 310 + #define PKT_NVI_CONTENTS7 0xc5c 311 + #define PKT_DRMI_CONTENTS0 0xc60 312 + #define PKT_DRMI_CONTENTS1 0xc64 313 + #define PKT_DRMI_CONTENTS2 0xc68 314 + #define PKT_DRMI_CONTENTS3 0xc6c 315 + #define PKT_DRMI_CONTENTS4 0xc70 316 + #define PKT_DRMI_CONTENTS5 0xc74 317 + #define PKT_DRMI_CONTENTS6 0xc78 318 + #define PKT_DRMI_CONTENTS7 0xc7c 319 + #define PKT_GHDMI1_CONTENTS0 0xc80 320 + #define PKT_GHDMI1_CONTENTS1 0xc84 321 + #define PKT_GHDMI1_CONTENTS2 0xc88 322 + #define PKT_GHDMI1_CONTENTS3 0xc8c 323 + #define PKT_GHDMI1_CONTENTS4 0xc90 324 + #define PKT_GHDMI1_CONTENTS5 0xc94 325 + #define PKT_GHDMI1_CONTENTS6 0xc98 326 + #define PKT_GHDMI1_CONTENTS7 0xc9c 327 + #define PKT_GHDMI2_CONTENTS0 0xca0 328 + #define PKT_GHDMI2_CONTENTS1 0xca4 329 + #define PKT_GHDMI2_CONTENTS2 0xca8 330 + #define PKT_GHDMI2_CONTENTS3 0xcac 331 + #define PKT_GHDMI2_CONTENTS4 0xcb0 332 + #define PKT_GHDMI2_CONTENTS5 0xcb4 333 + #define PKT_GHDMI2_CONTENTS6 0xcb8 334 + #define PKT_GHDMI2_CONTENTS7 0xcbc 335 + /* EMP Packetizer Registers */ 336 + #define PKT_EMP_CONFIG0 0xce0 337 + #define PKT_EMP_CONTROL0 0xcec 338 + #define PKT_EMP_CONTROL1 0xcf0 339 + #define PKT_EMP_CONTROL2 0xcf4 340 + #define PKT_EMP_VTEM_CONTENTS0 0xd00 341 + #define PKT_EMP_VTEM_CONTENTS1 0xd04 342 + #define PKT_EMP_VTEM_CONTENTS2 0xd08 343 + #define PKT_EMP_VTEM_CONTENTS3 0xd0c 344 + #define PKT_EMP_VTEM_CONTENTS4 0xd10 345 + #define PKT_EMP_VTEM_CONTENTS5 0xd14 346 + #define PKT_EMP_VTEM_CONTENTS6 0xd18 347 + #define PKT_EMP_VTEM_CONTENTS7 0xd1c 348 + #define PKT0_EMP_CVTEM_CONTENTS0 0xd20 349 + #define PKT0_EMP_CVTEM_CONTENTS1 0xd24 350 + #define PKT0_EMP_CVTEM_CONTENTS2 0xd28 351 + #define PKT0_EMP_CVTEM_CONTENTS3 0xd2c 352 + #define PKT0_EMP_CVTEM_CONTENTS4 0xd30 353 + #define PKT0_EMP_CVTEM_CONTENTS5 0xd34 354 + #define PKT0_EMP_CVTEM_CONTENTS6 0xd38 355 + #define PKT0_EMP_CVTEM_CONTENTS7 0xd3c 356 + #define PKT1_EMP_CVTEM_CONTENTS0 0xd40 357 + #define PKT1_EMP_CVTEM_CONTENTS1 0xd44 358 + #define PKT1_EMP_CVTEM_CONTENTS2 0xd48 359 + #define PKT1_EMP_CVTEM_CONTENTS3 0xd4c 360 + #define PKT1_EMP_CVTEM_CONTENTS4 0xd50 361 + #define PKT1_EMP_CVTEM_CONTENTS5 0xd54 362 + #define PKT1_EMP_CVTEM_CONTENTS6 0xd58 363 + #define PKT1_EMP_CVTEM_CONTENTS7 0xd5c 364 + #define PKT2_EMP_CVTEM_CONTENTS0 0xd60 365 + #define PKT2_EMP_CVTEM_CONTENTS1 0xd64 366 + #define PKT2_EMP_CVTEM_CONTENTS2 0xd68 367 + #define PKT2_EMP_CVTEM_CONTENTS3 0xd6c 368 + #define PKT2_EMP_CVTEM_CONTENTS4 0xd70 369 + #define PKT2_EMP_CVTEM_CONTENTS5 0xd74 370 + #define PKT2_EMP_CVTEM_CONTENTS6 0xd78 371 + #define PKT2_EMP_CVTEM_CONTENTS7 0xd7c 372 + #define PKT3_EMP_CVTEM_CONTENTS0 0xd80 373 + #define PKT3_EMP_CVTEM_CONTENTS1 0xd84 374 + #define PKT3_EMP_CVTEM_CONTENTS2 0xd88 375 + #define PKT3_EMP_CVTEM_CONTENTS3 0xd8c 376 + #define PKT3_EMP_CVTEM_CONTENTS4 0xd90 377 + #define PKT3_EMP_CVTEM_CONTENTS5 0xd94 378 + #define PKT3_EMP_CVTEM_CONTENTS6 0xd98 379 + #define PKT3_EMP_CVTEM_CONTENTS7 0xd9c 380 + #define PKT4_EMP_CVTEM_CONTENTS0 0xda0 381 + #define PKT4_EMP_CVTEM_CONTENTS1 0xda4 382 + #define PKT4_EMP_CVTEM_CONTENTS2 0xda8 383 + #define PKT4_EMP_CVTEM_CONTENTS3 0xdac 384 + #define PKT4_EMP_CVTEM_CONTENTS4 0xdb0 385 + #define PKT4_EMP_CVTEM_CONTENTS5 0xdb4 386 + #define PKT4_EMP_CVTEM_CONTENTS6 0xdb8 387 + #define PKT4_EMP_CVTEM_CONTENTS7 0xdbc 388 + #define PKT5_EMP_CVTEM_CONTENTS0 0xdc0 389 + #define PKT5_EMP_CVTEM_CONTENTS1 0xdc4 390 + #define PKT5_EMP_CVTEM_CONTENTS2 0xdc8 391 + #define PKT5_EMP_CVTEM_CONTENTS3 0xdcc 392 + #define PKT5_EMP_CVTEM_CONTENTS4 0xdd0 393 + #define PKT5_EMP_CVTEM_CONTENTS5 0xdd4 394 + #define PKT5_EMP_CVTEM_CONTENTS6 0xdd8 395 + #define PKT5_EMP_CVTEM_CONTENTS7 0xddc 396 + /* Audio Packetizer Registers */ 397 + #define AUDPKT_CONTROL0 0xe20 398 + #define AUDPKT_PBIT_FORCE_EN_MASK BIT(12) 399 + #define AUDPKT_PBIT_FORCE_EN BIT(12) 400 + #define AUDPKT_CHSTATUS_OVR_EN_MASK BIT(0) 401 + #define AUDPKT_CHSTATUS_OVR_EN BIT(0) 402 + #define AUDPKT_CONTROL1 0xe24 403 + #define AUDPKT_ACR_CONTROL0 0xe40 404 + #define AUDPKT_ACR_N_VALUE 0xfffff 405 + #define AUDPKT_ACR_CONTROL1 0xe44 406 + #define AUDPKT_ACR_CTS_OVR_VAL_MSK GENMASK(23, 4) 407 + #define AUDPKT_ACR_CTS_OVR_VAL(x) ((x) << 4) 408 + #define AUDPKT_ACR_CTS_OVR_EN_MSK BIT(1) 409 + #define AUDPKT_ACR_CTS_OVR_EN BIT(1) 410 + #define AUDPKT_ACR_STATUS0 0xe4c 411 + #define AUDPKT_CHSTATUS_OVR0 0xe60 412 + #define AUDPKT_CHSTATUS_OVR1 0xe64 413 + /* IEC60958 Byte 3: Sampleing frenuency Bits 24 to 27 */ 414 + #define AUDPKT_CHSTATUS_SR_MASK GENMASK(3, 0) 415 + #define AUDPKT_CHSTATUS_SR_22050 0x4 416 + #define AUDPKT_CHSTATUS_SR_24000 0x6 417 + #define AUDPKT_CHSTATUS_SR_32000 0x3 418 + #define AUDPKT_CHSTATUS_SR_44100 0x0 419 + #define AUDPKT_CHSTATUS_SR_48000 0x2 420 + #define AUDPKT_CHSTATUS_SR_88200 0x8 421 + #define AUDPKT_CHSTATUS_SR_96000 0xa 422 + #define AUDPKT_CHSTATUS_SR_176400 0xc 423 + #define AUDPKT_CHSTATUS_SR_192000 0xe 424 + #define AUDPKT_CHSTATUS_SR_768000 0x9 425 + #define AUDPKT_CHSTATUS_SR_NOT_INDICATED 0x1 426 + /* IEC60958 Byte 4: Original Sampleing frenuency Bits 36 to 39 */ 427 + #define AUDPKT_CHSTATUS_0SR_MASK GENMASK(15, 12) 428 + #define AUDPKT_CHSTATUS_OSR_8000 0x6 429 + #define AUDPKT_CHSTATUS_OSR_11025 0xa 430 + #define AUDPKT_CHSTATUS_OSR_12000 0x2 431 + #define AUDPKT_CHSTATUS_OSR_16000 0x8 432 + #define AUDPKT_CHSTATUS_OSR_22050 0xb 433 + #define AUDPKT_CHSTATUS_OSR_24000 0x9 434 + #define AUDPKT_CHSTATUS_OSR_32000 0xc 435 + #define AUDPKT_CHSTATUS_OSR_44100 0xf 436 + #define AUDPKT_CHSTATUS_OSR_48000 0xd 437 + #define AUDPKT_CHSTATUS_OSR_88200 0x7 438 + #define AUDPKT_CHSTATUS_OSR_96000 0x5 439 + #define AUDPKT_CHSTATUS_OSR_176400 0x3 440 + #define AUDPKT_CHSTATUS_OSR_192000 0x1 441 + #define AUDPKT_CHSTATUS_OSR_NOT_INDICATED 0x0 442 + #define AUDPKT_CHSTATUS_OVR2 0xe68 443 + #define AUDPKT_CHSTATUS_OVR3 0xe6c 444 + #define AUDPKT_CHSTATUS_OVR4 0xe70 445 + #define AUDPKT_CHSTATUS_OVR5 0xe74 446 + #define AUDPKT_CHSTATUS_OVR6 0xe78 447 + #define AUDPKT_CHSTATUS_OVR7 0xe7c 448 + #define AUDPKT_CHSTATUS_OVR8 0xe80 449 + #define AUDPKT_CHSTATUS_OVR9 0xe84 450 + #define AUDPKT_CHSTATUS_OVR10 0xe88 451 + #define AUDPKT_CHSTATUS_OVR11 0xe8c 452 + #define AUDPKT_CHSTATUS_OVR12 0xe90 453 + #define AUDPKT_CHSTATUS_OVR13 0xe94 454 + #define AUDPKT_CHSTATUS_OVR14 0xe98 455 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC0 0xea0 456 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC1 0xea4 457 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC2 0xea8 458 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC3 0xeac 459 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC4 0xeb0 460 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC5 0xeb4 461 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC6 0xeb8 462 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC7 0xebc 463 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC8 0xec0 464 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC9 0xec4 465 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC10 0xec8 466 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC11 0xecc 467 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC12 0xed0 468 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC13 0xed4 469 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC14 0xed8 470 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC15 0xedc 471 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC16 0xee0 472 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC17 0xee4 473 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC18 0xee8 474 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC19 0xeec 475 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC20 0xef0 476 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC21 0xef4 477 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC22 0xef8 478 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC23 0xefc 479 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC24 0xf00 480 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC25 0xf04 481 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC26 0xf08 482 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC27 0xf0c 483 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC28 0xf10 484 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC29 0xf14 485 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC30 0xf18 486 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC31 0xf1c 487 + #define AUDPKT_USRDATA_OVR_MSG_GENERIC32 0xf20 488 + #define AUDPKT_VBIT_OVR0 0xf24 489 + /* CEC Registers */ 490 + #define CEC_TX_CONTROL 0x1000 491 + #define CEC_STATUS 0x1004 492 + #define CEC_CONFIG 0x1008 493 + #define CEC_ADDR 0x100c 494 + #define CEC_TX_COUNT 0x1020 495 + #define CEC_TX_DATA3_0 0x1024 496 + #define CEC_TX_DATA7_4 0x1028 497 + #define CEC_TX_DATA11_8 0x102c 498 + #define CEC_TX_DATA15_12 0x1030 499 + #define CEC_RX_COUNT_STATUS 0x1040 500 + #define CEC_RX_DATA3_0 0x1044 501 + #define CEC_RX_DATA7_4 0x1048 502 + #define CEC_RX_DATA11_8 0x104c 503 + #define CEC_RX_DATA15_12 0x1050 504 + #define CEC_LOCK_CONTROL 0x1054 505 + #define CEC_RXQUAL_BITTIME_CONFIG 0x1060 506 + #define CEC_RX_BITTIME_CONFIG 0x1064 507 + #define CEC_TX_BITTIME_CONFIG 0x1068 508 + /* eARC RX CMDC Registers */ 509 + #define EARCRX_CMDC_CONFIG0 0x1800 510 + #define EARCRX_XACTREAD_STOP_CFG BIT(26) 511 + #define EARCRX_XACTREAD_RETRY_CFG BIT(25) 512 + #define EARCRX_CMDC_DSCVR_EARCVALID0_TO_DISC1 BIT(24) 513 + #define EARCRX_CMDC_XACT_RESTART_EN BIT(18) 514 + #define EARCRX_CMDC_CONFIG1 0x1804 515 + #define EARCRX_CMDC_CONTROL 0x1808 516 + #define EARCRX_CMDC_HEARTBEAT_LOSS_EN BIT(4) 517 + #define EARCRX_CMDC_DISCOVERY_EN BIT(3) 518 + #define EARCRX_CONNECTOR_HPD BIT(1) 519 + #define EARCRX_CMDC_WHITELIST0_CONFIG 0x180c 520 + #define EARCRX_CMDC_WHITELIST1_CONFIG 0x1810 521 + #define EARCRX_CMDC_WHITELIST2_CONFIG 0x1814 522 + #define EARCRX_CMDC_WHITELIST3_CONFIG 0x1818 523 + #define EARCRX_CMDC_STATUS 0x181c 524 + #define EARCRX_CMDC_XACT_INFO 0x1820 525 + #define EARCRX_CMDC_XACT_ACTION 0x1824 526 + #define EARCRX_CMDC_HEARTBEAT_RXSTAT_SE 0x1828 527 + #define EARCRX_CMDC_HEARTBEAT_STATUS 0x182c 528 + #define EARCRX_CMDC_XACT_WR0 0x1840 529 + #define EARCRX_CMDC_XACT_WR1 0x1844 530 + #define EARCRX_CMDC_XACT_WR2 0x1848 531 + #define EARCRX_CMDC_XACT_WR3 0x184c 532 + #define EARCRX_CMDC_XACT_WR4 0x1850 533 + #define EARCRX_CMDC_XACT_WR5 0x1854 534 + #define EARCRX_CMDC_XACT_WR6 0x1858 535 + #define EARCRX_CMDC_XACT_WR7 0x185c 536 + #define EARCRX_CMDC_XACT_WR8 0x1860 537 + #define EARCRX_CMDC_XACT_WR9 0x1864 538 + #define EARCRX_CMDC_XACT_WR10 0x1868 539 + #define EARCRX_CMDC_XACT_WR11 0x186c 540 + #define EARCRX_CMDC_XACT_WR12 0x1870 541 + #define EARCRX_CMDC_XACT_WR13 0x1874 542 + #define EARCRX_CMDC_XACT_WR14 0x1878 543 + #define EARCRX_CMDC_XACT_WR15 0x187c 544 + #define EARCRX_CMDC_XACT_WR16 0x1880 545 + #define EARCRX_CMDC_XACT_WR17 0x1884 546 + #define EARCRX_CMDC_XACT_WR18 0x1888 547 + #define EARCRX_CMDC_XACT_WR19 0x188c 548 + #define EARCRX_CMDC_XACT_WR20 0x1890 549 + #define EARCRX_CMDC_XACT_WR21 0x1894 550 + #define EARCRX_CMDC_XACT_WR22 0x1898 551 + #define EARCRX_CMDC_XACT_WR23 0x189c 552 + #define EARCRX_CMDC_XACT_WR24 0x18a0 553 + #define EARCRX_CMDC_XACT_WR25 0x18a4 554 + #define EARCRX_CMDC_XACT_WR26 0x18a8 555 + #define EARCRX_CMDC_XACT_WR27 0x18ac 556 + #define EARCRX_CMDC_XACT_WR28 0x18b0 557 + #define EARCRX_CMDC_XACT_WR29 0x18b4 558 + #define EARCRX_CMDC_XACT_WR30 0x18b8 559 + #define EARCRX_CMDC_XACT_WR31 0x18bc 560 + #define EARCRX_CMDC_XACT_WR32 0x18c0 561 + #define EARCRX_CMDC_XACT_WR33 0x18c4 562 + #define EARCRX_CMDC_XACT_WR34 0x18c8 563 + #define EARCRX_CMDC_XACT_WR35 0x18cc 564 + #define EARCRX_CMDC_XACT_WR36 0x18d0 565 + #define EARCRX_CMDC_XACT_WR37 0x18d4 566 + #define EARCRX_CMDC_XACT_WR38 0x18d8 567 + #define EARCRX_CMDC_XACT_WR39 0x18dc 568 + #define EARCRX_CMDC_XACT_WR40 0x18e0 569 + #define EARCRX_CMDC_XACT_WR41 0x18e4 570 + #define EARCRX_CMDC_XACT_WR42 0x18e8 571 + #define EARCRX_CMDC_XACT_WR43 0x18ec 572 + #define EARCRX_CMDC_XACT_WR44 0x18f0 573 + #define EARCRX_CMDC_XACT_WR45 0x18f4 574 + #define EARCRX_CMDC_XACT_WR46 0x18f8 575 + #define EARCRX_CMDC_XACT_WR47 0x18fc 576 + #define EARCRX_CMDC_XACT_WR48 0x1900 577 + #define EARCRX_CMDC_XACT_WR49 0x1904 578 + #define EARCRX_CMDC_XACT_WR50 0x1908 579 + #define EARCRX_CMDC_XACT_WR51 0x190c 580 + #define EARCRX_CMDC_XACT_WR52 0x1910 581 + #define EARCRX_CMDC_XACT_WR53 0x1914 582 + #define EARCRX_CMDC_XACT_WR54 0x1918 583 + #define EARCRX_CMDC_XACT_WR55 0x191c 584 + #define EARCRX_CMDC_XACT_WR56 0x1920 585 + #define EARCRX_CMDC_XACT_WR57 0x1924 586 + #define EARCRX_CMDC_XACT_WR58 0x1928 587 + #define EARCRX_CMDC_XACT_WR59 0x192c 588 + #define EARCRX_CMDC_XACT_WR60 0x1930 589 + #define EARCRX_CMDC_XACT_WR61 0x1934 590 + #define EARCRX_CMDC_XACT_WR62 0x1938 591 + #define EARCRX_CMDC_XACT_WR63 0x193c 592 + #define EARCRX_CMDC_XACT_WR64 0x1940 593 + #define EARCRX_CMDC_XACT_RD0 0x1960 594 + #define EARCRX_CMDC_XACT_RD1 0x1964 595 + #define EARCRX_CMDC_XACT_RD2 0x1968 596 + #define EARCRX_CMDC_XACT_RD3 0x196c 597 + #define EARCRX_CMDC_XACT_RD4 0x1970 598 + #define EARCRX_CMDC_XACT_RD5 0x1974 599 + #define EARCRX_CMDC_XACT_RD6 0x1978 600 + #define EARCRX_CMDC_XACT_RD7 0x197c 601 + #define EARCRX_CMDC_XACT_RD8 0x1980 602 + #define EARCRX_CMDC_XACT_RD9 0x1984 603 + #define EARCRX_CMDC_XACT_RD10 0x1988 604 + #define EARCRX_CMDC_XACT_RD11 0x198c 605 + #define EARCRX_CMDC_XACT_RD12 0x1990 606 + #define EARCRX_CMDC_XACT_RD13 0x1994 607 + #define EARCRX_CMDC_XACT_RD14 0x1998 608 + #define EARCRX_CMDC_XACT_RD15 0x199c 609 + #define EARCRX_CMDC_XACT_RD16 0x19a0 610 + #define EARCRX_CMDC_XACT_RD17 0x19a4 611 + #define EARCRX_CMDC_XACT_RD18 0x19a8 612 + #define EARCRX_CMDC_XACT_RD19 0x19ac 613 + #define EARCRX_CMDC_XACT_RD20 0x19b0 614 + #define EARCRX_CMDC_XACT_RD21 0x19b4 615 + #define EARCRX_CMDC_XACT_RD22 0x19b8 616 + #define EARCRX_CMDC_XACT_RD23 0x19bc 617 + #define EARCRX_CMDC_XACT_RD24 0x19c0 618 + #define EARCRX_CMDC_XACT_RD25 0x19c4 619 + #define EARCRX_CMDC_XACT_RD26 0x19c8 620 + #define EARCRX_CMDC_XACT_RD27 0x19cc 621 + #define EARCRX_CMDC_XACT_RD28 0x19d0 622 + #define EARCRX_CMDC_XACT_RD29 0x19d4 623 + #define EARCRX_CMDC_XACT_RD30 0x19d8 624 + #define EARCRX_CMDC_XACT_RD31 0x19dc 625 + #define EARCRX_CMDC_XACT_RD32 0x19e0 626 + #define EARCRX_CMDC_XACT_RD33 0x19e4 627 + #define EARCRX_CMDC_XACT_RD34 0x19e8 628 + #define EARCRX_CMDC_XACT_RD35 0x19ec 629 + #define EARCRX_CMDC_XACT_RD36 0x19f0 630 + #define EARCRX_CMDC_XACT_RD37 0x19f4 631 + #define EARCRX_CMDC_XACT_RD38 0x19f8 632 + #define EARCRX_CMDC_XACT_RD39 0x19fc 633 + #define EARCRX_CMDC_XACT_RD40 0x1a00 634 + #define EARCRX_CMDC_XACT_RD41 0x1a04 635 + #define EARCRX_CMDC_XACT_RD42 0x1a08 636 + #define EARCRX_CMDC_XACT_RD43 0x1a0c 637 + #define EARCRX_CMDC_XACT_RD44 0x1a10 638 + #define EARCRX_CMDC_XACT_RD45 0x1a14 639 + #define EARCRX_CMDC_XACT_RD46 0x1a18 640 + #define EARCRX_CMDC_XACT_RD47 0x1a1c 641 + #define EARCRX_CMDC_XACT_RD48 0x1a20 642 + #define EARCRX_CMDC_XACT_RD49 0x1a24 643 + #define EARCRX_CMDC_XACT_RD50 0x1a28 644 + #define EARCRX_CMDC_XACT_RD51 0x1a2c 645 + #define EARCRX_CMDC_XACT_RD52 0x1a30 646 + #define EARCRX_CMDC_XACT_RD53 0x1a34 647 + #define EARCRX_CMDC_XACT_RD54 0x1a38 648 + #define EARCRX_CMDC_XACT_RD55 0x1a3c 649 + #define EARCRX_CMDC_XACT_RD56 0x1a40 650 + #define EARCRX_CMDC_XACT_RD57 0x1a44 651 + #define EARCRX_CMDC_XACT_RD58 0x1a48 652 + #define EARCRX_CMDC_XACT_RD59 0x1a4c 653 + #define EARCRX_CMDC_XACT_RD60 0x1a50 654 + #define EARCRX_CMDC_XACT_RD61 0x1a54 655 + #define EARCRX_CMDC_XACT_RD62 0x1a58 656 + #define EARCRX_CMDC_XACT_RD63 0x1a5c 657 + #define EARCRX_CMDC_XACT_RD64 0x1a60 658 + #define EARCRX_CMDC_SYNC_CONFIG 0x1b00 659 + /* eARC RX DMAC Registers */ 660 + #define EARCRX_DMAC_PHY_CONTROL 0x1c00 661 + #define EARCRX_DMAC_CONFIG 0x1c08 662 + #define EARCRX_DMAC_CONTROL0 0x1c0c 663 + #define EARCRX_DMAC_AUDIO_EN BIT(1) 664 + #define EARCRX_DMAC_EN BIT(0) 665 + #define EARCRX_DMAC_CONTROL1 0x1c10 666 + #define EARCRX_DMAC_STATUS 0x1c14 667 + #define EARCRX_DMAC_CHSTATUS0 0x1c18 668 + #define EARCRX_DMAC_CHSTATUS1 0x1c1c 669 + #define EARCRX_DMAC_CHSTATUS2 0x1c20 670 + #define EARCRX_DMAC_CHSTATUS3 0x1c24 671 + #define EARCRX_DMAC_CHSTATUS4 0x1c28 672 + #define EARCRX_DMAC_CHSTATUS5 0x1c2c 673 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC0 0x1c30 674 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC1 0x1c34 675 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC2 0x1c38 676 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC3 0x1c3c 677 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC4 0x1c40 678 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC5 0x1c44 679 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC6 0x1c48 680 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC7 0x1c4c 681 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC8 0x1c50 682 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC9 0x1c54 683 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC10 0x1c58 684 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_AC11 0x1c5c 685 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT0 0x1c60 686 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT1 0x1c64 687 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT2 0x1c68 688 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT3 0x1c6c 689 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT4 0x1c70 690 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT5 0x1c74 691 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT6 0x1c78 692 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT7 0x1c7c 693 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT8 0x1c80 694 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT9 0x1c84 695 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT10 0x1c88 696 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC1_PKT11 0x1c8c 697 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT0 0x1c90 698 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT1 0x1c94 699 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT2 0x1c98 700 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT3 0x1c9c 701 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT4 0x1ca0 702 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT5 0x1ca4 703 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT6 0x1ca8 704 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT7 0x1cac 705 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT8 0x1cb0 706 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT9 0x1cb4 707 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT10 0x1cb8 708 + #define EARCRX_DMAC_USRDATA_MSG_HDMI_ISRC2_PKT11 0x1cbc 709 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC0 0x1cc0 710 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC1 0x1cc4 711 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC2 0x1cc8 712 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC3 0x1ccc 713 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC4 0x1cd0 714 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC5 0x1cd4 715 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC6 0x1cd8 716 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC7 0x1cdc 717 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC8 0x1ce0 718 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC9 0x1ce4 719 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC10 0x1ce8 720 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC11 0x1cec 721 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC12 0x1cf0 722 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC13 0x1cf4 723 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC14 0x1cf8 724 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC15 0x1cfc 725 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC16 0x1d00 726 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC17 0x1d04 727 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC18 0x1d08 728 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC19 0x1d0c 729 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC20 0x1d10 730 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC21 0x1d14 731 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC22 0x1d18 732 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC23 0x1d1c 733 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC24 0x1d20 734 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC25 0x1d24 735 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC26 0x1d28 736 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC27 0x1d2c 737 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC28 0x1d30 738 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC29 0x1d34 739 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC30 0x1d38 740 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC31 0x1d3c 741 + #define EARCRX_DMAC_USRDATA_MSG_GENERIC32 0x1d40 742 + #define EARCRX_DMAC_CHSTATUS_STREAMER0 0x1d44 743 + #define EARCRX_DMAC_CHSTATUS_STREAMER1 0x1d48 744 + #define EARCRX_DMAC_CHSTATUS_STREAMER2 0x1d4c 745 + #define EARCRX_DMAC_CHSTATUS_STREAMER3 0x1d50 746 + #define EARCRX_DMAC_CHSTATUS_STREAMER4 0x1d54 747 + #define EARCRX_DMAC_CHSTATUS_STREAMER5 0x1d58 748 + #define EARCRX_DMAC_CHSTATUS_STREAMER6 0x1d5c 749 + #define EARCRX_DMAC_CHSTATUS_STREAMER7 0x1d60 750 + #define EARCRX_DMAC_CHSTATUS_STREAMER8 0x1d64 751 + #define EARCRX_DMAC_CHSTATUS_STREAMER9 0x1d68 752 + #define EARCRX_DMAC_CHSTATUS_STREAMER10 0x1d6c 753 + #define EARCRX_DMAC_CHSTATUS_STREAMER11 0x1d70 754 + #define EARCRX_DMAC_CHSTATUS_STREAMER12 0x1d74 755 + #define EARCRX_DMAC_CHSTATUS_STREAMER13 0x1d78 756 + #define EARCRX_DMAC_CHSTATUS_STREAMER14 0x1d7c 757 + #define EARCRX_DMAC_USRDATA_STREAMER0 0x1d80 758 + /* Main Unit Interrupt Registers */ 759 + #define MAIN_INTVEC_INDEX 0x3000 760 + #define MAINUNIT_0_INT_STATUS 0x3010 761 + #define MAINUNIT_0_INT_MASK_N 0x3014 762 + #define MAINUNIT_0_INT_CLEAR 0x3018 763 + #define MAINUNIT_0_INT_FORCE 0x301c 764 + #define MAINUNIT_1_INT_STATUS 0x3020 765 + #define FLT_EXIT_TO_LTSL_IRQ BIT(22) 766 + #define FLT_EXIT_TO_LTS4_IRQ BIT(21) 767 + #define FLT_EXIT_TO_LTSP_IRQ BIT(20) 768 + #define SCDC_NACK_RCVD_IRQ BIT(12) 769 + #define SCDC_RR_REPLY_STOP_IRQ BIT(11) 770 + #define SCDC_UPD_FLAGS_CLR_IRQ BIT(10) 771 + #define SCDC_UPD_FLAGS_CHG_IRQ BIT(9) 772 + #define SCDC_UPD_FLAGS_RD_IRQ BIT(8) 773 + #define I2CM_NACK_RCVD_IRQ BIT(2) 774 + #define I2CM_READ_REQUEST_IRQ BIT(1) 775 + #define I2CM_OP_DONE_IRQ BIT(0) 776 + #define MAINUNIT_1_INT_MASK_N 0x3024 777 + #define I2CM_NACK_RCVD_MASK_N BIT(2) 778 + #define I2CM_READ_REQUEST_MASK_N BIT(1) 779 + #define I2CM_OP_DONE_MASK_N BIT(0) 780 + #define MAINUNIT_1_INT_CLEAR 0x3028 781 + #define I2CM_NACK_RCVD_CLEAR BIT(2) 782 + #define I2CM_READ_REQUEST_CLEAR BIT(1) 783 + #define I2CM_OP_DONE_CLEAR BIT(0) 784 + #define MAINUNIT_1_INT_FORCE 0x302c 785 + /* AVPUNIT Interrupt Registers */ 786 + #define AVP_INTVEC_INDEX 0x3800 787 + #define AVP_0_INT_STATUS 0x3810 788 + #define AVP_0_INT_MASK_N 0x3814 789 + #define AVP_0_INT_CLEAR 0x3818 790 + #define AVP_0_INT_FORCE 0x381c 791 + #define AVP_1_INT_STATUS 0x3820 792 + #define AVP_1_INT_MASK_N 0x3824 793 + #define HDCP14_AUTH_CHG_MASK_N BIT(6) 794 + #define AVP_1_INT_CLEAR 0x3828 795 + #define AVP_1_INT_FORCE 0x382c 796 + #define AVP_2_INT_STATUS 0x3830 797 + #define AVP_2_INT_MASK_N 0x3834 798 + #define AVP_2_INT_CLEAR 0x3838 799 + #define AVP_2_INT_FORCE 0x383c 800 + #define AVP_3_INT_STATUS 0x3840 801 + #define AVP_3_INT_MASK_N 0x3844 802 + #define AVP_3_INT_CLEAR 0x3848 803 + #define AVP_3_INT_FORCE 0x384c 804 + #define AVP_4_INT_STATUS 0x3850 805 + #define AVP_4_INT_MASK_N 0x3854 806 + #define AVP_4_INT_CLEAR 0x3858 807 + #define AVP_4_INT_FORCE 0x385c 808 + #define AVP_5_INT_STATUS 0x3860 809 + #define AVP_5_INT_MASK_N 0x3864 810 + #define AVP_5_INT_CLEAR 0x3868 811 + #define AVP_5_INT_FORCE 0x386c 812 + #define AVP_6_INT_STATUS 0x3870 813 + #define AVP_6_INT_MASK_N 0x3874 814 + #define AVP_6_INT_CLEAR 0x3878 815 + #define AVP_6_INT_FORCE 0x387c 816 + /* CEC Interrupt Registers */ 817 + #define CEC_INT_STATUS 0x4000 818 + #define CEC_INT_MASK_N 0x4004 819 + #define CEC_INT_CLEAR 0x4008 820 + #define CEC_INT_FORCE 0x400c 821 + /* eARC RX Interrupt Registers */ 822 + #define EARCRX_INTVEC_INDEX 0x4800 823 + #define EARCRX_0_INT_STATUS 0x4810 824 + #define EARCRX_CMDC_DISCOVERY_TIMEOUT_IRQ BIT(9) 825 + #define EARCRX_CMDC_DISCOVERY_DONE_IRQ BIT(8) 826 + #define EARCRX_0_INT_MASK_N 0x4814 827 + #define EARCRX_0_INT_CLEAR 0x4818 828 + #define EARCRX_0_INT_FORCE 0x481c 829 + #define EARCRX_1_INT_STATUS 0x4820 830 + #define EARCRX_1_INT_MASK_N 0x4824 831 + #define EARCRX_1_INT_CLEAR 0x4828 832 + #define EARCRX_1_INT_FORCE 0x482c 833 + 834 + #endif /* __DW_HDMI_QP_H__ */
+32
include/drm/bridge/dw_hdmi_qp.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 + /* 3 + * Copyright (c) 2021-2022 Rockchip Electronics Co., Ltd. 4 + * Copyright (c) 2024 Collabora Ltd. 5 + */ 6 + 7 + #ifndef __DW_HDMI_QP__ 8 + #define __DW_HDMI_QP__ 9 + 10 + struct device; 11 + struct drm_encoder; 12 + struct dw_hdmi_qp; 13 + struct platform_device; 14 + 15 + struct dw_hdmi_qp_phy_ops { 16 + int (*init)(struct dw_hdmi_qp *hdmi, void *data); 17 + void (*disable)(struct dw_hdmi_qp *hdmi, void *data); 18 + enum drm_connector_status (*read_hpd)(struct dw_hdmi_qp *hdmi, void *data); 19 + void (*setup_hpd)(struct dw_hdmi_qp *hdmi, void *data); 20 + }; 21 + 22 + struct dw_hdmi_qp_plat_data { 23 + const struct dw_hdmi_qp_phy_ops *phy_ops; 24 + void *phy_data; 25 + int main_irq; 26 + }; 27 + 28 + struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev, 29 + struct drm_encoder *encoder, 30 + const struct dw_hdmi_qp_plat_data *plat_data); 31 + void dw_hdmi_qp_resume(struct device *dev, struct dw_hdmi_qp *hdmi); 32 + #endif /* __DW_HDMI_QP__ */