diff options
Diffstat (limited to 'drivers/gpu/drm/drm_platform.c')
| -rw-r--r-- | drivers/gpu/drm/drm_platform.c | 122 | 
1 files changed, 122 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_platform.c b/drivers/gpu/drm/drm_platform.c new file mode 100644 index 00000000000..460e9a3afa8 --- /dev/null +++ b/drivers/gpu/drm/drm_platform.c @@ -0,0 +1,122 @@ +/* + * Derived from drm_pci.c + * + * Copyright 2003 José Fonseca. + * Copyright 2003 Leif Delgass. + * Copyright (c) 2009, Code Aurora Forum. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE + * AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "drmP.h" + +/** + * Register. + * + * \param platdev - Platform device struture + * \return zero on success or a negative number on failure. + * + * Attempt to gets inter module "drm" information. If we are first + * then register the character device and inter module information. + * Try and register, if we fail to register, backout previous work. + */ + +int drm_get_platform_dev(struct platform_device *platdev, +			 struct drm_driver *driver) +{ +	struct drm_device *dev; +	int ret; + +	DRM_DEBUG("\n"); + +	dev = kzalloc(sizeof(*dev), GFP_KERNEL); +	if (!dev) +		return -ENOMEM; + +	dev->platformdev = platdev; +	dev->dev = &platdev->dev; + +	ret = drm_fill_in_dev(dev, NULL, driver); + +	if (ret) { +		printk(KERN_ERR "DRM: Fill_in_dev failed.\n"); +		goto err_g1; +	} + +	if (drm_core_check_feature(dev, DRIVER_MODESET)) { +		dev_set_drvdata(&platdev->dev, dev); +		ret = drm_get_minor(dev, &dev->control, DRM_MINOR_CONTROL); +		if (ret) +			goto err_g1; +	} + +	ret = drm_get_minor(dev, &dev->primary, DRM_MINOR_LEGACY); +	if (ret) +		goto err_g2; + +	if (dev->driver->load) { +		ret = dev->driver->load(dev, 0); +		if (ret) +			goto err_g3; +	} + +	/* setup the grouping for the legacy output */ +	if (drm_core_check_feature(dev, DRIVER_MODESET)) { +		ret = drm_mode_group_init_legacy_group(dev, +				&dev->primary->mode_group); +		if (ret) +			goto err_g3; +	} + +	list_add_tail(&dev->driver_item, &driver->device_list); + +	DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", +		 driver->name, driver->major, driver->minor, driver->patchlevel, +		 driver->date, dev->primary->index); + +	return 0; + +err_g3: +	drm_put_minor(&dev->primary); +err_g2: +	if (drm_core_check_feature(dev, DRIVER_MODESET)) +		drm_put_minor(&dev->control); +err_g1: +	kfree(dev); +	return ret; +} +EXPORT_SYMBOL(drm_get_platform_dev); + +/** + * Platform device initialization. Called via drm_init at module load time, + * + * \return zero on success or a negative number on failure. + * + * Initializes a drm_device structures,registering the + * stubs + * + * Expands the \c DRIVER_PREINIT and \c DRIVER_POST_INIT macros before and + * after the initialization for driver customization. + */ + +int drm_platform_init(struct drm_driver *driver) +{ +	return drm_get_platform_dev(driver->platform_device, driver); +}  |