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