diff options
author | Ray <1458889+Raybuntu@users.noreply.github.com> | 2019-03-29 09:00:55 +0100 |
---|---|---|
committer | Dongjin Kim <tobetter@gmail.com> | 2020-02-13 17:13:40 +0900 |
commit | c699a267dbc23e6a02459284d633c62d41bface4 (patch) | |
tree | 6ca178367276b796527f74e8af6194a1bd9fa28b | |
parent | e7f2b0595cabf603f29305ca11601705b51a3381 (diff) | |
download | u-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.c | 50 | ||||
-rw-r--r-- | board/hardkernel/odroidc4/firmware/scp_task/pwr_ctrl.c | 24 |
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()) |