11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* setup.c: FRV specific setup
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 2003-5 Red Hat, Inc. All Rights Reserved.
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Written by David Howells (dhowells@redhat.com)
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Derived from arch/m68k/kernel/setup.c
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modify it under the terms of the GNU General Public License
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * as published by the Free Software Foundation; either version
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2 of the License, or (at your option) any later version.
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13273b281fa22c293963ee3e6eec418f5dda2dbc83Sam Ravnborg#include <generated/utsrelease.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/fs.h>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/fb.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/console.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/genhd.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/string.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/major.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bootmem.h>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/highmem.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/seq_file.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/serial.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/serial_core.h>
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/serial_reg.h>
32b187f180cc942e50007aa039f8e3a620ee5f3171Yinghai Lu#include <linux/serial_8250.h>
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/setup.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h>
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/sections.h>
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pgalloc.h>
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/busctl-regs.h>
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/serial-regs.h>
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/timer-regs.h>
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irc-regs.h>
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/spr-regs.h>
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mb-regs.h>
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mb93493-regs.h>
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/gdb-stub.h>
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_BLK_DEV_INITRD
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pgtable.h>
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "local.h"
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MB93090_MB00
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init mb93090_display(void);
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MMU
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init setup_linux_memory(void);
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init setup_uclinux_memory(void);
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MB93090_MB00
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char __initdata mb93090_banner[] = "FJ/RH FR-V Linux";
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char __initdata mb93090_version[] = UTS_RELEASE;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint __nongprelbss mb93090_mb00_detected;
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_unknown_system[] = "unknown";
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_mb93091_cb10[] = "mb93091-cb10";
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_mb93091_cb11[] = "mb93091-cb11";
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_mb93091_cb30[] = "mb93091-cb30";
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_mb93091_cb41[] = "mb93091-cb41";
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_mb93091_cb60[] = "mb93091-cb60";
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_mb93091_cb70[] = "mb93091-cb70";
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_mb93091_cb451[] = "mb93091-cb451";
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_mb93090_mb00[] = "mb93090-mb00";
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_mb93493[] = "mb93493";
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst char __frv_mb93093[] = "mb93093";
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *__nongprelbss cpu_series;
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *__nongprelbss cpu_core;
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *__nongprelbss cpu_silicon;
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *__nongprelbss cpu_mmu;
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *__nongprelbss cpu_system;
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *__nongprelbss cpu_board1;
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const char *__nongprelbss cpu_board2;
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned long __nongprelbss cpu_psr_all;
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned long __nongprelbss cpu_hsr0_all;
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __nongprelbss pdm_suspend_mode;
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __nongprelbss rom_length;
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __nongprelbss memory_start;
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __nongprelbss memory_end;
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __nongprelbss dma_coherent_mem_start;
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __nongprelbss dma_coherent_mem_end;
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __initdata __sdram_old_base;
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __initdata num_mappedpages;
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1079c00f7613249b3b42782a226308353a4033c11c3Alon Bar-Levchar __initdata command_line[COMMAND_LINE_SIZE];
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldschar __initdata redboot_command_line[COMMAND_LINE_SIZE];
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __pminit
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __pminitdata
113b4b5087173d09507f425714bc8d270615e5800b1Andi Kleen#define __pminitconst
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __pminit __init
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __pminitdata __initdata
117b4b5087173d09507f425714bc8d270615e5800b1Andi Kleen#define __pminitconst __initconst
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct clock_cmode {
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	uint8_t	xbus, sdram, corebus, core, dsu;
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _frac(N,D) ((N)<<4 | (D))
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x0_16	_frac(1,6)
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x0_25	_frac(1,4)
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x0_33	_frac(1,3)
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x0_375	_frac(3,8)
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x0_5	_frac(1,2)
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x0_66	_frac(2,3)
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x0_75	_frac(3,4)
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x1	_frac(1,1)
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x1_5	_frac(3,2)
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x2	_frac(2,1)
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x3	_frac(3,1)
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x4	_frac(4,1)
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x4_5	_frac(9,2)
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x6	_frac(6,1)
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x8	_frac(8,1)
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _x9	_frac(9,1)
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint __nongprelbss clock_p0_current;
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint __nongprelbss clock_cm_current;
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint __nongprelbss clock_cmode_current;
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint __nongprelbss clock_cmodes_permitted;
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsunsigned long __nongprelbss clock_bits_settable;
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct clock_cmode __pminitdata undef_clock_cmode = { _x1, _x1, _x1, _x1, _x1 };
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct clock_cmode __pminitdata clock_cmodes_fr401_fr403[16] = {
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[4]	= {	_x1,	_x1,	_x2,	_x2,	_x0_25	},
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[5]	= { 	_x1,	_x2,	_x4,	_x4,	_x0_5	},
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[8]	= { 	_x1,	_x1,	_x1,	_x2,	_x0_25	},
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[9]	= { 	_x1,	_x2,	_x2,	_x4,	_x0_5	},
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[11]	= { 	_x1,	_x4,	_x4,	_x8,	_x1	},
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[12]	= { 	_x1,	_x1,	_x2,	_x4,	_x0_5	},
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[13]	= { 	_x1,	_x2,	_x4,	_x8,	_x1	},
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct clock_cmode __pminitdata clock_cmodes_fr405[16] = {
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[0]	= {	_x1,	_x1,	_x1,	_x1,	_x0_5	},
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[1]	= {	_x1,	_x1,	_x1,	_x3,	_x0_25	},
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[2]	= {	_x1,	_x1,	_x2,	_x6,	_x0_5	},
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[3]	= {	_x1,	_x2,	_x2,	_x6,	_x0_5	},
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[4]	= {	_x1,	_x1,	_x2,	_x2,	_x0_16	},
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[8]	= { 	_x1,	_x1,	_x1,	_x2,	_x0_16	},
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[9]	= { 	_x1,	_x2,	_x2,	_x4,	_x0_33	},
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[12]	= { 	_x1,	_x1,	_x2,	_x4,	_x0_33	},
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[14]	= { 	_x1,	_x3,	_x3,	_x9,	_x0_75	},
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[15]	= { 	_x1,	_x1_5,	_x1_5,	_x4_5,	_x0_375	},
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CLOCK_CMODES_PERMITTED_FR405 0xd31f
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct clock_cmode __pminitdata clock_cmodes_fr555[16] = {
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[0]	= {	_x1,	_x2,	_x2,	_x4,	_x0_33	},
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[1]	= {	_x1,	_x3,	_x3,	_x6,	_x0_5	},
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[2]	= {	_x1,	_x2,	_x4,	_x8,	_x0_66	},
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[3]	= {	_x1,	_x1_5,	_x3,	_x6,	_x0_5	},
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[4]	= {	_x1,	_x3,	_x3,	_x9,	_x0_75	},
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[5]	= {	_x1,	_x2,	_x2,	_x6,	_x0_5	},
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	[6]	= {	_x1,	_x1_5,	_x1_5,	_x4_5,	_x0_375	},
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1873f3247d01933d357229f6a11f62d88a848445a9aAndi Kleenstatic const struct clock_cmode __pminitconst *clock_cmodes;
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __pminitdata clock_doubled;
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1905616df204ecf164ef2b124a17fd3cadd87954628David Howellsstatic struct uart_port __pminitdata __frv_uart0 = {
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.uartclk		= 0,
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.membase		= (char *) UART0_BASE,
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.irq			= IRQ_CPU_UART0,
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.regshift		= 3,
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.iotype			= UPIO_MEM,
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.flags			= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1995616df204ecf164ef2b124a17fd3cadd87954628David Howellsstatic struct uart_port __pminitdata __frv_uart1 = {
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.uartclk		= 0,
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.membase		= (char *) UART1_BASE,
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.irq			= IRQ_CPU_UART1,
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.regshift		= 3,
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.iotype			= UPIO_MEM,
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.flags			= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 0
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init printk_xampr(unsigned long ampr, unsigned long amlr, char i_d, int n)
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long phys, virt, cxn, size;
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MMU
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	virt = amlr & 0xffffc000;
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cxn = amlr & 0x3fff;
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	virt = ampr & 0xffffc000;
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cxn = 0;
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	phys = ampr & xAMPRx_PPFN;
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size = 1 << (((ampr & xAMPRx_SS) >> 4) + 17);
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("%cAMPR%d: va %08lx-%08lx [pa %08lx] %c%c%c%c [cxn:%04lx]\n",
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       i_d, n,
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       virt, virt + size - 1,
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       phys,
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       ampr & xAMPRx_S  ? 'S' : '-',
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       ampr & xAMPRx_C  ? 'C' : '-',
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       ampr & DAMPRx_WP ? 'W' : '-',
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       ampr & xAMPRx_V  ? 'V' : '-',
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cxn
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       );
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * dump the memory map
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init dump_memory_map(void)
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 0
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* dump the protection map */
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(0),  __get_IAMLR(0),  'I', 0);
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(1),  __get_IAMLR(1),  'I', 1);
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(2),  __get_IAMLR(2),  'I', 2);
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(3),  __get_IAMLR(3),  'I', 3);
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(4),  __get_IAMLR(4),  'I', 4);
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(5),  __get_IAMLR(5),  'I', 5);
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(6),  __get_IAMLR(6),  'I', 6);
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(7),  __get_IAMLR(7),  'I', 7);
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(8),  __get_IAMLR(8),  'I', 8);
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(9),  __get_IAMLR(9),  'i', 9);
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(10), __get_IAMLR(10), 'I', 10);
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(11), __get_IAMLR(11), 'I', 11);
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(12), __get_IAMLR(12), 'I', 12);
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(13), __get_IAMLR(13), 'I', 13);
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(14), __get_IAMLR(14), 'I', 14);
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_IAMPR(15), __get_IAMLR(15), 'I', 15);
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(0),  __get_DAMLR(0),  'D', 0);
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(1),  __get_DAMLR(1),  'D', 1);
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(2),  __get_DAMLR(2),  'D', 2);
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(3),  __get_DAMLR(3),  'D', 3);
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(4),  __get_DAMLR(4),  'D', 4);
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(5),  __get_DAMLR(5),  'D', 5);
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(6),  __get_DAMLR(6),  'D', 6);
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(7),  __get_DAMLR(7),  'D', 7);
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(8),  __get_DAMLR(8),  'D', 8);
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(9),  __get_DAMLR(9),  'D', 9);
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(10), __get_DAMLR(10), 'D', 10);
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(11), __get_DAMLR(11), 'D', 11);
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(12), __get_DAMLR(12), 'D', 12);
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(13), __get_DAMLR(13), 'D', 13);
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(14), __get_DAMLR(14), 'D', 14);
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk_xampr(__get_DAMPR(15), __get_DAMLR(15), 'D', 15);
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 0
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* dump the bus controller registers */
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("LGCR: %08lx\n", __get_LGCR());
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("Master: %08lx-%08lx CR=%08lx\n",
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       __get_LEMBR(), __get_LEMBR() + __get_LEMAM(),
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       __get_LMAICR());
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int loop;
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (loop = 1; loop <= 7; loop++) {
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned long lcr = __get_LCR(loop), lsbr = __get_LSBR(loop);
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("CS#%d: %08lx-%08lx %c%c%c%c%c%c%c%c%c\n",
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       loop,
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       lsbr, lsbr + __get_LSAM(loop),
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       lcr & 0x80000000 ? 'r' : '-',
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       lcr & 0x40000000 ? 'w' : '-',
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       lcr & 0x08000000 ? 'b' : '-',
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       lcr & 0x04000000 ? 'B' : '-',
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       lcr & 0x02000000 ? 'C' : '-',
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       lcr & 0x01000000 ? 'D' : '-',
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       lcr & 0x00800000 ? 'W' : '-',
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       lcr & 0x00400000 ? 'R' : '-',
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       (lcr & 0x00030000) == 0x00000000 ? '4' :
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       (lcr & 0x00030000) == 0x00010000 ? '2' :
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       (lcr & 0x00030000) == 0x00020000 ? '1' :
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       '-'
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       );
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 0
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("\n");
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end dump_memory_map() */
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * attempt to detect a VDK motherboard and DAV daughter board on an MB93091 system
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MB93091_VDK
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init detect_mb93091(void)
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MB93090_MB00
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Detect CB70 without motherboard */
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(cpu_system == __frv_mb93091_cb70 && ((*(unsigned short *)0xffc00030) & 0x100))) {
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_board1 = __frv_mb93090_mb00;
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mb93090_mb00_detected = 1;
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_FUJITSU_MB93493
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cpu_board2 = __frv_mb93493;
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end detect_mb93091() */
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * determine the CPU type and set appropriate parameters
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Family     Series      CPU Core    Silicon    Imple  Vers
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ----------------------------------------------------------
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FR-V --+-> FR400 --+-> FR401 --+-> MB93401     02     00 [1]
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |           |           |
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |           |           +-> MB93401/A   02     01
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |           |           |
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |           |           +-> MB93403     02     02
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |           |
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |           +-> FR405 ----> MB93405     04     00
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        +-> FR450 ----> FR451 ----> MB93451     05     00
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        +-> FR500 ----> FR501 --+-> MB93501     01     01 [2]
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |                       |
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |                       +-> MB93501/A   01     02
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        |
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        +-> FR550 --+-> FR551 ----> MB93555     03     01
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  [1] The MB93401 is an obsolete CPU replaced by the MB93401A
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  [2] The MB93501 is an obsolete CPU replaced by the MB93501A
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Imple is PSR(Processor Status Register)[31:28].
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Vers is PSR(Processor Status Register)[27:24].
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A "Silicon" consists of CPU core and some on-chip peripherals.
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init determine_cpu(void)
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long hsr0 = __get_HSR(0);
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long psr = __get_PSR();
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* work out what selectable services the CPU supports */
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_PSR(psr | PSR_EM | PSR_EF | PSR_CM | PSR_NEM);
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cpu_psr_all = __get_PSR();
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_PSR(psr);
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_HSR(0, hsr0 | HSR0_GRLE | HSR0_GRHE | HSR0_FRLE | HSR0_FRHE);
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cpu_hsr0_all = __get_HSR(0);
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_HSR(0, hsr0);
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* derive other service specs from the CPU type */
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cpu_series		= "unknown";
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cpu_core		= "unknown";
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cpu_silicon		= "unknown";
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cpu_mmu			= "Prot";
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cpu_system		= __frv_unknown_system;
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clock_cmodes		= NULL;
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clock_doubled		= 0;
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clock_bits_settable	= CLOCK_BIT_CM_H | CLOCK_BIT_CM_M | CLOCK_BIT_P0;
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (PSR_IMPLE(psr)) {
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PSR_IMPLE_FR401:
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_series	= "fr400";
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_core	= "fr401";
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pdm_suspend_mode = HSR0_PDM_PLL_RUN;
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (PSR_VERSION(psr)) {
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PSR_VERSION_FR401_MB93401:
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_silicon	= "mb93401";
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_system	= __frv_mb93091_cb10;
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			clock_cmodes	= clock_cmodes_fr401_fr403;
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			clock_doubled	= 1;
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PSR_VERSION_FR401_MB93401A:
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_silicon	= "mb93401/A";
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_system	= __frv_mb93091_cb11;
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			clock_cmodes	= clock_cmodes_fr401_fr403;
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PSR_VERSION_FR401_MB93403:
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_silicon	= "mb93403";
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef CONFIG_MB93093_PDK
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_system	= __frv_mb93091_cb30;
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_system	= __frv_mb93093;
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			clock_cmodes	= clock_cmodes_fr401_fr403;
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PSR_IMPLE_FR405:
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_series	= "fr400";
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_core	= "fr405";
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pdm_suspend_mode = HSR0_PDM_PLL_STOP;
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (PSR_VERSION(psr)) {
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PSR_VERSION_FR405_MB93405:
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_silicon	= "mb93405";
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_system	= __frv_mb93091_cb60;
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			clock_cmodes	= clock_cmodes_fr405;
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			clock_bits_settable |= CLOCK_BIT_CMODE;
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			clock_cmodes_permitted = CLOCK_CMODES_PERMITTED_FR405;
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* the FPGA on the CB70 has extra registers
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 * - it has 0x0046 in the VDK_ID FPGA register at 0x1a0, which is
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 *   how we tell the difference between it and a CB60
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 */
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (*(volatile unsigned short *) 0xffc001a0 == 0x0046)
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				cpu_system = __frv_mb93091_cb70;
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PSR_IMPLE_FR451:
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_series	= "fr450";
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_core	= "fr451";
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pdm_suspend_mode = HSR0_PDM_PLL_STOP;
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		clock_bits_settable |= CLOCK_BIT_CMODE;
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		clock_cmodes_permitted = CLOCK_CMODES_PERMITTED_FR405;
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (PSR_VERSION(psr)) {
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PSR_VERSION_FR451_MB93451:
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_silicon	= "mb93451";
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_mmu		= "Prot, SAT, xSAT, DAT";
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_system	= __frv_mb93091_cb451;
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			clock_cmodes	= clock_cmodes_fr405;
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PSR_IMPLE_FR501:
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_series	= "fr500";
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_core	= "fr501";
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pdm_suspend_mode = HSR0_PDM_PLL_STOP;
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (PSR_VERSION(psr)) {
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PSR_VERSION_FR501_MB93501:  cpu_silicon = "mb93501";   break;
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PSR_VERSION_FR501_MB93501A: cpu_silicon = "mb93501/A"; break;
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PSR_IMPLE_FR551:
4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_series	= "fr550";
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cpu_core	= "fr551";
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pdm_suspend_mode = HSR0_PDM_PLL_RUN;
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (PSR_VERSION(psr)) {
4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PSR_VERSION_FR551_MB93555:
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_silicon	= "mb93555";
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_mmu		= "Prot, SAT";
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cpu_system	= __frv_mb93091_cb41;
4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			clock_cmodes	= clock_cmodes_fr555;
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			clock_doubled	= 1;
4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("- Series:%s CPU:%s Silicon:%s\n",
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       cpu_series, cpu_core, cpu_silicon);
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MB93091_VDK
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	detect_mb93091();
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_MB93093_PDK) && defined(CONFIG_FUJITSU_MB93493)
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cpu_board2 = __frv_mb93493;
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end determine_cpu() */
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * calculate the bus clock speed
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __pminit determine_clocks(int verbose)
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const struct clock_cmode *mode, *tmode;
5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long clkc, psr, quot;
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clkc = __get_CLKC();
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	psr = __get_PSR();
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clock_p0_current = !!(clkc & CLKC_P0);
5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clock_cm_current = clkc & CLKC_CM;
5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clock_cmode_current = (clkc & CLKC_CMODE) >> CLKC_CMODE_s;
5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (verbose)
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("psr=%08lx hsr0=%08lx clkc=%08lx\n", psr, __get_HSR(0), clkc);
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* the CB70 has some alternative ways of setting the clock speed through switches accessed
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * through the FPGA.  */
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (cpu_system == __frv_mb93091_cb70) {
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned short clkswr = *(volatile unsigned short *) 0xffc00104UL & 0x1fffUL;
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (clkswr & 0x1000)
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			__clkin_clock_speed_HZ = 60000000UL;
5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			__clkin_clock_speed_HZ =
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				((clkswr >> 8) & 0xf) * 10000000 +
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				((clkswr >> 4) & 0xf) * 1000000 +
5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				((clkswr     ) & 0xf) * 100000;
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* the FR451 is currently fixed at 24MHz */
5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else if (cpu_system == __frv_mb93091_cb451) {
5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		//__clkin_clock_speed_HZ = 24000000UL; // CB451-FPGA
5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		unsigned short clkswr = *(volatile unsigned short *) 0xffc00104UL & 0x1fffUL;
5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (clkswr & 0x1000)
5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			__clkin_clock_speed_HZ = 60000000UL;
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			__clkin_clock_speed_HZ =
5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				((clkswr >> 8) & 0xf) * 10000000 +
5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				((clkswr >> 4) & 0xf) * 1000000 +
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				((clkswr     ) & 0xf) * 100000;
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* otherwise determine the clockspeed from VDK or other registers */
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else {
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__clkin_clock_speed_HZ = __get_CLKIN();
5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* look up the appropriate clock relationships table entry */
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mode = &undef_clock_cmode;
5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (clock_cmodes) {
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		tmode = &clock_cmodes[(clkc & CLKC_CMODE) >> CLKC_CMODE_s];
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (tmode->xbus)
5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			mode = tmode;
5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CLOCK(SRC,RATIO) ((SRC) * (((RATIO) >> 4) & 0x0f) / ((RATIO) & 0x0f))
5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (clock_doubled)
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__clkin_clock_speed_HZ <<= 1;
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__ext_bus_clock_speed_HZ	= CLOCK(__clkin_clock_speed_HZ, mode->xbus);
5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__sdram_clock_speed_HZ		= CLOCK(__clkin_clock_speed_HZ, mode->sdram);
5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__dsu_clock_speed_HZ		= CLOCK(__clkin_clock_speed_HZ, mode->dsu);
5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (clkc & CLKC_CM) {
5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 0: /* High */
5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__core_bus_clock_speed_HZ	= CLOCK(__clkin_clock_speed_HZ, mode->corebus);
5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__core_clock_speed_HZ		= CLOCK(__clkin_clock_speed_HZ, mode->core);
5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 1: /* Medium */
5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__core_bus_clock_speed_HZ	= CLOCK(__clkin_clock_speed_HZ, mode->sdram);
5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__core_clock_speed_HZ		= CLOCK(__clkin_clock_speed_HZ, mode->sdram);
5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 2: /* Low; not supported */
5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 3: /* UNDEF */
5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("Unsupported CLKC CM %ld\n", clkc & CLKC_CM);
5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		panic("Bye");
5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__res_bus_clock_speed_HZ = __ext_bus_clock_speed_HZ;
6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (clkc & CLKC_P0)
6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__res_bus_clock_speed_HZ >>= 1;
6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (verbose) {
6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("CLKIN: %lu.%3.3luMHz\n",
6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       __clkin_clock_speed_HZ / 1000000,
6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       (__clkin_clock_speed_HZ / 1000) % 1000);
6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("CLKS:"
6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       " ext=%luMHz res=%luMHz sdram=%luMHz cbus=%luMHz core=%luMHz dsu=%luMHz\n",
6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       __ext_bus_clock_speed_HZ / 1000000,
6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       __res_bus_clock_speed_HZ / 1000000,
6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       __sdram_clock_speed_HZ / 1000000,
6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       __core_bus_clock_speed_HZ / 1000000,
6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       __core_clock_speed_HZ / 1000000,
6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       __dsu_clock_speed_HZ / 1000000
6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		       );
6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* calculate the number of __delay() loop iterations per sec (2 insn loop) */
6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__delay_loops_MHz = __core_clock_speed_HZ / (1000000 * 2);
6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* set the serial prescaler */
6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__serial_clock_speed_HZ = __res_bus_clock_speed_HZ;
6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	quot = 1;
6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (__serial_clock_speed_HZ / quot / 16 / 65536 > 3000)
6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		quot += 1;
6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* double the divisor if P0 is clear, so that if/when P0 is set, it's still achievable
6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * - we have to be careful - dividing too much can mean we can't get 115200 baud
6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (__serial_clock_speed_HZ > 32000000 && !(clkc & CLKC_P0))
6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		quot <<= 1;
6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__serial_clock_speed_HZ /= quot;
6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__frv_uart0.uartclk = __serial_clock_speed_HZ;
6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__frv_uart1.uartclk = __serial_clock_speed_HZ;
6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (verbose)
6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("      uart=%luMHz\n", __serial_clock_speed_HZ / 1000000 * quot);
6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (!(__get_UART0_LSR() & UART_LSR_TEMT))
6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		continue;
6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (!(__get_UART1_LSR() & UART_LSR_TEMT))
6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		continue;
6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_UCPVR(quot);
6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_UCPSR(0);
6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end determine_clocks() */
6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * reserve some DMA consistent memory
6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_RESERVE_DMA_COHERENT
6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init reserve_dma_coherent(void)
6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long ampr;
6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* find the first non-kernel memory tile and steal it */
6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __steal_AMPR(r)						\
6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (__get_DAMPR(r) & xAMPRx_V) {			\
6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ampr = __get_DAMPR(r);				\
6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__set_DAMPR(r, ampr | xAMPRx_S | xAMPRx_C);	\
6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__set_IAMPR(r, 0);				\
6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto found;					\
6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__steal_AMPR(1);
6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__steal_AMPR(2);
6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__steal_AMPR(3);
6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__steal_AMPR(4);
6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__steal_AMPR(5);
6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__steal_AMPR(6);
6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (PSR_IMPLE(__get_PSR()) == PSR_IMPLE_FR551) {
6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__steal_AMPR(7);
6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__steal_AMPR(8);
6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__steal_AMPR(9);
6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__steal_AMPR(10);
6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__steal_AMPR(11);
6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__steal_AMPR(12);
6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__steal_AMPR(13);
6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		__steal_AMPR(14);
6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* unable to grant any DMA consistent memory */
6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("No DMA consistent memory reserved\n");
6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return;
6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds found:
6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dma_coherent_mem_start = ampr & xAMPRx_PPFN;
6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ampr &= xAMPRx_SS;
6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ampr >>= 4;
6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ampr = 1 << (ampr - 3 + 20);
6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dma_coherent_mem_end = dma_coherent_mem_start + ampr;
6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("DMA consistent memory reserved %lx-%lx\n",
7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       dma_coherent_mem_start, dma_coherent_mem_end);
7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end reserve_dma_coherent() */
7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * calibrate the delay loop
7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
710ec460ae52ef51eb329e08deda6beb97b1cc37d99Paul Gortmakervoid calibrate_delay(void)
7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	loops_per_jiffy = __delay_loops_MHz * (1000000 / HZ);
7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("Calibrating delay loop... %lu.%02lu BogoMIPS\n",
7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       loops_per_jiffy / (500000 / HZ),
7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	       (loops_per_jiffy / (5000 / HZ)) % 100);
7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end calibrate_delay() */
7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * look through the command line for some things we need to know immediately
7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init parse_cmdline_early(char *cmdline)
7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!cmdline)
7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (*cmdline) {
7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (*cmdline == ' ')
7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmdline++;
7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* "mem=XXX[kKmM]" sets SDRAM size to <mem>, overriding the value we worked
7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * out from the SDRAM controller mask register
7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
73698bd8d05ea5798ff3179ee33f0ca2789722ecc5aChen Gang		if (!strncmp(cmdline, "mem=", 4)) {
7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			unsigned long long mem_size;
7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			mem_size = memparse(cmdline + 4, &cmdline);
7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			memory_end = memory_start + mem_size;
7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while (*cmdline && *cmdline != ' ')
7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmdline++;
7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end parse_cmdline_early() */
7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init setup_arch(char **cmdline_p)
7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MMU
7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("Linux FR-V port done by Red Hat Inc <dhowells@redhat.com>\n");
7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("uClinux FR-V port done by Red Hat Inc <dhowells@redhat.com>\n");
7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7619c00f7613249b3b42782a226308353a4033c11c3Alon Bar-Lev	memcpy(boot_command_line, redboot_command_line, COMMAND_LINE_SIZE);
7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	determine_cpu();
7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	determine_clocks(1);
7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* For printk-directly-beats-on-serial-hardware hack */
7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	console_set_baud(115200);
7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_GDBSTUB
7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	gdbstub_set_baud(115200);
7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_RESERVE_DMA_COHERENT
7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	reserve_dma_coherent();
7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dump_memory_map();
7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MB93090_MB00
7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (mb93090_mb00_detected)
7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mb93090_display();
7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* register those serial ports that are available */
783f8aec7573b87d2bc09cafab459476953353d2efaDavid Howells#ifdef CONFIG_FRV_ONCPU_SERIAL
7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef CONFIG_GDBSTUB_UART0
7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__reg(UART0_BASE + UART_IER * 8) = 0;
7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	early_serial_setup(&__frv_uart0);
7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef CONFIG_GDBSTUB_UART1
7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__reg(UART1_BASE + UART_IER * 8) = 0;
7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	early_serial_setup(&__frv_uart1);
7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
792f8aec7573b87d2bc09cafab459476953353d2efaDavid Howells#endif
7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* deal with the command line - RedBoot may have passed one to the kernel */
7959c00f7613249b3b42782a226308353a4033c11c3Alon Bar-Lev	memcpy(command_line, boot_command_line, sizeof(command_line));
7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*cmdline_p = &command_line[0];
7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	parse_cmdline_early(command_line);
7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* set up the memory description
8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * - by now the stack is part of the init task */
8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("Memory %08lx-%08lx\n", memory_start, memory_end);
8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
803125e18745f16685f69a34fd6130d47598fc4bf54Eric Sesterhenn	BUG_ON(memory_start == memory_end);
8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8053515b737d3c1377874c5cba8b7db3d2477da3af3Geert Uytterhoeven	init_mm.start_code = (unsigned long) _stext;
8063515b737d3c1377874c5cba8b7db3d2477da3af3Geert Uytterhoeven	init_mm.end_code = (unsigned long) _etext;
8073515b737d3c1377874c5cba8b7db3d2477da3af3Geert Uytterhoeven	init_mm.end_data = (unsigned long) _edata;
8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 0 /* DAVIDM - don't set brk just incase someone decides to use it */
8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_mm.brk = (unsigned long) &_end;
8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_mm.brk = (unsigned long) 0;
8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef DEBUG
8153515b737d3c1377874c5cba8b7db3d2477da3af3Geert Uytterhoeven	printk("KERNEL -> TEXT=0x%p-0x%p DATA=0x%p-0x%p BSS=0x%p-0x%p\n",
8163515b737d3c1377874c5cba8b7db3d2477da3af3Geert Uytterhoeven	       _stext, _etext, _sdata, _edata, __bss_start, __bss_stop);
8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_VT
8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if defined(CONFIG_VGA_CONSOLE)
8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        conswitchp = &vga_con;
8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif defined(CONFIG_DUMMY_CONSOLE)
8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        conswitchp = &dummy_con;
8241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MMU
8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	setup_linux_memory();
8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	setup_uclinux_memory();
8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* get kmalloc into gear */
8341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	paging_init();
8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* init DMA */
8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	frv_dma_init();
8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef DEBUG
8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk("Done setup_arch\n");
8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* start the decrement timer running */
8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds//	asm volatile("movgs %0,timerd" :: "r"(10000000));
8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds//	__set_HSR(0, __get_HSR(0) | HSR0_ETMD);
8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end setup_arch() */
8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 0
8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
853b881bc469bdbdcca60e75047885509eb9886d3a2Greg Kroah-Hartmanstatic int setup_arch_serial(void)
8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
8551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* register those serial ports that are available */
8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef CONFIG_GDBSTUB_UART0
8571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	early_serial_setup(&__frv_uart0);
8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef CONFIG_GDBSTUB_UART1
8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	early_serial_setup(&__frv_uart1);
8611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end setup_arch_serial() */
8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldslate_initcall(setup_arch_serial);
8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
8711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * set up the memory map for normal MMU linux
8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
8731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MMU
8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init setup_linux_memory(void)
8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long bootmap_size, low_top_pfn, kstart, kend, high_mem;
8773f2b73c3c3e59cb9b94490d664b2439cd9c540e2Jiang Liu	unsigned long physpages;
8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kstart	= (unsigned long) &__kernel_image_start - PAGE_OFFSET;
8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kend	= (unsigned long) &__kernel_image_end - PAGE_OFFSET;
8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kstart = kstart & PAGE_MASK;
8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kend = (kend + PAGE_SIZE - 1) & PAGE_MASK;
8841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* give all the memory to the bootmap allocator,  tell it to put the
8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * boot mem_map immediately following the kernel image
8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
8881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bootmap_size = init_bootmem_node(NODE_DATA(0),
8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 kend >> PAGE_SHIFT,		/* map addr */
8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 memory_start >> PAGE_SHIFT,	/* start of RAM */
8911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 memory_end >> PAGE_SHIFT	/* end of RAM */
8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 );
8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* pass the memory that the kernel can immediately use over to the bootmem allocator */
8953f2b73c3c3e59cb9b94490d664b2439cd9c540e2Jiang Liu	max_mapnr = physpages = (memory_end - memory_start) >> PAGE_SHIFT;
8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	low_top_pfn = (KERNEL_LOWMEM_END - KERNEL_LOWMEM_START) >> PAGE_SHIFT;
8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	high_mem = 0;
8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8993f2b73c3c3e59cb9b94490d664b2439cd9c540e2Jiang Liu	if (physpages > low_top_pfn) {
9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HIGHMEM
9013f2b73c3c3e59cb9b94490d664b2439cd9c540e2Jiang Liu		high_mem = physpages - low_top_pfn;
9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
9033f2b73c3c3e59cb9b94490d664b2439cd9c540e2Jiang Liu		max_mapnr = physpages = low_top_pfn;
9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else {
9073f2b73c3c3e59cb9b94490d664b2439cd9c540e2Jiang Liu		low_top_pfn = physpages;
9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
9091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	min_low_pfn = memory_start >> PAGE_SHIFT;
9111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	max_low_pfn = low_top_pfn;
9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	max_pfn = memory_end >> PAGE_SHIFT;
9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	num_mappedpages = low_top_pfn;
9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_NOTICE "%ldMB LOWMEM available.\n", low_top_pfn >> (20 - PAGE_SHIFT));
9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	free_bootmem(memory_start, low_top_pfn << PAGE_SHIFT);
9191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_HIGHMEM
9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (high_mem)
9221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_NOTICE "%ldMB HIGHMEM available.\n", high_mem >> (20 - PAGE_SHIFT));
9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* take back the memory occupied by the kernel image and the bootmem alloc map */
92672a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle	reserve_bootmem(kstart, kend - kstart + bootmap_size,
92772a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle			BOOTMEM_DEFAULT);
9281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* reserve the memory occupied by the initial ramdisk */
9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_BLK_DEV_INITRD
9311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (LOADER_TYPE && INITRD_START) {
9321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (INITRD_START + INITRD_SIZE <= (low_top_pfn << PAGE_SHIFT)) {
93372a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle			reserve_bootmem(INITRD_START, INITRD_SIZE,
93472a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle					BOOTMEM_DEFAULT);
93519e5d9c0d2194b4b47189cbec2921cbf72b0bd1cHenry Nestler			initrd_start = INITRD_START + PAGE_OFFSET;
9361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			initrd_end = initrd_start + INITRD_SIZE;
9371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
9381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else {
9391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_ERR
9401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       "initrd extends beyond end of memory (0x%08lx > 0x%08lx)\n"
9411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       "disabling initrd\n",
9421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       INITRD_START + INITRD_SIZE,
9431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			       low_top_pfn << PAGE_SHIFT);
9441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			initrd_start = 0;
9451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end setup_linux_memory() */
9501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
9541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * set up the memory map for uClinux
9551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef CONFIG_MMU
9571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init setup_uclinux_memory(void)
9581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PROTECT_KERNEL
9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long dampr;
9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long kend;
9631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int bootmap_size;
9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kend = (unsigned long) &__kernel_image_end;
9661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kend = (kend + PAGE_SIZE - 1) & PAGE_MASK;
9671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* give all the memory to the bootmap allocator,  tell it to put the
9691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * boot mem_map immediately following the kernel image
9701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
9711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bootmap_size = init_bootmem_node(NODE_DATA(0),
9721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 kend >> PAGE_SHIFT,		/* map addr */
9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 memory_start >> PAGE_SHIFT,	/* start of RAM */
9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 memory_end >> PAGE_SHIFT	/* end of RAM */
9751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 );
9761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* free all the usable memory */
9781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	free_bootmem(memory_start, memory_end - memory_start);
9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	high_memory = (void *) (memory_end & PAGE_MASK);
9813f2b73c3c3e59cb9b94490d664b2439cd9c540e2Jiang Liu	max_mapnr = ((unsigned long) high_memory - PAGE_OFFSET) >> PAGE_SHIFT;
9821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	min_low_pfn = memory_start >> PAGE_SHIFT;
9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	max_low_pfn = memory_end >> PAGE_SHIFT;
9851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	max_pfn = max_low_pfn;
9861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* now take back the bits the core kernel is occupying */
9881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef CONFIG_PROTECT_KERNEL
98972a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle	reserve_bootmem(kend, bootmap_size, BOOTMEM_DEFAULT);
9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	reserve_bootmem((unsigned long) &__kernel_image_start,
99172a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle			kend - (unsigned long) &__kernel_image_start,
99272a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle			BOOTMEM_DEFAULT);
9931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
9951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dampr = __get_DAMPR(0);
9961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dampr &= xAMPRx_SS;
9971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dampr = (dampr >> 4) + 17;
9981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dampr = 1 << dampr;
9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
100072a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle	reserve_bootmem(__get_DAMPR(0) & xAMPRx_PPFN, dampr, BOOTMEM_DEFAULT);
10011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
10021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* reserve some memory to do uncached DMA through if requested */
10041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_RESERVE_DMA_COHERENT
10051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (dma_coherent_mem_start)
10061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		reserve_bootmem(dma_coherent_mem_start,
100772a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle				dma_coherent_mem_end - dma_coherent_mem_start,
100872a7fe3967dbf86cb34e24fbf1d957fe24d2f246Bernhard Walle				BOOTMEM_DEFAULT);
10091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
10101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end setup_uclinux_memory() */
10121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
10131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
10151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
10161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * get CPU information for use by procfs
10171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
10181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int show_cpuinfo(struct seq_file *m, void *v)
10191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
10201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const char *gr, *fr, *fm, *fp, *cm, *nem, *ble;
10211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM
10221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const char *sep;
10231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
10241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	gr  = cpu_hsr0_all & HSR0_GRHE	? "gr0-63"	: "gr0-31";
10261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	fr  = cpu_hsr0_all & HSR0_FRHE	? "fr0-63"	: "fr0-31";
10271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	fm  = cpu_psr_all  & PSR_EM	? ", Media"	: "";
10281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	fp  = cpu_psr_all  & PSR_EF	? ", FPU"	: "";
10291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cm  = cpu_psr_all  & PSR_CM	? ", CCCR"	: "";
10301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	nem = cpu_psr_all  & PSR_NEM	? ", NE"	: "";
10311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ble = cpu_psr_all  & PSR_BE	? "BE"		: "LE";
10321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m,
10341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   "CPU-Series:\t%s\n"
10351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   "CPU-Core:\t%s, %s, %s%s%s\n"
10361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   "CPU:\t\t%s\n"
10371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   "MMU:\t\t%s\n"
10381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   "FP-Media:\t%s%s%s\n"
10391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   "System:\t\t%s",
10401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   cpu_series,
10411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   cpu_core, gr, ble, cm, nem,
10421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   cpu_silicon,
10431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   cpu_mmu,
10441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   fr, fm, fp,
10451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   cpu_system);
10461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (cpu_board1)
10481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		seq_printf(m, ", %s", cpu_board1);
10491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (cpu_board2)
10511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		seq_printf(m, ", %s", cpu_board2);
10521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "\n");
10541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PM
10561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "PM-Controls:");
10571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sep = "\t";
10581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (clock_bits_settable & CLOCK_BIT_CMODE) {
10601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		seq_printf(m, "%scmode=0x%04hx", sep, clock_cmodes_permitted);
10611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sep = ", ";
10621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
10631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (clock_bits_settable & CLOCK_BIT_CM) {
10651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		seq_printf(m, "%scm=0x%lx", sep, clock_bits_settable & CLOCK_BIT_CM);
10661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sep = ", ";
10671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
10681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (clock_bits_settable & CLOCK_BIT_P0) {
10701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		seq_printf(m, "%sp0=0x3", sep);
10711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		sep = ", ";
10721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
10731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "%ssuspend=0x22\n", sep);
10751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
10761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m,
10781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   "PM-Status:\tcmode=%d, cm=%d, p0=%d\n",
10791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   clock_cmode_current, clock_cm_current, clock_p0_current);
10801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define print_clk(TAG, VAR) \
10821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m, "Clock-" TAG ":\t%lu.%2.2lu MHz\n", VAR / 1000000, (VAR / 10000) % 100)
10831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	print_clk("In",    __clkin_clock_speed_HZ);
10851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	print_clk("Core",  __core_clock_speed_HZ);
10861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	print_clk("SDRAM", __sdram_clock_speed_HZ);
10871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	print_clk("CBus",  __core_bus_clock_speed_HZ);
10881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	print_clk("Res",   __res_bus_clock_speed_HZ);
10891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	print_clk("Ext",   __ext_bus_clock_speed_HZ);
10901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	print_clk("DSU",   __dsu_clock_speed_HZ);
10911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	seq_printf(m,
10931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   "BogoMips:\t%lu.%02lu\n",
10941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   (loops_per_jiffy * HZ) / 500000, ((loops_per_jiffy * HZ) / 5000) % 100);
10951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
10971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end show_cpuinfo() */
10981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void *c_start(struct seq_file *m, loff_t *pos)
11001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
11011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return *pos < NR_CPUS ? (void *) 0x12345678 : NULL;
11021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
11031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void *c_next(struct seq_file *m, void *v, loff_t *pos)
11051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
11061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	++*pos;
11071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return c_start(m, pos);
11081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
11091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void c_stop(struct seq_file *m, void *v)
11111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
11121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
11131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
111403a44825be987d720df854f63b2f7bd30e46bddeJan Engelhardtconst struct seq_operations cpuinfo_op = {
11151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.start	= c_start,
11161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.next	= c_next,
11171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.stop	= c_stop,
11181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.show	= show_cpuinfo,
11191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
11201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid arch_gettod(int *year, int *mon, int *day, int *hour,
11221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 int *min, int *sec)
11231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
11241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*year = *mon = *day = *hour = *min = *sec = 0;
11251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
11261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
11281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
11291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
11301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
11311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MB93090_MB00
11321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init mb93090_sendlcdcmd(uint32_t cmd)
11331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
11341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long base = __addr_LCD();
11351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int loop;
11361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* request reading of the busy flag */
11381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_LCD(base, LCD_CMD_READ_BUSY);
11391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_LCD(base, LCD_CMD_READ_BUSY & ~LCD_E);
11401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* wait for the busy flag to become clear */
11421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (loop = 10000; loop > 0; loop--)
11431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!(__get_LCD(base) & 0x80))
11441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
11451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* send the command */
11471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_LCD(base, cmd);
11481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_LCD(base, cmd & ~LCD_E);
11491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end mb93090_sendlcdcmd() */
11511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*****************************************************************************/
11531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
11541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * write to the MB93090 LEDs and LCD
11551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
11561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __init mb93090_display(void)
11571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
11581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	const char *p;
11591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__set_LEDS(0);
11611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* set up the LCD */
11631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mb93090_sendlcdcmd(LCD_CMD_CLEAR);
11641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mb93090_sendlcdcmd(LCD_CMD_FUNCSET(1,1,0));
11651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mb93090_sendlcdcmd(LCD_CMD_ON(0,0));
11661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mb93090_sendlcdcmd(LCD_CMD_HOME);
11671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mb93090_sendlcdcmd(LCD_CMD_SET_DD_ADDR(0));
11691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (p = mb93090_banner; *p; p++)
11701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mb93090_sendlcdcmd(LCD_DATA_WRITE(*p));
11711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mb93090_sendlcdcmd(LCD_CMD_SET_DD_ADDR(64));
11731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (p = mb93090_version; *p; p++)
11741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mb93090_sendlcdcmd(LCD_DATA_WRITE(*p));
11751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} /* end mb93090_display() */
11771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif // CONFIG_MB93090_MB00
1179