AppleGenericPCATAChannel.cpp [plain text]
#include <IOKit/IODeviceTreeSupport.h>
#include "AppleGenericPCATAChannel.h"
#include "AppleGenericPCATARoot.h"
#include "AppleGenericPCATAKeys.h"
#define super IOService
OSDefineMetaClassAndStructors( AppleGenericPCATAChannel, IOService )
bool AppleGenericPCATAChannel::mergeProperties( OSDictionary * properties )
{
bool success = true;
OSCollectionIterator * propIter =
OSCollectionIterator::withCollection( properties );
if ( propIter )
{
const OSSymbol * propKey;
while ((propKey = (const OSSymbol *) propIter->getNextObject()))
{
if (setProperty(propKey, properties->getObject(propKey)) == false)
{
success = false;
break;
}
}
propIter->release();
}
return success;
}
bool AppleGenericPCATAChannel::init( IOService * provider,
OSDictionary * properties,
IORegistryEntry * dtEntry )
{
if ( dtEntry )
{
if ( super::init( dtEntry, gIODTPlane ) == false ||
mergeProperties( properties ) == false )
return false;
}
else
{
if ( super::init( properties ) == false )
return false;
}
fProvider = OSDynamicCast(AppleGenericPCATARoot, provider);
if (fProvider == 0)
return false;
UInt32 vector = getInterruptVector();
if (fProvider->callPlatformFunction( "SetDeviceInterrupts",
false,
this,
(void *) &vector,
(void *) 1,
(void *) false )
!= kIOReturnSuccess)
{
return false;
}
setLocation( getChannelNumber() ? "1" : "0" );
return true;
}
bool AppleGenericPCATAChannel::handleOpen( IOService * client,
IOOptionBits options,
void * arg )
{
bool ret = false;
if ( fProvider && fProvider->open( this, 0, arg ) )
{
ret = super::handleOpen( client, options, arg );
if ( ret == false )
fProvider->close( this );
}
return ret;
}
void AppleGenericPCATAChannel::handleClose( IOService * client,
IOOptionBits options )
{
super::handleClose( client, options );
if ( fProvider ) fProvider->close( this );
}
bool AppleGenericPCATAChannel::getNumberValue( const char * propKey,
void * outValue,
UInt32 outBits ) const
{
OSNumber * num = OSDynamicCast( OSNumber, getProperty( propKey ) );
bool success = false;
if ( num )
{
success = true;
switch ( outBits )
{
case 32:
*(UInt32 *) outValue = num->unsigned32BitValue();
break;
case 16:
*(UInt16 *) outValue = num->unsigned16BitValue();
break;
case 8:
*(UInt8 *) outValue = num->unsigned8BitValue();
break;
default:
success = false;
break;
}
}
return success;
}
UInt16 AppleGenericPCATAChannel::getCommandBlockAddress( void ) const
{
UInt16 value = 0xFFF0;
getNumberValue( kCommandBlockAddressKey, &value, 16 );
return value;
}
UInt16 AppleGenericPCATAChannel::getControlBlockAddress( void ) const
{
UInt16 value = 0xFFF0;
getNumberValue( kControlBlockAddressKey, &value, 16 );
return value;
}
UInt32 AppleGenericPCATAChannel::getInterruptVector( void ) const
{
UInt32 value = 0xFF;
getNumberValue( kInterruptVectorKey, &value, 32 );
return value;
}
UInt32 AppleGenericPCATAChannel::getChannelNumber( void ) const
{
UInt32 value = 0xFF;
getNumberValue( kChannelNumberKey, &value, 32 );
return value;
}
UInt32 AppleGenericPCATAChannel::getPIOMode( void ) const
{
UInt32 value = 0;
getNumberValue( kPIOModeKey, &value, 32 );
return value;
}