예제 #1
0
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;
}
예제 #2
0
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;
}