static int __devinit pca_isa_probe(struct device *dev, unsigned int id) { init_waitqueue_head(&pca_wait); dev_info(dev, "i/o base %#08lx. irq %d\n", base, irq); #ifdef CONFIG_PPC if (check_legacy_ioport(base)) { dev_err(dev, "I/O address %#08lx is not available\n", base); goto out; } #endif if (!request_region(base, IO_SIZE, "i2c-pca-isa")) { dev_err(dev, "I/O address %#08lx is in use\n", base); goto out; } if (irq > -1) { if (request_irq(irq, pca_handler, 0, "i2c-pca-isa", &pca_isa_ops) < 0) { dev_err(dev, "Request irq%d failed\n", irq); goto out_region; } } pca_isa_data.i2c_clock = clock; if (i2c_pca_add_bus(&pca_isa_ops) < 0) { dev_err(dev, "Failed to add i2c bus\n"); goto out_irq; } return 0; out_irq: if (irq > -1) free_irq(irq, &pca_isa_ops); out_region: release_region(base, IO_SIZE); out: return -ENODEV; }
static int __devinit tegra_gmi_pca_probe(struct platform_device *pdev) { int err = 0, err_gpio = 0; int err_int = 0; struct tegra_nor_chip_parms *plat = pdev->dev.platform_data; struct cs_info *csinfo = &plat->csinfo; struct gpio_state *state = &csinfo->gpio_cs; struct device *dev = &pdev->dev; struct resource *res; if (!plat) { pr_err("%s: no platform device info\n", __func__); err = -EINVAL; goto fail; } info = devm_kzalloc(dev, sizeof(struct tegra_gmi_pca_info), GFP_KERNEL); if (!info) { err = -ENOMEM; goto fail; } info->base = ((void __iomem *)IO_APB_VIRT + (TEGRA_SNOR_BASE - IO_APB_PHYS)); info->plat = plat; info->dev = dev; /* Intialise the SNOR controller before probe */ err = tegra_gmi_controller_init(info); if (err) { dev_err(dev, "Error initializing controller\n"); goto fail; } platform_set_drvdata(pdev, info); init_waitqueue_head(&pca_wait); err_gpio = gpio_request(state[0].gpio_num, state[0].label); gpio_direction_output(state[0].gpio_num, 0); res = platform_get_resource(pdev, IORESOURCE_IO, 0); if (!res) { dev_err(dev, "GPIO %d can't be used as interrupt\n", res->start); return -ENODEV; } err_int = gpio_request(res->start, NULL); gpio_direction_output(res->start, 0); irq = gpio_to_irq(res->start); info->gpio_num = res->start; if (irq <= 0) { printk(KERN_ALERT "GPIO %d can't be used as interrupt" , res->start); goto fail; } if (irq > -1) { if (request_irq(irq, pca_handler, IRQF_TRIGGER_FALLING, "i2c-pca-gmi", &pca_gmi_ops) < 0) { dev_err(dev, "Request irq%d failed\n", irq); goto fail; } } #ifdef CONFIG_TEGRA_GMI_ACCESS_CONTROL info->gmiFmLockHandle = register_gmi_device("gmi-i2c-pca", 0); #endif pca_gmi_data.i2c_clock = clock; pca_gmi_request_access(NULL); if (i2c_pca_add_bus(&pca_gmi_ops) < 0) { pca_gmi_release_access(NULL); dev_err(dev, "Failed to add i2c bus\n"); goto out_irq; } pca_gmi_release_access(NULL); return 0; out_irq: if (irq > -1) free_irq(irq, &pca_gmi_ops); fail: pr_err("Tegra GMI PCA probe failed\n"); return err; }