static int __init init_i82365()

in i82365.c [1241:1315]


static int __init init_i82365(void)
{
    int i, ret;

    ret = platform_driver_register(&i82365_driver);
    if (ret)
	goto err_out;

    i82365_device = platform_device_alloc("i82365", 0);
    if (i82365_device) {
	    ret = platform_device_add(i82365_device);
	    if (ret)
		    platform_device_put(i82365_device);
    } else
	    ret = -ENOMEM;

    if (ret)
	goto err_driver_unregister;

    printk(KERN_INFO "Intel ISA PCIC probe: ");
    sockets = 0;

    isa_probe();

    if (sockets == 0) {
	printk("not found.\n");
	ret = -ENODEV;
	goto err_dev_unregister;
    }

    /* Set up interrupt handler(s) */
    if (grab_irq != 0)
	ret = request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt);

    if (ret)
	goto err_socket_release;

    /* register sockets with the pcmcia core */
    for (i = 0; i < sockets; i++) {
	    socket[i].socket.dev.parent = &i82365_device->dev;
	    socket[i].socket.ops = &pcic_operations;
	    socket[i].socket.resource_ops = &pccard_nonstatic_ops;
	    socket[i].socket.owner = THIS_MODULE;
	    socket[i].number = i;
	    ret = pcmcia_register_socket(&socket[i].socket);
	    if (!ret)
		    socket[i].flags |= IS_REGISTERED;
    }

    /* Finally, schedule a polling interrupt */
    if (poll_interval != 0) {
	timer_setup(&poll_timer, pcic_interrupt_wrapper, 0);
    	poll_timer.expires = jiffies + poll_interval;
	add_timer(&poll_timer);
    }
    
    return 0;
err_socket_release:
    for (i = 0; i < sockets; i++) {
	/* Turn off all interrupt sources! */
	i365_set(i, I365_CSCINT, 0);
	release_region(socket[i].ioaddr, 2);
    }
err_dev_unregister:
    platform_device_unregister(i82365_device);
    release_region(i365_base, 2);
#ifdef CONFIG_PNP
    if (i82365_pnpdev)
	pnp_disable_dev(i82365_pnpdev);
#endif
err_driver_unregister:
    platform_driver_unregister(&i82365_driver);
err_out:
    return ret;
} /* init_i82365 */