Пример #1
0
static int tvme200_probe(struct device *dev, unsigned int ndev)
{
	struct tvme200_board *tvme200 = &carrier_boards[ndev];
	int i;
	int res = 0;

	tvme200->info = (struct tvme200_infos*) kzalloc(sizeof(struct tvme200_infos), GFP_KERNEL);
	if (tvme200->info == NULL) {
		dev_err(dev, "Carrier [%s %d] unable to allocate memory for new carrier !\n",
				TVME200_SHORTNAME,
				ndev);
		res = -ENOMEM;
		goto out_err;
	}

	tvme200->info->dev = dev;

	res = tvme200_install(tvme200, ndev);
	if (res) {
		dev_err(dev, "Error during carrier install !\n");
		goto out_free;
	}

	/* Register the carrier in the industry pack bus driver */
	tvme200->info->ipack_bus = ipack_bus_register(dev,
                                              TVME200_NB_SLOT,
                                              &tvme200_bus_ops);
	if (!tvme200->info->ipack_bus) {
        	dev_err(dev, "error registering the carrier on ipack driver\n");
        	res = -EFAULT;
	        goto out_free;
	}

	dev_set_drvdata(dev, tvme200);

	for (i = 0; i < TVME200_NB_SLOT; i++)
        	tvme200_create_mezz_device(tvme200, i);

	return 0;

out_free :
	tvme200_uninstall(tvme200);
	kfree(tvme200->info);
out_err :
	return res;
}
Пример #2
0
static int tpci200_pci_probe(struct pci_dev *pdev,
                             const struct pci_device_id *id)
{
    int ret, i;
    struct tpci200_board *tpci200;
    u32 reg32;

    tpci200 = kzalloc(sizeof(struct tpci200_board), GFP_KERNEL);
    if (!tpci200)
        return -ENOMEM;

    tpci200->info = kzalloc(sizeof(struct tpci200_infos), GFP_KERNEL);
    if (!tpci200->info) {
        ret = -ENOMEM;
        goto out_err_info;
    }

    pci_dev_get(pdev);

    /* Obtain a mapping of the carrier's PCI configuration registers */
    ret = pci_request_region(pdev, TPCI200_CFG_MEM_BAR,
                             KBUILD_MODNAME " Configuration Memory");
    if (ret) {
        dev_err(&pdev->dev, "Failed to allocate PCI Configuration Memory");
        ret = -EBUSY;
        goto out_err_pci_request;
    }
    tpci200->info->cfg_regs = ioremap_nocache(
                                  pci_resource_start(pdev, TPCI200_CFG_MEM_BAR),
                                  pci_resource_len(pdev, TPCI200_CFG_MEM_BAR));
    if (!tpci200->info->cfg_regs) {
        dev_err(&pdev->dev, "Failed to map PCI Configuration Memory");
        ret = -EFAULT;
        goto out_err_ioremap;
    }

    /* Disable byte swapping for 16 bit IP module access. This will ensure
     * that the Industrypack big endian byte order is preserved by the
     * carrier. */
    reg32 = ioread32(tpci200->info->cfg_regs + LAS1_DESC);
    reg32 |= 1 << LAS_BIT_BIGENDIAN;
    iowrite32(reg32, tpci200->info->cfg_regs + LAS1_DESC);

    reg32 = ioread32(tpci200->info->cfg_regs + LAS2_DESC);
    reg32 |= 1 << LAS_BIT_BIGENDIAN;
    iowrite32(reg32, tpci200->info->cfg_regs + LAS2_DESC);

    /* Save struct pci_dev pointer */
    tpci200->info->pdev = pdev;
    tpci200->info->id_table = (struct pci_device_id *)id;

    /* register the device and initialize it */
    ret = tpci200_install(tpci200);
    if (ret) {
        dev_err(&pdev->dev, "error during tpci200 install\n");
        ret = -ENODEV;
        goto out_err_install;
    }

    /* Register the carrier in the industry pack bus driver */
    tpci200->info->ipack_bus = ipack_bus_register(&pdev->dev,
                               TPCI200_NB_SLOT,
                               &tpci200_bus_ops);
    if (!tpci200->info->ipack_bus) {
        dev_err(&pdev->dev,
                "error registering the carrier on ipack driver\n");
        ret = -EFAULT;
        goto out_err_bus_register;
    }

    /* save the bus number given by ipack to logging purpose */
    tpci200->number = tpci200->info->ipack_bus->bus_nr;
    dev_set_drvdata(&pdev->dev, tpci200);

    for (i = 0; i < TPCI200_NB_SLOT; i++)
        tpci200_create_device(tpci200, i);
    return 0;

out_err_bus_register:
    tpci200_uninstall(tpci200);
out_err_install:
    iounmap(tpci200->info->cfg_regs);
out_err_ioremap:
    pci_release_region(pdev, TPCI200_CFG_MEM_BAR);
out_err_pci_request:
    pci_dev_put(pdev);
    kfree(tpci200->info);
out_err_info:
    kfree(tpci200);
    return ret;
}