From 4717829e9a668d17f727ae9e38ebd56cb73d712d Mon Sep 17 00:00:00 2001 From: xizx Date: Thu, 23 Sep 2021 14:23:38 +0800 Subject: [PATCH] mmi_info: provide check dynamic device status interface To avoid uncessary register driver, a dynamic check device status interface can be used to judge before register driver. Change-Id: I07d61a80ca46b955110c37588a1a466b0b4f2922 Reviewed-on: https://gerrit.mot.com/2074097 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: litong Reviewed-by: Jichao Zou Submit-Approved: Jira Key --- drivers/mmi_info/mmi_info_main.c | 29 +++++++++++++++++++++++++++++ include/linux/mmi_device.h | 1 + 2 files changed, 30 insertions(+) diff --git a/drivers/mmi_info/mmi_info_main.c b/drivers/mmi_info/mmi_info_main.c index 9b523b1dc2e3..c01183bfe3cb 100644 --- a/drivers/mmi_info/mmi_info_main.c +++ b/drivers/mmi_info/mmi_info_main.c @@ -93,6 +93,35 @@ bool mmi_device_is_available(struct device_node *np) } EXPORT_SYMBOL(mmi_device_is_available); +struct device_node *mmi_check_dynamic_device_node(char *dev_name) +{ + struct property *prop; + struct device_node *node, *dst_node; + int len; + char *val = NULL; + + node = of_find_node_by_path("/chosen"); + if (node == NULL) + return NULL; + + prop = of_find_property(node, "mmi,dynamic_devices", &len); + if (prop == NULL || len < 0) { + pr_err("%s: cannot find mmi,dynamic_devices property\n", __func__); + return NULL; + } + + while ((val = (char *)of_prop_next_string(prop, val))) { + if (strstr(val, dev_name)) { + pr_info("%s: find matched dev name string %s\n", __func__, val); + dst_node = of_find_node_by_path(val); + return dst_node; + } + } + pr_err("%s: cannot find any node with dev_name %s\n", __func__, dev_name); + return NULL; +} +EXPORT_SYMBOL(mmi_check_dynamic_device_node); + static int mmi_get_bootarg_dt(char *key, char **value, char *prop, char *spl_flag) { const char *bootargs_tmp = NULL; diff --git a/include/linux/mmi_device.h b/include/linux/mmi_device.h index 4f97dd8a7d07..5de81a954a4b 100644 --- a/include/linux/mmi_device.h +++ b/include/linux/mmi_device.h @@ -14,5 +14,6 @@ #define __MMI_DEVICE_H_INCLUDED bool mmi_device_is_available(struct device_node *np); +struct device_node *mmi_check_dynamic_device_node(char *dev_name); #endif /* __MMI_DEVICE_H_INCLUDED */