|
@@ -17,6 +17,7 @@
|
|
|
|
|
|
struct priv {
|
|
struct priv {
|
|
struct mcb_bus *bus;
|
|
struct mcb_bus *bus;
|
|
|
|
+ phys_addr_t mapbase;
|
|
void __iomem *base;
|
|
void __iomem *base;
|
|
};
|
|
};
|
|
|
|
|
|
@@ -31,8 +32,8 @@ static int mcb_pci_get_irq(struct mcb_device *mdev)
|
|
|
|
|
|
static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
{
|
|
{
|
|
|
|
+ struct resource *res;
|
|
struct priv *priv;
|
|
struct priv *priv;
|
|
- phys_addr_t mapbase;
|
|
|
|
int ret;
|
|
int ret;
|
|
int num_cells;
|
|
int num_cells;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
@@ -47,19 +48,21 @@ static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
}
|
|
}
|
|
|
|
|
|
- mapbase = pci_resource_start(pdev, 0);
|
|
|
|
- if (!mapbase) {
|
|
|
|
|
|
+ priv->mapbase = pci_resource_start(pdev, 0);
|
|
|
|
+ if (!priv->mapbase) {
|
|
dev_err(&pdev->dev, "No PCI resource\n");
|
|
dev_err(&pdev->dev, "No PCI resource\n");
|
|
goto err_start;
|
|
goto err_start;
|
|
}
|
|
}
|
|
|
|
|
|
- ret = pci_request_region(pdev, 0, KBUILD_MODNAME);
|
|
|
|
- if (ret) {
|
|
|
|
- dev_err(&pdev->dev, "Failed to request PCI BARs\n");
|
|
|
|
|
|
+ res = request_mem_region(priv->mapbase, CHAM_HEADER_SIZE,
|
|
|
|
+ KBUILD_MODNAME);
|
|
|
|
+ if (IS_ERR(res)) {
|
|
|
|
+ dev_err(&pdev->dev, "Failed to request PCI memory\n");
|
|
|
|
+ ret = PTR_ERR(res);
|
|
goto err_start;
|
|
goto err_start;
|
|
}
|
|
}
|
|
|
|
|
|
- priv->base = pci_iomap(pdev, 0, 0);
|
|
|
|
|
|
+ priv->base = ioremap(priv->mapbase, CHAM_HEADER_SIZE);
|
|
if (!priv->base) {
|
|
if (!priv->base) {
|
|
dev_err(&pdev->dev, "Cannot ioremap\n");
|
|
dev_err(&pdev->dev, "Cannot ioremap\n");
|
|
ret = -ENOMEM;
|
|
ret = -ENOMEM;
|
|
@@ -84,7 +87,7 @@ static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
|
|
|
priv->bus->get_irq = mcb_pci_get_irq;
|
|
priv->bus->get_irq = mcb_pci_get_irq;
|
|
|
|
|
|
- ret = chameleon_parse_cells(priv->bus, mapbase, priv->base);
|
|
|
|
|
|
+ ret = chameleon_parse_cells(priv->bus, priv->mapbase, priv->base);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
goto err_drvdata;
|
|
goto err_drvdata;
|
|
num_cells = ret;
|
|
num_cells = ret;
|
|
@@ -93,8 +96,10 @@ static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
|
|
|
mcb_bus_add_devices(priv->bus);
|
|
mcb_bus_add_devices(priv->bus);
|
|
|
|
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
err_drvdata:
|
|
err_drvdata:
|
|
- pci_iounmap(pdev, priv->base);
|
|
|
|
|
|
+ iounmap(priv->base);
|
|
err_ioremap:
|
|
err_ioremap:
|
|
pci_release_region(pdev, 0);
|
|
pci_release_region(pdev, 0);
|
|
err_start:
|
|
err_start:
|
|
@@ -107,6 +112,10 @@ static void mcb_pci_remove(struct pci_dev *pdev)
|
|
struct priv *priv = pci_get_drvdata(pdev);
|
|
struct priv *priv = pci_get_drvdata(pdev);
|
|
|
|
|
|
mcb_release_bus(priv->bus);
|
|
mcb_release_bus(priv->bus);
|
|
|
|
+
|
|
|
|
+ iounmap(priv->base);
|
|
|
|
+ release_region(priv->mapbase, CHAM_HEADER_SIZE);
|
|
|
|
+ pci_disable_device(pdev);
|
|
}
|
|
}
|
|
|
|
|
|
static const struct pci_device_id mcb_pci_tbl[] = {
|
|
static const struct pci_device_id mcb_pci_tbl[] = {
|