4 * Copyright (C) 1995-2003 Geert Uytterhoeven
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file COPYING in the main directory of this archive
11 #include <linux/module.h>
12 #include <linux/types.h>
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15 #include <linux/zorro.h>
16 #include <linux/bitops.h>
17 #include <linux/string.h>
18 #include <linux/platform_device.h>
19 #include <linux/slab.h>
21 #include <asm/setup.h>
22 #include <asm/amigahw.h>
28 * Zorro Expansion Devices
31 unsigned int zorro_num_autocon
;
32 struct zorro_dev zorro_autocon
[ZORRO_NUM_AUTO
];
40 struct list_head devices
; /* list of devices on this bus */
49 struct zorro_dev
*zorro_find_device(zorro_id id
, struct zorro_dev
*from
)
53 if (!zorro_num_autocon
)
56 for (z
= from
? from
+1 : &zorro_autocon
[0];
57 z
< zorro_autocon
+zorro_num_autocon
;
59 if (id
== ZORRO_WILDCARD
|| id
== z
->id
)
63 EXPORT_SYMBOL(zorro_find_device
);
67 DECLARE_BITMAP(zorro_unused_z2ram
, 128);
68 EXPORT_SYMBOL(zorro_unused_z2ram
);
71 static void __init
mark_region(unsigned long start
, unsigned long end
,
75 start
+= Z2RAM_CHUNKMASK
;
77 end
+= Z2RAM_CHUNKMASK
;
78 start
&= ~Z2RAM_CHUNKMASK
;
79 end
&= ~Z2RAM_CHUNKMASK
;
81 if (end
<= Z2RAM_START
|| start
>= Z2RAM_END
)
83 start
= start
< Z2RAM_START
? 0x00000000 : start
-Z2RAM_START
;
84 end
= end
> Z2RAM_END
? Z2RAM_SIZE
: end
-Z2RAM_START
;
86 u32 chunk
= start
>>Z2RAM_CHUNKSHIFT
;
88 set_bit(chunk
, zorro_unused_z2ram
);
90 clear_bit(chunk
, zorro_unused_z2ram
);
91 start
+= Z2RAM_CHUNKSIZE
;
96 static struct resource __init
*zorro_find_parent_resource(
97 struct platform_device
*bridge
, struct zorro_dev
*z
)
101 for (i
= 0; i
< bridge
->num_resources
; i
++) {
102 struct resource
*r
= &bridge
->resource
[i
];
103 if (zorro_resource_start(z
) >= r
->start
&&
104 zorro_resource_end(z
) <= r
->end
)
107 return &iomem_resource
;
112 static int __init
amiga_zorro_probe(struct platform_device
*pdev
)
114 struct zorro_bus
*bus
;
120 /* Initialize the Zorro bus */
121 bus
= kzalloc(sizeof(*bus
), GFP_KERNEL
);
125 INIT_LIST_HEAD(&bus
->devices
);
126 bus
->dev
.parent
= &pdev
->dev
;
127 dev_set_name(&bus
->dev
, "zorro");
128 error
= device_register(&bus
->dev
);
130 pr_err("Zorro: Error registering zorro_bus\n");
134 platform_set_drvdata(pdev
, bus
);
136 /* Register all devices */
137 pr_info("Zorro: Probing AutoConfig expansion devices: %u device%s\n",
138 zorro_num_autocon
, zorro_num_autocon
== 1 ? "" : "s");
140 for (i
= 0; i
< zorro_num_autocon
; i
++) {
141 z
= &zorro_autocon
[i
];
142 z
->id
= (z
->rom
.er_Manufacturer
<<16) | (z
->rom
.er_Product
<<8);
143 if (z
->id
== ZORRO_PROD_GVP_EPC_BASE
) {
145 unsigned long magic
= zorro_resource_start(z
)+0x8000;
146 z
->id
|= *(u16
*)ZTWO_VADDR(magic
) & GVP_PRODMASK
;
148 sprintf(z
->name
, "Zorro device %08x", z
->id
);
149 zorro_name_device(z
);
150 z
->resource
.name
= z
->name
;
151 r
= zorro_find_parent_resource(pdev
, z
);
152 error
= request_resource(r
, &z
->resource
);
155 "Address space collision on device %s %pR\n",
156 z
->name
, &z
->resource
);
157 dev_set_name(&z
->dev
, "%02x", i
);
158 z
->dev
.parent
= &bus
->dev
;
159 z
->dev
.bus
= &zorro_bus_type
;
160 error
= device_register(&z
->dev
);
162 dev_err(&bus
->dev
, "Error registering device %s\n",
166 error
= zorro_create_sysfs_dev_files(z
);
168 dev_err(&z
->dev
, "Error creating sysfs files\n");
171 /* Mark all available Zorro II memory */
172 zorro_for_each_dev(z
) {
173 if (z
->rom
.er_Type
& ERTF_MEMLIST
)
174 mark_region(zorro_resource_start(z
),
175 zorro_resource_end(z
)+1, 1);
178 /* Unmark all used Zorro II memory */
179 for (i
= 0; i
< m68k_num_memory
; i
++)
180 if (m68k_memory
[i
].addr
< 16*1024*1024)
181 mark_region(m68k_memory
[i
].addr
,
182 m68k_memory
[i
].addr
+m68k_memory
[i
].size
,
188 static struct platform_driver amiga_zorro_driver
= {
190 .name
= "amiga-zorro",
191 .owner
= THIS_MODULE
,
195 static int __init
amiga_zorro_init(void)
197 return platform_driver_probe(&amiga_zorro_driver
, amiga_zorro_probe
);
200 module_init(amiga_zorro_init
);
202 MODULE_LICENSE("GPL");