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