xref: /OK3568_Linux_fs/u-boot/board/freescale/c29xpcie/cpld.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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