2
* Copyright (C) 2004-2007 ARM Limited.
3
* Copyright (C) 2008 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License version 2
7
* as published by the Free Software Foundation.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
* As a special exception, if other files instantiate templates or use macros
19
* or inline functions from this file, or you compile this file and link it
20
* with other works to produce a work based on this file, this file does not
21
* by itself cause the resulting work to be covered by the GNU General Public
22
* License. However the source code for this file must still be made available
23
* in accordance with section (3) of the GNU General Public License.
25
* This exception does not invalidate any other reasons why a work based on
26
* this file might be covered by the GNU General Public License.
30
#include <stdio_dev.h>
32
#if defined(CONFIG_CPU_V6)
36
#define DCC_RBIT (1 << 30)
37
#define DCC_WBIT (1 << 29)
39
#define write_dcc(x) \
40
__asm__ volatile ("mcr p14, 0, %0, c0, c5, 0\n" : : "r" (x))
43
__asm__ volatile ("mrc p14, 0, %0, c0, c5, 0\n" : "=r" (x))
45
#define status_dcc(x) \
46
__asm__ volatile ("mrc p14, 0, %0, c0, c1, 0\n" : "=r" (x))
48
#elif defined(CONFIG_CPU_XSCALE)
52
#define DCC_RBIT (1 << 31)
53
#define DCC_WBIT (1 << 28)
55
#define write_dcc(x) \
56
__asm__ volatile ("mcr p14, 0, %0, c8, c0, 0\n" : : "r" (x))
59
__asm__ volatile ("mrc p14, 0, %0, c9, c0, 0\n" : "=r" (x))
61
#define status_dcc(x) \
62
__asm__ volatile ("mrc p14, 0, %0, c14, c0, 0\n" : "=r" (x))
65
#define DCC_RBIT (1 << 0)
66
#define DCC_WBIT (1 << 1)
68
#define write_dcc(x) \
69
__asm__ volatile ("mcr p14, 0, %0, c1, c0, 0\n" : : "r" (x))
72
__asm__ volatile ("mrc p14, 0, %0, c1, c0, 0\n" : "=r" (x))
74
#define status_dcc(x) \
75
__asm__ volatile ("mrc p14, 0, %0, c0, c0, 0\n" : "=r" (x))
79
#define can_read_dcc(x) do { \
84
#define can_write_dcc(x) do { \
90
#define TIMEOUT_COUNT 0x4000000
92
#ifndef CONFIG_ARM_DCC_MULTI
93
#define arm_dcc_init serial_init
94
void serial_setbrg(void) {}
95
#define arm_dcc_getc serial_getc
96
#define arm_dcc_putc serial_putc
97
#define arm_dcc_puts serial_puts
98
#define arm_dcc_tstc serial_tstc
101
int arm_dcc_init(void)
106
int arm_dcc_getc(void)
109
register unsigned int reg;
119
void arm_dcc_putc(char ch)
121
register unsigned int reg;
122
unsigned int timeout_count = TIMEOUT_COUNT;
124
while (--timeout_count) {
129
if (timeout_count == 0)
135
void arm_dcc_puts(const char *s)
141
int arm_dcc_tstc(void)
143
register unsigned int reg;
150
#ifdef CONFIG_ARM_DCC_MULTI
151
static struct stdio_dev arm_dcc_dev;
153
int drv_arm_dcc_init(void)
157
/* Device initialization */
158
memset(&arm_dcc_dev, 0, sizeof(arm_dcc_dev));
160
strcpy(arm_dcc_dev.name, "dcc");
161
arm_dcc_dev.ext = 0; /* No extensions */
162
arm_dcc_dev.flags = DEV_FLAGS_INPUT | DEV_FLAGS_OUTPUT;
163
arm_dcc_dev.tstc = arm_dcc_tstc; /* 'tstc' function */
164
arm_dcc_dev.getc = arm_dcc_getc; /* 'getc' function */
165
arm_dcc_dev.putc = arm_dcc_putc; /* 'putc' function */
166
arm_dcc_dev.puts = arm_dcc_puts; /* 'puts' function */
168
return stdio_register(&arm_dcc_dev);