From e3e12f52b214121840b44c91de5b3e5af5d3eb84 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 03:04:41 +0000
Subject: [PATCH] rk3568 rt init

---
 kernel/drivers/media/cec/cec-adap.c |   50 ++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/kernel/drivers/media/cec/cec-adap.c b/kernel/drivers/media/cec/cec-adap.c
index a77f961..efb6dfd 100644
--- a/kernel/drivers/media/cec/cec-adap.c
+++ b/kernel/drivers/media/cec/cec-adap.c
@@ -4,7 +4,7 @@
  *
  * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
  */
-
+#include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/module.h>
@@ -457,7 +457,12 @@
 
 		if (adap->transmit_in_progress) {
 			int err;
+			/* in rk platform 400ms is enough */
+			int time_out_ms = 400;
 
+			/* poll msg only need 100ms */
+			if (adap->transmitting && adap->transmitting->msg.len == 1)
+				time_out_ms = 100;
 			/*
 			 * We are transmitting a message, so add a timeout
 			 * to prevent the state machine to get stuck waiting
@@ -471,7 +476,7 @@
 				kthread_should_stop() ||
 				(!adap->transmit_in_progress &&
 				 !list_empty(&adap->transmit_queue)),
-				msecs_to_jiffies(CEC_XFER_TIMEOUT_MS));
+				msecs_to_jiffies(time_out_ms));
 			timeout = err == 0;
 		} else {
 			/* Otherwise we just wait for something to happen. */
@@ -532,19 +537,11 @@
 		adap->transmitting = data;
 
 		/*
-		 * Suggested number of attempts as per the CEC 2.0 spec:
-		 * 4 attempts is the default, except for 'secondary poll
-		 * messages', i.e. poll messages not sent during the adapter
-		 * configuration phase when it allocates logical addresses.
+		 * The number of retries is not set before the first sending,
+		 * but is set according to the actual sending result.
 		 */
-		if (data->msg.len == 1 && adap->is_configured)
-			attempts = 2;
-		else
-#ifdef CONFIG_ANDROID
-			attempts = 1;
-#else
-			attempts = 4;
-#endif
+		attempts = 0;
+
 		/* Set the suggested signal free time */
 		if (data->attempts) {
 			/* should be >= 3 data bit periods for a retry */
@@ -610,6 +607,28 @@
 		adap->transmit_in_progress = false;
 		goto wake_thread;
 	}
+
+	if (!(status & CEC_TX_STATUS_OK)) {
+		/* poll message is prefer to send twice */
+		if (nack_cnt && data->msg.len == 1) {
+			/* first send is successful or recover from bus busy */
+			if (!data->attempts || data->attempts > 2)
+				data->attempts = 2;
+			usleep_range(200, 300);
+		/*
+		 * If cec bus is busy, need retry.
+		 * Especially when TV wakes up STB, TV will
+		 * send cec messages then occupy cec bus.
+		 * The longest cec message takes more than 300 ms to send,
+		 * so retry in 400 ms.
+		 */
+		} else {
+			if (!data->attempts)
+				data->attempts = 200;
+			usleep_range(2000, 2200);
+		}
+	}
+
 	adap->transmit_in_progress = false;
 
 	msg = &data->msg;
@@ -1362,6 +1381,7 @@
 		unsigned int type = las->log_addr_type[i];
 		const u8 *la_list;
 		u8 last_la;
+		const u8 invalid_log_addrs[] = { CEC_LOG_ADDR_INVALID };
 
 		/*
 		 * The TV functionality can only map to physical address 0.
@@ -1386,6 +1406,8 @@
 		if (err < 0)
 			goto unconfigure;
 
+		la_list = invalid_log_addrs;
+
 		for (j = 0; la_list[j] != CEC_LOG_ADDR_INVALID; j++) {
 			/* Tried this one already, skip it */
 			if (la_list[j] == last_la)

--
Gitblit v1.6.2