/*
 * Copyright (C) 2013 NVIDIA Corporation
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include "drm.h"

static int drm_host1x_set_busid(struct drm_device *dev,
				struct drm_master *master)
{
	const char *device = dev_name(dev->dev);
	const char *driver = dev->driver->name;
	const char *bus = dev->dev->bus->name;
	int length;

	master->unique_len = strlen(bus) + 1 + strlen(device);
	master->unique_size = master->unique_len;

	master->unique = kmalloc(master->unique_len + 1, GFP_KERNEL);
	if (!master->unique)
		return -ENOMEM;

	snprintf(master->unique, master->unique_len + 1, "%s:%s", bus, device);

	length = strlen(driver) + 1 + master->unique_len;

	dev->devname = kmalloc(length + 1, GFP_KERNEL);
	if (!dev->devname)
		return -ENOMEM;

	snprintf(dev->devname, length + 1, "%s@%s", driver, master->unique);

	return 0;
}

static struct drm_bus drm_host1x_bus = {
	.bus_type = DRIVER_BUS_HOST1X,
	.set_busid = drm_host1x_set_busid,
};

int drm_host1x_init(struct drm_driver *driver, struct host1x_device *device)
{
	struct drm_device *drm;
	int ret;

	driver->bus = &drm_host1x_bus;

	drm = drm_dev_alloc(driver, &device->dev);
	if (!drm)
		return -ENOMEM;

	ret = drm_dev_register(drm, 0);
	if (ret)
		goto err_free;

	DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", driver->name,
		 driver->major, driver->minor, driver->patchlevel,
		 driver->date, drm->primary->index);

	return 0;

err_free:
	drm_dev_unref(drm);
	return ret;
}

void drm_host1x_exit(struct drm_driver *driver, struct host1x_device *device)
{
	struct tegra_drm *tegra = dev_get_drvdata(&device->dev);

	drm_put_dev(tegra->drm);
}
