xref: /rk3399_rockchip-uboot/board/freescale/ls1046ardb/cpld.c (revision 0675f992dbf4a785a05a1baf149c2bce6aa5fe90)
1dd02936fSMingkai Hu /*
2dd02936fSMingkai Hu  * Copyright 2016 Freescale Semiconductor
3dd02936fSMingkai Hu  *
4dd02936fSMingkai Hu  * SPDX-License-Identifier:	GPL-2.0+
5dd02936fSMingkai Hu  *
6dd02936fSMingkai Hu  * Freescale LS1046ARDB board-specific CPLD controlling supports.
7dd02936fSMingkai Hu  */
8dd02936fSMingkai Hu 
9dd02936fSMingkai Hu #include <common.h>
10dd02936fSMingkai Hu #include <command.h>
11dd02936fSMingkai Hu #include <asm/io.h>
12dd02936fSMingkai Hu #include "cpld.h"
13dd02936fSMingkai Hu 
cpld_read(unsigned int reg)14dd02936fSMingkai Hu u8 cpld_read(unsigned int reg)
15dd02936fSMingkai Hu {
16dd02936fSMingkai Hu 	void *p = (void *)CONFIG_SYS_CPLD_BASE;
17dd02936fSMingkai Hu 
18dd02936fSMingkai Hu 	return in_8(p + reg);
19dd02936fSMingkai Hu }
20dd02936fSMingkai Hu 
cpld_write(unsigned int reg,u8 value)21dd02936fSMingkai Hu void cpld_write(unsigned int reg, u8 value)
22dd02936fSMingkai Hu {
23dd02936fSMingkai Hu 	void *p = (void *)CONFIG_SYS_CPLD_BASE;
24dd02936fSMingkai Hu 
25dd02936fSMingkai Hu 	out_8(p + reg, value);
26dd02936fSMingkai Hu }
27dd02936fSMingkai Hu 
28dd02936fSMingkai Hu /* Set the boot bank to the alternate bank */
cpld_set_altbank(void)29dd02936fSMingkai Hu void cpld_set_altbank(void)
30dd02936fSMingkai Hu {
31dd02936fSMingkai Hu 	u16 reg = CPLD_CFG_RCW_SRC_QSPI;
32dd02936fSMingkai Hu 	u8 reg4 = CPLD_READ(soft_mux_on);
33dd02936fSMingkai Hu 	u8 reg5 = (u8)(reg >> 1);
34dd02936fSMingkai Hu 	u8 reg6 = (u8)(reg & 1);
35dd02936fSMingkai Hu 	u8 reg7 = CPLD_READ(vbank);
36dd02936fSMingkai Hu 
37dd02936fSMingkai Hu 	cpld_rev_bit(&reg5);
38dd02936fSMingkai Hu 
39dd02936fSMingkai Hu 	CPLD_WRITE(soft_mux_on, reg4 | CPLD_SW_MUX_BANK_SEL | 1);
40dd02936fSMingkai Hu 
41dd02936fSMingkai Hu 	CPLD_WRITE(cfg_rcw_src1, reg5);
42dd02936fSMingkai Hu 	CPLD_WRITE(cfg_rcw_src2, reg6);
43dd02936fSMingkai Hu 
44dd02936fSMingkai Hu 	reg7 = (reg7 & ~CPLD_BANK_SEL_MASK) | CPLD_BANK_SEL_ALTBANK;
45dd02936fSMingkai Hu 	CPLD_WRITE(vbank, reg7);
46dd02936fSMingkai Hu 
47dd02936fSMingkai Hu 	CPLD_WRITE(system_rst, 1);
48dd02936fSMingkai Hu }
49dd02936fSMingkai Hu 
50dd02936fSMingkai Hu /* Set the boot bank to the default bank */
cpld_set_defbank(void)51dd02936fSMingkai Hu void cpld_set_defbank(void)
52dd02936fSMingkai Hu {
53dd02936fSMingkai Hu 	u16 reg = CPLD_CFG_RCW_SRC_QSPI;
54dd02936fSMingkai Hu 	u8 reg4 = CPLD_READ(soft_mux_on);
55dd02936fSMingkai Hu 	u8 reg5 = (u8)(reg >> 1);
56dd02936fSMingkai Hu 	u8 reg6 = (u8)(reg & 1);
57dd02936fSMingkai Hu 
58dd02936fSMingkai Hu 	cpld_rev_bit(&reg5);
59dd02936fSMingkai Hu 
60dd02936fSMingkai Hu 	CPLD_WRITE(soft_mux_on, reg4 | CPLD_SW_MUX_BANK_SEL | 1);
61dd02936fSMingkai Hu 
62dd02936fSMingkai Hu 	CPLD_WRITE(cfg_rcw_src1, reg5);
63dd02936fSMingkai Hu 	CPLD_WRITE(cfg_rcw_src2, reg6);
64dd02936fSMingkai Hu 
65dd02936fSMingkai Hu 	CPLD_WRITE(vbank, 0);
66dd02936fSMingkai Hu 
67dd02936fSMingkai Hu 	CPLD_WRITE(system_rst, 1);
68dd02936fSMingkai Hu }
69dd02936fSMingkai Hu 
cpld_set_sd(void)70dd02936fSMingkai Hu void cpld_set_sd(void)
71dd02936fSMingkai Hu {
72dd02936fSMingkai Hu 	u16 reg = CPLD_CFG_RCW_SRC_SD;
73dd02936fSMingkai Hu 	u8 reg5 = (u8)(reg >> 1);
74dd02936fSMingkai Hu 	u8 reg6 = (u8)(reg & 1);
75dd02936fSMingkai Hu 
76dd02936fSMingkai Hu 	cpld_rev_bit(&reg5);
77dd02936fSMingkai Hu 
78dd02936fSMingkai Hu 	CPLD_WRITE(soft_mux_on, 1);
79dd02936fSMingkai Hu 
80dd02936fSMingkai Hu 	CPLD_WRITE(cfg_rcw_src1, reg5);
81dd02936fSMingkai Hu 	CPLD_WRITE(cfg_rcw_src2, reg6);
82dd02936fSMingkai Hu 
83dd02936fSMingkai Hu 	CPLD_WRITE(system_rst, 1);
84dd02936fSMingkai Hu }
85*6424577bSHou Zhiqiang 
cpld_select_core_volt(bool en_0v9)86*6424577bSHou Zhiqiang void cpld_select_core_volt(bool en_0v9)
87*6424577bSHou Zhiqiang {
88*6424577bSHou Zhiqiang 	u8 reg17 = en_0v9;
89*6424577bSHou Zhiqiang 
90*6424577bSHou Zhiqiang 	CPLD_WRITE(vdd_en, 1);
91*6424577bSHou Zhiqiang 	CPLD_WRITE(vdd_sel, reg17);
92*6424577bSHou Zhiqiang }
93*6424577bSHou Zhiqiang 
94dd02936fSMingkai Hu #ifdef DEBUG
cpld_dump_regs(void)95dd02936fSMingkai Hu static void cpld_dump_regs(void)
96dd02936fSMingkai Hu {
97dd02936fSMingkai Hu 	printf("cpld_ver	= %x\n", CPLD_READ(cpld_ver));
98dd02936fSMingkai Hu 	printf("cpld_ver_sub	= %x\n", CPLD_READ(cpld_ver_sub));
99dd02936fSMingkai Hu 	printf("pcba_ver	= %x\n", CPLD_READ(pcba_ver));
100dd02936fSMingkai Hu 	printf("soft_mux_on	= %x\n", CPLD_READ(soft_mux_on));
101dd02936fSMingkai Hu 	printf("cfg_rcw_src1	= %x\n", CPLD_READ(cfg_rcw_src1));
102dd02936fSMingkai Hu 	printf("cfg_rcw_src2	= %x\n", CPLD_READ(cfg_rcw_src2));
103dd02936fSMingkai Hu 	printf("vbank		= %x\n", CPLD_READ(vbank));
104dd02936fSMingkai Hu 	printf("sysclk_sel	= %x\n", CPLD_READ(sysclk_sel));
105dd02936fSMingkai Hu 	printf("uart_sel	= %x\n", CPLD_READ(uart_sel));
106dd02936fSMingkai Hu 	printf("sd1refclk_sel	= %x\n", CPLD_READ(sd1refclk_sel));
107dd02936fSMingkai Hu 	printf("rgmii_1588_sel	= %x\n", CPLD_READ(rgmii_1588_sel));
108dd02936fSMingkai Hu 	printf("1588_clk_sel	= %x\n", CPLD_READ(reg_1588_clk_sel));
109dd02936fSMingkai Hu 	printf("status_led	= %x\n", CPLD_READ(status_led));
110dd02936fSMingkai Hu 	printf("sd_emmc		= %x\n", CPLD_READ(sd_emmc));
111dd02936fSMingkai Hu 	printf("vdd_en		= %x\n", CPLD_READ(vdd_en));
112dd02936fSMingkai Hu 	printf("vdd_sel		= %x\n", CPLD_READ(vdd_sel));
113dd02936fSMingkai Hu 	putc('\n');
114dd02936fSMingkai Hu }
115dd02936fSMingkai Hu #endif
116dd02936fSMingkai Hu 
cpld_rev_bit(unsigned char * value)117dd02936fSMingkai Hu void cpld_rev_bit(unsigned char *value)
118dd02936fSMingkai Hu {
119dd02936fSMingkai Hu 	u8 rev_val, val;
120dd02936fSMingkai Hu 	int i;
121dd02936fSMingkai Hu 
122dd02936fSMingkai Hu 	val = *value;
123dd02936fSMingkai Hu 	rev_val = val & 1;
124dd02936fSMingkai Hu 	for (i = 1; i <= 7; i++) {
125dd02936fSMingkai Hu 		val >>= 1;
126dd02936fSMingkai Hu 		rev_val <<= 1;
127dd02936fSMingkai Hu 		rev_val |= val & 1;
128dd02936fSMingkai Hu 	}
129dd02936fSMingkai Hu 
130dd02936fSMingkai Hu 	*value = rev_val;
131dd02936fSMingkai Hu }
132dd02936fSMingkai Hu 
do_cpld(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])133dd02936fSMingkai Hu int do_cpld(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
134dd02936fSMingkai Hu {
135dd02936fSMingkai Hu 	int rc = 0;
136dd02936fSMingkai Hu 
137dd02936fSMingkai Hu 	if (argc <= 1)
138dd02936fSMingkai Hu 		return cmd_usage(cmdtp);
139dd02936fSMingkai Hu 
140dd02936fSMingkai Hu 	if (strcmp(argv[1], "reset") == 0) {
141dd02936fSMingkai Hu 		if (strcmp(argv[2], "altbank") == 0)
142dd02936fSMingkai Hu 			cpld_set_altbank();
143dd02936fSMingkai Hu 		else if (strcmp(argv[2], "sd") == 0)
144dd02936fSMingkai Hu 			cpld_set_sd();
145dd02936fSMingkai Hu 		else
146dd02936fSMingkai Hu 			cpld_set_defbank();
147dd02936fSMingkai Hu #ifdef DEBUG
148dd02936fSMingkai Hu 	} else if (strcmp(argv[1], "dump") == 0) {
149dd02936fSMingkai Hu 		cpld_dump_regs();
150dd02936fSMingkai Hu #endif
151dd02936fSMingkai Hu 	} else {
152dd02936fSMingkai Hu 		rc = cmd_usage(cmdtp);
153dd02936fSMingkai Hu 	}
154dd02936fSMingkai Hu 
155dd02936fSMingkai Hu 	return rc;
156dd02936fSMingkai Hu }
157dd02936fSMingkai Hu 
158dd02936fSMingkai Hu U_BOOT_CMD(
159dd02936fSMingkai Hu 	cpld, CONFIG_SYS_MAXARGS, 1, do_cpld,
160dd02936fSMingkai Hu 	"Reset the board or alternate bank",
161dd02936fSMingkai Hu 	"reset: reset to default bank\n"
162dd02936fSMingkai Hu 	"cpld reset altbank: reset to alternate bank\n"
163dd02936fSMingkai Hu 	"cpld reset sd: reset to boot from SD card\n"
164dd02936fSMingkai Hu #ifdef DEBUG
165dd02936fSMingkai Hu 	"cpld dump - display the CPLD registers\n"
166dd02936fSMingkai Hu #endif
167dd02936fSMingkai Hu );
168