diff options
Diffstat (limited to 'drivers/zorro/zorro.c')
| -rw-r--r-- | drivers/zorro/zorro.c | 27 | 
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/zorro/zorro.c b/drivers/zorro/zorro.c index 858c9714b2f..707c1a5a031 100644 --- a/drivers/zorro/zorro.c +++ b/drivers/zorro/zorro.c @@ -18,6 +18,7 @@  #include <linux/platform_device.h>  #include <linux/slab.h> +#include <asm/byteorder.h>  #include <asm/setup.h>  #include <asm/amigahw.h> @@ -29,7 +30,8 @@       */  unsigned int zorro_num_autocon; -struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO]; +struct zorro_dev_init zorro_autocon_init[ZORRO_NUM_AUTO] __initdata; +struct zorro_dev *zorro_autocon;      /* @@ -38,6 +40,7 @@ struct zorro_dev zorro_autocon[ZORRO_NUM_AUTO];  struct zorro_bus {  	struct device dev; +	struct zorro_dev devices[0];  }; @@ -125,18 +128,22 @@ static struct resource __init *zorro_find_parent_resource(  static int __init amiga_zorro_probe(struct platform_device *pdev)  {  	struct zorro_bus *bus; +	struct zorro_dev_init *zi;  	struct zorro_dev *z;  	struct resource *r;  	unsigned int i;  	int error;  	/* Initialize the Zorro bus */ -	bus = kzalloc(sizeof(*bus), GFP_KERNEL); +	bus = kzalloc(sizeof(*bus) + +		      zorro_num_autocon * sizeof(bus->devices[0]), +		      GFP_KERNEL);  	if (!bus)  		return -ENOMEM; +	zorro_autocon = bus->devices;  	bus->dev.parent = &pdev->dev; -	dev_set_name(&bus->dev, "zorro"); +	dev_set_name(&bus->dev, zorro_bus_type.name);  	error = device_register(&bus->dev);  	if (error) {  		pr_err("Zorro: Error registering zorro_bus\n"); @@ -151,15 +158,23 @@ static int __init amiga_zorro_probe(struct platform_device *pdev)  	/* First identify all devices ... */  	for (i = 0; i < zorro_num_autocon; i++) { +		zi = &zorro_autocon_init[i];  		z = &zorro_autocon[i]; -		z->id = (z->rom.er_Manufacturer<<16) | (z->rom.er_Product<<8); + +		z->rom = zi->rom; +		z->id = (be16_to_cpu(z->rom.er_Manufacturer) << 16) | +			(z->rom.er_Product << 8);  		if (z->id == ZORRO_PROD_GVP_EPC_BASE) {  			/* GVP quirk */ -			unsigned long magic = zorro_resource_start(z)+0x8000; +			unsigned long magic = zi->boardaddr + 0x8000;  			z->id |= *(u16 *)ZTWO_VADDR(magic) & GVP_PRODMASK;  		} +		z->slotaddr = zi->slotaddr; +		z->slotsize = zi->slotsize;  		sprintf(z->name, "Zorro device %08x", z->id);  		zorro_name_device(z); +		z->resource.start = zi->boardaddr; +		z->resource.end = zi->boardaddr + zi->boardsize - 1;  		z->resource.name = z->name;  		r = zorro_find_parent_resource(pdev, z);  		error = request_resource(r, &z->resource); @@ -167,9 +182,9 @@ static int __init amiga_zorro_probe(struct platform_device *pdev)  			dev_err(&bus->dev,  				"Address space collision on device %s %pR\n",  				z->name, &z->resource); -		dev_set_name(&z->dev, "%02x", i);  		z->dev.parent = &bus->dev;  		z->dev.bus = &zorro_bus_type; +		z->dev.id = i;  	}  	/* ... then register them */  | 
