return 0;
}
+int pass_put_resource(struct pass *pass)
+{
+ struct pass_resource_common *common;
+ struct pass_resource_info *info;
+ int i, ret;
+
+ for (i = 0; i < pass->num_resources; i++) {
+ struct pass_resource *pass_res = &pass->res[i];
+ struct pass_conf_data *cdata = &pass_res->cdata;
+ int res_type = cdata->res_type;
+
+ switch (res_type) {
+ case PASS_RESOURCE_CPU_ID:
+ common = (struct pass_resource_common*)pass_res->hal.cpu;
+ info = pass_res->hal.cpu->common.info;
+ ret = info->close(common);
+ break;
+ case PASS_RESOURCE_BUS_ID:
+ common = (struct pass_resource_common*)pass_res->hal.bus;
+ info = pass_res->hal.bus->common.info;
+ ret = info->close(common);
+ break;
+ case PASS_RESOURCE_GPU_ID:
+ common = (struct pass_resource_common*)pass_res->hal.gpu;
+ info = pass_res->hal.gpu->common.info;
+ ret = info->close(common);
+ break;
+ default:
+ return -EINVAL;
+ };
+
+ if (ret < 0) {
+ _E("Failed to close %s h/w resource\n", info->name);
+ return -EINVAL;
+ }
+
+ _D("Complete the closing for %s h/w resource\n", info->name);
+ }
+
+ return 0;
+}
/*
* FXIME: Following function is not standard interface.
* Following functions will be altered by the standard interface on later.
int pass_get_temp(struct pass_resource *res);
int pass_get_policy(struct pass_resource *res, char *policy);
-/* Load the h/w resource. */
+/* Get and put the h/w resource. */
int pass_get_resource(struct pass *pass);
+int pass_put_resource(struct pass *pass);
/*
* FXIME: Following function is not standard interface.
{
int i, ret;
- ret = 0;
for (i = 0; i < g_pass.num_resources; i++) {
struct pass_resource *pass_res = &g_pass.res[i];
struct pass_policy *policy = &pass_res->policy;
ret = pass_resource_exit(policy);
if (ret < 0) {
_E("failed to clean up the pass resource #%d\n", i);
- break;
+ goto exit;
}
}
+ ret = pass_put_resource(&g_pass);
+ if (ret < 0)
+ _E("cannot put the pass resource\n");
+
+exit:
return ret;
}