in dio.c [166:261]
static int __init dio_init(void)
{
int scode;
int i;
struct dio_dev *dev;
int error;
if (!MACH_IS_HP300)
return 0;
printk(KERN_INFO "Scanning for DIO devices...\n");
/* Initialize the DIO bus */
INIT_LIST_HEAD(&dio_bus.devices);
dev_set_name(&dio_bus.dev, "dio");
error = device_register(&dio_bus.dev);
if (error) {
pr_err("DIO: Error registering dio_bus\n");
return error;
}
/* Request all resources */
dio_bus.num_resources = (hp300_model == HP_320 ? 1 : 2);
for (i = 0; i < dio_bus.num_resources; i++)
request_resource(&iomem_resource, &dio_bus.resources[i]);
/* Register all devices */
for (scode = 0; scode < DIO_SCMAX; ++scode)
{
u_char prid, secid = 0; /* primary, secondary ID bytes */
u_char *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 */
}
/* Found a board, allocate it an entry in the list */
dev = kzalloc(sizeof(struct dio_dev), GFP_KERNEL);
if (!dev)
return -ENOMEM;
dev->bus = &dio_bus;
dev->dev.parent = &dio_bus.dev;
dev->dev.bus = &dio_bus_type;
dev->scode = scode;
dev->resource.start = pa;
dev->resource.end = pa + DIO_SIZE(scode, va);
dev_set_name(&dev->dev, "%02x", scode);
/* read the ID byte(s) and encode if necessary. */
prid = DIO_ID(va);
if (DIO_NEEDSSECID(prid)) {
secid = DIO_SECID(va);
dev->id = DIO_ENCODE_ID(prid, secid);
} else
dev->id = prid;
dev->ipl = DIO_IPL(va);
strcpy(dev->name,dio_getname(dev->id));
printk(KERN_INFO "select code %3d: ipl %d: ID %02X", dev->scode, dev->ipl, prid);
if (DIO_NEEDSSECID(prid))
printk(":%02X", secid);
printk(": %s\n", dev->name);
if (scode >= DIOII_SCBASE)
iounmap(va);
error = device_register(&dev->dev);
if (error) {
pr_err("DIO: Error registering device %s\n",
dev->name);
continue;
}
error = dio_create_sysfs_dev_files(dev);
if (error)
dev_err(&dev->dev, "Error creating sysfs files\n");
}
return 0;
}