int superhyway_add_device()

in superhyway/superhyway.c [53:91]


int superhyway_add_device(unsigned long base, struct superhyway_device *sdev,
			  struct superhyway_bus *bus)
{
	struct superhyway_device *dev = sdev;

	if (!dev) {
		dev = kzalloc(sizeof(struct superhyway_device), GFP_KERNEL);
		if (!dev)
			return -ENOMEM;

	}

	dev->bus = bus;
	superhyway_read_vcr(dev, base, &dev->vcr);

	if (!dev->resource) {
		dev->resource = kzalloc(sizeof(struct resource), GFP_KERNEL);
		if (!dev->resource) {
			kfree(dev);
			return -ENOMEM;
		}

		dev->resource->name	= dev->name;
		dev->resource->start	= base;
		dev->resource->end	= dev->resource->start + 0x01000000;
	}

	dev->dev.parent		= &superhyway_bus_device;
	dev->dev.bus		= &superhyway_bus_type;
	dev->dev.release	= superhyway_device_release;
	dev->id.id		= dev->vcr.mod_id;

	sprintf(dev->name, "SuperHyway device %04x", dev->id.id);
	dev_set_name(&dev->dev, "%02x", superhyway_devices);

	superhyway_devices++;

	return device_register(&dev->dev);
}