in dio.c [113:161]
int __init dio_find(int deviceid)
{
/* Called to find a DIO device before the full bus scan has run.
* Only used by the console driver.
*/
int scode, id;
u_char prid, secid, i;
for (scode = 0; scode < DIO_SCMAX; scode++) {
void *va;
unsigned long pa;
if (DIO_SCINHOLE(scode))
continue;
pa = dio_scodetophysaddr(scode);
if (!pa)
continue;
if (scode < DIOII_SCBASE)
va = (void *)(pa + DIO_VIRADDRBASE);
else
va = ioremap(pa, PAGE_SIZE);
if (copy_from_kernel_nofault(&i,
(unsigned char *)va + DIO_IDOFF, 1)) {
if (scode >= DIOII_SCBASE)
iounmap(va);
continue; /* no board present at that select code */
}
prid = DIO_ID(va);
if (DIO_NEEDSSECID(prid)) {
secid = DIO_SECID(va);
id = DIO_ENCODE_ID(prid, secid);
} else
id = prid;
if (id == deviceid) {
if (scode >= DIOII_SCBASE)
iounmap(va);
return scode;
}
}
return -1;
}