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; }
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; }