#include <KernelExport.h>
#include <OS.h>
#include "io.h"
#include "auichreg.h"
#include "debug.h"
#include <PCI.h>
extern pci_module_info *pci;
uint8
auich_reg_read_8(device_config *config, uint8 regno)
{
ASSERT(regno >= 0);
ASSERT(((config->type & TYPE_ICH4) != 0 && regno <= 255) || regno <= 63);
if (config->type & TYPE_ICH4)
return *(uint8 *)(((char *)config->log_mbbar) + regno);
else
return pci->read_io_8(config->nabmbar + regno);
}
uint16
auich_reg_read_16(device_config *config, uint8 regno)
{
ASSERT(regno >= 0);
ASSERT(((config->type & TYPE_ICH4) != 0 && regno <= 255) || regno <= 63);
if (config->type & TYPE_ICH4)
return *(uint16 *)(((char *)config->log_mbbar) + regno);
else
return pci->read_io_16(config->nabmbar + regno);
}
uint32
auich_reg_read_32(device_config *config, uint8 regno)
{
ASSERT(regno >= 0);
ASSERT(((config->type & TYPE_ICH4) != 0 && regno <= 255) || regno <= 63);
if (config->type & TYPE_ICH4)
return *(uint32 *)(((char *)config->log_mbbar) + regno);
else
return pci->read_io_32(config->nabmbar + regno);
}
void
auich_reg_write_8(device_config *config, uint8 regno, uint8 value)
{
ASSERT(regno >= 0);
ASSERT(((config->type & TYPE_ICH4) != 0 && regno <= 255) || regno <= 63);
if (config->type & TYPE_ICH4)
*(uint8 *)(((char *)config->log_mbbar) + regno) = value;
else
pci->write_io_8(config->nabmbar + regno, value);
}
void
auich_reg_write_16(device_config *config, uint8 regno, uint16 value)
{
ASSERT(regno >= 0);
ASSERT(((config->type & TYPE_ICH4) != 0 && regno <= 255) || regno <= 63);
if (config->type & TYPE_ICH4)
*(uint16 *)(((char *)config->log_mbbar) + regno) = value;
else
pci->write_io_16(config->nabmbar + regno, value);
}
void
auich_reg_write_32(device_config *config, uint8 regno, uint32 value)
{
ASSERT(regno >= 0);
ASSERT(((config->type & TYPE_ICH4) != 0 && regno <= 255) || regno <= 63);
if (config->type & TYPE_ICH4)
*(uint32 *)(((char *)config->log_mbbar) + regno) = value;
else
pci->write_io_32(config->nabmbar + regno, value);
}
static uint8 sCodecLastReadRegister = 0;
static uint8 sCodecLastWrittenRegister = 0;
static int
auich_codec_wait(device_config *config)
{
int i;
for (i = 0; i < 200; i++) {
if ((auich_reg_read_8(config, AUICH_REG_ACC_SEMA) & 0x01) == 0)
return B_OK;
if (i > 100)
snooze(10);
}
PRINT(("codec semaphore timed out!\n"));
PRINT(("last read/write registers: %x/%x\n", sCodecLastReadRegister, sCodecLastWrittenRegister));
return B_OK;
}
uint16
auich_codec_read(device_config *config, uint8 regno)
{
sCodecLastReadRegister = regno;
ASSERT(regno >= 0);
ASSERT(((config->type & TYPE_ICH4) != 0 && regno <= 511) || regno <= 255);
if (auich_codec_wait(config)!=B_OK) {
PRINT(("codec busy (2)\n"));
return -1;
}
if (config->type & TYPE_ICH4)
return *(uint16 *)(((char *)config->log_mmbar) + regno);
else
return pci->read_io_16(config->nambar + regno);
}
void
auich_codec_write(device_config *config, uint8 regno, uint16 value)
{
sCodecLastWrittenRegister = regno;
ASSERT(regno >= 0);
ASSERT(((config->type & TYPE_ICH4) != 0 && regno <= 511) || regno <= 255);
if (auich_codec_wait(config)!=B_OK) {
PRINT(("codec busy (4)\n"));
return;
}
if (config->type & TYPE_ICH4)
*(uint16 *)(((char *)config->log_mmbar) + regno) = value;
else
pci->write_io_16(config->nambar + regno, value);
}