xref: /openbmc/linux/Documentation/driver-api/zorro.rst (revision 0898782247ae533d1f4e47a06bc5d4870931b284)
1*baa293e9SMauro Carvalho Chehab========================================
2*baa293e9SMauro Carvalho ChehabWriting Device Drivers for Zorro Devices
3*baa293e9SMauro Carvalho Chehab========================================
4*baa293e9SMauro Carvalho Chehab
5*baa293e9SMauro Carvalho Chehab:Author: Written by Geert Uytterhoeven <geert@linux-m68k.org>
6*baa293e9SMauro Carvalho Chehab:Last revised: September 5, 2003
7*baa293e9SMauro Carvalho Chehab
8*baa293e9SMauro Carvalho Chehab
9*baa293e9SMauro Carvalho ChehabIntroduction
10*baa293e9SMauro Carvalho Chehab------------
11*baa293e9SMauro Carvalho Chehab
12*baa293e9SMauro Carvalho ChehabThe Zorro bus is the bus used in the Amiga family of computers. Thanks to
13*baa293e9SMauro Carvalho ChehabAutoConfig(tm), it's 100% Plug-and-Play.
14*baa293e9SMauro Carvalho Chehab
15*baa293e9SMauro Carvalho ChehabThere are two types of Zorro buses, Zorro II and Zorro III:
16*baa293e9SMauro Carvalho Chehab
17*baa293e9SMauro Carvalho Chehab  - The Zorro II address space is 24-bit and lies within the first 16 MB of the
18*baa293e9SMauro Carvalho Chehab    Amiga's address map.
19*baa293e9SMauro Carvalho Chehab
20*baa293e9SMauro Carvalho Chehab  - Zorro III is a 32-bit extension of Zorro II, which is backwards compatible
21*baa293e9SMauro Carvalho Chehab    with Zorro II. The Zorro III address space lies outside the first 16 MB.
22*baa293e9SMauro Carvalho Chehab
23*baa293e9SMauro Carvalho Chehab
24*baa293e9SMauro Carvalho ChehabProbing for Zorro Devices
25*baa293e9SMauro Carvalho Chehab-------------------------
26*baa293e9SMauro Carvalho Chehab
27*baa293e9SMauro Carvalho ChehabZorro devices are found by calling ``zorro_find_device()``, which returns a
28*baa293e9SMauro Carvalho Chehabpointer to the ``next`` Zorro device with the specified Zorro ID. A probe loop
29*baa293e9SMauro Carvalho Chehabfor the board with Zorro ID ``ZORRO_PROD_xxx`` looks like::
30*baa293e9SMauro Carvalho Chehab
31*baa293e9SMauro Carvalho Chehab    struct zorro_dev *z = NULL;
32*baa293e9SMauro Carvalho Chehab
33*baa293e9SMauro Carvalho Chehab    while ((z = zorro_find_device(ZORRO_PROD_xxx, z))) {
34*baa293e9SMauro Carvalho Chehab	if (!zorro_request_region(z->resource.start+MY_START, MY_SIZE,
35*baa293e9SMauro Carvalho Chehab				  "My explanation"))
36*baa293e9SMauro Carvalho Chehab	...
37*baa293e9SMauro Carvalho Chehab    }
38*baa293e9SMauro Carvalho Chehab
39*baa293e9SMauro Carvalho Chehab``ZORRO_WILDCARD`` acts as a wildcard and finds any Zorro device. If your driver
40*baa293e9SMauro Carvalho Chehabsupports different types of boards, you can use a construct like::
41*baa293e9SMauro Carvalho Chehab
42*baa293e9SMauro Carvalho Chehab    struct zorro_dev *z = NULL;
43*baa293e9SMauro Carvalho Chehab
44*baa293e9SMauro Carvalho Chehab    while ((z = zorro_find_device(ZORRO_WILDCARD, z))) {
45*baa293e9SMauro Carvalho Chehab	if (z->id != ZORRO_PROD_xxx1 && z->id != ZORRO_PROD_xxx2 && ...)
46*baa293e9SMauro Carvalho Chehab	    continue;
47*baa293e9SMauro Carvalho Chehab	if (!zorro_request_region(z->resource.start+MY_START, MY_SIZE,
48*baa293e9SMauro Carvalho Chehab				  "My explanation"))
49*baa293e9SMauro Carvalho Chehab	...
50*baa293e9SMauro Carvalho Chehab    }
51*baa293e9SMauro Carvalho Chehab
52*baa293e9SMauro Carvalho Chehab
53*baa293e9SMauro Carvalho ChehabZorro Resources
54*baa293e9SMauro Carvalho Chehab---------------
55*baa293e9SMauro Carvalho Chehab
56*baa293e9SMauro Carvalho ChehabBefore you can access a Zorro device's registers, you have to make sure it's
57*baa293e9SMauro Carvalho Chehabnot yet in use. This is done using the I/O memory space resource management
58*baa293e9SMauro Carvalho Chehabfunctions::
59*baa293e9SMauro Carvalho Chehab
60*baa293e9SMauro Carvalho Chehab    request_mem_region()
61*baa293e9SMauro Carvalho Chehab    release_mem_region()
62*baa293e9SMauro Carvalho Chehab
63*baa293e9SMauro Carvalho ChehabShortcuts to claim the whole device's address space are provided as well::
64*baa293e9SMauro Carvalho Chehab
65*baa293e9SMauro Carvalho Chehab    zorro_request_device
66*baa293e9SMauro Carvalho Chehab    zorro_release_device
67*baa293e9SMauro Carvalho Chehab
68*baa293e9SMauro Carvalho Chehab
69*baa293e9SMauro Carvalho ChehabAccessing the Zorro Address Space
70*baa293e9SMauro Carvalho Chehab---------------------------------
71*baa293e9SMauro Carvalho Chehab
72*baa293e9SMauro Carvalho ChehabThe address regions in the Zorro device resources are Zorro bus address
73*baa293e9SMauro Carvalho Chehabregions. Due to the identity bus-physical address mapping on the Zorro bus,
74*baa293e9SMauro Carvalho Chehabthey are CPU physical addresses as well.
75*baa293e9SMauro Carvalho Chehab
76*baa293e9SMauro Carvalho ChehabThe treatment of these regions depends on the type of Zorro space:
77*baa293e9SMauro Carvalho Chehab
78*baa293e9SMauro Carvalho Chehab  - Zorro II address space is always mapped and does not have to be mapped
79*baa293e9SMauro Carvalho Chehab    explicitly using z_ioremap().
80*baa293e9SMauro Carvalho Chehab
81*baa293e9SMauro Carvalho Chehab    Conversion from bus/physical Zorro II addresses to kernel virtual addresses
82*baa293e9SMauro Carvalho Chehab    and vice versa is done using::
83*baa293e9SMauro Carvalho Chehab
84*baa293e9SMauro Carvalho Chehab	virt_addr = ZTWO_VADDR(bus_addr);
85*baa293e9SMauro Carvalho Chehab	bus_addr = ZTWO_PADDR(virt_addr);
86*baa293e9SMauro Carvalho Chehab
87*baa293e9SMauro Carvalho Chehab  - Zorro III address space must be mapped explicitly using z_ioremap() first
88*baa293e9SMauro Carvalho Chehab    before it can be accessed::
89*baa293e9SMauro Carvalho Chehab
90*baa293e9SMauro Carvalho Chehab	virt_addr = z_ioremap(bus_addr, size);
91*baa293e9SMauro Carvalho Chehab	...
92*baa293e9SMauro Carvalho Chehab	z_iounmap(virt_addr);
93*baa293e9SMauro Carvalho Chehab
94*baa293e9SMauro Carvalho Chehab
95*baa293e9SMauro Carvalho ChehabReferences
96*baa293e9SMauro Carvalho Chehab----------
97*baa293e9SMauro Carvalho Chehab
98*baa293e9SMauro Carvalho Chehab#. linux/include/linux/zorro.h
99*baa293e9SMauro Carvalho Chehab#. linux/include/uapi/linux/zorro.h
100*baa293e9SMauro Carvalho Chehab#. linux/include/uapi/linux/zorro_ids.h
101*baa293e9SMauro Carvalho Chehab#. linux/arch/m68k/include/asm/zorro.h
102*baa293e9SMauro Carvalho Chehab#. linux/drivers/zorro
103*baa293e9SMauro Carvalho Chehab#. /proc/bus/zorro
104*baa293e9SMauro Carvalho Chehab
105