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