#ifndef _MACIOGPIO_H
#define _MACIOGPIO_H
#include <IOKit/IOService.h>
#include <IOKit/IOInterruptEventSource.h>
#include "GPIOParent.h"
#ifdef DLOG
#undef DLOG
#endif
#ifdef MACIOGPIO_DEBUG
#define DLOG(fmt, args...) kprintf(fmt, ## args)
#else
#define DLOG(fmt, args...)
#endif
#define kKeyLargoSafeWriteRegUInt8 "keyLargo_safeWriteRegUInt8"
#define kKeyLargoSafeReadRegUInt8 "keyLargo_safeReadRegUInt8"
#define kGPIOLevelsRegLen 8
#define kGPIONumGPIOs (18+17)
typedef struct MacIOGPIOCallbackInfo_
{
IOInterruptEventSource *eventSource;
GPIOEventHandler handler;
void *self;
MacIOGPIOCallbackInfo_ *next;
} MacIOGPIOCallbackInfo;
class MacIOGPIO : public IOService
{
OSDeclareDefaultStructors(MacIOGPIO)
private:
IOService *fKeyLargoDrv;
UInt32 fGPIOBaseAddress;
IOWorkLoop *fWorkLoop;
MacIOGPIOCallbackInfo *fClients;
IOLock *fClientLock;
const OSSymbol *fSymKeyLargoSafeWriteRegUInt8;
const OSSymbol *fSymKeyLargoSafeReadRegUInt8;
bool registerClient(void *param1, void *param2, void *param3,
void *param4);
bool unregisterClient(void *param1, void *param2, void *param3,
void *param4);
bool enableClient(void *param1, void *param2, void *param3,
void *param4);
bool disableClient(void *param1, void *param2, void *param3,
void *param4);
void handleInterrupt(IOInterruptEventSource *source, int count);
public:
virtual bool init(OSDictionary *dict);
virtual void free(void);
virtual IOService *probe(IOService *provider, SInt32 *score);
virtual bool start(IOService *provider);
virtual void stop(IOService *provider);
virtual IOReturn callPlatformFunction( const char *functionName,
bool waitForFunction,
void *param1, void *param2,
void *param3, void *param4 );
virtual IOReturn callPlatformFunction( const OSSymbol *functionName,
bool waitForFunction,
void *param1, void *param2,
void *param3, void *param4 );
IOService *createNub( IORegistryEntry * from );
void processNub(IOService *myNub);
void publishBelow(IOService *root);
static void interruptOccurred(OSObject *me, IOInterruptEventSource *source,
int count);
};
class MacIOGPIODevice : public IOService
{
OSDeclareDefaultStructors(MacIOGPIODevice)
virtual bool compareName(OSString *name, OSString **matched) const;
};
#endif // _MACIOGPIO_H