#only for internal testing
ccflags-y += -DOTM_HDMI_UNIT_TEST
+#enable HDCP
+ccflags-y += -DOTM_HDMI_HDCP_ENABLE
+
ifeq ($(CONFIG_MDFD_HDMI_GREENRIDGE),y)
ccflags-y += \
-I$(srctree)/$(src)/drv/otm_hdmi/pil/specific/oktl \
/*OTM_HDMI_FIXME: this should be from get attribute interface*/
#define OTM_HDMI_I2C_ADAPTER_NUM 8
+#define OTM_HDMI_MAX_DDC_WRITE_SIZE 20
#define SWITCH_DEV_HDMI_NAME "hdmi"
#define SWITCH_DEV_DVI_NAME "dvi"
int size)
{
struct i2c_adapter *adapter = i2c_get_adapter(OTM_HDMI_I2C_ADAPTER_NUM);
- struct i2c_msg msgs[] = {
- {
- .addr = i2c_addr,
- .flags = 0,
- .len = 1,
- .buf = &offset,
- }, {
- .addr = i2c_addr,
- .flags = ((read) ? I2C_M_RD : 0),
- .len = size,
- .buf = buffer,
- }
- };
+ struct i2c_msg msgs[2];
+ int num_of_msgs = 0;
+ uint8_t wr_buffer[OTM_HDMI_MAX_DDC_WRITE_SIZE];
+
+ /* Use one i2c message to write and two to read as some
+ * monitors don't handle two write messages properly
+ */
+ if (read) {
+ msgs[0].addr = i2c_addr,
+ msgs[0].flags = 0,
+ msgs[0].len = 1,
+ msgs[0].buf = &offset,
+
+ msgs[1].addr = i2c_addr,
+ msgs[1].flags = ((read) ? I2C_M_RD : 0),
+ msgs[1].len = size,
+ msgs[1].buf = buffer,
+
+ num_of_msgs = 2;
+ } else {
+ BUG_ON(size + 1 > OTM_HDMI_MAX_DDC_WRITE_SIZE);
+
+ wr_buffer[0] = offset;
+ memcpy(&wr_buffer[1], buffer, size);
+
+ msgs[0].addr = i2c_addr,
+ msgs[0].flags = 0,
+ msgs[0].len = size + 1,
+ msgs[0].buf = wr_buffer,
+
+ num_of_msgs = 1;
+ }
- if (adapter != NULL && i2c_transfer(adapter, msgs, 2) == 2)
+ if (adapter != NULL && i2c_transfer(adapter, msgs, num_of_msgs) ==
+ num_of_msgs)
return 1;
return 0;
aksv != NULL && aksv_size == HDCP_KSV_SIZE) {
if (hdcp_ddc_write(HDCP_RX_AN_ADDR, an, HDCP_AN_SIZE) ==
true) {
+ /* wait 20ms for i2c write for An to complete */
+ msleep(20);
if (hdcp_ddc_write(HDCP_RX_AKSV_ADDR, aksv,
HDCP_KSV_SIZE) == true)
ret = true;
pr_debug("hdcp: bksv: %02x%02x%02x%02x%02x\n",
bksv[0], bksv[1], bksv[2], bksv[3], bksv[4]);
+ /* wait 20ms for i2c read for bksv to complete */
+ msleep(20);
+
if (hdcp_read_bcaps(&bcaps.value) == false)
return false;
pr_debug("hdcp: bcaps: %x\n", bcaps.value);
+ /* wait 20ms for i2c read for bcaps to complete */
+ msleep(20);
+
/* Read BSTATUS */
if (hdcp_read_bstatus(&bstatus.value) == false)
return false;
pr_debug("hdcp: auth started\n");
- /* Wait for 100ms */
- msleep_interruptible(100);
+ /* Wait for 120ms before reading R0' */
+ msleep(120);
/* Check if R0 Ready */
retry = 20;
do {
if (ipil_hdcp_is_r0_ready() == true)
break;
- msleep_interruptible(5);
+ msleep(5);
retry--;
} while (retry);