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(®5);
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(®5);
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(®5);
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