]> git.saurik.com Git - apple/xnu.git/blame - iokit/Drivers/platform/drvAppleCuda/IOCudaADBController.cpp
xnu-123.5.tar.gz
[apple/xnu.git] / iokit / Drivers / platform / drvAppleCuda / IOCudaADBController.cpp
CommitLineData
1c79356b
A
1/*
2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22/*
23 * 1 Dec 1998 suurballe Created.
24 */
25
26#include "IOCudaADBController.h"
27#include "AppleCuda.h"
28
29#define super IOADBController
30OSDefineMetaClassAndStructors(IOCudaADBController, IOADBController)
31
32// **********************************************************************************
33// init
34//
35// **********************************************************************************
36bool IOCudaADBController::init ( OSDictionary * properties, AppleCuda * driver )
37{
38
39CudaDriver = driver;
40pollList = 0;
41autopollOn = false;
42
43return super::init(properties);
44}
45
46
47// **********************************************************************************
48// start
49//
50// **********************************************************************************
51bool IOCudaADBController::start ( IOService *nub )
52{
53if( !super::start(nub))
54 return false;
55
56CudaDriver->registerForADBInterrupts ( autopollHandler, this );
57return true;
58}
59
60
61// **********************************************************************************
62// setAutoPollPeriod
63//
64// **********************************************************************************
65IOReturn IOCudaADBController::setAutoPollPeriod ( int microsecs )
66{
67cuda_request_t cmd;
68
69adb_init_request(&cmd);
70ADB_BUILD_CMD3(&cmd, ADB_PACKET_PSEUDO, ADB_PSEUDOCMD_SET_AUTO_RATE,
71 ((microsecs + 999) / 1000));
72
73return CudaDriver->doSyncRequest(&cmd);
74}
75
76
77// **********************************************************************************
78// getAutoPollPeriod
79//
80// **********************************************************************************
81IOReturn IOCudaADBController::getAutoPollPeriod ( int * microsecs )
82{
83IOReturn err;
84cuda_request_t cmd;
85UInt8 data;
86
87adb_init_request(&cmd);
88ADB_BUILD_CMD2(&cmd, ADB_PACKET_PSEUDO, ADB_PSEUDOCMD_GET_AUTO_RATE);
89cmd.a_reply.a_buffer = &data;
90cmd.a_reply.a_bcount = sizeof(UInt8);
91
92err = CudaDriver->doSyncRequest(&cmd);
93
94if ( err == kIOReturnSuccess ) {
95 *microsecs = data * 1000;
96}
97return err;
98}
99
100
101// **********************************************************************************
102// getAutoPollPeriod
103//
104// **********************************************************************************
105IOReturn IOCudaADBController::setAutoPollList ( UInt16 activeAddressMask )
106{
107cuda_request_t cmd;
108
109adb_init_request(&cmd);
110ADB_BUILD_CMD2(&cmd, ADB_PACKET_PSEUDO, ADB_PSEUDOCMD_SET_DEVICE_LIST)
111
112cmd.a_cmd.a_buffer = (UInt8 *) &activeAddressMask;
113cmd.a_cmd.a_bcount = sizeof(UInt16);
114
115return CudaDriver->doSyncRequest(&cmd);
116}
117
118
119// **********************************************************************************
120// getAutoPollList
121//
122// **********************************************************************************
123IOReturn IOCudaADBController::getAutoPollList ( UInt16 * activeAddressMask )
124{
125cuda_request_t cmd;
126
127adb_init_request(&cmd);
128ADB_BUILD_CMD2(&cmd, ADB_PACKET_PSEUDO, ADB_PSEUDOCMD_GET_DEVICE_LIST);
129cmd.a_reply.a_buffer = (UInt8 *) activeAddressMask;
130cmd.a_reply.a_bcount = sizeof(UInt16);
131
132return CudaDriver->doSyncRequest(&cmd);
133}
134
135
136// **********************************************************************************
137// setAutoPollEnable
138//
139// **********************************************************************************
140IOReturn IOCudaADBController::setAutoPollEnable ( bool enable )
141{
142cuda_request_t cmd;
143
144adb_init_request(&cmd);
145ADB_BUILD_CMD3(&cmd, ADB_PACKET_PSEUDO, ADB_PSEUDOCMD_START_STOP_AUTO_POLL, (enable ? 1 : 0));
146
147return CudaDriver->doSyncRequest(&cmd);
148}
149
150
151// **********************************************************************************
152// resetBus
153//
154// **********************************************************************************
155IOReturn IOCudaADBController::resetBus ( void )
156{
157cuda_request_t cmd;
158
159adb_init_request(&cmd);
160ADB_BUILD_CMD2(&cmd, ADB_PACKET_ADB, ADB_ADBCMD_RESET_BUS );
161
162return CudaDriver->doSyncRequest(&cmd);
163}
164
165
166// **********************************************************************************
167// flushDevice
168//
169// **********************************************************************************
170IOReturn IOCudaADBController::flushDevice ( IOADBAddress address )
171{
172cuda_request_t cmd;
173
174adb_init_request(&cmd);
175ADB_BUILD_CMD2(&cmd, ADB_PACKET_ADB, (ADB_ADBCMD_FLUSH_ADB | (address << 4)));
176
177return CudaDriver->doSyncRequest(&cmd);
178}
179
180
181
182// **********************************************************************************
183// readFromDevice
184//
185// **********************************************************************************
186IOReturn IOCudaADBController::readFromDevice (IOADBAddress address, IOADBRegister adbRegister,
187 UInt8 * data, IOByteCount * length )
188{
189IOReturn err;
190cuda_request_t cmd;
191
192adb_init_request(&cmd);
193ADB_BUILD_CMD2(&cmd, ADB_PACKET_ADB,
194 (ADB_ADBCMD_READ_ADB | (address << 4) | (adbRegister & 3)));
195
196cmd.a_reply.a_buffer = data;
197cmd.a_reply.a_bcount = *length;
198
199err = CudaDriver->doSyncRequest(&cmd);
200
201//IOLog("Read %d, Addr %x Reg %x = %04x\n", err, address, adbRegister, *((UInt16 *)data));
202
203if( err == ADB_RET_OK ) {
204 *length = cmd.a_reply.a_bcount;
205}
206else {
207 *length = 0;
208}
209
210return err;
211}
212
213
214// **********************************************************************************
215// writeToDevice
216//
217// **********************************************************************************
218IOReturn IOCudaADBController::writeToDevice ( IOADBAddress address, IOADBRegister adbRegister,
219 UInt8 * data, IOByteCount * length )
220{
221IOReturn err;
222cuda_request_t cmd;
223
224adb_init_request(&cmd);
225
226ADB_BUILD_CMD2(&cmd, ADB_PACKET_ADB,
227 (ADB_ADBCMD_WRITE_ADB | (address << 4) | (adbRegister & 3)));
228cmd.a_cmd.a_buffer = data;
229cmd.a_cmd.a_bcount = *length;
230
231err = CudaDriver->doSyncRequest(&cmd);
232
233//IOLog("Write %d, Addr %x Reg %x = %04x\n", err, address, adbRegister, *((UInt16 *)data));
234
235if( err == ADB_RET_OK ) {
236 *length = cmd.a_reply.a_bcount;
237}
238else {
239 *length = 0;
240}
241return err;
242}
243