]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/staging/fsl-mc/bus/fsl-mc-bus.c
Revert "staging: fsl-mc: move mc-cmd.h contents in the public header"
[karo-tx-linux.git] / drivers / staging / fsl-mc / bus / fsl-mc-bus.c
index 3be5f25ff11306eca0a8e8a6afd014e7bb2128f0..166604e22952f18e05bf900a77d59a67977f2661 100644 (file)
 #include <linux/bitops.h>
 #include <linux/msi.h>
 #include <linux/dma-mapping.h>
-#include "../include/mc-bus.h"
-#include "../include/dpmng.h"
-#include "../include/mc-sys.h"
+#include "../include/mc-cmd.h"
 
 #include "fsl-mc-private.h"
 #include "dprc-cmd.h"
+#include "dpmng-cmd.h"
 
 /**
  * Default DMA mask for devices on a fsl-mc bus
@@ -60,6 +59,20 @@ struct fsl_mc_addr_translation_range {
        phys_addr_t start_phys_addr;
 };
 
+/**
+ * struct mc_version
+ * @major: Major version number: incremented on API compatibility changes
+ * @minor: Minor version number: incremented on API additions (that are
+ *             backward compatible); reset when major version is incremented
+ * @revision: Internal revision number: incremented on implementation changes
+ *             and/or bug fixes that have no impact on API
+ */
+struct mc_version {
+       u32 major;
+       u32 minor;
+       u32 revision;
+};
+
 /**
  * fsl_mc_bus_match - device to driver matching callback
  * @dev: the fsl-mc device to match against
@@ -82,7 +95,7 @@ static int fsl_mc_bus_match(struct device *dev, struct device_driver *drv)
         * If the object is not 'plugged' don't match.
         * Only exception is the root DPRC, which is a special case.
         */
-       if ((mc_dev->obj_desc.state & DPRC_OBJ_STATE_PLUGGED) == 0 &&
+       if ((mc_dev->obj_desc.state & FSL_MC_OBJ_STATE_PLUGGED) == 0 &&
            !fsl_mc_is_root_dprc(&mc_dev->dev))
                goto out;
 
@@ -238,11 +251,47 @@ void fsl_mc_driver_unregister(struct fsl_mc_driver *mc_driver)
 }
 EXPORT_SYMBOL_GPL(fsl_mc_driver_unregister);
 
+/**
+ * mc_get_version() - Retrieves the Management Complex firmware
+ *                     version information
+ * @mc_io:             Pointer to opaque I/O object
+ * @cmd_flags:         Command flags; one or more of 'MC_CMD_FLAG_'
+ * @mc_ver_info:       Returned version information structure
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+static int mc_get_version(struct fsl_mc_io *mc_io,
+                         u32 cmd_flags,
+                         struct mc_version *mc_ver_info)
+{
+       struct mc_command cmd = { 0 };
+       struct dpmng_rsp_get_version *rsp_params;
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMNG_CMDID_GET_VERSION,
+                                         cmd_flags,
+                                         0);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       rsp_params = (struct dpmng_rsp_get_version *)cmd.params;
+       mc_ver_info->revision = le32_to_cpu(rsp_params->revision);
+       mc_ver_info->major = le32_to_cpu(rsp_params->version_major);
+       mc_ver_info->minor = le32_to_cpu(rsp_params->version_minor);
+
+       return 0;
+}
+
 /**
  * fsl_mc_get_root_dprc - function to traverse to the root dprc
  */
-void fsl_mc_get_root_dprc(struct device *dev,
-                         struct device **root_dprc_dev)
+static void fsl_mc_get_root_dprc(struct device *dev,
+                                struct device **root_dprc_dev)
 {
        if (WARN_ON(!dev)) {
                *root_dprc_dev = NULL;
@@ -254,7 +303,6 @@ void fsl_mc_get_root_dprc(struct device *dev,
                        *root_dprc_dev = (*root_dprc_dev)->parent;
        }
 }
-EXPORT_SYMBOL_GPL(fsl_mc_get_root_dprc);
 
 static int get_dprc_attr(struct fsl_mc_io *mc_io,
                         int container_id, struct dprc_attributes *attr)
@@ -339,7 +387,7 @@ static int fsl_mc_device_get_mmio_regions(struct fsl_mc_device *mc_dev,
        int i;
        int error;
        struct resource *regions;
-       struct dprc_obj_desc *obj_desc = &mc_dev->obj_desc;
+       struct fsl_mc_obj_desc *obj_desc = &mc_dev->obj_desc;
        struct device *parent_dev = mc_dev->dev.parent;
        enum dprc_region_type mc_region_type;
 
@@ -420,15 +468,11 @@ bool fsl_mc_is_root_dprc(struct device *dev)
 static void fsl_mc_device_release(struct device *dev)
 {
        struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
-       struct fsl_mc_bus *mc_bus = NULL;
 
        kfree(mc_dev->regions);
 
        if (strcmp(mc_dev->obj_desc.type, "dprc") == 0)
-               mc_bus = to_fsl_mc_bus(mc_dev);
-
-       if (mc_bus)
-               kfree(mc_bus);
+               kfree(to_fsl_mc_bus(mc_dev));
        else
                kfree(mc_dev);
 }
@@ -436,7 +480,7 @@ static void fsl_mc_device_release(struct device *dev)
 /**
  * Add a newly discovered fsl-mc device to be visible in Linux
  */
-int fsl_mc_device_add(struct dprc_obj_desc *obj_desc,
+int fsl_mc_device_add(struct fsl_mc_obj_desc *obj_desc,
                      struct fsl_mc_io *mc_io,
                      struct device *parent_dev,
                      struct fsl_mc_device **new_mc_dev)
@@ -538,7 +582,7 @@ int fsl_mc_device_add(struct dprc_obj_desc *obj_desc,
        }
 
        /* Objects are coherent, unless 'no shareability' flag set. */
-       if (!(obj_desc->flags & DPRC_OBJ_FLAG_NO_MEM_SHAREABILITY))
+       if (!(obj_desc->flags & FSL_MC_OBJ_FLAG_NO_MEM_SHAREABILITY))
                arch_setup_dma_ops(&mc_dev->dev, 0, 0, NULL, true);
 
        /*
@@ -559,10 +603,8 @@ int fsl_mc_device_add(struct dprc_obj_desc *obj_desc,
 
 error_cleanup_dev:
        kfree(mc_dev->regions);
-       if (mc_bus)
-               kfree(mc_bus);
-       else
-               kfree(mc_dev);
+       kfree(mc_bus);
+       kfree(mc_dev);
 
        return error;
 }
@@ -644,10 +686,10 @@ static int get_mc_addr_translation_ranges(struct device *dev,
        const __be32 *cell;
 
        ret = parse_mc_ranges(dev,
-                               &paddr_cells,
-                               &mc_addr_cells,
-                               &mc_size_cells,
-                               &ranges_start);
+                             &paddr_cells,
+                             &mc_addr_cells,
+                             &mc_size_cells,
+                             &ranges_start);
        if (ret < 0)
                return ret;
 
@@ -693,7 +735,7 @@ static int get_mc_addr_translation_ranges(struct device *dev,
  */
 static int fsl_mc_bus_probe(struct platform_device *pdev)
 {
-       struct dprc_obj_desc obj_desc;
+       struct fsl_mc_obj_desc obj_desc;
        int error;
        struct fsl_mc *mc;
        struct fsl_mc_device *mc_bus_dev = NULL;
@@ -752,7 +794,7 @@ static int fsl_mc_bus_probe(struct platform_device *pdev)
                goto error_cleanup_mc_io;
        }
 
-       memset(&obj_desc, 0, sizeof(struct dprc_obj_desc));
+       memset(&obj_desc, 0, sizeof(struct fsl_mc_obj_desc));
        error = dprc_get_api_version(mc_io, 0,
                                     &obj_desc.ver_major,
                                     &obj_desc.ver_minor);