Annotation of XNU/iokit/Drivers/platform/drvApplePMU/IOPMUADBController.cpp, revision 1.1.1.1

1.1       root        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:  * 12 Nov 1998 suurballe  Created.
                     24:  */
                     25: 
                     26: #include <IOKit/IOSyncer.h>
                     27: #include "IOPMUADBController.h"
                     28: #include "pmupriv.h"
                     29: 
                     30: #define super IOADBController
                     31: OSDefineMetaClassAndStructors(IOPMUADBController, IOADBController)
                     32: 
                     33: // **********************************************************************************
                     34: // init
                     35: //
                     36: // **********************************************************************************
                     37: bool IOPMUADBController::init ( OSDictionary * properties, ApplePMU * driver )
                     38: {
                     39: PMUdriver = driver;
                     40: pollList = 0;
                     41: autopollOn = false;
                     42: 
                     43: return super::init(properties);
                     44: }
                     45: 
                     46: 
                     47: // **********************************************************************************
                     48: // start
                     49: //
                     50: // **********************************************************************************
                     51: bool IOPMUADBController::start ( IOService * nub )
                     52: {
                     53:     if( !super::start(nub))
                     54:         return false;
                     55: 
                     56:     PMUdriver->registerForADBInterrupts ( autopollHandler, this );
                     57:     return true;
                     58: }
                     59: 
                     60: 
                     61: // **********************************************************************************
                     62: // setAutoPollPeriod
                     63: //
                     64: // **********************************************************************************
                     65: IOReturn IOPMUADBController::setAutoPollPeriod ( int )
                     66: {
                     67: return kPMUNotSupported;
                     68: }
                     69: 
                     70: 
                     71: // **********************************************************************************
                     72: // getAutoPollPeriod
                     73: //
                     74: // **********************************************************************************
                     75: IOReturn IOPMUADBController::getAutoPollPeriod ( int * )
                     76: {
                     77: return kPMUNotSupported;
                     78: }
                     79: 
                     80: 
                     81: // **********************************************************************************
                     82: // setAutoPollList
                     83: //
                     84: // **********************************************************************************
                     85: IOReturn IOPMUADBController::setAutoPollList ( UInt16 PollBitField )
                     86: {
                     87: PMUrequest     request;
                     88: 
                     89: pollList = PollBitField;                               // remember the new poll list
                     90: 
                     91: if ( autopollOn ) {                    
                     92:         request.sync = IOSyncer::create();
                     93:         request.pmCommand = kPMUpMgrADB;       // if PMU is currently autopolling,
                     94:         request.pmFlag = false;                // give it the new list
                     95:         request.pmSLength1 = 4;
                     96:         request.pmSBuffer2 = NULL;
                     97:         request.pmSLength2 = 0;
                     98:         request.pmRBuffer = NULL;
                     99:         request.pmSBuffer1[0] = 0;
                    100:         request.pmSBuffer1[1] = 0x86;
                    101:         request.pmSBuffer1[2] = (UInt8)(PollBitField >> 8);
                    102:         request.pmSBuffer1[3] = (UInt8)(PollBitField & 0xff);
                    103: 
                    104:         PMUdriver->enqueueCommand(&request);
                    105:         request.sync->wait();                  // wait till done
                    106: }
                    107: return kPMUNoError;
                    108: }
                    109: 
                    110: 
                    111: // **********************************************************************************
                    112: // getAutoPollList
                    113: //
                    114: // **********************************************************************************
                    115: IOReturn IOPMUADBController::getAutoPollList ( UInt16 * activeAddressMask )
                    116: {
                    117: *activeAddressMask = pollList;
                    118: return kPMUNoError;
                    119: }
                    120: 
                    121: 
                    122: // **********************************************************************************
                    123: // setAutoPollEnable
                    124: //
                    125: // **********************************************************************************
                    126: IOReturn IOPMUADBController::setAutoPollEnable ( bool enable )
                    127: {
                    128: PMUrequest request;
                    129: 
                    130: if ( enable ) {                                                        // enabling autopoll
                    131:         autopollOn = true;
                    132:         request.sync = IOSyncer::create();
                    133:         request.pmCommand = kPMUpMgrADB;                                // give it the list we have
                    134:         request.pmFlag = false;
                    135:         request.pmSLength1 = 4;
                    136:         request.pmSBuffer2 = NULL;
                    137:         request.pmSLength2 = 0;
                    138:         request.pmRBuffer = NULL;
                    139:         request.pmSBuffer1[0] = 0;
                    140:         request.pmSBuffer1[1] = 0x86;
                    141:         request.pmSBuffer1[2] = (UInt8)(pollList >> 8);
                    142:         request.pmSBuffer1[3] = (UInt8)(pollList & 0xff);
                    143: 
                    144:         PMUdriver->enqueueCommand(&request);
                    145:         request.sync->wait();                  // wait till done
                    146:         return kPMUNoError;
                    147: }
                    148:     else {                                                             // disabling autopoll
                    149:         autopollOn = false;
                    150:         request.sync = IOSyncer::create();
                    151:         request.pmCommand = kPMUpMgrADBoff;
                    152:         request.pmFlag = false;
                    153:         request.pmSLength1 = 0;
                    154:         request.pmSBuffer2 = NULL;
                    155:         request.pmSLength2 = 0;
                    156:         request.pmRBuffer = NULL;
                    157: 
                    158:         PMUdriver->enqueueCommand(&request);
                    159:         request.sync->wait();                  // wait till done
                    160: 
                    161:         return kPMUNoError;
                    162: }
                    163: }
                    164: 
                    165: 
                    166: // **********************************************************************************
                    167: // resetBus
                    168: //
                    169: // **********************************************************************************
                    170: IOReturn IOPMUADBController::resetBus ( void )
                    171: {
                    172: PMUrequest request;
                    173: 
                    174: request.sync = IOSyncer::create();
                    175: request.pmCommand = kPMUpMgrADB;
                    176: request.pmFlag = true;                                 // this op solicits input from PGE
                    177: request.pmSLength1 = 3;
                    178: request.pmSBuffer2 = NULL;
                    179: request.pmSLength2 = 0;
                    180: request.pmRBuffer = NULL;
                    181: request.pmSBuffer1[0] = kPMUResetADBBus;
                    182: request.pmSBuffer1[1] = 0;
                    183: request.pmSBuffer1[2] = 0;
                    184: 
                    185: PMUdriver->enqueueCommand(&request);
                    186: request.sync->wait();                  // wait till done
                    187: 
                    188: return kPMUNoError;
                    189: }
                    190: 
                    191: 
                    192: // **********************************************************************************
                    193: // flushDevice
                    194: //
                    195: // **********************************************************************************
                    196: IOReturn IOPMUADBController::flushDevice ( IOADBAddress address )
                    197: {
                    198: PMUrequest request;
                    199: 
                    200: request.sync = IOSyncer::create();
                    201: request.pmCommand = kPMUpMgrADB;
                    202: request.pmFlag = true;
                    203: request.pmSLength1 = 3;
                    204: request.pmSBuffer2 = NULL;
                    205: request.pmSLength2 = 0;
                    206: request.pmRBuffer = NULL;
                    207: request.pmSBuffer1[0] = kPMUFlushADB | (address << kPMUADBAddressField);
                    208: if ( autopollOn ) {
                    209:        request.pmSBuffer1[1] = 2;
                    210: }
                    211: else {
                    212:         request.pmSBuffer1[1] = 0;
                    213: }
                    214: request.pmSBuffer1[2] = 0;
                    215: 
                    216: PMUdriver->enqueueCommand(&request);
                    217: request.sync->wait();                  // wait till done
                    218: 
                    219: return kPMUNoError;
                    220: }
                    221: 
                    222: 
                    223: // **********************************************************************************
                    224: // readFromDevice
                    225: //
                    226: // The length parameter is ignored on entry.  It is set on exit to reflect
                    227: // the number of bytes read from the device.
                    228: // **********************************************************************************
                    229: IOReturn IOPMUADBController::readFromDevice ( IOADBAddress address, IOADBRegister adbRegister,
                    230:                        UInt8 * data, IOByteCount * length )
                    231: {
                    232: PMUrequest     request;
                    233: UInt8 *                source;
                    234: UInt8 *                dest;
                    235: int            copylength, i;
                    236: 
                    237: if ( (length == NULL) || (data == NULL) ) {
                    238:        return kPMUParameterError;
                    239: }
                    240: 
                    241: request.sync = IOSyncer::create();
                    242: request.pmCommand = kPMUpMgrADB;
                    243: request.pmFlag = true;                                 // this op solicits input from PGE
                    244: request.pmSLength1 = 3;
                    245: request.pmSBuffer2 = NULL;
                    246: request.pmSLength2 = 0;
                    247: request.pmSBuffer1[0] = kPMUReadADB | (address << kPMUADBAddressField) | (adbRegister);
                    248: if ( autopollOn ) {
                    249:        request.pmSBuffer1[1] = 2;
                    250: }
                    251: else {
                    252:         request.pmSBuffer1[1] = 0;
                    253: }
                    254: request.pmSBuffer1[2] = 0;
                    255: 
                    256: PMUdriver->enqueueCommand(&request);
                    257: request.sync->wait();                  // wait till done
                    258: 
                    259: *length = request.pmRLength;                           // set caller's length
                    260:     
                    261: if (request.pmRLength == 0 ) {                         // nothing read; device isn't there
                    262:        return ADB_RET_NOTPRESENT;
                    263: }
                    264: else {
                    265:        source = request.pmRBuffer;                     // copy all but first two bytes of adb data
                    266:         dest = data;
                    267:         if ( *length > request.pmRLength ) {
                    268:             copylength = request.pmRLength;
                    269:         }
                    270:         else {
                    271:             copylength =*length;
                    272:         }
                    273:         for ( i = 0; i < copylength; i++ ) {
                    274:             *dest++ = *source++;
                    275:         }
                    276:         return ADB_RET_OK;
                    277: }
                    278: }
                    279: 
                    280: 
                    281: // **********************************************************************************
                    282: // writeToDevice
                    283: //
                    284: // **********************************************************************************
                    285: IOReturn IOPMUADBController::writeToDevice ( IOADBAddress address, IOADBRegister adbRegister,
                    286:                        UInt8 * data, IOByteCount * length )
                    287: {
                    288: PMUrequest request;
                    289: 
                    290: if ( (* length == 0) || (data == NULL) || (* length > (MISC_LENGTH)) )
                    291: {
                    292:        return kPMUParameterError;
                    293: }
                    294: 
                    295: request.sync = IOSyncer::create();
                    296: request.pmCommand = kPMUpMgrADB;
                    297: request.pmFlag = true;                                 // this op solicits input from PGE
                    298: request.pmSLength1 = 3;
                    299: request.pmSBuffer2 = data;
                    300: request.pmSLength2 = *length;
                    301: request.pmRBuffer = NULL;
                    302: request.pmSBuffer1[0] = kPMUWriteADB | (address << kPMUADBAddressField) | (adbRegister);
                    303: if ( autopollOn ) {
                    304:        request.pmSBuffer1[1] = 2;
                    305: }
                    306: else {
                    307:         request.pmSBuffer1[1] = 0;
                    308: }
                    309: request.pmSBuffer1[2] = *length;
                    310: 
                    311: PMUdriver->enqueueCommand(&request);
                    312: request.sync->wait();                  // wait till done
                    313: 
                    314: return kPMUNoError;
                    315: }
                    316: 
                    317: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.