Maciej W. Rozycki | b454cc6 | 2007-02-05 16:28:25 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Interface to the TURBOchannel related routines. |
| 3 | * |
| 4 | * Copyright (c) 1998 Harald Koerfgen |
| 5 | * Copyright (c) 2005 James Simmons |
| 6 | * Copyright (c) 2006 Maciej W. Rozycki |
| 7 | * |
| 8 | * Based on: |
| 9 | * |
| 10 | * "TURBOchannel Firmware Specification", EK-TCAAD-FS-004 |
| 11 | * |
| 12 | * from Digital Equipment Corporation. |
| 13 | * |
| 14 | * This file is subject to the terms and conditions of the GNU |
| 15 | * General Public License. See the file "COPYING" in the main |
| 16 | * directory of this archive for more details. |
| 17 | */ |
| 18 | #ifndef _LINUX_TC_H |
| 19 | #define _LINUX_TC_H |
| 20 | |
| 21 | #include <linux/compiler.h> |
| 22 | #include <linux/device.h> |
| 23 | #include <linux/ioport.h> |
| 24 | #include <linux/types.h> |
| 25 | |
| 26 | /* |
| 27 | * Offsets for the ROM header locations for TURBOchannel cards. |
| 28 | */ |
| 29 | #define TC_OLDCARD 0x3c0000 |
| 30 | #define TC_NEWCARD 0x000000 |
| 31 | |
| 32 | #define TC_ROM_WIDTH 0x3e0 |
| 33 | #define TC_ROM_STRIDE 0x3e4 |
| 34 | #define TC_ROM_SIZE 0x3e8 |
| 35 | #define TC_SLOT_SIZE 0x3ec |
| 36 | #define TC_PATTERN0 0x3f0 |
| 37 | #define TC_PATTERN1 0x3f4 |
| 38 | #define TC_PATTERN2 0x3f8 |
| 39 | #define TC_PATTERN3 0x3fc |
| 40 | #define TC_FIRM_VER 0x400 |
| 41 | #define TC_VENDOR 0x420 |
| 42 | #define TC_MODULE 0x440 |
| 43 | #define TC_FIRM_TYPE 0x460 |
| 44 | #define TC_FLAGS 0x470 |
| 45 | #define TC_ROM_OBJECTS 0x480 |
| 46 | |
| 47 | /* |
| 48 | * Information obtained through the get_tcinfo() PROM call. |
| 49 | */ |
| 50 | struct tcinfo { |
| 51 | s32 revision; /* Hardware revision level. */ |
| 52 | s32 clk_period; /* Clock period in nanoseconds. */ |
| 53 | s32 slot_size; /* Slot size in megabytes. */ |
| 54 | s32 io_timeout; /* I/O timeout in cycles. */ |
| 55 | s32 dma_range; /* DMA address range in megabytes. */ |
| 56 | s32 max_dma_burst; /* Maximum DMA burst length. */ |
| 57 | s32 parity; /* System module supports TC parity. */ |
| 58 | s32 reserved[4]; |
| 59 | }; |
| 60 | |
| 61 | /* |
| 62 | * TURBOchannel bus. |
| 63 | */ |
| 64 | struct tc_bus { |
| 65 | struct list_head devices; /* List of devices on this bus. */ |
| 66 | struct resource resource[2]; /* Address space routed to this bus. */ |
| 67 | |
| 68 | struct device dev; |
| 69 | char name[13]; |
| 70 | resource_size_t slot_base; |
| 71 | resource_size_t ext_slot_base; |
| 72 | resource_size_t ext_slot_size; |
| 73 | int num_tcslots; |
| 74 | struct tcinfo info; |
| 75 | }; |
| 76 | |
| 77 | /* |
| 78 | * TURBOchannel device. |
| 79 | */ |
| 80 | struct tc_dev { |
| 81 | struct list_head node; /* Node in list of all TC devices. */ |
| 82 | struct tc_bus *bus; /* Bus this device is on. */ |
| 83 | struct tc_driver *driver; /* Which driver has allocated this |
| 84 | device. */ |
| 85 | struct device dev; /* Generic device interface. */ |
| 86 | struct resource resource; /* Address space of this device. */ |
| 87 | char vendor[9]; |
| 88 | char name[9]; |
| 89 | char firmware[9]; |
| 90 | int interrupt; |
| 91 | int slot; |
| 92 | }; |
| 93 | |
| 94 | #define to_tc_dev(n) container_of(n, struct tc_dev, dev) |
| 95 | |
| 96 | struct tc_device_id { |
| 97 | char vendor[9]; |
| 98 | char name[9]; |
| 99 | }; |
| 100 | |
| 101 | /* |
| 102 | * TURBOchannel driver. |
| 103 | */ |
| 104 | struct tc_driver { |
| 105 | struct list_head node; |
| 106 | const struct tc_device_id *id_table; |
| 107 | struct device_driver driver; |
| 108 | }; |
| 109 | |
| 110 | #define to_tc_driver(drv) container_of(drv, struct tc_driver, driver) |
| 111 | |
| 112 | /* |
| 113 | * Return TURBOchannel clock frequency in Hz. |
| 114 | */ |
| 115 | static inline unsigned long tc_get_speed(struct tc_bus *tbus) |
| 116 | { |
| 117 | return 100000 * (10000 / (unsigned long)tbus->info.clk_period); |
| 118 | } |
| 119 | |
| 120 | #ifdef CONFIG_TC |
| 121 | |
| 122 | extern struct bus_type tc_bus_type; |
| 123 | |
| 124 | extern int tc_register_driver(struct tc_driver *tdrv); |
| 125 | extern void tc_unregister_driver(struct tc_driver *tdrv); |
| 126 | |
| 127 | #else /* !CONFIG_TC */ |
| 128 | |
| 129 | static inline int tc_register_driver(struct tc_driver *tdrv) { return 0; } |
| 130 | static inline void tc_unregister_driver(struct tc_driver *tdrv) { } |
| 131 | |
| 132 | #endif /* CONFIG_TC */ |
| 133 | |
| 134 | /* |
| 135 | * These have to be provided by the architecture. |
| 136 | */ |
| 137 | extern int tc_preadb(u8 *valp, void __iomem *addr); |
| 138 | extern int tc_bus_get_info(struct tc_bus *tbus); |
| 139 | extern void tc_device_get_irq(struct tc_dev *tdev); |
| 140 | |
| 141 | #endif /* _LINUX_TC_H */ |