Some SoC drivers reimplement the functionality of soc_device_get_machine(). Make this function accessible through the sys_soc.h header. Rework it slightly to return a negative error number on failure to read the machine string (SoC core can keep on ignoring it). While at it: make it use the __free() helper from cleanup.h.
Signed-off-by: Bartosz Golaszewski <[email protected]> --- drivers/base/soc.c | 16 +++++++++------- include/linux/sys_soc.h | 10 ++++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/drivers/base/soc.c b/drivers/base/soc.c index 6f42632d2b0fcc8a729484e6ad270f9bcabe4a0b..bec8771d40f0590d4d7c3985c08fedfd4043a394 100644 --- a/drivers/base/soc.c +++ b/drivers/base/soc.c @@ -5,6 +5,7 @@ * Author: Lee Jones <[email protected]> for ST-Ericsson. */ +#include <linux/cleanup.h> #include <linux/err.h> #include <linux/glob.h> #include <linux/idr.h> @@ -111,17 +112,18 @@ static void soc_release(struct device *dev) kfree(soc_dev); } -static void soc_device_get_machine(struct soc_device_attribute *soc_dev_attr) +int soc_device_get_machine(struct soc_device_attribute *soc_dev_attr) { - struct device_node *np; - if (soc_dev_attr->machine) - return; + return -EBUSY; + + struct device_node *np __free(device_node) = of_find_node_by_path("/"); + if (!np) + return -ENOENT; - np = of_find_node_by_path("/"); - of_property_read_string(np, "model", &soc_dev_attr->machine); - of_node_put(np); + return of_property_read_string(np, "model", &soc_dev_attr->machine); } +EXPORT_SYMBOL_GPL(soc_device_get_machine); static struct soc_device_attribute *early_soc_dev_attr; diff --git a/include/linux/sys_soc.h b/include/linux/sys_soc.h index d9b3cf0f410c8cfb509a4c1a4d6c83fde6fe33c6..2d2dbc18462a39ddee95e38826a769fab089026f 100644 --- a/include/linux/sys_soc.h +++ b/include/linux/sys_soc.h @@ -37,6 +37,16 @@ void soc_device_unregister(struct soc_device *soc_dev); */ struct device *soc_device_to_device(struct soc_device *soc); +/** + * soc_device_get_machine - retrieve the machine model and store it in + * the soc_device_attribute structure + * @soc_dev_attr: SoC attribute structure to store the model in + * + * Returns: + * 0 on success, negative error number on failure. + */ +int soc_device_get_machine(struct soc_device_attribute *soc_dev_attr); + #ifdef CONFIG_SOC_BUS const struct soc_device_attribute *soc_device_match( const struct soc_device_attribute *matches); -- 2.47.3
