]> Git Repo - J-linux.git/blobdiff - drivers/cdx/controller/cdx_controller.c
Merge tag 'kbuild-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[J-linux.git] / drivers / cdx / controller / cdx_controller.c
index 85fe4b1c4e5ee54dbc0f2d432a9bdd24d8d6ab6a..112a1541de6d7ed68b74566c870ab5928b8a71a9 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/cdx/cdx_bus.h>
+#include <linux/irqdomain.h>
 
 #include "cdx_controller.h"
 #include "../cdx.h"
@@ -60,9 +61,19 @@ static int cdx_configure_device(struct cdx_controller *cdx,
                                u8 bus_num, u8 dev_num,
                                struct cdx_device_config *dev_config)
 {
+       u16 msi_index;
        int ret = 0;
+       u32 data;
+       u64 addr;
 
        switch (dev_config->type) {
+       case CDX_DEV_MSI_CONF:
+               msi_index = dev_config->msi.msi_index;
+               data = dev_config->msi.data;
+               addr = dev_config->msi.addr;
+
+               ret = cdx_mcdi_write_msi(cdx->priv, bus_num, dev_num, msi_index, addr, data);
+               break;
        case CDX_DEV_RESET_CONF:
                ret = cdx_mcdi_reset_device(cdx->priv, bus_num, dev_num);
                break;
@@ -70,6 +81,9 @@ static int cdx_configure_device(struct cdx_controller *cdx,
                ret = cdx_mcdi_bus_master_enable(cdx->priv, bus_num, dev_num,
                                                 dev_config->bus_master_enable);
                break;
+       case CDX_DEV_MSI_ENABLE:
+               ret = cdx_mcdi_msi_enable(cdx->priv, bus_num, dev_num, dev_config->msi_enable);
+               break;
        default:
                ret = -EINVAL;
        }
@@ -178,6 +192,14 @@ static int xlnx_cdx_probe(struct platform_device *pdev)
        cdx->priv = cdx_mcdi;
        cdx->ops = &cdx_ops;
 
+       /* Create MSI domain */
+       cdx->msi_domain = cdx_msi_domain_init(&pdev->dev);
+       if (!cdx->msi_domain) {
+               dev_err(&pdev->dev, "cdx_msi_domain_init() failed");
+               ret = -ENODEV;
+               goto cdx_msi_fail;
+       }
+
        ret = cdx_setup_rpmsg(pdev);
        if (ret) {
                if (ret != -EPROBE_DEFER)
@@ -189,6 +211,8 @@ static int xlnx_cdx_probe(struct platform_device *pdev)
        return 0;
 
 cdx_rpmsg_fail:
+       irq_domain_remove(cdx->msi_domain);
+cdx_msi_fail:
        kfree(cdx);
 cdx_alloc_fail:
        cdx_mcdi_finish(cdx_mcdi);
@@ -205,6 +229,7 @@ static int xlnx_cdx_remove(struct platform_device *pdev)
 
        cdx_destroy_rpmsg(pdev);
 
+       irq_domain_remove(cdx->msi_domain);
        kfree(cdx);
 
        cdx_mcdi_finish(cdx_mcdi);
This page took 0.028754 seconds and 4 git commands to generate.