int hal_common_put_backend_with_library_name(enum hal_module module,
void *data, const char *library_name);
+/**
+ * @brief Get the backend data according to the HAL module type
+ * and initialize 'hal_backend_[module]_funcs' instance
+ * via the passed init_backend function pointer.
+ * @param[in] HAL module id among enum hal_module
+ * @param[out] Data pointer where 'hal_backend_[module]_funcs' instance
+ * should be initialized by HAL backend binary.
+ * @param[in] User data passed to init_backend function pointer.
+ * @param[in] init_backend function pointer to initialize
+ * 'hal_backend_[module]_funcs' instance.
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int hal_common_get_backend_v2(enum hal_module module,
+ void **data, void *user_data,
+ int (*init_backend)(void **data, void *user_data));
+
+/**
+ * @brief Put the backend data according to HAL module type
+ * and deinitialize 'hal_backend_[module]_funcs' instance.
+ * via the passed init_backend function pointer.
+ * @param[in] HAL module id among enum hal_module
+ * @param[in] Data pointer where 'hal_backend_[module]_funcs' instance
+ * @param[in] User data passed to init_backend function pointer.
+ * @param[in] exit_backend function pointer to deinitialize
+ * 'hal_backend_[module]_funcs' instance.
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int hal_common_put_backend_v2(enum hal_module module,
+ void *data, void *user_data,
+ int (*exit_backend)(void *data, void *user_data));
+
+/**
+ * @brief Get the backend data with the specific library name according to HAL module type
+ * and initialize 'hal_backend_[module]_funcs' instance
+ * via the passed init_backend function pointer.
+ * @param[in] HAL module id among enum hal_module
+ * @param[out] Data pointer where 'hal_backend_[module]_funcs' instance
+ * should be stored from HAL backend binary.
+ * @param[in] User data passed to init_backend function pointer.
+ * @param[in] init_backend function pointer to initialize
+ * 'hal_backend_[module]_funcs' instance.
+ * @param[in] HAL backend library name which is not default library name
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int hal_common_get_backend_with_library_name_v2(enum hal_module module,
+ void **data, void *user_data,
+ int (*init_backend)(void **data, void *user_data),
+ const char *library_name);
+
+/**
+ * @brief Put the backend data with the specific library name according to HAL module type
+ * and deinitialize 'hal_backend_[module]_funcs' instance.
+ * via the passed init_backend function pointer.
+ * @param[in] HAL module id among enum hal_module
+ * @param[in] Data pointer where 'hal_backend_[module]_funcs' instance
+ * @param[in] User data passed to init_backend function pointer.
+ * @param[in] exit_backend function pointer to deinitialize
+ * 'hal_backend_[module]_funcs' instance.
+ * @param[in] HAL backend library name which is not default library name
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int hal_common_put_backend_with_library_name_v2(enum hal_module module,
+ void **data, void *user_data,
+ int (*exit_backend)(void *data, void *user_data),
+ const char *library_name);
+
/**
* @brief Get the backend HAL major/minor version according to the type of HAL module
* @param[in] HAL module id among enum hal_moudle
info->handle = NULL;
}
-static int __init_backend(struct __hal_module_info *info, void **data,
- const char *library_name)
+static int __init_backend(struct __hal_module_info *info,
+ void **data, void *user_data,
+ int (*init_backend)(void **data, void *user_data))
{
int ret;
enum hal_common_backend_compatibility compatibility =
return 0;
}
+ if (init_backend) {
+ ret = init_backend(data, user_data);
+ if (ret < 0) {
+ _E("%s: Failed to init_backend of hal-api\n", info->module_name);
+ return ret;
+ }
+ }
+
if (!info->backend->init) {
_E("%s: hal_backend->init() is NULL\n", info->module_name);
return -EINVAL;
return 0;
}
-static int __exit_backend(struct __hal_module_info *info, void *data,
- const char *library_name)
+static int __exit_backend(struct __hal_module_info *info,
+ void *data, void *user_data,
+ int (*exit_backend)(void *interface, void *user_data))
{
int ret;
}
}
+ if (exit_backend) {
+ ret = exit_backend(data, user_data);
+ if (ret < 0) {
+ _E("%s: Failed to execute exit_backend of hal-api: name(%s)/vendor(%s)\n",
+ info->module_name, info->backend->name,
+ info->backend->vendor);
+ return ret;
+ }
+ }
+
return 0;
}
-static int __get_backend(enum hal_module module, void **data,
- const char *library_name)
+static int __get_backend(enum hal_module module,
+ void **data, void *user_data,
+ int (*init_backend)(void **data, void *user_data),
+ const char *library_name)
{
struct __hal_module_info *info = NULL;
int ret;
if (ret < 0)
goto err;
- ret = __init_backend(info, data, NULL);
+ ret = __init_backend(info, data, user_data, init_backend);
if (ret < 0) {
_E("%s: Failed to initialize the backend library\n",
info->module_name);
return ret;
}
-static int __put_backend(enum hal_module module, void *data,
- const char *library_name)
+static int __put_backend(enum hal_module module,
+ void *data, void *user_data,
+ int (*exit_backend)(void *data, void *user_data),
+ const char *library_name)
{
struct __hal_module_info *info = NULL;
int ret;
goto out;
}
- ret = __exit_backend(info, data, NULL);
+ ret = __exit_backend(info, data, user_data, exit_backend);
if (ret < 0) {
_E("%s: Failed to exit the backend library\n",
info->module_name);
EXPORT
int hal_common_get_backend(enum hal_module module, void **data)
{
- return __get_backend(module, data, NULL);
+ return __get_backend(module, data, NULL, NULL, NULL);
}
EXPORT
int hal_common_put_backend(enum hal_module module, void *data)
{
- return __put_backend(module, data, NULL);
+ return __put_backend(module, data, NULL, NULL, NULL);
}
EXPORT
int hal_common_get_backend_with_library_name(enum hal_module module,
void **data, const char *library_name)
{
- return __get_backend(module, data, library_name);
+ return __get_backend(module, data, NULL, NULL, library_name);
}
EXPORT
int hal_common_put_backend_with_library_name(enum hal_module module,
void *data, const char *library_name)
{
- return __put_backend(module, data, library_name);
+ return __put_backend(module, data, NULL, NULL, library_name);
+}
+
+EXPORT
+int hal_common_get_backend_v2(enum hal_module module,
+ void **data, void *user_data,
+ int (*init_backend)(void **data, void *user_data))
+{
+
+ if (!init_backend) {
+ _E("Invalid parameter of hal_module(%d)\n", module);
+ return -EINVAL;
+ }
+
+ return __get_backend(module, data, user_data, init_backend, NULL);
+}
+
+
+EXPORT
+int hal_common_put_backend_v2(enum hal_module module,
+ void *data, void *user_data,
+ int (*exit_backend)(void *data, void *user_data))
+{
+ if (!data || !exit_backend) {
+ _E("Invalid parameter of hal_module(%d)\n", module);
+ return -EINVAL;
+ }
+
+ return __put_backend(module, data, user_data, exit_backend, NULL);
+}
+
+EXPORT
+int hal_common_get_backend_with_library_name_v2(enum hal_module module,
+ void **data, void *user_data,
+ int (*init_backend)(void **data, void *user_data),
+ const char *library_name)
+{
+ if (!init_backend) {
+ _E("Invalid parameter of hal_module(%d)\n", module);
+ return -EINVAL;
+ }
+
+ return __get_backend(module, data, user_data, init_backend, library_name);
+}
+
+EXPORT
+int hal_common_put_backend_with_library_name_v2(enum hal_module module,
+ void **data, void *user_data,
+ int (*exit_backend)(void *data, void *user_data),
+ const char *library_name)
+{
+ if (!data || !exit_backend) {
+ _E("Invalid parameter of hal_module(%d)\n", module);
+ return -EINVAL;
+ }
+
+ return __put_backend(module, data, user_data, exit_backend, library_name);
}
EXPORT