uda1341.c revision 1.5 1 /* $NetBSD: uda1341.c,v 1.5 2003/07/15 00:25:08 lukem Exp $ */
2
3 /*-
4 * Copyright (c) 2001 The NetBSD Foundation, Inc. All rights reserved.
5 *
6 * This code is derived from software contributed to The NetBSD Foundation
7 * by Ichiro FUKUHARA (ichiro (at) ichiro.org).
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by the NetBSD
20 * Foundation, Inc. and its contributors.
21 * 4. Neither the name of The NetBSD Foundation nor the names of its
22 * contributors may be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
26 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38 #include <sys/cdefs.h>
39 __KERNEL_RCSID(0, "$NetBSD: uda1341.c,v 1.5 2003/07/15 00:25:08 lukem Exp $");
40
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/types.h>
44 #include <sys/conf.h>
45 #include <sys/file.h>
46 #include <sys/device.h>
47 #include <sys/kernel.h>
48 #include <sys/kthread.h>
49 #include <sys/malloc.h>
50
51 #include <machine/bus.h>
52
53 #include <hpcarm/dev/ipaq_saipvar.h>
54 #include <hpcarm/dev/ipaq_gpioreg.h>
55 #include <hpcarm/dev/uda1341.h>
56 #include <hpcarm/sa11x0/sa11x0_gpioreg.h>
57 #include <hpcarm/sa11x0/sa11x0_sspreg.h>
58
59 struct uda1341_softc {
60 struct device sc_dev;
61 bus_space_tag_t sc_iot;
62 bus_space_handle_t sc_ioh;
63 struct ipaq_softc *sc_parent;
64 };
65
66 static int uda1341_match(struct device *, struct cfdata *, void *);
67 static void uda1341_attach(struct device *, struct device *, void *);
68 static int uda1341_print(void *, const char *);
69 static int uda1341_search(struct device *, struct cfdata *, void *);
70
71 static void uda1341_output_high(struct uda1341_softc *);
72 static void uda1341_output_low(struct uda1341_softc *);
73 static void uda1341_L3_init(struct uda1341_softc *);
74 static void uda1341_init(struct uda1341_softc *);
75 static void uda1341_reset(struct uda1341_softc *);
76 static void uda1341_reginit(struct uda1341_softc *);
77
78 static int L3_getbit(struct uda1341_softc *);
79 static void L3_sendbit(struct uda1341_softc *, int);
80 static u_int8_t L3_getbyte(struct uda1341_softc *, int);
81 static void L3_sendbyte(struct uda1341_softc *, u_int8_t, int);
82 static int L3_read(struct uda1341_softc *, u_int8_t, u_int8_t *, int);
83 static int L3_write(struct uda1341_softc *, u_int8_t, u_int8_t *, int);
84
85 CFATTACH_DECL(uda, sizeof(struct uda1341_softc),
86 uda1341_match, uda1341_attach, NULL, NULL);
87
88 /*
89 * Philips L3 bus support.
90 * GPIO lines are used for clock, data and mode pins.
91 */
92 #define L3_DATA GPIO_H3600_L3_DATA
93 #define L3_MODE GPIO_H3600_L3_MODE
94 #define L3_CLK GPIO_H3600_L3_CLK
95
96 static struct {
97 u_int8_t data0; /* direct addressing register */
98 } DIRECT_REG = {0};
99
100 static struct {
101 u_int8_t data0; /* extended addressing register 1 */
102 u_int8_t data1; /* extended addressing register 2 */
103 } EXTEND_REG = {0, 0};
104
105 /*
106 * register space access macros
107 */
108 #define GPIO_WRITE(sc, reg, val) \
109 bus_space_write_4(sc->sc_iot, sc->sc_parent->sc_gpioh, reg, val)
110 #define GPIO_READ(sc, reg) \
111 bus_space_read_4(sc->sc_iot, sc->sc_parent->sc_gpioh, reg)
112 #define EGPIO_WRITE(sc) \
113 bus_space_write_2(sc->sc_iot, sc->sc_parent->sc_egpioh, \
114 0, sc->sc_parent->ipaq_egpio)
115 #define SSP_WRITE(sc, reg, val) \
116 bus_space_write_4(sc->sc_iot, sc->sc_parent->sc_ssph, reg, val)
117
118 static int
119 uda1341_match(parent, cf, aux)
120 struct device *parent;
121 struct cfdata *cf;
122 void *aux;
123 {
124 return (1);
125 }
126
127 static void
128 uda1341_attach(parent, self, aux)
129 struct device *parent;
130 struct device *self;
131 void *aux;
132 {
133 struct uda1341_softc *sc = (struct uda1341_softc *)self;
134 struct ipaq_softc *psc = (struct ipaq_softc *)parent;
135
136 printf("\n");
137 printf("%s: UDA1341 CODEC\n", sc->sc_dev.dv_xname);
138
139 sc->sc_iot = psc->sc_iot;
140 sc->sc_ioh = psc->sc_ioh;
141 sc->sc_parent = (struct ipaq_softc *)parent;
142
143 uda1341_L3_init(sc);
144 uda1341_init(sc);
145
146 uda1341_reset(sc);
147
148 uda1341_reginit(sc);
149
150
151 /*
152 * Attach each devices
153 */
154
155 config_search(uda1341_search, self, NULL);
156 }
157
158 static int
159 uda1341_search(parent, cf, aux)
160 struct device *parent;
161 struct cfdata *cf;
162 void *aux;
163 {
164 if (config_match(parent, cf, NULL) > 0)
165 config_attach(parent, cf, NULL, uda1341_print);
166 return 0;
167 }
168
169
170 static int
171 uda1341_print(aux, name)
172 void *aux;
173 const char *name;
174 {
175 return (UNCONF);
176 }
177
178 static void
179 uda1341_output_high(sc)
180 struct uda1341_softc *sc;
181 {
182 int cr;
183
184 GPIO_WRITE(sc, SAGPIO_PSR, (L3_DATA | L3_MODE | L3_CLK));
185 cr = GPIO_READ(sc, SAGPIO_PDR) | (L3_DATA | L3_MODE | L3_CLK);
186 GPIO_WRITE(sc, SAGPIO_PDR, cr);
187 }
188
189 static void
190 uda1341_output_low(sc)
191 struct uda1341_softc *sc;
192 {
193 int cr;
194
195 cr = GPIO_READ(sc, SAGPIO_PDR);
196 cr &= ~(L3_DATA | L3_MODE | L3_CLK);
197 GPIO_WRITE(sc, SAGPIO_PDR, cr);
198 }
199
200 static void
201 uda1341_L3_init(sc)
202 struct uda1341_softc *sc;
203 {
204 int cr;
205
206 cr = GPIO_READ(sc, SAGPIO_AFR);
207 cr &= ~(L3_DATA | L3_MODE | L3_CLK);
208 GPIO_WRITE(sc, SAGPIO_AFR, cr);
209
210 uda1341_output_low(sc);
211 }
212
213 static void
214 uda1341_init(sc)
215 struct uda1341_softc *sc;
216 {
217 int cr;
218
219 /* GPIO initialize */
220 cr = GPIO_READ(sc, SAGPIO_AFR);
221 cr &= ~(GPIO_ALT_SSP_TXD | GPIO_ALT_SSP_RXD | GPIO_ALT_SSP_SCLK |
222 GPIO_ALT_SSP_SFRM);
223 cr |= GPIO_ALT_SSP_CLK;
224 GPIO_WRITE(sc, SAGPIO_AFR, cr);
225
226 cr = GPIO_READ(sc, SAGPIO_PDR);
227 cr &= ~GPIO_ALT_SSP_CLK;
228 GPIO_WRITE(sc, SAGPIO_PDR, cr);
229
230 /* SSP initialize & enable */
231 SSP_WRITE(sc, SASSP_CR1, CR1_ECS);
232 cr = 0xF | (CR0_FRF_MASK & (1<<4)) | (CR0_SCR_MASK & (3<<8)) | CR0_SSE;
233 SSP_WRITE(sc, SASSP_CR0, cr);
234
235 /* Enable the audio power */
236 sc->sc_parent->ipaq_egpio |=
237 (EGPIO_H3600_AUD_PWRON | EGPIO_H3600_AUD_ON);
238 sc->sc_parent->ipaq_egpio &=
239 ~(EGPIO_H3600_CODEC_RESET | EGPIO_H3600_QMUTE);
240 EGPIO_WRITE(sc);
241
242 /* external clock configured for 44100 samples/sec */
243 cr = GPIO_READ(sc, SAGPIO_PDR);
244 cr |= (GPIO_H3600_CLK_SET0 | GPIO_H3600_CLK_SET1);
245 GPIO_WRITE(sc, SAGPIO_PDR, cr);
246 GPIO_WRITE(sc, SAGPIO_PSR, GPIO_H3600_CLK_SET0);
247 GPIO_WRITE(sc, SAGPIO_PCR, GPIO_H3600_CLK_SET1);
248
249 /* wait for power on */
250 delay(100*1000);
251 sc->sc_parent->ipaq_egpio |= EGPIO_H3600_CODEC_RESET;
252 EGPIO_WRITE(sc);
253
254 /* Wait for the UDA1341 to wake up */
255 delay(100*1000);
256 }
257
258 static void
259 uda1341_reset(sc)
260 struct uda1341_softc *sc;
261 {
262 u_int8_t command;
263
264 command = (L3_ADDRESS_COM << 2) | L3_ADDRESS_STATUS;
265 DIRECT_REG.data0 = STATUS0_RST | STATUS0_SC_256 | STATUS0_IF_LSB16;
266 L3_write(sc, command, (u_int8_t *) &DIRECT_REG, 1);
267
268 sc->sc_parent->ipaq_egpio &= ~EGPIO_H3600_CODEC_RESET;
269 EGPIO_WRITE(sc);
270 sc->sc_parent->ipaq_egpio |= EGPIO_H3600_CODEC_RESET;
271 EGPIO_WRITE(sc);
272
273 DIRECT_REG.data0 &= ~STATUS0_RST;
274 L3_write(sc, command, (u_int8_t *) &DIRECT_REG, 1);
275 }
276
277 static void
278 uda1341_reginit(sc)
279 struct uda1341_softc *sc;
280 {
281 u_int8_t command;
282
283 /* STATUS 0 */
284 command = (L3_ADDRESS_COM << 2) | L3_ADDRESS_STATUS;
285 DIRECT_REG.data0 = STATUS0_SC_256 | STATUS0_IF_LSB16;
286 L3_write(sc, command, (u_int8_t *) &DIRECT_REG, 1);
287
288 /* STATUS 1 */
289 DIRECT_REG.data0 = STATUS1_OGS | STATUS1_IGS | (1<<7);
290 L3_write(sc, command, (u_int8_t *) &DIRECT_REG, 1);
291
292 /* DATA 0 */
293 command = (L3_ADDRESS_COM << 2) | L3_ADDRESS_DATA0;
294 DIRECT_REG.data0 = DATA0_VC(100) | DATA0_COMMON;
295 L3_write(sc, command, (u_int8_t *) &DIRECT_REG, 1);
296
297 /* DATA 1 */
298 DIRECT_REG.data0 = DATA1_BB(0) | DATA1_TR(0) | DATA1_COMMON;
299 L3_write(sc, command, (u_int8_t *) &DIRECT_REG, 1);
300
301 /* DATA 2*/
302 DIRECT_REG.data0 = DATA2_PP | DATA2_COMMON;
303 L3_write(sc, command, (u_int8_t *) &DIRECT_REG, 1);
304
305 /* Extended DATA 0 */
306 EXTEND_REG.data0 = EXT_ADDR_COMMON | EXT_ADDR_E0;
307 EXTEND_REG.data1 = EXT_DATA_COMMN | 0x4 ;
308 L3_write(sc, command, (u_int8_t *) &EXTEND_REG, 2);
309
310 /* Extended DATA 1 */
311 EXTEND_REG.data0 = EXT_ADDR_COMMON | EXT_ADDR_E1;
312 EXTEND_REG.data1 = EXT_DATA_COMMN | 0x4 ;
313 L3_write(sc, command, (u_int8_t *) &EXTEND_REG, 2);
314
315 /* Extended DATA 2 */
316 EXTEND_REG.data0 = EXT_ADDR_COMMON | EXT_ADDR_E2;
317 EXTEND_REG.data1 = EXT_DATA_COMMN | DATA_E2_MS(30);
318 L3_write(sc, command, (u_int8_t *) &EXTEND_REG, 2);
319
320 /* Extended DATA 3 */
321 EXTEND_REG.data0 = EXT_ADDR_COMMON | EXT_ADDR_E3;
322 EXTEND_REG.data1 = EXT_DATA_COMMN | DATA_E3_IG_L(0);
323 L3_write(sc, command, (u_int8_t *) &EXTEND_REG, 2);
324
325 /* Extended DATA 4 */
326 EXTEND_REG.data0 = EXT_ADDR_COMMON | EXT_ADDR_E4;
327 EXTEND_REG.data1 = EXT_DATA_COMMN | DATA_E4_IG_H(0);
328 L3_write(sc, command, (u_int8_t *) &EXTEND_REG, 2);
329
330 /* Extended DATA 5 */
331 EXTEND_REG.data0 = EXT_ADDR_COMMON | EXT_ADDR_E5;
332 EXTEND_REG.data1 = EXT_DATA_COMMN;
333 L3_write(sc, command, (u_int8_t *) &EXTEND_REG, 2);
334 }
335
336 static int
337 L3_getbit(sc)
338 struct uda1341_softc *sc;
339 {
340 int cr, data;
341
342 GPIO_WRITE(sc, SAGPIO_PCR, L3_CLK); /* Clock down */
343 delay(L3_CLK_LOW);
344
345 cr = GPIO_READ(sc, SAGPIO_PLR);
346 data = (cr & L3_DATA) ? 1 : 0;
347
348 GPIO_WRITE(sc, SAGPIO_PSR, L3_CLK); /* Clock up */
349 delay(L3_CLK_HIGH);
350
351 return (data);
352 }
353
354 static void
355 L3_sendbit(sc, bit)
356 struct uda1341_softc *sc;
357 int bit;
358 {
359 GPIO_WRITE(sc, SAGPIO_PCR, L3_CLK); /* Clock down */
360
361 if (bit & 0x01)
362 GPIO_WRITE(sc, SAGPIO_PSR, L3_DATA);
363 else
364 GPIO_WRITE(sc, SAGPIO_PCR, L3_DATA);
365
366 delay(L3_CLK_LOW);
367 GPIO_WRITE(sc, SAGPIO_PSR, L3_CLK); /* Clock up */
368 delay(L3_CLK_HIGH);
369 }
370
371 static u_int8_t
372 L3_getbyte(sc, mode)
373 struct uda1341_softc *sc;
374 int mode;
375 {
376 int i;
377 u_int8_t data;
378
379 switch (mode) {
380 case 0: /* Address mode */
381 case 1: /* First data byte */
382 break;
383 default: /* second data byte via halt-Time */
384 GPIO_WRITE(sc, SAGPIO_PCR, L3_CLK); /* Clock down */
385 delay(L3_HALT);
386 GPIO_WRITE(sc, SAGPIO_PSR, L3_CLK); /* Clock up */
387 break;
388 }
389
390 delay(L3_MODE_SETUP);
391
392 for (i = 0; i < 8; i++)
393 data |= (L3_getbit(sc) << i);
394
395 delay(L3_MODE_HOLD);
396
397 return (data);
398 }
399
400 static void
401 L3_sendbyte(sc, data, mode)
402 struct uda1341_softc *sc;
403 u_int8_t data;
404 int mode;
405 {
406 int i;
407
408 switch (mode) {
409 case 0: /* Address mode */
410 GPIO_WRITE(sc, SAGPIO_PCR, L3_CLK); /* Clock down */
411 break;
412 case 1: /* First data byte */
413 break;
414 default: /* second data byte via halt-Time */
415 GPIO_WRITE(sc, SAGPIO_PCR, L3_CLK); /* Clock down */
416 delay(L3_HALT);
417 GPIO_WRITE(sc, SAGPIO_PSR, L3_CLK); /* Clock up */
418 break;
419 }
420
421 delay(L3_MODE_SETUP);
422
423 for (i = 0; i < 8; i++)
424 L3_sendbit(sc, data >> i);
425
426 if (mode == 0) /* Address mode */
427 GPIO_WRITE(sc, SAGPIO_PSR, L3_CLK); /* Clock up */
428
429 delay(L3_MODE_HOLD);
430 }
431
432 static int
433 L3_read(sc, addr, data, len)
434 struct uda1341_softc *sc;
435 u_int8_t addr, *data;
436 int len;
437 {
438 int cr, mode;
439 mode = 0;
440
441 uda1341_output_high(sc);
442 L3_sendbyte(sc, addr, mode++);
443
444 cr = GPIO_READ(sc, SAGPIO_PDR);
445 cr &= ~(L3_DATA);
446 GPIO_WRITE(sc, SAGPIO_PDR, cr);
447
448 while(len--)
449 *data++ = L3_getbyte(sc, mode++);
450 uda1341_output_low(sc);
451
452 return len;
453 }
454
455 static int
456 L3_write(sc, addr, data, len)
457 struct uda1341_softc *sc;
458 u_int8_t addr, *data;
459 int len;
460 {
461 int mode = 0;
462
463 uda1341_output_high(sc);
464 L3_sendbyte(sc, addr, mode++);
465 while(len--)
466 L3_sendbyte(sc, *data++, mode++);
467 uda1341_output_low(sc);
468
469 return len;
470 }
471