diff options
author | Yinghai Lu <yinghai@kernel.org> | 2012-09-17 22:20:31 -0700 |
---|---|---|
committer | Yinghai Lu <yinghai@kernel.org> | 2012-09-17 22:20:31 -0700 |
commit | ea36ae81f8b9b4123a3f9f43d7e9efab1972030b (patch) | |
tree | ef9c27e4fdce15616f573ef8e27e2a616f7b4126 | |
parent | 34938b934f358cafddb1968a4f90ceef6e098a03 (diff) | |
download | linux-yinghai-ea36ae81f8b9b4123a3f9f43d7e9efab1972030b.tar.gz |
PCI: Add helpers for add addon_resource
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
-rw-r--r-- | drivers/pci/probe.c | 68 | ||||
-rw-r--r-- | include/linux/pci.h | 5 |
2 files changed, 73 insertions, 0 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 5bae8c636cf39..54ff6fd6854ea 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -144,6 +144,74 @@ int pci_dev_resource_idx(struct pci_dev *dev, struct resource *res) return -1; } +struct pci_dev_addon_resource *__add_pci_dev_addon_resource( + struct pci_dev *dev, int addr, char *name) +{ + struct pci_dev_addon_resource *addon_res; + + addon_res = kzalloc(sizeof(*addon_res), GFP_KERNEL); + + if (!addon_res) + return NULL; + + addon_res->reg_addr = addr; + + if (name) + addon_res->res.name = name; + else + addon_res->res.name = pci_name(dev); + + list_add_tail(&addon_res->list, &dev->addon_resources); + + return addon_res; +} + +struct pci_dev_addon_resource *add_pci_dev_addon_fixed_resource( + struct pci_dev *dev, int start, int size, int flags, + int addr, char *name) +{ + struct pci_dev_addon_resource *addon_res; + struct resource *res; + + addon_res = __add_pci_dev_addon_resource(dev, addr, name); + if (addon_res) + return NULL; + + res = &addon_res->res; + res->start = start; + res->end = start + size - 1; + res->flags = flags | IORESOURCE_PCI_FIXED; + + dev_printk(KERN_DEBUG, &dev->dev, + "addon fixed resource %s %pR added\n", res->name, res); + + return addon_res; +} + +struct pci_dev_addon_resource *add_pci_dev_addon_resource(struct pci_dev *dev, + int addr, int size, struct resource_ops *ops, char *name) +{ + struct pci_dev_addon_resource *addon_res; + struct resource *res; + + addon_res = __add_pci_dev_addon_resource(dev, addr, name); + if (!addon_res) + return NULL; + + res = &addon_res->res; + if (ops) { + addon_res->ops = ops; + addon_res->size = size; + ops->read(dev, res, addr); + } else + __pci_read_base(dev, pci_bar_unknown, res, addr); + + dev_printk(KERN_DEBUG, &dev->dev, + "addon resource %s %pR added\n", res->name, res); + + return addon_res; +} + static void pci_release_dev_addon_res(struct pci_dev *dev) { struct pci_dev_addon_resource *addon_res, *tmp; diff --git a/include/linux/pci.h b/include/linux/pci.h index 1940849ff7cca..1e28adb90ebaa 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -398,6 +398,11 @@ struct pci_dev_addon_resource { struct resource *pci_dev_resource_n(struct pci_dev *dev, int n); int pci_dev_resource_idx(struct pci_dev *dev, struct resource *res); +struct pci_dev_addon_resource *add_pci_dev_addon_fixed_resource( + struct pci_dev *dev, int start, int size, int flags, + int addr, char *name); +struct pci_dev_addon_resource *add_pci_dev_addon_resource(struct pci_dev *dev, + int addr, int size, struct resource_ops *ops, char *name); #define PCI_STD_RES (1<<0) #define PCI_ROM_RES (1<<1) |