+++ /dev/null
-/*
- * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- *
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License"). You may not use this file except in compliance with the
- * License. Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- *
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
- * License for the specific language governing rights and limitations
- * under the License.
- *
- * @APPLE_LICENSE_HEADER_END@
- */
-#include <IOKit/pwr_mgt/IOPM.h>
-#include <IOKit/pwr_mgt/IOPMchangeNoteList.h>
-#include <IOKit/pwr_mgt/IOPowerConnection.h>
-
-#define super OSObject
-OSDefineMetaClassAndStructors(IOPMchangeNoteList,OSObject)
-
-//*********************************************************************************
-// init
-//
-//*********************************************************************************
-void IOPMchangeNoteList::initialize ( void )
-{
- long i;
-
- firstInList = 0;
- firstUnused = 0;
- for ( i = 0; i < IOPMMaxChangeNotes; i++ ) {
- changeNote[i].flags = IOPMNotInUse;
- }
-}
-
-//*********************************************************************************
-// createChangeNote
-//
-//*********************************************************************************
-
-long IOPMchangeNoteList::createChangeNote ( void )
-{
- unsigned long i, j;
-
- i = increment(firstUnused);
- if ( firstInList == i ) {
- return -1;
- }
- j = firstUnused;
- firstUnused = i;
-
- return j;
-}
-
-//*********************************************************************************
-// currentChange
-//
-// Return the ordinal of the first change note in the list.
-// If the list is empty, return -1.
-//*********************************************************************************
-
-long IOPMchangeNoteList::currentChange ( void )
-{
- if ( firstUnused == firstInList ) {
- return -1;
- }
- else {
- return firstInList;
- }
-}
-
-//*********************************************************************************
-// latestChange
-//
-// Return the ordinal of the last change note in the list.
-// If the list is empty, return -1.
-//*********************************************************************************
-
-long IOPMchangeNoteList::latestChange ( void )
-{
- if ( firstUnused == firstInList ) {
- return -1;
- }
- else {
- return decrement(firstUnused);
- }
-}
-
-//*********************************************************************************
-// releaseHeadChangeNote
-//
-// Mark the head node unused.
-// This happens when the first change in the list is completely processed.
-// That is, all interested parties have acknowledged it, and power is settled
-// at the new level.
-//*********************************************************************************
-
-IOReturn IOPMchangeNoteList::releaseHeadChangeNote ( void )
-{
- IOPowerConnection *tmp;
-
- if((tmp = changeNote[firstInList].parent)) {
- changeNote[firstInList].parent = 0;
- tmp->release();
- }
-
- changeNote[firstInList].flags = IOPMNotInUse;
- firstInList = increment(firstInList);
- return IOPMNoErr;
-}
-
-//*********************************************************************************
-// releaseTailChangeNote
-//
-// Mark the tail node unused.
-// This happens when a power change is queued up after another which has
-// not yet been started, and the second one supercedes the first. The data in
-// the second is copied into the first and the the second is released. This
-// collapses the first change out of the list.
-//*********************************************************************************
-
-IOReturn IOPMchangeNoteList::releaseTailChangeNote ( void )
-{
- IOPowerConnection *tmp;
-
- if((tmp = changeNote[firstInList].parent)) {
- changeNote[firstInList].parent = 0;
- tmp->release();
- }
-
- firstUnused = decrement(firstUnused);
- changeNote[firstUnused].flags = IOPMNotInUse;
- return IOPMNoErr;
-}
-
-//*********************************************************************************
-// changeNoteInUse
-//
-//*********************************************************************************
-
-bool IOPMchangeNoteList::changeNoteInUse ( unsigned long ordinal )
-{
- if ( changeNote[ordinal].flags == IOPMNotInUse ) {
- return false;
- }
- else {
- return true;
- }
-}
-
-//*********************************************************************************
-// nextChangeNote
-//
-// If the parameter corresponds to the most recent power change notification
-// passed to drivers and children, return -1. Otherwise, return the array
-// position of the next notification in the circular list.
-//*********************************************************************************
-
-long IOPMchangeNoteList::nextChangeNote ( unsigned long ordinal )
-{
- unsigned long i;
-
- i = increment(ordinal);
- if ( i == firstUnused) {
- return -1;
- }
- return ( i );
-}
-
-//*********************************************************************************
-// increment
-//
-// Increment the parameter mod the circular list size and return it.
-//*********************************************************************************
-
-unsigned long IOPMchangeNoteList::increment ( unsigned long ordinal )
-{
- if ( ordinal == (IOPMMaxChangeNotes - 1) ) {
- return 0;
- }
- else {
- return ordinal + 1;
- }
-}
-
-//*********************************************************************************
-// decrement
-//
-// Decrement the parameter mod the circular list size and return it.
-//*********************************************************************************
-
-unsigned long IOPMchangeNoteList::decrement ( unsigned long ordinal )
-{
- if ( ordinal == 0 ) {
- return IOPMMaxChangeNotes - 1;
- }
- else {
- return ordinal - 1;
- }
-}
-
-//*********************************************************************************
-// previousChangeNote
-//
-// If the parameter corresponds to the oldest power change notification
-// passed to drivers and children, return -1. Otherwise, return the array
-// position of the previous notification in the circular list.
-//*********************************************************************************
-
-long IOPMchangeNoteList::previousChangeNote ( unsigned long ordinal )
-{
- if ( ordinal == firstInList ) {
- return -1;
- }
- return decrement(ordinal);
-}
-
-//*********************************************************************************
-// listEmpty
-//
-//*********************************************************************************
-
-bool IOPMchangeNoteList::listEmpty ( void )
-{
- return ( firstInList == firstUnused ) ;
-}