Most users access the ti_sci interface by ti,sci phandles in their
device nodes. The code setting up the images on the A53 cores doesn't
have a device node though, so add a function for accessing the ti_sci
without having a phandle.

Signed-off-by: Sascha Hauer <s.ha...@pengutronix.de>
---
 drivers/firmware/ti_sci.c        | 59 ++++++++++++++--------------------------
 include/soc/ti/ti_sci_protocol.h |  7 -----
 2 files changed, 21 insertions(+), 45 deletions(-)

diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
index 27cd46b70f..638893a1ed 100644
--- a/drivers/firmware/ti_sci.c
+++ b/drivers/firmware/ti_sci.c
@@ -281,7 +281,7 @@ static int ti_sci_do_xfer(struct ti_sci_info *info,
  *
  * Return: 0 if all went fine, else return appropriate error.
  */
-static int ti_sci_cmd_get_revision(struct ti_sci_handle *handle)
+static __maybe_unused int ti_sci_cmd_get_revision(struct ti_sci_handle *handle)
 {
        struct ti_sci_msg_resp_version *rev_info;
        struct ti_sci_version_info *ver;
@@ -2654,29 +2654,20 @@ static void ti_sci_setup_ops(struct ti_sci_info *info)
        fwl_ops->change_fwl_owner = ti_sci_cmd_change_fwl_owner;
 }
 
-/**
- * ti_sci_get_handle_from_sysfw() - Get the TI SCI handle of the SYSFW
- * @dev:       Pointer to the SYSFW device
- *
- * Return: pointer to handle if successful, else EINVAL if invalid conditions
- *         are encountered.
- */
-const
-struct ti_sci_handle *ti_sci_get_handle_from_sysfw(struct device *sci_dev)
+static struct ti_sci_handle *ti_sci_get_by_node(struct device_node *np)
 {
-       struct ti_sci_info *info;
-       int ret;
+       struct ti_sci_info *entry, *info = NULL;
 
-       if (!sci_dev)
-               return ERR_PTR(-EINVAL);
+       of_device_ensure_probed(np);
 
-       info = dev_get_priv(sci_dev);
-       if (!info)
-               return ERR_PTR(-EINVAL);
+       list_for_each_entry(entry, &ti_sci_list, list)
+               if (dev_of_node(entry->dev) == np) {
+                       info = entry;
+                       break;
+               }
 
-       ret = ti_sci_cmd_get_revision(&info->handle);
-       if (ret)
-               return ERR_PTR(-EINVAL);
+       if (!info)
+               return ERR_PTR(-ENODEV);
 
        return &info->handle;
 }
@@ -2690,14 +2681,17 @@ struct ti_sci_handle 
*ti_sci_get_handle_from_sysfw(struct device *sci_dev)
  */
 const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
 {
-       struct device *sci_dev;
-
-       if (!dev)
-               return ERR_PTR(-EINVAL);
+       struct device_node *np;
 
-       sci_dev = dev->parent;
+       if (dev) {
+               np = dev->parent->of_node;
+       } else {
+               np = of_find_compatible_node(NULL, NULL, "ti,k2g-sci");
+               if (!np)
+                       return ERR_PTR(-ENODEV);
+       }
 
-       return ti_sci_get_handle_from_sysfw(sci_dev);
+       return ti_sci_get_by_node(np);
 }
 
 /**
@@ -2710,25 +2704,14 @@ const struct ti_sci_handle *ti_sci_get_handle(struct 
device *dev)
 const struct ti_sci_handle *ti_sci_get_by_phandle(struct device *dev,
                                                  const char *property)
 {
-       struct ti_sci_info *entry, *info = NULL;
        struct device_node *np;
 
        np = of_parse_phandle(dev->of_node, property, 0);
        if (!np)
                return ERR_PTR(-EINVAL);
 
-       of_device_ensure_probed(np);
-
-       list_for_each_entry(entry, &ti_sci_list, list)
-               if (dev_of_node(entry->dev) == np) {
-                       info = entry;
-                       break;
-               }
-
-       if (!info)
-               return ERR_PTR(-ENODEV);
 
-       return &info->handle;
+       return ti_sci_get_by_node(np);
 }
 
 /**
diff --git a/include/soc/ti/ti_sci_protocol.h b/include/soc/ti/ti_sci_protocol.h
index f41ed82b91..e1c9956eb1 100644
--- a/include/soc/ti/ti_sci_protocol.h
+++ b/include/soc/ti/ti_sci_protocol.h
@@ -654,7 +654,6 @@ struct ti_sci_resource {
 
 #if IS_ENABLED(CONFIG_TI_SCI_PROTOCOL)
 
-const struct ti_sci_handle *ti_sci_get_handle_from_sysfw(struct device *dev);
 const struct ti_sci_handle *ti_sci_get_handle(struct device *dev);
 const struct ti_sci_handle *ti_sci_get_by_phandle(struct device *dev,
                                                  const char *property);
@@ -663,12 +662,6 @@ devm_ti_sci_get_of_resource(const struct ti_sci_handle 
*handle,
                            struct device *dev, u32 dev_id, char *of_prop);
 #else  /* CONFIG_TI_SCI_PROTOCOL */
 
-static inline
-const struct ti_sci_handle *ti_sci_get_handle_from_sysfw(struct device *dev)
-{
-       return ERR_PTR(-EINVAL);
-}
-
 static inline const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
 {
        return ERR_PTR(-EINVAL);

-- 
2.39.5


Reply via email to