#ifndef _APPLEMAXIM1989_H
#define _APPLEMAXIM1989_H
#include <IOKit/IOLib.h>
#include <IOKit/IOService.h>
#include <IOKit/IODeviceTreeSupport.h>
#include <IOKit/IOPlatformExpert.h>
#include <IOKit/pwr_mgt/RootDomain.h>
#include "IOPlatformFunction.h"
#ifdef DLOG
#undef DLOG
#endif
#ifdef MAX1989_DEBUG
#define DLOG(fmt, args...) kprintf(fmt, ## args)
#else
#define DLOG(fmt, args...)
#endif
#define kWriteI2Cbus "writeI2CBus"
#define kReadI2Cbus "readI2CBus"
#define kOpenI2Cbus "openI2CBus"
#define kCloseI2Cbus "closeI2CBus"
#define kSetDumbMode "setDumbMode"
#define kSetStandardMode "setStandardMode"
#define kSetStandardSubMode "setStandardSubMode"
#define kSetCombinedMode "setCombinedMode"
#define kNumRetries 10
#define kDTSensorParamsVersionKey "hwsensor-params-version"
#define kDTSensorIDKey "hwsensor-id"
#define kDTSensorZoneKey "hwsensor-zone"
#define kDTSensorTypeKey "hwsensor-type"
#define kDTSensorLocationKey "hwsensor-location"
#define kDTSensorPollingPeriodKey "hwsensor-polling-period"
#define kHWSensorNubName "temp-sensor"
#define kHWSensorParamsVersionKey "version"
#define kHWSensorIDKey "sensor-id"
#define kHWSensorZoneKey "zone"
#define kHWSensorTypeKey "type"
#define kHWSensorLocationKey "location"
#define kHWSensorPollingPeriodKey "polling-period"
enum {
kHWSensorPollingPeriodNULL = 0xFFFFFFFF
};
class AppleMaxim1989 : public IOService
{
OSDeclareDefaultStructors(AppleMaxim1989)
private:
enum {
kReadLocalTemp = 0x00,
kReadRemoteDX1Temp = 0x01,
kReadRemoteDX2Temp = 0x02,
kReadRemoteDX3Temp = 0x03,
kReadRemoteDX4Temp = 0x04,
kReadStatusByte1 = 0x05,
kReadStatusByte2 = 0x06,
kReadConfigurationByte = 0x07,
kReadLocalHighLimit = 0x08,
kReadLocalLowLimit = 0x09,
kReadRemoteDX1HighLimit = 0x0A,
kReadRemoteDX1LowLimit = 0x0B,
kReadRemoteDX2HighLimit = 0x0C,
kReadRemoteDX2LowLimit = 0x0D,
kReadRemoteDX3HighLimit = 0x0E,
kReadRemoteDX3LowLimit = 0x0F,
kReadRemoteDX4HighLimit = 0x10,
kReadRemoteDX4LowLimit = 0x11,
kWriteConfigurationByte = 0x12,
kWriteLocalHighLimit = 0x13,
kWriteLocalLowLimit = 0x14,
kWriteRemoteDX1HighLimit = 0x15,
kWriteRemoteDX1LowLimit = 0x16,
kWriteRemoteDX2HighLimit = 0x17,
kWriteRemoteDX2LowLimit = 0x18,
kWriteRemoteDX3HighLimit = 0x19,
kWriteRemoteDX3LowLimit = 0x1A,
kWriteRemoteDX4HighLimit = 0x1B,
kWriteRemoteDX4LowLimit = 0x1C,
kReadManufactureID = 0xFE,
kReadDeviceID = 0xFF
};
enum {
kI2CDumbMode = 0x01,
kI2CStandardMode = 0x02,
kI2CStandardSubMode = 0x03,
kI2CCombinedMode = 0x04,
kI2CUnspecifiedMode = 0x05
};
bool fSleep;
IOService * fI2C_iface;
UInt8 fI2CBus;
UInt8 fI2CAddress;
#define READ_BUFFER_LEN 16
UInt8 fI2CReadBuffer[READ_BUFFER_LEN];
UInt16 fI2CReadBufferSize;
const OSSymbol * fGetSensorValueSym;
OSArray *fPlatformFuncArray;
bool performFunction(IOPlatformFunction *func, void *pfParam1, void *pfParam2,
void *pfParam3, void *pfParam4);
IOPMrootDomain *pmRootDomain;
void doSleep(void);
void doWake(void);
IOReturn publishChildren(IOService *);
IOReturn getTemp( UInt32 Reg, SInt32 * temp );
bool openI2C();
void closeI2C();
bool writeI2C( UInt8 subAddr, UInt8 * data, UInt16 size );
bool readI2C( UInt8 subAddr, UInt8 * data, UInt16 size );
bool setI2CDumbMode( void );
bool setI2CStandardMode( void );
bool setI2CStandardSubMode( void );
bool setI2CCombinedMode( void );
public:
virtual bool start( IOService * nub );
virtual void stop( IOService * nub );
virtual bool init( OSDictionary * dict );
virtual void free( void );
virtual IOReturn powerStateWillChangeTo (IOPMPowerFlags, unsigned long, IOService*);
virtual IOReturn callPlatformFunction(const OSSymbol *functionName,
bool waitForFunction,
void *param1, void *param2,
void *param3, void *param4);
};
#endif // _APPLEMAXIM1989_H