int fimc_is_resource_put(struct fimc_is_resourcemgr *resourcemgr) { int ret = 0; struct fimc_is_core *core; BUG_ON(!resourcemgr); core = (struct fimc_is_core *)resourcemgr->private_data; if ((atomic_read(&core->rsccount) == 0) || (atomic_read(&core->rsccount) > 5)) { err("[RSC] %s: Invalid rsccount(%d)\n", __func__, atomic_read(&core->rsccount)); ret = -EMFILE; goto exit; } atomic_dec(&core->rsccount); pr_info("[RSC] %s: rsccount = %d\n", __func__, atomic_read(&core->rsccount)); if (!atomic_read(&core->rsccount)) { if (test_bit(FIMC_IS_ISCHAIN_POWER_ON, &core->state)) { /* 1. Stop a5 and other devices operation */ ret = fimc_is_itf_power_down(&core->interface); if (ret) err("power down is failed, retry forcelly"); /* 2. Power down */ ret = fimc_is_ischain_power(&core->ischain[0], 0); if (ret) err("fimc_is_ischain_power is failed"); } /* 3. Deinit variables */ ret = fimc_is_interface_close(&core->interface); if (ret) err("fimc_is_interface_close is failed"); #ifndef RESERVED_MEM /* 5. Dealloc memroy */ fimc_is_ishcain_deinitmem(&core->ischain[0]); #endif } exit: return ret; }
int fimc_is_resource_put(struct fimc_is_resourcemgr *resourcemgr, u32 rsc_type) { int ret = 0; u32 rsccount; struct fimc_is_resource *resource; struct fimc_is_core *core; BUG_ON(!resourcemgr); BUG_ON(!resourcemgr->private_data); BUG_ON(rsc_type >= RESOURCE_TYPE_MAX); resource = GET_RESOURCE(resourcemgr, rsc_type); core = (struct fimc_is_core *)resourcemgr->private_data; rsccount = atomic_read(&core->rsccount); if (rsccount == 0) { err("[RSC] Invalid rsccount(%d)\n", rsccount); ret = -EMFILE; goto p_err; } if (atomic_read(&resource->rsccount) == 1) { switch (rsc_type) { case RESOURCE_TYPE_SENSOR0: break; case RESOURCE_TYPE_SENSOR1: break; case RESOURCE_TYPE_ISCHAIN: ret = fimc_is_itf_power_down(&core->interface); if (ret) err("power down cmd is fail(%d)", ret); ret = fimc_is_ischain_power(&core->ischain[0], 0); if (ret) err("fimc_is_ischain_power is fail(%d)", ret); ret = fimc_is_interface_close(&core->interface); if (ret) err("fimc_is_interface_close is fail(%d)", ret); #ifndef RESERVED_MEM /* 5. Dealloc memroy */ ret = fimc_is_ishcain_deinitmem(&core->ischain[0]); if (ret) err("fimc_is_ishcain_deinitmem is fail(%d)", ret); #endif break; default: err("[RSC] resource type(%d) is invalid", rsc_type); BUG(); break; } } atomic_dec(&resource->rsccount); atomic_dec(&core->rsccount); p_err: info("[RSC] rsctype : %d, rsccount : %d\n", rsc_type, rsccount); return ret; }