1*ab06b236SChunhe Lan /** 2*ab06b236SChunhe Lan * Copyright 2014 Freescale Semiconductor 3*ab06b236SChunhe Lan * 4*ab06b236SChunhe Lan * Author: Chunhe Lan <Chunhe.Lan@freescale.com> 5*ab06b236SChunhe Lan * 6*ab06b236SChunhe Lan * SPDX-License-Identifier: GPL-2.0+ 7*ab06b236SChunhe Lan * 8*ab06b236SChunhe Lan * This file provides support for the board-specific CPLD used on some Freescale 9*ab06b236SChunhe Lan * reference boards. 10*ab06b236SChunhe Lan * 11*ab06b236SChunhe Lan * The following macros need to be defined: 12*ab06b236SChunhe Lan * 13*ab06b236SChunhe Lan * CONFIG_SYS_CPLD_BASE - The virtual address of the base of the 14*ab06b236SChunhe Lan * CPLD register map 15*ab06b236SChunhe Lan * 16*ab06b236SChunhe Lan */ 17*ab06b236SChunhe Lan 18*ab06b236SChunhe Lan #include <common.h> 19*ab06b236SChunhe Lan #include <command.h> 20*ab06b236SChunhe Lan #include <asm/io.h> 21*ab06b236SChunhe Lan 22*ab06b236SChunhe Lan #include "cpld.h" 23*ab06b236SChunhe Lan 24*ab06b236SChunhe Lan u8 cpld_read(unsigned int reg) 25*ab06b236SChunhe Lan { 26*ab06b236SChunhe Lan void *p = (void *)CONFIG_SYS_CPLD_BASE; 27*ab06b236SChunhe Lan 28*ab06b236SChunhe Lan return in_8(p + reg); 29*ab06b236SChunhe Lan } 30*ab06b236SChunhe Lan 31*ab06b236SChunhe Lan void cpld_write(unsigned int reg, u8 value) 32*ab06b236SChunhe Lan { 33*ab06b236SChunhe Lan void *p = (void *)CONFIG_SYS_CPLD_BASE; 34*ab06b236SChunhe Lan 35*ab06b236SChunhe Lan out_8(p + reg, value); 36*ab06b236SChunhe Lan } 37*ab06b236SChunhe Lan 38*ab06b236SChunhe Lan /** 39*ab06b236SChunhe Lan * Set the boot bank to the alternate bank 40*ab06b236SChunhe Lan */ 41*ab06b236SChunhe Lan void cpld_set_altbank(void) 42*ab06b236SChunhe Lan { 43*ab06b236SChunhe Lan u8 val, curbank, altbank, override; 44*ab06b236SChunhe Lan 45*ab06b236SChunhe Lan val = CPLD_READ(vbank); 46*ab06b236SChunhe Lan curbank = val & CPLD_BANK_SEL_MASK; 47*ab06b236SChunhe Lan 48*ab06b236SChunhe Lan switch (curbank) { 49*ab06b236SChunhe Lan case CPLD_SELECT_BANK0: 50*ab06b236SChunhe Lan altbank = CPLD_SELECT_BANK4; 51*ab06b236SChunhe Lan CPLD_WRITE(vbank, altbank); 52*ab06b236SChunhe Lan override = CPLD_READ(software_on); 53*ab06b236SChunhe Lan CPLD_WRITE(software_on, override | CPLD_BANK_SEL_EN); 54*ab06b236SChunhe Lan CPLD_WRITE(sys_reset, CPLD_SYSTEM_RESET); 55*ab06b236SChunhe Lan break; 56*ab06b236SChunhe Lan case CPLD_SELECT_BANK4: 57*ab06b236SChunhe Lan altbank = CPLD_SELECT_BANK0; 58*ab06b236SChunhe Lan CPLD_WRITE(vbank, altbank); 59*ab06b236SChunhe Lan override = CPLD_READ(software_on); 60*ab06b236SChunhe Lan CPLD_WRITE(software_on, override | CPLD_BANK_SEL_EN); 61*ab06b236SChunhe Lan CPLD_WRITE(sys_reset, CPLD_SYSTEM_RESET); 62*ab06b236SChunhe Lan break; 63*ab06b236SChunhe Lan default: 64*ab06b236SChunhe Lan printf("CPLD Altbank Fail: Invalid value!\n"); 65*ab06b236SChunhe Lan return; 66*ab06b236SChunhe Lan } 67*ab06b236SChunhe Lan } 68*ab06b236SChunhe Lan 69*ab06b236SChunhe Lan /** 70*ab06b236SChunhe Lan * Set the boot bank to the default bank 71*ab06b236SChunhe Lan */ 72*ab06b236SChunhe Lan void cpld_set_defbank(void) 73*ab06b236SChunhe Lan { 74*ab06b236SChunhe Lan u8 val; 75*ab06b236SChunhe Lan 76*ab06b236SChunhe Lan val = CPLD_DEFAULT_BANK; 77*ab06b236SChunhe Lan 78*ab06b236SChunhe Lan CPLD_WRITE(global_reset, val); 79*ab06b236SChunhe Lan } 80*ab06b236SChunhe Lan 81*ab06b236SChunhe Lan #ifdef DEBUG 82*ab06b236SChunhe Lan static void cpld_dump_regs(void) 83*ab06b236SChunhe Lan { 84*ab06b236SChunhe Lan printf("chip_id1 = 0x%02x\n", CPLD_READ(chip_id1)); 85*ab06b236SChunhe Lan printf("chip_id2 = 0x%02x\n", CPLD_READ(chip_id2)); 86*ab06b236SChunhe Lan printf("sw_maj_ver = 0x%02x\n", CPLD_READ(sw_maj_ver)); 87*ab06b236SChunhe Lan printf("sw_min_ver = 0x%02x\n", CPLD_READ(sw_min_ver)); 88*ab06b236SChunhe Lan printf("hw_ver = 0x%02x\n", CPLD_READ(hw_ver)); 89*ab06b236SChunhe Lan printf("software_on = 0x%02x\n", CPLD_READ(software_on)); 90*ab06b236SChunhe Lan printf("cfg_rcw_src = 0x%02x\n", CPLD_READ(cfg_rcw_src)); 91*ab06b236SChunhe Lan printf("res0 = 0x%02x\n", CPLD_READ(res0)); 92*ab06b236SChunhe Lan printf("vbank = 0x%02x\n", CPLD_READ(vbank)); 93*ab06b236SChunhe Lan printf("sw1_sysclk = 0x%02x\n", CPLD_READ(sw1_sysclk)); 94*ab06b236SChunhe Lan printf("sw2_status = 0x%02x\n", CPLD_READ(sw2_status)); 95*ab06b236SChunhe Lan printf("sw3_status = 0x%02x\n", CPLD_READ(sw3_status)); 96*ab06b236SChunhe Lan printf("sw4_status = 0x%02x\n", CPLD_READ(sw4_status)); 97*ab06b236SChunhe Lan printf("sys_reset = 0x%02x\n", CPLD_READ(sys_reset)); 98*ab06b236SChunhe Lan printf("global_reset = 0x%02x\n", CPLD_READ(global_reset)); 99*ab06b236SChunhe Lan printf("res1 = 0x%02x\n", CPLD_READ(res1)); 100*ab06b236SChunhe Lan putc('\n'); 101*ab06b236SChunhe Lan } 102*ab06b236SChunhe Lan #endif 103*ab06b236SChunhe Lan 104*ab06b236SChunhe Lan #ifndef CONFIG_SPL_BUILD 105*ab06b236SChunhe Lan int do_cpld(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 106*ab06b236SChunhe Lan { 107*ab06b236SChunhe Lan int rc = 0; 108*ab06b236SChunhe Lan 109*ab06b236SChunhe Lan if (argc <= 1) 110*ab06b236SChunhe Lan return cmd_usage(cmdtp); 111*ab06b236SChunhe Lan 112*ab06b236SChunhe Lan if (strcmp(argv[1], "reset") == 0) { 113*ab06b236SChunhe Lan if (strcmp(argv[2], "altbank") == 0) 114*ab06b236SChunhe Lan cpld_set_altbank(); 115*ab06b236SChunhe Lan else 116*ab06b236SChunhe Lan cpld_set_defbank(); 117*ab06b236SChunhe Lan #ifdef DEBUG 118*ab06b236SChunhe Lan } else if (strcmp(argv[1], "dump") == 0) { 119*ab06b236SChunhe Lan cpld_dump_regs(); 120*ab06b236SChunhe Lan #endif 121*ab06b236SChunhe Lan } else 122*ab06b236SChunhe Lan rc = cmd_usage(cmdtp); 123*ab06b236SChunhe Lan 124*ab06b236SChunhe Lan return rc; 125*ab06b236SChunhe Lan } 126*ab06b236SChunhe Lan 127*ab06b236SChunhe Lan U_BOOT_CMD( 128*ab06b236SChunhe Lan cpld, CONFIG_SYS_MAXARGS, 1, do_cpld, 129*ab06b236SChunhe Lan "Reset the board or alternate bank", 130*ab06b236SChunhe Lan "reset - reset to default bank\n" 131*ab06b236SChunhe Lan "cpld reset altbank - reset to alternate bank\n" 132*ab06b236SChunhe Lan #ifdef DEBUG 133*ab06b236SChunhe Lan "cpld dump - display the CPLD registers\n" 134*ab06b236SChunhe Lan #endif 135*ab06b236SChunhe Lan ); 136*ab06b236SChunhe Lan #endif 137