#ifndef __APPLE_INTEL_AC97_DEFINES_H
#define __APPLE_INTEL_AC97_DEFINES_H
#include <libkern/OSTypes.h>
#include <IOKit/IOTypes.h>
#define BITS(x, v) ((v) << (x))
#define RO_BIT(x) BITS(x, 1)
#define RW_BIT(x) RO_BIT(x)
#define RC_BIT(x) RO_BIT(x)
#define RS_BIT(x) RO_BIT(x)
enum {
kCodecAudioReset = 0x00,
kCodecMasterVolume = 0x02,
kCodecAuxOutVolume = 0x04,
kCodecMonoVolume = 0x06,
kCodecMasterTone = 0x08,
kCodecPCBeepVolume = 0x0a,
kCodecPhoneVolume = 0x0c,
kCodecMicVolume = 0x0e,
kCodecLineInVolume = 0x10,
kCodecCDVolume = 0x12,
kCodecVideoVolume = 0x14,
kCodecAuxInVolume = 0x16,
kCodecPCMOutVolume = 0x18,
kCodecRecordSelect = 0x1a,
kCodecRecordGain = 0x1c,
kCodecRecordGainMic = 0x1e,
kCodecGeneralPurpose = 0x20,
kCodec3DControl = 0x22,
kCodecPowerdown = 0x26,
kCodecExtAudioID = 0x28,
kCodecExtAudioStat = 0x2a,
kCodecPCMFrontDACRate = 0x2c,
kCodecPCMSurroundDACRate = 0x2E,
kCodecPCMLFEDACRate = 0x30,
kCodecExtModemID = 0x3a,
kCodecVendorID1 = 0x7c,
kCodecVendorID2 = 0x7e,
kCodecRegisterCount = 0x80
};
enum {
kDedicatedPCMInChannel = 0x0001,
kBassTrebleControl = 0x0004,
kSimulatedStereo = 0x0008,
kHeadphoneOutSupport = 0x0010,
kLoudnessSupport = 0x0020,
k18BitDAC = 0x0040,
k20BitDAC = 0x0080,
k18BitADC = 0x0100,
k20BitADC = 0x0200,
kADCReady = 0x0001,
kDACReady = 0x0002,
kAnalogReady = 0x0004,
kVrefReady = 0x0008,
kVolumeMuteBit = 0x8000,
kVariableRatePCMAudio = 0x0001,
kDoubleRatePCMAudio = 0x0002,
};
enum {
kBMBufferDescBaseAddress = 0x00,
kBMCurrentIndex = 0x04,
kBMLastValidIndex = 0x05,
kBMStatus = 0x06,
kBMPositionInBuffer = 0x08,
kBMPrefetchedIndex = 0x0a,
kBMControl = 0x0b,
kGlobalControl = 0x2c,
kGlobalStatus = 0x30,
kCodecAccessSemaphore = 0x34,
kSDataInMap = 0x80,
};
enum {
kFIFOError = RC_BIT(4),
kBufferCompletionInterrupt = RC_BIT(3),
kLastValidBufferInterrupt = RC_BIT(2),
kCurrentEqualsLastValid = RO_BIT(1),
kDMAControllerHalted = RO_BIT(0)
};
enum {
kInterruptOnCompletionEnable = RW_BIT(4),
kFIFOErrorInterruptEnable = RW_BIT(3),
kLastValidBufferInterruptEnable = RW_BIT(2),
kResetRegisters = RS_BIT(1),
kRunBusMaster = RW_BIT(0)
};
enum {
k2ChannelMode = BITS(20, 0),
k4ChannelMode = BITS(20, 1),
k6ChannelMode = BITS(20, 2),
kSecResumeInterruptEnable = RW_BIT(5),
kPriResumeInterruptEnable = RW_BIT(4),
kACLinkShutOff = RW_BIT(3),
kGlobalWarmReset = RS_BIT(2),
kGlobalColdResetDisable = RW_BIT(1),
kGPIInterruptEnable = RW_BIT(0)
};
enum {
k3rdCodecReady = RO_BIT(28),
k6ChannelCapable = RO_BIT(21),
k4ChannelCapable = RO_BIT(20),
kModemPowerDownFlag = RW_BIT(17),
kAudioPowerDownFlag = RW_BIT(16),
kCodecReadTimeout = RC_BIT(15),
kSlot12Bit3 = RO_BIT(14),
kSlot12Bit2 = RO_BIT(13),
kSlot12Bit1 = RO_BIT(12),
kSecResumeInterrupt = RC_BIT(11),
kPriResumeInterrupt = RC_BIT(10),
kSecCodecReady = RO_BIT(9),
kPriCodecReady = RO_BIT(8),
kMicInInterrupt = RO_BIT(7),
kPCMOutInterrupt = RO_BIT(6),
kPCMInInterrupt = RO_BIT(5),
kModemOutInterrupt = RO_BIT(2),
kModemInInterrupt = RO_BIT(1),
kGPIInterrupt = RC_BIT(0)
};
enum {
kCodecAccessInProgress = RS_BIT(0)
};
enum {
kSteerEnable = RW_BIT(3)
};
typedef struct {
IOPhysicalAddress pointer;
UInt16 length;
UInt16 command;
} AC97BD;
enum {
kInterruptOnCompletion = 0x8000,
kBufferUnderrunPolicy = 0x4000,
};
enum {
kChannelPCMIn = 0,
kChannelPCMOut = 1,
kChannelMICIn = 2
};
#define kAudioFunctionKey "Audio"
#define kModemFunctionKey "Modem"
#define kControllerFunctionKey "Controller Function"
extern const OSSymbol * gAC97AudioFunction;
extern const OSSymbol * gAC97ModemFunction;
enum {
kMaxCodecCount = 4
};
#ifndef RELEASE
#define RELEASE(x) do { if (x) { (x)->release(); (x) = 0; } } while (0)
#endif
typedef UInt32 DMAChannel;
typedef UInt8 CodecID;
#endif