|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991
27: * All Rights Reserved
28: *
29: * Permission to use, copy, modify, and distribute this software and
30: * its documentation for any purpose and without fee is hereby granted,
31: * provided that the above copyright notice appears in all copies and
32: * that both the copyright notice and this permission notice appear in
33: * supporting documentation.
34: *
35: * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
36: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
37: * FOR A PARTICULAR PURPOSE.
38: *
39: * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
40: * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
41: * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
42: * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
43: * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
44: *
45: */
46: /*
47: * Copyright 1996 1995 by Apple Computer, Inc. 1997 1996 1995 1994 1993 1992 1991
48: * All Rights Reserved
49: *
50: * Permission to use, copy, modify, and distribute this software and
51: * its documentation for any purpose and without fee is hereby granted,
52: * provided that the above copyright notice appears in all copies and
53: * that both the copyright notice and this permission notice appear in
54: * supporting documentation.
55: *
56: * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
57: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
58: * FOR A PARTICULAR PURPOSE.
59: *
60: * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
61: * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
62: * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
63: * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
64: * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
65: */
66: /*
67: * MKLINUX-1.0DR2
68: */
69:
70: /*
71: * ADB Driver - used internally by ADB device drivers
72: *
73: * Currently this is heavily tied to the design of
74: * the CUDA hardware and MACH driver
75: */
76:
77:
78: #include <mach_kdb.h>
79: #include <mach/mach_types.h>
80: #include <machdep/ppc/powermac.h> //for HasPMU() definition
81: #include <sys/tty.h>
82: #include <sys/conf.h>
83: #include "busses.h"
84: #include "adb.h"
85: #include "adb_io.h"
86: #include "drvPMU/pmu.h"
87:
88: void waitForCallback(void);
89: void ADBcallback(id, UInt32, UInt32, UInt8 *);
90: void ADBReadCallback(id, UInt32, UInt32, UInt8 *);
91: void ADBReadCallback2(id, UInt32, UInt32, UInt8 *);
92: void inputHandler(id, UInt32, UInt32, UInt32, UInt8*);
93:
94: id PMUdriver = NULL;
95: UInt8 read_buffer[8];
96: int read_length;
97: boolean_t adb_initted = FALSE;
98: int adb_count = 0;
99:
100: adb_request_t *adb_queue_root = NULL, *adb_queue_end = NULL;
101:
102: #define ADB_POOL_COUNT 16
103:
104: adb_device_t adb_devices[ADB_DEVICE_COUNT];
105: adb_request_t adb_async_requests[ADB_POOL_COUNT], *adb_async_pool;
106: boolean_t adb_hardware = FALSE;
107:
108:
109: void adbattach( struct bus_device *device);
110: int adbprobe(caddr_t addr, void *ui);
111:
112: struct bus_device *adb_info[NADB];
113:
114: void
115: InitializeADB(void)
116: {
117:
118: if (adb_hardware == FALSE) {
119: [PMUdriver registerForADBAutopoll:inputHandler:(id)NULL];
120: adb_hardware = TRUE;
121: adbprobe(0, 0);
122: }
123: }
124:
125:
126: static int
127: adb_is_dev_present(unsigned short addr)
128: {
129: struct adb_device *devp = &adb_devices[addr];
130: unsigned short value;
131: int retval;
132:
133: //kprintf("adb_is_dev_present: addr = %08x, devp = %08x\n", addr, devp);
134:
135: retval = adb_readreg(addr, 3, &value);
136:
137: //kprintf("adb_is_dev_present: retval = %08x, ADB_RET_TIMEOUT = %08x\n",
138: // retval, ADB_RET_TIMEOUT);
139:
140: #if notdef_next // DEBUG
141: if (retval != ADB_RET_TIMEOUT)
142: printf("adb_is_dev_present(%2d) returned %d\n", addr, retval);
143: #endif /* DEBUG */
144: if (retval != ADB_RET_TIMEOUT) {
145:
146: //kprintf("adb_is_dev_present: value = %08x\n", value);
147:
148: devp->a_dev_addr = (value >> 8) & 0xf;
149: devp->a_dev_orighandler = devp->a_dev_handler = (value & 0xff);
150: devp->a_flags |= ADB_FLAGS_PRESENT;
151: return TRUE;
152: }
153:
154: return FALSE;
155: }
156:
157: int
158: adb_set_handler(struct adb_device *devp, int handler)
159: {
160: unsigned long retval;
161: unsigned short value;
162:
163: retval = adb_readreg(devp->a_addr, 3, &value);
164:
165: if (retval != ADB_RET_OK)
166: return( retval);
167:
168: value = (value & 0xF000) | handler;
169:
170: retval = adb_writereg(devp->a_addr, 3, value);
171:
172: if (retval != ADB_RET_OK)
173: return( retval);
174:
175: retval = adb_readreg(devp->a_addr, 3, &value);
176:
177: if (retval != ADB_RET_OK)
178: return( retval);
179:
180: if( (value & 0xFF) != handler)
181: retval = ADB_RET_UNEXPECTED_RESULT;
182:
183: /* Update to new handler/id */
184: devp->a_dev_handler = (value & 0xff);
185:
186:
187: return( retval);
188: }
189:
190: static void
191: adb_move_dev(unsigned short from, unsigned short to)
192: {
193: int addr;
194: adb_writereg(from, 3, ((to << 8) | 0xfe));
195:
196: addr = adb_devices[to].a_addr;
197: adb_devices[to] = adb_devices[from];
198: adb_devices[to].a_addr = addr;
199: adb_devices[from].a_flags = 0;
200:
201: return;
202: }
203:
204: static boolean_t
205: adb_find_unresolved_dev(unsigned short *devnum)
206: {
207: int i;
208: struct adb_device *devp;
209:
210: devp = &adb_devices[1];
211:
212: for (i = 1; i < ADB_DEVICE_COUNT; i++, devp++) {
213: if (devp->a_flags & ADB_FLAGS_UNRESOLVED) {
214: *devnum = i;
215: return TRUE;
216: }
217: }
218:
219: return FALSE;
220: }
221:
222: static int
223: adb_find_freedev(void)
224: {
225: struct adb_device *devp;
226: int i;
227:
228: for (i = ADB_DEVICE_COUNT-1; i >= 1; i--) {
229: devp = &adb_devices[i];
230:
231: if ((devp->a_flags & ADB_FLAGS_PRESENT) == 0)
232: return i;
233: }
234:
235: panic("ADB: Cannot find a free ADB slot for reassignment!");
236: return -1;
237: }
238:
239: int
240: adbprobe(caddr_t addr, void *ui)
241: {
242: unsigned short devnum, freenum, devlist;
243: struct adb_device *devp;
244: int i;
245: spl_t s;
246:
247: //kprintf("adbprobe: Begining\n");
248:
249: if (adb_initted)
250: return 1;
251:
252: //kprintf("adbprobe: Not initted\n");
253:
254: for (i = 0; i < ADB_POOL_COUNT; i++) {
255: adb_async_requests[i].a_next = adb_async_pool;
256: adb_async_pool = &adb_async_requests[i];
257: }
258:
259: s = spltty();
260:
261: /* Kill the auto poll until a new dev id's have been setup */
262:
263: if ( [PMUdriver ADBPollDisable:(UInt32)current_thread():0:ADBcallback] == kPMUNoError ) {
264: waitForCallback();
265: }
266: /*
267: * Send a ADB bus reset - reply is sent after bus has reset,
268: * so there is no need to wait for the reset to complete.
269: */
270:
271: if ( [PMUdriver ADBReset:(UInt32)current_thread():0:ADBcallback] == kPMUNoError ) {
272: waitForCallback();
273: }
274: /*
275: * Okay, now attempt reassign the
276: * bus
277: */
278:
279: //kprintf("adbprobe: probing\n");
280:
281: /* Skip 0 -- its special! */
282: for (i = 1; i < ADB_DEVICE_COUNT; i++) {
283: adb_devices[i].a_addr = i;
284:
285: //kprintf("adbprobe: probing %x\n", i);
286:
287: if (adb_is_dev_present(i)) {
288:
289: //kprintf("adbprobe: adb_is_dev_present\n");
290:
291: adb_devices[i].a_dev_type = i;
292: adb_devices[i].a_flags |= ADB_FLAGS_UNRESOLVED;
293: }
294: }
295:
296: /* Now attempt to reassign the addresses */
297: while (adb_find_unresolved_dev(&devnum)) {
298: freenum = adb_find_freedev();
299: adb_move_dev(devnum, freenum);
300:
301: if (!adb_is_dev_present(freenum)) {
302: /* It didn't move.. damn! */
303: adb_devices[devnum].a_flags &= ~ADB_FLAGS_UNRESOLVED;
304: printf("WARNING : ADB DEVICE %d having problems "
305: "probing!\n", devnum);
306: continue;
307: }
308:
309: if (!adb_is_dev_present(devnum)) {
310: /* no more at this address, good !*/
311: /* Move it back.. */
312:
313: adb_move_dev(freenum, devnum);
314:
315: /* Check the device to talk again.. */
316: (void) adb_is_dev_present(devnum);
317: adb_devices[devnum].a_flags &= ~ADB_FLAGS_UNRESOLVED;
318: } else {
319: /* Found another device at the address, leave
320: * the first device moved to one side and set up
321: * newly found device for probing
322: */
323: /* device_present already called on freenum above */
324: adb_devices[freenum].a_flags &= ~ADB_FLAGS_UNRESOLVED;
325:
326: /* device_present already called on devnum above */
327: adb_devices[devnum].a_dev_type = devnum;
328: adb_devices[devnum].a_flags |= ADB_FLAGS_UNRESOLVED;
329: #if 0
330: printf("Found hidden device at %d, previous device "
331: "moved to %d\n", devnum, freenum);
332: #endif /* DEBUG */
333: }
334: }
335:
336: /*
337: * Now build up a dev list bitmap and total device count
338: */
339:
340: devp = adb_devices;
341: devlist = 0;
342:
343: for (i = 0; i < ADB_DEVICE_COUNT; i++, devp++) {
344: if ((devp->a_flags & ADB_FLAGS_PRESENT) == 0)
345: continue;
346:
347: devlist |= (1<<i);
348: adb_count++;
349: }
350:
351:
352: // ADBSetPollList calls the callback before it returns when
353: // autopolling is off.
354: if (HasPMU())
355: {
356: [PMUdriver ADBSetPollList:devlist:0:0:NULL];
357: //PG&E doesn't perform this hardware operation immediately
358: // so it's OK not to wait for callback
359: }
360: else
361: if ( [PMUdriver ADBSetPollList:devlist:(UInt32)current_thread():0:ADBcallback] == kPMUNoError)
362: {
363: waitForCallback();
364: }
365:
366:
367: if ( [PMUdriver ADBSetPollRate:11:(UInt32)current_thread():0:ADBcallback] == kPMUNoError ) {
368: waitForCallback();
369: }
370:
371: if ( [PMUdriver ADBPollEnable:(UInt32)current_thread():0:ADBcallback] == kPMUNoError ) {
372: waitForCallback();
373: }
374:
375: if ( [PMUdriver ADBSetFileServerMode:(UInt32)current_thread():0:ADBcallback] == kPMUNoError ) {
376: waitForCallback();
377: }
378:
379:
380: adb_initted = TRUE;
381: splx(s);
382:
383: return 1;
384: }
385:
386: void
387: adbattach( struct bus_device *device)
388: {
389: int i;
390: adb_device_t *devp = &adb_devices[0];
391:
392: printf("\nadb0: %d devices on bus.\n", adb_count);
393: for (i = 0; i < ADB_DEVICE_COUNT; i++, devp++) {
394: if (devp->a_flags & ADB_FLAGS_PRESENT) {
395: printf(" %d: ", i);
396: switch (devp->a_dev_type) {
397: case ADB_DEV_PROTECT:
398: printf("security device");
399: break;
400: case ADB_DEV_KEYBOARD:
401: printf("keyboard");
402: break;
403: case ADB_DEV_MOUSE:
404: printf("mouse");
405: break;
406: case ADB_DEV_TABLET:
407: printf("tablet");
408: break;
409: case ADB_DEV_MODEM:
410: printf("modem");
411: break;
412: case ADB_DEV_APPL:
413: printf("application device");
414: break;
415: default:
416: printf("unknown device id=%d", i);
417: }
418: printf("\n");
419: }
420: }
421: }
422:
423: /*
424: * adbopen
425: *
426: */
427:
428: io_return_t
429: adbopen(dev_t dev, dev_mode_t flag, io_req_t ior)
430: {
431: return D_SUCCESS;
432: }
433:
434: void
435: adbclose(dev_t dev)
436: {
437: return;
438: }
439:
440: io_return_t
441: adbread(dev_t dev, io_req_t ior)
442: {
443: return D_INVALID_OPERATION;
444: }
445:
446: io_return_t
447: adbwrite(dev_t dev, io_req_t ior)
448: {
449: return D_INVALID_OPERATION;
450: }
451:
452: boolean_t
453: adbportdeath(dev_t dev, ipc_port_t port)
454: {
455: return FALSE;
456: }
457:
458: #if 0
459: io_return_t
460: adbgetstatus(dev_t dev, dev_flavor_t flavor, dev_status_t data,
461: mach_msg_type_number_t *status_count)
462: {
463: /* DS1
464: struct adb_info *info = (struct adb_info *) data;
465: struct adb_device *devp;
466: int i;
467:
468: switch (flavor) {
469: case ADB_GET_INFO:
470: devp = adb_devices;
471: for (i = 0; i < ADB_DEVICE_COUNT; i++, devp++) {
472: if ((devp->a_flags & ADB_FLAGS_PRESENT) == 0)
473: continue;
474:
475: info->a_addr = devp->a_addr;
476: info->a_type = devp->a_dev_type;
477: info->a_handler = devp->a_dev_handler;
478: info->a_orighandler = devp->a_dev_orighandler;
479: info++;
480: }
481: *status_count = (sizeof(struct adb_info)*adb_count)/sizeof(int);
482: break;
483:
484: case ADB_GET_COUNT:
485: *((unsigned int *) data) = adb_count;
486: *status_count = 1;
487: break;
488:
489: case ADB_READ_DATA: {
490: struct adb_regdata *reg = (struct adb_regdata *) data;
491:
492: reg->a_count = adb_reg_data.a_reply.a_bcount;
493: bcopy((char *) adb_reg_data.a_reply.a_buffer,
494: (char *) reg->a_buffer, adb_reg_data.a_reply.a_bcount);
495: *status_count = (sizeof(struct adb_regdata))/sizeof(int);
496: }
497: break;
498:
499: default:
500: return D_INVALID_OPERATION;
501: }
502: DS1 */
503: return D_SUCCESS;
504: }
505:
506: io_return_t
507: adbsetstatus(dev_t dev, dev_flavor_t flavor, dev_status_t data,
508: mach_msg_type_number_t status_count)
509: {
510: /* DS1
511: struct adb_info *info = (struct adb_info *) data;
512: struct adb_device *devp;
513:
514: switch (flavor) {
515: case ADB_SET_HANDLER:
516: if (info->a_addr < 1 || info->a_addr >= ADB_DEVICE_COUNT)
517: return D_NO_SUCH_DEVICE;
518:
519: devp = &adb_devices[info->a_addr];
520: adb_set_handler(devp, info->a_handler);
521: if (devp->a_dev_handler != info->a_handler)
522: return D_READ_ONLY;
523: break;
524:
525: case ADB_READ_REG: {
526: struct adb_regdata *reg = (struct adb_regdata *) data;
527:
528: adb_init_request(&adb_reg_data);
529: ADB_BUILD_CMD2(&adb_reg_data, ADB_PACKET_ADB,
530: (ADB_ADBCMD_READ_ADB|(reg->a_addr<<4)|reg->a_reg));
531:
532: adb_send(&adb_reg_data, TRUE);
533:
534: if (adb_reg_data.a_result != ADB_RET_OK)
535: return D_IO_ERROR;
536:
537: }
538: break;
539:
540: case ADB_WRITE_REG: {
541: struct adb_regdata *reg = (struct adb_regdata *) data;
542:
543: adb_init_request(&adb_reg_data);
544: ADB_BUILD_CMD2_BUFFER(&adb_reg_data, ADB_PACKET_ADB,
545: (ADB_ADBCMD_WRITE_ADB|(reg->a_addr<<4)|reg->a_reg),
546: reg->a_count, ®->a_buffer);
547:
548: adb_send(&adb_reg_data, TRUE);
549:
550: if (adb_reg_data.a_result != ADB_RET_OK)
551: return D_IO_ERROR;
552: }
553: break;
554:
555: default:
556: return D_INVALID_OPERATION;
557: }
558: DS1 */
559: return D_SUCCESS;
560: }
561: #endif
562:
563: /*
564: * Register a routine which is to send events from all
565: * devices matching a given type.
566: */
567:
568: void
569: adb_register_handler(int type,
570: void (*handler)(int number, unsigned char *packet, int count, void * ssp))
571: {
572: int dev;
573: adb_device_t *devp;
574:
575: //kprintf("adb_register_handler: type = %08x, handler = %08x\n",
576: // type, handler);
577:
578: for (dev = 0; dev < ADB_DEVICE_COUNT; dev++) {
579: devp = &adb_devices[dev];
580:
581: //kprintf("adb_register_handler: dev = %08x, devp = %08x, devp->a_dev_type = %08x\n", dev, devp, devp->a_dev_type);
582:
583: if (devp->a_dev_type != type)
584: continue;
585:
586: devp->a_flags |= ADB_FLAGS_REGISTERED;
587: devp->a_handler = handler;
588: }
589: }
590:
591: /*
592: * Register a routine to handle a dev at a specific address
593: */
594:
595: void
596: adb_register_dev(int devnum, void (*handler)(int number, unsigned char *packet, int count, void * ssp))
597: {
598: adb_device_t *devp;
599:
600: if (devnum < 0 || devnum > ADB_DEVICE_COUNT)
601: panic("adb_register: addr is out of range.");
602:
603: devp = &adb_devices[devnum];
604:
605: devp->a_flags |= ADB_FLAGS_REGISTERED;
606: devp->a_handler = handler;
607: }
608:
609:
610: static void (*oldHandlers[ ADB_DEVICE_COUNT ])(int number, unsigned char *buffer, int bytes, void * ssp);
611:
612: void
613: borrow_adb( void (*handler)(int number, unsigned char *packet, int count, void * ssp))
614: {
615: int dev;
616: adb_device_t *devp;
617:
618: for (dev = 1; dev < ADB_DEVICE_COUNT; dev++) {
619: devp = &adb_devices[dev];
620:
621: if( devp->a_flags & ADB_FLAGS_REGISTERED)
622: oldHandlers[ dev] = devp->a_handler;
623: else
624: oldHandlers[ dev] = 0;
625:
626: devp->a_flags |= ADB_FLAGS_REGISTERED;
627: devp->a_handler = handler;
628: }
629: }
630:
631: void
632: return_adb( void )
633: {
634:
635: int dev;
636: adb_device_t *devp;
637:
638: for (dev = 1; dev < ADB_DEVICE_COUNT; dev++) {
639:
640: devp = &adb_devices[dev];
641:
642: if( oldHandlers[ dev] ) {
643: devp->a_flags |= ADB_FLAGS_REGISTERED;
644: devp->a_handler = oldHandlers[ dev];
645: } else
646: devp->a_flags &= ~ADB_FLAGS_REGISTERED;
647: }
648: }
649:
650:
651: #if 0
652: /* DS2...
653: void
654: adb_done(adb_request_t *req)
655: {
656: adb_packet_t *pack = &req->a_reply;
657: DS2 */
658: /* Note, adb_busy is not reset because the CUDA chip
659: * needs time to settle back into an idle state.
660: * adb_busy will be reset in adb_next_request() when
661: * the CUDA driver is ready for the next one.
662: */
663: /* DS2
664: if (req->a_flags & ADB_IS_ASYNC) {
665: req->a_next = adb_async_pool;
666: adb_async_pool = req;
667: return;
668: }
669:
670: req->a_flags |= ADB_DONE;
671:
672: if (!adb_polling) {
673: if (req->a_done)
674: req->a_done(req);
675: else thread_wakeup((event_t) req);
676: }
677: }
678:
679: void
680: adb_unsolicited_done(adb_packet_t *pack, void * ssp)
681: {
682: adb_device_t *devp;
683: int devnum;
684:
685: DS2 */
686: /* adb_next_request() will reset this when CUDA
687: * asks for the next request.. until then the bus
688: * has to become idle
689: */
690: /* DS2
691: adb_busy = TRUE;
692:
693: devnum = pack->a_header[2] >> 4;
694: devp = &adb_devices[devnum];
695:
696: if (devp->a_flags & ADB_FLAGS_REGISTERED)
697: devp->a_handler(devnum, pack->a_buffer, pack->a_bcount, ssp);
698: }
699: ...DS2 */
700:
701: #endif
702:
703: int
704: adb_readreg(int number, int reg, unsigned short *value)
705: {
706: if ([PMUdriver ADBRead:number :reg :(UInt32)current_thread() :0 :ADBReadCallback] != kPMUNoError) {
707: return ADB_RET_UNEXPECTED_RESULT;
708: }
709:
710: waitForCallback();
711:
712: if ( read_length ) {
713: *value = (read_buffer[0] << 8) | read_buffer[1];
714: return ADB_RET_OK;
715: }
716: else {
717: return ADB_RET_TIMEOUT;
718: }
719: }
720:
721: int
722: adb_readreg2(int number, int reg, unsigned char *buffer, int *length)
723: {
724: if ([PMUdriver ADBRead:number :reg :(UInt32)current_thread() :0 :ADBReadCallback2] != kPMUNoError) {
725: return ADB_RET_UNEXPECTED_RESULT;
726: }
727: waitForCallback();
728:
729: *length = read_length;
730: if ( read_length ) {
731: int i;
732: for ( i = 0; i < read_length; i++ ) {
733: buffer[i] = read_buffer[i];
734: }
735: if ( reg == 3 ) { // snoop on reads from reg 3
736: adb_devices[number].a_dev_handler = read_buffer[1];
737: }
738:
739: return ADB_RET_OK;
740: }
741: else {
742: return ADB_RET_TIMEOUT;
743: }
744:
745: }
746:
747:
748: int
749: adb_flush(int number)
750: {
751: if ([PMUdriver ADBFlush: number :(UInt32)current_thread() :0 :ADBReadCallback] != kPMUNoError) {
752: return ADB_RET_UNEXPECTED_RESULT;
753: }
754:
755: waitForCallback();
756:
757: return ADB_RET_OK;
758: }
759:
760: int
761: adb_writereg(int number, int reg, unsigned short value)
762: {
763: UInt8 buffer[2];
764:
765: buffer[0] = value >> 8;
766: buffer[1] = value & 0xff;
767:
768: if ([PMUdriver ADBWrite:number :reg :2 :buffer :(UInt32)current_thread() :0 :ADBcallback] != kPMUNoError) {
769: return ADB_RET_UNEXPECTED_RESULT;
770: }
771:
772: waitForCallback();
773: return ADB_RET_OK;
774: }
775:
776: int
777: adb_writereg2(int number, int reg, unsigned char *buffer, int length)
778: {
779: if ([PMUdriver ADBWrite:number :reg :length :buffer :(UInt32)current_thread() :0 :ADBcallback] != kPMUNoError) {
780: return ADB_RET_UNEXPECTED_RESULT;
781: }
782:
783: waitForCallback();
784: return ADB_RET_OK;
785: }
786:
787: void
788: adb_writereg_async(int number, int reg, unsigned short value)
789: {
790: UInt8 buffer[2];
791:
792: buffer[0] = value >> 8;
793: buffer[1] = value & 0xff;
794:
795: if ([PMUdriver ADBWrite:number :reg :2 :buffer :0 :0:NULL] != kPMUNoError) {
796: return;
797: }
798:
799: return;
800: }
801:
802: #if 0
803: /* DS1
804: void
805: adb_send(adb_request_t *adb, boolean_t wait)
806: {
807: spl_t s;
808:
809: if (!adb_polling)
810: s = spltty();
811:
812: adb->a_reply.a_bsize = sizeof(adb->a_reply.a_buffer);
813:
814: if (wait)
815: adb->a_done = NULL;
816:
817: adb->a_flags &= ~ADB_DONE;
818: adb->a_next = NULL;
819:
820: if (adb_busy) {
821: if (adb_queue_root == NULL)
822: adb_queue_root = adb_queue_end = adb;
823: else {
824: adb_queue_end->a_next = adb;
825: adb_queue_end = adb;
826: }
827: if (adb_polling) {
828: adb_hardware->ao_poll();
829: if ((adb->a_flags & ADB_DONE) == 0)
830: panic("adb_send: request did not complete?!?");
831: }
832: } else {
833: adb_busy = TRUE;
834: adb_hardware->ao_send(adb);
835: }
836:
837: if (wait && !adb_polling) {
838: simple_lock(&adb->a_lock);
839: // simon: was thread_sleep_simple_lock
840: thread_sleep((event_t) adb, simple_lock_addr(adb->a_lock), TRUE);
841: }
842:
843: if (!adb_polling)
844: splx(s);
845: }
846: adb_request_t *
847: adb_next_request()
848: {
849: adb_request_t *adb;
850:
851: adb = adb_queue_root;
852:
853: if (adb) {
854: adb_queue_root = adb_queue_root->a_next;
855: if (adb_queue_root == NULL)
856: adb_queue_end = NULL;
857: adb_busy = TRUE;
858: } else adb_busy = FALSE;
859:
860:
861: return adb;
862: }
863: void
864: adb_poll(void)
865: {
866: boolean_t save_poll = adb_polling;
867:
868: adb_polling = TRUE;
869:
870: adb_hardware->ao_poll();
871:
872: adb_polling = save_poll;
873: }
874: DS1 */
875:
876: #endif
877:
878: // The PMU driver is finished sending the last command.
879: // Wake up the thread that is waiting.
880: void ADBcallback(id unused, UInt32 refnum, UInt32 length, UInt8* buffer)
881: {
882: clear_wait(refnum,0,FALSE);
883: }
884:
885:
886: // The PMU driver has received data from the PMU that is the result of our
887: // previous read. Copy the data and wake up the thread.
888: void ADBReadCallback(id unused, UInt32 refnum, UInt32 length, UInt8* buffer)
889: {
890: if (buffer != NULL) {
891: read_buffer[0] = *buffer;
892: read_buffer[1] = *(buffer+1);
893: }
894:
895: read_length = length;
896:
897: clear_wait(refnum,0,FALSE);
898: }
899:
900:
901: // The PMU driver has received data from the PMU that is the result of our
902: // previous read. Copy the data and wake up the thread.
903: void ADBReadCallback2(id unused, UInt32 refnum, UInt32 length, UInt8* buffer)
904: {
905: int i;
906:
907: for ( i = 0; i < length; i++ ) {
908: read_buffer[i] = buffer[i];
909: }
910: read_length = length;
911:
912: clear_wait(refnum,0,FALSE);
913: }
914:
915:
916: // We have sent a command to the PMU driver with current_thread as the refnum.
917: // Sleep until it has sent the command to the PMU.
918: void waitForCallback(void)
919: {
920: assert_wait(current_thread(), FALSE);
921: thread_block();
922: }
923:
924: // Called by the keyboard driver. Interrupts are off. Call PMU/Cuda
925: // to let it service any interrupts.
926: void CheckADBPoll(void)
927: {
928: [PMUdriver poll_device];
929: }
930:
931:
932: // Autopoll data has arrived from the PMU.
933: void inputHandler(id unused, UInt32 refnum, UInt32 devnum, UInt32 length, UInt8* buffer)
934: {
935: adb_device_t *devp;
936:
937: //kprintf("inputHandler: refnum: %08x, devnum = %08x, length = %08x, buffer = %08x\n", refnum, devnum, length, buffer);
938: //kprintf("buffer[0] = %02x, buffer[1] = %02x\n", buffer[0], buffer[1]);
939:
940: devp = &adb_devices[devnum];
941:
942: //kprintf("devp = %08x, devp->a_handler = %08x\n", devp, devp->a_handler);
943:
944: if (devp->a_flags & ADB_FLAGS_REGISTERED) {
945: devp->a_handler(devnum, buffer, length, 0);
946: }
947: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.