* Copyright 2009, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* JΓ©rΓ΄me Duval (korli@users.berlios.de)
*/
#include "driver.h"
int32 api_version = B_CUR_DRIVER_API_VERSION;
geode_controller gCards[MAX_CARDS];
uint32 gNumCards;
pci_module_info* gPci;
extern "C" status_t
init_hardware(void)
{
pci_info info;
long i;
if (get_module(B_PCI_MODULE_NAME, (module_info**)&gPci) != B_OK)
return ENODEV;
for (i = 0; gPci->get_nth_pci_info(i, &info) == B_OK; i++) {
if ((info.vendor_id == AMD_VENDOR_ID
&& info.device_id == AMD_CS5536_AUDIO_DEVICE_ID)
|| (info.vendor_id == NS_VENDOR_ID
&& info.device_id == NS_CS5535_AUDIO_DEVICE_ID)) {
put_module(B_PCI_MODULE_NAME);
return B_OK;
}
}
put_module(B_PCI_MODULE_NAME);
return ENODEV;
}
extern "C" status_t
init_driver(void)
{
char path[B_PATH_NAME_LENGTH];
pci_info info;
long i;
if (get_module(B_PCI_MODULE_NAME, (module_info**)&gPci) != B_OK)
return ENODEV;
gNumCards = 0;
for (i = 0; gPci->get_nth_pci_info(i, &info) == B_OK
&& gNumCards < MAX_CARDS; i++) {
if ((info.vendor_id == AMD_VENDOR_ID
&& info.device_id == AMD_CS5536_AUDIO_DEVICE_ID)
|| (info.vendor_id == NS_VENDOR_ID
&& info.device_id == NS_CS5535_AUDIO_DEVICE_ID)) {
memset(&gCards[gNumCards], 0, sizeof(geode_controller));
gCards[gNumCards].pci_info = info;
gCards[gNumCards].opened = 0;
sprintf(path, DEVFS_PATH_FORMAT, gNumCards);
gCards[gNumCards++].devfs_path = strdup(path);
dprintf("geode: detected controller @ PCI:%d:%d:%d, IRQ:%d, type %04x/%04x\n",
info.bus, info.device, info.function,
info.u.h0.interrupt_line,
info.vendor_id, info.device_id);
}
}
if (gNumCards == 0) {
put_module(B_PCI_MODULE_NAME);
return ENODEV;
}
return B_OK;
}
extern "C" void
uninit_driver(void)
{
for (uint32 i = 0; i < gNumCards; i++) {
free((void*)gCards[i].devfs_path);
gCards[i].devfs_path = NULL;
}
put_module(B_PCI_MODULE_NAME);
}
extern "C" const char**
publish_devices(void)
{
static const char* devs[MAX_CARDS + 1];
uint32 i;
for (i = 0; i < gNumCards; i++) {
devs[i] = gCards[i].devfs_path;
}
devs[i] = NULL;
return devs;
}
extern "C" device_hooks*
find_device(const char* name)
{
return &gDriverHooks;
}