13d98b858SHaiying Wang /* 22feb4af0STimur Tabi * Copyright 2006,2010 Freescale Semiconductor 33d98b858SHaiying Wang * Jeff Brown 43d98b858SHaiying Wang * Srikanth Srinivasan (srikanth.srinivasan@freescale.com) 53d98b858SHaiying Wang * 63d98b858SHaiying Wang * See file CREDITS for list of people who contributed to this 73d98b858SHaiying Wang * project. 83d98b858SHaiying Wang * 93d98b858SHaiying Wang * This program is free software; you can redistribute it and/or 103d98b858SHaiying Wang * modify it under the terms of the GNU General Public License as 113d98b858SHaiying Wang * published by the Free Software Foundation; either version 2 of 123d98b858SHaiying Wang * the License, or (at your option) any later version. 133d98b858SHaiying Wang * 143d98b858SHaiying Wang * This program is distributed in the hope that it will be useful, 153d98b858SHaiying Wang * but WITHOUT ANY WARRANTY; without even the implied warranty of 163d98b858SHaiying Wang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 173d98b858SHaiying Wang * GNU General Public License for more details. 183d98b858SHaiying Wang * 193d98b858SHaiying Wang * You should have received a copy of the GNU General Public License 203d98b858SHaiying Wang * along with this program; if not, write to the Free Software 213d98b858SHaiying Wang * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 223d98b858SHaiying Wang * MA 02111-1307 USA 233d98b858SHaiying Wang */ 243d98b858SHaiying Wang 253d98b858SHaiying Wang #include <common.h> 263d98b858SHaiying Wang #include <command.h> 275a8a163aSAndy Fleming #include <asm/io.h> 28ad8f8687SJon Loeliger 292feb4af0STimur Tabi #define pixis_base (u8 *)PIXIS_BASE 303d98b858SHaiying Wang 313d98b858SHaiying Wang /* 323d98b858SHaiying Wang * Simple board reset. 333d98b858SHaiying Wang */ 343d98b858SHaiying Wang void pixis_reset(void) 353d98b858SHaiying Wang { 36048e7efeSKumar Gala out_8(pixis_base + PIXIS_RST, 0); 373d98b858SHaiying Wang 382feb4af0STimur Tabi while (1); 392feb4af0STimur Tabi } 403d98b858SHaiying Wang 413d98b858SHaiying Wang /* 423d98b858SHaiying Wang * Per table 27, page 58 of MPC8641HPCN spec. 433d98b858SHaiying Wang */ 442feb4af0STimur Tabi static int set_px_sysclk(unsigned long sysclk) 453d98b858SHaiying Wang { 463d98b858SHaiying Wang u8 sysclk_s, sysclk_r, sysclk_v, vclkh, vclkl, sysclk_aux; 473d98b858SHaiying Wang 483d98b858SHaiying Wang switch (sysclk) { 493d98b858SHaiying Wang case 33: 503d98b858SHaiying Wang sysclk_s = 0x04; 513d98b858SHaiying Wang sysclk_r = 0x04; 523d98b858SHaiying Wang sysclk_v = 0x07; 533d98b858SHaiying Wang sysclk_aux = 0x00; 543d98b858SHaiying Wang break; 553d98b858SHaiying Wang case 40: 563d98b858SHaiying Wang sysclk_s = 0x01; 573d98b858SHaiying Wang sysclk_r = 0x1F; 583d98b858SHaiying Wang sysclk_v = 0x20; 593d98b858SHaiying Wang sysclk_aux = 0x01; 603d98b858SHaiying Wang break; 613d98b858SHaiying Wang case 50: 623d98b858SHaiying Wang sysclk_s = 0x01; 633d98b858SHaiying Wang sysclk_r = 0x1F; 643d98b858SHaiying Wang sysclk_v = 0x2A; 653d98b858SHaiying Wang sysclk_aux = 0x02; 663d98b858SHaiying Wang break; 673d98b858SHaiying Wang case 66: 683d98b858SHaiying Wang sysclk_s = 0x01; 693d98b858SHaiying Wang sysclk_r = 0x04; 703d98b858SHaiying Wang sysclk_v = 0x04; 713d98b858SHaiying Wang sysclk_aux = 0x03; 723d98b858SHaiying Wang break; 733d98b858SHaiying Wang case 83: 743d98b858SHaiying Wang sysclk_s = 0x01; 753d98b858SHaiying Wang sysclk_r = 0x1F; 763d98b858SHaiying Wang sysclk_v = 0x4B; 773d98b858SHaiying Wang sysclk_aux = 0x04; 783d98b858SHaiying Wang break; 793d98b858SHaiying Wang case 100: 803d98b858SHaiying Wang sysclk_s = 0x01; 813d98b858SHaiying Wang sysclk_r = 0x1F; 823d98b858SHaiying Wang sysclk_v = 0x5C; 833d98b858SHaiying Wang sysclk_aux = 0x05; 843d98b858SHaiying Wang break; 853d98b858SHaiying Wang case 134: 863d98b858SHaiying Wang sysclk_s = 0x06; 873d98b858SHaiying Wang sysclk_r = 0x1F; 883d98b858SHaiying Wang sysclk_v = 0x3B; 893d98b858SHaiying Wang sysclk_aux = 0x06; 903d98b858SHaiying Wang break; 913d98b858SHaiying Wang case 166: 923d98b858SHaiying Wang sysclk_s = 0x06; 933d98b858SHaiying Wang sysclk_r = 0x1F; 943d98b858SHaiying Wang sysclk_v = 0x4B; 953d98b858SHaiying Wang sysclk_aux = 0x07; 963d98b858SHaiying Wang break; 973d98b858SHaiying Wang default: 983d98b858SHaiying Wang printf("Unsupported SYSCLK frequency.\n"); 993d98b858SHaiying Wang return 0; 1003d98b858SHaiying Wang } 1013d98b858SHaiying Wang 1023d98b858SHaiying Wang vclkh = (sysclk_s << 5) | sysclk_r; 1033d98b858SHaiying Wang vclkl = sysclk_v; 1043d98b858SHaiying Wang 105048e7efeSKumar Gala out_8(pixis_base + PIXIS_VCLKH, vclkh); 106048e7efeSKumar Gala out_8(pixis_base + PIXIS_VCLKL, vclkl); 1073d98b858SHaiying Wang 108048e7efeSKumar Gala out_8(pixis_base + PIXIS_AUX, sysclk_aux); 1093d98b858SHaiying Wang 1103d98b858SHaiying Wang return 1; 1113d98b858SHaiying Wang } 1123d98b858SHaiying Wang 1132feb4af0STimur Tabi /* Set the CFG_SYSPLL bits 1142feb4af0STimur Tabi * 1152feb4af0STimur Tabi * This only has effect if PX_VCFGEN0[SYSPLL]=1, which is true if 1162feb4af0STimur Tabi * read_from_px_regs() is called. 1172feb4af0STimur Tabi */ 1182feb4af0STimur Tabi static int set_px_mpxpll(unsigned long mpxpll) 1193d98b858SHaiying Wang { 1203d98b858SHaiying Wang switch (mpxpll) { 1213d98b858SHaiying Wang case 2: 1223d98b858SHaiying Wang case 4: 1233d98b858SHaiying Wang case 6: 1243d98b858SHaiying Wang case 8: 1253d98b858SHaiying Wang case 10: 1263d98b858SHaiying Wang case 12: 1273d98b858SHaiying Wang case 14: 1283d98b858SHaiying Wang case 16: 1292feb4af0STimur Tabi clrsetbits_8(pixis_base + PIXIS_VSPEED1, 0x1F, mpxpll); 1302feb4af0STimur Tabi return 1; 1312feb4af0STimur Tabi } 1322feb4af0STimur Tabi 1333d98b858SHaiying Wang printf("Unsupported MPXPLL ratio.\n"); 1343d98b858SHaiying Wang return 0; 1353d98b858SHaiying Wang } 1363d98b858SHaiying Wang 1372feb4af0STimur Tabi static int set_px_corepll(unsigned long corepll) 1383d98b858SHaiying Wang { 1393d98b858SHaiying Wang u8 val; 1403d98b858SHaiying Wang 1412feb4af0STimur Tabi switch (corepll) { 1423d98b858SHaiying Wang case 20: 1433d98b858SHaiying Wang val = 0x08; 1443d98b858SHaiying Wang break; 1453d98b858SHaiying Wang case 25: 1463d98b858SHaiying Wang val = 0x0C; 1473d98b858SHaiying Wang break; 1483d98b858SHaiying Wang case 30: 1493d98b858SHaiying Wang val = 0x10; 1503d98b858SHaiying Wang break; 1513d98b858SHaiying Wang case 35: 1523d98b858SHaiying Wang val = 0x1C; 1533d98b858SHaiying Wang break; 1543d98b858SHaiying Wang case 40: 1553d98b858SHaiying Wang val = 0x14; 1563d98b858SHaiying Wang break; 1573d98b858SHaiying Wang case 45: 1583d98b858SHaiying Wang val = 0x0E; 1593d98b858SHaiying Wang break; 1603d98b858SHaiying Wang default: 1613d98b858SHaiying Wang printf("Unsupported COREPLL ratio.\n"); 1623d98b858SHaiying Wang return 0; 1633d98b858SHaiying Wang } 1643d98b858SHaiying Wang 1652feb4af0STimur Tabi clrsetbits_8(pixis_base + PIXIS_VSPEED0, 0x1F, val); 1663d98b858SHaiying Wang return 1; 1673d98b858SHaiying Wang } 1683d98b858SHaiying Wang 1692feb4af0STimur Tabi #ifndef CONFIG_SYS_PIXIS_VCFGEN0_ENABLE 1702feb4af0STimur Tabi #define CONFIG_SYS_PIXIS_VCFGEN0_ENABLE 0x1C 1712feb4af0STimur Tabi #endif 1723d98b858SHaiying Wang 1732feb4af0STimur Tabi /* Tell the PIXIS where to find the COREPLL, MPXPLL, SYSCLK values 1742feb4af0STimur Tabi * 1752feb4af0STimur Tabi * The PIXIS can be programmed to look at either the on-board dip switches 1762feb4af0STimur Tabi * or various other PIXIS registers to determine the values for COREPLL, 1772feb4af0STimur Tabi * MPXPLL, and SYSCLK. 1782feb4af0STimur Tabi * 1792feb4af0STimur Tabi * CONFIG_SYS_PIXIS_VCFGEN0_ENABLE is the value to write to the PIXIS_VCFGEN0 1802feb4af0STimur Tabi * register that tells the pixis to use the various PIXIS register. 1812feb4af0STimur Tabi */ 1822feb4af0STimur Tabi static void read_from_px_regs(int set) 1833d98b858SHaiying Wang { 184048e7efeSKumar Gala u8 tmp = in_8(pixis_base + PIXIS_VCFGEN0); 1853d98b858SHaiying Wang 1863d98b858SHaiying Wang if (set) 1872feb4af0STimur Tabi tmp = tmp | CONFIG_SYS_PIXIS_VCFGEN0_ENABLE; 1883d98b858SHaiying Wang else 1892feb4af0STimur Tabi tmp = tmp & ~CONFIG_SYS_PIXIS_VCFGEN0_ENABLE; 1902feb4af0STimur Tabi 191048e7efeSKumar Gala out_8(pixis_base + PIXIS_VCFGEN0, tmp); 1923d98b858SHaiying Wang } 1933d98b858SHaiying Wang 1942feb4af0STimur Tabi /* CONFIG_SYS_PIXIS_VBOOT_ENABLE is the value to write to the PX_VCFGEN1 1952feb4af0STimur Tabi * register that tells the pixis to use the PX_VBOOT[LBMAP] register. 1962feb4af0STimur Tabi */ 1972feb4af0STimur Tabi #ifndef CONFIG_SYS_PIXIS_VBOOT_ENABLE 1982feb4af0STimur Tabi #define CONFIG_SYS_PIXIS_VBOOT_ENABLE 0x04 1992feb4af0STimur Tabi #endif 2003d98b858SHaiying Wang 2012feb4af0STimur Tabi /* Configure the source of the boot location 2022feb4af0STimur Tabi * 2032feb4af0STimur Tabi * The PIXIS can be programmed to look at either the on-board dip switches 2042feb4af0STimur Tabi * or the PX_VBOOT[LBMAP] register to determine where we should boot. 2052feb4af0STimur Tabi * 2062feb4af0STimur Tabi * If we want to boot from the alternate boot bank, we need to tell the PIXIS 2072feb4af0STimur Tabi * to ignore the on-board dip switches and use the PX_VBOOT[LBMAP] instead. 2082feb4af0STimur Tabi */ 2092feb4af0STimur Tabi static void read_from_px_regs_altbank(int set) 2103d98b858SHaiying Wang { 211048e7efeSKumar Gala u8 tmp = in_8(pixis_base + PIXIS_VCFGEN1); 2123d98b858SHaiying Wang 2133d98b858SHaiying Wang if (set) 2142feb4af0STimur Tabi tmp = tmp | CONFIG_SYS_PIXIS_VBOOT_ENABLE; 2153d98b858SHaiying Wang else 2162feb4af0STimur Tabi tmp = tmp & ~CONFIG_SYS_PIXIS_VBOOT_ENABLE; 2172feb4af0STimur Tabi 218048e7efeSKumar Gala out_8(pixis_base + PIXIS_VCFGEN1, tmp); 2193d98b858SHaiying Wang } 2203d98b858SHaiying Wang 2212feb4af0STimur Tabi /* CONFIG_SYS_PIXIS_VBOOT_MASK contains the bits to set in VBOOT register that 2222feb4af0STimur Tabi * tells the PIXIS what the alternate flash bank is. 2232feb4af0STimur Tabi * 2242feb4af0STimur Tabi * Note that it's not really a mask. It contains the actual LBMAP bits that 2252feb4af0STimur Tabi * must be set to select the alternate bank. This code assumes that the 2262feb4af0STimur Tabi * primary bank has these bits set to 0, and the alternate bank has these 2272feb4af0STimur Tabi * bits set to 1. 2282feb4af0STimur Tabi */ 2296d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_PIXIS_VBOOT_MASK 2306d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_PIXIS_VBOOT_MASK (0x40) 231db74b3c1SJason Jin #endif 2323d98b858SHaiying Wang 2332feb4af0STimur Tabi /* Tell the PIXIS to boot from the default flash bank 2342feb4af0STimur Tabi * 2352feb4af0STimur Tabi * Program the default flash bank into the VBOOT register. This register is 2362feb4af0STimur Tabi * used only if PX_VCFGEN1[FLASH]=1. 2372feb4af0STimur Tabi */ 2382feb4af0STimur Tabi static void clear_altbank(void) 23916c3cde0SJames Yang { 2402feb4af0STimur Tabi clrbits_8(pixis_base + PIXIS_VBOOT, CONFIG_SYS_PIXIS_VBOOT_MASK); 24116c3cde0SJames Yang } 24216c3cde0SJames Yang 2432feb4af0STimur Tabi /* Tell the PIXIS to boot from the alternate flash bank 2442feb4af0STimur Tabi * 2452feb4af0STimur Tabi * Program the alternate flash bank into the VBOOT register. This register is 2462feb4af0STimur Tabi * used only if PX_VCFGEN1[FLASH]=1. 2472feb4af0STimur Tabi */ 2482feb4af0STimur Tabi static void set_altbank(void) 2493d98b858SHaiying Wang { 2502feb4af0STimur Tabi setbits_8(pixis_base + PIXIS_VBOOT, CONFIG_SYS_PIXIS_VBOOT_MASK); 2513d98b858SHaiying Wang } 2523d98b858SHaiying Wang 2532feb4af0STimur Tabi /* Reset the board with watchdog disabled. 2542feb4af0STimur Tabi * 2552feb4af0STimur Tabi * This respects the altbank setting. 2562feb4af0STimur Tabi */ 2572feb4af0STimur Tabi static void set_px_go(void) 2583d98b858SHaiying Wang { 2592feb4af0STimur Tabi /* Disable the VELA sequencer and watchdog */ 2602feb4af0STimur Tabi clrbits_8(pixis_base + PIXIS_VCTL, 9); 2613d98b858SHaiying Wang 2622feb4af0STimur Tabi /* Reboot by starting the VELA sequencer */ 2632feb4af0STimur Tabi setbits_8(pixis_base + PIXIS_VCTL, 0x1); 2643d98b858SHaiying Wang 2652feb4af0STimur Tabi while (1); 2663d98b858SHaiying Wang } 2673d98b858SHaiying Wang 2682feb4af0STimur Tabi /* Reset the board with watchdog enabled. 2692feb4af0STimur Tabi * 2702feb4af0STimur Tabi * This respects the altbank setting. 2712feb4af0STimur Tabi */ 2722feb4af0STimur Tabi static void set_px_go_with_watchdog(void) 2733d98b858SHaiying Wang { 2742feb4af0STimur Tabi /* Disable the VELA sequencer */ 2752feb4af0STimur Tabi clrbits_8(pixis_base + PIXIS_VCTL, 1); 2763d98b858SHaiying Wang 2772feb4af0STimur Tabi /* Enable the watchdog and reboot by starting the VELA sequencer */ 2782feb4af0STimur Tabi setbits_8(pixis_base + PIXIS_VCTL, 0x9); 2793d98b858SHaiying Wang 2802feb4af0STimur Tabi while (1); 2813d98b858SHaiying Wang } 2823d98b858SHaiying Wang 2832feb4af0STimur Tabi /* Disable the watchdog 2842feb4af0STimur Tabi * 2852feb4af0STimur Tabi */ 2862feb4af0STimur Tabi static int pixis_disable_watchdog_cmd(cmd_tbl_t *cmdtp, int flag, int argc, 28754841ab5SWolfgang Denk char * const argv[]) 2883d98b858SHaiying Wang { 2892feb4af0STimur Tabi /* Disable the VELA sequencer and the watchdog */ 2902feb4af0STimur Tabi clrbits_8(pixis_base + PIXIS_VCTL, 9); 2913d98b858SHaiying Wang 2923d98b858SHaiying Wang return 0; 2933d98b858SHaiying Wang } 2943d98b858SHaiying Wang 2953d98b858SHaiying Wang U_BOOT_CMD( 2963d98b858SHaiying Wang diswd, 1, 0, pixis_disable_watchdog_cmd, 2972fb2604dSPeter Tyser "Disable watchdog timer", 298a89c33dbSWolfgang Denk "" 299a89c33dbSWolfgang Denk ); 3003d98b858SHaiying Wang 301bff188baSLiu Yu #ifdef CONFIG_PIXIS_SGMII_CMD 3022feb4af0STimur Tabi 3032feb4af0STimur Tabi /* Enable or disable SGMII mode for a TSEC 3042feb4af0STimur Tabi */ 30554841ab5SWolfgang Denk static int pixis_set_sgmii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 3065a8a163aSAndy Fleming { 3075a8a163aSAndy Fleming int which_tsec = -1; 3082feb4af0STimur Tabi unsigned char mask; 3092feb4af0STimur Tabi unsigned char switch_mask; 3105a8a163aSAndy Fleming 3112feb4af0STimur Tabi if ((argc > 2) && (strcmp(argv[1], "all") != 0)) 3125a8a163aSAndy Fleming which_tsec = simple_strtoul(argv[1], NULL, 0); 3135a8a163aSAndy Fleming 3145a8a163aSAndy Fleming switch (which_tsec) { 315bff188baSLiu Yu #ifdef CONFIG_TSEC1 3165a8a163aSAndy Fleming case 1: 3175a8a163aSAndy Fleming mask = PIXIS_VSPEED2_TSEC1SER; 3185a8a163aSAndy Fleming switch_mask = PIXIS_VCFGEN1_TSEC1SER; 3195a8a163aSAndy Fleming break; 320bff188baSLiu Yu #endif 321bff188baSLiu Yu #ifdef CONFIG_TSEC2 322bff188baSLiu Yu case 2: 323bff188baSLiu Yu mask = PIXIS_VSPEED2_TSEC2SER; 324bff188baSLiu Yu switch_mask = PIXIS_VCFGEN1_TSEC2SER; 325bff188baSLiu Yu break; 326bff188baSLiu Yu #endif 327bff188baSLiu Yu #ifdef CONFIG_TSEC3 3285a8a163aSAndy Fleming case 3: 3295a8a163aSAndy Fleming mask = PIXIS_VSPEED2_TSEC3SER; 3305a8a163aSAndy Fleming switch_mask = PIXIS_VCFGEN1_TSEC3SER; 3315a8a163aSAndy Fleming break; 332bff188baSLiu Yu #endif 333bff188baSLiu Yu #ifdef CONFIG_TSEC4 334bff188baSLiu Yu case 4: 335bff188baSLiu Yu mask = PIXIS_VSPEED2_TSEC4SER; 336bff188baSLiu Yu switch_mask = PIXIS_VCFGEN1_TSEC4SER; 337bff188baSLiu Yu break; 338bff188baSLiu Yu #endif 3395a8a163aSAndy Fleming default: 340bff188baSLiu Yu mask = PIXIS_VSPEED2_MASK; 341bff188baSLiu Yu switch_mask = PIXIS_VCFGEN1_MASK; 3425a8a163aSAndy Fleming break; 3435a8a163aSAndy Fleming } 3445a8a163aSAndy Fleming 3455a8a163aSAndy Fleming /* Toggle whether the switches or FPGA control the settings */ 3465a8a163aSAndy Fleming if (!strcmp(argv[argc - 1], "switch")) 347048e7efeSKumar Gala clrbits_8(pixis_base + PIXIS_VCFGEN1, switch_mask); 3485a8a163aSAndy Fleming else 349048e7efeSKumar Gala setbits_8(pixis_base + PIXIS_VCFGEN1, switch_mask); 3505a8a163aSAndy Fleming 3515a8a163aSAndy Fleming /* If it's not the switches, enable or disable SGMII, as specified */ 3525a8a163aSAndy Fleming if (!strcmp(argv[argc - 1], "on")) 353048e7efeSKumar Gala clrbits_8(pixis_base + PIXIS_VSPEED2, mask); 3545a8a163aSAndy Fleming else if (!strcmp(argv[argc - 1], "off")) 355048e7efeSKumar Gala setbits_8(pixis_base + PIXIS_VSPEED2, mask); 3565a8a163aSAndy Fleming 3575a8a163aSAndy Fleming return 0; 3585a8a163aSAndy Fleming } 3595a8a163aSAndy Fleming 3605a8a163aSAndy Fleming U_BOOT_CMD( 3616d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pixis_set_sgmii, CONFIG_SYS_MAXARGS, 1, pixis_set_sgmii, 3625a8a163aSAndy Fleming "pixis_set_sgmii" 3635a8a163aSAndy Fleming " - Enable or disable SGMII mode for a given TSEC \n", 3645a8a163aSAndy Fleming "\npixis_set_sgmii [TSEC num] <on|off|switch>\n" 3655a8a163aSAndy Fleming " TSEC num: 1,2,3,4 or 'all'. 'all' is default.\n" 3665a8a163aSAndy Fleming " on - enables SGMII\n" 3675a8a163aSAndy Fleming " off - disables SGMII\n" 368a89c33dbSWolfgang Denk " switch - use switch settings" 369a89c33dbSWolfgang Denk ); 3702feb4af0STimur Tabi 3715a8a163aSAndy Fleming #endif 3725a8a163aSAndy Fleming 3733d98b858SHaiying Wang /* 3743d98b858SHaiying Wang * This function takes the non-integral cpu:mpx pll ratio 3753d98b858SHaiying Wang * and converts it to an integer that can be used to assign 3763d98b858SHaiying Wang * FPGA register values. 3773d98b858SHaiying Wang * input: strptr i.e. argv[2] 3783d98b858SHaiying Wang */ 3792feb4af0STimur Tabi static unsigned long strfractoint(char *strptr) 3803d98b858SHaiying Wang { 3812feb4af0STimur Tabi int i, j; 3823d98b858SHaiying Wang int mulconst; 383*8dbd4b74SKumar Gala int no_dec = 0; 3842feb4af0STimur Tabi unsigned long intval = 0, decval = 0; 3852feb4af0STimur Tabi char intarr[3], decarr[3]; 3863d98b858SHaiying Wang 3873d98b858SHaiying Wang /* Assign the integer part to intarr[] 3883d98b858SHaiying Wang * If there is no decimal point i.e. 3893d98b858SHaiying Wang * if the ratio is an integral value 3903d98b858SHaiying Wang * simply create the intarr. 3913d98b858SHaiying Wang */ 3923d98b858SHaiying Wang i = 0; 39316c3cde0SJames Yang while (strptr[i] != '.') { 3943d98b858SHaiying Wang if (strptr[i] == 0) { 3953d98b858SHaiying Wang no_dec = 1; 3963d98b858SHaiying Wang break; 3973d98b858SHaiying Wang } 3983d98b858SHaiying Wang intarr[i] = strptr[i]; 3993d98b858SHaiying Wang i++; 4003d98b858SHaiying Wang } 4013d98b858SHaiying Wang 4023d98b858SHaiying Wang intarr[i] = '\0'; 4033d98b858SHaiying Wang 4043d98b858SHaiying Wang if (no_dec) { 4053d98b858SHaiying Wang /* Currently needed only for single digit corepll ratios */ 4063d98b858SHaiying Wang mulconst = 10; 4073d98b858SHaiying Wang decval = 0; 4083d98b858SHaiying Wang } else { 4093d98b858SHaiying Wang j = 0; 4103d98b858SHaiying Wang i++; /* Skipping the decimal point */ 41116c3cde0SJames Yang while ((strptr[i] >= '0') && (strptr[i] <= '9')) { 4123d98b858SHaiying Wang decarr[j] = strptr[i]; 4133d98b858SHaiying Wang i++; 4143d98b858SHaiying Wang j++; 4153d98b858SHaiying Wang } 4163d98b858SHaiying Wang 4173d98b858SHaiying Wang decarr[j] = '\0'; 4183d98b858SHaiying Wang 4193d98b858SHaiying Wang mulconst = 1; 4202feb4af0STimur Tabi for (i = 0; i < j; i++) 4213d98b858SHaiying Wang mulconst *= 10; 4222feb4af0STimur Tabi decval = simple_strtoul(decarr, NULL, 10); 4233d98b858SHaiying Wang } 4243d98b858SHaiying Wang 4252feb4af0STimur Tabi intval = simple_strtoul(intarr, NULL, 10); 4263d98b858SHaiying Wang intval = intval * mulconst; 4273d98b858SHaiying Wang 4282feb4af0STimur Tabi return intval + decval; 4293d98b858SHaiying Wang } 4303d98b858SHaiying Wang 43154841ab5SWolfgang Denk static int pixis_reset_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 4323d98b858SHaiying Wang { 43316c3cde0SJames Yang unsigned int i; 43416c3cde0SJames Yang char *p_cf = NULL; 43516c3cde0SJames Yang char *p_cf_sysclk = NULL; 43616c3cde0SJames Yang char *p_cf_corepll = NULL; 43716c3cde0SJames Yang char *p_cf_mpxpll = NULL; 43816c3cde0SJames Yang char *p_altbank = NULL; 43916c3cde0SJames Yang char *p_wd = NULL; 4402feb4af0STimur Tabi int unknown_param = 0; 4413d98b858SHaiying Wang 4423d98b858SHaiying Wang /* 4433d98b858SHaiying Wang * No args is a simple reset request. 4443d98b858SHaiying Wang */ 4453d98b858SHaiying Wang if (argc <= 1) { 4463d98b858SHaiying Wang pixis_reset(); 4473d98b858SHaiying Wang /* not reached */ 4483d98b858SHaiying Wang } 4493d98b858SHaiying Wang 45016c3cde0SJames Yang for (i = 1; i < argc; i++) { 45116c3cde0SJames Yang if (strcmp(argv[i], "cf") == 0) { 45216c3cde0SJames Yang p_cf = argv[i]; 45316c3cde0SJames Yang if (i + 3 >= argc) { 45416c3cde0SJames Yang break; 45516c3cde0SJames Yang } 45616c3cde0SJames Yang p_cf_sysclk = argv[i+1]; 45716c3cde0SJames Yang p_cf_corepll = argv[i+2]; 45816c3cde0SJames Yang p_cf_mpxpll = argv[i+3]; 45916c3cde0SJames Yang i += 3; 46016c3cde0SJames Yang continue; 46116c3cde0SJames Yang } 46216c3cde0SJames Yang 46316c3cde0SJames Yang if (strcmp(argv[i], "altbank") == 0) { 46416c3cde0SJames Yang p_altbank = argv[i]; 46516c3cde0SJames Yang continue; 46616c3cde0SJames Yang } 46716c3cde0SJames Yang 46816c3cde0SJames Yang if (strcmp(argv[i], "wd") == 0) { 46916c3cde0SJames Yang p_wd = argv[i]; 47016c3cde0SJames Yang continue; 47116c3cde0SJames Yang } 47216c3cde0SJames Yang 47316c3cde0SJames Yang unknown_param = 1; 47416c3cde0SJames Yang } 4753d98b858SHaiying Wang 4763d98b858SHaiying Wang /* 47716c3cde0SJames Yang * Check that cf has all required parms 4783d98b858SHaiying Wang */ 47916c3cde0SJames Yang if ((p_cf && !(p_cf_sysclk && p_cf_corepll && p_cf_mpxpll)) 48016c3cde0SJames Yang || unknown_param) { 481f7fecc3eSEd Swarthout #ifdef CONFIG_SYS_LONGHELP 48216c3cde0SJames Yang puts(cmdtp->help); 483f7fecc3eSEd Swarthout #endif 4843d98b858SHaiying Wang return 1; 4853d98b858SHaiying Wang } 4863d98b858SHaiying Wang 4873d98b858SHaiying Wang /* 48816c3cde0SJames Yang * PIXIS seems to be sensitive to the ordering of 48916c3cde0SJames Yang * the registers that are touched. 4903d98b858SHaiying Wang */ 4913d98b858SHaiying Wang read_from_px_regs(0); 49216c3cde0SJames Yang 4932feb4af0STimur Tabi if (p_altbank) 4943d98b858SHaiying Wang read_from_px_regs_altbank(0); 4952feb4af0STimur Tabi 49616c3cde0SJames Yang clear_altbank(); 49716c3cde0SJames Yang 49816c3cde0SJames Yang /* 49916c3cde0SJames Yang * Clock configuration specified. 50016c3cde0SJames Yang */ 50116c3cde0SJames Yang if (p_cf) { 50216c3cde0SJames Yang unsigned long sysclk; 50316c3cde0SJames Yang unsigned long corepll; 50416c3cde0SJames Yang unsigned long mpxpll; 50516c3cde0SJames Yang 50616c3cde0SJames Yang sysclk = simple_strtoul(p_cf_sysclk, NULL, 10); 5072feb4af0STimur Tabi corepll = strfractoint(p_cf_corepll); 50816c3cde0SJames Yang mpxpll = simple_strtoul(p_cf_mpxpll, NULL, 10); 50916c3cde0SJames Yang 51016c3cde0SJames Yang if (!(set_px_sysclk(sysclk) 51116c3cde0SJames Yang && set_px_corepll(corepll) 51216c3cde0SJames Yang && set_px_mpxpll(mpxpll))) { 513f7fecc3eSEd Swarthout #ifdef CONFIG_SYS_LONGHELP 51416c3cde0SJames Yang puts(cmdtp->help); 515f7fecc3eSEd Swarthout #endif 5163d98b858SHaiying Wang return 1; 5173d98b858SHaiying Wang } 51816c3cde0SJames Yang read_from_px_regs(1); 51916c3cde0SJames Yang } 52016c3cde0SJames Yang 52116c3cde0SJames Yang /* 52216c3cde0SJames Yang * Altbank specified 52316c3cde0SJames Yang * 52416c3cde0SJames Yang * NOTE CHANGE IN BEHAVIOR: previous code would default 52516c3cde0SJames Yang * to enabling watchdog if altbank is specified. 52616c3cde0SJames Yang * Now the watchdog must be enabled explicitly using 'wd'. 52716c3cde0SJames Yang */ 52816c3cde0SJames Yang if (p_altbank) { 5293d98b858SHaiying Wang set_altbank(); 5303d98b858SHaiying Wang read_from_px_regs_altbank(1); 53116c3cde0SJames Yang } 5323d98b858SHaiying Wang 5333d98b858SHaiying Wang /* 53416c3cde0SJames Yang * Reset with watchdog specified. 5353d98b858SHaiying Wang */ 5362feb4af0STimur Tabi if (p_wd) 5373d98b858SHaiying Wang set_px_go_with_watchdog(); 5382feb4af0STimur Tabi else 53916c3cde0SJames Yang set_px_go(); 5403d98b858SHaiying Wang 5413d98b858SHaiying Wang /* 54216c3cde0SJames Yang * Shouldn't be reached. 5433d98b858SHaiying Wang */ 5443d98b858SHaiying Wang return 0; 5453d98b858SHaiying Wang } 5463d98b858SHaiying Wang 5473d98b858SHaiying Wang 5483d98b858SHaiying Wang U_BOOT_CMD( 5496d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pixis_reset, CONFIG_SYS_MAXARGS, 1, pixis_reset_cmd, 5502fb2604dSPeter Tyser "Reset the board using the FPGA sequencer", 5513d98b858SHaiying Wang " pixis_reset\n" 5523d98b858SHaiying Wang " pixis_reset [altbank]\n" 5533d98b858SHaiying Wang " pixis_reset altbank wd\n" 5543d98b858SHaiying Wang " pixis_reset altbank cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>\n" 555a89c33dbSWolfgang Denk " pixis_reset cf <SYSCLK freq> <COREPLL ratio> <MPXPLL ratio>" 5563d98b858SHaiying Wang ); 557