PCI: endpoint: Create configfs entry for each pci_epf_device_id table entry

In order to be able to provide correct driver_data for pci_epf device,
a separate configfs entry for each pci_epf_device_id table entry in
pci_epf_driver is required.

Add support to create configfs entry for each pci_epf_device_id
table entry here.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Tested-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
This commit is contained in:
Kishon Vijay Abraham I 2018-04-02 18:59:35 +05:30 committed by Lorenzo Pieralisi
parent ecc57efe9d
commit ef1433f717
2 changed files with 23 additions and 4 deletions

View File

@ -15,6 +15,8 @@
#include <linux/pci-epf.h> #include <linux/pci-epf.h>
#include <linux/pci-ep-cfs.h> #include <linux/pci-ep-cfs.h>
static DEFINE_MUTEX(pci_epf_mutex);
static struct bus_type pci_epf_bus_type; static struct bus_type pci_epf_bus_type;
static const struct device_type pci_epf_type; static const struct device_type pci_epf_type;
@ -143,7 +145,13 @@ EXPORT_SYMBOL_GPL(pci_epf_alloc_space);
*/ */
void pci_epf_unregister_driver(struct pci_epf_driver *driver) void pci_epf_unregister_driver(struct pci_epf_driver *driver)
{ {
pci_ep_cfs_remove_epf_group(driver->group); struct config_group *group;
mutex_lock(&pci_epf_mutex);
list_for_each_entry(group, &driver->epf_group, group_entry)
pci_ep_cfs_remove_epf_group(group);
list_del(&driver->epf_group);
mutex_unlock(&pci_epf_mutex);
driver_unregister(&driver->driver); driver_unregister(&driver->driver);
} }
EXPORT_SYMBOL_GPL(pci_epf_unregister_driver); EXPORT_SYMBOL_GPL(pci_epf_unregister_driver);
@ -159,6 +167,8 @@ int __pci_epf_register_driver(struct pci_epf_driver *driver,
struct module *owner) struct module *owner)
{ {
int ret; int ret;
struct config_group *group;
const struct pci_epf_device_id *id;
if (!driver->ops) if (!driver->ops)
return -EINVAL; return -EINVAL;
@ -173,7 +183,16 @@ int __pci_epf_register_driver(struct pci_epf_driver *driver,
if (ret) if (ret)
return ret; return ret;
driver->group = pci_ep_cfs_add_epf_group(driver->driver.name); INIT_LIST_HEAD(&driver->epf_group);
id = driver->id_table;
while (id->name[0]) {
group = pci_ep_cfs_add_epf_group(id->name);
mutex_lock(&pci_epf_mutex);
list_add_tail(&group->group_entry, &driver->epf_group);
mutex_unlock(&pci_epf_mutex);
id++;
}
return 0; return 0;
} }

View File

@ -72,7 +72,7 @@ struct pci_epf_ops {
* @driver: PCI EPF driver * @driver: PCI EPF driver
* @ops: set of function pointers for performing EPF operations * @ops: set of function pointers for performing EPF operations
* @owner: the owner of the module that registers the PCI EPF driver * @owner: the owner of the module that registers the PCI EPF driver
* @group: configfs group corresponding to the PCI EPF driver * @epf_group: list of configfs group corresponding to the PCI EPF driver
* @id_table: identifies EPF devices for probing * @id_table: identifies EPF devices for probing
*/ */
struct pci_epf_driver { struct pci_epf_driver {
@ -82,7 +82,7 @@ struct pci_epf_driver {
struct device_driver driver; struct device_driver driver;
struct pci_epf_ops *ops; struct pci_epf_ops *ops;
struct module *owner; struct module *owner;
struct config_group *group; struct list_head epf_group;
const struct pci_epf_device_id *id_table; const struct pci_epf_device_id *id_table;
}; };