struct resource_driver_ops {
int (*init)(struct resource *res);
void (*exit)(struct resource *res);
+ /*
+ * If prepare_update is specified, it will be called
+ * at every update_resource_attrs().
+ */
+ int (*prepare_update)(struct resource *res);
};
/* resource driver flags */
void delete_resource(struct resource *resource);
/* Handle resource attribute */
-int update_resource_attr(struct resource *resource, u_int64_t attr_id);
int update_resource_attrs(struct resource *resource);
const struct resource_attribute *get_resource_attr(struct resource *resource, u_int64_t attr_id);
struct resource_attribute_value *
get_resource_attr_value(struct resource *resource, u_int64_t attr_id);
int get_resource_attr_integer(struct resource *resource, u_int64_t attr_id, int *data);
-int get_resource_attr_integer_sync(struct resource *resource, u_int64_t attr_id, int *data);
int get_resource_attr_double(struct resource *resource, u_int64_t attr_id, double *data);
-int get_resource_attr_double_sync(struct resource *resource, u_int64_t attr_id, double *data);
int get_resource_attr_string(struct resource *resource, u_int64_t attr_id, char **data);
-int get_resource_attr_string_sync(struct resource *resource, u_int64_t attr_id, char **data);
-int get_resource_attr_ptr(struct resource *resource, u_int64_t attr_id, void **data);
-int get_resource_attr_ptr_sync(struct resource *resource, u_int64_t attr_id, void **data);
int get_resource_attr_array(struct resource *resource, u_int64_t attr_id,
struct array_value **data);
-int get_resource_attr_array_sync(struct resource *resource, u_int64_t attr_id,
- struct array_value **data);
+int get_resource_attr_ptr(struct resource *resource, u_int64_t attr_id, void **data);
void set_resource_attr_interest(struct resource *resource, u_int64_t interest_mask);
void unset_resource_attr_interest(struct resource *resource, u_int64_t interest_mask);
return resource;
}
-int update_resource_attr(struct resource *resource, u_int64_t attr_id)
+static int update_resource_attr(struct resource *resource, u_int64_t attr_id)
{
int attr_index = RESOURCE_ATTR_INDEX(attr_id);
const struct resource_attribute *attr = NULL;
if (!resource || !resource->type)
return -EINVAL;
+ if (resource->driver && resource->driver->ops.prepare_update) {
+ ret = resource->driver->ops.prepare_update(resource);
+ if (ret < 0)
+ return ret;
+ }
+
for (i = 0; i < resource->num_attrs; i++) {
if (!(resource->attrs[i].id & resource->attr_interest))
continue;
return 0;
}
-int get_resource_attr_integer_sync(struct resource *resource, u_int64_t attr_id, int *data)
-{
- int ret;
-
- ret = update_resource_attr(resource, attr_id);
- if (ret < 0)
- return ret;
-
- return get_resource_attr_integer(resource, attr_id, data);
-}
-
int get_resource_attr_double(struct resource *resource, u_int64_t attr_id, double *data)
{
struct resource_attribute_value *attr_value = NULL;
return 0;
}
-int get_resource_attr_double_sync(struct resource *resource, u_int64_t attr_id, double *data)
-{
- int ret;
-
- ret = update_resource_attr(resource, attr_id);
- if (ret < 0)
- return ret;
-
- return get_resource_attr_double(resource, attr_id, data);
-}
-
int get_resource_attr_string(struct resource *resource, u_int64_t attr_id, char **data)
{
struct resource_attribute_value *attr_value = NULL;
return 0;
}
-int get_resource_attr_string_sync(struct resource *resource, u_int64_t attr_id, char **data)
-{
- int ret;
-
- ret = update_resource_attr(resource, attr_id);
- if (ret < 0)
- return ret;
-
- return get_resource_attr_string(resource, attr_id, data);
-}
-
int get_resource_attr_array(struct resource *resource, u_int64_t attr_id, struct array_value **data)
{
struct resource_attribute_value *attr_value = NULL;
return 0;
}
-int get_resource_attr_array_sync(struct resource *resource, u_int64_t attr_id,
- struct array_value **data)
-{
- int ret;
-
- ret = update_resource_attr(resource, attr_id);
- if (ret < 0)
- return ret;
-
- return get_resource_attr_array(resource, attr_id, data);
-}
-
int get_resource_attr_ptr(struct resource *resource, u_int64_t attr_id, void **data)
{
struct resource_attribute_value *attr_value = NULL;
return 0;
}
-int get_resource_attr_ptr_sync(struct resource *resource, u_int64_t attr_id, void **data)
-{
- int ret;
-
- ret = update_resource_attr(resource, attr_id);
- if (ret < 0)
- return ret;
-
- return get_resource_attr_ptr(resource, attr_id, data);
-}
-
void set_resource_attr_interest(struct resource *resource, u_int64_t interest_mask)
{
resource->attr_interest |= interest_mask;