1*4882a593Smuzhiyun /**
2*4882a593Smuzhiyun * Copyright 2013 Freescale Semiconductor
3*4882a593Smuzhiyun * Author: Mingkai Hu <Mingkai.hu@freescale.com>
4*4882a593Smuzhiyun * Po Liu <Po.Liu@freescale.com>
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * This file provides support for the board-specific CPLD used on some Freescale
9*4882a593Smuzhiyun * reference boards.
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * The following macros need to be defined:
12*4882a593Smuzhiyun *
13*4882a593Smuzhiyun * CONFIG_SYS_CPLD_BASE - The virtual address of the base of the
14*4882a593Smuzhiyun * CPLD register map
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun */
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #include <common.h>
19*4882a593Smuzhiyun #include <command.h>
20*4882a593Smuzhiyun #include <asm/io.h>
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #include "cpld.h"
23*4882a593Smuzhiyun /**
24*4882a593Smuzhiyun * Set the boot bank to the alternate bank
25*4882a593Smuzhiyun */
cpld_set_altbank(u8 banksel)26*4882a593Smuzhiyun void cpld_set_altbank(u8 banksel)
27*4882a593Smuzhiyun {
28*4882a593Smuzhiyun struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE);
29*4882a593Smuzhiyun u8 reg11;
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun reg11 = in_8(&cpld_data->flhcsr);
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun switch (banksel) {
34*4882a593Smuzhiyun case 1:
35*4882a593Smuzhiyun out_8(&cpld_data->flhcsr, (reg11 & CPLD_BANKSEL_MASK)
36*4882a593Smuzhiyun | CPLD_BANKSEL_EN | CPLD_SELECT_BANK1);
37*4882a593Smuzhiyun break;
38*4882a593Smuzhiyun case 2:
39*4882a593Smuzhiyun out_8(&cpld_data->flhcsr, (reg11 & CPLD_BANKSEL_MASK)
40*4882a593Smuzhiyun | CPLD_BANKSEL_EN | CPLD_SELECT_BANK2);
41*4882a593Smuzhiyun break;
42*4882a593Smuzhiyun case 3:
43*4882a593Smuzhiyun out_8(&cpld_data->flhcsr, (reg11 & CPLD_BANKSEL_MASK)
44*4882a593Smuzhiyun | CPLD_BANKSEL_EN | CPLD_SELECT_BANK3);
45*4882a593Smuzhiyun break;
46*4882a593Smuzhiyun case 4:
47*4882a593Smuzhiyun out_8(&cpld_data->flhcsr, (reg11 & CPLD_BANKSEL_MASK)
48*4882a593Smuzhiyun | CPLD_BANKSEL_EN | CPLD_SELECT_BANK4);
49*4882a593Smuzhiyun break;
50*4882a593Smuzhiyun default:
51*4882a593Smuzhiyun printf("Invalid value! [1-4]\n");
52*4882a593Smuzhiyun return;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun udelay(100);
56*4882a593Smuzhiyun do_reset(NULL, 0, 0, NULL);
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun /**
60*4882a593Smuzhiyun * Set the boot bank to the default bank
61*4882a593Smuzhiyun */
cpld_set_defbank(void)62*4882a593Smuzhiyun void cpld_set_defbank(void)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun cpld_set_altbank(4);
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun #ifdef DEBUG
cpld_dump_regs(void)68*4882a593Smuzhiyun static void cpld_dump_regs(void)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE);
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun printf("chipid1 = 0x%02x\n", in_8(&cpld_data->chipid1));
73*4882a593Smuzhiyun printf("chipid2 = 0x%02x\n", in_8(&cpld_data->chipid2));
74*4882a593Smuzhiyun printf("hwver = 0x%02x\n", in_8(&cpld_data->hwver));
75*4882a593Smuzhiyun printf("cpldver = 0x%02x\n", in_8(&cpld_data->cpldver));
76*4882a593Smuzhiyun printf("rstcon = 0x%02x\n", in_8(&cpld_data->rstcon));
77*4882a593Smuzhiyun printf("flhcsr = 0x%02x\n", in_8(&cpld_data->flhcsr));
78*4882a593Smuzhiyun printf("wdcsr = 0x%02x\n", in_8(&cpld_data->wdcsr));
79*4882a593Smuzhiyun printf("wdkick = 0x%02x\n", in_8(&cpld_data->wdkick));
80*4882a593Smuzhiyun printf("fancsr = 0x%02x\n", in_8(&cpld_data->fancsr));
81*4882a593Smuzhiyun printf("ledcsr = 0x%02x\n", in_8(&cpld_data->ledcsr));
82*4882a593Smuzhiyun printf("misc = 0x%02x\n", in_8(&cpld_data->misccsr));
83*4882a593Smuzhiyun printf("bootor = 0x%02x\n", in_8(&cpld_data->bootor));
84*4882a593Smuzhiyun printf("bootcfg1 = 0x%02x\n", in_8(&cpld_data->bootcfg1));
85*4882a593Smuzhiyun printf("bootcfg2 = 0x%02x\n", in_8(&cpld_data->bootcfg2));
86*4882a593Smuzhiyun printf("bootcfg3 = 0x%02x\n", in_8(&cpld_data->bootcfg3));
87*4882a593Smuzhiyun printf("bootcfg4 = 0x%02x\n", in_8(&cpld_data->bootcfg4));
88*4882a593Smuzhiyun putc('\n');
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun #endif
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun #ifndef CONFIG_SPL_BUILD
cpld_cmd(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])93*4882a593Smuzhiyun int cpld_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun int rc = 0;
96*4882a593Smuzhiyun unsigned char value;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun if (argc <= 1)
99*4882a593Smuzhiyun return cmd_usage(cmdtp);
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun if (strcmp(argv[1], "reset") == 0) {
102*4882a593Smuzhiyun if (!strcmp(argv[2], "altbank") && argv[3]) {
103*4882a593Smuzhiyun value = (u8)simple_strtoul(argv[3], NULL, 16);
104*4882a593Smuzhiyun cpld_set_altbank(value);
105*4882a593Smuzhiyun } else if (!argv[2])
106*4882a593Smuzhiyun cpld_set_defbank();
107*4882a593Smuzhiyun else
108*4882a593Smuzhiyun cmd_usage(cmdtp);
109*4882a593Smuzhiyun #ifdef DEBUG
110*4882a593Smuzhiyun } else if (strcmp(argv[1], "dump") == 0) {
111*4882a593Smuzhiyun cpld_dump_regs();
112*4882a593Smuzhiyun #endif
113*4882a593Smuzhiyun } else
114*4882a593Smuzhiyun rc = cmd_usage(cmdtp);
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun return rc;
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun U_BOOT_CMD(
120*4882a593Smuzhiyun cpld_cmd, CONFIG_SYS_MAXARGS, 1, cpld_cmd,
121*4882a593Smuzhiyun "Reset the board using the CPLD sequencer",
122*4882a593Smuzhiyun "reset - hard reset to default bank 4\n"
123*4882a593Smuzhiyun "cpld_cmd reset altbank [bank]- reset to alternate bank\n"
124*4882a593Smuzhiyun " - [bank] bank value select 1-4\n"
125*4882a593Smuzhiyun " - bank 1 on the flash 0x0000000~0x0ffffff\n"
126*4882a593Smuzhiyun " - bank 2 on the flash 0x1000000~0x1ffffff\n"
127*4882a593Smuzhiyun " - bank 3 on the flash 0x2000000~0x2ffffff\n"
128*4882a593Smuzhiyun " - bank 4 on the flash 0x3000000~0x3ffffff\n"
129*4882a593Smuzhiyun #ifdef DEBUG
130*4882a593Smuzhiyun "cpld_cmd dump - display the CPLD registers\n"
131*4882a593Smuzhiyun #endif
132*4882a593Smuzhiyun );
133*4882a593Smuzhiyun #endif
134