uncompress.h 4.9 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 * arch/arm/plat-omap/include/mach/uncompress.h
L
Linus Torvalds 已提交
3 4 5 6
 *
 * Serial port stubs for kernel decompress status messages
 *
 * Initially based on:
7
 * linux-2.4.15-rmk1-dsplinux1.6/arch/arm/plat-omap/include/mach1510/uncompress.h
L
Linus Torvalds 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21
 * Copyright (C) 2000 RidgeRun, Inc.
 * Author: Greg Lonnon <glonnon@ridgerun.com>
 *
 * Rewritten by:
 * Author: <source@mvista.com>
 * 2004 (c) MontaVista Software, Inc.
 *
 * This file is licensed under the terms of the GNU General Public License
 * version 2. This program is licensed "as is" without any warranty of any
 * kind, whether express or implied.
 */

#include <linux/types.h>
#include <linux/serial_reg.h>
22

23
#include <asm/memory.h>
24 25
#include <asm/mach-types.h>

26
#include <plat/serial.h>
L
Linus Torvalds 已提交
27

28 29
#define MDR1_MODE_MASK			0x07

30 31
volatile u8 *uart_base;
int uart_shift;
L
Linus Torvalds 已提交
32

33
/*
34
 * Store the DEBUG_LL uart number into memory.
35 36
 * See also debug-macro.S, and serial.c for related code.
 */
37
static void set_omap_uart_info(unsigned char port)
L
Linus Torvalds 已提交
38
{
39 40 41 42 43 44 45
	/*
	 * Get address of some.bss variable and round it down
	 * a la CONFIG_AUTO_ZRELADDR.
	 */
	u32 ram_start = (u32)&uart_shift & 0xf8000000;
	u32 *uart_info = (u32 *)(ram_start + OMAP_UART_INFO_OFS);
	*uart_info = port;
46
}
L
Linus Torvalds 已提交
47

48 49 50
static void putc(int c)
{
	if (!uart_base)
L
Linus Torvalds 已提交
51 52
		return;

53 54 55 56
	/* Check for UART 16x mode */
	if ((uart_base[UART_OMAP_MDR1 << uart_shift] & MDR1_MODE_MASK) != 0)
		return;

57
	while (!(uart_base[UART_LSR << uart_shift] & UART_LSR_THRE))
58
		barrier();
59
	uart_base[UART_TX << uart_shift] = c;
60 61 62 63
}

static inline void flush(void)
{
L
Linus Torvalds 已提交
64 65
}

66 67 68
/*
 * Macros to configure UART1 and debug UART
 */
69
#define _DEBUG_LL_ENTRY(mach, dbg_uart, dbg_shft, dbg_id)		\
70 71 72 73
	if (machine_is_##mach()) {					\
		uart_base = (volatile u8 *)(dbg_uart);			\
		uart_shift = (dbg_shft);				\
		port = (dbg_id);					\
74
		set_omap_uart_info(port);				\
75 76 77 78
		break;							\
	}

#define DEBUG_LL_OMAP7XX(p, mach)					\
79 80
	_DEBUG_LL_ENTRY(mach, OMAP1_UART##p##_BASE, OMAP7XX_PORT_SHIFT,	\
		OMAP1UART##p)
81 82

#define DEBUG_LL_OMAP1(p, mach)						\
83 84
	_DEBUG_LL_ENTRY(mach, OMAP1_UART##p##_BASE, OMAP_PORT_SHIFT,	\
		OMAP1UART##p)
85 86

#define DEBUG_LL_OMAP2(p, mach)						\
87 88
	_DEBUG_LL_ENTRY(mach, OMAP2_UART##p##_BASE, OMAP_PORT_SHIFT,	\
		OMAP2UART##p)
89 90

#define DEBUG_LL_OMAP3(p, mach)						\
91 92
	_DEBUG_LL_ENTRY(mach, OMAP3_UART##p##_BASE, OMAP_PORT_SHIFT,	\
		OMAP3UART##p)
93 94

#define DEBUG_LL_OMAP4(p, mach)						\
95 96
	_DEBUG_LL_ENTRY(mach, OMAP4_UART##p##_BASE, OMAP_PORT_SHIFT,	\
		OMAP4UART##p)
97 98 99

/* Zoom2/3 shift is different for UART1 and external port */
#define DEBUG_LL_ZOOM(mach)						\
100
	_DEBUG_LL_ENTRY(mach, ZOOM_UART_BASE, ZOOM_PORT_SHIFT, ZOOM_UART)
101

102 103 104
#define DEBUG_LL_TI81XX(p, mach)					\
	_DEBUG_LL_ENTRY(mach, TI81XX_UART##p##_BASE, OMAP_PORT_SHIFT,	\
		TI81XXUART##p)
105

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
static inline void __arch_decomp_setup(unsigned long arch_id)
{
	int port = 0;

	/*
	 * Initialize the port based on the machine ID from the bootloader.
	 * Note that we're using macros here instead of switch statement
	 * as machine_is functions are optimized out for the boards that
	 * are not selected.
	 */
	do {
		/* omap7xx/8xx based boards using UART1 with shift 0 */
		DEBUG_LL_OMAP7XX(1, herald);
		DEBUG_LL_OMAP7XX(1, omap_perseus2);

		/* omap15xx/16xx based boards using UART1 */
		DEBUG_LL_OMAP1(1, ams_delta);
		DEBUG_LL_OMAP1(1, nokia770);
		DEBUG_LL_OMAP1(1, omap_h2);
		DEBUG_LL_OMAP1(1, omap_h3);
		DEBUG_LL_OMAP1(1, omap_innovator);
		DEBUG_LL_OMAP1(1, omap_osk);
		DEBUG_LL_OMAP1(1, omap_palmte);
		DEBUG_LL_OMAP1(1, omap_palmz71);

		/* omap15xx/16xx based boards using UART2 */
		DEBUG_LL_OMAP1(2, omap_palmtt);

		/* omap15xx/16xx based boards using UART3 */
		DEBUG_LL_OMAP1(3, sx1);

		/* omap2 based boards using UART1 */
		DEBUG_LL_OMAP2(1, omap_2430sdp);
		DEBUG_LL_OMAP2(1, omap_apollon);
		DEBUG_LL_OMAP2(1, omap_h4);

		/* omap2 based boards using UART3 */
		DEBUG_LL_OMAP2(3, nokia_n800);
		DEBUG_LL_OMAP2(3, nokia_n810);
		DEBUG_LL_OMAP2(3, nokia_n810_wimax);

		/* omap3 based boards using UART1 */
		DEBUG_LL_OMAP2(1, omap3evm);
		DEBUG_LL_OMAP3(1, omap_3430sdp);
		DEBUG_LL_OMAP3(1, omap_3630sdp);
151 152
		DEBUG_LL_OMAP3(1, omap3530_lv_som);
		DEBUG_LL_OMAP3(1, omap3_torpedo);
153 154 155

		/* omap3 based boards using UART3 */
		DEBUG_LL_OMAP3(3, cm_t35);
156
		DEBUG_LL_OMAP3(3, cm_t3517);
157
		DEBUG_LL_OMAP3(3, cm_t3730);
S
Srinath 已提交
158
		DEBUG_LL_OMAP3(3, craneboard);
159
		DEBUG_LL_OMAP3(3, devkit8000);
160
		DEBUG_LL_OMAP3(3, igep0020);
161
		DEBUG_LL_OMAP3(3, igep0030);
162
		DEBUG_LL_OMAP3(3, nokia_rm680);
163 164 165 166 167 168 169 170 171 172
		DEBUG_LL_OMAP3(3, nokia_rx51);
		DEBUG_LL_OMAP3(3, omap3517evm);
		DEBUG_LL_OMAP3(3, omap3_beagle);
		DEBUG_LL_OMAP3(3, omap3_pandora);
		DEBUG_LL_OMAP3(3, omap_ldp);
		DEBUG_LL_OMAP3(3, overo);
		DEBUG_LL_OMAP3(3, touchbook);

		/* omap4 based boards using UART3 */
		DEBUG_LL_OMAP4(3, omap_4430sdp);
173
		DEBUG_LL_OMAP4(3, omap4_panda);
174 175 176 177 178

		/* zoom2/3 external uart */
		DEBUG_LL_ZOOM(omap_zoom2);
		DEBUG_LL_ZOOM(omap_zoom3);

179
		/* TI8168 base boards using UART3 */
180
		DEBUG_LL_TI81XX(3, ti8168evm);
181

182 183 184 185 186
	} while (0);
}

#define arch_decomp_setup()	__arch_decomp_setup(arch_id)

L
Linus Torvalds 已提交
187 188 189 190
/*
 * nothing to do
 */
#define arch_decomp_wdog()