--- src/cir_driver.c.orig 2006-05-28 12:24:07.000000000 +0200 +++ src/cir_driver.c 2006-05-28 12:46:58.000000000 +0200 @@ -119,16 +119,29 @@ * unresolved symbols that are not required. */ +typedef enum {AvailableOptions, Probe} SubSymbolIdx; +typedef ScrnInfoPtr (*subFunctionPtr)(int); + static const char *alpSymbols[] = { "AlpAvailableOptions", "AlpProbe", NULL }; +subFunctionPtr alpRefs[] = { + NULL, + NULL, + NULL +}; static const char *lgSymbols[] = { "LgAvailableOptions", "LgProbe", NULL }; +subFunctionPtr lgRefs[] = { + NULL, + NULL, + NULL +}; static const char *vbeSymbols[] = { "VBEInit", @@ -200,13 +213,13 @@ case PCI_CHIP_GD5464BD: case PCI_CHIP_GD5465: if (lg_loaded) - return LgAvailableOptions(chipid); + return (*lgRefs[AvailableOptions])(chipid); else return NULL; default: if (alp_loaded) - return AlpAvailableOptions(chipid); + return (*alpRefs[AvailableOptions])(chipid); else return NULL; } @@ -215,7 +228,7 @@ static Bool CIRProbe(DriverPtr drv, int flags) { - int i; + int i, symidx; GDevPtr *devSections; pciVideoPtr pPci; int *usedChips; @@ -238,12 +251,18 @@ if (!lg_loaded) { if (xf86LoadDrvSubModule(drv, "cirrus_laguna")) { xf86LoaderReqSymLists(lgSymbols, NULL); + for (symidx=0; lgSymbols[symidx]!=NULL; symidx++) { + lgRefs[symidx]=(subFunctionPtr)LoaderSymbol(lgSymbols[symidx]); + } lg_loaded = TRUE; } } if (!alp_loaded) { if (xf86LoadDrvSubModule(drv, "cirrus_alpine")) { xf86LoaderReqSymLists(alpSymbols, NULL); + for (symidx=0; alpSymbols[symidx]!=NULL; symidx++) { + alpRefs[symidx]=(subFunctionPtr)LoaderSymbol(alpSymbols[symidx]); + } alp_loaded = TRUE; } } @@ -288,17 +307,23 @@ if (!xf86LoadDrvSubModule(drv, "cirrus_laguna")) continue; xf86LoaderReqSymLists(lgSymbols, NULL); + for (symidx=0; lgSymbols[symidx]!=NULL; symidx++) { + lgRefs[symidx]=(subFunctionPtr)LoaderSymbol(lgSymbols[symidx]); + } lg_loaded = TRUE; } - pScrn = LgProbe(usedChips[i]); + pScrn = (*lgRefs[Probe])(usedChips[i]); } else { if (!alp_loaded) { if (!xf86LoadDrvSubModule(drv, "cirrus_alpine")) continue; xf86LoaderReqSymLists(alpSymbols, NULL); + for (symidx=0; alpSymbols[symidx]!=NULL; symidx++) { + alpRefs[symidx]=(subFunctionPtr)LoaderSymbol(alpSymbols[symidx]); + } alp_loaded = TRUE; } - pScrn = AlpProbe(usedChips[i]); + pScrn = (*alpRefs[Probe])(usedChips[i]); } if (pScrn) {