1*94de0730Smatt /* $Id: common.c,v 1.4 2013/10/07 17:36:40 matt Exp $ */
2da8587eaSjkunz
3da8587eaSjkunz /*
4da8587eaSjkunz * Copyright (c) 2012 The NetBSD Foundation, Inc.
5da8587eaSjkunz * All rights reserved.
6da8587eaSjkunz *
7da8587eaSjkunz * This code is derived from software contributed to The NetBSD Foundation
8da8587eaSjkunz * by Petri Laakso.
9da8587eaSjkunz *
10da8587eaSjkunz * Redistribution and use in source and binary forms, with or without
11da8587eaSjkunz * modification, are permitted provided that the following conditions
12da8587eaSjkunz * are met:
13da8587eaSjkunz * 1. Redistributions of source code must retain the above copyright
14da8587eaSjkunz * notice, this list of conditions and the following disclaimer.
15da8587eaSjkunz * 2. Redistributions in binary form must reproduce the above copyright
16da8587eaSjkunz * notice, this list of conditions and the following disclaimer in the
17da8587eaSjkunz * documentation and/or other materials provided with the distribution.
18da8587eaSjkunz *
19da8587eaSjkunz * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20da8587eaSjkunz * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21da8587eaSjkunz * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22da8587eaSjkunz * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23da8587eaSjkunz * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24da8587eaSjkunz * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25da8587eaSjkunz * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26da8587eaSjkunz * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27da8587eaSjkunz * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28da8587eaSjkunz * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29da8587eaSjkunz * POSSIBILITY OF SUCH DAMAGE.
30da8587eaSjkunz */
31da8587eaSjkunz
32da8587eaSjkunz #include <sys/param.h>
335379dc38Sjkunz #include <sys/types.h>
34da8587eaSjkunz #include <sys/cdefs.h>
35da8587eaSjkunz
36*94de0730Smatt #include <lib/libsa/stand.h>
37*94de0730Smatt
38da8587eaSjkunz #include <arm/imx/imx23_digctlreg.h>
39da8587eaSjkunz #include <arm/imx/imx23_uartdbgreg.h>
40da8587eaSjkunz
41da8587eaSjkunz #include "common.h"
42da8587eaSjkunz
43da8587eaSjkunz /*
445379dc38Sjkunz * Delay us microseconds.
45da8587eaSjkunz */
46da8587eaSjkunz void
delay(unsigned int us)475379dc38Sjkunz delay(unsigned int us)
48da8587eaSjkunz {
49*94de0730Smatt volatile uint32_t *us_r;
50da8587eaSjkunz
51*94de0730Smatt us_r = (uint32_t *)(HW_DIGCTL_BASE + HW_DIGCTL_MICROSECONDS);
52da8587eaSjkunz
53*94de0730Smatt *us_r = 0;
54*94de0730Smatt while (*us_r < us)
55*94de0730Smatt ;
56da8587eaSjkunz
57da8587eaSjkunz return;
58da8587eaSjkunz }
59da8587eaSjkunz
60da8587eaSjkunz /*
61*94de0730Smatt * Write character c to debug UART.
62da8587eaSjkunz */
63da8587eaSjkunz void
putchar(int c)64*94de0730Smatt putchar(int c)
65da8587eaSjkunz {
66*94de0730Smatt volatile uint8_t *fr_r, *dr_r;
67*94de0730Smatt
68*94de0730Smatt fr_r = (uint8_t *)(HW_UARTDBG_BASE + HW_UARTDBGFR);
69*94de0730Smatt dr_r = (uint8_t *)(HW_UARTDBG_BASE + HW_UARTDBGDR);
70da8587eaSjkunz
71da8587eaSjkunz /* Wait until transmit FIFO has space for the new character. */
72*94de0730Smatt while (*fr_r & HW_UARTDBGFR_TXFF)
73*94de0730Smatt ;
74da8587eaSjkunz
75*94de0730Smatt *dr_r = c;
76*94de0730Smatt #ifdef DIAGNOSTIC
77*94de0730Smatt
785379dc38Sjkunz /* Flush: Wait until transmit FIFO contents are written to UART. */
79*94de0730Smatt while (!(*fr_r & HW_UARTDBGFR_TXFE))
80*94de0730Smatt ;
815379dc38Sjkunz #endif
82da8587eaSjkunz
83da8587eaSjkunz return;
84da8587eaSjkunz }
85bf9547b2Sjkunz
86bf9547b2Sjkunz /*
87bf9547b2Sjkunz * Read character from debug UART.
88bf9547b2Sjkunz */
89bf9547b2Sjkunz int
getchar(void)90bf9547b2Sjkunz getchar(void)
91bf9547b2Sjkunz {
92*94de0730Smatt volatile uint8_t *fr_r, *dr_r;
93*94de0730Smatt
94*94de0730Smatt fr_r = (uint8_t *)(HW_UARTDBG_BASE + HW_UARTDBGFR);
95*94de0730Smatt dr_r = (uint8_t *)(HW_UARTDBG_BASE + HW_UARTDBGDR);
96bf9547b2Sjkunz
97bf9547b2Sjkunz /* Wait until receive FIFO has character(s) */
98*94de0730Smatt while (*fr_r & HW_UARTDBGFR_RXFE)
99*94de0730Smatt ;
100bf9547b2Sjkunz
101*94de0730Smatt return *dr_r;
102*94de0730Smatt }
103bf9547b2Sjkunz
104*94de0730Smatt void
vpanic(const char * fmt,va_list ap)105*94de0730Smatt vpanic(const char *fmt, va_list ap)
106*94de0730Smatt {
107*94de0730Smatt printf(fmt, ap);
108*94de0730Smatt for(;;);
109*94de0730Smatt
110*94de0730Smatt /* NOTREACHED */
111bf9547b2Sjkunz }
112