summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay <1458889+Raybuntu@users.noreply.github.com>2019-03-29 09:00:55 +0100
committerDongjin Kim <tobetter@gmail.com>2020-02-13 17:13:40 +0900
commitc699a267dbc23e6a02459284d633c62d41bface4 (patch)
tree6ca178367276b796527f74e8af6194a1bd9fa28b
parente7f2b0595cabf603f29305ca11601705b51a3381 (diff)
downloadu-boot-odroid-c1-c699a267dbc23e6a02459284d633c62d41bface4.tar.gz
CE: CEC: Add CECB as wakeup src power
Change-Id: Id8c2f640436b085c27477e7cdf396fc728aa924b
-rw-r--r--arch/arm/cpu/armv8/g12a/firmware/scp_task/hdmi_cec_arc.c50
-rw-r--r--board/hardkernel/odroidc4/firmware/scp_task/pwr_ctrl.c24
2 files changed, 48 insertions, 26 deletions
diff --git a/arch/arm/cpu/armv8/g12a/firmware/scp_task/hdmi_cec_arc.c b/arch/arm/cpu/armv8/g12a/firmware/scp_task/hdmi_cec_arc.c
index 8475a9e9f5..498436a717 100644
--- a/arch/arm/cpu/armv8/g12a/firmware/scp_task/hdmi_cec_arc.c
+++ b/arch/arm/cpu/armv8/g12a/firmware/scp_task/hdmi_cec_arc.c
@@ -290,12 +290,14 @@ static int cec_queue_tx_msg(unsigned char *msg, unsigned char len)
static int cec_triggle_tx(unsigned char *msg, unsigned char len)
{
- int i = 0, lock;
+ int i = 0, ret = TX_ERROR;
+ unsigned int reg;
+ unsigned int cnt = 0;
while (1) {
/* send is in process */
- lock = cec_rd_reg(DWC_CECB_LOCK_BUF);
- if (lock) {
+ reg = cec_rd_reg(DWC_CECB_LOCK_BUF);
+ if (reg) {
cec_dbg_prints("rx msg in tx\n");
return -1;
}
@@ -319,23 +321,6 @@ static int cec_triggle_tx(unsigned char *msg, unsigned char len)
/* start send */
cec_wr_reg(DWC_CECB_TX_CNT, len);
cec_set_bits_dwc(DWC_CECB_CTRL, 3, 0, 3);
- return 0;
-}
-
-static int remote_cec_ll_tx(unsigned char *msg, unsigned char len)
-{
- cec_queue_tx_msg(msg, len);
- cec_triggle_tx(msg, len);
-
- return 0;
-}
-
-static int ping_cec_ll_tx(unsigned char *msg, unsigned char len)
-{
- unsigned int reg, ret = 0;
- unsigned int cnt = 0;
-
- remote_cec_ll_tx(msg, len);
while (cec_tx_msgs.queue_idx != cec_tx_msgs.send_idx) {
reg = readl(AO_CECB_INTR_STAT);
@@ -343,32 +328,35 @@ static int ping_cec_ll_tx(unsigned char *msg, unsigned char len)
if (reg & CECB_IRQ_TX_DONE) {
ret = TX_DONE;
cec_tx_msgs.send_idx = (cec_tx_msgs.send_idx + 1) & CEC_TX_MSG_BUF_MASK;
- cec_dbg_prints("ping_cec_tx:TX_DONE\n");
+ cec_dbg_prints("cec_triggle_tx:TX_DONE\n");
break;
}
if (reg & CECB_IRQ_TX_NACK) {
ret = TX_ERROR;
cec_tx_msgs.send_idx = (cec_tx_msgs.send_idx + 1) & CEC_TX_MSG_BUF_MASK;
- cec_dbg_prints("ping_cec_tx:TX_ERROR\n");
+ cec_dbg_prints("cec_triggle_tx:TX_ERROR\n");
break;
}
if (reg & CECB_IRQ_TX_ARB_LOST) {
ret = TX_BUSY;
cec_tx_msgs.send_idx = (cec_tx_msgs.send_idx + 1) & CEC_TX_MSG_BUF_MASK;
- cec_dbg_prints("ping_cec_tx:TX_ABT_LOST\n");
+ cec_dbg_prints("cec_triggle_tx:TX_ABT_LOST\n");
break;
}
if (reg & CECB_IRQ_TX_ERR_INITIATOR) {
ret = TX_BUSY;
cec_tx_msgs.send_idx = (cec_tx_msgs.send_idx + 1) & CEC_TX_MSG_BUF_MASK;
- cec_dbg_prints("ping_cec_tx:TX_ERR_INIT\n");
+ cec_dbg_prints("cec_triggle_tx:TX_ERR_INIT\n");
break;
}
_udelay(500);
+
if (cnt++ > 2000) {
uart_puts("err: tx not finish flag\n");
+ cec_tx_msgs.send_idx = (cec_tx_msgs.send_idx + 1) & CEC_TX_MSG_BUF_MASK;
cec_reset_addr();
+ ret = TX_BUSY;
break;
}
}
@@ -376,6 +364,17 @@ static int ping_cec_ll_tx(unsigned char *msg, unsigned char len)
return ret;
}
+static int remote_cec_ll_tx(unsigned char *msg, unsigned char len)
+{
+ cec_queue_tx_msg(msg, len);
+ return cec_triggle_tx(msg, len);
+}
+
+static int ping_cec_ll_tx(unsigned char *msg, unsigned char len)
+{
+ return remote_cec_ll_tx(msg, len);
+}
+
#define DEVICE_TV 0
#define DEVICE_RECORDER 1
#define DEVICE_RESERVED 2
@@ -691,7 +690,7 @@ unsigned int cec_handler(void)
static int busy_count = 0;
int irq;
- /*dump_cecb_reg();*/
+ dump_cecb_reg();
irq = readl(AO_CECB_INTR_STAT);
writel(irq, AO_CECB_INTR_CLR);
if (irq & CECB_IRQ_RX_EOM) {
@@ -756,7 +755,6 @@ unsigned int cec_handler(void)
}
if (cec_msg.rx_read_pos != cec_msg.rx_write_pos) {
cec_handle_message();
- dump_cecb_reg();
}
return 0;
diff --git a/board/hardkernel/odroidc4/firmware/scp_task/pwr_ctrl.c b/board/hardkernel/odroidc4/firmware/scp_task/pwr_ctrl.c
index 35b4efd2d8..8e8c5a37ca 100644
--- a/board/hardkernel/odroidc4/firmware/scp_task/pwr_ctrl.c
+++ b/board/hardkernel/odroidc4/firmware/scp_task/pwr_ctrl.c
@@ -20,6 +20,9 @@
#include <gpio.h>
#include "pwm_ctrl.h"
+#ifdef CONFIG_CEC_WAKEUP
+#include <cec_tx_reg.h>
+#endif
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
@@ -89,6 +92,10 @@ void get_wakeup_source(void *response, unsigned int suspend_from)
val = (POWER_KEY_WAKEUP_SRC | AUTO_WAKEUP_SRC | REMOTE_WAKEUP_SRC |
RTC_WAKEUP_SRC | BT_WAKEUP_SRC | ETH_PHY_GPIO_SRC);
+#ifdef CONFIG_CEC_WAKEUP
+ val |= CECB_WAKEUP_SRC;
+#endif
+
p->sources = val;
/* Power Key: AO_GPIO[3]*/
@@ -126,8 +133,25 @@ static unsigned int detect_key(unsigned int suspend_from)
saradc_enable();
#endif
init_remote();
+#ifdef CONFIG_CEC_WAKEUP
+ if (hdmi_cec_func_config & 0x1) {
+ remote_cec_hw_reset();
+ cec_node_init();
+ }
+#endif
do {
+#ifdef CONFIG_CEC_WAKEUP
+ if (!cec_msg.log_addr)
+ cec_node_init();
+ else {
+ if (readl(AO_CECB_INTR_STAT) & CECB_IRQ_RX_EOM) {
+ if (cec_power_on_check())
+ exit_reason = CEC_WAKEUP;
+ }
+ }
+#endif
+
if (irq[IRQ_AO_IR_DEC] == IRQ_AO_IR_DEC_NUM) {
irq[IRQ_AO_IR_DEC] = 0xFFFFFFFF;
if (remote_detect_key())