123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- /*
- * (C) Copyright 2001
- * Denis Peter, MPL AG Switzerland, d.peter@mpl.ch
- *
- * SPDX-License-Identifier: GPL-2.0+
- *
- * hacked for evb440spe
- */
- #include <common.h>
- #include <cli.h>
- #include <command.h>
- #include <console.h>
- #include "yucca.h"
- #include <i2c.h>
- #include <asm/byteorder.h>
- extern void print_evb440spe_info(void);
- static int setBootStrapClock(cmd_tbl_t *cmdtp, int incrflag,
- int flag, int argc, char * const argv[]);
- /* ------------------------------------------------------------------------- */
- int do_evb440spe(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
- {
- return setBootStrapClock (cmdtp, 1, flag, argc, argv);
- }
- /* ------------------------------------------------------------------------- */
- /* Modify memory.
- *
- * Syntax:
- * evb440spe wrclk prom0,prom1
- */
- static int setBootStrapClock(cmd_tbl_t *cmdtp, int incrflag, int flag,
- int argc, char * const argv[])
- {
- uchar chip;
- ulong data;
- int nbytes;
- char sysClock[4];
- char cpuClock[4];
- char plbClock[4];
- char pcixClock[4];
- if (argc < 3)
- return cmd_usage(cmdtp);
- if (strcmp(argv[2], "prom0") == 0)
- chip = IIC0_BOOTPROM_ADDR;
- else
- chip = IIC0_ALT_BOOTPROM_ADDR;
- do {
- printf("enter sys clock frequency 33 or 66 MHz or quit to abort\n");
- nbytes = cli_readline(" ? ");
- if (strcmp(console_buffer, "quit") == 0)
- return 0;
- if ((strcmp(console_buffer, "33") != 0) &
- (strcmp(console_buffer, "66") != 0))
- nbytes=0;
- strcpy(sysClock, console_buffer);
- } while (nbytes == 0);
- do {
- if (strcmp(sysClock, "66") == 0) {
- printf("enter cpu clock frequency 400, 533 MHz or quit to abort\n");
- } else {
- #ifdef CONFIG_STRESS
- printf("enter cpu clock frequency 400, 500, 533, 667 MHz or quit to abort\n");
- #else
- printf("enter cpu clock frequency 400, 500, 533 MHz or quit to abort\n");
- #endif
- }
- nbytes = cli_readline(" ? ");
- if (strcmp(console_buffer, "quit") == 0)
- return 0;
- if (strcmp(sysClock, "66") == 0) {
- if ((strcmp(console_buffer, "400") != 0) &
- (strcmp(console_buffer, "533") != 0)
- #ifdef CONFIG_STRESS
- & (strcmp(console_buffer, "667") != 0)
- #endif
- ) {
- nbytes = 0;
- }
- } else {
- if ((strcmp(console_buffer, "400") != 0) &
- (strcmp(console_buffer, "500") != 0) &
- (strcmp(console_buffer, "533") != 0)
- #ifdef CONFIG_STRESS
- & (strcmp(console_buffer, "667") != 0)
- #endif
- ) {
- nbytes = 0;
- }
- }
- strcpy(cpuClock, console_buffer);
- } while (nbytes == 0);
- if (strcmp(cpuClock, "500") == 0){
- strcpy(plbClock, "166");
- } else if (strcmp(cpuClock, "533") == 0){
- strcpy(plbClock, "133");
- } else {
- do {
- if (strcmp(cpuClock, "400") == 0)
- printf("enter plb clock frequency 100, 133 MHz or quit to abort\n");
- #ifdef CONFIG_STRESS
- if (strcmp(cpuClock, "667") == 0)
- printf("enter plb clock frequency 133, 166 MHz or quit to abort\n");
- #endif
- nbytes = cli_readline(" ? ");
- if (strcmp(console_buffer, "quit") == 0)
- return 0;
- if (strcmp(cpuClock, "400") == 0) {
- if ((strcmp(console_buffer, "100") != 0) &
- (strcmp(console_buffer, "133") != 0))
- nbytes = 0;
- }
- #ifdef CONFIG_STRESS
- if (strcmp(cpuClock, "667") == 0) {
- if ((strcmp(console_buffer, "133") != 0) &
- (strcmp(console_buffer, "166") != 0))
- nbytes = 0;
- }
- #endif
- strcpy(plbClock, console_buffer);
- } while (nbytes == 0);
- }
- do {
- printf("enter Pci-X clock frequency 33, 66, 100 or 133 MHz or quit to abort\n");
- nbytes = cli_readline(" ? ");
- if (strcmp(console_buffer, "quit") == 0)
- return 0;
- if ((strcmp(console_buffer, "33") != 0) &
- (strcmp(console_buffer, "66") != 0) &
- (strcmp(console_buffer, "100") != 0) &
- (strcmp(console_buffer, "133") != 0)) {
- nbytes = 0;
- }
- strcpy(pcixClock, console_buffer);
- } while (nbytes == 0);
- printf("\nsys clk = %s MHz\n", sysClock);
- printf("cpu clk = %s MHz\n", cpuClock);
- printf("plb clk = %s MHz\n", plbClock);
- printf("Pci-X clk = %s MHz\n", pcixClock);
- do {
- printf("\npress [y] to write I2C bootstrap\n");
- printf("or [n] to abort.\n");
- printf("Don't forget to set board switches\n");
- printf("according to your choice before re-starting\n");
- printf("(refer to 440spe_uboot_kit_um_1_01.pdf)\n");
- nbytes = cli_readline(" ? ");
- if (strcmp(console_buffer, "n") == 0)
- return 0;
- } while (nbytes == 0);
- if (strcmp(sysClock, "33") == 0) {
- if ((strcmp(cpuClock, "400") == 0) &
- (strcmp(plbClock, "100") == 0))
- data = 0x8678c206;
- if ((strcmp(cpuClock, "400") == 0) &
- (strcmp(plbClock, "133") == 0))
- data = 0x8678c2c6;
- if ((strcmp(cpuClock, "500") == 0))
- data = 0x8778f2c6;
- if ((strcmp(cpuClock, "533") == 0))
- data = 0x87790252;
- #ifdef CONFIG_STRESS
- if ((strcmp(cpuClock, "667") == 0) &
- (strcmp(plbClock, "133") == 0))
- data = 0x87794256;
- if ((strcmp(cpuClock, "667") == 0) &
- (strcmp(plbClock, "166") == 0))
- data = 0x87794206;
- #endif
- }
- if (strcmp(sysClock, "66") == 0) {
- if ((strcmp(cpuClock, "400") == 0) &
- (strcmp(plbClock, "100") == 0))
- data = 0x84706206;
- if ((strcmp(cpuClock, "400") == 0) &
- (strcmp(plbClock, "133") == 0))
- data = 0x847062c6;
- if ((strcmp(cpuClock, "533") == 0))
- data = 0x85708206;
- #ifdef CONFIG_STRESS
- if ((strcmp(cpuClock, "667") == 0) &
- (strcmp(plbClock, "133") == 0))
- data = 0x8570a256;
- if ((strcmp(cpuClock, "667") == 0) &
- (strcmp(plbClock, "166") == 0))
- data = 0x8570a206;
- #endif
- }
- #ifdef DEBUG
- printf(" pin strap0 to write in i2c = %x\n", data);
- #endif /* DEBUG */
- if (i2c_write(chip, 0, 1, (uchar *)&data, 4) != 0)
- printf("Error writing strap0 in %s\n", argv[2]);
- if (strcmp(pcixClock, "33") == 0)
- data = 0x00000701;
- if (strcmp(pcixClock, "66") == 0)
- data = 0x00000601;
- if (strcmp(pcixClock, "100") == 0)
- data = 0x00000501;
- if (strcmp(pcixClock, "133") == 0)
- data = 0x00000401;
- if (strcmp(plbClock, "166") == 0)
- data = data | 0x05950000;
- else
- data = data | 0x05A50000;
- #ifdef DEBUG
- printf(" pin strap1 to write in i2c = %x\n", data);
- #endif /* DEBUG */
- udelay(1000);
- if (i2c_write(chip, 4, 1, (uchar *)&data, 4) != 0)
- printf("Error writing strap1 in %s\n", argv[2]);
- return 0;
- }
- U_BOOT_CMD(
- evb440spe, 3, 1, do_evb440spe,
- "program the serial device strap",
- "wrclk [prom0|prom1] - program the serial device strap"
- );
|