#define EXPORT __attribute__((visibility("default")))
#endif
-static hal_backend_sensor_funcs *g_sensor_funcs = NULL;
+static hal_backend_sensor_funcs *hal_sensor_funcs = NULL;
+/*
+-1 : failed to initialize
+0 : not initialized
+1 : succeeded to initialize
+*/
+static int hal_initialized = 0;
EXPORT
-int hal_sensor_get_backend(void) {
- int ret;
+int hal_sensor_get_backend(void)
+{
+ int ret;
- if (g_sensor_funcs) return 0;
+ if (hal_sensor_funcs)
+ return 0;
- ret = hal_common_get_backend(HAL_MODULE_SENSOR, (void **)&g_sensor_funcs);
- if (ret < 0) {
- _E("Failed to get backend\n");
- return -EINVAL;
- }
+ ret = hal_common_get_backend(HAL_MODULE_SENSOR, (void **)&hal_sensor_funcs);
+ if (ret < 0) {
+ _E("Failed to get backend");
+ hal_initialized = -1;
+ return -ENODEV;
+ }
- return 0;
+ hal_initialized = 1;
+ return 0;
}
EXPORT
-int hal_sensor_put_backend(void) {
- int ret;
-
- if (!g_sensor_funcs) return -EINVAL;
+int hal_sensor_put_backend(void)
+{
+ if (!hal_sensor_funcs)
+ return -ENODEV;
- ret = hal_common_put_backend(HAL_MODULE_SENSOR, (void *)g_sensor_funcs);
- if (ret < 0) {
- _E("Failed to put backend\n");
- return -EINVAL;
- }
- g_sensor_funcs = NULL;
+ hal_common_put_backend(HAL_MODULE_SENSOR, (void *)hal_sensor_funcs);
+ hal_sensor_funcs = NULL;
+ hal_initialized = 0;
- return 0;
+ return 0;
}
EXPORT
-int hal_sensor_create(sensor_device_t **devices) {
- if (!g_sensor_funcs) {
- return -ENOTSUP;
- }
- return g_sensor_funcs->create(devices);
+int hal_sensor_create(sensor_device_t **devices)
+{
+ int ret;
+
+ if (!hal_sensor_funcs && !hal_initialized) {
+ if ((ret = hal_sensor_get_backend()) < 0)
+ return ret;
+ }
+
+ if (!hal_sensor_funcs || !hal_sensor_funcs->create)
+ return -ENODEV;
+
+ return hal_sensor_funcs->create(devices);
}