const struct resource_attribute_ops ops;
};
+struct resource_driver_ops {
+ int (*init)(struct resource *res);
+ void (*exit)(struct resource *res);
+};
+
struct resource_driver {
const char *name;
const int type;
const int num_attrs;
const struct resource_attribute *attrs;
+ const struct resource_driver_ops ops;
};
struct resource_device {
int type;
int index;
void *user_data;
+ void *priv;
int num_attrs;
const struct resource_attribute *attrs;
return (struct resource_driver *)node->data;
}
-void delete_resource(struct resource *resource)
+static void do_delete_resource(struct resource *resource)
{
- if (!resource)
- return;
-
if (!resource->name)
free(resource->name);
if (!resource->attrs_value)
free(resource);
}
+void delete_resource(struct resource *resource)
+{
+ const struct resource_driver *driver = NULL;
+
+ if (!resource)
+ return;
+
+ driver = find_resource_driver(resource->type);
+ if (!driver) {
+ _E("failed to find driver for resource type: %d\n", resource->type);
+ return;
+ }
+
+ if (driver->ops.exit)
+ driver->ops.exit(resource);
+
+ do_delete_resource(resource);
+}
+
struct resource *create_resource(int resource_type, int resource_index,
void *user_data)
{
const struct resource_device *device = NULL;
const struct resource_driver *driver = NULL;
struct resource *resource = NULL;
- int i;
+ int i, ret;
device = find_resource_device(resource_type, resource_index);
if (!device)
resource->attrs_value = calloc(resource->num_attrs,
sizeof(*resource->attrs_value));
if (!resource->attrs_value) {
- delete_resource(resource);
+ do_delete_resource(resource);
return NULL;
}
for (i = 0; i < resource->num_attrs; i++)
resource->attrs_value[i].type = driver->attrs[i].type;
+ if (driver->ops.init) {
+ ret = driver->ops.init(resource);
+ if (ret < 0) {
+ do_delete_resource(resource);
+ return NULL;
+ }
+ }
+
return resource;
}