Annotation of sys/arch/arm/sa11x0/sa11x0_com.c, Revision 1.2
1.1 nbrk 1: #include <sys/param.h>
2: #include <sys/systm.h>
3: #include <sys/proc.h>
4: #include <sys/tty.h>
5: #include <sys/conf.h>
6: #include <sys/device.h>
7:
8: #include <machine/bus.h>
9: #include <machine/cpu.h>
10: #include <machine/intr.h>
11:
12: #include <dev/cons.h>
13:
14: #include <arm/sa11x0/sa11x0_comreg.h>
15: #include <arm/sa11x0/sa11x0_reg.h>
16: #include <arm/sa11x0/sa11x0_var.h>
17:
18: #ifdef DDB
19: #include <ddb/db_var.h>
20: #endif
21:
22: cons_decl(sacom);
23: cons_decl(sacomfake);
24: void sacominit(bus_space_tag_t bust, bus_addr_t busa, int speed);
25: int sacomcnattach(bus_space_tag_t bust, bus_addr_t busa, int speed);
26: void sacomfakecnattach(bus_addr_t addr);
27:
28: /*
29: * Fake autoconf stuff.
30: */
31: struct cfdriver sacom_cd = {
32: NULL,
33: "sacom",
34: DV_TTY
35: };
36:
37: struct sacom_softc {
38: struct device sc_dev;
39: };
40:
41: int sacom_match(struct device *parent, void *match, void *aux);
42: void sacom_attach(struct device *parent, struct device *self, void *aux);
43:
44: struct cfattach sacom_ca = {
45: sizeof(struct sacom_softc),
46: sacom_match,
47: sacom_attach,
48: };
49:
50: int
51: sacom_match(struct device *parent, void *match, void *aux)
52: {
53: return (1);
54: }
55:
56: void
57: sacom_attach(struct device *parent, struct device *self, void *aux)
58: {
59: printf(": SA-11x0 UART\n");
60: return;
61: }
62:
63: /*
64: * Stuff for early sacom console support.
65: */
66: bus_space_tag_t sacom_bust;
67: bus_space_handle_t sacom_bush;
68: bus_addr_t sacom_base; /* XXX for early sacom */
69: int sacom_speed;
70: int sacom_attached;
71: struct consdev sacom_consdev = {
72: NULL /* probe */,
73: NULL, /* init */
74: sacomcngetc,
75: sacomcnputc,
76: NULL /* poll */,
77: NULL /* bell */,
78: NODEV,
79: CN_NORMAL
80: };
81: /* fake one (to use in bootstrap) */
82: struct consdev sacom_fakeconsdev = {
83: NULL /* probe */,
84: NULL, /* init */
85: sacomfakecngetc,
86: sacomfakecnputc,
87: NULL /* poll */,
88: NULL /* bell */,
89: NODEV,
90: CN_NORMAL
91: };
92:
93:
94: void
95: sacominit(bus_space_tag_t bust, bus_addr_t busa, int speed)
96: {
97: if (!sacom_attached && bus_space_map(bust, busa, 0x24, 0, &sacom_bush))
98: panic("sacomcninit: mapping failed");
99:
100: sacom_bust = bust;
101: sacom_attached = 1;
102: sacom_speed = speed;
103: }
104:
105: void
106: sacomcninit(struct consdev *p)
107: {
108: sacominit(sacom_bust, sacom_bush, sacom_speed);
109: }
110:
111: void
112: sacomfakecnattach(bus_addr_t addr)
113: {
114: /*
115: * XXX assume that loader (hpcboot) already set up UART3.
116: * Just point cn_tab at our fake putc & getc routines.
117: */
118:
119: sacom_base = addr;
120: cn_tab = &sacom_fakeconsdev;
121:
122: // sacom_attached = 1;
123: }
124:
125: int
126: sacomcnattach(bus_space_tag_t bust, bus_addr_t busa, int speed)
127: {
128: /*
129: * Early console attachment.
130: * Called from initarm() to print messages on boot.
131: */
132: // int s = splhigh();
133:
134: /* TODO: check state in which hpcboot leaves uart */
135:
136: if (!sacom_attached) {
137: sacominit(bust, busa, speed);
138:
139: cn_tab = &sacom_consdev;
140: sacom_attached = 1;
141: }
142:
143: // splx(s);
144:
145: return(0);
146: }
147:
148: /* ARGSUSED */
149: int
150: sacomcngetc(dev_t dev)
151: {
152: /* TODO */
153: #if 0
154: u_char stat;
155: int c, s;
156:
157: #ifdef lint
158: stat = dev; if (stat) return (0);
159: #endif
160:
161: s = splhigh();
162: while (((stat = sacom_cn->sacom_lsr) & LSR_RXRDY) == 0)
163: ;
164: c = sacom_cn->sacom_data;
165: stat = sacom_cn->sacom_iir;
166: splx(s);
167: return (c);
168: #endif /* 0 */
169: return(0);
170: }
171:
172: /* ARGSUSED */
173: int
174: sacomfakecngetc(dev_t dev)
175: {
176: /* TODO */
177: return(0);
178: }
179:
180: /*
181: * Console kernel output character routine.
182: */
183: /* ARGSUSED */
184: void
185: sacomcnputc(dev_t dev, int c)
186: {
187: int timo;
188: // int s = splhigh();
189: if (sacom_attached == 0) {
190: /* XXX */
191: panic("sacomcnputc: write to unattached device");
192:
193: }
194: /* wait for any pending transmission to finish */
195: timo = 50000;
196: while ((bus_space_read_4(sacom_bust, sacom_bush, SACOM_SR1) & SR1_TBY) == 1 && --timo)
197: ;
198:
199: bus_space_write_4(sacom_bust, sacom_bush, SACOM_DR, c);
200:
201: /* wait for this transmission to complete */
202: timo = 1500000;
203: while ((bus_space_read_4(sacom_bust, sacom_bush, SACOM_SR1) & SR1_TBY) == 1 && --timo)
204: ;
205: /* XXX clear just generated intrs */
206: // splx(s);
207:
208: }
209: /* ARGSUSED */
210: void
211: sacomfakecnputc(dev_t dev, int c)
212: {
213: int timo;
214:
215: /* wait for any pending transmission to finish */
216: timo = 50000;
1.2 ! nbrk 217: while (((*(volatile uint32_t *)(sacom_base + SACOM_SR1)) & SR1_TBY) == 1 && --timo)
1.1 nbrk 218: ;
219:
220: *(uint32_t *)(sacom_base + SACOM_DR) = c;
221:
222: /* wait for this transmission to complete */
223: timo = 1500000;
1.2 ! nbrk 224: while (((*(volatile uint32_t *)(sacom_base + SACOM_SR1)) & SR1_TBY) == 1 && --timo)
1.1 nbrk 225: ;
226: }
CVSweb