• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/arch/cris/arch-v32/kernel/
1/*
2 * Copyright (C) 2003, Axis Communications AB.
3 */
4
5#include <linux/console.h>
6#include <linux/init.h>
7#include <asm/system.h>
8#include <hwregs/reg_rdwr.h>
9#include <hwregs/reg_map.h>
10#include <hwregs/ser_defs.h>
11#include <hwregs/dma_defs.h>
12#include <mach/pinmux.h>
13
14struct dbg_port
15{
16	unsigned char nbr;
17	unsigned long instance;
18	unsigned int started;
19	unsigned long baudrate;
20	unsigned char parity;
21	unsigned int bits;
22};
23
24struct dbg_port ports[] =
25{
26  {
27    0,
28    regi_ser0,
29    0,
30    115200,
31    'N',
32    8
33  },
34  {
35    1,
36    regi_ser1,
37    0,
38    115200,
39    'N',
40    8
41  },
42  {
43    2,
44    regi_ser2,
45    0,
46    115200,
47    'N',
48    8
49  },
50  {
51    3,
52    regi_ser3,
53    0,
54    115200,
55    'N',
56    8
57  },
58#if CONFIG_ETRAX_SERIAL_PORTS == 5
59  {
60    4,
61    regi_ser4,
62    0,
63    115200,
64    'N',
65    8
66  },
67#endif
68};
69static struct dbg_port *port =
70#if defined(CONFIG_ETRAX_DEBUG_PORT0)
71	&ports[0];
72#elif defined(CONFIG_ETRAX_DEBUG_PORT1)
73	&ports[1];
74#elif defined(CONFIG_ETRAX_DEBUG_PORT2)
75	&ports[2];
76#elif defined(CONFIG_ETRAX_DEBUG_PORT3)
77	&ports[3];
78#elif defined(CONFIG_ETRAX_DEBUG_PORT4)
79	&ports[4];
80#else
81	NULL;
82#endif
83
84#ifdef CONFIG_ETRAX_KGDB
85static struct dbg_port *kgdb_port =
86#if defined(CONFIG_ETRAX_KGDB_PORT0)
87	&ports[0];
88#elif defined(CONFIG_ETRAX_KGDB_PORT1)
89	&ports[1];
90#elif defined(CONFIG_ETRAX_KGDB_PORT2)
91	&ports[2];
92#elif defined(CONFIG_ETRAX_KGDB_PORT3)
93	&ports[3];
94#elif defined(CONFIG_ETRAX_KGDB_PORT4)
95	&ports[4];
96#else
97	NULL;
98#endif
99#endif
100
101static void
102start_port(struct dbg_port* p)
103{
104	if (!p)
105		return;
106
107	if (p->started)
108		return;
109	p->started = 1;
110
111	if (p->nbr == 1)
112		crisv32_pinmux_alloc_fixed(pinmux_ser1);
113	else if (p->nbr == 2)
114		crisv32_pinmux_alloc_fixed(pinmux_ser2);
115	else if (p->nbr == 3)
116		crisv32_pinmux_alloc_fixed(pinmux_ser3);
117#if CONFIG_ETRAX_SERIAL_PORTS == 5
118	else if (p->nbr == 4)
119		crisv32_pinmux_alloc_fixed(pinmux_ser4);
120#endif
121
122	/* Set up serial port registers */
123	reg_ser_rw_tr_ctrl tr_ctrl = {0};
124	reg_ser_rw_tr_dma_en tr_dma_en = {0};
125
126	reg_ser_rw_rec_ctrl rec_ctrl = {0};
127	reg_ser_rw_tr_baud_div tr_baud_div = {0};
128	reg_ser_rw_rec_baud_div rec_baud_div = {0};
129
130	tr_ctrl.base_freq = rec_ctrl.base_freq = regk_ser_f29_493;
131	tr_dma_en.en = rec_ctrl.dma_mode = regk_ser_no;
132	tr_baud_div.div = rec_baud_div.div = 29493000 / p->baudrate / 8;
133	tr_ctrl.en = rec_ctrl.en = 1;
134
135	if (p->parity == 'O')
136	{
137		tr_ctrl.par_en = regk_ser_yes;
138		tr_ctrl.par = regk_ser_odd;
139		rec_ctrl.par_en = regk_ser_yes;
140		rec_ctrl.par = regk_ser_odd;
141	}
142	else if (p->parity == 'E')
143	{
144		tr_ctrl.par_en = regk_ser_yes;
145		tr_ctrl.par = regk_ser_even;
146		rec_ctrl.par_en = regk_ser_yes;
147		rec_ctrl.par = regk_ser_odd;
148	}
149
150	if (p->bits == 7)
151	{
152		tr_ctrl.data_bits = regk_ser_bits7;
153		rec_ctrl.data_bits = regk_ser_bits7;
154	}
155
156	REG_WR (ser, p->instance, rw_tr_baud_div, tr_baud_div);
157	REG_WR (ser, p->instance, rw_rec_baud_div, rec_baud_div);
158	REG_WR (ser, p->instance, rw_tr_dma_en, tr_dma_en);
159	REG_WR (ser, p->instance, rw_tr_ctrl, tr_ctrl);
160	REG_WR (ser, p->instance, rw_rec_ctrl, rec_ctrl);
161}
162
163#ifdef CONFIG_ETRAX_KGDB
164/* Use polling to get a single character from the kernel debug port */
165int
166getDebugChar(void)
167{
168	reg_ser_rs_stat_din stat;
169	reg_ser_rw_ack_intr ack_intr = { 0 };
170
171	do {
172		stat = REG_RD(ser, kgdb_port->instance, rs_stat_din);
173	} while (!stat.dav);
174
175	/* Ack the data_avail interrupt. */
176	ack_intr.dav = 1;
177	REG_WR(ser, kgdb_port->instance, rw_ack_intr, ack_intr);
178
179	return stat.data;
180}
181
182/* Use polling to put a single character to the kernel debug port */
183void
184putDebugChar(int val)
185{
186	reg_ser_r_stat_din stat;
187	do {
188		stat = REG_RD(ser, kgdb_port->instance, r_stat_din);
189	} while (!stat.tr_rdy);
190	REG_WR_INT(ser, kgdb_port->instance, rw_dout, val);
191}
192#endif /* CONFIG_ETRAX_KGDB */
193
194/* Register console for printk's, etc. */
195int __init
196init_etrax_debug(void)
197{
198        start_port(port);
199
200#ifdef CONFIG_ETRAX_KGDB
201	start_port(kgdb_port);
202#endif /* CONFIG_ETRAX_KGDB */
203	return 0;
204}
205