1 /* Code to support devices on the DIO and DIO-II bus
2 * Copyright (C) 05/1998 Peter Maydell <pmaydell@chiark.greenend.org.uk>
3 * Copyright (C) 2004 Jochen Friedrich <jochen@scram.de>
5 * This code has basically these routines at the moment:
6 * int dio_find(u_int deviceid)
7 * Search the list of DIO devices and return the select code
8 * of the next unconfigured device found that matches the given device ID.
9 * Note that the deviceid parameter should be the encoded ID.
10 * This means that framebuffers should pass it as
11 * DIO_ENCODE_ID(DIO_ID_FBUFFER,DIO_ID2_TOPCAT)
12 * (or whatever); everybody else just uses DIO_ID_FOOBAR.
13 * unsigned long dio_scodetophysaddr(int scode)
14 * Return the physical address corresponding to the given select code.
15 * int dio_scodetoipl(int scode)
16 * Every DIO card has a fixed interrupt priority level. This function
17 * returns it, whatever it is.
18 * const char *dio_scodetoname(int scode)
19 * Return a character string describing this board [might be "" if
20 * not CONFIG_DIO_CONSTANTS]
21 * void dio_config_board(int scode) mark board as configured in the list
22 * void dio_unconfig_board(int scode) mark board as no longer configured
24 * This file is based on the way the Amiga port handles Zorro II cards,
25 * although we aren't so complicated...
27 #include <linux/module.h>
28 #include <linux/string.h>
29 #include <linux/types.h>
30 #include <linux/kernel.h>
31 #include <linux/init.h>
32 #include <linux/dio.h>
33 #include <linux/slab.h> /* kmalloc() */
34 #include <linux/uaccess.h>
35 #include <asm/io.h> /* readb() */
37 struct dio_bus dio_bus
= {
40 { .name
= "DIO mem", .start
= 0x00600000, .end
= 0x007fffff },
42 { .name
= "DIO-II mem", .start
= 0x01000000, .end
= 0x1fffffff }
47 /* not a real config option yet! */
48 #define CONFIG_DIO_CONSTANTS
50 #ifdef CONFIG_DIO_CONSTANTS
51 /* We associate each numeric ID with an appropriate descriptive string
52 * using a constant array of these structs.
53 * FIXME: we should be able to arrange to throw away most of the strings
54 * using the initdata stuff. Then we wouldn't need to worry about
55 * carrying them around...
56 * I think we do this by copying them into newly kmalloc()ed memory and
57 * marking the names[] array as .initdata ?
66 #define DIONAME(x) { DIO_ID_##x, DIO_DESC_##x }
67 #define DIOFBNAME(x) { DIO_ENCODE_ID( DIO_ID_FBUFFER, DIO_ID2_##x), DIO_DESC2_##x }
69 static struct dioname names
[] =
71 DIONAME(DCA0
), DIONAME(DCA0REM
), DIONAME(DCA1
), DIONAME(DCA1REM
),
72 DIONAME(DCM
), DIONAME(DCMREM
),
74 DIONAME(FHPIB
), DIONAME(NHPIB
),
75 DIONAME(SCSI0
), DIONAME(SCSI1
), DIONAME(SCSI2
), DIONAME(SCSI3
),
77 DIONAME(PARALLEL
), DIONAME(VME
), DIONAME(DCL
), DIONAME(DCLREM
),
78 DIONAME(MISC0
), DIONAME(MISC1
), DIONAME(MISC2
), DIONAME(MISC3
),
79 DIONAME(MISC4
), DIONAME(MISC5
), DIONAME(MISC6
), DIONAME(MISC7
),
80 DIONAME(MISC8
), DIONAME(MISC9
), DIONAME(MISC10
), DIONAME(MISC11
),
81 DIONAME(MISC12
), DIONAME(MISC13
),
82 DIOFBNAME(GATORBOX
), DIOFBNAME(TOPCAT
), DIOFBNAME(RENAISSANCE
),
83 DIOFBNAME(LRCATSEYE
), DIOFBNAME(HRCCATSEYE
), DIOFBNAME(HRMCATSEYE
),
84 DIOFBNAME(DAVINCI
), DIOFBNAME(XXXCATSEYE
), DIOFBNAME(HYPERION
),
85 DIOFBNAME(XGENESIS
), DIOFBNAME(TIGER
), DIOFBNAME(YGENESIS
)
91 static const char *unknowndioname
92 = "unknown DIO board -- please email <linux-m68k@lists.linux-m68k.org>!";
94 static const char *dio_getname(int id
)
96 /* return pointer to a constant string describing the board with given ID */
98 for (i
= 0; i
< ARRAY_SIZE(names
); i
++)
99 if (names
[i
].id
== id
)
100 return names
[i
].name
;
102 return unknowndioname
;
107 static char dio_no_name
[] = { 0 };
108 #define dio_getname(_id) (dio_no_name)
110 #endif /* CONFIG_DIO_CONSTANTS */
112 int __init
dio_find(int deviceid
)
114 /* Called to find a DIO device before the full bus scan has run.
115 * Only used by the console driver.
118 u_char prid
, secid
, i
;
120 for (scode
= 0; scode
< DIO_SCMAX
; scode
++) {
124 if (DIO_SCINHOLE(scode
))
127 pa
= dio_scodetophysaddr(scode
);
132 if (scode
< DIOII_SCBASE
)
133 va
= (void *)(pa
+ DIO_VIRADDRBASE
);
135 va
= ioremap(pa
, PAGE_SIZE
);
137 if (probe_kernel_read(&i
, (unsigned char *)va
+ DIO_IDOFF
, 1)) {
138 if (scode
>= DIOII_SCBASE
)
140 continue; /* no board present at that select code */
145 if (DIO_NEEDSSECID(prid
)) {
146 secid
= DIO_SECID(va
);
147 id
= DIO_ENCODE_ID(prid
, secid
);
151 if (id
== deviceid
) {
152 if (scode
>= DIOII_SCBASE
)
161 /* This is the function that scans the DIO space and works out what
162 * hardware is actually present.
164 static int __init
dio_init(void)
174 printk(KERN_INFO
"Scanning for DIO devices...\n");
176 /* Initialize the DIO bus */
177 INIT_LIST_HEAD(&dio_bus
.devices
);
178 dev_set_name(&dio_bus
.dev
, "dio");
179 error
= device_register(&dio_bus
.dev
);
181 pr_err("DIO: Error registering dio_bus\n");
185 /* Request all resources */
186 dio_bus
.num_resources
= (hp300_model
== HP_320
? 1 : 2);
187 for (i
= 0; i
< dio_bus
.num_resources
; i
++)
188 request_resource(&iomem_resource
, &dio_bus
.resources
[i
]);
190 /* Register all devices */
191 for (scode
= 0; scode
< DIO_SCMAX
; ++scode
)
193 u_char prid
, secid
= 0; /* primary, secondary ID bytes */
197 if (DIO_SCINHOLE(scode
))
200 pa
= dio_scodetophysaddr(scode
);
205 if (scode
< DIOII_SCBASE
)
206 va
= (void *)(pa
+ DIO_VIRADDRBASE
);
208 va
= ioremap(pa
, PAGE_SIZE
);
210 if (probe_kernel_read(&i
, (unsigned char *)va
+ DIO_IDOFF
, 1)) {
211 if (scode
>= DIOII_SCBASE
)
213 continue; /* no board present at that select code */
216 /* Found a board, allocate it an entry in the list */
217 dev
= kzalloc(sizeof(struct dio_dev
), GFP_KERNEL
);
222 dev
->dev
.parent
= &dio_bus
.dev
;
223 dev
->dev
.bus
= &dio_bus_type
;
225 dev
->resource
.start
= pa
;
226 dev
->resource
.end
= pa
+ DIO_SIZE(scode
, va
);
227 dev_set_name(&dev
->dev
, "%02x", scode
);
229 /* read the ID byte(s) and encode if necessary. */
232 if (DIO_NEEDSSECID(prid
)) {
233 secid
= DIO_SECID(va
);
234 dev
->id
= DIO_ENCODE_ID(prid
, secid
);
238 dev
->ipl
= DIO_IPL(va
);
239 strcpy(dev
->name
,dio_getname(dev
->id
));
240 printk(KERN_INFO
"select code %3d: ipl %d: ID %02X", dev
->scode
, dev
->ipl
, prid
);
241 if (DIO_NEEDSSECID(prid
))
242 printk(":%02X", secid
);
243 printk(": %s\n", dev
->name
);
245 if (scode
>= DIOII_SCBASE
)
247 error
= device_register(&dev
->dev
);
249 pr_err("DIO: Error registering device %s\n",
253 error
= dio_create_sysfs_dev_files(dev
);
255 dev_err(&dev
->dev
, "Error creating sysfs files\n");
260 subsys_initcall(dio_init
);
262 /* Bear in mind that this is called in the very early stages of initialisation
263 * in order to get the address of the serial port for the console...
265 unsigned long dio_scodetophysaddr(int scode
)
267 if (scode
>= DIOII_SCBASE
) {
268 return (DIOII_BASE
+ (scode
- 132) * DIOII_DEVSIZE
);
269 } else if (scode
> DIO_SCMAX
|| scode
< 0)
271 else if (DIO_SCINHOLE(scode
))
274 return (DIO_BASE
+ scode
* DIO_DEVSIZE
);