#ifndef _IOKIT_AppleKeyswitch_H
#define _IOKIT_AppleKeyswitch_H
#include <IOKit/IOTypes.h>
#include <IOKit/IOLib.h>
#include <IOKit/IOService.h>
#include <IOKit/IOInterrupts.h>
#include <IOKit/IOInterruptController.h>
#include <IOKit/IOInterruptEventSource.h>
#include <IOKit/IOWorkLoop.h>
#include <IOKit/IODeviceTreeSupport.h>
#include <IOKit/acpi/IOACPIPlatformDevice.h>
#ifdef DLOG
#undef DLOG
#endif
#ifdef APPLEKEYSWITCH_DEBUG
#define DLOG(fmt, args...) kprintf(fmt, ## args)
#else
#define DLOG(fmt, args...)
#endif
enum
{
kKeyLargoGPIOBaseAddr = 0x50, };
enum
{
KEYSWITCH_VALUE_LOCKED = 0,
KEYSWITCH_VALUE_UNLOCKED = 1
};
enum
{
kSWITCH_STATE_IS_UNLOCKED = 0,
kSWITCH_STATE_IS_LOCKED = 1
};
class AppleKeyswitch : public IOService
{
OSDeclareDefaultStructors(AppleKeyswitch);
private:
UInt8 state;
UInt32 *extIntGPIO;
const OSSymbol *keyLargo_safeWriteRegUInt8;
const OSSymbol *keyLargo_safeReadRegUInt8;
#if defined( __i386__ )
IOACPIPlatformDevice * myProvider;
IONotifier * switchEventNotify;
#elif defined( __ppc__ )
void * reserved1; void * reserved2;
#endif
public:
IOWorkLoop *myWorkLoop;
IOInterruptEventSource *interruptSource;
virtual bool start(IOService *provider);
virtual void stop(IOService *provider);
static void interruptOccurred(OSObject *obj, IOInterruptEventSource *src, int count);
virtual void toggle(bool disableInts);
static IOReturn keyswitchNotification( void * target,
void * refCon,
UInt32 messageType,
IOService * provider,
void * messageArgument,
vm_size_t argSize );
void getKeyswitchState( UInt8 * switchState );
};
#endif