static void ged_exit(void)
{
#ifdef GED_DEBUG
    ged_log_buf_free(ghLogBuf_GED);
    ghLogBuf_GED = 0;

    ged_log_buf_free(ghLogBuf_GLES);
    ghLogBuf_GLES = 0;
#endif

    ged_profile_dvfs_exit();

    ged_hal_exit();

    ged_log_system_exit();

    ged_debugFS_exit();

    remove_proc_entry(GED_DRIVER_DEVICE_NAME, NULL);

    if (gvIOCTLParamBuf)
    {
        vfree(gvIOCTLParamBuf);
        gvIOCTLParamBuf = NULL;
    }
}
//-----------------------------------------------------------------------------
GED_ERROR ged_hal_init(void)
{
    GED_ERROR err = GED_OK;

    err = ged_debugFS_create_entry_dir(
            "hal",
            NULL,
            &gpsHALDir);

    if (unlikely(err != GED_OK))
    {
        err = GED_ERROR_FAIL;
        GED_LOGE("ged: failed to create hal dir!\n");
        goto ERROR;
    }

    /* Feedback the gpu freq level count */
    err = ged_debugFS_create_entry(
            "total_gpu_freq_level_count",
            gpsHALDir,
            &gsTotalGPUFreqLevelCountReadOps,
            NULL,
            NULL,
            &gpsTotalGPUFreqLevelCountEntry);

    if (unlikely(err != GED_OK))
    {
        GED_LOGE("ged: failed to create total_gpu_freq_level_count entry!\n");
        goto ERROR;
    }

    /* Control the gpu freq */
    err = ged_debugFS_create_entry(
            "custom_boost_gpu_freq",
            gpsHALDir,
            &gsCustomBoostGpuFreqReadOps,
            ged_custom_boost_gpu_freq_write_entry,
            NULL,
            &gpsCustomBoostGPUFreqEntry);

    if (unlikely(err != GED_OK))
    {
        GED_LOGE("ged: failed to create custom_boost_gpu_freq entry!\n");
        goto ERROR;
    }

    /* Control the gpu freq */
    err = ged_debugFS_create_entry(
            "custom_upbound_gpu_freq",
            gpsHALDir,
            &gsCustomUpboundGpuFreqReadOps,
            ged_custom_upbound_gpu_freq_write_entry,
            NULL,
            &gpsCustomUpboundGPUFreqEntry);

    if (unlikely(err != GED_OK))
    {
        GED_LOGE("ged: failed to create custom_upbound_gpu_freq entry!\n");
        goto ERROR;
    }

        /* Enable/Disable the vsync offset */
        
        err = ged_debugFS_create_entry(
            "event_notify",
            gpsHALDir,
            &gsVsync_offset_enableReadOps,
            ged_vsync_offset_enable_write_entry,
            NULL,
            &gpsVsyncOffsetEnableEntry);
    
    
    	/* Control the vsync offset level */
		
		err = ged_debugFS_create_entry(
            "vsync_offset_level",
            gpsHALDir,
            &gsVsync_offset_levelReadOps,
            ged_vsync_offset_level_write_entry,
            NULL,
            &gpsVsyncOffsetLevelEntry);
	
		/* Control the dvfs policy threshold level */
		
		err = ged_debugFS_create_entry(
            "custom_dvfs_mode",
            gpsHALDir,
            &gsDvfs_tuning_mode_ReadOps, 
            ged_dvfs_tuning_mode_write_entry, 
            NULL,
            &gpsDvfsTuningModeEntry);
        
        
        /* Get current GPU freq */
        
        err = ged_debugFS_create_entry(
            "current_freqency",
            gpsHALDir,
            &gsDvfs_cur_freq_ReadOps, 
            NULL, 
            NULL,
            &gpsDvfsCurFreqEntry);
        
      /* Get previous GPU freq */
        
        err = ged_debugFS_create_entry(
            "previous_freqency",
            gpsHALDir,
            &gsDvfs_pre_freq_ReadOps, 
            NULL, 
            NULL,
            &gpsDvfsPreFreqEntry);
     
     /* Get GPU Utilization */
        
        err = ged_debugFS_create_entry(
            "gpu_utilization",
            gpsHALDir,
            &gsDvfs_gpu_util_ReadOps, 
            NULL, 
            NULL,
            &gpsDvfsGpuUtilizationEntry);

	/* Get FPS upper bound */
	err = ged_debugFS_create_entry(
			"fps_upper_bound",
			gpsHALDir,
			&gs_fps_ub_read_ops,
			ged_fps_ub_write,
			NULL,
			&gpsFpsUpperBoundEntry
			);

    if (unlikely(err != GED_OK))
    {
        GED_LOGE("ged: failed to create vsync_offset_level entry!\n");
        goto ERROR;
    }
    

    return err;

ERROR:

    ged_hal_exit();

    return err;
}