* switch to PCI register IO
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29440 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
37a89eb4e9
commit
81201a4349
@ -42,6 +42,7 @@ enum {
|
||||
|
||||
struct geode_stream;
|
||||
struct geode_multi;
|
||||
extern pci_module_info* gPci;
|
||||
|
||||
/*! This structure describes a controller.
|
||||
*/
|
||||
@ -50,8 +51,7 @@ struct geode_controller {
|
||||
vint32 opened;
|
||||
const char* devfs_path;
|
||||
|
||||
area_id regs_area;
|
||||
vuint8* regs;
|
||||
uint32 nabmbar;
|
||||
uint32 irq;
|
||||
|
||||
uint32 num_streams;
|
||||
@ -67,32 +67,32 @@ struct geode_controller {
|
||||
|
||||
uint8 Read8(uint32 reg)
|
||||
{
|
||||
return *(regs + reg);
|
||||
return gPci->read_io_8(nabmbar + reg);
|
||||
}
|
||||
|
||||
uint16 Read16(uint32 reg)
|
||||
{
|
||||
return *(vuint16*)(regs + reg);
|
||||
return gPci->read_io_16(nabmbar + reg);
|
||||
}
|
||||
|
||||
uint32 Read32(uint32 reg)
|
||||
{
|
||||
return *(vuint32*)(regs + reg);
|
||||
return gPci->read_io_32(nabmbar + reg);
|
||||
}
|
||||
|
||||
void Write8(uint32 reg, uint8 value)
|
||||
{
|
||||
*(regs + reg) = value;
|
||||
gPci->write_io_8(nabmbar + reg, value);
|
||||
}
|
||||
|
||||
void Write16(uint32 reg, uint16 value)
|
||||
{
|
||||
*(vuint16*)(regs + reg) = value;
|
||||
gPci->write_io_16(nabmbar + reg, value);
|
||||
}
|
||||
|
||||
void Write32(uint32 reg, uint32 value)
|
||||
{
|
||||
*(vuint32*)(regs + reg) = value;
|
||||
gPci->write_io_32(nabmbar + reg, value);
|
||||
}
|
||||
};
|
||||
|
||||
@ -194,7 +194,6 @@ struct geode_multi {
|
||||
|
||||
/* driver.cpp */
|
||||
extern device_hooks gDriverHooks;
|
||||
extern pci_module_info* gPci;
|
||||
extern geode_controller gCards[MAX_CARDS];
|
||||
extern uint32 gNumCards;
|
||||
|
||||
|
@ -59,7 +59,7 @@ geode_codec_read(geode_controller *controller, uint8 regno)
|
||||
|
||||
if (geode_codec_wait(controller) != B_OK) {
|
||||
dprintf("codec busy (2)\n");
|
||||
return -1;
|
||||
return 0xffff;
|
||||
}
|
||||
|
||||
#define GCSCAUDIO_READ_CODEC_TIMEOUT 50
|
||||
@ -74,7 +74,7 @@ geode_codec_read(geode_controller *controller, uint8 regno)
|
||||
|
||||
if (i < 0) {
|
||||
dprintf("codec busy (3)\n");
|
||||
return -1;
|
||||
return 0xffff;
|
||||
}
|
||||
|
||||
return v;
|
||||
@ -363,7 +363,7 @@ geode_stream_setup_buffers(geode_stream* stream, const char* desc)
|
||||
bufferDescriptors->address = stream->physical_buffer_descriptors;
|
||||
bufferDescriptors->ctrlsize = ACC_BMx_PRD_CTRL_JMP;
|
||||
|
||||
for (uint32 index = 0; index < sizeof(kRates) / sizeof(kRates[0]); index++) {
|
||||
for (index = 0; index < sizeof(kRates) / sizeof(kRates[0]); index++) {
|
||||
if (kRates[index].multi_rate == stream->sample_rate) {
|
||||
stream->rate = kRates[index].rate;
|
||||
break;
|
||||
@ -391,16 +391,6 @@ geode_hw_init(geode_controller* controller)
|
||||
uint16 cmd;
|
||||
status_t status;
|
||||
|
||||
/* Map MMIO registers */
|
||||
controller->regs_area = map_physical_memory("geode_hw_regs",
|
||||
(void*)controller->pci_info.u.h0.base_registers[0],
|
||||
controller->pci_info.u.h0.base_register_sizes[0], B_ANY_KERNEL_ADDRESS,
|
||||
0, (void**)&controller->regs);
|
||||
if (controller->regs_area < B_OK) {
|
||||
status = controller->regs_area;
|
||||
goto error;
|
||||
}
|
||||
|
||||
cmd = (gPci->read_pci_config)(controller->pci_info.bus,
|
||||
controller->pci_info.device, controller->pci_info.function, PCI_command, 2);
|
||||
if (!(cmd & PCI_command_master)) {
|
||||
@ -410,12 +400,14 @@ geode_hw_init(geode_controller* controller)
|
||||
dprintf("geode: enabling PCI bus mastering\n");
|
||||
}
|
||||
|
||||
controller->nabmbar = controller->pci_info.u.h0.base_registers[0];
|
||||
|
||||
/* Absolute minimum hw is online; we can now install interrupt handler */
|
||||
controller->irq = controller->pci_info.u.h0.interrupt_line;
|
||||
status = install_io_interrupt_handler(controller->irq,
|
||||
(interrupt_handler)geode_interrupt_handler, controller, 0);
|
||||
if (status != B_OK)
|
||||
goto no_irq;
|
||||
goto error;
|
||||
|
||||
/* Get controller into valid state */
|
||||
status = reset_controller(controller);
|
||||
@ -444,12 +436,6 @@ geode_hw_init(geode_controller* controller)
|
||||
reset_failed:
|
||||
remove_io_interrupt_handler(controller->irq,
|
||||
(interrupt_handler)geode_interrupt_handler, controller);
|
||||
|
||||
no_irq:
|
||||
delete_area(controller->regs_area);
|
||||
controller->regs_area = B_ERROR;
|
||||
controller->regs = NULL;
|
||||
|
||||
error:
|
||||
dprintf("geode: ERROR: %s(%ld)\n", strerror(status), status);
|
||||
|
||||
@ -486,13 +472,6 @@ geode_hw_uninit(geode_controller* controller)
|
||||
remove_io_interrupt_handler(controller->irq,
|
||||
(interrupt_handler)geode_interrupt_handler, controller);
|
||||
|
||||
/* Unmap registers */
|
||||
if (controller->regs_area >= 0) {
|
||||
delete_area(controller->regs_area);
|
||||
controller->regs_area = B_ERROR;
|
||||
controller->regs = NULL;
|
||||
}
|
||||
|
||||
free(controller->multi);
|
||||
|
||||
geode_stream_delete(controller->playback_stream);
|
||||
|
Loading…
x
Reference in New Issue
Block a user