コード例 #1
0
ファイル: i2c-elektor.c プロジェクト: johnny/CobraDroidBeta
static int __devinit elektor_probe(struct device *dev, unsigned int id)
{
	init_waitqueue_head(&pcf_wait);
	if (pcf_isa_init())
		return -ENODEV;
	pcf_isa_ops.dev.parent = dev;
	if (i2c_pcf_add_bus(&pcf_isa_ops) < 0)
		goto fail;

	dev_info(dev, "found device at %#x\n", base);

	return 0;

 fail:
	if (irq > 0) {
		disable_irq(irq);
		free_irq(irq, NULL);
	}

	if (!mmapped) {
		ioport_unmap(base_iomem);
		release_region(base, 2);
	} else {
		iounmap(base_iomem);
		release_mem_region(base, 2);
	}
	return -ENODEV;
}
コード例 #2
0
ファイル: i2c-elektor.c プロジェクト: hugh712/Jollen
static int __init i2c_pcfisa_init(void)
{
#ifdef __alpha__
    /* check to see we have memory mapped PCF8584 connected to the
    Cypress cy82c693 PCI-ISA bridge as on UP2000 board */
    if ((base == 0) && pci_present()) {

        struct pci_dev *cy693_dev =
            pci_find_device(PCI_VENDOR_ID_CONTAQ,
                            PCI_DEVICE_ID_CONTAQ_82C693, NULL);

        if (cy693_dev) {
            char config;
            /* yeap, we've found cypress, let's check config */
            if (!pci_read_config_byte(cy693_dev, 0x47, &config)) {

                DEB3(printk("i2c-elektor.o: found cy82c693, config register 0x47 = 0x%02x.\n", config));

                /* UP2000 board has this register set to 0xe1,
                                   but the most significant bit as seems can be
                   reset during the proper initialisation
                                   sequence if guys from API decides to do that
                                   (so, we can even enable Tsunami Pchip
                                   window for the upper 1 Gb) */

                /* so just check for ROMCS at 0xe0000,
                                   ROMCS enabled for writes
                   and external XD Bus buffer in use. */
                if ((config & 0x7f) == 0x61) {
                    /* seems to be UP2000 like board */
                    base = 0xe0000;
                    /* I don't know why we need to
                       write twice */
                    mmapped = 2;
                    /* UP2000 drives ISA with
                    8.25 MHz (PCI/4) clock
                    			   (this can be read from cypress) */
                    clock = I2C_PCF_CLK | I2C_PCF_TRNS90;
                    printk("i2c-elektor.o: found API UP2000 like board, will probe PCF8584 later.\n");
                }
            }
        }
    }
#endif

    /* sanity checks for mmapped I/O */
    if (mmapped && base < 0xc8000) {
        printk("i2c-elektor.o: incorrect base address (0x%0X) specified for mmapped I/O.\n", base);
        return -ENODEV;
    }

    printk("i2c-elektor.o: i2c pcf8584-isa adapter module\n");

    if (base == 0) {
        base = DEFAULT_BASE;
    }

#if (LINUX_VERSION_CODE >= 0x020301)
    init_waitqueue_head(&pcf_wait);
#endif
    if (pcf_isa_init() == 0) {
        if (i2c_pcf_add_bus(&pcf_isa_ops) < 0)
            return -ENODEV;
    } else {
        return -ENODEV;
    }

    printk("i2c-elektor.o: found device at %#x.\n", base);

    return 0;
}