blob: 33323d6376c255871ee746b70728066a1973a62b [file] [log] [blame]
Bo Lv72d0e902023-01-02 14:27:34 +00001// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2/*
3 * Copyright (c) 2019 Amlogic, Inc. All rights reserved.
4 */
5
6#include <common.h>
7#include <command.h>
Bo Lvaa7bc4c2024-03-01 13:43:54 +08008#include <asm/amlogic/arch/io.h>
9#include <asm/amlogic/arch/clock.h>
Bo Lv72d0e902023-01-02 14:27:34 +000010#include <amlogic/aml_cec.h>
Bo Lvaa7bc4c2024-03-01 13:43:54 +080011#include <asm/amlogic/arch/secure_apb.h>
Bo Lv72d0e902023-01-02 14:27:34 +000012
yicheng shenc98e23c2024-09-04 08:45:28 +000013/**
14 * Bit field mask
15 * @param m width
16 * @param n shift
17 */
18#define MSK(m, n) (((1 << (m)) - 1) << (n))
19#define _BIT(n) MSK(1, (n))
20#define writel_bits(mask, val, addr) \
21 writel((readl(addr) & ~(mask)) | (val), addr)
22
Bo Lv72d0e902023-01-02 14:27:34 +000023static void cec_init(int logic_addr, unsigned char fun_cfg)
24{
25#ifndef CONFIG_MESON_T5W
26 unsigned int tmp;
27
28 writel(fun_cfg, SYSCTRL_STATUS_REG0);
29 tmp = readl(SYSCTRL_STATUS_REG1);
30 tmp &= (~0xf0000);
31 tmp |= ((logic_addr & 0xf) << 16);
32 writel(tmp, SYSCTRL_STATUS_REG1);
33 printf("cec func:%#x, parm:%#x\n", readl(SYSCTRL_STATUS_REG0),
34 readl(SYSCTRL_STATUS_REG1));
35#else
36 printf("%s :%d,%#x\n", __func__, logic_addr, fun_cfg);
37 /*cec_hw_init(logic_addr, fun_cfg);*/
38 writel(fun_cfg, P_AO_DEBUG_REG0);
39 writel(logic_addr, AO_DEBUG_REG1);
40 printf("cec func:%#x, parm:%#x\n", readl(P_AO_DEBUG_REG0),
41 readl(AO_DEBUG_REG1));
42#endif
43}
44
45static int do_cec(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
46{
47 int logic_addr = 0;
48 int fun_cfg = 0x2f;
49
50 if (argc >= 2)
51 logic_addr = simple_strtoul(argv[1], NULL, 10);
52 if (argc >= 3)
53 fun_cfg = simple_strtoul(argv[2], NULL, 16);
54
55 printf("logic_addr=0x%x, fun_cfg=0x%x\n",
56 logic_addr, fun_cfg);
57
58 cec_init(logic_addr, (unsigned char)fun_cfg);
59
60 return 0;
61}
62
63U_BOOT_CMD(cec, CONFIG_SYS_MAXARGS, 0, do_cec,
64 "Amlogic cec",
65 " - hdmi cec function\n"
66 " - param: logic addr;fun_cfg\n"
67 "\n"
68);
69
yicheng shenc98e23c2024-09-04 08:45:28 +000070void cec_get_trim_val(void)
71{
yaoyu.xu73100f12024-09-14 13:54:52 +080072 int64_t cec_trim_val;
yicheng shenc98e23c2024-09-04 08:45:28 +000073
74 /* get trim value from efuse, return -1 if not programed */
75 extern int64_t meson_trustzone_efuse_caliItem(const char *str);
76 cec_trim_val = meson_trustzone_efuse_caliItem("odio33");
77 /* cec gpiow 12 enable */
yaoyu.xu73100f12024-09-14 13:54:52 +080078 writel_bits(_BIT(12), 1 << 12, PADCTRL_GPIOW_PULL_EN);
yicheng shenc98e23c2024-09-04 08:45:28 +000079 if (cec_trim_val >= 0) {
yaoyu.xu73100f12024-09-14 13:54:52 +080080 writel_bits(MSK(2, 24), cec_trim_val << 24, PADCTRL_GPIOW_DS);
81 printf("cec trim:0x%llx\n", cec_trim_val);
yicheng shenc98e23c2024-09-04 08:45:28 +000082 } else {
83 printf("no cec trim val!\n");
84 }
85}
86