void mali_pp_scheduler_terminate(void)
{
	struct mali_group *group, *temp;

	/* Delete all groups owned by scheduler */
	if (NULL != virtual_group)
	{
		mali_group_delete(virtual_group);
	}

	MALI_DEBUG_ASSERT(_mali_osk_list_empty(&group_list_working));
	_MALI_OSK_LIST_FOREACHENTRY(group, temp, &group_list_idle, struct mali_group, pp_scheduler_list)
	{
		mali_group_delete(group);
	}

#if defined(MALI_PP_SCHEDULER_USE_DEFERRED_JOB_DELETE)
	_mali_osk_lock_term(pp_scheduler_job_delete_lock);
	_mali_osk_wq_delete_work(pp_scheduler_wq_job_delete);
#endif

	_mali_osk_wq_delete_work(pp_scheduler_wq_schedule);
	_mali_osk_wait_queue_term(pp_scheduler_working_wait_queue);
	_mali_osk_lock_term(pp_scheduler_lock);
}
void mali_cluster_delete(struct mali_cluster *cluster)
{
	u32 i;

	MALI_DEBUG_ASSERT_POINTER(cluster);

	/* Free all the resources we own */
	for (i = 0; i < cluster->number_of_groups; i++)
	{
		mali_group_delete(cluster->groups[i]);
	}

	if (NULL != cluster->l2)
	{
		mali_l2_cache_delete(cluster->l2);
	}

	for (i = 0; i < mali_global_num_clusters; i++)
	{
		if (mali_global_clusters[i] == cluster)
		{
			mali_global_clusters[i] = NULL;
			mali_global_num_clusters--;
			break;
		}
	}

	_mali_osk_free(cluster);
}
void mali_gp_scheduler_terminate(void)
{
	MALI_DEBUG_ASSERT(MALI_GP_SLOT_STATE_IDLE == slot.state);
	MALI_DEBUG_ASSERT_POINTER(slot.group);
	mali_group_delete(slot.group);

	_mali_osk_wait_queue_term(gp_scheduler_working_wait_queue);
	_mali_osk_lock_term(gp_scheduler_lock);
}
void mali_gp_scheduler_terminate(void)
{
    MALI_DEBUG_ASSERT(MALI_GP_SLOT_STATE_IDLE     == slot.state
                      || MALI_GP_SLOT_STATE_DISABLED == slot.state);
    MALI_DEBUG_ASSERT_POINTER(slot.group);
    mali_group_delete(slot.group);

    _mali_osk_wait_queue_term(gp_scheduler_working_wait_queue);

#if defined(MALI_UPPER_HALF_SCHEDULING)
    _mali_osk_spinlock_irq_term(gp_scheduler_lock);
#else
    _mali_osk_spinlock_term(gp_scheduler_lock);
#endif /* defined(MALI_UPPER_HALF_SCHEDULING) */
}