diff options
Diffstat (limited to 'src/armada_module.c')
-rw-r--r-- | src/armada_module.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/armada_module.c b/src/armada_module.c new file mode 100644 index 0000000..13483ea --- /dev/null +++ b/src/armada_module.c @@ -0,0 +1,138 @@ +/* + * Marvell Armada DRM-based driver + * + * Written by Russell King, 2012, derived in part from the + * Intel xorg X server driver. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "armada_drm.h" + +#define ARMADA_VERSION 4000 +#define ARMADA_NAME "armada" +#define ARMADA_DRIVER_NAME "armada" + +/* Supported "chipsets" */ +static SymTabRec armada_chipsets[] = { +// { 0, "88AP16x" }, + { 0, "88AP510" }, + { -1, NULL } +}; + +static void armada_identify(int flags) +{ + xf86PrintChipsets(ARMADA_NAME, "Support for Marvell LCD Controller", + armada_chipsets); +} + +static Bool armada_probe(DriverPtr drv, int flags) +{ + GDevPtr *devSections; + int i, numDevSections; + Bool foundScreen = FALSE; + + if (flags & PROBE_DETECT) + return FALSE; + + numDevSections = xf86MatchDevice(ARMADA_DRIVER_NAME, &devSections); + if (numDevSections <= 0) + return FALSE; + + for (i = 0; i < numDevSections; i++) { + ScrnInfoPtr pScrn; + int entity; + + entity = xf86ClaimFbSlot(drv, 0, devSections[i], TRUE); + pScrn = xf86ConfigFbEntity(NULL, 0, entity, + NULL, NULL, NULL, NULL); + + if (pScrn) { + foundScreen = TRUE; + + pScrn->driverVersion = ARMADA_VERSION; + pScrn->driverName = ARMADA_DRIVER_NAME; + pScrn->name = ARMADA_NAME; + pScrn->Probe = NULL; + + armada_drm_init_screen(pScrn); + } + } + + free(devSections); + + return foundScreen; +} + +static const OptionInfoRec *armada_available_options(int chipid, int busid) +{ + extern const OptionInfoRec armada_drm_options[]; + return armada_drm_options; +} + +static Bool +armada_driver_func(ScrnInfoPtr pScrn, xorgDriverFuncOp op, pointer ptr) +{ + xorgHWFlags *flag; + + switch (op) { + case GET_REQUIRED_HW_INTERFACES: + flag = (CARD32*)ptr; + (*flag) = 0; + return TRUE; + default: + return FALSE; + } +} + +_X_EXPORT DriverRec armada_driver = { + .driverVersion = ARMADA_VERSION, + .driverName = ARMADA_DRIVER_NAME, + .Identify = armada_identify, + .Probe = armada_probe, + .AvailableOptions = armada_available_options, + .driverFunc = armada_driver_func, +}; + +#ifdef XFree86LOADER + +static pointer armada_setup(pointer module, pointer opts, int *errmaj, + int *errmin) +{ + static Bool setupDone = FALSE; + + if (setupDone) { + if (errmaj) + *errmaj = LDR_ONCEONLY; + return NULL; + } + + setupDone = TRUE; + + xf86AddDriver(&armada_driver, module, HaveDriverFuncs); + + return (pointer) 1; +} + +static XF86ModuleVersionInfo armada_version = { + .modname = "armada", + .vendor = MODULEVENDORSTRING, + ._modinfo1_ = MODINFOSTRING1, + ._modinfo2_ = MODINFOSTRING2, + .xf86version = XORG_VERSION_CURRENT, + .majorversion = PACKAGE_VERSION_MAJOR, + .minorversion = PACKAGE_VERSION_MINOR, + .patchlevel = PACKAGE_VERSION_PATCHLEVEL, + .abiclass = ABI_CLASS_VIDEODRV, + .abiversion = ABI_VIDEODRV_VERSION, + .moduleclass = MOD_CLASS_VIDEODRV, + .checksum = { 0, 0, 0, 0 }, +}; + +_X_EXPORT XF86ModuleData armadaModuleData = { + .vers = &armada_version, + .setup = armada_setup, +}; + +#endif /* XFree86LOADER */ |