diff options
Diffstat (limited to 'drivers/cdx/cdx.c')
| -rw-r--r-- | drivers/cdx/cdx.c | 20 | 
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/cdx/cdx.c b/drivers/cdx/cdx.c index b74d76afccb6..236d381dc5f7 100644 --- a/drivers/cdx/cdx.c +++ b/drivers/cdx/cdx.c @@ -56,6 +56,7 @@   */  #include <linux/init.h> +#include <linux/irqdomain.h>  #include <linux/kernel.h>  #include <linux/of.h>  #include <linux/of_device.h> @@ -302,8 +303,19 @@ static int cdx_probe(struct device *dev)  {  	struct cdx_driver *cdx_drv = to_cdx_driver(dev->driver);  	struct cdx_device *cdx_dev = to_cdx_device(dev); +	struct cdx_controller *cdx = cdx_dev->cdx;  	int error; +	/* +	 * Setup MSI device data so that generic MSI alloc/free can +	 * be used by the device driver. +	 */ +	if (cdx->msi_domain) { +		error = msi_setup_device_data(&cdx_dev->dev); +		if (error) +			return error; +	} +  	error = cdx_drv->probe(cdx_dev);  	if (error) {  		dev_err_probe(dev, error, "%s failed\n", __func__); @@ -787,6 +799,7 @@ int cdx_device_add(struct cdx_dev_params *dev_params)  	/* Populate CDX dev params */  	cdx_dev->req_id = dev_params->req_id; +	cdx_dev->msi_dev_id = dev_params->msi_dev_id;  	cdx_dev->vendor = dev_params->vendor;  	cdx_dev->device = dev_params->device;  	cdx_dev->subsystem_vendor = dev_params->subsys_vendor; @@ -804,12 +817,19 @@ int cdx_device_add(struct cdx_dev_params *dev_params)  	cdx_dev->dev.bus = &cdx_bus_type;  	cdx_dev->dev.dma_mask = &cdx_dev->dma_mask;  	cdx_dev->dev.release = cdx_device_release; +	cdx_dev->msi_write_pending = false; +	mutex_init(&cdx_dev->irqchip_lock);  	/* Set Name */  	dev_set_name(&cdx_dev->dev, "cdx-%02x:%02x",  		     ((cdx->id << CDX_CONTROLLER_ID_SHIFT) | (cdx_dev->bus_num & CDX_BUS_NUM_MASK)),  		     cdx_dev->dev_num); +	if (cdx->msi_domain) { +		cdx_dev->num_msi = dev_params->num_msi; +		dev_set_msi_domain(&cdx_dev->dev, cdx->msi_domain); +	} +  	ret = device_add(&cdx_dev->dev);  	if (ret) {  		dev_err(&cdx_dev->dev,  | 
