diff --git a/exynos/multimedia/codecs/audio/Android.mk b/exynos/multimedia/codecs/audio/Android.mk
index 3bc3577..ae00b4f 100644
--- a/exynos/multimedia/codecs/audio/Android.mk
+++ b/exynos/multimedia/codecs/audio/Android.mk
@@ -5,7 +5,3 @@
 ifeq ($(filter-out exynos4,$(TARGET_BOARD_PLATFORM)),)
 include   $(LOCAL_PATH)/exynos4/Android.mk
 endif
-
-ifeq ($(filter-out exynos5,$(TARGET_BOARD_PLATFORM)),)
-include   $(LOCAL_PATH)/exynos5/Android.mk
-endif
diff --git a/exynos/multimedia/codecs/audio/exynos5/Android.mk b/exynos/multimedia/codecs/audio/exynos5/Android.mk
deleted file mode 100644
index 4b113e7..0000000
--- a/exynos/multimedia/codecs/audio/exynos5/Android.mk
+++ /dev/null
@@ -1,9 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_AUDIO_PATH :=$(LOCAL_PATH)
-
-ifeq ($(BOARD_USE_ALP_AUDIO), true)
-  include $(LOCAL_AUDIO_PATH)/srp/alp/Android.mk
-endif
diff --git a/exynos/multimedia/codecs/audio/exynos5/srp/alp/Android.mk b/exynos/multimedia/codecs/audio/exynos5/srp/alp/Android.mk
deleted file mode 100644
index 7393f68..0000000
--- a/exynos/multimedia/codecs/audio/exynos5/srp/alp/Android.mk
+++ /dev/null
@@ -1,26 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_COPY_HEADERS_TO := libsecmm
-LOCAL_COPY_HEADERS := \
-	include/srp_api.h \
-	include/srp_ioctl.h \
-	include/srp_error.h
-
-LOCAL_SRC_FILES := \
-	src/srp_api.c
-
-LOCAL_C_INCLUDES := \
-	$(LOCAL_PATH)/include
-
-LOCAL_MODULE := libsrpapi
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_ARM_MODE := arm
-
-LOCAL_STATIC_LIBRARIES :=
-
-LOCAL_SHARED_LIBRARIES :=
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/exynos/multimedia/codecs/audio/exynos5/srp/alp/include/srp_api.h b/exynos/multimedia/codecs/audio/exynos5/srp/alp/include/srp_api.h
deleted file mode 100644
index ad65b90..0000000
--- a/exynos/multimedia/codecs/audio/exynos5/srp/alp/include/srp_api.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef __SRP_API_H__
-#define __SRP_API_H__
-
-#include "srp_ioctl.h"
-#include "srp_error.h"
-
-#define SRP_DEV_NAME                    "dev/srp"
-
-#define SRP_INIT_BLOCK_MODE             0
-#define SRP_INIT_NONBLOCK_MODE          1
-
-#define SRP_PENDING_STATE_RUNNING       0
-#define SRP_PENDING_STATE_PENDING       1
-
-struct srp_buf_info {
-    void *mmapped_addr;
-    void *addr;
-    unsigned int mmapped_size;
-    unsigned int size;
-    int num;
-};
-
-struct srp_dec_info {
-    unsigned int sample_rate;
-    unsigned int channels;
-};
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int SRP_Create(int block_mode);
-int SRP_Init();
-int SRP_Decode(void *buff, int size_byte);
-int SRP_Send_EOS(void);
-int SRP_SetParams(int id, unsigned long val);
-int SRP_GetParams(int id, unsigned long *pval);
-int SRP_Deinit(void);
-int SRP_Terminate(void);
-int SRP_IsOpen(void);
-
-int SRP_Get_Ibuf_Info(void **addr, unsigned int *size, unsigned int *num);
-int SRP_Get_Obuf_Info(void **addr, unsigned int *size, unsigned int *num);
-int SRP_Get_Dec_Info(struct srp_dec_info *dec_info);
-int SRP_Get_PCM(void **addr, unsigned int *size);
-int SRP_Flush(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*__SRP_API_H__ */
diff --git a/exynos/multimedia/codecs/audio/exynos5/srp/alp/include/srp_error.h b/exynos/multimedia/codecs/audio/exynos5/srp/alp/include/srp_error.h
deleted file mode 100644
index 7f79452..0000000
--- a/exynos/multimedia/codecs/audio/exynos5/srp/alp/include/srp_error.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef _SRP_ERROR_H_
-#define _SRP_ERROR_H_
-
-typedef enum {
-    SRP_RETURN_OK = 0,
-
-    SRP_ERROR_OPEN_FAIL       = -1000,
-    SRP_ERROR_ALREADY_OPEN    = -1001,
-    SRP_ERROR_NOT_READY       = -1002,
-
-    SRP_ERROR_IBUF_OVERFLOW   = -2000,
-    SRP_ERROR_IBUF_INFO       = -2001,
-
-    SRP_ERROR_OBUF_READ       = -3000,
-    SRP_ERROR_OBUF_INFO       = -3001,
-    SRP_ERROR_OBUF_MMAP       = -3002,
-
-    SRP_ERROR_INVALID_SETTING = -4000,
-    SRP_ERROR_GETINFO_FAIL    = -4001
-} SRP_ERRORTYPE;
-
-#endif /* _SRP_ERROR_H_ */
diff --git a/exynos/multimedia/codecs/audio/exynos5/srp/alp/include/srp_ioctl.h b/exynos/multimedia/codecs/audio/exynos5/srp/alp/include/srp_ioctl.h
deleted file mode 100644
index 21d55df..0000000
--- a/exynos/multimedia/codecs/audio/exynos5/srp/alp/include/srp_ioctl.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef __SRP_IOCTL_H__
-#define __SRP_IOCTL_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define SRP_INIT                             (0x10000)
-#define SRP_DEINIT                           (0x10001)
-#define SRP_GET_MMAP_SIZE                    (0x10002)
-#define SRP_FLUSH                            (0x20002)
-#define SRP_SEND_EOS                         (0x20005)
-#define SRP_GET_IBUF_INFO                    (0x20007)
-#define SRP_GET_OBUF_INFO                    (0x20008)
-#define SRP_STOP_EOS_STATE                   (0x30007)
-#define SRP_GET_DEC_INFO                     (0x30008)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __SRP_IOCTL_H__ */
-
diff --git a/exynos/multimedia/codecs/audio/exynos5/srp/alp/src/srp_api.c b/exynos/multimedia/codecs/audio/exynos5/srp/alp/src/srp_api.c
deleted file mode 100644
index 59e4c4e..0000000
--- a/exynos/multimedia/codecs/audio/exynos5/srp/alp/src/srp_api.c
+++ /dev/null
@@ -1,265 +0,0 @@
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
-
-#include "srp_api.h"
-
-#define LOG_NDEBUG 1
-#define LOG_TAG "libsrpapi"
-#include <utils/Log.h>
-
-static struct srp_buf_info ibuf_info;
-static struct srp_buf_info obuf_info;
-static struct srp_buf_info pcm_info;
-
-static int srp_dev = -1;
-static int srp_block_mode = SRP_INIT_BLOCK_MODE;
-
-int SRP_Create(int block_mode)
-{
-    if (srp_dev == -1) {
-        srp_block_mode = block_mode;
-        srp_dev = open(SRP_DEV_NAME, O_RDWR |
-                    ((block_mode == SRP_INIT_NONBLOCK_MODE) ? O_NDELAY : 0));
-        if (srp_dev > 0)
-            return srp_dev;
-        else
-            return SRP_ERROR_OPEN_FAIL;
-    }
-
-    ALOGE("%s: Device is already opened", __func__);
-    return SRP_ERROR_ALREADY_OPEN;
-}
-
-int SRP_Init()
-{
-    int ret = SRP_RETURN_OK;
-    unsigned int mmapped_size = 0;
-
-    if (srp_dev != -1) {
-        ret = ioctl(srp_dev, SRP_INIT);
-        if (ret < 0)
-            return ret;
-
-        /* mmap for OBUF */
-        ret = ioctl(srp_dev, SRP_GET_MMAP_SIZE, &mmapped_size);
-        if (ret < 0) {
-            ALOGE("%s: SRP_GET_MMAP_SIZE is failed", __func__);
-            return SRP_ERROR_OBUF_MMAP;
-        }
-        obuf_info.mmapped_addr = mmap(0, mmapped_size,
-                    PROT_READ | PROT_WRITE, MAP_SHARED, srp_dev, 0);
-        if (!obuf_info.mmapped_addr) {
-            ALOGE("%s: mmap is failed", __func__);
-            return SRP_ERROR_OBUF_MMAP;
-        }
-        obuf_info.mmapped_size = mmapped_size;
-
-        ret = SRP_RETURN_OK;
-    } else {
-        ALOGE("%s: Device is not ready", __func__);
-        ret = SRP_ERROR_NOT_READY; /* device is not created */
-    }
-
-    return ret;
-}
-
-int SRP_Decode(void *buff, int size_byte)
-{
-    int ret = SRP_RETURN_OK;
-
-    if (srp_dev != -1) {
-        if (size_byte > 0) {
-            ALOGV("%s: Send data to RP (%d bytes)", __func__, size_byte);
-
-            ret = write(srp_dev, buff, size_byte);  /* Write Buffer to RP Driver */
-            if (ret < 0) {
-                if (ret != SRP_ERROR_IBUF_OVERFLOW)
-                    ALOGE("SRP_Decode returned error code: %d", ret);
-            }
-            return ret; /* Write Success */
-        } else {
-            return ret;
-        }
-    }
-
-    ALOGE("%s: Device is not ready", __func__);
-    return SRP_ERROR_NOT_READY;
-}
-
-int SRP_Send_EOS(void)
-{
-    if (srp_dev != -1)
-        return ioctl(srp_dev, SRP_SEND_EOS);
-
-    return SRP_ERROR_NOT_READY;
-}
-
-int SRP_SetParams(int id, unsigned long val)
-{
-    if (srp_dev != -1)
-        return 0; /* not yet */
-
-    return SRP_ERROR_NOT_READY;
-}
-
-int SRP_GetParams(int id, unsigned long *pval)
-{
-    if (srp_dev != -1)
-        return ioctl(srp_dev, id, pval);
-
-    return SRP_ERROR_NOT_READY;
-}
-
-int SRP_Flush(void)
-{
-    if (srp_dev != -1)
-        return ioctl(srp_dev, SRP_FLUSH);
-
-    return SRP_ERROR_NOT_READY;
-}
-
-int SRP_Get_PCM(void **addr, unsigned int *size)
-{
-    int ret = SRP_RETURN_OK;
-
-    if (srp_dev != -1) {
-        ret = read(srp_dev, &pcm_info, 0);
-        if (ret == -1) {
-            *size = 0;
-            ALOGE("%s: PCM read fail", __func__);
-            return SRP_ERROR_OBUF_READ;
-        }
-
-        *addr = pcm_info.addr;
-        *size = pcm_info.size;
-    } else {
-        return SRP_ERROR_NOT_READY;
-    }
-
-    return ret; /* Read Success */
-}
-
-int SRP_Get_Dec_Info(struct srp_dec_info *dec_info)
-{
-    int ret;
-
-    if (srp_dev != -1) {
-        ret = ioctl(srp_dev, SRP_GET_DEC_INFO, dec_info);
-        if (ret < 0) {
-            ALOGE("%s: Failed to get dec info", __func__);
-            return SRP_ERROR_GETINFO_FAIL;
-        }
-
-        ALOGV("numChannels(%d), samplingRate(%d)", dec_info->channels, dec_info->sample_rate);
-
-        ret = SRP_RETURN_OK;
-    } else {
-        ret = SRP_ERROR_NOT_READY;
-    }
-
-    return ret;
-}
-
-int SRP_Get_Ibuf_Info(void **addr, unsigned int *size, unsigned int *num)
-{
-    int ret = SRP_RETURN_OK;
-
-    if (srp_dev != -1) {
-        ret = ioctl(srp_dev, SRP_GET_IBUF_INFO, &ibuf_info);
-        if (ret == -1) {
-            ALOGE("%s: Failed to get Ibuf info", __func__);
-            return SRP_ERROR_IBUF_INFO;
-        }
-
-        *addr = ibuf_info.addr;
-        *size = ibuf_info.size;
-        *num = ibuf_info.num;
-
-        if (*num == 0) {
-            ALOGE("%s: IBUF num is 0", __func__);
-            return SRP_ERROR_INVALID_SETTING;
-        }
-
-        ret = SRP_RETURN_OK;
-    } else {
-        ret = SRP_ERROR_NOT_READY;
-    }
-
-    return ret;
-}
-
-int SRP_Get_Obuf_Info(void **addr, unsigned int *size, unsigned int *num)
-{
-    int ret = SRP_RETURN_OK;
-
-    if (srp_dev != -1) {
-        if (obuf_info.addr == NULL) {
-            ret = ioctl(srp_dev, SRP_GET_OBUF_INFO, &obuf_info);
-            if (ret < 0) {
-                ALOGE("%s: SRP_GET_OBUF_INFO is failed", __func__);
-                return SRP_ERROR_OBUF_INFO;
-            }
-        }
-
-        *addr = obuf_info.addr;
-        *size = obuf_info.size;
-        *num = obuf_info.num;
-
-        if (*num == 0) {
-            ALOGE("%s: OBUF num is 0", __func__);
-            return SRP_ERROR_INVALID_SETTING;
-        }
-
-        ret = SRP_RETURN_OK;
-    } else {
-        ret = SRP_ERROR_NOT_READY;
-    }
-
-    return ret;
-}
-
-int SRP_Deinit(void)
-{
-    if (srp_dev != -1) {
-        munmap(obuf_info.mmapped_addr, obuf_info.mmapped_size);
-        return ioctl(srp_dev, SRP_DEINIT);
-    }
-
-    return SRP_ERROR_NOT_READY;
-}
-
-int SRP_Terminate(void)
-{
-    int ret;
-
-    if (srp_dev != -1) {
-        ret = close(srp_dev);
-
-        if (ret == 0) {
-            srp_dev = -1; /* device closed */
-            return SRP_RETURN_OK;
-        }
-    }
-
-    return SRP_ERROR_NOT_READY;
-}
-
-int SRP_IsOpen(void)
-{
-    if (srp_dev == -1) {
-        ALOGV("%s: Device is not opened", __func__);
-        return 0;
-    }
-
-    ALOGV("%s: Device is opened", __func__);
-    return 1;
-}
diff --git a/exynos/multimedia/codecs/video/Android.mk b/exynos/multimedia/codecs/video/Android.mk
index 3bc3577..ae00b4f 100644
--- a/exynos/multimedia/codecs/video/Android.mk
+++ b/exynos/multimedia/codecs/video/Android.mk
@@ -5,7 +5,3 @@
 ifeq ($(filter-out exynos4,$(TARGET_BOARD_PLATFORM)),)
 include   $(LOCAL_PATH)/exynos4/Android.mk
 endif
-
-ifeq ($(filter-out exynos5,$(TARGET_BOARD_PLATFORM)),)
-include   $(LOCAL_PATH)/exynos5/Android.mk
-endif
diff --git a/exynos/multimedia/codecs/video/exynos5/Android.mk b/exynos/multimedia/codecs/video/exynos5/Android.mk
deleted file mode 100644
index 949c637..0000000
--- a/exynos/multimedia/codecs/video/exynos5/Android.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_VIDEO_PATH :=$(LOCAL_PATH)
-
-include    $(LOCAL_VIDEO_PATH)/mfc_v4l2/Android.mk
diff --git a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/Android.mk b/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/Android.mk
deleted file mode 100644
index f7ae2ec..0000000
--- a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/Android.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_COPY_HEADERS_TO := libsecmm
-LOCAL_COPY_HEADERS := \
-	include/mfc_errno.h \
-	include/mfc_interface.h \
-	include/SsbSipMfcApi.h
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := \
-	dec/src/SsbSipMfcDecAPI.c \
-	enc/src/SsbSipMfcEncAPI.c
-
-LOCAL_C_INCLUDES := \
-	$(LOCAL_PATH)/include \
-	device/samsung/$(TARGET_BOARD_PLATFORM)/include
-
-LOCAL_MODULE := libsecmfcapi
-
-LOCAL_PRELINK_MODULE := false
-
-ifeq ($(BOARD_USES_MFC_FPS),true)
-LOCAL_CFLAGS := -DCONFIG_MFC_FPS
-endif
-
-LOCAL_ARM_MODE := arm
-
-LOCAL_STATIC_LIBRARIES :=
-LOCAL_SHARED_LIBRARIES := liblog
-
-#ifeq ($(BOARD_USE_V4L2_ION),true)
-#LOCAL_CFLAGS += -DUSE_ION
-#LOCAL_SHARED_LIBRARIES += libion
-#endif
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/dec/src/SsbSipMfcDecAPI.c b/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/dec/src/SsbSipMfcDecAPI.c
deleted file mode 100644
index 99aef76..0000000
--- a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/dec/src/SsbSipMfcDecAPI.c
+++ /dev/null
@@ -1,1669 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *              http://www.samsung.com/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <fcntl.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-
-#include <sys/poll.h>
-#include "videodev2.h"
-
-#include "mfc_interface.h"
-#include "SsbSipMfcApi.h"
-#ifdef USE_ION
-#include "ion.h"
-#endif
-
-/* #define LOG_NDEBUG 0 */
-#define LOG_TAG "MFC_DEC_APP"
-#include <utils/Log.h>
-
-#ifdef CONFIG_MFC_FPS
-#include <sys/time.h>
-#endif
-
-/*#define CRC_ENABLE
-#define SLICE_MODE_ENABLE */
-#define POLL_DEC_WAIT_TIMEOUT 25
-
-#define USR_DATA_START_CODE (0x000001B2)
-#define VOP_START_CODE      (0x000001B6)
-#define MP4_START_CODE      (0x000001)
-
-#ifdef CONFIG_MFC_FPS
-unsigned int framecount, over30ms;
-struct timeval mTS1, mTS2, mDec1, mDec2;
-#endif
-
-#define DEFAULT_NUMBER_OF_EXTRA_DPB 5
-#define CLEAR(x)    memset (&(x), 0, sizeof(x))
-
-enum {
-    NV12MT_FMT = 0,
-    NV12M_FMT,
-    NV21M_FMT,
-};
-
-static char *mfc_dev_name = SAMSUNG_MFC_DEV_NAME;
-static int mfc_dev_node = 6;
-
-int read_header_data(void *openHandle);
-int init_mfc_output_stream(void *openHandle);
-int isBreak_loop(void *openHandle);
-
-int v4l2_mfc_querycap(int fd)
-{
-    struct v4l2_capability cap;
-    int ret;
-
-    CLEAR(cap);
-
-    ret = ioctl(fd, VIDIOC_QUERYCAP, &cap);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_QUERYCAP failed", __func__);
-        return ret;
-    }
-
-    if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
-        ALOGE("[%s] Device does not support capture", __func__);
-        return -1;
-    }
-
-    if (!(cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) {
-        ALOGE("[%s] Device does not support output", __func__);
-        return -1;
-    }
-
-    if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
-        ALOGE("[%s] Device does not support streaming", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int v4l2_mfc_s_fmt(int fd, enum v4l2_buf_type type,
-                    int pixelformat, unsigned int sizeimage, int width, int height)
-{
-    int ret;
-    struct v4l2_format fmt;
-
-    CLEAR(fmt);
-
-    fmt.type = type;
-
-    if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
-        switch (pixelformat) {
-        case H264_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
-            break;
-        case MPEG4_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_MPEG4;
-            break;
-        case H263_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H263;
-            break;
-        case XVID_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_XVID;
-            break;
-        case MPEG2_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_MPEG12;
-            break;
-        case FIMV1_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_FIMV1;
-            fmt.fmt.pix_mp.width = width;
-            fmt.fmt.pix_mp.height = height;
-            break;
-        case FIMV2_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_FIMV2;
-            break;
-        case FIMV3_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_FIMV3;
-            break;
-        case FIMV4_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_FIMV4;
-            break;
-        case VC1_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_VC1;
-            break;
-        case VC1RCV_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_VC1_RCV;
-            break;
-        case VP8_DEC:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_VP8;
-            break;
-        default:
-            ALOGE("[%s] Does NOT support the codec type (%d)", __func__, pixelformat);
-            return -1;
-        }
-        fmt.fmt.pix_mp.plane_fmt[0].sizeimage = sizeimage;
-    } else if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
-        switch (pixelformat) {
-        case NV12MT_FMT:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12MT_16X16;
-            break;
-        case NV12M_FMT:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12M;
-            break;
-        case NV21M_FMT:
-            fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV21M;
-            break;
-        default:
-            ALOGE("[%s] Does NOT support the pixel format (%d)", __func__, pixelformat);
-            return -1;
-        }
-    } else {
-        ALOGE("[%s] Wrong buffer type", __func__);
-        return -1;
-    }
-
-    ret = ioctl(fd, VIDIOC_S_FMT, &fmt);
-
-    return ret;
-}
-
-int v4l2_mfc_reqbufs(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, int *buf_cnt)
-{
-    struct v4l2_requestbuffers reqbuf;
-    int ret;
-
-    CLEAR(reqbuf);
-
-    reqbuf.type = type;
-    reqbuf.memory = memory;
-    reqbuf.count = *buf_cnt;
-
-    ret = ioctl(fd, VIDIOC_REQBUFS, &reqbuf);
-    *buf_cnt = reqbuf.count;
-
-    return ret;
-}
-
-int v4l2_mfc_querybuf(int fd, struct v4l2_buffer *buf, enum v4l2_buf_type type,
-                        enum v4l2_memory memory, int index, struct v4l2_plane *planes)
-{
-    int length = -1, ret;
-
-    if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
-        length = 1;
-    else if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
-        length = 2;
-
-    CLEAR(*buf);
-    buf->type = type;
-    buf->memory = memory;
-    buf->index = index;
-    buf->m.planes = planes;
-    buf->length = length;
-
-    ret = ioctl(fd, VIDIOC_QUERYBUF, buf);
-
-    return ret;
-}
-
-int v4l2_mfc_streamon(int fd, enum v4l2_buf_type type)
-{
-    int ret;
-
-    ret = ioctl(fd, VIDIOC_STREAMON, &type);
-
-    return ret;
-}
-
-int v4l2_mfc_streamoff(int fd, enum v4l2_buf_type type)
-{
-    int ret;
-
-    ret = ioctl(fd, VIDIOC_STREAMOFF, &type);
-
-    return ret;
-}
-
-int v4l2_mfc_s_ctrl(int fd, int id, int value)
-{
-    struct v4l2_control ctrl;
-    int ret;
-
-    CLEAR(ctrl);
-    ctrl.id = id;
-    ctrl.value = value;
-
-    ret = ioctl(fd, VIDIOC_S_CTRL, &ctrl);
-
-    return ret;
-}
-
-int v4l2_mfc_g_ctrl(int fd, int id, int *value)
-{
-    struct v4l2_control ctrl;
-    int ret;
-
-    CLEAR(ctrl);
-    ctrl.id = id;
-
-    ret = ioctl(fd, VIDIOC_G_CTRL, &ctrl);
-    *value = ctrl.value;
-
-    return ret;
-}
-
-int v4l2_mfc_qbuf(int fd, struct v4l2_buffer *qbuf, enum v4l2_buf_type type,
-        enum v4l2_memory memory, int index,
-        struct v4l2_plane *planes, int frame_length)
-{
-    int ret, length = 0;
-
-    if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
-        CLEAR(*qbuf);
-        length = 1;
-    } else if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
-        length = 2;
-    }
-
-    qbuf->type = type;
-    qbuf->memory = memory;
-    qbuf->index = index;
-    qbuf->m.planes = planes;
-    qbuf->length = length;
-    qbuf->m.planes[0].bytesused = frame_length;
-
-    ret = ioctl(fd, VIDIOC_QBUF, qbuf);
-
-    return ret;
-}
-
-int v4l2_mfc_dqbuf(int fd, struct v4l2_buffer *dqbuf, enum v4l2_buf_type type,
-                    enum v4l2_memory memory)
-{
-    struct v4l2_plane planes[MFC_DEC_NUM_PLANES];
-    int ret, length = 0;
-
-    CLEAR(*dqbuf);
-    if (type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
-        length = 1;
-    else if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
-        length = 2;
-
-    dqbuf->type = type;
-    dqbuf->memory = memory;
-    dqbuf->m.planes = planes;
-    dqbuf->length = length;
-
-    ret = ioctl(fd, VIDIOC_DQBUF, dqbuf);
-
-    return ret;
-}
-
-int v4l2_mfc_g_fmt(int fd, struct v4l2_format *fmt, enum v4l2_buf_type type)
-{
-    int ret;
-
-    CLEAR(*fmt);
-    fmt->type = type;
-    ret = ioctl(fd, VIDIOC_G_FMT, fmt);
-
-    return ret;
-}
-
-int v4l2_mfc_g_crop(int fd, struct v4l2_crop *crop, enum v4l2_buf_type type)
-{
-    int ret;
-
-    CLEAR(*crop);
-    crop->type = type;
-    ret = ioctl(fd, VIDIOC_G_CROP, crop);
-
-    return ret;
-}
-
-int v4l2_mfc_poll(int fd, int *revents, int timeout)
-{
-    struct pollfd poll_events;
-    int ret;
-
-    poll_events.fd = fd;
-    poll_events.events = POLLOUT | POLLERR;
-    poll_events.revents = 0;
-
-    ret = poll((struct pollfd*)&poll_events, 1, timeout);
-    *revents = poll_events.revents;
-
-    return ret;
-}
-
-static void getAByte(char *buff, int *code)
-{
-    int byte;
-
-    *code = (*code << 8);
-    byte = (int)*buff;
-    byte &= 0xFF;
-    *code |= byte;
-}
-
-static int isPBPacked(_MFCLIB *pCtx, int Frameleng)
-{
-    char *strmBuffer = NULL;
-    int startCode = 0xFFFFFFFF;
-    int leng_idx = 1;
-
-    strmBuffer = (char*)pCtx->virStrmBuf;
-
-    while (1) {
-        while (startCode != USR_DATA_START_CODE) {
-            if ((startCode == VOP_START_CODE) || (leng_idx == Frameleng)) {
-                ALOGI("[%s] VOP START Found !!.....return",__func__);
-                ALOGW("[%s] Non Packed PB",__func__);
-                return 0;
-            }
-            getAByte(strmBuffer, &startCode);
-            ALOGV(">> StartCode = 0x%08x <<\n", startCode);
-            strmBuffer++;
-            leng_idx++;
-        }
-        ALOGI("[%s] User Data Found !!",__func__);
-
-        do {
-            if (*strmBuffer == 'p') {
-                ALOGW("[%s] Packed PB",__func__);
-                return 1;
-            }
-            getAByte(strmBuffer, &startCode);
-            strmBuffer++; leng_idx++;
-        } while ((leng_idx <= Frameleng) && ((startCode >> 8) != MP4_START_CODE));
-
-        if (leng_idx > Frameleng)
-            break;
-    }
-
-    ALOGW("[%s] Non Packed PB",__func__);
-
-    return 0;
-}
-
-static void getMFCName(char *devicename, int size)
-{
-    snprintf(devicename, size, "%s%d", SAMSUNG_MFC_DEV_NAME, mfc_dev_node);
-}
-
-void SsbSipMfcDecSetMFCNode(int devicenode)
-{
-    mfc_dev_node = devicenode;
-}
-
-void SsbSipMfcDecSetMFCName(char *devicename)
-{
-    mfc_dev_name = devicename;
-}
-
-void *SsbSipMfcDecOpen(void)
-{
-    int hMFCOpen;
-    _MFCLIB *pCTX;
-    char mfc_dev_name[64];
-
-    int ret;
-    int req_count;
-    unsigned int i, j;
-
-    struct v4l2_buffer buf;
-    struct v4l2_plane planes[MFC_DEC_NUM_PLANES];
-
-    ALOGI("[%s] MFC Library Ver %d.%02d",__func__, MFC_LIB_VER_MAJOR, MFC_LIB_VER_MINOR);
-
-#ifdef CONFIG_MFC_FPS
-    framecount = 0;
-    over30ms = 0;
-    gettimeofday(&mTS1, NULL);
-#endif
-
-    pCTX = (_MFCLIB *)malloc(sizeof(_MFCLIB));
-    if (pCTX == NULL) {
-        ALOGE("[%s] malloc failed.",__func__);
-        return NULL;
-    }
-
-    memset(pCTX, 0, sizeof(_MFCLIB));
-
-    getMFCName(mfc_dev_name, 64);
-    ALOGI("[%s] dev name is %s",__func__,mfc_dev_name);
-
-    if (access(mfc_dev_name, F_OK) != 0) {
-        ALOGE("[%s] MFC device node not exists",__func__);
-        goto error_case1;
-    }
-
-    hMFCOpen = open(mfc_dev_name, O_RDWR|O_NONBLOCK, 0);
-    if (hMFCOpen < 0) {
-        ALOGE("[%s] Failed to open MFC device",__func__);
-        goto error_case1;
-    }
-
-    pCTX->hMFC = hMFCOpen;
-
-    ret = v4l2_mfc_querycap(pCTX->hMFC);
-    if (ret != 0) {
-        ALOGE("[%s] QUERYCAP failed", __func__);
-        goto error_case2;
-    }
-
-    pCTX->inter_buff_status = MFC_USE_NONE;
-    ret = v4l2_mfc_s_fmt(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
-                                H264_DEC, MAX_DECODER_INPUT_BUFFER_SIZE, 0, 0);
-    if (ret != 0) {
-        ALOGE("[%s] S_FMT failed",__func__);
-        goto error_case2;
-    }
-
-    pCTX->v4l2_dec.mfc_src_bufs_len = MAX_DECODER_INPUT_BUFFER_SIZE;
-
-    req_count = MFC_DEC_NUM_SRC_BUFS;
-    ret = v4l2_mfc_reqbufs(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
-                            V4L2_MEMORY_MMAP, &req_count);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_REQBUFS failed",__func__);
-        goto error_case2;
-    }
-
-    pCTX->v4l2_dec.mfc_num_src_bufs = req_count;
-
-    for (i = 0; i < pCTX->v4l2_dec.mfc_num_src_bufs; ++i) {
-        ret = v4l2_mfc_querybuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
-                                V4L2_MEMORY_MMAP, i, planes);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_QUERYBUF failed",__func__);
-            goto error_case3;
-        }
-
-        pCTX->v4l2_dec.mfc_src_bufs[i] = mmap(NULL, buf.m.planes[0].length,
-        PROT_READ | PROT_WRITE, MAP_SHARED, pCTX->hMFC, buf.m.planes[0].m.mem_offset);
-        if (pCTX->v4l2_dec.mfc_src_bufs[i] == MAP_FAILED) {
-            ALOGE("[%s] mmap failed (%d)",__func__,i);
-            goto error_case3;
-        }
-    }
-    pCTX->inter_buff_status |= MFC_USE_STRM_BUFF;
-
-    /* set extra DPB size to 5 as default for optimal performce (heuristic method) */
-    pCTX->dec_numextradpb = DEFAULT_NUMBER_OF_EXTRA_DPB;
-
-    pCTX->v4l2_dec.bBeingFinalized = 0;
-    pCTX->lastframe = SSBSIP_MFC_LAST_FRAME_NOT_RECEIVED;
-
-    pCTX->cacheablebuffer = NO_CACHE;
-
-    for (i = 0; i<MFC_DEC_NUM_SRC_BUFS; i++)
-        pCTX->v4l2_dec.mfc_src_buf_flags[i] = BUF_DEQUEUED;
-
-    pCTX->v4l2_dec.beingUsedIndex = 0;
-
-    return (void *) pCTX;
-
-error_case3:
-    for (j = 0; j < i; j++)
-        munmap(pCTX->v4l2_dec.mfc_src_bufs[j], pCTX->v4l2_dec.mfc_src_bufs_len);
-error_case2:
-    close(pCTX->hMFC);
-error_case1:
-    free(pCTX);
-
-    return NULL;
-}
-
-void *SsbSipMfcDecOpenExt(void *value)
-{
-    _MFCLIB *pCTX;
-
-    pCTX = SsbSipMfcDecOpen();
-
-    if (pCTX == NULL)
-        return NULL;
-
-    if (NO_CACHE == (*(SSBIP_MFC_BUFFER_TYPE *)value)) {
-        pCTX->cacheablebuffer = NO_CACHE;
-        ALOGI("[%s] non cacheable buffer",__func__);
-    } else {
-        pCTX->cacheablebuffer = CACHE;
-        ALOGI("[%s] cacheable buffer",__func__);
-    }
-
-    return (void *)pCTX;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecClose(void *openHandle)
-{
-    int ret, i;
-    _MFCLIB  *pCTX;
-
-#ifdef CONFIG_MFC_FPS
-    ALOGI(">>> MFC");
-    gettimeofday(&mTS2, NULL);
-    ALOGI(">>> time=%d", mTS2.tv_sec-mTS1.tv_sec);
-    ALOGI(">>> framecount=%d", framecount);
-    ALOGI(">>> 30ms over=%d", over30ms);
-#endif
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    if (pCTX->inter_buff_status & MFC_USE_DST_STREAMON) {
-        ret = v4l2_mfc_streamoff(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_STREAMOFF failed (destination buffers)",__func__);
-            return MFC_RET_CLOSE_FAIL;
-        }
-        pCTX->inter_buff_status &= ~(MFC_USE_DST_STREAMON);
-    }
-
-    if (pCTX->inter_buff_status & MFC_USE_SRC_STREAMON) {
-        ret = v4l2_mfc_streamoff(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_STREAMOFF failed (source buffers)",__func__);
-            return MFC_RET_CLOSE_FAIL;
-        }
-        pCTX->inter_buff_status &= ~(MFC_USE_SRC_STREAMON);
-    }
-
-    if (pCTX->inter_buff_status & MFC_USE_STRM_BUFF) {
-        for (i = 0; i < pCTX->v4l2_dec.mfc_num_src_bufs; i++)
-            munmap(pCTX->v4l2_dec.mfc_src_bufs[i], pCTX->v4l2_dec.mfc_src_bufs_len);
-        pCTX->inter_buff_status &= ~(MFC_USE_STRM_BUFF);
-    }
-
-    if (pCTX->inter_buff_status & MFC_USE_YUV_BUFF) {
-        for (i = 0; i < pCTX->v4l2_dec.mfc_num_dst_bufs; i++) {
-            munmap(pCTX->v4l2_dec.mfc_dst_bufs[i][0], pCTX->v4l2_dec.mfc_dst_bufs_len[0]);
-            munmap(pCTX->v4l2_dec.mfc_dst_bufs[i][1], pCTX->v4l2_dec.mfc_dst_bufs_len[1]);
-        }
-        pCTX->inter_buff_status &= ~(MFC_USE_YUV_BUFF);
-    }
-
-#ifdef USE_ION
-    ion_client_destroy(pCTX->ion_fd);
-#endif
-    close(pCTX->hMFC);
-    free(pCTX);
-
-    return MFC_RET_OK;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecInit(void *openHandle, SSBSIP_MFC_CODEC_TYPE codec_type, int Frameleng)
-{
-    int packedPB = 0;
-    _MFCLIB *pCTX;
-    int ret;
-
-    int width, height;
-    int ctrl_value;
-
-    struct v4l2_buffer buf;
-    struct v4l2_plane planes[MFC_DEC_NUM_PLANES];
-
-    int poll_state, poll_revents;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    pCTX->codecType = codec_type;
-
-    if ((pCTX->codecType == MPEG4_DEC) || (pCTX->codecType == XVID_DEC) ||
-    (pCTX->codecType == FIMV1_DEC) || (pCTX->codecType == FIMV2_DEC) ||
-    (pCTX->codecType == FIMV3_DEC) || (pCTX->codecType == FIMV4_DEC))
-        packedPB = isPBPacked(pCTX, Frameleng);
-
-    if (pCTX->codecType == FIMV1_DEC) {
-        width = pCTX->fimv1_res.width;
-        height = pCTX->fimv1_res.height;
-    } else {
-        width = 0;
-        height = 0;
-    }
-    ret = v4l2_mfc_s_fmt(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, pCTX->codecType,
-                            MAX_DECODER_INPUT_BUFFER_SIZE, width, height);
-    if (ret != 0) {
-        ALOGE("[%s] S_FMT failed", __func__);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case1;
-    }
-
-    /* Set default destination format as NV12MT */
-    ret = v4l2_mfc_s_fmt(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, NV12MT_FMT,
-                            0, width, height);
-    if (ret != 0) {
-        ALOGE("[%s] S_FMT failed",__func__);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case1;
-    }
-
-    /* PackedPB should be set after VIDIOC_S_FMT */
-    if (packedPB) {
-        ret = v4l2_mfc_s_ctrl(pCTX->hMFC, V4L2_CID_CODEC_PACKED_PB, 1);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_S_CTRL failed of PACKED_PB\n", __func__);
-            return MFC_RET_DEC_SET_CONF_FAIL;
-        }
-    }
-
-    ret = v4l2_mfc_qbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
-                    V4L2_MEMORY_MMAP, pCTX->v4l2_dec.beingUsedIndex, planes, Frameleng);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE",__func__);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case1;
-    }
-
-    /* Processing the header requires running streamon
-     on OUTPUT queue */
-    ret = v4l2_mfc_streamon(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_STREAMON failed",__func__);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case1;
-    }
-    pCTX->inter_buff_status |= MFC_USE_SRC_STREAMON;
-
-    ret = read_header_data(pCTX);
-    if (ret != 0)
-        goto error_case1;
-
-    /* cacheable buffer */
-    if (pCTX->cacheablebuffer == NO_CACHE)
-        ctrl_value = 0;
-    else
-        ctrl_value = 1;
-
-    ret = v4l2_mfc_s_ctrl(pCTX->hMFC, V4L2_CID_CACHEABLE, ctrl_value);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_S_CTRL failed, V4L2_CID_CACHEABLE", __func__);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case1;
-    }
-
-#ifdef USE_ION
-    pCTX->ion_fd = ion_client_create();
-    if (pCTX->ion_fd < 3) {
-        ALOGE("[%s] Failed to get ion_fd : %d", __func__, pCTX->ion_fd);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case1;
-    }
-#endif
-
-    ret = init_mfc_output_stream(pCTX);
-    if (ret != 0)
-        goto error_case1;
-
-    ret = v4l2_mfc_streamon(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_STREAMON failed (destination buffers)", __func__);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case1;
-    }
-    pCTX->inter_buff_status |= MFC_USE_DST_STREAMON;
-
-    do {
-        poll_state = v4l2_mfc_poll(pCTX->hMFC, &poll_revents, POLL_DEC_WAIT_TIMEOUT);
-        if (poll_state > 0) {
-            if (poll_revents & POLLOUT) {
-                ret = v4l2_mfc_dqbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_MMAP);
-                if (ret == 0)
-                    break;
-            } else if (poll_revents & POLLERR) {
-                ALOGE("[%s] POLLERR\n", __func__);
-                return MFC_GETOUTBUF_STATUS_NULL;
-            } else {
-                ALOGE("[%s] poll() returns 0x%x\n", __func__, poll_revents);
-                return MFC_GETOUTBUF_STATUS_NULL;
-            }
-        } else if (poll_state < 0) {
-            return MFC_GETOUTBUF_STATUS_NULL;
-        }
-    } while (poll_state == 0);
-
-    return MFC_RET_OK;
-
-error_case1:
-    SsbSipMfcDecClose(openHandle);
-    return ret;
-}
-
-int read_header_data(void *openHandle)
-{
-    struct v4l2_format fmt;
-    struct v4l2_crop crop;
-    struct v4l2_pix_format_mplane pix_mp;
-    int ctrl_value;
-    int ret;
-
-    _MFCLIB *pCTX;
-    pCTX  = (_MFCLIB *) openHandle;
-
-    ret = v4l2_mfc_g_fmt(pCTX->hMFC, &fmt, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_G_FMT failed",__func__);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case;
-    }
-
-    pix_mp = fmt.fmt.pix_mp;
-    pCTX->decOutInfo.buf_width = pix_mp.plane_fmt[0].bytesperline;
-    pCTX->decOutInfo.buf_height =
-        pix_mp.plane_fmt[0].sizeimage / pix_mp.plane_fmt[0].bytesperline;
-
-    pCTX->decOutInfo.img_width = pix_mp.width;
-    pCTX->decOutInfo.img_height = pix_mp.height;
-
-    ret = v4l2_mfc_g_crop(pCTX->hMFC, &crop, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_G_CROP failed",__func__);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case;
-    }
-
-    pCTX->decOutInfo.crop_left_offset = crop.c.left;
-    pCTX->decOutInfo.crop_top_offset = crop.c.top;
-    pCTX->decOutInfo.crop_right_offset =
-        pix_mp.width - crop.c.width - crop.c.left;
-    pCTX->decOutInfo.crop_bottom_offset =
-        pix_mp.height - crop.c.height - crop.c.top;
-
-    ret = v4l2_mfc_g_ctrl(pCTX->hMFC, V4L2_CID_CODEC_REQ_NUM_BUFS, &ctrl_value);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_G_CTRL failed",__func__);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case;
-    }
-
-    pCTX->v4l2_dec.mfc_num_dst_bufs = ctrl_value + pCTX->dec_numextradpb;
-
-    ALOGV("[%s] Num of allocated buffers: %d\n",__func__, pCTX->v4l2_dec.mfc_num_dst_bufs);
-
-    return 0;
-
-error_case:
-    return ret;
-    }
-
-/* Initialize output stream of MFC */
-int init_mfc_output_stream(void *openHandle)
-{
-    struct v4l2_buffer buf;
-    struct v4l2_plane planes[MFC_DEC_NUM_PLANES];
-    int ret;
-    int i, j;
-    _MFCLIB *pCTX;
-    pCTX  = (_MFCLIB *) openHandle;
-
-    ret = v4l2_mfc_reqbufs(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
-                    V4L2_MEMORY_MMAP, (int *)&pCTX->v4l2_dec.mfc_num_dst_bufs);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_REQBUFS failed (destination buffers)",__func__);
-        ret = MFC_RET_DEC_INIT_FAIL;
-        goto error_case1;
-    }
-
-    for (i = 0;  i < pCTX->v4l2_dec.mfc_num_dst_bufs; ++i) {
-        ret = v4l2_mfc_querybuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
-                        V4L2_MEMORY_MMAP, i, planes);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_QUERYBUF failed (destination buffers)",__func__);
-            ret = MFC_RET_DEC_INIT_FAIL;
-            goto error_case1;
-        }
-
-        pCTX->v4l2_dec.mfc_dst_bufs_len[0] = buf.m.planes[0].length;
-        pCTX->v4l2_dec.mfc_dst_bufs_len[1] = buf.m.planes[1].length;
-
-        pCTX->v4l2_dec.mfc_dst_phys[i][0] = buf.m.planes[0].cookie;
-        pCTX->v4l2_dec.mfc_dst_phys[i][1] = buf.m.planes[1].cookie;
-
-#ifdef USE_ION
-        pCTX->dst_ion_fd[i][0] = (int)buf.m.planes[0].share;
-        pCTX->dst_ion_fd[i][1] = (int)buf.m.planes[1].share;
-
-        pCTX->v4l2_dec.mfc_dst_bufs[i][0] =
-            ion_map(pCTX->dst_ion_fd[i][0],pCTX->v4l2_dec.mfc_dst_bufs_len[0],0);
-        pCTX->v4l2_dec.mfc_dst_bufs[i][1] =
-            ion_map(pCTX->dst_ion_fd[i][1],pCTX->v4l2_dec.mfc_dst_bufs_len[1],0);
-        if (pCTX->v4l2_dec.mfc_dst_bufs[i][0] == MAP_FAILED ||
-            pCTX->v4l2_dec.mfc_dst_bufs[i][0] == MAP_FAILED)
-            goto error_case2;
-#else
-        pCTX->v4l2_dec.mfc_dst_bufs[i][0] = mmap(NULL, buf.m.planes[0].length,
-             PROT_READ | PROT_WRITE, MAP_SHARED, pCTX->hMFC, buf.m.planes[0].m.mem_offset);
-        if (pCTX->v4l2_dec.mfc_dst_bufs[i][0] == MAP_FAILED) {
-            ALOGE("[%s] mmap failed (destination buffers (Y))",__func__);
-            ret = MFC_RET_DEC_INIT_FAIL;
-            goto error_case2;
-        }
-
-        pCTX->v4l2_dec.mfc_dst_bufs[i][1] = mmap(NULL, buf.m.planes[1].length,
-        PROT_READ | PROT_WRITE, MAP_SHARED, pCTX->hMFC, buf.m.planes[1].m.mem_offset);
-        if (pCTX->v4l2_dec.mfc_dst_bufs[i][1] == MAP_FAILED) {
-            ALOGE("[%s] mmap failed (destination buffers (UV))",__func__);
-            ret = MFC_RET_DEC_INIT_FAIL;
-            goto error_case2;
-        }
-#endif
-
-        ret = v4l2_mfc_qbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
-                        V4L2_MEMORY_MMAP, i, planes, 0);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE",__func__);
-            ret = MFC_RET_DEC_INIT_FAIL;
-            goto error_case2;
-        }
-    }
-    pCTX->inter_buff_status |= MFC_USE_YUV_BUFF;
-
-    return 0;
-
-error_case2:
-    for (j = 0; j < i; j++) {
-        munmap(pCTX->v4l2_dec.mfc_dst_bufs[j][0], pCTX->v4l2_dec.mfc_dst_bufs_len[0]);
-        munmap(pCTX->v4l2_dec.mfc_dst_bufs[j][1], pCTX->v4l2_dec.mfc_dst_bufs_len[1]);
-    }
-error_case1:
-    return ret;
-}
-
-int resolution_change(void *openHandle)
-{
-    int i, ret;
-    int req_count;
-    _MFCLIB *pCTX;
-    pCTX  = (_MFCLIB *) openHandle;
-
-    ret = v4l2_mfc_streamoff(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
-    if (ret != 0)
-        goto error_case;
-
-    pCTX->inter_buff_status &= ~(MFC_USE_DST_STREAMON);
-
-    for (i = 0; i < pCTX->v4l2_dec.mfc_num_dst_bufs; i++) {
-        munmap(pCTX->v4l2_dec.mfc_dst_bufs[i][0], pCTX->v4l2_dec.mfc_dst_bufs_len[0]);
-        munmap(pCTX->v4l2_dec.mfc_dst_bufs[i][1], pCTX->v4l2_dec.mfc_dst_bufs_len[1]);
-    }
-    pCTX->inter_buff_status &= ~(MFC_USE_YUV_BUFF);
-
-    req_count = 0;
-    ret = v4l2_mfc_reqbufs(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
-                    V4L2_MEMORY_MMAP, &req_count);
-    if (ret != 0)
-        goto error_case;
-
-    read_header_data(pCTX);
-    init_mfc_output_stream(pCTX);
-
-    ret = v4l2_mfc_streamon(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
-    if (ret != 0)
-        goto error_case;
-    pCTX->inter_buff_status |= MFC_USE_DST_STREAMON;
-
-    return 0;
-
-error_case:
-    return ret;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecExe(void *openHandle, int lengthBufFill)
-{
-    _MFCLIB *pCTX;
-    int ret;
-
-    struct v4l2_buffer buf;
-    struct v4l2_plane planes[MFC_DEC_NUM_PLANES];
-    int loop_count, ctrl_value;
-
-    int poll_state;
-    int poll_revents;
-
-#ifdef CONFIG_MFC_FPS
-    framecount++;
-#endif
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    if ((lengthBufFill < 0) || (lengthBufFill > MAX_DECODER_INPUT_BUFFER_SIZE)) {
-        ALOGE("[%s] lengthBufFill is invalid. (lengthBufFill=%d)",__func__, lengthBufFill);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-#ifdef CONFIG_MFC_FPS
-    gettimeofday(&mDec1, NULL);
-#endif
-    pCTX  = (_MFCLIB *) openHandle;
-
-    if ((lengthBufFill > 0) && (SSBSIP_MFC_LAST_FRAME_PROCESSED != pCTX->lastframe)) {
-        /* Queue the stream frame */
-        ret = v4l2_mfc_qbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
-                            V4L2_MEMORY_MMAP, pCTX->v4l2_dec.beingUsedIndex, planes, lengthBufFill);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE",__func__);
-            return MFC_RET_DEC_EXE_ERR;
-        }
-
-        memset(&buf, 0, sizeof(buf));
-        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-        buf.memory = V4L2_MEMORY_MMAP;
-        buf.m.planes = planes;
-        buf.length = 1;
-
-        /* wait for decoding */
-        do {
-            poll_state = v4l2_mfc_poll(pCTX->hMFC, &poll_revents, POLL_DEC_WAIT_TIMEOUT);
-            if (poll_state > 0) {
-                if (poll_revents & POLLOUT) {
-                    ret = v4l2_mfc_dqbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_MMAP);
-                    if (ret == 0) {
-                        if (buf.flags & V4L2_BUF_FLAG_ERROR)
-                            return MFC_RET_DEC_EXE_ERR;
-                        pCTX->v4l2_dec.mfc_src_buf_flags[buf.index] = BUF_DEQUEUED;
-                        break;
-                    }
-                } else if (poll_revents & POLLERR) {
-                    ALOGE("[%s] POLLERR\n",__func__);
-                    return MFC_RET_DEC_EXE_ERR;
-                } else {
-                    ALOGE("[%s] poll() returns 0x%x\n", __func__, poll_revents);
-                    return MFC_RET_DEC_EXE_ERR;
-                }
-            } else if (poll_state < 0) {
-                return MFC_RET_DEC_EXE_ERR;
-            }
-
-            if (isBreak_loop(pCTX))
-                break;
-
-        } while(0 == poll_state);
-
-        ret = v4l2_mfc_dqbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP);
-        if (ret != 0) {
-            pCTX->displayStatus = MFC_GETOUTBUF_DECODING_ONLY;
-            pCTX->decOutInfo.disp_pic_frame_type = -1;
-            return MFC_RET_OK;
-        } else {
-            ret = v4l2_mfc_g_ctrl(pCTX->hMFC, V4L2_CID_CODEC_DISPLAY_STATUS, &ctrl_value);
-            if (ret != 0) {
-                ALOGE("[%s] VIDIOC_G_CTRL failed", __func__);
-                return MFC_RET_DEC_GET_CONF_FAIL;
-            }
-
-            switch (ctrl_value) {
-            case 0:
-                pCTX->displayStatus = MFC_GETOUTBUF_DECODING_ONLY;
-                break;
-            case 1:
-                pCTX->displayStatus = MFC_GETOUTBUF_DISPLAY_DECODING;
-                break;
-            case 2:
-                pCTX->displayStatus = MFC_GETOUTBUF_DISPLAY_ONLY;
-                break;
-            case 3:
-                pCTX->displayStatus = MFC_GETOUTBUF_CHANGE_RESOL;
-                break;
-            }
-        }
-
-        if (pCTX->displayStatus == MFC_GETOUTBUF_CHANGE_RESOL) {
-            resolution_change(pCTX);
-        } else {
-            pCTX->decOutInfo.YVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][0];
-            pCTX->decOutInfo.CVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][1];
-
-            pCTX->decOutInfo.YPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][0];
-            pCTX->decOutInfo.CPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][1];
-        }
-
-        if (SSBSIP_MFC_LAST_FRAME_RECEIVED == pCTX->lastframe)
-            pCTX->lastframe = SSBSIP_MFC_LAST_FRAME_PROCESSED;
-
-    } else if (pCTX->v4l2_dec.bBeingFinalized == 0) {
-        pCTX->lastframe = SSBSIP_MFC_LAST_FRAME_PROCESSED;
-        pCTX->v4l2_dec.bBeingFinalized = 1; /* true */
-
-        /* Queue the stream frame */
-        ret = v4l2_mfc_qbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
-                            V4L2_MEMORY_MMAP, pCTX->v4l2_dec.beingUsedIndex, planes, 0);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE",__func__);
-            return MFC_RET_DEC_EXE_ERR;
-        }
-
-        /* wait for decoding */
-        loop_count = 0;
-        do {
-            ret = v4l2_mfc_dqbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP);
-            if (ret != 0)
-                usleep(1000);
-            loop_count++;
-            if (loop_count >= 1000) {
-                ALOGE("[%s] Error in do-while loop",__func__);
-                break;
-            }
-        } while (ret != 0);
-
-        pCTX->displayStatus = MFC_GETOUTBUF_DISPLAY_ONLY;
-
-        pCTX->decOutInfo.YVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][0];
-        pCTX->decOutInfo.CVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][1];
-
-        pCTX->decOutInfo.YPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][0];
-        pCTX->decOutInfo.CPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][1];
-    } else {
-        loop_count = 0;
-        do {
-            ret = v4l2_mfc_dqbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP);
-            if (ret != 0)
-                usleep(1000);
-            loop_count++;
-            if (loop_count >= 1000) {
-                ALOGE("[%s] Error in do-while loop",__func__);
-                break;
-            }
-        } while (ret != 0);
-
-        if (buf.m.planes[0].bytesused == 0) {
-            pCTX->displayStatus = MFC_GETOUTBUF_DISPLAY_END;
-            pCTX->decOutInfo.disp_pic_frame_type = -1;
-            return MFC_RET_OK;
-        } else {
-            pCTX->displayStatus = MFC_GETOUTBUF_DISPLAY_ONLY;
-        }
-
-        pCTX->decOutInfo.YVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][0];
-        pCTX->decOutInfo.CVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][1];
-
-        pCTX->decOutInfo.YPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][0];
-        pCTX->decOutInfo.CPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][1];
-    }
-
-    pCTX->decOutInfo.disp_pic_frame_type = (buf.flags & (0x7 << 3));
-
-    switch (pCTX->decOutInfo.disp_pic_frame_type) {
-    case V4L2_BUF_FLAG_KEYFRAME:
-        pCTX->decOutInfo.disp_pic_frame_type = 1;
-        break;
-    case V4L2_BUF_FLAG_PFRAME:
-        pCTX->decOutInfo.disp_pic_frame_type = 2;
-        break;
-    case V4L2_BUF_FLAG_BFRAME:
-        pCTX->decOutInfo.disp_pic_frame_type = 3;
-        break;
-    default:
-        pCTX->decOutInfo.disp_pic_frame_type = 0;
-        break;
-    }
-
-    ret = v4l2_mfc_qbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP,
-                        buf.index, planes, 0);
-
-#ifdef CONFIG_MFC_FPS
-    gettimeofday(&mDec2, NULL);
-    if (mDec2.tv_usec-mDec1.tv_usec > 30000) over30ms++;
-#endif
-    return MFC_RET_OK;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecExeNb(void *openHandle, int lengthBufFill)
-{
-    _MFCLIB *pCTX;
-    int ret;
-
-    struct v4l2_buffer buf;
-    struct v4l2_plane planes[MFC_DEC_NUM_PLANES];
-
-#ifdef CONFIG_MFC_FPS
-    framecount++;
-#endif
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    if ((lengthBufFill < 0) || (lengthBufFill > MAX_DECODER_INPUT_BUFFER_SIZE)) {
-        ALOGE("[%s] lengthBufFill is invalid. (lengthBufFill=%d)",__func__, lengthBufFill);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    if ((lengthBufFill > 0) && (SSBSIP_MFC_LAST_FRAME_PROCESSED != pCTX->lastframe)) {
-        /* Queue the stream frame */
-        ret = v4l2_mfc_qbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
-                            V4L2_MEMORY_MMAP, pCTX->v4l2_dec.beingUsedIndex, planes, lengthBufFill);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE",__func__);
-            return MFC_RET_DEC_EXE_ERR;
-        }
-    } else if (pCTX->v4l2_dec.bBeingFinalized == 0) {
-        /* Queue the stream frame */
-        ret = v4l2_mfc_qbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
-                            V4L2_MEMORY_MMAP, pCTX->v4l2_dec.beingUsedIndex, planes, 0);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE",__func__);
-            return MFC_RET_DEC_EXE_ERR;
-        }
-    }
-
-    if ((SSBSIP_MFC_LAST_FRAME_PROCESSED != pCTX->lastframe) && (lengthBufFill == 0))
-        pCTX->lastframe = SSBSIP_MFC_LAST_FRAME_RECEIVED;
-
-    return MFC_RET_OK;
-}
-
-int isBreak_loop(void *openHandle)
-{
-    _MFCLIB *pCTX;
-    pCTX  = (_MFCLIB *) openHandle;
-    int ctrl_value;
-    int ret = 0;
-
-    if (pCTX->displayStatus == MFC_GETOUTBUF_DISPLAY_ONLY)
-        return 1;
-
-    ret = v4l2_mfc_g_ctrl(pCTX->hMFC, V4L2_CID_CODEC_CHECK_STATE, &ctrl_value);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_G_CTRL failed", __func__);
-        return 0;
-    }
-
-    if (ctrl_value == MFCSTATE_DEC_RES_DETECT) {
-        ALOGV("[%s] Resolution Change detect",__func__);
-        return 1;
-    } else if (ctrl_value == MFCSTATE_DEC_TERMINATING) {
-        ALOGV("[%s] Decoding Finish!!!",__func__);
-        return 1;
-    }
-
-    return 0;
-}
-
-SSBSIP_MFC_DEC_OUTBUF_STATUS SsbSipMfcDecWaitForOutBuf(void *openHandle, SSBSIP_MFC_DEC_OUTPUT_INFO *output_info)
-{
-    _MFCLIB *pCTX;
-    int ret;
-
-    struct v4l2_buffer buf;
-    struct v4l2_plane planes[MFC_DEC_NUM_PLANES];
-    int loop_count, ctrl_value;
-
-    int poll_state;
-    int poll_revents;
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    if (SSBSIP_MFC_LAST_FRAME_PROCESSED != pCTX->lastframe) {
-        /* wait for decoding */
-        do {
-            poll_state = v4l2_mfc_poll(pCTX->hMFC, &poll_revents, POLL_DEC_WAIT_TIMEOUT);
-            if (poll_state > 0) {
-                if (poll_revents & POLLOUT) {
-                    buf.m.planes = planes;
-                    buf.length = 1;
-                    ret = v4l2_mfc_dqbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_MMAP);
-                    if (ret == 0) {
-                        if (buf.flags & V4L2_BUF_FLAG_ERROR)
-                            return MFC_GETOUTBUF_STATUS_NULL;
-                        pCTX->v4l2_dec.mfc_src_buf_flags[buf.index] = BUF_DEQUEUED;
-                        break;
-                    }
-                } else if (poll_revents & POLLERR) {
-                    ALOGE("[%s] POLLERR\n",__func__);
-                    return MFC_GETOUTBUF_STATUS_NULL;
-                } else {
-                    ALOGE("[%s] poll() returns 0x%x\n", __func__, poll_revents);
-                    return MFC_GETOUTBUF_STATUS_NULL;
-                }
-            } else if (poll_state < 0) {
-                return MFC_GETOUTBUF_STATUS_NULL;
-            }
-
-            if (isBreak_loop(pCTX))
-                break;
-
-        } while (poll_state == 0);
-
-        ret = v4l2_mfc_dqbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP);
-        if (ret != 0) {
-            pCTX->displayStatus = MFC_GETOUTBUF_DECODING_ONLY;
-            pCTX->decOutInfo.disp_pic_frame_type = -1;
-            return SsbSipMfcDecGetOutBuf(pCTX, output_info);;
-        } else {
-            ret = v4l2_mfc_g_ctrl(pCTX->hMFC, V4L2_CID_CODEC_DISPLAY_STATUS, &ctrl_value);
-            if (ret != 0) {
-                ALOGE("[%s] VIDIOC_G_CTRL failed", __func__);
-                return MFC_RET_DEC_GET_CONF_FAIL;
-            }
-
-            switch (ctrl_value) {
-            case 0:
-                pCTX->displayStatus = MFC_GETOUTBUF_DECODING_ONLY;
-                break;
-            case 1:
-                pCTX->displayStatus = MFC_GETOUTBUF_DISPLAY_DECODING;
-                break;
-            case 2:
-                pCTX->displayStatus = MFC_GETOUTBUF_DISPLAY_ONLY;
-                break;
-            case 3:
-                pCTX->displayStatus = MFC_GETOUTBUF_CHANGE_RESOL;
-                break;
-            }
-        }
-
-        if (pCTX->displayStatus == MFC_GETOUTBUF_CHANGE_RESOL) {
-            resolution_change(pCTX);
-        } else {
-            pCTX->decOutInfo.YVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][0];
-            pCTX->decOutInfo.CVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][1];
-
-            pCTX->decOutInfo.YPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][0];
-            pCTX->decOutInfo.CPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][1];
-        }
-
-        if (SSBSIP_MFC_LAST_FRAME_RECEIVED == pCTX->lastframe)
-            pCTX->lastframe = SSBSIP_MFC_LAST_FRAME_PROCESSED;
-    } else if (pCTX->v4l2_dec.bBeingFinalized == 0) {
-        pCTX->lastframe = SSBSIP_MFC_LAST_FRAME_PROCESSED;
-        pCTX->v4l2_dec.bBeingFinalized = 1; /* true */
-
-        /* wait for decoding */
-        loop_count = 0;
-        do {
-            ret = v4l2_mfc_dqbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP);
-            if (ret != 0)
-                usleep(1000);
-            loop_count++;
-            if (loop_count >= 1000) {
-                ALOGE("[%s] Error in do-while loop",__func__);
-                break;
-            }
-        } while (ret != 0);
-
-        pCTX->displayStatus = MFC_GETOUTBUF_DISPLAY_ONLY;
-
-        pCTX->decOutInfo.YVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][0];
-        pCTX->decOutInfo.CVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][1];
-
-        pCTX->decOutInfo.YPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][0];
-        pCTX->decOutInfo.CPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][1];
-    } else {
-        loop_count = 0;
-        do {
-            ret = v4l2_mfc_dqbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP);
-            if (ret != 0)
-                usleep(1000);
-            loop_count++;
-            if (loop_count >= 1000) {
-                ALOGE("[%s] Error in do-while loop",__func__);
-                break;
-            }
-        } while (ret != 0);
-
-        if (buf.m.planes[0].bytesused == 0) {
-            pCTX->displayStatus = MFC_GETOUTBUF_DISPLAY_END;
-            pCTX->decOutInfo.disp_pic_frame_type = -1;
-            return SsbSipMfcDecGetOutBuf(pCTX, output_info);;
-        } else {
-            pCTX->displayStatus = MFC_GETOUTBUF_DISPLAY_ONLY;
-        }
-
-        pCTX->decOutInfo.YVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][0];
-        pCTX->decOutInfo.CVirAddr = pCTX->v4l2_dec.mfc_dst_bufs[buf.index][1];
-
-        pCTX->decOutInfo.YPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][0];
-        pCTX->decOutInfo.CPhyAddr = (unsigned int)pCTX->v4l2_dec.mfc_dst_phys[buf.index][1];
-    }
-
-    pCTX->decOutInfo.disp_pic_frame_type = (buf.flags & (0x7 << 3));
-
-    switch (pCTX->decOutInfo.disp_pic_frame_type) {
-    case V4L2_BUF_FLAG_KEYFRAME:
-        pCTX->decOutInfo.disp_pic_frame_type = 1;
-        break;
-    case V4L2_BUF_FLAG_PFRAME:
-        pCTX->decOutInfo.disp_pic_frame_type = 2;
-        break;
-    case V4L2_BUF_FLAG_BFRAME:
-        pCTX->decOutInfo.disp_pic_frame_type = 3;
-        break;
-    default:
-        pCTX->decOutInfo.disp_pic_frame_type = 0;
-        break;
-    }
-
-    ret = v4l2_mfc_qbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP,
-                        buf.index, planes, 0);
-
-    return SsbSipMfcDecGetOutBuf(pCTX, output_info);
-}
-
-void  *SsbSipMfcDecGetInBuf(void *openHandle, void **phyInBuf, int inputBufferSize)
-{
-    _MFCLIB *pCTX;
-    int i;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL",__func__);
-        return NULL;
-    }
-
-    if ((inputBufferSize < 0) || (inputBufferSize > MAX_DECODER_INPUT_BUFFER_SIZE)) {
-        ALOGE("[%s] inputBufferSize = %d is invalid",__func__, inputBufferSize);
-        return NULL;
-    }
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    for (i = 0; i < MFC_DEC_NUM_SRC_BUFS; i++)
-        if (BUF_DEQUEUED == pCTX->v4l2_dec.mfc_src_buf_flags[i])
-            break;
-
-    if (i == MFC_DEC_NUM_SRC_BUFS) {
-        ALOGV("[%s] No buffer is available.",__func__);
-        return NULL;
-    } else {
-        pCTX->virStrmBuf = (unsigned int)pCTX->v4l2_dec.mfc_src_bufs[i];
-        pCTX->v4l2_dec.beingUsedIndex = i;
-        /* Set the buffer flag as Enqueued for NB_mode_process*/
-        /* FIXME: Check this assignment in case of using New API ExeNb() */
-        pCTX->v4l2_dec.mfc_src_buf_flags[i] = BUF_ENQUEUED;
-    }
-
-    return (void *)pCTX->virStrmBuf;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecSetInBuf(void *openHandle, void *phyInBuf, void *virInBuf, int size)
-{
-    _MFCLIB *pCTX;
-    int i;
-
-    ALOGV("[%s] Enter",__func__);
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    for (i = 0; i < MFC_DEC_NUM_SRC_BUFS; i++) {
-        if (pCTX->v4l2_dec.mfc_src_bufs[i] == virInBuf)
-            break;
-    }
-
-    if (i == MFC_DEC_NUM_SRC_BUFS) {
-        ALOGE("[%s] Can not use the buffer",__func__);
-        return MFC_RET_INVALID_PARAM;
-    } else {
-        pCTX->virStrmBuf = (unsigned int)virInBuf;
-        pCTX->v4l2_dec.beingUsedIndex = i;
-        pCTX->v4l2_dec.mfc_src_buf_flags[i] = BUF_ENQUEUED;
-    }
-    ALOGV("[%s] Exit idx %d",__func__,pCTX->v4l2_dec.beingUsedIndex);
-    return MFC_RET_OK;
-}
-
-SSBSIP_MFC_DEC_OUTBUF_STATUS SsbSipMfcDecGetOutBuf(void *openHandle, SSBSIP_MFC_DEC_OUTPUT_INFO *output_info)
-{
-    _MFCLIB *pCTX;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL",__func__);
-        return MFC_GETOUTBUF_DISPLAY_END;
-    }
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    output_info->YPhyAddr = pCTX->decOutInfo.YPhyAddr;
-    output_info->CPhyAddr = pCTX->decOutInfo.CPhyAddr;
-
-    output_info->YVirAddr = pCTX->decOutInfo.YVirAddr;
-    output_info->CVirAddr = pCTX->decOutInfo.CVirAddr;
-
-    output_info->img_width = pCTX->decOutInfo.img_width;
-    output_info->img_height= pCTX->decOutInfo.img_height;
-
-    output_info->buf_width = pCTX->decOutInfo.buf_width;
-    output_info->buf_height= pCTX->decOutInfo.buf_height;
-
-    output_info->crop_right_offset =  pCTX->decOutInfo.crop_right_offset;
-    output_info->crop_left_offset =  pCTX->decOutInfo.crop_left_offset;
-    output_info->crop_bottom_offset = pCTX->decOutInfo.crop_bottom_offset;
-    output_info->crop_top_offset = pCTX->decOutInfo.crop_top_offset;
-
-    output_info->disp_pic_frame_type = pCTX->decOutInfo.disp_pic_frame_type;
-
-    switch (pCTX->displayStatus) {
-    case MFC_GETOUTBUF_DISPLAY_ONLY:
-    case MFC_GETOUTBUF_DISPLAY_DECODING:
-    case MFC_GETOUTBUF_DISPLAY_END:
-    case MFC_GETOUTBUF_DECODING_ONLY:
-    case MFC_GETOUTBUF_CHANGE_RESOL:
-        break;
-    default:
-        return MFC_GETOUTBUF_DISPLAY_END;
-    }
-
-    return pCTX->displayStatus;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecSetConfig(void *openHandle, SSBSIP_MFC_DEC_CONF conf_type, void *value)
-{
-    int ret, i;
-
-    _MFCLIB *pCTX;
-    struct mfc_dec_fimv1_info *fimv1_res;
-
-    struct v4l2_buffer buf;
-    struct v4l2_plane planes[MFC_DEC_NUM_PLANES];
-
-    int id, ctrl_value;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    if ((value == NULL) && (MFC_DEC_SETCONF_IS_LAST_FRAME !=conf_type)) {
-        ALOGE("[%s] value is NULL",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX = (_MFCLIB *) openHandle;
-
-    /* First, process non-ioctl calling settings */
-    switch (conf_type) {
-    case MFC_DEC_SETCONF_EXTRA_BUFFER_NUM:
-        pCTX->dec_numextradpb = *((unsigned int *) value);
-        return MFC_RET_OK;
-
-    case MFC_DEC_SETCONF_FIMV1_WIDTH_HEIGHT: /* be set before calling SsbSipMfcDecInit */
-         fimv1_res = (struct mfc_dec_fimv1_info *)value;
-         ALOGI("fimv1->width  = %d\n", fimv1_res->width);
-         ALOGI("fimv1->height = %d\n", fimv1_res->height);
-         pCTX->fimv1_res.width  = (int)(fimv1_res->width);
-         pCTX->fimv1_res.height = (int)(fimv1_res->height);
-         return MFC_RET_OK;
-
-    case MFC_DEC_SETCONF_IS_LAST_FRAME:
-        if (SSBSIP_MFC_LAST_FRAME_PROCESSED != pCTX->lastframe) {
-            pCTX->lastframe = SSBSIP_MFC_LAST_FRAME_RECEIVED;
-            return MFC_RET_OK;
-        } else {
-            return MFC_RET_FAIL;
-        }
-
-    case MFC_DEC_SETCONF_DPB_FLUSH:
-        ret = v4l2_mfc_streamoff(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_STREAMOFF failed (destination buffers)",__func__);
-            return MFC_RET_DEC_SET_CONF_FAIL;
-        }
-        pCTX->inter_buff_status &= ~(MFC_USE_DST_STREAMON);
-
-        for (i = 0;  i < pCTX->v4l2_dec.mfc_num_dst_bufs; ++i) {
-            ret = v4l2_mfc_qbuf(pCTX->hMFC, &buf, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
-                        V4L2_MEMORY_MMAP, i, planes, 0);
-            if (ret != 0) {
-                ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE",__func__);
-                return MFC_RET_DEC_SET_CONF_FAIL;
-            }
-        }
-
-        ret = v4l2_mfc_streamon(pCTX->hMFC, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_STREAMON failed (destination buffers)",__func__);
-            return MFC_RET_DEC_SET_CONF_FAIL;
-        }
-        pCTX->inter_buff_status |= MFC_USE_DST_STREAMON;
-        return MFC_RET_OK;
-    default:
-        /* Others will be processed next */
-        break;
-    }
-
-    /* Process ioctl calling settings */
-    switch (conf_type) {
-    case MFC_DEC_SETCONF_DISPLAY_DELAY: /* be set before calling SsbSipMfcDecInit */
-        id = V4L2_CID_CODEC_DISPLAY_DELAY;
-        ctrl_value = *((unsigned int *) value);
-        break;
-
-    case MFC_DEC_SETCONF_CRC_ENABLE:
-        id = V4L2_CID_CODEC_CRC_ENABLE;
-        ctrl_value = 1;
-        break;
-
-    case MFC_DEC_SETCONF_SLICE_ENABLE:
-        id = V4L2_CID_CODEC_SLICE_INTERFACE;
-        ctrl_value = 1;
-        break;
-
-    case MFC_DEC_SETCONF_FRAME_TAG: /*be set before calling SsbSipMfcDecExe */
-        id = V4L2_CID_CODEC_FRAME_TAG;
-        ctrl_value = *((unsigned int*)value);
-        break;
-
-    case MFC_DEC_SETCONF_POST_ENABLE:
-        id = V4L2_CID_CODEC_LOOP_FILTER_MPEG4_ENABLE;
-        ctrl_value = *((unsigned int*)value);
-        break;
-
-    default:
-        ALOGE("[%s] conf_type(%d) is NOT supported",__func__, conf_type);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    ret = v4l2_mfc_s_ctrl(pCTX->hMFC, id, ctrl_value);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_S_CTRL failed (conf_type = %d)",__func__, conf_type);
-        return MFC_RET_DEC_SET_CONF_FAIL;
-    }
-
-    return MFC_RET_OK;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecGetConfig(void *openHandle, SSBSIP_MFC_DEC_CONF conf_type, void *value)
-{
-    _MFCLIB *pCTX;
-
-    SSBSIP_MFC_IMG_RESOLUTION *img_resolution;
-    int ret;
-    SSBSIP_MFC_CRC_DATA *crc_data;
-    SSBSIP_MFC_CROP_INFORMATION *crop_information;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    if (value == NULL) {
-        ALOGE("[%s] value is NULL",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX = (_MFCLIB *) openHandle;
-
-    switch (conf_type) {
-    case MFC_DEC_GETCONF_BUF_WIDTH_HEIGHT:
-        img_resolution = (SSBSIP_MFC_IMG_RESOLUTION *)value;
-        img_resolution->width = pCTX->decOutInfo.img_width;
-        img_resolution->height = pCTX->decOutInfo.img_height;
-        img_resolution->buf_width = pCTX->decOutInfo.buf_width;
-        img_resolution->buf_height = pCTX->decOutInfo.buf_height;
-        break;
-
-    case MFC_DEC_GETCONF_FRAME_TAG:
-        ret = v4l2_mfc_g_ctrl(pCTX->hMFC, V4L2_CID_CODEC_FRAME_TAG, (int*)value);
-        if (ret != 0)
-            ALOGE("[%s] VIDIOC_G_CTRL failed, V4L2_CID_CODEC_FRAME_TAG", __func__);
-        break;
-
-    case MFC_DEC_GETCONF_CRC_DATA:
-        crc_data = (SSBSIP_MFC_CRC_DATA *) value;
-
-        ret = v4l2_mfc_g_ctrl(pCTX->hMFC, V4L2_CID_CODEC_CRC_DATA_LUMA, &crc_data->luma0);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_G_CTRL failed, V4L2_CID_CODEC_CRC_DATA_LUMA",__func__);
-            return MFC_RET_DEC_GET_CONF_FAIL;
-        }
-
-        ret = v4l2_mfc_g_ctrl(pCTX->hMFC, V4L2_CID_CODEC_CRC_DATA_CHROMA, &crc_data->chroma0);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_G_CTRL failed, V4L2_CID_CODEC_CRC_DATA_CHROMA",__func__);
-            return MFC_RET_DEC_GET_CONF_FAIL;
-        }
-        ALOGI("[%s] crc_data->luma0=0x%x\n", __func__, crc_data->luma0);
-        ALOGI("[%s] crc_data->chroma0=0x%x\n", __func__, crc_data->chroma0);
-        break;
-
-    case MFC_DEC_GETCONF_CROP_INFO:
-        crop_information = (SSBSIP_MFC_CROP_INFORMATION *)value;
-        crop_information->crop_top_offset = pCTX->decOutInfo.crop_top_offset;
-        crop_information->crop_bottom_offset = pCTX->decOutInfo.crop_bottom_offset;
-        crop_information->crop_left_offset = pCTX->decOutInfo.crop_left_offset;
-        crop_information->crop_right_offset = pCTX->decOutInfo.crop_right_offset;
-        break;
-
-    default:
-        ALOGE("[%s] conf_type(%d) is NOT supported",__func__, conf_type);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    return MFC_RET_OK;
-}
diff --git a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/enc/src/SsbSipMfcEncAPI.c b/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/enc/src/SsbSipMfcEncAPI.c
deleted file mode 100644
index 413e734..0000000
--- a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/enc/src/SsbSipMfcEncAPI.c
+++ /dev/null
@@ -1,1318 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <fcntl.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-
-#include <sys/poll.h>
-#include "videodev2.h"
-
-#include "mfc_interface.h"
-#include "SsbSipMfcApi.h"
-
-/* #define LOG_NDEBUG 0 */
-#define LOG_TAG "MFC_ENC_APP"
-#include <utils/Log.h>
-
-#define POLL_ENC_WAIT_TIMEOUT 25
-
-#ifndef true
-#define true  (1)
-#endif
-
-#ifndef false
-#define false (0)
-#endif
-
-#define MAX_STREAM_SIZE (2*1024*1024)
-
-static char *mfc_dev_name = SAMSUNG_MFC_DEV_NAME;
-static int mfc_dev_node = 7;
-
-static void getMFCName(char *devicename, int size)
-{
-    snprintf(devicename, size, "%s%d", SAMSUNG_MFC_DEV_NAME, mfc_dev_node);
-}
-
-void SsbSipMfcEncSetMFCName(char *devicename)
-{
-    mfc_dev_name = devicename;
-}
-
-void *SsbSipMfcEncOpen(void)
-{
-    int hMFCOpen;
-    _MFCLIB *pCTX;
-
-    char mfc_dev_name[64];
-
-    int ret;
-    struct v4l2_capability cap;
-
-    ALOGI("[%s] MFC Library Ver %d.%02d",__func__, MFC_LIB_VER_MAJOR, MFC_LIB_VER_MINOR);
-    getMFCName(mfc_dev_name, 64);
-    ALOGI("[%s] dev name is %s\n",__func__,mfc_dev_name);
-
-    if (access(mfc_dev_name, F_OK) != 0) {
-        ALOGE("[%s] MFC device node not exists",__func__);
-        return NULL;
-    }
-
-    hMFCOpen = open(mfc_dev_name, O_RDWR | O_NONBLOCK, 0);
-    if (hMFCOpen < 0) {
-        ALOGE("[%s] Failed to open MFC device",__func__);
-        return NULL;
-    }
-
-    pCTX = (_MFCLIB *)malloc(sizeof(_MFCLIB));
-    if (pCTX == NULL) {
-        ALOGE("[%s] malloc failed.",__func__);
-        return NULL;
-    }
-    memset(pCTX, 0, sizeof(_MFCLIB));
-
-    pCTX->hMFC = hMFCOpen;
-
-    memset(&cap, 0, sizeof(cap));
-    ret = ioctl(pCTX->hMFC, VIDIOC_QUERYCAP, &cap);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_QUERYCAP failed",__func__);
-        close(pCTX->hMFC);
-        free(pCTX);
-        return NULL;
-    }
-
-    if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
-        ALOGE("[%s] Device does not support capture",__func__);
-        close(pCTX->hMFC);
-        free(pCTX);
-        return NULL;
-    }
-
-    if (!(cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) {
-        ALOGE("[%s] Device does not support output",__func__);
-        close(pCTX->hMFC);
-        free(pCTX);
-        return NULL;
-    }
-
-    if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
-        ALOGE("[%s] Device does not support streaming",__func__);
-        close(pCTX->hMFC);
-        free(pCTX);
-        return NULL;
-    }
-
-    pCTX->v4l2_enc.bRunning = 0;
-    /* physical address is used for Input source */
-    pCTX->v4l2_enc.bInputPhyVir = 1;
-
-    pCTX->cacheablebuffer = NO_CACHE;
-
-    return (void *)pCTX;
-}
-
-void *SsbSipMfcEncOpenExt(void *value)
-{
-    _MFCLIB *pCTX;
-
-    pCTX = SsbSipMfcEncOpen();
-    if (pCTX == NULL)
-        return NULL;
-
-    if (NO_CACHE == (*(SSBIP_MFC_BUFFER_TYPE *)value)) {
-        pCTX->cacheablebuffer = NO_CACHE;
-        /* physical address is used for Input source */
-        pCTX->v4l2_enc.bInputPhyVir = 1;
-        ALOGI("[%s] non cacheable buffer",__func__);
-    }
-    else {
-        pCTX->cacheablebuffer = CACHE;
-        /* vitual address is used for Input source */
-        pCTX->v4l2_enc.bInputPhyVir = 0;
-        ALOGI("[%s] cacheable buffer",__func__);
-    }
-
-    return (void *)pCTX;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncClose(void *openHandle)
-{
-    _MFCLIB *pCTX;
-    int ret, i;
-
-    enum v4l2_buf_type type;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX = (_MFCLIB *) openHandle;
-
-    if (pCTX->inter_buff_status & MFC_USE_DST_STREAMON) {
-        type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-        ret = ioctl(pCTX->hMFC, VIDIOC_STREAMOFF, &type);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_STREAMOFF failed (destination buffers)",__func__);
-            return MFC_RET_CLOSE_FAIL;
-        }
-        pCTX->inter_buff_status &= ~(MFC_USE_DST_STREAMON);
-    }
-
-    if (pCTX->inter_buff_status & MFC_USE_SRC_STREAMON) {
-        type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-        ret = ioctl(pCTX->hMFC, VIDIOC_STREAMOFF, &type);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_STREAMOFF failed (source buffers)",__func__);
-            return MFC_RET_CLOSE_FAIL;
-        }
-        pCTX->inter_buff_status &= ~(MFC_USE_SRC_STREAMON);
-    }
-
-    if (!pCTX->v4l2_enc.bInputPhyVir) {
-        for (i = 0; i < pCTX->v4l2_enc.mfc_num_src_bufs; i++) {
-            munmap(pCTX->v4l2_enc.mfc_src_bufs[i][0], pCTX->v4l2_enc.mfc_src_bufs_len[0]);
-            munmap(pCTX->v4l2_enc.mfc_src_bufs[i][1], pCTX->v4l2_enc.mfc_src_bufs_len[1]);
-        }
-    }
-
-    for (i = 0; i < pCTX->v4l2_enc.mfc_num_dst_bufs; i++)
-        munmap(pCTX->v4l2_enc.mfc_dst_bufs[i], pCTX->v4l2_enc.mfc_dst_bufs_len);
-
-    pCTX->inter_buff_status = MFC_USE_NONE;
-
-    close(pCTX->hMFC);
-
-    free(pCTX);
-
-    return MFC_RET_OK;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncInit(void *openHandle, void *param)
-{
-    int ret, i, j,index;
-    _MFCLIB *pCTX;
-
-    enum v4l2_buf_type type;
-    struct v4l2_format fmt;
-    struct v4l2_plane planes[MFC_ENC_NUM_PLANES];
-
-    struct v4l2_buffer buf;
-    struct v4l2_requestbuffers reqbuf;
-
-    struct v4l2_control ctrl;
-
-    struct pollfd poll_events;
-    int poll_state;
-
-    struct v4l2_ext_control ext_ctrl_mpeg4[28];
-    struct v4l2_ext_control ext_ctrl_h263[20];
-    struct v4l2_ext_control ext_ctrl[48];
-    struct v4l2_ext_controls ext_ctrls;
-
-    SSBSIP_MFC_ENC_H264_PARAM *h264_arg;
-    SSBSIP_MFC_ENC_MPEG4_PARAM *mpeg4_arg;
-    SSBSIP_MFC_ENC_H263_PARAM *h263_arg;
-
-    if (openHandle == NULL) {
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    mpeg4_arg = (SSBSIP_MFC_ENC_MPEG4_PARAM*)param;
-    if (mpeg4_arg->codecType == MPEG4_ENC) {
-        pCTX->codecType= MPEG4_ENC;
-        pCTX->width = mpeg4_arg->SourceWidth;
-        pCTX->height = mpeg4_arg->SourceHeight;
-        pCTX->framemap = mpeg4_arg->FrameMap;
-    } else {
-        h263_arg = (SSBSIP_MFC_ENC_H263_PARAM*)param;
-        if (h263_arg->codecType == H263_ENC) {
-            pCTX->codecType = H263_ENC;
-            pCTX->width = h263_arg->SourceWidth;
-            pCTX->height = h263_arg->SourceHeight;
-            pCTX->framemap = h263_arg->FrameMap;
-        } else {
-            h264_arg = (SSBSIP_MFC_ENC_H264_PARAM*)param;
-            if (h264_arg->codecType == H264_ENC) {
-                pCTX->codecType = H264_ENC;
-                pCTX->width = h264_arg->SourceWidth;
-                pCTX->height = h264_arg->SourceHeight;
-                pCTX->framemap = h264_arg->FrameMap;
-            } else {
-                ALOGE("[%s] Undefined codec type \n",__func__);
-                ret = MFC_RET_INVALID_PARAM;
-                goto error_case1;
-            }
-        }
-    }
-
-    switch (pCTX->codecType) {
-    case MPEG4_ENC:
-        ext_ctrl_mpeg4[0].id = V4L2_CID_CODEC_MFC5X_ENC_MPEG4_PROFILE;
-        ext_ctrl_mpeg4[0].value = mpeg4_arg->ProfileIDC;
-        ext_ctrl_mpeg4[1].id = V4L2_CID_CODEC_MFC5X_ENC_MPEG4_LEVEL;
-        ext_ctrl_mpeg4[1].value = mpeg4_arg->LevelIDC;
-        ext_ctrl_mpeg4[2].id = V4L2_CID_CODEC_MFC5X_ENC_GOP_SIZE;
-        ext_ctrl_mpeg4[2].value = mpeg4_arg->IDRPeriod;
-        ext_ctrl_mpeg4[3].id = V4L2_CID_CODEC_MFC5X_ENC_MPEG4_QUARTER_PIXEL;
-        ext_ctrl_mpeg4[3].value = mpeg4_arg->DisableQpelME;
-
-        ext_ctrl_mpeg4[4].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MODE;
-        ext_ctrl_mpeg4[4].value = mpeg4_arg->SliceMode; /* 0: one, 1: fixed #mb, 3: fixed #bytes */
-        if (mpeg4_arg->SliceMode == 0) {
-            ext_ctrl_mpeg4[5].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MB;
-            ext_ctrl_mpeg4[5].value = 1;  /* default */
-            ext_ctrl_mpeg4[6].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_BIT;
-            ext_ctrl_mpeg4[6].value = 2800; /* based on MFC6.x */
-        } else if (mpeg4_arg->SliceMode == 1) {
-            ext_ctrl_mpeg4[5].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MB;
-            ext_ctrl_mpeg4[5].value = mpeg4_arg->SliceArgument;
-            ext_ctrl_mpeg4[6].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_BIT;
-            ext_ctrl_mpeg4[6].value = 2800; /* based on MFC6.x */
-        } else if (mpeg4_arg->SliceMode == 3) {
-            ext_ctrl_mpeg4[5].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MB;
-            ext_ctrl_mpeg4[5].value = 1; /* default */
-            ext_ctrl_mpeg4[6].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_BIT;
-            ext_ctrl_mpeg4[6].value = mpeg4_arg->SliceArgument;
-        }
-        /*
-        It should be set using mpeg4_arg->NumberBFrames after being handled by appl.
-         */
-        ext_ctrl_mpeg4[7].id =  V4L2_CID_CODEC_MFC5X_ENC_MPEG4_B_FRAMES;
-        ext_ctrl_mpeg4[7].value = mpeg4_arg->NumberBFrames;
-        ext_ctrl_mpeg4[8].id = V4L2_CID_CODEC_MFC5X_ENC_INTRA_REFRESH_MB;
-        ext_ctrl_mpeg4[8].value = mpeg4_arg->RandomIntraMBRefresh;
-
-        ext_ctrl_mpeg4[9].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_CTRL_ENABLE;
-        ext_ctrl_mpeg4[9].value = mpeg4_arg->PadControlOn;
-        ext_ctrl_mpeg4[10].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_LUMA_VALUE;
-        ext_ctrl_mpeg4[10].value = mpeg4_arg->LumaPadVal;
-        ext_ctrl_mpeg4[11].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_CB_VALUE;
-        ext_ctrl_mpeg4[11].value = mpeg4_arg->CbPadVal;
-        ext_ctrl_mpeg4[12].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_CR_VALUE;
-        ext_ctrl_mpeg4[12].value = mpeg4_arg->CrPadVal;
-
-        ext_ctrl_mpeg4[13].id = V4L2_CID_CODEC_MFC5X_ENC_RC_FRAME_ENABLE;
-        ext_ctrl_mpeg4[13].value = mpeg4_arg->EnableFRMRateControl;
-        ext_ctrl_mpeg4[14].id = V4L2_CID_CODEC_MFC5X_ENC_MPEG4_VOP_TIME_RES;
-        ext_ctrl_mpeg4[14].value = mpeg4_arg->TimeIncreamentRes;
-        ext_ctrl_mpeg4[15].id = V4L2_CID_CODEC_MFC5X_ENC_MPEG4_VOP_FRM_DELTA;
-        ext_ctrl_mpeg4[15].value = mpeg4_arg->VopTimeIncreament;
-        ext_ctrl_mpeg4[16].id = V4L2_CID_CODEC_MFC5X_ENC_RC_BIT_RATE;
-        ext_ctrl_mpeg4[16].value = mpeg4_arg->Bitrate;
-
-        ext_ctrl_mpeg4[17].id = V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_FRAME_QP;
-        ext_ctrl_mpeg4[17].value = mpeg4_arg->FrameQp;
-        ext_ctrl_mpeg4[18].id =  V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_P_FRAME_QP;
-        ext_ctrl_mpeg4[18].value = mpeg4_arg->FrameQp_P;
-        ext_ctrl_mpeg4[19].id =  V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_B_FRAME_QP;
-        ext_ctrl_mpeg4[19].value = mpeg4_arg->FrameQp_B;
-
-        ext_ctrl_mpeg4[20].id =  V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_MAX_QP;
-        ext_ctrl_mpeg4[20].value = mpeg4_arg->QSCodeMax;
-        ext_ctrl_mpeg4[21].id = V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_MIN_QP;
-        ext_ctrl_mpeg4[21].value = mpeg4_arg->QSCodeMin;
-        ext_ctrl_mpeg4[22].id = V4L2_CID_CODEC_MFC5X_ENC_RC_REACTION_COEFF;
-        ext_ctrl_mpeg4[22].value = mpeg4_arg->CBRPeriodRf;
-
-        if (V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_LEVEL == pCTX->enc_frameskip) {
-            ext_ctrl_mpeg4[23].id = V4L2_CID_CODEC_MFC5X_ENC_FRAME_SKIP_MODE;
-            ext_ctrl_mpeg4[23].value = V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_LEVEL;
-        } else if (V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_VBV_BUF_SIZE == pCTX->enc_frameskip) {
-            ext_ctrl_mpeg4[23].id = V4L2_CID_CODEC_MFC5X_ENC_FRAME_SKIP_MODE;
-            ext_ctrl_mpeg4[23].value = V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_VBV_BUF_SIZE;
-        } else { /* ENC_FRAME_SKIP_MODE_DISABLE (default) */
-            ext_ctrl_mpeg4[23].id = V4L2_CID_CODEC_MFC5X_ENC_FRAME_SKIP_MODE;
-            ext_ctrl_mpeg4[23].value = V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_DISABLE;
-        }
-
-        ext_ctrl_mpeg4[24].id = V4L2_CID_CODEC_MFC5X_ENC_VBV_BUF_SIZE;
-        ext_ctrl_mpeg4[24].value = 0;
-
-        ext_ctrl_mpeg4[25].id = V4L2_CID_CODEC_MFC5X_ENC_SEQ_HDR_MODE;
-        ext_ctrl_mpeg4[25].value = 0;
-
-        ext_ctrl_mpeg4[26].id = V4L2_CID_CODEC_MFC5X_ENC_RC_FIXED_TARGET_BIT;
-        ext_ctrl_mpeg4[26].value = V4L2_CODEC_MFC5X_ENC_SW_ENABLE;
-
-        ext_ctrl_mpeg4[27].id = V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_MB_ENABLE; /* MFC 6.x Only */
-        ext_ctrl_mpeg4[27].value = mpeg4_arg->EnableMBRateControl;
-        break;
-
-    case H263_ENC:
-        ext_ctrl_h263[0].id = V4L2_CID_CODEC_MFC5X_ENC_GOP_SIZE;
-        ext_ctrl_h263[0].value = h263_arg->IDRPeriod;
-
-        ext_ctrl_h263[1].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MODE;
-        ext_ctrl_h263[1].value = h263_arg->SliceMode; /* 0: one, Check is needed if h264 support multi-slice */
-
-        ext_ctrl_h263[2].id = V4L2_CID_CODEC_MFC5X_ENC_INTRA_REFRESH_MB;
-        ext_ctrl_h263[2].value = h263_arg->RandomIntraMBRefresh;
-
-        ext_ctrl_h263[3].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_CTRL_ENABLE;
-        ext_ctrl_h263[3].value = h263_arg->PadControlOn;
-        ext_ctrl_h263[4].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_LUMA_VALUE;
-        ext_ctrl_h263[4].value = h263_arg->LumaPadVal;
-        ext_ctrl_h263[5].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_CB_VALUE;
-        ext_ctrl_h263[5].value = h263_arg->CbPadVal;
-        ext_ctrl_h263[6].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_CR_VALUE;
-        ext_ctrl_h263[6].value = h263_arg->CrPadVal;
-
-        ext_ctrl_h263[7].id = V4L2_CID_CODEC_MFC5X_ENC_RC_FRAME_ENABLE;
-        ext_ctrl_h263[7].value = h263_arg->EnableFRMRateControl;
-
-        ext_ctrl_h263[8].id = V4L2_CID_CODEC_MFC5X_ENC_H263_RC_FRAME_RATE;
-        ext_ctrl_h263[8].value = h263_arg->FrameRate;
-
-        ext_ctrl_h263[9].id = V4L2_CID_CODEC_MFC5X_ENC_RC_BIT_RATE;
-        ext_ctrl_h263[9].value = h263_arg->Bitrate;
-
-        ext_ctrl_h263[10].id = V4L2_CID_CODEC_MFC5X_ENC_H263_RC_FRAME_QP;
-        ext_ctrl_h263[10].value = h263_arg->FrameQp;
-        ext_ctrl_h263[11].id =  V4L2_CID_CODEC_MFC5X_ENC_H263_RC_P_FRAME_QP;
-        ext_ctrl_h263[11].value = h263_arg->FrameQp_P;
-
-        ext_ctrl_h263[12].id =  V4L2_CID_CODEC_MFC5X_ENC_H263_RC_MAX_QP;
-        ext_ctrl_h263[12].value = h263_arg->QSCodeMax;
-        ext_ctrl_h263[13].id = V4L2_CID_CODEC_MFC5X_ENC_H263_RC_MIN_QP;
-        ext_ctrl_h263[13].value = h263_arg->QSCodeMin;
-        ext_ctrl_h263[14].id = V4L2_CID_CODEC_MFC5X_ENC_RC_REACTION_COEFF;
-        ext_ctrl_h263[14].value = h263_arg->CBRPeriodRf;
-
-        if (V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_LEVEL == pCTX->enc_frameskip) {
-            ext_ctrl_h263[15].id = V4L2_CID_CODEC_MFC5X_ENC_FRAME_SKIP_MODE;
-            ext_ctrl_h263[15].value = V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_LEVEL;
-        } else if (V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_VBV_BUF_SIZE == pCTX->enc_frameskip) {
-            ext_ctrl_h263[15].id = V4L2_CID_CODEC_MFC5X_ENC_FRAME_SKIP_MODE;
-            ext_ctrl_h263[15].value = V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_VBV_BUF_SIZE;
-        } else { /* ENC_FRAME_SKIP_MODE_DISABLE (default) */
-            ext_ctrl_h263[15].id = V4L2_CID_CODEC_MFC5X_ENC_FRAME_SKIP_MODE;
-            ext_ctrl_h263[15].value = V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_DISABLE;
-        }
-
-        ext_ctrl_h263[16].id = V4L2_CID_CODEC_MFC5X_ENC_VBV_BUF_SIZE;
-        ext_ctrl_h263[16].value = 0;
-
-        ext_ctrl_h263[17].id = V4L2_CID_CODEC_MFC5X_ENC_SEQ_HDR_MODE;
-        ext_ctrl_h263[17].value = 0;
-
-        ext_ctrl_h263[18].id = V4L2_CID_CODEC_MFC5X_ENC_RC_FIXED_TARGET_BIT;
-        ext_ctrl_h263[18].value = V4L2_CODEC_MFC5X_ENC_SW_ENABLE;
-
-        ext_ctrl_h263[19].id = V4L2_CID_CODEC_MFC5X_ENC_H263_RC_MB_ENABLE; /* MFC 6.x Only */
-        ext_ctrl_h263[19].value = h263_arg->EnableMBRateControl;
-        break;
-
-    case H264_ENC:
-        ext_ctrl[0].id = V4L2_CID_CODEC_MFC5X_ENC_H264_PROFILE;
-        ext_ctrl[0].value = h264_arg->ProfileIDC;
-        ext_ctrl[1].id = V4L2_CID_CODEC_MFC5X_ENC_H264_LEVEL;
-        ext_ctrl[1].value = h264_arg->LevelIDC;
-        ext_ctrl[2].id = V4L2_CID_CODEC_MFC5X_ENC_GOP_SIZE;
-        ext_ctrl[2].value = h264_arg->IDRPeriod;
-        ext_ctrl[3].id = V4L2_CID_CODEC_MFC5X_ENC_H264_MAX_REF_PIC;
-        ext_ctrl[3].value = h264_arg->NumberReferenceFrames;
-        ext_ctrl[4].id = V4L2_CID_CODEC_MFC5X_ENC_H264_NUM_REF_PIC_4P;
-        ext_ctrl[4].value = h264_arg->NumberRefForPframes;
-        ext_ctrl[5].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MODE;
-        ext_ctrl[5].value = h264_arg->SliceMode;  /* 0: one, 1: fixed #mb, 3: fixed #bytes */
-        if (h264_arg->SliceMode == 0) {
-            ext_ctrl[6].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MB;
-            ext_ctrl[6].value = 1;  /* default */
-            ext_ctrl[7].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_BIT;
-            ext_ctrl[7].value = 2800; /* based on MFC6.x */
-        } else if (h264_arg->SliceMode == 1) {
-            ext_ctrl[6].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MB;
-            ext_ctrl[6].value = h264_arg->SliceArgument;
-            ext_ctrl[7].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_BIT;
-            ext_ctrl[7].value = 2800; /* based on MFC6.x */
-        } else if (h264_arg->SliceMode == 3) {
-            ext_ctrl[6].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MB;
-            ext_ctrl[6].value = 1; /* default */
-            ext_ctrl[7].id = V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_BIT;
-            ext_ctrl[7].value = h264_arg->SliceArgument;
-        }
-        /*
-        It should be set using h264_arg->NumberBFrames after being handled by appl.
-         */
-        ext_ctrl[8].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_B_FRAMES;
-        ext_ctrl[8].value = h264_arg->NumberBFrames;
-        ext_ctrl[9].id = V4L2_CID_CODEC_MFC5X_ENC_H264_LOOP_FILTER_MODE;
-        ext_ctrl[9].value = h264_arg->LoopFilterDisable;
-        ext_ctrl[10].id = V4L2_CID_CODEC_MFC5X_ENC_H264_LOOP_FILTER_ALPHA;
-        ext_ctrl[10].value = h264_arg->LoopFilterAlphaC0Offset;
-        ext_ctrl[11].id = V4L2_CID_CODEC_MFC5X_ENC_H264_LOOP_FILTER_BETA;
-        ext_ctrl[11].value = h264_arg->LoopFilterBetaOffset;
-        ext_ctrl[12].id = V4L2_CID_CODEC_MFC5X_ENC_H264_ENTROPY_MODE;
-        ext_ctrl[12].value = h264_arg->SymbolMode;
-        ext_ctrl[13].id = V4L2_CID_CODEC_MFC5X_ENC_H264_INTERLACE;
-        ext_ctrl[13].value = h264_arg->PictureInterlace;
-        ext_ctrl[14].id = V4L2_CID_CODEC_MFC5X_ENC_H264_8X8_TRANSFORM;
-        ext_ctrl[14].value = h264_arg->Transform8x8Mode;
-        ext_ctrl[15].id = V4L2_CID_CODEC_MFC5X_ENC_INTRA_REFRESH_MB;
-        ext_ctrl[15].value = h264_arg->RandomIntraMBRefresh;
-        ext_ctrl[16].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_CTRL_ENABLE;
-        ext_ctrl[16].value = h264_arg->PadControlOn;
-        ext_ctrl[17].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_LUMA_VALUE;
-        ext_ctrl[17].value = h264_arg->LumaPadVal;
-        ext_ctrl[18].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_CB_VALUE;
-        ext_ctrl[18].value = h264_arg->CbPadVal;
-        ext_ctrl[19].id = V4L2_CID_CODEC_MFC5X_ENC_PAD_CR_VALUE;
-        ext_ctrl[19].value = h264_arg->CrPadVal;
-        ext_ctrl[20].id = V4L2_CID_CODEC_MFC5X_ENC_RC_FRAME_ENABLE;
-        ext_ctrl[20].value = h264_arg->EnableFRMRateControl;
-        ext_ctrl[21].id = V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MB_ENABLE;
-        ext_ctrl[21].value = h264_arg->EnableMBRateControl;
-        ext_ctrl[22].id = V4L2_CID_CODEC_MFC5X_ENC_H264_RC_FRAME_RATE;
-        ext_ctrl[22].value = h264_arg->FrameRate;
-        ext_ctrl[23].id = V4L2_CID_CODEC_MFC5X_ENC_RC_BIT_RATE;
-        /* FIXME temporary fix */
-        if (h264_arg->Bitrate)
-            ext_ctrl[23].value = h264_arg->Bitrate;
-        else
-            ext_ctrl[23].value = 1; /* just for testing Movi studio */
-        ext_ctrl[24].id = V4L2_CID_CODEC_MFC5X_ENC_H264_RC_FRAME_QP;
-        ext_ctrl[24].value = h264_arg->FrameQp;
-        ext_ctrl[25].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_RC_P_FRAME_QP;
-        ext_ctrl[25].value = h264_arg->FrameQp_P;
-        ext_ctrl[26].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_RC_B_FRAME_QP;
-        ext_ctrl[26].value = h264_arg->FrameQp_B;
-        ext_ctrl[27].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MAX_QP;
-        ext_ctrl[27].value = h264_arg->QSCodeMax;
-        ext_ctrl[28].id = V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MIN_QP;
-        ext_ctrl[28].value = h264_arg->QSCodeMin;
-        ext_ctrl[29].id = V4L2_CID_CODEC_MFC5X_ENC_RC_REACTION_COEFF;
-        ext_ctrl[29].value = h264_arg->CBRPeriodRf;
-        ext_ctrl[30].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MB_DARK;
-        ext_ctrl[30].value = h264_arg->DarkDisable;
-        ext_ctrl[31].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MB_SMOOTH;
-        ext_ctrl[31].value = h264_arg->SmoothDisable;
-        ext_ctrl[32].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MB_STATIC;
-        ext_ctrl[32].value = h264_arg->StaticDisable;
-        ext_ctrl[33].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MB_ACTIVITY;
-        ext_ctrl[33].value = h264_arg->ActivityDisable;
-
-        /* doesn't have to be set */
-        ext_ctrl[34].id = V4L2_CID_CODEC_MFC5X_ENC_H264_OPEN_GOP;
-        ext_ctrl[34].value = V4L2_CODEC_MFC5X_ENC_SW_DISABLE;
-        ext_ctrl[35].id = V4L2_CID_CODEC_MFC5X_ENC_H264_I_PERIOD;
-        ext_ctrl[35].value = 10;
-
-        if (V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_LEVEL == pCTX->enc_frameskip) {
-            ext_ctrl[36].id = V4L2_CID_CODEC_MFC5X_ENC_FRAME_SKIP_MODE;
-            ext_ctrl[36].value = V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_LEVEL;
-        } else if (V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_VBV_BUF_SIZE == pCTX->enc_frameskip) {
-            ext_ctrl[36].id = V4L2_CID_CODEC_MFC5X_ENC_FRAME_SKIP_MODE;
-            ext_ctrl[36].value = V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_VBV_BUF_SIZE;
-        } else { /* ENC_FRAME_SKIP_MODE_DISABLE (default) */
-            ext_ctrl[36].id = V4L2_CID_CODEC_MFC5X_ENC_FRAME_SKIP_MODE;
-            ext_ctrl[36].value = V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_DISABLE;
-        }
-
-        ext_ctrl[37].id = V4L2_CID_CODEC_MFC5X_ENC_VBV_BUF_SIZE;
-        ext_ctrl[37].value = 0;
-
-        ext_ctrl[38].id = V4L2_CID_CODEC_MFC5X_ENC_SEQ_HDR_MODE;
-        ext_ctrl[38].value = 0; /* 0: seperated header
-                                              1: header + first frame */
-
-        ext_ctrl[39].id = V4L2_CID_CODEC_MFC5X_ENC_RC_FIXED_TARGET_BIT; /* MFC5.x Only */
-        ext_ctrl[39].value = V4L2_CODEC_MFC5X_ENC_SW_ENABLE;
-
-        ext_ctrl[40].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_AR_VUI_ENABLE;
-        ext_ctrl[40].value = V4L2_CODEC_MFC5X_ENC_SW_DISABLE;
-        ext_ctrl[41].id = V4L2_CID_CODEC_MFC5X_ENC_H264_AR_VUI_IDC;
-        ext_ctrl[41].value = 0;
-        ext_ctrl[42].id = V4L2_CID_CODEC_MFC5X_ENC_H264_EXT_SAR_WIDTH;
-        ext_ctrl[42].value = 0;
-        ext_ctrl[43].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_EXT_SAR_HEIGHT;
-        ext_ctrl[43].value = 0;
-
-        if (pCTX->hier_p_enable) {
-            ext_ctrl[44].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_HIER_P_ENABLE;
-            ext_ctrl[44].value = V4L2_CODEC_MFC5X_ENC_SW_ENABLE;
-            ext_ctrl[45].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_LAYER0_QP;
-            ext_ctrl[45].value = pCTX->hier_qp_value.t0_frame_qp;
-            ext_ctrl[46].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_LAYER1_QP;
-            ext_ctrl[46].value = pCTX->hier_qp_value.t2_frame_qp;
-            ext_ctrl[47].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_LAYER2_QP;
-            ext_ctrl[47].value = pCTX->hier_qp_value.t3_frame_qp;
-        } else {
-            ext_ctrl[44].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_HIER_P_ENABLE;
-            ext_ctrl[44].value = V4L2_CODEC_MFC5X_ENC_SW_DISABLE;
-            ext_ctrl[45].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_LAYER0_QP;
-            ext_ctrl[45].value = 0;
-            ext_ctrl[46].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_LAYER1_QP;
-            ext_ctrl[46].value = 0;
-            ext_ctrl[47].id =  V4L2_CID_CODEC_MFC5X_ENC_H264_LAYER2_QP;
-            ext_ctrl[47].value = 0;
-        }
-        break;
-
-    default:
-        ALOGE("[%s] Undefined codec type",__func__);
-        ret = MFC_RET_INVALID_PARAM;
-        goto error_case1;
-    }
-
-    ext_ctrls.ctrl_class = V4L2_CTRL_CLASS_CODEC;
-    if (pCTX->codecType == MPEG4_ENC) {
-        ext_ctrls.count = 28;
-        ext_ctrls.controls = ext_ctrl_mpeg4;
-    } else if (pCTX->codecType == H264_ENC) {
-        ext_ctrls.count = 48;
-        ext_ctrls.controls = ext_ctrl;
-    } else if (pCTX->codecType == H263_ENC) {
-        ext_ctrls.count = 20;
-        ext_ctrls.controls = ext_ctrl_h263;
-    }
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_S_EXT_CTRLS, &ext_ctrls);
-    if (ret != 0) {
-        ALOGE("[%s] Failed to set extended controls",__func__);
-        ret = MFC_RET_ENC_INIT_FAIL;
-        goto error_case1;
-    }
-
-    memset(&fmt, 0, sizeof(fmt));
-    fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-
-    fmt.fmt.pix_mp.width = pCTX->width;
-    fmt.fmt.pix_mp.height = pCTX->height;
-    fmt.fmt.pix_mp.num_planes = 2;
-#if 0
-    fmt.fmt.pix_mp.plane_fmt[0].bytesperline = Align(fmt.fmt.pix_mp.width, 128);
-    fmt.fmt.pix_mp.plane_fmt[1].bytesperline = Align(fmt.fmt.pix_mp.width, 128);
-
-    if (NV12_TILE == pCTX->framemap) {
-        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12MT; /* 4:2:0, 2 Planes, 64x32 Tiles */
-        fmt.fmt.pix_mp.plane_fmt[0].sizeimage =
-            Align(Align(fmt.fmt.pix_mp.width, 128) * Align(fmt.fmt.pix_mp.height, 32), 8192); /* tiled mode */
-        fmt.fmt.pix_mp.plane_fmt[1].sizeimage =
-            Align(Align(fmt.fmt.pix_mp.width, 128) * Align(fmt.fmt.pix_mp.height >> 1, 32), 8192); /* tiled mode */
-    } else { /* NV12_LINEAR (default) */
-        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12M; /* 4:2:0, 2 Planes, linear */
-        fmt.fmt.pix_mp.plane_fmt[0].sizeimage =
-            Align((fmt.fmt.pix_mp.width * fmt.fmt.pix_mp.height), 2048); /* linear mode, 2K align */
-        fmt.fmt.pix_mp.plane_fmt[1].sizeimage =
-            Align((fmt.fmt.pix_mp.width * (fmt.fmt.pix_mp.height >> 1)), 2048); /* linear mode, 2K align */
-    }
-#else   /* FIXME: */
-    if (NV12_TILE == pCTX->framemap) {
-        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12MT; /* 4:2:0, 2 Planes, 16x16 Tiles */
-    } else { /* NV12_LINEAR (default) */
-        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12M; /* 4:2:0, 2 Planes, linear */
-    }
-#endif
-    ret = ioctl(pCTX->hMFC, VIDIOC_S_FMT, &fmt);
-    if (ret != 0) {
-        ALOGE("[%s] S_FMT failed on MFC output stream",__func__);
-        ret = MFC_RET_ENC_INIT_FAIL;
-        goto error_case1;
-    }
-
-    /* capture (dst) */
-    memset(&fmt, 0, sizeof(fmt));
-
-    switch (pCTX->codecType) {
-    case H264_ENC:
-        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
-        break;
-    case MPEG4_ENC:
-        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_MPEG4;
-        break;
-    case H263_ENC:
-        fmt.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H263;
-        break;
-    default:
-        ALOGE("[%s] Codec has not been recognised",__func__);
-        return MFC_RET_ENC_INIT_FAIL;
-    }
-
-    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-    fmt.fmt.pix_mp.plane_fmt[0].sizeimage = MAX_STREAM_SIZE;
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_S_FMT, &fmt);
-    if (ret != 0) {
-        ALOGE("[%s] S_FMT failed on MFC output stream",__func__);
-        ret = MFC_RET_ENC_INIT_FAIL;
-        goto error_case1;
-    }
-
-    /* cacheable buffer */
-    ctrl.id = V4L2_CID_CACHEABLE;
-    if (pCTX->cacheablebuffer == NO_CACHE)
-        ctrl.value = 0;
-    else
-        ctrl.value = 1;
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_S_CTRL, &ctrl);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_S_CTRL failed, V4L2_CID_CACHEABLE",__func__);
-        ret = MFC_RET_ENC_INIT_FAIL;
-        goto error_case1;
-    }
-
-    /* Initialize streams for input */
-    memset(&reqbuf, 0, sizeof(reqbuf));
-    reqbuf.count  = MFC_ENC_NUM_SRC_BUFS;
-    reqbuf.type   = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    if (pCTX->v4l2_enc.bInputPhyVir)
-        reqbuf.memory = V4L2_MEMORY_USERPTR;
-    else
-        reqbuf.memory = V4L2_MEMORY_MMAP;
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_REQBUFS, &reqbuf);
-    if (ret != 0) {
-        ALOGE("[%s] Reqbufs src ioctl failed",__func__);
-        ret = MFC_RET_ENC_INIT_FAIL;
-        goto error_case1;
-    }
-    pCTX->v4l2_enc.mfc_num_src_bufs  = reqbuf.count;
-
-    if (!pCTX->v4l2_enc.bInputPhyVir) {
-        /* Then the buffers have to be queried and mmaped */
-        for (i = 0;  i < pCTX->v4l2_enc.mfc_num_src_bufs; ++i) {
-            memset(&buf, 0, sizeof(buf));
-            buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-            buf.memory = V4L2_MEMORY_MMAP;
-            buf.index = i;
-            buf.m.planes = planes;
-            buf.length = 2;
-
-            ret = ioctl(pCTX->hMFC, VIDIOC_QUERYBUF, &buf);
-            if (ret != 0) {
-                ALOGE("[%s] Querybuf src ioctl failed",__func__);
-                ret = MFC_RET_ENC_INIT_FAIL;
-                goto error_case2;
-            }
-
-            pCTX->v4l2_enc.mfc_src_bufs_len[0] = buf.m.planes[0].length;
-            pCTX->v4l2_enc.mfc_src_bufs_len[1] = buf.m.planes[1].length;
-
-            pCTX->v4l2_enc.mfc_src_phys[i][0] = buf.m.planes[0].cookie;
-            pCTX->v4l2_enc.mfc_src_phys[i][1] = buf.m.planes[1].cookie;
-
-            pCTX->v4l2_enc.mfc_src_bufs[i][0] =
-                mmap(NULL, buf.m.planes[0].length, PROT_READ | PROT_WRITE,
-                MAP_SHARED, pCTX->hMFC, buf.m.planes[0].m.mem_offset);
-            if (pCTX->v4l2_enc.mfc_src_bufs[i][0] == MAP_FAILED) {
-                ALOGE("[%s] Mmap on src buffer (0) failed",__func__);
-                ret = MFC_RET_ENC_INIT_FAIL;
-                goto error_case2;
-            }
-
-            pCTX->v4l2_enc.mfc_src_bufs[i][1] =
-                mmap(NULL, buf.m.planes[1].length, PROT_READ | PROT_WRITE,
-                MAP_SHARED, pCTX->hMFC, buf.m.planes[1].m.mem_offset);
-            if (pCTX->v4l2_enc.mfc_src_bufs[i][1] == MAP_FAILED) {
-                munmap(pCTX->v4l2_enc.mfc_src_bufs[i][0], pCTX->v4l2_enc.mfc_src_bufs_len[0]);
-                ALOGE("[%s] Mmap on src buffer (1) failed",__func__);
-                ret = MFC_RET_ENC_INIT_FAIL;
-                goto error_case2;
-            }
-        }
-    } else
-        ALOGV("[%s] Camera Phys src buf %d",__func__,reqbuf.count);
-
-    for (i = 0; i < pCTX->v4l2_enc.mfc_num_src_bufs; i++)
-        pCTX->v4l2_enc.mfc_src_buf_flags[i] = BUF_DEQUEUED;
-
-    pCTX->v4l2_enc.beingUsedIndex = 0;
-
-    pCTX->sizeFrmBuf.luma = (unsigned int)(pCTX->width * pCTX->height);
-    pCTX->sizeFrmBuf.chroma = (unsigned int)((pCTX->width * pCTX->height) >> 1);
-    pCTX->inter_buff_status |= MFC_USE_YUV_BUFF;
-
-    /* Initialize stream for output */
-    memset(&reqbuf, 0, sizeof(reqbuf));
-    reqbuf.count  = MFC_ENC_MAX_DST_BUFS;
-    reqbuf.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-    reqbuf.memory = V4L2_MEMORY_MMAP;
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_REQBUFS, &reqbuf);
-    if (ret != 0) {
-        ALOGE("[%s] Reqbufs dst ioctl failed",__func__);
-        ret = MFC_RET_ENC_INIT_FAIL;
-        goto error_case2;
-    }
-
-    pCTX->v4l2_enc.mfc_num_dst_bufs   = reqbuf.count;
-
-    for (i = 0; i < MFC_ENC_MAX_DST_BUFS; ++i) {
-        memset(&buf, 0, sizeof(buf));
-        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-        buf.memory = V4L2_MEMORY_MMAP;
-        buf.index = i;
-        buf.m.planes = planes;
-        buf.length = 1;
-
-        ret = ioctl(pCTX->hMFC, VIDIOC_QUERYBUF, &buf);
-        if (ret != 0) {
-            ALOGE("[%s] Querybuf dst ioctl failed",__func__);
-            ret = MFC_RET_ENC_INIT_FAIL;
-            goto error_case3;
-        }
-
-        pCTX->v4l2_enc.mfc_dst_bufs_len = buf.m.planes[0].length;
-        pCTX->v4l2_enc.mfc_dst_bufs[i] =
-                mmap(NULL, buf.m.planes[0].length, PROT_READ | PROT_WRITE,
-                MAP_SHARED, pCTX->hMFC, buf.m.planes[0].m.mem_offset);
-        if (pCTX->v4l2_enc.mfc_dst_bufs[i] == MAP_FAILED) {
-            ALOGE("[%s] Mmap on dst buffer failed",__func__);
-            ret = MFC_RET_ENC_INIT_FAIL;
-            goto error_case3;
-        }
-
-        ret = ioctl(pCTX->hMFC, VIDIOC_QBUF, &buf);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE",__func__);
-            ret = MFC_RET_ENC_INIT_FAIL;
-            goto error_case3;
-        }
-    }
-
-    pCTX->sizeStrmBuf = MAX_ENCODER_OUTPUT_BUFFER_SIZE;
-    pCTX->inter_buff_status |= MFC_USE_STRM_BUFF;
-
-    type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_STREAMON, &type);
-    if (ret != 0) {
-        ALOGE("[%s] V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, VIDIOC_STREAMON failed",__func__);
-        ret = MFC_RET_ENC_INIT_FAIL;
-        goto error_case3;
-    }
-
-    pCTX->inter_buff_status |= MFC_USE_DST_STREAMON;
-
-    memset(&buf, 0, sizeof(buf));
-    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-    buf.memory = V4L2_MEMORY_MMAP;
-    buf.m.planes = planes;
-    buf.length = 1;
-
-    /* note: #define POLLOUT 0x0004 */
-    poll_events.fd = pCTX->hMFC;
-    poll_events.events = POLLIN | POLLERR;
-    poll_events.revents = 0;
-
-    /* wait for header encoding */
-    do {
-        poll_state = poll((struct pollfd*)&poll_events, 1, POLL_ENC_WAIT_TIMEOUT);
-        if (0 < poll_state) {
-            if (poll_events.revents & POLLIN) { /* POLLIN */
-                ret = ioctl(pCTX->hMFC, VIDIOC_DQBUF, &buf);
-                if (ret == 0)
-                    break;
-            } else if (poll_events.revents & POLLERR) { /*POLLERR */
-                ALOGE("[%s] POLLERR\n",__func__);
-                ret = MFC_RET_ENC_INIT_FAIL;
-                goto error_case3;
-            } else {
-                ALOGE("[%s] poll() returns 0x%x\n",__func__, poll_events.revents);
-                ret = MFC_RET_ENC_INIT_FAIL;
-                goto error_case3;
-            }
-        } else if (0 > poll_state) {
-            ret = MFC_RET_ENC_INIT_FAIL;
-            goto error_case3;
-        }
-    } while (1 == poll_state);
-
-    pCTX->v4l2_enc.mfc_dst_bufs_bytes_used_len = buf.m.planes[0].bytesused;
-    pCTX->virStrmBuf = pCTX->v4l2_enc.mfc_dst_bufs[buf.index];
-
-    /* stream dequeued index */
-    index = buf.index;
-    memset(&buf, 0, sizeof(buf));
-    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-    buf.memory = V4L2_MEMORY_MMAP;
-    buf.index = index;
-    buf.m.planes = planes;
-    buf.length = 1;
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_QBUF, &buf);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE",__func__);
-        ret = MFC_RET_ENC_INIT_FAIL;
-        goto error_case3;
-    }
-    ALOGV("[%s] Strm out idx %d",__func__,index);
-
-    return MFC_RET_OK;
-error_case3:
-    for (j = 0; j < i; j++)
-        munmap(pCTX->v4l2_enc.mfc_dst_bufs[j], pCTX->v4l2_enc.mfc_dst_bufs_len);
-
-    i = pCTX->v4l2_enc.mfc_num_src_bufs;
-error_case2:
-    if (!pCTX->v4l2_enc.bInputPhyVir) {
-        for (j = 0; j < i; j++) {
-            munmap(pCTX->v4l2_enc.mfc_src_bufs[j][0], pCTX->v4l2_enc.mfc_src_bufs_len[0]);
-            munmap(pCTX->v4l2_enc.mfc_src_bufs[j][1], pCTX->v4l2_enc.mfc_src_bufs_len[1]);
-        }
-    }
-error_case1:
-    return ret;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncGetInBuf(void *openHandle, SSBSIP_MFC_ENC_INPUT_INFO *input_info)
-{
-    _MFCLIB *pCTX;
-    int i;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL\n",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    /* FIXME check this if GetInBuf() is not called for UserPtr */
-    if (pCTX->v4l2_enc.bInputPhyVir) {
-        input_info->YPhyAddr = (void*)0;
-        input_info->CPhyAddr = (void*)0;
-        input_info->YVirAddr = (void*)0;
-        input_info->CVirAddr = (void*)0;
-
-        /* FIXME check whether Y & C sizes should be set or not*/
-        if (NV12_TILE == pCTX->framemap) {
-            /* 4:2:0, 2 Planes, 64x32 Tiles */
-            input_info->YSize = Align(Align(pCTX->width, 128) * Align(pCTX->height, 32), 8192); /* tiled mode */
-            input_info->CSize = Align(Align(pCTX->width, 128) * Align(pCTX->height >> 1, 32), 8192); /* tiled mode */
-        } else { /* NV12_LINEAR (default) */
-            /* 4:2:0, 2 Planes, linear */
-            input_info->YSize = Align((pCTX->width * pCTX->height), 2048); /* linear mode, 2K align */
-            input_info->CSize = Align((pCTX->width * (pCTX->height >> 1)), 2048); /* linear mode, 2K align */
-        }
-    } else {
-        for (i = 0; i < pCTX->v4l2_enc.mfc_num_src_bufs; i++)
-            if (BUF_DEQUEUED == pCTX->v4l2_enc.mfc_src_buf_flags[i])
-                break;
-
-        if (i == pCTX->v4l2_enc.mfc_num_src_bufs) {
-            ALOGV("[%s] No buffer is available.",__func__);
-            return MFC_RET_ENC_GET_INBUF_FAIL;
-        } else {
-            input_info->YPhyAddr = (void*)pCTX->v4l2_enc.mfc_src_phys[i][0];
-            input_info->CPhyAddr = (void*)pCTX->v4l2_enc.mfc_src_phys[i][1];
-            input_info->YVirAddr = (void*)pCTX->v4l2_enc.mfc_src_bufs[i][0];
-            input_info->CVirAddr = (void*)pCTX->v4l2_enc.mfc_src_bufs[i][1];
-            input_info->YSize = (int)pCTX->v4l2_enc.mfc_src_bufs_len[0];
-            input_info->CSize = (int)pCTX->v4l2_enc.mfc_src_bufs_len[1];
-
-            pCTX->v4l2_enc.mfc_src_buf_flags[i] = BUF_ENQUEUED;
-        }
-    }
-    ALOGV("[%s] Input Buffer idx %d",__func__,i);
-    return MFC_RET_OK;
-}
-
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncSetInBuf(void *openHandle, SSBSIP_MFC_ENC_INPUT_INFO *input_info)
-{
-    _MFCLIB *pCTX;
-    struct v4l2_buffer qbuf;
-    struct v4l2_plane planes[MFC_ENC_NUM_PLANES];
-    int ret,i;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL\n",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    memset(&qbuf, 0, sizeof(qbuf));
-    if (pCTX->v4l2_enc.bInputPhyVir) {
-        qbuf.memory = V4L2_MEMORY_USERPTR;
-        qbuf.index = pCTX->v4l2_enc.beingUsedIndex;
-        planes[0].m.userptr = (unsigned long)input_info->YPhyAddr;
-        planes[0].length = input_info->YSize;
-        planes[0].bytesused = input_info->YSize;
-        planes[1].m.userptr = (unsigned long)input_info->CPhyAddr;
-        planes[1].length = input_info->CSize;
-        planes[1].bytesused = input_info->CSize;
-
-        /* FIXME, this is only for case of not using B frame,
-        Camera side should know which buffer is queued() refering to index of
-        MFC dqbuf() */
-        pCTX->v4l2_enc.beingUsedIndex++;
-        pCTX->v4l2_enc.beingUsedIndex %= MFC_ENC_NUM_SRC_BUFS;
-        ALOGV("[%s] Phy Input Buffer idx Queued %d",__func__,pCTX->v4l2_enc.beingUsedIndex);
-    } else {
-        for (i = 0; i < pCTX->v4l2_enc.mfc_num_src_bufs; i++)
-            if (pCTX->v4l2_enc.mfc_src_bufs[i][0] == input_info->YVirAddr)
-                break;
-
-        if (i == pCTX->v4l2_enc.mfc_num_src_bufs) {
-            ALOGE("[%s] Can not use the buffer",__func__);
-            return MFC_RET_INVALID_PARAM;
-        } else {
-            pCTX->v4l2_enc.beingUsedIndex = i;
-            //pCTX->v4l2_enc.mfc_src_buf_flags[i] = BUF_ENQUEUED;
-        }
-        qbuf.memory = V4L2_MEMORY_MMAP;
-        qbuf.index = pCTX->v4l2_enc.beingUsedIndex;
-        planes[0].bytesused = pCTX->width * pCTX->height;
-        planes[1].bytesused = (pCTX->width * pCTX->height) >> 1;
-        ALOGV("[%s] Input Buffer idx Queued %d",__func__,pCTX->v4l2_enc.beingUsedIndex);
-    }
-
-    qbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    qbuf.m.planes = planes;
-    qbuf.length = 2;
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_QBUF, &qbuf);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE",__func__);
-        return MFC_RET_ENC_SET_INBUF_FAIL;
-    }
-
-    return MFC_RET_OK;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncGetOutBuf(void *openHandle, SSBSIP_MFC_ENC_OUTPUT_INFO *output_info)
-{
-    _MFCLIB *pCTX;
-    struct v4l2_control ctrl;
-    unsigned int encoded_y_addr, encoded_c_addr;
-    int ret;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL\n",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX = (_MFCLIB *) openHandle;
-
-    if (pCTX->v4l2_enc.bRunning == 0) {
-        pCTX->encodedHeaderSize = pCTX->v4l2_enc.mfc_dst_bufs_bytes_used_len;
-        output_info->dataSize = 0;
-    } else {
-        output_info->dataSize = pCTX->v4l2_enc.mfc_dst_bufs_bytes_used_len;
-    }
-
-    ctrl.id = V4L2_CID_CODEC_ENCODED_LUMA_ADDR;
-    ctrl.value = 0;
-    ret = ioctl(pCTX->hMFC, VIDIOC_G_CTRL, &ctrl);
-    if (ret != 0)
-        ALOGE("[%s] Error to do g_ctrl",__func__);
-    encoded_y_addr = (unsigned int)ctrl.value;
-
-    ctrl.id = V4L2_CID_CODEC_ENCODED_CHROMA_ADDR;
-    ctrl.value = 0;
-    ret = ioctl(pCTX->hMFC, VIDIOC_G_CTRL, &ctrl);
-    if (ret != 0)
-        ALOGE("[%s] Error to do g_ctrl",__func__);
-    encoded_c_addr = (unsigned int)ctrl.value;
-
-    output_info->headerSize = pCTX->encodedHeaderSize;
-    output_info->frameType = pCTX->encodedframeType;
-    output_info->StrmPhyAddr = (void *)0;
-    output_info->StrmVirAddr = (void *)pCTX->virStrmBuf;
-    output_info->encodedYPhyAddr = (void*)encoded_y_addr;
-    output_info->encodedCPhyAddr = (void*)encoded_c_addr;
-
-    return MFC_RET_OK;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncSetOutBuf(void *openHandle, void *phyOutbuf, void *virOutbuf, int outputBufferSize)
-{
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL\n",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    return MFC_RET_ENC_SET_OUTBUF_FAIL;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncExe(void *openHandle)
-{
-    int ret;
-    int dequeued_index;
-    int loopcnt = 0;
-    _MFCLIB *pCTX;
-
-    struct v4l2_buffer qbuf;
-    struct v4l2_plane planes[MFC_ENC_NUM_PLANES];
-    enum v4l2_buf_type type;
-
-    struct v4l2_control ctrl;
-
-    struct pollfd poll_events;
-    int poll_state;
-
-    ALOGV("[%s] Enter \n",__func__);
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL\n",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX = (_MFCLIB *) openHandle;
-
-    ctrl.id = V4L2_CID_CODEC_FRAME_TAG;
-    ctrl.value = pCTX->inframetag;
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_S_CTRL, &ctrl);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_S_CTRL failed, V4L2_CID_CODEC_FRAME_TAG",__func__);
-        return MFC_RET_ENC_EXE_ERR;
-    }
-
-    if (pCTX->v4l2_enc.bRunning == 0) {
-        type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-        ret = ioctl(pCTX->hMFC, VIDIOC_STREAMON, &type);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_STREAMON failed, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE",__func__);
-            return MFC_RET_ENC_EXE_ERR;
-        }
-
-        pCTX->v4l2_enc.bRunning = 1;
-    }
-
-    pCTX->inter_buff_status |= MFC_USE_SRC_STREAMON;
-
-    memset(&qbuf, 0, sizeof(qbuf));
-    qbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-    qbuf.memory = V4L2_MEMORY_MMAP;
-    qbuf.m.planes = planes;
-    qbuf.length = 1;
-
-    /* note: #define POLLOUT 0x0004 */
-    poll_events.fd = pCTX->hMFC;
-    poll_events.events = POLLIN | POLLERR;
-    poll_events.revents = 0;
-
-    /* wait for encoding */
-    do {
-        poll_state = poll((struct pollfd*)&poll_events, 1, POLL_ENC_WAIT_TIMEOUT);
-        if (0 < poll_state) {
-            if (poll_events.revents & POLLIN) { /* POLLIN */
-                ret = ioctl(pCTX->hMFC, VIDIOC_DQBUF, &qbuf);
-                if (ret == 0)
-                    break;
-            } else if (poll_events.revents & POLLERR) { /* POLLERR */
-                ALOGE("[%s] POLLERR\n",__func__);
-                return MFC_RET_ENC_EXE_ERR;
-            } else {
-                ALOGE("[%s] poll() returns 0x%x\n",__func__, poll_events.revents);
-                return MFC_RET_ENC_EXE_ERR;
-            }
-        } else if (0 > poll_state) {
-            ALOGE("[%s] poll() Encoder POLL Timeout 0x%x\n",__func__, poll_events.revents);
-            return MFC_RET_ENC_EXE_ERR;
-        } else { /* in the case of B frame encoding */
-            ctrl.id = V4L2_CID_CODEC_CHECK_STATE;
-            ctrl.value = 0;
-            ret = ioctl(pCTX->hMFC, VIDIOC_G_CTRL, &ctrl);
-            ALOGV("[%s] ctx state = %d\n",__func__, ctrl.value);
-            if (ctrl.value == MFCSTATE_ENC_NO_OUTPUT)
-                return MFC_RET_OK;
-        }
-        loopcnt++;
-    } while ((0 == poll_state) && (loopcnt < 5));
-
-    if (pCTX->v4l2_enc.bRunning != 0) {
-        pCTX->encodedframeType = (qbuf.flags & 0x38) >> 3; /* encoded frame type */
-        ALOGV("[%s] encoded frame type = %d\n", __func__, pCTX->encodedframeType);
-
-        switch (pCTX->encodedframeType) {
-        case 1:
-            pCTX->encodedframeType = MFC_FRAME_TYPE_I_FRAME;
-            break;
-        case 2:
-            pCTX->encodedframeType = MFC_FRAME_TYPE_P_FRAME;
-            break;
-        case 4:
-            pCTX->encodedframeType = MFC_FRAME_TYPE_B_FRAME;
-            break;
-        default:
-             ALOGE("[%s] VIDIOC_DQBUF failed, encoded frame type is wrong",__func__);
-        }
-    }
-
-    dequeued_index = qbuf.index;
-
-    if (qbuf.m.planes[0].bytesused > 0) { /* FIXME later */
-        pCTX->v4l2_enc.mfc_dst_bufs_bytes_used_len = qbuf.m.planes[0].bytesused;
-    }
-
-    ctrl.id = V4L2_CID_CODEC_FRAME_TAG;
-    ctrl.value = 0;
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_G_CTRL, &ctrl);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_G_CTRL failed, V4L2_CID_CODEC_FRAME_TAG",__func__);
-        return MFC_RET_ENC_EXE_ERR;
-    }
-
-    pCTX->outframetagtop = ctrl.value;
-
-    memset(&qbuf, 0, sizeof(qbuf));
-    qbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-    qbuf.memory = V4L2_MEMORY_MMAP;
-    qbuf.index = dequeued_index;
-    qbuf.m.planes = planes;
-    qbuf.length = 1;
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_QBUF, &qbuf);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_QBUF failed, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE",__func__);
-        return MFC_RET_ENC_EXE_ERR;
-    }
-
-    if (pCTX->v4l2_enc.bRunning != 0) {
-        memset(&qbuf, 0, sizeof(qbuf));
-        qbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-
-        if (pCTX->v4l2_enc.bInputPhyVir)
-            qbuf.memory = V4L2_MEMORY_USERPTR;
-        else
-            qbuf.memory = V4L2_MEMORY_MMAP;
-
-        ret = ioctl(pCTX->hMFC, VIDIOC_DQBUF, &qbuf);
-        if (ret != 0) {
-            ALOGE("[%s] VIDIOC_DQBUF failed, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE",__func__);
-            return MFC_RET_ENC_EXE_ERR;
-        }
-    }
-    pCTX->v4l2_enc.mfc_src_buf_flags[qbuf.index] = BUF_DEQUEUED;
-
-    /* Update context stream buffer address */
-    pCTX->virStrmBuf = pCTX->v4l2_enc.mfc_dst_bufs[dequeued_index];
-    ALOGV("[%s] Strm out idx %d",__func__,dequeued_index);
-
-    return MFC_RET_OK;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncSetConfig(void *openHandle, SSBSIP_MFC_ENC_CONF conf_type, void *value)
-{
-    _MFCLIB *pCTX;
-    struct v4l2_control ctrl;
-    struct mfc_enc_hier_p_qp hier_p_qp;
-    int ret;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL\n",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    if (value == NULL) {
-        ALOGE("[%s] value is NULL\n",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    pCTX  = (_MFCLIB *) openHandle;
-
-    switch (conf_type) {
-    case MFC_ENC_SETCONF_FRAME_TAG:
-        pCTX->inframetag = *((unsigned int *)value);
-        return MFC_RET_OK;
-
-    case MFC_ENC_SETCONF_FRAME_TYPE:
-        ctrl.id = V4L2_CID_CODEC_FRAME_INSERTION;
-        ctrl.value = *((unsigned int*)value);
-        break;
-
-    case MFC_ENC_SETCONF_I_PERIOD:
-        ctrl.id = V4L2_CID_CODEC_ENCODED_I_PERIOD_CH;
-        ctrl.value = *((unsigned int*)value);
-        break;
-
-    case MFC_ENC_SETCONF_CHANGE_FRAME_RATE:
-        ctrl.id = V4L2_CID_CODEC_ENCODED_FRAME_RATE_CH;
-        ctrl.value = *((unsigned int*)value);
-        break;
-
-    case MFC_ENC_SETCONF_CHANGE_BIT_RATE:
-        ctrl.id = V4L2_CID_CODEC_ENCODED_BIT_RATE_CH;
-        ctrl.value = *((unsigned int*)value);
-        break;
-
-    case MFC_ENC_SETCONF_ALLOW_FRAME_SKIP:
-        pCTX->enc_frameskip = *((int *)value);
-        return MFC_RET_OK;
-#if 0
-    case MFC_ENC_SETCONF_VUI_INFO:
-        vui_info = *((struct mfc_enc_vui_info *) value);
-        EncArg.args.set_config.in_config_value[0]  = (int)(vui_info.aspect_ratio_idc);
-        EncArg.args.set_config.in_config_value[1]  = 0;
-        break;
-#endif
-    case MFC_ENC_SETCONF_HIER_P:
-        hier_p_qp = *((struct mfc_enc_hier_p_qp *) value);
-        pCTX->hier_p_enable = 1;
-        pCTX->hier_qp_value.t0_frame_qp = (int)(hier_p_qp.t0_frame_qp);
-        pCTX->hier_qp_value.t2_frame_qp  = (int)(hier_p_qp.t2_frame_qp);
-        pCTX->hier_qp_value.t3_frame_qp  = (int)(hier_p_qp.t3_frame_qp);
-        return MFC_RET_OK;
-
-    default:
-        ALOGE("[%s] conf_type(%d) is NOT supported\n",__func__, conf_type);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    ret = ioctl(pCTX->hMFC, VIDIOC_S_CTRL, &ctrl);
-    if (ret != 0) {
-        ALOGE("[%s] VIDIOC_S_CTRL failed (conf_type = %d)",__func__, conf_type);
-        return MFC_RET_ENC_SET_CONF_FAIL;
-    }
-
-    return MFC_RET_OK;
-}
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncGetConfig(void *openHandle, SSBSIP_MFC_ENC_CONF conf_type, void *value)
-{
-    _MFCLIB *pCTX;
-
-    pCTX = (_MFCLIB *) openHandle;
-
-    if (openHandle == NULL) {
-        ALOGE("[%s] openHandle is NULL\n",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    if (value == NULL) {
-        ALOGE("[%s] value is NULL\n",__func__);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    switch (conf_type) {
-    case MFC_ENC_GETCONF_FRAME_TAG:
-        *((unsigned int *)value) = pCTX->outframetagtop;
-        break;
-
-    default:
-        ALOGE("[%s] conf_type(%d) is NOT supported\n",__func__, conf_type);
-        return MFC_RET_INVALID_PARAM;
-    }
-
-    return MFC_RET_OK;
-}
-
diff --git a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/include/SsbSipMfcApi.h b/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/include/SsbSipMfcApi.h
deleted file mode 100644
index 28b2d8a..0000000
--- a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/include/SsbSipMfcApi.h
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *              http://www.samsung.com/
- *
- * Global header for Samsung MFC (Multi Function Codec - FIMV) driver
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _SSBSIP_MFC_API_H_
-#define _SSBSIP_MFC_API_H_
-
-/*--------------------------------------------------------------------------------*/
-/* Definition                                                                     */
-/*--------------------------------------------------------------------------------*/
-#define MAX_DECODER_INPUT_BUFFER_SIZE  (1024 * 3072)
-#define MAX_ENCODER_OUTPUT_BUFFER_SIZE (1024 * 3072)
-
-#define SUPPORT_1080P        1
-
-#if SUPPORT_1080P
-#define MMAP_BUFFER_SIZE_MMAP          (70*1024*1024) /* only C110 use this value. in C210, memory size is decided in menuconfig*/
-#else
-#define MMAP_BUFFER_SIZE_MMAP          (62*1024*1024)
-#endif
-
-#define SAMSUNG_MFC_DEV_NAME           "/dev/video"
-
-#define SSBSIP_MFC_OK                   (1)
-#define SSBSIP_MFC_FAIL                 (0)
-
-/*--------------------------------------------------------------------------------*/
-/* Structure and Type                                                             */
-/*--------------------------------------------------------------------------------*/
-typedef enum {
-    H264_DEC,
-    VC1_DEC,     /* VC1 advaced Profile decoding  */
-    MPEG4_DEC,
-    XVID_DEC,
-    MPEG1_DEC,
-    MPEG2_DEC,
-    H263_DEC,
-    VC1RCV_DEC,  /* VC1 simple/main profile decoding  */
-    FIMV1_DEC,
-    FIMV2_DEC,
-    FIMV3_DEC,
-    FIMV4_DEC,
-    VP8_DEC,
-    H264_ENC,
-    MPEG4_ENC,
-    H263_ENC,
-    UNKNOWN_TYPE
-} SSBSIP_MFC_CODEC_TYPE;
-
-typedef enum {
-    DONT_CARE = 0,
-    I_FRAME = 1,
-    NOT_CODED = 2
-} SSBSIP_MFC_FORCE_SET_FRAME_TYPE;
-
-typedef enum {
-    NV12_LINEAR = 0,
-    NV12_TILE
-} SSBSIP_MFC_INSTRM_MODE_TYPE;
-
-typedef enum {
-    NO_CACHE = 0,
-    CACHE = 1
-} SSBIP_MFC_BUFFER_TYPE;
-
-typedef enum {
-    MFC_DEC_SETCONF_POST_ENABLE = 1,
-    MFC_DEC_SETCONF_EXTRA_BUFFER_NUM,
-    MFC_DEC_SETCONF_DISPLAY_DELAY,
-    MFC_DEC_SETCONF_IS_LAST_FRAME,
-    MFC_DEC_SETCONF_SLICE_ENABLE,
-    MFC_DEC_SETCONF_CRC_ENABLE,
-    MFC_DEC_SETCONF_FIMV1_WIDTH_HEIGHT,
-    MFC_DEC_SETCONF_FRAME_TAG,
-    MFC_DEC_GETCONF_CRC_DATA,
-    MFC_DEC_GETCONF_BUF_WIDTH_HEIGHT,
-    MFC_DEC_GETCONF_CROP_INFO,
-    MFC_DEC_GETCONF_FRAME_TAG,
-
-    /* C210 specific feature */
-    MFC_DEC_SETCONF_IMMEDIATELY_DISPLAY,
-    MFC_DEC_SETCONF_DPB_FLUSH,
-    MFC_DEC_SETCONF_PIXEL_CACHE,
-    MFC_DEC_GETCONF_WIDTH_HEIGHT
-} SSBSIP_MFC_DEC_CONF;
-
-typedef enum {
-    MFC_ENC_SETCONF_FRAME_TYPE = 100,
-    MFC_ENC_SETCONF_CHANGE_FRAME_RATE,
-    MFC_ENC_SETCONF_CHANGE_BIT_RATE,
-    MFC_ENC_SETCONF_FRAME_TAG,
-    MFC_ENC_SETCONF_ALLOW_FRAME_SKIP,
-    MFC_ENC_GETCONF_FRAME_TAG,
-
-    /* C210 specific feature */
-    MFC_ENC_SETCONF_VUI_INFO,
-    MFC_ENC_SETCONF_I_PERIOD,
-    MFC_ENC_SETCONF_HIER_P
-} SSBSIP_MFC_ENC_CONF;
-
-typedef enum {
-    MFC_GETOUTBUF_STATUS_NULL = 0,
-    MFC_GETOUTBUF_DECODING_ONLY = 1,
-    MFC_GETOUTBUF_DISPLAY_DECODING,
-    MFC_GETOUTBUF_DISPLAY_ONLY,
-    MFC_GETOUTBUF_DISPLAY_END,
-    MFC_GETOUTBUF_CHANGE_RESOL
-} SSBSIP_MFC_DEC_OUTBUF_STATUS;
-
-typedef enum {
-    MFC_FRAME_TYPE_NOT_CODED,
-    MFC_FRAME_TYPE_I_FRAME,
-    MFC_FRAME_TYPE_P_FRAME,
-    MFC_FRAME_TYPE_B_FRAME,
-    MFC_FRAME_TYPE_OTHERS
-} SSBSIP_MFC_FRAME_TYPE;
-
-typedef enum {
-    MFC_RET_OK                      = 1,
-    MFC_RET_FAIL                    = -1000,
-    MFC_RET_OPEN_FAIL               = -1001,
-    MFC_RET_CLOSE_FAIL              = -1002,
-
-    MFC_RET_DEC_INIT_FAIL           = -2000,
-    MFC_RET_DEC_EXE_TIME_OUT        = -2001,
-    MFC_RET_DEC_EXE_ERR             = -2002,
-    MFC_RET_DEC_GET_INBUF_FAIL      = -2003,
-    MFC_RET_DEC_SET_INBUF_FAIL      = -2004,
-    MFC_RET_DEC_GET_OUTBUF_FAIL     = -2005,
-    MFC_RET_DEC_GET_CONF_FAIL       = -2006,
-    MFC_RET_DEC_SET_CONF_FAIL       = -2007,
-
-    MFC_RET_ENC_INIT_FAIL           = -3000,
-    MFC_RET_ENC_EXE_TIME_OUT        = -3001,
-    MFC_RET_ENC_EXE_ERR             = -3002,
-    MFC_RET_ENC_GET_INBUF_FAIL      = -3003,
-    MFC_RET_ENC_SET_INBUF_FAIL      = -3004,
-    MFC_RET_ENC_GET_OUTBUF_FAIL     = -3005,
-    MFC_RET_ENC_SET_OUTBUF_FAIL     = -3006,
-    MFC_RET_ENC_GET_CONF_FAIL       = -3007,
-    MFC_RET_ENC_SET_CONF_FAIL       = -3008,
-
-    MFC_RET_INVALID_PARAM           = -4000
-} SSBSIP_MFC_ERROR_CODE;
-
-typedef struct {
-    void *YPhyAddr;                     /* [OUT] physical address of Y */
-    void *CPhyAddr;                     /* [OUT] physical address of CbCr */
-    void *YVirAddr;                     /* [OUT] virtual address of Y */
-    void *CVirAddr;                     /* [OUT] virtual address of CbCr */
-
-    int img_width;                      /* [OUT] width of real image */
-    int img_height;                     /* [OUT] height of real image */
-    int buf_width;                      /* [OUT] width aligned to 16 */
-    int buf_height;                     /* [OUT] height alighed to 16 */
-
-    int timestamp_top;                  /* [OUT] timestamp of top filed(This is used for interlaced stream) */
-    int timestamp_bottom;               /* [OUT] timestamp of bottom filed(This is used for interlaced stream) */
-    int consumedByte;                   /* [OUT] the number of byte consumed during decoding */
-    int res_change;                     /* [OUT] whether resolution is changed or not. 0: not change, 1: increased, 2: decreased */
-    int crop_top_offset;                /* [OUT] crop information, top_offset */
-    int crop_bottom_offset;             /* [OUT] crop information, bottom_offset */
-    int crop_left_offset;               /* [OUT] crop information, left_offset */
-    int crop_right_offset;              /* [OUT] crop information, right_offset */
-    int disp_pic_frame_type;            /* [OUT] display picture frame type information */
-
-    /* C210 UMP feature */
-    unsigned int y_cookie;              /* [OUT] cookie for Y address */
-    unsigned int c_cookie;              /* [OUT] cookie for CbCr address, If it is 0, Y and CbCr is in continous memory */
-} SSBSIP_MFC_DEC_OUTPUT_INFO;
-
-typedef struct {
-    void *YPhyAddr;                     /* [IN/OUT] physical address of Y */
-    void *CPhyAddr;                     /* [IN/OUT] physical address of CbCr */
-    void *YVirAddr;                     /* [IN/OUT] virtual address of Y */
-    void *CVirAddr;                     /* [IN/OUT] virtual address of CbCr */
-    int YSize;                          /* [IN/OUT] input size of Y data */
-    int CSize;                          /* [IN/OUT] input size of CbCr data */
-
-    /* C210 UMP feature */
-    unsigned int y_cookie;              /* [OUT] cookie for Y address */
-    unsigned int c_cookie;              /* [OUT] cookie for CbCr address, If it is 0, Y and CbCr is in continous memory */
-} SSBSIP_MFC_ENC_INPUT_INFO;
-
-typedef struct {
-    unsigned int dataSize;              /* [OUT] encoded data size(without header) */
-    unsigned int headerSize;            /* [OUT] encoded header size */
-    unsigned int frameType;             /* [OUT] frame type of encoded stream */
-    void *StrmPhyAddr;                  /* [OUT] physical address of Y */
-    void *StrmVirAddr;                  /* [OUT] virtual address of Y */
-    void *encodedYPhyAddr;              /* [OUT] physical address of Y which is flushed */
-    void *encodedCPhyAddr;              /* [OUT] physical address of C which is flushed */
-
-    /* C210 UMP feature */
-    unsigned int strm_cookie;           /* [OUT] cooke for stream buffer */
-    unsigned int y_encoded_cookie;      /* [OUT] cookie for Y address */
-    unsigned int c_encoded_cookie;      /* [OUT] cookie for CbCr address, If it is 0, Y and CbCr is in continous memory */
-} SSBSIP_MFC_ENC_OUTPUT_INFO;
-
-typedef struct {
-    /* common parameters */
-    SSBSIP_MFC_CODEC_TYPE codecType;    /* [IN] codec type */
-    int SourceWidth;                    /* [IN] width of video to be encoded */
-    int SourceHeight;                   /* [IN] height of video to be encoded */
-    int IDRPeriod;                      /* [IN] GOP number(interval of I-frame) */
-    int SliceMode;                      /* [IN] Multi slice mode */
-    int RandomIntraMBRefresh;           /* [IN] cyclic intra refresh */
-    int EnableFRMRateControl;           /* [IN] frame based rate control enable */
-    int Bitrate;                        /* [IN] rate control parameter(bit rate) */
-    int FrameQp;                        /* [IN] The quantization parameter of the frame */
-    int FrameQp_P;                      /* [IN] The quantization parameter of the P frame */
-    int QSCodeMax;                      /* [IN] Maximum Quantization value */
-    int QSCodeMin;                      /* [IN] Minimum Quantization value */
-    int CBRPeriodRf;                    /* [IN] Reaction coefficient parameter for rate control */
-    int PadControlOn;                   /* [IN] Enable padding control */
-    int LumaPadVal;                     /* [IN] Luma pel value used to fill padding area */
-    int CbPadVal;                       /* [IN] CB pel value used to fill padding area */
-    int CrPadVal;                       /* [IN] CR pel value used to fill padding area */
-    int FrameMap;                       /* [IN] Encoding input mode(tile mode or linear mode) */
-
-    /* H.264 specific parameters */
-    int ProfileIDC;                     /* [IN] profile */
-    int LevelIDC;                       /* [IN] level */
-    int FrameQp_B;                      /* [IN] The quantization parameter of the B frame */
-    int FrameRate;                      /* [IN] rate control parameter(frame rate) */
-    int SliceArgument;                  /* [IN] MB number or byte number */
-    int NumberBFrames;                  /* [IN] The number of consecutive B frame inserted */
-    int NumberReferenceFrames;          /* [IN] The number of reference pictures used */
-    int NumberRefForPframes;            /* [IN] The number of reference pictures used for encoding P pictures */
-    int LoopFilterDisable;              /* [IN] disable the loop filter */
-    int LoopFilterAlphaC0Offset;        /* [IN] Alpha & C0 offset for H.264 loop filter */
-    int LoopFilterBetaOffset;           /* [IN] Beta offset for H.264 loop filter */
-    int SymbolMode;                     /* [IN] The mode of entropy coding(CABAC, CAVLC) */
-    int PictureInterlace;               /* [IN] Enables the interlace mode */
-    int Transform8x8Mode;               /* [IN] Allow 8x8 transform(This is allowed only for high profile) */
-    int EnableMBRateControl;            /* [IN] Enable macroblock-level rate control */
-    int DarkDisable;                    /* [IN] Disable adaptive rate control on dark region */
-    int SmoothDisable;                  /* [IN] Disable adaptive rate control on smooth region */
-    int StaticDisable;                  /* [IN] Disable adaptive rate control on static region */
-    int ActivityDisable;                /* [IN] Disable adaptive rate control on high activity region */
-} SSBSIP_MFC_ENC_H264_PARAM;
-
-typedef struct {
-    /* common parameters */
-    SSBSIP_MFC_CODEC_TYPE codecType;    /* [IN] codec type */
-    int SourceWidth;                    /* [IN] width of video to be encoded */
-    int SourceHeight;                   /* [IN] height of video to be encoded */
-    int IDRPeriod;                      /* [IN] GOP number(interval of I-frame) */
-    int SliceMode;                      /* [IN] Multi slice mode */
-    int RandomIntraMBRefresh;           /* [IN] cyclic intra refresh */
-    int EnableFRMRateControl;           /* [IN] frame based rate control enable */
-    int Bitrate;                        /* [IN] rate control parameter(bit rate) */
-    int FrameQp;                        /* [IN] The quantization parameter of the frame */
-    int FrameQp_P;                      /* [IN] The quantization parameter of the P frame */
-    int QSCodeMax;                      /* [IN] Maximum Quantization value */
-    int QSCodeMin;                      /* [IN] Minimum Quantization value */
-    int CBRPeriodRf;                    /* [IN] Reaction coefficient parameter for rate control */
-    int PadControlOn;                   /* [IN] Enable padding control */
-    int LumaPadVal;                     /* [IN] Luma pel value used to fill padding area */
-    int CbPadVal;                       /* [IN] CB pel value used to fill padding area */
-    int CrPadVal;                       /* [IN] CR pel value used to fill padding area */
-    int FrameMap;                       /* [IN] Encoding input mode(tile mode or linear mode) */
-    int EnableMBRateControl;            /* [IN] Enable macroblock-level rate control, MFC6.x Only */
-
-    /* MPEG4 specific parameters */
-    int ProfileIDC;                     /* [IN] profile */
-    int LevelIDC;                       /* [IN] level */
-    int FrameQp_B;                      /* [IN] The quantization parameter of the B frame */
-    int TimeIncreamentRes;              /* [IN] frame rate */
-    int VopTimeIncreament;              /* [IN] frame rate */
-    int SliceArgument;                  /* [IN] MB number or byte number */
-    int NumberBFrames;                  /* [IN] The number of consecutive B frame inserted */
-    int DisableQpelME;                  /* [IN] disable quarter-pixel motion estimation */
-} SSBSIP_MFC_ENC_MPEG4_PARAM;
-
-typedef struct {
-    /* common parameters */
-    SSBSIP_MFC_CODEC_TYPE codecType;    /* [IN] codec type */
-    int SourceWidth;                    /* [IN] width of video to be encoded */
-    int SourceHeight;                   /* [IN] height of video to be encoded */
-    int IDRPeriod;                      /* [IN] GOP number(interval of I-frame) */
-    int SliceMode;                      /* [IN] Multi slice mode */
-    int RandomIntraMBRefresh;           /* [IN] cyclic intra refresh */
-    int EnableFRMRateControl;           /* [IN] frame based rate control enable */
-    int Bitrate;                        /* [IN] rate control parameter(bit rate) */
-    int FrameQp;                        /* [IN] The quantization parameter of the frame */
-    int FrameQp_P;                      /* [IN] The quantization parameter of the P frame */
-    int QSCodeMax;                      /* [IN] Maximum Quantization value */
-    int QSCodeMin;                      /* [IN] Minimum Quantization value */
-    int CBRPeriodRf;                    /* [IN] Reaction coefficient parameter for rate control */
-    int PadControlOn;                   /* [IN] Enable padding control */
-    int LumaPadVal;                     /* [IN] Luma pel value used to fill padding area */
-    int CbPadVal;                       /* [IN] CB pel value used to fill padding area */
-    int CrPadVal;                       /* [IN] CR pel value used to fill padding area */
-    int FrameMap;                       /* [IN] Encoding input mode(tile mode or linear mode) */
-    int EnableMBRateControl;            /* [IN] Enable macroblock-level rate control, MFC6.x Only */
-
-    /* H.263 specific parameters */
-    int FrameRate;                      /* [IN] rate control parameter(frame rate) */
-} SSBSIP_MFC_ENC_H263_PARAM;
-
-typedef struct {
-    int width;
-    int height;
-    int buf_width;
-    int buf_height;
-} SSBSIP_MFC_IMG_RESOLUTION;
-
-typedef struct {
-    int crop_top_offset;
-    int crop_bottom_offset;
-    int crop_left_offset;
-    int crop_right_offset;
-} SSBSIP_MFC_CROP_INFORMATION;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*--------------------------------------------------------------------------------*/
-/* Decoding APIs                                                                  */
-/*--------------------------------------------------------------------------------*/
-void *SsbSipMfcDecOpen(void);
-void *SsbSipMfcDecOpenExt(void *value);
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecInit(void *openHandle, SSBSIP_MFC_CODEC_TYPE codec_type, int Frameleng);
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecExe(void *openHandle, int lengthBufFill);
-//SSBSIP_MFC_ERROR_CODE SsbSipMfcDecExeNb(void *openHandle, int lengthBufFill);
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecClose(void *openHandle);
-void  *SsbSipMfcDecGetInBuf(void *openHandle, void **phyInBuf, int inputBufferSize);
-//SSBSIP_MFC_DEC_OUTBUF_STATUS SsbSipMfcDecWaitForOutBuf(void *openHandle, SSBSIP_MFC_DEC_OUTPUT_INFO *output_info);
-
-#if (defined(CONFIG_VIDEO_MFC_VCM_UMP) || defined(USE_UMP))
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecSetInBuf(void *openHandle, unsigned int secure_id, int size);
-#else
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecSetInBuf(void *openHandle, void *phyInBuf, void *virInBuf, int size);
-#endif
-
-SSBSIP_MFC_DEC_OUTBUF_STATUS SsbSipMfcDecGetOutBuf(void *openHandle, SSBSIP_MFC_DEC_OUTPUT_INFO *output_info);
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecSetConfig(void *openHandle, SSBSIP_MFC_DEC_CONF conf_type, void *value);
-SSBSIP_MFC_ERROR_CODE SsbSipMfcDecGetConfig(void *openHandle, SSBSIP_MFC_DEC_CONF conf_type, void *value);
-
-/*--------------------------------------------------------------------------------*/
-/* Encoding APIs                                                                  */
-/*--------------------------------------------------------------------------------*/
-void *SsbSipMfcEncOpen(void);
-void *SsbSipMfcEncOpenExt(void *value);
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncInit(void *openHandle, void *param);
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncExe(void *openHandle);
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncClose(void *openHandle);
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncGetInBuf(void *openHandle, SSBSIP_MFC_ENC_INPUT_INFO *input_info);
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncSetInBuf(void *openHandle, SSBSIP_MFC_ENC_INPUT_INFO *input_info);
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncGetOutBuf(void *openHandle, SSBSIP_MFC_ENC_OUTPUT_INFO *output_info);
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncSetOutBuf(void *openHandle, void *phyOutbuf, void *virOutbuf, int outputBufferSize);
-
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncSetConfig(void *openHandle, SSBSIP_MFC_ENC_CONF conf_type, void *value);
-SSBSIP_MFC_ERROR_CODE SsbSipMfcEncGetConfig(void *openHandle, SSBSIP_MFC_ENC_CONF conf_type, void *value);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SSBSIP_MFC_API_H_ */
diff --git a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/include/mfc_errno.h b/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/include/mfc_errno.h
deleted file mode 100644
index b8e96ab..0000000
--- a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/include/mfc_errno.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *              http://www.samsung.com/
- *
- * Global header for Samsung MFC (Multi Function Codec - FIMV) driver
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __MFC_ERRNO_H
-#define __MFC_ERRNO_H __FILE__
-
-enum mfc_ret_code {
-    MFC_OK = 1,
-    MFC_FAIL = -1000,
-    MFC_OPEN_FAIL = -1001,
-    MFC_CLOSE_FAIL = -1002,
-
-    MFC_DEC_INIT_FAIL = -2000,
-    MFC_DEC_EXE_TIME_OUT = -2001,
-    MFC_DEC_EXE_ERR = -2002,
-    MFC_DEC_GET_INBUF_FAIL = 2003,
-    MFC_DEC_SET_INBUF_FAIL = 2004,
-    MFC_DEC_GET_OUTBUF_FAIL = -2005,
-    MFC_DEC_GET_CONF_FAIL = -2006,
-    MFC_DEC_SET_CONF_FAIL = -2007,
-
-    MFC_ENC_INIT_FAIL = -3000,
-    MFC_ENC_EXE_TIME_OUT = -3001,
-    MFC_ENC_EXE_ERR = -3002,
-    MFC_ENC_GET_INBUF_FAIL = -3003,
-    MFC_ENC_SET_INBUF_FAIL = -3004,
-    MFC_ENC_GET_OUTBUF_FAIL = -3005,
-    MFC_ENC_SET_OUTBUF_FAIL = -3006,
-    MFC_ENC_GET_CONF_FAIL = -3007,
-    MFC_ENC_SET_CONF_FAIL = -3008,
-
-    MFC_STATE_INVALID = -4000,
-    MFC_DEC_HEADER_FAIL = -4001,
-    MFC_DEC_INIT_BUF_FAIL = -4002,
-    MFC_ENC_HEADER_FAIL = -5000,
-    MFC_ENC_PARAM_FAIL = -5001,
-    MFC_FRM_BUF_SIZE_FAIL = -6000,
-    MFC_FW_LOAD_FAIL = -6001,
-    MFC_FW_INIT_FAIL = -6002,
-    MFC_INST_NUM_EXCEEDED_FAIL = -6003,
-    MFC_MEM_ALLOC_FAIL = -6004,
-    MFC_MEM_INVALID_ADDR_FAIL = -6005,
-    MFC_MEM_MAPPING_FAIL = -6006,
-    MFC_GET_CONF_FAIL = -6007,
-    MFC_SET_CONF_FAIL = -6008,
-    MFC_INVALID_PARAM_FAIL = -6009,
-    MFC_API_FAIL = -9000,
-
-    MFC_CMD_FAIL = -1003,
-    MFC_SLEEP_FAIL = -1010,
-    MFC_WAKEUP_FAIL = -1020,
-
-    MFC_CLK_ON_FAIL = -1030,
-    MFC_CLK_OFF_FAIL = -1030,
-    MFC_PWR_ON_FAIL = -1040,
-    MFC_PWR_OFF_FAIL = -1041,
-};
-
-#endif /* __MFC_ERRNO_H */
diff --git a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/include/mfc_interface.h b/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/include/mfc_interface.h
deleted file mode 100644
index 2200e10..0000000
--- a/exynos/multimedia/codecs/video/exynos5/mfc_v4l2/include/mfc_interface.h
+++ /dev/null
@@ -1,555 +0,0 @@
-/*
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *              http://www.samsung.com/
- *
- * Global header for Samsung MFC (Multi Function Codec - FIMV) driver
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __MFC_INTERFACE_H
-#define __MFC_INTERFACE_H
-
-#include "mfc_errno.h"
-#include "SsbSipMfcApi.h"
-
-#define IOCTL_MFC_DEC_INIT          (0x00800001)
-#define IOCTL_MFC_ENC_INIT          (0x00800002)
-#define IOCTL_MFC_DEC_EXE           (0x00800003)
-#define IOCTL_MFC_ENC_EXE           (0x00800004)
-
-#define IOCTL_MFC_GET_IN_BUF        (0x00800010)
-#define IOCTL_MFC_FREE_BUF          (0x00800011)
-#define IOCTL_MFC_GET_REAL_ADDR     (0x00800012)
-#define IOCTL_MFC_GET_MMAP_SIZE     (0x00800014)
-#define IOCTL_MFC_SET_IN_BUF        (0x00800018)
-
-#define IOCTL_MFC_SET_CONFIG        (0x00800101)
-#define IOCTL_MFC_GET_CONFIG        (0x00800102)
-
-#define IOCTL_MFC_SET_BUF_CACHE     (0x00800201)
-
-/* MFC H/W support maximum 32 extra DPB. */
-#define MFC_MAX_EXTRA_DPB                      5
-#define MFC_MAX_DISP_DELAY              0xF
-
-#define MFC_LIB_VER_MAJOR               1
-#define MFC_LIB_VER_MINOR               00
-
-#define BUF_L_UNIT          (1024)
-#define Align(x, alignbyte)     (((x)+(alignbyte)-1)/(alignbyte)*(alignbyte))
-
-#define MFC_ENC_NUM_SRC_BUFS    2 /* Number of source buffers to request */
-#define MFC_ENC_MAX_DST_BUFS    2 /* The maximum number of buffers */
-#define MFC_ENC_NUM_PLANES  2 /* Number of planes used by MFC Input */
-
-#define MFC_DEC_NUM_SRC_BUFS    2  /* Number of source buffers to request */
-#define MFC_DEC_MAX_DST_BUFS    32 /* The maximum number of buffers */
-#define MFC_DEC_NUM_PLANES  2  /* Number of planes used by MFC output */
-
-enum inst_type {
-    DECODER = 0x1,
-    ENCODER = 0x2,
-};
-
-enum mfc_check_state {
-    MFCSTATE_PROCESSING = 0,
-    MFCSTATE_DEC_RES_DETECT,
-    MFCSTATE_DEC_TERMINATING,
-    MFCSTATE_ENC_NO_OUTPUT,
-};
-
-typedef enum {
-    MFC_UNPACKED_PB = 0,
-    MFC_PACKED_PB = 1
-} mfc_packed_mode;
-
-typedef enum {
-    SSBSIP_MFC_LAST_FRAME_NOT_RECEIVED = 0,
-    SSBSIP_MFC_LAST_FRAME_RECEIVED = 1,
-    SSBSIP_MFC_LAST_FRAME_PROCESSED = 2
-} SSBSIP_MFC_LAST_FRAME_STATUS;
-
-typedef enum {
-    MFC_USE_NONE         =  0x0000,
-    MFC_USE_YUV_BUFF     =  0x0001,
-    MFC_USE_STRM_BUFF    =  0x0010,
-    MFC_USE_SRC_STREAMON =  0x0100,
-    MFC_USE_DST_STREAMON =  0x1000,
-} s3c_mfc_interbuff_status;
-
-typedef struct {
-    int luma0;  /* per frame (or top field) */
-    int chroma0;    /* per frame (or top field) */
-    int luma1;  /* per frame (or bottom field) */
-    int chroma1;    /* per frame (or bottom field) */
-} SSBSIP_MFC_CRC_DATA;
-
-struct mfc_strm_ref_buf_arg {
-    unsigned int strm_ref_y;
-    unsigned int mv_ref_yc;
-};
-
-struct mfc_frame_buf_arg {
-    unsigned int luma;
-    unsigned int chroma;
-};
-
-struct mfc_enc_init_common_arg {
-    SSBSIP_MFC_CODEC_TYPE in_codec_type; /* [IN] codec type */
-
-    int in_width;                        /* [IN] width of YUV420 frame to be encoded */
-    int in_height;                       /* [IN] height of YUV420 frame to be encoded */
-
-    int in_gop_num;                      /* [IN] GOP Number (interval of I-frame) */
-    int in_vop_quant;   /* [IN] VOP quant */
-    int in_vop_quant_p; /* [IN] VOP quant for P frame */
-
-    /* [IN] RC enable */
-    /* [IN] RC enable (0:disable, 1:frame level RC) */
-    int in_rc_fr_en;
-    int in_rc_bitrate;  /* [IN]  RC parameter (bitrate in kbps) */
-
-    int in_rc_qbound_min;   /* [IN]  RC parameter (Q bound Min) */
-    int in_rc_qbound_max;   /* [IN]  RC parameter (Q bound Max) */
-    int in_rc_rpara;    /* [IN]  RC parameter (Reaction Coefficient) */
-
-    /* [IN] Multi-slice mode (0:single, 1:multiple) */
-    int in_ms_mode;
-    /* [IN] Multi-slice size (in num. of mb or byte) */
-    int in_ms_arg;
-
-    int in_mb_refresh;                   /* [IN] Macroblock refresh */
-
-    /* [IN] Enable (1) / Disable (0) padding with the specified values */
-    int in_pad_ctrl_on;
-
-    /* [IN] pad value if pad_ctrl_on is Enable */
-    int in_y_pad_val;
-    int in_cb_pad_val;
-    int in_cr_pad_val;
-
-    /* linear or tiled */
-    int in_frame_map;
-
-    unsigned int in_pixelcache;
-
-    unsigned int in_mapped_addr;
-    struct mfc_strm_ref_buf_arg out_u_addr;
-    struct mfc_strm_ref_buf_arg out_p_addr;
-    struct mfc_strm_ref_buf_arg out_buf_size;
-    unsigned int out_header_size;
-};
-
-struct mfc_enc_init_h263_arg {
-    int in_rc_framerate;    /* [IN]  RC parameter (framerate) */
-};
-
-struct mfc_enc_init_mpeg4_arg {
-    int in_profile;     /* [IN] profile */
-    int in_level;       /* [IN] level */
-
-    int in_vop_quant_b; /* [IN] VOP quant for B frame */
-
-    /* [IN] B frame number */
-    int in_bframenum;
-
-    /* [IN] Quarter-pel MC enable (1:enabled, 0:disabled) */
-    int in_quart_pixel;
-
-    int in_TimeIncreamentRes;   /* [IN] VOP time resolution */
-    int in_VopTimeIncreament;   /* [IN] Frame delta */
-};
-
-struct mfc_enc_init_h264_arg {
-    int in_profile;     /* [IN] profile */
-    int in_level;       /* [IN] level */
-
-    int in_vop_quant_b; /* [IN] VOP quant for B frame */
-
-    /* [IN] B frame number */
-    int in_bframenum;
-
-    /* [IN] interlace mode(0:progressive, 1:interlace) */
-    int in_interlace_mode;
-
-    /* [IN]  reference number */
-    int in_reference_num;
-    /* [IN]  reference number of P frame */
-    int in_ref_num_p;
-
-    int in_rc_framerate;    /* [IN]  RC parameter (framerate) */
-    int in_rc_mb_en;    /* [IN] RC enable (0:disable, 1:MB level RC) */
-    /* [IN] MB level rate control dark region adaptive feature */
-    int in_rc_mb_dark_dis;  /* (0:enable, 1:disable) */
-    /* [IN] MB level rate control smooth region adaptive feature */
-    int in_rc_mb_smooth_dis;    /* (0:enable, 1:disable) */
-    /* [IN] MB level rate control static region adaptive feature */
-    int in_rc_mb_static_dis;    /* (0:enable, 1:disable) */
-    /* [IN] MB level rate control activity region adaptive feature */
-    int in_rc_mb_activity_dis;  /* (0:enable, 1:disable) */
-
-    /* [IN]  disable deblocking filter idc */
-    int in_deblock_dis; /* (0: enable,1: disable, 2:Disable at slice boundary) */
-    /* [IN]  slice alpha c0 offset of deblocking filter */
-    int in_deblock_alpha_c0;
-    /* [IN]  slice beta offset of deblocking filter */
-    int in_deblock_beta;
-
-    /* [IN]  ( 0 : CAVLC, 1 : CABAC ) */
-    int in_symbolmode;
-    /* [IN] (0: only 4x4 transform, 1: allow using 8x8 transform) */
-    int in_transform8x8_mode;
-
-    /* [IN] Inter weighted parameter for mode decision */
-    int in_md_interweight_pps;
-    /* [IN] Intra weighted parameter for mode decision */
-    int in_md_intraweight_pps;
-};
-
-struct mfc_enc_init_arg {
-    struct mfc_enc_init_common_arg cmn;
-    union {
-        struct mfc_enc_init_h264_arg h264;
-        struct mfc_enc_init_mpeg4_arg mpeg4;
-        struct mfc_enc_init_h263_arg h263;
-    } codec;
-};
-
-struct mfc_enc_exe_arg {
-    SSBSIP_MFC_CODEC_TYPE in_codec_type; /* [IN]  codec type */
-    unsigned int in_Y_addr;              /* [IN]  In-buffer addr of Y component */
-    unsigned int in_CbCr_addr;           /* [IN]  In-buffer addr of CbCr component */
-    unsigned int in_Y_addr_vir;          /* [IN]  In-buffer addr of Y component */
-    unsigned int in_CbCr_addr_vir;       /* [IN]  In-buffer addr of CbCr component */
-    unsigned int in_strm_st;             /* [IN]  Out-buffer start addr of encoded strm */
-    unsigned int in_strm_end;            /* [IN]  Out-buffer end addr of encoded strm */
-    unsigned int in_frametag;   /* [IN]  unique frame ID */
-
-    unsigned int out_frame_type;         /* [OUT] frame type */
-    int out_encoded_size;                /* [OUT] Length of Encoded video stream */
-    unsigned int out_Y_addr;    /*[OUT]Out-buffer addr of encoded Y component */
-    unsigned int out_CbCr_addr; /*[OUT]Out-buffer addr of encoded CbCr component */
-    unsigned int out_frametag_top;  /* [OUT] unique frame ID of an output frame or top field */
-    unsigned int out_frametag_bottom;/* [OUT] unique frame ID of bottom field */
-
-#if defined(CONFIG_VIDEO_MFC_VCM_UMP)
-    unsigned int out_y_secure_id;
-    unsigned int out_c_secure_id;
-#elif defined(CONFIG_S5P_VMEM)
-    unsigned int out_y_cookie;
-    unsigned int out_c_cookie;
-#endif
-};
-
-struct mfc_dec_init_arg {
-    SSBSIP_MFC_CODEC_TYPE in_codec_type;    /* [IN] codec type */
-    int in_strm_buf;        /* [IN] address of stream buffer */
-    int in_strm_size;       /* [IN] filled size in stream buffer */
-    int in_packed_PB;                    /* [IN]  Is packed PB frame or not, 1: packedPB  0: unpacked */
-
-    unsigned int in_crc;        /* [IN] */
-    unsigned int in_pixelcache; /* [IN] */
-    unsigned int in_slice;      /* [IN] */
-    unsigned int in_numextradpb;    /* [IN] */
-
-    unsigned int in_mapped_addr;
-
-    int out_frm_width;      /* [OUT] width  of YUV420 frame */
-    int out_frm_height;     /* [OUT] height of YUV420 frame */
-    int out_buf_width;  /* [OUT] width  of YUV420 frame */
-    int out_buf_height; /* [OUT] height of YUV420 frame */
-
-    int out_dpb_cnt;    /* [OUT] the number of buffers which is nessary during decoding. */
-
-    int out_crop_right_offset; /* [OUT] crop information for h264 */
-    int out_crop_left_offset;
-    int out_crop_bottom_offset;
-    int out_crop_top_offset;
-};
-
-struct mfc_dec_exe_arg {
-    SSBSIP_MFC_CODEC_TYPE in_codec_type; /* [IN]  codec type */
-    int in_strm_buf;  /* [IN]  the physical address of STRM_BUF */
-    /* [IN]  Size of video stream filled in STRM_BUF */
-    int in_strm_size;
-    /* [IN] the address of dpb FRAME_BUF */
-    struct mfc_frame_buf_arg in_frm_buf;
-    /* [IN] size of dpb FRAME_BUF */
-    struct mfc_frame_buf_arg in_frm_size;
-    /* [IN] Unique frame ID eg. application specific timestamp */
-    unsigned int in_frametag;
-    /* [IN] immdiate Display for seek,thumbnail and one frame */
-    int in_immediately_disp;
-    /* [OUT]  the physical address of display buf */
-    int out_display_Y_addr;
-    /* [OUT]  the physical address of display buf */
-    int out_display_C_addr;
-    int out_display_status;
-    /* [OUT] unique frame ID of an output frame or top field */
-    unsigned int out_frametag_top;
-     /* [OUT] unique frame ID of bottom field */
-    unsigned int out_frametag_bottom;
-    int out_pic_time_top;
-    int out_pic_time_bottom;
-    int out_consumed_byte;
-
-    int out_crop_right_offset;
-    int out_crop_left_offset;
-    int out_crop_bottom_offset;
-    int out_crop_top_offset;
-
-    /* in new driver, each buffer offset must be return to the user */
-    int out_y_offset;
-    int out_c_offset;
-
-#if defined(CONFIG_VIDEO_MFC_VCM_UMP)
-    unsigned int out_y_secure_id;
-    unsigned int out_c_secure_id;
-#elif defined(CONFIG_S5P_VMEM)
-    unsigned int out_y_cookie;
-    unsigned int out_c_cookie;
-#endif
-    int out_img_width;                   /* [OUT] width  of YUV420 frame */
-    int out_img_height;                  /* [OUT] height of YUV420 frame */
-    int out_buf_width;                   /* [OUT] width  of YUV420 frame */
-    int out_buf_height;                  /* [OUT] height of YUV420 frame */
-
-    int out_disp_pic_frame_type;        /* [OUT] display picture frame type information */
-};
-
-struct mfc_get_config_arg {
-    /* [IN] Configurable parameter type */
-    int in_config_param;
-
-    /* [IN] Values to get for the configurable parameter. */
-    /* Maximum four integer values can be obtained; */
-    int out_config_value[4];
-};
-
-struct mfc_set_config_arg {
-    /* [IN] Configurable parameter type */
-    int in_config_param;
-
-    /* [IN]  Values to be set for the configurable parameter. */
-    /* Maximum four integer values can be set. */
-    int in_config_value[4];
-};
-
-struct mfc_get_real_addr_arg {
-    unsigned int key;
-    unsigned int addr;
-};
-
-struct mfc_buf_alloc_arg {
-    enum inst_type type;
-    int size;
-    /*
-    unsigned int mapped;
-    */
-    unsigned int align;
-
-    unsigned int addr;
-    /*
-    unsigned int phys;
-    */
-#if defined(CONFIG_VIDEO_MFC_VCM_UMP)
-    /* FIMXE: invalid secure id == -1 */
-    unsigned int secure_id;
-#elif defined(CONFIG_S5P_VMEM)
-    unsigned int cookie;
-#else
-    unsigned int offset;
-#endif
-};
-
-struct mfc_buf_free_arg {
-    unsigned int addr;
-};
-
-/* RMVME */
-struct mfc_mem_alloc_arg {
-    enum inst_type type;
-    int buff_size;
-    SSBIP_MFC_BUFFER_TYPE buf_cache_type;
-    unsigned int mapped_addr;
-#if defined(CONFIG_VIDEO_MFC_VCM_UMP)
-    unsigned int secure_id;
-#elif defined(CONFIG_S5P_VMEM)
-    unsigned int cookie;
-#else
-    unsigned int offset;
-#endif
-};
-
-struct mfc_mem_free_arg {
-    unsigned int key;
-};
-/* RMVME */
-
-union mfc_args {
-    /*
-    struct mfc_enc_init_arg enc_init;
-
-    struct mfc_enc_init_mpeg4_arg enc_init_mpeg4;
-    struct mfc_enc_init_mpeg4_arg enc_init_h263;
-    struct mfc_enc_init_h264_arg enc_init_h264;
-    */
-    struct mfc_enc_init_arg enc_init;
-    struct mfc_enc_exe_arg enc_exe;
-
-    struct mfc_dec_init_arg dec_init;
-    struct mfc_dec_exe_arg dec_exe;
-
-    struct mfc_get_config_arg get_config;
-    struct mfc_set_config_arg set_config;
-
-    struct mfc_buf_alloc_arg buf_alloc;
-    struct mfc_buf_free_arg buf_free;
-    struct mfc_get_real_addr_arg real_addr;
-
-    /* RMVME */
-    struct mfc_mem_alloc_arg mem_alloc;
-    struct mfc_mem_free_arg mem_free;
-    /* RMVME */
-};
-
-struct mfc_common_args {
-    enum mfc_ret_code ret_code; /* [OUT] error code */
-    union mfc_args args;
-};
-
-struct mfc_enc_vui_info {
-    int aspect_ratio_idc;
-};
-
-struct mfc_dec_fimv1_info {
-    int width;
-    int height;
-};
-
-struct mfc_enc_hier_p_qp {
-    int t0_frame_qp;
-    int t2_frame_qp;
-    int t3_frame_qp;
-};
-
-enum BUF_STATUS {
-    BUF_ENQUEUED,
-    BUF_DEQUEUED
-};
-
-struct mfc_dec_v4l2 {
-    char *mfc_src_bufs[MFC_DEC_NUM_SRC_BUFS];                   /* information of source buffers */
-    char *mfc_dst_bufs[MFC_DEC_MAX_DST_BUFS][MFC_DEC_NUM_PLANES];   /* information of destination buffers */
-    char *mfc_dst_phys[MFC_DEC_MAX_DST_BUFS][MFC_DEC_NUM_PLANES];   /* cma information of destination buffers */
-
-    unsigned int mfc_src_bufs_len;                      /* needed for munmap */
-    unsigned int mfc_dst_bufs_len[MFC_DEC_NUM_PLANES];  /* needed for munmap */
-
-    unsigned int mfc_num_src_bufs;  /* the number of source buffers */
-    unsigned int mfc_num_dst_bufs;  /* the number of destination buffers */
-
-    char mfc_src_buf_flags[MFC_DEC_NUM_SRC_BUFS];
-    int bBeingFinalized;
-    int allocIndex;
-    int beingUsedIndex;
-};
-
-struct mfc_enc_v4l2 {
-    char *mfc_src_bufs[MFC_ENC_NUM_SRC_BUFS][MFC_ENC_NUM_PLANES];
-    char *mfc_src_phys[MFC_ENC_NUM_SRC_BUFS][MFC_ENC_NUM_PLANES];
-    char *mfc_dst_bufs[MFC_ENC_MAX_DST_BUFS];
-
-    unsigned int mfc_src_bufs_len[MFC_ENC_NUM_PLANES];
-    unsigned int mfc_dst_bufs_len;
-
-    unsigned int mfc_num_src_bufs;
-    unsigned int mfc_num_dst_bufs;
-
-    unsigned int mfc_dst_bufs_bytes_used_len;
-    char mfc_src_buf_flags[MFC_ENC_NUM_SRC_BUFS];
-    int bRunning;
-    int bInputPhyVir;               /* Flag to use MFC src as physical or virtual 0: virtual  1: physical */
-    int beingUsedIndex;
-};
-
-typedef struct {
-    int magic;
-    int hMFC;
-    int hVMEM;
-    int width;
-    int height;
-    int sizeStrmBuf;
-    struct mfc_frame_buf_arg sizeFrmBuf;
-    int displayStatus;
-    int inter_buff_status;
-    unsigned int virFreeStrmAddr;
-    unsigned int phyStrmBuf;
-    unsigned int virStrmBuf;
-    unsigned int virMvRefYC;
-    struct mfc_frame_buf_arg phyFrmBuf;
-    struct mfc_frame_buf_arg virFrmBuf;
-    unsigned int mapped_addr;
-    unsigned int mapped_size;
-    struct mfc_common_args MfcArg;
-    SSBSIP_MFC_CODEC_TYPE codecType;
-    SSBSIP_MFC_DEC_OUTPUT_INFO decOutInfo;
-    unsigned int inframetag;
-    unsigned int outframetagtop;
-    unsigned int outframetagbottom;
-    unsigned int immediatelydisp;
-    unsigned int encodedHeaderSize;
-    int encodedDataSize;
-    unsigned int encodedframeType;
-    struct mfc_frame_buf_arg encodedphyFrmBuf;
-
-    unsigned int dec_crc;
-    unsigned int dec_pixelcache;
-    unsigned int dec_slice;
-    unsigned int dec_numextradpb;
-
-    int input_cookie;
-    int input_secure_id;
-    int input_size;
-
-    /* to support non-blocking mode */
-    unsigned int encode_cnt;
-
-    struct mfc_dec_v4l2 v4l2_dec;
-    struct mfc_enc_v4l2 v4l2_enc;
-
-    int enc_frameskip;
-    int cacheablebuffer;
-    struct mfc_dec_fimv1_info fimv1_res;
-    SSBSIP_MFC_LAST_FRAME_STATUS lastframe;
-    SSBSIP_MFC_INSTRM_MODE_TYPE framemap;
-
-    int hier_p_enable;
-    struct mfc_enc_hier_p_qp hier_qp_value;
-
-    /*ION related*/
-    int ion_fd;
-    int dst_ion_fd[MFC_DEC_MAX_DST_BUFS][MFC_DEC_NUM_PLANES];
-} _MFCLIB;
-
-#define ENC_PROFILE_LEVEL(profile, level)      ((profile) | ((level) << 8))
-#define ENC_RC_QBOUND(min_qp, max_qp)          ((min_qp) | ((max_qp) << 8))
-
-#define SSBSIP_MFC_FAIL                  (0)
-
-#endif /* __MFC_INTERFACE_H */
diff --git a/exynos/multimedia/openmax/Android.mk b/exynos/multimedia/openmax/Android.mk
index 61bdff7..234d592 100644
--- a/exynos/multimedia/openmax/Android.mk
+++ b/exynos/multimedia/openmax/Android.mk
@@ -26,10 +26,6 @@
 include $(SEC_OMX_COMPONENT)/video/enc/h264/Android.mk
 include $(SEC_OMX_COMPONENT)/video/enc/mpeg4/Android.mk
 
-ifeq ($(filter-out exynos5,$(TARGET_BOARD_PLATFORM)),)
-include $(SEC_OMX_COMPONENT)/video/dec/vp8/Android.mk
-endif
-
 ifeq ($(BOARD_USE_ALP_AUDIO), true)
 include $(SEC_OMX_COMPONENT)/audio/dec/Android.mk
 include $(SEC_OMX_COMPONENT)/audio/dec/mp3/Android.mk
diff --git a/exynos/multimedia/utils/csc/Android.mk b/exynos/multimedia/utils/csc/Android.mk
index 3bc3577..ae00b4f 100644
--- a/exynos/multimedia/utils/csc/Android.mk
+++ b/exynos/multimedia/utils/csc/Android.mk
@@ -5,7 +5,3 @@
 ifeq ($(filter-out exynos4,$(TARGET_BOARD_PLATFORM)),)
 include   $(LOCAL_PATH)/exynos4/Android.mk
 endif
-
-ifeq ($(filter-out exynos5,$(TARGET_BOARD_PLATFORM)),)
-include   $(LOCAL_PATH)/exynos5/Android.mk
-endif
diff --git a/exynos/multimedia/utils/csc/exynos5/Android.mk b/exynos/multimedia/utils/csc/exynos5/Android.mk
deleted file mode 100644
index 955a3e2..0000000
--- a/exynos/multimedia/utils/csc/exynos5/Android.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_COPY_HEADERS_TO := libsecmm
-LOCAL_COPY_HEADERS := \
-	color_space_convertor.h \
-	csc_fimc.h
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := \
-	color_space_convertor.c \
-	csc_fimc.cpp \
-	csc_tiled_to_linear_y_neon.s \
-	csc_tiled_to_linear_uv_neon.s \
-	csc_tiled_to_linear_uv_deinterleave_neon.s \
-	csc_interleave_memcpy_neon.s
-
-LOCAL_C_INCLUDES := \
-	$(TOP)/device/samsung/multimedia/openmax/include/khronos \
-	$(TOP)/device/samsung/$(TARGET_BOARD_PLATFORM)/include
-
-LOCAL_MODULE := libseccscapi
-
-LOCAL_PRELINK_MODULE := false
-
-LOCAL_CFLAGS :=
-
-LOCAL_ARM_MODE := arm
-
-LOCAL_STATIC_LIBRARIES :=
-LOCAL_SHARED_LIBRARIES := liblog libfimc
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/exynos/multimedia/utils/csc/exynos5/color_space_convertor.c b/exynos/multimedia/utils/csc/exynos5/color_space_convertor.c
deleted file mode 100644
index a651d62..0000000
--- a/exynos/multimedia/utils/csc/exynos5/color_space_convertor.c
+++ /dev/null
@@ -1,640 +0,0 @@
-/*
- *
- * Copyright 2010 Samsung Electronics S.LSI Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * @file    color_space_convertor.c
- *
- * @brief   SEC_OMX specific define. It support MFC 6.x tiled.
- *
- * @author  ShinWon Lee (shinwon.lee@samsung.com)
- *
- * @version 1.0
- *
- * @history
- *   2011.12.01 : Create
- */
-
-#include "stdio.h"
-#include "stdlib.h"
-#include "color_space_convertor.h"
-
-/* 2D Configurable tiled memory access (TM)
- * Return the linear address from tiled position (x, y) */
-unsigned int Tile2D_To_Linear(
-    unsigned int width,
-    unsigned int height,
-    unsigned int xpos,
-    unsigned int ypos,
-    int crFlag)
-{
-    int  tileNumX;
-    int  tileX, tileY;
-    int  tileAddr;
-    int  offset;
-    int  addr;
-
-    width = ((width + 15) / 16) * 16;
-    tileNumX = width / 16;
-
-    /* crFlag - 0: Y plane, 1: CbCr plane */
-    if (crFlag == 0) {
-        tileX = xpos / 16;
-        tileY = ypos / 16;
-        tileAddr = tileY * tileNumX + tileX;
-        offset = (ypos & 15) * 16 + (xpos & 15);
-        addr = (tileAddr << 8) | offset;
-    } else {
-        tileX = xpos / 16;
-        tileY = ypos / 8;
-        tileAddr = tileY * tileNumX + tileX;
-        offset = (ypos & 7) * 16 + (xpos & 15);
-        addr = (tileAddr << 7) | offset;
-    }
-
-    return addr;
-}
-
-/*
- * De-interleaves src to dest1, dest2
- *
- * @param dest1
- *   Address of de-interleaved data[out]
- *
- * @param dest2
- *   Address of de-interleaved data[out]
- *
- * @param src
- *   Address of interleaved data[in]
- *
- * @param src_size
- *   Size of interleaved data[in]
- */
-void csc_deinterleave_memcpy(
-    unsigned char *dest1,
-    unsigned char *dest2,
-    unsigned char *src,
-    unsigned int src_size)
-{
-    unsigned int i = 0;
-    for(i=0; i<src_size/2; i++) {
-        dest1[i] = src[i*2];
-        dest2[i] = src[i*2+1];
-    }
-}
-
-/*
- * Interleaves src1, src2 to dest
- *
- * @param dest
- *   Address of interleaved data[out]
- *
- * @param src1
- *   Address of de-interleaved data[in]
- *
- * @param src2
- *   Address of de-interleaved data[in]
- *
- * @param src_size
- *   Size of de-interleaved data[in]
- */
-void csc_interleave_memcpy(
-    unsigned char *dest,
-    unsigned char *src1,
-    unsigned char *src2,
-    unsigned int src_size)
-{
-    unsigned int i = 0;
-    for(i=0; i<src_size; i++) {
-        dest[i*2] = src1[i];
-        dest[i*2+1] = src2[i];
-    }
-}
-
-/*
- * Converts tiled data to linear for mfc 6.x tiled
- * 1. y of nv12t to y of yuv420p
- * 2. y of nv12t to y of yuv420s
- *
- * @param dst
- *   y address of yuv420[out]
- *
- * @param src
- *   y address of nv12t[in]
- *
- * @param yuv420_width
- *   real width of yuv420[in]
- *   it should be even
- *
- * @param yuv420_height
- *   real height of yuv420[in]
- *   it should be even.
- *
- */
-void csc_tiled_to_linear_y(
-    unsigned char *y_dst,
-    unsigned char *y_src,
-    unsigned int width,
-    unsigned int height)
-{
-    unsigned int i, j, k;
-    unsigned int aligned_width, aligned_height;
-    unsigned int tiled_width;
-    unsigned int src_offset, dst_offset;
-
-    aligned_height = height & (~0xF);
-    aligned_width = width & (~0xF);
-    tiled_width = ((width + 15) >> 4) << 4;
-
-    for (i = 0; i < aligned_height; i = i + 16) {
-        for (j = 0; j<aligned_width; j = j + 16) {
-            src_offset = (tiled_width * i) + (j << 4);
-            dst_offset = width * i + j;
-            for (k = 0; k < 8; k++) {
-                memcpy(y_dst + dst_offset, y_src + src_offset, 16);
-                src_offset += 16;
-                dst_offset += width;
-                memcpy(y_dst + dst_offset, y_src + src_offset, 16);
-                src_offset += 16;
-                dst_offset += width;
-            }
-        }
-        if (aligned_width != width) {
-            src_offset = (tiled_width * i) + (j << 4);
-            dst_offset = width * i + j;
-            for (k = 0; k < 8; k++) {
-                memcpy(y_dst + dst_offset, y_src + src_offset, width - j);
-                src_offset += 16;
-                dst_offset += width;
-                memcpy(y_dst + dst_offset, y_src + src_offset, width - j);
-                src_offset += 16;
-                dst_offset += width;
-            }
-        }
-    }
-
-    if (aligned_height != height) {
-        for (j = 0; j<aligned_width; j = j + 16) {
-            src_offset = (tiled_width * i) + (j << 4);
-            dst_offset = width * i + j;
-            for (k = 0; k < height - aligned_height; k = k + 2) {
-                memcpy(y_dst + dst_offset, y_src + src_offset, 16);
-                src_offset += 16;
-                dst_offset += width;
-                memcpy(y_dst + dst_offset, y_src + src_offset, 16);
-                src_offset += 16;
-                dst_offset += width;
-            }
-        }
-        if (aligned_width != width) {
-            src_offset = (tiled_width * i) + (j << 4);
-            dst_offset = width * i + j;
-            for (k = 0; k < height - aligned_height; k = k + 2) {
-                memcpy(y_dst + dst_offset, y_src + src_offset, width - j);
-                src_offset += 16;
-                dst_offset += width;
-                memcpy(y_dst + dst_offset, y_src + src_offset, width - j);
-                src_offset += 16;
-                dst_offset += width;
-            }
-        }
-    }
-}
-
-/*
- * Converts tiled data to linear for mfc 6.x tiled
- * 1. uv of nv12t to uv of yuv420s
- *
- * @param dst
- *   uv address of yuv420s[out]
- *
- * @param src
- *   uv address of nv12t[in]
- *
- * @param yuv420_width
- *   real width of yuv420s[in]
- *
- * @param yuv420_height
- *   real height of yuv420s[in]
- *
- */
-void csc_tiled_to_linear_uv(
-    unsigned char *uv_dst,
-    unsigned char *uv_src,
-    unsigned int width,
-    unsigned int height)
-{
-    unsigned int i, j, k;
-    unsigned int aligned_width, aligned_height;
-    unsigned int tiled_width;
-    unsigned int src_offset, dst_offset;
-
-    aligned_height = height & (~0x7);
-    aligned_width = width & (~0xF);
-    tiled_width = ((width + 15) >> 4) << 4;
-
-    for (i = 0; i < aligned_height; i = i + 8) {
-        for (j = 0; j<aligned_width; j = j + 16) {
-            src_offset = (tiled_width * i) + (j << 3);
-            dst_offset = width * i + j;
-            for (k = 0; k < 4; k++) {
-                memcpy(uv_dst + dst_offset, uv_src + src_offset, 16);
-                src_offset += 16;
-                dst_offset += width;
-                memcpy(uv_dst + dst_offset, uv_src + src_offset, 16);
-                src_offset += 16;
-                dst_offset += width;
-            }
-        }
-        if (aligned_width != width) {
-            src_offset = (tiled_width * i) + (j << 3);
-            dst_offset = width * i + j;
-            for (k = 0; k < 4; k++) {
-                memcpy(uv_dst + dst_offset, uv_src + src_offset, width - j);
-                src_offset += 16;
-                dst_offset += width;
-                memcpy(uv_dst + dst_offset, uv_src + src_offset, width - j);
-                src_offset += 16;
-                dst_offset += width;
-            }
-        }
-    }
-
-    if (aligned_height != height) {
-        for (j = 0; j<aligned_width; j = j + 16) {
-            src_offset = (tiled_width * i) + (j << 3);
-            dst_offset = width * i + j;
-            for (k = 0; k < height - aligned_height; k = k + 1) {
-                memcpy(uv_dst + dst_offset, uv_src + src_offset, 16);
-                src_offset += 16;
-                dst_offset += width;
-            }
-        }
-        if (aligned_width != width) {
-            src_offset = (tiled_width * i) + (j << 3);
-            dst_offset = width * i + j;
-            for (k = 0; k < height - aligned_height; k = k + 1) {
-                memcpy(uv_dst + dst_offset, uv_src + src_offset, width - j);
-                src_offset += 16;
-                dst_offset += width;
-            }
-        }
-    }
-}
-
-/*
- * Converts tiled data to linear for mfc 6.x tiled
- * 1. uv of nt12t to uv of yuv420p
- *
- * @param u_dst
- *   u address of yuv420p[out]
- *
- * @param v_dst
- *   v address of yuv420p[out]
- *
- * @param uv_src
- *   uv address of nt12t[in]
- *
- * @param yuv420_width
- *   real width of yuv420p[in]
- *
- * @param yuv420_height
- *   real height of yuv420p[in]
- */
-void csc_tiled_to_linear_uv_deinterleave(
-    unsigned char *u_dst,
-    unsigned char *v_dst,
-    unsigned char *uv_src,
-    unsigned int width,
-    unsigned int height)
-{
-    unsigned int i, j, k;
-    unsigned int aligned_width, aligned_height;
-    unsigned int tiled_width;
-    unsigned int src_offset, dst_offset;
-
-    aligned_height = height & (~0x7);
-    aligned_width = width & (~0xF);
-    tiled_width = ((width + 15) >> 4) << 4;
-
-    for (i = 0; i < aligned_height; i = i + 8) {
-        for (j = 0; j<aligned_width; j = j + 16) {
-            src_offset = (tiled_width * i) + (j << 3);
-            dst_offset = (width >> 1) * i + (j >> 1);
-            for (k = 0; k < 4; k++) {
-                csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset,
-                                        uv_src + src_offset, 16);
-                src_offset += 16;
-                dst_offset += width >> 1;
-                csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset,
-                                        uv_src + src_offset, 16);
-                src_offset += 16;
-                dst_offset += width >> 1;
-            }
-        }
-        if (aligned_width != width) {
-            src_offset = (tiled_width * i) + (j << 3);
-            dst_offset = (width >> 1) * i + (j >> 1);
-            for (k = 0; k < 4; k++) {
-                csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset,
-                                        uv_src + src_offset, width - j);
-                src_offset += 16;
-                dst_offset += width >> 1;
-                csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset,
-                                        uv_src + src_offset, width - j);
-                src_offset += 16;
-                dst_offset += width >> 1;
-            }
-        }
-    }
-    if (aligned_height != height) {
-        for (j = 0; j<aligned_width; j = j + 16) {
-            src_offset = (tiled_width * i) + (j << 3);
-            dst_offset = (width >> 1) * i + (j >> 1);
-            for (k = 0; k < height - aligned_height; k = k + 1) {
-                csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset,
-                                        uv_src + src_offset, 16);
-                src_offset += 16;
-                dst_offset += width >> 1;
-            }
-        }
-        if (aligned_width != width) {
-            src_offset = (tiled_width * i) + (j << 3);
-            dst_offset = (width >> 1) * i + (j >> 1);
-            for (k = 0; k < height - aligned_height; k = k + 1) {
-                csc_deinterleave_memcpy(u_dst + dst_offset, v_dst + dst_offset,
-                                        uv_src + src_offset, width - j);
-                src_offset += 16;
-                dst_offset += width >> 1;
-            }
-        }
-    }
-}
-
-/*
- * Converts linear data to tiled
- * It supports mfc 6.x tiled
- * 1. y of yuv420 to y of nv12t
- *
- * @param dst
- *   y address of nv12t[out]
- *
- * @param src
- *   y address of yuv420[in]
- *
- * @param yuv420_width
- *   real width of yuv420[in]
- *   it should be even
- *
- * @param yuv420_height
- *   real height of yuv420[in]
- *   it should be even.
- *
- */
-void csc_linear_to_tiled_y(
-    unsigned char *y_dst,
-    unsigned char *y_src,
-    unsigned int width,
-    unsigned int height)
-{
-
-}
-
-/*
- * Converts and interleaves linear data to tiled
- * It supports mfc 6.x tiled
- * 1. uv of nv12t to uv of yuv420
- *
- * @param dst
- *   uv address of nv12t[out]
- *
- * @param src
- *   u address of yuv420[in]
- *
- * @param src
- *   v address of yuv420[in]
- *
- * @param yuv420_width
- *   real width of yuv420[in]
- *
- * @param yuv420_height
- *   real height of yuv420[in]
- *
- */
-void csc_linear_to_tiled_uv(
-    unsigned char *uv_dst,
-    unsigned char *u_src,
-    unsigned char *v_src,
-    unsigned int width,
-    unsigned int height)
-{
-
-}
-
-void Tile2D_To_YUV420(unsigned char *Y_plane, unsigned char *Cb_plane, unsigned char *Cr_plane,
-                        unsigned int y_addr, unsigned int c_addr, unsigned int width, unsigned int height)
-{
-    int x, y, j, k, l;
-    int out_of_width, actual_width;
-    unsigned int base_addr, data;
-
-    // y: 0, 16, 32, ...
-    for (y = 0; y < height; y += 16) {
-        // x: 0, 16, 32, ...
-        for (x = 0; x < width; x += 16) {
-            out_of_width = (x + 16) > width ? 1 : 0;
-            base_addr = y_addr + Tile2D_To_Linear(width, height, x, y, 0);
-
-            for (k = 0; (k < 16) && ((y + k) < height); k++) {
-                actual_width = out_of_width ? ((width%4)?((width%16) / 4 + 1) : ((width%16) / 4)) : 4;
-                for (l = 0; l < actual_width; l++) {
-                    data = *((unsigned int*)(base_addr + 16*k + l*4));
-                    for (j = 0; (j < 4) && (x + l*4 + j) < width; j++) {
-                        Y_plane[(y+k)*width + x + l*4 +j] = (data>>(8*j))&0xff;
-                    }
-                }
-            }
-        }
-    }
-
-    for (y = 0; y < height/2; y += 8) {
-        for (x = 0; x < width; x += 16) {
-            out_of_width = (x + 16) > width ? 1 : 0;
-            base_addr = c_addr + Tile2D_To_Linear(width, height/2, x, y, 1);
-            for (k = 0; (k < 8) && ((y+k) < height/2); k++) {
-                actual_width = out_of_width ? ((width%4) ? ((width%16) / 4 + 1) : ((width%16) / 4)) : 4;
-                for (l = 0; l < actual_width; l++) {
-                    data = *((unsigned int*)(base_addr + 16*k + l*4));
-                    for (j = 0; (j < 2) && (x/2 + l*2 +j) < width/2; j++) {
-                        Cb_plane[(y+k)*width/2 + x/2 + l*2 +j] = (data>> (8*2*j))&0xff;
-                        Cr_plane[(y+k)*width/2 + x/2 + l*2 +j] = (data>>(8*2*j+8))&0xff;
-                    }
-                }
-            }
-        }
-    }
-}
-
-/*
- * Converts RGB565 to YUV420P
- *
- * @param y_dst
- *   Y plane address of YUV420P[out]
- *
- * @param u_dst
- *   U plane address of YUV420P[out]
- *
- * @param v_dst
- *   V plane address of YUV420P[out]
- *
- * @param rgb_src
- *   Address of RGB565[in]
- *
- * @param width
- *   Width of RGB565[in]
- *
- * @param height
- *   Height of RGB565[in]
- */
-void csc_RGB565_to_YUV420P(
-    unsigned char *y_dst,
-    unsigned char *u_dst,
-    unsigned char *v_dst,
-    unsigned char *rgb_src,
-    int width,
-    int height)
-{
-    unsigned int i, j;
-    unsigned int tmp;
-
-    unsigned int R, G, B;
-    unsigned int Y, U, V;
-
-    unsigned int offset1 = width * height;
-    unsigned int offset2 = width/2 * height/2;
-
-    unsigned short int *pSrc = (unsigned short int *)rgb_src;
-
-    unsigned char *pDstY = (unsigned char *)y_dst;
-    unsigned char *pDstU = (unsigned char *)u_dst;
-    unsigned char *pDstV = (unsigned char *)v_dst;
-
-    unsigned int yIndex = 0;
-    unsigned int uIndex = 0;
-    unsigned int vIndex = 0;
-
-    for (j = 0; j < height; j++) {
-        for (i = 0; i < width; i++) {
-            tmp = pSrc[j * width + i];
-
-            R = (tmp & 0x0000F800) >> 8;
-            G = (tmp & 0x000007E0) >> 3;
-            B = (tmp & 0x0000001F);
-            B = B << 3;
-
-            Y = ((66 * R) + (129 * G) + (25 * B) + 128);
-            Y = Y >> 8;
-            Y += 16;
-
-            pDstY[yIndex++] = (unsigned char)Y;
-
-            if ((j % 2) == 0 && (i % 2) == 0) {
-                U = ((-38 * R) - (74 * G) + (112 * B) + 128);
-                U = U >> 8;
-                U += 128;
-                V = ((112 * R) - (94 * G) - (18 * B) + 128);
-                V = V >> 8;
-                V += 128;
-
-                pDstU[uIndex++] = (unsigned char)U;
-                pDstV[vIndex++] = (unsigned char)V;
-            }
-        }
-    }
-}
-
-/*
- * Converts RGB565 to YUV420SP
- *
- * @param y_dst
- *   Y plane address of YUV420SP[out]
- *
- * @param uv_dst
- *   UV plane address of YUV420SP[out]
- *
- * @param rgb_src
- *   Address of RGB565[in]
- *
- * @param width
- *   Width of RGB565[in]
- *
- * @param height
- *   Height of RGB565[in]
- */
-void csc_RGB565_to_YUV420SP(
-    unsigned char *y_dst,
-    unsigned char *uv_dst,
-    unsigned char *rgb_src,
-    int width,
-    int height)
-{
-    unsigned int i, j;
-    unsigned int tmp;
-
-    unsigned int R, G, B;
-    unsigned int Y, U, V;
-
-    unsigned int offset = width * height;
-
-    unsigned short int *pSrc = (unsigned short int *)rgb_src;
-
-    unsigned char *pDstY = (unsigned char *)y_dst;
-    unsigned char *pDstUV = (unsigned char *)uv_dst;
-
-    unsigned int yIndex = 0;
-    unsigned int uvIndex = 0;
-
-    for (j = 0; j < height; j++) {
-        for (i = 0; i < width; i++) {
-            tmp = pSrc[j * width + i];
-
-            R = (tmp & 0x0000F800) >> 11;
-            R = R * 8;
-            G = (tmp & 0x000007E0) >> 5;
-            G = G * 4;
-            B = (tmp & 0x0000001F);
-            B = B * 8;
-
-            Y = ((66 * R) + (129 * G) + (25 * B) + 128);
-            Y = Y >> 8;
-            Y += 16;
-
-            pDstY[yIndex++] = (unsigned char)Y;
-
-            if ((j % 2) == 0 && (i % 2) == 0) {
-                U = ((-38 * R) - (74 * G) + (112 * B) + 128);
-                U = U >> 8;
-                U += 128;
-                V = ((112 * R) - (94 * G) - (18 * B) + 128);
-                V = V >> 8;
-                V += 128;
-
-                pDstUV[uvIndex++] = (unsigned char)U;
-                pDstUV[uvIndex++] = (unsigned char)V;
-            }
-        }
-    }
-}
diff --git a/exynos/multimedia/utils/csc/exynos5/color_space_convertor.h b/exynos/multimedia/utils/csc/exynos5/color_space_convertor.h
deleted file mode 100644
index 202011e..0000000
--- a/exynos/multimedia/utils/csc/exynos5/color_space_convertor.h
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
- *
- * Copyright 2010 Samsung Electronics S.LSI Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * @file    color_space_convertor.h
- * @brief   SEC_OMX specific define. It support MFC 6.x tiled.
- *   NV12T(tiled) layout:
- *   Each element is not pixel. It is 64x32 pixel block.
- *   uv pixel block is interleaved as u v u v u v ...
- *   y1    y2    y7    y8    y9    y10   y15   y16
- *   y3    y4    y5    y6    y11   y12   y13   y14
- *   y17   y18   y23   y24   y25   y26   y31   y32
- *   y19   y20   y21   y22   y27   y28   y29   y30
- *   uv1   uv2   uv7   uv8   uv9   uv10  uv15  uv16
- *   uv3   uv4   uv5   uv6   uv11  uv12  uv13  uv14
- *   YUV420Planar(linear) layout:
- *   Each element is not pixel. It is 64x32 pixel block.
- *   y1    y2    y3    y4    y5    y6    y7    y8
- *   y9    y10   y11   y12   y13   y14   y15   y16
- *   y17   y18   y19   y20   y21   y22   y23   y24
- *   y25   y26   y27   y28   y29   y30   y31   y32
- *   u1    u2    u3    u4    u5    u6    u7    u8
- *   v1    v2    v3    v4    v5    v6    v7    v8
- *   YUV420Semiplanar(linear) layout:
- *   Each element is not pixel. It is 64x32 pixel block.
- *   uv pixel block is interleaved as u v u v u v ...
- *   y1    y2    y3    y4    y5    y6    y7    y8
- *   y9    y10   y11   y12   y13   y14   y15   y16
- *   y17   y18   y19   y20   y21   y22   y23   y24
- *   y25   y26   y27   y28   y29   y30   y31   y32
- *   uv1   uv2   uv3   uv4   uv5   uv6   uv7   uv8
- *   uv9   uv10  uv11  uv12  uv13  uv14  uv15  uv16
- * @author  ShinWon Lee (shinwon.lee@samsung.com)
- * @version 1.0
- * @history
- *   2011.12.01 : Create
- */
-
-#ifndef COLOR_SPACE_CONVERTOR_H_
-#define COLOR_SPACE_CONVERTOR_H_
-
-/*--------------------------------------------------------------------------------*/
-/* Format Conversion API                                                          */
-/*--------------------------------------------------------------------------------*/
-/* C Code */
-/*
- * De-interleaves src to dest1, dest2
- *
- * @param dest1
- *   Address of de-interleaved data[out]
- *
- * @param dest2
- *   Address of de-interleaved data[out]
- *
- * @param src
- *   Address of interleaved data[in]
- *
- * @param src_size
- *   Size of interleaved data[in]
- */
-void csc_deinterleave_memcpy(
-    unsigned char *dest1,
-    unsigned char *dest2,
-    unsigned char *src,
-    unsigned int src_size);
-
-/*
- * Interleaves src1, src2 to dest
- *
- * @param dest
- *   Address of interleaved data[out]
- *
- * @param src1
- *   Address of de-interleaved data[in]
- *
- * @param src2
- *   Address of de-interleaved data[in]
- *
- * @param src_size
- *   Size of de-interleaved data[in]
- */
-void csc_interleave_memcpy(
-    unsigned char *dest,
-    unsigned char *src1,
-    unsigned char *src2,
-    unsigned int src_size);
-
-/*
- * Converts tiled data to linear
- * It supports mfc 6.x tiled
- * 1. y of nv12t to y of yuv420p
- * 2. y of nv12t to y of yuv420s
- *
- * @param dst
- *   y address of yuv420[out]
- *
- * @param src
- *   y address of nv12t[in]
- *
- * @param yuv420_width
- *   real width of yuv420[in]
- *   it should be even
- *
- * @param yuv420_height
- *   real height of yuv420[in]
- *   it should be even.
- *
- */
-void csc_tiled_to_linear_y(
-    unsigned char *y_dst,
-    unsigned char *y_src,
-    unsigned int width,
-    unsigned int height);
-
-/*
- * Converts tiled data to linear
- * It supports mfc 6.x tiled
- * 1. uv of nv12t to y of yuv420s
- *
- * @param dst
- *   uv address of yuv420s[out]
- *
- * @param src
- *   uv address of nv12t[in]
- *
- * @param yuv420_width
- *   real width of yuv420s[in]
- *
- * @param yuv420_height
- *   real height of yuv420s[in]
- *
- */
-void csc_tiled_to_linear_uv(
-    unsigned char *uv_dst,
-    unsigned char *uv_src,
-    unsigned int width,
-    unsigned int height);
-
-/*
- * Converts tiled data to linear
- * It supports mfc 6.x tiled
- * 1. uv of nt12t to uv of yuv420p
- *
- * @param u_dst
- *   u address of yuv420p[out]
- *
- * @param v_dst
- *   v address of yuv420p[out]
- *
- * @param uv_src
- *   uv address of nt12t[in]
- *
- * @param yuv420_width
- *   real width of yuv420p[in]
- *
- * @param yuv420_height
- *   real height of yuv420p[in]
- */
-void csc_tiled_to_linear_uv_deinterleave(
-    unsigned char *u_dst,
-    unsigned char *v_dst,
-    unsigned char *uv_src,
-    unsigned int width,
-    unsigned int height);
-
-/*
- * Converts linear data to tiled
- * It supports mfc 6.x tiled
- * 1. y of yuv420 to y of nv12t
- *
- * @param dst
- *   y address of nv12t[out]
- *
- * @param src
- *   y address of yuv420[in]
- *
- * @param yuv420_width
- *   real width of yuv420[in]
- *   it should be even
- *
- * @param yuv420_height
- *   real height of yuv420[in]
- *   it should be even.
- *
- */
-void csc_linear_to_tiled_y(
-    unsigned char *y_dst,
-    unsigned char *y_src,
-    unsigned int width,
-    unsigned int height);
-
-/*
- * Converts and interleaves linear data to tiled
- * It supports mfc 6.x tiled
- * 1. uv of nv12t to uv of yuv420
- *
- * @param dst
- *   uv address of nv12t[out]
- *
- * @param src
- *   u address of yuv420[in]
- *
- * @param src
- *   v address of yuv420[in]
- *
- * @param yuv420_width
- *   real width of yuv420[in]
- *
- * @param yuv420_height
- *   real height of yuv420[in]
- *
- */
-void csc_linear_to_tiled_uv(
-    unsigned char *uv_dst,
-    unsigned char *u_src,
-    unsigned char *v_src,
-    unsigned int width,
-    unsigned int height);
-
-/*
- * Converts RGB565 to YUV420P
- *
- * @param y_dst
- *   Y plane address of YUV420P[out]
- *
- * @param u_dst
- *   U plane address of YUV420P[out]
- *
- * @param v_dst
- *   V plane address of YUV420P[out]
- *
- * @param rgb_src
- *   Address of RGB565[in]
- *
- * @param width
- *   Width of RGB565[in]
- *
- * @param height
- *   Height of RGB565[in]
- */
-void csc_RGB565_to_YUV420P(
-    unsigned char *y_dst,
-    unsigned char *u_dst,
-    unsigned char *v_dst,
-    unsigned char *rgb_src,
-    int width,
-    int height);
-
-/*
- * Converts RGB565 to YUV420S
- *
- * @param y_dst
- *   Y plane address of YUV420S[out]
- *
- * @param uv_dst
- *   UV plane address of YUV420S[out]
- *
- * @param rgb_src
- *   Address of RGB565[in]
- *
- * @param width
- *   Width of RGB565[in]
- *
- * @param height
- *   Height of RGB565[in]
- */
-void csc_RGB565_to_YUV420SP(
-    unsigned char *y_dst,
-    unsigned char *uv_dst,
-    unsigned char *rgb_src,
-    int width,
-    int height);
-
-/*
- * Converts tiled data to linear for mfc 6.x
- * 1. Y of NV12T to Y of YUV420P
- * 2. Y of NV12T to Y of YUV420S
- *
- * @param dst
- *   Y address of YUV420[out]
- *
- * @param src
- *   Y address of NV12T[in]
- *
- * @param yuv420_width
- *   real width of YUV420[in]
- *
- * @param yuv420_height
- *   Y: real height of YUV420[in]
- *
- */
-void csc_tiled_to_linear_y_neon(
-    unsigned char *y_dst,
-    unsigned char *y_src,
-    unsigned int width,
-    unsigned int height);
-
-/*
- * Converts tiled data to linear for mfc 6.x
- * 1. UV of NV12T to Y of YUV420S
- *
- * @param u_dst
- *   UV plane address of YUV420P[out]
- *
- * @param nv12t_src
- *   Y or UV plane address of NV12T[in]
- *
- * @param yuv420_width
- *   real width of YUV420[in]
- *
- * @param yuv420_height
- *   (real height)/2 of YUV420[in]
- */
-void csc_tiled_to_linear_uv_neon(
-    unsigned char *uv_dst,
-    unsigned char *uv_src,
-    unsigned int width,
-    unsigned int height);
-
-/*
- * Converts tiled data to linear for mfc 6.x
- * Deinterleave src to u_dst, v_dst
- * 1. UV of NV12T to Y of YUV420P
- *
- * @param u_dst
- *   U plane address of YUV420P[out]
- *
- * @param v_dst
- *   V plane address of YUV420P[out]
- *
- * @param nv12t_src
- *   Y or UV plane address of NV12T[in]
- *
- * @param yuv420_width
- *   real width of YUV420[in]
- *
- * @param yuv420_height
- *   (real height)/2 of YUV420[in]
- */
-void csc_tiled_to_linear_uv_deinterleave_neon(
-    unsigned char *u_dst,
-    unsigned char *v_dst,
-    unsigned char *uv_src,
-    unsigned int width,
-    unsigned int height);
-
-/*
- * Converts linear data to tiled
- * It supports mfc 6.x tiled
- * 1. y of yuv420 to y of nv12t
- *
- * @param dst
- *   y address of nv12t[out]
- *
- * @param src
- *   y address of yuv420[in]
- *
- * @param yuv420_width
- *   real width of yuv420[in]
- *   it should be even
- *
- * @param yuv420_height
- *   real height of yuv420[in]
- *   it should be even.
- *
- */
-void csc_linear_to_tiled_y_neon(
-    unsigned char *y_dst,
-    unsigned char *y_src,
-    unsigned int width,
-    unsigned int height);
-
-/*
- * Converts and interleave linear data to tiled
- * It supports mfc 6.x tiled
- * 1. uv of nv12t to uv of yuv420
- *
- * @param dst
- *   uv address of yuv420[out]
- *
- * @param src
- *   uv address of nv12t[in]
- *
- * @param yuv420_width
- *   real width of yuv420[in]
- *
- * @param yuv420_height
- *   real height of yuv420[in]
- *
- */
-void csc_linear_to_tiled_uv_neon(
-    unsigned char *uv_dst,
-    unsigned char *uv_src,
-    unsigned int width,
-    unsigned int height);
-
-#endif /*COLOR_SPACE_CONVERTOR_H_*/
diff --git a/exynos/multimedia/utils/csc/exynos5/csc_fimc.cpp b/exynos/multimedia/utils/csc/exynos5/csc_fimc.cpp
deleted file mode 100644
index 4243624..0000000
--- a/exynos/multimedia/utils/csc/exynos5/csc_fimc.cpp
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * @file    csc_fimc.cpp
- *
- * @brief   csc_fimc use fimc1 to color space convertion
- *
- * @author  ShinWon Lee (shinwon.lee@samsung.com)
- *
- * @version 1.0
- *
- * @history
- *   2011.11.01 : Create
- */
-
-#include <utils/Log.h>
-#include <dlfcn.h>
-
-#include "SecFimc.h"
-#include "csc_fimc.h"
-
-#define ALIGN(value, base) (((value) + (base) - 1) & ~((base) - 1))
-
-unsigned int OMXtoHarPixelFomrat(OMX_COLOR_FORMATTYPE ColorFormat)
-{
-    unsigned int v4l2_format = 0;
-    switch (ColorFormat) {
-    case OMX_COLOR_FormatYUV420Planar:
-        v4l2_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
-        break;
-    case OMX_COLOR_FormatYUV420SemiPlanar:
-        v4l2_format = HAL_PIXEL_FORMAT_YCbCr_420_SP;
-        break;
-    default:
-        v4l2_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
-        break;
-    }
-    return v4l2_format;
-}
-
-/*
- * create and open fimc handle
- *
- * @return
- *   fimc handle
- */
-void *csc_fimc_open()
-{
-    SecFimc *(*create_instance)();
-    void (*destroy_instance)(void *);
-    SecFimc *handle_fimc = NULL;
-    void* hdl = NULL;
-
-    hdl = dlopen("libfimc.so", RTLD_NOW);
-    if (hdl == NULL) {
-        ALOGE("%s:: load libfimc.so failed", __func__);
-        return NULL;
-    }
-
-    create_instance = (SecFimc *(*)())dlsym(hdl, "create_instance");
-    handle_fimc = (SecFimc *)create_instance();
-    if (handle_fimc == NULL) {
-        ALOGE("%s:: create handle_fimc failed", __func__);
-        return NULL;
-    }
-
-    if (!handle_fimc->create(SecFimc::DEV_1, SecFimc::MODE_MULTI_BUF, 1)) {
-        destroy_instance = (void (*)(void *))dlsym(hdl, "destroy_instance");
-        destroy_instance(handle_fimc);
-        ALOGE("%s:: create() failed", __func__);
-        return NULL;
-    }
-    return (void *)handle_fimc;
-}
-
-/*
- * close and destroy fimc handle
- *
- * @param handle
- *   fimc handle[in]
- *
- * @return
- *   pass or fail
- */
-CSC_FIMC_ERROR_CODE csc_fimc_close(void *handle)
-{
-    void (*destroy_instance)(void *);
-    SecFimc *handle_fimc = (SecFimc *)handle;
-    void* hdl = NULL;
-
-    if (!handle_fimc->destroy()) {
-        ALOGE("%s:: destroy() failed", __func__);
-        return CSC_FIMC_RET_FAIL;
-    }
-
-    hdl = dlopen("libfimc.so", RTLD_NOW);
-    if (hdl == NULL) {
-        ALOGE("%s:: load libfimc.so failed", __func__);
-        return CSC_FIMC_RET_FAIL;
-    }
-
-    destroy_instance = (void (*)(void *))dlsym(hdl, "destroy_instance");
-    destroy_instance(handle);
-
-    return CSC_FIMC_RET_OK;
-}
-
-/*
- * convert color space nv12t to omxformat
- *
- * @param handle
- *   fimc handle[in]
- *
- * @param dst_addr
- *   y,u,v address of dst_addr[out]
- *
- * @param src_addr
- *   y,uv address of src_addr.Format is nv12t[in]
- *
- * @param width
- *   width of dst image[in]
- *
- * @param height
- *   height of dst image[in]
- *
- * @param omxformat
- *   omxformat of dst image[in]
- *
- * @return
- *   pass or fail
- */
-CSC_FIMC_ERROR_CODE csc_fimc_convert_nv12t(
-    void *handle,
-    void **dst_addr,
-    void **src_addr,
-    unsigned int width,
-    unsigned int height,
-    OMX_COLOR_FORMATTYPE omxformat)
-{
-    int rotate_value = 0;
-
-    SecFimc *handle_fimc = (SecFimc *)handle;
-
-    unsigned int src_crop_x = 0;
-    unsigned int src_crop_y = 0;
-    unsigned int src_crop_width = width;
-    unsigned int src_crop_height = height;
-
-    unsigned int dst_crop_x = 0;
-    unsigned int dst_crop_y = 0;
-    unsigned int dst_crop_width = width;
-    unsigned int dst_crop_height = height;
-
-    unsigned int HarPixelformat = 0;
-    HarPixelformat = OMXtoHarPixelFomrat(omxformat);
-
-    // set post processor configuration
-    if (!handle_fimc->setSrcParams(width, height, src_crop_x, src_crop_y,
-                                   &src_crop_width, &src_crop_height,
-                                   HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED)) {
-        ALOGE("%s:: setSrcParms() failed", __func__);
-        return CSC_FIMC_RET_FAIL;
-    }
-
-    if (!handle_fimc->setSrcAddr((unsigned int)src_addr[0],
-                                 (unsigned int)src_addr[1],
-                                 (unsigned int)src_addr[1],
-                                 HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED)) {
-        ALOGE("%s:: setSrcPhyAddr() failed", __func__);
-        return CSC_FIMC_RET_FAIL;
-    }
-
-    if (!handle_fimc->setRotVal(rotate_value)) {
-        ALOGE("%s:: setRotVal() failed", __func__);
-        return CSC_FIMC_RET_FAIL;
-    }
-
-    if (!handle_fimc->setDstParams(width, height, dst_crop_x, dst_crop_y,
-                                   &dst_crop_width, &dst_crop_height,
-                                   HarPixelformat)) {
-        ALOGE("%s:: setDstParams() failed", __func__);
-        return CSC_FIMC_RET_FAIL;
-    }
-
-    switch (omxformat) {
-    case OMX_COLOR_FormatYUV420SemiPlanar:
-        if (!handle_fimc->setDstAddr((unsigned int)(dst_addr[0]),
-                                     (unsigned int)(dst_addr[1]),
-                                     (unsigned int)(dst_addr[1]))) {
-            ALOGE("%s:: setDstPhyAddr() failed", __func__);
-            return CSC_FIMC_RET_FAIL;
-        }
-        break;
-    case OMX_COLOR_FormatYUV420Planar:
-    default:
-        if (!handle_fimc->setDstAddr((unsigned int)(dst_addr[0]),
-                                     (unsigned int)(dst_addr[1]),
-                                     (unsigned int)(dst_addr[2]))) {
-            ALOGE("%s:: setDstPhyAddr() failed", __func__);
-            return CSC_FIMC_RET_FAIL;
-        }
-        break;
-    }
-
-    if (!handle_fimc->draw(0, 0)) {
-        ALOGE("%s:: handleOneShot() failed", __func__);
-        return CSC_FIMC_RET_FAIL;
-    }
-
-    return CSC_FIMC_RET_OK;
-}
diff --git a/exynos/multimedia/utils/csc/exynos5/csc_fimc.h b/exynos/multimedia/utils/csc/exynos5/csc_fimc.h
deleted file mode 100644
index 3ae24ac..0000000
--- a/exynos/multimedia/utils/csc/exynos5/csc_fimc.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * @file    csc_fimc.h
- *
- * @brief   csc_fimc use fimc1 to color space convertion
- *
- * @author  ShinWon Lee (shinwon.lee@samsung.com)
- *
- * @version 1.0
- *
- * @history
- *   2011.11.01 : Create
- */
-
-#ifndef CSC_FIMC_H
-
-#define CSC_FIMC_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <OMX_Video.h>
-
-/*--------------------------------------------------------------------------------*/
-/* Structure and Type                                                             */
-/*--------------------------------------------------------------------------------*/
-typedef enum {
-    CSC_FIMC_RET_OK                 = 0,
-    CSC_FIMC_RET_FAIL               = -1
-} CSC_FIMC_ERROR_CODE;
-
-/*--------------------------------------------------------------------------------*/
-/* CSC FIMC APIs                                                                  */
-/*--------------------------------------------------------------------------------*/
-/*
- * create and open fimc handle
- *
- * @return
- *   fimc handle
- */
-void *csc_fimc_open();
-
-/*
- * close and destroy fimc handle
- *
- * @param handle
- *   fimc handle[in]
- *
- * @return
- *   error code
- */
-CSC_FIMC_ERROR_CODE csc_fimc_close(void *handle);
-
-/*
- * convert color space nv12t to omxformat
- *
- * @param handle
- *   fimc handle[in]
- *
- * @param dst_addr
- *   y,u,v address of dst_addr[out]
- *
- * @param src_addr
- *   y,uv address of src_addr.Format is nv12t[in]
- *
- * @param width
- *   width of dst image[in]
- *
- * @param height
- *   height of dst image[in]
- *
- * @param omxformat
- *   omxformat of dst image[in]
- *
- * @return
- *   error code
- */
-CSC_FIMC_ERROR_CODE csc_fimc_convert_nv12t(
-    void *handle,
-    void **dst_addr,
-    void **src_addr,
-    unsigned int width,
-    unsigned int height,
-    OMX_COLOR_FORMATTYPE omxformat);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/exynos/multimedia/utils/csc/exynos5/csc_interleave_memcpy_neon.s b/exynos/multimedia/utils/csc/exynos5/csc_interleave_memcpy_neon.s
deleted file mode 100644
index 3d2b41f..0000000
--- a/exynos/multimedia/utils/csc/exynos5/csc_interleave_memcpy_neon.s
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *
- * Copyright 2012 Samsung Electronics S.LSI Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License")
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * @file    csc_linear_to_tiled_crop_neon.s
- * @brief   SEC_OMX specific define
- * @author  ShinWon Lee (shinwon.lee@samsung.com)
- * @version 1.0
- * @history
- *   2012.01.04 : Create
- */
-
-/*
- * Interleave src1, src2 to dst
- *
- * @param dest
- *   dst address[out]
- *
- * @param src1
- *   src1 address[in]
- *
- * @param src2
- *   src2 address[in]
- *
- * @param src_size
- *   src_size or src1
- */
-
-    .arch armv7-a
-    .text
-    .global csc_interleave_memcpy_neon
-    .type   csc_interleave_memcpy_neon, %function
-csc_interleave_memcpy_neon:
-    .fnstart
-
-    @r0     dest
-    @r1     src1
-    @r2     src2
-    @r3     src_size
-    @r4
-    @r5
-    @r6
-    @r7
-    @r8     temp1
-    @r9     temp2
-    @r10    dest_addr
-    @r11    src1_addr
-    @r12    src2_addr
-    @r14    i
-
-    stmfd       sp!, {r8-r12,r14}       @ backup registers
-
-    mov         r10, r0
-    mov         r11, r1
-    mov         r12, r2
-    mov         r14, r3
-
-    cmp         r14, #128
-    blt         LESS_THAN_128
-
-LOOP_128:
-    vld1.8      {q0}, [r11]!
-    vld1.8      {q2}, [r11]!
-    vld1.8      {q4}, [r11]!
-    vld1.8      {q6}, [r11]!
-    vld1.8      {q8}, [r11]!
-    vld1.8      {q10}, [r11]!
-    vld1.8      {q12}, [r11]!
-    vld1.8      {q14}, [r11]!
-    vld1.8      {q1}, [r12]!
-    vld1.8      {q3}, [r12]!
-    vld1.8      {q5}, [r12]!
-    vld1.8      {q7}, [r12]!
-    vld1.8      {q9}, [r12]!
-    vld1.8      {q11}, [r12]!
-    vld1.8      {q13}, [r12]!
-    vld1.8      {q15}, [r12]!
-
-    vst2.8      {q0, q1}, [r10]!
-    vst2.8      {q2, q3}, [r10]!
-    vst2.8      {q4, q5}, [r10]!
-    vst2.8      {q6, q7}, [r10]!
-    vst2.8      {q8, q9}, [r10]!
-    vst2.8      {q10, q11}, [r10]!
-    vst2.8      {q12, q13}, [r10]!
-    vst2.8      {q14, q15}, [r10]!
-
-    sub         r14, #128
-    cmp         r14, #128
-    bgt         LOOP_128
-
-LESS_THAN_128:
-    cmp         r14, #0
-    beq         RESTORE_REG
-
-LOOP_1:
-    ldrb        r8, [r11], #1
-    ldrb        r9, [r12], #1
-    strb        r8, [r10], #1
-    strb        r9, [r10], #1
-    subs        r14, #1
-    bne         LOOP_1
-
-RESTORE_REG:
-    ldmfd       sp!, {r8-r12,r15}       @ restore registers
-    .fnend
diff --git a/exynos/multimedia/utils/csc/exynos5/csc_tiled_to_linear_uv_deinterleave_neon.s b/exynos/multimedia/utils/csc/exynos5/csc_tiled_to_linear_uv_deinterleave_neon.s
deleted file mode 100644
index 1e76a2e..0000000
--- a/exynos/multimedia/utils/csc/exynos5/csc_tiled_to_linear_uv_deinterleave_neon.s
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- *
- * Copyright 2010 Samsung Electronics S.LSI Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License")
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * @file    csc_tiled_to_linear_uv_deinterleave_neon.s
- * @brief   SEC_OMX specific define. It support MFC 6.x tiled.
- * @author  ShinWon Lee (shinwon.lee@samsung.com)
- * @version 1.0
- * @history
- *   2011.12.01 : Create
- */
-
-/*
- * Converts and Deinterleave tiled data to linear for mfc 6.x
- * 1. UV of NV12T to Y of YUV420P
- *
- * @param u_dst
- *   U address of YUV420[out]
- *
- * @param v_dst
- *   V address of YUV420[out]
- *
- * @param uv_src
- *   UV address of NV12T[in]
- *
- * @param yuv420_width
- *   real width of YUV420[in]. It should be even.
- *
- * @param yuv420_height
- *   real height of YUV420[in] It should be even.
- */
-
-    .arch armv7-a
-    .text
-    .global csc_tiled_to_linear_uv_deinterleave_neon
-    .type   csc_tiled_to_linear_uv_deinterleave_neon, %function
-csc_tiled_to_linear_uv_deinterleave_neon:
-    .fnstart
-
-    .equ CACHE_LINE_SIZE, 64
-
-    @r0     u_dst
-    @r1     v_dst
-    @r2     uv_src
-    @r3     width
-    @r4     height
-    @r5     i
-    @r6     j
-    @r7     dst_offset
-    @r8     src_offset
-    @r9     aligned_height
-    @r10    aligned_width
-    @r11    tiled_width
-    @r12    temp1
-    @r14    temp2
-
-    stmfd       sp!, {r4-r12,r14}       @ backup registers
-    ldr         r4, [sp, #40]           @ r4 = height
-
-    bic         r9, r4, #0x7            @ aligned_height = height & (~0x7)
-    bic         r10, r3, #0xF           @ aligned_width = width & (~0xF)
-    add         r11, r3, #15            @ tiled_width = ((width + 15) >> 4) << 4
-    mov         r11, r11, asr #4
-    mov         r11, r11, lsl #4
-
-    mov         r5, #0
-LOOP_MAIN_ALIGNED_HEIGHT:
-    mul         r8, r11, r5             @ src_offset = tiled_width * i
-    mov         r6, #0
-    add         r8, r2, r8              @ src_offset = uv_src + src_offset
-LOOP_MAIN_ALIGNED_WIDTH:
-    mov         r12, r3, asr #1         @ temp1 = (width >> 1) * i + (j >> 1)
-    mul         r12, r12, r5
-
-    pld         [r8, #CACHE_LINE_SIZE]
-    vld2.8      {q0, q1}, [r8]!
-    add         r12, r12, r6, asr #1
-    vld2.8      {q2, q3}, [r8]!
-    add         r7, r0, r12             @ dst_offset = u_dst + temp1
-    pld         [r8, #CACHE_LINE_SIZE]
-    vld2.8      {q4, q5}, [r8]!
-    mov         r14, r3, asr #1         @ temp2 = width / 2
-    vld2.8      {q6, q7}, [r8]!
-
-    vst1.8      {d0}, [r7], r14
-    vst1.8      {d1}, [r7], r14
-    vst1.8      {d4}, [r7], r14
-    vst1.8      {d5}, [r7], r14
-    vst1.8      {d8}, [r7], r14
-    vst1.8      {d9}, [r7], r14
-    vst1.8      {d12}, [r7], r14
-    vst1.8      {d13}, [r7], r14
-
-    add         r7, r1, r12             @ dst_offset = v_dst + temp1
-
-    vst1.8      {d2}, [r7], r14
-    vst1.8      {d3}, [r7], r14
-    vst1.8      {d6}, [r7], r14
-    vst1.8      {d7}, [r7], r14
-    vst1.8      {d10}, [r7], r14
-    vst1.8      {d11}, [r7], r14
-    add         r6, r6, #16
-    vst1.8      {d14}, [r7], r14
-    cmp         r6, r10
-    vst1.8      {d15}, [r7], r14
-    blt         LOOP_MAIN_ALIGNED_WIDTH
-
-MAIN_REMAIN_WIDTH_START:
-    cmp         r10, r3                 @ if (aligned_width != width) {
-    beq         MAIN_REMAIN_WIDTH_END
-    stmfd       sp!, {r0-r2,r4}         @ backup registers
-    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 3)
-    add         r8, r8, r6, lsl #3
-    add         r8, r2, r8              @ r8 = uv_src + src_offset
-    mov         r12, r3, asr #1         @ temp1 = (width >> 1) * i + (j >> 1)
-    mul         r12, r12, r5
-    add         r12, r12, r6, asr #1
-    add         r7, r0, r12             @ r7 = u_dst + temp1
-    add         r12, r1, r12            @ r12 = v_dst + temp1
-    sub         r14, r3, r6             @ r14 = (width - j) / 2
-    mov         r14, r14, asr #1
-
-    mov         r4, #0
-LOOP_MAIN_REMAIN_HEIGHT:
-    mov         r0, #0                  @ r0 is index in de-interleave
-LOOP_MAIN_REMAIN_WIDTH:
-    ldrb        r1, [r8], #1
-    ldrb        r2, [r8], #1
-    strb        r1, [r7], #1
-    strb        r2, [r12], #1
-    add         r0, #1
-    cmp         r0, r14
-    blt         LOOP_MAIN_REMAIN_WIDTH
-
-    sub         r8, r8, r14, lsl #1
-    sub         r7, r7, r14
-    sub         r12, r12, r14
-    add         r8, r8, #16
-    add         r7, r7, r3, asr #1
-    add         r12, r12, r3, asr #1
-
-    add         r4, #1
-    cmp         r4, #8
-    blt         LOOP_MAIN_REMAIN_HEIGHT
-    ldmfd       sp!, {r0-r2,r4}         @ restore registers
-MAIN_REMAIN_WIDTH_END:
-
-    add         r5, r5, #8
-    cmp         r5, r9
-    blt         LOOP_MAIN_ALIGNED_HEIGHT
-
-REMAIN_HEIGHT_START:
-    cmp         r9, r4                  @ if (aligned_height != height) {
-    beq         REMAIN_HEIGHT_END
-
-    mov         r6, #0
-LOOP_REMAIN_HEIGHT_WIDTH16:
-    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 3)
-    add         r8, r8, r6, lsl #3
-    add         r8, r2, r8              @ src_offset = uv_src + src_offset
-
-    mov         r12, r3, asr #1         @ temp1 = (width >> 1) * i + (j >> 1)
-    mul         r12, r12, r5
-    add         r12, r12, r6, asr #1
-    add         r7, r0, r12             @ r7 = u_dst + temp1
-    add         r12, r1, r12            @ r12 = v_dst + temp1
-    mov         r14, r3, asr #1         @ temp2 = width / 2
-
-    stmfd       sp!, {r0-r1}            @ backup registers
-    mov         r0, #0
-    sub         r1, r4, r9
-LOOP_REMAIN_HEIGHT_WIDTH16_HEIGHT1:
-    vld2.8      {d0, d1}, [r8]!
-    vst1.8      {d0}, [r7], r14
-    vst1.8      {d1}, [r12], r14
-
-    add         r0, r0, #1
-    cmp         r0, r1
-    blt         LOOP_REMAIN_HEIGHT_WIDTH16_HEIGHT1
-    ldmfd       sp!, {r0-r1}            @ restore registers
-
-    add         r6, r6, #16
-    cmp         r6, r10
-    blt         LOOP_REMAIN_HEIGHT_WIDTH16
-
-REMAIN_HEIGHT_REMAIN_WIDTH_START:
-    cmp         r10, r3
-    beq         REMAIN_HEIGHT_REMAIN_WIDTH_END
-    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 3)
-    add         r8, r8, r6, lsl #3
-    add         r8, r2, r8              @ src_offset = uv_src + src_offset
-
-    mov         r12, r3, asr #1         @ temp1 = (width >> 1) * i + (j >> 1)
-    mul         r12, r12, r5
-    add         r12, r12, r6, asr #1
-    add         r7, r0, r12             @ r7 = u_dst + temp1
-    add         r12, r1, r12            @ r12 = v_dst + temp1
-    sub         r14, r3, r6             @ r14 = (width - j) /2
-    mov         r14, r14, asr #1
-
-    stmfd       sp!, {r0-r2,r4-r5}            @ backup registers
-    mov         r0, #0
-    sub         r1, r4, r9
-LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1:
-
-    mov         r4, #0
-LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1_WIDTHx:
-    ldrb        r2, [r8], #1
-    ldrb        r5, [r8], #1
-    strb        r2, [r7], #1
-    strb        r5, [r12], #1
-    add         r4, #1
-    cmp         r4, r14
-    blt         LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1_WIDTHx
-
-    sub         r8, r8, r14, lsl #1
-    sub         r7, r7, r14
-    sub         r12, r12, r14
-    add         r8, r8, #16
-    add         r7, r7, r3, asr #1
-    add         r12, r12, r3, asr #1
-
-    add         r0, r0, #1
-    cmp         r0, r1
-    blt         LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1
-    ldmfd       sp!, {r0-r2,r4-r5}            @ restore registers
-
-REMAIN_HEIGHT_REMAIN_WIDTH_END:
-
-REMAIN_HEIGHT_END:
-
-RESTORE_REG:
-    ldmfd       sp!, {r4-r12,r15}       @ restore registers
-
-    .fnend
diff --git a/exynos/multimedia/utils/csc/exynos5/csc_tiled_to_linear_uv_neon.s b/exynos/multimedia/utils/csc/exynos5/csc_tiled_to_linear_uv_neon.s
deleted file mode 100644
index ad58419..0000000
--- a/exynos/multimedia/utils/csc/exynos5/csc_tiled_to_linear_uv_neon.s
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- *
- * Copyright 2010 Samsung Electronics S.LSI Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License")
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * @file    csc_tiled_to_linear_uv.s
- * @brief   SEC_OMX specific define. It support MFC 6.x tiled.
- * @author  ShinWon Lee (shinwon.lee@samsung.com)
- * @version 1.0
- * @history
- *   2011.12.01 : Create
- */
-
-/*
- * Converts tiled data to linear for mfc 6.x tiled
- * 1. uv of nv12t to y of yuv420s
- *
- * @param dst
- *   uv address of yuv420s[out]
- *
- * @param src
- *   uv address of nv12t[in]
- *
- * @param yuv420_width
- *   real width of yuv420s[in]
- *
- * @param yuv420_height
- *   real height of yuv420s[in]
- *
- */
-    .arch armv7-a
-    .text
-    .global csc_tiled_to_linear_uv_neon
-    .type   csc_tiled_to_linear_uv_neon, %function
-csc_tiled_to_linear_uv_neon:
-    .fnstart
-
-    .equ CACHE_LINE_SIZE, 64
-
-    @r0     y_dst
-    @r1     y_src
-    @r2     width
-    @r3     height
-    @r4     temp3
-    @r5     i
-    @r6     j
-    @r7     dst_offset
-    @r8     src_offset
-    @r9     aligned_height
-    @r10    aligned_width
-    @r11    tiled_width
-    @r12    temp1
-    @r14    temp2
-
-    stmfd       sp!, {r4-r12,r14}       @ backup registers
-    ldr         r4, [sp, #40]           @ r4 = height
-
-    bic         r9, r3, #0x7            @ aligned_height = height & (~0xF)
-    bic         r10, r2, #0xF           @ aligned_width = width & (~0xF)
-    add         r11, r2, #15            @ tiled_width = ((width + 15) >> 4) << 4
-    mov         r11, r11, asr #4
-    mov         r11, r11, lsl #4
-
-    mov         r5, #0
-LOOP_MAIN_ALIGNED_HEIGHT:
-    mul         r8, r11, r5             @ src_offset = tiled_width * i
-    mov         r6, #0
-    add         r8, r1, r8              @ src_offset = y_src + src_offset
-LOOP_MAIN_ALIGNED_WIDTH:
-    pld         [r8, #CACHE_LINE_SIZE]
-    vld1.8      {q0, q1}, [r8]!
-    mul         r12, r2, r5             @ temp1 = width * i + j;
-    vld1.8      {q2, q3}, [r8]!
-    add         r12, r12, r6
-    pld         [r8, #CACHE_LINE_SIZE]
-    vld1.8      {q4, q5}, [r8]!
-    add         r7, r0, r12             @ dst_offset = y_dst + temp1
-    vld1.8      {q6, q7}, [r8]!
-
-    vst1.8      {q0}, [r7], r2
-    vst1.8      {q1}, [r7], r2
-    vst1.8      {q2}, [r7], r2
-    vst1.8      {q3}, [r7], r2
-    vst1.8      {q4}, [r7], r2
-    vst1.8      {q5}, [r7], r2
-    vst1.8      {q6}, [r7], r2
-    vst1.8      {q7}, [r7], r2
-    add         r6, r6, #16
-    cmp         r6, r10
-    blt         LOOP_MAIN_ALIGNED_WIDTH
-
-MAIN_REMAIN_WIDTH_START:
-    cmp         r10, r2                 @ if (aligned_width != width) {
-    beq         MAIN_REMAIN_WIDTH_END
-
-    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 3);
-    add         r8, r8, r6, lsl #3
-    add         r8, r1, r8              @ r8 = y_src + src_offset
-
-    mul         r12, r2, r5             @ temp1 = width * i + j;
-    add         r12, r12, r6
-    add         r7, r0, r12             @ r7 = y_dst + temp1
-    sub         r14, r2, r6             @ r14 = width - j
-
-    stmfd       sp!, {r0-r1}            @ backup registers
-    mov         r1, #0
-LOOP_MAIN_REMAIN_HEIGHT:
-    mov         r0, #0                  @ r0 is index in memcpy
-LOOP_MAIN_REMAIN_WIDTH:
-    ldrh        r4, [r8], #2
-    strh        r4, [r7], #2
-    add         r0, #2
-    cmp         r0, r14
-    blt         LOOP_MAIN_REMAIN_WIDTH
-
-    sub         r8, r8, r14
-    sub         r7, r7, r14
-    add         r8, r8, #16
-    add         r7, r7, r2
-
-    add         r1, #1
-    cmp         r1, #8
-    blt         LOOP_MAIN_REMAIN_HEIGHT
-    ldmfd       sp!, {r0-r1}            @ restore registers
-MAIN_REMAIN_WIDTH_END:
-
-    add         r5, r5, #8
-    cmp         r5, r9
-    blt         LOOP_MAIN_ALIGNED_HEIGHT
-
-REMAIN_HEIGHT_START:
-    cmp         r9, r3                  @ if (aligned_height != height) {
-    beq         REMAIN_HEIGHT_END
-
-    mov         r6, #0
-LOOP_REMAIN_HEIGHT_WIDTH16:
-    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 3)
-    add         r8, r8, r6, lsl #3
-    add         r8, r1, r8              @ src_offset = y_src + src_offset
-
-    mul         r12, r2, r5             @ temp1 = width * i + j;
-    add         r12, r12, r6
-    add         r7, r0, r12             @ r7 = y_dst + temp1
-
-    sub         r12, r3, r9
-    mov         r14, #0
-LOOP_REMAIN_HEIGHT_WIDTH16_HEIGHT1:
-    vld1.8      {q0}, [r8]!
-    vld1.8      {q1}, [r8]!
-    vst1.8      {q0}, [r7], r2
-    vst1.8      {q1}, [r7], r2
-
-    add         r14, r14, #2
-    cmp         r14, r12
-    blt         LOOP_REMAIN_HEIGHT_WIDTH16_HEIGHT1
-
-    add         r6, r6, #16
-    cmp         r6, r10
-    blt         LOOP_REMAIN_HEIGHT_WIDTH16
-
-REMAIN_HEIGHT_REMAIN_WIDTH_START:
-    cmp         r10, r2
-    beq         REMAIN_HEIGHT_REMAIN_WIDTH_END
-    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 3)
-    add         r8, r8, r6, lsl #3
-    add         r8, r1, r8              @ src_offset = y_src + src_offset
-
-    mul         r12, r2, r5             @ temp1 = width * i + j;
-    add         r12, r12, r6
-    add         r7, r0, r12             @ r7 = y_dst + temp1
-
-    stmfd       sp!, {r0-r1,r3}         @ backup registers
-    mov         r0, #0
-    sub         r1, r3, r9
-LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1:
-
-    sub         r14, r2, r6
-    mov         r4, #0
-LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1_WIDTHx:
-    ldrh        r3, [r8], #2
-    strh        r3, [r7], #2
-    add         r4, #2
-    cmp         r4, r14
-    blt         LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1_WIDTHx
-
-    sub         r8, r8, r14
-    sub         r7, r7, r14
-    add         r8, r8, #16
-    add         r7, r7, r2
-
-    add         r0, r0, #1
-    cmp         r0, r1
-    blt         LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1
-    ldmfd       sp!, {r0-r1,r3}            @ restore registers
-
-REMAIN_HEIGHT_REMAIN_WIDTH_END:
-
-REMAIN_HEIGHT_END:
-
-RESTORE_REG:
-    ldmfd       sp!, {r4-r12,r15}       @ restore registers
-
-    .fnend
diff --git a/exynos/multimedia/utils/csc/exynos5/csc_tiled_to_linear_y_neon.s b/exynos/multimedia/utils/csc/exynos5/csc_tiled_to_linear_y_neon.s
deleted file mode 100644
index 1aa3b13..0000000
--- a/exynos/multimedia/utils/csc/exynos5/csc_tiled_to_linear_y_neon.s
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- *
- * Copyright 2010 Samsung Electronics S.LSI Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License")
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * @file    csc_tiled_to_linear_y.s
- * @brief   SEC_OMX specific define. It support MFC 6.x tiled.
- * @author  ShinWon Lee (shinwon.lee@samsung.com)
- * @version 1.0
- * @history
- *   2011.12.01 : Create
- */
-
-/*
- * Converts tiled data to linear for mfc 6.x
- * 1. Y of NV12T to Y of YUV420P
- * 2. Y of NV12T to Y of YUV420S
- *
- * @param dst
- *   Y address of YUV420[out]
- *
- * @param src
- *   Y address of NV12T[in]
- *
- * @param yuv420_width
- *   real width of YUV420[in]. It should be even.
- *
- * @param yuv420_height
- *   real height of YUV420[in] It should be even.
- *
- */
-    .arch armv7-a
-    .text
-    .global csc_tiled_to_linear_y_neon
-    .type   csc_tiled_to_linear_y_neon, %function
-csc_tiled_to_linear_y_neon:
-    .fnstart
-
-    .equ CACHE_LINE_SIZE, 64
-
-    @r0     y_dst
-    @r1     y_src
-    @r2     width
-    @r3     height
-    @r4     temp3
-    @r5     i
-    @r6     j
-    @r7     dst_offset
-    @r8     src_offset
-    @r9     aligned_height
-    @r10    aligned_width
-    @r11    tiled_width
-    @r12    temp1
-    @r14    temp2
-
-    stmfd       sp!, {r4-r12,r14}       @ backup registers
-    ldr         r4, [sp, #40]           @ r4 = height
-
-    bic         r9, r3, #0xF            @ aligned_height = height & (~0xF)
-    bic         r10, r2, #0xF           @ aligned_width = width & (~0xF)
-    add         r11, r2, #15            @ tiled_width = ((width + 15) >> 4) << 4
-    mov         r11, r11, asr #4
-    mov         r11, r11, lsl #4
-
-    mov         r5, #0
-LOOP_MAIN_ALIGNED_HEIGHT:
-    mul         r8, r11, r5             @ src_offset = tiled_width * i
-    mov         r6, #0
-    add         r8, r1, r8              @ src_offset = y_src + src_offset
-LOOP_MAIN_ALIGNED_WIDTH:
-    pld         [r8, #CACHE_LINE_SIZE]
-    vld1.8      {q0, q1}, [r8]!
-    vld1.8      {q2, q3}, [r8]!
-    pld         [r8, #CACHE_LINE_SIZE]
-    vld1.8      {q4, q5}, [r8]!
-    vld1.8      {q6, q7}, [r8]!
-    mul         r12, r2, r5             @ temp1 = width * i + j;
-    pld         [r8, #CACHE_LINE_SIZE]
-    vld1.8      {q8, q9}, [r8]!
-    add         r12, r12, r6
-    vld1.8      {q10, q11}, [r8]!
-    add         r7, r0, r12             @ dst_offset = y_dst + temp1
-    pld         [r8, #CACHE_LINE_SIZE]
-    vld1.8      {q12, q13}, [r8]!
-    vld1.8      {q14, q15}, [r8]!
-
-    vst1.8      {q0}, [r7], r2
-    vst1.8      {q1}, [r7], r2
-    vst1.8      {q2}, [r7], r2
-    vst1.8      {q3}, [r7], r2
-    vst1.8      {q4}, [r7], r2
-    vst1.8      {q5}, [r7], r2
-    vst1.8      {q6}, [r7], r2
-    vst1.8      {q7}, [r7], r2
-    vst1.8      {q8}, [r7], r2
-    vst1.8      {q9}, [r7], r2
-    vst1.8      {q10}, [r7], r2
-    vst1.8      {q11}, [r7], r2
-    vst1.8      {q12}, [r7], r2
-    vst1.8      {q13}, [r7], r2
-    add         r6, r6, #16
-    vst1.8      {q14}, [r7], r2
-    cmp         r6, r10
-    vst1.8      {q15}, [r7], r2
-    blt         LOOP_MAIN_ALIGNED_WIDTH
-
-MAIN_REMAIN_WIDTH_START:
-    cmp         r10, r2                 @ if (aligned_width != width) {
-    beq         MAIN_REMAIN_WIDTH_END
-
-    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 4);
-    add         r8, r8, r6, lsl #4
-    add         r8, r1, r8              @ r8 = y_src + src_offset
-
-    mul         r12, r2, r5             @ temp1 = width * i + j;
-    add         r12, r12, r6
-    add         r7, r0, r12             @ r7 = y_dst + temp1
-    sub         r14, r2, r6             @ r14 = width - j
-
-    stmfd       sp!, {r0-r1}            @ backup registers
-    mov         r1, #0
-LOOP_MAIN_REMAIN_HEIGHT:
-    mov         r0, #0                  @ r0 is index in memcpy
-LOOP_MAIN_REMAIN_WIDTH:
-    ldrh        r4, [r8], #2
-    strh        r4, [r7], #2
-    add         r0, #2
-    cmp         r0, r14
-    blt         LOOP_MAIN_REMAIN_WIDTH
-
-    sub         r8, r8, r14
-    sub         r7, r7, r14
-    add         r8, r8, #16
-    add         r7, r7, r2
-
-    add         r1, #1
-    cmp         r1, #16
-    blt         LOOP_MAIN_REMAIN_HEIGHT
-    ldmfd       sp!, {r0-r1}            @ restore registers
-MAIN_REMAIN_WIDTH_END:
-
-    add         r5, r5, #16
-    cmp         r5, r9
-    blt         LOOP_MAIN_ALIGNED_HEIGHT
-
-REMAIN_HEIGHT_START:
-    cmp         r9, r3                  @ if (aligned_height != height) {
-    beq         REMAIN_HEIGHT_END
-
-    mov         r6, #0
-LOOP_REMAIN_HEIGHT_WIDTH16:
-    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 4)
-    add         r8, r8, r6, lsl #4
-    add         r8, r1, r8              @ src_offset = y_src + src_offset
-
-    mul         r12, r2, r5             @ temp1 = width * i + j;
-    add         r12, r12, r6
-    add         r7, r0, r12             @ r7 = y_dst + temp1
-
-    sub         r12, r3, r9
-    mov         r14, #0
-LOOP_REMAIN_HEIGHT_WIDTH16_HEIGHT1:
-    vld1.8      {q0}, [r8]!
-    vld1.8      {q1}, [r8]!
-    vst1.8      {q0}, [r7], r2
-    vst1.8      {q1}, [r7], r2
-
-    add         r14, r14, #2
-    cmp         r14, r12
-    blt         LOOP_REMAIN_HEIGHT_WIDTH16_HEIGHT1
-
-    add         r6, r6, #16
-    cmp         r6, r10
-    blt         LOOP_REMAIN_HEIGHT_WIDTH16
-
-REMAIN_HEIGHT_REMAIN_WIDTH_START:
-    cmp         r10, r2
-    beq         REMAIN_HEIGHT_REMAIN_WIDTH_END
-    mul         r8, r11, r5             @ src_offset = (tiled_width * i) + (j << 4)
-    add         r8, r8, r6, lsl #4
-    add         r8, r1, r8              @ src_offset = y_src + src_offset
-
-    mul         r12, r2, r5             @ temp1 = width * i + j;
-    add         r12, r12, r6
-    add         r7, r0, r12             @ r7 = y_dst + temp1
-
-    stmfd       sp!, {r0-r1,r3}         @ backup registers
-    mov         r0, #0
-    sub         r1, r3, r9
-LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1:
-
-    sub         r14, r2, r6
-    mov         r4, #0
-LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1_WIDTHx:
-    ldrh        r3, [r8], #2
-    strh        r3, [r7], #2
-    add         r4, #2
-    cmp         r4, r14
-    blt         LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1_WIDTHx
-
-    sub         r8, r8, r14
-    sub         r7, r7, r14
-    add         r8, r8, #16
-    add         r7, r7, r2
-
-    add         r0, r0, #1
-    cmp         r0, r1
-    blt         LOOP_REMAIN_HEIGHT_REMAIN_WIDTH_HEIGHT1
-    ldmfd       sp!, {r0-r1,r3}            @ restore registers
-
-REMAIN_HEIGHT_REMAIN_WIDTH_END:
-
-REMAIN_HEIGHT_END:
-
-RESTORE_REG:
-    ldmfd       sp!, {r4-r12,r15}       @ restore registers
-
-    .fnend
diff --git a/exynos5/hal/Android.mk b/exynos5/hal/Android.mk
deleted file mode 100644
index 6fe94d2..0000000
--- a/exynos5/hal/Android.mk
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Copyright (C) 2009 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-ifeq ($(TARGET_BOARD_PLATFORM),exynos5)
-common_exynos5_dirs := libgralloc_ump libhdmi libhwcomposer libfimg4x libcamera
-exynos5250_dirs := $(common_exynos5_dirs)
-
-ifeq ($(BOARD_USES_HWJPEG),true)
-exynos5250_dirs += libhwjpeg
-endif
-
-ifeq ($(TARGET_SOC),exynos5250)
-  include $(call all-named-subdir-makefiles,$(exynos5250_dirs))
-endif
-endif
diff --git a/exynos5/hal/include/Exif.h b/exynos5/hal/include/Exif.h
deleted file mode 100644
index 71e2241..0000000
--- a/exynos5/hal/include/Exif.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright Samsung Electronics Co.,LTD.
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef ANDROID_HARDWARE_EXIF_H
-#define ANDROID_HARDWARE_EXIF_H
-
-#include <math.h>
-
-#define EXIF_LOG2(x)                    (log((double)(x)) / log(2.0))
-#define APEX_FNUM_TO_APERTURE(x)        ((int)(EXIF_LOG2((double)(x)) * 2 + 0.5))
-#define APEX_EXPOSURE_TO_SHUTTER(x)     ((x) >= 1 ?                                 \
-                                        (int)(-(EXIF_LOG2((double)(x)) + 0.5)) :    \
-                                        (int)(-(EXIF_LOG2((double)(x)) - 0.5)))
-#define APEX_ISO_TO_FILMSENSITIVITY(x)  ((int)(EXIF_LOG2((x) / 3.125) + 0.5))
-
-#define NUM_SIZE                    2
-#define IFD_SIZE                    12
-#define OFFSET_SIZE                 4
-
-#define NUM_0TH_IFD_TIFF            10
-#define NUM_0TH_IFD_EXIF            22
-#define NUM_0TH_IFD_GPS             10
-#define NUM_1TH_IFD_TIFF            9
-
-/* Type */
-#define EXIF_TYPE_BYTE              1
-#define EXIF_TYPE_ASCII             2
-#define EXIF_TYPE_SHORT             3
-#define EXIF_TYPE_LONG              4
-#define EXIF_TYPE_RATIONAL          5
-#define EXIF_TYPE_UNDEFINED         7
-#define EXIF_TYPE_SLONG             9
-#define EXIF_TYPE_SRATIONAL         10
-
-#define EXIF_FILE_SIZE              28800
-
-/* 0th IFD TIFF Tags */
-#define EXIF_TAG_IMAGE_WIDTH                    0x0100
-#define EXIF_TAG_IMAGE_HEIGHT                   0x0101
-#define EXIF_TAG_MAKE                           0x010f
-#define EXIF_TAG_MODEL                          0x0110
-#define EXIF_TAG_ORIENTATION                    0x0112
-#define EXIF_TAG_SOFTWARE                       0x0131
-#define EXIF_TAG_DATE_TIME                      0x0132
-#define EXIF_TAG_YCBCR_POSITIONING              0x0213
-#define EXIF_TAG_EXIF_IFD_POINTER               0x8769
-#define EXIF_TAG_GPS_IFD_POINTER                0x8825
-
-/* 0th IFD Exif Private Tags */
-#define EXIF_TAG_EXPOSURE_TIME                  0x829A
-#define EXIF_TAG_FNUMBER                        0x829D
-#define EXIF_TAG_EXPOSURE_PROGRAM               0x8822
-#define EXIF_TAG_ISO_SPEED_RATING               0x8827
-#define EXIF_TAG_EXIF_VERSION                   0x9000
-#define EXIF_TAG_DATE_TIME_ORG                  0x9003
-#define EXIF_TAG_DATE_TIME_DIGITIZE             0x9004
-#define EXIF_TAG_SHUTTER_SPEED                  0x9201
-#define EXIF_TAG_APERTURE                       0x9202
-#define EXIF_TAG_BRIGHTNESS                     0x9203
-#define EXIF_TAG_EXPOSURE_BIAS                  0x9204
-#define EXIF_TAG_MAX_APERTURE                   0x9205
-#define EXIF_TAG_METERING_MODE                  0x9207
-#define EXIF_TAG_FLASH                          0x9209
-#define EXIF_TAG_FOCAL_LENGTH                   0x920A
-#define EXIF_TAG_USER_COMMENT                   0x9286
-#define EXIF_TAG_COLOR_SPACE                    0xA001
-#define EXIF_TAG_PIXEL_X_DIMENSION              0xA002
-#define EXIF_TAG_PIXEL_Y_DIMENSION              0xA003
-#define EXIF_TAG_EXPOSURE_MODE                  0xA402
-#define EXIF_TAG_WHITE_BALANCE                  0xA403
-#define EXIF_TAG_SCENCE_CAPTURE_TYPE            0xA406
-
-/* 0th IFD GPS Info Tags */
-#define EXIF_TAG_GPS_VERSION_ID                 0x0000
-#define EXIF_TAG_GPS_LATITUDE_REF               0x0001
-#define EXIF_TAG_GPS_LATITUDE                   0x0002
-#define EXIF_TAG_GPS_LONGITUDE_REF              0x0003
-#define EXIF_TAG_GPS_LONGITUDE                  0x0004
-#define EXIF_TAG_GPS_ALTITUDE_REF               0x0005
-#define EXIF_TAG_GPS_ALTITUDE                   0x0006
-#define EXIF_TAG_GPS_TIMESTAMP                  0x0007
-#define EXIF_TAG_GPS_PROCESSING_METHOD          0x001B
-#define EXIF_TAG_GPS_DATESTAMP                  0x001D
-
-/* 1th IFD TIFF Tags */
-#define EXIF_TAG_COMPRESSION_SCHEME             0x0103
-#define EXIF_TAG_X_RESOLUTION                   0x011A
-#define EXIF_TAG_Y_RESOLUTION                   0x011B
-#define EXIF_TAG_RESOLUTION_UNIT                0x0128
-#define EXIF_TAG_JPEG_INTERCHANGE_FORMAT        0x0201
-#define EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LEN    0x0202
-
-typedef enum {
-    EXIF_ORIENTATION_UP     = 1,
-    EXIF_ORIENTATION_90     = 6,
-    EXIF_ORIENTATION_180    = 3,
-    EXIF_ORIENTATION_270    = 8,
-} ExifOrientationType;
-
-typedef enum {
-    EXIF_SCENE_STANDARD,
-    EXIF_SCENE_LANDSCAPE,
-    EXIF_SCENE_PORTRAIT,
-    EXIF_SCENE_NIGHT,
-} CamExifSceneCaptureType;
-
-typedef enum {
-    EXIF_METERING_UNKNOWN,
-    EXIF_METERING_AVERAGE,
-    EXIF_METERING_CENTER,
-    EXIF_METERING_SPOT,
-    EXIF_METERING_MULTISPOT,
-    EXIF_METERING_PATTERN,
-    EXIF_METERING_PARTIAL,
-    EXIF_METERING_OTHER     = 255,
-} CamExifMeteringModeType;
-
-typedef enum {
-    EXIF_EXPOSURE_AUTO,
-    EXIF_EXPOSURE_MANUAL,
-    EXIF_EXPOSURE_AUTO_BRACKET,
-} CamExifExposureModeType;
-
-typedef enum {
-    EXIF_WB_AUTO,
-    EXIF_WB_MANUAL,
-} CamExifWhiteBalanceType;
-
-/* Values */
-#define EXIF_DEF_MAKER          "SAMSUNG"
-#define EXIF_DEF_MODEL          "SAMSUNG"
-#define EXIF_DEF_SOFTWARE       "SAMSUNG"
-#define EXIF_DEF_EXIF_VERSION   "0220"
-#define EXIF_DEF_USERCOMMENTS   "User comments"
-
-#define EXIF_DEF_YCBCR_POSITIONING  1   /* centered */
-#define EXIF_DEF_FNUMBER_NUM        26  /* 2.6 */
-#define EXIF_DEF_FNUMBER_DEN        10
-#define EXIF_DEF_EXPOSURE_PROGRAM   3   /* aperture priority */
-#define EXIF_DEF_FOCAL_LEN_NUM      278 /* 2.78mm */
-#define EXIF_DEF_FOCAL_LEN_DEN      100
-#define EXIF_DEF_FLASH              0   /* O: off, 1: on*/
-#define EXIF_DEF_COLOR_SPACE        1
-#define EXIF_DEF_EXPOSURE_MODE      EXIF_EXPOSURE_AUTO
-#define EXIF_DEF_APEX_DEN           10
-
-#define EXIF_DEF_COMPRESSION        6
-#define EXIF_DEF_RESOLUTION_NUM     72
-#define EXIF_DEF_RESOLUTION_DEN     1
-#define EXIF_DEF_RESOLUTION_UNIT    2   /* inches */
-
-typedef struct {
-    uint32_t num;
-    uint32_t den;
-} rational_t;
-
-typedef struct {
-    int32_t num;
-    int32_t den;
-} srational_t;
-
-typedef struct {
-    bool enableGps;
-    bool enableThumb;
-
-    unsigned char maker[32];
-    unsigned char model[32];
-    unsigned char software[32];
-    unsigned char exif_version[4];
-    unsigned char date_time[20];
-    unsigned char user_comment[150];
-
-    uint32_t width;
-    uint32_t height;
-    uint32_t widthThumb;
-    uint32_t heightThumb;
-
-    uint16_t orientation;
-    uint16_t ycbcr_positioning;
-    uint16_t exposure_program;
-    uint16_t iso_speed_rating;
-    uint16_t metering_mode;
-    uint16_t flash;
-    uint16_t color_space;
-    uint16_t exposure_mode;
-    uint16_t white_balance;
-    uint16_t scene_capture_type;
-
-    rational_t exposure_time;
-    rational_t fnumber;
-    rational_t aperture;
-    rational_t max_aperture;
-    rational_t focal_length;
-
-    srational_t shutter_speed;
-    srational_t brightness;
-    srational_t exposure_bias;
-
-    unsigned char gps_latitude_ref[2];
-    unsigned char gps_longitude_ref[2];
-
-    uint8_t gps_version_id[4];
-    uint8_t gps_altitude_ref;
-
-    rational_t gps_latitude[3];
-    rational_t gps_longitude[3];
-    rational_t gps_altitude;
-    rational_t gps_timestamp[3];
-    unsigned char gps_datestamp[11];
-    unsigned char gps_processing_method[100];
-
-    rational_t x_resolution;
-    rational_t y_resolution;
-    uint16_t resolution_unit;
-    uint16_t compression_scheme;
-} exif_attribute_t;
-
-#endif /* ANDROID_HARDWARE_EXIF_H */
diff --git a/exynos5/hal/include/SecBuffer.h b/exynos5/hal/include/SecBuffer.h
deleted file mode 100644
index b8a41df..0000000
--- a/exynos5/hal/include/SecBuffer.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-/*!
- * \file      SecBuffer.h
- * \brief     header file for SecBuffer
- * \author    Sangwoo, Park(sw5771.park@samsung.com)
- * \date      2011/06/02
- *
- * <b>Revision History: </b>
- * - 2010/06/03 : Sangwoo, Park(sw5771.park@samsung.com) \n
- *   Initial version
- *
- */
-
-/**
- * @page SecBuffer
- *
- * @section Introduction
- * SecBuffer is common struct for buffer
- *
- * @section Copyright
- *  Copyright (c) 2008-2011 Samsung Electronics Co., Ltd.All rights reserved. \n
- *  Proprietary and Confidential
- *
- * @image html samsung.png
- */
-
-#ifndef __SEC_BUFFER_H__
-#define __SEC_BUFFER_H__
-
-#include <sys/types.h>
-
-//! Buffer information
-struct SecBuffer
-{
-public:
-    //! Buffer type
-    enum BUFFER_TYPE
-    {
-        BUFFER_TYPE_BASE     = 0,
-        BUFFER_TYPE_VIRT     = 1,      //!< virtual address
-        BUFFER_TYPE_PHYS     = 1 << 1, //!< physical address
-        BUFFER_TYPE_RESERVED = 1 << 2, //!< reserved type
-        BUFFER_TYPE_MAX,
-    };
-
-    //! Buffer virtual address
-    union {
-        char *p;       //! single address.
-        char *extP[3]; //! Y Cb Cr.
-    } virt;
-
-    //! Buffer physical address
-    union {
-        unsigned int p;       //! single address.
-        unsigned int extP[3]; //! Y Cb Cr.
-    } phys;
-
-    //! Buffer reserved id
-    union {
-        unsigned int p;       //! \n
-        unsigned int extP[3]; //! \n
-    } reserved;
-
-    //! Buffer size
-    union {
-        unsigned int s;
-        unsigned int extS[3];
-    } size;
-
-    //! Constructor
-    SecBuffer()
-    {
-        for (int i = 0; i < 3; i++) {
-            virt.    extP[i] = NULL;
-            phys.    extP[i] = 0;
-            reserved.extP[i] = 0;
-            size.    extS[i] = 0;
-        }
-    }
-
-    //! Constructor
-    SecBuffer(const SecBuffer *other)
-    {
-        for (int i = 0; i < 3; i++) {
-            virt.    extP[i] = other->virt.extP[i];
-            phys.    extP[i] = other->phys.extP[i];
-            reserved.extP[i] = other->reserved.extP[i];
-            size.    extS[i] = other->size.extS[i];
-        }
-    }
-
-    //! Operator(=) override
-    SecBuffer& operator =(const SecBuffer &other)
-    {
-        for (int i = 0; i < 3; i++) {
-            virt.    extP[i] = other.virt.extP[i];
-            phys.    extP[i] = other.phys.extP[i];
-            reserved.extP[i] = other.reserved.extP[i];
-            size.    extS[i] = other.size.extS[i];
-        }
-        return *this;
-    }
-
-    //! Operator(==) override
-    bool operator ==(const SecBuffer &other) const
-    {
-        return (   virt.    extP[0] == other.virt.extP[0]
-                && virt.    extP[1] == other.virt.extP[1]
-                && virt.    extP[2] == other.virt.extP[2]
-                && phys.    extP[0] == other.phys.extP[0]
-                && phys.    extP[1] == other.phys.extP[1]
-                && phys.    extP[2] == other.phys.extP[2]
-                && reserved.extP[0] == other.reserved.extP[0]
-                && reserved.extP[1] == other.reserved.extP[1]
-                && reserved.extP[2] == other.reserved.extP[2]
-                && size.    extS[0] == other.size.extS[0]
-                && size.    extS[1] == other.size.extS[1]
-                && size.    extS[2] == other.size.extS[2]);
-    }
-
-    //! Operator(!=) override
-    bool operator !=(const SecBuffer &other) const
-    {
-        // use operator(==)
-        return !(*this == other);
-    }
-
-    //! Get Buffer type
-    static int BUFFER_TYPE(SecBuffer *buf)
-    {
-        int type = BUFFER_TYPE_BASE;
-        if (buf->virt.p)
-            type |= BUFFER_TYPE_VIRT;
-        if (buf->phys.p)
-            type |= BUFFER_TYPE_PHYS;
-        if (buf->reserved.p)
-            type |= BUFFER_TYPE_RESERVED;
-
-        return type;
-    }
-};
-
-#endif //__SEC_BUFFER_H__
diff --git a/exynos5/hal/include/SecFimc.h b/exynos5/hal/include/SecFimc.h
deleted file mode 100644
index c7f9945..0000000
--- a/exynos5/hal/include/SecFimc.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*!
- * \file      SecFimc.h
- * \brief     header file for Fimc HAL MODULE
- * \author    Hyunkyung, Kim(hk310.kim@samsung.com)
- * \date      2010/10/13
- *
- * <b>Revision History: </b>
- * - 2010/10/13 : Hyunkyung, Kim(hk310.kim@samsung.com) \n
- *   Initial version
- *
- * - 2011/11/15 : Sunmi, Lee(carrotsm.lee@samsung.com) \n
- *   Adjust V4L2 architecture \n
- */
-
-#ifndef __SEC_FIMC_H__
-#define __SEC_FIMC_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <linux/fb.h>
-
-#include <stdint.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <asm/sizes.h>
-
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/poll.h>
-#include <sys/mman.h>
-#include <hardware/hardware.h>
-
-#include "utils/Timers.h"
-
-#include "s5p_fimc_v4l2.h"
-#include "sec_utils_v4l2.h"
-#include "sec_format.h"
-
-#include "SecBuffer.h"
-#include "SecRect.h"
-
-#define PFX_NODE_FIMC        "/dev/video"
-#define MAX_DST_BUFFERS     (3)
-#define MAX_SRC_BUFFERS     (1)
-#define MAX_PLANES          (3)
-
-#ifdef __cplusplus
-}
-
-class SecFimc
-{
-public:
-    enum DEV {
-        DEV_0 = 0,
-        DEV_1,
-        DEV_2,
-        DEV_3,
-        DEV_MAX,
-    };
-
-    enum MODE {
-        MODE_NONE = 0,
-        MODE_SINGLE_BUF,
-        MODE_MULTI_BUF,
-        MODE_DMA_AUTO,
-        MODE_MAX,
-    };
-
-private:
-    bool                        mFlagCreate;
-    int                         mDev;
-    int                         mFimcMode;
-    int                         mNumOfBuf;
-
-    int                         mRealDev;
-    int                         mFd;
-    int                         mHwVersion;
-    int                         mBufIndex;
-    int                         mRotVal;
-    bool                        mFlagGlobalAlpha;
-    int                         mGlobalAlpha;
-    bool                        mFlagLocalAlpha;
-    bool                        mFlagColorKey;
-    int                         mColorKey;
-    bool                        mFlagSetSrcParam;
-    bool                        mFlagSetDstParam;
-    bool                        mFlagStreamOn;
-
-    s5p_fimc_t                  mS5pFimc;
-    struct v4l2_capability      mFimcCap;
-
-    SecBuffer                   mSrcBuffer;
-    SecBuffer                   mDstBuffer[MAX_DST_BUFFERS];
-
-public:
-    SecFimc();
-    virtual ~SecFimc();
-
-    bool create(enum DEV dev, enum MODE mode, int numOfBuf);
-    bool destroy(void);
-    bool flagCreate(void);
-
-    int  getFd(void);
-
-    SecBuffer * getMemAddr(int index = 0);
-
-    int  getHWVersion(void);
-
-    bool setSrcParams(unsigned int width, unsigned int height,
-                      unsigned int cropX, unsigned int cropY,
-                      unsigned int *cropWidth, unsigned int *cropHeight,
-                      int colorFormat,
-                      bool forceChange = true);
-
-    bool getSrcParams(unsigned int *width, unsigned int *height,
-                      unsigned int *cropX, unsigned int *cropY,
-                      unsigned int *cropWidth, unsigned int *cropHeight,
-                      int *colorFormat);
-
-    bool setSrcAddr(unsigned int physYAddr,
-                    unsigned int physCbAddr = 0,
-                    unsigned int physCrAddr = 0,
-                    int colorFormat = 0);
-
-    bool setDstParams(unsigned int width, unsigned int height,
-                      unsigned int cropX, unsigned int cropY,
-                      unsigned int *cropWidth, unsigned int *cropHeight,
-                      int colorFormat,
-                      bool forceChange = true);
-
-    bool getDstParams(unsigned int *width, unsigned int *height,
-                      unsigned int *cropX, unsigned int *cropY,
-                      unsigned int *cropWidth, unsigned int *cropHeight,
-                      int *colorFormat);
-
-    bool setDstAddr(unsigned int physYAddr, unsigned int physCbAddr = 0, unsigned int physCrAddr = 0, int buf_index = 0);
-
-    bool setRotVal(unsigned int rotVal);
-    bool setGlobalAlpha(bool enable = true, int alpha = 0xff);
-    bool setLocalAlpha(bool enable);
-    bool setColorKey(bool enable = true, int colorKey = 0xff);
-
-    bool draw(int src_index, int dst_index);
-
-private:
-    bool m_streamOn(void);
-    bool m_checkSrcSize(unsigned int width, unsigned int height,
-                        unsigned int cropX, unsigned int cropY,
-                        unsigned int *cropWidth, unsigned int *cropHeight,
-                        int colorFormat,
-                        bool forceChange = false);
-
-    bool m_checkDstSize(unsigned int width, unsigned int height,
-                        unsigned int cropX, unsigned int cropY,
-                        unsigned int *cropWidth, unsigned int *cropHeight,
-                        int colorFormat,
-                        int rotVal,
-                        bool forceChange = false);
-    int  m_widthOfFimc(int v4l2ColorFormat, int width);
-    int  m_heightOfFimc(int v4l2ColorFormat, int height);
-    int  m_getYuvBpp(unsigned int fmt);
-    int  m_getYuvPlanes(unsigned int fmt);
-};
-#endif
-
-#endif //__SEC_FIMC_H__
diff --git a/exynos5/hal/include/SecHdmi.h b/exynos5/hal/include/SecHdmi.h
deleted file mode 100644
index 1811c73..0000000
--- a/exynos5/hal/include/SecHdmi.h
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-**
-** @author Sangwoo, Park(sw5771.park@samsung.com)
-** @date   2010-09-10
-**
-*/
-
-#ifndef __SEC_HDMI_H__
-#define __SEC_HDMI_H__
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <signal.h>
-#include <pthread.h>
-
-#include "s5p_tvout_v4l2.h"
-#include "v4l2-mediabus.h"
-
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-#include "sec_g2d.h"
-#include "FimgApi.h"
-#endif
-
-#include "s3c_lcd.h"
-#include "SecBuffer.h"
-
-#include "../libhdmi/libsForhdmi/libedid/libedid.h"
-#include "../libhdmi/libsForhdmi/libcec/libcec.h"
-
-#include "../libhdmi/SecHdmi/SecHdmiCommon.h"
-#include "../libhdmi/SecHdmi/SecHdmiV4L2Utils.h"
-#include "../libhdmi/SecHdmi/SecGscaler.h"
-
-
-#include <linux/fb.h>
-#include <utils/threads.h>
-
-namespace android {
-
-class SecHdmi: virtual public RefBase
-{
-public :
-    enum HDMI_LAYER {
-        HDMI_LAYER_BASE   = 0,
-        HDMI_LAYER_VIDEO,
-        HDMI_LAYER_GRAPHIC_0,
-        HDMI_LAYER_GRAPHIC_1,
-        HDMI_LAYER_MAX,
-    };
-
-private :
-    class CECThread: public Thread
-    {
-        public:
-            bool                mFlagRunning;
-
-        private:
-            sp<SecHdmi>         mSecHdmi;
-            Mutex               mThreadLoopLock;
-            Mutex               mThreadControlLock;
-            virtual bool        threadLoop();
-            enum CECDeviceType  mDevtype;
-            int                 mLaddr;
-            int                 mPaddr;
-
-        public:
-            CECThread(sp<SecHdmi> secHdmi)
-                :Thread(false),
-                mFlagRunning(false),
-                mSecHdmi(secHdmi),
-                mDevtype(CEC_DEVICE_PLAYER),
-                mLaddr(0),
-                mPaddr(0){
-            };
-            virtual ~CECThread();
-
-            bool start();
-            bool stop();
-
-    };
-
-    Mutex        mLock;
-
-    sp<CECThread>               mCECThread;
-
-    bool         mFlagCreate;
-    bool         mFlagConnected;
-    bool         mFlagLayerEnable[HDMI_LAYER_MAX];
-    bool         mFlagHdmiStart[HDMI_LAYER_MAX];
-
-    int          mSrcWidth[HDMI_LAYER_MAX];
-    int          mSrcHeight[HDMI_LAYER_MAX];
-    int          mSrcColorFormat[HDMI_LAYER_MAX];
-    int          mHdmiResolutionWidth[HDMI_LAYER_MAX];
-    int          mHdmiResolutionHeight[HDMI_LAYER_MAX];
-    int          mPreviousNumofHwLayer[HDMI_LAYER_MAX];
-    __u32        mPreviousHdmiPresetId;
-    int          mHdmiDstWidth;
-    int          mHdmiDstHeight;
-
-    unsigned int mHdmiSrcYAddr;
-    unsigned int mHdmiSrcCbCrAddr;
-
-    unsigned int mFBaddr;
-    unsigned int mFBsize;
-    int          mFBionfd;
-    unsigned int mFBoffset;
-
-    int          mHdmiOutputMode;
-    unsigned int mHdmiResolutionValue;
-    v4l2_std_id  mHdmiStdId;
-    __u32        mHdmiPresetId;
-    unsigned int mCompositeStd;
-    bool         mHdcpMode;
-    int          mAudioMode;
-    unsigned int mUIRotVal;
-    unsigned int mG2DUIRotVal;
-
-    int          mCurrentsrcW;
-    int          mCurrentsrcH;
-    int          mCurrentsrcColorFormat;
-    unsigned int mCurrentsrcYAddr;
-    unsigned int mCurrentsrcCbAddr;
-    int          mCurrentdstX;
-    int          mCurrentdstY;
-    int          mCurrenthdmiLayer;
-    int          mCurrentNumOfHWCLayer;
-
-    int          mCurrentHdmiOutputMode;
-    unsigned int mCurrentHdmiResolutionValue;
-    bool         mCurrentHdcpMode;
-    int          mCurrentAudioMode;
-    bool         mHdmiInfoChange;
-
-    bool         mFlagGscalerStart;
-    int          mGscalerDstColorFormat;
-
-    int          mVideodevFd[HDMI_LAYER_MAX];
-    int          mMediadevFd;
-    int          mSubdevMixerFd;
-
-    __u32        mMixerSubdevEntity;
-
-    SecBuffer    mSrcBuffer[HDMI_LAYER_MAX][MAX_BUFFERS_MIXER];
-    int          mSrcIndex[HDMI_LAYER_MAX];
-    SecGscaler   mSecGscaler;
-
-    struct v4l2_rect        mSrcRect;
-    struct media_link_desc  mlink_desc;
-
-    int          mIonClient;
-
-    unsigned int mHdmiResolutionValueList[14];
-    int          mHdmiSizeOfResolutionValueList;
-
-    int          mDefaultFBFd;
-    int          mDisplayWidth;
-    int          mDisplayHeight;
-
-    bool         mGscalerForceUpdate;
-
-public :
-
-    SecHdmi();
-    virtual ~SecHdmi();
-    bool        create(int width, int height);
-    bool        destroy(void);
-    inline bool flagCreate(void) { return mFlagCreate; }
-
-    bool        connect(void);
-    bool        disconnect(void);
-
-    bool        flagConnected(void);
-
-    bool        flush(int srcW, int srcH, int srcColorFormat,
-                        unsigned int srcYAddr, unsigned int srcCbAddr, unsigned int srcCrAddr,
-                        int dstX, int dstY,
-                        int hdmiLayer,
-                        int num_of_hwc_layer);
-
-    bool        clear(int hdmiLayer);
-
-    void        clearGraphicLayer(int hdmiLayer);
-    bool        enableGraphicLayer(int hdmiLayer);
-    bool        disableGraphicLayer(int hdmiLayer);
-
-    bool        startHdmi(int hdmiLayer);
-    bool        stopHdmi(int hdmiLayer);
-
-    bool        setHdmiOutputMode(int hdmiOutputMode, bool forceRun = false);
-    bool        setHdmiResolution(unsigned int hdmiResolutionValue, bool forceRun = true);
-    bool        setHdcpMode(bool hdcpMode, bool forceRun = false);
-    bool        setUIRotation(unsigned int rotVal, unsigned int hwcLayer);
-    bool        setDisplaySize(int width, int height);
-    void        setDisplayInfo(int srcW, int srcH, int srcColorFormat,
-                    unsigned int srcYAddr, unsigned int srcCbAddr,
-                    int dstX, int dstY,
-                    int hdmiLayer,
-                    int num_of_hwc_layer);
-private:
-    bool        m_setupLink(void);
-    bool        m_openLayer(int layer);
-    bool        m_closeLayer(int layer);
-
-    bool        m_reset(int w, int h, int dstX, int dstY, int colorFormat, int hdmiLayer, int num_of_hwc_layer);
-    bool        m_streamOn(int hdmiLayer);
-
-    bool        m_run(int hdmiLayer);
-    bool        m_startHdmi(int hdmiLayer);
-    bool        m_stopHdmi(int hdmiLayer);
-
-    bool        m_setHdmiOutputMode(int hdmiOutputMode);
-    bool        m_setHdmiResolution(unsigned int hdmiResolutionValue);
-    bool        m_setCompositeResolution(unsigned int compositeStdId);
-    bool        m_setHdcpMode(bool hdcpMode);
-    bool        m_setAudioMode(int audioMode);
-
-    int         m_resolutionValueIndex(unsigned int ResolutionValue);
-
-    bool        m_flagHWConnected(void);
-    bool        m_flush(int srcW, int srcH, int srcColorFormat,
-                    unsigned int srcYAddr, unsigned int srcCbAddr, unsigned int srcCrAddr,
-                    int dstX, int dstY,
-                    int hdmiLayer,
-                    int nun_of_hwc_layer);
-};
-
-}; // namespace android
-
-#endif //__SEC_HDMI_H__
diff --git a/exynos5/hal/include/SecJpegCodecHal.h b/exynos5/hal/include/SecJpegCodecHal.h
deleted file mode 100644
index 55db15d..0000000
--- a/exynos5/hal/include/SecJpegCodecHal.h
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright Samsung Electronics Co.,LTD.
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __SEC_JPG_CODEC_HAL_H__
-#define __SEC_JPG_CODEC_HAL_H__
-
-#include "videodev2.h"
-
-#define JPEG_DEC_NODE        "/dev/video11"
-#define JPEG_ENC_NODE        "/dev/video12"
-
-#define JPEG_MAX_PLANE_CNT          (3)
-#define JPEG_BYTE_ALIGN     (32)
-
-#define MAX_JPG_WIDTH 8192
-#define MAX_JPG_HEIGHT 8192
-
-#define JPEG_CACHE_OFF (0)
-#define JPEG_CACHE_ON (1)
-
-class SecJpegCodecHal {
-public:
-    ;
-    SecJpegCodecHal();
-    virtual ~SecJpegCodecHal();
-
-    enum ERROR_JPEG_HAL {
-        ERROR_JPEG_DEVICE_ALREADY_CREATE = -0x100,
-        ERROR_CANNOT_OPEN_JPEG_DEVICE,
-        ERROR_JPEG_DEVICE_ALREADY_CLOSED,
-        ERROR_JPEG_DEVICE_ALREADY_DESTROY,
-        ERROR_JPEG_DEVICE_NOT_CREATE_YET,
-        ERROR_INVALID_COLOR_FORMAT,
-        ERROR_INVALID_JPEG_FORMAT,
-        ERROR_INVALID_IMAGE_SIZE,
-        ERROR_JPEG_CONFIG_POINTER_NULL,
-        ERROR_INVALID_JPEG_CONFIG,
-        ERROR_IN_BUFFER_CREATE_FAIL,
-        ERROR_OUT_BUFFER_CREATE_FAIL,
-        ERROR_EXCUTE_FAIL,
-        ERROR_JPEG_SIZE_TOO_SMALL,
-        ERROR_CANNOT_CHANGE_CACHE_SETTING,
-        ERROR_SIZE_NOT_SET_YET,
-        ERROR_BUFFR_IS_NULL,
-        ERROR_BUFFER_TOO_SMALL,
-        ERROR_GET_SIZE_FAIL,
-        ERROR_REQBUF_FAIL,
-        ERROR_INVALID_V4l2_BUF_TYPE = -0x80,
-        ERROR_MMAP_FAILED,
-        ERROR_FAIL,
-        ERROR_NONE = 0
-    };
-
-    enum MODE {
-        MODE_ENCODE = 0,
-        MODE_DECODE
-    };
-
-    struct BUFFER{
-        int     numOfPlanes;
-        char *addr[JPEG_MAX_PLANE_CNT];
-        int     size[JPEG_MAX_PLANE_CNT];
-    };
-
-    struct BUF_INFO{
-        int                 numOfPlanes;
-        enum v4l2_memory    memory;
-        enum v4l2_buf_type  buf_type;
-        int                 reserved[4];
-    };
-
-    struct PIX_FMT{
-        int in_fmt;
-        int out_fmt;
-        int reserved[4];
-    };
-
-    struct CONFIG{
-        int               mode;
-        int               enc_qual;
-
-        int               width;
-        int               height;
-        int               scaled_width;
-        int               scaled_height;
-
-        int               numOfPlanes;
-
-        int               sizeJpeg;
-
-        union {
-            PIX_FMT enc_fmt;
-            PIX_FMT dec_fmt;
-        } pix;
-
-        int              reserved[8];
-    };
-
-protected:
-    // variables
-    bool t_bFlagCreate;
-    bool t_bFlagCreateInBuf;
-    bool t_bFlagCreateOutBuf;
-    bool t_bFlagExcute;
-
-    int t_iPlaneNum;
-
-    int t_iJpegFd;
-    struct CONFIG t_stJpegConfig;
-    struct BUFFER t_stJpegInbuf;
-    struct BUFFER t_stJpegOutbuf;
-
-    //functions
-    int t_v4l2Querycap(int iFd);
-    int t_v4l2SetJpegcomp(int iFd, int iQuality);
-    int t_v4l2SetFmt(int iFd, enum v4l2_buf_type eType, struct CONFIG *pstConfig);
-    int t_v4l2GetFmt(int iFd, enum v4l2_buf_type eType, struct CONFIG *pstConfig);
-    int t_v4l2Reqbufs(int iFd, int iBufCount, struct BUF_INFO *pstBufInfo);
-    int t_v4l2Querybuf(int iFd, struct BUF_INFO *pstBufInfo, struct BUFFER *pstBuf);
-    int t_v4l2Qbuf(int iFd, struct BUF_INFO *pstBufInfo, struct BUFFER *pstBuf);
-    int t_v4l2Dqbuf(int iFd, enum v4l2_buf_type eType, enum v4l2_memory eMemory);
-    int t_v4l2StreamOn(int iFd, enum v4l2_buf_type eType);
-    int t_v4l2StreamOff(int iFd, enum v4l2_buf_type eType);
-    int t_v4l2SetCtrl(int iFd, int iCid, int iValue);
-    int t_v4l2GetCtrl(int iFd, int iCid);
-};
-
-class SecJpegEncoderHal : SecJpegCodecHal {
-public:
-    ;
-    SecJpegEncoderHal();
-    virtual ~SecJpegEncoderHal();
-
-    enum QUALITY {
-        QUALITY_LEVEL_1 = 0,    /* high */
-        QUALITY_LEVEL_2,
-        QUALITY_LEVEL_3,
-        QUALITY_LEVEL_4,        /* low */
-    };
-
-    int     create(void);
-    int     destroy(void);
-
-    int     setSize(int iW, int iH);
-
-    int     setJpegConfig(void* pConfig);
-    void *getJpegConfig(void);
-
-
-    char **getInBuf(int *piInputSize);
-    char *getOutBuf(int *piOutputSize);
-
-    int     setCache(int iValue);
-
-    int     setInBuf(char **pcBuf, int *iSize);
-    int     setOutBuf(char *pcBuf, int iSize);
-
-    int     getSize(int *piWidth, int *piHeight);
-    int     setColorFormat(int iV4l2ColorFormat);
-    int     setJpegFormat(int iV4l2JpegFormat);
-    int     updateConfig(void);
-
-    int     setQuality(int iQuality);
-    int     getJpegSize(void);
-
-    int     encode(void);
-};
-
-class SecJpegDecoderHal : SecJpegCodecHal {
-public:
-    ;
-    SecJpegDecoderHal();
-    virtual ~SecJpegDecoderHal();
-
-    int     create(void);
-    int     destroy(void);
-
-    int     setSize(int iW, int iH);
-
-    int     setJpegConfig(void* pConfig);
-    void *getJpegConfig(void);
-
-
-    char *getInBuf(int *piInputSize);
-    char **getOutBuf(int *piOutputSize);
-
-    int     setCache(int iValue);
-
-    int     setInBuf(char *pcBuf, int iSize);
-    int     setOutBuf(char **pcBuf, int *iSize);
-
-    int     getSize(int *piWidth, int *piHeight);
-    int     setColorFormat(int iV4l2ColorFormat);
-    int     setJpegFormat(int iV4l2JpegFormat);
-    int     updateConfig(void);
-
-    int setScaledSize(int iW, int iH);
-    int setJpegSize(int iJpegSize);
-
-    int  decode(void);
-};
-
-#endif /* __SEC_JPG_CODEC_HAL_H__ */
diff --git a/exynos5/hal/include/SecJpegEncoder.h b/exynos5/hal/include/SecJpegEncoder.h
deleted file mode 100644
index c7390f9..0000000
--- a/exynos5/hal/include/SecJpegEncoder.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright Samsung Electronics Co.,LTD.
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __SEC_JPG_ENC_H__
-#define __SEC_JPG_ENC_H__
-
-#include "Exif.h"
-
-#include "SecJpegCodecHal.h"
-
-#include <sys/mman.h>
-#include "ion.h"
-
-#define JPEG_THUMBNAIL_QUALITY 60
-#define EXIF_LIMIT_SIZE 64*1024
-//#define JPEG_WA_FOR_PAGEFAULT
-#define JPEG_WA_BUFFER_SIZE 64
-
-class SecJpegEncoder {
-public :
-    ;
-    enum ERROR {
-        ERROR_ALREADY_CREATE = -0x200,
-        ERROR_CANNOT_CREATE_SEC_JPEG_ENC_HAL,
-        ERROR_NOT_YET_CREATED,
-        ERROR_ALREADY_DESTROY,
-        ERROR_INPUT_DATA_SIZE_TOO_LARGE,
-        ERROR_OUT_BUFFER_SIZE_TOO_SMALL,
-        ERROR_EXIFOUT_ALLOC_FAIL,
-        ERROR_MAKE_EXIF_FAIL,
-        ERROR_INVALID_SCALING_WIDTH_HEIGHT,
-        ERROR_CANNOT_CREATE_SEC_THUMB,
-        ERROR_THUMB_JPEG_SIZE_TOO_SMALL,
-        ERROR_IMPLEMENT_NOT_YET,
-        ERROR_JPEG_DEVICE_ALREADY_CREATE = -0x100,
-        ERROR_CANNOT_OPEN_JPEG_DEVICE,
-        ERROR_JPEG_DEVICE_ALREADY_CLOSED,
-        ERROR_JPEG_DEVICE_ALREADY_DESTROY,
-        ERROR_JPEG_DEVICE_NOT_CREATE_YET,
-        ERROR_INVALID_COLOR_FORMAT,
-        ERROR_INVALID_JPEG_FORMAT,
-        ERROR_JPEG_CONFIG_POINTER_NULL,
-        ERROR_INVALID_JPEG_CONFIG,
-        ERROR_IN_BUFFER_CREATE_FAIL,
-        ERROR_OUT_BUFFER_CREATE_FAIL,
-        ERROR_EXCUTE_FAIL,
-        ERROR_JPEG_SIZE_TOO_SMALL,
-        ERROR_CANNOT_CHANGE_CACHE_SETTING,
-        ERROR_SIZE_NOT_SET_YET,
-        ERROR_BUFFR_IS_NULL,
-        ERROR_BUFFER_TOO_SMALL,
-        ERROR_GET_SIZE_FAIL,
-        ERROR_REQBUF_FAIL,
-        ERROR_INVALID_V4l2_BUF_TYPE = -0x80,
-        ERROR_MMAP_FAILED,
-        ERROR_FAIL,
-        ERROR_NONE = 0
-    };
-
-    SecJpegEncoder();
-    virtual ~SecJpegEncoder();
-
-    bool   flagCreate();
-    int     create(void);
-    int     destroy(void);
-
-    int     setSize(int w, int h);
-    int     setQuality(int quality);
-    int     setColorFormat(int colorFormat);
-    int     setJpegFormat(int jpegFormat);
-
-    int     updateConfig(void);
-
-    char *getInBuf(int *input_size);
-    char *getOutBuf(int *output_size);
-    int     setInBuf(char *buf, int size);
-    int     setOutBuf(char *buf, int size);
-
-    int     encode(int *size, exif_attribute_t *exifInfo);
-
-    int     setThumbnailSize(int w, int h);
-
-    int     makeExif(unsigned char *exifOut,
-                               exif_attribute_t *exifIn,
-                               unsigned int *size,
-                               bool useMainbufForThumb = false);
-
-private:
-    inline void writeExifIfd(unsigned char **pCur,
-                                         unsigned short tag,
-                                         unsigned short type,
-                                         unsigned int count,
-                                         uint32_t value);
-    inline void writeExifIfd(unsigned char **pCur,
-                                        unsigned short tag,
-                                        unsigned short type,
-                                        unsigned int count,
-                                        unsigned char *pValue);
-    inline void writeExifIfd(unsigned char **pCur,
-                                         unsigned short tag,
-                                         unsigned short type,
-                                         unsigned int count,
-                                         rational_t *pValue,
-                                         unsigned int *offset,
-                                         unsigned char *start);
-    inline void writeExifIfd(unsigned char **pCur,
-                                         unsigned short tag,
-                                         unsigned short type,
-                                         unsigned int count,
-                                         unsigned char *pValue,
-                                         unsigned int *offset,
-                                         unsigned char *start);
-    int     m_scaleDownYuv422(char *srcBuf, uint32_t srcWidth, uint32_t srcHight,
-                           char *dstBuf, uint32_t dstWidth, uint32_t dstHight);
-    // thumbnail
-    int     encodeThumbnail(unsigned int *size, bool useMain = true);
-
-    int     allocJpegIonMemory(ion_client ionClient, ion_buffer *ionBuffer, char **buffer, int size);
-    void    freeJpegIonMemory(ion_client ionClient, ion_buffer *ionBuffer, char **buffer, int size);
-
-    bool     m_flagCreate;
-
-    SecJpegEncoderHal *m_jpegMain;
-    SecJpegEncoderHal *m_jpegThumb;
-
-    char *m_pThumbInputBuffer;
-    char *m_pThumbOutputBuffer;
-#ifdef JPEG_WA_FOR_PAGEFAULT
-    char *m_pExtInBuf;
-    char *m_pJpegInputBuffer;
-    int m_iInBufSize;
-#endif // JPEG_WA_FOR_PAGEFAULT
-    ion_client m_ionJpegClient;
-    ion_buffer m_ionThumbInBuffer, m_ionThumbOutBuffer;
-#ifdef JPEG_WA_FOR_PAGEFAULT
-    ion_buffer m_ionJpegInBuffer;
-#endif // JPEG_WA_FOR_PAGEFAULT
-
-    int m_thumbnailW;
-    int m_thumbnailH;
-};
-
-#endif /* __SEC_JPG_ENC_H__ */
diff --git a/exynos5/hal/include/SecRect.h b/exynos5/hal/include/SecRect.h
deleted file mode 100644
index 1160a0b..0000000
--- a/exynos5/hal/include/SecRect.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-/*!
- * \file      SecRect.h
- * \brief     header file for SecRect
- * \author    Sangwoo, Park(sw5771.park@samsung.com)
- * \date      2011/06/02
- *
- * <b>Revision History: </b>
- * - 2010/06/03 : Sangwoo, Park(sw5771.park@samsung.com) \n
- *   Initial version
- *
- */
-
-/**
- * @page SecRect
- *
- * @section Introduction
- * SetRect is common struct for rectangle
- *
- * @section Copyright
- *  Copyright (c) 2008-2011 Samsung Electronics Co., Ltd.All rights reserved. \n
- *  Proprietary and Confidential
- *
- * @image html samsung.png
- */
-
-#ifndef __SEC_RECT_H__
-#define __SEC_RECT_H__
-
-//! Rectangle information
-struct SecRect
-{
-    int x;           //!< x pos
-    int y;           //!< y pos
-    int w;           //!< width
-    int h;           //!< height
-    int fullW;       //!< full width of image
-    int fullH;       //!< full height of image
-    int colorFormat; //!< V4L2_PIX_FMT_XXX
-
-    //! Constructor
-    SecRect(int _x_ = 0,
-            int _y_ = 0,
-            int _w_ = 0,
-            int _h_ = 0,
-            int _fullW_ = 0,
-            int _fullH_ = 0,
-            int _colorFormat_ = 0)
-    {
-        x = _x_;
-        y = _y_;
-        w = _w_;
-        h = _h_;
-        fullW = _fullW_;
-        fullH = _fullH_;
-        colorFormat = _colorFormat_;
-    }
-
-    //! Constructor
-    SecRect(const SecRect *other)
-    {
-        x           = other->x;
-        y           = other->y;
-        w           = other->w;
-        h           = other->h;
-        fullW       = other->fullW;
-        fullH       = other->fullH;
-        colorFormat = other->colorFormat;
-    }
-
-    //! Operator(=) override
-    SecRect& operator =(const SecRect &other)
-    {
-        x           = other.x;
-        y           = other.y;
-        w           = other.w;
-        h           = other.h;
-        fullW       = other.fullW;
-        fullH       = other.fullH;
-        colorFormat = other.colorFormat;
-        return *this;
-    }
-
-    //! Operator(==) override
-    bool operator ==(const SecRect &other) const
-    {
-        return (   x           == other.x
-                && y           == other.y
-                && w           == other.w
-                && h           == other.h
-                && fullW       == other.fullW
-                && fullH       == other.fullH
-                && colorFormat == other.colorFormat);
-    }
-
-    //! Operator(!=) override
-    bool operator !=(const SecRect &other) const
-    {
-        // use operator(==)
-        return !(*this == other);
-    }
-};
-
-//! Clip information
-struct SecRect2
-{
-    int x1; //!< Left   (The x-coordinate value of upper-left corner)
-    int y1; //!< Top    (The y-coordinate value of upper-left corner)
-    int x2; //!< Right  (The x-coordinate value of lower-right corner)
-    int y2; //!< Bottom (The y-coordinate value of lower-right corner)
-
-    //! Constructor
-    SecRect2(int _x1_ = 0, int _y1_ = 0, int _x2_ = 0, int _y2_ = 0)
-    {
-        x1 = _x1_;
-        y1 = _y1_;
-        x2 = _x2_;
-        y2 = _y2_;
-    }
-
-    //! Constructor
-    SecRect2(const SecRect2 *other)
-    {
-        x1 = other->x1;
-        y1 = other->y1;
-        x2 = other->x2;
-        y2 = other->y2;
-    }
-
-    //! Operator(=) override
-    SecRect2& operator =(const SecRect2 &other)
-    {
-        x1 = other.x1;
-        y1 = other.y1;
-        x2 = other.x2;
-        y2 = other.y2;
-        return *this;
-    }
-
-    //! Operator(==) override
-    bool operator ==(const SecRect2 &other) const
-    {
-        return (   x1           == other.x1
-                && y1           == other.y1
-                && x2           == other.x2
-                && y2           == other.y2);
-    }
-
-    //! Operator(!=) override
-    bool operator !=(const SecRect2 &other) const
-    {
-        // use operator(==)
-        return !(*this == other);
-    }
-};
-
-#endif //__SEC_RECT_H__
diff --git a/exynos5/hal/include/audio.h b/exynos5/hal/include/audio.h
deleted file mode 100644
index 1275db3..0000000
--- a/exynos5/hal/include/audio.h
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _AUDIO_H_
-#define _AUDIO_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef __HDMI_AUDIO_HDMIAUDIOPORT__
-#define __HDMI_AUDIO_HDMIAUDIOPORT__
-/**
- * @enum HDMIAudioPort
- * Available audio inputs on HDMI HW module.
- */
-enum HDMIAudioPort {
-    /** I2S input port */
-    I2S_PORT,
-    /** SPDIF input port */
-    SPDIF_PORT,
-    /** DSD input port */
-    DSD_PORT,
-};
-#endif /* __HDMI_AUDIO_HDMIAUDIOPORT__ */
-
-#ifndef __HDMI_AUDIO_AUDIOFORMAT__
-#define __HDMI_AUDIO_AUDIOFORMAT__
-/**
- * @enum AudioFormat
- * The encoding format of audio stream
- */
-enum AudioFormat {
-    /** LPCM encoding format */
-    LPCM_FORMAT = 1,
-    /** AC3 encoding format */
-    AC3_FORMAT,
-    /** MPEG1 encoding format */
-    MPEG1_FORMAT,
-    /** MP3 encoding format */
-    MP3_FORMAT,
-    /** MPEG2 encoding format */
-    MPEG2_FORMAT,
-    /** AAC encoding format */
-    AAC_FORMAT,
-    /** DTS encoding format */
-    DTS_FORMAT,
-    /** ATRAC encoding format */
-    ATRAC_FORMAT,
-    /** DSD encoding format */
-    DSD_FORMAT,
-    /** Dolby Digital+ encoding format */
-    Dolby_Digital_Plus_FORMAT,
-    /** DTS HD encoding format */
-    DTS_HD_FORMAT,
-    /** MAT encoding format */
-    MAT_FORMAT,
-    /** DST encoding format */
-    DST_FORMAT,
-    /** WAM_Pro encoding format */
-    WAM_Pro_FORMAT
-};
-#endif /* __HDMI_AUDIO_AUDIOFORMAT__ */
-
-#ifndef __HDMI_AUDIO_LPCMWORDLENGTH__
-#define __HDMI_AUDIO_LPCMWORDLENGTH__
-/**
- * @enum LPCM_WordLen
- * Word length of LPCM audio stream.
- */
-enum LPCM_WordLen {
-    /** 16bit word length */
-    WORD_16 = 0,
-    /** 17bit word length */
-    WORD_17,
-    /** 18bit word length */
-    WORD_18,
-    /** 19bit word length */
-    WORD_19,
-    /** 20bit word length */
-    WORD_20,
-    /** 21bit word length */
-    WORD_21,
-    /** 22bit word length */
-    WORD_22,
-    /** 23bit word length */
-    WORD_23,
-    /** 24bit word length */
-    WORD_24
-};
-#endif /* __HDMI_AUDIO_LPCMWORDLENGTH__ */
-
-#ifndef __HDMI_AUDIO_SAMPLINGFREQUENCY__
-#define __HDMI_AUDIO_SAMPLINGFREQUENCY__
-/**
- * @enum SamplingFreq
- * Sampling frequency of audio stream.
- */
-enum SamplingFreq {
-    /** 32KHz sampling frequency */
-    SF_32KHZ = 0,
-    /** 44.1KHz sampling frequency */
-    SF_44KHZ,
-    /** 48KHz sampling frequency */
-    SF_48KHZ,
-    /** 88.2KHz sampling frequency */
-    SF_88KHZ,
-    /** 96KHz sampling frequency */
-    SF_96KHZ,
-    /** 176.4KHz sampling frequency */
-    SF_176KHZ,
-    /** 192KHz sampling frequency */
-    SF_192KHZ
-};
-#endif /* __HDMI_AUDIO_SAMPLINGFREQUENCY__ */
-
-#ifndef __HDMI_AUDIO_CHANNELNUMBER__
-#define __HDMI_AUDIO_CHANNELNUMBER__
-/**
- * @enum ChannelNum
- * Channel number of audio stream.
- */
-enum ChannelNum {
-    /** 2 channel audio stream */
-    CH_2 = 2,
-    /** 3 channel audio stream */
-    CH_3,
-    /** 4 channel audio stream */
-    CH_4,
-    /** 5 channel audio stream */
-    CH_5,
-    /** 6 channel audio stream */
-    CH_6,
-    /** 7 channel audio stream */
-    CH_7,
-    /** 8 channel audio stream */
-    CH_8,
-};
-#endif /* __HDMI_AUDIO_CHANNELNUMBER__ */
-
-#ifndef __HDMI_AUDIO_AUDIOSAMPLEPACKETTYPE__
-#define __HDMI_AUDIO_AUDIOSAMPLEPACKETTYPE__
-/**
- * @enum HDMIASPType
- * Type of HDMI audio sample packet
- */
-enum HDMIASPType {
-    /** Audio Sample Packet Type */
-    HDMI_ASP,
-    /** One Bit Audio Packet Type */
-    HDMI_DSD,
-    /** High Bit Rate Packet Type */
-    HDMI_HBR,
-    /** DST Packet Type */
-    HDMI_DST
-};
-#endif /* __HDMI_AUDID_AUDIOSAMPLEPACKETTYPE__ */
-
-#ifndef __HDMI_AUDIO_I2S_CUV_AUDIO_CODING_TYPE__
-#define __HDMI_AUDIO_I2S_CUV_AUDIO_CODING_TYPE__
-/**
- * @enum CUVAudioCoding
- * Audio coding type information for CUV fields.
- */
-enum CUVAudioCoding {
-    /** Linear PCM coding type */
-    CUV_LPCM,
-    /** Non-linear PCM coding type */
-    CUV_NLPCM
-};
-#endif /* __HDMI_AUDIO_I2S_CUV_AUDIO_CODING_TYPE__ */
-
-#ifndef __HDMI_AUDIO_SPDIF_AUDIO_CODING_TYPE__
-#define __HDMI_AUDIO_SPDIF_AUDIO_CODING_TYPE__
-/**
- * @enum SPDIFAudioCoding
- * Audio coding type information for SPDIF input port.
- */
-enum SPDIFAudioCoding {
-    /** Linear PCM coding type */
-    SPDIF_LPCM,
-    /** Non-linear PCM coding type */
-    SPDIF_NLPCM
-};
-#endif /* __HDMI_AUDIO_SPDIF_AUDIO_CODING_TYPE__ */
-
-#ifndef __HDMI_AUDIO_I2S_CUV_CHANNEL_NUMBER__
-#define __HDMI_AUDIO_I2S_CUV_CHANNEL_NUMBER__
-/**
- * @enum CUVChannelNumber
- * Channel number information for CUV fields.
- */
-enum CUVChannelNumber {
-    /** Unknown channel audio stream */
-    CUV_CH_UNDEFINED = 0,
-    /** 1 channel audio stream */
-    CUV_CH_01,
-    /** 2 channel audio stream */
-    CUV_CH_02,
-    /** 3 channel audio stream */
-    CUV_CH_03,
-    /** 4 channel audio stream */
-    CUV_CH_04,
-    /** 5 channel audio stream */
-    CUV_CH_05,
-    /** 6 channel audio stream */
-    CUV_CH_06,
-    /** 7 channel audio stream */
-    CUV_CH_07,
-    /** 8 channel audio stream */
-    CUV_CH_08,
-    /** 9 channel audio stream */
-    CUV_CH_09,
-    /** 10 channel audio stream */
-    CUV_CH_10,
-    /** 11 channel audio stream */
-    CUV_CH_11,
-    /** 12 channel audio stream */
-    CUV_CH_12,
-    /** 13 channel audio stream */
-    CUV_CH_13,
-    /** 14 channel audio stream */
-    CUV_CH_14,
-    /** 15 channel audio stream */
-    CUV_CH_15,
-};
-#endif /* __HDMI_AUDIO_I2S_CUV_CHANNEL_NUMBER__ */
-
-#ifndef __HDMI_AUDIO_I2S_CUV_WORD_LENGTH__
-#define __HDMI_AUDIO_I2S_CUV_WORD_LENGTH__
-/**
- * @enum CUVWordLength
- * Word length information of LPCM audio stream for CUV fields.
- */
-enum CUVWordLength {
-    /** Max word length is 20 bits, number of valid bits is not defined */
-    CUV_WL_20_NOT_DEFINED,
-    /** Max word length is 20 bits, 16 bits are valid */
-    CUV_WL_20_16,
-    /** Max word length is 20 bits, 18 bits are valid */
-    CUV_WL_20_18,
-    /** Max word length is 20 bits, 19 bits are valid */
-    CUV_WL_20_19,
-    /** Max word length is 20 bits, 20 bits are valid */
-    CUV_WL_20_20,
-    /** Max word length is 20 bits, 17 bits are valid */
-    CUV_WL_20_17,
-    /** Max word length is 24 bits, number of valid bits is not defined */
-    CUV_WL_24_NOT_DEFINED,
-    /** Max word length is 24 bits, 20 bits are valid */
-    CUV_WL_24_20,
-    /** Max word length is 24 bits, 22 bits are valid */
-    CUV_WL_24_22,
-    /** Max word length is 24 bits, 23 bits are valid */
-    CUV_WL_24_23,
-    /** Max word length is 24 bits, 24 bits are valid */
-    CUV_WL_24_24,
-    /** Max word length is 24 bits, 21 bits are valid */
-    CUV_WL_24_21,
-};
-#endif /* __HDMI_AUDIO_I2S_CUV_WORD_LENGTH__ */
-
-#ifndef __HDMI_AUDIO_I2S_BITS_PER_CHANNEL__
-#define __HDMI_AUDIO_I2S_BITS_PER_CHANNEL__
-
-/**
- * @enum I2SBitsPerChannel
- * Serial data bit per channel in I2S audio stream.
- */
-enum I2SBitsPerChannel {
-    /** 16 bits per channel */
-    I2S_BPC_16,
-    /** 20 bits per channel */
-    I2S_BPC_20,
-    /** 24 bits per channel */
-    I2S_BPC_24
-};
-
-#endif /* __HDMI_AUDIO_I2S_BITS_PER_CHANNEL__ */
-
-#ifndef __HDMI_AUDIO_I2S_DATA_FORMAT__
-#define __HDMI_AUDIO_I2S_DATA_FORMAT__
-
-/**
- * @enum I2SDataFormat
- * Foramt of data in I2S audio stream.
- */
-enum I2SDataFormat {
-    /** Basic format */
-    I2S_BASIC,
-    /** Left justified format */
-    I2S_LEFT_JUSTIFIED,
-    /** Right justified format */
-    I2S_RIGHT_JUSTIFIED
-};
-
-#endif /* __HDMI_AUDIO_I2S_DATA_FORMAT__ */
-
-#ifndef __HDMI_AUDIO_I2S_CLOCK_PER_FRAME__
-#define __HDMI_AUDIO_I2S_CLOCK_PER_FRAME__
-
-/**
- * @enum I2SClockPerFrame
- * Bit clock per Frame in I2S audio stream.
- */
-enum I2SClockPerFrame {
-    /** 32 clock per Frame */
-    I2S_32FS,
-    /** 48 clock per Frame */
-    I2S_48FS,
-    /** 64 clock per Frame */
-    I2S_64FS
-};
-
-#endif /* __HDMI_AUDIO_I2S_CLOCK_PER_FRAME__ */
-
-#ifndef __HDMI_AUDIO_I2S_PARAMETER__
-#define __HDMI_AUDIO_I2S_PARAMETER__
-
-//! Structure for I2S audio stream
-struct I2SParameter {
-    enum I2SBitsPerChannel bpc;
-    enum I2SDataFormat format;
-    enum I2SClockPerFrame clk;
-};
-#endif /* __HDMI_AUDIO_I2S_PARAMETER__ */
-
-//! Structure for HDMI audio input
-struct HDMIAudioParameter {
-    /** Input audio port to HDMI HW */
-    enum HDMIAudioPort inputPort;
-    /** Output Packet type **/
-    enum HDMIASPType outPacket;
-    /** Encoding format */
-    enum AudioFormat formatCode;
-    /** Channel number */
-    enum ChannelNum channelNum;
-    /** Sampling frequency */
-    enum SamplingFreq sampleFreq;
-    /** Word length. This is avaliable only if LPCM encoding format */
-    enum LPCM_WordLen wordLength;
-    /** structure for I2S audio stream */
-    struct I2SParameter i2sParam;
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // _AUDIO_H_
diff --git a/exynos5/hal/include/exynos_mem.h b/exynos5/hal/include/exynos_mem.h
deleted file mode 100644
index a65f030..0000000
--- a/exynos5/hal/include/exynos_mem.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __INCLUDE_EXYNOS_MEM_H
-#define __INCLUDE_EXYNOS_MEM_H __FILE__
-
-/* IOCTL commands */
-#define EXYNOS_MEM_SET_CACHEABLE	_IOW('M', 200, bool)
-#define EXYNOS_MEM_PADDR_CACHE_FLUSH	_IOW('M', 201, struct exynos_mem_flush_range)
-
-struct exynos_mem_flush_range {
-	dma_addr_t	start;
-	size_t		length;
-};
-
-#endif /* __INCLUDE_EXYNOS_MEM_H */
diff --git a/exynos5/hal/include/gralloc_priv.h b/exynos5/hal/include/gralloc_priv.h
deleted file mode 100644
index 05d7754..0000000
--- a/exynos5/hal/include/gralloc_priv.h
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
- *
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef GRALLOC_PRIV_H_
-#define GRALLOC_PRIV_H_
-
-#include <stdint.h>
-#include <pthread.h>
-#include <errno.h>
-#include <linux/fb.h>
-
-#include <hardware/gralloc.h>
-#include <cutils/native_handle.h>
-
-#include "ump.h"
-
-/*
- * HWC_HWOVERLAY is flag for location of glFinish().
- * Enable this define if you want that glFinish() is in HWComposer.
- * If you disable this define, glFinish() is called in threadloop().
- */
-#define HWC_HWOVERLAY 1
-
-#define GRALLOC_ARM_UMP_MODULE 1
-
-struct private_handle_t;
-
-struct private_module_t
-{
-    gralloc_module_t base;
-
-    private_handle_t* framebuffer;
-    uint32_t flags;
-    uint32_t numBuffers;
-    uint32_t bufferMask;
-    pthread_mutex_t lock;
-    buffer_handle_t currentBuffer;
-    int ion_client;
-
-    struct fb_var_screeninfo info;
-    struct fb_fix_screeninfo finfo;
-    float xdpi;
-    float ydpi;
-    float fps;
-
-    enum {
-        PRIV_USAGE_LOCKED_FOR_POST = 0x80000000
-    };
-};
-
-#ifdef __cplusplus
-struct private_handle_t : public native_handle
-{
-#else
-struct private_handle_t
-{
-    struct native_handle nativeHandle;
-#endif
-
-    enum {
-        PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
-        PRIV_FLAGS_USES_UMP    = 0x00000002,
-        PRIV_FLAGS_USES_ION    = 0x00000020,
-    };
-
-    enum {
-        LOCK_STATE_WRITE     =   1<<31,
-        LOCK_STATE_MAPPED    =   1<<30,
-        LOCK_STATE_READ_MASK =   0x3FFFFFFF
-    };
-
-    // Following member is for ION memory only
-    int     fd;
-    int     magic;
-    int     flags;
-    int     size;
-    int     base;
-    int     lockState;
-    int     writeOwner;
-    int     pid;
-
-    // Following members are for UMP memory only
-    ump_secure_id  ump_id;
-    ump_handle     ump_mem_handle;
-
-    // Following members is for framebuffer only
-    int     offset;
-    int     paddr;
-
-    int     format;
-    int     usage;
-    int     width;
-    int     height;
-    int     bpp;
-    int     stride;
-
-    /* Following members are for YUV information */
-    unsigned int yaddr;
-    unsigned int uoffset;
-    unsigned int voffset;
-    int     ion_client;
-
-#ifdef __cplusplus
-    static const int sNumInts = 21;
-    static const int sNumFds = 1;
-    static const int sMagic = 0x3141592;
-
-    private_handle_t(int flags, int size, int base, int lock_state, ump_secure_id secure_id, ump_handle handle):
-        magic(sMagic),
-        flags(flags),
-        size(size),
-        base(base),
-        lockState(lock_state),
-        writeOwner(0),
-        pid(getpid()),
-        ump_id(secure_id),
-        ump_mem_handle(handle),
-        fd(0),
-        format(0),
-        usage(0),
-        width(0),
-        height(0),
-        bpp(0),
-        stride(0),
-        yaddr(0),
-        uoffset(0),
-        voffset(0),
-        offset(0)
-    {
-        version = sizeof(native_handle);
-        numFds = sNumFds;
-        numInts = sNumInts;
-    }
-
-    private_handle_t(int flags, int size, int base, int lock_state, int fb_file, int fb_offset):
-        magic(sMagic),
-        flags(flags),
-        size(size),
-        base(base),
-        lockState(lock_state),
-        writeOwner(0),
-        pid(getpid()),
-        ump_id(UMP_INVALID_SECURE_ID),
-        ump_mem_handle(UMP_INVALID_MEMORY_HANDLE),
-        fd(fb_file),
-        format(0),
-        usage(0),
-        width(0),
-        height(0),
-        bpp(0),
-        stride(0),
-        yaddr(0),
-        uoffset(0),
-        voffset(0),
-        offset(fb_offset)
-    {
-        version = sizeof(native_handle);
-        numFds = sNumFds;
-        numInts = sNumInts;
-    }
-
-    ~private_handle_t()
-    {
-        magic = 0;
-    }
-
-    bool usesPhysicallyContiguousMemory()
-    {
-        return (flags & PRIV_FLAGS_FRAMEBUFFER) ? true : false;
-    }
-
-    static int validate(const native_handle* h)
-    {
-        const private_handle_t* hnd = (const private_handle_t*)h;
-
-        if (!h || h->version != sizeof(native_handle) ||
-            h->numInts != sNumInts ||
-            h->numFds != sNumFds ||
-            hnd->magic != sMagic)
-            return -EINVAL;
-
-        return 0;
-    }
-
-    static private_handle_t* dynamicCast(const native_handle* in)
-    {
-        if (validate(in) == 0)
-            return (private_handle_t*) in;
-
-        return NULL;
-    }
-#endif
-};
-
-#endif /* GRALLOC_PRIV_H_ */
diff --git a/exynos5/hal/include/i2c-dev.h b/exynos5/hal/include/i2c-dev.h
deleted file mode 100644
index a7a35a7..0000000
--- a/exynos5/hal/include/i2c-dev.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
-    i2c-dev.h - i2c-bus driver, char device interface
-
-    Copyright (C) 1995-97 Simon G. Vogl
-    Copyright (C) 1998-99 Frodo Looijaard <frodol@dds.nl>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef _LINUX_I2C_DEV_H
-#define _LINUX_I2C_DEV_H
-
-#include <linux/types.h>
-#include <linux/compiler.h>
-
-/* /dev/i2c-X ioctl commands.  The ioctl's parameter is always an
- * unsigned long, except for:
- *  - I2C_FUNCS, takes pointer to an unsigned long
- *  - I2C_RDWR, takes pointer to struct i2c_rdwr_ioctl_data
- *  - I2C_SMBUS, takes pointer to struct i2c_smbus_ioctl_data
- */
-#define I2C_RETRIES 0x0701  /* number of times a device address should
-                   be polled when not acknowledging */
-#define I2C_TIMEOUT 0x0702  /* set timeout in units of 10 ms */
-
-/* NOTE: Slave address is 7 or 10 bits, but 10-bit addresses
- * are NOT supported! (due to code brokenness)
- */
-#define I2C_SLAVE   0x0703  /* Use this slave address */
-#define I2C_SLAVE_FORCE 0x0706  /* Use this slave address, even if it
-                   is already in use by a driver! */
-#define I2C_TENBIT  0x0704  /* 0 for 7 bit addrs, != 0 for 10 bit */
-
-#define I2C_FUNCS   0x0705  /* Get the adapter functionality mask */
-
-#define I2C_RDWR    0x0707  /* Combined R/W transfer (one STOP only) */
-
-#define I2C_PEC     0x0708  /* != 0 to use PEC with SMBus */
-#define I2C_SMBUS   0x0720  /* SMBus transfer */
-
-
-/* This is the structure as used in the I2C_SMBUS ioctl call */
-struct i2c_smbus_ioctl_data {
-    __u8 read_write;
-    __u8 command;
-    __u32 size;
-    union i2c_smbus_data __user *data;
-};
-
-/* This is the structure as used in the I2C_RDWR ioctl call */
-struct i2c_rdwr_ioctl_data {
-    struct i2c_msg __user *msgs;    /* pointers to i2c_msgs */
-    __u32 nmsgs;            /* number of i2c_msgs */
-};
-
-#define  I2C_RDRW_IOCTL_MAX_MSGS    42
-
-#ifdef __KERNEL__
-#define I2C_MAJOR   89      /* Device major number      */
-#endif
-
-#endif /* _LINUX_I2C_DEV_H */
diff --git a/exynos5/hal/include/ion.h b/exynos5/hal/include/ion.h
deleted file mode 100644
index dbb8896..0000000
--- a/exynos5/hal/include/ion.h
+++ /dev/null
@@ -1,144 +0,0 @@
-#ifndef _LIB_ION_H_
-#define _LIB_ION_H_
-
-#include <unistd.h> /* size_t */
-
-#define ION_HEAP_SYSTEM_MASK		(1 << 0)
-#define ION_HEAP_SYSTEM_CONTIG_MASK	(1 << 1)
-#define ION_HEAP_EXYNOS_MASK		(1 << 4)
-#define ION_HEAP_EXYNOS_CONTIG_MASK	(1 << 5)
-
-/* ION_MSYNC_FLAGS
- * values of @flags parameter to ion_msync()
- *
- * IMSYNC_DEV_TO_READ: Device only reads the buffer
- * IMSYNC_DEV_TO_WRITE: Device may writes to the buffer
- * IMSYNC_DEV_TO_RW: Device reads and writes to the buffer
- *
- * IMSYNC_SYNC_FOR_DEV: ion_msync() for device to access the buffer
- * IMSYNC_SYNC_FOR_CPU: ion_msync() for CPU to access the buffer after device
- *                      has accessed it.
- *
- * The values must be ORed with one of IMSYNC_DEV_* and one of IMSYNC_SYNC_*.
- * Otherwise, ion_msync() will not effect.
- */
-enum ION_MSYNC_FLAGS {
-	IMSYNC_DEV_TO_READ = 0,
-	IMSYNC_DEV_TO_WRITE = 1,
-	IMSYNC_DEV_TO_RW = 2,
-	IMSYNC_SYNC_FOR_DEV = 0x10000,
-	IMSYNC_SYNC_FOR_CPU = 0x20000,
-};
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ion_client
- * An ION client is an object or an entity that needs to use the service of
- * ION and has unique address space. ion_client is an identifier of an ION
- * client and it represents the ION client.
- * All operations on ION needs a valid ion_client value and it can be obtained
- * by ion_client_create().
- */
-typedef int ion_client;
-
-/* ion_buffer
- * An identifier of a buffer allocated from ION. You must obtain to access
- * a buffer allocated from ION. If you have an effective ion_buffer, you have
- * three options to work with it.
- * - To access  the buffer, you can request an address (user virtual address)
- *   of the buffer with ion_map().
- * - To pass the buffer to the kernel, you can pass the ion_buffer to the
- *   kernel driver directly, if the kernel driver can work with ION.
- * - To pass the buffer to other processes, you can pass the ion_buffer to
- *   other processes through RPC machanism such as socket communication or
- *   Android Binder because ion_buffer is actually an open file descripotor
- *   of the current process.
- */
-typedef int ion_buffer;
-
-/* ion_client_create()
- * @RETURN: new ion_client.
- *          netative value if creating new ion_client is failed.
- *
- * A call to ion_client_create() must be paired with ion_client_destroy(),
- * symmetrically. ion_client_destroy() needs a valid ion_client that
- * is returned by ion_client_create().
- */
-ion_client ion_client_create(void);
-
-/* ion_client_destroy()
- * @client: An ion_client value to remove.
- */
-void ion_client_destroy(ion_client client);
-
-/* ion_alloc() - Allocates new buffer from ION.
- * @client: A valid ion_client value returned by ion_client_create().
- * @len: Size of a buffer required in bytes.
- * @align: Alignment requirements of @len and the start address of the allocated
- *         buffer. If the @len is not aligned by @align, ION allocates a buffer
- *         that is aligned by @align and the size of the buffer will be larger
- *         than @len.
- * @flags: Additional requirements about buffer. ION_HEAP_SYSTEM_CONTIG_MASK
- *         for allocating physically contiguous buffer and ION_HEAP_SYSTEM_MASK
- *         for virtually contiguous buffer. You can combine those flags or
- *         simply give -1(0xFFFFFFFF) if you do not care about the contiguouty
- *         of the buffer.
- * @RETURN: An ion_buffer that represents the buffer allocated. It is only
- *          unique in the context of the given client, @client.
- *          -error if the allocation failed.
- *          See the description of ion_buffer above for detailed information.
- */
-ion_buffer ion_alloc(ion_client client, size_t len, size_t align,
-		     unsigned int flags);
-
-/* ion_free() - Frees an existing buffer that is allocated by ION
- * @buffer: An ion_buffer of the buffer to be released.
- */
-void ion_free(ion_buffer buffer);
-
-/* ion_map() - Obtains a virtual address of the buffer identied by @buffer
- * @buffer: The buffer to map. The virtual address returned is allocated by the
- *          kernel.
- * @len: The size of the buffer to map. This must not exceed the size of the
- *       buffer represented by @fd_buf. Thus you need to know the size of it
- *       before calling this function. If @len is less than the size of the
- *       buffer, this function just map just the size requested (@len) not the
- *       entire buffer.
- * @offset: How many pages will be ignored while mapping.@offset number of
- *       pages from the start of the buffer will not be mapped.
- * @RETURN: The start virtual addres mapped.
- *          MAP_FAILED if mapping fails.
- *
- * Note that @len + (@offset * PAGE_SIZE) must not exceed the size of the
- * buffer.
- */
-void *ion_map(ion_buffer buffer, size_t len, off_t offset);
-
-/* ion_unmap() - Frees the buffer mapped by ion_map()
- * @addr: The address returned by ion_map().
- * @len: The size of the buffer mapped by ion_map().
- * @RETURN: 0 on success, and -1 on failure.
- *          errno is also set on failure.
- */
-int ion_unmap(void *addr, size_t len);
-
-/* ion_msync() - Makes sure that data in the buffer are visible to H/W peri.
- * @client: A valid ion_client value returned by ion_client_create().
- * @buffer: The buffer to perform ion_msync().
- * @flags: Direction of access of H/W peri and CPU. See the description of
- *         ION_MSYNC_FLAGS.
- * @size: Size to ion_msync() in bytes.
- * @offset: Where ion_msync() start in @buffer, size in bytes.
- * @RETURN: 0 if successful. -error, otherwise.
- *
- * Note that @offset + @size must not exceed the size of @buffer.
- */
-int ion_msync(ion_client client, ion_buffer buffer, long flags,
-		size_t size, off_t offset);
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* _LIB_ION_H_ */
diff --git a/exynos5/hal/include/jpeg_api.h b/exynos5/hal/include/jpeg_api.h
deleted file mode 100644
index f2685e1..0000000
--- a/exynos5/hal/include/jpeg_api.h
+++ /dev/null
@@ -1,121 +0,0 @@
-#ifndef __JPEG_API_H__
-#define __JPEG_API_H__
-
-#define JPEG_DRIVER_NAME        "/dev/s5p-jpeg"
-
-#define MAX_JPEG_WIDTH          3264
-#define MAX_JPEG_HEIGHT         2448
-
-#define MAX_JPEG_RES            (MAX_JPEG_WIDTH * MAX_JPEG_HEIGHT)
-
-#define JPEG_STREAM_BUF_SIZE    MAX_JPEG_RES
-#define JPEG_FRAME_BUF_SIZE     (MAX_JPEG_RES * 3)
-
-#define JPEG_TOTAL_BUF_SIZE     (JPEG_STREAM_BUF_SIZE + JPEG_FRAME_BUF_SIZE)
-
-#define JPEG_IOCTL_MAGIC    'J'
-
-#define IOCTL_JPEG_DEC_EXE              _IO(JPEG_IOCTL_MAGIC, 1)
-#define IOCTL_JPEG_ENC_EXE              _IO(JPEG_IOCTL_MAGIC, 2)
-#define IOCTL_GET_DEC_IN_BUF            _IO(JPEG_IOCTL_MAGIC, 3)
-#define IOCTL_GET_DEC_OUT_BUF           _IO(JPEG_IOCTL_MAGIC, 4)
-#define IOCTL_GET_ENC_IN_BUF            _IO(JPEG_IOCTL_MAGIC, 5)
-#define IOCTL_GET_ENC_OUT_BUF           _IO(JPEG_IOCTL_MAGIC, 6)
-#define IOCTL_SET_DEC_PARAM             _IO(JPEG_IOCTL_MAGIC, 7)
-#define IOCTL_SET_ENC_PARAM             _IO(JPEG_IOCTL_MAGIC, 8)
-
-enum jpeg_ret_type{
-    JPEG_FAIL,
-    JPEG_OK,
-    JPEG_ENCODE_FAIL,
-    JPEG_ENCODE_OK,
-    JPEG_DECODE_FAIL,
-    JPEG_DECODE_OK,
-    JPEG_OUT_OF_MEMORY,
-    JPEG_UNKNOWN_ERROR
-};
-
-enum jpeg_img_quality_level {
-    QUALITY_LEVEL_1 = 0,     /* high */
-    QUALITY_LEVEL_2,
-    QUALITY_LEVEL_3,
-    QUALITY_LEVEL_4,         /* low */
-};
-
-/* raw data image format */
-enum jpeg_frame_format {
-    YUV_422,    /* decode output, encode input */
-    YUV_420,    /* decode output, encode output */
-    RGB_565,    /* encode input */
-};
-
-/* jpeg data format */
-enum jpeg_stream_format {
-    JPEG_422,    /* decode input, encode output */
-    JPEG_420,    /* decode input, encode output */
-    JPEG_444,    /* decode input*/
-    JPEG_GRAY,    /* decode input*/
-    JPEG_RESERVED,
-};
-
-enum jpeg_test_mode {
-    encode_mode,
-    decode_mode,
-};
-
-struct jpeg_dec_param {
-    unsigned int width;
-    unsigned int height;
-    unsigned int size;
-    enum jpeg_stream_format in_fmt;
-    enum jpeg_frame_format out_fmt;
-};
-
-struct jpeg_enc_param {
-    unsigned int width;
-    unsigned int height;
-    unsigned int size;
-    enum jpeg_frame_format in_fmt;
-    enum jpeg_stream_format out_fmt;
-    enum jpeg_img_quality_level quality;
-};
-
-struct jpeg_args{
-    char                     *in_buf;
-    unsigned int             in_cookie;
-    unsigned int             in_buf_size;
-    char                     *out_buf;
-    unsigned int             out_cookie;
-    unsigned int             out_buf_size;
-    char                     *mmapped_addr;
-    struct jpeg_dec_param    *dec_param;
-    struct jpeg_enc_param    *enc_param;
-};
-
-struct jpeg_lib {
-    int  jpeg_fd;
-    struct jpeg_args args;
-};
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-int api_jpeg_decode_init();
-int api_jpeg_encode_init();
-int api_jpeg_decode_deinit(int dev_fd);
-int api_jpeg_encode_deinit(int dev_fd);
-void *api_jpeg_get_decode_in_buf(int dev_fd, unsigned int size);
-void *api_jpeg_get_encode_in_buf(int dev_fd, unsigned int size);
-void *api_jpeg_get_decode_out_buf(int dev_fd);
-void *api_jpeg_get_encode_out_buf(int dev_fd);
-void api_jpeg_set_decode_param(struct jpeg_dec_param *param);
-void api_jpeg_set_encode_param(struct jpeg_enc_param *param);
-enum jpeg_ret_type api_jpeg_decode_exe(int dev_fd,
-                    struct jpeg_dec_param *dec_param);
-enum jpeg_ret_type api_jpeg_encode_exe(int dev_fd,
-                    struct jpeg_enc_param *enc_param);
-#ifdef __cplusplus
-}
-#endif
-
-#endif//__JPEG_API_H__
diff --git a/exynos5/hal/include/jpeg_hal.h b/exynos5/hal/include/jpeg_hal.h
deleted file mode 100644
index 4d9c160..0000000
--- a/exynos5/hal/include/jpeg_hal.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "videodev2.h"
-
-#define JPEG_DEC_NODE        "/dev/video11"
-#define JPEG_ENC_NODE        "/dev/video12"
-
-#define JPEG_MAX_PLANE_CNT          3
-#define JPEG_DEC_OUT_BYTE_ALIGN     8
-
-//#define JPEG_PERF_MEAS
-
-#ifdef JPEG_PERF_MEAS
-#define JPEG_PERF_DEFINE(n) \
-    struct timeval time_start_##n, time_stop_##n; unsigned long log_time_##n = 0;
-
-#define JPEG_PERF_START(n) \
-    gettimeofday(&time_start_##n, NULL);
-
-#define JPEG_PERF_END(n) \
-    gettimeofday(&time_stop_##n, NULL); log_time_##n = measure_time(&time_start_##n, &time_stop_##n);
-
-#define JPEG_PERF(n) \
-    log_time_##n
-#else
-#define JPEG_PERF_DEFINE(n)
-#define JPEG_PERF_START(n)
-#define JPEG_PERF_END(n)
-#define JPEG_PERF(n)
-#endif
-
-enum jpeg_ret_type {
-    JPEG_FAIL,
-    JPEG_OK,
-    JPEG_ENCODE_FAIL,
-    JPEG_ENCODE_OK,
-    JPEG_DECODE_FAIL,
-    JPEG_DECODE_OK,
-    JPEG_OUT_OF_MEMORY,
-    JPEG_UNKNOWN_ERROR
-};
-
-enum jpeg_quality_level {
-    QUALITY_LEVEL_1 = 0,    /* high */
-    QUALITY_LEVEL_2,
-    QUALITY_LEVEL_3,
-    QUALITY_LEVEL_4,        /* low */
-};
-
-enum jpeg_mode {
-    JPEG_ENCODE,
-    JPEG_DECODE
-};
-
-struct jpeg_buf {
-    int     num_planes;
-    void    *start[JPEG_MAX_PLANE_CNT];
-    int     length[JPEG_MAX_PLANE_CNT];
-};
-
-struct jpeg_buf_info {
-    int                 num_planes;
-    enum v4l2_memory    memory;
-    enum v4l2_buf_type  buf_type;
-    int                 reserved[4];
-};
-
-struct jpeg_pixfmt {
-    int in_fmt;
-    int out_fmt;
-    int reserved[4];
-};
-
-struct jpeg_config {
-    enum jpeg_mode              mode;
-    enum jpeg_quality_level     enc_qual;
-
-    int                         width;
-    int                         height;
-
-    int                         num_planes;
-
-    int                         scaled_width;
-    int                         scaled_height;
-
-    int                         sizeJpeg;
-
-    union {
-        struct jpeg_pixfmt enc_fmt;
-        struct jpeg_pixfmt dec_fmt;
-    } pix;
-
-    int                         reserved[8];
-};
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-int jpeghal_dec_init();
-int jpeghal_enc_init();
-
-int jpeghal_dec_setconfig(int fd, struct jpeg_config *config);
-int jpeghal_enc_setconfig(int fd, struct jpeg_config *config);
-int jpeghal_dec_getconfig(int fd, struct jpeg_config *config);
-int jpeghal_enc_getconfig(int fd, struct jpeg_config *config);
-
-int jpeghal_set_inbuf(int fd, struct jpeg_buf *buf);
-int jpeghal_set_outbuf(int fd, struct jpeg_buf *buf);
-
-int jpeghal_dec_exe(int fd, struct jpeg_buf *in_buf, struct jpeg_buf *out_buf);
-int jpeghal_enc_exe(int fd, struct jpeg_buf *in_buf, struct jpeg_buf *out_buf);
-
-int jpeghal_deinit(int fd, struct jpeg_buf *in_buf, struct jpeg_buf *out_buf);
-
-int jpeghal_s_ctrl(int fd, int cid, int value);
-int jpeghal_g_ctrl(int fd, int id);
-
-unsigned long measure_time(struct timeval *start, struct timeval *stop);
-#ifdef __cplusplus
-}
-#endif
diff --git a/exynos5/hal/include/malisw/arm_cstd/arm_cstd.h b/exynos5/hal/include/malisw/arm_cstd/arm_cstd.h
deleted file mode 100644
index 61520b5..0000000
--- a/exynos5/hal/include/malisw/arm_cstd/arm_cstd.h
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2007-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-/**
- * @addtogroup malisw
- * @{
- */
-
-/* ============================================================================
-    Description
-============================================================================ */
-/**
- * @defgroup arm_cstd_coding_standard ARM C standard types and constants
- * The common files are a set of standard headers which are used by all parts
- * of this development, describing types, and generic constants.
- *
- * Files in group:
- *     - arm_cstd.h
- *     - arm_cstd_compilers.h
- *     - arm_cstd_types.h
- *     - arm_cstd_types_rvct.h
- *     - arm_cstd_types_gcc.h
- *     - arm_cstd_types_msvc.h
- *     - arm_cstd_pack_push.h
- *     - arm_cstd_pack_pop.h
- */
-
-/**
- * @addtogroup arm_cstd_coding_standard
- * @{
- */
-
-#ifndef _ARM_CSTD_
-#define _ARM_CSTD_
-
-/* ============================================================================
-	Import standard C99 types
-============================================================================ */
-#include "arm_cstd_compilers.h"
-#include "arm_cstd_types.h"
-
-/* ============================================================================
-	Min and Max Values
-============================================================================ */
-#if !defined(INT8_MAX)
-	#define INT8_MAX                ((int8_t) 0x7F)
-#endif
-#if !defined(INT8_MIN)
-	#define INT8_MIN                (-INT8_MAX - 1)
-#endif
-
-#if !defined(INT16_MAX)
-	#define INT16_MAX               ((int16_t)0x7FFF)
-#endif
-#if !defined(INT16_MIN)
-	#define INT16_MIN               (-INT16_MAX - 1)
-#endif
-
-#if !defined(INT32_MAX)
-	#define INT32_MAX               ((int32_t)0x7FFFFFFF)
-#endif
-#if !defined(INT32_MIN)
-	#define INT32_MIN               (-INT32_MAX - 1)
-#endif
-
-#if !defined(INT64_MAX)
-	#define INT64_MAX               ((int64_t)0x7FFFFFFFFFFFFFFFLL)
-#endif
-#if !defined(INT64_MIN)
-	#define INT64_MIN               (-INT64_MAX - 1)
-#endif
-
-#if !defined(UINT8_MAX)
-	#define UINT8_MAX               ((uint8_t) 0xFF)
-#endif
-
-#if !defined(UINT16_MAX)
-	#define UINT16_MAX              ((uint16_t)0xFFFF)
-#endif
-
-#if !defined(UINT32_MAX)
-	#define UINT32_MAX              ((uint32_t)0xFFFFFFFF)
-#endif
-
-#if !defined(UINT64_MAX)
-	#define UINT64_MAX              ((uint64_t)0xFFFFFFFFFFFFFFFFULL)
-#endif
-
-/* fallbacks if limits.h wasn't available */
-#if !defined(UCHAR_MAX)
-	#define UCHAR_MAX               ((unsigned char)~0U)
-#endif
-
-#if !defined(SCHAR_MAX)
-	#define SCHAR_MAX               ((signed char)(UCHAR_MAX >> 1))
-#endif
-#if !defined(SCHAR_MIN)
-	#define SCHAR_MIN               ((signed char)(-SCHAR_MAX - 1))
-#endif
-
-#if !defined(USHRT_MAX)
-	#define USHRT_MAX               ((unsigned short)~0U)
-#endif
-
-#if !defined(SHRT_MAX)
-	#define SHRT_MAX                ((signed short)(USHRT_MAX >> 1))
-#endif
-#if !defined(SHRT_MIN)
-	#define SHRT_MIN                ((signed short)(-SHRT_MAX - 1))
-#endif
-
-#if !defined(UINT_MAX)
-	#define UINT_MAX                ((unsigned int)~0U)
-#endif
-
-#if !defined(INT_MAX)
-	#define INT_MAX                 ((signed int)(UINT_MAX >> 1))
-#endif
-#if !defined(INT_MIN)
-	#define INT_MIN                 ((signed int)(-INT_MAX - 1))
-#endif
-
-#if !defined(ULONG_MAX)
-	#define ULONG_MAX               ((unsigned long)~0UL)
-#endif
-
-#if !defined(LONG_MAX)
-	#define LONG_MAX                ((signed long)(ULONG_MAX >> 1))
-#endif
-#if !defined(LONG_MIN)
-	#define LONG_MIN                ((signed long)(-LONG_MAX - 1))
-#endif
-
-#if !defined(ULLONG_MAX)
-	#define ULLONG_MAX              ((unsigned long long)~0ULL)
-#endif
-
-#if !defined(LLONG_MAX)
-	#define LLONG_MAX               ((signed long long)(ULLONG_MAX >> 1))
-#endif
-#if !defined(LLONG_MIN)
-	#define LLONG_MIN               ((signed long long)(-LLONG_MAX - 1))
-#endif
-
-#if !defined(SIZE_MAX)
-	#if 1 == CSTD_CPU_32BIT
-		#define SIZE_MAX            UINT32_MAX
-	#elif 1 == CSTD_CPU_64BIT
-		#define SIZE_MAX            UINT64_MAX
-	#endif
-#endif
-
-/* ============================================================================
-	Keywords
-============================================================================ */
-/* Portable keywords. */
-
-#if !defined(CONST)
-/**
- * @hideinitializer
- * Variable is a C @c const, which can be made non-const for testing purposes.
- */
-	#define CONST                   const
-#endif
-
-#if !defined(STATIC)
-/**
- * @hideinitializer
- * Variable is a C @c static, which can be made non-static for testing
- * purposes.
- */
-	#define STATIC                  static
-#endif
-
-/**
- * Specifies a function as being exported outside of a logical module.
- */
-#define PUBLIC
-
-/**
- * @def PROTECTED
- * Specifies a a function which is internal to an logical module, but which
- * should not be used outside of that module. This cannot be enforced by the
- * compiler, as a module is typically more than one translation unit.
- */
-#define PROTECTED
-
-/**
- * Specify an assertion value which is evaluated at compile time. Recommended
- * usage is specification of a @c static @c INLINE function containing all of
- * the assertions thus:
- *
- * @code
- * static INLINE [module]_compile_time_assertions( void )
- * {
- *     COMPILE_TIME_ASSERT( sizeof(uintptr_t) == sizeof(intptr_t) );
- * }
- * @endcode
- *
- * @note Use @c static not @c STATIC. We never want to turn off this @c static
- * specification for testing purposes.
- */
-#define CSTD_COMPILE_TIME_ASSERT( expr ) \
-	do { switch(0){case 0: case (expr):;} } while( FALSE )
-
-/**
- * @hideinitializer
- * @deprecated Prefered form is @c CSTD_UNUSED
- * Function-like macro for suppressing unused variable warnings. Where possible
- * such variables should be removed; this macro is present for cases where we
- * much support API backwards compatibility.
- */
-#define UNUSED( x )                 ((void)(x))
-
-/**
- * @hideinitializer
- * Function-like macro for suppressing unused variable warnings. Where possible
- * such variables should be removed; this macro is present for cases where we
- * much support API backwards compatibility.
- */
-#define CSTD_UNUSED( x )            ((void)(x))
-
-/**
- * @hideinitializer
- * Function-like macro for use where "no behavior" is desired. This is useful
- * when compile time macros turn a function-like macro in to a no-op, but
- * where having no statement is otherwise invalid.
- */
-#define CSTD_NOP( ... )             ((void)#__VA_ARGS__)
-
-/**
- * @hideinitializer
- * Function-like macro for converting a pointer in to a u64 for storing into
- * an external data structure. This is commonly used when pairing a 32-bit
- * CPU with a 64-bit peripheral, such as a Midgard GPU. C's type promotion
- * is complex and a straight cast does not work reliably as pointers are
- * often considered as signed.
- */
-#define CSTD_PTR_TO_U64( x )        ((uint64_t)((uintptr_t)(x)))
-
-/**
- * @hideinitializer
- * Function-like macro for stringizing a single level macro.
- * @code
- * #define MY_MACRO 32
- * CSTD_STR1( MY_MACRO )
- * > "MY_MACRO"
- * @endcode
- */
-#define CSTD_STR1( x )             #x
-
-/**
- * @hideinitializer
- * Function-like macro for stringizing a macro's value. This should not be used
- * if the macro is defined in a way which may have no value; use the
- * alternative @c CSTD_STR2N macro should be used instead.
- * @code
- * #define MY_MACRO 32
- * CSTD_STR2( MY_MACRO )
- * > "32"
- * @endcode
- */
-#define CSTD_STR2( x )              CSTD_STR1( x )
-
-/**
- * @hideinitializer
- * Utility function for stripping the first character off a string.
- */
-static INLINE char* arm_cstd_strstrip( char * string )
-{
-	return ++string;
-}
-
-/**
- * @hideinitializer
- * Function-like macro for stringizing a single level macro where the macro
- * itself may not have a value. Parameter @c a should be set to any single
- * character which is then stripped by the macro via an inline function. This
- * should only be used via the @c CSTD_STR2N macro; for printing a single
- * macro only the @c CSTD_STR1 macro is a better alternative.
- *
- * This macro requires run-time code to handle the case where the macro has 
- * no value (you can't concat empty strings in the preprocessor).
- */
-#define CSTD_STR1N( a, x )          arm_cstd_strstrip( CSTD_STR1( a##x ) )
-
-/**
- * @hideinitializer
- * Function-like macro for stringizing a two level macro where the macro itself
- * may not have a value.
- * @code
- * #define MY_MACRO 32
- * CSTD_STR2N( MY_MACRO )
- * > "32"
- *
- * #define MY_MACRO 32
- * CSTD_STR2N( MY_MACRO )
- * > "32"
- * @endcode
- */
-#define CSTD_STR2N( x )              CSTD_STR1N( _, x )
-
-/* ============================================================================
-	Validate portability constructs
-============================================================================ */
-static INLINE void arm_cstd_compile_time_assertions( void )
-{
-	CSTD_COMPILE_TIME_ASSERT( sizeof(uint8_t)  == 1 );
-	CSTD_COMPILE_TIME_ASSERT( sizeof(int8_t)   == 1 );
-	CSTD_COMPILE_TIME_ASSERT( sizeof(uint16_t) == 2 );
-	CSTD_COMPILE_TIME_ASSERT( sizeof(int16_t)  == 2 );
-	CSTD_COMPILE_TIME_ASSERT( sizeof(uint32_t) == 4 );
-	CSTD_COMPILE_TIME_ASSERT( sizeof(int32_t)  == 4 );
-	CSTD_COMPILE_TIME_ASSERT( sizeof(uint64_t) == 8 );
-	CSTD_COMPILE_TIME_ASSERT( sizeof(int64_t)  == 8 );
-	CSTD_COMPILE_TIME_ASSERT( sizeof(intptr_t) == sizeof(uintptr_t) );
-
-	CSTD_COMPILE_TIME_ASSERT( 1 == TRUE );
-	CSTD_COMPILE_TIME_ASSERT( 0 == FALSE );
-
-#if 1 == CSTD_CPU_32BIT
-	CSTD_COMPILE_TIME_ASSERT( sizeof(uintptr_t) == 4 );
-#elif 1 == CSTD_CPU_64BIT
-	CSTD_COMPILE_TIME_ASSERT( sizeof(uintptr_t) == 8 );
-#endif
-
-}
-
-/* ============================================================================
-	Useful function-like macro
-============================================================================ */
-/**
- * @brief Return the lesser of two values.
- * As a macro it may evaluate its arguments more than once.
- * @see CSTD_MAX
- */
-#define CSTD_MIN( x, y )            ((x) < (y) ? (x) : (y))
-
-/**
- * @brief Return the greater of two values.
- * As a macro it may evaluate its arguments more than once.
- * If called on the same two arguments as CSTD_MIN it is guaranteed to return
- * the one that CSTD_MIN didn't return. This is significant for types where not
- * all values are comparable e.g. NaNs in floating-point types. But if you want
- * to retrieve the min and max of two values, consider using a conditional swap
- * instead.
- */
-#define CSTD_MAX( x, y )            ((x) < (y) ? (y) : (x))
-
-/**
- * @brief Clamp value @c x to within @c min and @c max inclusive.
- */
-#define CSTD_CLAMP( x, min, max )   ((x)<(min) ? (min):((x)>(max) ? (max):(x)))
-
-/**
- * Flag a cast as a reinterpretation, usually of a pointer type.
- */
-#define CSTD_REINTERPRET_CAST(type) (type)
-
-/**
- * Flag a cast as casting away const, usually of a pointer type.
- */
-#define CSTD_CONST_CAST(type)       (type)
-
-/**
- * Flag a cast as a (potentially complex) value conversion, usually of a 
- * numerical type.
- */
-#define CSTD_STATIC_CAST(type)      (type)
-
-/* ============================================================================
-	Useful bit constants
-============================================================================ */
-/**
- * @cond arm_cstd_utilities
- */
-
-/* Common bit constant values, useful in embedded programming. */
-#define F_BIT_0       ((uint32_t)0x00000001)
-#define F_BIT_1       ((uint32_t)0x00000002)
-#define F_BIT_2       ((uint32_t)0x00000004)
-#define F_BIT_3       ((uint32_t)0x00000008)
-#define F_BIT_4       ((uint32_t)0x00000010)
-#define F_BIT_5       ((uint32_t)0x00000020)
-#define F_BIT_6       ((uint32_t)0x00000040)
-#define F_BIT_7       ((uint32_t)0x00000080)
-#define F_BIT_8       ((uint32_t)0x00000100)
-#define F_BIT_9       ((uint32_t)0x00000200)
-#define F_BIT_10      ((uint32_t)0x00000400)
-#define F_BIT_11      ((uint32_t)0x00000800)
-#define F_BIT_12      ((uint32_t)0x00001000)
-#define F_BIT_13      ((uint32_t)0x00002000)
-#define F_BIT_14      ((uint32_t)0x00004000)
-#define F_BIT_15      ((uint32_t)0x00008000)
-#define F_BIT_16      ((uint32_t)0x00010000)
-#define F_BIT_17      ((uint32_t)0x00020000)
-#define F_BIT_18      ((uint32_t)0x00040000)
-#define F_BIT_19      ((uint32_t)0x00080000)
-#define F_BIT_20      ((uint32_t)0x00100000)
-#define F_BIT_21      ((uint32_t)0x00200000)
-#define F_BIT_22      ((uint32_t)0x00400000)
-#define F_BIT_23      ((uint32_t)0x00800000)
-#define F_BIT_24      ((uint32_t)0x01000000)
-#define F_BIT_25      ((uint32_t)0x02000000)
-#define F_BIT_26      ((uint32_t)0x04000000)
-#define F_BIT_27      ((uint32_t)0x08000000)
-#define F_BIT_28      ((uint32_t)0x10000000)
-#define F_BIT_29      ((uint32_t)0x20000000)
-#define F_BIT_30      ((uint32_t)0x40000000)
-#define F_BIT_31      ((uint32_t)0x80000000)
-
-/* Common 2^n size values, useful in embedded programming. */
-#define C_SIZE_1B     ((uint32_t)0x00000001)
-#define C_SIZE_2B     ((uint32_t)0x00000002)
-#define C_SIZE_4B     ((uint32_t)0x00000004)
-#define C_SIZE_8B     ((uint32_t)0x00000008)
-#define C_SIZE_16B    ((uint32_t)0x00000010)
-#define C_SIZE_32B    ((uint32_t)0x00000020)
-#define C_SIZE_64B    ((uint32_t)0x00000040)
-#define C_SIZE_128B   ((uint32_t)0x00000080)
-#define C_SIZE_256B   ((uint32_t)0x00000100)
-#define C_SIZE_512B   ((uint32_t)0x00000200)
-#define C_SIZE_1KB    ((uint32_t)0x00000400)
-#define C_SIZE_2KB    ((uint32_t)0x00000800)
-#define C_SIZE_4KB    ((uint32_t)0x00001000)
-#define C_SIZE_8KB    ((uint32_t)0x00002000)
-#define C_SIZE_16KB   ((uint32_t)0x00004000)
-#define C_SIZE_32KB   ((uint32_t)0x00008000)
-#define C_SIZE_64KB   ((uint32_t)0x00010000)
-#define C_SIZE_128KB  ((uint32_t)0x00020000)
-#define C_SIZE_256KB  ((uint32_t)0x00040000)
-#define C_SIZE_512KB  ((uint32_t)0x00080000)
-#define C_SIZE_1MB    ((uint32_t)0x00100000)
-#define C_SIZE_2MB    ((uint32_t)0x00200000)
-#define C_SIZE_4MB    ((uint32_t)0x00400000)
-#define C_SIZE_8MB    ((uint32_t)0x00800000)
-#define C_SIZE_16MB   ((uint32_t)0x01000000)
-#define C_SIZE_32MB   ((uint32_t)0x02000000)
-#define C_SIZE_64MB   ((uint32_t)0x04000000)
-#define C_SIZE_128MB  ((uint32_t)0x08000000)
-#define C_SIZE_256MB  ((uint32_t)0x10000000)
-#define C_SIZE_512MB  ((uint32_t)0x20000000)
-#define C_SIZE_1GB    ((uint32_t)0x40000000)
-#define C_SIZE_2GB    ((uint32_t)0x80000000)
-
-/**
- * @endcond
- */
-
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-#endif  /* End (_ARM_CSTD_) */
diff --git a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_compilers.h b/exynos5/hal/include/malisw/arm_cstd/arm_cstd_compilers.h
deleted file mode 100644
index 0dcb5e2..0000000
--- a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_compilers.h
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2005-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-#ifndef _ARM_CSTD_COMPILERS_H_
-#define _ARM_CSTD_COMPILERS_H_
-
-/* ============================================================================
-	Document default definitions - assuming nothing set at this point.
-============================================================================ */
-/**
- * @addtogroup arm_cstd_coding_standard
- * @{
- */
-
-/**
- * @hideinitializer
- * Defined with value of 1 if toolchain is Microsoft Visual Studio, 0
- * otherwise.
- */
-#define CSTD_TOOLCHAIN_MSVC         0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if toolchain is the GNU Compiler Collection, 0
- * otherwise.
- */
-#define CSTD_TOOLCHAIN_GCC          0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if toolchain is ARM RealView Compiler Tools, 0
- * otherwise. Note - if running RVCT in GCC mode this define will be set to 0;
- * @c CSTD_TOOLCHAIN_GCC and @c CSTD_TOOLCHAIN_RVCT_GCC_MODE will both be
- * defined as 1.
- */
-#define CSTD_TOOLCHAIN_RVCT         0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if toolchain is ARM RealView Compiler Tools running
- * in GCC mode, 0 otherwise.
- */
-#define CSTD_TOOLCHAIN_RVCT_GCC_MODE 0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if processor is an x86 32-bit machine, 0 otherwise.
- */
-#define CSTD_CPU_X86_32             0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if processor is an x86-64 (AMD64) machine, 0
- * otherwise.
- */
-#define CSTD_CPU_X86_64             0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if processor is an ARM machine, 0 otherwise.
- */
-#define CSTD_CPU_ARM                0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if processor is a MIPS machine, 0 otherwise.
- */
-#define CSTD_CPU_MIPS               0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if CPU is 32-bit, 0 otherwise.
- */
-#define CSTD_CPU_32BIT              0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if CPU is 64-bit, 0 otherwise.
- */
-#define CSTD_CPU_64BIT              0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if processor configured as big-endian, 0 if it
- * is little-endian.
- */
-#define CSTD_CPU_BIG_ENDIAN         0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is a version of Windows, 0 if
- * it is not.
- */
-#define CSTD_OS_WINDOWS             0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is a 32-bit version of Windows,
- * 0 if it is not.
- */
-#define CSTD_OS_WIN32               0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is a 64-bit version of Windows,
- * 0 if it is not.
- */
-#define CSTD_OS_WIN64               0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is Linux, 0 if it is not.
- */
-#define CSTD_OS_LINUX               0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if we are compiling Linux kernel code, 0 otherwise.
- */
-#define CSTD_OS_LINUX_KERNEL        0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is a 32-bit version of Linux,
- * 0 if it is not.
- */
-#define CSTD_OS_LINUX32             0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is a 64-bit version of Linux,
- * 0 if it is not.
- */
-#define CSTD_OS_LINUX64             0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is Android, 0 if it is not.
- */
-#define CSTD_OS_ANDROID             0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if we are compiling Android kernel code, 0 otherwise.
- */
-#define CSTD_OS_ANDROID_KERNEL      0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is a 32-bit version of Android,
- * 0 if it is not.
- */
-#define CSTD_OS_ANDROID32           0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is a 64-bit version of Android,
- * 0 if it is not.
- */
-#define CSTD_OS_ANDROID64           0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is a version of Apple OS,
- * 0 if it is not.
- */
-#define CSTD_OS_APPLEOS             0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is a 32-bit version of Apple OS,
- * 0 if it is not.
- */
-#define CSTD_OS_APPLEOS32           0
-
-/**
- * @hideinitializer
- * Defined with value of 1 if operating system is a 64-bit version of Apple OS,
- * 0 if it is not.
- */
-#define CSTD_OS_APPLEOS64           0
-
-/**
- * @def CSTD_OS_SYMBIAN
- * @hideinitializer
- * Defined with value of 1 if operating system is Symbian, 0 if it is not.
- */
-#define CSTD_OS_SYMBIAN             0
-
-/**
- * @def CSTD_OS_NONE
- * @hideinitializer
- * Defined with value of 1 if there is no operating system (bare metal), 0
- * otherwise
- */
-#define CSTD_OS_NONE                0
-
-/* ============================================================================
-	Determine the compiler in use
-============================================================================ */
-#if defined(_MSC_VER)
-	#undef CSTD_TOOLCHAIN_MSVC
-	#define CSTD_TOOLCHAIN_MSVC         1
-
-#elif defined(__GNUC__)
-	#undef CSTD_TOOLCHAIN_GCC
-	#define CSTD_TOOLCHAIN_GCC          1
-
-	/* Detect RVCT pretending to be GCC. */
-	#if defined(__ARMCC_VERSION)
-		#undef CSTD_TOOLCHAIN_RVCT_GCC_MODE
-		#define CSTD_TOOLCHAIN_RVCT_GCC_MODE    1
-	#endif
-
-#elif defined(__ARMCC_VERSION)
-	#undef CSTD_TOOLCHAIN_RVCT
-	#define CSTD_TOOLCHAIN_RVCT         1
-
-#else
-	#warning "Unsupported or unknown toolchain"
-
-#endif
-
-/* ============================================================================
-	Determine the processor
-============================================================================ */
-#if 1 == CSTD_TOOLCHAIN_MSVC
-	#if defined(_M_IX86)
-		#undef CSTD_CPU_X86_32
-		#define CSTD_CPU_X86_32         1
-
-	#elif defined(_M_X64) || defined(_M_AMD64)
-		#undef CSTD_CPU_X86_64
-		#define CSTD_CPU_X86_64         1
-
-	#elif defined(_M_ARM)
-		#undef CSTD_CPU_ARM
-		#define CSTD_CPU_ARM            1
-
-	#elif defined(_M_MIPS)
-		#undef CSTD_CPU_MIPS
-		#define CSTD_CPU_MIPS           1
-
-	#else
-		#warning "Unsupported or unknown host CPU for MSVC tools"
-
-	#endif
-
-#elif 1 == CSTD_TOOLCHAIN_GCC
-	#if defined(__amd64__)
-		#undef CSTD_CPU_X86_64
-		#define CSTD_CPU_X86_64         1
-
-	#elif defined(__i386__)
-		#undef CSTD_CPU_X86_32
-		#define CSTD_CPU_X86_32         1
-
-	#elif defined(__arm__)
-		#undef CSTD_CPU_ARM
-		#define CSTD_CPU_ARM            1
-
-	#elif defined(__mips__)
-		#undef CSTD_CPU_MIPS
-		#define CSTD_CPU_MIPS           1
-
-	#else
-		#warning "Unsupported or unknown host CPU for GCC tools"
-
-	#endif
-
-#elif 1 == CSTD_TOOLCHAIN_RVCT
-	#undef CSTD_CPU_ARM
-	#define CSTD_CPU_ARM                1
-
-#else
-	#warning "Unsupported or unknown toolchain"
-
-#endif
-
-/* ============================================================================
-	Determine the Processor Endianness
-============================================================================ */
-
-#if ((1 == CSTD_CPU_X86_32) || (1 == CSTD_CPU_X86_64))
-	/* Note: x86 and x86-64 are always little endian, so leave at default. */
-
-#elif 1 == CSTD_TOOLCHAIN_RVCT
-	#if defined(__BIG_ENDIAN)
-		#undef CSTD_ENDIAN_BIG
-		#define CSTD_ENDIAN_BIG         1
-	#endif
-
-#elif ((1 == CSTD_TOOLCHAIN_GCC) && (1 == CSTD_CPU_ARM))
-	#if defined(__ARMEB__)
-		#undef CSTD_ENDIAN_BIG
-		#define CSTD_ENDIAN_BIG         1
-	#endif
-
-#elif ((1 == CSTD_TOOLCHAIN_GCC) && (1 == CSTD_CPU_MIPS))
-	#if defined(__MIPSEB__)
-		#undef CSTD_ENDIAN_BIG
-		#define CSTD_ENDIAN_BIG         1
-	#endif
-
-#elif 1 == CSTD_TOOLCHAIN_MSVC
-	/* Note: Microsoft only support little endian, so leave at default. */
-
-#else
-	#warning "Unsupported or unknown CPU"
-
-#endif
-
-/* ============================================================================
-	Determine the operating system and addressing width
-============================================================================ */
-#if 1 == CSTD_TOOLCHAIN_MSVC
-	#if defined(_WIN32) && !defined(_WIN64)
-		#undef CSTD_OS_WINDOWS
-		#define CSTD_OS_WINDOWS         1
-		#undef CSTD_OS_WIN32
-		#define CSTD_OS_WIN32           1
-		#undef CSTD_CPU_32BIT
-		#define CSTD_CPU_32BIT          1
-
-	#elif defined(_WIN32) && defined(_WIN64)
-		#undef CSTD_OS_WINDOWS
-		#define CSTD_OS_WINDOWS         1
-		#undef CSTD_OS_WIN64
-		#define CSTD_OS_WIN64           1
-		#undef CSTD_CPU_64BIT
-		#define CSTD_CPU_64BIT          1
-
-	#else
-		#warning "Unsupported or unknown host OS for MSVC tools"
-
-	#endif
-
-#elif 1 == CSTD_TOOLCHAIN_GCC
-	#if defined(_WIN32) && defined(_WIN64)
-		#undef CSTD_OS_WINDOWS
-		#define CSTD_OS_WINDOWS         1
-		#undef CSTD_OS_WIN64
-		#define CSTD_OS_WIN64           1
-		#undef CSTD_CPU_64BIT
-		#define CSTD_CPU_64BIT          1
-
-	#elif defined(_WIN32) && !defined(_WIN64)
-		#undef CSTD_OS_WINDOWS
-		#define CSTD_OS_WINDOWS         1
-		#undef CSTD_OS_WIN32
-		#define CSTD_OS_WIN32           1
-		#undef CSTD_CPU_32BIT
-		#define CSTD_CPU_32BIT          1
-
-	#elif defined(ANDROID)
-		#undef CSTD_OS_ANDROID
-		#define CSTD_OS_ANDROID         1
-
-		#if defined(__KERNEL__)
-			#undef CSTD_OS_ANDROID_KERNEL
-			#define CSTD_OS_ANDROID_KERNEL  1
-		#endif
-
-		#if defined(__LP64__) || defined(_LP64)
-			#undef CSTD_OS_ANDROID64
-			#define CSTD_OS_ANDROID64       1
-			#undef CSTD_CPU_64BIT
-			#define CSTD_CPU_64BIT          1
-		#else
-			#undef CSTD_OS_ANDROID32
-			#define CSTD_OS_ANDROID32       1
-			#undef CSTD_CPU_32BIT
-			#define CSTD_CPU_32BIT          1
-		#endif
-
-	#elif defined(__linux)
-		#undef CSTD_OS_LINUX
-		#define CSTD_OS_LINUX           1
-		
-		#if defined(__KERNEL__)
-			#undef CSTD_OS_LINUX_KERNEL
-			#define CSTD_OS_LINUX_KERNEL    1
-		#endif
-
-		#if defined(__LP64__) || defined(_LP64)
-			#undef CSTD_OS_LINUX64
-			#define CSTD_OS_LINUX64         1
-			#undef CSTD_CPU_64BIT
-			#define CSTD_CPU_64BIT          1
-		#else
-			#undef CSTD_OS_LINUX32
-			#define CSTD_OS_LINUX32         1
-			#undef CSTD_CPU_32BIT
-			#define CSTD_CPU_32BIT          1
-		#endif
-
-	#elif defined(__APPLE__)
-		#undef CSTD_OS_APPLEOS
-		#define CSTD_OS_APPLEOS         1
-
-		#if defined(__LP64__) || defined(_LP64)
-			#undef CSTD_OS_APPLEOS64
-			#define CSTD_OS_APPLEOS64       1
-			#undef CSTD_CPU_64BIT
-			#define CSTD_CPU_64BIT          1
-		#else
-			#undef CSTD_OS_APPLEOS32
-			#define CSTD_OS_APPLEOS32       1
-			#undef CSTD_CPU_32BIT
-			#define CSTD_CPU_32BIT          1
-		#endif
-
-	#elif defined(__SYMBIAN32__)
-		#undef CSTD_OS_SYMBIAN
-		#define CSTD_OS_SYMBIAN         1
-		#undef CSTD_CPU_32BIT
-		#define CSTD_CPU_32BIT          1
-
-	#else
-		#undef CSTD_OS_NONE
-		#define CSTD_OS_NONE            1
-		#undef CSTD_CPU_32BIT
-		#define CSTD_CPU_32BIT          1
-
-#endif
-
-#elif 1 == CSTD_TOOLCHAIN_RVCT
-
-	#if defined(ANDROID)
-		#undef CSTD_OS_ANDROID
-		#undef CSTD_OS_ANDROID32
-		#define CSTD_OS_ANDROID         1
-		#define CSTD_OS_ANDROID32       1
-
-	#elif defined(__linux)
-		#undef CSTD_OS_LINUX
-		#undef CSTD_OS_LINUX32
-		#define CSTD_OS_LINUX           1
-		#define CSTD_OS_LINUX32         1
-
-	#elif defined(__SYMBIAN32__)
-		#undef CSTD_OS_SYMBIAN
-		#define CSTD_OS_SYMBIAN         1
-
-	#else
-		#undef CSTD_OS_NONE
-		#define CSTD_OS_NONE            1
-
-#endif
-
-#else
-	#warning "Unsupported or unknown host OS"
-
-#endif
-
-/* ============================================================================
-	Determine the correct linker symbol Import and Export Macros
-============================================================================ */
-/**
- * @defgroup arm_cstd_linkage_specifiers Linkage Specifiers
- * @{
- *
- * This set of macros contain system-dependent linkage specifiers which
- * determine the visibility of symbols across DLL boundaries. A header for a
- * particular DLL should define a set of local macros derived from these,
- * and should not use these macros to decorate functions directly as there may
- * be multiple DLLs being used.
- *
- * These DLL library local macros should be (with appropriate library prefix)
- * <tt>[MY_LIBRARY]_API</tt>, <tt>[MY_LIBRARY]_IMPL</tt>, and
- * <tt>[MY_LIBRARY]_LOCAL</tt>.
- *
- *    - <tt>[MY_LIBRARY]_API</tt> should be use to decorate the function
- *      declarations in the header. It should be defined as either
- *      @c CSTD_LINK_IMPORT or @c CSTD_LINK_EXPORT, depending whether the
- *      current situation is a compile of the DLL itself (use export) or a
- *      compile of an external user of the DLL (use import).
- *    - <tt>[MY_LIBRARY]_IMPL</tt> should be defined as @c CSTD_LINK_IMPL
- *      and should be used to decorate the definition of functions in the C
- *      file.
- *    - <tt>[MY_LIBRARY]_LOCAL</tt> should be used to decorate function
- *      declarations which are exported across translation units within the
- *      DLL, but which are not exported outside of the DLL boundary.
- *
- * Functions which are @c static in either a C file or in a header file do not
- * need any form of linkage decoration, and should therefore have no linkage
- * macro applied to them.
- */
-
-/**
- * @def CSTD_LINK_IMPORT
- * Specifies a function as being imported to a translation unit across a DLL
- * boundary.
- */
-
-/**
- * @def CSTD_LINK_EXPORT
- * Specifies a function as being exported across a DLL boundary by a
- * translation unit.
- */
-
-/**
- * @def CSTD_LINK_IMPL
- * Specifies a function which will be exported across a DLL boundary as
- * being implemented by a translation unit.
- */
-
-/**
- * @def CSTD_LINK_LOCAL
- * Specifies a function which is internal to a DLL, and which should not be
- * exported outside of it.
- */
-
-/**
- * @}
- */
-
-#if 1 ==  CSTD_OS_LINUX
-	#define CSTD_LINK_IMPORT __attribute__((visibility("default")))
-	#define CSTD_LINK_EXPORT __attribute__((visibility("default")))
-	#define CSTD_LINK_IMPL   __attribute__((visibility("default")))
-	#define CSTD_LINK_LOCAL  __attribute__((visibility("hidden")))
-
-#elif 1 ==  CSTD_OS_WINDOWS
-	#define CSTD_LINK_IMPORT __declspec(dllimport)
-	#define CSTD_LINK_EXPORT __declspec(dllexport)
-	#define CSTD_LINK_IMPL   __declspec(dllexport)
-	#define CSTD_LINK_LOCAL
-
-#elif 1 ==  CSTD_OS_SYMBIAN
-	#define CSTD_LINK_IMPORT IMPORT_C
-	#define CSTD_LINK_EXPORT IMPORT_C
-	#define CSTD_LINK_IMPL   EXPORT_C
-	#define CSTD_LINK_LOCAL
-
-#elif 1 ==  CSTD_OS_APPLEOS
-	#define CSTD_LINK_IMPORT __attribute__((visibility("default")))
-	#define CSTD_LINK_EXPORT __attribute__((visibility("default")))
-	#define CSTD_LINK_IMPL   __attribute__((visibility("default")))
-	#define CSTD_LINK_LOCAL  __attribute__((visibility("hidden")))
-
-#else /* CSTD_OS_NONE */
-	#define CSTD_LINK_IMPORT
-	#define CSTD_LINK_EXPORT
-	#define CSTD_LINK_IMPL
-	#define CSTD_LINK_LOCAL
-
-#endif
-
-/**
- * @}
- */
-
-#endif /* End (_ARM_CSTD_COMPILERS_H_) */
diff --git a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_pack_pop.h b/exynos5/hal/include/malisw/arm_cstd/arm_cstd_pack_pop.h
deleted file mode 100644
index 01f8fab..0000000
--- a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_pack_pop.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2009-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-#ifndef _ARM_CSTD_PACK_POP_H_
-#define _ARM_CSTD_PACK_POP_H_
-
-#if 1 == CSTD_TOOLCHAIN_MSVC
-	#include <poppack.h>
-#endif
-
-#endif /* End (_ARM_CSTD_PACK_POP_H_) */
diff --git a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_pack_push.h b/exynos5/hal/include/malisw/arm_cstd/arm_cstd_pack_push.h
deleted file mode 100644
index ac1ff93..0000000
--- a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_pack_push.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2009-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-#ifndef _ARM_CSTD_PACK_PUSH_H_
-#define _ARM_CSTD_PACK_PUSH_H_
-
-#if 1 == CSTD_TOOLCHAIN_MSVC
-	#include <pshpack1.h>
-#endif
-
-#endif /* End (_ARM_CSTD_PACK_PUSH_H_) */
diff --git a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_types.h b/exynos5/hal/include/malisw/arm_cstd/arm_cstd_types.h
deleted file mode 100644
index 2e50b57..0000000
--- a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_types.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2009-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-#ifndef _ARM_CSTD_TYPES_H_
-#define _ARM_CSTD_TYPES_H_
-
-#if 1 == CSTD_TOOLCHAIN_MSVC
-	#include "arm_cstd_types_msvc.h"
-#elif 1 == CSTD_TOOLCHAIN_GCC
-	#include "arm_cstd_types_gcc.h"
-#elif 1 == CSTD_TOOLCHAIN_RVCT
-	#include "arm_cstd_types_rvct.h"
-#else
-	#error "Toolchain not recognized"
-#endif
-
-#endif /* End (_ARM_CSTD_TYPES_H_) */
diff --git a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_types_gcc.h b/exynos5/hal/include/malisw/arm_cstd/arm_cstd_types_gcc.h
deleted file mode 100644
index 54d06fe..0000000
--- a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_types_gcc.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2009-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-#ifndef _ARM_CSTD_TYPES_GCC_H_
-#define _ARM_CSTD_TYPES_GCC_H_
-
-/* ============================================================================
-	Type definitions
-============================================================================ */
-/* All modern versions of GCC support stdint outside of C99 Mode. */
-/* However, Linux kernel limits what headers are available! */
-#if 1 == CSTD_OS_LINUX_KERNEL
-	#include <linux/kernel.h>
-	#include <linux/types.h>
-	#include <linux/stddef.h>
-	#include <linux/version.h>
-
-	/* Fix up any types which CSTD provdes but which Linux is missing. */
-	/* Note Linux assumes pointers are "long", so this is safe. */
-	#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-		typedef unsigned long   uintptr_t;
-	#endif
-	typedef long                intptr_t;
-
-#else
-	#include <stdint.h>
-	#include <stddef.h>
-	#include <limits.h>
-#endif
-
-typedef uint32_t                bool_t;
-
-#if !defined(TRUE)
-	#define TRUE                ((bool_t)1)
-#endif
-
-#if !defined(FALSE)
-	#define FALSE               ((bool_t)0)
-#endif
-
-/* ============================================================================
-	Keywords
-============================================================================ */
-/* Doxygen documentation for these is in the RVCT header. */
-#define ASM                     __asm__
-
-#define INLINE                  __inline__
-
-#define FORCE_INLINE            __attribute__((__always_inline__)) __inline__
-
-#define NEVER_INLINE            __attribute__((__noinline__))
-
-#define PURE                    __attribute__((__pure__))
-
-#define PACKED                  __attribute__((__packed__))
-
-/* GCC does not support pointers to UNALIGNED data, so we do not define it to
- * force a compile error if this macro is used. */
-
-#define RESTRICT                __restrict__
-
-/* RVCT in GCC mode does not support the CHECK_RESULT attribute. */
-#if 0 == CSTD_TOOLCHAIN_RVCT_GCC_MODE
-	#define CHECK_RESULT        __attribute__((__warn_unused_result__))
-#else
-	#define CHECK_RESULT
-#endif
-
-/* RVCT in GCC mode does not support the __func__ name outside of C99. */
-#if (0 == CSTD_TOOLCHAIN_RVCT_GCC_MODE)
-	#define CSTD_FUNC           __func__
-#else
-	#define CSTD_FUNC           __FUNCTION__
-#endif
-
-#endif /* End (_ARM_CSTD_TYPES_GCC_H_) */
diff --git a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_types_rvct.h b/exynos5/hal/include/malisw/arm_cstd/arm_cstd_types_rvct.h
deleted file mode 100644
index 8bae4c2..0000000
--- a/exynos5/hal/include/malisw/arm_cstd/arm_cstd_types_rvct.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2009-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-#ifndef _ARM_CSTD_TYPES_RVCT_H_
-#define _ARM_CSTD_TYPES_RVCT_H_
-
-/* ============================================================================
-	Type definitions
-============================================================================ */
-#include <stddef.h>
-#include <limits.h>
-
-#if 199901L <= __STDC_VERSION__
-	#include <inttypes.h>
-#else
-	typedef unsigned char           uint8_t;
-	typedef signed char             int8_t;
-	typedef unsigned short          uint16_t;
-	typedef signed short            int16_t;
-	typedef unsigned int            uint32_t;
-	typedef signed int              int32_t;
-	typedef unsigned __int64        uint64_t;
-	typedef signed __int64          int64_t;
-	typedef ptrdiff_t               intptr_t;
-	typedef size_t                  uintptr_t;
-#endif
-
-typedef uint32_t                    bool_t;
-
-#if !defined(TRUE)
-	#define TRUE                ((bool_t)1)
-#endif
-
-#if !defined(FALSE)
-	#define FALSE               ((bool_t)0)
-#endif
-
-/* ============================================================================
-	Keywords
-============================================================================ */
-/**
- * @addtogroup arm_cstd_coding_standard
- * @{
- */
-
-/**
- * @def ASM
- * @hideinitializer
- * Mark an assembler block. Such blocks are often compiler specific, so often
- * need to be surrounded in appropriate @c ifdef and @c endif blocks
- * using the relevant @c CSTD_TOOLCHAIN macro.
- */
-#define ASM                     __asm
-
-/**
- * @def INLINE
- * @hideinitializer
- * Mark a definition as something which should be inlined. This is not always
- * possible on a given compiler, and may be disabled at lower optimization
- * levels.
- */
-#define INLINE                  __inline
-
-/**
- * @def FORCE_INLINE
- * @hideinitializer
- * Mark a definition as something which should be inlined. This provides a much
- * stronger hint to the compiler than @c INLINE, and if supported should always
- * result in an inlined function being emitted. If not supported this falls
- * back to using the @c INLINE definition.
- */
-#define FORCE_INLINE            __forceinline
-
-/**
- * @def NEVER_INLINE
- * @hideinitializer
- * Mark a definition as something which should not be inlined. This provides a
- * stronger hint to the compiler than the function should not be inlined,
- * bypassing any heuristic rules the compiler normally applies. If not
- * supported by a toolchain this falls back to being an empty macro.
- */
-#define NEVER_INLINE            __declspec(noinline)
-
-/**
- * @def PURE
- * @hideinitializer
- * Denotes that a function's return is only dependent on its inputs, enabling
- * more efficient optimizations. Falls back to an empty macro if not supported.
- */
-#define PURE                    __pure
-
-/**
- * @def PACKED
- * @hideinitializer
- * Denotes that a structure should be stored in a packed form. This macro must
- * be used in conjunction with the @c arm_cstd_pack_* headers for portability:
- *
- * @code
- * #include <cstd/arm_cstd_pack_push.h>
- *
- * struct PACKED myStruct {
- *     ...
- * };
- *
- * #include <cstd/arm_cstd_pack_pop.h>
- * PACKED
- * @endcode
- */
-#define PACKED                  __packed
-
-/**
- * @def UNALIGNED
- * @hideinitializer
- * Denotes that a pointer points to a buffer with lower alignment than the
- * natural alignment required by the C standard. This should only be used
- * in extreme cases, as the emitted code is normally more efficient if memory
- * is aligned.
- *
- * @warning This is \b NON-PORTABLE. The GNU tools are anti-unaligned pointers
- * and have no support for such a construction.
- */
-#define UNALIGNED               __packed
-
-/**
- * @def RESTRICT
- * @hideinitializer
- * Denotes that a pointer does not overlap with any other points currently in
- * scope, increasing the range of optimizations which can be performed by the
- * compiler.
- *
- * @warning Specification of @c RESTRICT is a contract between the programmer
- * and the compiler. If you place @c RESTICT on buffers which do actually
- * overlap the behavior is undefined, and likely to vary at different
- * optimization levels.!
- */
-#define RESTRICT                __restrict
-
-/**
- * @def CHECK_RESULT
- * @hideinitializer
- * Function attribute which causes a warning to be emitted if the compiler's
- * return value is not used by the caller. Compiles to an empty macro if
- * there is no supported mechanism for this check in the underlying compiler.
- *
- * @note At the time of writing this is only supported by GCC. RVCT does not
- * support this attribute, even in GCC mode, so engineers are encouraged to
- * compile their code using GCC even if primarily working with another
- * compiler.
- *
- * @code
- * CHECK_RESULT int my_func( void );
- * @endcode
-  */
-#define CHECK_RESULT
-
-/**
- * @def CSTD_FUNC
- * Specify the @c CSTD_FUNC macro, a portable construct containing the name of
- * the current function. On most compilers it is illegal to use this macro
- * outside of a function scope. If not supported by the compiler we define
- * @c CSTD_FUNC as an empty string.
- *
- * @warning Due to the implementation of this on most modern compilers this
- * expands to a magically defined "static const" variable, not a constant
- * string. This makes injecting @c CSTD_FUNC directly in to compile-time
- * strings impossible, so if you want to make the function name part of a
- * larger string you must use a printf-like function with a @c @%s template
- * which is populated with @c CSTD_FUNC
- */
-#define CSTD_FUNC            __FUNCTION__
-
-/**
- * @}
- */
-
-#endif /* End (_ARM_CSTD_TYPES_RVCT_H_) */
diff --git a/exynos5/hal/include/malisw/mali_malisw.h b/exynos5/hal/include/malisw/mali_malisw.h
deleted file mode 100644
index c19f14f..0000000
--- a/exynos5/hal/include/malisw/mali_malisw.h
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-#ifndef _MALISW_H_
-#define _MALISW_H_
-
-#define MALI_MODULE_MALISW_MAJOR 2
-#define MALI_MODULE_MALISW_MINOR 4
-
-/**
- * @file mali_malisw.h
- * Driver-wide include for common macros and types.
- */
-
-/**
- * @defgroup malisw Mali software definitions and types
- * @{
- */
-
-#include <stddef.h>
-
-#include "mali_stdtypes.h"
-#include "mali_version_macros.h"
-
-/** @brief Gets the container object when given a pointer to a member of an object. */
-#define CONTAINER_OF(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type,member)))
-
-/** @brief Gets the number of elements of type s in a fixed length array of s */
-#define NELEMS(s)       (sizeof(s)/sizeof((s)[0]))
-
-/**
- * @brief The lesser of two values.
- * May evaluate its arguments more than once.
- * @see CSTD_MIN
- */
-#define MIN(x,y) CSTD_MIN(x,y)
-
-/**
- * @brief The greater of two values.
- * May evaluate its arguments more than once.
- * @see CSTD_MAX
- */
-#define MAX(x,y) CSTD_MAX(x,y)
-
-/**
- * @brief Clamp value x to within min and max inclusive
- * May evaluate its arguments more than once.
- * @see CSTD_CLAMP
- */
-#define CLAMP( x, min, max ) CSTD_CLAMP( x, min, max )
-
-/**
- * @brief Convert a pointer into a u64 for storing in a data structure.
- * This is commonly used when pairing a 32-bit CPU with a 64-bit peripheral,
- * such as a Midgard GPU. C's type promotion is complex and a straight cast
- * does not work reliably as pointers are often considered as signed.
- */
-#define PTR_TO_U64( x ) CSTD_PTR_TO_U64( x )
-
-/**
- * @name Mali library linkage specifiers 
- * These directly map to the cstd versions described in detail here: @ref arm_cstd_linkage_specifiers
- * @{
- */
-#define MALI_IMPORT CSTD_LINK_IMPORT
-#define MALI_EXPORT CSTD_LINK_EXPORT
-#define MALI_IMPL   CSTD_LINK_IMPL
-#define MALI_LOCAL  CSTD_LINK_LOCAL
-
-/** @brief Decorate exported function prototypes.
- *
- * The file containing the implementation of the function should define this to be MALI_EXPORT before including
- * malisw/mali_malisw.h.
- */
-#ifndef MALI_API
-#define MALI_API MALI_IMPORT
-#endif
-/** @} */
-
-/** @name Testable static functions
- * @{
- *
- * These macros can be used to allow functions to be static in release builds but exported from a shared library in unit
- * test builds, allowing them to be tested or used to assist testing.
- *
- * Example mali_foo_bar.c containing the function to test:
- *
- * @code
- * #define MALI_API MALI_EXPORT
- *
- * #include <malisw/mali_malisw.h>
- * #include "mali_foo_testable_statics.h"
- *
- * MALI_TESTABLE_STATIC_IMPL void my_func()
- * {
- *	//Implementation
- * }
- * @endcode
- *
- * Example mali_foo_testable_statics.h:
- *
- * @code
- * #if 1 == MALI_UNIT_TEST
- * #include <malisw/mali_malisw.h>
- *
- * MALI_TESTABLE_STATIC_API void my_func();
- *
- * #endif
- * @endcode
- *
- * Example mali_foo_tests.c:
- *
- * @code
- * #include <foo/src/mali_foo_testable_statics.h>
- *
- * void my_test_func()
- * {
- * 	my_func();
- * }
- * @endcode
- */
-
-/** @brief Decorate testable static function implementations.
- *
- * A header file containing a MALI_TESTABLE_STATIC_API-decorated prototype for each static function will be required
- * when MALI_UNIT_TEST == 1 in order to link the function from the test.
- */
-#if 1 == MALI_UNIT_TEST
-#define MALI_TESTABLE_STATIC_IMPL MALI_IMPL
-#else
-#define MALI_TESTABLE_STATIC_IMPL static
-#endif
-
-/** @brief Decorate testable static function prototypes.
- *
- * @note Prototypes should @em only be declared when MALI_UNIT_TEST == 1
- */
-#define MALI_TESTABLE_STATIC_API MALI_API
-/** @} */
-
-/** @name Testable local functions
- * @{
- *
- * These macros can be used to allow functions to be local to a shared library in release builds but be exported in unit
- * test builds, allowing them to be tested or used to assist testing.
- *
- * Example mali_foo_bar.c containing the function to test:
- *
- * @code
- * #define MALI_API MALI_EXPORT
- *
- * #include <malisw/mali_malisw.h>
- * #include "mali_foo_bar.h"
- *
- * MALI_TESTABLE_LOCAL_IMPL void my_func()
- * {
- *	//Implementation
- * }
- * @endcode
- *
- * Example mali_foo_bar.h:
- *
- * @code
- * #include <malisw/mali_malisw.h>
- *
- * MALI_TESTABLE_LOCAL_API void my_func();
- *
- * @endcode
- *
- * Example mali_foo_tests.c:
- *
- * @code
- * #include <foo/src/mali_foo_bar.h>
- *
- * void my_test_func()
- * {
- * 	my_func();
- * }
- * @endcode
- */
-
-/** @brief Decorate testable local function implementations.
- *
- * This can be used to have a function normally local to the shared library except in unit test builds where it will be
- * exported.
- */
-#if 1 == MALI_UNIT_TEST
-#define MALI_TESTABLE_LOCAL_IMPL MALI_IMPL
-#else
-#define MALI_TESTABLE_LOCAL_IMPL MALI_LOCAL
-#endif
-
-/** @brief Decorate testable local function prototypes.
- *
- * This can be used to have a function normally local to the shared library except in unit test builds where it will be
- * exported.
- */
-#if 1 == MALI_UNIT_TEST
-#define MALI_TESTABLE_LOCAL_API MALI_API
-#else
-#define MALI_TESTABLE_LOCAL_API MALI_LOCAL
-#endif
-/** @} */
-
-/**
- * Flag a cast as a reinterpretation, usually of a pointer type.
- * @see CSTD_REINTERPRET_CAST
- */
-#define REINTERPRET_CAST(type) CSTD_REINTERPRET_CAST(type)
-
-/**
- * Flag a cast as casting away const, usually of a pointer type.
- * @see CSTD_CONST_CAST
- */
-#define CONST_CAST(type) (type) CSTD_CONST_CAST(type)
-
-/**
- * Flag a cast as a (potentially complex) value conversion, usually of a numerical type.
- * @see CSTD_STATIC_CAST
- */
-#define STATIC_CAST(type) (type) CSTD_STATIC_CAST(type)
-
-
-/** @} */
-
-#endif /* _MALISW_H_ */
diff --git a/exynos5/hal/include/malisw/mali_stdtypes.h b/exynos5/hal/include/malisw/mali_stdtypes.h
deleted file mode 100644
index 545c085..0000000
--- a/exynos5/hal/include/malisw/mali_stdtypes.h
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-#ifndef _MALISW_STDTYPES_H_
-#define _MALISW_STDTYPES_H_
-
-/**
- * @file mali_stdtypes.h
- * This file defines the standard types used by the Mali codebase.
- */
-
-/**
- * @addtogroup malisw
- * @{
- */
-
-/**
- * @defgroup malisw_stdtypes Mali software standard types
- *
- * Basic driver-wide types.
- */
-
-/**
- * @addtogroup malisw_stdtypes
- * @{
- */
-
-#include "arm_cstd/arm_cstd.h"
-
-/**
- * @name Scalar types.
- * These are the scalar types used within the mali driver.
- * @{
- */
-/* Note: if compiling the Linux kernel then avoid redefining these. */
-#if 0 == CSTD_OS_LINUX_KERNEL
-	typedef uint64_t u64;
-	typedef uint32_t u32;
-	typedef uint16_t u16;
-	typedef uint8_t  u8;
-	
-	typedef int64_t  s64;
-	typedef int32_t  s32;
-	typedef int16_t  s16;
-	typedef int8_t   s8;
-#endif
-
-typedef double   f64;
-typedef float    f32;
-typedef u16      f16;
-
-typedef u32      mali_fixed16_16;
-/* @} */
-
-/**
- * @name Boolean types.
- * The intended use is for bool8 to be used when storing boolean values in
- * structures, casting to mali_bool to be used in code sections.
- * @{
- */
-typedef bool_t     mali_bool;
-typedef u8         mali_bool8;
-
-#define MALI_FALSE FALSE
-#define MALI_TRUE  TRUE
-/* @} */
-
-/**
- * @name Integer bounding values
- * Maximum and minimum values for integer types
- * @{
- */
-#define U64_MAX	 UINT64_MAX
-#define U32_MAX	 UINT32_MAX
-#define U16_MAX	 UINT16_MAX
-#define U8_MAX	 UINT8_MAX
-
-#define S64_MAX  INT64_MAX
-#define S64_MIN  INT64_MIN
-#define S32_MAX  INT32_MAX
-#define S32_MIN  INT32_MIN
-#define S16_MAX  INT16_MAX
-#define S16_MIN  INT16_MIN
-#define S8_MAX   INT8_MAX
-#define S8_MIN   INT8_MIN
-/* @} */
-
-/**
- * @name GPU address types
- * Types for integers which hold a GPU pointer or GPU pointer offsets.
- * @{
- */
-typedef u64      mali_addr64;
-typedef u32      mali_addr32;
-typedef u64      mali_size64;
-typedef s64      mali_offset64;
-/* 32 bit offsets and sizes are always for native types and so use ptrdiff_t and size_t respectively */
-/* @} */
-
-/**
- * @name Mali error types
- * @brief The common error type for the mali drivers
- * The mali_error type, all driver error handling should be of this type unless
- * it must deal with a specific APIs error type.
- * @{
- */
-typedef enum
-{
-	/**
-	 * @brief Common Mali errors for the entire driver
-	 * MALI_ERROR_NONE is guaranteed to be 0.
-	 * @{
-	 */
-	MALI_ERROR_NONE = 0,
-	MALI_ERROR_OUT_OF_GPU_MEMORY,
-	MALI_ERROR_OUT_OF_MEMORY,
-	MALI_ERROR_FUNCTION_FAILED,
-	/* @} */
-	/**
-	 * @brief Mali errors for Client APIs to pass to EGL when creating EGLImages
-	 * These errors must only be returned to EGL from one of the Client APIs as part of the
-	 * (clientapi)_egl_image_interface.h 
-	 * @{
-	 */
-	MALI_ERROR_EGLP_BAD_ACCESS,
-	MALI_ERROR_EGLP_BAD_PARAMETER,
-	/* @} */
-	/**
-	 * @brief Mali errors for the MCL module.
-	 * These errors must only be used within the private components of the OpenCL implementation that report
-	 * directly to API functions for cases where errors cannot be detected in the entrypoints file. They must
-	 * not be passed between driver components.
-	 * These are errors in the mali error space specifically for the MCL module, hence the MCLP prefix.
-	 * @{
-	 */
-	MALI_ERROR_MCLP_DEVICE_NOT_FOUND,
-	MALI_ERROR_MCLP_DEVICE_NOT_AVAILABLE,
-	MALI_ERROR_MCLP_COMPILER_NOT_AVAILABLE,
-	MALI_ERROR_MCLP_MEM_OBJECT_ALLOCATION_FAILURE,
-	MALI_ERROR_MCLP_PROFILING_INFO_NOT_AVAILABLE,
-	MALI_ERROR_MCLP_MEM_COPY_OVERLAP,
-	MALI_ERROR_MCLP_IMAGE_FORMAT_MISMATCH,
-	MALI_ERROR_MCLP_IMAGE_FORMAT_NOT_SUPPORTED,
-	MALI_ERROR_MCLP_BUILD_PROGRAM_FAILURE,
-	MALI_ERROR_MCLP_MAP_FAILURE,
-	MALI_ERROR_MCLP_MISALIGNED_SUB_BUFFER_OFFSET,
-	MALI_ERROR_MCLP_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST,
-	MALI_ERROR_MCLP_INVALID_VALUE,
-	MALI_ERROR_MCLP_INVALID_DEVICE_TYPE,
-	MALI_ERROR_MCLP_INVALID_PLATFORM,
-	MALI_ERROR_MCLP_INVALID_DEVICE,
-	MALI_ERROR_MCLP_INVALID_CONTEXT,
-	MALI_ERROR_MCLP_INVALID_QUEUE_PROPERTIES,
-	MALI_ERROR_MCLP_INVALID_COMMAND_QUEUE,
-	MALI_ERROR_MCLP_INVALID_HOST_PTR,
-	MALI_ERROR_MCLP_INVALID_MEM_OBJECT,
-	MALI_ERROR_MCLP_INVALID_IMAGE_FORMAT_DESCRIPTOR,
-	MALI_ERROR_MCLP_INVALID_IMAGE_SIZE,
-	MALI_ERROR_MCLP_INVALID_SAMPLER,
-	MALI_ERROR_MCLP_INVALID_BINARY,
-	MALI_ERROR_MCLP_INVALID_BUILD_OPTIONS,
-	MALI_ERROR_MCLP_INVALID_PROGRAM,
-	MALI_ERROR_MCLP_INVALID_PROGRAM_EXECUTABLE,
-	MALI_ERROR_MCLP_INVALID_KERNEL_NAME,
-	MALI_ERROR_MCLP_INVALID_KERNEL_DEFINITION,
-	MALI_ERROR_MCLP_INVALID_KERNEL,
-	MALI_ERROR_MCLP_INVALID_ARG_INDEX,
-	MALI_ERROR_MCLP_INVALID_ARG_VALUE,
-	MALI_ERROR_MCLP_INVALID_ARG_SIZE,
-	MALI_ERROR_MCLP_INVALID_KERNEL_ARGS,
-	MALI_ERROR_MCLP_INVALID_WORK_DIMENSION,
-	MALI_ERROR_MCLP_INVALID_WORK_GROUP_SIZE,
-	MALI_ERROR_MCLP_INVALID_WORK_ITEM_SIZE,
-	MALI_ERROR_MCLP_INVALID_GLOBAL_OFFSET,
-	MALI_ERROR_MCLP_INVALID_EVENT_WAIT_LIST,
-	MALI_ERROR_MCLP_INVALID_EVENT,
-	MALI_ERROR_MCLP_INVALID_OPERATION,
-	MALI_ERROR_MCLP_INVALID_GL_OBJECT,
-	MALI_ERROR_MCLP_INVALID_BUFFER_SIZE,
-	MALI_ERROR_MCLP_INVALID_MIP_LEVEL,
-	MALI_ERROR_MCLP_INVALID_GLOBAL_WORK_SIZE,
-	/* @} */
-	/**
-	 * @brief Mali errors for the BASE module
-	 * These errors must only be used within the private components of the Base implementation. They will not
-	 * passed to other modules by the base driver.
-	 * These are errors in the mali error space specifically for the BASE module, hence the BASEP prefix.
-	 * @{
-	 */
-	MALI_ERROR_BASEP_INVALID_FUNCTION
-	/* @} */
-} mali_error;
-/* @} */
-
-/* @} */
-
-/* @} */
-
-#endif /* _MALISW_STDTYPES_H_ */
diff --git a/exynos5/hal/include/malisw/mali_version_macros.h b/exynos5/hal/include/malisw/mali_version_macros.h
deleted file mode 100644
index e7dc43e..0000000
--- a/exynos5/hal/include/malisw/mali_version_macros.h
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-#ifndef _MALISW_VERSION_MACROS_H_
-#define _MALISW_VERSION_MACROS_H_
-
-/**
- * @file mali_version_macros.h
- * Mali version control macros.
- */
-
-/**
- * @addtogroup malisw 
- * @{
- */
-
-/**
- * @defgroup malisw_version Mali module version control
- *
- * This file provides a set of macros used to check a module's version. This
- * version information can be used to perform compile time checks of a module's
- * suitability for use with another.
- *
- * Module versions have both a Major and Minor value which specify the version
- * of the interface only. These are defined in the following way:
- *
- * @li Major: This version is incremented whenever a compatibility-breaking
- * change is made. For example, removing an interface function.
- * @li Minor: This version is incremented whenever an interface change is made
- * that does not break compatibility. For example, adding a new function to the
- * interface. This value is reset to zero whenever the major number is
- * incremented.
- *
- * When providing a driver module that will be used with this system, the public
- * header must include a major and minor define of the following form:
- *
- * @code
- * #define MALI_MODULE_<module>_MAJOR X
- * #define MALI_MODULE_<module>_MINOR Y
- * @endcode
- * e.g. for a module CZAM with include czam/mali_czam.h
- * @code
- *
- * #define MALI_MODULE_CZAM_MAJOR 1
- * #define MALI_MODULE_CZAM_MINOR 0
- * @endcode
- *
- * The version assertion macros outlined below are wrapped with a static function.
- * This provides more useful error messages when the assertions fail, and allows
- * the assertions to be specified adjacent to the inclusion of the module header.
- *
- * These macros should be used in the global scope of the file. Normal use would be:
- *
- * @code
- * #include <modulex/mali_modulex.h>
- * #include <moduley/mali_moduley.h>
- * #include <modulez/mali_modulez.h>
- * #include <modulez/mali_modulew.h>
- *
- * // This module added an enum we needed on minor 4 of major release 2
- * MALI_MODULE_ASSERT_MAJOR_EQUALS_MINOR_AT_LEAST( MODULEW, 2, 4 )
- *
- * // this module really needs to be a specific version
- * MALI_MODULE_ASSERT_EQUALS( MODULEX, 2, 0 )
- *
- * // 1.4 has performance problems
- * MALI_MODULE_ASSERT_MAXIMUM( MODULEY, 1, 3 )
- *
- * // Major defines a backward compatible series of versions
- * MALI_MODULE_ASSERT_MAJOR_EQUALS( MODULEZ, 1 )
- * @endcode
- *
- * @par Version Assertions
- *
- * This module provides the following compile time version assertion macros.
- *
- * @li #MALI_MODULE_ASSERT_MAJOR_EQUALS_MINOR_AT_LEAST
- * @li #MALI_MODULE_ASSERT_MAJOR_EQUALS
- * @li #MALI_MODULE_ASSERT_EQUALS
- * @li #MALI_MODULE_ASSERT_MINIMUM
- * @li #MALI_MODULE_ASSERT_MAXIMUM
- *
- * @par Limitations
- *
- * To allow the macros to be placed in the global scope and report more readable
- * errors, they produce a static function. This makes them unsuitable for use
- * within headers as the names are only unique on the name of the module under test,
- * the line number of the current file, and assert type (min, max, equals, ...).
- */
-
-/**
- * @addtogroup malisw_version 
- * @{
- */
-
-#include "arm_cstd/arm_cstd.h"
-
-/**
- * Private helper macro, indirection so that __LINE__ resolves correctly.
- */
-#define MALIP_MODULE_ASSERT_FUNCTION_SIGNATURE2( module, type, line ) \
-	static INLINE void _mali_module_##module##_version_check_##type##_##line(void)
-
-#define MALIP_MODULE_ASSERT_FUNCTION_SIGNATURE( module, type, line ) \
-	MALIP_MODULE_ASSERT_FUNCTION_SIGNATURE2( module, type, line )
-
-/**
- * @hideinitializer
- * This macro provides a compile time assert that a module interface that has been
- * @#included in the source base has is greater than or equal to the version specified.
- *
- * Expected use is for cases where a module version before the requested minimum
- * does not support a specific function or is missing an enum affecting the code that is
- * importing the module.
- *
- * It should be invoked at the global scope and ideally following straight after
- * the module header has been included. For example:
- *
- * @code
- * #include <modulex/mali_modulex.h>
- *
- * MALI_MODULE_ASSERT_MINIMUM( MODULEX, 1, 3 ) 
- * @endcode
- */
-#define MALI_MODULE_ASSERT_MINIMUM( module, major, minor ) \
-	MALIP_MODULE_ASSERT_FUNCTION_SIGNATURE( module, minimum, __LINE__ ) \
-	{ \
-		CSTD_COMPILE_TIME_ASSERT( ( ( MALI_MODULE_##module##_MAJOR << 16 ) | MALI_MODULE_##module##_MINOR ) \
-					  >= ( ( (major) << 16 ) | (minor) ) ); \
-	}
-
-/**
- * @hideinitializer
- * This macro provides a compile time assert that a module interface that has been
- * @#included in the source base is less than or equal to the version specified.
- *
- * Expected use is for cases where a later published minor version is found to be
- * incompatible in some way after the new minor has been issued.
- *
- * It should be invoked at the global scope and ideally following straight after
- * the module header has been included. For example:
- *
- * @code
- * #include <modulex/mali_modulex.h>
- *
- * MALI_MODULE_ASSERT_MAXIMUM( MODULEX, 1, 3 ) 
- * @endcode
- */
-#define MALI_MODULE_ASSERT_MAXIMUM( module, major, minor ) \
-	MALIP_MODULE_ASSERT_FUNCTION_SIGNATURE( module, maximum, __LINE__ ) \
-	{ \
-		CSTD_COMPILE_TIME_ASSERT( ( ( MALI_MODULE_##module##_MAJOR << 16 ) | MALI_MODULE_##module##_MINOR ) \
-					  <= ( ( (major) << 16 ) | (minor) ) ); \
-	}
-
-/**
- * @hideinitializer
- * This macro provides a compile time assert that a module interface that has been
- * @#included in the source base is equal to the version specified.
- *
- * Expected use is for cases where a specific version is known to work and other
- * versions are considered to be risky.
- *
- * It should be invoked at the global scope and ideally following straight after
- * the module header has been included. For example:
- *
- * @code
- * #include <modulex/mali_modulex.h>
- *
- * MALI_MODULE_ASSERT_EQUALS( MODULEX, 1, 3 ) 
- * @endcode
- */
-#define MALI_MODULE_ASSERT_EQUALS( module, major, minor ) \
-	MALIP_MODULE_ASSERT_FUNCTION_SIGNATURE( module, equals, __LINE__ ) \
-	{ \
-		CSTD_COMPILE_TIME_ASSERT( MALI_MODULE_##module##_MAJOR == major ); \
-		CSTD_COMPILE_TIME_ASSERT( MALI_MODULE_##module##_MINOR == minor ); \
-	}
-
-/**
- * @hideinitializer
- * This macro provides a compile time assert that a module interface that has been
- * @#included in the source base has a major version equal to the major version specified.
- *
- * Expected use is for cases where a module is considered low risk and any minor changes
- * are not considered to be important.
- *
- * It should be invoked at the global scope and ideally following straight after
- * the module header has been included. For example:
- *
- * @code
- * #include <modulex/mali_modulex.h>
- *
- * MALI_MODULE_ASSERT_MAJOR_EQUALS( MODULEX, 1, 3 ) 
- * @endcode
- */
-#define MALI_MODULE_ASSERT_MAJOR_EQUALS( module, major ) \
-	MALIP_MODULE_ASSERT_FUNCTION_SIGNATURE( module, major_equals, __LINE__ ) \
-	{ \
-		CSTD_COMPILE_TIME_ASSERT( MALI_MODULE_##module##_MAJOR == major ); \
-	}
-
-/**
- * @hideinitializer
- * This macro provides a compile time assert that a module interface that has been
- * @#included in the source base has a major version equal to the major version specified
- * and that the minor version is at least that which is specified.
- *
- * Expected use is for cases where a major revision is suitable from a specific minor
- * revision but future major versions are a risk.
- *
- * It should be invoked at the global scope and ideally following straight after
- * the module header has been included. For example:
- *
- * @code
- * #include <modulex/mali_modulex.h>
- *
- * MALI_MODULE_ASSERT_MAJOR_EQUALS_MINOR_AT_LEAST( MODULEX, 1, 3 ) 
- * @endcode
- */
-#define MALI_MODULE_ASSERT_MAJOR_EQUALS_MINOR_AT_LEAST( module, major, minor ) \
-	MALIP_MODULE_ASSERT_FUNCTION_SIGNATURE( module, major_equals_minor_at_least, __LINE__ ) \
-	{ \
-		CSTD_COMPILE_TIME_ASSERT( MALI_MODULE_##module##_MAJOR == major ); \
-		CSTD_COMPILE_TIME_ASSERT( MALI_MODULE_##module##_MINOR >= minor ); \
-	}
-
-/* @} */
-
-/* @} */
-
-#endif /* _MALISW_VERSION_MACROS_H_ */
diff --git a/exynos5/hal/include/media.h b/exynos5/hal/include/media.h
deleted file mode 100644
index 0ef8833..0000000
--- a/exynos5/hal/include/media.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Multimedia device API
- *
- * Copyright (C) 2010 Nokia Corporation
- *
- * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
- *	     Sakari Ailus <sakari.ailus@iki.fi>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __LINUX_MEDIA_H
-#define __LINUX_MEDIA_H
-
-#include <linux/ioctl.h>
-#include <linux/types.h>
-#include <linux/version.h>
-
-#define MEDIA_API_VERSION	KERNEL_VERSION(0, 1, 0)
-
-struct media_device_info {
-	char driver[16];
-	char model[32];
-	char serial[40];
-	char bus_info[32];
-	__u32 media_version;
-	__u32 hw_revision;
-	__u32 driver_version;
-	__u32 reserved[31];
-};
-
-#define MEDIA_ENT_ID_FLAG_NEXT		(1 << 31)
-
-#define MEDIA_ENT_TYPE_SHIFT		16
-#define MEDIA_ENT_TYPE_MASK		0x00ff0000
-#define MEDIA_ENT_SUBTYPE_MASK		0x0000ffff
-
-#define MEDIA_ENT_T_DEVNODE		(1 << MEDIA_ENT_TYPE_SHIFT)
-#define MEDIA_ENT_T_DEVNODE_V4L		(MEDIA_ENT_T_DEVNODE + 1)
-#define MEDIA_ENT_T_DEVNODE_FB		(MEDIA_ENT_T_DEVNODE + 2)
-#define MEDIA_ENT_T_DEVNODE_ALSA	(MEDIA_ENT_T_DEVNODE + 3)
-#define MEDIA_ENT_T_DEVNODE_DVB		(MEDIA_ENT_T_DEVNODE + 4)
-
-#define MEDIA_ENT_T_V4L2_SUBDEV		(2 << MEDIA_ENT_TYPE_SHIFT)
-#define MEDIA_ENT_T_V4L2_SUBDEV_SENSOR	(MEDIA_ENT_T_V4L2_SUBDEV + 1)
-#define MEDIA_ENT_T_V4L2_SUBDEV_FLASH	(MEDIA_ENT_T_V4L2_SUBDEV + 2)
-#define MEDIA_ENT_T_V4L2_SUBDEV_LENS	(MEDIA_ENT_T_V4L2_SUBDEV + 3)
-
-#define MEDIA_ENT_FL_DEFAULT		(1 << 0)
-
-struct media_entity_desc {
-	__u32 id;
-	char name[32];
-	__u32 type;
-	__u32 revision;
-	__u32 flags;
-	__u32 group_id;
-	__u16 pads;
-	__u16 links;
-
-	__u32 reserved[4];
-
-	union {
-		/* Node specifications */
-		struct {
-			__u32 major;
-			__u32 minor;
-		} v4l;
-		struct {
-			__u32 major;
-			__u32 minor;
-		} fb;
-		struct {
-			__u32 card;
-			__u32 device;
-			__u32 subdevice;
-		} alsa;
-		int dvb;
-
-		/* Sub-device specifications */
-		/* Nothing needed yet */
-		__u8 raw[184];
-	};
-};
-
-#define MEDIA_PAD_FL_SINK		(1 << 0)
-#define MEDIA_PAD_FL_SOURCE		(1 << 1)
-
-struct media_pad_desc {
-	__u32 entity;		/* entity ID */
-	__u16 index;		/* pad index */
-	__u32 flags;		/* pad flags */
-	__u32 reserved[2];
-};
-
-#define MEDIA_LNK_FL_ENABLED		(1 << 0)
-#define MEDIA_LNK_FL_IMMUTABLE		(1 << 1)
-#define MEDIA_LNK_FL_DYNAMIC		(1 << 2)
-
-struct media_link_desc {
-	struct media_pad_desc source;
-	struct media_pad_desc sink;
-	__u32 flags;
-	__u32 reserved[2];
-};
-
-struct media_links_enum {
-	__u32 entity;
-	/* Should have enough room for pads elements */
-	struct media_pad_desc __user *pads;
-	/* Should have enough room for links elements */
-	struct media_link_desc __user *links;
-	__u32 reserved[4];
-};
-
-#define MEDIA_IOC_DEVICE_INFO		_IOWR('|', 0x00, struct media_device_info)
-#define MEDIA_IOC_ENUM_ENTITIES		_IOWR('|', 0x01, struct media_entity_desc)
-#define MEDIA_IOC_ENUM_LINKS		_IOWR('|', 0x02, struct media_links_enum)
-#define MEDIA_IOC_SETUP_LINK		_IOWR('|', 0x03, struct media_link_desc)
-
-#endif /* __LINUX_MEDIA_H */
diff --git a/exynos5/hal/include/s3c_lcd.h b/exynos5/hal/include/s3c_lcd.h
deleted file mode 100644
index 22ebf86..0000000
--- a/exynos5/hal/include/s3c_lcd.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _S3CFB_LCD_
-#define _S3CFB_LCD_
-
-/*
- * S T R U C T U R E S  F O R  C U S T O M  I O C T L S
- *
-*/
-struct s3cfb_user_window {
-    int x;
-    int y;
-};
-
-struct s3cfb_user_plane_alpha {
-    int             channel;
-    unsigned char   red;
-    unsigned char   green;
-    unsigned char   blue;
-};
-
-struct s3cfb_user_chroma {
-    int             enabled;
-    unsigned char   red;
-    unsigned char   green;
-    unsigned char   blue;
-};
-
-typedef struct {
-    unsigned int phy_start_addr;
-    unsigned int xres;      /* visible resolution*/
-    unsigned int yres;
-    unsigned int xres_virtual;  /* virtual resolution*/
-    unsigned int yres_virtual;
-    unsigned int xoffset;   /* offset from virtual to visible */
-    unsigned int yoffset;   /* resolution   */
-    unsigned int lcd_offset_x;
-    unsigned int lcd_offset_y;
-} s3c_fb_next_info_t;
-
-struct s3c_fb_user_ion_client {
-    int fd;
-};
-
-/*
- * C U S T O M  I O C T L S
- *
-*/
-
-#define S3CFB_WIN_POSITION          _IOW ('F', 203, struct s3cfb_user_window)
-#define S3CFB_WIN_SET_PLANE_ALPHA   _IOW ('F', 204, struct s3cfb_user_plane_alpha)
-#define S3CFB_WIN_SET_CHROMA        _IOW ('F', 205, struct s3cfb_user_chroma)
-#define S3CFB_SET_VSYNC_INT         _IOW ('F', 206, unsigned int)
-#define S3CFB_SET_SUSPEND_FIFO      _IOW ('F', 300, unsigned long)
-#define S3CFB_SET_RESUME_FIFO       _IOW ('F', 301, unsigned long)
-#define S3CFB_GET_LCD_WIDTH         _IOR ('F', 302, int)
-#define S3CFB_GET_LCD_HEIGHT        _IOR ('F', 303, int)
-#define S3CFB_GET_FB_PHY_ADDR       _IOR ('F', 310, unsigned int)
-#define S3C_FB_GET_CURR_FB_INFO     _IOR ('F', 305, s3c_fb_next_info_t)
-#define S3CFB_GET_ION_USER_HANDLE   _IOWR('F', 208, struct s3c_fb_user_ion_client)
-
-/***************** LCD frame buffer *****************/
-#define FB0_NAME    "/dev/fb0"
-#define FB1_NAME    "/dev/fb1"
-#define FB2_NAME    "/dev/fb2"
-#define FB3_NAME    "/dev/fb3"
-#define FB4_NAME    "/dev/fb4"
-
-#endif
diff --git a/exynos5/hal/include/s3c_mem.h b/exynos5/hal/include/s3c_mem.h
deleted file mode 100644
index dd4cbdb..0000000
--- a/exynos5/hal/include/s3c_mem.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _S3C_MEM_COMMON_H_
-#define _S3C_MEM_COMMON_H_
-
-#define MEM_IOCTL_MAGIC         'M'
-
-#define S3C_MEM_ALLOC           _IOWR(MEM_IOCTL_MAGIC, 310, struct s3c_mem_alloc)
-#define S3C_MEM_FREE            _IOWR(MEM_IOCTL_MAGIC, 311, struct s3c_mem_alloc)
-
-#define S3C_MEM_SHARE_ALLOC     _IOWR(MEM_IOCTL_MAGIC, 314, struct s3c_mem_alloc)
-#define S3C_MEM_SHARE_FREE      _IOWR(MEM_IOCTL_MAGIC, 315, struct s3c_mem_alloc)
-
-#define S3C_MEM_CACHEABLE_ALLOC     _IOWR(MEM_IOCTL_MAGIC, 316, struct s3c_mem_alloc)
-#define S3C_MEM_CACHEABLE_SHARE_ALLOC   _IOWR(MEM_IOCTL_MAGIC, 317, struct s3c_mem_alloc)
-
-#define S3C_MEM_CACHE_FLUSH     _IOWR(MEM_IOCTL_MAGIC, 318, struct s3c_mem_alloc)
-#define S3C_MEM_CACHE_INVAL     _IOWR(MEM_IOCTL_MAGIC, 319, struct s3c_mem_alloc)
-#define S3C_MEM_CACHE_CLEAN     _IOWR(MEM_IOCTL_MAGIC, 320, struct s3c_mem_alloc)
-
-struct s3c_mem_alloc {
-    int     size;
-    unsigned int    vir_addr;
-    unsigned int    phy_addr;
-};
-
-struct s3c_mem_dma_param {
-    int     size;
-    unsigned int    src_addr;
-    unsigned int    dst_addr;
-    int     cfg;
-};
-
-#endif // _S3C_MEM_COMMON_H_
diff --git a/exynos5/hal/include/s5p_fimc.h b/exynos5/hal/include/s5p_fimc.h
deleted file mode 100644
index d41fee1..0000000
--- a/exynos5/hal/include/s5p_fimc.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/* Copyright(c) 2011 Samsung Electronics Co, Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-#ifndef _S5P_FIMC_H_
-#define _S5P_FIMC_H_
-
-#include <linux/videodev2.h>
-#include "SecBuffer.h"
-/*
- * G E N E R A L S
- *
-*/
-#define MIN(x, y)       ((x < y) ? x : y)
-
-/*
- * P I X E L   F O R M A T   G U I D E
- *
- * The 'x' means 'DO NOT CARE'
- * The '*' means 'FIMC SPECIFIC'
- * For some fimc formats, we couldn't find equivalent format in the V4L2 FOURCC.
- *
- * FIMC TYPE    PLANES  ORDER       V4L2_PIX_FMT
- * ---------------------------------------------------------
- * RGB565   x   x       V4L2_PIX_FMT_RGB565
- * RGB888   x   x       V4L2_PIX_FMT_RGB24
- * YUV420   2   LSB_CBCR    V4L2_PIX_FMT_NV12
- * YUV420   2   LSB_CRCB    V4L2_PIX_FMT_NV21
- * YUV420   2   MSB_CBCR    V4L2_PIX_FMT_NV21X*
- * YUV420   2   MSB_CRCB    V4L2_PIX_FMT_NV12X*
- * YUV420   3   x       V4L2_PIX_FMT_YUV420
- * YUV422   1   YCBYCR      V4L2_PIX_FMT_YUYV
- * YUV422   1   YCRYCB      V4L2_PIX_FMT_YVYU
- * YUV422   1   CBYCRY      V4L2_PIX_FMT_UYVY
- * YUV422   1   CRYCBY      V4L2_PIX_FMT_VYUY*
- * YUV422   2   LSB_CBCR    V4L2_PIX_FMT_NV16*
- * YUV422   2   LSB_CRCB    V4L2_PIX_FMT_NV61*
- * YUV422   2   MSB_CBCR    V4L2_PIX_FMT_NV16X*
- * YUV422   2   MSB_CRCB    V4L2_PIX_FMT_NV61X*
- * YUV422   3   x       V4L2_PIX_FMT_YUV422P
- *
-*/
-
-/*
- * V 4 L 2   F I M C   E X T E N S I O N S
- *
-*/
-#define V4L2_PIX_FMT_YVYU       v4l2_fourcc('Y', 'V', 'Y', 'U')
-
-/* FOURCC for FIMC specific */
-#define V4L2_PIX_FMT_NV12X      v4l2_fourcc('N', '1', '2', 'X')
-#define V4L2_PIX_FMT_NV21X      v4l2_fourcc('N', '2', '1', 'X')
-#define V4L2_PIX_FMT_VYUY       v4l2_fourcc('V', 'Y', 'U', 'Y')
-#define V4L2_PIX_FMT_NV16       v4l2_fourcc('N', 'V', '1', '6')
-#define V4L2_PIX_FMT_NV61       v4l2_fourcc('N', 'V', '6', '1')
-#define V4L2_PIX_FMT_NV16X      v4l2_fourcc('N', '1', '6', 'X')
-#define V4L2_PIX_FMT_NV61X      v4l2_fourcc('N', '6', '1', 'X')
-
-#define V4L2_PIX_FMT_NV12T      v4l2_fourcc('T', 'V', '1', '2') /* 12  Y/CbCr 4:2:0 64x32 macroblocks */
-
-/* CID extensions */
-#define V4L2_CID_ROTATION       (V4L2_CID_PRIVATE_BASE + 0)
-#define V4L2_CID_OVLY_MODE              (V4L2_CID_PRIVATE_BASE + 9)
-#define V4L2_CID_GET_PHY_SRC_YADDR  (V4L2_CID_PRIVATE_BASE + 12)
-#define V4L2_CID_GET_PHY_SRC_CADDR  (V4L2_CID_PRIVATE_BASE + 13)
-#define V4L2_CID_RESERVED_MEM_BASE_ADDR (V4L2_CID_PRIVATE_BASE + 20)
-#define V4L2_CID_FIMC_VERSION       (V4L2_CID_PRIVATE_BASE + 21)
-
-/*
- * U S E R   D E F I N E D   T Y P E S
- *
-*/
-#define FIMC1_RESERVED_SIZE 32768
-
-enum fimc_overlay_mode {
-    FIMC_OVLY_NOT_FIXED       = 0x0,    /* Overlay mode isn't fixed. */
-    FIMC_OVLY_FIFO            = 0x1,    /* Non-destructive Overlay with FIFO */
-    FIMC_OVLY_DMA_AUTO        = 0x2,    /* Non-destructive Overlay with DMA */
-    FIMC_OVLY_DMA_MANUAL      = 0x3,    /* Non-destructive Overlay with DMA */
-    FIMC_OVLY_NONE_SINGLE_BUF = 0x4,    /* Destructive Overlay with DMA single destination buffer */
-    FIMC_OVLY_NONE_MULTI_BUF  = 0x5,    /* Destructive Overlay with DMA multiple dstination buffer */
-};
-
-typedef unsigned int dma_addr_t;
-
-struct fimc_buf {
-    dma_addr_t  base[3];
-    size_t      length[3];
-};
-
-struct fimc_buffer {
-    void    *virt_addr;
-    void    *phys_addr;
-    size_t  length;
-};
-
-struct yuv_fmt_list {
-    const char      *name;
-    const char      *desc;
-    unsigned int    fmt;
-    int             bpp;
-    int             planes;
-};
-
-struct img_offset {
-    int y_h;
-    int y_v;
-    int cb_h;
-    int cb_v;
-    int cr_h;
-    int cr_v;
-};
-
-//------------ STRUCT ---------------------------------------------------------//
-
-typedef struct
-{
-    unsigned int full_width;            // Source Image Full Width (Virtual screen size)
-    unsigned int full_height;           // Source Image Full Height (Virtual screen size)
-    unsigned int start_x;               // Source Image Start width offset
-    unsigned int start_y;               // Source Image Start height offset
-    unsigned int width;                 // Source Image Width
-    unsigned int height;                // Source Image Height
-    unsigned int buf_addr_phy_rgb_y;    // Base Address of the Source Image (RGB or Y): Physical Address
-    unsigned int buf_addr_phy_cb;       // Base Address of the Source Image (CB Component) : Physical Address
-    unsigned int buf_addr_phy_cr;       // Base Address of the Source Image (CR Component) : Physical Address
-    unsigned int color_space;           // Color Space of the Source Image
-} s5p_fimc_img_info;
-
-typedef struct
-{
-    s5p_fimc_img_info   src;
-    s5p_fimc_img_info   dst;
-} s5p_fimc_params_t;
-
-typedef struct _s5p_fimc_t {
-    int                dev_fd;
-    struct fimc_buffer  out_buf;
-
-    s5p_fimc_params_t   params;
-
-    int                 use_ext_out_mem;
-}s5p_fimc_t;
-
-#endif
diff --git a/exynos5/hal/include/s5p_fimc_v4l2.h b/exynos5/hal/include/s5p_fimc_v4l2.h
deleted file mode 100644
index e69951d..0000000
--- a/exynos5/hal/include/s5p_fimc_v4l2.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/* Copyright(c) 2011 Samsung Electronics Co, Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-#ifndef _S5P_FIMC_H_
-#define _S5P_FIMC_H_
-
-#include "videodev2.h"
-#include "SecBuffer.h"
-
-/*
- * G E N E R A L S
- *
-*/
-
-/*
- * P I X E L   F O R M A T   G U I D E
- *
- * The 'x' means 'DO NOT CARE'
- * The '*' means 'FIMC SPECIFIC'
- * For some fimc formats, we couldn't find equivalent format in the V4L2 FOURCC.
- *
- * FIMC TYPE    PLANES  ORDER       V4L2_PIX_FMT
- * ---------------------------------------------------------
- * RGB565   x   x       V4L2_PIX_FMT_RGB565
- * RGB888   x   x       V4L2_PIX_FMT_RGB24
- * YUV420   2   LSB_CBCR    V4L2_PIX_FMT_NV12
- * YUV420   2   LSB_CRCB    V4L2_PIX_FMT_NV21
- * YUV420   2   MSB_CBCR    V4L2_PIX_FMT_NV21X*
- * YUV420   2   MSB_CRCB    V4L2_PIX_FMT_NV12X*
- * YUV420   3   x       V4L2_PIX_FMT_YUV420
- * YUV422   1   YCBYCR      V4L2_PIX_FMT_YUYV
- * YUV422   1   YCRYCB      V4L2_PIX_FMT_YVYU
- * YUV422   1   CBYCRY      V4L2_PIX_FMT_UYVY
- * YUV422   1   CRYCBY      V4L2_PIX_FMT_VYUY*
- * YUV422   2   LSB_CBCR    V4L2_PIX_FMT_NV16*
- * YUV422   2   LSB_CRCB    V4L2_PIX_FMT_NV61*
- * YUV422   2   MSB_CBCR    V4L2_PIX_FMT_NV16X*
- * YUV422   2   MSB_CRCB    V4L2_PIX_FMT_NV61X*
- * YUV422   3   x       V4L2_PIX_FMT_YUV422P
- *
-*/
-
-/*
- * V 4 L 2   F I M C   E X T E N S I O N S
- *
-*/
-#define V4L2_PIX_FMT_YVYU       v4l2_fourcc('Y', 'V', 'Y', 'U')
-
-/* FOURCC for FIMC specific */
-#define V4L2_PIX_FMT_NV12X      v4l2_fourcc('N', '1', '2', 'X')
-#define V4L2_PIX_FMT_NV21X      v4l2_fourcc('N', '2', '1', 'X')
-#define V4L2_PIX_FMT_VYUY       v4l2_fourcc('V', 'Y', 'U', 'Y')
-#define V4L2_PIX_FMT_NV16       v4l2_fourcc('N', 'V', '1', '6')
-#define V4L2_PIX_FMT_NV61       v4l2_fourcc('N', 'V', '6', '1')
-#define V4L2_PIX_FMT_NV16X      v4l2_fourcc('N', '1', '6', 'X')
-#define V4L2_PIX_FMT_NV61X      v4l2_fourcc('N', '6', '1', 'X')
-
-#define V4L2_PIX_FMT_NV12T      v4l2_fourcc('T', 'V', '1', '2') /* 12  Y/CbCr 4:2:0 64x32 macroblocks */
-
-/* CID extensions */
-#define V4L2_CID_ROTATION       (V4L2_CID_PRIVATE_BASE + 0)
-#define V4L2_CID_OVLY_MODE              (V4L2_CID_PRIVATE_BASE + 9)
-#define V4L2_CID_GET_PHY_SRC_YADDR  (V4L2_CID_PRIVATE_BASE + 12)
-#define V4L2_CID_GET_PHY_SRC_CADDR  (V4L2_CID_PRIVATE_BASE + 13)
-#define V4L2_CID_RESERVED_MEM_BASE_ADDR (V4L2_CID_PRIVATE_BASE + 20)
-#define V4L2_CID_FIMC_VERSION       (V4L2_CID_PRIVATE_BASE + 21)
-
-/*
- * U S E R   D E F I N E D   T Y P E S
- *
-*/
-#define FIMC1_RESERVED_SIZE 32768
-
-enum fimc_overlay_mode {
-    FIMC_OVLY_NOT_FIXED       = 0x0,    /* Overlay mode isn't fixed. */
-    FIMC_OVLY_FIFO            = 0x1,    /* Non-destructive Overlay with FIFO */
-    FIMC_OVLY_DMA_AUTO        = 0x2,    /* Non-destructive Overlay with DMA */
-    FIMC_OVLY_DMA_MANUAL      = 0x3,    /* Non-destructive Overlay with DMA */
-    FIMC_OVLY_NONE_SINGLE_BUF = 0x4,    /* Destructive Overlay with DMA single destination buffer */
-    FIMC_OVLY_NONE_MULTI_BUF  = 0x5,    /* Destructive Overlay with DMA multiple dstination buffer */
-};
-
-typedef unsigned int dma_addr_t;
-
-struct fimc_buf {
-    dma_addr_t  base[3];
-    size_t      size[3];
-    int         planes;
-};
-
-struct fimc_buffer {
-    void    *virt_addr;
-    void    *phys_addr;
-    size_t  length;
-};
-
-struct yuv_fmt_list {
-    const char      *name;
-    const char      *desc;
-    unsigned int    fmt;
-    int             bpp;
-    int             planes;
-};
-
-struct img_offset {
-    int y_h;
-    int y_v;
-    int cb_h;
-    int cb_v;
-    int cr_h;
-    int cr_v;
-};
-
-//------------ STRUCT ---------------------------------------------------------//
-
-typedef struct
-{
-    unsigned int full_width;            // Source Image Full Width (Virtual screen size)
-    unsigned int full_height;           // Source Image Full Height (Virtual screen size)
-    unsigned int start_x;               // Source Image Start width offset
-    unsigned int start_y;               // Source Image Start height offset
-    unsigned int width;                 // Source Image Width
-    unsigned int height;                // Source Image Height
-    unsigned int buf_addr_phy_rgb_y;    // Base Address of the Source Image (RGB or Y): Physical Address
-    unsigned int buf_addr_phy_cb;       // Base Address of the Source Image (CB Component) : Physical Address
-    unsigned int buf_addr_phy_cr;       // Base Address of the Source Image (CR Component) : Physical Address
-    unsigned int color_space;           // Color Space of the Source Image
-    unsigned int planes;                // number of planes for the Image
-} s5p_fimc_img_info;
-
-typedef struct
-{
-    s5p_fimc_img_info   src;
-    s5p_fimc_img_info   dst;
-} s5p_fimc_params_t;
-
-typedef struct _s5p_fimc_t {
-    int                 dev_fd;
-    struct fimc_buffer  out_buf;
-
-    s5p_fimc_params_t   params;
-
-    int                 use_ext_out_mem;
-} s5p_fimc_t;
-
-#endif
diff --git a/exynos5/hal/include/s5p_tvout.h b/exynos5/hal/include/s5p_tvout.h
deleted file mode 100644
index fd31bec..0000000
--- a/exynos5/hal/include/s5p_tvout.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __S5P_TVOUT_H__
-#define __S5P_TVOUT_H__
-
-#include <linux/fb.h>
-#include <linux/videodev2.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*******************************************
- * Define
- *******************************************/
-/* TVOUT control */
-#ifdef SAMSUNG_EXYNOS4210
-#define TVOUT_DEV   "/dev/video14"
-#else
-#define TVOUT_DEV   "/dev/video16"
-#endif
-#define HPD_DEV         "/dev/HPD"
-
-/* ------------- Output -----------------*/
-/* type */
-#define V4L2_OUTPUT_TYPE_MSDMA          4
-#define V4L2_OUTPUT_TYPE_COMPOSITE      5
-#define V4L2_OUTPUT_TYPE_SVIDEO         6
-#define V4L2_OUTPUT_TYPE_YPBPR_INERLACED    7
-#define V4L2_OUTPUT_TYPE_YPBPR_PROGRESSIVE  8
-#define V4L2_OUTPUT_TYPE_RGB_PROGRESSIVE    9
-#define V4L2_OUTPUT_TYPE_DIGITAL        10
-#define V4L2_OUTPUT_TYPE_HDMI           V4L2_OUTPUT_TYPE_DIGITAL
-#define V4L2_OUTPUT_TYPE_HDMI_RGB       11
-#define V4L2_OUTPUT_TYPE_DVI            12
-
-/* ------------- STD -------------------*/
-#define V4L2_STD_PAL_BDGHI\
- (V4L2_STD_PAL_B|V4L2_STD_PAL_D|V4L2_STD_PAL_G|V4L2_STD_PAL_H|V4L2_STD_PAL_I)
-
-#define V4L2_STD_480P_60_16_9           ((v4l2_std_id)0x04000000)
-#define V4L2_STD_480P_60_4_3            ((v4l2_std_id)0x05000000)
-#define V4L2_STD_576P_50_16_9           ((v4l2_std_id)0x06000000)
-#define V4L2_STD_576P_50_4_3            ((v4l2_std_id)0x07000000)
-#define V4L2_STD_720P_60                ((v4l2_std_id)0x08000000)
-#define V4L2_STD_720P_50                ((v4l2_std_id)0x09000000)
-#define V4L2_STD_1080P_60               ((v4l2_std_id)0x0a000000)
-#define V4L2_STD_1080P_50               ((v4l2_std_id)0x0b000000)
-#define V4L2_STD_1080I_60               ((v4l2_std_id)0x0c000000)
-#define V4L2_STD_1080I_50               ((v4l2_std_id)0x0d000000)
-#define V4L2_STD_480P_59                ((v4l2_std_id)0x0e000000)
-#define V4L2_STD_720P_59                ((v4l2_std_id)0x0f000000)
-#define V4L2_STD_1080I_59               ((v4l2_std_id)0x10000000)
-#define V4L2_STD_1080P_59               ((v4l2_std_id)0x11000000)
-#define V4L2_STD_1080P_30               ((v4l2_std_id)0x12000000)
-#define V4L2_STD_TVOUT_720P_60_SBS_HALF ((v4l2_std_id)0x13000000)
-#define V4L2_STD_TVOUT_720P_59_SBS_HALF ((v4l2_std_id)0x14000000)
-#define V4L2_STD_TVOUT_720P_50_TB       ((v4l2_std_id)0x15000000)
-#define V4L2_STD_TVOUT_1080P_24_TB      ((v4l2_std_id)0x16000000)
-#define V4L2_STD_TVOUT_1080P_23_TB      ((v4l2_std_id)0x17000000)
-
-/* TVOUT video */
-#ifdef SAMSUNG_EXYNOS4210
-#define TVOUT_DEV_V "/dev/video21"
-#else
-#define TVOUT_DEV_V "/dev/video20"
-#endif
-
-/* ------------- Input ------------------*/
-/* type */
-#define V4L2_INPUT_TYPE_MSDMA           3
-#define V4L2_INPUT_TYPE_FIFO            4
-
-/* TVOUT video */
-#define PFX_NODE_FB "/dev/graphics/fb"
-
-/*******************************************
- * structures
- *******************************************/
-
-/* TVOUT */
-struct v4l2_vid_overlay_src {
-    void            *base_y;
-    void            *base_c;
-    struct v4l2_pix_format  pix_fmt;
-};
-
-struct v4l2_window_s5p_tvout {
-    __u32       capability;
-    __u32       flags;
-    __u32       priority;
-    struct v4l2_window  win;
-};
-
-struct v4l2_pix_format_s5p_tvout {
-    void *base_y;
-    void *base_c;
-    __u32 src_img_endian;
-    struct v4l2_pix_format  pix_fmt;
-};
-
-struct vid_overlay_param {
-    struct v4l2_vid_overlay_src     src;
-    struct v4l2_rect                src_crop;
-    struct v4l2_framebuffer         dst;
-    struct v4l2_window              dst_win;
-};
-
-struct tvout_param {
-    struct v4l2_pix_format_s5p_tvout    tvout_src;
-    struct v4l2_window_s5p_tvout        tvout_rect;
-    struct v4l2_rect                    tvout_dst;
-};
-
-struct overlay_param {
-    struct v4l2_framebuffer         overlay_frame;
-    struct v4l2_window_s5p_tvout    overlay_rect;
-    struct v4l2_rect                overlay_dst;
-};
-
-/* FB */
-struct s5ptvfb_user_window {
-    int x;
-    int y;
-};
-
-struct s5ptvfb_user_plane_alpha {
-    int channel;
-    unsigned char alpha;
-};
-
-struct s5ptvfb_user_chroma {
-    int enabled;
-    unsigned char red;
-    unsigned char green;
-    unsigned char blue;
-};
-
-enum s5ptvfb_ver_scaling_t {
-    VERTICAL_X1,
-    VERTICAL_X2,
-};
-
-enum s5ptvfb_hor_scaling_t {
-    HORIZONTAL_X1,
-    HORIZONTAL_X2,
-};
-
-struct s5ptvfb_user_scaling {
-    enum s5ptvfb_ver_scaling_t ver;
-    enum s5ptvfb_hor_scaling_t hor;
-};
-
-/*******************************************
- * custom ioctls
- *******************************************/
-
-#define VIDIOC_S_BASEADDR        _IOR('V', 83, int)
-
-#define VIDIOC_HDCP_ENABLE _IOWR('V', 100, unsigned int)
-#define VIDIOC_HDCP_STATUS _IOR('V', 101, unsigned int)
-#define VIDIOC_HDCP_PROT_STATUS _IOR('V', 102, unsigned int)
-
-#define VIDIOC_INIT_AUDIO _IOR('V', 103, unsigned int)
-#define VIDIOC_AV_MUTE _IOR('V', 104, unsigned int)
-#define VIDIOC_G_AVMUTE _IOR('V', 105, unsigned int)
-#define HPD_GET_STATE _IOR('H', 100, unsigned int)
-
-#define S5PTVFB_WIN_POSITION _IOW('F', 213, struct s5ptvfb_user_window)
-#define S5PTVFB_WIN_SET_PLANE_ALPHA _IOW('F', 214, struct s5ptvfb_user_plane_alpha)
-#define S5PTVFB_WIN_SET_CHROMA _IOW('F', 215, struct s5ptvfb_user_chroma)
-
-#define S5PTVFB_SET_VSYNC_INT _IOW('F', 216, unsigned int)
-#define S5PTVFB_WAITFORVSYNC _IO('F', 32)
-#define S5PTVFB_WIN_SET_ADDR _IOW('F', 219, unsigned int)
-#define S5PTVFB_SET_WIN_ON _IOW('F', 220, unsigned int)
-#define S5PTVFB_SET_WIN_OFF _IOW('F', 221, unsigned int)
-#define S5PTVFB_SCALING _IOW('F', 222, struct s5ptvfb_user_scaling)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __S5P_TVOUT_H__ */
diff --git a/exynos5/hal/include/s5p_tvout_v4l2.h b/exynos5/hal/include/s5p_tvout_v4l2.h
deleted file mode 100644
index 49ac288..0000000
--- a/exynos5/hal/include/s5p_tvout_v4l2.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __S5P_TVOUT_H__
-#define __S5P_TVOUT_H__
-
-#include <linux/fb.h>
-
-#include "videodev2.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*******************************************
- * Define
- *******************************************/
-/* TVOUT control */
-#define PFX_NODE_FB               "/dev/graphics/fb"
-
-#define PFX_NODE_MEDIADEV         "/dev/media"
-#define PFX_NODE_SUBDEV           "/dev/v4l-subdev"
-#define PFX_NODE_VIDEODEV         "/dev/video"
-#define PFX_ENTITY_SUBDEV_MIXER   "s5p-mixer%d"
-
-/* Sub-Mixer 0 */
-#define TVOUT0_DEV_G0      "/dev/video16"
-#define TVOUT0_DEV_G1      "/dev/video17"
-/* Sub-Mixer 1 */
-#define TVOUT1_DEV_G0      "/dev/video18"
-#define TVOUT1_DEV_G1      "/dev/video19"
-
-#define MIXER_V_SUBDEV_PAD_SINK     (0)
-#define MIXER_V_SUBDEV_PAD_SOURCE   (3)
-#define MIXER_G0_SUBDEV_PAD_SINK    (1)
-#define MIXER_G0_SUBDEV_PAD_SOURCE  (4)
-#define MIXER_G1_SUBDEV_PAD_SINK    (2)
-#define MIXER_G1_SUBDEV_PAD_SOURCE  (5)
-
-#define GSCALER_SUBDEV_PAD_SOURCE   (1)
-
-#define HPD_DEV         "/dev/HPD"
-
-/* ------------- Output -----------------*/
-/* type */
-#define V4L2_OUTPUT_TYPE_MSDMA          4
-#define V4L2_OUTPUT_TYPE_COMPOSITE      5
-#define V4L2_OUTPUT_TYPE_SVIDEO         6
-#define V4L2_OUTPUT_TYPE_YPBPR_INERLACED    7
-#define V4L2_OUTPUT_TYPE_YPBPR_PROGRESSIVE  8
-#define V4L2_OUTPUT_TYPE_RGB_PROGRESSIVE    9
-#define V4L2_OUTPUT_TYPE_DIGITAL        10
-#define V4L2_OUTPUT_TYPE_HDMI           V4L2_OUTPUT_TYPE_DIGITAL
-#define V4L2_OUTPUT_TYPE_HDMI_RGB       11
-#define V4L2_OUTPUT_TYPE_DVI            12
-
-/* ------------- STD -------------------*/
-#define V4L2_STD_PAL_BDGHI\
- (V4L2_STD_PAL_B|V4L2_STD_PAL_D|V4L2_STD_PAL_G|V4L2_STD_PAL_H|V4L2_STD_PAL_I)
-
-#define V4L2_STD_480P_60_16_9           ((v4l2_std_id)0x04000000)
-#define V4L2_STD_480P_60_4_3            ((v4l2_std_id)0x05000000)
-#define V4L2_STD_576P_50_16_9           ((v4l2_std_id)0x06000000)
-#define V4L2_STD_576P_50_4_3            ((v4l2_std_id)0x07000000)
-#define V4L2_STD_720P_60                ((v4l2_std_id)0x08000000)
-#define V4L2_STD_720P_50                ((v4l2_std_id)0x09000000)
-#define V4L2_STD_1080P_60               ((v4l2_std_id)0x0a000000)
-#define V4L2_STD_1080P_50               ((v4l2_std_id)0x0b000000)
-#define V4L2_STD_1080I_60               ((v4l2_std_id)0x0c000000)
-#define V4L2_STD_1080I_50               ((v4l2_std_id)0x0d000000)
-#define V4L2_STD_480P_59                ((v4l2_std_id)0x0e000000)
-#define V4L2_STD_720P_59                ((v4l2_std_id)0x0f000000)
-#define V4L2_STD_1080I_59               ((v4l2_std_id)0x10000000)
-#define V4L2_STD_1080P_59               ((v4l2_std_id)0x11000000)
-#define V4L2_STD_1080P_30               ((v4l2_std_id)0x12000000)
-#define V4L2_STD_TVOUT_720P_60_SBS_HALF ((v4l2_std_id)0x13000000)
-#define V4L2_STD_TVOUT_720P_59_SBS_HALF ((v4l2_std_id)0x14000000)
-#define V4L2_STD_TVOUT_720P_50_TB       ((v4l2_std_id)0x15000000)
-#define V4L2_STD_TVOUT_1080P_24_TB      ((v4l2_std_id)0x16000000)
-#define V4L2_STD_TVOUT_1080P_23_TB      ((v4l2_std_id)0x17000000)
-
-/* ------------- Input ------------------*/
-/* type */
-#define V4L2_INPUT_TYPE_MSDMA           3
-#define V4L2_INPUT_TYPE_FIFO            4
-
-/*******************************************
- * structures
- *******************************************/
-
-/* TVOUT */
-struct v4l2_vid_overlay_src {
-    void            *base_y;
-    void            *base_c;
-    struct v4l2_pix_format  pix_fmt;
-};
-
-struct v4l2_window_s5p_tvout {
-    __u32       capability;
-    __u32       flags;
-    __u32       priority;
-    struct v4l2_window  win;
-};
-
-struct v4l2_pix_format_s5p_tvout {
-    void *base_y;
-    void *base_c;
-    __u32 src_img_endian;
-    struct v4l2_pix_format  pix_fmt;
-};
-
-struct vid_overlay_param {
-    struct v4l2_vid_overlay_src     src;
-    struct v4l2_rect                src_crop;
-    struct v4l2_framebuffer         dst;
-    struct v4l2_window              dst_win;
-};
-
-struct tvout_param {
-    struct v4l2_pix_format_s5p_tvout    tvout_src;
-    struct v4l2_window_s5p_tvout        tvout_rect;
-    struct v4l2_rect                    tvout_dst;
-};
-
-struct overlay_param {
-    struct v4l2_framebuffer         overlay_frame;
-    struct v4l2_window_s5p_tvout    overlay_rect;
-    struct v4l2_rect                overlay_dst;
-};
-
-/* FB */
-struct s5ptvfb_user_window {
-    int x;
-    int y;
-};
-
-struct s5ptvfb_user_plane_alpha {
-    int channel;
-    unsigned char alpha;
-};
-
-struct s5ptvfb_user_chroma {
-    int enabled;
-    unsigned char red;
-    unsigned char green;
-    unsigned char blue;
-};
-
-enum s5ptvfb_ver_scaling_t {
-    VERTICAL_X1,
-    VERTICAL_X2,
-};
-
-enum s5ptvfb_hor_scaling_t {
-    HORIZONTAL_X1,
-    HORIZONTAL_X2,
-};
-
-struct s5ptvfb_user_scaling {
-    enum s5ptvfb_ver_scaling_t ver;
-    enum s5ptvfb_hor_scaling_t hor;
-};
-
-/*******************************************
- * custom ioctls
- *******************************************/
-
-#define VIDIOC_S_BASEADDR        _IOR('V', 83, int)
-
-#define VIDIOC_HDCP_ENABLE _IOWR('V', 100, unsigned int)
-#define VIDIOC_HDCP_STATUS _IOR('V', 101, unsigned int)
-#define VIDIOC_HDCP_PROT_STATUS _IOR('V', 102, unsigned int)
-
-#define VIDIOC_INIT_AUDIO _IOR('V', 103, unsigned int)
-#define VIDIOC_AV_MUTE _IOR('V', 104, unsigned int)
-#define VIDIOC_G_AVMUTE _IOR('V', 105, unsigned int)
-#define HPD_GET_STATE _IOR('H', 100, unsigned int)
-
-#define S5PTVFB_WIN_POSITION _IOW('F', 213, struct s5ptvfb_user_window)
-#define S5PTVFB_WIN_SET_PLANE_ALPHA _IOW('F', 214, struct s5ptvfb_user_plane_alpha)
-#define S5PTVFB_WIN_SET_CHROMA _IOW('F', 215, struct s5ptvfb_user_chroma)
-
-#define S5PTVFB_SET_VSYNC_INT _IOW('F', 216, unsigned int)
-#define S5PTVFB_WAITFORVSYNC _IO('F', 32)
-#define S5PTVFB_WIN_SET_ADDR _IOW('F', 219, unsigned int)
-#define S5PTVFB_SET_WIN_ON _IOW('F', 220, unsigned int)
-#define S5PTVFB_SET_WIN_OFF _IOW('F', 221, unsigned int)
-#define S5PTVFB_SCALING _IOW('F', 222, struct s5ptvfb_user_scaling)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __S5P_TVOUT_H__ */
diff --git a/exynos5/hal/include/sec_format.h b/exynos5/hal/include/sec_format.h
deleted file mode 100644
index 1f7b70b..0000000
--- a/exynos5/hal/include/sec_format.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-#ifndef _SEC_FORMAT_H_
-#define _SEC_FORMAT_H_
-
-/* enum related to pixel format */
-
-enum {
-    HAL_PIXEL_FORMAT_YCbCr_422_P         = 0x100,
-    HAL_PIXEL_FORMAT_YCbCr_420_P         = 0x101,
-    HAL_PIXEL_FORMAT_YCbCr_420_I         = 0x102,
-    HAL_PIXEL_FORMAT_CbYCrY_422_I        = 0x103,
-    HAL_PIXEL_FORMAT_CbYCrY_420_I        = 0x104,
-    HAL_PIXEL_FORMAT_YCbCr_420_SP        = 0x105,
-    HAL_PIXEL_FORMAT_YCrCb_422_SP        = 0x106,
-    // support custom format for zero copy
-    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP = 0x110,
-    HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP = 0x111,
-    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED = 0x112,
-    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP = 0x113,
-    HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP = 0x114,
-    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I = 0x115,
-    HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I = 0x116,
-    HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I = 0x117,
-    HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I = 0x118,
-    HAL_PIXEL_FORMAT_CUSTOM_CbYCr_422_I  = 0x11B,
-    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR = 0x11C,
-    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL = 0x11D,
-    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR = 0x11E,
-    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL = 0x11F,
-    HAL_PIXEL_FORMAT_CUSTOM_MAX
-};
-
-#endif
diff --git a/exynos5/hal/include/sec_g2d.h b/exynos5/hal/include/sec_g2d.h
deleted file mode 100644
index 772cbf8..0000000
--- a/exynos5/hal/include/sec_g2d.h
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _SEC_G2D_DRIVER_H_
-#define _SEC_G2D_DRIVER_H_
-typedef unsigned char  u8;
-typedef unsigned short u16;
-typedef unsigned long  u32;
-
-#define SEC_G2D_DEV_NAME        "/dev/fimg2d"
-
-#define G2D_IOCTL_MAGIC 'G'
-
-#define G2D_BLIT                    _IO(G2D_IOCTL_MAGIC,0)
-#define G2D_GET_VERSION             _IO(G2D_IOCTL_MAGIC,1)
-#define G2D_GET_MEMORY              _IOR(G2D_IOCTL_MAGIC,2, unsigned int)
-#define G2D_GET_MEMORY_SIZE         _IOR(G2D_IOCTL_MAGIC,3, unsigned int)
-#define G2D_DMA_CACHE_CLEAN         _IOWR(G2D_IOCTL_MAGIC,4, struct g2d_dma_info)
-#define G2D_DMA_CACHE_FLUSH         _IOWR(G2D_IOCTL_MAGIC,5, struct g2d_dma_info)
-#define G2D_SYNC                    _IO(G2D_IOCTL_MAGIC,6)
-#define G2D_RESET                   _IO(G2D_IOCTL_MAGIC,7)
-
-#define G2D_MAX_WIDTH   (2048)
-#define G2D_MAX_HEIGHT  (2048)
-
-#define G2D_ALPHA_VALUE_MAX (255)
-
-#define G2D_POLLING (1<<0)
-#define G2D_INTERRUPT (0<<0)
-#define G2D_CACHE_OP (1<<1)
-#define G2D_NONE_INVALIDATE (0<<1)
-#define G2D_HYBRID_MODE (1<<2)
-
-typedef enum {
-    G2D_ROT_0 = 0,
-    G2D_ROT_90,
-    G2D_ROT_180,
-    G2D_ROT_270,
-    G2D_ROT_X_FLIP,
-    G2D_ROT_Y_FLIP
-} G2D_ROT_DEG;
-
-typedef enum {
-    G2D_ALPHA_BLENDING_MIN    = 0,   // wholly transparent
-    G2D_ALPHA_BLENDING_MAX    = 255, // 255
-    G2D_ALPHA_BLENDING_OPAQUE = 256, // opaque
-} G2D_ALPHA_BLENDING_MODE;
-
-typedef enum {
-    G2D_COLORKEY_NONE = 0,
-    G2D_COLORKEY_SRC_ON,
-    G2D_COLORKEY_DST_ON,
-    G2D_COLORKEY_SRC_DST_ON,
-} G2D_COLORKEY_MODE;
-
-typedef enum {
-    G2D_BLUE_SCREEN_NONE = 0,
-    G2D_BLUE_SCREEN_TRANSPARENT,
-    G2D_BLUE_SCREEN_WITH_COLOR,
-} G2D_BLUE_SCREEN_MODE;
-
-typedef enum {
-    G2D_ROP_SRC = 0,
-    G2D_ROP_DST,
-    G2D_ROP_SRC_AND_DST,
-    G2D_ROP_SRC_OR_DST,
-    G2D_ROP_3RD_OPRND,
-    G2D_ROP_SRC_AND_3RD_OPRND,
-    G2D_ROP_SRC_OR_3RD_OPRND,
-    G2D_ROP_SRC_XOR_3RD_OPRND,
-    G2D_ROP_DST_OR_3RD,
-} G2D_ROP_TYPE;
-
-typedef enum {
-    G2D_THIRD_OP_NONE = 0,
-    G2D_THIRD_OP_PATTERN,
-    G2D_THIRD_OP_FG,
-    G2D_THIRD_OP_BG
-} G2D_THIRD_OP_MODE;
-
-typedef enum {
-    G2D_BLACK = 0,
-    G2D_RED,
-    G2D_GREEN,
-    G2D_BLUE,
-    G2D_WHITE,
-    G2D_YELLOW,
-    G2D_CYAN,
-    G2D_MAGENTA
-} G2D_COLOR;
-
-typedef enum {
-    G2D_RGB_565 = ((0<<4)|2),
-
-    G2D_ABGR_8888 = ((2<<4)|1),
-    G2D_BGRA_8888 = ((3<<4)|1),
-    G2D_ARGB_8888 = ((0<<4)|1),
-    G2D_RGBA_8888 = ((1<<4)|1),
-
-    G2D_XBGR_8888 = ((2<<4)|0),
-    G2D_BGRX_8888 = ((3<<4)|0),
-    G2D_XRGB_8888 = ((0<<4)|0),
-    G2D_RGBX_8888 = ((1<<4)|0),
-
-    G2D_ABGR_1555 = ((2<<4)|4),
-    G2D_BGRA_5551 = ((3<<4)|4),
-    G2D_ARGB_1555 = ((0<<4)|4),
-    G2D_RGBA_5551 = ((1<<4)|4),
-
-    G2D_XBGR_1555 = ((2<<4)|3),
-    G2D_BGRX_5551 = ((3<<4)|3),
-    G2D_XRGB_1555 = ((0<<4)|3),
-    G2D_RGBX_5551 = ((1<<4)|3),
-
-    G2D_ABGR_4444 = ((2<<4)|6),
-    G2D_BGRA_4444 = ((3<<4)|6),
-    G2D_ARGB_4444 = ((0<<4)|6),
-    G2D_RGBA_4444 = ((1<<4)|6),
-
-    G2D_XBGR_4444 = ((2<<4)|5),
-    G2D_BGRX_4444 = ((3<<4)|5),
-    G2D_XRGB_4444 = ((0<<4)|5),
-    G2D_RGBX_4444 = ((1<<4)|5),
-
-    G2D_PACKED_BGR_888 = ((2<<4)|7),
-    G2D_PACKED_RGB_888 = ((0<<4)|7),
-
-    G2D_MAX_COLOR_SPACE
-} G2D_COLOR_SPACE;
-
-typedef enum {
-    G2D_Clear_Mode,    //!< [0, 0]
-    G2D_Src_Mode,      //!< [Sa, Sc]
-    G2D_Dst_Mode,      //!< [Da, Dc]
-    G2D_SrcOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Sc + (1 - Sa)*Dc]
-    G2D_DstOver_Mode,  //!< [Sa + Da - Sa*Da, Rc = Dc + (1 - Da)*Sc]
-    G2D_SrcIn_Mode,    //!< [Sa * Da, Sc * Da]
-    G2D_DstIn_Mode,    //!< [Sa * Da, Sa * Dc]
-    G2D_SrcOut_Mode,   //!< [Sa * (1 - Da), Sc * (1 - Da)]
-    G2D_DstOut_Mode,   //!< [Da * (1 - Sa), Dc * (1 - Sa)]
-    G2D_SrcATop_Mode,  //!< [Da, Sc * Da + (1 - Sa) * Dc]
-    G2D_DstATop_Mode,  //!< [Sa, Sa * Dc + Sc * (1 - Da)]
-    G2D_Xor_Mode,      //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
-
-    // these modes are defined in the SVG Compositing standard
-    // http://www.w3.org/TR/2009/WD-SVGCompositing-20090430/
-    G2D_Plus_Mode,
-    G2D_Multiply_Mode,
-    G2D_Screen_Mode,
-    G2D_Overlay_Mode,
-    G2D_Darken_Mode,
-    G2D_Lighten_Mode,
-    G2D_ColorDodge_Mode,
-    G2D_ColorBurn_Mode,
-    G2D_HardLight_Mode,
-    G2D_SoftLight_Mode,
-    G2D_Difference_Mode,
-    G2D_Exclusion_Mode,
-
-    kLastMode = G2D_Exclusion_Mode
-} G2D_PORTTERDUFF_MODE;
-
-typedef enum {
-       G2D_MEMORY_KERNEL,
-       G2D_MEMORY_USER
-} G2D_MEMORY_TYPE;
-
-typedef struct {
-    int    x;
-    int    y;
-    unsigned int    w;
-    unsigned int    h;
-    unsigned int    full_w;
-    unsigned int    full_h;
-    int             color_format;
-    unsigned int    bytes_per_pixel;
-    unsigned char * addr;
-} g2d_rect;
-
-typedef struct {
-    unsigned int    rotate_val;
-    unsigned int    alpha_val;
-
-    unsigned int    blue_screen_mode;     //true : enable, false : disable
-    unsigned int    color_key_val;        //screen color value
-    unsigned int    color_switch_val;     //one color
-
-    unsigned int    src_color;            // when set one color on SRC
-
-    unsigned int    third_op_mode;
-    unsigned int    rop_mode;
-    unsigned int    mask_mode;
-    unsigned int    render_mode;
-    unsigned int    potterduff_mode;
-        unsigned int    memory_type;
-} g2d_flag;
-
-typedef struct {
-    unsigned int    t;
-    unsigned int    b;
-    unsigned int    l;
-    unsigned int    r;
-} g2d_clip;
-
-typedef struct {
-    g2d_rect src_rect;
-    g2d_rect dst_rect;
-    g2d_clip clip;
-    g2d_flag flag;
-} g2d_params;
-
-struct g2d_dma_info {
-    unsigned long addr;
-    unsigned int  size;
-};
-
-typedef struct _sec_g2d_t {
-    int dev_fd;
-    g2d_params  params;
-}sec_g2d_t;
-
-typedef struct __s5p_rect {
-    uint32_t x;
-    uint32_t y;
-    uint32_t w;
-    uint32_t h;
-} __s5p_rect;
-
-typedef struct __s5p_img {
-    uint32_t width;
-    uint32_t height;
-    uint32_t format;
-    uint32_t offset;
-    uint32_t base;
-    int memory_id;
-} __s5p_img;
-
-#endif /*_SEC_G2D_DRIVER_H_*/
diff --git a/exynos5/hal/include/sec_utils.h b/exynos5/hal/include/sec_utils.h
deleted file mode 100644
index 26b63a1..0000000
--- a/exynos5/hal/include/sec_utils.h
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-#ifndef __SAMSUNG_SYSLSI_SEC_COMMON_H__
-#define __SAMSUNG_SYSLSI_SEC_COMMON_H__
-
-//---------------------------------------------------------//
-// Include
-//---------------------------------------------------------//
-
-#include <hardware/hardware.h>
-#include "sec_format.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <linux/videodev2.h>
-#include "videodev2_samsung.h"
-
-#ifdef __cplusplus
-}
-#endif
-
-//---------------------------------------------------------//
-// Common structure                                        //
-//---------------------------------------------------------//
-struct ADDRS {
-    unsigned int addr_y;
-    unsigned int addr_cbcr;
-    unsigned int buf_idx;
-    unsigned int reserved;
-};
-
-//---------------------------------------------------------//
-// Common function                                         //
-//---------------------------------------------------------//
-inline int HAL_PIXEL_FORMAT_2_V4L2_PIX(int HAL_PIXEL_FORMAT)
-{
-    int V4L2_PIX = -1;
-
-    switch (HAL_PIXEL_FORMAT) {
-    case HAL_PIXEL_FORMAT_RGBA_8888:
-    case HAL_PIXEL_FORMAT_RGBX_8888:
-        V4L2_PIX = V4L2_PIX_FMT_RGB32;
-        break;
-
-    case HAL_PIXEL_FORMAT_RGB_888:
-        V4L2_PIX = V4L2_PIX_FMT_RGB24;
-        break;
-
-    case HAL_PIXEL_FORMAT_RGB_565:
-        V4L2_PIX = V4L2_PIX_FMT_RGB565;
-        break;
-
-    case HAL_PIXEL_FORMAT_BGRA_8888:
-        V4L2_PIX = V4L2_PIX_FMT_RGB32;
-        break;
-
-    case HAL_PIXEL_FORMAT_RGBA_5551:
-        V4L2_PIX = V4L2_PIX_FMT_RGB555X;
-        break;
-
-    case HAL_PIXEL_FORMAT_RGBA_4444:
-        V4L2_PIX = V4L2_PIX_FMT_RGB444;
-        break;
-
-    case HAL_PIXEL_FORMAT_YV12:
-    case HAL_PIXEL_FORMAT_YCbCr_420_P:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL:
-        V4L2_PIX = V4L2_PIX_FMT_YUV420;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
-        V4L2_PIX = V4L2_PIX_FMT_NV61;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
-        V4L2_PIX = V4L2_PIX_FMT_NV12;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCbCr_422_I:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
-        V4L2_PIX = V4L2_PIX_FMT_YUYV;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCbCr_422_P:
-        V4L2_PIX = V4L2_PIX_FMT_YUV422P;
-        break;
-
-    case HAL_PIXEL_FORMAT_CbYCrY_422_I:
-    case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
-        V4L2_PIX = V4L2_PIX_FMT_UYVY;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCrCb_422_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
-        V4L2_PIX = V4L2_PIX_FMT_NV16;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
-        V4L2_PIX = V4L2_PIX_FMT_NV21;
-        break;
-
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
-        V4L2_PIX = V4L2_PIX_FMT_NV12T;
-        break;
-
-   case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
-        V4L2_PIX = V4L2_PIX_FMT_YVYU;
-        break;
-
-   case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
-        V4L2_PIX = V4L2_PIX_FMT_VYUY;
-        break;
-
-    default:
-        ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
-                __func__, HAL_PIXEL_FORMAT);
-        break;
-    }
-
-    return V4L2_PIX;
-}
-
-inline int V4L2_PIX_2_HAL_PIXEL_FORMAT(int V4L2_PIX)
-{
-    int HAL_PIXEL_FORMAT = -1;
-
-    switch (V4L2_PIX) {
-    case V4L2_PIX_FMT_RGB32:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGBA_8888;
-        break;
-
-    case V4L2_PIX_FMT_RGB24:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGB_888;
-        break;
-
-    case V4L2_PIX_FMT_RGB565:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGB_565;
-        break;
-
-    case V4L2_PIX_FMT_BGR32:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_BGRA_8888;
-        break;
-
-    case V4L2_PIX_FMT_RGB555X:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGBA_5551;
-        break;
-
-    case V4L2_PIX_FMT_RGB444:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGBA_4444;
-        break;
-
-    case V4L2_PIX_FMT_YUV420:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YCbCr_420_P;
-        break;
-
-    case V4L2_PIX_FMT_NV16:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP;
-        break;
-
-    case V4L2_PIX_FMT_NV12:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP;
-        break;
-
-    case V4L2_PIX_FMT_YUYV:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I;
-        break;
-
-    case V4L2_PIX_FMT_YUV422P:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YCbCr_422_P;
-        break;
-
-    case V4L2_PIX_FMT_UYVY:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I;
-        break;
-
-    case V4L2_PIX_FMT_NV21:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP;
-        break;
-
-    case V4L2_PIX_FMT_NV12T:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED;
-        break;
-
-    case V4L2_PIX_FMT_NV61:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP;
-        break;
-
-    case V4L2_PIX_FMT_YVYU:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I;
-        break;
-
-    case V4L2_PIX_FMT_VYUY:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I;
-        break;
-
-    default:
-        ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
-                __func__, V4L2_PIX);
-        break;
-    }
-
-    return HAL_PIXEL_FORMAT;
-}
-
-#define ALIGN_TO_32B(x)   ((((x) + (1 <<  5) - 1) >>  5) <<  5)
-#define ALIGN_TO_128B(x)  ((((x) + (1 <<  7) - 1) >>  7) <<  7)
-#define ALIGN_TO_8KB(x)   ((((x) + (1 << 13) - 1) >> 13) << 13)
-
-#define GET_32BPP_FRAME_SIZE(w, h)  (((w) * (h)) << 2)
-#define GET_24BPP_FRAME_SIZE(w, h)  (((w) * (h)) * 3)
-#define GET_16BPP_FRAME_SIZE(w, h)  (((w) * (h)) << 1)
-
-inline unsigned int FRAME_SIZE(int HAL_PIXEL_FORMAT, int w, int h)
-{
-    unsigned int frame_size = 0;
-    unsigned int size       = 0;
-
-    switch (HAL_PIXEL_FORMAT) {
-    // 16bpp
-    case HAL_PIXEL_FORMAT_RGB_565:
-    case HAL_PIXEL_FORMAT_RGBA_5551:
-    case HAL_PIXEL_FORMAT_RGBA_4444:
-        frame_size = GET_16BPP_FRAME_SIZE(w, h);
-        break;
-
-    // 24bpp
-    case HAL_PIXEL_FORMAT_RGB_888:
-        frame_size = GET_24BPP_FRAME_SIZE(w, h);
-        break;
-
-    // 32bpp
-    case HAL_PIXEL_FORMAT_RGBA_8888:
-    case HAL_PIXEL_FORMAT_BGRA_8888:
-    case HAL_PIXEL_FORMAT_RGBX_8888:
-        frame_size = GET_32BPP_FRAME_SIZE(w, h);
-        break;
-
-    // 12bpp
-    case HAL_PIXEL_FORMAT_YV12:
-    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
-    case HAL_PIXEL_FORMAT_YCbCr_420_P:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL:
-    case HAL_PIXEL_FORMAT_YCbCr_420_I:
-    case HAL_PIXEL_FORMAT_CbYCrY_420_I:
-    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
-        size = w * h;
-        frame_size = size + ((size >> 2) << 1);
-        break;
-
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
-        frame_size =   ALIGN_TO_8KB(ALIGN_TO_128B(w) * ALIGN_TO_32B(h))
-                     + ALIGN_TO_8KB(ALIGN_TO_128B(w) * ALIGN_TO_32B(h >> 1));
-        break;
-
-    // 16bpp
-    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
-    case HAL_PIXEL_FORMAT_YCbCr_422_I:
-    case HAL_PIXEL_FORMAT_YCbCr_422_P:
-    case HAL_PIXEL_FORMAT_CbYCrY_422_I:
-    case HAL_PIXEL_FORMAT_YCrCb_422_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
-    case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
-    case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
-        frame_size = GET_16BPP_FRAME_SIZE(w, h);
-        break;
-
-    default:
-        ALOGD("%s::no matching source colorformat(0x%x), w(%d), h(%d) fail\n",
-                __func__, HAL_PIXEL_FORMAT, w, h);
-        break;
-    }
-
-    return frame_size;
-}
-
-#endif //__SAMSUNG_SYSLSI_SEC_COMMON_H__
\ No newline at end of file
diff --git a/exynos5/hal/include/sec_utils_v4l2.h b/exynos5/hal/include/sec_utils_v4l2.h
deleted file mode 100644
index b74eaed..0000000
--- a/exynos5/hal/include/sec_utils_v4l2.h
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-/*
- * file sec_utils_v4l2.h
- * brief header file for sec_utils_v4l2.h
- * author Sangwoo, Park(sw5771.park@samsung.com)
- * date 2011/06/02
- *
- * Revision History:
- * - 2010/06/03 : Sangwoo, Park(sw5771.park@samsung.com)
- * Initial version
- *
- * - 2011/12/07 : Hyeonmyeong Choi( hyeon.choi@samsung.com)
- * Add V4L2_PIX_FMT_YVU420M
- *
- */
-
-#ifndef __SAMSUNG_SYSLSI_SEC_COMMON_H__
-#define __SAMSUNG_SYSLSI_SEC_COMMON_H__
-
-//---------------------------------------------------------//
-// Include
-//---------------------------------------------------------//
-
-#include <hardware/hardware.h>
-#include "sec_format.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "videodev2.h"
-
-#ifdef __cplusplus
-}
-#endif
-
-//---------------------------------------------------------//
-// Common structure                                        //
-//---------------------------------------------------------//
-struct ADDRS {
-    unsigned int addr_y;
-    unsigned int addr_cbcr;
-    unsigned int buf_idx;
-    unsigned int reserved;
-};
-
-//---------------------------------------------------------//
-// Common function                                         //
-//---------------------------------------------------------//
-inline int HAL_PIXEL_FORMAT_2_V4L2_PIX(int HAL_PIXEL_FORMAT)
-{
-    int V4L2_PIX = -1;
-
-    switch (HAL_PIXEL_FORMAT) {
-    case HAL_PIXEL_FORMAT_RGBA_8888:
-    case HAL_PIXEL_FORMAT_RGBX_8888:
-        V4L2_PIX = V4L2_PIX_FMT_RGB32;
-        break;
-
-    case HAL_PIXEL_FORMAT_RGB_888:
-        V4L2_PIX = V4L2_PIX_FMT_RGB24;
-        break;
-
-    case HAL_PIXEL_FORMAT_RGB_565:
-        V4L2_PIX = V4L2_PIX_FMT_RGB565;
-        break;
-
-    case HAL_PIXEL_FORMAT_BGRA_8888:
-        V4L2_PIX = V4L2_PIX_FMT_BGR32;
-        break;
-
-    case HAL_PIXEL_FORMAT_RGBA_5551:
-        V4L2_PIX = V4L2_PIX_FMT_RGB555X;
-        break;
-
-    case HAL_PIXEL_FORMAT_RGBA_4444:
-        V4L2_PIX = V4L2_PIX_FMT_RGB444;
-        break;
-
-    case HAL_PIXEL_FORMAT_YV12:
-        V4L2_PIX = V4L2_PIX_FMT_YVU420M;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCbCr_420_P:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL:
-        V4L2_PIX = V4L2_PIX_FMT_YUV420M;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
-        V4L2_PIX = V4L2_PIX_FMT_NV61;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
-        V4L2_PIX = V4L2_PIX_FMT_NV12M;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCbCr_422_I:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
-        V4L2_PIX = V4L2_PIX_FMT_YUYV;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCbCr_422_P:
-        V4L2_PIX = V4L2_PIX_FMT_YUV422P;
-        break;
-
-    case HAL_PIXEL_FORMAT_CbYCrY_422_I:
-    case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
-        V4L2_PIX = V4L2_PIX_FMT_UYVY;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCrCb_422_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
-        V4L2_PIX = V4L2_PIX_FMT_NV16;
-        break;
-
-    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
-        V4L2_PIX = V4L2_PIX_FMT_NV21;
-        break;
-
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
-        V4L2_PIX = V4L2_PIX_FMT_NV12MT;
-        break;
-
-   case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
-        V4L2_PIX = V4L2_PIX_FMT_YVYU;
-        break;
-
-   case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
-        V4L2_PIX = V4L2_PIX_FMT_VYUY;
-        break;
-
-    default:
-        ALOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
-                __func__, HAL_PIXEL_FORMAT);
-        break;
-    }
-
-    return V4L2_PIX;
-}
-
-inline int V4L2_PIX_2_HAL_PIXEL_FORMAT(int V4L2_PIX)
-{
-    int HAL_PIXEL_FORMAT = -1;
-
-    switch (V4L2_PIX) {
-    case V4L2_PIX_FMT_RGB32:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGBA_8888;
-        break;
-
-    case V4L2_PIX_FMT_RGB24:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGB_888;
-        break;
-
-    case V4L2_PIX_FMT_RGB565:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGB_565;
-        break;
-
-    case V4L2_PIX_FMT_BGR32:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_BGRA_8888;
-        break;
-
-    case V4L2_PIX_FMT_RGB555X:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGBA_5551;
-        break;
-
-    case V4L2_PIX_FMT_RGB444:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_RGBA_4444;
-        break;
-
-    case V4L2_PIX_FMT_YUV420:
-    case V4L2_PIX_FMT_YUV420M:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YCbCr_420_P;
-        break;
-
-    case V4L2_PIX_FMT_YVU420:
-    case V4L2_PIX_FMT_YVU420M:
-         HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YV12;
-         break;
-
-    case V4L2_PIX_FMT_NV16:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP;
-        break;
-
-    case V4L2_PIX_FMT_NV12:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP;
-        break;
-
-    case V4L2_PIX_FMT_YUYV:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I;
-        break;
-
-    case V4L2_PIX_FMT_YUV422P:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_YCbCr_422_P;
-        break;
-
-    case V4L2_PIX_FMT_UYVY:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I;
-        break;
-
-    case V4L2_PIX_FMT_NV21:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP;
-        break;
-    case V4L2_PIX_FMT_NV12MT:
-
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED;
-        break;
-
-    case V4L2_PIX_FMT_NV61:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP;
-        break;
-
-    case V4L2_PIX_FMT_YVYU:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I;
-        break;
-
-    case V4L2_PIX_FMT_VYUY:
-        HAL_PIXEL_FORMAT = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I;
-        break;
-
-    default:
-        ALOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
-                __func__, V4L2_PIX);
-        break;
-    }
-
-    return HAL_PIXEL_FORMAT;
-}
-
-#define ALIGN_TO_32B(x)   ((((x) + (1 <<  5) - 1) >>  5) <<  5)
-#define ALIGN_TO_128B(x)  ((((x) + (1 <<  7) - 1) >>  7) <<  7)
-#define ALIGN_TO_8KB(x)   ((((x) + (1 << 13) - 1) >> 13) << 13)
-#define ALIGN(x, a)       (((x) + (a) - 1) & ~((a) - 1))
-
-#define GET_32BPP_FRAME_SIZE(w, h)  (((w) * (h)) << 2)
-#define GET_24BPP_FRAME_SIZE(w, h)  (((w) * (h)) * 3)
-#define GET_16BPP_FRAME_SIZE(w, h)  (((w) * (h)) << 1)
-
-inline unsigned int FRAME_SIZE(int HAL_PIXEL_FORMAT, int w, int h)
-{
-    unsigned int frame_size = 0;
-    unsigned int size       = 0;
-
-    switch (HAL_PIXEL_FORMAT) {
-    // 16bpp
-    case HAL_PIXEL_FORMAT_RGB_565:
-    case HAL_PIXEL_FORMAT_RGBA_5551:
-    case HAL_PIXEL_FORMAT_RGBA_4444:
-        frame_size = GET_16BPP_FRAME_SIZE(w, h);
-        break;
-
-    // 24bpp
-    case HAL_PIXEL_FORMAT_RGB_888:
-        frame_size = GET_24BPP_FRAME_SIZE(w, h);
-        break;
-
-    // 32bpp
-    case HAL_PIXEL_FORMAT_RGBA_8888:
-    case HAL_PIXEL_FORMAT_BGRA_8888:
-    case HAL_PIXEL_FORMAT_RGBX_8888:
-        frame_size = GET_32BPP_FRAME_SIZE(w, h);
-        break;
-
-    // 12bpp
-    case HAL_PIXEL_FORMAT_YV12:
-    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
-    case HAL_PIXEL_FORMAT_YCbCr_420_P:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL:
-    case HAL_PIXEL_FORMAT_YCbCr_420_I:
-    case HAL_PIXEL_FORMAT_CbYCrY_420_I:
-    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
-        size = w * h;
-        frame_size = size + ((size >> 2) << 1);
-        break;
-
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
-        frame_size =   ALIGN_TO_8KB(ALIGN_TO_128B(w) * ALIGN_TO_32B(h))
-                     + ALIGN_TO_8KB(ALIGN_TO_128B(w) * ALIGN_TO_32B(h >> 1));
-        break;
-
-    // 16bpp
-    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
-    case HAL_PIXEL_FORMAT_YCbCr_422_I:
-    case HAL_PIXEL_FORMAT_YCbCr_422_P:
-    case HAL_PIXEL_FORMAT_CbYCrY_422_I:
-    case HAL_PIXEL_FORMAT_YCrCb_422_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
-    case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
-    case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
-        frame_size = GET_16BPP_FRAME_SIZE(w, h);
-        break;
-
-    default:
-        ALOGD("%s::no matching source colorformat(0x%x), w(%d), h(%d) fail\n",
-                __func__, HAL_PIXEL_FORMAT, w, h);
-        break;
-    }
-
-    return frame_size;
-}
-
-#endif //__SAMSUNG_SYSLSI_SEC_COMMON_H__
diff --git a/exynos5/hal/include/ump.h b/exynos5/hal/include/ump.h
deleted file mode 100644
index 487e2c2..0000000
--- a/exynos5/hal/include/ump.h
+++ /dev/null
@@ -1,627 +0,0 @@
-/*
- * This confidential and proprietary software may be used only as
- * authorised by a licensing agreement from ARM Limited
- * (C) COPYRIGHT 2008-2011 ARM Limited
- * ALL RIGHTS RESERVED
- * The entire notice above must be reproduced on all authorised
- * copies and copies may only be made to the extent permitted
- * by a licensing agreement from ARM Limited.
- */
-
-/**
- * @file ump.h
- *
- * This file contains the user space part of the UMP API.
- *
- */
-
-#ifndef _UMP_H_
-#define _UMP_H_
-
-/**
- * @page page_base_ump Unified Memory Provider API
- *
- * UMP(Universal Memory Provider) is an API to allocate memory with some special unique requirements;
- * @li Known physical addresses
- * @li Non-relocatable/pinned
- * @li Won't be paged out
- * @li Shareable between processes (selectable per allocation for security reasons)
- * @li Shareable with multiple hardware devices
- * @li Physically contiguous (optional)
- * @li Extended (not valid with the physically contiguous requirement for obvious reasons)
- *
- * Allocations from UMP can safely be used with hardware devices and other processes.
- * All uses are reference counted, so memory won't be released until all participating hardware devices and processes have released their use of the allocation.
- * This means that even if a process frees memory too early or crashes any hardware using the memory won't corrupt freed memory.
- *
- * Allocations inside a process is represented using an UMP memory handle.
- *
- * Each allocation is represented by a system-wide unique ID (called a secure ID),
- * which can be obtained from a handle and be shared with other processes or given to a device driver.
- *
- * Based on a secure ID a new handle can be created either in kernel space by a driver
- * or in user space by some other process to use the same allocation.
- *
- * Based on the handle a driver in kernel space can obtain information about the physical memory block(s)
- * an allocation consists of and increment or decrement the reference count.
- *
- * Usage in user-space also adds a reference to the memory, but it's managed by the UMP device driver.
- *
- * The user-space reference count is only local to the process, so a process can't by accident decrement
- * the count one time too many and cause the memory to be freed while it's in use by a hardware device.
- *
- * This is all handled by the UMP kernel code, no user-space code cooperation is needed.
- *
- * By default an allocation is only accessible in the same process or what other security boundary the OS uses.
- * If marked as shared it can be accessed in all processes, the kernel space customer defined security filter permitting of course.
- * See @ref ump_dd_security_filter for more information about this security filter.
- *
- * @sa ump_api
- * @sa example_user_api.c
- * @sa example_kernel_api.c
- *
- * @example example_user_api.c
- * @example example_kernel_api.c
- *
- */
-
-/** @defgroup ump_api Unified Memory Provider APIs
- */
-
-/**
- * @addtogroup ump_api
- * @{
- */
-
-/** @defgroup ump_user_space_api UMP User Space API
- * @{ */
-
-
-#include "ump_platform.h"
-#include "ump_common.h"
-#include "ion.h"
-
-#ifndef __KERNEL__
-#include <stdlib.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-#endif
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/**
- * External representation of a UMP handle in user space.
- */
-typedef void * ump_handle;
-
-/**
- * Value to indicate an invalid UMP memory handle.
- */
-#define UMP_INVALID_MEMORY_HANDLE ((ump_handle)0)
-
-/**
- * Opens and initializes the UMP library.
- *
- * This function must be called at least once before calling any other UMP API functions.
- * Each successful open call is reference counted and must be matched with a call to @ref ump_close.
- * It is safe to call @a ump_open after a @a ump_close has terminated a previous session.
- *
- * UMP_ERROR will be returned if:
- *   - the reference count is ULONG_MAX so would overflow.
- *   - the reference count is 0 and the backend fails to open.
- *
- * UMP API: v1 and v2
- * @see ump_close
- *
- * @return UMP_OK indicates success, UMP_ERROR indicates failure.
- */
-UMP_API_EXPORT ump_result ump_open(void) CHECK_RESULT;
-
-
-/**
- * Terminate the UMP library.
- *
- * This must be called once for every successful @ref ump_open. The UMP library is
- * terminated when, and only when, the last open reference to the UMP interface is closed.
- *
- * If this is called while having active allocations or mappings the behavior is undefined.
- *
- * UMP API: v1 and v2
- * @see ump_open
- */
-UMP_API_EXPORT void ump_close(void);
-
-
-/**
- * Retrieves the secure ID for the specified UMP memory.
- *
- * This identifier is unique across the entire system, and uniquely identifies
- * the specified UMP memory allocation. This identifier can later be used through the
- * v2 API:
- * @ref ump_from_secure_id or
- * @ref ump_dd_from_secure_id
- * v1 API:
- * @ref ump_handle_create_from_secure_id or
- * @ref ump_dd_handle_create_from_secure_id
- *
- * functions in order to access this UMP memory, for instance from another process.
- * Unless the allocation was marked as shared the returned ID will only be resolvable in the same process as did the allocation.
- *
- * If called on an @a UMP_INVALID_MEMORY_HANDLE it will return @a UMP_INVALID_SECURE_ID.
- *
- * @note There is a kernel space equivalent function called @ref ump_dd_secure_id_get
- *
- * UMP API: v1 and v2
- *
- * @see ump_dd_secure_id_get
- * v2 API:
- * @see ump_from_secure_id
- * @see ump_dd_from_secure_id
- * v1 API:
- * @see ump_handle_create_from_secure_id
- * @see ump_dd_from_secure_id
- *
- * @param mem Handle to UMP memory.
- *
- * @return Returns the secure ID for the specified UMP memory.
- */
-UMP_API_EXPORT ump_secure_id ump_secure_id_get(const ump_handle mem) CHECK_RESULT;
-
-
-/**
- * Synchronous mapping cache sync operation.
- *
- * Performs the requested CPU side cache sync operations before returning.
- * A clean must be done before the memory is guaranteed to be visible in main memory.
- * Any device-specific cache clean/invalidate must be done in combination with this routine, if needed.
- * Function returns cache status for the allocation.
- *
- * Example:
- * @code
- * 	ump_cpu_msync_now(handle, UMP_MSYNC_CLEAN, ptr, size);
- * 	device_invalidate(...);
- * 	// ... run device ...
- * 	device_clean(...);
- * 	ump_cpu_msync_now(handle, UMP_MSYNC_CLEAN_AND_INVALIDATE, ptr, size);
- * 	// ... safe to access on the cpu side again ...
- * @endcode
- *
- *
- * Calls to operate on an @a UMP_INVALID_MEMORY_HANDLE will result in undefined behavior.
- * Debug builds will assert on this.
- *
- * If @a address is not inside a mapping previously obtained from the @a ump_handle provided results in undefined behavior.
- * If @a address combined with @a size results on reaching beyond the end of the buffer results in undefined behavior.
- *
- * UMP API: v1 and v2
- * @param mem Handle to UMP memory
- * @param op Cache operation to perform
- * @param[in] address The CPU address where to start the sync operation, this can be at an offset from the start of the allocation.
- * @param size The number of bytes to be synced.
- *
- * @return Returns 1 if cache is enabled, 0 if cache is disabled for the given allocation.
- *
- */
-UMP_API_EXPORT int ump_cpu_msync_now(ump_handle mem, ump_cpu_msync_op op, void * address, size_t size);
-
-
-#ifndef UMP_BLOCK_V2_API
-
-/**
- * Allocate a buffer.
- * The life-time of the allocation is controlled by a reference count.
- * The reference count of the returned buffer is set to 1.
- * The memory will be freed once the reference count reaches 0.
- * Use @ref ump_retain and @ref ump_release to control the reference count.
- * The contens of the memory returned will be zero initialized.
- *
- * The @ref UMP_V1_API_DEFAULT_ALLOCATION_FLAGS can be used
- * to create a buffer that can be shared with v1 API applications.
- * The allocation will be limited to 32-bit PA.
- *
- * The @ref UMP_CONSTRAINT_UNCACHED flag disables cache for all cpu mappings for this allocation.
- *
- * UMP API: v2
- * @param size Number of bytes to allocate. Will be padded up to a multiple of the page size.
- * @param flags Bit-wise OR of zero or more of the allocation flag bits.
- * @return Handle to the new allocation, or @a UMP_INVALID_MEMORY_HANDLE on allocation failure.
- */
-UMP_API_EXPORT ump_handle ump_allocate_64(u64 size, ump_alloc_flags flags) CHECK_RESULT;
-
-
-/**
- * Creates a handle based on a shared UMP memory allocation.
- *
- * The usage of UMP memory is reference counted, so this will increment the reference
- * count by one for the specified UMP memory.
- *
- * If called on an @a UMP_INVALID_SECURE_ID this will return @a UMP_INVALID_MEMORY_HANDLE.
- * If called on an non-shared allocation and this is a different process @a UMP_INVALID_MEMORY_HANDLE will be returned.
- *
- * Use @ref ump_release when there is no longer any
- * use for the retrieved handle.
- *
- * @note There is a kernel space equivalent function called @ref ump_dd_from_secure_id
- *
- * UMP API: v2
- * @see ump_release
- * @see ump_dd_from_secure_id
- *
- * @param secure_id The secure ID of the UMP memory to open, that can be retrieved using the @ref ump_secure_id_get function.
- *
- * @return @a UMP_INVALID_MEMORY_HANDLE indicates failure, otherwise a valid handle is returned.
- */
-UMP_API_EXPORT ump_handle ump_from_secure_id(ump_secure_id secure_id) CHECK_RESULT;
-
-
-/**
- * 64 bit version of @ref ump_size_get. Retrieves the actual size of the specified UMP memory.
- *
- * The size is reported in bytes, and is typically a multiple of the page size.
- * If called on an @a UMP_INVALID_MEMORY_HANDLE will result in undefined behavior.
- * Debug builds will assert on this.
- *
- * @note There is a kernel space equivalent function called @ref ump_dd_size_get_64
- *
- * UMP API: v2
- * @see ump_dd_size_get_64
- *
- * @param mem Handle to UMP memory.
- *
- * @return Returns the allocated 64-bit size of the specified UMP memory, in bytes.
- */
-UMP_API_EXPORT u64 ump_size_get_64(const ump_handle mem) CHECK_RESULT;
-
-
-/**
- * Retrieves a memory mapped pointer to the specified UMP memory.
- *
- * This function retrieves a memory mapped pointer to the specified UMP memory, that can be used by the CPU.@n
- * Every successful call to @a ump_map must be matched with a call to @ref ump_unmap when the mapping is no longer needed.
- *
- * An offset and/or size resulting in going beyond the end of the buffer will case  the function to return NULL.
- *
- * Calling on @a UMP_INVALID_MEMORY_HANDLE results in undefined behavior.
- * Debug builds will assert on this.
- *
- * @note Systems without a MMU for the CPU only return the physical address, because no mapping is required.
- *
- * UMP API: v2
- * @see ump_unmap
- *
- * @param mem Handle to UMP memory.
- * @param offset An offset at which the mapping begins.
- * @param size The number of bytes to map. Passing 0 does not retrieve a memory mapped
- * pointer - instead NULL is returned.
- *
- * @return NULL indicates failure, otherwise a CPU mapped pointer is returned.
- */
-UMP_API_EXPORT void * ump_map(ump_handle mem, u64 offset, size_t size) CHECK_RESULT;
-
-
-/**
- * Releases a previously mapped pointer to the specified UMP memory.
- *
- * Every successful call to @ref ump_map must be matched with a call to @a ump_unmap when the mapping is no longer needed.
- *
- * The following results in undefined behavior:
- * - Called with an address not returned from @ref ump_map
- * - Called with a different @a ump_handle than was used to obtain the pointer
- * - Called with a different @a size than was used to obtain the pointer
- *
- * @note Systems without a MMU must still implement this function, even though no unmapping should be needed.
- *
- * UMP API: v2
- * @param mem Handle to UMP memory.
- * @param[in] address The CPU virtual address returned by @ref ump_map
- * @param size Size matching argument given to ump_map
- */
-UMP_API_EXPORT void ump_unmap(ump_handle mem, void* address, size_t size);
-
-
-/**
- * Adds an extra reference to the specified UMP memory.
- *
- * This function adds an extra reference to the specified UMP memory. This function should
- * be used every time a UMP memory handle is duplicated, that is, assigned to another ump_handle
- * variable. The function @ref ump_release must then be used
- * to release each copy of the UMP memory handle.
- *
- * It's safe to call this on both shared and non-shared handles.
- * Calling on an @a UMP_INVALID_MEMORY_HANDLE results in undefined behavior.
- * Debug builds will assert on this.
- *
- * @note You are not required to call @ref ump_retain
- * for UMP handles returned from
- * @ref ump_from_secure_id,
- * because these handles are already reference counted by this function.
- *
- * @note There is a kernel space equivalent function called @ref ump_dd_retain
- *
- * UMP API: v2
- * @see ump_dd_retain
- *
- * @param mem Handle to UMP memory.
- * @return UMP_OK indicates success, UMP_ERROR indicates failure.
- */
-UMP_API_EXPORT ump_result ump_retain(ump_handle mem);
-
-
-/**
- * Releases a reference from the specified UMP memory.
- *
- * This function should be called once for every reference to the UMP memory handle.
- * When the last reference is released, all resources associated with this UMP memory
- * handle are freed.
- *
- * One can only call ump_release when matched with a successful ump_retain, ump_allocate_64 or ump_from_secure_id
- * It's safe to call this on both shared and non-shared handles.
- * If called on an @a UMP_INVALID_MEMORY_HANDLE it will return early.
- *
- * @note There is a kernel space equivalent function called @ref ump_dd_release
- *
- * UMP API: v2
- * @see ump_release
- *
- * @param mem Handle to UMP memory.
- */
-UMP_API_EXPORT void ump_release(ump_handle mem);
-
-
-/**
- * Import external memory into UMP.
- *
- * This function creates a ump_handle wrapping memory provided by some external source.
- *
- * For reference counted types the returned handle represents one new reference,
- * which must be freed using @a ump_release.
- * The handle passed in still holds its reference and can still be used and must be released
- * as it would be normally.
- *
- * For ownership based types the returned handle has claimed the ownership which will be released
- * with @a ump_release.
- * The handle passed in is no longer valid.
- *
- * A pointer to the handle type is required, not the type it self.
- *
- * The flags are used in the same way as for @a ump_allocate_64, except that these flags are ignored:
- * @li UMP_CONSTRAINT_32BIT_ADDRESSABLE
- * @li UMP_CONSTRAINT_PHYSICALLY_LINEAR
- *
- * The returned UMP handle can be used as any other ump_handle.
- *
- * Example for UMP_EXTERNAL_MEM_TYPE_ION:
- *
- * @code
- * ump_handle h;
- * ump_alloc_flags flags = get_requested_flags();
- * int fd = ion_fd_get();
- * h = ump_import(UMP_EXTERNAL_MEM_TYPE_ION, &fd, flags);
- * // native release
- * close(fd);
- * ...
- * ump_release(h);
- * @endcode
- *
- * Example for a generic ownership based type:
- *
- * @code
- * ump_handle h;
- * ump_alloc_flags = get_requested_flags();
- * type t = type_claim();
- * h = ump_import(UMP_OWNERSHIP_BASED_TYPE, &t, flags);
- * // native handle no longer valid
- * t = INVALID;
- * ...
- * ump_release(h);
- * @endcode
- *
- * UMP API: v2
- * @see ump_release
- *
- * @param type Type of external memory to import
- * @param phandle Pointer to the handle to import.
- * @param flags Bit-wise OR of zero or more of the allocation flag bits.
- * @return Handle wrapping the imported memory, or @a UMP_INVALID_MEMORY_HANDLE on import failure.
- */
-UMP_API_EXPORT ump_handle ump_import(enum ump_external_memory_type type, void * phandle, ump_alloc_flags flags) CHECK_RESULT;
-
-#endif /* UMP_BLOCK_V2_API */
-
-/** @name UMP v1 API
- * Functions provided to support compatibility with UMP v1 API
- *
- * You should use v1 API only with handles created with @ref ump_ref_drv_allocate
- * and @ref ump_handle_create_from_secure_id.
- * Using v1 API for handles created with v2 API can cause undefined behavior.
- *
- *@{
- */
-
-#ifndef UMP_BLOCK_V1_API
-
-/** Allocate an UMP handle containing a memory buffer.
- *
- * If usage is UMP_REF_DRV_CONSTRAINT_USE_CACHE, the allocation is mapped as cached by the cpu.
- * If it is UMP_REF_DRV_CONSTRAINT_NONE it is mapped as noncached.
- * The flag UMP_REF_DRV_CONSTRAINT_PHYSICALLY_LINEAR is not supported.
- *
- * UMP API: v1
- * @param size The minimum size for the allocation.
- * @param usage The allocation constraints.
- */
-
-UMP_API_EXPORT ump_handle ump_ref_drv_allocate(unsigned long size, ump_alloc_constraints usage);
-
-
-/**
- * Retrieves the actual size of the specified UMP memory.
- *
- * The size is reported in bytes, and is typically page aligned.
- *
- * @note There is a kernel space equivalent function called @ref ump_dd_size_get "ump_dd_size_get"
- *
- * UMP API: v1
- * @see ump_dd_size_get
- *
- * @param mem Handle to UMP memory.
- *
- * @return Returns the allocated size of the specified UMP memory, in bytes.
- */
-UMP_API_EXPORT unsigned long ump_size_get(ump_handle mem) CHECK_RESULT;
-
-
-/**
- * Retrieves a handle to allocated UMP memory.
- *
- * The usage of UMP memory is reference counted, so this will increment the reference
- * count by one for the specified UMP memory.
- * Use @ref ump_reference_release "ump_reference_release" when there is no longer any
- * use for the retrieved handle.
- *
- * @note There is a kernel space equivalent function called @ref ump_dd_handle_create_from_secure_id "ump_dd_handle_create_from_secure_id"
- *
- * UMP API: v1
- * @see ump_reference_release
- * @see ump_dd_handle_create_from_secure_id
- *
- * @param secure_id The secure ID of the UMP memory to open, that can be retrieved using the @ref ump_secure_id_get "ump_secure_id_get " function.
- *
- * @return UMP_INVALID_MEMORY_HANDLE indicates failure, otherwise a valid handle is returned.
- */
-UMP_API_EXPORT ump_handle ump_handle_create_from_secure_id(ump_secure_id secure_id) CHECK_RESULT;
-
-
-/**
- * Adds an extra reference to the specified UMP memory.
- *
- * This function adds an extra reference to the specified UMP memory. This function should
- * be used every time a UMP memory handle is duplicated, that is, assigned to another ump_handle
- * variable. The function @ref ump_reference_release "ump_reference_release" must then be used
- * to release each copy of the UMP memory handle.
- *
- * @note You are not required to call @ref ump_reference_add "ump_reference_add"
- * for UMP handles returned from
- * @ref ump_handle_create_from_secure_id "ump_handle_create_from_secure_id",
- * because these handles are already reference counted by this function.
- *
- * @note There is a kernel space equivalent function called @ref ump_dd_reference_add "ump_dd_reference_add"
- *
- * UMP API: v1
- * @see ump_dd_reference_add
- *
- * @param mem Handle to UMP memory.
- */
-UMP_API_EXPORT void ump_reference_add(ump_handle mem);
-
-
-/**
- * Releases a reference from the specified UMP memory.
- *
- * This function should be called once for every reference to the UMP memory handle.
- * When the last reference is released, all resources associated with this UMP memory
- * handle are freed.
- *
- * @note There is a kernel space equivalent function called @ref ump_dd_reference_release "ump_dd_reference_release"
- *
- * UMP API: v1
- * @see ump_dd_reference_release
- *
- * @param mem Handle to UMP memory.
- */
-UMP_API_EXPORT void ump_reference_release(ump_handle mem);
-
-
-/**
- * Retrieves a memory mapped pointer to the specified UMP memory.
- *
- * This function retrieves a memory mapped pointer to the specified UMP memory,
- * that can be used by the CPU. Every successful call to
- * @ref ump_mapped_pointer_get "ump_mapped_pointer_get" is reference counted,
- * and must therefor be followed by a call to
- * @ref ump_mapped_pointer_release "ump_mapped_pointer_release " when the
- * memory mapping is no longer needed.
- *
- * @note Systems without a MMU for the CPU only return the physical address, because no mapping is required.
- *
- * UMP API: v1
- * @see ump_mapped_pointer_release
- *
- * @param mem Handle to UMP memory.
- *
- * @return NULL indicates failure, otherwise a CPU mapped pointer is returned.
- */
-UMP_API_EXPORT void * ump_mapped_pointer_get(ump_handle mem);
-
-
-/**
- * Releases a previously mapped pointer to the specified UMP memory.
- *
- * The CPU mapping of the specified UMP memory memory is reference counted,
- * so every call to @ref ump_mapped_pointer_get "ump_mapped_pointer_get" must
- * be matched with a call to this function when the mapping is no longer needed.
- *
- * The CPU mapping is not removed before all references to the mapping is released.
- *
- * UMP API: v1
- * @note Systems without a MMU must still implement this function, even though no unmapping should be needed.
- *
- * @param mem Handle to UMP memory.
- */
-UMP_API_EXPORT void ump_mapped_pointer_release(ump_handle mem);
-
-
-/**
- * Read from specified UMP memory.
- *
- * Another way of reading from (and writing to) UMP memory is to use the
- * @ref ump_mapped_pointer_get "ump_mapped_pointer_get" to retrieve
- * a CPU mapped pointer to the memory.
- *
- * UMP API: v1
- * @see ump_mapped_pointer_get
- *
- * @param dst Destination buffer.
- * @param src Handle to UMP memory to read from.
- * @param offset Where to start reading, given in bytes.
- * @param length How much to read, given in bytes.
- */
-UMP_API_EXPORT void ump_read(void * dst, ump_handle src, unsigned long offset, unsigned long length);
-
-
-/**
- * Write to specified UMP memory.
- *
- * Another way of writing to (and reading from) UMP memory is to use the
- * @ref ump_mapped_pointer_get "ump_mapped_pointer_get" to retrieve
- * a CPU mapped pointer to the memory.
- *
- * UMP API: v1
- * @see ump_mapped_pointer_get
- *
- * @param dst Handle to UMP memory to write to.
- * @param offset Where to start writing, given in bytes.
- * @param src Buffer to read from.
- * @param length How much to write, given in bytes.
- */
-UMP_API_EXPORT void ump_write(ump_handle dst, unsigned long offset, const void * src, unsigned long length);
-
-#endif /* UMP_BLOCK_V1_API */
-
-/* @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-/** @} */ /* end group ump_user_space_api */
-
-/** @} */ /* end group ump_api */
-
-#endif /* _UMP_H_ */
diff --git a/exynos5/hal/include/ump_common.h b/exynos5/hal/include/ump_common.h
deleted file mode 100644
index 8fdeef1..0000000
--- a/exynos5/hal/include/ump_common.h
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- *
- * (C) COPYRIGHT 2010-2011 ARM Limited. All rights reserved.
- *
- * This program is free software and is provided to you under the terms of the GNU General Public License version 2
- * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
- * 
- * A copy of the licence is included with the program, and can also be obtained from Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- * 
- */
-
-
-
-/**
- * @file ump_common.h
- *
- * This file contains some common enum values used both in both the user and kernel space side of UMP.
- */
-
-#ifndef _UMP_COMMON_H_
-#define _UMP_COMMON_H_
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <stdint.h>
-#endif
-
-/**
- * Values to identify major and minor version of UMP
- */
-#define UMP_VERSION_MAJOR 2
-#define UMP_VERSION_MINOR 0
-
-/**
- * Typedef for a secure ID, a system wide identifier for UMP memory buffers.
- */
-typedef uint32_t ump_secure_id;
-
-/**
- * Value to indicate an invalid secure Id.
- */
-#define UMP_INVALID_SECURE_ID  ((ump_secure_id)-1)
-
-/**
- * UMP error codes.
- */
-typedef enum
-{
-	UMP_OK    = 0, /**< indicates success */
-	UMP_ERROR = 1  /**< indicates failure */
-} ump_result;
-
-/**
- * Allocation flag bits.
- *
- * ump_allocate accepts zero or more flags to specify the type of memory to allocate and how to expose it to devices.
- *
- * For each supported device there are 4 flags to control access permissions and give usage characteristic hints to optimize the allocation/mapping.
- * They are;
- * @li @a UMP_PROT_<device>_RD   read permission
- * @li @a UMP_PROT_<device>_WR   write permission
- * @li @a UMP_HINT_<device>_RD   read often
- * @li @a UMP_HINT_<device>_WR   written often
- *
- * 5 devices are currently supported, with a device being the CPU itself.
- * The other 4 devices will be mapped to real devices per SoC design.
- * They are just named W,X,Y,Z by UMP as it has no knowledge of their real names/identifiers.
- * As an example device W could be a camera device while device Z could be an ARM GPU device, leaving X and Y unused.
- *
- * 2 additional flags control the allocation;
- * @li @a UMP_CONSTRAINT_PHYSICALLY_LINEAR   the allocation must be physical linear. Typical for devices without an MMU and no IOMMU to help it. 
- * @li @a UMP_PROT_SHAREABLE                 the allocation can be shared with other processes on the system. Without this flag the returned allocation won't be resolvable in other processes.
- *
- * All UMP allocation are growable unless they're @a UMP_PROT_SHAREABLE.
- * The hint bits should be used to indicate the access pattern so the driver can select the most optimal memory type and cache settings based on the what the system supports.
- */
-typedef enum
-{
-	/* Generic helpers */
-	UMP_PROT_DEVICE_RD = (1u << 0),
-	UMP_PROT_DEVICE_WR = (1u << 1),
-	UMP_HINT_DEVICE_RD = (1u << 2),
-	UMP_HINT_DEVICE_WR = (1u << 3),
-	UMP_DEVICE_MASK = 0xF,
-	UMP_DEVICE_CPU_SHIFT = 0,
-	UMP_DEVICE_W_SHIFT = 4,
-	UMP_DEVICE_X_SHIFT = 8,
-	UMP_DEVICE_Y_SHIFT = 12,
-	UMP_DEVICE_Z_SHIFT = 16,
-
-	/* CPU protection and hints. */
-	UMP_PROT_CPU_RD = (1u <<  0),
-	UMP_PROT_CPU_WR = (1u <<  1),
-	UMP_HINT_CPU_RD = (1u <<  2),
-	UMP_HINT_CPU_WR = (1u <<  3),
-
-	/* device W */
-	UMP_PROT_W_RD = (1u <<  4),
-	UMP_PROT_W_WR = (1u <<  5),
-	UMP_HINT_W_RD = (1u <<  6),
-	UMP_HINT_W_WR = (1u <<  7),
-
-	/* device X */
-	UMP_PROT_X_RD = (1u <<  8),
-	UMP_PROT_X_WR = (1u <<  9),
-	UMP_HINT_X_RD = (1u << 10),
-	UMP_HINT_X_WR = (1u << 11),
-	
-	/* device Y */
-	UMP_PROT_Y_RD = (1u << 12),
-	UMP_PROT_Y_WR = (1u << 13),
-	UMP_HINT_Y_RD = (1u << 14),
-	UMP_HINT_Y_WR = (1u << 15),
-
-	/* device Z */
-	UMP_PROT_Z_RD = (1u << 16),
-	UMP_PROT_Z_WR = (1u << 17),
-	UMP_HINT_Z_RD = (1u << 18),
-	UMP_HINT_Z_WR = (1u << 19),
-
-	/* 20-26 reserved for future use */
-	UMPP_ALLOCBITS_UNUSED = (0x7Fu << 20),
-	/** Allocations marked as @ UMP_CONSTRAINT_UNCACHED won't be mapped as cached by the cpu  */
-	UMP_CONSTRAINT_UNCACHED = (1u << 27),
-	/** Require 32-bit physically addressable memory */
-	UMP_CONSTRAINT_32BIT_ADDRESSABLE = (1u << 28),
-	/** For devices without an MMU and with no IOMMU assistance. */
-	UMP_CONSTRAINT_PHYSICALLY_LINEAR = (1u << 29),
-	/** Shareable must be set to allow the allocation to be used by other processes, the default is non-shared */
-	UMP_PROT_SHAREABLE = (1u << 30)
-	/* (1u << 31) should not be used to ensure compiler portability */
-} ump_allocation_bits;
-
-/**
- * ump_allocation_bits combination argument type.
- *
- * Type used to pass zero or more bits from the @ref ump_allocation_bits enum
- */
-typedef uint32_t ump_alloc_flags;
-
-
-/**
- *  Default allocation flags for UMP v1 compatible allocations.
- */
-#define UMP_V1_API_DEFAULT_ALLOCATION_FLAGS		UMP_PROT_CPU_RD | UMP_PROT_CPU_WR | \
-												UMP_PROT_W_RD | UMP_PROT_W_WR |	\
-												UMP_PROT_X_RD | UMP_PROT_X_WR |	\
-												UMP_PROT_Y_RD | UMP_PROT_Y_WR |	\
-												UMP_PROT_Z_RD | UMP_PROT_Z_WR |	\
-												UMP_PROT_SHAREABLE |	\
-												UMP_CONSTRAINT_32BIT_ADDRESSABLE
-
-/**
- * CPU cache sync operations.
- *
- * Cache synchronization operations to pass to @ref ump_cpu_msync_now
- */
-enum
-{
-	/** 
-	 * Cleans any dirty cache lines to main memory, but the data will still be available in the cache.
-	 * After a clean the contents of memory is considered to be "owned" by the device.
-	 * */
-	UMP_MSYNC_CLEAN = 1,
-
-	/** Cleans any dirty cache lines to main memory and Ejects all lines from the cache.
-	 * After an clean&invalidate the contents of memory is considered to be "owned" by the CPU.
-	 * Any subsequent access will fetch data from main memory.
-	 * 
-	 * @note Due to CPUs doing speculative prefetching a UMP_MSYNC_CLEAN_AND_INVALIDATE must be done before and after interacting with hardware.
-	 * */
-	UMP_MSYNC_CLEAN_AND_INVALIDATE
-
-};
-
-typedef u32 ump_cpu_msync_op;
-
-/**
- * Memory import types supported.
- * If new import types are added they will appear here.
- * They must be added before UMPP_EXTERNAL_MEM_COUNT and
- * must be assigned an explicit sequantial number.
- *
- * @li UMP_EXTERNAL_MEM_TYPE_ION - Import an ION allocation
- *                                 Takes a int* (pointer to a file descriptor)
- *                                 Another ION reference is taken which is released on the final ump_release
- */
-enum ump_external_memory_type
-{
-	UMPP_EXTERNAL_MEM_TYPE_UNUSED = 0, /* reserve type 0 */
-	UMP_EXTERNAL_MEM_TYPE_ION = 1,
-	UMPP_EXTERNAL_MEM_COUNT
-};
-
-/** @name UMP v1 API
- *
- *@{
- */
-
-/**
- * Allocation constraints.
- *
- * Allocation flags to pass @ref ump_ref_drv_allocate
- *
- * UMP v1 API only.
- */
-typedef enum
-{
-	/** the allocation is mapped as noncached. */
-	UMP_REF_DRV_CONSTRAINT_NONE = 0,
-	/** not supported. */
-	UMP_REF_DRV_CONSTRAINT_PHYSICALLY_LINEAR = 1,
-	/** the allocation is mapped as cached by the cpu. */
-	UMP_REF_DRV_CONSTRAINT_USE_CACHE = 4
-} ump_alloc_constraints;
-
-/* @} */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* _UMP_COMMON_H_ */
diff --git a/exynos5/hal/include/ump_platform.h b/exynos5/hal/include/ump_platform.h
deleted file mode 100644
index 31f9343..0000000
--- a/exynos5/hal/include/ump_platform.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * This confidential and proprietary software may be used only as
- * authorised by a licensing agreement from ARM Limited
- * (C) COPYRIGHT 2008-2010 ARM Limited
- * ALL RIGHTS RESERVED
- * The entire notice above must be reproduced on all authorised
- * copies and copies may only be made to the extent permitted
- * by a licensing agreement from ARM Limited.
- */
-
-/**
- * @file ump_platform.h
- *
- * This file should define UMP_API_EXPORT,
- * which dictates how the UMP user space API should be exported/imported.
- * Modify this file, if needed, to match your platform setup.
- */
-
-
-#ifndef _UMP_PLATFORM_H_
-#define _UMP_PLATFORM_H_
-
-#include "malisw/mali_stdtypes.h"
-
-/** @addtogroup ump_user_space_api
- * @{ */
-
-/**
- * A define which controls how UMP user space API functions are imported and exported.
- *
- * Functions exported by the driver is tagged with UMP_API_EXPORT to allow
- * the compiler/build system/OS loader to detect and handle functions which is to be exported/imported from a shared library. @n
- * This define should be set by the implementor of the UMP API to match their needs if needed.
- *
- * Typical usage example in the driver:
- *
- * UMP_API_EXPORT void my_api_call(void);
- */
-
-#if defined(_WIN32)
-
-#define UMP_API_EXPORT
-
-#elif defined(__SYMBIAN32__)
-
-#define UMP_API_EXPORT IMPORT_C
-
-#else
-
-#define UMP_API_EXPORT
-
-#endif
-
-/** @} */ /* end group ump_user_space_api */
-
-
-#endif /* _UMP_PLATFORM_H_ */
diff --git a/exynos5/hal/include/ump_ref_drv.h b/exynos5/hal/include/ump_ref_drv.h
deleted file mode 100644
index 6320f1d..0000000
--- a/exynos5/hal/include/ump_ref_drv.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * This confidential and proprietary software may be used only as
- * authorised by a licensing agreement from ARM Limited
- * (C) COPYRIGHT 2009-2010 ARM Limited
- * ALL RIGHTS RESERVED
- * The entire notice above must be reproduced on all authorised
- * copies and copies may only be made to the extent permitted
- * by a licensing agreement from ARM Limited.
- */
-
-/**
- * @file ump_ref_drv.h
- *
- * Reference driver extensions to the UMP user space API for allocating UMP memory
- */
-
-#ifndef _UNIFIED_MEMORY_PROVIDER_REF_DRV_H_
-#define _UNIFIED_MEMORY_PROVIDER_REF_DRV_H_
-
-#include "ump.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef enum {
-    /* This enum must match with the IOCTL enum in ump_ioctl.h */
-    UMP_REF_DRV_CONSTRAINT_NONE = 0,
-    UMP_REF_DRV_CONSTRAINT_PHYSICALLY_LINEAR = 1,
-    /* This enum is included by samsung */
-    UMP_REF_DRV_CONSTRAINT_USE_CACHE = 128,
-} ump_alloc_constraints;
-
-/** Allocate an UMP handle containing a memory buffer.
- * Input: Size: The minimum size for the allocation.
- * Usage: If this is UMP_REF_DRV_CONSTRAINT_USE_CACHE, the allocation is mapped as cached by the cpu.
- *        If it is UMP_REF_DRV_CONSTRAINT_NONE it is mapped as noncached.
- *        The flag UMP_REF_DRV_CONSTRAINT_PHYSICALLY_LINEAR is not supported.*/
-UMP_API_EXPORT ump_handle ump_ref_drv_allocate(unsigned long size, ump_alloc_constraints usage);
-
-UMP_API_EXPORT ump_handle ump_ref_drv_ion_import(int ion_fd, ump_alloc_constraints constraints);
-typedef enum {
-	UMP_MSYNC_CLEAN = 0 ,
-	UMP_MSYNC_CLEAN_AND_INVALIDATE = 1,
-	UMP_MSYNC_READOUT_CACHE_ENABLED = 128,
-} ump_cpu_msync_op;
-
-/** Flushing cache for an ump_handle.
- * The function will always CLEAN_AND_INVALIDATE as long as the \a op is not UMP_MSYNC_READOUT_CACHE_ENABLED.
- * If so it will only report back if the given ump_handle is cacheable.
- * At the momement the implementation does not use \a address or \a size.
- * Return value is 1 if cache is enabled, and 0 if it is disabled for the given allocation.*/
-UMP_API_EXPORT int ump_cpu_msync_now(ump_handle mem, ump_cpu_msync_op op, void* address, int size);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*_UNIFIED_MEMORY_PROVIDER_REF_DRV_H_ */
diff --git a/exynos5/hal/include/v4l2-mediabus.h b/exynos5/hal/include/v4l2-mediabus.h
deleted file mode 100644
index 1a13cf3..0000000
--- a/exynos5/hal/include/v4l2-mediabus.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Media Bus API header
- *
- * Copyright (C) 2009, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __LINUX_V4L2_MEDIABUS_H
-#define __LINUX_V4L2_MEDIABUS_H
-
-#include <linux/types.h>
-#include <linux/videodev2.h>
-
-/*
- * These pixel codes uniquely identify data formats on the media bus. Mostly
- * they correspond to similarly named V4L2_PIX_FMT_* formats, format 0 is
- * reserved, V4L2_MBUS_FMT_FIXED shall be used by host-client pairs, where the
- * data format is fixed. Additionally, "2X8" means that one pixel is transferred
- * in two 8-bit samples, "BE" or "LE" specify in which order those samples are
- * transferred over the bus: "LE" means that the least significant bits are
- * transferred first, "BE" means that the most significant bits are transferred
- * first, and "PADHI" and "PADLO" define which bits - low or high, in the
- * incomplete high byte, are filled with padding bits.
- *
- * The pixel codes are grouped by type, bus_width, bits per component, samples
- * per pixel and order of subsamples. Numerical values are sorted using generic
- * numerical sort order (8 thus comes before 10).
- *
- * As their value can't change when a new pixel code is inserted in the
- * enumeration, the pixel codes are explicitly given a numerical value. The next
- * free values for each category are listed below, update them when inserting
- * new pixel codes.
- */
-enum v4l2_mbus_pixelcode {
-	V4L2_MBUS_FMT_FIXED = 0x0001,
-
-	/* RGB - next is 0x1009 */
-	V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE = 0x1001,
-	V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE = 0x1002,
-	V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE = 0x1003,
-	V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE = 0x1004,
-	V4L2_MBUS_FMT_BGR565_2X8_BE = 0x1005,
-	V4L2_MBUS_FMT_BGR565_2X8_LE = 0x1006,
-	V4L2_MBUS_FMT_RGB565_2X8_BE = 0x1007,
-	V4L2_MBUS_FMT_RGB565_2X8_LE = 0x1008,
-	V4L2_MBUS_FMT_XRGB8888_4X8_LE = 0x1009,
-
-	/* YUV (including grey) - next is 0x2014 */
-	V4L2_MBUS_FMT_Y8_1X8 = 0x2001,
-	V4L2_MBUS_FMT_UYVY8_1_5X8 = 0x2002,
-	V4L2_MBUS_FMT_VYUY8_1_5X8 = 0x2003,
-	V4L2_MBUS_FMT_YUYV8_1_5X8 = 0x2004,
-	V4L2_MBUS_FMT_YVYU8_1_5X8 = 0x2005,
-	V4L2_MBUS_FMT_UYVY8_2X8 = 0x2006,
-	V4L2_MBUS_FMT_VYUY8_2X8 = 0x2007,
-	V4L2_MBUS_FMT_YUYV8_2X8 = 0x2008,
-	V4L2_MBUS_FMT_YVYU8_2X8 = 0x2009,
-	V4L2_MBUS_FMT_Y10_1X10 = 0x200a,
-	V4L2_MBUS_FMT_YUYV10_2X10 = 0x200b,
-	V4L2_MBUS_FMT_YVYU10_2X10 = 0x200c,
-	V4L2_MBUS_FMT_Y12_1X12 = 0x2013,
-	V4L2_MBUS_FMT_UYVY8_1X16 = 0x200f,
-	V4L2_MBUS_FMT_VYUY8_1X16 = 0x2010,
-	V4L2_MBUS_FMT_YUYV8_1X16 = 0x2011,
-	V4L2_MBUS_FMT_YVYU8_1X16 = 0x2012,
-	V4L2_MBUS_FMT_YUV8_1X24	= 0x2014,
-	V4L2_MBUS_FMT_YUYV10_1X20 = 0x200d,
-	V4L2_MBUS_FMT_YVYU10_1X20 = 0x200e,
-
-	/* Bayer - next is 0x3015 */
-	V4L2_MBUS_FMT_SBGGR8_1X8 = 0x3001,
-	V4L2_MBUS_FMT_SGBRG8_1X8 = 0x3013,
-	V4L2_MBUS_FMT_SGRBG8_1X8 = 0x3002,
-	V4L2_MBUS_FMT_SRGGB8_1X8 = 0x3014,
-	V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8 = 0x300b,
-	V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8 = 0x300c,
-	V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8 = 0x3009,
-	V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8 = 0x300d,
-	V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE = 0x3003,
-	V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE = 0x3004,
-	V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE = 0x3005,
-	V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE = 0x3006,
-	V4L2_MBUS_FMT_SBGGR10_1X10 = 0x3007,
-	V4L2_MBUS_FMT_SGBRG10_1X10 = 0x300e,
-	V4L2_MBUS_FMT_SGRBG10_1X10 = 0x300a,
-	V4L2_MBUS_FMT_SRGGB10_1X10 = 0x300f,
-	V4L2_MBUS_FMT_SBGGR12_1X12 = 0x3008,
-	V4L2_MBUS_FMT_SGBRG12_1X12 = 0x3010,
-	V4L2_MBUS_FMT_SGRBG12_1X12 = 0x3011,
-	V4L2_MBUS_FMT_SRGGB12_1X12 = 0x3012,
-
-	/* JPEG compressed formats - next is 0x4002 */
-	V4L2_MBUS_FMT_JPEG_1X8 = 0x4001,
-};
-
-/**
- * struct v4l2_mbus_framefmt - frame format on the media bus
- * @width:	frame width
- * @height:	frame height
- * @code:	data format code (from enum v4l2_mbus_pixelcode)
- * @field:	used interlacing type (from enum v4l2_field)
- * @colorspace:	colorspace of the data (from enum v4l2_colorspace)
- */
-struct v4l2_mbus_framefmt {
-	__u32			width;
-	__u32			height;
-	__u32			code;
-	__u32			field;
-	__u32			colorspace;
-	__u32			reserved[7];
-};
-
-#endif
diff --git a/exynos5/hal/include/v4l2-subdev.h b/exynos5/hal/include/v4l2-subdev.h
deleted file mode 100644
index f5dd9a1..0000000
--- a/exynos5/hal/include/v4l2-subdev.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * V4L2 subdev userspace API
- *
- * Copyright (C) 2010 Nokia Corporation
- *
- * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
- *	     Sakari Ailus <sakari.ailus@iki.fi>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __LINUX_V4L2_SUBDEV_H
-#define __LINUX_V4L2_SUBDEV_H
-
-#include <linux/ioctl.h>
-#include <linux/types.h>
-#include "v4l2-mediabus.h"
-
-/**
- * enum v4l2_subdev_format_whence - Media bus format type
- * @V4L2_SUBDEV_FORMAT_TRY: try format, for negotiation only
- * @V4L2_SUBDEV_FORMAT_ACTIVE: active format, applied to the device
- */
-enum v4l2_subdev_format_whence {
-	V4L2_SUBDEV_FORMAT_TRY = 0,
-	V4L2_SUBDEV_FORMAT_ACTIVE = 1,
-};
-
-/**
- * struct v4l2_subdev_format - Pad-level media bus format
- * @which: format type (from enum v4l2_subdev_format_whence)
- * @pad: pad number, as reported by the media API
- * @format: media bus format (format code and frame size)
- */
-struct v4l2_subdev_format {
-	__u32 which;
-	__u32 pad;
-	struct v4l2_mbus_framefmt format;
-	__u32 reserved[8];
-};
-
-/**
- * struct v4l2_subdev_crop - Pad-level crop settings
- * @which: format type (from enum v4l2_subdev_format_whence)
- * @pad: pad number, as reported by the media API
- * @rect: pad crop rectangle boundaries
- */
-struct v4l2_subdev_crop {
-	__u32 which;
-	__u32 pad;
-	struct v4l2_rect rect;
-	__u32 reserved[8];
-};
-
-/**
- * struct v4l2_subdev_mbus_code_enum - Media bus format enumeration
- * @pad: pad number, as reported by the media API
- * @index: format index during enumeration
- * @code: format code (from enum v4l2_mbus_pixelcode)
- */
-struct v4l2_subdev_mbus_code_enum {
-	__u32 pad;
-	__u32 index;
-	__u32 code;
-	__u32 reserved[9];
-};
-
-/**
- * struct v4l2_subdev_frame_size_enum - Media bus format enumeration
- * @pad: pad number, as reported by the media API
- * @index: format index during enumeration
- * @code: format code (from enum v4l2_mbus_pixelcode)
- */
-struct v4l2_subdev_frame_size_enum {
-	__u32 index;
-	__u32 pad;
-	__u32 code;
-	__u32 min_width;
-	__u32 max_width;
-	__u32 min_height;
-	__u32 max_height;
-	__u32 reserved[9];
-};
-
-/**
- * struct v4l2_subdev_frame_interval - Pad-level frame rate
- * @pad: pad number, as reported by the media API
- * @interval: frame interval in seconds
- */
-struct v4l2_subdev_frame_interval {
-	__u32 pad;
-	struct v4l2_fract interval;
-	__u32 reserved[9];
-};
-
-/**
- * struct v4l2_subdev_frame_interval_enum - Frame interval enumeration
- * @pad: pad number, as reported by the media API
- * @index: frame interval index during enumeration
- * @code: format code (from enum v4l2_mbus_pixelcode)
- * @width: frame width in pixels
- * @height: frame height in pixels
- * @interval: frame interval in seconds
- */
-struct v4l2_subdev_frame_interval_enum {
-	__u32 index;
-	__u32 pad;
-	__u32 code;
-	__u32 width;
-	__u32 height;
-	struct v4l2_fract interval;
-	__u32 reserved[9];
-};
-
-#define VIDIOC_SUBDEV_G_FMT	_IOWR('V',  4, struct v4l2_subdev_format)
-#define VIDIOC_SUBDEV_S_FMT	_IOWR('V',  5, struct v4l2_subdev_format)
-#define VIDIOC_SUBDEV_G_FRAME_INTERVAL \
-			_IOWR('V', 21, struct v4l2_subdev_frame_interval)
-#define VIDIOC_SUBDEV_S_FRAME_INTERVAL \
-			_IOWR('V', 22, struct v4l2_subdev_frame_interval)
-#define VIDIOC_SUBDEV_ENUM_MBUS_CODE \
-			_IOWR('V',  2, struct v4l2_subdev_mbus_code_enum)
-#define VIDIOC_SUBDEV_ENUM_FRAME_SIZE \
-			_IOWR('V', 74, struct v4l2_subdev_frame_size_enum)
-#define VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL \
-			_IOWR('V', 75, struct v4l2_subdev_frame_interval_enum)
-#define VIDIOC_SUBDEV_G_CROP	_IOWR('V', 59, struct v4l2_subdev_crop)
-#define VIDIOC_SUBDEV_S_CROP	_IOWR('V', 60, struct v4l2_subdev_crop)
-
-#endif
diff --git a/exynos5/hal/include/video.h b/exynos5/hal/include/video.h
deleted file mode 100644
index 0565b85..0000000
--- a/exynos5/hal/include/video.h
+++ /dev/null
@@ -1,363 +0,0 @@
-#ifndef _VIDEO_H_
-#define _VIDEO_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef __HDMI_VIDEO_VIDEOFORMAT__
-#define __HDMI_VIDEO_VIDEOFORMAT__
-/**
- * @enum VideoFormat
- * Video format
- */
-enum VideoFormat {
-    /** 640x480p\@60Hz */
-    v640x480p_60Hz = 0,
-    /** 720x480p\@60Hz */
-    v720x480p_60Hz,
-    /** 1280x700p\@60Hz */
-    v1280x720p_60Hz,
-    /** 1920x1080i\@60Hz */
-    v1920x1080i_60Hz,
-    /** 720x480i\@60Hz */
-    v720x480i_60Hz,
-    /** 720x240p\@60Hz */
-    v720x240p_60Hz,
-    /** 2880x480i\@60Hz */
-    v2880x480i_60Hz,
-    /** 2880x240p\@60Hz */
-    v2880x240p_60Hz,
-    /** 1440x480p\@60Hz */
-    v1440x480p_60Hz,
-    /** 1920x1080p\@60Hz */
-    v1920x1080p_60Hz,
-    /** 720x576p\@60Hz */
-    v720x576p_50Hz,
-    /** 1280x720p\@50Hz */
-    v1280x720p_50Hz,
-    /** 1920x1080i\@50Hz (V total = 1125) */
-    v1920x1080i_50Hz,
-    /** 720x576i\@50Hz */
-    v720x576i_50Hz,
-    /** 720x288p\@50Hz */
-    v720x288p_50Hz,
-    /** 2880x576i\@50Hz */
-    v2880x576i_50Hz,
-    /** 2880x288p\@50Hz */
-    v2880x288p_50Hz,
-    /** 1440x576p\@50Hz */
-    v1440x576p_50Hz,
-    /** 1920x1080p\@50Hz */
-    v1920x1080p_50Hz,
-    /** 1920x1080p\@24Hz */
-    v1920x1080p_24Hz,
-    /** 1920x1080p\@25Hz */
-    v1920x1080p_25Hz,
-    /** 1920x1080p\@30Hz */
-    v1920x1080p_30Hz,
-    /** 2880x480p\@60Hz */
-    v2880x480p_60Hz,
-    /** 2880x576p\@60Hz */
-    v2880x576p_50Hz,
-    /** 1920x1080i\@50Hz (V total = 1250) */
-    v1920x1080i_50Hz_1250,
-    /** 1920x1080i\@100Hz */
-    v1920x1080i_100Hz,
-    /** 1280x720p\@100Hz */
-    v1280x720p_100Hz,
-    /** 720x576p\@100Hz */
-    v720x576p_100Hz,
-    /** 720x576i\@100Hz */
-    v720x576i_100Hz,
-    /** 1920x1080i\@120Hz */
-    v1920x1080i_120Hz,
-    /** 1280x720p\@120Hz */
-    v1280x720p_120Hz,
-    /** 720x480p\@120Hz */
-    v720x480p_120Hz,
-    /** 720x480i\@120Hz */
-    v720x480i_120Hz,
-    /** 720x576p\@200Hz */
-    v720x576p_200Hz,
-    /** 720x576i\@200Hz */
-    v720x576i_200Hz,
-    /** 720x480p\@240Hz */
-    v720x480p_240Hz,
-    /** 720x480i\@240Hz */
-    v720x480i_240Hz,
-    /** 1280x720p\@24Hz */
-    v1280x720p_24Hz,
-    /** 1280x720p\@25Hz */
-    v1280x720p_25Hz,
-    /** 1280x720p\@30Hz */
-    v1280x720p_30Hz,
-    /** 1920x1080p\@120Hz */
-    v1920x1080p_120Hz,
-    /** 1920x1080p\@100Hz */
-    v1920x1080p_100Hz,
-    /** 4Kx2K\@30Hz     */
-    v4Kx2K_30Hz,
-};
-#endif /* __HDMI_VIDEO_VIDEOFORMAT__ */
-#ifndef __HDMI_VIDEO_COLORSPACE__
-#define __HDMI_VIDEO_COLORSPACE__
-/**
- * @enum ColorSpace
- * Color space of video stream.
- */
-enum ColorSpace {
-    /** RGB color space */
-    HDMI_CS_RGB,
-    /** YCbCr 4:4:4 color space */
-    HDMI_CS_YCBCR444,
-    /** YCbCr 4:2:2 color space */
-    HDMI_CS_YCBCR422
-};
-#endif /* __HDMI_VIDEO_COLORSPACE__ */
-
-#ifndef __HDMI_VIDEO_COLORDEPTH__
-#define __HDMI_VIDEO_COLORDEPTH__
-/**
- * @enum ColorDepth
- * Color depth per pixel of video stream
- */
-enum ColorDepth {
-    /** 36 bit color depth per pixel */
-    HDMI_CD_36,
-    /** 30 bit color depth per pixel */
-    HDMI_CD_30,
-    /** 24 bit color depth per pixel */
-    HDMI_CD_24
-};
-#endif /* __HDMI_VIDEO_COLORDEPTH__ */
-
-#ifndef __HDMI_VIDEO_HDMIMODE__
-#define __HDMI_VIDEO_HDMIMODE__
-/**
- * @enum HDMIMode
- * System mode
- */
-enum HDMIMode {
-    /** DVI mode */
-    DVI = 0,
-    /** HDMI mode */
-    HDMI
-};
-#endif /* __HDMI_VIDEO_HDMIMODE__ */
-
-#ifndef __HDMI_VIDEO_PIXELLIMIT__
-#define __HDMI_VIDEO_PIXELLIMIT__
-/**
- * @enum PixelLimit
- * Pixel limitation of video stream
- */
-enum PixelLimit {
-    /** Full range */
-    HDMI_FULL_RANGE,
-    /** Limit range for RGB color space */
-    HDMI_RGB_LIMIT_RANGE,
-    /** Limit range for YCbCr color space */
-    HDMI_YCBCR_LIMIT_RANGE
-};
-#endif /* __HDMI_VIDEO_PIXELLIMIT__ */
-
-#ifndef __HDMI_VIDEO_COLORIMETRY__
-#define __HDMI_VIDEO_COLORIMETRY__
-/**
- * @enum HDMIColorimetry
- * Colorimetry of video stream
- */
-enum HDMIColorimetry {
-    /** Colorimetry is not defined */
-    HDMI_COLORIMETRY_NO_DATA,
-    /** ITU601 colorimetry */
-    HDMI_COLORIMETRY_ITU601,
-    /** ITU709 colorimetry */
-    HDMI_COLORIMETRY_ITU709,
-    /** Extended ITU601 colorimetry */
-    HDMI_COLORIMETRY_EXTENDED_xvYCC601,
-    /** Extended ITU709 colorimetry */
-    HDMI_COLORIMETRY_EXTENDED_xvYCC709
-};
-#endif /* __HDMI_VIDEO_COLORIMETRY__ */
-
-#ifndef __HDMI_VIDEO_PIXELASPECTRATIO__
-#define __HDMI_VIDEO_PIXELASPECTRATIO__
-/**
- * @enum PixelAspectRatio
- * Pixel aspect ratio of video stream
- */
-enum PixelAspectRatio {
-    /** as picutre pixel ratio */
-    HDMI_PIXEL_RATIO_AS_PICTURE,
-    /** 4:3 pixel ratio */
-    HDMI_PIXEL_RATIO_4_3,
-    /** 16:9 pixel ratio */
-    HDMI_PIXEL_RATIO_16_9
-};
-#endif /* __HDMI_VIDEO_PIXELASPECTRATIO__ */
-
-#ifndef __HDMI_VIDEO_PIXELFREQUENCY__
-#define __HDMI_VIDEO_PIXELFREQUENCY__
-/**
- * @enum PixelFreq
- * Pixel Frequency
- */
-enum PixelFreq {
-    /** 25.2 MHz pixel frequency */
-    PIXEL_FREQ_25_200 = 2520,
-    /** 25.175 MHz pixel frequency */
-    PIXEL_FREQ_25_175 = 2517,
-    /** 27 MHz pixel frequency */
-    PIXEL_FREQ_27 = 2700,
-    /** 27.027 MHz pixel frequency */
-    PIXEL_FREQ_27_027 = 2702,
-    /** 54 MHz pixel frequency */
-    PIXEL_FREQ_54 = 5400,
-    /** 54.054 MHz pixel frequency */
-    PIXEL_FREQ_54_054 = 5405,
-    /** 74.25 MHz pixel frequency */
-    PIXEL_FREQ_74_250 = 7425,
-    /** 74.176 MHz pixel frequency */
-    PIXEL_FREQ_74_176 = 7417,
-    /** 148.5 MHz pixel frequency */
-    PIXEL_FREQ_148_500 = 14850,
-    /** 148.352 MHz pixel frequency */
-    PIXEL_FREQ_148_352 = 14835,
-    /** 108.108 MHz pixel frequency */
-    PIXEL_FREQ_108_108 = 10810,
-    /** 72 MHz pixel frequency */
-    PIXEL_FREQ_72 = 7200,
-    /** 25 MHz pixel frequency */
-    PIXEL_FREQ_25 = 2500,
-    /** 65 MHz pixel frequency */
-    PIXEL_FREQ_65 = 6500,
-    /** 108 MHz pixel frequency */
-    PIXEL_FREQ_108 = 10800,
-    /** 162 MHz pixel frequency */
-    PIXEL_FREQ_162 = 16200,
-    /** 59.4 MHz pixel frequency */
-    PIXEL_FREQ_59_400 = 5940,
-};
-#endif /* __HDMI_VIDEO_PIXELFREQUENCY__ */
-
-#ifndef __HDMI_PHY_PIXELFREQUENCY__
-#define __HDMI_PHY_PIXELFREQUENCY__
-
-/**
- * @enum PHYFreq
- * PHY Frequency
- */
-enum PHYFreq {
-    /** Not supported */
-    PHY_FREQ_NOT_SUPPORTED = -1,
-    /** 25.2 MHz pixel frequency */
-    PHY_FREQ_25_200 = 0,
-    /** 25.175 MHz pixel frequency */
-    PHY_FREQ_25_175,
-    /** 27 MHz pixel frequency */
-    PHY_FREQ_27,
-    /** 27.027 MHz pixel frequency */
-    PHY_FREQ_27_027,
-    /** 54 MHz pixel frequency */
-    PHY_FREQ_54,
-    /** 54.054 MHz pixel frequency */
-    PHY_FREQ_54_054,
-    /** 74.25 MHz pixel frequency */
-    PHY_FREQ_74_250,
-    /** 74.176 MHz pixel frequency */
-    PHY_FREQ_74_176,
-    /** 148.5 MHz pixel frequency */
-    PHY_FREQ_148_500,
-    /** 148.352 MHz pixel frequency */
-    PHY_FREQ_148_352,
-    /** 108.108 MHz pixel frequency */
-    PHY_FREQ_108_108,
-    /** 72 MHz pixel frequency */
-    PHY_FREQ_72,
-    /** 25 MHz pixel frequency */
-    PHY_FREQ_25,
-    /** 65 MHz pixel frequency */
-    PHY_FREQ_65,
-    /** 108 MHz pixel frequency */
-    PHY_FREQ_108,
-    /** 162 MHz pixel frequency */
-    PHY_FREQ_162,
-    /** 59.4 MHz pixel frequency */
-    PHY_FREQ_59_400,
-};
-
-#endif /* __HDMI_PHY_PIXELFREQUENCY__ */
-
-#ifndef __HDMI_VIDEO_SOURCE__
-#define __HDMI_VIDEO_SOURCE__
-/**
- * @enum HDMIVideoSource
- * Type of video source.
- */
-enum HDMIVideoSource {
-    /** Internal Video Source */
-    HDMI_SOURCE_INTERNAL,
-    /** External Video Source */
-    HDMI_SOURCE_EXTERNAL,
-};
-#endif /* __HDMI_VIDEO_SOURCE__ */
-
-#ifndef __HDMI_3D_VIDEO_STRUCTURE__
-#define __HDMI_3D_VIDEO_STRUCTURE__
-/**
- * @enum HDMI3DVideoStructure
- * Type of 3D Video Structure
- */
-enum HDMI3DVideoStructure {
-    /** 2D Video Format  */
-    HDMI_2D_VIDEO_FORMAT = -1,
-    /** 3D Frame Packing Structure */
-    HDMI_3D_FP_FORMAT = 0,
-    /** 3D Field Alternative Structure  */
-    HDMI_3D_FA_FORMAT,
-    /** 3D Line Alternative Structure */
-    HDMI_3D_LA_FORMAT,
-    /** Side-by-Side(Full)Structure */
-    HDMI_3D_SSF_FORMAT,
-    /** 3D L+Depth Structure */
-    HDMI_3D_LD_FORMAT,
-    /** 3D L+Depth+Graphics Structure */
-    HDMI_3D_LDGFX_FORMAT,
-    /** 3D Top-and-Bottom Structure */
-    HDMI_3D_TB_FORMAT,
-    /** HDMI VIC Structure (ex. 4Kx2K) */
-    HDMI_VIC_FORMAT,
-    /** Side-by-Side(Half)Structure */
-    HDMI_3D_SSH_FORMAT,
-};
-#endif /* __HDMI_3D_VIDEO_STRUCTURE__ */
-
-#ifndef __HDMI_VIDEO_PARAMETER__
-#define __HDMI_VIDEO_PARAMETER__
-//! Structure for HDMI video
-struct HDMIVideoParameter {
-    /** Video interface */
-    enum HDMIMode mode;
-    /** Video format */
-    enum VideoFormat resolution;
-    /** Color space */
-    enum ColorSpace colorSpace;
-    /** Color depth */
-    enum ColorDepth colorDepth;
-    /** Colorimetry */
-    enum HDMIColorimetry colorimetry;
-    /** Pixel aspect ratio */
-    enum PixelAspectRatio pixelAspectRatio;
-    /** Video Source */
-    enum HDMIVideoSource videoSrc;
-    /** 3D Video Structure */
-    enum HDMI3DVideoStructure hdmi_3d_format;
-};
-#endif /* __HDMI_VIDEO_PARAMETER__*/
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* _VIDEO_H_ */
diff --git a/exynos5/hal/include/videodev2.h b/exynos5/hal/include/videodev2.h
deleted file mode 100644
index 48b3081..0000000
--- a/exynos5/hal/include/videodev2.h
+++ /dev/null
@@ -1,2227 +0,0 @@
-/*
- *  Video for Linux Two header file
- *
- *  Copyright (C) 1999-2007 the contributors
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  Alternatively you can redistribute this file under the terms of the
- *  BSD license as stated below:
- *
- *  Redistribution and use in source and binary forms, with or without
- *  modification, are permitted provided that the following conditions
- *  are met:
- *  1. Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *  2. Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in
- *     the documentation and/or other materials provided with the
- *     distribution.
- *  3. The names of its contributors may not be used to endorse or promote
- *     products derived from this software without specific prior written
- *     permission.
- *
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *	Header file for v4l or V4L2 drivers and applications
- * with public API.
- * All kernel-specific stuff were moved to media/v4l2-dev.h, so
- * no #if __KERNEL tests are allowed here
- *
- *	See http://linuxtv.org for more info
- *
- *	Author: Bill Dirks <bill@thedirks.org>
- *		Justin Schoeman
- *              Hans Verkuil <hverkuil@xs4all.nl>
- *		et al.
- */
-#ifndef __LINUX_VIDEODEV2_H
-#define __LINUX_VIDEODEV2_H
-
-#ifdef __KERNEL__
-#include <linux/time.h>     /* need struct timeval */
-#else
-#include <sys/time.h>
-#endif
-#include <linux/compiler.h>
-#include <linux/ioctl.h>
-#include <linux/types.h>
-
-/*
- * Common stuff for both V4L1 and V4L2
- * Moved from videodev.h
- */
-#define VIDEO_MAX_FRAME               32
-#define VIDEO_MAX_PLANES               8
-
-#ifndef __KERNEL__
-
-/* These defines are V4L1 specific and should not be used with the V4L2 API!
-   They will be removed from this header in the future. */
-
-#define VID_TYPE_CAPTURE	1	/* Can capture */
-#define VID_TYPE_TUNER		2	/* Can tune */
-#define VID_TYPE_TELETEXT	4	/* Does teletext */
-#define VID_TYPE_OVERLAY	8	/* Overlay onto frame buffer */
-#define VID_TYPE_CHROMAKEY	16	/* Overlay by chromakey */
-#define VID_TYPE_CLIPPING	32	/* Can clip */
-#define VID_TYPE_FRAMERAM	64	/* Uses the frame buffer memory */
-#define VID_TYPE_SCALES		128	/* Scalable */
-#define VID_TYPE_MONOCHROME	256	/* Monochrome only */
-#define VID_TYPE_SUBCAPTURE	512	/* Can capture subareas of the image */
-#define VID_TYPE_MPEG_DECODER	1024	/* Can decode MPEG streams */
-#define VID_TYPE_MPEG_ENCODER	2048	/* Can encode MPEG streams */
-#define VID_TYPE_MJPEG_DECODER	4096	/* Can decode MJPEG streams */
-#define VID_TYPE_MJPEG_ENCODER	8192	/* Can encode MJPEG streams */
-#endif
-
-/*
- *	M I S C E L L A N E O U S
- */
-
-/*  Four-character-code (FOURCC) */
-#define v4l2_fourcc(a, b, c, d)\
-	((__u32)(a) | ((__u32)(b) << 8) | ((__u32)(c) << 16) | ((__u32)(d) << 24))
-
-/*
- *	E N U M S
- */
-enum v4l2_field {
-	V4L2_FIELD_ANY           = 0, /* driver can choose from none,
-					 top, bottom, interlaced
-					 depending on whatever it thinks
-					 is approximate ... */
-	V4L2_FIELD_NONE          = 1, /* this device has no fields ... */
-	V4L2_FIELD_TOP           = 2, /* top field only */
-	V4L2_FIELD_BOTTOM        = 3, /* bottom field only */
-	V4L2_FIELD_INTERLACED    = 4, /* both fields interlaced */
-	V4L2_FIELD_SEQ_TB        = 5, /* both fields sequential into one
-					 buffer, top-bottom order */
-	V4L2_FIELD_SEQ_BT        = 6, /* same as above + bottom-top order */
-	V4L2_FIELD_ALTERNATE     = 7, /* both fields alternating into
-					 separate buffers */
-	V4L2_FIELD_INTERLACED_TB = 8, /* both fields interlaced, top field
-					 first and the top field is
-					 transmitted first */
-	V4L2_FIELD_INTERLACED_BT = 9, /* both fields interlaced, top field
-					 first and the bottom field is
-					 transmitted first */
-};
-#define V4L2_FIELD_HAS_TOP(field)	\
-	((field) == V4L2_FIELD_TOP 	||\
-	 (field) == V4L2_FIELD_INTERLACED ||\
-	 (field) == V4L2_FIELD_INTERLACED_TB ||\
-	 (field) == V4L2_FIELD_INTERLACED_BT ||\
-	 (field) == V4L2_FIELD_SEQ_TB	||\
-	 (field) == V4L2_FIELD_SEQ_BT)
-#define V4L2_FIELD_HAS_BOTTOM(field)	\
-	((field) == V4L2_FIELD_BOTTOM 	||\
-	 (field) == V4L2_FIELD_INTERLACED ||\
-	 (field) == V4L2_FIELD_INTERLACED_TB ||\
-	 (field) == V4L2_FIELD_INTERLACED_BT ||\
-	 (field) == V4L2_FIELD_SEQ_TB	||\
-	 (field) == V4L2_FIELD_SEQ_BT)
-#define V4L2_FIELD_HAS_BOTH(field)	\
-	((field) == V4L2_FIELD_INTERLACED ||\
-	 (field) == V4L2_FIELD_INTERLACED_TB ||\
-	 (field) == V4L2_FIELD_INTERLACED_BT ||\
-	 (field) == V4L2_FIELD_SEQ_TB ||\
-	 (field) == V4L2_FIELD_SEQ_BT)
-
-enum v4l2_buf_type {
-	V4L2_BUF_TYPE_VIDEO_CAPTURE        = 1,
-	V4L2_BUF_TYPE_VIDEO_OUTPUT         = 2,
-	V4L2_BUF_TYPE_VIDEO_OVERLAY        = 3,
-	V4L2_BUF_TYPE_VBI_CAPTURE          = 4,
-	V4L2_BUF_TYPE_VBI_OUTPUT           = 5,
-	V4L2_BUF_TYPE_SLICED_VBI_CAPTURE   = 6,
-	V4L2_BUF_TYPE_SLICED_VBI_OUTPUT    = 7,
-#if 1
-	/* Experimental */
-	V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8,
-#endif
-	V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE = 9,
-	V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE  = 10,
-	V4L2_BUF_TYPE_PRIVATE              = 0x80,
-};
-
-#define V4L2_TYPE_IS_MULTIPLANAR(type)			\
-	((type) == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE	\
-	 || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
-
-#define V4L2_TYPE_IS_OUTPUT(type)				\
-	((type) == V4L2_BUF_TYPE_VIDEO_OUTPUT			\
-	 || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE		\
-	 || (type) == V4L2_BUF_TYPE_VIDEO_OVERLAY		\
-	 || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY	\
-	 || (type) == V4L2_BUF_TYPE_VBI_OUTPUT			\
-	 || (type) == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT)
-
-enum v4l2_tuner_type {
-	V4L2_TUNER_RADIO	     = 1,
-	V4L2_TUNER_ANALOG_TV	     = 2,
-	V4L2_TUNER_DIGITAL_TV	     = 3,
-};
-
-enum v4l2_memory {
-	V4L2_MEMORY_MMAP             = 1,
-	V4L2_MEMORY_USERPTR          = 2,
-	V4L2_MEMORY_OVERLAY          = 3,
-};
-
-/* see also http://vektor.theorem.ca/graphics/ycbcr/ */
-enum v4l2_colorspace {
-	/* ITU-R 601 -- broadcast NTSC/PAL */
-	V4L2_COLORSPACE_SMPTE170M     = 1,
-
-	/* 1125-Line (US) HDTV */
-	V4L2_COLORSPACE_SMPTE240M     = 2,
-
-	/* HD and modern captures. */
-	V4L2_COLORSPACE_REC709        = 3,
-
-	/* broken BT878 extents (601, luma range 16-253 instead of 16-235) */
-	V4L2_COLORSPACE_BT878         = 4,
-
-	/* These should be useful.  Assume 601 extents. */
-	V4L2_COLORSPACE_470_SYSTEM_M  = 5,
-	V4L2_COLORSPACE_470_SYSTEM_BG = 6,
-
-	/* I know there will be cameras that send this.  So, this is
-	 * unspecified chromaticities and full 0-255 on each of the
-	 * Y'CbCr components
-	 */
-	V4L2_COLORSPACE_JPEG          = 7,
-
-	/* For RGB colourspaces, this is probably a good start. */
-	V4L2_COLORSPACE_SRGB          = 8,
-};
-
-enum v4l2_priority {
-	V4L2_PRIORITY_UNSET       = 0,  /* not initialized */
-	V4L2_PRIORITY_BACKGROUND  = 1,
-	V4L2_PRIORITY_INTERACTIVE = 2,
-	V4L2_PRIORITY_RECORD      = 3,
-	V4L2_PRIORITY_DEFAULT     = V4L2_PRIORITY_INTERACTIVE,
-};
-
-struct v4l2_rect {
-	__s32   left;
-	__s32   top;
-	__s32   width;
-	__s32   height;
-};
-
-struct v4l2_fract {
-	__u32   numerator;
-	__u32   denominator;
-};
-
-/*
- *	D R I V E R   C A P A B I L I T I E S
- */
-struct v4l2_capability {
-	__u8	driver[16];	/* i.e. "bttv" */
-	__u8	card[32];	/* i.e. "Hauppauge WinTV" */
-	__u8	bus_info[32];	/* "PCI:" + pci_name(pci_dev) */
-	__u32   version;        /* should use KERNEL_VERSION() */
-	__u32	capabilities;	/* Device capabilities */
-	__u32	reserved[4];
-};
-
-/* Values for 'capabilities' field */
-#define V4L2_CAP_VIDEO_CAPTURE		0x00000001  /* Is a video capture device */
-#define V4L2_CAP_VIDEO_OUTPUT		0x00000002  /* Is a video output device */
-#define V4L2_CAP_VIDEO_OVERLAY		0x00000004  /* Can do video overlay */
-#define V4L2_CAP_VBI_CAPTURE		0x00000010  /* Is a raw VBI capture device */
-#define V4L2_CAP_VBI_OUTPUT		0x00000020  /* Is a raw VBI output device */
-#define V4L2_CAP_SLICED_VBI_CAPTURE	0x00000040  /* Is a sliced VBI capture device */
-#define V4L2_CAP_SLICED_VBI_OUTPUT	0x00000080  /* Is a sliced VBI output device */
-#define V4L2_CAP_RDS_CAPTURE		0x00000100  /* RDS data capture */
-#define V4L2_CAP_VIDEO_OUTPUT_OVERLAY	0x00000200  /* Can do video output overlay */
-#define V4L2_CAP_HW_FREQ_SEEK		0x00000400  /* Can do hardware frequency seek  */
-#define V4L2_CAP_RDS_OUTPUT		0x00000800  /* Is an RDS encoder */
-
-/* Is a video capture device that supports multiplanar formats */
-#define V4L2_CAP_VIDEO_CAPTURE_MPLANE	0x00001000
-/* Is a video output device that supports multiplanar formats */
-#define V4L2_CAP_VIDEO_OUTPUT_MPLANE	0x00002000
-
-#define V4L2_CAP_TUNER			0x00010000  /* has a tuner */
-#define V4L2_CAP_AUDIO			0x00020000  /* has audio support */
-#define V4L2_CAP_RADIO			0x00040000  /* is a radio device */
-#define V4L2_CAP_MODULATOR		0x00080000  /* has a modulator */
-
-#define V4L2_CAP_READWRITE              0x01000000  /* read/write systemcalls */
-#define V4L2_CAP_ASYNCIO                0x02000000  /* async I/O */
-#define V4L2_CAP_STREAMING              0x04000000  /* streaming I/O ioctls */
-
-/*
- *	V I D E O   I M A G E   F O R M A T
- */
-struct v4l2_pix_format {
-	__u32         		width;
-	__u32			height;
-	__u32			pixelformat;
-	enum v4l2_field  	field;
-	__u32            	bytesperline;	/* for padding, zero if unused */
-	__u32          		sizeimage;
-	enum v4l2_colorspace	colorspace;
-	__u32			priv;		/* private data, depends on pixelformat */
-};
-
-/*      Pixel format         FOURCC                          depth  Description  */
-
-/* RGB formats */
-#define V4L2_PIX_FMT_RGB332  v4l2_fourcc('R', 'G', 'B', '1') /*  8  RGB-3-3-2     */
-#define V4L2_PIX_FMT_RGB444  v4l2_fourcc('R', '4', '4', '4') /* 16  xxxxrrrr ggggbbbb */
-#define V4L2_PIX_FMT_RGB555  v4l2_fourcc('R', 'G', 'B', 'O') /* 16  RGB-5-5-5     */
-#define V4L2_PIX_FMT_RGB565  v4l2_fourcc('R', 'G', 'B', 'P') /* 16  RGB-5-6-5     */
-#define V4L2_PIX_FMT_RGB555X v4l2_fourcc('R', 'G', 'B', 'Q') /* 16  RGB-5-5-5 BE  */
-#define V4L2_PIX_FMT_RGB565X v4l2_fourcc('R', 'G', 'B', 'R') /* 16  RGB-5-6-5 BE  */
-#define V4L2_PIX_FMT_BGR666  v4l2_fourcc('B', 'G', 'R', 'H') /* 18  BGR-6-6-6	  */
-#define V4L2_PIX_FMT_BGR24   v4l2_fourcc('B', 'G', 'R', '3') /* 24  BGR-8-8-8     */
-#define V4L2_PIX_FMT_RGB24   v4l2_fourcc('R', 'G', 'B', '3') /* 24  RGB-8-8-8     */
-#define V4L2_PIX_FMT_BGR32   v4l2_fourcc('B', 'G', 'R', '4') /* 32  BGR-8-8-8-8   */
-#define V4L2_PIX_FMT_RGB32   v4l2_fourcc('R', 'G', 'B', '4') /* 32  RGB-8-8-8-8   */
-
-/* Grey formats */
-#define V4L2_PIX_FMT_GREY    v4l2_fourcc('G', 'R', 'E', 'Y') /*  8  Greyscale     */
-#define V4L2_PIX_FMT_Y4      v4l2_fourcc('Y', '0', '4', ' ') /*  4  Greyscale     */
-#define V4L2_PIX_FMT_Y6      v4l2_fourcc('Y', '0', '6', ' ') /*  6  Greyscale     */
-#define V4L2_PIX_FMT_Y10     v4l2_fourcc('Y', '1', '0', ' ') /* 10  Greyscale     */
-#define V4L2_PIX_FMT_Y12     v4l2_fourcc('Y', '1', '2', ' ') /* 12  Greyscale     */
-#define V4L2_PIX_FMT_Y16     v4l2_fourcc('Y', '1', '6', ' ') /* 16  Greyscale     */
-
-/* Grey bit-packed formats */
-#define V4L2_PIX_FMT_Y10BPACK    v4l2_fourcc('Y', '1', '0', 'B') /* 10  Greyscale bit-packed */
-
-/* Palette formats */
-#define V4L2_PIX_FMT_PAL8    v4l2_fourcc('P', 'A', 'L', '8') /*  8  8-bit palette */
-
-/* Luminance+Chrominance formats */
-#define V4L2_PIX_FMT_YVU410  v4l2_fourcc('Y', 'V', 'U', '9') /*  9  YVU 4:1:0     */
-#define V4L2_PIX_FMT_YVU420  v4l2_fourcc('Y', 'V', '1', '2') /* 12  YVU 4:2:0     */
-#define V4L2_PIX_FMT_YUYV    v4l2_fourcc('Y', 'U', 'Y', 'V') /* 16  YUV 4:2:2     */
-#define V4L2_PIX_FMT_YYUV    v4l2_fourcc('Y', 'Y', 'U', 'V') /* 16  YUV 4:2:2     */
-#define V4L2_PIX_FMT_YVYU    v4l2_fourcc('Y', 'V', 'Y', 'U') /* 16 YVU 4:2:2 */
-#define V4L2_PIX_FMT_UYVY    v4l2_fourcc('U', 'Y', 'V', 'Y') /* 16  YUV 4:2:2     */
-#define V4L2_PIX_FMT_VYUY    v4l2_fourcc('V', 'Y', 'U', 'Y') /* 16  YUV 4:2:2     */
-#define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4', '2', '2', 'P') /* 16  YVU422 planar */
-#define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4', '1', '1', 'P') /* 16  YVU411 planar */
-#define V4L2_PIX_FMT_Y41P    v4l2_fourcc('Y', '4', '1', 'P') /* 12  YUV 4:1:1     */
-#define V4L2_PIX_FMT_YUV444  v4l2_fourcc('Y', '4', '4', '4') /* 16  xxxxyyyy uuuuvvvv */
-#define V4L2_PIX_FMT_YUV555  v4l2_fourcc('Y', 'U', 'V', 'O') /* 16  YUV-5-5-5     */
-#define V4L2_PIX_FMT_YUV565  v4l2_fourcc('Y', 'U', 'V', 'P') /* 16  YUV-5-6-5     */
-#define V4L2_PIX_FMT_YUV32   v4l2_fourcc('Y', 'U', 'V', '4') /* 32  YUV-8-8-8-8   */
-#define V4L2_PIX_FMT_YUV410  v4l2_fourcc('Y', 'U', 'V', '9') /*  9  YUV 4:1:0     */
-#define V4L2_PIX_FMT_YUV420  v4l2_fourcc('Y', 'U', '1', '2') /* 12  YUV 4:2:0     */
-#define V4L2_PIX_FMT_HI240   v4l2_fourcc('H', 'I', '2', '4') /*  8  8-bit color   */
-#define V4L2_PIX_FMT_HM12    v4l2_fourcc('H', 'M', '1', '2') /*  8  YUV 4:2:0 16x16 macroblocks */
-#define V4L2_PIX_FMT_M420    v4l2_fourcc('M', '4', '2', '0') /* 12  YUV 4:2:0 2 lines y, 1 line uv interleaved */
-
-/* two planes -- one Y, one Cr + Cb interleaved  */
-#define V4L2_PIX_FMT_NV12    v4l2_fourcc('N', 'V', '1', '2') /* 12  Y/CbCr 4:2:0  */
-#define V4L2_PIX_FMT_NV21    v4l2_fourcc('N', 'V', '2', '1') /* 12  Y/CrCb 4:2:0  */
-#define V4L2_PIX_FMT_NV16    v4l2_fourcc('N', 'V', '1', '6') /* 16  Y/CbCr 4:2:2  */
-#define V4L2_PIX_FMT_NV61    v4l2_fourcc('N', 'V', '6', '1') /* 16  Y/CrCb 4:2:2  */
-
-/* two non contiguous planes - one Y, one Cr + Cb interleaved  */
-#define V4L2_PIX_FMT_NV12M        v4l2_fourcc('N', 'M', '1', '2') /* 12  Y/CbCr 4:2:0  */
-#define V4L2_PIX_FMT_NV21M        v4l2_fourcc('N', 'M', '2', '1') /* 21  Y/CrCb 4:2:0  */
-#define V4L2_PIX_FMT_NV12MT       v4l2_fourcc('T', 'M', '1', '2') /* 12  Y/CbCr 4:2:0 64x32 macroblocks */
-#define V4L2_PIX_FMT_NV12MT_16X16 v4l2_fourcc('V', 'M', '1', '2') /* 12  Y/CbCr 4:2:0 16x16 macroblocks */
-
-/* three non contiguous planes - Y, Cb, Cr */
-#define V4L2_PIX_FMT_YUV420M v4l2_fourcc('Y', 'U', 'V', 'M') /* 12  YUV420 planar */
-#define V4L2_PIX_FMT_YVU420M v4l2_fourcc('Y', 'V', 'U', 'M') /* 12  YVU420 planar */
-
-/* Bayer formats - see http://www.siliconimaging.com/RGB%20Bayer.htm */
-#define V4L2_PIX_FMT_SBGGR8  v4l2_fourcc('B', 'A', '8', '1') /*  8  BGBG.. GRGR.. */
-#define V4L2_PIX_FMT_SGBRG8  v4l2_fourcc('G', 'B', 'R', 'G') /*  8  GBGB.. RGRG.. */
-#define V4L2_PIX_FMT_SGRBG8  v4l2_fourcc('G', 'R', 'B', 'G') /*  8  GRGR.. BGBG.. */
-#define V4L2_PIX_FMT_SRGGB8  v4l2_fourcc('R', 'G', 'G', 'B') /*  8  RGRG.. GBGB.. */
-#define V4L2_PIX_FMT_SBGGR10 v4l2_fourcc('B', 'G', '1', '0') /* 10  BGBG.. GRGR.. */
-#define V4L2_PIX_FMT_SGBRG10 v4l2_fourcc('G', 'B', '1', '0') /* 10  GBGB.. RGRG.. */
-#define V4L2_PIX_FMT_SGRBG10 v4l2_fourcc('B', 'A', '1', '0') /* 10  GRGR.. BGBG.. */
-#define V4L2_PIX_FMT_SRGGB10 v4l2_fourcc('R', 'G', '1', '0') /* 10  RGRG.. GBGB.. */
-#define V4L2_PIX_FMT_SBGGR12 v4l2_fourcc('B', 'G', '1', '2') /* 12  BGBG.. GRGR.. */
-#define V4L2_PIX_FMT_SGBRG12 v4l2_fourcc('G', 'B', '1', '2') /* 12  GBGB.. RGRG.. */
-#define V4L2_PIX_FMT_SGRBG12 v4l2_fourcc('B', 'A', '1', '2') /* 12  GRGR.. BGBG.. */
-#define V4L2_PIX_FMT_SRGGB12 v4l2_fourcc('R', 'G', '1', '2') /* 12  RGRG.. GBGB.. */
-	/* 10bit raw bayer DPCM compressed to 8 bits */
-#define V4L2_PIX_FMT_SGRBG10DPCM8 v4l2_fourcc('B', 'D', '1', '0')
-	/*
-	 * 10bit raw bayer, expanded to 16 bits
-	 * xxxxrrrrrrrrrrxxxxgggggggggg xxxxggggggggggxxxxbbbbbbbbbb...
-	 */
-#define V4L2_PIX_FMT_SBGGR16 v4l2_fourcc('B', 'Y', 'R', '2') /* 16  BGBG.. GRGR.. */
-
-/* compressed formats */
-#define V4L2_PIX_FMT_MJPEG    v4l2_fourcc('M', 'J', 'P', 'G') /* Motion-JPEG   */
-#define V4L2_PIX_FMT_JPEG     v4l2_fourcc('J', 'P', 'E', 'G') /* JFIF JPEG     */
-#define V4L2_PIX_FMT_DV       v4l2_fourcc('d', 'v', 's', 'd') /* 1394          */
-#define V4L2_PIX_FMT_MPEG     v4l2_fourcc('M', 'P', 'E', 'G') /* MPEG-1/2/4    */
-
-
-#define V4L2_PIX_FMT_H264     v4l2_fourcc('H', '2', '6', '4') /* H264    */
-#define V4L2_PIX_FMT_H263     v4l2_fourcc('H', '2', '6', '3') /* H263    */
-#define V4L2_PIX_FMT_MPEG12   v4l2_fourcc('M', 'P', '1', '2') /* MPEG-1/2  */
-#define V4L2_PIX_FMT_MPEG4    v4l2_fourcc('M', 'P', 'G', '4') /* MPEG-4  */
-#define V4L2_PIX_FMT_FIMV     v4l2_fourcc('F', 'I', 'M', 'V') /* FIMV  */
-#define V4L2_PIX_FMT_FIMV1    v4l2_fourcc('F', 'I', 'M', '1') /* FIMV1 */
-#define V4L2_PIX_FMT_FIMV2    v4l2_fourcc('F', 'I', 'M', '2') /* FIMV2 */
-#define V4L2_PIX_FMT_FIMV3    v4l2_fourcc('F', 'I', 'M', '3') /* FIMV3 */
-#define V4L2_PIX_FMT_FIMV4    v4l2_fourcc('F', 'I', 'M', '4') /* FIMV4 */
-#define V4L2_PIX_FMT_XVID     v4l2_fourcc('X', 'V', 'I', 'D') /* Xvid */
-#define V4L2_PIX_FMT_VC1      v4l2_fourcc('V', 'C', '1', 'A') /* VC-1 */
-#define V4L2_PIX_FMT_VC1_RCV      v4l2_fourcc('V', 'C', '1', 'R') /* VC-1 RCV */
-#define V4L2_PIX_FMT_VP8      v4l2_fourcc('V', 'P', '8', '0') /* VP8 */
-
-
-/*  Vendor-specific formats   */
-#define V4L2_PIX_FMT_CPIA1    v4l2_fourcc('C', 'P', 'I', 'A') /* cpia1 YUV */
-#define V4L2_PIX_FMT_WNVA     v4l2_fourcc('W', 'N', 'V', 'A') /* Winnov hw compress */
-#define V4L2_PIX_FMT_SN9C10X  v4l2_fourcc('S', '9', '1', '0') /* SN9C10x compression */
-#define V4L2_PIX_FMT_SN9C20X_I420 v4l2_fourcc('S', '9', '2', '0') /* SN9C20x YUV 4:2:0 */
-#define V4L2_PIX_FMT_PWC1     v4l2_fourcc('P', 'W', 'C', '1') /* pwc older webcam */
-#define V4L2_PIX_FMT_PWC2     v4l2_fourcc('P', 'W', 'C', '2') /* pwc newer webcam */
-#define V4L2_PIX_FMT_ET61X251 v4l2_fourcc('E', '6', '2', '5') /* ET61X251 compression */
-#define V4L2_PIX_FMT_SPCA501  v4l2_fourcc('S', '5', '0', '1') /* YUYV per line */
-#define V4L2_PIX_FMT_SPCA505  v4l2_fourcc('S', '5', '0', '5') /* YYUV per line */
-#define V4L2_PIX_FMT_SPCA508  v4l2_fourcc('S', '5', '0', '8') /* YUVY per line */
-#define V4L2_PIX_FMT_SPCA561  v4l2_fourcc('S', '5', '6', '1') /* compressed GBRG bayer */
-#define V4L2_PIX_FMT_PAC207   v4l2_fourcc('P', '2', '0', '7') /* compressed BGGR bayer */
-#define V4L2_PIX_FMT_MR97310A v4l2_fourcc('M', '3', '1', '0') /* compressed BGGR bayer */
-#define V4L2_PIX_FMT_SN9C2028 v4l2_fourcc('S', 'O', 'N', 'X') /* compressed GBRG bayer */
-#define V4L2_PIX_FMT_SQ905C   v4l2_fourcc('9', '0', '5', 'C') /* compressed RGGB bayer */
-#define V4L2_PIX_FMT_PJPG     v4l2_fourcc('P', 'J', 'P', 'G') /* Pixart 73xx JPEG */
-#define V4L2_PIX_FMT_OV511    v4l2_fourcc('O', '5', '1', '1') /* ov511 JPEG */
-#define V4L2_PIX_FMT_OV518    v4l2_fourcc('O', '5', '1', '8') /* ov518 JPEG */
-#define V4L2_PIX_FMT_STV0680  v4l2_fourcc('S', '6', '8', '0') /* stv0680 bayer */
-#define V4L2_PIX_FMT_TM6000   v4l2_fourcc('T', 'M', '6', '0') /* tm5600/tm60x0 */
-#define V4L2_PIX_FMT_CIT_YYVYUY v4l2_fourcc('C', 'I', 'T', 'V') /* one line of Y then 1 line of VYUY */
-#define V4L2_PIX_FMT_KONICA420  v4l2_fourcc('K', 'O', 'N', 'I') /* YUV420 planar in blocks of 256 pixels */
-#define V4L2_PIX_FMT_JPGL	v4l2_fourcc('J', 'P', 'G', 'L') /* JPEG-Lite */
-
-#define V4L2_PIX_FMT_JPEG_444     v4l2_fourcc('J', 'P', 'G', '4') /* yuv444 of JFIF JPEG     */
-#define V4L2_PIX_FMT_JPEG_422     v4l2_fourcc('J', 'P', 'G', '2') /* yuv422 of JFIF JPEG     */
-#define V4L2_PIX_FMT_JPEG_420     v4l2_fourcc('J', 'P', 'G', '0') /* yuv420 of JFIF JPEG     */
-#define V4L2_PIX_FMT_JPEG_GRAY     v4l2_fourcc('J', 'P', 'G', 'G') /* grey of JFIF JPEG     */
-#define V4L2_PIX_FMT_YUV444_2P  v4l2_fourcc('Y', 'U', '2', 'P') /* 16  xxxxyyyy uuuuvvvv */
-#define V4L2_PIX_FMT_YVU444_2P  v4l2_fourcc('Y', 'V', '2', 'P') /* 16  xxxxyyyy uuuuvvvv */
-#define V4L2_PIX_FMT_YUV444_3P  v4l2_fourcc('Y', 'U', '3', 'P') /* 16  xxxxyyyy uuuuvvvv */
-/*
- *	F O R M A T   E N U M E R A T I O N
- */
-struct v4l2_fmtdesc {
-	__u32		    index;             /* Format number      */
-	enum v4l2_buf_type  type;              /* buffer type        */
-	__u32               flags;
-	__u8		    description[32];   /* Description string */
-	__u32		    pixelformat;       /* Format fourcc      */
-	__u32		    reserved[4];
-};
-
-#define V4L2_FMT_FLAG_COMPRESSED 0x0001
-#define V4L2_FMT_FLAG_EMULATED   0x0002
-
-#if 1
-	/* Experimental Frame Size and frame rate enumeration */
-/*
- *	F R A M E   S I Z E   E N U M E R A T I O N
- */
-enum v4l2_frmsizetypes {
-	V4L2_FRMSIZE_TYPE_DISCRETE	= 1,
-	V4L2_FRMSIZE_TYPE_CONTINUOUS	= 2,
-	V4L2_FRMSIZE_TYPE_STEPWISE	= 3,
-};
-
-struct v4l2_frmsize_discrete {
-	__u32			width;		/* Frame width [pixel] */
-	__u32			height;		/* Frame height [pixel] */
-};
-
-struct v4l2_frmsize_stepwise {
-	__u32			min_width;	/* Minimum frame width [pixel] */
-	__u32			max_width;	/* Maximum frame width [pixel] */
-	__u32			step_width;	/* Frame width step size [pixel] */
-	__u32			min_height;	/* Minimum frame height [pixel] */
-	__u32			max_height;	/* Maximum frame height [pixel] */
-	__u32			step_height;	/* Frame height step size [pixel] */
-};
-
-struct v4l2_frmsizeenum {
-	__u32			index;		/* Frame size number */
-	__u32			pixel_format;	/* Pixel format */
-	__u32			type;		/* Frame size type the device supports. */
-
-	union {					/* Frame size */
-		struct v4l2_frmsize_discrete	discrete;
-		struct v4l2_frmsize_stepwise	stepwise;
-	};
-
-	__u32   reserved[2];			/* Reserved space for future use */
-};
-
-/*
- *	F R A M E   R A T E   E N U M E R A T I O N
- */
-enum v4l2_frmivaltypes {
-	V4L2_FRMIVAL_TYPE_DISCRETE	= 1,
-	V4L2_FRMIVAL_TYPE_CONTINUOUS	= 2,
-	V4L2_FRMIVAL_TYPE_STEPWISE	= 3,
-};
-
-struct v4l2_frmival_stepwise {
-	struct v4l2_fract	min;		/* Minimum frame interval [s] */
-	struct v4l2_fract	max;		/* Maximum frame interval [s] */
-	struct v4l2_fract	step;		/* Frame interval step size [s] */
-};
-
-struct v4l2_frmivalenum {
-	__u32			index;		/* Frame format index */
-	__u32			pixel_format;	/* Pixel format */
-	__u32			width;		/* Frame width */
-	__u32			height;		/* Frame height */
-	__u32			type;		/* Frame interval type the device supports. */
-
-	union {					/* Frame interval */
-		struct v4l2_fract		discrete;
-		struct v4l2_frmival_stepwise	stepwise;
-	};
-
-	__u32	reserved[2];			/* Reserved space for future use */
-};
-#endif
-
-/*
- *	T I M E C O D E
- */
-struct v4l2_timecode {
-	__u32	type;
-	__u32	flags;
-	__u8	frames;
-	__u8	seconds;
-	__u8	minutes;
-	__u8	hours;
-	__u8	userbits[4];
-};
-
-/*  Type  */
-#define V4L2_TC_TYPE_24FPS		1
-#define V4L2_TC_TYPE_25FPS		2
-#define V4L2_TC_TYPE_30FPS		3
-#define V4L2_TC_TYPE_50FPS		4
-#define V4L2_TC_TYPE_60FPS		5
-
-/*  Flags  */
-#define V4L2_TC_FLAG_DROPFRAME		0x0001 /* "drop-frame" mode */
-#define V4L2_TC_FLAG_COLORFRAME		0x0002
-#define V4L2_TC_USERBITS_field		0x000C
-#define V4L2_TC_USERBITS_USERDEFINED	0x0000
-#define V4L2_TC_USERBITS_8BITCHARS	0x0008
-/* The above is based on SMPTE timecodes */
-
-struct v4l2_jpegcompression {
-	int quality;
-
-	int  APPn;              /* Number of APP segment to be written,
-				 * must be 0..15 */
-	int  APP_len;           /* Length of data in JPEG APPn segment */
-	char APP_data[60];      /* Data in the JPEG APPn segment. */
-
-	int  COM_len;           /* Length of data in JPEG COM segment */
-	char COM_data[60];      /* Data in JPEG COM segment */
-
-	__u32 jpeg_markers;     /* Which markers should go into the JPEG
-				 * output. Unless you exactly know what
-				 * you do, leave them untouched.
-				 * Inluding less markers will make the
-				 * resulting code smaller, but there will
-				 * be fewer applications which can read it.
-				 * The presence of the APP and COM marker
-				 * is influenced by APP_len and COM_len
-				 * ONLY, not by this property! */
-
-#define V4L2_JPEG_MARKER_DHT (1<<3)    /* Define Huffman Tables */
-#define V4L2_JPEG_MARKER_DQT (1<<4)    /* Define Quantization Tables */
-#define V4L2_JPEG_MARKER_DRI (1<<5)    /* Define Restart Interval */
-#define V4L2_JPEG_MARKER_COM (1<<6)    /* Comment segment */
-#define V4L2_JPEG_MARKER_APP (1<<7)    /* App segment, driver will
-					* allways use APP0 */
-};
-
-/*
- *	M E M O R Y - M A P P I N G   B U F F E R S
- */
-struct v4l2_requestbuffers {
-	__u32			count;
-	enum v4l2_buf_type      type;
-	enum v4l2_memory        memory;
-	__u32			reserved[2];
-};
-
-/**
- * struct v4l2_plane - plane info for multi-planar buffers
- * @bytesused:		number of bytes occupied by data in the plane (payload)
- * @length:		size of this plane (NOT the payload) in bytes
- * @mem_offset:		when memory in the associated struct v4l2_buffer is
- *			V4L2_MEMORY_MMAP, equals the offset from the start of
- *			the device memory for this plane (or is a "cookie" that
- *			should be passed to mmap() called on the video node)
- * @userptr:		when memory is V4L2_MEMORY_USERPTR, a userspace pointer
- *			pointing to this plane
- * @data_offset:	offset in the plane to the start of data; usually 0,
- *			unless there is a header in front of the data
- *
- * Multi-planar buffers consist of one or more planes, e.g. an YCbCr buffer
- * with two planes can have one plane for Y, and another for interleaved CbCr
- * components. Each plane can reside in a separate memory buffer, or even in
- * a completely separate memory node (e.g. in embedded devices).
- */
-struct v4l2_plane {
-	__u32			bytesused;
-	__u32			length;
-	union {
-		__u32		mem_offset;
-		unsigned long	userptr;
-	} m;
-	__u32			data_offset;
-	void			*cookie;
-	void			*share;
-	__u32			reserved[9];
-};
-
-/**
- * struct v4l2_buffer - video buffer info
- * @index:	id number of the buffer
- * @type:	buffer type (type == *_MPLANE for multiplanar buffers)
- * @bytesused:	number of bytes occupied by data in the buffer (payload);
- *		unused (set to 0) for multiplanar buffers
- * @flags:	buffer informational flags
- * @field:	field order of the image in the buffer
- * @timestamp:	frame timestamp
- * @timecode:	frame timecode
- * @sequence:	sequence count of this frame
- * @memory:	the method, in which the actual video data is passed
- * @offset:	for non-multiplanar buffers with memory == V4L2_MEMORY_MMAP;
- *		offset from the start of the device memory for this plane,
- *		(or a "cookie" that should be passed to mmap() as offset)
- * @userptr:	for non-multiplanar buffers with memory == V4L2_MEMORY_USERPTR;
- *		a userspace pointer pointing to this buffer
- * @planes:	for multiplanar buffers; userspace pointer to the array of plane
- *		info structs for this buffer
- * @length:	size in bytes of the buffer (NOT its payload) for single-plane
- *		buffers (when type != *_MPLANE); number of elements in the
- *		planes array for multi-plane buffers
- * @input:	input number from which the video data has has been captured
- *
- * Contains data exchanged by application and driver using one of the Streaming
- * I/O methods.
- */
-struct v4l2_buffer {
-	__u32			index;
-	enum v4l2_buf_type      type;
-	__u32			bytesused;
-	__u32			flags;
-	enum v4l2_field		field;
-	struct timeval		timestamp;
-	struct v4l2_timecode	timecode;
-	__u32			sequence;
-
-	/* memory location */
-	enum v4l2_memory        memory;
-	union {
-		__u32           offset;
-		unsigned long   userptr;
-		struct v4l2_plane *planes;
-	} m;
-	__u32			length;
-	__u32			input;
-	__u32			reserved;
-};
-
-/*  Flags for 'flags' field */
-#define V4L2_BUF_FLAG_MAPPED	0x0001  /* Buffer is mapped (flag) */
-#define V4L2_BUF_FLAG_QUEUED	0x0002	/* Buffer is queued for processing */
-#define V4L2_BUF_FLAG_DONE	0x0004	/* Buffer is ready */
-#define V4L2_BUF_FLAG_KEYFRAME	0x0008	/* Image is a keyframe (I-frame) */
-#define V4L2_BUF_FLAG_PFRAME	0x0010	/* Image is a P-frame */
-#define V4L2_BUF_FLAG_BFRAME	0x0020	/* Image is a B-frame */
-/* Buffer is ready, but the data contained within is corrupted. */
-#define V4L2_BUF_FLAG_ERROR	0x0040
-#define V4L2_BUF_FLAG_TIMECODE	0x0100	/* timecode field is valid */
-#define V4L2_BUF_FLAG_INPUT     0x0200  /* input field is valid */
-
-/*
- *	O V E R L A Y   P R E V I E W
- */
-struct v4l2_framebuffer {
-	__u32			capability;
-	__u32			flags;
-/* FIXME: in theory we should pass something like PCI device + memory
- * region + offset instead of some physical address */
-	void                    *base;
-	struct v4l2_pix_format	fmt;
-};
-/*  Flags for the 'capability' field. Read only */
-#define V4L2_FBUF_CAP_EXTERNOVERLAY	0x0001
-#define V4L2_FBUF_CAP_CHROMAKEY		0x0002
-#define V4L2_FBUF_CAP_LIST_CLIPPING     0x0004
-#define V4L2_FBUF_CAP_BITMAP_CLIPPING	0x0008
-#define V4L2_FBUF_CAP_LOCAL_ALPHA	0x0010
-#define V4L2_FBUF_CAP_GLOBAL_ALPHA	0x0020
-#define V4L2_FBUF_CAP_LOCAL_INV_ALPHA	0x0040
-#define V4L2_FBUF_CAP_SRC_CHROMAKEY	0x0080
-/*  Flags for the 'flags' field. */
-#define V4L2_FBUF_FLAG_PRIMARY		0x0001
-#define V4L2_FBUF_FLAG_OVERLAY		0x0002
-#define V4L2_FBUF_FLAG_CHROMAKEY	0x0004
-#define V4L2_FBUF_FLAG_LOCAL_ALPHA	0x0008
-#define V4L2_FBUF_FLAG_GLOBAL_ALPHA	0x0010
-#define V4L2_FBUF_FLAG_LOCAL_INV_ALPHA	0x0020
-#define V4L2_FBUF_FLAG_SRC_CHROMAKEY	0x0040
-
-struct v4l2_clip {
-	struct v4l2_rect        c;
-	struct v4l2_clip	__user *next;
-};
-
-struct v4l2_window {
-	struct v4l2_rect        w;
-	enum v4l2_field  	field;
-	__u32			chromakey;
-	struct v4l2_clip	__user *clips;
-	__u32			clipcount;
-	void			__user *bitmap;
-	__u8                    global_alpha;
-};
-
-/*
- *	C A P T U R E   P A R A M E T E R S
- */
-struct v4l2_captureparm {
-	__u32		   capability;	  /*  Supported modes */
-	__u32		   capturemode;	  /*  Current mode */
-	struct v4l2_fract  timeperframe;  /*  Time per frame in .1us units */
-	__u32		   extendedmode;  /*  Driver-specific extensions */
-	__u32              readbuffers;   /*  # of buffers for read */
-	__u32		   reserved[4];
-};
-
-/*  Flags for 'capability' and 'capturemode' fields */
-#define V4L2_MODE_HIGHQUALITY	0x0001	/*  High quality imaging mode */
-#define V4L2_CAP_TIMEPERFRAME	0x1000	/*  timeperframe field is supported */
-
-struct v4l2_outputparm {
-	__u32		   capability;	 /*  Supported modes */
-	__u32		   outputmode;	 /*  Current mode */
-	struct v4l2_fract  timeperframe; /*  Time per frame in seconds */
-	__u32		   extendedmode; /*  Driver-specific extensions */
-	__u32              writebuffers; /*  # of buffers for write */
-	__u32		   reserved[4];
-};
-
-/*
- *	I N P U T   I M A G E   C R O P P I N G
- */
-struct v4l2_cropcap {
-	enum v4l2_buf_type      type;
-	struct v4l2_rect        bounds;
-	struct v4l2_rect        defrect;
-	struct v4l2_fract       pixelaspect;
-};
-
-struct v4l2_crop {
-	enum v4l2_buf_type      type;
-	struct v4l2_rect        c;
-};
-
-/*
- *      A N A L O G   V I D E O   S T A N D A R D
- */
-
-typedef __u64 v4l2_std_id;
-
-/* one bit for each */
-#define V4L2_STD_PAL_B          ((v4l2_std_id)0x00000001)
-#define V4L2_STD_PAL_B1         ((v4l2_std_id)0x00000002)
-#define V4L2_STD_PAL_G          ((v4l2_std_id)0x00000004)
-#define V4L2_STD_PAL_H          ((v4l2_std_id)0x00000008)
-#define V4L2_STD_PAL_I          ((v4l2_std_id)0x00000010)
-#define V4L2_STD_PAL_D          ((v4l2_std_id)0x00000020)
-#define V4L2_STD_PAL_D1         ((v4l2_std_id)0x00000040)
-#define V4L2_STD_PAL_K          ((v4l2_std_id)0x00000080)
-
-#define V4L2_STD_PAL_M          ((v4l2_std_id)0x00000100)
-#define V4L2_STD_PAL_N          ((v4l2_std_id)0x00000200)
-#define V4L2_STD_PAL_Nc         ((v4l2_std_id)0x00000400)
-#define V4L2_STD_PAL_60         ((v4l2_std_id)0x00000800)
-
-#define V4L2_STD_NTSC_M         ((v4l2_std_id)0x00001000)
-#define V4L2_STD_NTSC_M_JP      ((v4l2_std_id)0x00002000)
-#define V4L2_STD_NTSC_443       ((v4l2_std_id)0x00004000)
-#define V4L2_STD_NTSC_M_KR      ((v4l2_std_id)0x00008000)
-
-#define V4L2_STD_SECAM_B        ((v4l2_std_id)0x00010000)
-#define V4L2_STD_SECAM_D        ((v4l2_std_id)0x00020000)
-#define V4L2_STD_SECAM_G        ((v4l2_std_id)0x00040000)
-#define V4L2_STD_SECAM_H        ((v4l2_std_id)0x00080000)
-#define V4L2_STD_SECAM_K        ((v4l2_std_id)0x00100000)
-#define V4L2_STD_SECAM_K1       ((v4l2_std_id)0x00200000)
-#define V4L2_STD_SECAM_L        ((v4l2_std_id)0x00400000)
-#define V4L2_STD_SECAM_LC       ((v4l2_std_id)0x00800000)
-
-/* ATSC/HDTV */
-#define V4L2_STD_ATSC_8_VSB     ((v4l2_std_id)0x01000000)
-#define V4L2_STD_ATSC_16_VSB    ((v4l2_std_id)0x02000000)
-
-/* FIXME:
-   Although std_id is 64 bits, there is an issue on PPC32 architecture that
-   makes switch(__u64) to break. So, there's a hack on v4l2-common.c rounding
-   this value to 32 bits.
-   As, currently, the max value is for V4L2_STD_ATSC_16_VSB (30 bits wide),
-   it should work fine. However, if needed to add more than two standards,
-   v4l2-common.c should be fixed.
- */
-
-/* some merged standards */
-#define V4L2_STD_MN	(V4L2_STD_PAL_M|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc|V4L2_STD_NTSC)
-#define V4L2_STD_B	(V4L2_STD_PAL_B|V4L2_STD_PAL_B1|V4L2_STD_SECAM_B)
-#define V4L2_STD_GH	(V4L2_STD_PAL_G|V4L2_STD_PAL_H|V4L2_STD_SECAM_G|V4L2_STD_SECAM_H)
-#define V4L2_STD_DK	(V4L2_STD_PAL_DK|V4L2_STD_SECAM_DK)
-
-/* some common needed stuff */
-#define V4L2_STD_PAL_BG		(V4L2_STD_PAL_B		|\
-				 V4L2_STD_PAL_B1	|\
-				 V4L2_STD_PAL_G)
-#define V4L2_STD_PAL_DK		(V4L2_STD_PAL_D		|\
-				 V4L2_STD_PAL_D1	|\
-				 V4L2_STD_PAL_K)
-#define V4L2_STD_PAL		(V4L2_STD_PAL_BG	|\
-				 V4L2_STD_PAL_DK	|\
-				 V4L2_STD_PAL_H		|\
-				 V4L2_STD_PAL_I)
-#define V4L2_STD_NTSC           (V4L2_STD_NTSC_M	|\
-				 V4L2_STD_NTSC_M_JP     |\
-				 V4L2_STD_NTSC_M_KR)
-#define V4L2_STD_SECAM_DK      	(V4L2_STD_SECAM_D	|\
-				 V4L2_STD_SECAM_K	|\
-				 V4L2_STD_SECAM_K1)
-#define V4L2_STD_SECAM		(V4L2_STD_SECAM_B	|\
-				 V4L2_STD_SECAM_G	|\
-				 V4L2_STD_SECAM_H	|\
-				 V4L2_STD_SECAM_DK	|\
-				 V4L2_STD_SECAM_L       |\
-				 V4L2_STD_SECAM_LC)
-
-#define V4L2_STD_525_60		(V4L2_STD_PAL_M		|\
-				 V4L2_STD_PAL_60	|\
-				 V4L2_STD_NTSC		|\
-				 V4L2_STD_NTSC_443)
-#define V4L2_STD_625_50		(V4L2_STD_PAL		|\
-				 V4L2_STD_PAL_N		|\
-				 V4L2_STD_PAL_Nc	|\
-				 V4L2_STD_SECAM)
-#define V4L2_STD_ATSC           (V4L2_STD_ATSC_8_VSB    |\
-				 V4L2_STD_ATSC_16_VSB)
-
-#define V4L2_STD_UNKNOWN        0
-#define V4L2_STD_ALL            (V4L2_STD_525_60	|\
-				 V4L2_STD_625_50)
-
-struct v4l2_standard {
-	__u32		     index;
-	v4l2_std_id          id;
-	__u8		     name[24];
-	struct v4l2_fract    frameperiod; /* Frames, not fields */
-	__u32		     framelines;
-	__u32		     reserved[4];
-};
-
-/*
- *	V I D E O	T I M I N G S	D V	P R E S E T
- */
-struct v4l2_dv_preset {
-	__u32	preset;
-	__u32	reserved[4];
-};
-
-/*
- *	D V	P R E S E T S	E N U M E R A T I O N
- */
-struct v4l2_dv_enum_preset {
-	__u32	index;
-	__u32	preset;
-	__u8	name[32]; /* Name of the preset timing */
-	__u32	width;
-	__u32	height;
-	__u32	reserved[4];
-};
-
-/*
- * 	D V	P R E S E T	V A L U E S
- */
-#define		V4L2_DV_INVALID		0
-#define		V4L2_DV_480P59_94	1 /* BT.1362 */
-#define		V4L2_DV_576P50		2 /* BT.1362 */
-#define		V4L2_DV_720P24		3 /* SMPTE 296M */
-#define		V4L2_DV_720P25		4 /* SMPTE 296M */
-#define		V4L2_DV_720P30		5 /* SMPTE 296M */
-#define		V4L2_DV_720P50		6 /* SMPTE 296M */
-#define		V4L2_DV_720P59_94	7 /* SMPTE 274M */
-#define		V4L2_DV_720P60		8 /* SMPTE 274M/296M */
-#define		V4L2_DV_1080I29_97	9 /* BT.1120/ SMPTE 274M */
-#define		V4L2_DV_1080I30		10 /* BT.1120/ SMPTE 274M */
-#define		V4L2_DV_1080I25		11 /* BT.1120 */
-#define		V4L2_DV_1080I50		12 /* SMPTE 296M */
-#define		V4L2_DV_1080I60		13 /* SMPTE 296M */
-#define		V4L2_DV_1080P24		14 /* SMPTE 296M */
-#define		V4L2_DV_1080P25		15 /* SMPTE 296M */
-#define		V4L2_DV_1080P30		16 /* SMPTE 296M */
-#define		V4L2_DV_1080P50		17 /* BT.1120 */
-#define		V4L2_DV_1080P60		18 /* BT.1120 */
-
-#define		V4L2_DV_480P60			19
-#define		V4L2_DV_1080I59_94		20
-#define		V4L2_DV_1080P59_94		21
-
-#define		V4L2_DV_720P60_FP		22
-#define		V4L2_DV_720P60_SB_HALF		23
-#define		V4L2_DV_720P60_TB		24
-#define		V4L2_DV_720P59_94_FP		25
-#define		V4L2_DV_720P59_94_SB_HALF	26
-#define		V4L2_DV_720P59_94_TB		27
-#define		V4L2_DV_720P50_FP		28
-#define		V4L2_DV_720P50_SB_HALF		29
-#define		V4L2_DV_720P50_TB		30
-#define		V4L2_DV_1080P24_FP		31
-#define		V4L2_DV_1080P24_SB_HALF		32
-#define		V4L2_DV_1080P24_TB		33
-#define		V4L2_DV_1080P23_98_FP		34
-#define		V4L2_DV_1080P23_98_SB_HALF	35
-#define		V4L2_DV_1080P23_98_TB		36
-#define		V4L2_DV_1080I60_SB_HALF		37
-#define		V4L2_DV_1080I59_94_SB_HALF	38
-#define		V4L2_DV_1080I50_SB_HALF		39
-#define		V4L2_DV_1080P60_SB_HALF		40
-#define		V4L2_DV_1080P60_TB		41
-#define		V4L2_DV_1080P30_FP		42
-#define		V4L2_DV_1080P30_SB_HALF		43
-#define		V4L2_DV_1080P30_TB		44
-
-/*
- *	D V 	B T	T I M I N G S
- */
-
-/* BT.656/BT.1120 timing data */
-struct v4l2_bt_timings {
-	__u32	width;		/* width in pixels */
-	__u32	height;		/* height in lines */
-	__u32	interlaced;	/* Interlaced or progressive */
-	__u32	polarities;	/* Positive or negative polarity */
-	__u64	pixelclock;	/* Pixel clock in HZ. Ex. 74.25MHz->74250000 */
-	__u32	hfrontporch;	/* Horizpontal front porch in pixels */
-	__u32	hsync;		/* Horizontal Sync length in pixels */
-	__u32	hbackporch;	/* Horizontal back porch in pixels */
-	__u32	vfrontporch;	/* Vertical front porch in pixels */
-	__u32	vsync;		/* Vertical Sync length in lines */
-	__u32	vbackporch;	/* Vertical back porch in lines */
-	__u32	il_vfrontporch;	/* Vertical front porch for bottom field of
-				 * interlaced field formats
-				 */
-	__u32	il_vsync;	/* Vertical sync length for bottom field of
-				 * interlaced field formats
-				 */
-	__u32	il_vbackporch;	/* Vertical back porch for bottom field of
-				 * interlaced field formats
-				 */
-	__u32	reserved[16];
-} __attribute__ ((packed));
-
-/* Interlaced or progressive format */
-#define	V4L2_DV_PROGRESSIVE	0
-#define	V4L2_DV_INTERLACED	1
-
-/* Polarities. If bit is not set, it is assumed to be negative polarity */
-#define V4L2_DV_VSYNC_POS_POL	0x00000001
-#define V4L2_DV_HSYNC_POS_POL	0x00000002
-
-
-/* DV timings */
-struct v4l2_dv_timings {
-	__u32 type;
-	union {
-		struct v4l2_bt_timings	bt;
-		__u32	reserved[32];
-	};
-} __attribute__ ((packed));
-
-/* Values for the type field */
-#define V4L2_DV_BT_656_1120	0	/* BT.656/1120 timing type */
-
-/*
- *	V I D E O   I N P U T S
- */
-struct v4l2_input {
-	__u32	     index;		/*  Which input */
-	__u8	     name[32];		/*  Label */
-	__u32	     type;		/*  Type of input */
-	__u32	     audioset;		/*  Associated audios (bitfield) */
-	__u32        tuner;             /*  Associated tuner */
-	v4l2_std_id  std;
-	__u32	     status;
-	__u32	     capabilities;
-	__u32	     reserved[3];
-};
-
-/*  Values for the 'type' field */
-#define V4L2_INPUT_TYPE_TUNER		1
-#define V4L2_INPUT_TYPE_CAMERA		2
-
-/* field 'status' - general */
-#define V4L2_IN_ST_NO_POWER    0x00000001  /* Attached device is off */
-#define V4L2_IN_ST_NO_SIGNAL   0x00000002
-#define V4L2_IN_ST_NO_COLOR    0x00000004
-
-/* field 'status' - sensor orientation */
-/* If sensor is mounted upside down set both bits */
-#define V4L2_IN_ST_HFLIP       0x00000010 /* Frames are flipped horizontally */
-#define V4L2_IN_ST_VFLIP       0x00000020 /* Frames are flipped vertically */
-
-/* field 'status' - analog */
-#define V4L2_IN_ST_NO_H_LOCK   0x00000100  /* No horizontal sync lock */
-#define V4L2_IN_ST_COLOR_KILL  0x00000200  /* Color killer is active */
-
-/* field 'status' - digital */
-#define V4L2_IN_ST_NO_SYNC     0x00010000  /* No synchronization lock */
-#define V4L2_IN_ST_NO_EQU      0x00020000  /* No equalizer lock */
-#define V4L2_IN_ST_NO_CARRIER  0x00040000  /* Carrier recovery failed */
-
-/* field 'status' - VCR and set-top box */
-#define V4L2_IN_ST_MACROVISION 0x01000000  /* Macrovision detected */
-#define V4L2_IN_ST_NO_ACCESS   0x02000000  /* Conditional access denied */
-#define V4L2_IN_ST_VTR         0x04000000  /* VTR time constant */
-
-/* capabilities flags */
-#define V4L2_IN_CAP_PRESETS		0x00000001 /* Supports S_DV_PRESET */
-#define V4L2_IN_CAP_CUSTOM_TIMINGS	0x00000002 /* Supports S_DV_TIMINGS */
-#define V4L2_IN_CAP_STD			0x00000004 /* Supports S_STD */
-
-/*
- *	V I D E O   O U T P U T S
- */
-struct v4l2_output {
-	__u32	     index;		/*  Which output */
-	__u8	     name[32];		/*  Label */
-	__u32	     type;		/*  Type of output */
-	__u32	     audioset;		/*  Associated audios (bitfield) */
-	__u32	     modulator;         /*  Associated modulator */
-	v4l2_std_id  std;
-	__u32	     capabilities;
-	__u32	     reserved[3];
-};
-/*  Values for the 'type' field */
-#define V4L2_OUTPUT_TYPE_MODULATOR		1
-#define V4L2_OUTPUT_TYPE_ANALOG			2
-#define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY	3
-
-/* capabilities flags */
-#define V4L2_OUT_CAP_PRESETS		0x00000001 /* Supports S_DV_PRESET */
-#define V4L2_OUT_CAP_CUSTOM_TIMINGS	0x00000002 /* Supports S_DV_TIMINGS */
-#define V4L2_OUT_CAP_STD		0x00000004 /* Supports S_STD */
-
-/*
- *	C O N T R O L S
- */
-struct v4l2_control {
-	__u32		     id;
-	__s32		     value;
-};
-
-struct v4l2_ext_control {
-	__u32 id;
-	__u32 size;
-	__u32 reserved2[1];
-	union {
-		__s32 value;
-		__s64 value64;
-		char *string;
-	};
-} __attribute__ ((packed));
-
-struct v4l2_ext_controls {
-	__u32 ctrl_class;
-	__u32 count;
-	__u32 error_idx;
-	__u32 reserved[2];
-	struct v4l2_ext_control *controls;
-};
-
-/*  Values for ctrl_class field */
-#define V4L2_CTRL_CLASS_USER 0x00980000	/* Old-style 'user' controls */
-#define V4L2_CTRL_CLASS_MPEG 0x00990000	/* MPEG-compression controls */
-#define V4L2_CTRL_CLASS_CAMERA 0x009a0000	/* Camera class controls */
-#define V4L2_CTRL_CLASS_FM_TX 0x009b0000	/* FM Modulator control class */
-#define V4L2_CTRL_CLASS_CODEC 0x009c0000	/* Codec control class */
-
-#define V4L2_CTRL_ID_MASK      	  (0x0fffffff)
-#define V4L2_CTRL_ID2CLASS(id)    ((id) & 0x0fff0000UL)
-#define V4L2_CTRL_DRIVER_PRIV(id) (((id) & 0xffff) >= 0x1000)
-
-enum v4l2_ctrl_type {
-	V4L2_CTRL_TYPE_INTEGER	     = 1,
-	V4L2_CTRL_TYPE_BOOLEAN	     = 2,
-	V4L2_CTRL_TYPE_MENU	     = 3,
-	V4L2_CTRL_TYPE_BUTTON	     = 4,
-	V4L2_CTRL_TYPE_INTEGER64     = 5,
-	V4L2_CTRL_TYPE_CTRL_CLASS    = 6,
-	V4L2_CTRL_TYPE_STRING        = 7,
-};
-
-/*  Used in the VIDIOC_QUERYCTRL ioctl for querying controls */
-struct v4l2_queryctrl {
-	__u32		     id;
-	enum v4l2_ctrl_type  type;
-	__u8		     name[32];	/* Whatever */
-	__s32		     minimum;	/* Note signedness */
-	__s32		     maximum;
-	__s32		     step;
-	__s32		     default_value;
-	__u32                flags;
-	__u32		     reserved[2];
-};
-
-/*  Used in the VIDIOC_QUERYMENU ioctl for querying menu items */
-struct v4l2_querymenu {
-	__u32		id;
-	__u32		index;
-	__u8		name[32];	/* Whatever */
-	__u32		reserved;
-};
-
-/*  Control flags  */
-#define V4L2_CTRL_FLAG_DISABLED		0x0001
-#define V4L2_CTRL_FLAG_GRABBED		0x0002
-#define V4L2_CTRL_FLAG_READ_ONLY 	0x0004
-#define V4L2_CTRL_FLAG_UPDATE 		0x0008
-#define V4L2_CTRL_FLAG_INACTIVE 	0x0010
-#define V4L2_CTRL_FLAG_SLIDER 		0x0020
-#define V4L2_CTRL_FLAG_WRITE_ONLY 	0x0040
-
-/*  Query flag, to be ORed with the control ID */
-#define V4L2_CTRL_FLAG_NEXT_CTRL	0x80000000
-
-/*  User-class control IDs defined by V4L2 */
-#define V4L2_CID_BASE			(V4L2_CTRL_CLASS_USER | 0x900)
-#define V4L2_CID_USER_BASE 		V4L2_CID_BASE
-/*  IDs reserved for driver specific controls */
-#define V4L2_CID_PRIVATE_BASE		0x08000000
-
-#define V4L2_CID_USER_CLASS 		(V4L2_CTRL_CLASS_USER | 1)
-#define V4L2_CID_BRIGHTNESS		(V4L2_CID_BASE+0)
-#define V4L2_CID_CONTRAST		(V4L2_CID_BASE+1)
-#define V4L2_CID_SATURATION		(V4L2_CID_BASE+2)
-#define V4L2_CID_HUE			(V4L2_CID_BASE+3)
-#define V4L2_CID_AUDIO_VOLUME		(V4L2_CID_BASE+5)
-#define V4L2_CID_AUDIO_BALANCE		(V4L2_CID_BASE+6)
-#define V4L2_CID_AUDIO_BASS		(V4L2_CID_BASE+7)
-#define V4L2_CID_AUDIO_TREBLE		(V4L2_CID_BASE+8)
-#define V4L2_CID_AUDIO_MUTE		(V4L2_CID_BASE+9)
-#define V4L2_CID_AUDIO_LOUDNESS		(V4L2_CID_BASE+10)
-#define V4L2_CID_BLACK_LEVEL		(V4L2_CID_BASE+11) /* Deprecated */
-#define V4L2_CID_AUTO_WHITE_BALANCE	(V4L2_CID_BASE+12)
-#define V4L2_CID_DO_WHITE_BALANCE	(V4L2_CID_BASE+13)
-#define V4L2_CID_RED_BALANCE		(V4L2_CID_BASE+14)
-#define V4L2_CID_BLUE_BALANCE		(V4L2_CID_BASE+15)
-#define V4L2_CID_GAMMA			(V4L2_CID_BASE+16)
-#define V4L2_CID_WHITENESS		(V4L2_CID_GAMMA) /* Deprecated */
-#define V4L2_CID_EXPOSURE		(V4L2_CID_BASE+17)
-#define V4L2_CID_AUTOGAIN		(V4L2_CID_BASE+18)
-#define V4L2_CID_GAIN			(V4L2_CID_BASE+19)
-#define V4L2_CID_HFLIP			(V4L2_CID_BASE+20)
-#define V4L2_CID_VFLIP			(V4L2_CID_BASE+21)
-
-/* Deprecated; use V4L2_CID_PAN_RESET and V4L2_CID_TILT_RESET */
-#define V4L2_CID_HCENTER		(V4L2_CID_BASE+22)
-#define V4L2_CID_VCENTER		(V4L2_CID_BASE+23)
-
-#define V4L2_CID_POWER_LINE_FREQUENCY	(V4L2_CID_BASE+24)
-enum v4l2_power_line_frequency {
-	V4L2_CID_POWER_LINE_FREQUENCY_DISABLED	= 0,
-	V4L2_CID_POWER_LINE_FREQUENCY_50HZ	= 1,
-	V4L2_CID_POWER_LINE_FREQUENCY_60HZ	= 2,
-};
-#define V4L2_CID_HUE_AUTO			(V4L2_CID_BASE+25)
-#define V4L2_CID_WHITE_BALANCE_TEMPERATURE	(V4L2_CID_BASE+26)
-#define V4L2_CID_SHARPNESS			(V4L2_CID_BASE+27)
-#define V4L2_CID_BACKLIGHT_COMPENSATION 	(V4L2_CID_BASE+28)
-#define V4L2_CID_CHROMA_AGC                     (V4L2_CID_BASE+29)
-#define V4L2_CID_COLOR_KILLER                   (V4L2_CID_BASE+30)
-#define V4L2_CID_COLORFX			(V4L2_CID_BASE+31)
-enum v4l2_colorfx {
-	V4L2_COLORFX_NONE	= 0,
-	V4L2_COLORFX_BW		= 1,
-	V4L2_COLORFX_SEPIA	= 2,
-	V4L2_COLORFX_NEGATIVE = 3,
-	V4L2_COLORFX_EMBOSS = 4,
-	V4L2_COLORFX_SKETCH = 5,
-	V4L2_COLORFX_SKY_BLUE = 6,
-	V4L2_COLORFX_GRASS_GREEN = 7,
-	V4L2_COLORFX_SKIN_WHITEN = 8,
-	V4L2_COLORFX_VIVID = 9,
-};
-#define V4L2_CID_AUTOBRIGHTNESS			(V4L2_CID_BASE+32)
-#define V4L2_CID_BAND_STOP_FILTER		(V4L2_CID_BASE+33)
-
-#define V4L2_CID_ROTATE				(V4L2_CID_BASE+34)
-#define V4L2_CID_BG_COLOR			(V4L2_CID_BASE+35)
-
-#define V4L2_CID_CHROMA_GAIN                    (V4L2_CID_BASE+36)
-
-#define V4L2_CID_ILLUMINATORS_1			(V4L2_CID_BASE+37)
-#define V4L2_CID_ILLUMINATORS_2			(V4L2_CID_BASE+38)
-
-/*
- * This is custom CID
- */
-/* for rgb alpha function */
-#define V4L2_CID_GLOBAL_ALPHA			(V4L2_CID_BASE+39)
-
-/* cacheable configuration */
-#define V4L2_CID_CACHEABLE			(V4L2_CID_BASE+40)
-
-/* jpeg captured size */
-#define V4L2_CID_CAM_JPEG_MEMSIZE		(V4L2_CID_BASE+41)
-#define V4L2_CID_CAM_JPEG_ENCODEDSIZE		(V4L2_CID_BASE+42)
-
-#define V4L2_CID_SET_SHAREABLE			(V4L2_CID_BASE+43)
-
-/* TV configuration */
-#define V4L2_CID_TV_LAYER_BLEND_ENABLE		(V4L2_CID_BASE+44)
-#define V4L2_CID_TV_LAYER_BLEND_ALPHA		(V4L2_CID_BASE+45)
-#define V4L2_CID_TV_PIXEL_BLEND_ENABLE		(V4L2_CID_BASE+46)
-#define V4L2_CID_TV_CHROMA_ENABLE		(V4L2_CID_BASE+47)
-#define V4L2_CID_TV_CHROMA_VALUE		(V4L2_CID_BASE+48)
-#define V4L2_CID_TV_HPD_STATUS			(V4L2_CID_BASE+49)
-
-/* last CID + 1 */
-#define V4L2_CID_LASTP1				(V4L2_CID_BASE+50)
-
-/*  MPEG-class control IDs defined by V4L2 */
-#define V4L2_CID_MPEG_BASE 			(V4L2_CTRL_CLASS_MPEG | 0x900)
-#define V4L2_CID_MPEG_CLASS 			(V4L2_CTRL_CLASS_MPEG | 1)
-
-/*  MPEG streams */
-#define V4L2_CID_MPEG_STREAM_TYPE 		(V4L2_CID_MPEG_BASE+0)
-enum v4l2_mpeg_stream_type {
-	V4L2_MPEG_STREAM_TYPE_MPEG2_PS   = 0, /* MPEG-2 program stream */
-	V4L2_MPEG_STREAM_TYPE_MPEG2_TS   = 1, /* MPEG-2 transport stream */
-	V4L2_MPEG_STREAM_TYPE_MPEG1_SS   = 2, /* MPEG-1 system stream */
-	V4L2_MPEG_STREAM_TYPE_MPEG2_DVD  = 3, /* MPEG-2 DVD-compatible stream */
-	V4L2_MPEG_STREAM_TYPE_MPEG1_VCD  = 4, /* MPEG-1 VCD-compatible stream */
-	V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD = 5, /* MPEG-2 SVCD-compatible stream */
-};
-#define V4L2_CID_MPEG_STREAM_PID_PMT 		(V4L2_CID_MPEG_BASE+1)
-#define V4L2_CID_MPEG_STREAM_PID_AUDIO 		(V4L2_CID_MPEG_BASE+2)
-#define V4L2_CID_MPEG_STREAM_PID_VIDEO 		(V4L2_CID_MPEG_BASE+3)
-#define V4L2_CID_MPEG_STREAM_PID_PCR 		(V4L2_CID_MPEG_BASE+4)
-#define V4L2_CID_MPEG_STREAM_PES_ID_AUDIO 	(V4L2_CID_MPEG_BASE+5)
-#define V4L2_CID_MPEG_STREAM_PES_ID_VIDEO 	(V4L2_CID_MPEG_BASE+6)
-#define V4L2_CID_MPEG_STREAM_VBI_FMT 		(V4L2_CID_MPEG_BASE+7)
-enum v4l2_mpeg_stream_vbi_fmt {
-	V4L2_MPEG_STREAM_VBI_FMT_NONE = 0,  /* No VBI in the MPEG stream */
-	V4L2_MPEG_STREAM_VBI_FMT_IVTV = 1,  /* VBI in private packets, IVTV format */
-};
-
-/*  MPEG audio */
-#define V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ 	(V4L2_CID_MPEG_BASE+100)
-enum v4l2_mpeg_audio_sampling_freq {
-	V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100 = 0,
-	V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000 = 1,
-	V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000 = 2,
-};
-#define V4L2_CID_MPEG_AUDIO_ENCODING 		(V4L2_CID_MPEG_BASE+101)
-enum v4l2_mpeg_audio_encoding {
-	V4L2_MPEG_AUDIO_ENCODING_LAYER_1 = 0,
-	V4L2_MPEG_AUDIO_ENCODING_LAYER_2 = 1,
-	V4L2_MPEG_AUDIO_ENCODING_LAYER_3 = 2,
-	V4L2_MPEG_AUDIO_ENCODING_AAC     = 3,
-	V4L2_MPEG_AUDIO_ENCODING_AC3     = 4,
-};
-#define V4L2_CID_MPEG_AUDIO_L1_BITRATE 		(V4L2_CID_MPEG_BASE+102)
-enum v4l2_mpeg_audio_l1_bitrate {
-	V4L2_MPEG_AUDIO_L1_BITRATE_32K  = 0,
-	V4L2_MPEG_AUDIO_L1_BITRATE_64K  = 1,
-	V4L2_MPEG_AUDIO_L1_BITRATE_96K  = 2,
-	V4L2_MPEG_AUDIO_L1_BITRATE_128K = 3,
-	V4L2_MPEG_AUDIO_L1_BITRATE_160K = 4,
-	V4L2_MPEG_AUDIO_L1_BITRATE_192K = 5,
-	V4L2_MPEG_AUDIO_L1_BITRATE_224K = 6,
-	V4L2_MPEG_AUDIO_L1_BITRATE_256K = 7,
-	V4L2_MPEG_AUDIO_L1_BITRATE_288K = 8,
-	V4L2_MPEG_AUDIO_L1_BITRATE_320K = 9,
-	V4L2_MPEG_AUDIO_L1_BITRATE_352K = 10,
-	V4L2_MPEG_AUDIO_L1_BITRATE_384K = 11,
-	V4L2_MPEG_AUDIO_L1_BITRATE_416K = 12,
-	V4L2_MPEG_AUDIO_L1_BITRATE_448K = 13,
-};
-#define V4L2_CID_MPEG_AUDIO_L2_BITRATE 		(V4L2_CID_MPEG_BASE+103)
-enum v4l2_mpeg_audio_l2_bitrate {
-	V4L2_MPEG_AUDIO_L2_BITRATE_32K  = 0,
-	V4L2_MPEG_AUDIO_L2_BITRATE_48K  = 1,
-	V4L2_MPEG_AUDIO_L2_BITRATE_56K  = 2,
-	V4L2_MPEG_AUDIO_L2_BITRATE_64K  = 3,
-	V4L2_MPEG_AUDIO_L2_BITRATE_80K  = 4,
-	V4L2_MPEG_AUDIO_L2_BITRATE_96K  = 5,
-	V4L2_MPEG_AUDIO_L2_BITRATE_112K = 6,
-	V4L2_MPEG_AUDIO_L2_BITRATE_128K = 7,
-	V4L2_MPEG_AUDIO_L2_BITRATE_160K = 8,
-	V4L2_MPEG_AUDIO_L2_BITRATE_192K = 9,
-	V4L2_MPEG_AUDIO_L2_BITRATE_224K = 10,
-	V4L2_MPEG_AUDIO_L2_BITRATE_256K = 11,
-	V4L2_MPEG_AUDIO_L2_BITRATE_320K = 12,
-	V4L2_MPEG_AUDIO_L2_BITRATE_384K = 13,
-};
-#define V4L2_CID_MPEG_AUDIO_L3_BITRATE 		(V4L2_CID_MPEG_BASE+104)
-enum v4l2_mpeg_audio_l3_bitrate {
-	V4L2_MPEG_AUDIO_L3_BITRATE_32K  = 0,
-	V4L2_MPEG_AUDIO_L3_BITRATE_40K  = 1,
-	V4L2_MPEG_AUDIO_L3_BITRATE_48K  = 2,
-	V4L2_MPEG_AUDIO_L3_BITRATE_56K  = 3,
-	V4L2_MPEG_AUDIO_L3_BITRATE_64K  = 4,
-	V4L2_MPEG_AUDIO_L3_BITRATE_80K  = 5,
-	V4L2_MPEG_AUDIO_L3_BITRATE_96K  = 6,
-	V4L2_MPEG_AUDIO_L3_BITRATE_112K = 7,
-	V4L2_MPEG_AUDIO_L3_BITRATE_128K = 8,
-	V4L2_MPEG_AUDIO_L3_BITRATE_160K = 9,
-	V4L2_MPEG_AUDIO_L3_BITRATE_192K = 10,
-	V4L2_MPEG_AUDIO_L3_BITRATE_224K = 11,
-	V4L2_MPEG_AUDIO_L3_BITRATE_256K = 12,
-	V4L2_MPEG_AUDIO_L3_BITRATE_320K = 13,
-};
-#define V4L2_CID_MPEG_AUDIO_MODE 		(V4L2_CID_MPEG_BASE+105)
-enum v4l2_mpeg_audio_mode {
-	V4L2_MPEG_AUDIO_MODE_STEREO       = 0,
-	V4L2_MPEG_AUDIO_MODE_JOINT_STEREO = 1,
-	V4L2_MPEG_AUDIO_MODE_DUAL         = 2,
-	V4L2_MPEG_AUDIO_MODE_MONO         = 3,
-};
-#define V4L2_CID_MPEG_AUDIO_MODE_EXTENSION 	(V4L2_CID_MPEG_BASE+106)
-enum v4l2_mpeg_audio_mode_extension {
-	V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4  = 0,
-	V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_8  = 1,
-	V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_12 = 2,
-	V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16 = 3,
-};
-#define V4L2_CID_MPEG_AUDIO_EMPHASIS 		(V4L2_CID_MPEG_BASE+107)
-enum v4l2_mpeg_audio_emphasis {
-	V4L2_MPEG_AUDIO_EMPHASIS_NONE         = 0,
-	V4L2_MPEG_AUDIO_EMPHASIS_50_DIV_15_uS = 1,
-	V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17    = 2,
-};
-#define V4L2_CID_MPEG_AUDIO_CRC 		(V4L2_CID_MPEG_BASE+108)
-enum v4l2_mpeg_audio_crc {
-	V4L2_MPEG_AUDIO_CRC_NONE  = 0,
-	V4L2_MPEG_AUDIO_CRC_CRC16 = 1,
-};
-#define V4L2_CID_MPEG_AUDIO_MUTE 		(V4L2_CID_MPEG_BASE+109)
-#define V4L2_CID_MPEG_AUDIO_AAC_BITRATE		(V4L2_CID_MPEG_BASE+110)
-#define V4L2_CID_MPEG_AUDIO_AC3_BITRATE		(V4L2_CID_MPEG_BASE+111)
-enum v4l2_mpeg_audio_ac3_bitrate {
-	V4L2_MPEG_AUDIO_AC3_BITRATE_32K  = 0,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_40K  = 1,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_48K  = 2,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_56K  = 3,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_64K  = 4,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_80K  = 5,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_96K  = 6,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_112K = 7,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_128K = 8,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_160K = 9,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_192K = 10,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_224K = 11,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_256K = 12,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_320K = 13,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_384K = 14,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_448K = 15,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_512K = 16,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_576K = 17,
-	V4L2_MPEG_AUDIO_AC3_BITRATE_640K = 18,
-};
-
-/*  MPEG video */
-#define V4L2_CID_MPEG_VIDEO_ENCODING 		(V4L2_CID_MPEG_BASE+200)
-enum v4l2_mpeg_video_encoding {
-	V4L2_MPEG_VIDEO_ENCODING_MPEG_1     = 0,
-	V4L2_MPEG_VIDEO_ENCODING_MPEG_2     = 1,
-	V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC = 2,
-};
-#define V4L2_CID_MPEG_VIDEO_ASPECT 		(V4L2_CID_MPEG_BASE+201)
-enum v4l2_mpeg_video_aspect {
-	V4L2_MPEG_VIDEO_ASPECT_1x1     = 0,
-	V4L2_MPEG_VIDEO_ASPECT_4x3     = 1,
-	V4L2_MPEG_VIDEO_ASPECT_16x9    = 2,
-	V4L2_MPEG_VIDEO_ASPECT_221x100 = 3,
-};
-#define V4L2_CID_MPEG_VIDEO_B_FRAMES 		(V4L2_CID_MPEG_BASE+202)
-#define V4L2_CID_MPEG_VIDEO_GOP_SIZE 		(V4L2_CID_MPEG_BASE+203)
-#define V4L2_CID_MPEG_VIDEO_GOP_CLOSURE 	(V4L2_CID_MPEG_BASE+204)
-#define V4L2_CID_MPEG_VIDEO_PULLDOWN 		(V4L2_CID_MPEG_BASE+205)
-#define V4L2_CID_MPEG_VIDEO_BITRATE_MODE 	(V4L2_CID_MPEG_BASE+206)
-enum v4l2_mpeg_video_bitrate_mode {
-	V4L2_MPEG_VIDEO_BITRATE_MODE_VBR = 0,
-	V4L2_MPEG_VIDEO_BITRATE_MODE_CBR = 1,
-};
-#define V4L2_CID_MPEG_VIDEO_BITRATE 		(V4L2_CID_MPEG_BASE+207)
-#define V4L2_CID_MPEG_VIDEO_BITRATE_PEAK 	(V4L2_CID_MPEG_BASE+208)
-#define V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (V4L2_CID_MPEG_BASE+209)
-#define V4L2_CID_MPEG_VIDEO_MUTE 		(V4L2_CID_MPEG_BASE+210)
-#define V4L2_CID_MPEG_VIDEO_MUTE_YUV 		(V4L2_CID_MPEG_BASE+211)
-
-/*  MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */
-#define V4L2_CID_MPEG_CX2341X_BASE 				(V4L2_CTRL_CLASS_MPEG | 0x1000)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE 	(V4L2_CID_MPEG_CX2341X_BASE+0)
-enum v4l2_mpeg_cx2341x_video_spatial_filter_mode {
-	V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL = 0,
-	V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO   = 1,
-};
-#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER 		(V4L2_CID_MPEG_CX2341X_BASE+1)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE 	(V4L2_CID_MPEG_CX2341X_BASE+2)
-enum v4l2_mpeg_cx2341x_video_luma_spatial_filter_type {
-	V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF                  = 0,
-	V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR               = 1,
-	V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_VERT              = 2,
-	V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_HV_SEPARABLE      = 3,
-	V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE = 4,
-};
-#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE 	(V4L2_CID_MPEG_CX2341X_BASE+3)
-enum v4l2_mpeg_cx2341x_video_chroma_spatial_filter_type {
-	V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF    = 0,
-	V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR = 1,
-};
-#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE 	(V4L2_CID_MPEG_CX2341X_BASE+4)
-enum v4l2_mpeg_cx2341x_video_temporal_filter_mode {
-	V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL = 0,
-	V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO   = 1,
-};
-#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER 		(V4L2_CID_MPEG_CX2341X_BASE+5)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE 		(V4L2_CID_MPEG_CX2341X_BASE+6)
-enum v4l2_mpeg_cx2341x_video_median_filter_type {
-	V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF      = 0,
-	V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR      = 1,
-	V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_VERT     = 2,
-	V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR_VERT = 3,
-	V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG     = 4,
-};
-#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM 	(V4L2_CID_MPEG_CX2341X_BASE+7)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP 	(V4L2_CID_MPEG_CX2341X_BASE+8)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM	(V4L2_CID_MPEG_CX2341X_BASE+9)
-#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP 	(V4L2_CID_MPEG_CX2341X_BASE+10)
-#define V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS 	(V4L2_CID_MPEG_CX2341X_BASE+11)
-
-/* For codecs */
-
-#define V4L2_CID_CODEC_BASE 			(V4L2_CTRL_CLASS_CODEC | 0x900)
-#define V4L2_CID_CODEC_CLASS 			(V4L2_CTRL_CLASS_CODEC | 1)
-
-/* Codec class control IDs specific to the MFC5X driver */
-#define V4L2_CID_CODEC_MFC5X_BASE		(V4L2_CTRL_CLASS_CODEC | 0x1000)
-
-/* For both decoding and encoding */
-
-/* For decoding */
-
-#define V4L2_CID_CODEC_LOOP_FILTER_MPEG4_ENABLE	(V4L2_CID_CODEC_BASE + 110)
-#define V4L2_CID_CODEC_DISPLAY_DELAY		(V4L2_CID_CODEC_BASE + 137)
-#define V4L2_CID_CODEC_REQ_NUM_BUFS		(V4L2_CID_CODEC_BASE + 140)
-#define V4L2_CID_CODEC_SLICE_INTERFACE		(V4L2_CID_CODEC_BASE + 141)
-#define V4L2_CID_CODEC_PACKED_PB		(V4L2_CID_CODEC_BASE + 142)
-#define V4L2_CID_CODEC_FRAME_TAG		(V4L2_CID_CODEC_BASE + 143)
-#define V4L2_CID_CODEC_CRC_ENABLE		(V4L2_CID_CODEC_BASE + 144)
-#define V4L2_CID_CODEC_CRC_DATA_LUMA		(V4L2_CID_CODEC_BASE + 145)
-#define V4L2_CID_CODEC_CRC_DATA_CHROMA		(V4L2_CID_CODEC_BASE + 146)
-#define V4L2_CID_CODEC_CRC_DATA_LUMA_BOT	(V4L2_CID_CODEC_BASE + 147)
-#define V4L2_CID_CODEC_CRC_DATA_CHROMA_BOT	(V4L2_CID_CODEC_BASE + 148)
-#define V4L2_CID_CODEC_CRC_GENERATED		(V4L2_CID_CODEC_BASE + 149)
-#define V4L2_CID_CODEC_FRAME_TYPE		(V4L2_CID_CODEC_BASE + 154)
-#define V4L2_CID_CODEC_CHECK_STATE		(V4L2_CID_CODEC_BASE + 155)
-#define V4L2_CID_CODEC_DISPLAY_STATUS		(V4L2_CID_CODEC_BASE + 156)
-#define V4L2_CID_CODEC_FRAME_PACK_SEI_PARSE	(V4L2_CID_CODEC_BASE + 157)
-#define V4L2_CID_CODEC_FRAME_PACK_SEI_AVAIL	(V4L2_CID_CODEC_BASE + 158)
-#define V4L2_CID_CODEC_FRAME_PACK_ARRGMENT_ID	(V4L2_CID_CODEC_BASE + 159)
-#define V4L2_CID_CODEC_FRAME_PACK_SEI_INFO	(V4L2_CID_CODEC_BASE + 160)
-#define V4L2_CID_CODEC_FRAME_PACK_GRID_POS	(V4L2_CID_CODEC_BASE + 161)
-
-/* For encoding */
-#define V4L2_CID_CODEC_LOOP_FILTER_H264		(V4L2_CID_CODEC_BASE + 9)
-enum v4l2_cid_codec_loop_filter_h264 {
-	V4L2_CID_CODEC_LOOP_FILTER_H264_ENABLE = 0,
-	V4L2_CID_CODEC_LOOP_FILTER_H264_DISABLE = 1,
-	V4L2_CID_CODEC_LOOP_FILTER_H264_DISABLE_AT_BOUNDARY = 2,
-};
-
-#define V4L2_CID_CODEC_FRAME_INSERTION		(V4L2_CID_CODEC_BASE + 10)
-enum v4l2_cid_codec_frame_insertion {
-	V4L2_CID_CODEC_FRAME_INSERT_NONE = 0x0,
-	V4L2_CID_CODEC_FRAME_INSERT_I_FRAME = 0x1,
-	V4L2_CID_CODEC_FRAME_INSERT_NOT_CODED = 0x2,
-};
-
-#define V4L2_CID_CODEC_ENCODED_LUMA_ADDR	(V4L2_CID_CODEC_BASE + 11)
-#define V4L2_CID_CODEC_ENCODED_CHROMA_ADDR	(V4L2_CID_CODEC_BASE + 12)
-
-#define V4L2_CID_CODEC_ENCODED_I_PERIOD_CH	V4L2_CID_CODEC_MFC5X_ENC_GOP_SIZE
-#define V4L2_CID_CODEC_ENCODED_FRAME_RATE_CH 	V4L2_CID_CODEC_MFC5X_ENC_H264_RC_FRAME_RATE
-#define V4L2_CID_CODEC_ENCODED_BIT_RATE_CH 	V4L2_CID_CODEC_MFC5X_ENC_RC_BIT_RATE
-
-#define V4L2_CID_CODEC_FRAME_PACK_SEI_GEN	(V4L2_CID_CODEC_BASE + 13)
-#define V4L2_CID_CODEC_FRAME_PACK_FRM0_FLAG	(V4L2_CID_CODEC_BASE + 14)
-enum v4l2_codec_mfc5x_enc_flag {
-	V4L2_CODEC_MFC5X_ENC_FLAG_DISABLE = 0,
-	V4L2_CODEC_MFC5X_ENC_FLAG_ENABLE = 1,
-};
-#define V4L2_CID_CODEC_FRAME_PACK_ARRGMENT_TYPE	(V4L2_CID_CODEC_BASE + 15)
-enum v4l2_codec_mfc5x_enc_frame_pack_arrgment_type {
-	V4L2_CODEC_MFC5X_ENC_FRAME_PACK_SIDE_BY_SIDE = 0,
-	V4L2_CODEC_MFC5X_ENC_FRAME_PACK_TOP_AND_BOT = 1,
-	V4L2_CODEC_MFC5X_ENC_FRAME_PACK_TMP_INTER = 2,
-};
-
-/* common */
-enum v4l2_codec_mfc5x_enc_switch {
-	V4L2_CODEC_MFC5X_ENC_SW_DISABLE	= 0,
-	V4L2_CODEC_MFC5X_ENC_SW_ENABLE	= 1,
-};
-enum v4l2_codec_mfc5x_enc_switch_inv {
-	V4L2_CODEC_MFC5X_ENC_SW_INV_ENABLE	= 0,
-	V4L2_CODEC_MFC5X_ENC_SW_INV_DISABLE	= 1,
-};
-#define V4L2_CID_CODEC_MFC5X_ENC_GOP_SIZE		(V4L2_CID_CODEC_MFC5X_BASE+300)
-#define V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MODE	(V4L2_CID_CODEC_MFC5X_BASE+301)
-enum v4l2_codec_mfc5x_enc_multi_slice_mode {
-	V4L2_CODEC_MFC5X_ENC_MULTI_SLICE_MODE_DISABLE		= 0,
-	V4L2_CODEC_MFC5X_ENC_MULTI_SLICE_MODE_MACROBLOCK_COUNT	= 1,
-	V4L2_CODEC_MFC5X_ENC_MULTI_SLICE_MODE_BIT_COUNT		= 3,
-};
-#define V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_MB		(V4L2_CID_CODEC_MFC5X_BASE+302)
-#define V4L2_CID_CODEC_MFC5X_ENC_MULTI_SLICE_BIT	(V4L2_CID_CODEC_MFC5X_BASE+303)
-#define V4L2_CID_CODEC_MFC5X_ENC_INTRA_REFRESH_MB	(V4L2_CID_CODEC_MFC5X_BASE+304)
-#define V4L2_CID_CODEC_MFC5X_ENC_PAD_CTRL_ENABLE	(V4L2_CID_CODEC_MFC5X_BASE+305)
-#define V4L2_CID_CODEC_MFC5X_ENC_PAD_LUMA_VALUE		(V4L2_CID_CODEC_MFC5X_BASE+306)
-#define V4L2_CID_CODEC_MFC5X_ENC_PAD_CB_VALUE		(V4L2_CID_CODEC_MFC5X_BASE+307)
-#define V4L2_CID_CODEC_MFC5X_ENC_PAD_CR_VALUE		(V4L2_CID_CODEC_MFC5X_BASE+308)
-#define V4L2_CID_CODEC_MFC5X_ENC_RC_FRAME_ENABLE	(V4L2_CID_CODEC_MFC5X_BASE+309)
-#define V4L2_CID_CODEC_MFC5X_ENC_RC_BIT_RATE		(V4L2_CID_CODEC_MFC5X_BASE+310)
-#define V4L2_CID_CODEC_MFC5X_ENC_RC_REACTION_COEFF	(V4L2_CID_CODEC_MFC5X_BASE+311)
-#define V4L2_CID_CODEC_MFC5X_ENC_STREAM_SIZE		(V4L2_CID_CODEC_MFC5X_BASE+312)
-#define V4L2_CID_CODEC_MFC5X_ENC_FRAME_COUNT		(V4L2_CID_CODEC_MFC5X_BASE+313)
-#define V4L2_CID_CODEC_MFC5X_ENC_FRAME_TYPE		(V4L2_CID_CODEC_MFC5X_BASE+314)
-enum v4l2_codec_mfc5x_enc_frame_type {
-	V4L2_CODEC_MFC5X_ENC_FRAME_TYPE_NOT_CODED	= 0,
-	V4L2_CODEC_MFC5X_ENC_FRAME_TYPE_I_FRAME		= 1,
-	V4L2_CODEC_MFC5X_ENC_FRAME_TYPE_P_FRAME		= 2,
-	V4L2_CODEC_MFC5X_ENC_FRAME_TYPE_B_FRAME		= 3,
-	V4L2_CODEC_MFC5X_ENC_FRAME_TYPE_SKIPPED		= 4,
-	V4L2_CODEC_MFC5X_ENC_FRAME_TYPE_OTHERS		= 5,
-};
-#define V4L2_CID_CODEC_MFC5X_ENC_FORCE_FRAME_TYPE	(V4L2_CID_CODEC_MFC5X_BASE+315)
-enum v4l2_codec_mfc5x_enc_force_frame_type {
-	V4L2_CODEC_MFC5X_ENC_FORCE_FRAME_TYPE_I_FRAME	= 1,
-	V4L2_CODEC_MFC5X_ENC_FORCE_FRAME_TYPE_NOT_CODED	= 2,
-};
-#define V4L2_CID_CODEC_MFC5X_ENC_VBV_BUF_SIZE		(V4L2_CID_CODEC_MFC5X_BASE+316)
-#define V4L2_CID_CODEC_MFC5X_ENC_SEQ_HDR_MODE		(V4L2_CID_CODEC_MFC5X_BASE+317)
-enum v4l2_codec_mfc5x_enc_seq_hdr_mode {
-	V4L2_CODEC_MFC5X_ENC_SEQ_HDR_MODE_SEQ		= 0,
-	V4L2_CODEC_MFC5X_ENC_SEQ_HDR_MODE_SEQ_FRAME	= 1,
-};
-#define V4L2_CID_CODEC_MFC5X_ENC_FRAME_SKIP_MODE	(V4L2_CID_CODEC_MFC5X_BASE+318)
-enum v4l2_codec_mfc5x_enc_frame_skip_mode {
-	V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_DISABLE		= 0,
-	V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_LEVEL		= 1,
-	V4L2_CODEC_MFC5X_ENC_FRAME_SKIP_MODE_VBV_BUF_SIZE	= 2,
-};
-#define V4L2_CID_CODEC_MFC5X_ENC_RC_FIXED_TARGET_BIT	(V4L2_CID_CODEC_MFC5X_BASE+319)
-#define V4L2_CID_CODEC_MFC5X_ENC_FRAME_DELTA		(V4L2_CID_CODEC_MFC5X_BASE+320)
-
-/* codec specific */
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_B_FRAMES		(V4L2_CID_CODEC_MFC5X_BASE+400)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_PROFILE		(V4L2_CID_CODEC_MFC5X_BASE+401)
-enum v4l2_codec_mfc5x_enc_h264_profile {
-	V4L2_CODEC_MFC5X_ENC_H264_PROFILE_MAIN		= 0,
-	V4L2_CODEC_MFC5X_ENC_H264_PROFILE_HIGH		= 1,
-	V4L2_CODEC_MFC5X_ENC_H264_PROFILE_BASELINE	= 2,
-};
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_LEVEL		(V4L2_CID_CODEC_MFC5X_BASE+402)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_INTERLACE		(V4L2_CID_CODEC_MFC5X_BASE+403)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_LOOP_FILTER_MODE	(V4L2_CID_CODEC_MFC5X_BASE+404)
-enum v4l2_codec_mfc5x_enc_h264_loop_filter {
-	V4L2_CODEC_MFC5X_ENC_H264_LOOP_FILTER_ENABLE			= 0,
-	V4L2_CODEC_MFC5X_ENC_H264_LOOP_FILTER_DISABLE			= 1,
-	V4L2_CODEC_MFC5X_ENC_H264_LOOP_FILTER_DISABLE_AT_BOUNDARY	= 2,
-};
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_LOOP_FILTER_ALPHA	(V4L2_CID_CODEC_MFC5X_BASE+405)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_LOOP_FILTER_BETA	(V4L2_CID_CODEC_MFC5X_BASE+406)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_ENTROPY_MODE	(V4L2_CID_CODEC_MFC5X_BASE+407)
-enum v4l2_codec_mfc5x_enc_h264_entropy_mode {
-	V4L2_CODEC_MFC5X_ENC_H264_ENTROPY_MODE_CAVLC	= 0,
-	V4L2_CODEC_MFC5X_ENC_H264_ENTROPY_MODE_CABAC	= 1,
-};
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_MAX_REF_PIC	(V4L2_CID_CODEC_MFC5X_BASE+408)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_NUM_REF_PIC_4P	(V4L2_CID_CODEC_MFC5X_BASE+409)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_8X8_TRANSFORM	(V4L2_CID_CODEC_MFC5X_BASE+410)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MB_ENABLE	(V4L2_CID_CODEC_MFC5X_BASE+411)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_FRAME_RATE	(V4L2_CID_CODEC_MFC5X_BASE+412)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_FRAME_QP	(V4L2_CID_CODEC_MFC5X_BASE+413)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MIN_QP		(V4L2_CID_CODEC_MFC5X_BASE+414)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MAX_QP		(V4L2_CID_CODEC_MFC5X_BASE+415)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MB_DARK	(V4L2_CID_CODEC_MFC5X_BASE+416)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MB_SMOOTH	(V4L2_CID_CODEC_MFC5X_BASE+417)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MB_STATIC	(V4L2_CID_CODEC_MFC5X_BASE+418)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_MB_ACTIVITY	(V4L2_CID_CODEC_MFC5X_BASE+419)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_P_FRAME_QP	(V4L2_CID_CODEC_MFC5X_BASE+420)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_RC_B_FRAME_QP	(V4L2_CID_CODEC_MFC5X_BASE+421)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_AR_VUI_ENABLE	(V4L2_CID_CODEC_MFC5X_BASE+422)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_AR_VUI_IDC	(V4L2_CID_CODEC_MFC5X_BASE+423)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_EXT_SAR_WIDTH	(V4L2_CID_CODEC_MFC5X_BASE+424)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_EXT_SAR_HEIGHT	(V4L2_CID_CODEC_MFC5X_BASE+425)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_OPEN_GOP		(V4L2_CID_CODEC_MFC5X_BASE+426)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_I_PERIOD		(V4L2_CID_CODEC_MFC5X_BASE+427)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_HIER_P_ENABLE	(V4L2_CID_CODEC_MFC5X_BASE+428)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_LAYER0_QP		(V4L2_CID_CODEC_MFC5X_BASE+429)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_LAYER1_QP		(V4L2_CID_CODEC_MFC5X_BASE+430)
-#define V4L2_CID_CODEC_MFC5X_ENC_H264_LAYER2_QP		(V4L2_CID_CODEC_MFC5X_BASE+431)
-
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_B_FRAMES		(V4L2_CID_CODEC_MFC5X_BASE+440)
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_PROFILE		(V4L2_CID_CODEC_MFC5X_BASE+441)
-enum v4l2_codec_mfc5x_enc_mpeg4_profile {
-	V4L2_CODEC_MFC5X_ENC_MPEG4_PROFILE_SIMPLE		= 0,
-	V4L2_CODEC_MFC5X_ENC_MPEG4_PROFILE_ADVANCED_SIMPLE	= 1,
-};
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_LEVEL		(V4L2_CID_CODEC_MFC5X_BASE+442)
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_FRAME_QP	(V4L2_CID_CODEC_MFC5X_BASE+443)
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_MIN_QP	(V4L2_CID_CODEC_MFC5X_BASE+444)
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_MAX_QP	(V4L2_CID_CODEC_MFC5X_BASE+445)
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_QUARTER_PIXEL	(V4L2_CID_CODEC_MFC5X_BASE+446)
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_P_FRAME_QP	(V4L2_CID_CODEC_MFC5X_BASE+447)
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_B_FRAME_QP	(V4L2_CID_CODEC_MFC5X_BASE+448)
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_VOP_TIME_RES	(V4L2_CID_CODEC_MFC5X_BASE+449)
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_VOP_FRM_DELTA	(V4L2_CID_CODEC_MFC5X_BASE+450)
-#define V4L2_CID_CODEC_MFC5X_ENC_MPEG4_RC_MB_ENABLE	(V4L2_CID_CODEC_MFC5X_BASE+451)
-
-#define V4L2_CID_CODEC_MFC5X_ENC_H263_RC_FRAME_RATE	(V4L2_CID_CODEC_MFC5X_BASE+460)
-#define V4L2_CID_CODEC_MFC5X_ENC_H263_RC_FRAME_QP	(V4L2_CID_CODEC_MFC5X_BASE+461)
-#define V4L2_CID_CODEC_MFC5X_ENC_H263_RC_MIN_QP		(V4L2_CID_CODEC_MFC5X_BASE+462)
-#define V4L2_CID_CODEC_MFC5X_ENC_H263_RC_MAX_QP		(V4L2_CID_CODEC_MFC5X_BASE+463)
-#define V4L2_CID_CODEC_MFC5X_ENC_H263_RC_P_FRAME_QP	(V4L2_CID_CODEC_MFC5X_BASE+464)
-#define V4L2_CID_CODEC_MFC5X_ENC_H263_RC_MB_ENABLE	(V4L2_CID_CODEC_MFC5X_BASE+465)
-
-/*  Camera class control IDs */
-#define V4L2_CID_CAMERA_CLASS_BASE 	(V4L2_CTRL_CLASS_CAMERA | 0x900)
-#define V4L2_CID_CAMERA_CLASS 		(V4L2_CTRL_CLASS_CAMERA | 1)
-
-#define V4L2_CID_EXPOSURE_AUTO			(V4L2_CID_CAMERA_CLASS_BASE+1)
-enum  v4l2_exposure_auto_type {
-	V4L2_EXPOSURE_AUTO = 0,
-	V4L2_EXPOSURE_MANUAL = 1,
-	V4L2_EXPOSURE_SHUTTER_PRIORITY = 2,
-	V4L2_EXPOSURE_APERTURE_PRIORITY = 3
-};
-#define V4L2_CID_EXPOSURE_ABSOLUTE		(V4L2_CID_CAMERA_CLASS_BASE+2)
-#define V4L2_CID_EXPOSURE_AUTO_PRIORITY		(V4L2_CID_CAMERA_CLASS_BASE+3)
-
-#define V4L2_CID_PAN_RELATIVE			(V4L2_CID_CAMERA_CLASS_BASE+4)
-#define V4L2_CID_TILT_RELATIVE			(V4L2_CID_CAMERA_CLASS_BASE+5)
-#define V4L2_CID_PAN_RESET			(V4L2_CID_CAMERA_CLASS_BASE+6)
-#define V4L2_CID_TILT_RESET			(V4L2_CID_CAMERA_CLASS_BASE+7)
-
-#define V4L2_CID_PAN_ABSOLUTE			(V4L2_CID_CAMERA_CLASS_BASE+8)
-#define V4L2_CID_TILT_ABSOLUTE			(V4L2_CID_CAMERA_CLASS_BASE+9)
-
-#define V4L2_CID_FOCUS_ABSOLUTE			(V4L2_CID_CAMERA_CLASS_BASE+10)
-#define V4L2_CID_FOCUS_RELATIVE			(V4L2_CID_CAMERA_CLASS_BASE+11)
-#define V4L2_CID_FOCUS_AUTO			(V4L2_CID_CAMERA_CLASS_BASE+12)
-
-#define V4L2_CID_ZOOM_ABSOLUTE			(V4L2_CID_CAMERA_CLASS_BASE+13)
-#define V4L2_CID_ZOOM_RELATIVE			(V4L2_CID_CAMERA_CLASS_BASE+14)
-#define V4L2_CID_ZOOM_CONTINUOUS		(V4L2_CID_CAMERA_CLASS_BASE+15)
-
-#define V4L2_CID_PRIVACY			(V4L2_CID_CAMERA_CLASS_BASE+16)
-
-#define V4L2_CID_IRIS_ABSOLUTE			(V4L2_CID_CAMERA_CLASS_BASE+17)
-#define V4L2_CID_IRIS_RELATIVE			(V4L2_CID_CAMERA_CLASS_BASE+18)
-
-/* FM Modulator class control IDs */
-#define V4L2_CID_FM_TX_CLASS_BASE		(V4L2_CTRL_CLASS_FM_TX | 0x900)
-#define V4L2_CID_FM_TX_CLASS			(V4L2_CTRL_CLASS_FM_TX | 1)
-
-#define V4L2_CID_RDS_TX_DEVIATION		(V4L2_CID_FM_TX_CLASS_BASE + 1)
-#define V4L2_CID_RDS_TX_PI			(V4L2_CID_FM_TX_CLASS_BASE + 2)
-#define V4L2_CID_RDS_TX_PTY			(V4L2_CID_FM_TX_CLASS_BASE + 3)
-#define V4L2_CID_RDS_TX_PS_NAME			(V4L2_CID_FM_TX_CLASS_BASE + 5)
-#define V4L2_CID_RDS_TX_RADIO_TEXT		(V4L2_CID_FM_TX_CLASS_BASE + 6)
-
-#define V4L2_CID_AUDIO_LIMITER_ENABLED		(V4L2_CID_FM_TX_CLASS_BASE + 64)
-#define V4L2_CID_AUDIO_LIMITER_RELEASE_TIME	(V4L2_CID_FM_TX_CLASS_BASE + 65)
-#define V4L2_CID_AUDIO_LIMITER_DEVIATION	(V4L2_CID_FM_TX_CLASS_BASE + 66)
-
-#define V4L2_CID_AUDIO_COMPRESSION_ENABLED	(V4L2_CID_FM_TX_CLASS_BASE + 80)
-#define V4L2_CID_AUDIO_COMPRESSION_GAIN		(V4L2_CID_FM_TX_CLASS_BASE + 81)
-#define V4L2_CID_AUDIO_COMPRESSION_THRESHOLD	(V4L2_CID_FM_TX_CLASS_BASE + 82)
-#define V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME	(V4L2_CID_FM_TX_CLASS_BASE + 83)
-#define V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME	(V4L2_CID_FM_TX_CLASS_BASE + 84)
-
-#define V4L2_CID_PILOT_TONE_ENABLED		(V4L2_CID_FM_TX_CLASS_BASE + 96)
-#define V4L2_CID_PILOT_TONE_DEVIATION		(V4L2_CID_FM_TX_CLASS_BASE + 97)
-#define V4L2_CID_PILOT_TONE_FREQUENCY		(V4L2_CID_FM_TX_CLASS_BASE + 98)
-
-#define V4L2_CID_TUNE_PREEMPHASIS		(V4L2_CID_FM_TX_CLASS_BASE + 112)
-enum v4l2_preemphasis {
-	V4L2_PREEMPHASIS_DISABLED	= 0,
-	V4L2_PREEMPHASIS_50_uS		= 1,
-	V4L2_PREEMPHASIS_75_uS		= 2,
-};
-#define V4L2_CID_TUNE_POWER_LEVEL		(V4L2_CID_FM_TX_CLASS_BASE + 113)
-#define V4L2_CID_TUNE_ANTENNA_CAPACITOR		(V4L2_CID_FM_TX_CLASS_BASE + 114)
-
-/*
- *	T U N I N G
- */
-struct v4l2_tuner {
-	__u32                   index;
-	__u8			name[32];
-	enum v4l2_tuner_type    type;
-	__u32			capability;
-	__u32			rangelow;
-	__u32			rangehigh;
-	__u32			rxsubchans;
-	__u32			audmode;
-	__s32			signal;
-	__s32			afc;
-	__u32			reserved[4];
-};
-
-struct v4l2_modulator {
-	__u32			index;
-	__u8			name[32];
-	__u32			capability;
-	__u32			rangelow;
-	__u32			rangehigh;
-	__u32			txsubchans;
-	__u32			reserved[4];
-};
-
-/*  Flags for the 'capability' field */
-#define V4L2_TUNER_CAP_LOW		0x0001
-#define V4L2_TUNER_CAP_NORM		0x0002
-#define V4L2_TUNER_CAP_STEREO		0x0010
-#define V4L2_TUNER_CAP_LANG2		0x0020
-#define V4L2_TUNER_CAP_SAP		0x0020
-#define V4L2_TUNER_CAP_LANG1		0x0040
-#define V4L2_TUNER_CAP_RDS		0x0080
-#define V4L2_TUNER_CAP_RDS_BLOCK_IO	0x0100
-#define V4L2_TUNER_CAP_RDS_CONTROLS	0x0200
-
-/*  Flags for the 'rxsubchans' field */
-#define V4L2_TUNER_SUB_MONO		0x0001
-#define V4L2_TUNER_SUB_STEREO		0x0002
-#define V4L2_TUNER_SUB_LANG2		0x0004
-#define V4L2_TUNER_SUB_SAP		0x0004
-#define V4L2_TUNER_SUB_LANG1		0x0008
-#define V4L2_TUNER_SUB_RDS		0x0010
-
-/*  Values for the 'audmode' field */
-#define V4L2_TUNER_MODE_MONO		0x0000
-#define V4L2_TUNER_MODE_STEREO		0x0001
-#define V4L2_TUNER_MODE_LANG2		0x0002
-#define V4L2_TUNER_MODE_SAP		0x0002
-#define V4L2_TUNER_MODE_LANG1		0x0003
-#define V4L2_TUNER_MODE_LANG1_LANG2	0x0004
-
-struct v4l2_frequency {
-	__u32		      tuner;
-	enum v4l2_tuner_type  type;
-	__u32		      frequency;
-	__u32		      reserved[8];
-};
-
-struct v4l2_hw_freq_seek {
-	__u32		      tuner;
-	enum v4l2_tuner_type  type;
-	__u32		      seek_upward;
-	__u32		      wrap_around;
-	__u32		      spacing;
-	__u32		      reserved[7];
-};
-
-/*
- *	R D S
- */
-
-struct v4l2_rds_data {
-	__u8 	lsb;
-	__u8 	msb;
-	__u8 	block;
-} __attribute__ ((packed));
-
-#define V4L2_RDS_BLOCK_MSK 	 0x7
-#define V4L2_RDS_BLOCK_A 	 0
-#define V4L2_RDS_BLOCK_B 	 1
-#define V4L2_RDS_BLOCK_C 	 2
-#define V4L2_RDS_BLOCK_D 	 3
-#define V4L2_RDS_BLOCK_C_ALT 	 4
-#define V4L2_RDS_BLOCK_INVALID 	 7
-
-#define V4L2_RDS_BLOCK_CORRECTED 0x40
-#define V4L2_RDS_BLOCK_ERROR 	 0x80
-
-/*
- *	A U D I O
- */
-struct v4l2_audio {
-	__u32	index;
-	__u8	name[32];
-	__u32	capability;
-	__u32	mode;
-	__u32	reserved[2];
-};
-
-/*  Flags for the 'capability' field */
-#define V4L2_AUDCAP_STEREO		0x00001
-#define V4L2_AUDCAP_AVL			0x00002
-
-/*  Flags for the 'mode' field */
-#define V4L2_AUDMODE_AVL		0x00001
-
-struct v4l2_audioout {
-	__u32	index;
-	__u8	name[32];
-	__u32	capability;
-	__u32	mode;
-	__u32	reserved[2];
-};
-
-/*
- *	M P E G   S E R V I C E S
- *
- *	NOTE: EXPERIMENTAL API
- */
-#if 1
-#define V4L2_ENC_IDX_FRAME_I    (0)
-#define V4L2_ENC_IDX_FRAME_P    (1)
-#define V4L2_ENC_IDX_FRAME_B    (2)
-#define V4L2_ENC_IDX_FRAME_MASK (0xf)
-
-struct v4l2_enc_idx_entry {
-	__u64 offset;
-	__u64 pts;
-	__u32 length;
-	__u32 flags;
-	__u32 reserved[2];
-};
-
-#define V4L2_ENC_IDX_ENTRIES (64)
-struct v4l2_enc_idx {
-	__u32 entries;
-	__u32 entries_cap;
-	__u32 reserved[4];
-	struct v4l2_enc_idx_entry entry[V4L2_ENC_IDX_ENTRIES];
-};
-
-
-#define V4L2_ENC_CMD_START      (0)
-#define V4L2_ENC_CMD_STOP       (1)
-#define V4L2_ENC_CMD_PAUSE      (2)
-#define V4L2_ENC_CMD_RESUME     (3)
-
-/* Flags for V4L2_ENC_CMD_STOP */
-#define V4L2_ENC_CMD_STOP_AT_GOP_END    (1 << 0)
-
-struct v4l2_encoder_cmd {
-	__u32 cmd;
-	__u32 flags;
-	union {
-		struct {
-			__u32 data[8];
-		} raw;
-	};
-};
-
-#endif
-
-
-/*
- *	D A T A   S E R V I C E S   ( V B I )
- *
- *	Data services API by Michael Schimek
- */
-
-/* Raw VBI */
-struct v4l2_vbi_format {
-	__u32	sampling_rate;		/* in 1 Hz */
-	__u32	offset;
-	__u32	samples_per_line;
-	__u32	sample_format;		/* V4L2_PIX_FMT_* */
-	__s32	start[2];
-	__u32	count[2];
-	__u32	flags;			/* V4L2_VBI_* */
-	__u32	reserved[2];		/* must be zero */
-};
-
-/*  VBI flags  */
-#define V4L2_VBI_UNSYNC		(1 << 0)
-#define V4L2_VBI_INTERLACED	(1 << 1)
-
-/* Sliced VBI
- *
- *    This implements is a proposal V4L2 API to allow SLICED VBI
- * required for some hardware encoders. It should change without
- * notice in the definitive implementation.
- */
-
-struct v4l2_sliced_vbi_format {
-	__u16   service_set;
-	/* service_lines[0][...] specifies lines 0-23 (1-23 used) of the first field
-	   service_lines[1][...] specifies lines 0-23 (1-23 used) of the second field
-				 (equals frame lines 313-336 for 625 line video
-				  standards, 263-286 for 525 line standards) */
-	__u16   service_lines[2][24];
-	__u32   io_size;
-	__u32   reserved[2];            /* must be zero */
-};
-
-/* Teletext World System Teletext
-   (WST), defined on ITU-R BT.653-2 */
-#define V4L2_SLICED_TELETEXT_B          (0x0001)
-/* Video Program System, defined on ETS 300 231*/
-#define V4L2_SLICED_VPS                 (0x0400)
-/* Closed Caption, defined on EIA-608 */
-#define V4L2_SLICED_CAPTION_525         (0x1000)
-/* Wide Screen System, defined on ITU-R BT1119.1 */
-#define V4L2_SLICED_WSS_625             (0x4000)
-
-#define V4L2_SLICED_VBI_525             (V4L2_SLICED_CAPTION_525)
-#define V4L2_SLICED_VBI_625             (V4L2_SLICED_TELETEXT_B | V4L2_SLICED_VPS | V4L2_SLICED_WSS_625)
-
-struct v4l2_sliced_vbi_cap {
-	__u16   service_set;
-	/* service_lines[0][...] specifies lines 0-23 (1-23 used) of the first field
-	   service_lines[1][...] specifies lines 0-23 (1-23 used) of the second field
-				 (equals frame lines 313-336 for 625 line video
-				  standards, 263-286 for 525 line standards) */
-	__u16   service_lines[2][24];
-	enum v4l2_buf_type type;
-	__u32   reserved[3];    /* must be 0 */
-};
-
-struct v4l2_sliced_vbi_data {
-	__u32   id;
-	__u32   field;          /* 0: first field, 1: second field */
-	__u32   line;           /* 1-23 */
-	__u32   reserved;       /* must be 0 */
-	__u8    data[48];
-};
-
-/*
- * Sliced VBI data inserted into MPEG Streams
- */
-
-/*
- * V4L2_MPEG_STREAM_VBI_FMT_IVTV:
- *
- * Structure of payload contained in an MPEG 2 Private Stream 1 PES Packet in an
- * MPEG-2 Program Pack that contains V4L2_MPEG_STREAM_VBI_FMT_IVTV Sliced VBI
- * data
- *
- * Note, the MPEG-2 Program Pack and Private Stream 1 PES packet header
- * definitions are not included here.  See the MPEG-2 specifications for details
- * on these headers.
- */
-
-/* Line type IDs */
-#define V4L2_MPEG_VBI_IVTV_TELETEXT_B     (1)
-#define V4L2_MPEG_VBI_IVTV_CAPTION_525    (4)
-#define V4L2_MPEG_VBI_IVTV_WSS_625        (5)
-#define V4L2_MPEG_VBI_IVTV_VPS            (7)
-
-struct v4l2_mpeg_vbi_itv0_line {
-	__u8 id;	/* One of V4L2_MPEG_VBI_IVTV_* above */
-	__u8 data[42];	/* Sliced VBI data for the line */
-} __attribute__ ((packed));
-
-struct v4l2_mpeg_vbi_itv0 {
-	__le32 linemask[2]; /* Bitmasks of VBI service lines present */
-	struct v4l2_mpeg_vbi_itv0_line line[35];
-} __attribute__ ((packed));
-
-struct v4l2_mpeg_vbi_ITV0 {
-	struct v4l2_mpeg_vbi_itv0_line line[36];
-} __attribute__ ((packed));
-
-#define V4L2_MPEG_VBI_IVTV_MAGIC0	"itv0"
-#define V4L2_MPEG_VBI_IVTV_MAGIC1	"ITV0"
-
-struct v4l2_mpeg_vbi_fmt_ivtv {
-	__u8 magic[4];
-	union {
-		struct v4l2_mpeg_vbi_itv0 itv0;
-		struct v4l2_mpeg_vbi_ITV0 ITV0;
-	};
-} __attribute__ ((packed));
-
-/*
- *	A G G R E G A T E   S T R U C T U R E S
- */
-
-/**
- * struct v4l2_plane_pix_format - additional, per-plane format definition
- * @sizeimage:		maximum size in bytes required for data, for which
- *			this plane will be used
- * @bytesperline:	distance in bytes between the leftmost pixels in two
- *			adjacent lines
- */
-struct v4l2_plane_pix_format {
-	__u32		sizeimage;
-	__u16		bytesperline;
-	__u16		reserved[7];
-} __attribute__ ((packed));
-
-/**
- * struct v4l2_pix_format_mplane - multiplanar format definition
- * @width:		image width in pixels
- * @height:		image height in pixels
- * @pixelformat:	little endian four character code (fourcc)
- * @field:		field order (for interlaced video)
- * @colorspace:		supplemental to pixelformat
- * @plane_fmt:		per-plane information
- * @num_planes:		number of planes for this format
- */
-struct v4l2_pix_format_mplane {
-	__u32				width;
-	__u32				height;
-	__u32				pixelformat;
-	enum v4l2_field			field;
-	enum v4l2_colorspace		colorspace;
-
-	struct v4l2_plane_pix_format	plane_fmt[VIDEO_MAX_PLANES];
-	__u8				num_planes;
-	__u8				reserved[11];
-} __attribute__ ((packed));
-
-/**
- * struct v4l2_format - stream data format
- * @type:	type of the data stream
- * @pix:	definition of an image format
- * @pix_mp:	definition of a multiplanar image format
- * @win:	definition of an overlaid image
- * @vbi:	raw VBI capture or output parameters
- * @sliced:	sliced VBI capture or output parameters
- * @raw_data:	placeholder for future extensions and custom formats
- */
-struct v4l2_format {
-	enum v4l2_buf_type type;
-	union {
-		struct v4l2_pix_format		pix;     /* V4L2_BUF_TYPE_VIDEO_CAPTURE */
-		struct v4l2_pix_format_mplane	pix_mp;  /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */
-		struct v4l2_window		win;     /* V4L2_BUF_TYPE_VIDEO_OVERLAY */
-		struct v4l2_vbi_format		vbi;     /* V4L2_BUF_TYPE_VBI_CAPTURE */
-		struct v4l2_sliced_vbi_format	sliced;  /* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */
-		__u8	raw_data[200];                   /* user-defined */
-	} fmt;
-};
-
-/*	Stream type-dependent parameters
- */
-struct v4l2_streamparm {
-	enum v4l2_buf_type type;
-	union {
-		struct v4l2_captureparm	capture;
-		struct v4l2_outputparm	output;
-		__u8	raw_data[200];  /* user-defined */
-	} parm;
-};
-
-/*
- *	E V E N T S
- */
-
-#define V4L2_EVENT_ALL				0
-#define V4L2_EVENT_VSYNC			1
-#define V4L2_EVENT_EOS				2
-#define V4L2_EVENT_PRIVATE_START		0x08000000
-
-/* Payload for V4L2_EVENT_VSYNC */
-struct v4l2_event_vsync {
-	/* Can be V4L2_FIELD_ANY, _NONE, _TOP or _BOTTOM */
-	__u8 field;
-} __attribute__ ((packed));
-
-struct v4l2_event {
-	__u32				type;
-	union {
-		struct v4l2_event_vsync vsync;
-		__u8			data[64];
-	} u;
-	__u32				pending;
-	__u32				sequence;
-	struct timespec			timestamp;
-	__u32				reserved[9];
-};
-
-struct v4l2_event_subscription {
-	__u32				type;
-	__u32				reserved[7];
-};
-
-/*
- *	A D V A N C E D   D E B U G G I N G
- *
- *	NOTE: EXPERIMENTAL API, NEVER RELY ON THIS IN APPLICATIONS!
- *	FOR DEBUGGING, TESTING AND INTERNAL USE ONLY!
- */
-
-/* VIDIOC_DBG_G_REGISTER and VIDIOC_DBG_S_REGISTER */
-
-#define V4L2_CHIP_MATCH_HOST       0  /* Match against chip ID on host (0 for the host) */
-#define V4L2_CHIP_MATCH_I2C_DRIVER 1  /* Match against I2C driver name */
-#define V4L2_CHIP_MATCH_I2C_ADDR   2  /* Match against I2C 7-bit address */
-#define V4L2_CHIP_MATCH_AC97       3  /* Match against anciliary AC97 chip */
-
-struct v4l2_dbg_match {
-	__u32 type; /* Match type */
-	union {     /* Match this chip, meaning determined by type */
-		__u32 addr;
-		char name[32];
-	};
-} __attribute__ ((packed));
-
-struct v4l2_dbg_register {
-	struct v4l2_dbg_match match;
-	__u32 size;	/* register size in bytes */
-	__u64 reg;
-	__u64 val;
-} __attribute__ ((packed));
-
-/* VIDIOC_DBG_G_CHIP_IDENT */
-struct v4l2_dbg_chip_ident {
-	struct v4l2_dbg_match match;
-	__u32 ident;       /* chip identifier as specified in <media/v4l2-chip-ident.h> */
-	__u32 revision;    /* chip revision, chip specific */
-} __attribute__ ((packed));
-
-/*
- *	I O C T L   C O D E S   F O R   V I D E O   D E V I C E S
- *
- */
-#define VIDIOC_QUERYCAP		 _IOR('V',  0, struct v4l2_capability)
-#define VIDIOC_RESERVED		  _IO('V',  1)
-#define VIDIOC_ENUM_FMT         _IOWR('V',  2, struct v4l2_fmtdesc)
-#define VIDIOC_G_FMT		_IOWR('V',  4, struct v4l2_format)
-#define VIDIOC_S_FMT		_IOWR('V',  5, struct v4l2_format)
-#define VIDIOC_REQBUFS		_IOWR('V',  8, struct v4l2_requestbuffers)
-#define VIDIOC_QUERYBUF		_IOWR('V',  9, struct v4l2_buffer)
-#define VIDIOC_G_FBUF		 _IOR('V', 10, struct v4l2_framebuffer)
-#define VIDIOC_S_FBUF		 _IOW('V', 11, struct v4l2_framebuffer)
-#define VIDIOC_OVERLAY		 _IOW('V', 14, int)
-#define VIDIOC_QBUF		_IOWR('V', 15, struct v4l2_buffer)
-#define VIDIOC_DQBUF		_IOWR('V', 17, struct v4l2_buffer)
-#define VIDIOC_STREAMON		 _IOW('V', 18, int)
-#define VIDIOC_STREAMOFF	 _IOW('V', 19, int)
-#define VIDIOC_G_PARM		_IOWR('V', 21, struct v4l2_streamparm)
-#define VIDIOC_S_PARM		_IOWR('V', 22, struct v4l2_streamparm)
-#define VIDIOC_G_STD		 _IOR('V', 23, v4l2_std_id)
-#define VIDIOC_S_STD		 _IOW('V', 24, v4l2_std_id)
-#define VIDIOC_ENUMSTD		_IOWR('V', 25, struct v4l2_standard)
-#define VIDIOC_ENUMINPUT	_IOWR('V', 26, struct v4l2_input)
-#define VIDIOC_G_CTRL		_IOWR('V', 27, struct v4l2_control)
-#define VIDIOC_S_CTRL		_IOWR('V', 28, struct v4l2_control)
-#define VIDIOC_G_TUNER		_IOWR('V', 29, struct v4l2_tuner)
-#define VIDIOC_S_TUNER		 _IOW('V', 30, struct v4l2_tuner)
-#define VIDIOC_G_AUDIO		 _IOR('V', 33, struct v4l2_audio)
-#define VIDIOC_S_AUDIO		 _IOW('V', 34, struct v4l2_audio)
-#define VIDIOC_QUERYCTRL	_IOWR('V', 36, struct v4l2_queryctrl)
-#define VIDIOC_QUERYMENU	_IOWR('V', 37, struct v4l2_querymenu)
-#define VIDIOC_G_INPUT		 _IOR('V', 38, int)
-#define VIDIOC_S_INPUT		_IOWR('V', 39, int)
-#define VIDIOC_G_OUTPUT		 _IOR('V', 46, int)
-#define VIDIOC_S_OUTPUT		_IOWR('V', 47, int)
-#define VIDIOC_ENUMOUTPUT	_IOWR('V', 48, struct v4l2_output)
-#define VIDIOC_G_AUDOUT		 _IOR('V', 49, struct v4l2_audioout)
-#define VIDIOC_S_AUDOUT		 _IOW('V', 50, struct v4l2_audioout)
-#define VIDIOC_G_MODULATOR	_IOWR('V', 54, struct v4l2_modulator)
-#define VIDIOC_S_MODULATOR	 _IOW('V', 55, struct v4l2_modulator)
-#define VIDIOC_G_FREQUENCY	_IOWR('V', 56, struct v4l2_frequency)
-#define VIDIOC_S_FREQUENCY	 _IOW('V', 57, struct v4l2_frequency)
-#define VIDIOC_CROPCAP		_IOWR('V', 58, struct v4l2_cropcap)
-#define VIDIOC_G_CROP		_IOWR('V', 59, struct v4l2_crop)
-#define VIDIOC_S_CROP		 _IOW('V', 60, struct v4l2_crop)
-#define VIDIOC_G_JPEGCOMP	 _IOR('V', 61, struct v4l2_jpegcompression)
-#define VIDIOC_S_JPEGCOMP	 _IOW('V', 62, struct v4l2_jpegcompression)
-#define VIDIOC_QUERYSTD      	 _IOR('V', 63, v4l2_std_id)
-#define VIDIOC_TRY_FMT      	_IOWR('V', 64, struct v4l2_format)
-#define VIDIOC_ENUMAUDIO	_IOWR('V', 65, struct v4l2_audio)
-#define VIDIOC_ENUMAUDOUT	_IOWR('V', 66, struct v4l2_audioout)
-#define VIDIOC_G_PRIORITY        _IOR('V', 67, enum v4l2_priority)
-#define VIDIOC_S_PRIORITY        _IOW('V', 68, enum v4l2_priority)
-#define VIDIOC_G_SLICED_VBI_CAP _IOWR('V', 69, struct v4l2_sliced_vbi_cap)
-#define VIDIOC_LOG_STATUS         _IO('V', 70)
-#define VIDIOC_G_EXT_CTRLS	_IOWR('V', 71, struct v4l2_ext_controls)
-#define VIDIOC_S_EXT_CTRLS	_IOWR('V', 72, struct v4l2_ext_controls)
-#define VIDIOC_TRY_EXT_CTRLS	_IOWR('V', 73, struct v4l2_ext_controls)
-#if 1
-#define VIDIOC_ENUM_FRAMESIZES	_IOWR('V', 74, struct v4l2_frmsizeenum)
-#define VIDIOC_ENUM_FRAMEINTERVALS _IOWR('V', 75, struct v4l2_frmivalenum)
-#define VIDIOC_G_ENC_INDEX       _IOR('V', 76, struct v4l2_enc_idx)
-#define VIDIOC_ENCODER_CMD      _IOWR('V', 77, struct v4l2_encoder_cmd)
-#define VIDIOC_TRY_ENCODER_CMD  _IOWR('V', 78, struct v4l2_encoder_cmd)
-#endif
-
-#if 1
-/* Experimental, meant for debugging, testing and internal use.
-   Only implemented if CONFIG_VIDEO_ADV_DEBUG is defined.
-   You must be root to use these ioctls. Never use these in applications! */
-#define	VIDIOC_DBG_S_REGISTER 	 _IOW('V', 79, struct v4l2_dbg_register)
-#define	VIDIOC_DBG_G_REGISTER 	_IOWR('V', 80, struct v4l2_dbg_register)
-
-/* Experimental, meant for debugging, testing and internal use.
-   Never use this ioctl in applications! */
-#define VIDIOC_DBG_G_CHIP_IDENT _IOWR('V', 81, struct v4l2_dbg_chip_ident)
-#endif
-
-#define VIDIOC_S_HW_FREQ_SEEK	 _IOW('V', 82, struct v4l2_hw_freq_seek)
-#define	VIDIOC_ENUM_DV_PRESETS	_IOWR('V', 83, struct v4l2_dv_enum_preset)
-#define	VIDIOC_S_DV_PRESET	_IOWR('V', 84, struct v4l2_dv_preset)
-#define	VIDIOC_G_DV_PRESET	_IOWR('V', 85, struct v4l2_dv_preset)
-#define	VIDIOC_QUERY_DV_PRESET	_IOR('V',  86, struct v4l2_dv_preset)
-#define	VIDIOC_S_DV_TIMINGS	_IOWR('V', 87, struct v4l2_dv_timings)
-#define	VIDIOC_G_DV_TIMINGS	_IOWR('V', 88, struct v4l2_dv_timings)
-#define	VIDIOC_DQEVENT		 _IOR('V', 89, struct v4l2_event)
-#define	VIDIOC_SUBSCRIBE_EVENT	 _IOW('V', 90, struct v4l2_event_subscription)
-#define	VIDIOC_UNSUBSCRIBE_EVENT _IOW('V', 91, struct v4l2_event_subscription)
-
-/* Reminder: when adding new ioctls please add support for them to
-   drivers/media/video/v4l2-compat-ioctl32.c as well! */
-
-#define BASE_VIDIOC_PRIVATE	192		/* 192-255 are private */
-
-#endif /* __LINUX_VIDEODEV2_H */
diff --git a/exynos5/hal/include/videodev2_samsung.h b/exynos5/hal/include/videodev2_samsung.h
deleted file mode 100644
index f93688c..0000000
--- a/exynos5/hal/include/videodev2_samsung.h
+++ /dev/null
@@ -1,1060 +0,0 @@
-/*
- * Video for Linux Two header file for samsung
- *
- * Copyright (C) 2009, Dongsoo Nathaniel Kim<dongsoo45.kim@samsung.com>
- *
- * This header file contains several v4l2 APIs to be proposed to v4l2
- * community and until bein accepted, will be used restrictly in Samsung's
- * camera interface driver FIMC.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * Alternatively, Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __LINUX_VIDEODEV2_SAMSUNG_H
-#define __LINUX_VIDEODEV2_SAMSUNG_H
-
-/* Values for 'capabilities' field */
-/* Object detection device */
-#define V4L2_CAP_OBJ_RECOGNITION    0x10000000
-/* strobe control */
-#define V4L2_CAP_STROBE         0x20000000
-
-#define V4L2_CID_FOCUS_MODE     (V4L2_CID_CAMERA_CLASS_BASE+17)
-/* Focus Methods */
-enum v4l2_focus_mode {
-    V4L2_FOCUS_MODE_AUTO        = 0,
-    V4L2_FOCUS_MODE_MACRO       = 1,
-    V4L2_FOCUS_MODE_MANUAL      = 2,
-    V4L2_FOCUS_MODE_LASTP       = 2,
-};
-
-#define V4L2_CID_ZOOM_MODE      (V4L2_CID_CAMERA_CLASS_BASE+18)
-/* Zoom Methods */
-enum v4l2_zoom_mode {
-    V4L2_ZOOM_MODE_CONTINUOUS   = 0,
-    V4L2_ZOOM_MODE_OPTICAL      = 1,
-    V4L2_ZOOM_MODE_DIGITAL      = 2,
-    V4L2_ZOOM_MODE_LASTP        = 2,
-};
-
-/* Exposure Methods */
-#define V4L2_CID_PHOTOMETRY     (V4L2_CID_CAMERA_CLASS_BASE+19)
-enum v4l2_photometry_mode {
-    V4L2_PHOTOMETRY_MULTISEG    = 0, /*Multi Segment*/
-    V4L2_PHOTOMETRY_CWA     = 1, /*Centre Weighted Average*/
-    V4L2_PHOTOMETRY_SPOT        = 2,
-    V4L2_PHOTOMETRY_AFSPOT      = 3, /*Spot metering on focused point*/
-    V4L2_PHOTOMETRY_LASTP       = V4L2_PHOTOMETRY_AFSPOT,
-};
-
-/* Manual exposure control items menu type: iris, shutter, iso */
-#define V4L2_CID_CAM_APERTURE   (V4L2_CID_CAMERA_CLASS_BASE+20)
-#define V4L2_CID_CAM_SHUTTER    (V4L2_CID_CAMERA_CLASS_BASE+21)
-#define V4L2_CID_CAM_ISO    (V4L2_CID_CAMERA_CLASS_BASE+22)
-
-/* Following CIDs are menu type */
-#define V4L2_CID_SCENEMODE  (V4L2_CID_CAMERA_CLASS_BASE+23)
-#define V4L2_CID_CAM_STABILIZE  (V4L2_CID_CAMERA_CLASS_BASE+24)
-#define V4L2_CID_CAM_MULTISHOT  (V4L2_CID_CAMERA_CLASS_BASE+25)
-
-/* Control dynamic range */
-#define V4L2_CID_CAM_DR     (V4L2_CID_CAMERA_CLASS_BASE+26)
-
-/* White balance preset control */
-#define V4L2_CID_WHITE_BALANCE_PRESET   (V4L2_CID_CAMERA_CLASS_BASE+27)
-#define V4L2_CID_CAM_SENSOR_FW_VER       (V4L2_CID_CAMERA_CLASS_BASE + 28)
-#define V4L2_CID_CAM_PHONE_FW_VER        (V4L2_CID_CAMERA_CLASS_BASE + 29)
-
-/* CID extensions */
-#define V4L2_CID_ROTATION       (V4L2_CID_PRIVATE_BASE + 0)
-#define V4L2_CID_PADDR_Y        (V4L2_CID_PRIVATE_BASE + 1)
-#define V4L2_CID_PADDR_CB       (V4L2_CID_PRIVATE_BASE + 2)
-#define V4L2_CID_PADDR_CR       (V4L2_CID_PRIVATE_BASE + 3)
-#define V4L2_CID_PADDR_CBCR     (V4L2_CID_PRIVATE_BASE + 4)
-#define V4L2_CID_OVERLAY_AUTO       (V4L2_CID_PRIVATE_BASE + 5)
-#define V4L2_CID_OVERLAY_VADDR0     (V4L2_CID_PRIVATE_BASE + 6)
-#define V4L2_CID_OVERLAY_VADDR1     (V4L2_CID_PRIVATE_BASE + 7)
-#define V4L2_CID_OVERLAY_VADDR2     (V4L2_CID_PRIVATE_BASE + 8)
-#define V4L2_CID_OVLY_MODE      (V4L2_CID_PRIVATE_BASE + 9)
-#define V4L2_CID_DST_INFO       (V4L2_CID_PRIVATE_BASE + 10)
-/* UMP secure id control */
-#define V4L2_CID_GET_UMP_SECURE_ID  (V4L2_CID_PRIVATE_BASE + 11)
-#define V4L2_CID_GET_PHY_SRC_YADDR  (V4L2_CID_PRIVATE_BASE + 12)
-#define V4L2_CID_GET_PHY_SRC_CADDR  (V4L2_CID_PRIVATE_BASE + 13)
-#define V4L2_CID_IMAGE_EFFECT_FN    (V4L2_CID_PRIVATE_BASE + 16)
-#define V4L2_CID_IMAGE_EFFECT_APPLY (V4L2_CID_PRIVATE_BASE + 17)
-#define V4L2_CID_IMAGE_EFFECT_CB    (V4L2_CID_PRIVATE_BASE + 18)
-#define V4L2_CID_IMAGE_EFFECT_CR    (V4L2_CID_PRIVATE_BASE + 19)
-#define V4L2_CID_RESERVED_MEM_BASE_ADDR (V4L2_CID_PRIVATE_BASE + 20)
-#define V4L2_CID_FIMC_VERSION       (V4L2_CID_PRIVATE_BASE + 21)
-
-#define V4L2_CID_STREAM_PAUSE           (V4L2_CID_PRIVATE_BASE + 53)
-
-/* CID Extensions for camera sensor operations */
-#define V4L2_CID_CAM_PREVIEW_ONOFF      (V4L2_CID_PRIVATE_BASE + 64)
-#define V4L2_CID_CAM_CAPTURE            (V4L2_CID_PRIVATE_BASE + 65)
-//#define V4L2_CID_CAM_JPEG_MEMSIZE     (V4L2_CID_PRIVATE_BASE + 66)
-
-#define V4L2_CID_CAM_DATE_INFO_YEAR             (V4L2_CID_PRIVATE_BASE + 14)
-#define V4L2_CID_CAM_DATE_INFO_MONTH            (V4L2_CID_PRIVATE_BASE + 15)
-#define V4L2_CID_CAM_DATE_INFO_DATE             (V4L2_CID_PRIVATE_BASE + 22)
-#define V4L2_CID_CAM_SENSOR_VER                 (V4L2_CID_PRIVATE_BASE + 23)
-#define V4L2_CID_CAM_FW_MINOR_VER               (V4L2_CID_PRIVATE_BASE + 24)
-#define V4L2_CID_CAM_FW_MAJOR_VER               (V4L2_CID_PRIVATE_BASE + 25)
-#define V4L2_CID_CAM_PRM_MINOR_VER              (V4L2_CID_PRIVATE_BASE + 26)
-#define V4L2_CID_CAM_PRM_MAJOR_VER              (V4L2_CID_PRIVATE_BASE + 27)
-#define V4L2_CID_CAM_FW_VER                     (V4L2_CID_PRIVATE_BASE + 28)
-#define V4L2_CID_CAM_SET_FW_ADDR                (V4L2_CID_PRIVATE_BASE + 29)
-#define V4L2_CID_CAM_SET_FW_SIZE                (V4L2_CID_PRIVATE_BASE + 30)
-#define V4L2_CID_CAM_UPDATE_FW  (V4L2_CID_PRIVATE_BASE + 31)
-enum v4l2_firmware_mode {
-    FW_MODE_UPDATE,
-    FW_MODE_VERSION,
-    FW_MODE_DUMP,
-};
-
-#define V4L2_CID_CAM_JPEG_MAIN_SIZE     (V4L2_CID_PRIVATE_BASE + 32)
-#define V4L2_CID_CAM_JPEG_MAIN_OFFSET       (V4L2_CID_PRIVATE_BASE + 33)
-#define V4L2_CID_CAM_JPEG_THUMB_SIZE        (V4L2_CID_PRIVATE_BASE + 34)
-#define V4L2_CID_CAM_JPEG_THUMB_OFFSET      (V4L2_CID_PRIVATE_BASE + 35)
-#define V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET   (V4L2_CID_PRIVATE_BASE + 36)
-#define V4L2_CID_CAM_JPEG_QUALITY   (V4L2_CID_PRIVATE_BASE + 37)
-#define V4L2_CID_CAM_SENSOR_MAKER   (V4L2_CID_PRIVATE_BASE + 38)
-#define V4L2_CID_CAM_SENSOR_OPTICAL (V4L2_CID_PRIVATE_BASE + 39)
-#define V4L2_CID_CAM_AF_VER_LOW     (V4L2_CID_PRIVATE_BASE + 40)
-#define V4L2_CID_CAM_AF_VER_HIGH    (V4L2_CID_PRIVATE_BASE + 41)
-#define V4L2_CID_CAM_GAMMA_RG_LOW   (V4L2_CID_PRIVATE_BASE + 42)
-#define V4L2_CID_CAM_GAMMA_RG_HIGH  (V4L2_CID_PRIVATE_BASE + 43)
-#define V4L2_CID_CAM_GAMMA_BG_LOW   (V4L2_CID_PRIVATE_BASE + 44)
-#define V4L2_CID_CAM_GAMMA_BG_HIGH  (V4L2_CID_PRIVATE_BASE + 45)
-#define V4L2_CID_CAM_DUMP_FW        (V4L2_CID_PRIVATE_BASE + 46)
-#define V4L2_CID_CAM_GET_DUMP_SIZE  (V4L2_CID_PRIVATE_BASE + 47)
-#define V4L2_CID_CAMERA_VT_MODE         (V4L2_CID_PRIVATE_BASE + 48)
-#define V4L2_CID_CAMERA_VGA_BLUR    (V4L2_CID_PRIVATE_BASE + 49)
-#define V4L2_CID_CAMERA_CAPTURE     (V4L2_CID_PRIVATE_BASE + 50)
-#define V4L2_CID_CAMERA_HDR         (V4L2_CID_PRIVATE_BASE + 51)
-
-#define V4L2_CID_MAIN_SW_DATE_INFO_YEAR     (V4L2_CID_PRIVATE_BASE + 54)
-#define V4L2_CID_MAIN_SW_DATE_INFO_MONTH    (V4L2_CID_PRIVATE_BASE + 55)
-#define V4L2_CID_MAIN_SW_DATE_INFO_DATE     (V4L2_CID_PRIVATE_BASE + 56)
-#define V4L2_CID_MAIN_SW_FW_MINOR_VER       (V4L2_CID_PRIVATE_BASE + 57)
-#define V4L2_CID_MAIN_SW_FW_MAJOR_VER       (V4L2_CID_PRIVATE_BASE + 58)
-#define V4L2_CID_MAIN_SW_PRM_MINOR_VER      (V4L2_CID_PRIVATE_BASE + 59)
-#define V4L2_CID_MAIN_SW_PRM_MAJOR_VER      (V4L2_CID_PRIVATE_BASE + 60)
-
-#define V4L2_CID_FIMC_IS_BASE               (V4L2_CTRL_CLASS_CAMERA | 0x1000)
-
-#define V4L2_CID_IS_LOAD_FW                 (V4L2_CID_FIMC_IS_BASE + 10)
-#define V4L2_CID_IS_INIT_PARAM              (V4L2_CID_FIMC_IS_BASE + 11)
-#define V4L2_CID_IS_RESET                   (V4L2_CID_FIMC_IS_BASE + 12)
-#define V4L2_CID_IS_S_POWER                 (V4L2_CID_FIMC_IS_BASE + 13)
-enum is_set_power {
-    IS_POWER_OFF,
-    IS_POWER_ON
-};
-
-#define V4L2_CID_IS_S_STREAM                (V4L2_CID_FIMC_IS_BASE + 14)
-enum is_set_stream {
-    IS_DISABLE_STREAM,
-    IS_ENABLE_STREAM
-};
-
-#define V4L2_CID_IS_S_SCENARIO_MODE         (V4L2_CID_FIMC_IS_BASE + 15)
-#define V4L2_CID_IS_S_FORMAT_SCENARIO       (V4L2_CID_FIMC_IS_BASE + 16)
-enum scenario_mode {
-    IS_MODE_PREVIEW_STILL,
-    IS_MODE_PREVIEW_VIDEO,
-    IS_MODE_CAPTURE_STILL,
-    IS_MODE_CAPTURE_VIDEO,
-    IS_MODE_MAX
-};
-
-/* global */
-#define V4L2_CID_IS_CAMERA_SHOT_MODE_NORMAL      (V4L2_CID_FIMC_IS_BASE + 101)
-/* value : 1 : single shot , >=2 : continuous shot */
-
-#define V4L2_CID_IS_CAMERA_SENSOR_NUM        (V4L2_CID_FIMC_IS_BASE + 201)
-#define V4L2_CID_IS_CAMERA_FOCUS_MODE        (V4L2_CID_FIMC_IS_BASE + 401)
-enum is_focus_mode {
-    IS_FOCUS_MODE_AUTO,
-    IS_FOCUS_MODE_MACRO,
-    IS_FOCUS_MODE_INFINITY,
-    IS_FOCUS_MODE_CONTINUOUS,
-    IS_FOCUS_MODE_TOUCH,
-    IS_FOCUS_MODE_FACEDETECT,
-    IS_FOCUS_MODE_MAX,
-};
-
-#define V4L2_CID_IS_CAMERA_FLASH_MODE        (V4L2_CID_FIMC_IS_BASE + 402)
-enum is_flash_mode {
-    IS_FLASH_MODE_OFF,
-    IS_FLASH_MODE_AUTO,
-    IS_FLASH_MODE_AUTO_REDEYE,
-    IS_FLASH_MODE_ON,
-    IS_FLASH_MODE_TORCH,
-    IS_FLASH_MODE_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_AWB_MODE        (V4L2_CID_FIMC_IS_BASE + 403)
-enum is_awb_mode {
-    IS_AWB_AUTO,
-    IS_AWB_DAYLIGHT,
-    IS_AWB_CLOUDY,
-    IS_AWB_TUNGSTEN,
-    IS_AWB_FLUORESCENT,
-    IS_AWB_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_IMAGE_EFFECT        (V4L2_CID_FIMC_IS_BASE + 404)
-enum is_image_effect {
-    IS_IMAGE_EFFECT_DISABLE,
-    IS_IMAGE_EFFECT_MONOCHROME,
-    IS_IMAGE_EFFECT_NEGATIVE_MONO,
-    IS_IMAGE_EFFECT_NEGATIVE_COLOR,
-    IS_IMAGE_EFFECT_SEPIA,
-    IS_IMAGE_EFFECT_SEPIA_CB,
-    IS_IMAGE_EFFECT_SEPIA_CR,
-    IS_IMAGE_EFFECT_NEGATIVE,
-    IS_IMAGE_EFFECT_ARTFREEZE,
-    IS_IMAGE_EFFECT_EMBOSSING,
-    IS_IMAGE_EFFECT_SILHOUETTE,
-    IS_IMAGE_EFFECT_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_ISO            (V4L2_CID_FIMC_IS_BASE + 405)
-enum is_iso {
-    IS_ISO_AUTO,
-    IS_ISO_50,
-    IS_ISO_100,
-    IS_ISO_200,
-    IS_ISO_400,
-    IS_ISO_800,
-    IS_ISO_1600,
-    IS_ISO_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_CONTRAST        (V4L2_CID_FIMC_IS_BASE + 406)
-enum is_contrast {
-    IS_CONTRAST_AUTO,
-    IS_CONTRAST_MINUS_2,
-    IS_CONTRAST_MINUS_1,
-    IS_CONTRAST_DEFAULT,
-    IS_CONTRAST_PLUS_1,
-    IS_CONTRAST_PLUS_2,
-    IS_CONTRAST_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_SATURATION        (V4L2_CID_FIMC_IS_BASE + 407)
-enum is_saturation {
-    IS_SATURATION_MINUS_2,
-    IS_SATURATION_MINUS_1,
-    IS_SATURATION_DEFAULT,
-    IS_SATURATION_PLUS1,
-    IS_SATURATION_PLUS2,
-    IS_SATURATION_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_SHARPNESS        (V4L2_CID_FIMC_IS_BASE + 408)
-enum is_sharpness {
-    IS_SHARPNESS_MINUS_2,
-    IS_SHARPNESS_MINUS_1,
-    IS_SHARPNESS_DEFAULT,
-    IS_SHARPNESS_PLUS1,
-    IS_SHARPNESS_PLUS2,
-    IS_SHARPNESS_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_EXPOSURE        (V4L2_CID_FIMC_IS_BASE + 409)
-enum is_exposure {
-    IS_EXPOSURE_MINUS_2,
-    IS_EXPOSURE_MINUS_1,
-    IS_EXPOSURE_DEFAULT,
-    IS_EXPOSURE_PLUS1,
-    IS_EXPOSURE_PLUS2,
-    IS_EXPOSURE_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_BRIGHTNESS        (V4L2_CID_FIMC_IS_BASE + 410)
-enum is_brightness {
-    IS_BRIGHTNESS_MINUS_2,
-    IS_BRIGHTNESS_MINUS_1,
-    IS_BRIGHTNESS_DEFAULT,
-    IS_BRIGHTNESS_PLUS1,
-    IS_BRIGHTNESS_PLUS2,
-    IS_BRIGHTNESS_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_HUE            (V4L2_CID_FIMC_IS_BASE + 411)
-enum is_hue {
-    IS_HUE_MINUS_2,
-    IS_HUE_MINUS_1,
-    IS_HUE_DEFAULT,
-    IS_HUE_PLUS1,
-    IS_HUE_PLUS2,
-    IS_HUE_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_METERING        (V4L2_CID_FIMC_IS_BASE + 412)
-enum is_metering {
-    IS_METERING_AVERAGE,
-    IS_METERING_SPOT,
-    IS_METERING_MATRIX,
-    IS_METERING_MAX
-};
-#define V4L2_CID_IS_CAMERA_METERING_POSITION_X  (V4L2_CID_FIMC_IS_BASE + 500)
-#define V4L2_CID_IS_CAMERA_METERING_POSITION_Y  (V4L2_CID_FIMC_IS_BASE + 501)
-#define V4L2_CID_IS_CAMERA_METERING_WINDOW_X    (V4L2_CID_FIMC_IS_BASE + 502)
-#define V4L2_CID_IS_CAMERA_METERING_WINDOW_Y    (V4L2_CID_FIMC_IS_BASE + 503)
-
-#define V4L2_CID_IS_CAMERA_AFC_MODE        (V4L2_CID_FIMC_IS_BASE + 413)
-enum is_afc_mode {
-    IS_AFC_DISABLE,
-    IS_AFC_AUTO,
-    IS_AFC_MANUAL_50HZ,
-    IS_AFC_MANUAL_60HZ,
-    IS_AFC_MAX
-};
-
-#define V4L2_CID_IS_FD_NUM_FACE            (V4L2_CID_FIMC_IS_BASE + 414)
-/* value : maximum number of face */
-
-#define V4L2_CID_IS_FD_GET_FACE_COUNT            (V4L2_CID_FIMC_IS_BASE + 416)
-#define V4L2_CID_IS_FD_GET_FACE_FRAME_NUMBER     (V4L2_CID_FIMC_IS_BASE + 417)
-#define V4L2_CID_IS_FD_GET_FACE_CONFIDENCE       (V4L2_CID_FIMC_IS_BASE + 418)
-#define V4L2_CID_IS_FD_GET_FACE_SMILELEVEL       (V4L2_CID_FIMC_IS_BASE + 419)
-#define V4L2_CID_IS_FD_GET_FACE_BLINKLEVEL       (V4L2_CID_FIMC_IS_BASE + 420)
-#define V4L2_CID_IS_FD_GET_FACE_OFFSET_X         (V4L2_CID_FIMC_IS_BASE + 421)
-#define V4L2_CID_IS_FD_GET_FACE_OFFSET_Y         (V4L2_CID_FIMC_IS_BASE + 422)
-#define V4L2_CID_IS_FD_GET_FACE_SIZE_X           (V4L2_CID_FIMC_IS_BASE + 423)
-#define V4L2_CID_IS_FD_GET_FACE_SIZE_Y           (V4L2_CID_FIMC_IS_BASE + 424)
-#define V4L2_CID_IS_FD_GET_LEFT_EYE_OFFSET_X     (V4L2_CID_FIMC_IS_BASE + 425)
-#define V4L2_CID_IS_FD_GET_LEFT_EYE_OFFSET_Y     (V4L2_CID_FIMC_IS_BASE + 426)
-#define V4L2_CID_IS_FD_GET_LEFT_EYE_SIZE_X       (V4L2_CID_FIMC_IS_BASE + 427)
-#define V4L2_CID_IS_FD_GET_LEFT_EYE_SIZE_Y       (V4L2_CID_FIMC_IS_BASE + 428)
-#define V4L2_CID_IS_FD_GET_RIGHT_EYE_OFFSET_X    (V4L2_CID_FIMC_IS_BASE + 429)
-#define V4L2_CID_IS_FD_GET_RIGHT_EYE_OFFSET_Y    (V4L2_CID_FIMC_IS_BASE + 430)
-#define V4L2_CID_IS_FD_GET_RIGHT_EYE_SIZE_X      (V4L2_CID_FIMC_IS_BASE + 431)
-#define V4L2_CID_IS_FD_GET_RIGHT_EYE_SIZE_Y      (V4L2_CID_FIMC_IS_BASE + 432)
-#define V4L2_CID_IS_FD_GET_MOUTH_OFFSET_X        (V4L2_CID_FIMC_IS_BASE + 433)
-#define V4L2_CID_IS_FD_GET_MOUTH_OFFSET_Y        (V4L2_CID_FIMC_IS_BASE + 434)
-#define V4L2_CID_IS_FD_GET_MOUTH_SIZE_X          (V4L2_CID_FIMC_IS_BASE + 435)
-#define V4L2_CID_IS_FD_GET_MOUTH_SIZE_Y          (V4L2_CID_FIMC_IS_BASE + 436)
-#define V4L2_CID_IS_FD_GET_ANGLE                 (V4L2_CID_FIMC_IS_BASE + 437)
-#define V4L2_CID_IS_FD_SET_ORIENTATION           (V4L2_CID_FIMC_IS_BASE + 438)
-#define V4L2_CID_IS_FD_SET_DATA_ADDRESS          (V4L2_CID_FIMC_IS_BASE + 439)
-#define V4L2_CID_IS_FD_GET_DATA                  (V4L2_CID_FIMC_IS_BASE + 500)
-#define V4L2_CID_IS_FD_SET_YAW_ANGLE             (V4L2_CID_FIMC_IS_BASE + 501)
-#define V4L2_CID_IS_FD_SET_ROLL_ANGLE            (V4L2_CID_FIMC_IS_BASE + 502)
-
-#define V4L2_CID_IS_SET_ISP            (V4L2_CID_FIMC_IS_BASE + 440)
-enum is_isp_bypass_mode {
-    IS_ISP_BYPASS_DISABLE,
-    IS_ISP_BYPASS_ENABLE,
-    IS_ISP_BYPASS_MAX
-};
-
-#define V4L2_CID_IS_SET_DRC            (V4L2_CID_FIMC_IS_BASE + 441)
-enum is_drc_bypass_mode {
-    IS_DRC_BYPASS_DISABLE,
-    IS_DRC_BYPASS_ENABLE,
-    IS_DRC_BYPASS_MAX
-};
-
-#define V4L2_CID_IS_SET_FD            (V4L2_CID_FIMC_IS_BASE + 442)
-enum is_fd_bypass_mode {
-    IS_FD_BYPASS_DISABLE,
-    IS_FD_BYPASS_ENABLE,
-    IS_FD_BYPASS_MAX
-};
-
-#define V4L2_CID_IS_SET_ODC            (V4L2_CID_FIMC_IS_BASE + 443)
-enum is_odc_bypass_mode {
-    IS_ODC_BYPASS_DISABLE,
-    IS_ODC_BYPASS_ENABLE,
-    IS_ODC_BYPASS_MAX
-};
-
-#define V4L2_CID_IS_SET_DIS            (V4L2_CID_FIMC_IS_BASE + 444)
-enum is_dis_bypass_mode {
-    IS_DIS_BYPASS_DISABLE,
-    IS_DIS_BYPASS_ENABLE,
-    IS_DIS_BYPASS_MAX
-};
-
-#define V4L2_CID_IS_SET_3DNR            (V4L2_CID_FIMC_IS_BASE + 445)
-enum is_tdnr_bypass_mode {
-    IS_TDNR_BYPASS_DISABLE,
-    IS_TDNR_BYPASS_ENABLE,
-    IS_TDNR_BYPASS_MAX
-};
-
-#define V4L2_CID_IS_SET_SCALERC            (V4L2_CID_FIMC_IS_BASE + 446)
-enum is_scalerc_bypass_mode {
-    IS_SCALERC_BYPASS_DISABLE,
-    IS_SCALERC_BYPASS_ENABLE,
-    IS_SCALERC_BYPASS_MAX
-};
-
-#define V4L2_CID_IS_SET_SCALERP            (V4L2_CID_FIMC_IS_BASE + 446)
-enum is_scalerp_bypass_mode {
-    IS_SCALERP_BYPASS_DISABLE,
-    IS_SCALERP_BYPASS_ENABLE,
-    IS_SCALERP_BYPASS_MAX
-};
-
-#define V4L2_CID_IS_ROTATION_MODE        (V4L2_CID_FIMC_IS_BASE + 450)
-enum is_rotation_mode {
-    IS_ROTATION_0,
-    IS_ROTATION_90,
-    IS_ROTATION_180,
-    IS_ROTATION_270,
-    IS_ROTATION_MAX
-};
-
-#define V4L2_CID_IS_3DNR_1ST_FRAME_MODE        (V4L2_CID_FIMC_IS_BASE + 451)
-enum is_tdnr_1st_frame_mode {
-    IS_TDNR_1ST_FRAME_NOPROCESSING,
-    IS_TDNR_1ST_FRAME_2DNR,
-    IS_TDNR_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_OBJECT_POSITION_X    (V4L2_CID_FIMC_IS_BASE + 452)
-#define V4L2_CID_IS_CAMERA_OBJECT_POSITION_Y    (V4L2_CID_FIMC_IS_BASE + 453)
-#define V4L2_CID_IS_CAMERA_WINDOW_SIZE_X        (V4L2_CID_FIMC_IS_BASE + 454)
-#define V4L2_CID_IS_CAMERA_WINDOW_SIZE_Y        (V4L2_CID_FIMC_IS_BASE + 455)
-
-#define V4L2_CID_IS_CAMERA_EXIF_EXPTIME         (V4L2_CID_FIMC_IS_BASE + 456)
-#define V4L2_CID_IS_CAMERA_EXIF_FLASH           (V4L2_CID_FIMC_IS_BASE + 457)
-#define V4L2_CID_IS_CAMERA_EXIF_ISO             (V4L2_CID_FIMC_IS_BASE + 458)
-#define V4L2_CID_IS_CAMERA_EXIF_SHUTTERSPEED    (V4L2_CID_FIMC_IS_BASE + 459)
-#define V4L2_CID_IS_CAMERA_EXIF_BRIGHTNESS      (V4L2_CID_FIMC_IS_BASE + 460)
-
-#define V4L2_CID_IS_CAMERA_ISP_SEL_INPUT        (V4L2_CID_FIMC_IS_BASE + 461)
-enum is_isp_sel_input {
-    IS_ISP_INPUT_OTF,
-    IS_ISP_INPUT_DMA1,
-    IS_ISP_INPUT_DMA2,
-    IS_ISP_INPUT_DMA12,
-    IS_ISP_INPUT_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_ISP_SEL_OUTPUT    (V4L2_CID_FIMC_IS_BASE + 462)
-enum is_isp_sel_output {
-    IS_ISP_OUTPUT_OTF,
-    IS_ISP_OUTPUT_DMA1,
-    IS_ISP_OUTPUT_DMA2,
-    IS_ISP_OUTPUT_DMA12,
-    IS_ISP_OUTPUT_OTF_DMA1,
-    IS_ISP_OUTPUT_OTF_DMA2,
-    IS_ISP_OUTPUT_OTF_DMA12,
-    IS_ISP_OUTPUT_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_DRC_SEL_INPUT    (V4L2_CID_FIMC_IS_BASE + 463)
-enum is_drc_sel_input {
-    IS_DRC_INPUT_OTF,
-    IS_DRC_INPUT_DMA,
-    IS_DRC_INPUT_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_FD_SEL_INPUT        (V4L2_CID_FIMC_IS_BASE + 464)
-enum is_fd_sel_input {
-    IS_FD_INPUT_OTF,
-    IS_FD_INPUT_DMA,
-    IS_FD_INPUT_MAX
-};
-
-#define V4L2_CID_IS_CAMERA_INIT_WIDTH        (V4L2_CID_FIMC_IS_BASE + 465)
-#define V4L2_CID_IS_CAMERA_INIT_HEIGHT       (V4L2_CID_FIMC_IS_BASE + 466)
-
-#define V4L2_CID_IS_CMD_ISP            (V4L2_CID_FIMC_IS_BASE + 467)
-enum is_isp_cmd_mode {
-    IS_ISP_COMMAND_STOP,
-    IS_ISP_COMMAND_START,
-    IS_ISP_COMMAND_MAX
-};
-
-#define V4L2_CID_IS_CMD_DRC            (V4L2_CID_FIMC_IS_BASE + 468)
-enum is_drc_cmd_mode {
-    IS_DRC_COMMAND_STOP,
-    IS_DRC_COMMAND_START,
-    IS_DRC_COMMAND_MAX
-};
-
-#define V4L2_CID_IS_CMD_FD            (V4L2_CID_FIMC_IS_BASE + 469)
-enum is_fd_cmd_mode {
-    IS_FD_COMMAND_STOP,
-    IS_FD_COMMAND_START,
-    IS_FD_COMMAND_MAX
-};
-
-#define V4L2_CID_IS_CMD_ODC            (V4L2_CID_FIMC_IS_BASE + 470)
-enum is_odc_cmd_mode {
-    IS_ODC_COMMAND_STOP,
-    IS_ODC_COMMAND_START,
-    IS_ODC_COMMAND_MAX
-};
-
-#define V4L2_CID_IS_CMD_DIS            (V4L2_CID_FIMC_IS_BASE + 471)
-enum is_dis_cmd_mode {
-    IS_DIS_COMMAND_STOP,
-    IS_DIS_COMMAND_START,
-    IS_DIS_COMMAND_MAX
-};
-
-#define V4L2_CID_IS_CMD_TDNR           (V4L2_CID_FIMC_IS_BASE + 472)
-enum is_tdnr_cmd_mode {
-    IS_TDNR_COMMAND_STOP,
-    IS_TDNR_COMMAND_START,
-    IS_TDNR_COMMAND_MAX
-};
-
-#define V4L2_CID_IS_CMD_SCALERC        (V4L2_CID_FIMC_IS_BASE + 473)
-enum is_scalerc_cmd_mode {
-    IS_SCALERC_COMMAND_STOP,
-    IS_SCALERC_COMMAND_START,
-    IS_SCALERC_COMMAND_MAX
-};
-
-#define V4L2_CID_IS_CMD_SCALERP        (V4L2_CID_FIMC_IS_BASE + 474)
-enum is_scalerp_cmd_mode {
-    IS_SCALERP_COMMAND_STOP,
-    IS_SCALERP_COMMAND_START,
-    IS_SCALERP_COMMAND_MAX
-};
-
-#define V4L2_CID_IS_GET_SENSOR_OFFSET_X        (V4L2_CID_FIMC_IS_BASE + 480)
-#define V4L2_CID_IS_GET_SENSOR_OFFSET_Y        (V4L2_CID_FIMC_IS_BASE + 481)
-#define V4L2_CID_IS_GET_SENSOR_WIDTH           (V4L2_CID_FIMC_IS_BASE + 482)
-#define V4L2_CID_IS_GET_SENSOR_HEIGHT          (V4L2_CID_FIMC_IS_BASE + 483)
-
-#define V4L2_CID_IS_GET_FRAME_VALID            (V4L2_CID_FIMC_IS_BASE + 484)
-#define V4L2_CID_IS_SET_FRAME_VALID            (V4L2_CID_FIMC_IS_BASE + 485)
-#define V4L2_CID_IS_GET_FRAME_BADMARK          (V4L2_CID_FIMC_IS_BASE + 486)
-#define V4L2_CID_IS_SET_FRAME_BADMARK          (V4L2_CID_FIMC_IS_BASE + 487)
-#define V4L2_CID_IS_GET_FRAME_CAPTURED         (V4L2_CID_FIMC_IS_BASE + 488)
-#define V4L2_CID_IS_SET_FRAME_CAPTURED         (V4L2_CID_FIMC_IS_BASE + 489)
-#define V4L2_CID_IS_SET_FRAME_NUMBER           (V4L2_CID_FIMC_IS_BASE + 490)
-#define V4L2_CID_IS_GET_FRAME_NUMBER           (V4L2_CID_FIMC_IS_BASE + 491)
-#define V4L2_CID_IS_CLEAR_FRAME_NUMBER         (V4L2_CID_FIMC_IS_BASE + 492)
-#define V4L2_CID_IS_GET_LOSTED_FRAME_NUMBER    (V4L2_CID_FIMC_IS_BASE + 493)
-#define V4L2_CID_IS_ISP_DMA_BUFFER_NUM         (V4L2_CID_FIMC_IS_BASE + 494)
-#define V4L2_CID_IS_ISP_DMA_BUFFER_ADDRESS     (V4L2_CID_FIMC_IS_BASE + 495)
-
-enum v4l2_blur {
-    BLUR_LEVEL_0 = 0,
-    BLUR_LEVEL_1,
-    BLUR_LEVEL_2,
-    BLUR_LEVEL_3,
-    BLUR_LEVEL_MAX,
-};
-
-#if 1
-#define V4L2_CID_CAMERA_SCENE_MODE      (V4L2_CID_PRIVATE_BASE+70)
-enum v4l2_scene_mode {
-    SCENE_MODE_BASE,
-    SCENE_MODE_NONE,
-    SCENE_MODE_PORTRAIT,
-    SCENE_MODE_NIGHTSHOT,
-    SCENE_MODE_BACK_LIGHT,
-    SCENE_MODE_LANDSCAPE,
-    SCENE_MODE_SPORTS,
-    SCENE_MODE_PARTY_INDOOR,
-    SCENE_MODE_BEACH_SNOW,
-    SCENE_MODE_SUNSET,
-    SCENE_MODE_DUSK_DAWN,
-    SCENE_MODE_FALL_COLOR,
-    SCENE_MODE_FIREWORKS,
-    SCENE_MODE_TEXT,
-    SCENE_MODE_CANDLE_LIGHT,
-    SCENE_MODE_MAX,
-};
-
-#define V4L2_CID_CAMERA_FLASH_MODE      (V4L2_CID_PRIVATE_BASE+71)
-enum v4l2_flash_mode {
-    FLASH_MODE_BASE,
-    FLASH_MODE_OFF,
-    FLASH_MODE_AUTO,
-    FLASH_MODE_ON,
-    FLASH_MODE_TORCH,
-    FLASH_MODE_MAX,
-};
-
-#define V4L2_CID_CAMERA_BRIGHTNESS      (V4L2_CID_PRIVATE_BASE+72)
-enum v4l2_ev_mode {
-    EV_MINUS_4  = -4,
-    EV_MINUS_3  = -3,
-    EV_MINUS_2  = -2,
-    EV_MINUS_1  = -1,
-    EV_DEFAULT  = 0,
-    EV_PLUS_1   = 1,
-    EV_PLUS_2   = 2,
-    EV_PLUS_3   = 3,
-    EV_PLUS_4   = 4,
-    EV_MAX,
-};
-
-#define V4L2_CID_CAMERA_WHITE_BALANCE   (V4L2_CID_PRIVATE_BASE+73)
-enum v4l2_wb_mode {
-    WHITE_BALANCE_BASE = 0,
-    WHITE_BALANCE_AUTO,
-    WHITE_BALANCE_SUNNY,
-    WHITE_BALANCE_CLOUDY,
-    WHITE_BALANCE_TUNGSTEN,
-    WHITE_BALANCE_FLUORESCENT,
-    WHITE_BALANCE_MAX,
-};
-
-#define V4L2_CID_CAMERA_EFFECT          (V4L2_CID_PRIVATE_BASE+74)
-enum v4l2_effect_mode {
-    IMAGE_EFFECT_BASE = 0,
-    IMAGE_EFFECT_NONE,
-    IMAGE_EFFECT_BNW,
-    IMAGE_EFFECT_SEPIA,
-    IMAGE_EFFECT_AQUA,
-    IMAGE_EFFECT_ANTIQUE,
-    IMAGE_EFFECT_NEGATIVE,
-    IMAGE_EFFECT_SHARPEN,
-    IMAGE_EFFECT_MAX,
-};
-
-#define V4L2_CID_CAMERA_ISO             (V4L2_CID_PRIVATE_BASE+75)
-enum v4l2_iso_mode {
-    ISO_AUTO = 0,
-    ISO_50,
-    ISO_100,
-    ISO_200,
-    ISO_400,
-    ISO_800,
-    ISO_1600,
-    ISO_SPORTS,
-    ISO_NIGHT,
-    ISO_MOVIE,
-    ISO_MAX,
-};
-
-#define V4L2_CID_CAMERA_METERING            (V4L2_CID_PRIVATE_BASE+76)
-enum v4l2_metering_mode {
-    METERING_BASE = 0,
-    METERING_MATRIX,
-    METERING_CENTER,
-    METERING_SPOT,
-    METERING_MAX,
-};
-
-#define V4L2_CID_CAMERA_CONTRAST            (V4L2_CID_PRIVATE_BASE+77)
-enum v4l2_contrast_mode {
-    CONTRAST_MINUS_2 = 0,
-    CONTRAST_MINUS_1,
-    CONTRAST_DEFAULT,
-    CONTRAST_PLUS_1,
-    CONTRAST_PLUS_2,
-    CONTRAST_MAX,
-};
-
-#define V4L2_CID_CAMERA_SATURATION      (V4L2_CID_PRIVATE_BASE+78)
-enum v4l2_saturation_mode {
-    SATURATION_MINUS_2 = 0,
-    SATURATION_MINUS_1,
-    SATURATION_DEFAULT,
-    SATURATION_PLUS_1,
-    SATURATION_PLUS_2,
-    SATURATION_MAX,
-};
-
-#define V4L2_CID_CAMERA_SHARPNESS       (V4L2_CID_PRIVATE_BASE+79)
-enum v4l2_sharpness_mode {
-    SHARPNESS_MINUS_2 = 0,
-    SHARPNESS_MINUS_1,
-    SHARPNESS_DEFAULT,
-    SHARPNESS_PLUS_1,
-    SHARPNESS_PLUS_2,
-    SHARPNESS_MAX,
-};
-
-#define V4L2_CID_CAMERA_WDR             (V4L2_CID_PRIVATE_BASE+80)
-enum v4l2_wdr_mode {
-    WDR_OFF,
-    WDR_ON,
-    WDR_MAX,
-};
-
-#define V4L2_CID_CAMERA_ANTI_SHAKE      (V4L2_CID_PRIVATE_BASE+81)
-enum v4l2_anti_shake_mode {
-    ANTI_SHAKE_OFF,
-    ANTI_SHAKE_STILL_ON,
-    ANTI_SHAKE_MOVIE_ON,
-    ANTI_SHAKE_MAX,
-};
-
-#define V4L2_CID_CAMERA_TOUCH_AF_START_STOP     (V4L2_CID_PRIVATE_BASE+82)
-enum v4l2_touch_af {
-    TOUCH_AF_STOP = 0,
-    TOUCH_AF_START,
-    TOUCH_AF_MAX,
-};
-
-#define V4L2_CID_CAMERA_SMART_AUTO      (V4L2_CID_PRIVATE_BASE+83)
-enum v4l2_smart_auto {
-    SMART_AUTO_OFF = 0,
-    SMART_AUTO_ON,
-    SMART_AUTO_MAX,
-};
-
-#define V4L2_CID_CAMERA_VINTAGE_MODE        (V4L2_CID_PRIVATE_BASE+84)
-enum v4l2_vintage_mode {
-    VINTAGE_MODE_BASE,
-    VINTAGE_MODE_OFF,
-    VINTAGE_MODE_NORMAL,
-    VINTAGE_MODE_WARM,
-    VINTAGE_MODE_COOL,
-    VINTAGE_MODE_BNW,
-    VINTAGE_MODE_MAX,
-};
-
-#define V4L2_CID_CAMERA_JPEG_QUALITY        (V4L2_CID_PRIVATE_BASE+85)
-#define V4L2_CID_CAMERA_GPS_LATITUDE        (V4L2_CID_CAMERA_CLASS_BASE + 30)//(V4L2_CID_PRIVATE_BASE+86)
-#define V4L2_CID_CAMERA_GPS_LONGITUDE   (V4L2_CID_CAMERA_CLASS_BASE + 31)//(V4L2_CID_PRIVATE_BASE+87)
-#define V4L2_CID_CAMERA_GPS_TIMESTAMP   (V4L2_CID_CAMERA_CLASS_BASE + 32)//(V4L2_CID_PRIVATE_BASE+88)
-#define V4L2_CID_CAMERA_GPS_ALTITUDE        (V4L2_CID_CAMERA_CLASS_BASE + 33)//(V4L2_CID_PRIVATE_BASE+89)
-#define V4L2_CID_CAMERA_EXIF_TIME_INFO  (V4L2_CID_CAMERA_CLASS_BASE + 34)
-#define V4L2_CID_CAMERA_GPS_PROCESSINGMETHOD                     (V4L2_CID_CAMERA_CLASS_BASE+35)
-#define V4L2_CID_CAMERA_ZOOM                (V4L2_CID_PRIVATE_BASE+90)
-enum v4l2_zoom_level {
-    ZOOM_LEVEL_0 = 0,
-    ZOOM_LEVEL_1,
-    ZOOM_LEVEL_2,
-    ZOOM_LEVEL_3,
-    ZOOM_LEVEL_4,
-    ZOOM_LEVEL_5,
-    ZOOM_LEVEL_6,
-    ZOOM_LEVEL_7,
-    ZOOM_LEVEL_8,
-    ZOOM_LEVEL_9,
-    ZOOM_LEVEL_10,
-    ZOOM_LEVEL_11,
-    ZOOM_LEVEL_12,
-    ZOOM_LEVEL_MAX = 31,
-};
-
-#define V4L2_CID_CAMERA_FACE_DETECTION      (V4L2_CID_PRIVATE_BASE+91)
-enum v4l2_face_detection {
-    FACE_DETECTION_OFF = 0,
-    FACE_DETECTION_ON,
-    FACE_DETECTION_NOLINE,
-    FACE_DETECTION_ON_BEAUTY,
-    FACE_DETECTION_MAX,
-};
-
-#define V4L2_CID_CAMERA_SMART_AUTO_STATUS       (V4L2_CID_PRIVATE_BASE+92)
-enum v4l2_smart_auto_status {
-    SMART_AUTO_STATUS_AUTO = 0,
-    SMART_AUTO_STATUS_LANDSCAPE,
-    SMART_AUTO_STATUS_PORTRAIT,
-    SMART_AUTO_STATUS_MACRO,
-    SMART_AUTO_STATUS_NIGHT,
-    SMART_AUTO_STATUS_PORTRAIT_NIGHT,
-    SMART_AUTO_STATUS_BACKLIT,
-    SMART_AUTO_STATUS_PORTRAIT_BACKLIT,
-    SMART_AUTO_STATUS_ANTISHAKE,
-    SMART_AUTO_STATUS_PORTRAIT_ANTISHAKE,
-    SMART_AUTO_STATUS_MAX,
-};
-
-#define V4L2_CID_CAMERA_SET_AUTO_FOCUS      (V4L2_CID_PRIVATE_BASE+93)
-enum v4l2_auto_focus {
-    AUTO_FOCUS_OFF = 0,
-    AUTO_FOCUS_ON,
-    AUTO_FOCUS_MAX,
-};
-
-#define V4L2_CID_CAMERA_BEAUTY_SHOT     (V4L2_CID_PRIVATE_BASE+94)
-enum v4l2_beauty_shot {
-    BEAUTY_SHOT_OFF = 0,
-    BEAUTY_SHOT_ON,
-    BEAUTY_SHOT_MAX,
-};
-
-#define V4L2_CID_CAMERA_AEAWB_LOCK_UNLOCK       (V4L2_CID_PRIVATE_BASE+95)
-enum v4l2_ae_awb_lockunlock {
-    AE_UNLOCK_AWB_UNLOCK = 0,
-    AE_LOCK_AWB_UNLOCK,
-    AE_UNLOCK_AWB_LOCK,
-    AE_LOCK_AWB_LOCK,
-    AE_AWB_MAX
-};
-
-#define V4L2_CID_CAMERA_FACEDETECT_LOCKUNLOCK   (V4L2_CID_PRIVATE_BASE+96)
-enum v4l2_face_lock {
-    FACE_LOCK_OFF = 0,
-    FACE_LOCK_ON,
-    FIRST_FACE_TRACKING,
-    FACE_LOCK_MAX,
-};
-
-#define V4L2_CID_CAMERA_OBJECT_POSITION_X   (V4L2_CID_PRIVATE_BASE+97)
-#define V4L2_CID_CAMERA_OBJECT_POSITION_Y   (V4L2_CID_PRIVATE_BASE+98)
-#define V4L2_CID_CAMERA_FOCUS_MODE      (V4L2_CID_PRIVATE_BASE+99)
-enum v4l2_focusmode {
-    FOCUS_MODE_AUTO = 0,
-    FOCUS_MODE_MACRO,
-    FOCUS_MODE_FACEDETECT,
-    FOCUS_MODE_INFINITY,
-    FOCUS_MODE_CONTINOUS,
-    FOCUS_MODE_TOUCH,
-    FOCUS_MODE_MAX,
-    FOCUS_MODE_DEFAULT = (1 << 8),
-};
-
-#define V4L2_CID_CAMERA_OBJ_TRACKING_STATUS (V4L2_CID_PRIVATE_BASE+100)
-enum v4l2_obj_tracking_status {
-    OBJECT_TRACKING_STATUS_BASE,
-    OBJECT_TRACKING_STATUS_PROGRESSING,
-    OBJECT_TRACKING_STATUS_SUCCESS,
-    OBJECT_TRACKING_STATUS_FAIL,
-    OBJECT_TRACKING_STATUS_MISSING,
-    OBJECT_TRACKING_STATUS_MAX,
-};
-
-#define V4L2_CID_CAMERA_OBJ_TRACKING_START_STOP (V4L2_CID_PRIVATE_BASE+101)
-enum v4l2_ot_start_stop {
-    OT_STOP = 0,
-    OT_START,
-    OT_MAX,
-};
-
-#define V4L2_CID_CAMERA_CAF_START_STOP  (V4L2_CID_PRIVATE_BASE+102)
-enum v4l2_caf_start_stop {
-    CAF_STOP = 0,
-    CAF_START,
-    CAF_MAX,
-};
-
-#define V4L2_CID_CAMERA_AUTO_FOCUS_RESULT           (V4L2_CID_PRIVATE_BASE+103)
-#define V4L2_CID_CAMERA_FRAME_RATE          (V4L2_CID_PRIVATE_BASE+104)
-enum v4l2_frame_rate {
-    FRAME_RATE_AUTO = 0,
-    FRAME_RATE_7 = 7,
-    FRAME_RATE_15 = 15,
-    FRAME_RATE_30 = 30,
-    FRAME_RATE_60 = 60,
-    FRAME_RATE_120 = 120,
-    FRAME_RATE_MAX
-};
-
-#define V4L2_CID_CAMERA_ANTI_BANDING                    (V4L2_CID_PRIVATE_BASE+105)
-enum v4l2_anti_banding {
-    ANTI_BANDING_AUTO = 0,
-    ANTI_BANDING_50HZ = 1,
-    ANTI_BANDING_60HZ = 2,
-    ANTI_BANDING_OFF = 3,
-};
-
-#define V4L2_CID_CAMERA_SET_GAMMA   (V4L2_CID_PRIVATE_BASE+106)
-enum v4l2_gamma_mode {
-    GAMMA_OFF = 0,
-    GAMMA_ON = 1,
-    GAMMA_MAX,
-};
-
-#define V4L2_CID_CAMERA_SET_SLOW_AE (V4L2_CID_PRIVATE_BASE+107)
-enum v4l2_slow_ae_mode {
-    SLOW_AE_OFF,
-    SLOW_AE_ON,
-    SLOW_AE_MAX,
-};
-
-#define V4L2_CID_CAMERA_BATCH_REFLECTION                    (V4L2_CID_PRIVATE_BASE+108)
-#define V4L2_CID_CAMERA_EXIF_ORIENTATION                    (V4L2_CID_PRIVATE_BASE+109)
-
-#define V4L2_CID_CAMERA_RESET                               (V4L2_CID_PRIVATE_BASE+111) //s1_camera [ Defense process by ESD input ]
-#define V4L2_CID_CAMERA_CHECK_DATALINE                      (V4L2_CID_PRIVATE_BASE+112)
-#define V4L2_CID_CAMERA_CHECK_DATALINE_STOP                 (V4L2_CID_PRIVATE_BASE+113)
-
-#endif
-
-#if defined(CONFIG_ARIES_NTT) // Modify NTTS1
-#define V4L2_CID_CAMERA_AE_AWB_DISABLE_LOCK                 (V4L2_CID_PRIVATE_BASE+114)
-#endif
-#define V4L2_CID_CAMERA_THUMBNAIL_NULL                                  (V4L2_CID_PRIVATE_BASE+115)
-#define V4L2_CID_CAMERA_SENSOR_MODE                 (V4L2_CID_PRIVATE_BASE+116)
-enum v4l2_sensor_mode {
-    SENSOR_CAMERA,
-    SENSOR_MOVIE,
-};
-
-typedef enum {
-    STREAM_MODE_CAM_OFF,
-    STREAM_MODE_CAM_ON,
-    STREAM_MODE_MOVIE_OFF,
-    STREAM_MODE_MOVIE_ON,
-} stream_mode_t;
-
-#define V4L2_CID_CAMERA_EXIF_EXPTIME                (V4L2_CID_PRIVATE_BASE+117)
-#define V4L2_CID_CAMERA_EXIF_FLASH                  (V4L2_CID_PRIVATE_BASE+118)
-#define V4L2_CID_CAMERA_EXIF_ISO                    (V4L2_CID_PRIVATE_BASE+119)
-#define V4L2_CID_CAMERA_EXIF_TV                     (V4L2_CID_PRIVATE_BASE+120)
-#define V4L2_CID_CAMERA_EXIF_BV                     (V4L2_CID_PRIVATE_BASE+121)
-#define V4L2_CID_CAMERA_EXIF_EBV                    (V4L2_CID_PRIVATE_BASE+122)
-#define V4L2_CID_CAMERA_CHECK_ESD                   (V4L2_CID_PRIVATE_BASE+123)
-#define V4L2_CID_CAMERA_APP_CHECK                   (V4L2_CID_PRIVATE_BASE+124)
-
-/*      Pixel format FOURCC depth  Description  */
-enum v4l2_pix_format_mode {
-    V4L2_PIX_FMT_MODE_PREVIEW,
-    V4L2_PIX_FMT_MODE_CAPTURE,
-    V4L2_PIX_FMT_MODE_HDR,
-    V4L2_PIX_FMT_MODE_VT_MIRROR,
-    V4L2_PIX_FMT_MODE_VT_NONMIRROR,
-};
-/* 12  Y/CbCr 4:2:0 64x32 macroblocks */
-#define V4L2_PIX_FMT_NV12T    v4l2_fourcc('T', 'V', '1', '2')
-#define V4L2_PIX_FMT_NV21T    v4l2_fourcc('T', 'V', '2', '1')
-
-
-/*
- *  * V4L2 extention for digital camera
- *   */
-/* Strobe flash light */
-enum v4l2_strobe_control {
-    /* turn off the flash light */
-    V4L2_STROBE_CONTROL_OFF     = 0,
-    /* turn on the flash light */
-    V4L2_STROBE_CONTROL_ON      = 1,
-    /* act guide light before splash */
-    V4L2_STROBE_CONTROL_AFGUIDE = 2,
-    /* charge the flash light */
-    V4L2_STROBE_CONTROL_CHARGE  = 3,
-};
-
-enum v4l2_strobe_conf {
-    V4L2_STROBE_OFF         = 0,    /* Always off */
-    V4L2_STROBE_ON          = 1,    /* Always splashes */
-    /* Auto control presets */
-    V4L2_STROBE_AUTO        = 2,
-    V4L2_STROBE_REDEYE_REDUCTION    = 3,
-    V4L2_STROBE_SLOW_SYNC       = 4,
-    V4L2_STROBE_FRONT_CURTAIN   = 5,
-    V4L2_STROBE_REAR_CURTAIN    = 6,
-    /* Extra manual control presets */
-    /* keep turned on until turning off */
-    V4L2_STROBE_PERMANENT       = 7,
-    V4L2_STROBE_EXTERNAL        = 8,
-};
-
-enum v4l2_strobe_status {
-    V4L2_STROBE_STATUS_OFF      = 0,
-    /* while processing configurations */
-    V4L2_STROBE_STATUS_BUSY     = 1,
-    V4L2_STROBE_STATUS_ERR      = 2,
-    V4L2_STROBE_STATUS_CHARGING = 3,
-    V4L2_STROBE_STATUS_CHARGED  = 4,
-};
-
-/* capabilities field */
-/* No strobe supported */
-#define V4L2_STROBE_CAP_NONE        0x0000
-/* Always flash off mode */
-#define V4L2_STROBE_CAP_OFF     0x0001
-/* Always use flash light mode */
-#define V4L2_STROBE_CAP_ON      0x0002
-/* Flashlight works automatic */
-#define V4L2_STROBE_CAP_AUTO        0x0004
-/* Red-eye reduction */
-#define V4L2_STROBE_CAP_REDEYE      0x0008
-/* Slow sync */
-#define V4L2_STROBE_CAP_SLOWSYNC    0x0010
-/* Front curtain */
-#define V4L2_STROBE_CAP_FRONT_CURTAIN   0x0020
-/* Rear curtain */
-#define V4L2_STROBE_CAP_REAR_CURTAIN    0x0040
-/* keep turned on until turning off */
-#define V4L2_STROBE_CAP_PERMANENT   0x0080
-/* use external strobe */
-#define V4L2_STROBE_CAP_EXTERNAL    0x0100
-
-/* Set mode and Get status */
-struct v4l2_strobe {
-    /* off/on/charge:0/1/2 */
-    enum    v4l2_strobe_control control;
-    /* supported strobe capabilities */
-    __u32   capabilities;
-    enum    v4l2_strobe_conf mode;
-    enum    v4l2_strobe_status status;  /* read only */
-    /* default is 0 and range of value varies from each models */
-    __u32   flash_ev;
-    __u32   reserved[4];
-};
-
-#define VIDIOC_S_STROBE     _IOWR('V', 83, struct v4l2_strobe)
-#define VIDIOC_G_STROBE     _IOR('V', 84, struct v4l2_strobe)
-
-/* Object recognition and collateral actions */
-enum v4l2_recog_mode {
-    V4L2_RECOGNITION_MODE_OFF   = 0,
-    V4L2_RECOGNITION_MODE_ON    = 1,
-    V4L2_RECOGNITION_MODE_LOCK  = 2,
-};
-
-enum v4l2_recog_action {
-    V4L2_RECOGNITION_ACTION_NONE    = 0,    /* only recognition */
-    V4L2_RECOGNITION_ACTION_BLINK   = 1,    /* Capture on blinking */
-    V4L2_RECOGNITION_ACTION_SMILE   = 2,    /* Capture on smiling */
-};
-
-enum v4l2_recog_pattern {
-    V4L2_RECOG_PATTERN_FACE     = 0, /* Face */
-    V4L2_RECOG_PATTERN_HUMAN    = 1, /* Human */
-    V4L2_RECOG_PATTERN_CHAR     = 2, /* Character */
-};
-
-struct v4l2_recog_rect {
-    enum    v4l2_recog_pattern  p;  /* detected pattern */
-    struct  v4l2_rect  o;   /* detected area */
-    __u32   reserved[4];
-};
-
-struct v4l2_recog_data {
-    __u8    detect_cnt;     /* detected object counter */
-    struct  v4l2_rect   o;  /* detected area */
-    __u32   reserved[4];
-};
-
-struct v4l2_recognition {
-    enum v4l2_recog_mode    mode;
-
-    /* Which pattern to detect */
-    enum v4l2_recog_pattern  pattern;
-
-    /* How many object to detect */
-    __u8    obj_num;
-
-    /* select detected object */
-    __u32   detect_idx;
-
-    /* read only :Get object coordination */
-    struct v4l2_recog_data  data;
-
-    enum v4l2_recog_action  action;
-    __u32   reserved[4];
-};
-
-#define VIDIOC_S_RECOGNITION    _IOWR('V', 85, struct v4l2_recognition)
-#define VIDIOC_G_RECOGNITION    _IOR('V', 86, struct v4l2_recognition)
-
-#endif /* __LINUX_VIDEODEV2_SAMSUNG_H */
diff --git a/exynos5/hal/libcamera/Android.mk b/exynos5/hal/libcamera/Android.mk
deleted file mode 100644
index 9ab5b2f..0000000
--- a/exynos5/hal/libcamera/Android.mk
+++ /dev/null
@@ -1,28 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# HAL module implemenation stored in
-# hw/<COPYPIX_HARDWARE_MODULE_ID>.<ro.product.board>.so
-LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
-
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
-
-LOCAL_SRC_FILES:= \
-	SecCamera.cpp \
-	SecCameraHWInterface.cpp \
-	mediactl.cpp \
-
-LOCAL_SHARED_LIBRARIES:= libutils libcutils libbinder liblog libcamera_client libhardware
-
-LOCAL_CFLAGS += -DGAIA_FW_BETA
-
-ifeq ($(BOARD_USES_HWJPEG),true)
-LOCAL_SHARED_LIBRARIES += libhwjpeg
-LOCAL_CFLAGS += -DSAMSUNG_EXYNOS5250
-endif
-
-LOCAL_MODULE := camera.$(TARGET_DEVICE)
-
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/exynos5/hal/libcamera/NOTICE b/exynos5/hal/libcamera/NOTICE
deleted file mode 100644
index f921593..0000000
--- a/exynos5/hal/libcamera/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (C) 2008 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/exynos5/hal/libcamera/SecCamera.cpp b/exynos5/hal/libcamera/SecCamera.cpp
deleted file mode 100644
index aad6c79..0000000
--- a/exynos5/hal/libcamera/SecCamera.cpp
+++ /dev/null
@@ -1,3693 +0,0 @@
-/*
- * Copyright 2008, The Android Open Source Project
- * Copyright 2010, Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
-************************************
-* Filename: SecCamera.cpp
-* Author:   Sachin P. Kamat
-* Purpose:  This file interacts with the Camera and JPEG drivers.
-*************************************
-*/
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "SecCamera"
-
-#include <utils/Log.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/poll.h>
-#include "SecCamera.h"
-#include "cutils/properties.h"
-#include <videodev2.h>
-#include "mediactl.h"
-#include "v4l2subdev.h"
-
-using namespace android;
-
-#define CHECK(return_value)                                          \
-    if (return_value < 0) {                                          \
-        ALOGE("%s::%d fail. errno: %s, m_camera_id = %d",             \
-             __func__, __LINE__, strerror(errno), m_camera_id);      \
-        return -1;                                                   \
-    }
-
-#define CHECK_PTR(return_value)                                      \
-    if (return_value < 0) {                                          \
-        ALOGE("%s::%d fail, errno: %s, m_camera_id = %d",             \
-             __func__,__LINE__, strerror(errno), m_camera_id);       \
-        return NULL;                                                 \
-    }
-
-#define ALIGN(x, a)       (((x) + (a) - 1) & ~((a) - 1))
-
-namespace android {
-
-static struct timeval time_start;
-static struct timeval time_stop;
-int cam_fd1, cam_fd2;
-
-#if defined(ALOG_NDEBUG) && LOG_NDEBUG == 0
-unsigned long measure_time_camera(struct timeval *start, struct timeval *stop)
-{
-    unsigned long sec, usec, time;
-
-    sec = stop->tv_sec - start->tv_sec;
-
-    if (stop->tv_usec >= start->tv_usec) {
-        usec = stop->tv_usec - start->tv_usec;
-    } else {
-        usec = stop->tv_usec + 1000000 - start->tv_usec;
-        sec--;
-    }
-
-    time = (sec * 1000000) + usec;
-
-    return time;
-}
-#endif
-
-static int gsc_cap_open(int id)
-{
-    char node[20];
-    int fd;
-
-    id += GSC_VD_NODE_OFFSET;
-    sprintf(node, "%s%d", PFX_NODE_GSC, id);
-    ALOGE("(%s): %s%d", __func__, PFX_NODE_GSC, id);
-
-    fd = open(node, O_RDWR, 0);
-    if(fd < 0) {
-        ALOGE("ERR(%s): Open gscaler video device failed", __func__);
-        return -1;
-    }
-    ALOGE("%s open", node);
-
-    return fd;
-}
-
-static int close_buffers(struct SecBuffer *buffers)
-{
-    int i, j;
-    int ret;
-
-    for (i = 0; i < MAX_BUFFERS; i++) {
-        for(j = 0; j < MAX_PLANES; j++) {
-            if (buffers[i].virt.extP[j]) {
-                buffers[i].virt.extP[j] = NULL;
-            }
-        }
-    }
-
-    return 0;
-}
-
-static int get_pixel_depth(unsigned int fmt)
-{
-    int depth = 0;
-
-    switch (fmt) {
-    case V4L2_PIX_FMT_JPEG:
-        depth = 8;
-    break;
-
-    case V4L2_PIX_FMT_NV12:
-    case V4L2_PIX_FMT_NV12T:
-    case V4L2_PIX_FMT_NV21:
-    case V4L2_PIX_FMT_YUV420:
-    case V4L2_PIX_FMT_YVU420:
-    case V4L2_PIX_FMT_YVU420M:
-    case V4L2_PIX_FMT_NV12M:
-    case V4L2_PIX_FMT_NV12MT:
-        depth = 12;
-        break;
-
-    case V4L2_PIX_FMT_RGB565:
-    case V4L2_PIX_FMT_RGB565X:
-    case V4L2_PIX_FMT_YUYV:
-    case V4L2_PIX_FMT_YVYU:
-    case V4L2_PIX_FMT_UYVY:
-    case V4L2_PIX_FMT_VYUY:
-    case V4L2_PIX_FMT_NV16:
-    case V4L2_PIX_FMT_NV61:
-    case V4L2_PIX_FMT_YUV422P:
-        depth = 16;
-        break;
-
-    case V4L2_PIX_FMT_RGB32:
-        depth = 32;
-        break;
-
-    default:
-        ALOGE("ERR(%s):Get depth failed.", __func__);
-    break;
-    }
-
-    return depth;
-}
-
-static int gsc_cap_poll(struct pollfd *events)
-{
-    int ret;
-
-    /* 10 second delay is because sensor can take a long time
-     * to do auto focus and capture in dark settings
-     */
-    ret = poll(events, 1, 10000);
-    if (ret < 0) {
-        ALOGE("ERR(%s):poll error", __func__);
-        return ret;
-    }
-
-    if (ret == 0) {
-        ALOGE("ERR(%s):No data in 10 secs..", __func__);
-        return ret;
-    }
-
-    return ret;
-}
-
-static int v4l2_gsc_cap_querycap(int fp)
-{
-    struct v4l2_capability cap;
-
-    if (ioctl(fp, VIDIOC_QUERYCAP, &cap) < 0) {
-        ALOGE("ERR(%s):VIDIOC_QUERYCAP failed", __func__);
-        return -1;
-    }
-
-    if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE_MPLANE)) {
-        ALOGE("ERR(%s):no capture devices", __func__);
-        return -1;
-    }
-    if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
-        ALOGE("ERR(%s):no streaming capture devices", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-static const __u8* v4l2_gsc_cap_enuminput(int fp, int index)
-{
-    static struct v4l2_input input;
-
-    input.index = index;
-    if (ioctl(fp, VIDIOC_ENUMINPUT, &input) != 0) {
-        ALOGE("ERR(%s):No matching index found", __func__);
-        return NULL;
-    }
-    ALOGI("Name of input channel[%d] is %s", input.index, input.name);
-
-    return input.name;
-}
-
-static int v4l2_gsc_cap_s_input(int fp, int index)
-{
-    struct v4l2_input input;
-
-    input.index = index;
-
-    if (ioctl(fp, VIDIOC_S_INPUT, &input) < 0) {
-        ALOGE("ERR(%s):VIDIOC_S_INPUT failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-static int v4l2_gsc_cap_g_fmt(int fp)
-{
-    struct v4l2_format v4l2_fmt;
-
-    v4l2_fmt.type = V4L2_BUF_TYPE;
-
-    if(ioctl(fp,  VIDIOC_G_FMT,  &v4l2_fmt) < 0){
-        ALOGE("ERR(%s):VIDIOC_G_FMT failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-static int v4l2_gsc_cap_s_fmt(int fp, int width, int height, unsigned int fmt, enum v4l2_field field, unsigned int num_plane)
-{
-    struct v4l2_format v4l2_fmt;
-    struct v4l2_pix_format pixfmt;
-    unsigned int framesize;
-
-    memset(&v4l2_fmt, 0, sizeof(struct v4l2_format));
-    v4l2_fmt.type = V4L2_BUF_TYPE;
-
-    framesize = (width * height * get_pixel_depth(fmt)) / 8;
-
-    v4l2_fmt.fmt.pix_mp.width = width;
-    v4l2_fmt.fmt.pix_mp.height = height;
-    v4l2_fmt.fmt.pix_mp.pixelformat = fmt;
-    v4l2_fmt.fmt.pix_mp.field = field;
-    if (num_plane == 1) {
-        v4l2_fmt.fmt.pix_mp.plane_fmt[0].sizeimage = framesize;
-    } else if (num_plane == 2) {
-        v4l2_fmt.fmt.pix_mp.plane_fmt[0].sizeimage = ALIGN(width * height, 2048);
-        v4l2_fmt.fmt.pix_mp.plane_fmt[1].sizeimage = ALIGN(width/2, 16) * ALIGN(height/2, 16) * 2;
-    } else if (num_plane == 3) {
-        v4l2_fmt.fmt.pix_mp.plane_fmt[0].sizeimage = ALIGN(width, 16) * ALIGN(height, 16);
-        v4l2_fmt.fmt.pix_mp.plane_fmt[1].sizeimage = ALIGN(width/2, 8) * ALIGN(height/2, 8);
-        v4l2_fmt.fmt.pix_mp.plane_fmt[2].sizeimage = ALIGN(width/2, 8) * ALIGN(height/2, 8);
-    } else {
-        ALOGE("ERR(%s): Invalid plane number", __func__);
-        return -1;
-    }
-    v4l2_fmt.fmt.pix_mp.num_planes = num_plane;
-
-    /* Set up for capture */
-    if (ioctl(fp, VIDIOC_S_FMT, &v4l2_fmt) < 0) {
-        ALOGE("ERR(%s):VIDIOC_S_FMT failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-static int v4l2_gsc_cap_s_fmt_cap(int fp, int width, int height, unsigned int fmt)
-{
-    struct v4l2_format v4l2_fmt;
-    struct v4l2_pix_format pixfmt;
-
-    memset(&pixfmt, 0, sizeof(pixfmt));
-
-    v4l2_fmt.type = V4L2_BUF_TYPE;
-
-    pixfmt.width = width;
-    pixfmt.height = height;
-    pixfmt.pixelformat = fmt;
-    if (fmt == V4L2_PIX_FMT_JPEG)
-        pixfmt.colorspace = V4L2_COLORSPACE_JPEG;
-
-    v4l2_fmt.fmt.pix = pixfmt;
-
-    /* Set up for capture */
-    if (ioctl(fp, VIDIOC_S_FMT, &v4l2_fmt) < 0) {
-        ALOGE("ERR(%s):VIDIOC_S_FMT failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int v4l2_gsc_cap_s_fmt_is(int fp, int width, int height, unsigned int fmt, enum v4l2_field field)
-{
-    struct v4l2_format v4l2_fmt;
-    struct v4l2_pix_format pixfmt;
-
-    memset(&pixfmt, 0, sizeof(pixfmt));
-
-    v4l2_fmt.type = V4L2_BUF_TYPE_PRIVATE;
-
-    pixfmt.width = width;
-    pixfmt.height = height;
-    pixfmt.pixelformat = fmt;
-    pixfmt.field = field;
-
-    v4l2_fmt.fmt.pix = pixfmt;
-
-    /* Set up for capture */
-    if (ioctl(fp, VIDIOC_S_FMT, &v4l2_fmt) < 0) {
-        ALOGE("ERR(%s):VIDIOC_S_FMT failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-static int v4l2_gsc_cap_enum_fmt(int fp, unsigned int fmt)
-{
-    struct v4l2_fmtdesc fmtdesc;
-    int found = 0;
-
-    fmtdesc.type = V4L2_BUF_TYPE;
-    fmtdesc.index = 0;
-
-    while (ioctl(fp, VIDIOC_ENUM_FMT, &fmtdesc) == 0) {
-        if (fmtdesc.pixelformat == fmt) {
-            ALOGV("Passed fmt = %#x found pixel format[%d]: %s", fmt, fmtdesc.index, fmtdesc.description);
-            found = 1;
-            break;
-        }
-
-        fmtdesc.index++;
-    }
-
-    if (!found) {
-        ALOGE("unsupported pixel format");
-        return -1;
-    }
-
-    return 0;
-}
-
-static int v4l2_gsc_cap_reqbufs(int fp, enum v4l2_buf_type type, int nr_bufs)
-{
-    struct v4l2_requestbuffers req;
-
-    req.count = nr_bufs;
-    req.type = type;
-    req.memory = V4L2_MEMORY_TYPE;
-
-    if (ioctl(fp, VIDIOC_REQBUFS, &req) < 0) {
-        ALOGE("ERR(%s):VIDIOC_REQBUFS failed", __func__);
-        return -1;
-    }
-
-    if (req.count > MAX_BUFFERS ) {
-        ALOGE("ERR(%s):Insufficient buffer memory on", __func__);
-        return -1;
-    }
-
-    return req.count;
-}
-
-static int v4l2_gsc_cap_querybuf(int fp, struct SecBuffer *buffers, enum v4l2_buf_type type, int nr_frames, int num_plane)
-{
-    struct v4l2_buffer v4l2_buf;
-    struct v4l2_plane planes[VIDEO_MAX_PLANES];
-    int i, plane_index;
-
-    for (i = 0; i < nr_frames; i++) {
-        v4l2_buf.type = type;
-        v4l2_buf.memory = V4L2_MEMORY_TYPE;
-        v4l2_buf.index = i;
-        v4l2_buf.m.planes = planes;
-        v4l2_buf.length = num_plane;  // this is for multi-planar
-        ALOGV("QUERYBUF(index=%d)", i);
-        ALOGV("Memory plane is %d", v4l2_buf.length);
-
-        if (ioctl(fp, VIDIOC_QUERYBUF, &v4l2_buf) < 0) {
-            ALOGE("ERR(%s):VIDIOC_QUERYBUF failed", __func__);
-            return -1;
-        }
-
-        for (plane_index = 0; plane_index < num_plane; plane_index++) {
-            ALOGV("Offset : 0x%x", v4l2_buf.m.planes[plane_index].m.mem_offset);
-            ALOGV("Plane Length : 0x%x", v4l2_buf.m.planes[plane_index].length);
-
-            buffers[i].phys.extP[plane_index] = (unsigned int)v4l2_buf.m.planes[plane_index].cookie;
-
-            buffers[i].size.extS[plane_index] = v4l2_buf.m.planes[plane_index].length;
-            ALOGV("Length[%d] : 0x%x", i, buffers[i].size.extS[plane_index]);
-            if ((buffers[i].virt.extP[plane_index] = (char *)mmap(0, v4l2_buf.m.planes[plane_index].length,
-                    PROT_READ | PROT_WRITE, MAP_SHARED, fp, v4l2_buf.m.planes[plane_index].m.mem_offset)) < 0) {
-                ALOGE("mmap failed");
-                return -1;
-            }
-            ALOGV("vaddr[%d][%d] : 0x%x", i, plane_index, (__u32) buffers[i].virt.extP[plane_index]);
-        }
-    }
-    return 0;
-}
-
-static int v4l2_gsc_cap_streamon(int fp)
-{
-    enum v4l2_buf_type type = V4L2_BUF_TYPE;
-    int ret;
-
-    ALOGV("%s : On streaming I/O", __func__);
-    ret = ioctl(fp, VIDIOC_STREAMON, &type);
-    if (ret < 0) {
-        ALOGE("ERR(%s):VIDIOC_STREAMON failed", __func__);
-        return ret;
-    }
-
-    return ret;
-}
-
-static int v4l2_gsc_cap_streamoff(int fp)
-{
-    enum v4l2_buf_type type = V4L2_BUF_TYPE;
-    int ret;
-
-    ALOGV("%s :", __func__);
-    ret = ioctl(fp, VIDIOC_STREAMOFF, &type);
-    if (ret < 0) {
-        ALOGE("ERR(%s):VIDIOC_STREAMOFF failed", __func__);
-        return ret;
-    }
-
-    return 0;
-}
-
-static int v4l2_gsc_cap_qbuf(int fp, int width, int height, struct SecBuffer *vaddr, int index, int num_plane)
-{
-    struct v4l2_buffer v4l2_buf;
-    int ret;
-
-    struct v4l2_plane planes[VIDEO_MAX_PLANES];
-
-    v4l2_buf.m.planes = planes;
-    v4l2_buf.length = num_plane;
-
-    v4l2_buf.type = V4L2_BUF_TYPE;
-    v4l2_buf.memory = V4L2_MEMORY_TYPE;
-    v4l2_buf.index = index;
-
-    if(fp == cam_fd1) {
-        if (num_plane == 1) {
-            v4l2_buf.m.planes[0].m.userptr = (long unsigned int)vaddr[index].virt.extP[0];
-            v4l2_buf.m.planes[0].length = width * height * 2;
-        } else if (num_plane == 2) {
-            v4l2_buf.m.planes[0].m.userptr = (long unsigned int)vaddr[index].virt.extP[0];
-            v4l2_buf.m.planes[0].length = ALIGN(width, 16) * ALIGN(height, 16);
-            v4l2_buf.m.planes[1].m.userptr = (long unsigned int)vaddr[index].virt.extP[1];
-            v4l2_buf.m.planes[1].length = ALIGN(width/2, 16) * ALIGN(height/2, 16);
-        } else if (num_plane == 3) {
-            v4l2_buf.m.planes[0].m.userptr = (long unsigned int)vaddr[index].virt.extP[0];
-            v4l2_buf.m.planes[0].length = ALIGN(width, 16) * ALIGN(height, 16);
-            v4l2_buf.m.planes[1].m.userptr = (long unsigned int)vaddr[index].virt.extP[1];
-            v4l2_buf.m.planes[1].length = ALIGN(width/2, 8) * ALIGN(height/2, 8);
-            v4l2_buf.m.planes[2].m.userptr = (long unsigned int)vaddr[index].virt.extP[2];
-            v4l2_buf.m.planes[2].length = ALIGN(width/2, 8) * ALIGN(height/2, 8);
-        } else {
-            ALOGE("ERR(%s): Invalid plane number", __func__);
-            return -1;
-        }
-    }
-    else if(fp == cam_fd2) {
-        v4l2_buf.m.planes[0].m.userptr = (long unsigned int)vaddr[index].virt.extP[0];
-        v4l2_buf.m.planes[0].length = ALIGN(ALIGN(width, 16) * ALIGN(height, 16), 2048);
-        v4l2_buf.m.planes[1].m.userptr = (long unsigned int)vaddr[index].virt.extP[1];
-        v4l2_buf.m.planes[1].length = ALIGN(ALIGN(width, 16) * ALIGN(height >> 1, 8), 2048);
-    }
-    else {
-        return -1;
-    }
-
-    ret = ioctl(fp, VIDIOC_QBUF, &v4l2_buf);
-    if (ret < 0) {
-        ALOGE("ERR(%s):VIDIOC_QBUF failed", __func__);
-        return ret;
-    }
-
-    return 0;
-}
-
-static int v4l2_gsc_cap_dqbuf(int fp, int num_plane)
-{
-    struct v4l2_buffer v4l2_buf;
-    int ret;
-
-    struct v4l2_plane planes[VIDEO_MAX_PLANES];
-
-    v4l2_buf.m.planes = planes;
-    v4l2_buf.length = num_plane;
-
-    v4l2_buf.type = V4L2_BUF_TYPE;
-    v4l2_buf.memory = V4L2_MEMORY_TYPE;
-
-    ret = ioctl(fp, VIDIOC_DQBUF, &v4l2_buf);
-    if (ret < 0) {
-        ALOGE("ERR(%s):VIDIOC_DQBUF failed, dropped frame", __func__);
-        return ret;
-    }
-
-    return v4l2_buf.index;
-}
-
-static int v4l2_gsc_cap_g_ctrl(int fp, unsigned int id)
-{
-    struct v4l2_control ctrl;
-    int ret;
-
-    ctrl.id = id;
-
-    ret = ioctl(fp, VIDIOC_G_CTRL, &ctrl);
-    if (ret < 0) {
-        ALOGE("ERR(%s): VIDIOC_G_CTRL(id = 0x%x (%d)) failed, ret = %d",
-             __func__, id, id-V4L2_CID_PRIVATE_BASE, ret);
-        return ret;
-    }
-
-    return ctrl.value;
-}
-
-static int v4l2_gsc_cap_s_ctrl(int fp, unsigned int id, unsigned int value)
-{
-    struct v4l2_control ctrl;
-    int ret;
-
-    ctrl.id = id;
-    ctrl.value = value;
-
-    ret = ioctl(fp, VIDIOC_S_CTRL, &ctrl);
-    if (ret < 0) {
-        ALOGE("ERR(%s):VIDIOC_S_CTRL(id = %#x (%d), value = %d) failed ret = %d",
-             __func__, id, id-V4L2_CID_PRIVATE_BASE, value, ret);
-
-        return ret;
-    }
-
-    return ctrl.value;
-}
-
-static int v4l2_gsc_cap_s_ext_ctrl(int fp, unsigned int id, void *value)
-{
-    struct v4l2_ext_controls ctrls;
-    struct v4l2_ext_control ctrl;
-    int ret;
-
-    ctrl.id = id;
-
-    ctrls.ctrl_class = V4L2_CTRL_CLASS_CAMERA;
-    ctrls.count = 1;
-    ctrls.controls = &ctrl;
-
-    ret = ioctl(fp, VIDIOC_S_EXT_CTRLS, &ctrls);
-    if (ret < 0)
-        ALOGE("ERR(%s):VIDIOC_S_EXT_CTRLS failed", __func__);
-
-    return ret;
-}
-
-static int v4l2_gsc_cap_g_parm(int fp, struct v4l2_streamparm *streamparm)
-{
-    int ret;
-
-    streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-
-    ret = ioctl(fp, VIDIOC_G_PARM, streamparm);
-    if (ret < 0) {
-        ALOGE("ERR(%s):VIDIOC_G_PARM failed", __func__);
-        return ret;
-    }
-
-    ALOGV("%s : timeperframe: numerator %d, denominator %d", __func__,
-            streamparm->parm.capture.timeperframe.numerator,
-            streamparm->parm.capture.timeperframe.denominator);
-
-    return ret;
-}
-
-static int v4l2_gsc_cap_s_parm(int fp, struct v4l2_streamparm *streamparm)
-{
-    int ret;
-
-    streamparm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-
-    ret = ioctl(fp, VIDIOC_S_PARM, streamparm);
-    if (ret < 0) {
-        ALOGE("ERR(%s):VIDIOC_S_PARM failed", __func__);
-        return ret;
-    }
-
-    return ret;
-}
-
-static int v4l2_subdev_open(struct media_entity *entity)
-{
-    int fd;
-
-    fd = open(entity->devname,  O_RDWR, 0);
-    if(fd < 0){
-        ALOGE("ERR(%s): Open failed.", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-static int v4l2_subdev_get_fmt(int fd, struct v4l2_subdev_format *fmt)
-{
-    if(ioctl(fd, VIDIOC_SUBDEV_G_FMT, fmt)) {
-        ALOGE("ERR(%s):  subdev get foramt failed.", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-SecCamera::SecCamera() :
-            m_flagCreate(0),
-            m_camera_id(CAMERA_ID_BACK),
-            m_gsc_vd_fd(-1),
-            m_cam_fd2(-1),
-            m_jpeg_fd(-1),
-            m_flag_record_start(0),
-            m_preview_v4lformat(V4L2_PIX_FMT_YVU420M),
-            m_preview_width      (0),
-            m_preview_height     (0),
-            m_preview_max_width  (MAX_BACK_CAMERA_PREVIEW_WIDTH),
-            m_preview_max_height (MAX_BACK_CAMERA_PREVIEW_HEIGHT),
-            m_snapshot_v4lformat(-1),
-            m_snapshot_width      (0),
-            m_snapshot_height     (0),
-            m_snapshot_max_width  (MAX_BACK_CAMERA_SNAPSHOT_WIDTH),
-            m_snapshot_max_height (MAX_BACK_CAMERA_SNAPSHOT_HEIGHT),
-            m_picture_vaddr(NULL),
-            m_recording_en        (0),
-            m_recording_width     (0),
-            m_recording_height    (0),
-            m_angle(-1),
-            m_anti_banding(-1),
-            m_wdr(-1),
-            m_anti_shake(-1),
-            m_zoom_level(-1),
-            m_object_tracking(-1),
-            m_smart_auto(-1),
-            m_beauty_shot(-1),
-            m_vintage_mode(-1),
-            m_face_detect(-1),
-            m_object_tracking_start_stop(-1),
-            m_gps_latitude(-1),
-            m_gps_longitude(-1),
-            m_gps_altitude(-1),
-            m_gps_timestamp(-1),
-            m_sensor_mode(-1),
-            m_shot_mode(-1),
-            m_exif_orientation(-1),
-            m_chk_dataline(-1),
-            m_video_gamma(-1),
-            m_slow_ae(-1),
-            m_camera_af_flag(-1),
-            m_flag_camera_start(0),
-            m_jpeg_thumbnail_width (0),
-            m_jpeg_thumbnail_height(0),
-            m_jpeg_thumbnail_quality(100),
-            m_jpeg_quality(100),
-            m_touch_af_start_stop(-1),
-            m_postview_offset(0)
-#ifdef ENABLE_ESD_PREVIEW_CHECK
-            ,
-            m_esd_check_count(0)
-#endif // ENABLE_ESD_PREVIEW_CHECK
-{
-    memset(&m_streamparm, 0, sizeof(m_streamparm));
-    m_params = (struct sec_cam_parm*)&m_streamparm.parm.raw_data;
-    struct v4l2_captureparm capture;
-    m_params->capture.timeperframe.numerator = 1;
-    m_params->capture.timeperframe.denominator = 0;
-    m_params->contrast = -1;
-    m_params->effects = -1;
-    m_params->brightness = -1;
-    m_params->exposure = -1;
-    m_params->flash_mode = -1;
-    m_params->focus_mode = -1;
-    m_params->iso = -1;
-    m_params->metering = -1;
-    m_params->saturation = -1;
-    m_params->scene_mode = -1;
-    m_params->sharpness = -1;
-    m_params->white_balance = -1;
-
-    memset(&mExifInfo, 0, sizeof(mExifInfo));
-
-    memset(&m_events_c, 0, sizeof(m_events_c));
-    memset(&m_events_c2, 0, sizeof(m_events_c2));
-}
-
-SecCamera::~SecCamera()
-{
-    ALOGV("%s :", __func__);
-    DestroyCamera();
-}
-
-bool SecCamera::CreateCamera(int index)
-{
-    ALOGV("%s:", __func__);
-    char node[30];
-    int i;
-    int ret = 0;
-
-    ALOGV("%s: m_flagCreate : %d", __func__, m_flagCreate);
-    if (!m_flagCreate) {
-        /* Arun C
-         * Reset the lense position only during camera starts; don't do
-         * reset between shot to shot
-         */
-        m_flagCreate = 1;
-        m_camera_af_flag = -1;
-
-        /* media device open */
-        ALOGV("%s: m_flagCreate : %d", __func__, m_flagCreate);
-
-        media = media_open();
-        if (media == NULL) {
-            ALOGE("ERR(%s):Cannot open media device (error : %s)", __func__, strerror(errno));
-        return -1;
-    }
-
-#ifndef GAIA_FW_BETA
-        //////////////////
-        /* GET ENTITIES */
-        //////////////////
-        /* camera subdev */
-        strcpy(node, M5MOLS_ENTITY_NAME);
-    ALOGV("%s : node : %s", __func__, node);
-    camera_sd_entity = media_get_entity_by_name(media, node, strlen(node));
-    ALOGV("%s : camera_sd_entity : 0x%p", __func__, camera_sd_entity);
-
-        /* mipi-csis subdev */
-        sprintf(node, "%s.%d", PFX_SUBDEV_ENTITY_MIPI_CSIS, MIPI_NUM);
-    ALOGV("%s : node : %s", __func__, node);
-    mipi_sd_entity = media_get_entity_by_name(media, node, strlen(node));
-    ALOGV("%s : mipi_sd_entity : 0x%p", __func__, mipi_sd_entity);
-
-        /* fimc-lite subdev */
-        sprintf(node, "%s.%d", PFX_SUBDEV_ENTITY_FLITE, FLITE_NUM);
-    ALOGV("%s : node : %s", __func__, node);
-    flite_sd_entity = media_get_entity_by_name(media, node, strlen(node));
-    ALOGV("%s : flite_sd_entity : 0x%p", __func__, flite_sd_entity);
-
-        /* gscaler-capture subdev */
-        sprintf(node, "%s.%d", PFX_SUBDEV_ENTITY_GSC_CAP, GSC_NUM);
-    ALOGV("%s : node : %s", __func__, node);
-    gsc_cap_sd_entity = media_get_entity_by_name(media, node, strlen(node));
-    ALOGV("%s : gsc_cap_sd_entity : 0x%p", __func__, gsc_cap_sd_entity);
-
-        /* gscaler-capture subdev */
-        sprintf(node, "%s.%d", PFX_VIDEODEV_ENTITY_GSC_CAP, GSC_NUM);
-    ALOGV("%s : node : %s", __func__, node);
-    gsc_cap_vd_entity = media_get_entity_by_name(media, node, strlen(node));
-    ALOGV("%s : gsc_cap_vd_entity : 0x%p", __func__, gsc_cap_vd_entity);
-
-    ALOGV("camera_sd : numlink : %d", camera_sd_entity->num_links);
-    ALOGV("mipi_sd : numlink : %d", mipi_sd_entity->num_links);
-    ALOGV("flite_sd : numlink : %d", flite_sd_entity->num_links);
-    ALOGV("gsc_cap_sd : numlink : %d", gsc_cap_sd_entity->num_links);
-    ALOGV("gsc_cap_vd : numlink : %d", gsc_cap_vd_entity->num_links);
-
-        //////////////////
-        /* SETUP LINKS */
-        //////////////////
-    /*camera sensor to mipi-csis */
-    links = camera_sd_entity->links;
-    if (links == NULL ||
-        links->source->entity != camera_sd_entity ||
-        links->sink->entity != mipi_sd_entity) {
-        ALOGE("ERR(%s): Cannot make link camera sensor to mipi-csis", __func__);
-        return -1;
-    }
-        if (media_setup_link(media,  links->source,  links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
-        ALOGE("ERR(%s): Cannot make setup camera sensor to mipi-csis", __func__);
-        return -1;
-    }
-        ALOGV("[LINK SUCCESS] camera seneor to mipi-csis");
-
-        /*mipi-csis to fimc-lite*/
-    for(i = 0; i < mipi_sd_entity->num_links; i++) {
-            links = &mipi_sd_entity->links[i];
-                ALOGV("(%s), i=%d: links->source->entity : %p, mipi_sd_entity : %p", __func__, i,
-                                                  links->source->entity, mipi_sd_entity);
-                ALOGV("(%s), i=%d: links->sink->entity : %p, flite_sd_entity : %p", __func__, i,
-                                                  links->sink->entity, flite_sd_entity);
-            if (links == NULL ||
-                links->source->entity != mipi_sd_entity ||
-                links->sink->entity != flite_sd_entity) {
-            continue;
-            } else if (media_setup_link(media,  links->source,  links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
-                ALOGE("ERR(%s): Cannot make setup mipi-csis to fimc-lite", __func__);
-                return -1;
-            }
-        }
-        ALOGV("[LINK SUCCESS] mipi-csis to fimc-lite");
-
-        /*fimc-lite to gscaler capture device*/
-    for(i = 0; i < gsc_cap_sd_entity->num_links; i++) {
-            links = &gsc_cap_sd_entity->links[i];
-                ALOGV("(%s), i=%d: links->source->entity : %p, flite_sd_entity : %p", __func__, i,
-                                                  links->source->entity, flite_sd_entity);
-                ALOGV("(%s), i=%d: links->sink->entity : %p, gsc_cap_sd_entity : %p", __func__, i,
-                                                  links->sink->entity, gsc_cap_sd_entity);
-            if (links == NULL ||
-                links->source->entity != flite_sd_entity ||
-                links->sink->entity != gsc_cap_sd_entity) {
-            continue;
-            } else if (media_setup_link(media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
-                ALOGE("ERR(%s): Cannot make setup fimc-lite to gscaler capture device", __func__);
-                return -1;
-            }
-        }
-        ALOGV("[LINK SUCCESS] fimc-lite to gscaler capture device");
-
-        /*gscaler capture device to gscaler video device*/
-    for(i = 0; i < gsc_cap_vd_entity->num_links; i++) {
-            links = &gsc_cap_vd_entity->links[i];
-                ALOGV("(%s), i=%d: links->source->entity : %p, gsc_cap_sd_entity : %p", __func__, i,
-                                                  links->source->entity, gsc_cap_sd_entity);
-                ALOGV("(%s), i=%d: links->sink->entity : %p, gsc_cap_vd_entity : %p", __func__, i,
-                                                  links->sink->entity, gsc_cap_vd_entity);
-            if (links == NULL ||
-                links->source->entity != gsc_cap_sd_entity ||
-                links->sink->entity != gsc_cap_vd_entity) {
-            continue;
-            } else if (media_setup_link(media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
-                ALOGE("ERR(%s): Cannot make setup gscaler capture device to gscaler video device", __func__);
-                return -1;
-            }
-        }
-        ALOGV("[LINK SUCCESS] gscaler capture device to gscaler video device");
-#else
-//////////////////////////////
-//  internal IS
-//////////////////////////////
-        //////////////////
-        /* GET ENTITIES */
-        //////////////////
-    /* ISP sensor subdev */
-    memset(&node, 0x00, sizeof(node));
-    strcpy(node, ISP_SENSOR_ENTITY_NAME);
-    isp_sensor_entity = media_get_entity_by_name(media, node, strlen(node));
-
-    /* ISP front subdev */
-    memset(&node, 0x00, sizeof(node));
-    strcpy(node, ISP_FRONT_ENTITY_NAME);
-    isp_front_entity = media_get_entity_by_name(media, node, strlen(node));
-
-    /* ISP back subdev */
-    memset(&node, 0x00, sizeof(node));
-    strcpy(node, ISP_BACK_ENTITY_NAME);
-    isp_back_entity = media_get_entity_by_name(media, node, strlen(node));
-
-
-    /* ISP ScalerC video node */
-    memset(&node, 0x00, sizeof(node));
-    strcpy(node, ISP_VIDEO_SCALERC_NAME);
-    isp_scalerc_entity = media_get_entity_by_name(media, node, strlen(node));
-
-    /* ISP ScalerP video node */
-    memset(&node, 0x00, sizeof(node));
-    strcpy(node, ISP_VIDEO_SCALERP_NAME);
-    isp_scalerp_entity = media_get_entity_by_name(media, node, strlen(node));
-
-    /* ISP 3DNR video node */
-    memset(&node, 0x00, sizeof(node));
-    strcpy(node, ISP_VIDEO_3DNR_NAME);
-    isp_3dnr_entity = media_get_entity_by_name(media, node, strlen(node));
-
-    ALOGV("isp_sensor_entity : numlink : %d", isp_sensor_entity->num_links);
-    ALOGV("isp_front_entity : numlink : %d", isp_front_entity->num_links);
-    ALOGV("isp_back_entity : numlink : %d", isp_back_entity->num_links);
-    ALOGV("isp_scalerc_entity : numlink : %d", isp_scalerc_entity->num_links);
-    ALOGV("isp_scalerp_entity : numlink : %d", isp_scalerp_entity->num_links);
-    ALOGV("isp_3dnr_entity : numlink : %d", isp_3dnr_entity->num_links);
-
-        //////////////////
-        /* SETUP LINKS */
-        //////////////////
-    /* SENSOR TO FRONT */
-    links = isp_sensor_entity->links;
-    if (links == NULL ||
-            links->source->entity != isp_sensor_entity ||
-            links->sink->entity != isp_front_entity) {
-            ALOGE("[ERR] Can not make link isp_sensor to isp_front\n");
-        return -1;
-    }
-    if(media_setup_link(media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
-        ALOGE("[ERR] Can not make setup isp_sensor to isp_front\n");
-        return -1;
-    }
-    ALOGV("[LINK SUCCESS] Sensor to front");
-
-    /* FRONT TO BACK */
-    for (i = 0; i < isp_front_entity->num_links; i++){
-        links = &isp_front_entity->links[i];
-        if (links == NULL ||
-            links->source->entity != isp_front_entity ||
-            links->sink->entity != isp_back_entity) {
-                ALOGV("(%s), i=%d: links->source->entity : %p, isp_front_entity : %p", __func__, i,
-                                                  links->source->entity, isp_front_entity);
-                ALOGV("(%s), i=%d: links->sink->entity : %p, isp_back_entity : %p", __func__, i,
-                                                  links->sink->entity, isp_back_entity);
-                continue;
-        } else if(media_setup_link(media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
-                ALOGE("[ERR] Can not make setup isp_front to isp_back\n");
-            return -1;
-        }
-    }
-    ALOGV("[LINK SUCCESS] front to back");
-
-    /* BACK TO ScalerP Video*/
-    for (i = 0; i < isp_back_entity->num_links; i++){
-        links = &isp_back_entity->links[i];
-        if (links == NULL ||
-            links->source->entity != isp_back_entity ||
-            links->sink->entity != isp_scalerp_entity) {
-                ALOGV("(%s), i=%d: links->source->entity : %p, isp_front_entity : %p", __func__, i,
-                                                  links->source->entity, isp_front_entity);
-                ALOGV("(%s), i=%d: links->sink->entity : %p, isp_back_entity : %p", __func__, i,
-                                                  links->sink->entity, isp_back_entity);
-                continue;
-        }
-                if(media_setup_link(media, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
-            ALOGE("[ERR] Can not make setup isp_back to scalerP\n");
-                    return -1;
-        }
-    }
-    ALOGV("[LINK SUCCESS] back to scalerP");
-#endif
-
-    m_gsc_vd_fd = gsc_cap_open(0);
-    cam_fd1 = m_gsc_vd_fd;
-        if (m_gsc_vd_fd < 0) {
-            ALOGE("ERR(%s):Cannot open %s (error : %s)", __func__, PFX_NODE_GSC, strerror(errno));
-            return -1;
-        }
-
-#ifndef GAIA_FW_BETA
-        if (!v4l2_gsc_cap_enuminput(m_gsc_vd_fd, index)) {
-            ALOGE("m_gsc_vd_fd(%d) v4l2_gsc_cap_enuminput fail", m_gsc_vd_fd);
-            return -1;
-        }
-
-        ret = v4l2_gsc_cap_s_input(m_gsc_vd_fd, index);
-        CHECK(ret);
-#endif
-
-        m_camera_id = index;
-
-        switch (m_camera_id) {
-        case CAMERA_ID_FRONT:
-            m_preview_max_width   = MAX_FRONT_CAMERA_PREVIEW_WIDTH;
-            m_preview_max_height  = MAX_FRONT_CAMERA_PREVIEW_HEIGHT;
-            m_snapshot_max_width  = MAX_FRONT_CAMERA_SNAPSHOT_WIDTH;
-            m_snapshot_max_height = MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT;
-            break;
-
-        case CAMERA_ID_BACK:
-            m_preview_max_width   = MAX_BACK_CAMERA_PREVIEW_WIDTH;
-            m_preview_max_height  = MAX_BACK_CAMERA_PREVIEW_HEIGHT;
-            m_snapshot_max_width  = MAX_BACK_CAMERA_SNAPSHOT_WIDTH;
-            m_snapshot_max_height = MAX_BACK_CAMERA_SNAPSHOT_HEIGHT;
-            break;
-        }
-
-        //setExifFixedAttribute();
-    }
-    return 0;
-}
-
-void SecCamera::resetCamera()
-{
-    ALOGV("%s :", __func__);
-    DestroyCamera();
-    CreateCamera(m_camera_id);
-}
-
-bool SecCamera::DestroyCamera()
-{
-    ALOGV("%s :", __func__);
-
-    if (m_flagCreate) {
-
-        stopRecord();
-
-        /* close m_gsc_vd_fd after stopRecord() because stopRecord()
-         * uses m_gsc_vd_fd to change frame rate
-         */
-        ALOGI("DestroyCamera: m_gsc_vd_fd(%d)", m_gsc_vd_fd);
-        if (m_gsc_vd_fd > -1) {
-            close(m_gsc_vd_fd);
-            m_gsc_vd_fd = -1;
-        }
-
-        ALOGI("DestroyCamera: m_cam_fd2(%d)", m_cam_fd2);
-        if (m_cam_fd2 > -1) {
-            close(m_cam_fd2);
-            m_cam_fd2 = -1;
-        }
-
-        m_flagCreate = 0;
-    } else
-        ALOGI("%s : already deinitialized", __func__);
-
-    return 0;
-}
-
-int SecCamera::getCameraFd(void)
-{
-    return m_gsc_vd_fd;
-}
-
-unsigned char* SecCamera::getPictureVaddr(void)
-{
-    return m_picture_vaddr;
-}
-
-int SecCamera::startPreview(void)
-{
-    v4l2_streamparm streamparm;
-    struct sec_cam_parm *parms;
-    int    ret;
-
-    parms = (struct sec_cam_parm*)&streamparm.parm.raw_data;
-    ALOGV("%s :", __func__);
-
-    // check preview is aleady started.
-    if (m_flag_camera_start > 0) {
-        ALOGE("ERR(%s):Preview was already started", __func__);
-        return 0;
-    }
-
-    if (m_gsc_vd_fd <= 0) {
-        ALOGE("ERR(%s):Camera was closed", __func__);
-        return -1;
-    }
-
-    memset(&m_events_c, 0, sizeof(m_events_c));
-    m_events_c.fd = m_gsc_vd_fd;
-    m_events_c.events = POLLIN | POLLERR;
-
-#ifndef GAIA_FW_BETA
-    /* enum_fmt, s_fmt sample */
-    ret = v4l2_gsc_cap_enum_fmt(m_gsc_vd_fd, m_preview_v4lformat);
-    CHECK(ret);
-
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-    ALOGV("Internal_is(%d), %s", Internal_is, (const char*)getCameraSensorName());
-
-    if (Internal_is) {
-        if (!m_recording_en)
-            v4l2_gsc_cap_s_fmt_is(m_gsc_vd_fd, m_preview_width, m_preview_height,
-                    m_preview_v4lformat, (enum v4l2_field) IS_MODE_PREVIEW_STILL);
-        else
-            v4l2_gsc_cap_s_fmt_is(m_gsc_vd_fd, m_recording_width, m_recording_height,
-                    m_preview_v4lformat, (enum v4l2_field) IS_MODE_PREVIEW_STILL);
-
-    }
-
-    ret = v4l2_gsc_cap_s_fmt(m_gsc_vd_fd, m_preview_width, m_preview_height, m_preview_v4lformat, V4L2_FIELD_ANY, PREVIEW_NUM_PLANE);
-    CHECK(ret);
-
-    if (Internal_is) {
-        if (!m_recording_en)
-            ret = v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_S_SCENARIO_MODE, IS_MODE_PREVIEW_STILL);
-        else
-            ret = v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_S_SCENARIO_MODE, IS_MODE_PREVIEW_STILL);
-    }
-    CHECK(ret);
-
-    ret = v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CACHEABLE, 1);
-    CHECK(ret);
-#endif
-
-    ret = v4l2_gsc_cap_reqbufs(m_gsc_vd_fd, V4L2_BUF_TYPE, MAX_BUFFERS);
-    CHECK(ret);
-
-    ALOGV("%s : m_preview_width: %d m_preview_height: %d m_angle: %d",
-            __func__, m_preview_width, m_preview_height, m_angle);
-
-    ALOGV("m_camera_id : %d", m_camera_id);
-
-    /* start with all buffers in queue */
-    for (int i = 0; i < MAX_BUFFERS; i++) {
-        ret = v4l2_gsc_cap_qbuf(m_gsc_vd_fd, m_preview_width, m_preview_height, m_buffers_preview, i, PREVIEW_NUM_PLANE);
-        CHECK(ret);
-    }
-
-    ret = v4l2_gsc_cap_streamon(m_gsc_vd_fd);
-    CHECK(ret);
-
-    m_flag_camera_start = 1;
-/* TO DO : Frame Rate set is will be availeable.
-    if (setFrameRate(m_params->capture.timeperframe.denominator) < 0)
-        ALOGE("ERR(%s):Fail on setFrameRate(%d)",
-            __func__, m_params->capture.timeperframe.denominator);
-*/
-    ALOGV("%s: got the first frame of the preview", __func__);
-
-    return 0;
-}
-
-int SecCamera::stopPreview(void)
-{
-    int ret;
-
-    ALOGV("%s :", __func__);
-
-    if (m_flag_camera_start == 0) {
-        ALOGW("%s: doing nothing because m_flag_camera_start is zero", __func__);
-        return 0;
-    }
-
-    if (m_params->flash_mode == FLASH_MODE_TORCH)
-        setFlashMode(FLASH_MODE_OFF);
-
-    if (m_gsc_vd_fd <= 0) {
-        ALOGE("ERR(%s):Camera was closed", __func__);
-        return -1;
-    }
-
-    ret = v4l2_gsc_cap_streamoff(m_gsc_vd_fd);
-    CHECK(ret);
-
-    close_buffers(m_buffers_preview);
-
-    v4l2_gsc_cap_reqbufs(m_gsc_vd_fd, V4L2_BUF_TYPE, 0);
-
-    m_flag_camera_start = 0;
-
-    return ret;
-}
-
-//Recording
-int SecCamera::startRecord(void)
-{
-    int ret, i;
-
-    ALOGV("%s :", __func__);
-
-    // aleady started
-    if (m_flag_record_start > 0) {
-        ALOGE("ERR(%s):Preview was already started", __func__);
-        return 0;
-    }
-
-    if (m_cam_fd2 <= 0) {
-        ALOGE("ERR(%s):Camera was closed", __func__);
-        return -1;
-    }
-
-    /* enum_fmt, s_fmt sample */
-    ret = v4l2_gsc_cap_enum_fmt(m_cam_fd2, RECORD_PIX_FMT);
-    CHECK(ret);
-
-    ALOGI("%s: m_recording_width = %d, m_recording_height = %d",
-         __func__, m_recording_width, m_recording_height);
-
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-    ALOGV("Internal_is(%d), %s", Internal_is, (const char*)getCameraSensorName());
-
-//    if (Internal_is)
-//        v4l2_gsc_cap_s_fmt_is(m_cam_fd2, m_recording_width, m_recording_height, RECORD_PIX_FMT, (enum v4l2_field) IS_MODE_CAPTURE_VIDEO);
-
-    ret = v4l2_gsc_cap_s_fmt(m_cam_fd2, m_recording_width,
-                          m_recording_height, RECORD_PIX_FMT, V4L2_FIELD_ANY, RECORD_NUM_PLANE);
-    CHECK(ret);
-
-    ret = v4l2_gsc_cap_reqbufs(m_cam_fd2, V4L2_BUF_TYPE, MAX_BUFFERS);
-    CHECK(ret);
-
-    /* start with all buffers in queue */
-    for (i = 0; i < MAX_BUFFERS; i++) {
-        ret = v4l2_gsc_cap_qbuf(m_cam_fd2, m_recording_width, m_recording_height, m_buffers_record, i, RECORD_NUM_PLANE);
-        CHECK(ret);
-    }
-
-    // Get and throw away the first frame since it is often garbled.
-    memset(&m_events_c2, 0, sizeof(m_events_c2));
-    m_events_c2.fd = m_cam_fd2;
-    m_events_c2.events = POLLIN | POLLERR;
-
-    ret = v4l2_gsc_cap_streamon(m_cam_fd2);
-    CHECK(ret);
-
-    m_flag_record_start = 1;
-
-    return 0;
-}
-
-int SecCamera::stopRecord(void)
-{
-    int ret;
-
-    ALOGV("%s :", __func__);
-
-    if (m_flag_record_start == 0) {
-        ALOGW("%s: doing nothing because m_flag_record_start is zero", __func__);
-        return 0;
-    }
-
-    if (m_cam_fd2 <= 0) {
-        ALOGE("ERR(%s):Camera was closed", __func__);
-        return -1;
-    }
-
-    m_flag_record_start = 0;
-
-    ret = v4l2_gsc_cap_streamoff(m_cam_fd2);
-    CHECK(ret);
-
-    close_buffers(m_buffers_record);
-
-    v4l2_gsc_cap_reqbufs(m_cam_fd2, V4L2_BUF_TYPE, 0);
-
-    return 0;
-}
-
-int SecCamera::getRecordAddr(int index, SecBuffer *buffer)
-{
-    buffer->phys.extP[0] = (unsigned int)m_buffers_record[index].phys.extP[0];
-    buffer->phys.extP[1] = (unsigned int)(m_buffers_record[index].phys.extP[0] + (m_recording_width * m_recording_height));
-    return 0;
-}
-
-int SecCamera::getPreviewAddr(int index, SecBuffer *buffer)
-{
-    buffer->phys.extP[0] = (unsigned int)m_buffers_preview[index].phys.extP[0];
-    buffer->phys.extP[1] = (unsigned int)m_buffers_preview[index].phys.extP[1];
-    buffer->virt.extP[0] = m_buffers_preview[index].virt.extP[0];
-    return 0;
-}
-
-void SecCamera::setUserBufferAddr(void *ptr, int index, int mode)
-{
-    if (mode == PREVIEW_MODE) {
-        m_buffers_preview[index].virt.extP[0] = (char *)((unsigned int *)ptr)[0];
-        m_buffers_preview[index].virt.extP[1] = (char *)((unsigned int *)ptr)[1];
-        m_buffers_preview[index].virt.extP[2] = (char *)((unsigned int *)ptr)[2];
-    } else if (mode == RECORD_MODE) {
-        m_buffers_record[index].virt.extP[0] = (char *)ptr;
-        m_buffers_record[index].virt.extP[1] = (char *)ptr + ((ALIGN(m_recording_width, 16) * ALIGN(m_recording_height, 16)));
-    } else
-        ALOGE("%s: Invalid fd!!!", __func__);
-}
-
-int SecCamera::getPreview()
-{
-    int index;
-    int ret;
-
-    ALOGV("%s: ", __func__);
-    if (m_flag_camera_start == 0 || gsc_cap_poll(&m_events_c) == 0) {
-        ALOGE("ERR(%s):Start Camera Device Reset", __func__);
-        /*
-         * When there is no data for more than 1 second from the camera we inform
-         * the FIMC driver by calling v4l2_gsc_cap_s_input() with a special value = 1000
-         * FIMC driver identify that there is something wrong with the camera
-         * and it restarts the sensor.
-         */
-        stopPreview();
-        /* Reset Only Camera Device */
-        ret = v4l2_gsc_cap_querycap(m_gsc_vd_fd);
-        CHECK(ret);
-#ifndef GAIA_FW_BETA
-        if (v4l2_gsc_cap_enuminput(m_gsc_vd_fd, m_camera_id))
-            return -1;
-        ret = v4l2_gsc_cap_s_input(m_gsc_vd_fd, 1000);
-        CHECK(ret);
-#endif
-        m_preview_state = 0;
-        return -1;
-        ret = startPreview();
-        if (ret < 0) {
-            ALOGE("ERR(%s): startPreview() return %d", __func__, ret);
-            return 0;
-        }
-    }
-
-    index = v4l2_gsc_cap_dqbuf(m_gsc_vd_fd, PREVIEW_NUM_PLANE);
-    if (!(0 <= index && index < MAX_BUFFERS)) {
-        ALOGE("ERR(%s):wrong index = %d", __func__, index);
-        return -1;
-    }
-
-    return index;
-}
-
-int SecCamera::setPreviewFrame(int index)
-{
-    int ret;
-    ret = v4l2_gsc_cap_qbuf(m_gsc_vd_fd, m_preview_width, m_preview_height, m_buffers_preview, index, PREVIEW_NUM_PLANE);
-    CHECK(ret);
-
-    return ret;
-}
-
-int SecCamera::getRecordFrame()
-{
-    if (m_flag_record_start == 0) {
-        ALOGE("%s: m_flag_record_start is 0", __func__);
-        return -1;
-    }
-
-    gsc_cap_poll(&m_events_c2);
-    int index = v4l2_gsc_cap_dqbuf(m_cam_fd2, RECORD_NUM_PLANE);
-    if (!(0 <= index && index < MAX_BUFFERS)) {
-        ALOGE("ERR(%s):wrong index = %d", __func__, index);
-        return -1;
-    }
-
-    return index;
-}
-
-int SecCamera::releaseRecordFrame(int index)
-{
-    if (!m_flag_record_start) {
-        /* this can happen when recording frames are returned after
-         * the recording is stopped at the driver level.  we don't
-         * need to return the buffers in this case and we've seen
-         * cases where fimc could crash if we called qbuf and it
-         * wasn't expecting it.
-         */
-        ALOGI("%s: recording not in progress, ignoring", __func__);
-        return 0;
-    }
-
-    return v4l2_gsc_cap_qbuf(m_cam_fd2, m_recording_width, m_recording_height, m_buffers_record, index, RECORD_NUM_PLANE);
-}
-
-int SecCamera::setPreviewSize(int width, int height, int pixel_format)
-{
-    ALOGV("%s(width(%d), height(%d), format(%d))", __func__, width, height, pixel_format);
-
-    int v4lpixelformat = pixel_format;
-
-#if defined(ALOG_NDEBUG) && LOG_NDEBUG == 0
-    if (v4lpixelformat == V4L2_PIX_FMT_YUV420)
-        ALOGV("PreviewFormat:V4L2_PIX_FMT_YUV420");
-    else if (v4lpixelformat == V4L2_PIX_FMT_YVU420)
-        ALOGV("PreviewFormat:V4L2_PIX_FMT_YVU420");
-    else if (v4lpixelformat == V4L2_PIX_FMT_YVU420M)
-        ALOGV("PreviewFormat:V4L2_PIX_FMT_YVU420M");
-    else if (v4lpixelformat == V4L2_PIX_FMT_NV12)
-        ALOGV("PreviewFormat:V4L2_PIX_FMT_NV12");
-    else if (v4lpixelformat == V4L2_PIX_FMT_NV12M)
-        ALOGV("PreviewFormat:V4L2_PIX_FMT_NV12M");
-    else if (v4lpixelformat == V4L2_PIX_FMT_NV12T)
-        ALOGV("PreviewFormat:V4L2_PIX_FMT_NV12T");
-    else if (v4lpixelformat == V4L2_PIX_FMT_NV21)
-        ALOGV("PreviewFormat:V4L2_PIX_FMT_NV21");
-    else if (v4lpixelformat == V4L2_PIX_FMT_YUV422P)
-        ALOGV("PreviewFormat:V4L2_PIX_FMT_YUV422P");
-    else if (v4lpixelformat == V4L2_PIX_FMT_YUYV)
-        ALOGV("PreviewFormat:V4L2_PIX_FMT_YUYV");
-    else if (v4lpixelformat == V4L2_PIX_FMT_RGB565)
-        ALOGV("PreviewFormat:V4L2_PIX_FMT_RGB565");
-    else
-        ALOGV("PreviewFormat:UnknownFormat");
-#endif
-    m_preview_width  = width;
-    m_preview_height = height;
-    m_preview_v4lformat = v4lpixelformat;
-
-    return 0;
-}
-
-int SecCamera::getPreviewSize(int *width, int *height, int *frame_size)
-{
-    *width  = m_preview_width;
-    *height = m_preview_height;
-    *frame_size = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(m_preview_v4lformat), *width, *height);
-    return 0;
-}
-
-int SecCamera::getPreviewMaxSize(int *width, int *height)
-{
-    *width  = m_preview_max_width;
-    *height = m_preview_max_height;
-
-    return 0;
-}
-
-int SecCamera::getPreviewPixelFormat(void)
-{
-    return m_preview_v4lformat;
-}
-
-/*
- * Devide getJpeg() as two funcs, setSnapshotCmd() & getJpeg() because of the shutter sound timing.
- * Here, just send the capture cmd to camera ISP to start JPEG capture.
- */
-int SecCamera::setSnapshotCmd(void)
-{
-    ALOGV("%s :", __func__);
-
-    int ret = 0;
-
-    if (m_gsc_vd_fd <= 0) {
-        ALOGE("ERR(%s):Camera was closed", __func__);
-        return 0;
-    }
-
-    if (m_flag_camera_start > 0) {
-        ALOGW("WARN(%s):Camera was in preview, should have been stopped", __func__);
-        stopPreview();
-    }
-
-    memset(&m_events_c, 0, sizeof(m_events_c));
-    m_events_c.fd = m_gsc_vd_fd;
-    m_events_c.events = POLLIN | POLLERR;
-
-    int nframe = 1;
-
-    ret = v4l2_gsc_cap_enum_fmt(m_gsc_vd_fd,m_snapshot_v4lformat);
-    CHECK(ret);
-
-    ret = v4l2_gsc_cap_reqbufs(m_gsc_vd_fd, V4L2_BUF_TYPE, nframe);
-    CHECK(ret);
-
-#ifdef GAIA_FW_BETA
-    ret = v4l2_gsc_cap_querybuf(m_gsc_vd_fd, &m_capture_buf, V4L2_BUF_TYPE, 1, 2);
-    CHECK(ret);
-#endif
-
-    ret = v4l2_gsc_cap_qbuf(m_gsc_vd_fd, m_snapshot_width, m_snapshot_height, m_buffers_preview, 0, 1);
-    CHECK(ret);
-
-    ret = v4l2_gsc_cap_streamon(m_gsc_vd_fd);
-    CHECK(ret);
-
-    return 0;
-}
-
-int SecCamera::endSnapshot(void)
-{
-    int ret;
-
-    ALOGI("%s :", __func__);
-    if (m_capture_buf.virt.extP[0]) {
-        munmap(m_capture_buf.virt.extP[0], m_capture_buf.size.extS[0]);
-        ALOGI("munmap():virt. addr %p size = %d",
-             m_capture_buf.virt.extP[0], m_capture_buf.size.extS[0]);
-        m_capture_buf.virt.extP[0] = NULL;
-        m_capture_buf.size.extS[0] = 0;
-    }
-    return 0;
-}
-
-/*
- * Set Jpeg quality & exif info and get JPEG data from camera ISP
- */
-unsigned char* SecCamera::getJpeg(int *jpeg_size, unsigned int *phyaddr)
-{
-    int index, ret = 0;
-    unsigned char *addr;
-    SecBuffer jpegAddr;
-
-    // capture
-    ret = gsc_cap_poll(&m_events_c);
-    CHECK_PTR(ret);
-    index = v4l2_gsc_cap_dqbuf(m_gsc_vd_fd, 1);
-
-    if (index != 0) {
-        ALOGE("ERR(%s):wrong index = %d", __func__, index);
-        return NULL;
-    }
-
-    *jpeg_size = v4l2_gsc_cap_g_ctrl(m_gsc_vd_fd, V4L2_CID_CAM_JPEG_MAIN_SIZE);
-    CHECK_PTR(*jpeg_size);
-
-    int main_offset = v4l2_gsc_cap_g_ctrl(m_gsc_vd_fd, V4L2_CID_CAM_JPEG_MAIN_OFFSET);
-    CHECK_PTR(main_offset);
-    m_postview_offset = v4l2_gsc_cap_g_ctrl(m_gsc_vd_fd, V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET);
-    CHECK_PTR(m_postview_offset);
-
-    ret = v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_STREAM_PAUSE, 0);
-    CHECK_PTR(ret);
-    ALOGV("\nsnapshot dqueued buffer = %d snapshot_width = %d snapshot_height = %d, size = %d",
-            index, m_snapshot_width, m_snapshot_height, *jpeg_size);
-
-    addr = (unsigned char*)(m_capture_buf.virt.extP[0]) + main_offset;
-    getPreviewAddr(index, &jpegAddr);
-    *phyaddr = jpegAddr.phys.extP[0] + m_postview_offset;
-
-    ret = v4l2_gsc_cap_streamoff(m_gsc_vd_fd);
-    CHECK_PTR(ret);
-
-    return addr;
-}
-
-int SecCamera::getExif(unsigned char *pExifDst, unsigned char *pThumbSrc)
-{
-    /*TODO : to be added HW JPEG code. */
-    return 0;
-}
-
-void SecCamera::getPostViewConfig(int *width, int *height, int *size)
-{
-    *width = m_snapshot_width;
-    *height = m_snapshot_height;
-    *size = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(m_snapshot_v4lformat), *width, *height);
-    ALOGV("[5B] m_preview_width : %d, mPostViewWidth = %d mPostViewHeight = %d mPostViewSize = %d",
-            m_preview_width, *width, *height, *size);
-}
-
-void SecCamera::getThumbnailConfig(int *width, int *height, int *size)
-{
-    *width = m_jpeg_thumbnail_width;
-    *height = m_jpeg_thumbnail_height;
-    *size = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(m_snapshot_v4lformat), *width, *height);
-}
-
-int SecCamera::getPostViewOffset(void)
-{
-    return m_postview_offset;
-}
-
-int SecCamera::getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_buf,
-                                            unsigned int *output_size)
-{
-    ALOGV("%s :", __func__);
-
-    int index;
-    unsigned char *addr;
-    int ret = 0;
-
-    if (m_gsc_vd_fd <= 0) {
-        ALOGE("ERR(%s):Camera was closed", __func__);
-        return -1;
-    }
-
-    if (m_flag_camera_start > 0) {
-        ALOGW("WARN(%s):Camera was in preview, should have been stopped", __func__);
-        stopPreview();
-    }
-
-    memset(&m_events_c, 0, sizeof(m_events_c));
-    m_events_c.fd = m_gsc_vd_fd;
-    m_events_c.events = POLLIN | POLLERR;
-
-#if defined(ALOG_NDEBUG) && LOG_NDEBUG == 0
-    if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420)
-        ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUV420");
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12)
-        ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV12");
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T)
-        ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV12T");
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21)
-        ALOGV("SnapshotFormat:V4L2_PIX_FMT_NV21");
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P)
-        ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUV422P");
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV)
-        ALOGV("SnapshotFormat:V4L2_PIX_FMT_YUYV");
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY)
-        ALOGV("SnapshotFormat:V4L2_PIX_FMT_UYVY");
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565)
-        ALOGV("SnapshotFormat:V4L2_PIX_FMT_RGB565");
-    else
-        ALOGV("SnapshotFormat:UnknownFormat");
-#endif
-
-    int nframe = 1;
-
-    ret = v4l2_gsc_cap_enum_fmt(m_gsc_vd_fd, m_snapshot_v4lformat);
-    CHECK(ret);
-
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-    ALOGV("Internal_is(%d), %s", Internal_is, (const char*)getCameraSensorName());
-
-    ret = v4l2_gsc_cap_s_fmt_cap(m_gsc_vd_fd, m_snapshot_width, m_snapshot_height, m_snapshot_v4lformat);
-    CHECK(ret);
-
-    ret = v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CACHEABLE, 1);
-    CHECK(ret);
-    ret = v4l2_gsc_cap_reqbufs(m_gsc_vd_fd, V4L2_BUF_TYPE, nframe);
-    CHECK(ret);
-
-#ifdef GAIA_FW_BETA
-    ret = v4l2_gsc_cap_querybuf(m_gsc_vd_fd, &m_capture_buf, V4L2_BUF_TYPE, 1, 2);
-    CHECK(ret);
-#endif
-
-    struct SecBuffer my_buf;
-    my_buf.virt.p = (char *)yuv_buf;
-
-#ifndef GAIA_FW_BETA
-    ret = v4l2_gsc_cap_qbuf(m_gsc_vd_fd, m_snapshot_width, m_snapshot_height, &my_buf, 0, 1);
-    CHECK(ret);
-#else
-    ret = v4l2_gsc_cap_qbuf(m_gsc_vd_fd, m_snapshot_width, m_snapshot_height, &m_capture_buf, 0, 1);
-    CHECK(ret);
-#endif
-
-    ret = v4l2_gsc_cap_streamon(m_gsc_vd_fd);
-    CHECK(ret);
-
-    gsc_cap_poll(&m_events_c);
-
-    index = v4l2_gsc_cap_dqbuf(m_gsc_vd_fd, 1);
-
-#ifdef GAIA_FW_BETA
-    ret = v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_STREAM_PAUSE, 0);
-    CHECK_PTR(ret);
-    ALOGV("\nsnapshot dequeued buffer = %d snapshot_width = %d snapshot_height = %d",
-            index, m_snapshot_width, m_snapshot_height);
-
-    yuv_buf = (unsigned char*)m_capture_buf.virt.extP[0];
-#endif
-    m_picture_vaddr = yuv_buf;
-    v4l2_gsc_cap_streamoff(m_gsc_vd_fd);
-
-    /* TODO: JPEG encode for smdk5250 */
-
-    return 0;
-}
-
-int SecCamera::setSnapshotSize(int width, int height)
-{
-    ALOGV("%s(width(%d), height(%d))", __func__, width, height);
-
-    m_snapshot_width  = width;
-    m_snapshot_height = height;
-
-    return 0;
-}
-
-int SecCamera::getSnapshotSize(int *width, int *height, int *frame_size)
-{
-    *width  = m_snapshot_width;
-    *height = m_snapshot_height;
-
-    int frame = 0;
-
-    frame = FRAME_SIZE(V4L2_PIX_2_HAL_PIXEL_FORMAT(m_snapshot_v4lformat), *width, *height);
-
-    // set it big.
-    if (frame == 0)
-        frame = m_snapshot_width * m_snapshot_height * BPP;
-
-    *frame_size = frame;
-
-    return 0;
-}
-
-int SecCamera::getSnapshotMaxSize(int *width, int *height)
-{
-    switch (m_camera_id) {
-    case CAMERA_ID_FRONT:
-        m_snapshot_max_width  = MAX_FRONT_CAMERA_SNAPSHOT_WIDTH;
-        m_snapshot_max_height = MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT;
-        break;
-
-    default:
-    case CAMERA_ID_BACK:
-        m_snapshot_max_width  = MAX_BACK_CAMERA_SNAPSHOT_WIDTH;
-        m_snapshot_max_height = MAX_BACK_CAMERA_SNAPSHOT_HEIGHT;
-        break;
-    }
-
-    *width  = m_snapshot_max_width;
-    *height = m_snapshot_max_height;
-
-    return 0;
-}
-
-int SecCamera::setSnapshotPixelFormat(int pixel_format)
-{
-    int v4lpixelformat = pixel_format;
-
-    if (m_snapshot_v4lformat != v4lpixelformat) {
-        m_snapshot_v4lformat = v4lpixelformat;
-    }
-
-#if defined(ALOG_NDEBUG) && LOG_NDEBUG == 0
-    if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV420)
-        ALOGE("%s : SnapshotFormat:V4L2_PIX_FMT_YUV420", __func__);
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12)
-        ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12", __func__);
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV12T)
-        ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV12T", __func__);
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_NV21)
-        ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_NV21", __func__);
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUV422P)
-        ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUV422P", __func__);
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_YUYV)
-        ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_YUYV", __func__);
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_UYVY)
-        ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_UYVY", __func__);
-    else if (m_snapshot_v4lformat == V4L2_PIX_FMT_RGB565)
-        ALOGD("%s : SnapshotFormat:V4L2_PIX_FMT_RGB565", __func__);
-    else
-        ALOGD("SnapshotFormat:UnknownFormat");
-#endif
-    return 0;
-}
-
-int SecCamera::getSnapshotPixelFormat(void)
-{
-    return m_snapshot_v4lformat;
-}
-
-int SecCamera::getCameraId(void)
-{
-    return m_camera_id;
-}
-
-int SecCamera::setAutofocus(void)
-{
-    ALOGV("%s :", __func__);
-
-    if (m_gsc_vd_fd <= 0) {
-        ALOGE("ERR(%s):Camera was closed", __func__);
-        return -1;
-    }
-
-    if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_SET_AUTO_FOCUS, AUTO_FOCUS_ON) < 0) {
-        ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_AUTO_FOCUS", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int SecCamera::getAutoFocusResult(void)
-{
-    int af_result;
-
-    af_result = v4l2_gsc_cap_g_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_AUTO_FOCUS_RESULT);
-
-    ALOGV("%s : returning %d", __func__, af_result);
-
-    return af_result;
-}
-
-int SecCamera::cancelAutofocus(void)
-{
-    ALOGV("%s :", __func__);
-
-    if (m_gsc_vd_fd <= 0) {
-        ALOGE("ERR(%s):Camera was closed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int SecCamera::SetRotate(int angle)
-{
-    ALOGE("%s(angle(%d))", __func__, angle);
-
-    if (m_angle != angle) {
-        switch (angle) {
-        case -360:
-        case    0:
-        case  360:
-            m_angle = 0;
-            break;
-
-        case -270:
-        case   90:
-            m_angle = 90;
-            break;
-
-        case -180:
-        case  180:
-            m_angle = 180;
-            break;
-
-        case  -90:
-        case  270:
-            m_angle = 270;
-            break;
-
-        default:
-            ALOGE("ERR(%s):Invalid angle(%d)", __func__, angle);
-            return -1;
-        }
-
-        if (m_flag_camera_start) {
-            if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_ROTATION, angle) < 0) {
-                ALOGE("ERR(%s):Fail on V4L2_CID_ROTATION", __func__);
-                return -1;
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getRotate(void)
-{
-    ALOGV("%s : angle(%d)", __func__, m_angle);
-    return m_angle;
-}
-
-int SecCamera::setFrameRate(int frame_rate)
-{
-    ALOGV("%s(FrameRate(%d))", __func__, frame_rate);
-
-    if (frame_rate < FRAME_RATE_AUTO || FRAME_RATE_MAX < frame_rate )
-        ALOGE("ERR(%s):Invalid frame_rate(%d)", __func__, frame_rate);
-
-    m_params->capture.timeperframe.denominator = frame_rate;
-    if (m_flag_camera_start) {
-        if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_FRAME_RATE, frame_rate) < 0) {
-            ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FRAME_RATE", __func__);
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::setVerticalMirror(void)
-{
-    ALOGV("%s :", __func__);
-
-    if (m_gsc_vd_fd <= 0) {
-        ALOGE("ERR(%s):Camera was closed", __func__);
-        return -1;
-    }
-
-    if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_VFLIP, 0) < 0) {
-        ALOGE("ERR(%s):Fail on V4L2_CID_VFLIP", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int SecCamera::setHorizontalMirror(void)
-{
-    ALOGV("%s :", __func__);
-
-    if (m_gsc_vd_fd <= 0) {
-        ALOGE("ERR(%s):Camera was closed", __func__);
-        return -1;
-    }
-
-    if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_HFLIP, 0) < 0) {
-        ALOGE("ERR(%s):Fail on V4L2_CID_HFLIP", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int SecCamera::setWhiteBalance(int white_balance)
-{
-    ALOGV("%s(white_balance(%d))", __func__, white_balance);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        if (white_balance < IS_AWB_AUTO || IS_AWB_MAX <= white_balance) {
-            ALOGE("ERR(%s):Invalid white_balance(%d)", __func__, white_balance);
-            return -1;
-        }
-    } else {
-        if (white_balance <= WHITE_BALANCE_BASE || WHITE_BALANCE_MAX <= white_balance) {
-            ALOGE("ERR(%s):Invalid white_balance(%d)", __func__, white_balance);
-            return -1;
-        }
-    }
-
-    if (m_params->white_balance != white_balance) {
-        m_params->white_balance = white_balance;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_AWB_MODE, white_balance) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_AWB_MODE", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_WHITE_BALANCE, white_balance) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_WHITE_BALANCE", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getWhiteBalance(void)
-{
-    ALOGV("%s : white_balance(%d)", __func__, m_params->white_balance);
-    return m_params->white_balance;
-}
-
-int SecCamera::setBrightness(int brightness)
-{
-    ALOGV("%s(brightness(%d))", __func__, brightness);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        brightness += IS_BRIGHTNESS_DEFAULT;
-        if (brightness < IS_BRIGHTNESS_MINUS_2 || IS_BRIGHTNESS_PLUS2 < brightness) {
-            ALOGE("ERR(%s):Invalid brightness(%d)", __func__, brightness);
-            return -1;
-        }
-    } else {
-        ALOGW("WARN(%s):Not supported brightness setting", __func__);
-        return 0;
-    }
-
-    if (m_params->brightness != brightness) {
-        m_params->brightness = brightness;
-        if (m_flag_camera_start) {
-            if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_BRIGHTNESS, brightness) < EV_MINUS_4) {
-                ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_BRIGHTNESS", __func__);
-                return -1;
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getBrightness(void)
-{
-    ALOGV("%s : brightness(%d)", __func__, m_params->brightness);
-    return m_params->brightness;
-}
-
-int SecCamera::setExposure(int exposure)
-{
-    ALOGV("%s(exposure(%d))", __func__, exposure);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        exposure += IS_EXPOSURE_DEFAULT;
-        if (exposure < IS_EXPOSURE_MINUS_2 || IS_EXPOSURE_PLUS2 < exposure) {
-            ALOGE("ERR(%s):Invalid exposure(%d)", __func__, exposure);
-            return -1;
-        }
-    } else {
-        exposure += EV_DEFAULT;
-        if (exposure < EV_MINUS_4 || EV_PLUS_4 < exposure) {
-            ALOGE("ERR(%s):Invalid exposure(%d)", __func__, exposure);
-            return -1;
-        }
-    }
-
-    if (m_params->exposure != exposure) {
-        m_params->exposure = exposure;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_EXPOSURE, exposure) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_EXPOSURE", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_BRIGHTNESS, exposure) < EV_MINUS_4) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BRIGHTNESS", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getExposure(void)
-{
-    ALOGV("%s : exposure(%d)", __func__, m_params->exposure);
-    return m_params->exposure;
-}
-
-int SecCamera::setImageEffect(int image_effect)
-{
-    ALOGV("%s(image_effect(%d))", __func__, image_effect);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        if (image_effect < IS_IMAGE_EFFECT_DISABLE || IS_IMAGE_EFFECT_MAX <= image_effect) {
-            ALOGE("ERR(%s):Invalid image_effect(%d)", __func__, image_effect);
-            return -1;
-        }
-    } else {
-        if (image_effect <= IMAGE_EFFECT_BASE || IMAGE_EFFECT_MAX <= image_effect) {
-            ALOGE("ERR(%s):Invalid image_effect(%d)", __func__, image_effect);
-            return -1;
-        }
-    }
-
-    if (m_params->effects != image_effect) {
-        m_params->effects = image_effect;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_IMAGE_EFFECT, image_effect) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_IMAGE_EFFECT", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_EFFECT, image_effect) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_EFFECT", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getImageEffect(void)
-{
-    ALOGV("%s : image_effect(%d)", __func__, m_params->effects);
-    return m_params->effects;
-}
-
-int SecCamera::setAntiBanding(int anti_banding)
-{
-    ALOGV("%s(anti_banding(%d))", __func__, anti_banding);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        if (anti_banding < IS_AFC_DISABLE || IS_AFC_MAX <= anti_banding) {
-            ALOGE("ERR(%s):Invalid anti_banding (%d)", __func__, anti_banding);
-            return -1;
-        }
-    } else {
-        if (anti_banding < ANTI_BANDING_AUTO || ANTI_BANDING_OFF < anti_banding) {
-            ALOGE("ERR(%s):Invalid anti_banding (%d)", __func__, anti_banding);
-            return -1;
-        }
-    }
-
-    if (m_anti_banding != anti_banding) {
-        m_anti_banding = anti_banding;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_AFC_MODE, anti_banding) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_AFC_MODE", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_ANTI_BANDING, anti_banding) < 0) {
-                     ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ANTI_BANDING", __func__);
-                     return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::setSceneMode(int scene_mode)
-{
-    ALOGV("%s(scene_mode(%d))", __func__, scene_mode);
-
-    if (scene_mode <= SCENE_MODE_BASE || SCENE_MODE_MAX <= scene_mode) {
-        ALOGE("ERR(%s):Invalid scene_mode (%d)", __func__, scene_mode);
-        return -1;
-    }
-
-    if (m_params->scene_mode != scene_mode) {
-        m_params->scene_mode = scene_mode;
-        if (m_flag_camera_start) {
-            if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_SCENE_MODE, scene_mode) < 0) {
-                ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SCENE_MODE", __func__);
-                return -1;
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getSceneMode(void)
-{
-    return m_params->scene_mode;
-}
-
-int SecCamera::setFlashMode(int flash_mode)
-{
-    ALOGV("%s(flash_mode(%d))", __func__, flash_mode);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        if (flash_mode <= IS_FLASH_MODE_OFF || IS_FLASH_MODE_MAX <= flash_mode) {
-            ALOGE("ERR(%s):Invalid flash_mode (%d)", __func__, flash_mode);
-            return -1;
-        }
-    } else {
-        if (flash_mode <= FLASH_MODE_BASE || FLASH_MODE_MAX <= flash_mode) {
-            ALOGE("ERR(%s):Invalid flash_mode (%d)", __func__, flash_mode);
-            return -1;
-        }
-    }
-
-    if (m_params->flash_mode != flash_mode) {
-        m_params->flash_mode = flash_mode;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_FLASH_MODE, flash_mode) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_FLASH_MODE", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_FLASH_MODE, flash_mode) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FLASH_MODE", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getFlashMode(void)
-{
-    return m_params->flash_mode;
-}
-
-int SecCamera::setISO(int iso_value)
-{
-    ALOGV("%s(iso_value(%d))", __func__, iso_value);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        if (iso_value < IS_ISO_AUTO || IS_ISO_MAX <= iso_value) {
-            ALOGE("ERR(%s):Invalid iso_value (%d)", __func__, iso_value);
-            return -1;
-        }
-    } else {
-        if (iso_value < ISO_AUTO || ISO_MAX <= iso_value) {
-            ALOGE("ERR(%s):Invalid iso_value (%d)", __func__, iso_value);
-            return -1;
-        }
-    }
-
-    if (m_params->iso != iso_value) {
-        m_params->iso = iso_value;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_ISO, iso_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_ISO", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_ISO, iso_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ISO", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getISO(void)
-{
-    return m_params->iso;
-}
-
-int SecCamera::setContrast(int contrast_value)
-{
-    ALOGV("%s(contrast_value(%d))", __func__, contrast_value);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        if (contrast_value < IS_CONTRAST_AUTO || IS_CONTRAST_MAX <= contrast_value) {
-            ALOGE("ERR(%s):Invalid contrast_value (%d)", __func__, contrast_value);
-            return -1;
-        }
-    } else {
-        if (contrast_value < CONTRAST_MINUS_2 || CONTRAST_MAX <= contrast_value) {
-            ALOGE("ERR(%s):Invalid contrast_value (%d)", __func__, contrast_value);
-            return -1;
-        }
-    }
-
-    if (m_params->contrast != contrast_value) {
-        m_params->contrast = contrast_value;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_CONTRAST, contrast_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_CONTRAST", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_CONTRAST, contrast_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_CONTRAST", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getContrast(void)
-{
-    return m_params->contrast;
-}
-
-int SecCamera::setSaturation(int saturation_value)
-{
-    ALOGV("%s(saturation_value(%d))", __func__, saturation_value);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        saturation_value += IS_SATURATION_DEFAULT;
-        if (saturation_value < IS_SATURATION_MINUS_2 || IS_SATURATION_MAX <= saturation_value) {
-            ALOGE("ERR(%s):Invalid saturation_value (%d)", __func__, saturation_value);
-            return -1;
-        }
-    } else {
-        saturation_value += SATURATION_DEFAULT;
-        if (saturation_value < SATURATION_MINUS_2 || SATURATION_MAX <= saturation_value) {
-            ALOGE("ERR(%s):Invalid saturation_value (%d)", __func__, saturation_value);
-            return -1;
-        }
-    }
-
-    if (m_params->saturation != saturation_value) {
-        m_params->saturation = saturation_value;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_SATURATION, saturation_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SATURATION", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_SATURATION, saturation_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SATURATION", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getSaturation(void)
-{
-    return m_params->saturation;
-}
-
-int SecCamera::setSharpness(int sharpness_value)
-{
-    ALOGV("%s(sharpness_value(%d))", __func__, sharpness_value);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        sharpness_value += IS_SHARPNESS_DEFAULT;
-        if (sharpness_value < IS_SHARPNESS_MINUS_2 || IS_SHARPNESS_MAX <= sharpness_value) {
-            ALOGE("ERR(%s):Invalid sharpness_value (%d)", __func__, sharpness_value);
-            return -1;
-        }
-    } else {
-        sharpness_value += SHARPNESS_DEFAULT;
-        if (sharpness_value < SHARPNESS_MINUS_2 || SHARPNESS_MAX <= sharpness_value) {
-            ALOGE("ERR(%s):Invalid sharpness_value (%d)", __func__, sharpness_value);
-            return -1;
-        }
-    }
-
-    if (m_params->sharpness != sharpness_value) {
-        m_params->sharpness = sharpness_value;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_SHARPNESS, sharpness_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SHARPNESS", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_SHARPNESS, sharpness_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SHARPNESS", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getSharpness(void)
-{
-    return m_params->sharpness;
-}
-
-int SecCamera::setHue(int hue_value)
-{
-    ALOGV("%s(hue_value(%d))", __func__, hue_value);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        hue_value += IS_HUE_DEFAULT;
-        if (hue_value < IS_HUE_MINUS_2 || IS_HUE_MAX <= hue_value) {
-            ALOGE("ERR(%s):Invalid hue_value (%d)", __func__, hue_value);
-            return -1;
-        }
-    } else {
-            ALOGW("WARN(%s):Not supported hue setting", __func__);
-            return 0;
-    }
-
-    if (m_params->hue != hue_value) {
-        m_params->hue = hue_value;
-        if (m_flag_camera_start) {
-            if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_HUE, hue_value) < 0) {
-                ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_HUE", __func__);
-                return -1;
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getHue(void)
-{
-    return m_params->hue;
-}
-
-int SecCamera::setWDR(int wdr_value)
-{
-    ALOGV("%s(wdr_value(%d))", __func__, wdr_value);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        if (wdr_value < IS_DRC_BYPASS_DISABLE || IS_DRC_BYPASS_MAX <= wdr_value) {
-            ALOGE("ERR(%s):Invalid drc_value (%d)", __func__, wdr_value);
-            return -1;
-        }
-    } else {
-        if (wdr_value < WDR_OFF || WDR_MAX <= wdr_value) {
-            ALOGE("ERR(%s):Invalid wdr_value (%d)", __func__, wdr_value);
-            return -1;
-        }
-    }
-
-    if (m_wdr != wdr_value) {
-        m_wdr = wdr_value;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_SET_DRC, wdr_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_SET_DRC", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_WDR, wdr_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_WDR", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getWDR(void)
-{
-    return m_wdr;
-}
-
-int SecCamera::setAntiShake(int anti_shake)
-{
-    ALOGV("%s(anti_shake(%d))", __func__, anti_shake);
-
-    if (anti_shake < ANTI_SHAKE_OFF || ANTI_SHAKE_MAX <= anti_shake) {
-        ALOGE("ERR(%s):Invalid anti_shake (%d)", __func__, anti_shake);
-        return -1;
-    }
-
-    if (m_anti_shake != anti_shake) {
-        m_anti_shake = anti_shake;
-        if (m_flag_camera_start) {
-            if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_ANTI_SHAKE, anti_shake) < 0) {
-                ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ANTI_SHAKE", __func__);
-                return -1;
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getAntiShake(void)
-{
-    return m_anti_shake;
-}
-
-int SecCamera::setMetering(int metering_value)
-{
-    ALOGV("%s(metering (%d))", __func__, metering_value);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        if (metering_value < IS_METERING_AVERAGE || IS_METERING_MAX <= metering_value) {
-            ALOGE("ERR(%s):Invalid metering_value (%d)", __func__, metering_value);
-            return -1;
-        }
-    } else {
-        if (metering_value <= METERING_BASE || METERING_MAX <= metering_value) {
-            ALOGE("ERR(%s):Invalid metering_value (%d)", __func__, metering_value);
-            return -1;
-        }
-    }
-
-    if (m_params->metering != metering_value) {
-        m_params->metering = metering_value;
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_METERING, metering_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_METERING", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_METERING, metering_value) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_METERING", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getMetering(void)
-{
-    return m_params->metering;
-}
-
-int SecCamera::setJpegQuality(int jpeg_quality)
-{
-    ALOGV("%s(jpeg_quality (%d))", __func__, jpeg_quality);
-
-    if (jpeg_quality < JPEG_QUALITY_ECONOMY || JPEG_QUALITY_MAX <= jpeg_quality) {
-        ALOGE("ERR(%s):Invalid jpeg_quality (%d)", __func__, jpeg_quality);
-        return -1;
-    }
-
-    if (m_jpeg_quality != jpeg_quality) {
-        m_jpeg_quality = jpeg_quality;
-#ifdef JPEG_FROM_SENSOR
-        if (m_flag_camera_start && (m_camera_id == CAMERA_ID_BACK)) {
-            if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAM_JPEG_QUALITY, jpeg_quality) < 0) {
-                ALOGE("ERR(%s):Fail on V4L2_CID_CAM_JPEG_QUALITY", __func__);
-                return -1;
-            }
-        }
-#endif
-    }
-
-    return 0;
-}
-
-int SecCamera::getJpegQuality(void)
-{
-    return m_jpeg_quality;
-}
-
-int SecCamera::setZoom(int zoom_level)
-{
-    ALOGV("%s(zoom_level (%d))", __func__, zoom_level);
-
-    if (zoom_level < ZOOM_LEVEL_0 || ZOOM_LEVEL_MAX <= zoom_level) {
-        ALOGE("ERR(%s):Invalid zoom_level (%d)", __func__, zoom_level);
-        return -1;
-    }
-
-    if (m_zoom_level != zoom_level) {
-        m_zoom_level = zoom_level;
-        if (m_flag_camera_start) {
-            if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_ZOOM, zoom_level) < 0) {
-                ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_ZOOM", __func__);
-                return -1;
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getZoom(void)
-{
-    return m_zoom_level;
-}
-
-int SecCamera::setObjectTracking(int object_tracking)
-{
-    ALOGV("%s(object_tracking (%d))", __func__, object_tracking);
-
-    if (object_tracking < OBJECT_TRACKING_OFF || OBJECT_TRACKING_MAX <= object_tracking) {
-        ALOGE("ERR(%s):Invalid object_tracking (%d)", __func__, object_tracking);
-        return -1;
-    }
-
-    if (m_object_tracking != object_tracking)
-        m_object_tracking = object_tracking;
-
-    return 0;
-}
-
-int SecCamera::getObjectTracking(void)
-{
-    return m_object_tracking;
-}
-
-int SecCamera::getObjectTrackingStatus(void)
-{
-    int obj_status = 0;
-    obj_status = v4l2_gsc_cap_g_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_OBJ_TRACKING_STATUS);
-    return obj_status;
-}
-
-int SecCamera::setObjectTrackingStartStop(int start_stop)
-{
-    ALOGV("%s(object_tracking_start_stop (%d))", __func__, start_stop);
-
-    if (m_object_tracking_start_stop != start_stop) {
-        m_object_tracking_start_stop = start_stop;
-        if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_OBJ_TRACKING_START_STOP, start_stop) < 0) {
-            ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_OBJ_TRACKING_START_STOP", __func__);
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::setTouchAFStartStop(int start_stop)
-{
-    ALOGV("%s(touch_af_start_stop (%d))", __func__, start_stop);
-
-    if (m_touch_af_start_stop != start_stop) {
-        m_touch_af_start_stop = start_stop;
-        if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_TOUCH_AF_START_STOP, start_stop) < 0) {
-            ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_TOUCH_AF_START_STOP", __func__);
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::setSmartAuto(int smart_auto)
-{
-    ALOGV("%s(smart_auto (%d))", __func__, smart_auto);
-
-    if (smart_auto < SMART_AUTO_OFF || SMART_AUTO_MAX <= smart_auto) {
-        ALOGE("ERR(%s):Invalid smart_auto (%d)", __func__, smart_auto);
-        return -1;
-    }
-
-    if (m_smart_auto != smart_auto) {
-        m_smart_auto = smart_auto;
-        if (m_flag_camera_start) {
-            if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_SMART_AUTO, smart_auto) < 0) {
-                ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SMART_AUTO", __func__);
-                return -1;
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getSmartAuto(void)
-{
-    return m_smart_auto;
-}
-
-int SecCamera::getAutosceneStatus(void)
-{
-    int autoscene_status = -1;
-
-    if (getSmartAuto() == SMART_AUTO_ON) {
-        autoscene_status = v4l2_gsc_cap_g_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_SMART_AUTO_STATUS);
-
-        if ((autoscene_status < SMART_AUTO_STATUS_AUTO) || (autoscene_status > SMART_AUTO_STATUS_MAX)) {
-            ALOGE("ERR(%s):Invalid getAutosceneStatus (%d)", __func__, autoscene_status);
-            return -1;
-        }
-    }
-    return autoscene_status;
-}
-
-int SecCamera::setBeautyShot(int beauty_shot)
-{
-    ALOGV("%s(beauty_shot (%d))", __func__, beauty_shot);
-
-    if (beauty_shot < BEAUTY_SHOT_OFF || BEAUTY_SHOT_MAX <= beauty_shot) {
-        ALOGE("ERR(%s):Invalid beauty_shot (%d)", __func__, beauty_shot);
-        return -1;
-    }
-
-    if (m_beauty_shot != beauty_shot) {
-        m_beauty_shot = beauty_shot;
-        if (m_flag_camera_start) {
-            if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_BEAUTY_SHOT, beauty_shot) < 0) {
-                ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BEAUTY_SHOT", __func__);
-                return -1;
-            }
-        }
-
-        setFaceDetect(FACE_DETECTION_ON_BEAUTY);
-    }
-
-    return 0;
-}
-
-int SecCamera::getBeautyShot(void)
-{
-    return m_beauty_shot;
-}
-
-int SecCamera::setVintageMode(int vintage_mode)
-{
-    ALOGV("%s(vintage_mode(%d))", __func__, vintage_mode);
-
-    if (vintage_mode <= VINTAGE_MODE_BASE || VINTAGE_MODE_MAX <= vintage_mode) {
-        ALOGE("ERR(%s):Invalid vintage_mode (%d)", __func__, vintage_mode);
-        return -1;
-    }
-
-    if (m_vintage_mode != vintage_mode) {
-        m_vintage_mode = vintage_mode;
-        if (m_flag_camera_start) {
-            if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_VINTAGE_MODE, vintage_mode) < 0) {
-                ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_VINTAGE_MODE", __func__);
-                return -1;
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getVintageMode(void)
-{
-    return m_vintage_mode;
-}
-
-int SecCamera::setFocusMode(int focus_mode)
-{
-    ALOGV("%s(focus_mode(%d))", __func__, focus_mode);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (Internal_is) {
-        if (IS_FOCUS_MODE_MAX <= focus_mode) {
-            ALOGE("ERR(%s):Invalid focus_mode (%d)", __func__, focus_mode);
-            return -1;
-        }
-    } else {
-        if (FOCUS_MODE_MAX <= focus_mode) {
-            ALOGE("ERR(%s):Invalid focus_mode (%d)", __func__, focus_mode);
-            return -1;
-        }
-    }
-
-    if (m_params->focus_mode != focus_mode) {
-        m_params->focus_mode = focus_mode;
-#ifdef AF_SUPPORT
-        if (m_flag_camera_start) {
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_FOCUS_MODE, focus_mode) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_FOCUS_MODE", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_FOCUS_MODE, focus_mode) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FOCUS_MODE", __func__);
-                    return -1;
-                }
-            }
-        }
-#endif
-    }
-
-    return 0;
-}
-
-int SecCamera::getFocusMode(void)
-{
-    return m_params->focus_mode;
-}
-
-int SecCamera::setFaceDetect(int face_detect)
-{
-    ALOGV("%s(face_detect(%d))", __func__, face_detect);
-    int Internal_is = !strncmp((const char*)getCameraSensorName(), "ISP Camera", 10);
-
-    if (m_face_detect != face_detect) {
-        m_face_detect = face_detect;
-        if (m_flag_camera_start) {
-            if (m_face_detect != FACE_DETECTION_OFF) {
-                if (Internal_is) {
-                    if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CAMERA_FOCUS_MODE, IS_FOCUS_MODE_AUTO) < 0) {
-                        ALOGE("ERR(%s):Fail on V4L2_CID_IS_CAMERA_FOCUS_MODin face detecion", __func__);
-                        return -1;
-                    }
-                } else {
-                    if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_FOCUS_MODE, FOCUS_MODE_AUTO) < 0) {
-                        ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FOCUS_MODin face detecion", __func__);
-                        return -1;
-                    }
-                }
-            }
-            if (Internal_is) {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_IS_CMD_FD, face_detect) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_IS_CMD_FD", __func__);
-                    return -1;
-                }
-            } else {
-                if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_FACE_DETECTION, face_detect) < 0) {
-                    ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FACE_DETECTION", __func__);
-                    return -1;
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-int SecCamera::getFaceDetect(void)
-{
-    return m_face_detect;
-}
-
-int SecCamera::setGPSLatitude(const char *gps_latitude)
-{
-    double conveted_latitude = 0;
-    ALOGV("%s(gps_latitude(%s))", __func__, gps_latitude);
-    if (gps_latitude == NULL)
-        m_gps_latitude = 0;
-    else {
-        conveted_latitude = atof(gps_latitude);
-        m_gps_latitude = (long)(conveted_latitude * 10000 / 1);
-    }
-
-    ALOGV("%s(m_gps_latitude(%ld))", __func__, m_gps_latitude);
-    return 0;
-}
-
-int SecCamera::setGPSLongitude(const char *gps_longitude)
-{
-    double conveted_longitude = 0;
-    ALOGV("%s(gps_longitude(%s))", __func__, gps_longitude);
-    if (gps_longitude == NULL)
-        m_gps_longitude = 0;
-    else {
-        conveted_longitude = atof(gps_longitude);
-        m_gps_longitude = (long)(conveted_longitude * 10000 / 1);
-    }
-
-    ALOGV("%s(m_gps_longitude(%ld))", __func__, m_gps_longitude);
-    return 0;
-}
-
-int SecCamera::setGPSAltitude(const char *gps_altitude)
-{
-    double conveted_altitude = 0;
-    ALOGV("%s(gps_altitude(%s))", __func__, gps_altitude);
-    if (gps_altitude == NULL)
-        m_gps_altitude = 0;
-    else {
-        conveted_altitude = atof(gps_altitude);
-        m_gps_altitude = (long)(conveted_altitude * 100 / 1);
-    }
-
-    ALOGV("%s(m_gps_altitude(%ld))", __func__, m_gps_altitude);
-    return 0;
-}
-
-int SecCamera::setGPSTimeStamp(const char *gps_timestamp)
-{
-    ALOGV("%s(gps_timestamp(%s))", __func__, gps_timestamp);
-    if (gps_timestamp == NULL)
-        m_gps_timestamp = 0;
-    else
-        m_gps_timestamp = atol(gps_timestamp);
-
-    ALOGV("%s(m_gps_timestamp(%ld))", __func__, m_gps_timestamp);
-    return 0;
-}
-
-int SecCamera::setGPSProcessingMethod(const char *gps_processing_method)
-{
-    ALOGV("%s(gps_processing_method(%s))", __func__, gps_processing_method);
-    memset(mExifInfo.gps_processing_method, 0, sizeof(mExifInfo.gps_processing_method));
-    if (gps_processing_method != NULL) {
-        size_t len = strlen(gps_processing_method);
-        if (len > sizeof(mExifInfo.gps_processing_method)) {
-            len = sizeof(mExifInfo.gps_processing_method);
-        }
-        memcpy(mExifInfo.gps_processing_method, gps_processing_method, len);
-    }
-    return 0;
-}
-
-int SecCamera::setFaceDetectLockUnlock(int facedetect_lockunlock)
-{
-    ALOGV("%s(facedetect_lockunlock(%d))", __func__, facedetect_lockunlock);
-
-    if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_FACEDETECT_LOCKUNLOCK, facedetect_lockunlock) < 0) {
-        ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_FACEDETECT_LOCKUNLOCK", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int SecCamera::setObjectPosition(int x, int y)
-{
-    ALOGV("%s(setObjectPosition(x=%d, y=%d))", __func__, x, y);
-
-    if (m_preview_width ==640)
-        x = x - 80;
-
-    if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_OBJECT_POSITION_X, x) < 0) {
-        ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_OBJECT_POSITION_X", __func__);
-        return -1;
-    }
-
-    if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_OBJECT_POSITION_Y, y) < 0) {
-        ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_OBJECT_POSITION_Y", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int SecCamera::setGamma(int gamma)
-{
-     ALOGV("%s(gamma(%d))", __func__, gamma);
-
-     if (gamma < GAMMA_OFF || GAMMA_MAX <= gamma) {
-         ALOGE("ERR(%s):Invalid gamma (%d)", __func__, gamma);
-         return -1;
-     }
-
-     if (m_video_gamma != gamma) {
-         m_video_gamma = gamma;
-         if (m_flag_camera_start) {
-             if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_SET_GAMMA, gamma) < 0) {
-                 ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_GAMMA", __func__);
-                 return -1;
-             }
-         }
-     }
-
-     return 0;
-}
-
-int SecCamera::setSlowAE(int slow_ae)
-{
-     ALOGV("%s(slow_ae(%d))", __func__, slow_ae);
-
-     if (slow_ae < GAMMA_OFF || GAMMA_MAX <= slow_ae) {
-         ALOGE("ERR(%s):Invalid slow_ae (%d)", __func__, slow_ae);
-         return -1;
-     }
-
-     if (m_slow_ae!= slow_ae) {
-         m_slow_ae = slow_ae;
-         if (m_flag_camera_start) {
-             if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_SET_SLOW_AE, slow_ae) < 0) {
-                 ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_SET_SLOW_AE", __func__);
-                 return -1;
-             }
-         }
-     }
-
-     return 0;
-}
-
-int SecCamera::setRecording(int recording_en)
-{
-     ALOGV("%s(recoding_en(%d))", __func__, recording_en);
-
-     m_recording_en  = recording_en;
-
-     return 0;
-}
-
-int SecCamera::setRecordingSize(int width, int height)
-{
-     ALOGV("%s(width(%d), height(%d))", __func__, width, height);
-
-     m_recording_width  = width;
-     m_recording_height = height;
-
-     return 0;
-}
-
-int SecCamera::getRecordingSize(int *width, int *height)
-{
-    *width  = m_recording_width;
-    *height = m_recording_height;
-
-    return 0;
-}
-
-int SecCamera::setExifOrientationInfo(int orientationInfo)
-{
-     ALOGV("%s(orientationInfo(%d))", __func__, orientationInfo);
-
-     if (orientationInfo < 0) {
-         ALOGE("ERR(%s):Invalid orientationInfo (%d)", __func__, orientationInfo);
-         return -1;
-     }
-     m_exif_orientation = orientationInfo;
-
-     return 0;
-}
-
-int SecCamera::setBatchReflection()
-{
-    if (m_flag_camera_start) {
-        if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_BATCH_REFLECTION, 1) < 0) {
-             ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_BATCH_REFLECTION", __func__);
-             return -1;
-        }
-    }
-
-    return 0;
-}
-
-/* Camcorder fix fps */
-int SecCamera::setSensorMode(int sensor_mode)
-{
-    ALOGV("%s(sensor_mode (%d))", __func__, sensor_mode);
-
-    if (sensor_mode < SENSOR_MODE_CAMERA || SENSOR_MODE_MOVIE < sensor_mode) {
-        ALOGE("ERR(%s):Invalid sensor mode (%d)", __func__, sensor_mode);
-        return -1;
-    }
-
-    if (m_sensor_mode != sensor_mode)
-        m_sensor_mode = sensor_mode;
-
-    return 0;
-}
-
-/*  Shot mode   */
-/*  SINGLE = 0
-*   CONTINUOUS = 1
-*   PANORAMA = 2
-*   SMILE = 3
-*   SELF = 6
-*/
-int SecCamera::setShotMode(int shot_mode)
-{
-    ALOGV("%s(shot_mode (%d))", __func__, shot_mode);
-    if (shot_mode < SHOT_MODE_SINGLE || SHOT_MODE_SELF < shot_mode) {
-        ALOGE("ERR(%s):Invalid shot_mode (%d)", __func__, shot_mode);
-        return -1;
-    }
-    m_shot_mode = shot_mode;
-
-    return 0;
-}
-
-int SecCamera::setDataLineCheck(int chk_dataline)
-{
-    ALOGV("%s(chk_dataline (%d))", __func__, chk_dataline);
-
-    if (chk_dataline < CHK_DATALINE_OFF || CHK_DATALINE_MAX <= chk_dataline) {
-        ALOGE("ERR(%s):Invalid chk_dataline (%d)", __func__, chk_dataline);
-        return -1;
-    }
-
-    m_chk_dataline = chk_dataline;
-
-    return 0;
-}
-
-int SecCamera::getDataLineCheck(void)
-{
-    return m_chk_dataline;
-}
-
-int SecCamera::setDataLineCheckStop(void)
-{
-    ALOGV("%s", __func__);
-
-    if (m_flag_camera_start) {
-        if (v4l2_gsc_cap_s_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_CHECK_DATALINE_STOP, 1) < 0) {
-            ALOGE("ERR(%s):Fail on V4L2_CID_CAMERA_CHECK_DATALINE_STOP", __func__);
-            return -1;
-        }
-    }
-    return 0;
-}
-
-const __u8* SecCamera::getCameraSensorName(void)
-{
-    ALOGV("%s", __func__);
-
-    return v4l2_gsc_cap_enuminput(m_gsc_vd_fd, getCameraId());
-}
-
-#ifdef ENABLE_ESD_PREVIEW_CHECK
-int SecCamera::getCameraSensorESDStatus(void)
-{
-    ALOGV("%s", __func__);
-
-    // 0 : normal operation, 1 : abnormal operation
-    int status = v4l2_gsc_cap_g_ctrl(m_gsc_vd_fd, V4L2_CID_ESD_INT);
-
-    return status;
-}
-#endif // ENABLE_ESD_PREVIEW_CHECK
-
-int SecCamera::setJpegThumbnailSize(int width, int height)
-{
-    ALOGV("%s(width(%d), height(%d))", __func__, width, height);
-
-    m_jpeg_thumbnail_width  = width;
-    m_jpeg_thumbnail_height = height;
-
-    return 0;
-}
-
-int SecCamera::getJpegThumbnailSize(int *width, int  *height)
-{
-    if (width)
-        *width   = m_jpeg_thumbnail_width;
-    if (height)
-        *height  = m_jpeg_thumbnail_height;
-
-    return 0;
-}
-
-int SecCamera::setJpegThumbnailQuality(int jpeg_thumbnail_quality)
-{
-    ALOGV("%s(jpeg_thumbnail_quality (%d))", __func__, jpeg_thumbnail_quality);
-
-    if (jpeg_thumbnail_quality < JPEG_QUALITY_ECONOMY || JPEG_QUALITY_MAX <= jpeg_thumbnail_quality) {
-        ALOGE("ERR(%s):Invalid jpeg_thumbnail_quality (%d)", __func__, jpeg_thumbnail_quality);
-        return -1;
-    }
-
-    if (m_jpeg_thumbnail_quality != jpeg_thumbnail_quality) {
-        m_jpeg_thumbnail_quality = jpeg_thumbnail_quality;
-    }
-
-    return 0;
-}
-
-int SecCamera::getJpegThumbnailQuality(void)
-{
-    return m_jpeg_thumbnail_quality;
-}
-
-void SecCamera::setExifFixedAttribute()
-{
-    char property[PROPERTY_VALUE_MAX];
-
-    //2 0th IFD TIFF Tags
-    //3 Maker
-    property_get("ro.product.brand", property, EXIF_DEF_MAKER);
-    strncpy((char *)mExifInfo.maker, property,
-                sizeof(mExifInfo.maker) - 1);
-    mExifInfo.maker[sizeof(mExifInfo.maker) - 1] = '\0';
-    //3 Model
-    property_get("ro.product.model", property, EXIF_DEF_MODEL);
-    strncpy((char *)mExifInfo.model, property,
-                sizeof(mExifInfo.model) - 1);
-    mExifInfo.model[sizeof(mExifInfo.model) - 1] = '\0';
-    //3 Software
-    property_get("ro.build.id", property, EXIF_DEF_SOFTWARE);
-    strncpy((char *)mExifInfo.software, property,
-                sizeof(mExifInfo.software) - 1);
-    mExifInfo.software[sizeof(mExifInfo.software) - 1] = '\0';
-
-    //3 YCbCr Positioning
-    mExifInfo.ycbcr_positioning = EXIF_DEF_YCBCR_POSITIONING;
-
-    //2 0th IFD Exif Private Tags
-    //3 F Number
-    mExifInfo.fnumber.num = EXIF_DEF_FNUMBER_NUM;
-    mExifInfo.fnumber.den = EXIF_DEF_FNUMBER_DEN;
-    //3 Exposure Program
-    mExifInfo.exposure_program = EXIF_DEF_EXPOSURE_PROGRAM;
-    //3 Exif Version
-    memcpy(mExifInfo.exif_version, EXIF_DEF_EXIF_VERSION, sizeof(mExifInfo.exif_version));
-    //3 Aperture
-    uint32_t av = APEX_FNUM_TO_APERTURE((double)mExifInfo.fnumber.num/mExifInfo.fnumber.den);
-    mExifInfo.aperture.num = av*EXIF_DEF_APEX_DEN;
-    mExifInfo.aperture.den = EXIF_DEF_APEX_DEN;
-    //3 Maximum lens aperture
-    mExifInfo.max_aperture.num = mExifInfo.aperture.num;
-    mExifInfo.max_aperture.den = mExifInfo.aperture.den;
-    //3 Lens Focal Length
-    if (m_camera_id == CAMERA_ID_BACK)
-        mExifInfo.focal_length.num = BACK_CAMERA_FOCAL_LENGTH;
-    else
-        mExifInfo.focal_length.num = FRONT_CAMERA_FOCAL_LENGTH;
-
-    mExifInfo.focal_length.den = EXIF_DEF_FOCAL_LEN_DEN;
-    //3 User Comments
-    strcpy((char *)mExifInfo.user_comment, EXIF_DEF_USERCOMMENTS);
-    //3 Color Space information
-    mExifInfo.color_space = EXIF_DEF_COLOR_SPACE;
-    //3 Exposure Mode
-    mExifInfo.exposure_mode = EXIF_DEF_EXPOSURE_MODE;
-
-    //2 0th IFD GPS Info Tags
-    unsigned char gps_version[4] = { 0x02, 0x02, 0x00, 0x00 };
-    memcpy(mExifInfo.gps_version_id, gps_version, sizeof(gps_version));
-
-    //2 1th IFD TIFF Tags
-    mExifInfo.compression_scheme = EXIF_DEF_COMPRESSION;
-    mExifInfo.x_resolution.num = EXIF_DEF_RESOLUTION_NUM;
-    mExifInfo.x_resolution.den = EXIF_DEF_RESOLUTION_DEN;
-    mExifInfo.y_resolution.num = EXIF_DEF_RESOLUTION_NUM;
-    mExifInfo.y_resolution.den = EXIF_DEF_RESOLUTION_DEN;
-    mExifInfo.resolution_unit = EXIF_DEF_RESOLUTION_UNIT;
-}
-
-void SecCamera::setExifChangedAttribute()
-{
-    //2 0th IFD TIFF Tags
-    //3 Width
-    mExifInfo.width = m_snapshot_width;
-    //3 Height
-    mExifInfo.height = m_snapshot_height;
-    //3 Orientation
-    switch (m_exif_orientation) {
-    case 90:
-        mExifInfo.orientation = EXIF_ORIENTATION_90;
-        break;
-    case 180:
-        mExifInfo.orientation = EXIF_ORIENTATION_180;
-        break;
-    case 270:
-        mExifInfo.orientation = EXIF_ORIENTATION_270;
-        break;
-    case 0:
-    default:
-        mExifInfo.orientation = EXIF_ORIENTATION_UP;
-        break;
-    }
-    //3 Date time
-    time_t rawtime;
-    struct tm *timeinfo;
-    time(&rawtime);
-    timeinfo = localtime(&rawtime);
-    strftime((char *)mExifInfo.date_time, 20, "%Y:%m:%d %H:%M:%S", timeinfo);
-
-    //2 0th IFD Exif Private Tags
-    //3 Exposure Time
-    //int shutterSpeed = v4l2_gsc_cap_g_ctrl(m_gsc_vd_fd,  V4L2_CID_CAMERA_GET_SHT_TIME);
-    int shutterSpeed = 100;
-
-    /* TBD - front camera needs to be fixed to support this g_ctrl,
-       it current returns a negative err value, so avoid putting
-       odd value into exif for now */
-    if (shutterSpeed < 0) {
-        ALOGE("%s: error %d getting shutterSpeed, camera_id = %d, using 100",
-             __func__, shutterSpeed, m_camera_id);
-        shutterSpeed = 100;
-    }
-    mExifInfo.exposure_time.num = 1;
-    // x us -> 1/x s */
-    mExifInfo.exposure_time.den = (uint32_t)(1000000 / shutterSpeed);
-
-    //3 ISO Speed Rating
-    int iso = m_params->iso;
-    //int iso = v4l2_gsc_cap_g_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_GET_ISO);
-    /* TBD - front camera needs to be fixed to support this g_ctrl,
-       it current returns a negative err value, so avoid putting
-       odd value into exif for now */
-    if (iso < 0) {
-        ALOGE("%s: error %d getting iso, camera_id = %d, using 100",
-             __func__, iso, m_camera_id);
-        iso = ISO_100;
-    }
-    switch(iso) {
-    case ISO_50:
-        mExifInfo.iso_speed_rating = 50;
-        break;
-    case ISO_100:
-        mExifInfo.iso_speed_rating = 100;
-        break;
-    case ISO_200:
-        mExifInfo.iso_speed_rating = 200;
-        break;
-    case ISO_400:
-        mExifInfo.iso_speed_rating = 400;
-        break;
-    case ISO_800:
-        mExifInfo.iso_speed_rating = 800;
-        break;
-    case ISO_1600:
-        mExifInfo.iso_speed_rating = 1600;
-        break;
-    default:
-        mExifInfo.iso_speed_rating = 100;
-        break;
-    }
-
-    uint32_t av, tv, bv, sv, ev;
-    av = APEX_FNUM_TO_APERTURE((double)mExifInfo.fnumber.num / mExifInfo.fnumber.den);
-    tv = APEX_EXPOSURE_TO_SHUTTER((double)mExifInfo.exposure_time.num / mExifInfo.exposure_time.den);
-    sv = APEX_ISO_TO_FILMSENSITIVITY(mExifInfo.iso_speed_rating);
-    bv = av + tv - sv;
-    ev = av + tv;
-    ALOGD("Shutter speed=%d us, iso=%d", shutterSpeed, mExifInfo.iso_speed_rating);
-    ALOGD("AV=%d, TV=%d, SV=%d", av, tv, sv);
-
-    //3 Shutter Speed
-    mExifInfo.shutter_speed.num = tv*EXIF_DEF_APEX_DEN;
-    mExifInfo.shutter_speed.den = EXIF_DEF_APEX_DEN;
-    //3 Brightness
-    mExifInfo.brightness.num = bv*EXIF_DEF_APEX_DEN;
-    mExifInfo.brightness.den = EXIF_DEF_APEX_DEN;
-    //3 Exposure Bias
-    if (m_params->scene_mode == SCENE_MODE_BEACH_SNOW) {
-        mExifInfo.exposure_bias.num = EXIF_DEF_APEX_DEN;
-        mExifInfo.exposure_bias.den = EXIF_DEF_APEX_DEN;
-    } else {
-        mExifInfo.exposure_bias.num = 0;
-        mExifInfo.exposure_bias.den = 0;
-    }
-    //3 Metering Mode
-    switch (m_params->metering) {
-    case METERING_SPOT:
-        mExifInfo.metering_mode = EXIF_METERING_SPOT;
-        break;
-    case METERING_MATRIX:
-        mExifInfo.metering_mode = EXIF_METERING_AVERAGE;
-        break;
-    case METERING_CENTER:
-        mExifInfo.metering_mode = EXIF_METERING_CENTER;
-        break;
-    default :
-        mExifInfo.metering_mode = EXIF_METERING_AVERAGE;
-        break;
-    }
-
-    //3 Flash
-    int flash = m_params->flash_mode;
-    //int flash = v4l2_gsc_cap_g_ctrl(m_gsc_vd_fd, V4L2_CID_CAMERA_GET_FLASH_ONOFF);
-    if (flash < 0)
-        mExifInfo.flash = EXIF_DEF_FLASH;
-    else
-        mExifInfo.flash = flash;
-
-    //3 White Balance
-    if (m_params->white_balance == WHITE_BALANCE_AUTO)
-        mExifInfo.white_balance = EXIF_WB_AUTO;
-    else
-        mExifInfo.white_balance = EXIF_WB_MANUAL;
-    //3 Scene Capture Type
-    switch (m_params->scene_mode) {
-    case SCENE_MODE_PORTRAIT:
-        mExifInfo.scene_capture_type = EXIF_SCENE_PORTRAIT;
-        break;
-    case SCENE_MODE_LANDSCAPE:
-        mExifInfo.scene_capture_type = EXIF_SCENE_LANDSCAPE;
-        break;
-    case SCENE_MODE_NIGHTSHOT:
-        mExifInfo.scene_capture_type = EXIF_SCENE_NIGHT;
-        break;
-    default:
-        mExifInfo.scene_capture_type = EXIF_SCENE_STANDARD;
-        break;
-    }
-
-    //2 0th IFD GPS Info Tags
-    if (m_gps_latitude != 0 && m_gps_longitude != 0) {
-        if (m_gps_latitude > 0)
-            strcpy((char *)mExifInfo.gps_latitude_ref, "N");
-        else
-            strcpy((char *)mExifInfo.gps_latitude_ref, "S");
-
-        if (m_gps_longitude > 0)
-            strcpy((char *)mExifInfo.gps_longitude_ref, "E");
-        else
-            strcpy((char *)mExifInfo.gps_longitude_ref, "W");
-
-        if (m_gps_altitude > 0)
-            mExifInfo.gps_altitude_ref = 0;
-        else
-            mExifInfo.gps_altitude_ref = 1;
-
-        double latitude = fabs(m_gps_latitude / 10000.0);
-        double longitude = fabs(m_gps_longitude / 10000.0);
-        double altitude = fabs(m_gps_altitude / 100.0);
-
-        mExifInfo.gps_latitude[0].num = (uint32_t)latitude;
-        mExifInfo.gps_latitude[0].den = 1;
-        mExifInfo.gps_latitude[1].num = (uint32_t)((latitude - mExifInfo.gps_latitude[0].num) * 60);
-        mExifInfo.gps_latitude[1].den = 1;
-        mExifInfo.gps_latitude[2].num = (uint32_t)((((latitude - mExifInfo.gps_latitude[0].num) * 60)
-                                        - mExifInfo.gps_latitude[1].num) * 60);
-        mExifInfo.gps_latitude[2].den = 1;
-
-        mExifInfo.gps_longitude[0].num = (uint32_t)longitude;
-        mExifInfo.gps_longitude[0].den = 1;
-        mExifInfo.gps_longitude[1].num = (uint32_t)((longitude - mExifInfo.gps_longitude[0].num) * 60);
-        mExifInfo.gps_longitude[1].den = 1;
-        mExifInfo.gps_longitude[2].num = (uint32_t)((((longitude - mExifInfo.gps_longitude[0].num) * 60)
-                                        - mExifInfo.gps_longitude[1].num) * 60);
-        mExifInfo.gps_longitude[2].den = 1;
-
-        mExifInfo.gps_altitude.num = (uint32_t)altitude;
-        mExifInfo.gps_altitude.den = 1;
-
-        struct tm tm_data;
-        gmtime_r(&m_gps_timestamp, &tm_data);
-        mExifInfo.gps_timestamp[0].num = tm_data.tm_hour;
-        mExifInfo.gps_timestamp[0].den = 1;
-        mExifInfo.gps_timestamp[1].num = tm_data.tm_min;
-        mExifInfo.gps_timestamp[1].den = 1;
-        mExifInfo.gps_timestamp[2].num = tm_data.tm_sec;
-        mExifInfo.gps_timestamp[2].den = 1;
-        snprintf((char*)mExifInfo.gps_datestamp, sizeof(mExifInfo.gps_datestamp),
-                "%04d:%02d:%02d", tm_data.tm_year + 1900, tm_data.tm_mon + 1, tm_data.tm_mday);
-
-        mExifInfo.enableGps = true;
-    } else {
-        mExifInfo.enableGps = false;
-    }
-
-    //2 1th IFD TIFF Tags
-    mExifInfo.widthThumb = m_jpeg_thumbnail_width;
-    mExifInfo.heightThumb = m_jpeg_thumbnail_height;
-}
-
-int SecCamera::makeExif (unsigned char *exifOut,
-                                        unsigned char *thumb_buf,
-                                        unsigned int thumb_size,
-                                        exif_attribute_t *exifInfo,
-                                        unsigned int *size,
-                                        bool useMainbufForThumb)
-{
-    unsigned char *pCur, *pApp1Start, *pIfdStart, *pGpsIfdPtr, *pNextIfdOffset;
-    unsigned int tmp, LongerTagOffest = 0;
-    pApp1Start = pCur = exifOut;
-
-    //2 Exif Identifier Code & TIFF Header
-    pCur += 4;  // Skip 4 Byte for APP1 marker and length
-    unsigned char ExifIdentifierCode[6] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
-    memcpy(pCur, ExifIdentifierCode, 6);
-    pCur += 6;
-
-    /* Byte Order - little endian, Offset of IFD - 0x00000008.H */
-    unsigned char TiffHeader[8] = { 0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00 };
-    memcpy(pCur, TiffHeader, 8);
-    pIfdStart = pCur;
-    pCur += 8;
-
-    //2 0th IFD TIFF Tags
-    if (exifInfo->enableGps)
-        tmp = NUM_0TH_IFD_TIFF;
-    else
-        tmp = NUM_0TH_IFD_TIFF - 1;
-
-    memcpy(pCur, &tmp, NUM_SIZE);
-    pCur += NUM_SIZE;
-
-    LongerTagOffest += 8 + NUM_SIZE + tmp*IFD_SIZE + OFFSET_SIZE;
-
-    writeExifIfd(&pCur, EXIF_TAG_IMAGE_WIDTH, EXIF_TYPE_LONG,
-                 1, exifInfo->width);
-    writeExifIfd(&pCur, EXIF_TAG_IMAGE_HEIGHT, EXIF_TYPE_LONG,
-                 1, exifInfo->height);
-    writeExifIfd(&pCur, EXIF_TAG_MAKE, EXIF_TYPE_ASCII,
-                 strlen((char *)exifInfo->maker) + 1, exifInfo->maker, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_MODEL, EXIF_TYPE_ASCII,
-                 strlen((char *)exifInfo->model) + 1, exifInfo->model, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT,
-                 1, exifInfo->orientation);
-    writeExifIfd(&pCur, EXIF_TAG_SOFTWARE, EXIF_TYPE_ASCII,
-                 strlen((char *)exifInfo->software) + 1, exifInfo->software, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME, EXIF_TYPE_ASCII,
-                 20, exifInfo->date_time, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_YCBCR_POSITIONING, EXIF_TYPE_SHORT,
-                 1, exifInfo->ycbcr_positioning);
-    writeExifIfd(&pCur, EXIF_TAG_EXIF_IFD_POINTER, EXIF_TYPE_LONG,
-                 1, LongerTagOffest);
-    if (exifInfo->enableGps) {
-        pGpsIfdPtr = pCur;
-        pCur += IFD_SIZE;   // Skip a ifd size for gps IFD pointer
-    }
-
-    pNextIfdOffset = pCur;  // Skip a offset size for next IFD offset
-    pCur += OFFSET_SIZE;
-
-    //2 0th IFD Exif Private Tags
-    pCur = pIfdStart + LongerTagOffest;
-
-    tmp = NUM_0TH_IFD_EXIF;
-    memcpy(pCur, &tmp , NUM_SIZE);
-    pCur += NUM_SIZE;
-
-    LongerTagOffest += NUM_SIZE + NUM_0TH_IFD_EXIF*IFD_SIZE + OFFSET_SIZE;
-
-    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_TIME, EXIF_TYPE_RATIONAL,
-                 1, &exifInfo->exposure_time, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_FNUMBER, EXIF_TYPE_RATIONAL,
-                 1, &exifInfo->fnumber, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_PROGRAM, EXIF_TYPE_SHORT,
-                 1, exifInfo->exposure_program);
-    writeExifIfd(&pCur, EXIF_TAG_ISO_SPEED_RATING, EXIF_TYPE_SHORT,
-                 1, exifInfo->iso_speed_rating);
-    writeExifIfd(&pCur, EXIF_TAG_EXIF_VERSION, EXIF_TYPE_UNDEFINED,
-                 4, exifInfo->exif_version);
-    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME_ORG, EXIF_TYPE_ASCII,
-                 20, exifInfo->date_time, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME_DIGITIZE, EXIF_TYPE_ASCII,
-                 20, exifInfo->date_time, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_SHUTTER_SPEED, EXIF_TYPE_SRATIONAL,
-                 1, (rational_t *)&exifInfo->shutter_speed, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_APERTURE, EXIF_TYPE_RATIONAL,
-                 1, &exifInfo->aperture, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_BRIGHTNESS, EXIF_TYPE_SRATIONAL,
-                 1, (rational_t *)&exifInfo->brightness, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_BIAS, EXIF_TYPE_SRATIONAL,
-                 1, (rational_t *)&exifInfo->exposure_bias, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_MAX_APERTURE, EXIF_TYPE_RATIONAL,
-                 1, &exifInfo->max_aperture, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_METERING_MODE, EXIF_TYPE_SHORT,
-                 1, exifInfo->metering_mode);
-    writeExifIfd(&pCur, EXIF_TAG_FLASH, EXIF_TYPE_SHORT,
-                 1, exifInfo->flash);
-    writeExifIfd(&pCur, EXIF_TAG_FOCAL_LENGTH, EXIF_TYPE_RATIONAL,
-                 1, &exifInfo->focal_length, &LongerTagOffest, pIfdStart);
-    char code[8] = { 0x00, 0x00, 0x00, 0x49, 0x49, 0x43, 0x53, 0x41 };
-    int commentsLen = strlen((char *)exifInfo->user_comment) + 1;
-    memmove(exifInfo->user_comment + sizeof(code), exifInfo->user_comment, commentsLen);
-    memcpy(exifInfo->user_comment, code, sizeof(code));
-    writeExifIfd(&pCur, EXIF_TAG_USER_COMMENT, EXIF_TYPE_UNDEFINED,
-                 commentsLen + sizeof(code), exifInfo->user_comment, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_COLOR_SPACE, EXIF_TYPE_SHORT,
-                 1, exifInfo->color_space);
-    writeExifIfd(&pCur, EXIF_TAG_PIXEL_X_DIMENSION, EXIF_TYPE_LONG,
-                 1, exifInfo->width);
-    writeExifIfd(&pCur, EXIF_TAG_PIXEL_Y_DIMENSION, EXIF_TYPE_LONG,
-                 1, exifInfo->height);
-    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_MODE, EXIF_TYPE_LONG,
-                 1, exifInfo->exposure_mode);
-    writeExifIfd(&pCur, EXIF_TAG_WHITE_BALANCE, EXIF_TYPE_LONG,
-                 1, exifInfo->white_balance);
-    writeExifIfd(&pCur, EXIF_TAG_SCENCE_CAPTURE_TYPE, EXIF_TYPE_LONG,
-                 1, exifInfo->scene_capture_type);
-    tmp = 0;
-    memcpy(pCur, &tmp, OFFSET_SIZE); // next IFD offset
-    pCur += OFFSET_SIZE;
-
-    //2 0th IFD GPS Info Tags
-    if (exifInfo->enableGps) {
-        writeExifIfd(&pGpsIfdPtr, EXIF_TAG_GPS_IFD_POINTER, EXIF_TYPE_LONG,
-                     1, LongerTagOffest); // GPS IFD pointer skipped on 0th IFD
-
-        pCur = pIfdStart + LongerTagOffest;
-
-        if (exifInfo->gps_processing_method[0] == 0) {
-            // don't create GPS_PROCESSING_METHOD tag if there isn't any
-            tmp = NUM_0TH_IFD_GPS - 1;
-        } else {
-            tmp = NUM_0TH_IFD_GPS;
-        }
-        memcpy(pCur, &tmp, NUM_SIZE);
-        pCur += NUM_SIZE;
-
-        LongerTagOffest += NUM_SIZE + tmp*IFD_SIZE + OFFSET_SIZE;
-
-        writeExifIfd(&pCur, EXIF_TAG_GPS_VERSION_ID, EXIF_TYPE_BYTE,
-                     4, exifInfo->gps_version_id);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_LATITUDE_REF, EXIF_TYPE_ASCII,
-                     2, exifInfo->gps_latitude_ref);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_LATITUDE, EXIF_TYPE_RATIONAL,
-                     3, exifInfo->gps_latitude, &LongerTagOffest, pIfdStart);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_LONGITUDE_REF, EXIF_TYPE_ASCII,
-                     2, exifInfo->gps_longitude_ref);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_LONGITUDE, EXIF_TYPE_RATIONAL,
-                     3, exifInfo->gps_longitude, &LongerTagOffest, pIfdStart);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_ALTITUDE_REF, EXIF_TYPE_BYTE,
-                     1, exifInfo->gps_altitude_ref);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_ALTITUDE, EXIF_TYPE_RATIONAL,
-                     1, &exifInfo->gps_altitude, &LongerTagOffest, pIfdStart);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_TIMESTAMP, EXIF_TYPE_RATIONAL,
-                     3, exifInfo->gps_timestamp, &LongerTagOffest, pIfdStart);
-        tmp = strlen((char*)exifInfo->gps_processing_method);
-        if (tmp > 0) {
-            if (tmp > 100) {
-                tmp = 100;
-            }
-            static const char ExifAsciiPrefix[] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 };
-            unsigned char tmp_buf[100+sizeof(ExifAsciiPrefix)];
-            memcpy(tmp_buf, ExifAsciiPrefix, sizeof(ExifAsciiPrefix));
-            memcpy(&tmp_buf[sizeof(ExifAsciiPrefix)], exifInfo->gps_processing_method, tmp);
-            writeExifIfd(&pCur, EXIF_TAG_GPS_PROCESSING_METHOD, EXIF_TYPE_UNDEFINED,
-                         tmp+sizeof(ExifAsciiPrefix), tmp_buf, &LongerTagOffest, pIfdStart);
-        }
-        writeExifIfd(&pCur, EXIF_TAG_GPS_DATESTAMP, EXIF_TYPE_ASCII,
-                     11, exifInfo->gps_datestamp, &LongerTagOffest, pIfdStart);
-        tmp = 0;
-        memcpy(pCur, &tmp, OFFSET_SIZE); // next IFD offset
-        pCur += OFFSET_SIZE;
-    }
-
-    //2 1th IFD TIFF Tags
-
-    unsigned char *thumbBuf = thumb_buf;
-    unsigned int thumbSize = thumb_size;
-
-    if (exifInfo->enableThumb && (thumbBuf != NULL) && (thumbSize > 0)) {
-        tmp = LongerTagOffest;
-        memcpy(pNextIfdOffset, &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
-
-        pCur = pIfdStart + LongerTagOffest;
-
-        tmp = NUM_1TH_IFD_TIFF;
-        memcpy(pCur, &tmp, NUM_SIZE);
-        pCur += NUM_SIZE;
-
-        LongerTagOffest += NUM_SIZE + NUM_1TH_IFD_TIFF*IFD_SIZE + OFFSET_SIZE;
-
-        writeExifIfd(&pCur, EXIF_TAG_IMAGE_WIDTH, EXIF_TYPE_LONG,
-                     1, exifInfo->widthThumb);
-        writeExifIfd(&pCur, EXIF_TAG_IMAGE_HEIGHT, EXIF_TYPE_LONG,
-                     1, exifInfo->heightThumb);
-        writeExifIfd(&pCur, EXIF_TAG_COMPRESSION_SCHEME, EXIF_TYPE_SHORT,
-                     1, exifInfo->compression_scheme);
-        writeExifIfd(&pCur, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT,
-                     1, exifInfo->orientation);
-        writeExifIfd(&pCur, EXIF_TAG_X_RESOLUTION, EXIF_TYPE_RATIONAL,
-                     1, &exifInfo->x_resolution, &LongerTagOffest, pIfdStart);
-        writeExifIfd(&pCur, EXIF_TAG_Y_RESOLUTION, EXIF_TYPE_RATIONAL,
-                     1, &exifInfo->y_resolution, &LongerTagOffest, pIfdStart);
-        writeExifIfd(&pCur, EXIF_TAG_RESOLUTION_UNIT, EXIF_TYPE_SHORT,
-                     1, exifInfo->resolution_unit);
-        writeExifIfd(&pCur, EXIF_TAG_JPEG_INTERCHANGE_FORMAT, EXIF_TYPE_LONG,
-                     1, LongerTagOffest);
-        writeExifIfd(&pCur, EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LEN, EXIF_TYPE_LONG,
-                     1, thumbSize);
-
-        tmp = 0;
-        memcpy(pCur, &tmp, OFFSET_SIZE); // next IFD offset
-        pCur += OFFSET_SIZE;
-
-        memcpy(pIfdStart + LongerTagOffest, thumbBuf, thumbSize);
-        LongerTagOffest += thumbSize;
-    } else {
-        tmp = 0;
-        memcpy(pNextIfdOffset, &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
-    }
-
-    unsigned char App1Marker[2] = { 0xff, 0xe1 };
-    memcpy(pApp1Start, App1Marker, 2);
-    pApp1Start += 2;
-
-    *size = 10 + LongerTagOffest;
-    tmp = *size - 2;    // APP1 Maker isn't counted
-    unsigned char size_mm[2] = {(tmp >> 8) & 0xFF, tmp & 0xFF};
-    memcpy(pApp1Start, size_mm, 2);
-
-    ALOGD("makeExif X");
-
-    return 0;
-}
-
-inline void SecCamera::writeExifIfd(unsigned char **pCur,
-                                         unsigned short tag,
-                                         unsigned short type,
-                                         unsigned int count,
-                                         uint32_t value)
-{
-    memcpy(*pCur, &tag, 2);
-    *pCur += 2;
-    memcpy(*pCur, &type, 2);
-    *pCur += 2;
-    memcpy(*pCur, &count, 4);
-    *pCur += 4;
-    memcpy(*pCur, &value, 4);
-    *pCur += 4;
-}
-
-inline void SecCamera::writeExifIfd(unsigned char **pCur,
-                                         unsigned short tag,
-                                         unsigned short type,
-                                         unsigned int count,
-                                         unsigned char *pValue)
-{
-    char buf[4] = { 0,};
-
-    memcpy(buf, pValue, count);
-    memcpy(*pCur, &tag, 2);
-    *pCur += 2;
-    memcpy(*pCur, &type, 2);
-    *pCur += 2;
-    memcpy(*pCur, &count, 4);
-    *pCur += 4;
-    memcpy(*pCur, buf, 4);
-    *pCur += 4;
-}
-
-inline void SecCamera::writeExifIfd(unsigned char **pCur,
-                                         unsigned short tag,
-                                         unsigned short type,
-                                         unsigned int count,
-                                         unsigned char *pValue,
-                                         unsigned int *offset,
-                                         unsigned char *start)
-{
-    memcpy(*pCur, &tag, 2);
-    *pCur += 2;
-    memcpy(*pCur, &type, 2);
-    *pCur += 2;
-    memcpy(*pCur, &count, 4);
-    *pCur += 4;
-    memcpy(*pCur, offset, 4);
-    *pCur += 4;
-    memcpy(start + *offset, pValue, count);
-    *offset += count;
-}
-
-inline void SecCamera::writeExifIfd(unsigned char **pCur,
-                                         unsigned short tag,
-                                         unsigned short type,
-                                         unsigned int count,
-                                         rational_t *pValue,
-                                         unsigned int *offset,
-                                         unsigned char *start)
-{
-    memcpy(*pCur, &tag, 2);
-    *pCur += 2;
-    memcpy(*pCur, &type, 2);
-    *pCur += 2;
-    memcpy(*pCur, &count, 4);
-    *pCur += 4;
-    memcpy(*pCur, offset, 4);
-    *pCur += 4;
-    memcpy(start + *offset, pValue, 8 * count);
-    *offset += 8 * count;
-}
-
-status_t SecCamera::dump(int fd)
-{
-    const size_t SIZE = 256;
-    char buffer[SIZE];
-    String8 result;
-    snprintf(buffer, 255, "dump(%d)\n", fd);
-    result.append(buffer);
-    ::write(fd, result.string(), result.size());
-    return NO_ERROR;
-}
-
-double SecCamera::jpeg_ratio = 0.7;
-int SecCamera::interleaveDataSize = 5242880;
-int SecCamera::jpegLineLength = 636;
-
-}; // namespace android
diff --git a/exynos5/hal/libcamera/SecCamera.h b/exynos5/hal/libcamera/SecCamera.h
deleted file mode 100644
index 300a214..0000000
--- a/exynos5/hal/libcamera/SecCamera.h
+++ /dev/null
@@ -1,698 +0,0 @@
-/*
-**
-** Copyright 2008, The Android Open Source Project
-** Copyright 2010, Samsung Electronics Co. LTD
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-#ifndef ANDROID_HARDWARE_CAMERA_SEC_H
-#define ANDROID_HARDWARE_CAMERA_SEC_H
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <sys/poll.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <utils/RefBase.h>
-#include <videodev2.h>
-#include <videodev2_samsung.h>
-#include <linux/vt.h>
-
-#include <media.h>
-#include <v4l2-mediabus.h>
-#include <v4l2-subdev.h>
-
-#include <sec_utils_v4l2.h>
-
-#include "SecBuffer.h"
-
-#include <mediactl.h>
-#include <v4l2subdev.h>
-
-#include <utils/String8.h>
-
-#include "SecJpegEncoder.h"
-
-#include "Exif.h"
-namespace android {
-
-//#define ENABLE_ESD_PREVIEW_CHECK
-
-#if defined(ALOG_NDEBUG) && (ALOG_NDEBUG == 0)
-#define LOG_CAMERA ALOGD
-#define LOG_CAMERA_PREVIEW ALOGD
-
-#define LOG_TIME_DEFINE(n) \
-    struct timeval time_start_##n, time_stop_##n; unsigned long log_time_##n = 0;
-
-#define LOG_TIME_START(n) \
-    gettimeofday(&time_start_##n, NULL);
-
-#define LOG_TIME_END(n) \
-    gettimeofday(&time_stop_##n, NULL); log_time_##n = measure_time_camera(&time_start_##n, &time_stop_##n);
-
-#define LOG_TIME(n) \
-    log_time_##n
-
-#else
-#define LOG_CAMERA(...)
-#define LOG_CAMERA_PREVIEW(...)
-#define LOG_TIME_DEFINE(n)
-#define LOG_TIME_START(n)
-#define LOG_TIME_END(n)
-#define LOG_TIME(n)
-#endif
-
-#define JOIN(x, y) JOIN_AGAIN(x, y)
-#define JOIN_AGAIN(x, y) x ## y
-
-#define FRONT_CAM M5MO
-#define BACK_CAM S5K4E5
-
-#if !defined (FRONT_CAM) || !defined(BACK_CAM)
-#error "Please define the Camera module"
-#endif
-
-#define M5MO_PREVIEW_WIDTH                  1920
-#define M5MO_PREVIEW_HEIGHT                 1080
-#define M5MO_SNAPSHOT_WIDTH                 3264
-#define M5MO_SNAPSHOT_HEIGHT                2448
-
-#define M5MO_THUMBNAIL_WIDTH                320
-#define M5MO_THUMBNAIL_HEIGHT               240
-#define M5MO_THUMBNAIL_BPP                  16
-
-#define M5MO_FPS                            30
-
-/* focal length of 3.43mm */
-#define M5MO_FOCAL_LENGTH                   343
-
-#define S5K4E5_PREVIEW_WIDTH                1920
-#define S5K4E5_PREVIEW_HEIGHT               1080
-#define S5K4E5_SNAPSHOT_WIDTH               1920
-#define S5K4E5_SNAPSHOT_HEIGHT              1080
-
-#define S5K4E5_THUMBNAIL_WIDTH              320
-#define S5K4E5_THUMBNAIL_HEIGHT             240
-#define S5K4E5_THUMBNAIL_BPP                16
-
-#define S5K4E5_FPS                          30
-
-/* focal length of 0.9mm */
-#define S5K4E5_FOCAL_LENGTH                 90
-
-#define MAX_BACK_CAMERA_PREVIEW_WIDTH       JOIN(BACK_CAM,_PREVIEW_WIDTH)
-#define MAX_BACK_CAMERA_PREVIEW_HEIGHT      JOIN(BACK_CAM,_PREVIEW_HEIGHT)
-#define MAX_BACK_CAMERA_SNAPSHOT_WIDTH      JOIN(BACK_CAM,_SNAPSHOT_WIDTH)
-#define MAX_BACK_CAMERA_SNAPSHOT_HEIGHT     JOIN(BACK_CAM,_SNAPSHOT_HEIGHT)
-
-#define BACK_CAMERA_THUMBNAIL_WIDTH         JOIN(BACK_CAM,_THUMBNAIL_WIDTH)
-#define BACK_CAMERA_THUMBNAIL_HEIGHT        JOIN(BACK_CAM,_THUMBNAIL_HEIGHT)
-#define BACK_CAMERA_THUMBNAIL_BPP           JOIN(BACK_CAM,_THUMBNAIL_BPP)
-
-#define BACK_CAMERA_FPS                     JOIN(BACK_CAM,_FPS)
-
-#define BACK_CAMERA_FOCAL_LENGTH            JOIN(BACK_CAM,_FOCAL_LENGTH)
-
-#define MAX_FRONT_CAMERA_PREVIEW_WIDTH      JOIN(FRONT_CAM,_PREVIEW_WIDTH)
-#define MAX_FRONT_CAMERA_PREVIEW_HEIGHT     JOIN(FRONT_CAM,_PREVIEW_HEIGHT)
-#define MAX_FRONT_CAMERA_SNAPSHOT_WIDTH     JOIN(FRONT_CAM,_SNAPSHOT_WIDTH)
-#define MAX_FRONT_CAMERA_SNAPSHOT_HEIGHT    JOIN(FRONT_CAM,_SNAPSHOT_HEIGHT)
-
-#define FRONT_CAMERA_THUMBNAIL_WIDTH        JOIN(FRONT_CAM,_THUMBNAIL_WIDTH)
-#define FRONT_CAMERA_THUMBNAIL_HEIGHT       JOIN(FRONT_CAM,_THUMBNAIL_HEIGHT)
-#define FRONT_CAMERA_THUMBNAIL_BPP          JOIN(FRONT_CAM,_THUMBNAIL_BPP)
-
-#define FRONT_CAMERA_FPS                    JOIN(FRONT_CAM,_FPS)
-
-#define FRONT_CAMERA_FOCAL_LENGTH           JOIN(FRONT_CAM,_FOCAL_LENGTH)
-
-#define DEFAULT_JPEG_THUMBNAIL_WIDTH        256
-#define DEFAULT_JPEG_THUMBNAIL_HEIGHT       192
-
-#define PFX_NODE_GSC                        "/dev/video"
-
-#define M5MOLS_ENTITY_NAME                  "M5MOLS 5-001f"
-#define PFX_SUBDEV_ENTITY_MIPI_CSIS         "s5p-mipi-csis"
-#define PFX_SUBDEV_ENTITY_FLITE             "exynos-fimc-lite"
-#define PFX_SUBDEV_ENTITY_GSC_CAP           "gsc-cap-subdev"
-#define PFX_VIDEODEV_ENTITY_GSC_CAP         "exynos-gsc"
-#define FIMD1_ENTITY_NAME                   "s5p-fimd1"
-
-#define GAIA_FW_BETA                        1
-
-#ifndef GAIA_FW_BETA
-#define GSC_VD_NODE_OFFSET                  25         //GSCALER 0 (0:25, 1:28, 2:31, 3:34)
-#else
-#define GSC_VD_NODE_OFFSET                  41         //INTERNAL_ISP 4E5
-
-#define ISP_SENSOR_MAX_ENTITIES             1
-#define ISP_SENSOR_PAD_SOURCE_FRONT         0
-#define ISP_SENSOR_PADS_NUM                 1
-
-#define ISP_FRONT_MAX_ENTITIES              1
-#define ISP_FRONT_PAD_SINK                  0
-#define ISP_FRONT_PAD_SOURCE_BACK           1
-#define ISP_FRONT_PAD_SOURCE_BAYER          2
-#define ISP_FRONT_PAD_SOURCE_SCALERC        3
-#define ISP_FRONT_PADS_NUM                  4
-
-#define ISP_BACK_MAX_ENTITIES               1
-#define ISP_BACK_PAD_SINK                   0
-#define ISP_BACK_PAD_SOURCE_3DNR            1
-#define ISP_BACK_PAD_SOURCE_SCALERP         2
-#define ISP_BACK_PADS_NUM                   3
-
-#define ISP_MODULE_NAME                     "exynos5-fimc-is"
-#define ISP_SENSOR_ENTITY_NAME              "exynos5-fimc-is-sensor"
-#define ISP_FRONT_ENTITY_NAME               "exynos5-fimc-is-front"
-#define ISP_BACK_ENTITY_NAME                "exynos5-fimc-is-back"
-#define ISP_VIDEO_BAYER_NAME                "exynos5-fimc-is-bayer"
-#define ISP_VIDEO_SCALERC_NAME              "exynos5-fimc-is-scalerc"
-#define ISP_VIDEO_3DNR_NAME                 "exynos5-fimc-is-3dnr"
-#define ISP_VIDEO_SCALERP_NAME              "exynos5-fimc-is-scalerp"
-
-#endif
-#define MIPI_NUM                            1
-#define FLITE_NUM                           1
-#define GSC_NUM                             0
-
-#define PFX_SUBDEV_NODE                     "/dev/v4l-subdev"
-
-#define BPP             2
-#define MIN(x, y)       (((x) < (y)) ? (x) : (y))
-#ifndef GAIA_FW_BETA
-#define MAX_BUFFERS     8
-#else
-#define MAX_BUFFERS     4  //external : 8,  internal : 4
-#endif
-
-#define MAX_PLANES      (3)
-#define V4L2_BUF_TYPE V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
-
-#define V4L2_MEMORY_TYPE V4L2_MEMORY_USERPTR
-#define RECORD_PIX_FMT V4L2_PIX_FMT_NV12M
-#define PREVIEW_NUM_PLANE (3)
-#define RECORD_NUM_PLANE (2)
-
-/*
- * V 4 L 2   F I M C   E X T E N S I O N S
- *
- */
-#define V4L2_CID_ROTATION                   (V4L2_CID_PRIVATE_BASE + 0)
-#define V4L2_CID_PADDR_Y                    (V4L2_CID_PRIVATE_BASE + 1)
-#define V4L2_CID_PADDR_CB                   (V4L2_CID_PRIVATE_BASE + 2)
-#define V4L2_CID_PADDR_CR                   (V4L2_CID_PRIVATE_BASE + 3)
-#define V4L2_CID_PADDR_CBCR                 (V4L2_CID_PRIVATE_BASE + 4)
-#define V4L2_CID_STREAM_PAUSE               (V4L2_CID_PRIVATE_BASE + 53)
-
-#define V4L2_CID_CAM_JPEG_MAIN_SIZE         (V4L2_CID_PRIVATE_BASE + 32)
-#define V4L2_CID_CAM_JPEG_MAIN_OFFSET       (V4L2_CID_PRIVATE_BASE + 33)
-#define V4L2_CID_CAM_JPEG_THUMB_SIZE        (V4L2_CID_PRIVATE_BASE + 34)
-#define V4L2_CID_CAM_JPEG_THUMB_OFFSET      (V4L2_CID_PRIVATE_BASE + 35)
-#define V4L2_CID_CAM_JPEG_POSTVIEW_OFFSET   (V4L2_CID_PRIVATE_BASE + 36)
-#define V4L2_CID_CAM_JPEG_QUALITY           (V4L2_CID_PRIVATE_BASE + 37)
-
-#define TPATTERN_COLORBAR           1
-#define TPATTERN_HORIZONTAL         2
-#define TPATTERN_VERTICAL           3
-
-#define V4L2_PIX_FMT_YVYU           v4l2_fourcc('Y', 'V', 'Y', 'U')
-
-/* FOURCC for FIMC specific */
-#define V4L2_PIX_FMT_VYUY           v4l2_fourcc('V', 'Y', 'U', 'Y')
-#define V4L2_PIX_FMT_NV16           v4l2_fourcc('N', 'V', '1', '6')
-#define V4L2_PIX_FMT_NV61           v4l2_fourcc('N', 'V', '6', '1')
-#define V4L2_PIX_FMT_NV12T          v4l2_fourcc('T', 'V', '1', '2')
-/*
- * U S E R   D E F I N E D   T Y P E S
- *
- */
-#define PREVIEW_MODE 1
-#define RECORD_MODE 2
-
-/* We use this struct as the v4l2_streamparm raw_data for
- * VIDIOC_G_PARM and VIDIOC_S_PARM
- */
-struct sec_cam_parm {
-    struct v4l2_captureparm capture;
-    int contrast;
-    int effects;
-    int brightness;
-    int exposure;
-    int flash_mode;
-    int focus_mode;
-    int iso;
-    int metering;
-    int saturation;
-    int scene_mode;
-    int sharpness;
-    int hue;
-    int white_balance;
-};
-
-struct yuv_fmt_list {
-    const char  *name;
-    const char  *desc;
-    unsigned int    fmt;
-    int     depth;
-    int     planes;
-};
-
-struct camsensor_date_info {
-    unsigned int year;
-    unsigned int month;
-    unsigned int date;
-};
-
-class SecCamera : public virtual RefBase {
-public:
-
-    enum CAMERA_ID {
-        CAMERA_ID_BACK  = 0,
-        CAMERA_ID_FRONT = 1,
-    };
-
-    enum JPEG_QUALITY {
-        JPEG_QUALITY_ECONOMY    = 0,
-        JPEG_QUALITY_NORMAL     = 50,
-        JPEG_QUALITY_SUPERFINE  = 100,
-        JPEG_QUALITY_MAX,
-    };
-
-    enum OBJECT_TRACKING {
-        OBJECT_TRACKING_OFF,
-        OBJECT_TRACKING_ON,
-        OBJECT_TRACKING_MAX,
-    };
-
-    /*VT call*/
-    enum VT_MODE {
-        VT_MODE_OFF,
-        VT_MODE_ON,
-        VT_MODE_MAX,
-    };
-
-    /*Camera sensor mode - Camcorder fix fps*/
-    enum SENSOR_MODE {
-        SENSOR_MODE_CAMERA,
-        SENSOR_MODE_MOVIE,
-    };
-
-    /*Camera Shot mode*/
-    enum SHOT_MODE {
-        SHOT_MODE_SINGLE        = 0,
-        SHOT_MODE_CONTINUOUS    = 1,
-        SHOT_MODE_PANORAMA      = 2,
-        SHOT_MODE_SMILE         = 3,
-        SHOT_MODE_SELF          = 6,
-    };
-
-    enum CHK_DATALINE {
-        CHK_DATALINE_OFF,
-        CHK_DATALINE_ON,
-        CHK_DATALINE_MAX,
-    };
-
-    int m_touch_af_start_stop;
-
-    SecCamera();
-    virtual ~SecCamera();
-
-    static SecCamera* createInstance(void)
-    {
-        static SecCamera singleton;
-        return &singleton;
-    }
-    status_t dump(int fd);
-
-    bool            CreateCamera(int index);
-    bool            DestroyCamera(void);
-    int             getCameraId(void);
-
-    int             startPreview(void);
-    int             stopPreview(void);
-    int             getPreviewState(void)
-    {
-        return m_preview_state;
-    }
-    void            clearPreviewState(void)
-    {
-        m_preview_state = 0;
-    }
-
-    int             startRecord(void);
-    int             stopRecord(void);
-    int             setPreviewFrame(int index);
-    int             getRecordFrame(void);
-    int             releaseRecordFrame(int index);
-    int             getRecordAddr(int index, SecBuffer *buffer);
-
-    int             getPreview(void);
-    int             setPreviewSize(int width, int height, int pixel_format);
-    int             getPreviewSize(int *width, int *height, int *frame_size);
-    int             getPreviewMaxSize(int *width, int *height);
-    int             getPreviewPixelFormat(void);
-    int             setPreviewImage(int index, unsigned char *buffer, int size);
-
-    int             setSnapshotSize(int width, int height);
-    int             getSnapshotSize(int *width, int *height, int *frame_size);
-    int             getSnapshotMaxSize(int *width, int *height);
-    int             setSnapshotPixelFormat(int pixel_format);
-    int             getSnapshotPixelFormat(void);
-
-    unsigned char*  getJpeg(unsigned char *snapshot_data, int snapshot_size, int *size);
-    unsigned char*  yuv2Jpeg(unsigned char *raw_data, int raw_size,
-                                int *jpeg_size,
-                                int width, int height, int pixel_format);
-
-    int             setJpegThumbnailSize(int width, int height);
-    int             getJpegThumbnailSize(int *width, int *height);
-
-    int             setJpegThumbnailQuality(int jpeg_thumbnail_quality);
-    int             getJpegThumbnailQuality(void);
-
-    int             setAutofocus(void);
-
-    int             SetRotate(int angle);
-    int             getRotate(void);
-
-    int             setVerticalMirror(void);
-    int             setHorizontalMirror(void);
-
-    int             setWhiteBalance(int white_balance);
-    int             getWhiteBalance(void);
-
-    int             setBrightness(int brightness);
-    int             getBrightness(void);
-
-    int             setExposure(int exposure);
-    int             getExposure(void);
-
-    int             setImageEffect(int image_effect);
-    int             getImageEffect(void);
-
-    int             setSceneMode(int scene_mode);
-    int             getSceneMode(void);
-
-    int             setFlashMode(int flash_mode);
-    int             getFlashMode(void);
-
-    int             setMetering(int metering_value);
-    int             getMetering(void);
-
-    int             setISO(int iso_value);
-    int             getISO(void);
-
-    int             setContrast(int contrast_value);
-    int             getContrast(void);
-
-    int             setSaturation(int saturation_value);
-    int             getSaturation(void);
-
-    int             setSharpness(int sharpness_value);
-    int             getSharpness(void);
-
-    int             setHue(int hue_value);
-    int             getHue(void);
-
-    int             setWDR(int wdr_value);
-    int             getWDR(void);
-
-    int             setAntiShake(int anti_shake);
-    int             getAntiShake(void);
-
-    int             setJpegQuality(int jpeg_qality);
-    int             getJpegQuality(void);
-
-    int             setZoom(int zoom_level);
-    int             getZoom(void);
-
-    int             setObjectTracking(int object_tracking);
-    int             getObjectTracking(void);
-    int             getObjectTrackingStatus(void);
-
-    int             setSmartAuto(int smart_auto);
-    int             getSmartAuto(void);
-    int             getAutosceneStatus(void);
-
-    int             setBeautyShot(int beauty_shot);
-    int             getBeautyShot(void);
-
-    int             setVintageMode(int vintage_mode);
-    int             getVintageMode(void);
-
-    int             setFocusMode(int focus_mode);
-    int             getFocusMode(void);
-
-    int             setFaceDetect(int face_detect);
-    int             getFaceDetect(void);
-
-    int             setGPSLatitude(const char *gps_latitude);
-    int             setGPSLongitude(const char *gps_longitude);
-    int             setGPSAltitude(const char *gps_altitude);
-    int             setGPSTimeStamp(const char *gps_timestamp);
-    int             setGPSProcessingMethod(const char *gps_timestamp);
-    int             cancelAutofocus(void);
-    int             setFaceDetectLockUnlock(int facedetect_lockunlock);
-    int             setObjectPosition(int x, int y);
-    int             setObjectTrackingStartStop(int start_stop);
-    int             setTouchAFStartStop(int start_stop);
-    int             setCAFStatus(int on_off);
-    int             getAutoFocusResult(void);
-    int             setAntiBanding(int anti_banding);
-    int             getPostview(void);
-    int             setRecording(int recording_en);
-    int             setRecordingSize(int width, int height);
-    int             getRecordingSize(int *width, int *height);
-    int             setGamma(int gamma);
-    int             setSlowAE(int slow_ae);
-    int             setExifOrientationInfo(int orientationInfo);
-    int             setBatchReflection(void);
-    int             setSnapshotCmd(void);
-    int             endSnapshot(void);
-    int             setCameraSensorReset(void);
-    int             setSensorMode(int sensor_mode); /* Camcorder fix fps */
-    int             setShotMode(int shot_mode);     /* Shot mode */
-    int             setDataLineCheck(int chk_dataline);
-    int             getDataLineCheck(void);
-    int             setDataLineCheckStop(void);
-    int             setDefultIMEI(int imei);
-    int             getDefultIMEI(void);
-    const __u8*     getCameraSensorName(void);
-#ifdef ENABLE_ESD_PREVIEW_CHECK
-    int             getCameraSensorESDStatus(void);
-#endif // ENABLE_ESD_PREVIEW_CHECK
-
-    int setFrameRate(int frame_rate);
-    unsigned char*  getJpeg(int*, unsigned int*);
-    int             getSnapshotAndJpeg(unsigned char *yuv_buf, unsigned char *jpeg_buf,
-                                        unsigned int *output_size);
-    int             getExif(unsigned char *pExifDst, unsigned char *pThumbSrc);
-
-    void            getPostViewConfig(int*, int*, int*);
-    void            getThumbnailConfig(int *width, int *height, int *size);
-
-    int             getPostViewOffset(void);
-    int             getCameraFd(void);
-    unsigned char*  getPictureVaddr(void);
-    int             getJpegFd(void);
-    void            SetJpgAddr(unsigned char *addr);
-    int             getPreviewAddr(int index, SecBuffer *buffer);
-    void            setUserBufferAddr(void *ptr, int index, int mode);
-    static void     setJpegRatio(double ratio)
-    {
-        if((ratio < 0) || (ratio > 1))
-            return;
-
-        jpeg_ratio = ratio;
-    }
-
-    static double   getJpegRatio()
-    {
-        return jpeg_ratio;
-    }
-
-    static void     setInterleaveDataSize(int x)
-    {
-        interleaveDataSize = x;
-    }
-
-    static int      getInterleaveDataSize()
-    {
-        return interleaveDataSize;
-    }
-
-    static void     setJpegLineLength(int x)
-    {
-        jpegLineLength = x;
-    }
-
-    static int      getJpegLineLength()
-    {
-        return jpegLineLength;
-    }
-
-private:
-    v4l2_streamparm m_streamparm;
-    struct sec_cam_parm   *m_params;
-    int             m_flagCreate;
-    int             m_preview_state;
-    int             m_camera_id;
-
-    /* v4l2 sub-dev file description */
-    int             m_cam_sd_fd;
-    int             m_mipi_sd_fd;
-    int             m_flite_sd_fd;
-    int             m_gsc_sd_fd;
-    int             m_gsc_vd_fd;
-
-    /* media controller variable */
-    struct media_device *media;
-    struct media_link   *links;
-    struct media_pad    *pads;
-
-    struct media_entity *camera_sd_entity;
-    struct media_entity *mipi_sd_entity;
-    struct media_entity *flite_sd_entity;
-    struct media_entity *gsc_cap_sd_entity;
-    struct media_entity *gsc_cap_vd_entity;
-    struct media_entity *isp_sensor_entity;
-    struct media_entity *isp_front_entity;
-    struct media_entity *isp_back_entity;
-    struct media_entity *isp_scalerc_entity;
-    struct media_entity *isp_scalerp_entity;
-    struct media_entity *isp_3dnr_entity;
-
-    int             m_cam_fd;
-
-    int             m_cam_fd2;
-    struct pollfd   m_events_c2;
-    int             m_flag_record_start;
-
-    int             m_preview_v4lformat;
-    int             m_preview_width;
-    int             m_preview_height;
-    int             m_preview_max_width;
-    int             m_preview_max_height;
-
-    int             m_snapshot_v4lformat;
-    int             m_snapshot_width;
-    int             m_snapshot_height;
-    int             m_snapshot_max_width;
-    int             m_snapshot_max_height;
-    unsigned char*  m_picture_vaddr;
-
-    int             m_angle;
-    int             m_anti_banding;
-    int             m_wdr;
-    int             m_anti_shake;
-    int             m_zoom_level;
-    int             m_object_tracking;
-    int             m_smart_auto;
-    int             m_beauty_shot;
-    int             m_vintage_mode;
-    int             m_face_detect;
-    int             m_object_tracking_start_stop;
-    int             m_recording_en;
-    int             m_recording_width;
-    int             m_recording_height;
-    long            m_gps_latitude;
-    long            m_gps_longitude;
-    long            m_gps_altitude;
-    long            m_gps_timestamp;
-    int             m_sensor_mode; /*Camcorder fix fps */
-    int             m_shot_mode; /* Shot mode */
-    int             m_exif_orientation;
-    int             m_chk_dataline;
-    int             m_video_gamma;
-    int             m_slow_ae;
-    int             m_camera_af_flag;
-
-    int             m_flag_camera_start;
-
-    int             m_jpeg_fd;
-    int             m_jpeg_thumbnail_width;
-    int             m_jpeg_thumbnail_height;
-    int             m_jpeg_thumbnail_quality;
-    int             m_jpeg_quality;
-
-    int             m_postview_offset;
-
-#ifdef ENABLE_ESD_PREVIEW_CHECK
-    int             m_esd_check_count;
-#endif // ENABLE_ESD_PREVIEW_CHECK
-
-    exif_attribute_t mExifInfo;
-
-    struct SecBuffer m_capture_buf;
-    struct SecBuffer m_buffers_preview[MAX_BUFFERS];
-    struct SecBuffer m_buffers_record[MAX_BUFFERS];
-    struct pollfd   m_events_c;
-
-    inline void     writeExifIfd(unsigned char **pCur,
-                                 unsigned short tag,
-                                 unsigned short type,
-                                 unsigned int count,
-                                 uint32_t value);
-    inline void     writeExifIfd(unsigned char **pCur,
-                                 unsigned short tag,
-                                 unsigned short type,
-                                 unsigned int count,
-                                 unsigned char *pValue);
-    inline void     writeExifIfd(unsigned char **pCur,
-                                 unsigned short tag,
-                                 unsigned short type,
-                                 unsigned int count,
-                                 rational_t *pValue,
-                                 unsigned int *offset,
-                                 unsigned char *start);
-    inline void     writeExifIfd(unsigned char **pCur,
-                                 unsigned short tag,
-                                 unsigned short type,
-                                 unsigned int count,
-                                 unsigned char *pValue,
-                                 unsigned int *offset,
-                                 unsigned char *start);
-
-    void            setExifChangedAttribute();
-    void            setExifFixedAttribute();
-    int             makeExif (unsigned char *exifOut,
-                                        unsigned char *thumb_buf,
-                                        unsigned int thumb_size,
-                                        exif_attribute_t *exifInfo,
-                                        unsigned int *size,
-                                        bool useMainbufForThumb);
-    void            resetCamera();
-
-    static double   jpeg_ratio;
-    static int      interleaveDataSize;
-    static int      jpegLineLength;
-};
-
-extern unsigned long measure_time_camera(struct timeval *start, struct timeval *stop);
-
-}; // namespace android
-
-#endif // ANDROID_HARDWARE_CAMERA_SEC_H
diff --git a/exynos5/hal/libcamera/SecCameraHWInterface.cpp b/exynos5/hal/libcamera/SecCameraHWInterface.cpp
deleted file mode 100644
index 717cb78..0000000
--- a/exynos5/hal/libcamera/SecCameraHWInterface.cpp
+++ /dev/null
@@ -1,3043 +0,0 @@
-/*
-**
-** Copyright 2008, The Android Open Source Project
-** Copyright 2010, Samsung Electronics Co. LTD
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-//#define LOG_NDEBUG 0
-#define LOG_TAG "CameraHardwareSec"
-#include <utils/Log.h>
-
-#include "SecCameraHWInterface.h"
-#include <utils/threads.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <camera/Camera.h>
-#include <media/hardware/MetadataBufferType.h>
-
-#define VIDEO_COMMENT_MARKER_H          0xFFBE
-#define VIDEO_COMMENT_MARKER_L          0xFFBF
-#define VIDEO_COMMENT_MARKER_LENGTH     4
-#define JPEG_EOI_MARKER                 0xFFD9
-#define HIBYTE(x) (((x) >> 8) & 0xFF)
-#define LOBYTE(x) ((x) & 0xFF)
-#define ALIGN(x, a)       (((x) + (a) - 1) & ~((a) - 1))
-
-#define BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR       "0.10,1.20,Infinity"
-#define BACK_CAMERA_MACRO_FOCUS_DISTANCES_STR      "0.10,0.20,Infinity"
-#define BACK_CAMERA_INFINITY_FOCUS_DISTANCES_STR   "0.10,1.20,Infinity"
-#define FRONT_CAMERA_FOCUS_DISTANCES_STR           "0.20,0.25,Infinity"
-//#define USE_EGL
-
-// This hack does two things:
-// -- it sets preview to NV21 (YUV420SP)
-// -- it sets gralloc to YV12
-//
-// The reason being: the samsung encoder understands only yuv420sp, and gralloc
-// does yv12 and rgb565.  So what we do is we break up the interleaved UV in
-// separate V and U planes, which makes preview look good, and enabled the
-// encoder as well.
-//
-// FIXME: Samsung needs to enable support for proper yv12 coming out of the
-//        camera, and to fix their video encoder to work with yv12.
-// FIXME: It also seems like either Samsung's YUV420SP (NV21) or img's YV12 has
-//        the color planes switched.  We need to figure which side is doing it
-//        wrong and have the respective party fix it.
-
-namespace android {
-
-struct addrs {
-    uint32_t type;  // make sure that this is 4 byte.
-    unsigned int addr_y;
-    unsigned int addr_cbcr;
-    unsigned int buf_index;
-    unsigned int reserved;
-};
-
-struct addrs_cap {
-    unsigned int addr_y;
-    unsigned int width;
-    unsigned int height;
-};
-
-static const int INITIAL_SKIP_FRAME = 3;
-static const int EFFECT_SKIP_FRAME = 1;
-
-gralloc_module_t const* CameraHardwareSec::mGrallocHal;
-
-CameraHardwareSec::CameraHardwareSec(int cameraId, camera_device_t *dev)
-        :
-          mCaptureInProgress(false),
-          mParameters(),
-          mFrameSizeDelta(0),
-          mCameraSensorName(NULL),
-          mSkipFrame(0),
-          mNotifyCb(0),
-          mDataCb(0),
-          mDataCbTimestamp(0),
-          mCallbackCookie(0),
-          mMsgEnabled(CAMERA_MSG_RAW_IMAGE),
-          mRecordRunning(false),
-          mPostViewWidth(0),
-          mPostViewHeight(0),
-          mPostViewSize(0),
-          mHalDevice(dev)
-{
-    ALOGV("%s :", __func__);
-    int ret = 0;
-
-    mPreviewWindow = NULL;
-    mSecCamera = SecCamera::createInstance();
-
-    mRawHeap = NULL;
-    mPreviewHeap = NULL;
-    for(int i = 0; i < BUFFER_COUNT_FOR_ARRAY; i++)
-        mRecordHeap[i] = NULL;
-
-    if (!mGrallocHal) {
-        ret = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (const hw_module_t **)&mGrallocHal);
-        if (ret)
-            ALOGE("ERR(%s):Fail on loading gralloc HAL", __func__);
-    }
-
-    ret = mSecCamera->CreateCamera(cameraId);
-    if (ret < 0) {
-        ALOGE("ERR(%s):Fail on mSecCamera init", __func__);
-        mSecCamera->DestroyCamera();
-    }
-
-    initDefaultParameters(cameraId);
-
-    mExitAutoFocusThread = false;
-    mExitPreviewThread = false;
-    /* whether the PreviewThread is active in preview or stopped.  we
-     * create the thread but it is initially in stopped state.
-     */
-    mPreviewRunning = false;
-    mPreviewStartDeferred = false;
-    mPreviewThread = new PreviewThread(this);
-    mAutoFocusThread = new AutoFocusThread(this);
-    mPictureThread = new PictureThread(this);
-}
-
-int CameraHardwareSec::getCameraId() const
-{
-    return mSecCamera->getCameraId();
-}
-
-void CameraHardwareSec::initDefaultParameters(int cameraId)
-{
-    if (mSecCamera == NULL) {
-        ALOGE("ERR(%s):mSecCamera object is NULL", __func__);
-        return;
-    }
-
-    CameraParameters p;
-    CameraParameters ip;
-
-#ifndef GAIA_FW_BETA
-    mCameraSensorName = mSecCamera->getCameraSensorName();
-    if (mCameraSensorName == NULL) {
-        ALOGE("ERR(%s):mCameraSensorName is NULL", __func__);
-        return;
-    }
-    ALOGV("CameraSensorName: %s", mCameraSensorName);
-    int Internal_is = !strncmp((const char*)mCameraSensorName, "ISP Camera", 10);
-#else
-    int Internal_is = 0;
-    //sprintf((char *)mCameraSensorName, "%s", "temp name");
-#endif
-    int preview_max_width   = 0;
-    int preview_max_height  = 0;
-    int snapshot_max_width  = 0;
-    int snapshot_max_height = 0;
-
-    if (cameraId == SecCamera::CAMERA_ID_BACK) {
-        p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
-              "3264x2448,2576x1948,1920x1080,1280x720,800x480,720x480,640x480,320x240,528x432,176x144");
-        p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
-              "3264x2448,1920x1080,1280x720,800x480,720x480,640x480");
-        if (Internal_is)
-            p.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
-                  "1920x1080,1280x720,640x480,176x144");
-    } else {
-        p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
-              "1392x1392,1280x720,640x480,352x288,320x240,176x144");
-        p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
-              "1392x1392,1280x960,640x480");
-        if (Internal_is)
-            p.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
-                  "1280x720,640x480,176x144");
-    }
-
-    p.getSupportedPreviewSizes(mSupportedPreviewSizes);
-
-    // If these fail, then we are using an invalid cameraId and we'll leave the
-    // sizes at zero to catch the error.
-    if (mSecCamera->getPreviewMaxSize(&preview_max_width,
-                                      &preview_max_height) < 0)
-        ALOGE("getPreviewMaxSize fail (%d / %d)",
-             preview_max_width, preview_max_height);
-    if (mSecCamera->getSnapshotMaxSize(&snapshot_max_width,
-                                       &snapshot_max_height) < 0)
-        ALOGE("getSnapshotMaxSize fail (%d / %d)",
-             snapshot_max_width, snapshot_max_height);
-
-    p.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420P); mFrameSizeDelta = 16;
-    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, CameraParameters::PIXEL_FORMAT_YUV420P);
-    p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, CameraParameters::PIXEL_FORMAT_YUV420SP);
-    p.setPreviewSize(preview_max_width, preview_max_height);
-
-    p.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
-    p.setPictureSize(snapshot_max_width, snapshot_max_height);
-    p.set(CameraParameters::KEY_JPEG_QUALITY, "100"); // maximum quality
-    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
-          CameraParameters::PIXEL_FORMAT_JPEG);
-
-    p.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, "1280x720");
-
-    String8 parameterString;
-
-    if (cameraId == SecCamera::CAMERA_ID_BACK) {
-        parameterString = CameraParameters::FOCUS_MODE_AUTO;
-        parameterString.append(",");
-        parameterString.append(CameraParameters::FOCUS_MODE_INFINITY);
-        parameterString.append(",");
-        parameterString.append(CameraParameters::FOCUS_MODE_MACRO);
-        p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
-              parameterString.string());
-        p.set(CameraParameters::KEY_FOCUS_MODE,
-              CameraParameters::FOCUS_MODE_AUTO);
-        p.set(CameraParameters::KEY_FOCUS_DISTANCES,
-              BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR);
-        p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
-              "320x240,0x0");
-        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, "320");
-        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, "240");
-        p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, "7,15,30");
-        p.setPreviewFrameRate(30);
-    } else {
-        parameterString = CameraParameters::FOCUS_MODE_FIXED;
-        p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
-              parameterString.string());
-        p.set(CameraParameters::KEY_FOCUS_MODE,
-              CameraParameters::FOCUS_MODE_FIXED);
-        p.set(CameraParameters::KEY_FOCUS_DISTANCES,
-              FRONT_CAMERA_FOCUS_DISTANCES_STR);
-        p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
-              "160x120,0x0");
-        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, "160");
-        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, "120");
-        p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, "7,15,30");
-        p.setPreviewFrameRate(30);
-    }
-
-    parameterString = CameraParameters::EFFECT_NONE;
-    parameterString.append(",");
-    parameterString.append(CameraParameters::EFFECT_MONO);
-    parameterString.append(",");
-    parameterString.append(CameraParameters::EFFECT_NEGATIVE);
-    parameterString.append(",");
-    parameterString.append(CameraParameters::EFFECT_SEPIA);
-    p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, parameterString.string());
-
-    if (cameraId == SecCamera::CAMERA_ID_BACK) {
-        parameterString = CameraParameters::FLASH_MODE_ON;
-        parameterString.append(",");
-        parameterString.append(CameraParameters::FLASH_MODE_OFF);
-        parameterString.append(",");
-        parameterString.append(CameraParameters::FLASH_MODE_AUTO);
-        parameterString.append(",");
-        parameterString.append(CameraParameters::FLASH_MODE_TORCH);
-        p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
-              parameterString.string());
-        p.set(CameraParameters::KEY_FLASH_MODE,
-              CameraParameters::FLASH_MODE_OFF);
-
-        parameterString = CameraParameters::SCENE_MODE_AUTO;
-        parameterString.append(",");
-        parameterString.append(CameraParameters::SCENE_MODE_PORTRAIT);
-        parameterString.append(",");
-        parameterString.append(CameraParameters::SCENE_MODE_LANDSCAPE);
-        parameterString.append(",");
-        parameterString.append(CameraParameters::SCENE_MODE_BEACH);
-        parameterString.append(",");
-        parameterString.append(CameraParameters::SCENE_MODE_SNOW);
-        parameterString.append(",");
-        parameterString.append(CameraParameters::SCENE_MODE_FIREWORKS);
-        parameterString.append(",");
-        parameterString.append(CameraParameters::SCENE_MODE_SPORTS);
-        parameterString.append(",");
-        parameterString.append(CameraParameters::SCENE_MODE_PARTY);
-        parameterString.append(",");
-        parameterString.append(CameraParameters::SCENE_MODE_CANDLELIGHT);
-        p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
-              parameterString.string());
-        p.set(CameraParameters::KEY_SCENE_MODE,
-              CameraParameters::SCENE_MODE_AUTO);
-
-        /* we have two ranges, 4-30fps for night mode and
-         * 15-30fps for all others
-         */
-        p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(15000,30000)");
-        p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "15000,30000");
-
-        p.set(CameraParameters::KEY_FOCAL_LENGTH, "3.43");
-    } else {
-        p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(7500,30000)");
-        p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "7500,30000");
-
-        p.set(CameraParameters::KEY_FOCAL_LENGTH, "0.9");
-    }
-
-    parameterString = CameraParameters::WHITE_BALANCE_AUTO;
-    parameterString.append(",");
-    parameterString.append(CameraParameters::WHITE_BALANCE_INCANDESCENT);
-    parameterString.append(",");
-    parameterString.append(CameraParameters::WHITE_BALANCE_FLUORESCENT);
-    parameterString.append(",");
-    parameterString.append(CameraParameters::WHITE_BALANCE_DAYLIGHT);
-    parameterString.append(",");
-    parameterString.append(CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT);
-    p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
-          parameterString.string());
-
-    p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, "100");
-
-    p.set(CameraParameters::KEY_ROTATION, 0);
-    p.set(CameraParameters::KEY_WHITE_BALANCE, CameraParameters::WHITE_BALANCE_AUTO);
-
-    p.set(CameraParameters::KEY_EFFECT, CameraParameters::EFFECT_NONE);
-
-    p.set("contrast", "auto");
-    p.set("iso", "auto");
-    p.set("metering", "center");
-    p.set("wdr", 0);
-
-    ip.set("chk_dataline", 0);
-    if (cameraId == SecCamera::CAMERA_ID_FRONT) {
-        ip.set("vtmode", 0);
-        ip.set("blur", 0);
-    }
-
-    p.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, "51.2");
-    p.set(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, "39.4");
-
-    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, "0");
-    p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, "2");
-    p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, "-2");
-    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, "1");
-
-    p.set("brightness", 0);
-    p.set("brightness-max", 2);
-    p.set("brightness-min", -2);
-
-    p.set("saturation", 0);
-    p.set("saturation-max", 2);
-    p.set("saturation-min", -2);
-
-    p.set("sharpness", 0);
-    p.set("sharpness-max", 2);
-    p.set("sharpness-min", -2);
-
-    p.set("hue", 0);
-    p.set("hue-max", 2);
-    p.set("hue-min", -2);
-
-    parameterString = CameraParameters::ANTIBANDING_AUTO;
-    parameterString.append(",");
-    parameterString.append(CameraParameters::ANTIBANDING_50HZ);
-    parameterString.append(",");
-    parameterString.append(CameraParameters::ANTIBANDING_60HZ);
-    parameterString.append(",");
-    parameterString.append(CameraParameters::ANTIBANDING_OFF);
-    p.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
-          parameterString.string());
-
-    p.set(CameraParameters::KEY_ANTIBANDING, CameraParameters::ANTIBANDING_OFF);
-
-    mParameters = p;
-    mInternalParameters = ip;
-
-    /* make sure mSecCamera has all the settings we do.  applications
-     * aren't required to call setParameters themselves (only if they
-     * want to change something.
-     */
-    setParameters(p);
-    if (cameraId == SecCamera::CAMERA_ID_BACK)
-        mSecCamera->setFrameRate(BACK_CAMERA_FPS);
-    else
-        mSecCamera->setFrameRate(FRONT_CAMERA_FPS);
-}
-
-CameraHardwareSec::~CameraHardwareSec()
-{
-    ALOGV("%s", __func__);
-    mSecCamera->DestroyCamera();
-}
-
-status_t CameraHardwareSec::setPreviewWindow(preview_stream_ops *w)
-{
-    int min_bufs;
-
-    mPreviewWindow = w;
-    ALOGV("%s: mPreviewWindow %p", __func__, mPreviewWindow);
-
-    if (!w) {
-        ALOGE("preview window is NULL!");
-        return OK;
-    }
-
-    mPreviewLock.lock();
-
-    if (mPreviewRunning && !mPreviewStartDeferred) {
-        ALOGI("stop preview (window change)");
-        stopPreviewInternal();
-    }
-
-    if (w->get_min_undequeued_buffer_count(w, &min_bufs)) {
-        ALOGE("%s: could not retrieve min undequeued buffer count", __func__);
-        return INVALID_OPERATION;
-    }
-
-    if (min_bufs >= BUFFER_COUNT_FOR_GRALLOC) {
-        ALOGE("%s: min undequeued buffer count %d is too high (expecting at most %d)", __func__,
-             min_bufs, BUFFER_COUNT_FOR_GRALLOC - 1);
-    }
-
-    ALOGV("%s: setting buffer count to %d", __func__, BUFFER_COUNT_FOR_GRALLOC);
-    if (w->set_buffer_count(w, BUFFER_COUNT_FOR_GRALLOC)) {
-        ALOGE("%s: could not set buffer count", __func__);
-        return INVALID_OPERATION;
-    }
-
-    int preview_width;
-    int preview_height;
-    mParameters.getPreviewSize(&preview_width, &preview_height);
-
-    int hal_pixel_format;
-
-    const char *str_preview_format = mParameters.getPreviewFormat();
-    ALOGV("%s: str preview format %s width : %d height : %d ", __func__, str_preview_format, preview_width, preview_height);
-    mFrameSizeDelta = 16;
-
-    hal_pixel_format = HAL_PIXEL_FORMAT_YV12;
-
-    if (!strcmp(str_preview_format,
-                CameraParameters::PIXEL_FORMAT_RGB565)) {
-        hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565;
-        mFrameSizeDelta = 0;
-    } else if (!strcmp(str_preview_format,
-                     CameraParameters::PIXEL_FORMAT_RGBA8888)) {
-        hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888;
-        mFrameSizeDelta = 0;
-    } else if (!strcmp(str_preview_format,
-                     CameraParameters::PIXEL_FORMAT_YUV420SP)) {
-        hal_pixel_format = HAL_PIXEL_FORMAT_YCrCb_420_SP;
-    } else if (!strcmp(str_preview_format,
-                     CameraParameters::PIXEL_FORMAT_YUV420P))
-        hal_pixel_format = HAL_PIXEL_FORMAT_YV12;
-
-#ifdef USE_EGL
-    if (w->set_usage(w, GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_HW_ION)) {
-        ALOGE("%s: could not set usage on gralloc buffer", __func__);
-        return INVALID_OPERATION;
-    }
-#else
-    if (w->set_usage(w, GRALLOC_USAGE_SW_WRITE_OFTEN
-        | GRALLOC_USAGE_HWC_HWOVERLAY | GRALLOC_USAGE_HW_ION)) {
-        ALOGE("%s: could not set usage on gralloc buffer", __func__);
-        return INVALID_OPERATION;
-    }
-#endif
-
-    if (w->set_buffers_geometry(w,
-                                preview_width, preview_height,
-                                hal_pixel_format)) {
-        ALOGE("%s: could not set buffers geometry to %s",
-             __func__, str_preview_format);
-        return INVALID_OPERATION;
-    }
-
-    for(int i = 0; i < BUFFER_COUNT_FOR_ARRAY; i++)
-        if (0 != mPreviewWindow->dequeue_buffer(mPreviewWindow, &mBufferHandle[i], &mStride[i])) {
-            ALOGE("%s: Could not dequeue gralloc buffer[%d]!!", __func__, i);
-            return INVALID_OPERATION;
-        }
-
-    if (mPreviewRunning && mPreviewStartDeferred) {
-        ALOGV("start/resume preview");
-        status_t ret = startPreviewInternal();
-        if (ret == OK) {
-            mPreviewStartDeferred = false;
-            mPreviewCondition.signal();
-        }
-    }
-    mPreviewLock.unlock();
-
-    return OK;
-}
-
-void CameraHardwareSec::setCallbacks(camera_notify_callback notify_cb,
-                                     camera_data_callback data_cb,
-                                     camera_data_timestamp_callback data_cb_timestamp,
-                                     camera_request_memory get_memory,
-                                     void *user)
-{
-    mNotifyCb = notify_cb;
-    mDataCb = data_cb;
-    mDataCbTimestamp = data_cb_timestamp;
-    mGetMemoryCb = get_memory;
-    mCallbackCookie = user;
-}
-
-void CameraHardwareSec::enableMsgType(int32_t msgType)
-{
-    ALOGV("%s : msgType = 0x%x, mMsgEnabled before = 0x%x",
-         __func__, msgType, mMsgEnabled);
-    mMsgEnabled |= msgType;
-
-    mPreviewLock.lock();
-    if ((msgType & (CAMERA_MSG_PREVIEW_FRAME | CAMERA_MSG_VIDEO_FRAME)) &&
-             mPreviewRunning && mPreviewStartDeferred) {
-        ALOGV("%s: starting deferred preview", __func__);
-        if (startPreviewInternal() == OK) {
-            mPreviewStartDeferred = false;
-            mPreviewCondition.signal();
-        }
-    }
-    mPreviewLock.unlock();
-
-    ALOGV("%s : mMsgEnabled = 0x%x", __func__, mMsgEnabled);
-}
-
-void CameraHardwareSec::disableMsgType(int32_t msgType)
-{
-    ALOGV("%s : msgType = 0x%x, mMsgEnabled before = 0x%x",
-         __func__, msgType, mMsgEnabled);
-    mMsgEnabled &= ~msgType;
-    ALOGV("%s : mMsgEnabled = 0x%x", __func__, mMsgEnabled);
-}
-
-bool CameraHardwareSec::msgTypeEnabled(int32_t msgType)
-{
-    return (mMsgEnabled & msgType);
-}
-
-void CameraHardwareSec::setSkipFrame(int frame)
-{
-    Mutex::Autolock lock(mSkipFrameLock);
-    if (frame < mSkipFrame)
-        return;
-
-    mSkipFrame = frame;
-}
-
-int CameraHardwareSec::previewThreadWrapper()
-{
-    ALOGI("%s: starting", __func__);
-    while (1) {
-        mPreviewLock.lock();
-        while (!mPreviewRunning) {
-            ALOGI("%s: calling mSecCamera->stopPreview() and waiting", __func__);
-            mSecCamera->stopPreview();
-            /* signal that we're stopping */
-            mPreviewStoppedCondition.signal();
-            mPreviewCondition.wait(mPreviewLock);
-            ALOGI("%s: return from wait", __func__);
-        }
-        mPreviewLock.unlock();
-
-        if (mExitPreviewThread) {
-            ALOGI("%s: exiting", __func__);
-            mSecCamera->stopPreview();
-            return 0;
-        }
-        previewThread();
-    }
-}
-
-int CameraHardwareSec::previewThread()
-{
-    int index;
-    nsecs_t timestamp;
-    SecBuffer previewAddr, recordAddr;
-    static int numArray = 0;
-    void *virAddr[3];
-    private_handle_t *hnd = NULL;
-
-    index = mSecCamera->getPreview();
-
-    if (index < 0) {
-        ALOGE("ERR(%s):Fail on SecCamera->getPreview()", __func__);
-        if (mSecCamera->getPreviewState()) {
-            stopPreview();
-            startPreview();
-            mSecCamera->clearPreviewState();
-        }
-        return UNKNOWN_ERROR;
-    }
-
-    mSkipFrameLock.lock();
-    if (mSkipFrame > 0) {
-        mSkipFrame--;
-        mSkipFrameLock.unlock();
-        ALOGV("%s: index %d skipping frame", __func__, index);
-        if (mSecCamera->setPreviewFrame(index) < 0) {
-            ALOGE("%s: Could not qbuff[%d]!!", __func__, index);
-            return UNKNOWN_ERROR;
-        }
-        return NO_ERROR;
-    }
-    mSkipFrameLock.unlock();
-
-    timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
-
-    int width, height, frame_size, offset;
-
-    mSecCamera->getPreviewSize(&width, &height, &frame_size);
-
-    offset = frame_size * index;
-
-    if (mPreviewWindow && mGrallocHal && mPreviewRunning) {
-        hnd = (private_handle_t*)*mBufferHandle[index];
-
-        if (mPreviewHeap) {
-            mPreviewHeap->release(mPreviewHeap);
-            mPreviewHeap = 0;
-        }
-
-        mPreviewHeap = mGetMemoryCb(hnd->fd, frame_size, 1, 0);
-
-        hnd = NULL;
-
-        mGrallocHal->unlock(mGrallocHal, *mBufferHandle[index]);
-        if (0 != mPreviewWindow->enqueue_buffer(mPreviewWindow, mBufferHandle[index])) {
-            ALOGE("%s: Could not enqueue gralloc buffer[%d]!!", __func__, index);
-            goto callbacks;
-        }
-
-        numArray = index;
-
-        if (0 != mPreviewWindow->dequeue_buffer(mPreviewWindow, &mBufferHandle[numArray], &mStride[numArray])) {
-            ALOGE("%s: Could not dequeue gralloc buffer[%d]!!", __func__, numArray);
-            goto callbacks;
-        }
-
-        if (!mGrallocHal->lock(mGrallocHal,
-                               *mBufferHandle[numArray],
-                               GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_YUV_ADDR,
-                               0, 0, width, height, virAddr)) {
-            mSecCamera->getPreviewAddr(index, &previewAddr);
-            char *frame = (char *)previewAddr.virt.extP[0];
-
-#ifdef USE_EGL
-            int m_Ywidth = ALIGN(width, 16);
-            int m_Yheight = ALIGN(height, 16);
-            int m_UVwidth = ALIGN(width/2, 8);
-            int m_UVheight = ALIGN(height/2, 8);
-            virAddr[1] = virAddr[0] + (m_Ywidth * m_Yheight);
-            virAddr[2] = virAddr[1] + (m_UVwidth * m_UVheight);
-#endif
-
-            mSecCamera->setUserBufferAddr(virAddr, index, PREVIEW_MODE);
-        }
-        else
-            ALOGE("%s: could not obtain gralloc buffer", __func__);
-
-        if (mSecCamera->setPreviewFrame(index) < 0) {
-            ALOGE("%s: Fail qbuf, index(%d)", __func__, index);
-            goto callbacks;
-        }
-        index = 0;
-    }
-
-callbacks:
-    // Notify the client of a new frame.
-    if (mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
-        mDataCb(CAMERA_MSG_PREVIEW_FRAME, mPreviewHeap, index, NULL, mCallbackCookie);
-
-    Mutex::Autolock lock(mRecordLock);
-    if (mRecordRunning == true) {
-        int recordingIndex = 0;
-
-        index = mSecCamera->getRecordFrame();
-        if (index < 0) {
-            ALOGE("ERR(%s):Fail on SecCamera->getRecordFrame()", __func__);
-            return UNKNOWN_ERROR;
-        }
-
-        numArray = index;
-
-        // Notify the client of a new frame.
-        if (mMsgEnabled & CAMERA_MSG_VIDEO_FRAME)
-            mDataCbTimestamp(timestamp, CAMERA_MSG_VIDEO_FRAME,
-                             mRecordHeap[numArray], recordingIndex, mCallbackCookie);
-        else
-            mSecCamera->releaseRecordFrame(index);
-    }
-
-    return NO_ERROR;
-}
-
-status_t CameraHardwareSec::startPreview()
-{
-    int ret = 0;
-
-    ALOGV("%s :", __func__);
-
-    Mutex::Autolock lock(mStateLock);
-    if (mCaptureInProgress) {
-        ALOGE("%s : capture in progress, not allowed", __func__);
-        return INVALID_OPERATION;
-    }
-
-    mPreviewLock.lock();
-    if (mPreviewRunning) {
-        // already running
-        ALOGE("%s : preview thread already running", __func__);
-        mPreviewLock.unlock();
-        return INVALID_OPERATION;
-    }
-
-    mPreviewRunning = true;
-    mPreviewStartDeferred = false;
-
-    if (!mPreviewWindow &&
-            !(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) &&
-            !(mMsgEnabled & CAMERA_MSG_VIDEO_FRAME)) {
-        ALOGI("%s : deferring", __func__);
-        mPreviewStartDeferred = true;
-        mPreviewLock.unlock();
-        return NO_ERROR;
-    }
-
-    ret = startPreviewInternal();
-    if (ret == OK)
-        mPreviewCondition.signal();
-
-    mPreviewLock.unlock();
-    return ret;
-}
-
-status_t CameraHardwareSec::startPreviewInternal()
-{
-    ALOGV("%s", __func__);
-    int width, height, frame_size;
-
-    mSecCamera->getPreviewSize(&width, &height, &frame_size);
-    ALOGD("mPreviewHeap(fd(%d), size(%d), width(%d), height(%d))",
-         mSecCamera->getCameraFd(), frame_size + mFrameSizeDelta, width, height);
-
-    void *vaddr[3];
-
-    for (int i = 0; i < MAX_BUFFERS; i++) {
-        !mGrallocHal->lock(mGrallocHal,
-                           *mBufferHandle[i],
-                           GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_YUV_ADDR,
-                           0, 0, width, height, vaddr);
-        memset(vaddr[0], 0, width*height*2);
-        int m_Ywidth = ALIGN(width, 16);
-        int m_Yheight = ALIGN(height, 16);
-        int m_UVwidth = ALIGN(width/2, 8);
-        int m_UVheight = ALIGN(height/2, 8);
-        vaddr[1] = vaddr[0] + (m_Ywidth * m_Yheight);
-        vaddr[2] = vaddr[1] + (m_UVwidth * m_UVheight);
-        mSecCamera->setUserBufferAddr(vaddr, i, PREVIEW_MODE);
-    }
-
-    int ret  = mSecCamera->startPreview();
-    ALOGV("%s : mSecCamera->startPreview() returned %d", __func__, ret);
-
-    if (ret < 0) {
-        ALOGE("ERR(%s):Fail on mSecCamera->startPreview()", __func__);
-        return UNKNOWN_ERROR;
-    }
-
-    setSkipFrame(INITIAL_SKIP_FRAME);
-
-    if (mPreviewHeap) {
-        mPreviewHeap->release(mPreviewHeap);
-        mPreviewHeap = 0;
-    }
-
-    mSecCamera->getPostViewConfig(&mPostViewWidth, &mPostViewHeight, &mPostViewSize);
-    ALOGV("CameraHardwareSec: mPostViewWidth = %d mPostViewHeight = %d mPostViewSize = %d",
-         mPostViewWidth,mPostViewHeight,mPostViewSize);
-
-    return NO_ERROR;
-}
-
-void CameraHardwareSec::stopPreviewInternal()
-{
-    ALOGV("%s :", __func__);
-
-    /* request that the preview thread stop. */
-    if (mPreviewRunning) {
-        mPreviewRunning = false;
-        if (!mPreviewStartDeferred) {
-            mPreviewCondition.signal();
-            /* wait until preview thread is stopped */
-            mPreviewStoppedCondition.wait(mPreviewLock);
-
-            for (int i = 0; i < MAX_BUFFERS; i++) {
-                if (0 != mPreviewWindow->enqueue_buffer(mPreviewWindow, mBufferHandle[i]))
-                    ALOGE("%s: Fail to enqueue buffer[%d]", __func__, i);
-            }
-        }
-        else
-            ALOGV("%s : preview running but deferred, doing nothing", __func__);
-    } else
-        ALOGI("%s : preview not running, doing nothing", __func__);
-}
-
-void CameraHardwareSec::stopPreview()
-{
-    ALOGV("%s :", __func__);
-
-    /* request that the preview thread stop. */
-    mPreviewLock.lock();
-    stopPreviewInternal();
-    mPreviewLock.unlock();
-}
-
-bool CameraHardwareSec::previewEnabled()
-{
-    Mutex::Autolock lock(mPreviewLock);
-    ALOGV("%s : %d", __func__, mPreviewRunning);
-    return mPreviewRunning;
-}
-
-status_t CameraHardwareSec::startRecording()
-{
-    ALOGV("%s :", __func__);
-
-    Mutex::Autolock lock(mRecordLock);
-
-    for(int i = 0; i<BUFFER_COUNT_FOR_ARRAY; i++){
-        if (mRecordHeap[i] != NULL) {
-            mRecordHeap[i]->release(mRecordHeap[i]);
-            mRecordHeap[i] = 0;
-        }
-
-        int width, height;
-
-        mSecCamera->getRecordingSize(&width, &height);
-        mRecordHeap[i] = mGetMemoryCb(-1, (ALIGN((ALIGN(width, 16) * ALIGN(height, 16)), 2048)
-	                   + ALIGN((ALIGN(width, 16) * ALIGN(height >> 1, 8)), 2048)), 1, NULL);
-        mSecCamera->setUserBufferAddr((void *)(mRecordHeap[i]->data), i, RECORD_MODE);
-        if (!mRecordHeap[i]) {
-            ALOGE("ERR(%s): Record heap[%d] creation fail", __func__, i);
-            return UNKNOWN_ERROR;
-        }
-    }
-
-    ALOGV("mRecordHeaps alloc done");
-
-    if (mRecordRunning == false) {
-        if (mSecCamera->startRecord() < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->startRecord()", __func__);
-            return UNKNOWN_ERROR;
-        }
-        mRecordRunning = true;
-    }
-    return NO_ERROR;
-}
-
-void CameraHardwareSec::stopRecording()
-{
-    ALOGV("%s :", __func__);
-
-    Mutex::Autolock lock(mRecordLock);
-
-    if (mRecordRunning == true) {
-        if (mSecCamera->stopRecord() < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->stopRecord()", __func__);
-            return;
-        }
-        mRecordRunning = false;
-    }
-}
-
-bool CameraHardwareSec::recordingEnabled()
-{
-    ALOGV("%s :", __func__);
-    ALOGV("%s : %d", __func__, mPreviewRunning);
-
-    return mRecordRunning;
-}
-
-void CameraHardwareSec::releaseRecordingFrame(const void *opaque)
-{
-    int i;
-    for (i = 0; i < MAX_BUFFERS; i++)
-        if ((char *)mRecordHeap[i]->data == (char *)opaque)
-            break;
-
-    mSecCamera->releaseRecordFrame(i);
-}
-
-int CameraHardwareSec::autoFocusThread()
-{
-    int count =0;
-    int af_status =0 ;
-
-    ALOGV("%s : starting", __func__);
-
-
-    /* block until we're told to start.  we don't want to use
-     * a restartable thread and requestExitAndWait() in cancelAutoFocus()
-     * because it would cause deadlock between our callbacks and the
-     * caller of cancelAutoFocus() which both want to grab the same lock
-     * in CameraServices layer.
-     */
-    mFocusLock.lock();
-    /* check early exit request */
-    if (mExitAutoFocusThread) {
-        mFocusLock.unlock();
-        ALOGV("%s : exiting on request0", __func__);
-        return NO_ERROR;
-    }
-    mFocusCondition.wait(mFocusLock);
-    /* check early exit request */
-    if (mExitAutoFocusThread) {
-        mFocusLock.unlock();
-        ALOGV("%s : exiting on request1", __func__);
-        return NO_ERROR;
-    }
-    mFocusLock.unlock();
-
-#ifdef GAIA_FW_BETA
-    if (mMsgEnabled & CAMERA_MSG_FOCUS)
-        mNotifyCb(CAMERA_MSG_FOCUS, false, 0, mCallbackCookie);
-
-    //ALOGV("%s : exiting with no error", __func__);
-    return NO_ERROR;
-#else
-
-#ifdef AF_SUPPORT
-    ALOGV("%s : calling setAutoFocus", __func__);
-    if (mSecCamera->setAutofocus() < 0) {
-        ALOGE("ERR(%s):Fail on mSecCamera->setAutofocus()", __func__);
-        return UNKNOWN_ERROR;
-    }
-
-    af_status = mSecCamera->getAutoFocusResult();
-#else
-    sleep(1);
-    af_status = 0x02;
-#endif
-
-    if (af_status == 0x01) {
-        ALOGV("%s : AF Success!!", __func__);
-        if (mMsgEnabled & CAMERA_MSG_FOCUS)
-            mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie);
-    } else if (af_status == 0x02) {
-        ALOGV("%s : AF Cancelled !!", __func__);
-        if (mMsgEnabled & CAMERA_MSG_FOCUS) {
-            /* CAMERA_MSG_FOCUS only takes a bool.  true for
-             * finished and false for failure.  cancel is still
-             * considered a true result.
-             */
-            mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie);
-        }
-    } else {
-        ALOGV("%s : AF Fail !!", __func__);
-        ALOGV("%s : mMsgEnabled = 0x%x", __func__, mMsgEnabled);
-        if (mMsgEnabled & CAMERA_MSG_FOCUS)
-            mNotifyCb(CAMERA_MSG_FOCUS, false, 0, mCallbackCookie);
-    }
-
-    ALOGV("%s : exiting with no error", __func__);
-    return NO_ERROR;
-#endif
-}
-
-status_t CameraHardwareSec::autoFocus()
-{
-    ALOGV("%s :", __func__);
-    /* signal autoFocusThread to run once */
-    mFocusCondition.signal();
-    return NO_ERROR;
-}
-
-status_t CameraHardwareSec::cancelAutoFocus()
-{
-    ALOGV("%s :", __func__);
-#ifndef GAIA_FW_BETA
-
-    if (mSecCamera->cancelAutofocus() < 0) {
-        ALOGE("ERR(%s):Fail on mSecCamera->cancelAutofocus()", __func__);
-        return UNKNOWN_ERROR;
-    }
-#endif
-    return NO_ERROR;
-}
-
-int CameraHardwareSec::save_jpeg( unsigned char *real_jpeg, int jpeg_size)
-{
-    FILE *yuv_fp = NULL;
-    char filename[100], *buffer = NULL;
-
-    /* file create/open, note to "wb" */
-    yuv_fp = fopen("/data/camera_dump.jpeg", "wb");
-    if (yuv_fp == NULL) {
-        ALOGE("Save jpeg file open error");
-        return -1;
-    }
-
-    ALOGV("[BestIQ]  real_jpeg size ========>  %d", jpeg_size);
-    buffer = (char *) malloc(jpeg_size);
-    if (buffer == NULL) {
-        ALOGE("Save YUV] buffer alloc failed");
-        if (yuv_fp)
-            fclose(yuv_fp);
-
-        return -1;
-    }
-
-    memcpy(buffer, real_jpeg, jpeg_size);
-
-    fflush(stdout);
-
-    fwrite(buffer, 1, jpeg_size, yuv_fp);
-
-    fflush(yuv_fp);
-
-    if (yuv_fp)
-            fclose(yuv_fp);
-    if (buffer)
-            free(buffer);
-
-    return 0;
-}
-
-void CameraHardwareSec::save_postview(const char *fname, uint8_t *buf, uint32_t size)
-{
-    int nw;
-    int cnt = 0;
-    uint32_t written = 0;
-
-    ALOGD("opening file [%s]", fname);
-    int fd = open(fname, O_RDWR | O_CREAT);
-    if (fd < 0) {
-        ALOGE("failed to create file [%s]: %s", fname, strerror(errno));
-        return;
-    }
-
-    ALOGD("writing %d bytes to file [%s]", size, fname);
-    while (written < size) {
-        nw = ::write(fd, buf + written, size - written);
-        if (nw < 0) {
-            ALOGE("failed to write to file %d [%s]: %s",written,fname, strerror(errno));
-            break;
-        }
-        written += nw;
-        cnt++;
-    }
-    ALOGD("done writing %d bytes to file [%s] in %d passes",size, fname, cnt);
-    ::close(fd);
-}
-
-bool CameraHardwareSec::scaleDownYuv422(char *srcBuf, uint32_t srcWidth, uint32_t srcHeight,
-                                        char *dstBuf, uint32_t dstWidth, uint32_t dstHeight)
-{
-    int32_t step_x, step_y;
-    int32_t iXsrc, iXdst;
-    int32_t x, y, src_y_start_pos, dst_pos, src_pos;
-
-    if (dstWidth % 2 != 0 || dstHeight % 2 != 0) {
-        ALOGE("scale_down_yuv422: invalid width, height for scaling");
-        return false;
-    }
-
-    step_x = srcWidth / dstWidth;
-    step_y = srcHeight / dstHeight;
-
-    dst_pos = 0;
-    for (uint32_t y = 0; y < dstHeight; y++) {
-        src_y_start_pos = (y * step_y * (srcWidth * 2));
-
-        for (uint32_t x = 0; x < dstWidth; x += 2) {
-            src_pos = src_y_start_pos + (x * (step_x * 2));
-
-            dstBuf[dst_pos++] = srcBuf[src_pos    ];
-            dstBuf[dst_pos++] = srcBuf[src_pos + 1];
-            dstBuf[dst_pos++] = srcBuf[src_pos + 2];
-            dstBuf[dst_pos++] = srcBuf[src_pos + 3];
-        }
-    }
-
-    return true;
-}
-
-bool CameraHardwareSec::YUY2toNV21(void *srcBuf, void *dstBuf, uint32_t srcWidth, uint32_t srcHeight)
-{
-    int32_t        x, y, src_y_start_pos, dst_cbcr_pos, dst_pos, src_pos;
-    unsigned char *srcBufPointer = (unsigned char *)srcBuf;
-    unsigned char *dstBufPointer = (unsigned char *)dstBuf;
-
-    dst_pos = 0;
-    dst_cbcr_pos = srcWidth*srcHeight;
-    for (uint32_t y = 0; y < srcHeight; y++) {
-        src_y_start_pos = (y * (srcWidth * 2));
-
-        for (uint32_t x = 0; x < (srcWidth * 2); x += 2) {
-            src_pos = src_y_start_pos + x;
-
-            dstBufPointer[dst_pos++] = srcBufPointer[src_pos];
-        }
-    }
-    for (uint32_t y = 0; y < srcHeight; y += 2) {
-        src_y_start_pos = (y * (srcWidth * 2));
-
-        for (uint32_t x = 0; x < (srcWidth * 2); x += 4) {
-            src_pos = src_y_start_pos + x;
-
-            dstBufPointer[dst_cbcr_pos++] = srcBufPointer[src_pos + 3];
-            dstBufPointer[dst_cbcr_pos++] = srcBufPointer[src_pos + 1];
-        }
-    }
-
-    return true;
-}
-
-int CameraHardwareSec::pictureThread()
-{
-    ALOGV("%s :", __func__);
-
-    int jpeg_size = 0;
-    int ret = NO_ERROR;
-    unsigned char *jpeg_data = NULL;
-    int postview_offset = 0;
-    unsigned char *postview_data = NULL;
-
-    unsigned char *addr = NULL;
-    int mPostViewWidth, mPostViewHeight, mPostViewSize;
-    int mThumbWidth, mThumbHeight, mThumbSize;
-    int cap_width, cap_height, cap_frame_size;
-
-    unsigned int output_size = 0;
-
-    mSecCamera->getPostViewConfig(&mPostViewWidth, &mPostViewHeight, &mPostViewSize);
-    mSecCamera->getThumbnailConfig(&mThumbWidth, &mThumbHeight, &mThumbSize);
-    int postviewHeapSize = mPostViewSize;
-    mSecCamera->getSnapshotSize(&cap_width, &cap_height, &cap_frame_size);
-    int mJpegHeapSize;
-#ifdef JPEG_FROM_SENSOR
-    if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK)
-        mJpegHeapSize = cap_frame_size * SecCamera::getJpegRatio();
-    else
-#endif
-        mJpegHeapSize = cap_frame_size;
-
-    //sp<MemoryBase> buffer = new MemoryBase(mRawHeap, 0, mPostViewSize + 8);
-
-    ALOGV("[5B] mPostViewWidth = %d mPostViewHeight = %d\n",mPostViewWidth,mPostViewHeight);
-
-    camera_memory_t *JpegHeap = mGetMemoryCb(-1, mJpegHeapSize, 1, 0);
-#ifndef GAIA_FW_BETA
-    sp<MemoryHeapBase> PostviewHeap = new MemoryHeapBaseIon(mPostViewSize);
-    sp<MemoryHeapBase> ThumbnailHeap = new MemoryHeapBaseIon(mThumbSize);
-#else
-    sp<MemoryHeapBase> PostviewHeap = new MemoryHeapBase(mPostViewSize);
-    sp<MemoryHeapBase> ThumbnailHeap = new MemoryHeapBase(mThumbSize);
-#endif
-
-    if (mMsgEnabled & CAMERA_MSG_RAW_IMAGE) {
-        int picture_size, picture_width, picture_height;
-        mSecCamera->getSnapshotSize(&picture_width, &picture_height, &picture_size);
-        int picture_format = mSecCamera->getSnapshotPixelFormat();
-
-        unsigned int phyAddr;
-
-        // Modified the shutter sound timing for Jpeg capture
-#ifdef JPEG_FROM_SENSOR
-        if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK)
-            mSecCamera->setSnapshotCmd();
-        if (mMsgEnabled & CAMERA_MSG_SHUTTER)
-            mNotifyCb(CAMERA_MSG_SHUTTER, 0, 0, mCallbackCookie);
-        if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK){
-            jpeg_data = mSecCamera->getJpeg(&jpeg_size, &phyAddr);
-            if (jpeg_data == NULL) {
-                ALOGE("ERR(%s):Fail on SecCamera->getSnapshot()", __func__);
-                ret = UNKNOWN_ERROR;
-            }
-        } else {
-#endif
-            if (mMsgEnabled & CAMERA_MSG_SHUTTER)
-                mNotifyCb(CAMERA_MSG_SHUTTER, 0, 0, mCallbackCookie);
-            if (mSecCamera->getSnapshotAndJpeg((unsigned char*)PostviewHeap->base(),
-                    (unsigned char*)JpegHeap->data, &output_size) < 0) {
-                mStateLock.lock();
-                mCaptureInProgress = false;
-                mStateLock.unlock();
-                JpegHeap->release(JpegHeap);
-                return UNKNOWN_ERROR;
-            }
-            ALOGI("snapshotandjpeg done");
-#ifdef JPEG_FROM_SENSOR
-        }
-#endif
-    }
-
-    int JpegImageSize, JpegExifSize;
-    bool isLSISensor = false;
-
-#ifdef JPEG_FROM_SENSOR
-    if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK) {
-        ALOGV("%s, %s", __func__, (const char*)mCameraSensorName);   //to check sensor name
-        isLSISensor = !strncmp((const char*)mCameraSensorName, "S5K4ECGX", 8);
-        if (isLSISensor) {
-            ALOGI("== Camera Sensor Detect %s - Samsung LSI SOC 5M ==", mCameraSensorName);
-            // LSI 5M SOC
-            if (!SplitFrame(jpeg_data, SecCamera::getInterleaveDataSize(),
-                            SecCamera::getJpegLineLength(),
-                            mPostViewWidth * 2, mPostViewWidth,
-                            JpegHeap->data, &JpegImageSize,
-                            PostviewHeap->base(), &mPostViewSize)) {
-                JpegHeap->release(JpegHeap);
-                return UNKNOWN_ERROR;
-            }
-        } else {
-            ALOGI("== Camera Sensor Detect %s Sony SOC 5M ==", mCameraSensorName);
-            decodeInterleaveData(jpeg_data,
-                                 SecCamera::getInterleaveDataSize(),
-                                 mPostViewWidth, mPostViewHeight,
-                                 &JpegImageSize, JpegHeap->data, PostviewHeap->base());
-        }
-    } else
-#endif
-        JpegImageSize = static_cast<int>(output_size);
-
-    scaleDownYuv422((char *)mSecCamera->getPictureVaddr(), mPostViewWidth, mPostViewHeight,
-                    (char *)ThumbnailHeap->base(), mThumbWidth, mThumbHeight);
-
-#ifdef GAIA_FW_BETA
-    int rawHeapSize = mPostViewSize;
-    ALOGV("mRawHeap : MemoryHeapBase(previewHeapSize(%d))", rawHeapSize);
-    mRawHeap = mGetMemoryCb((int)mSecCamera->getCameraFd(), rawHeapSize, 1, 0);
-    if (!mRawHeap)
-        ALOGE("ERR(%s): Raw heap creation fail", __func__);
-
-    if (mMsgEnabled & CAMERA_MSG_RAW_IMAGE)
-        mDataCb(CAMERA_MSG_RAW_IMAGE, mRawHeap, 0, NULL, mCallbackCookie);
-#endif
-
-    mStateLock.lock();
-    mCaptureInProgress = false;
-    mStateLock.unlock();
-
-    if (mMsgEnabled & CAMERA_MSG_COMPRESSED_IMAGE) {
-        camera_memory_t *ExifHeap =
-            mGetMemoryCb(-1, EXIF_FILE_SIZE + mThumbSize, 1, 0);
-
-        JpegExifSize = mSecCamera->getExif((unsigned char *)ExifHeap->data,
-                                           (unsigned char *)ThumbnailHeap->base());
-        ALOGV("JpegExifSize=%d", JpegExifSize);
-
-        if (JpegExifSize < 0) {
-            ret = UNKNOWN_ERROR;
-            goto out;
-        }
-
-        int mJpegHeapSize_out = JpegImageSize + JpegExifSize;
-        camera_memory_t *JpegHeap_out = mGetMemoryCb(-1, mJpegHeapSize_out, 1, 0);
-
-        unsigned char *ExifStart = (unsigned char *)JpegHeap_out->data + 2;
-        unsigned char *ImageStart = ExifStart + JpegExifSize;
-
-        memcpy(JpegHeap_out->data, JpegHeap->data, 2);
-        memcpy(ExifStart, ExifHeap->data, JpegExifSize);
-        memcpy(ImageStart, JpegHeap->data + 2, JpegImageSize - 2);
-
-        mDataCb(CAMERA_MSG_COMPRESSED_IMAGE, JpegHeap_out, 0, NULL, mCallbackCookie);
-
-        if (ExifHeap) {
-            ExifHeap->release(ExifHeap);
-            ExifHeap = 0;
-        }
-
-        if (JpegHeap_out) {
-            JpegHeap_out->release(JpegHeap_out);
-            JpegHeap_out = 0;
-        }
-    }
-
-    ALOGV("%s : pictureThread end", __func__);
-
-out:
-    if (JpegHeap) {
-        JpegHeap->release(JpegHeap);
-        JpegHeap = 0;
-    }
-
-    if (mRawHeap) {
-        mRawHeap->release(mRawHeap);
-        mRawHeap = 0;
-    }
-
-    return ret;
-}
-
-status_t CameraHardwareSec::takePicture()
-{
-    ALOGV("%s :", __func__);
-
-    stopPreview();
-
-    Mutex::Autolock lock(mStateLock);
-    if (mCaptureInProgress) {
-        ALOGE("%s : capture already in progress", __func__);
-        return INVALID_OPERATION;
-    }
-
-    if (mPictureThread->run("CameraPictureThread", PRIORITY_DEFAULT) != NO_ERROR) {
-        ALOGE("%s : couldn't run picture thread", __func__);
-        return INVALID_OPERATION;
-    }
-    mCaptureInProgress = true;
-
-    return NO_ERROR;
-}
-
-status_t CameraHardwareSec::cancelPicture()
-{
-    ALOGV("%s", __func__);
-
-    if (mPictureThread.get()) {
-        ALOGV("%s: waiting for picture thread to exit", __func__);
-        mPictureThread->requestExitAndWait();
-        ALOGV("%s: picture thread has exited", __func__);
-    }
-
-    return NO_ERROR;
-}
-
-bool CameraHardwareSec::CheckVideoStartMarker(unsigned char *pBuf)
-{
-    if (!pBuf) {
-        ALOGE("CheckVideoStartMarker() => pBuf is NULL");
-        return false;
-    }
-
-    if (HIBYTE(VIDEO_COMMENT_MARKER_H) == * pBuf      && LOBYTE(VIDEO_COMMENT_MARKER_H) == *(pBuf + 1) &&
-        HIBYTE(VIDEO_COMMENT_MARKER_L) == *(pBuf + 2) && LOBYTE(VIDEO_COMMENT_MARKER_L) == *(pBuf + 3))
-        return true;
-
-    return false;
-}
-
-bool CameraHardwareSec::CheckEOIMarker(unsigned char *pBuf)
-{
-    if (!pBuf) {
-        ALOGE("CheckEOIMarker() => pBuf is NULL");
-        return false;
-    }
-
-    // EOI marker [FF D9]
-    if (HIBYTE(JPEG_EOI_MARKER) == *pBuf && LOBYTE(JPEG_EOI_MARKER) == *(pBuf + 1))
-        return true;
-
-    return false;
-}
-
-bool CameraHardwareSec::FindEOIMarkerInJPEG(unsigned char *pBuf, int dwBufSize, int *pnJPEGsize)
-{
-    if (NULL == pBuf || 0 >= dwBufSize) {
-        ALOGE("FindEOIMarkerInJPEG() => There is no contents.");
-        return false;
-    }
-
-    unsigned char *pBufEnd = pBuf + dwBufSize;
-
-    while (pBuf < pBufEnd) {
-        if (CheckEOIMarker(pBuf++))
-            return true;
-
-        (*pnJPEGsize)++;
-    }
-
-    return false;
-}
-
-bool CameraHardwareSec::SplitFrame(unsigned char *pFrame, int dwSize,
-                    int dwJPEGLineLength, int dwVideoLineLength, int dwVideoHeight,
-                    void *pJPEG, int *pdwJPEGSize,
-                    void *pVideo, int *pdwVideoSize)
-{
-    ALOGV("===========SplitFrame Start==============");
-
-    if (NULL == pFrame || 0 >= dwSize) {
-        ALOGE("There is no contents (pFrame=%p, dwSize=%d", pFrame, dwSize);
-        return false;
-    }
-
-    if (0 == dwJPEGLineLength || 0 == dwVideoLineLength) {
-        ALOGE("There in no input information for decoding interleaved jpeg");
-        return false;
-    }
-
-    unsigned char *pSrc = pFrame;
-    unsigned char *pSrcEnd = pFrame + dwSize;
-
-    unsigned char *pJ = (unsigned char *)pJPEG;
-    int dwJSize = 0;
-    unsigned char *pV = (unsigned char *)pVideo;
-    int dwVSize = 0;
-
-    bool bRet = false;
-    bool isFinishJpeg = false;
-
-    while (pSrc < pSrcEnd) {
-        // Check video start marker
-        if (CheckVideoStartMarker(pSrc)) {
-            int copyLength;
-
-            if (pSrc + dwVideoLineLength <= pSrcEnd)
-                copyLength = dwVideoLineLength;
-            else
-                copyLength = pSrcEnd - pSrc - VIDEO_COMMENT_MARKER_LENGTH;
-
-            // Copy video data
-            if (pV) {
-                memcpy(pV, pSrc + VIDEO_COMMENT_MARKER_LENGTH, copyLength);
-                pV += copyLength;
-                dwVSize += copyLength;
-            }
-
-            pSrc += copyLength + VIDEO_COMMENT_MARKER_LENGTH;
-        } else {
-            // Copy pure JPEG data
-            int size = 0;
-            int dwCopyBufLen = dwJPEGLineLength <= pSrcEnd-pSrc ? dwJPEGLineLength : pSrcEnd - pSrc;
-
-            if (FindEOIMarkerInJPEG((unsigned char *)pSrc, dwCopyBufLen, &size)) {
-                isFinishJpeg = true;
-                size += 2;  // to count EOF marker size
-            } else {
-                if ((dwCopyBufLen == 1) && (pJPEG < pJ)) {
-                    unsigned char checkBuf[2] = { *(pJ - 1), *pSrc };
-
-                    if (CheckEOIMarker(checkBuf))
-                        isFinishJpeg = true;
-                }
-                size = dwCopyBufLen;
-            }
-
-            memcpy(pJ, pSrc, size);
-
-            dwJSize += size;
-
-            pJ += dwCopyBufLen;
-            pSrc += dwCopyBufLen;
-        }
-        if (isFinishJpeg)
-            break;
-    }
-
-    if (isFinishJpeg) {
-        bRet = true;
-        if (pdwJPEGSize)
-            *pdwJPEGSize = dwJSize;
-        if (pdwVideoSize)
-            *pdwVideoSize = dwVSize;
-    } else {
-        ALOGE("DecodeInterleaveJPEG_WithOutDT() => Can not find EOI");
-        bRet = false;
-        if (pdwJPEGSize)
-            *pdwJPEGSize = 0;
-        if (pdwVideoSize)
-            *pdwVideoSize = 0;
-    }
-    ALOGV("===========SplitFrame end==============");
-
-    return bRet;
-}
-
-int CameraHardwareSec::decodeInterleaveData(unsigned char *pInterleaveData,
-                                                 int interleaveDataSize,
-                                                 int yuvWidth,
-                                                 int yuvHeight,
-                                                 int *pJpegSize,
-                                                 void *pJpegData,
-                                                 void *pYuvData)
-{
-    if (pInterleaveData == NULL)
-        return false;
-
-    bool ret = true;
-    unsigned int *interleave_ptr = (unsigned int *)pInterleaveData;
-    unsigned char *jpeg_ptr = (unsigned char *)pJpegData;
-    unsigned char *yuv_ptr = (unsigned char *)pYuvData;
-    unsigned char *p;
-    int jpeg_size = 0;
-    int yuv_size = 0;
-
-    int i = 0;
-
-    ALOGV("decodeInterleaveData Start~~~");
-    while (i < interleaveDataSize) {
-        if ((*interleave_ptr == 0xFFFFFFFF) || (*interleave_ptr == 0x02FFFFFF) ||
-                (*interleave_ptr == 0xFF02FFFF)) {
-            // Padding Data
-            interleave_ptr++;
-            i += 4;
-        } else if ((*interleave_ptr & 0xFFFF) == 0x05FF) {
-            // Start-code of YUV Data
-            p = (unsigned char *)interleave_ptr;
-            p += 2;
-            i += 2;
-
-            // Extract YUV Data
-            if (pYuvData != NULL) {
-                memcpy(yuv_ptr, p, yuvWidth * 2);
-                yuv_ptr += yuvWidth * 2;
-                yuv_size += yuvWidth * 2;
-            }
-            p += yuvWidth * 2;
-            i += yuvWidth * 2;
-
-            // Check End-code of YUV Data
-            if ((*p == 0xFF) && (*(p + 1) == 0x06)) {
-                interleave_ptr = (unsigned int *)(p + 2);
-                i += 2;
-            } else {
-                ret = false;
-                break;
-            }
-        } else {
-            // Extract JPEG Data
-            if (pJpegData != NULL) {
-                memcpy(jpeg_ptr, interleave_ptr, 4);
-                jpeg_ptr += 4;
-                jpeg_size += 4;
-            }
-            interleave_ptr++;
-            i += 4;
-        }
-    }
-    if (ret) {
-        if (pJpegData != NULL) {
-            // Remove Padding after EOI
-            for (i = 0; i < 3; i++) {
-                if (*(--jpeg_ptr) != 0xFF) {
-                    break;
-                }
-                jpeg_size--;
-            }
-            *pJpegSize = jpeg_size;
-
-        }
-        // Check YUV Data Size
-        if (pYuvData != NULL) {
-            if (yuv_size != (yuvWidth * yuvHeight * 2)) {
-                ret = false;
-            }
-        }
-    }
-    ALOGV("decodeInterleaveData End~~~");
-    return ret;
-}
-
-status_t CameraHardwareSec::dump(int fd) const
-{
-    const size_t SIZE = 256;
-    char buffer[SIZE];
-    String8 result;
-    const Vector<String16> args;
-
-    if (mSecCamera != 0) {
-        mSecCamera->dump(fd);
-        mParameters.dump(fd, args);
-        mInternalParameters.dump(fd, args);
-        snprintf(buffer, 255, " preview running(%s)\n", mPreviewRunning?"true": "false");
-        result.append(buffer);
-    } else
-        result.append("No camera client yet.\n");
-    write(fd, result.string(), result.size());
-    return NO_ERROR;
-}
-
-bool CameraHardwareSec::isSupportedPreviewSize(const int width,
-                                               const int height) const
-{
-    unsigned int i;
-
-    for (i = 0; i < mSupportedPreviewSizes.size(); i++) {
-        if (mSupportedPreviewSizes[i].width == width &&
-                mSupportedPreviewSizes[i].height == height)
-            return true;
-    }
-
-    return false;
-}
-
-status_t CameraHardwareSec::setParameters(const CameraParameters& params)
-{
-    ALOGV("%s :", __func__);
-#ifndef GAIA_FW_BETA
-    int Internal_is = !strncmp((const char*)mSecCamera->getCameraSensorName(), "ISP Camera", 10);
-#else
-    int Internal_is = 0;
-#endif
-    status_t ret = NO_ERROR;
-
-    /* if someone calls us while picture thread is running, it could screw
-     * up the sensor quite a bit so return error.  we can't wait because
-     * that would cause deadlock with the callbacks
-     */
-    mStateLock.lock();
-    if (mCaptureInProgress) {
-        mStateLock.unlock();
-        ALOGE("%s : capture in progress, not allowed", __func__);
-        return UNKNOWN_ERROR;
-    }
-    mStateLock.unlock();
-
-    // preview size
-#ifdef GAIA_FW_BETA
-    int new_preview_width  = 1920;
-    int new_preview_height = 1080;
-#else
-    int new_preview_width  = 0;
-    int new_preview_height = 0;
-    params.getPreviewSize(&new_preview_width, &new_preview_height);
-#endif
-    const char *new_str_preview_format = params.getPreviewFormat();
-    ALOGV("%s : new_preview_width x new_preview_height = %dx%d, format = %s",
-         __func__, new_preview_width, new_preview_height, new_str_preview_format);
-
-    if (0 < new_preview_width && 0 < new_preview_height &&
-            new_str_preview_format != NULL &&
-            isSupportedPreviewSize(new_preview_width, new_preview_height)) {
-        int new_preview_format = 0;
-
-        mFrameSizeDelta = 16;
-        if (!strcmp(new_str_preview_format,
-                    CameraParameters::PIXEL_FORMAT_RGB565)) {
-            new_preview_format = V4L2_PIX_FMT_RGB565;
-            mFrameSizeDelta = 0;
-        }
-        else if (!strcmp(new_str_preview_format,
-                         CameraParameters::PIXEL_FORMAT_RGBA8888)) {
-            new_preview_format = V4L2_PIX_FMT_RGB32;
-            mFrameSizeDelta = 0;
-        }
-        else if (!strcmp(new_str_preview_format,
-                         CameraParameters::PIXEL_FORMAT_YUV420SP))
-            new_preview_format = V4L2_PIX_FMT_NV21;
-        else if (!strcmp(new_str_preview_format,
-                         CameraParameters::PIXEL_FORMAT_YUV420P))
-            new_preview_format = V4L2_PIX_FMT_YVU420M;
-
-        else if (!strcmp(new_str_preview_format, "yuv420sp_custom"))
-            new_preview_format = V4L2_PIX_FMT_NV12T;
-        else if (!strcmp(new_str_preview_format, "yuv422i"))
-            new_preview_format = V4L2_PIX_FMT_YUYV;
-        else if (!strcmp(new_str_preview_format, "yuv422p"))
-            new_preview_format = V4L2_PIX_FMT_YUV422P;
-        else
-            new_preview_format = V4L2_PIX_FMT_NV21; //for 3rd party
-
-        int current_preview_width, current_preview_height, current_frame_size;
-        mSecCamera->getPreviewSize(&current_preview_width,
-                                   &current_preview_height,
-                                   &current_frame_size);
-        int current_pixel_format = mSecCamera->getPreviewPixelFormat();
-
-        if (current_preview_width != new_preview_width ||
-                    current_preview_height != new_preview_height ||
-                    current_pixel_format != new_preview_format) {
-            if (mSecCamera->setPreviewSize(new_preview_width, new_preview_height,
-                                           new_preview_format) < 0) {
-                ALOGE("ERR(%s):Fail on mSecCamera->setPreviewSize(width(%d), height(%d), format(%d))",
-                     __func__, new_preview_width, new_preview_height, new_preview_format);
-                ret = UNKNOWN_ERROR;
-            } else {
-                if (mPreviewWindow) {
-                    if (mPreviewRunning && !mPreviewStartDeferred) {
-                        ALOGE("ERR(%s): preview is running, cannot change size and format!",
-                        __func__);
-                        ret = INVALID_OPERATION;
-                    }
-
-                    ALOGV("%s: mPreviewWindow (%p) set_buffers_geometry", __func__, mPreviewWindow);
-                    ALOGV("%s: mPreviewWindow->set_buffers_geometry (%p)", __func__,
-                         mPreviewWindow->set_buffers_geometry);
-                    mPreviewWindow->set_buffers_geometry(mPreviewWindow,
-                                                         new_preview_width, new_preview_height,
-                                                         new_preview_format);
-                    ALOGV("%s: DONE mPreviewWindow (%p) set_buffers_geometry", __func__, mPreviewWindow);
-                }
-                mParameters.setPreviewSize(new_preview_width, new_preview_height);
-                mParameters.setPreviewFormat(new_str_preview_format);
-            }
-        }
-        else ALOGV("%s: preview size and format has not changed", __func__);
-    } else {
-        ALOGE("%s: Invalid preview size(%dx%d)",
-                __func__, new_preview_width, new_preview_height);
-
-        ret = INVALID_OPERATION;
-    }
-
-#ifndef GAIA_FW_BETA
-    int new_picture_width  = 0;
-    int new_picture_height = 0;
-
-    params.getPictureSize(&new_picture_width, &new_picture_height);
-    ALOGV("%s : new_picture_width x new_picture_height = %dx%d", __func__, new_picture_width, new_picture_height);
-    if (0 < new_picture_width && 0 < new_picture_height) {
-        ALOGV("%s: setSnapshotSize", __func__);
-        if (mSecCamera->setSnapshotSize(new_picture_width, new_picture_height) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setSnapshotSize(width(%d), height(%d))",
-                    __func__, new_picture_width, new_picture_height);
-            ret = UNKNOWN_ERROR;
-        } else
-            mParameters.setPictureSize(new_picture_width, new_picture_height);
-    }
-
-    // picture format
-    const char *new_str_picture_format = params.getPictureFormat();
-    ALOGV("%s : new_str_picture_format %s", __func__, new_str_picture_format);
-    if (new_str_picture_format != NULL) {
-        int new_picture_format = 0;
-
-        if (!strcmp(new_str_picture_format, CameraParameters::PIXEL_FORMAT_RGB565))
-            new_picture_format = V4L2_PIX_FMT_RGB565;
-        else if (!strcmp(new_str_picture_format, CameraParameters::PIXEL_FORMAT_RGBA8888))
-            new_picture_format = V4L2_PIX_FMT_RGB32;
-        else if (!strcmp(new_str_picture_format, CameraParameters::PIXEL_FORMAT_YUV420SP))
-            new_picture_format = V4L2_PIX_FMT_NV21;
-        else if (!strcmp(new_str_picture_format, "yuv420sp_custom"))
-            new_picture_format = V4L2_PIX_FMT_NV12T;
-        else if (!strcmp(new_str_picture_format, "yuv420p"))
-            new_picture_format = V4L2_PIX_FMT_YUV420;
-        else if (!strcmp(new_str_picture_format, "yuv422i"))
-            new_picture_format = V4L2_PIX_FMT_YUYV;
-        else if (!strcmp(new_str_picture_format, "uyv422i_custom")) //Zero copy UYVY format
-            new_picture_format = V4L2_PIX_FMT_UYVY;
-        else if (!strcmp(new_str_picture_format, "uyv422i")) //Non-zero copy UYVY format
-            new_picture_format = V4L2_PIX_FMT_UYVY;
-        else if (!strcmp(new_str_picture_format, CameraParameters::PIXEL_FORMAT_JPEG))
-            new_picture_format = V4L2_PIX_FMT_YUYV;
-        else if (!strcmp(new_str_picture_format, "yuv422p"))
-            new_picture_format = V4L2_PIX_FMT_YUV422P;
-        else
-            new_picture_format = V4L2_PIX_FMT_NV21; //for 3rd party
-
-        if (mSecCamera->setSnapshotPixelFormat(new_picture_format) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setSnapshotPixelFormat(format(%d))", __func__, new_picture_format);
-            ret = UNKNOWN_ERROR;
-        } else
-            mParameters.setPictureFormat(new_str_picture_format);
-    }
-
-    // JPEG image quality
-    int new_jpeg_quality = params.getInt(CameraParameters::KEY_JPEG_QUALITY);
-    ALOGV("%s : new_jpeg_quality %d", __func__, new_jpeg_quality);
-    /* we ignore bad values */
-    if (new_jpeg_quality >=1 && new_jpeg_quality <= 100) {
-        if (mSecCamera->setJpegQuality(new_jpeg_quality) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setJpegQuality(quality(%d))", __func__, new_jpeg_quality);
-            ret = UNKNOWN_ERROR;
-        } else
-            mParameters.set(CameraParameters::KEY_JPEG_QUALITY, new_jpeg_quality);
-    }
-
-    // JPEG thumbnail size
-    int new_jpeg_thumbnail_width = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
-    int new_jpeg_thumbnail_height= params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
-    if (0 <= new_jpeg_thumbnail_width && 0 <= new_jpeg_thumbnail_height) {
-        if (mSecCamera->setJpegThumbnailSize(new_jpeg_thumbnail_width, new_jpeg_thumbnail_height) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setJpegThumbnailSize(width(%d), height(%d))", __func__, new_jpeg_thumbnail_width, new_jpeg_thumbnail_height);
-            ret = UNKNOWN_ERROR;
-        } else {
-            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, new_jpeg_thumbnail_width);
-            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, new_jpeg_thumbnail_height);
-        }
-    }
-
-    // JPEG thumbnail quality
-    int new_jpeg_thumbnail_quality = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
-    ALOGV("%s : new_jpeg_thumbnail_quality %d", __func__, new_jpeg_thumbnail_quality);
-    /* we ignore bad values */
-    if (new_jpeg_thumbnail_quality >=1 && new_jpeg_thumbnail_quality <= 100) {
-        if (mSecCamera->setJpegThumbnailQuality(new_jpeg_thumbnail_quality) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setJpegThumbnailQuality(quality(%d))",
-                                               __func__, new_jpeg_thumbnail_quality);
-            ret = UNKNOWN_ERROR;
-        } else
-            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, new_jpeg_thumbnail_quality);
-    }
-
-    // frame rate
-    int new_frame_rate = params.getPreviewFrameRate();
-    /* ignore any fps request, we're determine fps automatically based
-     * on scene mode.  don't return an error because it causes CTS failure.
-     */
-    if (new_frame_rate != mParameters.getPreviewFrameRate()) {
-        if (mSecCamera->setFrameRate(new_frame_rate) < 0){
-            ALOGE("ERR(%s):Fail on mSecCamera->setFrameRate(%d)", __func__, new_frame_rate);
-            ret = UNKNOWN_ERROR;
-        } else {
-            mParameters.setPreviewFrameRate(new_frame_rate);
-        }
-     }
-
-    // rotation
-    int new_rotation = params.getInt(CameraParameters::KEY_ROTATION);
-    ALOGV("%s : new_rotation %d", __func__, new_rotation);
-    if (0 <= new_rotation) {
-        ALOGV("%s : set orientation:%d", __func__, new_rotation);
-        if (mSecCamera->setExifOrientationInfo(new_rotation) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setExifOrientationInfo(%d)", __func__, new_rotation);
-            ret = UNKNOWN_ERROR;
-        } else
-            mParameters.set(CameraParameters::KEY_ROTATION, new_rotation);
-    }
-
-    // brightness
-    int new_brightness = params.getInt("brightness");
-    int max_brightness = params.getInt("brightness-max");
-    int min_brightness = params.getInt("brightness-min");
-    ALOGV("%s : new_brightness %d", __func__, new_brightness);
-    if ((min_brightness <= new_brightness) &&
-        (max_brightness >= new_brightness)) {
-        if (mSecCamera->setBrightness(new_brightness) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setBrightness(brightness(%d))", __func__, new_brightness);
-            ret = UNKNOWN_ERROR;
-        } else {
-            mParameters.set("brightness", new_brightness);
-        }
-    }
-
-    // saturation
-    int new_saturation = params.getInt("saturation");
-    int max_saturation = params.getInt("saturation-max");
-    int min_saturation = params.getInt("saturation-min");
-    ALOGV("%s : new_saturation %d", __func__, new_saturation);
-    if ((min_saturation <= new_saturation) &&
-        (max_saturation >= new_saturation)) {
-        if (mSecCamera->setSaturation(new_saturation) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setSaturation(saturation(%d))", __func__, new_saturation);
-            ret = UNKNOWN_ERROR;
-        } else {
-            mParameters.set("saturation", new_saturation);
-        }
-    }
-
-    // sharpness
-    int new_sharpness = params.getInt("sharpness");
-    int max_sharpness = params.getInt("sharpness-max");
-    int min_sharpness = params.getInt("sharpness-min");
-    ALOGV("%s : new_sharpness %d", __func__, new_sharpness);
-    if ((min_sharpness <= new_sharpness) &&
-        (max_sharpness >= new_sharpness)) {
-        if (mSecCamera->setSharpness(new_sharpness) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setSharpness(sharpness(%d))", __func__, new_sharpness);
-            ret = UNKNOWN_ERROR;
-        } else {
-            mParameters.set("sharpness", new_sharpness);
-        }
-    }
-
-    // hue
-    int new_hue = params.getInt("hue");
-    int max_hue = params.getInt("hue-max");
-    int min_hue = params.getInt("hue-min");
-    ALOGV("%s : new_hue %d", __func__, new_hue);
-    if ((min_hue <= new_hue) &&
-        (max_hue >= new_hue)) {
-        if (mSecCamera->setHue(new_hue) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setHue(hue(%d))", __func__, new_hue);
-            ret = UNKNOWN_ERROR;
-        } else {
-            mParameters.set("hue", new_hue);
-        }
-    }
-
-    // exposure
-    int new_exposure_compensation = params.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
-    int max_exposure_compensation = params.getInt(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION);
-    int min_exposure_compensation = params.getInt(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION);
-    ALOGV("%s : new_exposure_compensation %d", __func__, new_exposure_compensation);
-    if ((min_exposure_compensation <= new_exposure_compensation) &&
-        (max_exposure_compensation >= new_exposure_compensation)) {
-        if (mSecCamera->setExposure(new_exposure_compensation) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setExposure(exposure(%d))", __func__, new_exposure_compensation);
-            ret = UNKNOWN_ERROR;
-        } else {
-            mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, new_exposure_compensation);
-        }
-    }
-
-    // ISO
-    const char *new_iso_str = params.get("iso");
-    ALOGV("%s : new_iso_str %s", __func__, new_iso_str);
-    if (new_iso_str != NULL) {
-        int new_iso = -1;
-
-        if (!strcmp(new_iso_str, "auto")) {
-            if (Internal_is)
-                new_iso = IS_ISO_AUTO;
-            else
-                new_iso = ISO_AUTO;
-        } else if (!strcmp(new_iso_str, "50")) {
-            if (Internal_is)
-                new_iso = IS_ISO_50;
-            else
-                new_iso = ISO_50;
-        } else if (!strcmp(new_iso_str, "100")) {
-            if (Internal_is)
-                new_iso = IS_ISO_100;
-            else
-                new_iso = ISO_100;
-        } else if (!strcmp(new_iso_str, "200")) {
-            if (Internal_is)
-                new_iso = IS_ISO_200;
-            else
-                new_iso = ISO_200;
-        } else if (!strcmp(new_iso_str, "400")) {
-            if (Internal_is)
-                new_iso = IS_ISO_400;
-            else
-                new_iso = ISO_400;
-        } else if (!strcmp(new_iso_str, "800")) {
-            if (Internal_is)
-                new_iso = IS_ISO_800;
-            else
-                new_iso = ISO_800;
-        } else if (!strcmp(new_iso_str, "1600")) {
-            if (Internal_is)
-                new_iso = IS_ISO_1600;
-            else
-                new_iso = ISO_1600;
-        } else {
-            ALOGE("ERR(%s):Invalid iso value(%s)", __func__, new_iso_str);
-            ret = UNKNOWN_ERROR;
-        }
-
-        if (0 <= new_iso) {
-            if (mSecCamera->setISO(new_iso) < 0) {
-                ALOGE("ERR(%s):Fail on mSecCamera->setISO(iso(%d))", __func__, new_iso);
-                ret = UNKNOWN_ERROR;
-            } else {
-                mParameters.set("iso", new_iso_str);
-            }
-        }
-    }
-
-    // whitebalance
-    const char *new_white_str = params.get(CameraParameters::KEY_WHITE_BALANCE);
-    ALOGV("%s : new_white_str %s", __func__, new_white_str);
-    if (new_white_str != NULL) {
-        int new_white = -1;
-
-        if (!strcmp(new_white_str, CameraParameters::WHITE_BALANCE_AUTO)) {
-            if (Internal_is)
-                new_white = IS_AWB_AUTO;
-            else
-                new_white = WHITE_BALANCE_AUTO;
-        } else if (!strcmp(new_white_str,
-                         CameraParameters::WHITE_BALANCE_DAYLIGHT)) {
-            if (Internal_is)
-                new_white = IS_AWB_DAYLIGHT;
-            else
-                new_white = WHITE_BALANCE_SUNNY;
-        } else if (!strcmp(new_white_str,
-                         CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT)) {
-            if (Internal_is)
-                new_white = IS_AWB_CLOUDY;
-            else
-                new_white = WHITE_BALANCE_CLOUDY;
-        } else if (!strcmp(new_white_str,
-                         CameraParameters::WHITE_BALANCE_FLUORESCENT)) {
-            if (Internal_is)
-                new_white = IS_AWB_FLUORESCENT;
-            else
-                new_white = WHITE_BALANCE_FLUORESCENT;
-        } else if (!strcmp(new_white_str,
-                         CameraParameters::WHITE_BALANCE_INCANDESCENT)) {
-            if (Internal_is)
-                new_white = IS_AWB_TUNGSTEN;
-            else
-                new_white = WHITE_BALANCE_TUNGSTEN;
-        } else {
-            ALOGE("ERR(%s):Invalid white balance(%s)", __func__, new_white_str); //twilight, shade, warm_flourescent
-            ret = UNKNOWN_ERROR;
-        }
-
-        if (0 <= new_white) {
-            if (mSecCamera->setWhiteBalance(new_white) < 0) {
-                ALOGE("ERR(%s):Fail on mSecCamera->setWhiteBalance(white(%d))", __func__, new_white);
-                ret = UNKNOWN_ERROR;
-            } else {
-                mParameters.set(CameraParameters::KEY_WHITE_BALANCE, new_white_str);
-            }
-        }
-    }
-
-    // Metering
-    const char *new_metering_str = params.get("metering");
-    ALOGV("%s : new_metering_str %s", __func__, new_metering_str);
-    if (new_metering_str != NULL) {
-        int new_metering = -1;
-
-        if (!strcmp(new_metering_str, "center")) {
-            if (Internal_is)
-                new_metering = IS_METERING_AVERAGE;
-            else
-                new_metering = METERING_CENTER;
-        } else if (!strcmp(new_metering_str, "spot")) {
-            if (Internal_is)
-                new_metering = IS_METERING_SPOT;
-            else
-                new_metering = METERING_SPOT;
-        } else if (!strcmp(new_metering_str, "matrix")) {
-            if (Internal_is)
-                new_metering = IS_METERING_MATRIX;
-            else
-                new_metering = METERING_MATRIX;
-        } else {
-            ALOGE("ERR(%s):Invalid metering value(%s)", __func__, new_metering_str);
-            ret = UNKNOWN_ERROR;
-        }
-
-        if (0 <= new_metering) {
-            if (mSecCamera->setMetering(new_metering) < 0) {
-                ALOGE("ERR(%s):Fail on mSecCamera->setMetering(metering(%d))", __func__, new_metering);
-                ret = UNKNOWN_ERROR;
-            } else {
-                mParameters.set("metering", new_metering_str);
-            }
-        }
-    }
-
-    // AFC
-    const char *new_antibanding_str = params.get(CameraParameters::KEY_ANTIBANDING);
-    ALOGV("%s : new_antibanding_str %s", __func__, new_antibanding_str);
-    if (new_antibanding_str != NULL) {
-        int new_antibanding = -1;
-
-        if (!strcmp(new_antibanding_str, CameraParameters::ANTIBANDING_AUTO)) {
-            if (Internal_is)
-                new_antibanding = IS_AFC_AUTO;
-            else
-                new_antibanding = ANTI_BANDING_AUTO;
-        } else if (!strcmp(new_antibanding_str, CameraParameters::ANTIBANDING_50HZ)) {
-            if (Internal_is)
-                new_antibanding = IS_AFC_MANUAL_50HZ;
-            else
-                new_antibanding = ANTI_BANDING_50HZ;
-        } else if (!strcmp(new_antibanding_str, CameraParameters::ANTIBANDING_60HZ)) {
-            if (Internal_is)
-                new_antibanding = IS_AFC_MANUAL_60HZ;
-            else
-                new_antibanding = ANTI_BANDING_60HZ;
-        } else if (!strcmp(new_antibanding_str, CameraParameters::ANTIBANDING_OFF)) {
-            if (Internal_is)
-                new_antibanding = IS_AFC_DISABLE;
-            else
-                new_antibanding = ANTI_BANDING_OFF;
-        } else {
-            ALOGE("ERR(%s):Invalid antibanding value(%s)", __func__, new_antibanding_str);
-            ret = UNKNOWN_ERROR;
-        }
-
-        if (0 <= new_antibanding) {
-            if (mSecCamera->setAntiBanding(new_antibanding) < 0) {
-                ALOGE("ERR(%s):Fail on mSecCamera->setAntiBanding(antibanding(%d))", __func__, new_antibanding);
-                ret = UNKNOWN_ERROR;
-            } else {
-                mParameters.set(CameraParameters::KEY_ANTIBANDING, new_antibanding_str);
-            }
-        }
-    }
-
-    // scene mode
-    const char *new_scene_mode_str = params.get(CameraParameters::KEY_SCENE_MODE);
-    const char *current_scene_mode_str = mParameters.get(CameraParameters::KEY_SCENE_MODE);
-
-    // fps range
-    int new_min_fps = 0;
-    int new_max_fps = 0;
-    int current_min_fps, current_max_fps;
-    params.getPreviewFpsRange(&new_min_fps, &new_max_fps);
-    mParameters.getPreviewFpsRange(&current_min_fps, &current_max_fps);
-    /* our fps range is determined by the sensor, reject any request
-     * that isn't exactly what we're already at.
-     * but the check is performed when requesting only changing fps range
-     */
-    if (new_scene_mode_str && current_scene_mode_str) {
-        if (!strcmp(new_scene_mode_str, current_scene_mode_str)) {
-            if ((new_min_fps != current_min_fps) || (new_max_fps != current_max_fps)) {
-                ALOGW("%s : requested new_min_fps = %d, new_max_fps = %d not allowed",
-                        __func__, new_min_fps, new_max_fps);
-                ALOGE("%s : current_min_fps = %d, current_max_fps = %d",
-                        __func__, current_min_fps, current_max_fps);
-                ret = UNKNOWN_ERROR;
-            }
-        }
-    } else {
-        /* Check basic validation if scene mode is different */
-        if ((new_min_fps > new_max_fps) ||
-            (new_min_fps < 0) || (new_max_fps < 0))
-        ret = UNKNOWN_ERROR;
-    }
-
-    if (new_scene_mode_str != NULL) {
-        int  new_scene_mode = -1;
-
-        const char *new_flash_mode_str = params.get(CameraParameters::KEY_FLASH_MODE);
-        const char *new_focus_mode_str;
-
-        new_focus_mode_str = params.get(CameraParameters::KEY_FOCUS_MODE);
-        // fps range is (15000,30000) by default.
-        mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(15000,30000)");
-        mParameters.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
-                "15000,30000");
-
-        if (!strcmp(new_scene_mode_str, CameraParameters::SCENE_MODE_AUTO)) {
-            new_scene_mode = SCENE_MODE_NONE;
-        } else {
-            // defaults for non-auto scene modes
-            if (mSecCamera->getCameraId() == SecCamera::CAMERA_ID_BACK) {
-                new_focus_mode_str = CameraParameters::FOCUS_MODE_AUTO;
-            }
-            new_flash_mode_str = CameraParameters::FLASH_MODE_OFF;
-
-            if (!strcmp(new_scene_mode_str,
-                       CameraParameters::SCENE_MODE_PORTRAIT)) {
-                new_scene_mode = SCENE_MODE_PORTRAIT;
-                new_flash_mode_str = CameraParameters::FLASH_MODE_AUTO;
-            } else if (!strcmp(new_scene_mode_str,
-                               CameraParameters::SCENE_MODE_LANDSCAPE)) {
-                new_scene_mode = SCENE_MODE_LANDSCAPE;
-            } else if (!strcmp(new_scene_mode_str,
-                               CameraParameters::SCENE_MODE_SPORTS)) {
-                new_scene_mode = SCENE_MODE_SPORTS;
-            } else if (!strcmp(new_scene_mode_str,
-                               CameraParameters::SCENE_MODE_PARTY)) {
-                new_scene_mode = SCENE_MODE_PARTY_INDOOR;
-                new_flash_mode_str = CameraParameters::FLASH_MODE_AUTO;
-            } else if ((!strcmp(new_scene_mode_str,
-                                CameraParameters::SCENE_MODE_BEACH)) ||
-                        (!strcmp(new_scene_mode_str,
-                                 CameraParameters::SCENE_MODE_SNOW))) {
-                new_scene_mode = SCENE_MODE_BEACH_SNOW;
-            } else if (!strcmp(new_scene_mode_str,
-                               CameraParameters::SCENE_MODE_SUNSET)) {
-                new_scene_mode = SCENE_MODE_SUNSET;
-            } else if (!strcmp(new_scene_mode_str,
-                               CameraParameters::SCENE_MODE_NIGHT)) {
-                new_scene_mode = SCENE_MODE_NIGHTSHOT;
-                mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(4000,30000)");
-                mParameters.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
-                                "4000,30000");
-            } else if (!strcmp(new_scene_mode_str,
-                               CameraParameters::SCENE_MODE_FIREWORKS)) {
-                new_scene_mode = SCENE_MODE_FIREWORKS;
-            } else if (!strcmp(new_scene_mode_str,
-                               CameraParameters::SCENE_MODE_CANDLELIGHT)) {
-                new_scene_mode = SCENE_MODE_CANDLE_LIGHT;
-            } else {
-                ALOGE("%s::unmatched scene_mode(%s)",
-                        __func__, new_scene_mode_str); //action, night-portrait, theatre, steadyphoto
-                ret = UNKNOWN_ERROR;
-            }
-        }
-
-        // focus mode
-        if (new_focus_mode_str != NULL) {
-            int  new_focus_mode = -1;
-
-            if (!strcmp(new_focus_mode_str,
-                        CameraParameters::FOCUS_MODE_AUTO)) {
-                new_focus_mode = FOCUS_MODE_AUTO;
-                mParameters.set(CameraParameters::KEY_FOCUS_DISTANCES,
-                                BACK_CAMERA_AUTO_FOCUS_DISTANCES_STR);
-            } else if (!strcmp(new_focus_mode_str,
-                             CameraParameters::FOCUS_MODE_MACRO)) {
-                new_focus_mode = FOCUS_MODE_MACRO;
-                mParameters.set(CameraParameters::KEY_FOCUS_DISTANCES,
-                                BACK_CAMERA_MACRO_FOCUS_DISTANCES_STR);
-            } else if (!strcmp(new_focus_mode_str,
-                             CameraParameters::FOCUS_MODE_INFINITY)) {
-                new_focus_mode = FOCUS_MODE_INFINITY;
-                mParameters.set(CameraParameters::KEY_FOCUS_DISTANCES,
-                                BACK_CAMERA_INFINITY_FOCUS_DISTANCES_STR);
-            } else {
-                ALOGE("%s::unmatched focus_mode(%s)", __func__, new_focus_mode_str);
-                ret = UNKNOWN_ERROR;
-            }
-
-            if (0 <= new_focus_mode) {
-                if (mSecCamera->setFocusMode(new_focus_mode) < 0) {
-                    ALOGE("%s::mSecCamera->setFocusMode(%d) fail", __func__, new_focus_mode);
-                    ret = UNKNOWN_ERROR;
-                } else {
-                    mParameters.set(CameraParameters::KEY_FOCUS_MODE, new_focus_mode_str);
-                }
-            }
-        }
-
-        // flash..
-        if (new_flash_mode_str != NULL) {
-            int  new_flash_mode = -1;
-
-            if (!strcmp(new_flash_mode_str, CameraParameters::FLASH_MODE_OFF))
-                new_flash_mode = FLASH_MODE_OFF;
-            else if (!strcmp(new_flash_mode_str, CameraParameters::FLASH_MODE_AUTO))
-                new_flash_mode = FLASH_MODE_AUTO;
-            else if (!strcmp(new_flash_mode_str, CameraParameters::FLASH_MODE_ON))
-                new_flash_mode = FLASH_MODE_ON;
-            else if (!strcmp(new_flash_mode_str, CameraParameters::FLASH_MODE_TORCH))
-                new_flash_mode = FLASH_MODE_TORCH;
-            else {
-                ALOGE("%s::unmatched flash_mode(%s)", __func__, new_flash_mode_str); //red-eye
-                ret = UNKNOWN_ERROR;
-            }
-            if (0 <= new_flash_mode) {
-                if (mSecCamera->setFlashMode(new_flash_mode) < 0) {
-                    ALOGE("%s::mSecCamera->setFlashMode(%d) fail", __func__, new_flash_mode);
-                    ret = UNKNOWN_ERROR;
-                } else {
-                    mParameters.set(CameraParameters::KEY_FLASH_MODE, new_flash_mode_str);
-                }
-            }
-        }
-
-        //  scene..
-        if (0 <= new_scene_mode) {
-            if (mSecCamera->setSceneMode(new_scene_mode) < 0) {
-                ALOGE("%s::mSecCamera->setSceneMode(%d) fail", __func__, new_scene_mode);
-                ret = UNKNOWN_ERROR;
-            } else {
-                mParameters.set(CameraParameters::KEY_SCENE_MODE, new_scene_mode_str);
-            }
-        }
-    }
-
-    // image effect
-    const char *new_image_effect_str = params.get(CameraParameters::KEY_EFFECT);
-    if (new_image_effect_str != NULL) {
-
-        int  new_image_effect = -1;
-
-        if (!strcmp(new_image_effect_str, CameraParameters::EFFECT_NONE)) {
-            if (Internal_is)
-                new_image_effect = IS_IMAGE_EFFECT_DISABLE;
-            else
-                new_image_effect = IMAGE_EFFECT_NONE;
-        } else if (!strcmp(new_image_effect_str, CameraParameters::EFFECT_MONO)) {
-            if (Internal_is)
-                new_image_effect = IS_IMAGE_EFFECT_MONOCHROME;
-            else
-                new_image_effect = IMAGE_EFFECT_BNW;
-        } else if (!strcmp(new_image_effect_str, CameraParameters::EFFECT_SEPIA)) {
-            if (Internal_is)
-                new_image_effect = IS_IMAGE_EFFECT_SEPIA;
-            else
-                new_image_effect = IMAGE_EFFECT_SEPIA;
-        } else if (!strcmp(new_image_effect_str, CameraParameters::EFFECT_AQUA))
-            new_image_effect = IMAGE_EFFECT_AQUA;
-        else if (!strcmp(new_image_effect_str, CameraParameters::EFFECT_NEGATIVE)) {
-            if (Internal_is)
-                new_image_effect = IS_IMAGE_EFFECT_NEGATIVE_MONO;
-            else
-                ALOGW("WARN(%s):Invalid effect value (%s)", __func__, new_image_effect_str);
-        } else {
-            //posterize, whiteboard, blackboard, solarize
-            ALOGE("ERR(%s):Invalid effect(%s)", __func__, new_image_effect_str);
-            ret = UNKNOWN_ERROR;
-        }
-
-        if (new_image_effect >= 0) {
-            if (mSecCamera->setImageEffect(new_image_effect) < 0) {
-                ALOGE("ERR(%s):Fail on mSecCamera->setImageEffect(effect(%d))", __func__, new_image_effect);
-                ret = UNKNOWN_ERROR;
-            } else {
-                const char *old_image_effect_str = mParameters.get(CameraParameters::KEY_EFFECT);
-
-                if (old_image_effect_str) {
-                    if (strcmp(old_image_effect_str, new_image_effect_str)) {
-                        setSkipFrame(EFFECT_SKIP_FRAME);
-                    }
-                }
-
-                mParameters.set(CameraParameters::KEY_EFFECT, new_image_effect_str);
-            }
-        }
-    }
-
-    //contrast
-    const char *new_contrast_str = params.get("contrast");
-    ALOGV("%s : new_contrast_str %s", __func__, new_contrast_str);
-    if (new_contrast_str != NULL) {
-        int new_contrast = -1;
-
-        if (!strcmp(new_contrast_str, "auto")) {
-            if (Internal_is)
-                new_contrast = IS_CONTRAST_AUTO;
-            else
-                ALOGW("WARN(%s):Invalid contrast value (%s)", __func__, new_contrast_str);
-        } else if (!strcmp(new_contrast_str, "-2")) {
-            if (Internal_is)
-                new_contrast = IS_CONTRAST_MINUS_2;
-            else
-                new_contrast = CONTRAST_MINUS_2;
-        } else if (!strcmp(new_contrast_str, "-1")) {
-            if (Internal_is)
-                new_contrast = IS_CONTRAST_MINUS_1;
-            else
-                new_contrast = CONTRAST_MINUS_1;
-        } else if (!strcmp(new_contrast_str, "0")) {
-            if (Internal_is)
-                new_contrast = IS_CONTRAST_DEFAULT;
-            else
-                new_contrast = CONTRAST_DEFAULT;
-        } else if (!strcmp(new_contrast_str, "1")) {
-            if (Internal_is)
-                new_contrast = IS_CONTRAST_PLUS_1;
-            else
-                new_contrast = CONTRAST_PLUS_1;
-        } else if (!strcmp(new_contrast_str, "2")) {
-            if (Internal_is)
-                new_contrast = IS_CONTRAST_PLUS_2;
-            else
-                new_contrast = CONTRAST_PLUS_2;
-        } else {
-            ALOGE("ERR(%s):Invalid contrast value(%s)", __func__, new_contrast_str);
-            ret = UNKNOWN_ERROR;
-        }
-
-        if (0 <= new_contrast) {
-            if (mSecCamera->setContrast(new_contrast) < 0) {
-                ALOGE("ERR(%s):Fail on mSecCamera->setContrast(contrast(%d))", __func__, new_contrast);
-                ret = UNKNOWN_ERROR;
-            } else {
-                mParameters.set("contrast", new_contrast_str);
-            }
-        }
-    }
-
-    //WDR
-    int new_wdr = params.getInt("wdr");
-    ALOGV("%s : new_wdr %d", __func__, new_wdr);
-
-    if (0 <= new_wdr) {
-        if (mSecCamera->setWDR(new_wdr) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setWDR(%d)", __func__, new_wdr);
-            ret = UNKNOWN_ERROR;
-        }
-    }
-
-    //anti shake
-    int new_anti_shake = mInternalParameters.getInt("anti-shake");
-
-    if (0 <= new_anti_shake) {
-        if (mSecCamera->setAntiShake(new_anti_shake) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setWDR(%d)", __func__, new_anti_shake);
-            ret = UNKNOWN_ERROR;
-        }
-    }
-
-    // gps latitude
-    const char *new_gps_latitude_str = params.get(CameraParameters::KEY_GPS_LATITUDE);
-    if (mSecCamera->setGPSLatitude(new_gps_latitude_str) < 0) {
-        ALOGE("%s::mSecCamera->setGPSLatitude(%s) fail", __func__, new_gps_latitude_str);
-        ret = UNKNOWN_ERROR;
-    } else {
-        if (new_gps_latitude_str) {
-            mParameters.set(CameraParameters::KEY_GPS_LATITUDE, new_gps_latitude_str);
-        } else {
-            mParameters.remove(CameraParameters::KEY_GPS_LATITUDE);
-        }
-    }
-
-    // gps longitude
-    const char *new_gps_longitude_str = params.get(CameraParameters::KEY_GPS_LONGITUDE);
-
-    if (mSecCamera->setGPSLongitude(new_gps_longitude_str) < 0) {
-        ALOGE("%s::mSecCamera->setGPSLongitude(%s) fail", __func__, new_gps_longitude_str);
-        ret = UNKNOWN_ERROR;
-    } else {
-        if (new_gps_longitude_str) {
-            mParameters.set(CameraParameters::KEY_GPS_LONGITUDE, new_gps_longitude_str);
-        } else {
-            mParameters.remove(CameraParameters::KEY_GPS_LONGITUDE);
-        }
-    }
-
-    // gps altitude
-    const char *new_gps_altitude_str = params.get(CameraParameters::KEY_GPS_ALTITUDE);
-
-    if (mSecCamera->setGPSAltitude(new_gps_altitude_str) < 0) {
-        ALOGE("%s::mSecCamera->setGPSAltitude(%s) fail", __func__, new_gps_altitude_str);
-        ret = UNKNOWN_ERROR;
-    } else {
-        if (new_gps_altitude_str) {
-            mParameters.set(CameraParameters::KEY_GPS_ALTITUDE, new_gps_altitude_str);
-        } else {
-            mParameters.remove(CameraParameters::KEY_GPS_ALTITUDE);
-        }
-    }
-
-    // gps timestamp
-    const char *new_gps_timestamp_str = params.get(CameraParameters::KEY_GPS_TIMESTAMP);
-
-    if (mSecCamera->setGPSTimeStamp(new_gps_timestamp_str) < 0) {
-        ALOGE("%s::mSecCamera->setGPSTimeStamp(%s) fail", __func__, new_gps_timestamp_str);
-        ret = UNKNOWN_ERROR;
-    } else {
-        if (new_gps_timestamp_str) {
-            mParameters.set(CameraParameters::KEY_GPS_TIMESTAMP, new_gps_timestamp_str);
-        } else {
-            mParameters.remove(CameraParameters::KEY_GPS_TIMESTAMP);
-        }
-    }
-
-    // gps processing method
-    const char *new_gps_processing_method_str = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
-
-    if (mSecCamera->setGPSProcessingMethod(new_gps_processing_method_str) < 0) {
-        ALOGE("%s::mSecCamera->setGPSProcessingMethod(%s) fail", __func__, new_gps_processing_method_str);
-        ret = UNKNOWN_ERROR;
-    } else {
-        if (new_gps_processing_method_str) {
-            mParameters.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, new_gps_processing_method_str);
-        } else {
-            mParameters.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD);
-        }
-    }
-
-    // Recording size
-    int new_recording_width  = 0;
-    int new_recording_height = 0;
-    params.getVideoSize(&new_recording_width, &new_recording_height);
-    ALOGV("new_recording_width (%d) new_recording_height (%d)",
-            new_recording_width, new_recording_height);
-
-    int current_recording_width, current_recording_height;
-    mSecCamera->getRecordingSize(&current_recording_width, &current_recording_height);
-    ALOGV("current_recording_width (%d) current_recording_height (%d)",
-            current_recording_width, current_recording_height);
-
-    if (0 < new_recording_width && 0 < new_recording_height) {
-          if (current_recording_width != new_recording_width ||
-              current_recording_height != new_recording_height) {
-            if (mSecCamera->setRecordingSize(new_recording_width, new_recording_height) < 0) {
-                ALOGE("ERR(%s):Fail on mSecCamera->setRecordingSize(width(%d), height(%d))",
-                        __func__, new_recording_width, new_recording_height);
-                ret = UNKNOWN_ERROR;
-            } else {
-                if (Internal_is && mPreviewWindow && mPreviewRunning) {
-                    mSecCamera->setRecording(1);
-                    stopPreview();
-                    startPreview();
-                    mSecCamera->setRecording(0);
-                }
-            }
-        }
-        mParameters.setVideoSize(new_recording_width, new_recording_height);
-    } else {
-        if (mSecCamera->setRecordingSize(new_preview_width, new_preview_height) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setRecordingSize(width(%d), height(%d))",
-                    __func__, new_preview_width, new_preview_height);
-            ret = UNKNOWN_ERROR;
-        }
-    }
-
-    //gamma
-    const char *new_gamma_str = mInternalParameters.get("video_recording_gamma");
-
-    if (new_gamma_str != NULL) {
-        int new_gamma = -1;
-        if (!strcmp(new_gamma_str, "off"))
-            new_gamma = GAMMA_OFF;
-        else if (!strcmp(new_gamma_str, "on"))
-            new_gamma = GAMMA_ON;
-        else {
-            ALOGE("%s::unmatched gamma(%s)", __func__, new_gamma_str);
-            ret = UNKNOWN_ERROR;
-        }
-
-        if (0 <= new_gamma) {
-            if (mSecCamera->setGamma(new_gamma) < 0) {
-                ALOGE("%s::mSecCamera->setGamma(%d) fail", __func__, new_gamma);
-                ret = UNKNOWN_ERROR;
-            }
-        }
-    }
-
-    //slow ae
-    const char *new_slow_ae_str = mInternalParameters.get("slow_ae");
-
-    if (new_slow_ae_str != NULL) {
-        int new_slow_ae = -1;
-
-        if (!strcmp(new_slow_ae_str, "off"))
-            new_slow_ae = SLOW_AE_OFF;
-        else if (!strcmp(new_slow_ae_str, "on"))
-            new_slow_ae = SLOW_AE_ON;
-        else {
-            ALOGE("%s::unmatched slow_ae(%s)", __func__, new_slow_ae_str);
-            ret = UNKNOWN_ERROR;
-        }
-
-        if (0 <= new_slow_ae) {
-            if (mSecCamera->setSlowAE(new_slow_ae) < 0) {
-                ALOGE("%s::mSecCamera->setSlowAE(%d) fail", __func__, new_slow_ae);
-                ret = UNKNOWN_ERROR;
-            }
-        }
-    }
-
-    /*Camcorder fix fps*/
-    int new_sensor_mode = mInternalParameters.getInt("cam_mode");
-
-    if (0 <= new_sensor_mode) {
-        if (mSecCamera->setSensorMode(new_sensor_mode) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setSensorMode(%d)", __func__, new_sensor_mode);
-            ret = UNKNOWN_ERROR;
-        }
-    } else {
-        new_sensor_mode=0;
-    }
-
-    /*Shot mode*/
-    int new_shot_mode = mInternalParameters.getInt("shot_mode");
-
-    if (0 <= new_shot_mode) {
-        if (mSecCamera->setShotMode(new_shot_mode) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setShotMode(%d)", __func__, new_shot_mode);
-            ret = UNKNOWN_ERROR;
-        }
-    } else {
-        new_shot_mode=0;
-    }
-
-    // chk_dataline
-    int new_dataline = mInternalParameters.getInt("chk_dataline");
-
-    if (0 <= new_dataline) {
-        if (mSecCamera->setDataLineCheck(new_dataline) < 0) {
-            ALOGE("ERR(%s):Fail on mSecCamera->setDataLineCheck(%d)", __func__, new_dataline);
-            ret = UNKNOWN_ERROR;
-        }
-    }
-    ALOGV("%s return ret = %d", __func__, ret);
-#endif
-
-    return ret;
-}
-
-CameraParameters CameraHardwareSec::getParameters() const
-{
-    ALOGV("%s :", __func__);
-    return mParameters;
-}
-
-status_t CameraHardwareSec::sendCommand(int32_t command, int32_t arg1, int32_t arg2)
-{
-    return BAD_VALUE;
-}
-
-void CameraHardwareSec::release()
-{
-    ALOGV("%s", __func__);
-
-    /* shut down any threads we have that might be running.  do it here
-     * instead of the destructor.  we're guaranteed to be on another thread
-     * than the ones below.  if we used the destructor, since the threads
-     * have a reference to this object, we could wind up trying to wait
-     * for ourself to exit, which is a deadlock.
-     */
-    if (mPreviewThread != NULL) {
-        /* this thread is normally already in it's threadLoop but blocked
-         * on the condition variable or running.  signal it so it wakes
-         * up and can exit.
-         */
-        mPreviewThread->requestExit();
-        mExitPreviewThread = true;
-        mPreviewRunning = true; /* let it run so it can exit */
-        mPreviewCondition.signal();
-        mPreviewThread->requestExitAndWait();
-        mPreviewThread.clear();
-    }
-    if (mAutoFocusThread != NULL) {
-        /* this thread is normally already in it's threadLoop but blocked
-         * on the condition variable.  signal it so it wakes up and can exit.
-         */
-        mFocusLock.lock();
-        mAutoFocusThread->requestExit();
-        mExitAutoFocusThread = true;
-        mFocusCondition.signal();
-        mFocusLock.unlock();
-        mAutoFocusThread->requestExitAndWait();
-        mAutoFocusThread.clear();
-    }
-    if (mPictureThread != NULL) {
-        mPictureThread->requestExitAndWait();
-        mPictureThread.clear();
-    }
-
-    if (mRawHeap) {
-        mRawHeap->release(mRawHeap);
-        mRawHeap = 0;
-    }
-    if (mPreviewHeap) {
-        mPreviewHeap->release(mPreviewHeap);
-        mPreviewHeap = 0;
-    }
-    for(int i = 0; i < BUFFER_COUNT_FOR_ARRAY; i++) {
-        if (mRecordHeap[i]) {
-            mRecordHeap[i]->release(mRecordHeap[i]);
-            mRecordHeap[i] = 0;
-        }
-    }
-
-     /* close after all the heaps are cleared since those
-     * could have dup'd our file descriptor.
-     */
-    mSecCamera->DestroyCamera();
-}
-
-static CameraInfo sCameraInfo[] = {
-    {
-        CAMERA_FACING_BACK,
-        0,  /* orientation */
-    },
-    {
-        CAMERA_FACING_FRONT,
-        0,  /* orientation */
-    }
-};
-
-status_t CameraHardwareSec::storeMetaDataInBuffers(bool enable)
-{
-    if (!enable) {
-        ALOGE("Non-metadata buffer mode is not supported!");
-        return INVALID_OPERATION;
-    }
-    return OK;
-}
-
-/** Close this device */
-
-static camera_device_t *g_cam_device;
-
-static int HAL_camera_device_close(struct hw_device_t* device)
-{
-    ALOGI("%s", __func__);
-    if (device) {
-        camera_device_t *cam_device = (camera_device_t *)device;
-        delete static_cast<CameraHardwareSec *>(cam_device->priv);
-        free(cam_device);
-        g_cam_device = 0;
-    }
-    return 0;
-}
-
-static inline CameraHardwareSec *obj(struct camera_device *dev)
-{
-    return reinterpret_cast<CameraHardwareSec *>(dev->priv);
-}
-
-/** Set the preview_stream_ops to which preview frames are sent */
-static int HAL_camera_device_set_preview_window(struct camera_device *dev,
-                                                struct preview_stream_ops *buf)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->setPreviewWindow(buf);
-}
-
-/** Set the notification and data callbacks */
-static void HAL_camera_device_set_callbacks(struct camera_device *dev,
-        camera_notify_callback notify_cb,
-        camera_data_callback data_cb,
-        camera_data_timestamp_callback data_cb_timestamp,
-        camera_request_memory get_memory,
-        void* user)
-{
-    ALOGV("%s", __func__);
-    obj(dev)->setCallbacks(notify_cb, data_cb, data_cb_timestamp,
-                           get_memory,
-                           user);
-}
-
-/**
- * The following three functions all take a msg_type, which is a bitmask of
- * the messages defined in include/ui/Camera.h
- */
-
-/**
- * Enable a message, or set of messages.
- */
-static void HAL_camera_device_enable_msg_type(struct camera_device *dev, int32_t msg_type)
-{
-    ALOGV("%s", __func__);
-    obj(dev)->enableMsgType(msg_type);
-}
-
-/**
- * Disable a message, or a set of messages.
- *
- * Once received a call to disableMsgType(CAMERA_MSG_VIDEO_FRAME), camera
- * HAL should not rely on its client to call releaseRecordingFrame() to
- * release video recording frames sent out by the cameral HAL before and
- * after the disableMsgType(CAMERA_MSG_VIDEO_FRAME) call. Camera HAL
- * clients must not modify/access any video recording frame after calling
- * disableMsgType(CAMERA_MSG_VIDEO_FRAME).
- */
-static void HAL_camera_device_disable_msg_type(struct camera_device *dev, int32_t msg_type)
-{
-    ALOGV("%s", __func__);
-    obj(dev)->disableMsgType(msg_type);
-}
-
-/**
- * Query whether a message, or a set of messages, is enabled.  Note that
- * this is operates as an AND, if any of the messages queried are off, this
- * will return false.
- */
-static int HAL_camera_device_msg_type_enabled(struct camera_device *dev, int32_t msg_type)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->msgTypeEnabled(msg_type);
-}
-
-/**
- * Start preview mode.
- */
-static int HAL_camera_device_start_preview(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->startPreview();
-}
-
-/**
- * Stop a previously started preview.
- */
-static void HAL_camera_device_stop_preview(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    obj(dev)->stopPreview();
-}
-
-/**
- * Returns true if preview is enabled.
- */
-static int HAL_camera_device_preview_enabled(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->previewEnabled();
-}
-
-/**
- * Request the camera HAL to store meta data or real YUV data in the video
- * buffers sent out via CAMERA_MSG_VIDEO_FRAME for a recording session. If
- * it is not called, the default camera HAL behavior is to store real YUV
- * data in the video buffers.
- *
- * This method should be called before startRecording() in order to be
- * effective.
- *
- * If meta data is stored in the video buffers, it is up to the receiver of
- * the video buffers to interpret the contents and to find the actual frame
- * data with the help of the meta data in the buffer. How this is done is
- * outside of the scope of this method.
- *
- * Some camera HALs may not support storing meta data in the video buffers,
- * but all camera HALs should support storing real YUV data in the video
- * buffers. If the camera HAL does not support storing the meta data in the
- * video buffers when it is requested to do do, INVALID_OPERATION must be
- * returned. It is very useful for the camera HAL to pass meta data rather
- * than the actual frame data directly to the video encoder, since the
- * amount of the uncompressed frame data can be very large if video size is
- * large.
- *
- * @param enable if true to instruct the camera HAL to store
- *      meta data in the video buffers; false to instruct
- *      the camera HAL to store real YUV data in the video
- *      buffers.
- *
- * @return OK on success.
- */
-static int HAL_camera_device_store_meta_data_in_buffers(struct camera_device *dev, int enable)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->storeMetaDataInBuffers(enable);
-}
-
-/**
- * Start record mode. When a record image is available, a
- * CAMERA_MSG_VIDEO_FRAME message is sent with the corresponding
- * frame. Every record frame must be released by a camera HAL client via
- * releaseRecordingFrame() before the client calls
- * disableMsgType(CAMERA_MSG_VIDEO_FRAME). After the client calls
- * disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is the camera HAL's
- * responsibility to manage the life-cycle of the video recording frames,
- * and the client must not modify/access any video recording frames.
- */
-static int HAL_camera_device_start_recording(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->startRecording();
-}
-
-/**
- * Stop a previously started recording.
- */
-static void HAL_camera_device_stop_recording(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    obj(dev)->stopRecording();
-}
-
-/**
- * Returns true if recording is enabled.
- */
-static int HAL_camera_device_recording_enabled(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->recordingEnabled();
-}
-
-/**
- * Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
- *
- * It is camera HAL client's responsibility to release video recording
- * frames sent out by the camera HAL before the camera HAL receives a call
- * to disableMsgType(CAMERA_MSG_VIDEO_FRAME). After it receives the call to
- * disableMsgType(CAMERA_MSG_VIDEO_FRAME), it is the camera HAL's
- * responsibility to manage the life-cycle of the video recording frames.
- */
-static void HAL_camera_device_release_recording_frame(struct camera_device *dev,
-                                const void *opaque)
-{
-    ALOGV("%s", __func__);
-    obj(dev)->releaseRecordingFrame(opaque);
-}
-
-/**
- * Start auto focus, the notification callback routine is called with
- * CAMERA_MSG_FOCUS once when focusing is complete. autoFocus() will be
- * called again if another auto focus is needed.
- */
-static int HAL_camera_device_auto_focus(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->autoFocus();
-}
-
-/**
- * Cancels auto-focus function. If the auto-focus is still in progress,
- * this function will cancel it. Whether the auto-focus is in progress or
- * not, this function will return the focus position to the default.  If
- * the camera does not support auto-focus, this is a no-op.
- */
-static int HAL_camera_device_cancel_auto_focus(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->cancelAutoFocus();
-}
-
-/**
- * Take a picture.
- */
-static int HAL_camera_device_take_picture(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->takePicture();
-}
-
-/**
- * Cancel a picture that was started with takePicture. Calling this method
- * when no picture is being taken is a no-op.
- */
-static int HAL_camera_device_cancel_picture(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->cancelPicture();
-}
-
-/**
- * Set the camera parameters. This returns BAD_VALUE if any parameter is
- * invalid or not supported.
- */
-static int HAL_camera_device_set_parameters(struct camera_device *dev,
-                                            const char *parms)
-{
-    ALOGV("%s", __func__);
-    String8 str(parms);
-    CameraParameters p(str);
-    return obj(dev)->setParameters(p);
-}
-
-/** Return the camera parameters. */
-char *HAL_camera_device_get_parameters(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    String8 str;
-    CameraParameters parms = obj(dev)->getParameters();
-    str = parms.flatten();
-    return strdup(str.string());
-}
-
-static void HAL_camera_device_put_parameters(struct camera_device *dev, char *parms)
-{
-    ALOGV("%s", __func__);
-    free(parms);
-}
-
-/**
- * Send command to camera driver.
- */
-static int HAL_camera_device_send_command(struct camera_device *dev,
-                    int32_t cmd, int32_t arg1, int32_t arg2)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->sendCommand(cmd, arg1, arg2);
-}
-
-/**
- * Release the hardware resources owned by this object.  Note that this is
- * *not* done in the destructor.
- */
-static void HAL_camera_device_release(struct camera_device *dev)
-{
-    ALOGV("%s", __func__);
-    obj(dev)->release();
-}
-
-/**
- * Dump state of the camera hardware
- */
-static int HAL_camera_device_dump(struct camera_device *dev, int fd)
-{
-    ALOGV("%s", __func__);
-    return obj(dev)->dump(fd);
-}
-
-static int HAL_getNumberOfCameras()
-{
-    ALOGV("%s", __func__);
-    return sizeof(sCameraInfo) / sizeof(sCameraInfo[0]);
-}
-
-static int HAL_getCameraInfo(int cameraId, struct camera_info *cameraInfo)
-{
-    ALOGV("%s", __func__);
-    memcpy(cameraInfo, &sCameraInfo[cameraId], sizeof(CameraInfo));
-    return 0;
-}
-
-#define SET_METHOD(m) m : HAL_camera_device_##m
-
-static camera_device_ops_t camera_device_ops = {
-        SET_METHOD(set_preview_window),
-        SET_METHOD(set_callbacks),
-        SET_METHOD(enable_msg_type),
-        SET_METHOD(disable_msg_type),
-        SET_METHOD(msg_type_enabled),
-        SET_METHOD(start_preview),
-        SET_METHOD(stop_preview),
-        SET_METHOD(preview_enabled),
-        SET_METHOD(store_meta_data_in_buffers),
-        SET_METHOD(start_recording),
-        SET_METHOD(stop_recording),
-        SET_METHOD(recording_enabled),
-        SET_METHOD(release_recording_frame),
-        SET_METHOD(auto_focus),
-        SET_METHOD(cancel_auto_focus),
-        SET_METHOD(take_picture),
-        SET_METHOD(cancel_picture),
-        SET_METHOD(set_parameters),
-        SET_METHOD(get_parameters),
-        SET_METHOD(put_parameters),
-        SET_METHOD(send_command),
-        SET_METHOD(release),
-        SET_METHOD(dump),
-};
-
-#undef SET_METHOD
-
-static int HAL_camera_device_open(const struct hw_module_t* module,
-                                  const char *id,
-                                  struct hw_device_t** device)
-{
-    ALOGV("%s", __func__);
-
-    int cameraId = atoi(id);
-    if (cameraId < 0 || cameraId >= HAL_getNumberOfCameras()) {
-        ALOGE("Invalid camera ID %s", id);
-        return -EINVAL;
-    }
-
-    if (g_cam_device) {
-        if (obj(g_cam_device)->getCameraId() == cameraId) {
-            ALOGV("returning existing camera ID %s", id);
-            goto done;
-        } else {
-            ALOGE("Cannot open camera %d. camera %d is already running!",
-                    cameraId, obj(g_cam_device)->getCameraId());
-            return -ENOSYS;
-        }
-    }
-
-    g_cam_device = (camera_device_t *)malloc(sizeof(camera_device_t));
-    if (!g_cam_device)
-        return -ENOMEM;
-
-    g_cam_device->common.tag     = HARDWARE_DEVICE_TAG;
-    g_cam_device->common.version = 1;
-    g_cam_device->common.module  = const_cast<hw_module_t *>(module);
-    g_cam_device->common.close   = HAL_camera_device_close;
-
-    g_cam_device->ops = &camera_device_ops;
-
-    ALOGI("%s: open camera %s", __func__, id);
-
-    g_cam_device->priv = new CameraHardwareSec(cameraId, g_cam_device);
-
-done:
-    *device = (hw_device_t *)g_cam_device;
-    ALOGI("%s: opened camera %s (%p)", __func__, id, *device);
-    return 0;
-}
-
-static hw_module_methods_t camera_module_methods = {
-            open : HAL_camera_device_open
-};
-
-extern "C" {
-    struct camera_module HAL_MODULE_INFO_SYM = {
-      common : {
-          tag           : HARDWARE_MODULE_TAG,
-          version_major : 1,
-          version_minor : 0,
-          id            : CAMERA_HARDWARE_MODULE_ID,
-          name          : "orion camera HAL",
-          author        : "Samsung Corporation",
-          methods       : &camera_module_methods,
-      },
-      get_number_of_cameras : HAL_getNumberOfCameras,
-      get_camera_info       : HAL_getCameraInfo
-    };
-}
-
-}; // namespace android
diff --git a/exynos5/hal/libcamera/SecCameraHWInterface.h b/exynos5/hal/libcamera/SecCameraHWInterface.h
deleted file mode 100644
index 6be8ae2..0000000
--- a/exynos5/hal/libcamera/SecCameraHWInterface.h
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
-**
-** Copyright 2008, The Android Open Source Project
-** Copyright 2010, Samsung Electronics Co. LTD
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-#ifndef ANDROID_HARDWARE_CAMERA_HARDWARE_SEC_H
-
-#include "SecCamera.h"
-#include <utils/threads.h>
-#include <utils/RefBase.h>
-#include <binder/MemoryBase.h>
-#include <binder/MemoryHeapBase.h>
-#include <hardware/camera.h>
-#include <hardware/gralloc.h>
-#include <camera/CameraParameters.h>
-#include <binder/MemoryHeapBaseIon.h>
-#include <sec_utils_v4l2.h>
-
-#include "gralloc_priv.h"
-
-#define  BUFFER_COUNT_FOR_GRALLOC (MAX_BUFFERS + 4)
-#define  BUFFER_COUNT_FOR_ARRAY (MAX_BUFFERS)
-
-namespace android {
-    class CameraHardwareSec : public virtual RefBase {
-public:
-    virtual void        setCallbacks(camera_notify_callback notify_cb,
-                                     camera_data_callback data_cb,
-                                     camera_data_timestamp_callback data_cb_timestamp,
-                                     camera_request_memory get_memory,
-                                     void *user);
-
-    virtual void        enableMsgType(int32_t msgType);
-    virtual void        disableMsgType(int32_t msgType);
-    virtual bool        msgTypeEnabled(int32_t msgType);
-
-    virtual status_t    startPreview();
-    virtual void        stopPreview();
-    virtual bool        previewEnabled();
-
-    virtual status_t    startRecording();
-    virtual void        stopRecording();
-    virtual bool        recordingEnabled();
-    virtual void        releaseRecordingFrame(const void *opaque);
-
-    virtual status_t    autoFocus();
-    virtual status_t    cancelAutoFocus();
-    virtual status_t    takePicture();
-    virtual status_t    cancelPicture();
-    virtual status_t    dump(int fd) const;
-    virtual status_t    setParameters(const CameraParameters& params);
-    virtual CameraParameters  getParameters() const;
-    virtual status_t    sendCommand(int32_t command, int32_t arg1, int32_t arg2);
-    virtual status_t    setPreviewWindow(preview_stream_ops *w);
-    virtual status_t    storeMetaDataInBuffers(bool enable);
-    virtual void        release();
-
-    inline  int         getCameraId() const;
-
-    CameraHardwareSec(int cameraId, camera_device_t *dev);
-    virtual             ~CameraHardwareSec();
-private:
-    status_t    startPreviewInternal();
-    void stopPreviewInternal();
-
-    class PreviewThread : public Thread {
-        CameraHardwareSec *mHardware;
-    public:
-        PreviewThread(CameraHardwareSec *hw):
-        Thread(false),
-        mHardware(hw) { }
-        virtual void onFirstRef() {
-            run("CameraPreviewThread", PRIORITY_URGENT_DISPLAY);
-        }
-        virtual bool threadLoop() {
-            mHardware->previewThreadWrapper();
-            return false;
-        }
-    };
-
-    class PictureThread : public Thread {
-        CameraHardwareSec *mHardware;
-    public:
-        PictureThread(CameraHardwareSec *hw):
-        Thread(false),
-        mHardware(hw) { }
-        virtual bool threadLoop() {
-            mHardware->pictureThread();
-            mHardware->mSecCamera->endSnapshot();
-            return false;
-        }
-    };
-
-    class AutoFocusThread : public Thread {
-        CameraHardwareSec *mHardware;
-    public:
-        AutoFocusThread(CameraHardwareSec *hw): Thread(false), mHardware(hw) { }
-        virtual void onFirstRef() {
-            run("CameraAutoFocusThread", PRIORITY_DEFAULT);
-        }
-        virtual bool threadLoop() {
-            mHardware->autoFocusThread();
-            return true;
-        }
-    };
-
-            void        initDefaultParameters(int cameraId);
-            void        initHeapLocked();
-
-    sp<PreviewThread>   mPreviewThread;
-            int         previewThread();
-            int         previewThreadWrapper();
-
-    sp<AutoFocusThread> mAutoFocusThread;
-            int         autoFocusThread();
-
-    sp<PictureThread>   mPictureThread;
-            int         pictureThread();
-            bool        mCaptureInProgress;
-
-            int         save_jpeg(unsigned char *real_jpeg, int jpeg_size);
-            void        save_postview(const char *fname, uint8_t *buf,
-                                        uint32_t size);
-            int         decodeInterleaveData(unsigned char *pInterleaveData,
-                                                int interleaveDataSize,
-                                                int yuvWidth,
-                                                int yuvHeight,
-                                                int *pJpegSize,
-                                                void *pJpegData,
-                                                void *pYuvData);
-            bool        YUY2toNV21(void *srcBuf, void *dstBuf, uint32_t srcWidth, uint32_t srcHeight);
-            bool        scaleDownYuv422(char *srcBuf, uint32_t srcWidth,
-                                        uint32_t srcHight, char *dstBuf,
-                                        uint32_t dstWidth, uint32_t dstHight);
-
-            bool        CheckVideoStartMarker(unsigned char *pBuf);
-            bool        CheckEOIMarker(unsigned char *pBuf);
-            bool        FindEOIMarkerInJPEG(unsigned char *pBuf,
-                                            int dwBufSize, int *pnJPEGsize);
-            bool        SplitFrame(unsigned char *pFrame, int dwSize,
-                                   int dwJPEGLineLength, int dwVideoLineLength,
-                                   int dwVideoHeight, void *pJPEG,
-                                   int *pdwJPEGSize, void *pVideo,
-                                   int *pdwVideoSize);
-            void        setSkipFrame(int frame);
-            bool        isSupportedPreviewSize(const int width,
-                                               const int height) const;
-    /* used by auto focus thread to block until it's told to run */
-    mutable Mutex       mFocusLock;
-    mutable Condition   mFocusCondition;
-            bool        mExitAutoFocusThread;
-
-    /* used by preview thread to block until it's told to run */
-    mutable Mutex       mPreviewLock;
-    mutable Condition   mPreviewCondition;
-    mutable Condition   mPreviewStoppedCondition;
-            bool        mPreviewRunning;
-            bool        mPreviewStartDeferred;
-            bool        mExitPreviewThread;
-
-            preview_stream_ops *mPreviewWindow;
-
-    /* used to guard threading state */
-    mutable Mutex       mStateLock;
-
-    CameraParameters    mParameters;
-    CameraParameters    mInternalParameters;
-
-    int                 mFrameSizeDelta;
-    camera_memory_t     *mPreviewHeap;
-    camera_memory_t     *mRawHeap;
-    camera_memory_t     *mRecordHeap[BUFFER_COUNT_FOR_ARRAY];
-
-    buffer_handle_t *mBufferHandle[BUFFER_COUNT_FOR_ARRAY];
-    int mStride[BUFFER_COUNT_FOR_ARRAY];
-
-
-    SecCamera           *mSecCamera;
-            const __u8  *mCameraSensorName;
-
-    mutable Mutex       mSkipFrameLock;
-            int         mSkipFrame;
-
-    camera_notify_callback     mNotifyCb;
-    camera_data_callback       mDataCb;
-    camera_data_timestamp_callback mDataCbTimestamp;
-    camera_request_memory      mGetMemoryCb;
-    void   *mCallbackCookie;
-
-            int32_t     mMsgEnabled;
-
-            bool        mRecordRunning;
-    mutable Mutex       mRecordLock;
-            int         mPostViewWidth;
-            int         mPostViewHeight;
-            int         mPostViewSize;
-
-            Vector<Size> mSupportedPreviewSizes;
-
-    camera_device_t *mHalDevice;
-    static gralloc_module_t const* mGrallocHal;
-};
-
-}; // namespace android
-
-#endif
diff --git a/exynos5/hal/libcamera/mediactl.cpp b/exynos5/hal/libcamera/mediactl.cpp
deleted file mode 100644
index 82aa90a..0000000
--- a/exynos5/hal/libcamera/mediactl.cpp
+++ /dev/null
@@ -1,668 +0,0 @@
-/*
- * Media controller interface library
- *
- * Copyright (C) 2010-2011 Ideas on board SPRL
- *
- * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-//#include "config.h"
-#define LOG_NDEBUG 0
-#define LOG_TAG "Mediactl"
-
-#include <utils/Log.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-
-#include <poll.h>
-#include <signal.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <ctype.h>
-#include <stdarg.h>
-#include <linux/videodev2.h>
-#include <media.h>
-#include <linux/kdev_t.h>
-#include <linux/types.h>
-
-#include "mediactl.h"
-
-#define KF_MSG                              0x1
-#define KF_ANY                              0x2
-
-#define perror_exit(cond, func) \
-    if (cond) { \
-        fprintf(stderr, "[%s:%d]: ", __func__, __LINE__);\
-        perror(func);\
-        exit(EXIT_FAILURE);\
-    }
-
-struct media_pad *media_entity_remote_source(struct media_pad *pad)
-{
-    unsigned int i;
-
-    if (!(pad->flags & MEDIA_PAD_FL_SINK))
-        return NULL;
-
-    for (i = 0; i < pad->entity->num_links; ++i) {
-        struct media_link *link = &pad->entity->links[i];
-
-        if (!(link->flags & MEDIA_LNK_FL_ENABLED))
-            continue;
-
-        if (link->sink == pad)
-            return link->source;
-    }
-
-    return NULL;
-}
-
-struct media_entity *media_get_entity_by_name(struct media_device *media,
-                          const char *name, size_t length)
-{
-    unsigned int i;
-        struct media_entity *entity;
-        entity = (struct media_entity*)calloc(1,  sizeof(struct media_entity));
-    for (i = 0; i < media->entities_count; ++i) {
-        entity = &media->entities[i];
-
-        if (strncmp(entity->info.name, name, length) == 0)
-            return entity;
-    }
-
-    return NULL;
-}
-
-struct media_entity *media_get_entity_by_id(struct media_device *media,
-                        __u32 id)
-{
-    unsigned int i;
-
-    for (i = 0; i < media->entities_count; ++i) {
-        struct media_entity *entity = &media->entities[i];
-
-        if (entity->info.id == id)
-            return entity;
-    }
-
-    return NULL;
-}
-
-int media_setup_link(struct media_device *media,
-             struct media_pad *source,
-             struct media_pad *sink,
-             __u32 flags)
-{
-    struct media_link *link;
-    struct media_link_desc ulink;
-    unsigned int i;
-    int ret;
-
-    for (i = 0; i < source->entity->num_links; i++) {
-        link = &source->entity->links[i];
-
-        if (link->source->entity == source->entity &&
-            link->source->index == source->index &&
-            link->sink->entity == sink->entity &&
-            link->sink->index == sink->index)
-            break;
-    }
-
-    if (i == source->entity->num_links) {
-        ALOGE("%s: Link not found", __func__);
-        return -ENOENT;
-    }
-
-    /* source pad */
-    ulink.source.entity = source->entity->info.id;
-    ulink.source.index = source->index;
-    ulink.source.flags = MEDIA_PAD_FL_SOURCE;
-
-    /* sink pad */
-    ulink.sink.entity = sink->entity->info.id;
-    ulink.sink.index = sink->index;
-    ulink.sink.flags = MEDIA_PAD_FL_SINK;
-
-    ulink.flags = flags | (link->flags & MEDIA_LNK_FL_IMMUTABLE);
-
-    ret = ioctl(media->fd, MEDIA_IOC_SETUP_LINK, &ulink);
-    if (ret == -1) {
-        ALOGE("%s: Unable to setup link (%s)",
-              __func__, strerror(errno));
-        return -errno;
-    }
-
-    link->flags = ulink.flags;
-    link->twin->flags = ulink.flags;
-    return 0;
-}
-
-int media_reset_links(struct media_device *media)
-{
-    unsigned int i, j;
-    int ret;
-
-    for (i = 0; i < media->entities_count; ++i) {
-        struct media_entity *entity = &media->entities[i];
-
-        for (j = 0; j < entity->num_links; j++) {
-            struct media_link *link = &entity->links[j];
-
-            if (link->flags & MEDIA_LNK_FL_IMMUTABLE ||
-                link->source->entity != entity)
-                continue;
-
-            ret = media_setup_link(media, link->source, link->sink,
-                           link->flags & ~MEDIA_LNK_FL_ENABLED);
-            if (ret < 0)
-                return ret;
-        }
-    }
-
-    return 0;
-}
-
-static struct media_link *media_entity_add_link(struct media_entity *entity)
-{
-    if (entity->num_links >= entity->max_links) {
-        struct media_link *links = entity->links;
-        unsigned int max_links = entity->max_links * 2;
-        unsigned int i;
-
-        links = (struct media_link*)realloc(links, max_links * sizeof *links);
-        if (links == NULL)
-            return NULL;
-
-        for (i = 0; i < entity->num_links; ++i)
-            links[i].twin->twin = &links[i];
-
-        entity->max_links = max_links;
-        entity->links = links;
-    }
-
-    return &entity->links[entity->num_links++];
-}
-
-static int media_enum_links(struct media_device *media)
-{
-    ALOGV("%s: start", __func__);
-    __u32 id;
-    int ret = 0;
-
-    for (id = 1; id <= media->entities_count; id++) {
-        struct media_entity *entity = &media->entities[id - 1];
-        struct media_links_enum links;
-        unsigned int i;
-
-        links.entity = entity->info.id;
-        links.pads = (struct media_pad_desc*)malloc(entity->info.pads * sizeof(struct media_pad_desc));
-        links.links = (struct media_link_desc*)malloc(entity->info.links * sizeof(struct media_link_desc));
-
-        if (ioctl(media->fd, MEDIA_IOC_ENUM_LINKS, &links) < 0) {
-            ALOGE(
-                  "%s: Unable to enumerate pads and links (%s).",
-                  __func__, strerror(errno));
-            free(links.pads);
-            free(links.links);
-            return -errno;
-        }
-
-        for (i = 0; i < entity->info.pads; ++i) {
-            entity->pads[i].entity = entity;
-            entity->pads[i].index = links.pads[i].index;
-            entity->pads[i].flags = links.pads[i].flags;
-        }
-
-        for (i = 0; i < entity->info.links; ++i) {
-            struct media_link_desc *link = &links.links[i];
-            struct media_link *fwdlink;
-            struct media_link *backlink;
-            struct media_entity *source;
-            struct media_entity *sink;
-
-            source = media_get_entity_by_id(media, link->source.entity);
-            sink = media_get_entity_by_id(media, link->sink.entity);
-            if (source == NULL || sink == NULL) {
-                ALOGE(
-                      "WARNING entity %u link %u from %u/%u to %u/%u is invalid!",
-                      id, i, link->source.entity,
-                      link->source.index,
-                      link->sink.entity,
-                      link->sink.index);
-                ret = -EINVAL;
-            } else {
-                fwdlink = media_entity_add_link(source);
-                fwdlink->source = &source->pads[link->source.index];
-                fwdlink->sink = &sink->pads[link->sink.index];
-                fwdlink->flags = link->flags;
-
-                backlink = media_entity_add_link(sink);
-                backlink->source = &source->pads[link->source.index];
-                backlink->sink = &sink->pads[link->sink.index];
-                backlink->flags = link->flags;
-
-                fwdlink->twin = backlink;
-                backlink->twin = fwdlink;
-            }
-        }
-
-        free(links.pads);
-        free(links.links);
-    }
-    return ret;
-}
-
-#ifdef HAVE_LIBUDEV
-
-#include <libudev.h>
-
-static inline int media_udev_open(struct udev **udev)
-{
-    *udev = udev_new();
-    if (*udev == NULL)
-        return -ENOMEM;
-    return 0;
-}
-
-static inline void media_udev_close(struct udev *udev)
-{
-    if (udev != NULL)
-        udev_unref(udev);
-}
-
-static int media_get_devname_udev(struct udev *udev,
-        struct media_entity *entity)
-{
-    struct udev_device *device;
-    dev_t devnum;
-    const char *p;
-    int ret = -ENODEV;
-
-    if (udev == NULL)
-        return -EINVAL;
-
-    devnum = makedev(entity->info.v4l.major, entity->info.v4l.minor);
-    ALOGE("looking up device: %u:%u",
-          major(devnum), minor(devnum));
-    device = udev_device_new_from_devnum(udev, 'c', devnum);
-    if (device) {
-        p = udev_device_get_devnode(device);
-        if (p) {
-            strncpy(entity->devname, p, sizeof(entity->devname));
-            entity->devname[sizeof(entity->devname) - 1] = '\0';
-        }
-        ret = 0;
-    }
-
-    udev_device_unref(device);
-
-    return ret;
-}
-
-#else    /* HAVE_LIBUDEV */
-
-struct udev;
-
-static inline int media_udev_open(struct udev **udev) { return 0; }
-
-static inline void media_udev_close(struct udev *udev) { }
-
-static inline int media_get_devname_udev(struct udev *udev,
-        struct media_entity *entity)
-{
-    return -ENOTSUP;
-}
-
-#endif    /* HAVE_LIBUDEV */
-
-static int media_get_devname_sysfs(struct media_entity *entity)
-{
-    //struct stat devstat;
-    char devname[32];
-    char sysname[32];
-    char target[1024];
-    char *p;
-    int ret;
-
-    sprintf(sysname, "/sys/dev/char/%u:%u", entity->info.v4l.major,
-        entity->info.v4l.minor);
-
-    ret = readlink(sysname, target, sizeof(target));
-    if (ret < 0)
-        return -errno;
-
-    target[ret] = '\0';
-    p = strrchr(target, '/');
-    if (p == NULL)
-        return -EINVAL;
-
-    sprintf(devname, "/tmp/%s", p + 1);
-
-    ret = mknod(devname, 0666 | S_IFCHR, MKDEV(81, entity->info.v4l.minor));
-    strcpy(entity->devname, devname);
-
-    return 0;
-}
-
-int get_media_fd(struct media_device *media)
-{
-    ssize_t num;
-    int media_node;
-    char *ptr;
-    char media_buf[6];
-
-    ALOGV("%s(%s)", __func__, MEDIA_DEV);
-
-    media->fd = open(MEDIA_DEV, O_RDWR, 0);
-    if( media->fd < 0) {
-        ALOGE("Open sysfs media device failed, media->fd : 0x%p", media->fd);
-        return -1;
-    }
-    ALOGV("media->fd : %p", media->fd);
-
-    return media->fd;
-
-}
-
-static int media_enum_entities(struct media_device *media)
-{
-    struct media_entity *entity;
-    unsigned int size;
-    __u32 id;
-    int ret;
-    entity = (struct media_entity*)calloc(1,  sizeof(struct media_entity));
-    for (id = 0, ret = 0; ; id = entity->info.id) {
-        size = (media->entities_count + 1) * sizeof(*media->entities);
-        media->entities = (struct media_entity*)realloc(media->entities, size);
-
-        entity = &media->entities[media->entities_count];
-        memset(entity, 0, sizeof(*entity));
-        entity->fd = -1;
-        entity->info.id = id | MEDIA_ENT_ID_FLAG_NEXT;
-        entity->media = media;
-
-        ret = ioctl(media->fd, MEDIA_IOC_ENUM_ENTITIES, &entity->info);
-
-        if (ret < 0) {
-            ret = errno != EINVAL ? -errno : 0;
-            break;
-        }
-
-        /* Number of links (for outbound links) plus number of pads (for
-         * inbound links) is a good safe initial estimate of the total
-         * number of links.
-         */
-        entity->max_links = entity->info.pads + entity->info.links;
-
-        entity->pads = (struct media_pad*)malloc(entity->info.pads * sizeof(*entity->pads));
-        entity->links = (struct media_link*)malloc(entity->max_links * sizeof(*entity->links));
-        if (entity->pads == NULL || entity->links == NULL) {
-            ret = -ENOMEM;
-            break;
-        }
-
-        media->entities_count++;
-
-        /* Find the corresponding device name. */
-        if (media_entity_type(entity) != MEDIA_ENT_T_DEVNODE &&
-            media_entity_type(entity) != MEDIA_ENT_T_V4L2_SUBDEV)
-            continue;
-
-        /* Fall back to get the device name via sysfs */
-        media_get_devname_sysfs(entity);
-        if (ret < 0)
-            ALOGE("media_get_devname failed");
-    }
-
-    return ret;
-}
-
-static void media_debug_default(void *ptr, ...)
-{
-    va_list argptr;
-    va_start(argptr, ptr);
-    vprintf((const char*)ptr, argptr);
-    va_end(argptr);
-}
-
-void media_debug_set_handler(struct media_device *media,
-                 void (*debug_handler)(void *, ...),
-                 void *debug_priv)
-{
-    if (debug_handler) {
-        media->debug_handler = debug_handler;
-        media->debug_priv = debug_priv;
-    } else {
-        media->debug_handler = media_debug_default;
-        media->debug_priv = NULL;
-    }
-}
-
-struct media_device *media_open_debug(
-    const char *name, void (*debug_handler)(void *, ...),
-    void *debug_priv)
-{
-    struct media_device *media;
-    int ret;
-
-    media = (struct media_device*)calloc(1, sizeof(struct media_device));
-    if (media == NULL) {
-        ALOGE("%s: media : %p", __func__, media);
-        return NULL;
-    }
-
-    media_debug_set_handler(media, debug_handler, debug_priv);
-
-    ALOGV("Opening media device %s", name);
-    ALOGV("%s: media : %p", __func__, media);
-
-    media->fd = get_media_fd(media);
-    if (media->fd < 0) {
-        media_close(media);
-        ALOGE("%s: failed get_media_fd %s",
-              __func__, name);
-        return NULL;
-    }
-
-    ALOGV("%s: media->fd : %p", __func__, media->fd);
-    ret = media_enum_entities(media);
-
-    if (ret < 0) {
-        ALOGE(
-              "%s: Unable to enumerate entities for device %s (%s)",
-              __func__, name, strerror(-ret));
-        media_close(media);
-        return NULL;
-    }
-
-    ALOGV("Found %u entities", media->entities_count);
-    ALOGV("Enumerating pads and links");
-
-    ret = media_enum_links(media);
-    if (ret < 0) {
-        ALOGE(
-              "%s: Unable to enumerate pads and linksfor device %s",
-              __func__, name);
-        media_close(media);
-        return NULL;
-    }
-
-    return media;
-}
-
-struct media_device *media_open(void)
-{
-    return media_open_debug(NULL, (void (*)(void *, ...))fprintf, stdout);
-}
-
-void media_close(struct media_device *media)
-{
-    unsigned int i;
-
-    if (media->fd != -1)
-        close(media->fd);
-
-    for (i = 0; i < media->entities_count; ++i) {
-        struct media_entity *entity = &media->entities[i];
-
-        free(entity->pads);
-        free(entity->links);
-        if (entity->fd != -1)
-            close(entity->fd);
-    }
-
-    free(media->entities);
-    free(media);
-}
-
-struct media_pad *media_parse_pad(struct media_device *media,
-                  const char *p, char **endp)
-{
-    unsigned int entity_id, pad;
-    struct media_entity *entity;
-    char *end;
-
-    for (; isspace(*p); ++p);
-
-    if (*p == '"') {
-        for (end = (char *)p + 1; *end && *end != '"'; ++end);
-        if (*end != '"')
-            return NULL;
-
-        entity = media_get_entity_by_name(media, p + 1, end - p - 1);
-        if (entity == NULL)
-            return NULL;
-
-        ++end;
-    } else {
-        entity_id = strtoul(p, &end, 10);
-        entity = media_get_entity_by_id(media, entity_id);
-        if (entity == NULL)
-            return NULL;
-    }
-    for (; isspace(*end); ++end);
-
-    if (*end != ':')
-        return NULL;
-    for (p = end + 1; isspace(*p); ++p);
-
-    pad = strtoul(p, &end, 10);
-    for (p = end; isspace(*p); ++p);
-
-    if (pad >= entity->info.pads)
-        return NULL;
-
-    for (p = end; isspace(*p); ++p);
-    if (endp)
-        *endp = (char *)p;
-
-    return &entity->pads[pad];
-}
-
-struct media_link *media_parse_link(struct media_device *media,
-                    const char *p, char **endp)
-{
-    struct media_link *link;
-    struct media_pad *source;
-    struct media_pad *sink;
-    unsigned int i;
-    char *end;
-
-    source = media_parse_pad(media, p, &end);
-    if (source == NULL)
-        return NULL;
-
-    if (end[0] != '-' || end[1] != '>')
-        return NULL;
-    p = end + 2;
-
-    sink = media_parse_pad(media, p, &end);
-    if (sink == NULL)
-        return NULL;
-
-    *endp = end;
-
-    for (i = 0; i < source->entity->num_links; i++) {
-        link = &source->entity->links[i];
-
-        if (link->source == source && link->sink == sink)
-            return link;
-    }
-
-    return NULL;
-}
-
-int media_parse_setup_link(struct media_device *media,
-               const char *p, char **endp)
-{
-    struct media_link *link;
-    __u32 flags;
-    char *end;
-
-    link = media_parse_link(media, p, &end);
-    if (link == NULL) {
-        ALOGE(
-              "%s: Unable to parse link", __func__);
-        return -EINVAL;
-    }
-
-    p = end;
-    if (*p++ != '[') {
-        ALOGE("Unable to parse link flags");
-        return -EINVAL;
-    }
-
-    flags = strtoul(p, &end, 10);
-    for (p = end; isspace(*p); p++);
-    if (*p++ != ']') {
-        ALOGE("Unable to parse link flags");
-        return -EINVAL;
-    }
-
-    for (; isspace(*p); p++);
-    *endp = (char *)p;
-
-    ALOGV(
-          "Setting up link %u:%u -> %u:%u [%u]",
-          link->source->entity->info.id, link->source->index,
-          link->sink->entity->info.id, link->sink->index,
-          flags);
-
-    return media_setup_link(media, link->source, link->sink, flags);
-}
-
-int media_parse_setup_links(struct media_device *media, const char *p)
-{
-    char *end;
-    int ret;
-
-    do {
-        ret = media_parse_setup_link(media, p, &end);
-        if (ret < 0)
-            return ret;
-
-        p = end + 1;
-    } while (*end == ',');
-
-    return *end ? -EINVAL : 0;
-}
diff --git a/exynos5/hal/libcamera/mediactl.h b/exynos5/hal/libcamera/mediactl.h
deleted file mode 100644
index f28ce16..0000000
--- a/exynos5/hal/libcamera/mediactl.h
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Media controller interface library
- *
- * Copyright (C) 2010-2011 Ideas on board SPRL
- *
- * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __MEDIA_H__
-#define __MEDIA_H__
-
-#include <media.h>
-
-#define GAIA_FW_BETA 1
-
-#ifndef GAIA_FW_BETA
-#define MEDIA_DEV                          "/dev/media1"    //M5MO : External ISP
-#else
-#define MEDIA_DEV                          "/dev/media2"    //4E5  : Internal ISP
-#endif
-
-#define MEDIA_MINOR                         0
-
-#define KF_MSG                              0x1
-#define KF_ANY                              0x2
-
-struct media_link {
-    struct media_pad *source;
-    struct media_pad *sink;
-    struct media_link *twin;
-    __u32 flags;
-    __u32 padding[3];
-};
-
-struct media_pad {
-    struct media_entity *entity;
-    __u32 index;
-    __u32 flags;
-    __u32 padding[3];
-};
-
-struct media_entity {
-    struct media_device *media;
-    struct media_entity_desc info;
-    struct media_pad *pads;
-    struct media_link *links;
-    unsigned int max_links;
-    unsigned int num_links;
-
-    char devname[32];
-    int fd;
-    __u32 padding[6];
-};
-
-struct media_device {
-    int fd;
-    struct media_entity *entities;
-    unsigned int entities_count;
-    void (*debug_handler)(void *, ...);
-    void *debug_priv;
-    __u32 padding[6];
-};
-
-#define media_dbg(media, ...) \
-    (media)->debug_handler((media)->debug_priv, __VA_ARGS__)
-
-/**
- * @brief Set a handler for debug messages.
- * @param media - device instance.
- * @param debug_handler - debug message handler
- * @param debug_priv - first argument to debug message handler
- *
- * Set a handler for debug messages that will be called whenever
- * debugging information is to be printed. The handler expects an
- * fprintf-like function.
- */
-void media_debug_set_handler(
-    struct media_device *media, void (*debug_handler)(void *, ...),
-    void *debug_priv);
-
-/**
- * @brief Open a media device with debugging enabled.
- * @param name - name (including path) of the device node.
- * @param debug_handler - debug message handler
- * @param debug_priv - first argument to debug message handler
- *
- * Open the media device referenced by @a name and enumerate entities, pads and
- * links.
- *
- * Calling media_open_debug() instead of media_open() is equivalent to
- * media_open() and media_debug_set_handler() except that debugging is
- * also enabled during media_open().
- *
- * @return A pointer to a newly allocated media_device structure instance on
- * success and NULL on failure. The returned pointer must be freed with
- * media_close when the device isn't needed anymore.
- */
-struct media_device *media_open_debug(
-    const char *name, void (*debug_handler)(void *, ...),
-    void *debug_priv);
-
-/**
- * @brief Open a media device.
- * @param name - name (including path) of the device node.
- *
- * Open the media device referenced by @a name and enumerate entities, pads and
- * links.
- *
- * @return A pointer to a newly allocated media_device structure instance on
- * success and NULL on failure. The returned pointer must be freed with
- * media_close when the device isn't needed anymore.
- */
-struct media_device *media_open(void);
-
-/**
- * @brief Close a media device.
- * @param media - device instance.
- *
- * Close the @a media device instance and free allocated resources. Access to the
- * device instance is forbidden after this function returns.
- */
-void media_close(struct media_device *media);
-
-/**
- * @brief Locate the pad at the other end of a link.
- * @param pad - sink pad at one end of the link.
- *
- * Locate the source pad connected to @a pad through an enabled link. As only one
- * link connected to a sink pad can be enabled at a time, the connected source
- * pad is guaranteed to be unique.
- *
- * @return A pointer to the connected source pad, or NULL if all links connected
- * to @a pad are disabled. Return NULL also if @a pad is not a sink pad.
- */
-struct media_pad *media_entity_remote_source(struct media_pad *pad);
-
-/**
- * @brief Get the type of an entity.
- * @param entity - the entity.
- *
- * @return The type of @a entity.
- */
-static inline unsigned int media_entity_type(struct media_entity *entity)
-{
-    return entity->info.type & MEDIA_ENT_TYPE_MASK;
-}
-
-/**
- * @brief Find an entity by its name.
- * @param media - media device.
- * @param name - entity name.
- * @param length - size of @a name.
- *
- * Search for an entity with a name equal to @a name.
- *
- * @return A pointer to the entity if found, or NULL otherwise.
- */
-struct media_entity *media_get_entity_by_name(struct media_device *media,
-    const char *name, size_t length);
-
-/**
- * @brief Find an entity by its ID.
- * @param media - media device.
- * @param id - entity ID.
- *
- * Search for an entity with an ID equal to @a id.
- *
- * @return A pointer to the entity if found, or NULL otherwise.
- */
-struct media_entity *media_get_entity_by_id(struct media_device *media,
-    __u32 id);
-
-/**
- * @brief Configure a link.
- * @param media - media device.
- * @param source - source pad at the link origin.
- * @param sink - sink pad at the link target.
- * @param flags - configuration flags.
- *
- * Locate the link between @a source and @a sink, and configure it by applying
- * the new @a flags.
- *
- * Only the MEDIA_LINK_FLAG_ENABLED flag is writable.
- *
- * @return 0 on success, -1 on failure:
- *       -ENOENT: link not found
- *       - other error codes returned by MEDIA_IOC_SETUP_LINK
- */
-int media_setup_link(struct media_device *media,
-    struct media_pad *source, struct media_pad *sink,
-    __u32 flags);
-
-/**
- * @brief Reset all links to the disabled state.
- * @param media - media device.
- *
- * Disable all links in the media device. This function is usually used after
- * opening a media device to reset all links to a known state.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int media_reset_links(struct media_device *media);
-
-/**
- * @brief Parse string to a pad on the media device.
- * @param media - media device.
- * @param p - input string
- * @param endp - pointer to string where parsing ended
- *
- * Parse NULL terminated string describing a pad and return its struct
- * media_pad instance.
- *
- * @return Pointer to struct media_pad on success, NULL on failure.
- */
-struct media_pad *media_parse_pad(struct media_device *media,
-                  const char *p, char **endp);
-
-/**
- * @brief Parse string to a link on the media device.
- * @param media - media device.
- * @param p - input string
- * @param endp - pointer to p where parsing ended
- *
- * Parse NULL terminated string p describing a link and return its struct
- * media_link instance.
- *
- * @return Pointer to struct media_link on success, NULL on failure.
- */
-struct media_link *media_parse_link(struct media_device *media,
-                    const char *p, char **endp);
-
-/**
- * @brief Parse string to a link on the media device and set it up.
- * @param media - media device.
- * @param p - input string
- *
- * Parse NULL terminated string p describing a link and its configuration
- * and configure the link.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int media_parse_setup_link(struct media_device *media,
-               const char *p, char **endp);
-
-/**
- * @brief Parse string to link(s) on the media device and set it up.
- * @param media - media device.
- * @param p - input string
- *
- * Parse NULL terminated string p describing link(s) separated by
- * commas (,) and configure the link(s).
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int media_parse_setup_links(struct media_device *media, const char *p);
-
-#endif
diff --git a/exynos5/hal/libcamera/v4l2subdev.h b/exynos5/hal/libcamera/v4l2subdev.h
deleted file mode 100644
index 20e0557..0000000
--- a/exynos5/hal/libcamera/v4l2subdev.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * V4L2 subdev interface library
- *
- * Copyright (C) 2010-2011 Ideas on board SPRL
- *
- * Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __SUBDEV_H__
-#define __SUBDEV_H__
-
-#include <v4l2-subdev.h>
-
-struct media_entity;
-
-/**
- * @brief Open a sub-device.
- * @param entity - sub-device media entity.
- *
- * Open the V4L2 subdev device node associated with @a entity. The file
- * descriptor is stored in the media_entity structure.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int v4l2_subdev_open(struct media_entity *entity);
-
-/**
- * @brief Close a sub-device.
- * @param entity - sub-device media entity.
- *
- * Close the V4L2 subdev device node associated with the @a entity and opened by
- * a previous call to v4l2_subdev_open() (either explicit or implicit).
- */
-void v4l2_subdev_close(struct media_entity *entity);
-
-/**
- * @brief Retrieve the format on a pad.
- * @param entity - subdev-device media entity.
- * @param format - format to be filled.
- * @param pad - pad number.
- * @param which - identifier of the format to get.
- *
- * Retrieve the current format on the @a entity @a pad and store it in the
- * @a format structure.
- *
- * @a which is set to V4L2_SUBDEV_FORMAT_TRY to retrieve the try format stored
- * in the file handle, of V4L2_SUBDEV_FORMAT_ACTIVE to retrieve the current
- * active format.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int v4l2_subdev_get_format(struct media_entity *entity,
-    struct v4l2_mbus_framefmt *format, unsigned int pad,
-    enum v4l2_subdev_format_whence which);
-
-/**
- * @brief Set the format on a pad.
- * @param entity - subdev-device media entity.
- * @param format - format.
- * @param pad - pad number.
- * @param which - identifier of the format to set.
- *
- * Set the format on the @a entity @a pad to @a format. The driver is allowed to
- * modify the requested format, in which case @a format is updated with the
- * modifications.
- *
- * @a which is set to V4L2_SUBDEV_FORMAT_TRY to set the try format stored in the
- * file handle, of V4L2_SUBDEV_FORMAT_ACTIVE to configure the device with an
- * active format.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int v4l2_subdev_set_format(struct media_entity *entity,
-    struct v4l2_mbus_framefmt *format, unsigned int pad,
-    enum v4l2_subdev_format_whence which);
-
-/**
- * @brief Retrieve the crop rectangle on a pad.
- * @param entity - subdev-device media entity.
- * @param rect - crop rectangle to be filled.
- * @param pad - pad number.
- * @param which - identifier of the format to get.
- *
- * Retrieve the current crop rectangleon the @a entity @a pad and store it in
- * the @a rect structure.
- *
- * @a which is set to V4L2_SUBDEV_FORMAT_TRY to retrieve the try crop rectangle
- * stored in the file handle, of V4L2_SUBDEV_FORMAT_ACTIVE to retrieve the
- * current active crop rectangle.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int v4l2_subdev_get_crop(struct media_entity *entity, struct v4l2_rect *rect,
-    unsigned int pad, enum v4l2_subdev_format_whence which);
-
-/**
- * @brief Set the crop rectangle on a pad.
- * @param entity - subdev-device media entity.
- * @param rect - crop rectangle.
- * @param pad - pad number.
- * @param which - identifier of the format to set.
- *
- * Set the crop rectangle on the @a entity @a pad to @a rect. The driver is
- * allowed to modify the requested rectangle, in which case @a rect is updated
- * with the modifications.
- *
- * @a which is set to V4L2_SUBDEV_FORMAT_TRY to set the try crop rectangle
- * stored in the file handle, of V4L2_SUBDEV_FORMAT_ACTIVE to configure the
- * device with an active crop rectangle.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int v4l2_subdev_set_crop(struct media_entity *entity, struct v4l2_rect *rect,
-    unsigned int pad, enum v4l2_subdev_format_whence which);
-
-/**
- * @brief Retrieve the frame interval on a sub-device.
- * @param entity - subdev-device media entity.
- * @param interval - frame interval to be filled.
- *
- * Retrieve the current frame interval on subdev @a entity and store it in the
- * @a interval structure.
- *
- * Frame interval retrieving is usually supported only on devices at the
- * beginning of video pipelines, such as sensors.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-
-int v4l2_subdev_get_frame_interval(struct media_entity *entity,
-    struct v4l2_fract *interval);
-
-/**
- * @brief Set the frame interval on a sub-device.
- * @param entity - subdev-device media entity.
- * @param interval - frame interval.
- *
- * Set the frame interval on subdev @a entity to @a interval. The driver is
- * allowed to modify the requested frame interval, in which case @a interval is
- * updated with the modifications.
- *
- * Frame interval setting is usually supported only on devices at the beginning
- * of video pipelines, such as sensors.
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int v4l2_subdev_set_frame_interval(struct media_entity *entity,
-    struct v4l2_fract *interval);
-
-/**
- * @brief Parse a string and apply format, crop and frame interval settings.
- * @param media - media device.
- * @param p - input string
- * @param endp - pointer to string p where parsing ended (return)
- *
- * Parse string @a p and apply format, crop and frame interval settings to a
- * subdev pad specified in @a p. @a endp will be written a pointer where
- * parsing of @a p ended.
- *
- * Format strings are separeted by commas (,).
- *
- * @return 0 on success, or a negative error code on failure.
- */
-int v4l2_subdev_parse_setup_formats(struct media_device *media, const char *p);
-
-/**
- * @brief Convert media bus pixel code to string.
- * @param code - input string
- *
- * Convert media bus pixel code @a code to a human-readable string.
- *
- * @return A pointer to a string on success, NULL on failure.
- */
-const char *v4l2_subdev_pixelcode_to_string(enum v4l2_mbus_pixelcode code);
-
-/**
- * @brief Parse string to media bus pixel code.
- * @param string - input string
- * @param lenght - length of the string
- *
- * Parse human readable string @a string to an media bus pixel code.
- *
- * @return media bus pixelcode on success, -1 on failure.
- */
-enum v4l2_mbus_pixelcode v4l2_subdev_string_to_pixelcode(const char *string,
-                             unsigned int length);
-#endif
diff --git a/exynos5/hal/libfimg4x/Android.mk b/exynos5/hal/libfimg4x/Android.mk
deleted file mode 100644
index d5d18e9..0000000
--- a/exynos5/hal/libfimg4x/Android.mk
+++ /dev/null
@@ -1,22 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-ifeq ($(BOARD_USES_FIMGAPI),true)
-
-#LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include
-LOCAL_C_INCLUDES += external/skia/include/core
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES:= \
-	FimgApi.cpp   \
-	FimgExynos5.cpp
-
-LOCAL_SHARED_LIBRARIES:= liblog libutils libbinder
-
-LOCAL_MODULE:= libfimg
-
-LOCAL_PRELINK_MODULE := false
-
-include $(BUILD_SHARED_LIBRARY)
-
-endif
diff --git a/exynos5/hal/libfimg4x/FimgApi.cpp b/exynos5/hal/libfimg4x/FimgApi.cpp
deleted file mode 100644
index 444e9c9..0000000
--- a/exynos5/hal/libfimg4x/FimgApi.cpp
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
-**
-** Copyright 2009 Samsung Electronics Co, Ltd.
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-**
-**
-*/
-
-#define LOG_NDEBUG 0
-#define LOG_TAG "SKIA"
-#include <utils/Log.h>
-
-#include "FimgApi.h"
-
-struct blit_op_table optbl[] = {
-    { (int)BLIT_OP_SOLID_FILL, "FILL" },
-    { (int)BLIT_OP_CLR, "CLR" },
-    { (int)BLIT_OP_SRC, "SRC" },
-    { (int)BLIT_OP_DST, "DST" },
-    { (int)BLIT_OP_SRC_OVER, "SRC_OVER" },
-    { (int)BLIT_OP_DST_OVER, "DST_OVER" },
-    { (int)BLIT_OP_SRC_IN, "SRC_IN" },
-    { (int)BLIT_OP_DST_IN, "DST_IN" },
-    { (int)BLIT_OP_SRC_OUT, "SRC_OUT" },
-    { (int)BLIT_OP_DST_OUT, "DST_OUT" },
-    { (int)BLIT_OP_SRC_ATOP, "SRC_ATOP" },
-    { (int)BLIT_OP_DST_ATOP, "DST_ATOP" },
-    { (int)BLIT_OP_XOR, "XOR" },
-    { (int)BLIT_OP_ADD, "ADD" },
-    { (int)BLIT_OP_MULTIPLY, "MULTIPLY" },
-    { (int)BLIT_OP_SCREEN, "SCREEN" },
-    { (int)BLIT_OP_DARKEN, "DARKEN" },
-    { (int)BLIT_OP_LIGHTEN, "LIGHTEN" },
-    { (int)BLIT_OP_DISJ_SRC_OVER, "DISJ_SRC_OVER" },
-    { (int)BLIT_OP_DISJ_DST_OVER, "DISJ_DST_OVER" },
-    { (int)BLIT_OP_DISJ_SRC_IN, "DISJ_SRC_IN" },
-    { (int)BLIT_OP_DISJ_DST_IN, "DISJ_DST_IN" },
-    { (int)BLIT_OP_DISJ_SRC_OUT, "DISJ_SRC_OUT" },
-    { (int)BLIT_OP_DISJ_DST_OUT, "DISJ_DST_OUT" },
-    { (int)BLIT_OP_DISJ_SRC_ATOP, "DISJ_SRC_ATOP" },
-    { (int)BLIT_OP_DISJ_DST_ATOP, "DISJ_DST_ATOP" },
-    { (int)BLIT_OP_DISJ_XOR, "DISJ_XOR" },
-    { (int)BLIT_OP_CONJ_SRC_OVER, "CONJ_SRC_OVER" },
-    { (int)BLIT_OP_CONJ_DST_OVER, "CONJ_DST_OVER" },
-    { (int)BLIT_OP_CONJ_SRC_IN, "CONJ_SRC_IN" },
-    { (int)BLIT_OP_CONJ_DST_IN, "CONJ_DST_IN" },
-    { (int)BLIT_OP_CONJ_SRC_OUT, "CONJ_SRC_OUT" },
-    { (int)BLIT_OP_CONJ_DST_OUT, "CONJ_DST_OUT" },
-    { (int)BLIT_OP_CONJ_SRC_ATOP, "CONJ_SRC_ATOP" },
-    { (int)BLIT_OP_CONJ_DST_ATOP, "CONJ_DST_ATOP" },
-    { (int)BLIT_OP_CONJ_XOR, "CONJ_XOR" },
-    { (int)BLIT_OP_USER_COEFF, "USER_COEFF" },
-    { (int)BLIT_OP_END, "" },
-};
-
-#ifndef REAL_DEBUG
-    void VOID_FUNC(const char *format, ...)
-    {}
-#endif
-
-FimgApi::FimgApi()
-{
-    m_flagCreate = false;
-}
-
-FimgApi::~FimgApi()
-{
-    if (m_flagCreate == true)
-        PRINT("%s::this is not Destroyed fail\n", __func__);
-}
-
-bool FimgApi::Create(void)
-{
-    bool ret = false;
-
-    if (t_Lock() == false) {
-        PRINT("%s::t_Lock() fail\n", __func__);
-        goto CREATE_DONE;
-    }
-
-    if (m_flagCreate == true) {
-        PRINT("%s::Already Created fail\n", __func__);
-        goto CREATE_DONE;
-    }
-
-    if (t_Create() == false) {
-        PRINT("%s::t_Create() fail\n", __func__);
-        goto CREATE_DONE;
-    }
-
-    m_flagCreate = true;
-
-    ret = true;
-
-CREATE_DONE :
-
-    t_UnLock();
-
-    return ret;
-}
-
-bool FimgApi::Destroy(void)
-{
-    bool ret = false;
-
-    if (t_Lock() == false) {
-        PRINT("%s::t_Lock() fail\n", __func__);
-        goto DESTROY_DONE;
-    }
-
-    if (m_flagCreate == false) {
-        PRINT("%s::Already Destroyed fail\n", __func__);
-        goto DESTROY_DONE;
-    }
-
-    if (t_Destroy() == false) {
-        PRINT("%s::t_Destroy() fail\n", __func__);
-        goto DESTROY_DONE;
-    }
-
-    m_flagCreate = false;
-
-    ret = true;
-
-DESTROY_DONE :
-
-    t_UnLock();
-
-    return ret;
-}
-
-bool FimgApi::Stretch(struct fimg2d_blit *cmd)
-{
-    bool ret = false;
-
-    if (t_Lock() == false) {
-        PRINT("%s::t_Lock() fail\n", __func__);
-        goto STRETCH_DONE;
-    }
-
-    if (m_flagCreate == false) {
-        PRINT("%s::This is not Created fail\n", __func__);
-        goto STRETCH_DONE;
-    }
-
-    if (t_Stretch(cmd) == false) {
-        goto STRETCH_DONE;
-    }
-
-    ret = true;
-
-STRETCH_DONE :
-
-    t_UnLock();
-
-    return ret;
-}
-
-bool FimgApi::Sync(void)
-{
-    bool ret = false;
-
-    if (m_flagCreate == false) {
-        PRINT("%s::This is not Created fail\n", __func__);
-        goto SYNC_DONE;
-    }
-
-    if (t_Sync() == false)
-        goto SYNC_DONE;
-
-    ret = true;
-
-SYNC_DONE :
-
-    return ret;
-}
-
-bool FimgApi::t_Create(void)
-{
-    PRINT("%s::This is empty virtual function fail\n", __func__);
-    return false;
-}
-
-bool FimgApi::t_Destroy(void)
-{
-    PRINT("%s::This is empty virtual function fail\n", __func__);
-    return false;
-}
-
-bool FimgApi::t_Stretch(struct fimg2d_blit *cmd)
-{
-    PRINT("%s::This is empty virtual function fail\n", __func__);
-    return false;
-}
-
-bool FimgApi::t_Sync(void)
-{
-    PRINT("%s::This is empty virtual function fail\n", __func__);
-    return false;
-}
-
-bool FimgApi::t_Lock(void)
-{
-    PRINT("%s::This is empty virtual function fail\n", __func__);
-    return false;
-}
-
-bool FimgApi::t_UnLock(void)
-{
-    PRINT("%s::This is empty virtual function fail\n", __func__);
-    return false;
-}
-
-//---------------------------------------------------------------------------//
-// extern function
-//---------------------------------------------------------------------------//
-extern "C" int stretchFimgApi(struct fimg2d_blit *cmd)
-{
-    FimgApi * fimgApi = createFimgApi();
-
-    if (fimgApi == NULL) {
-        PRINT("%s::createFimgApi() fail\n", __func__);
-        return -1;
-    }
-
-    if (fimgApi->Stretch(cmd) == false) {
-        if (fimgApi != NULL)
-            destroyFimgApi(fimgApi);
-
-        return -1;
-    }
-
-    if (fimgApi != NULL)
-        destroyFimgApi(fimgApi);
-
-    return 0;
-}
-
-extern "C" int SyncFimgApi(void)
-{
-    FimgApi * fimgApi = createFimgApi();
-    if (fimgApi == NULL) {
-        PRINT("%s::createFimgApi() fail\n", __func__);
-        return -1;
-    }
-
-    if (fimgApi->Sync() == false) {
-        if (fimgApi != NULL)
-            destroyFimgApi(fimgApi);
-
-        return -1;
-    }
-
-    if (fimgApi != NULL)
-        destroyFimgApi(fimgApi);
-
-    return 0;
-}
-
-void printDataBlit(char *title, struct fimg2d_blit *cmd)
-{
-    ALOGI("%s\n", title);
-
-    ALOGI("    sequence_no. = %u\n", cmd->seq_no);
-    ALOGI("    blit_op      = %d(%s)\n", cmd->op, optbl[cmd->op].str);
-    ALOGI("    fill_color   = %X\n", cmd->solid_color);
-    ALOGI("    global_alpha = %u\n", (unsigned int)cmd->g_alpha);
-    ALOGI("    PREMULT      = %s\n", cmd->premult == PREMULTIPLIED ? "PREMULTIPLIED" : "NON-PREMULTIPLIED");
-    ALOGI("    do_dither    = %s\n", cmd->dither == true ? "dither" : "no-dither");
-
-    printDataBlitRotate(cmd->rotate);
-
-    printDataBlitScale(cmd->scaling);
-
-    printDataBlitImage("SRC", cmd->src);
-    printDataBlitImage("DST", cmd->dst);
-    printDataBlitImage("MSK", cmd->msk);
-
-    printDataBlitRect("SRC", cmd->src_rect);
-    printDataBlitRect("DST", cmd->dst_rect);
-    printDataBlitRect("MSK", cmd->msk_rect);
-
-    printDataBlitClip(cmd->clipping);
-}
-
-void printDataBlitImage(char *title, struct fimg2d_image *image)
-{
-    if (NULL != image) {
-    ALOGI("    Image_%s\n", title);
-    ALOGI("        addr = %X\n", image->addr.start);
-    ALOGI("        size = %u\n", image->addr.size);
-    ALOGI("        (width, height) = (%d, %d)\n", image->width, image->height);
-    ALOGI("        format = %d\n", image->fmt);
-    } else
-        ALOGI("    Image_%s : NULL\n", title);
-}
-
-void printDataBlitRect(char *title, struct fimg2d_rect *rect)
-{
-    if (NULL != rect) {
-        ALOGI("    RECT_%s\n", title);
-        ALOGI("        (x1, y1) = (%d, %d)\n", rect->x1, rect->y1);
-        ALOGI("        (x2, y2) = (%d, %d)\n", rect->x2, rect->y2);
-        ALOGI("        (width, height) = (%d, %d)\n", rect->x2 - rect->x1, rect->y2 - rect->y1);
-    } else
-        ALOGI("    RECT_%s : NULL\n", title);
-}
-
-void printDataBlitRotate(enum rotation rotate)
-{
-    ALOGI("    ROTATE : %d\n", rotate);
-}
-
-void printDataBlitClip(struct fimg2d_clip *clip)
-{
-    if (NULL != clip) {
-        ALOGI("    CLIP\n");
-        ALOGI("        clip %s\n", clip->enable == true ? "enabled" : "disabled");
-        ALOGI("        (x1, y1) = (%d, %d)\n", clip->x1, clip->y1);
-        ALOGI("        (x2, y2) = (%d, %d)\n", clip->x2, clip->y2);
-        ALOGI("        (width, hight) = (%d, %d)\n", clip->x2 - clip->x1, clip->y2 - clip->y1);
-    } else
-        ALOGI("    CLIP : NULL\n");
-}
-
-void printDataBlitScale(struct fimg2d_scale *scaling)
-{
-    if (NULL != scaling) {
-        ALOGI("    SCALING\n");
-        ALOGI("        scale_mode : %s\n", scaling->mode == 0 ?
-                                          "NO_SCALING" :
-                              (scaling->mode == 1 ? "SCALING_NEAREST" : "SCALING_BILINEAR"));
-        ALOGI("        scaling_factor_unit : %s\n", scaling->factor == 0 ? "PERCENT" : "PIXEL");
-
-        if (scaling->factor == 0)
-            ALOGI("        scaling_factor : (scale_w, scale_y) = (%d, %d)\n", scaling->scale_w, scaling->scale_h);
-        else {
-            ALOGI("        src : (src_w, src_h) = (%d, %d)\n", scaling->src_w, scaling->src_h);
-            ALOGI("        dst : (dst_w, dst_h) = (%d, %d)\n", scaling->dst_w, scaling->dst_h);
-            ALOGI("        scaling_factor : (scale_w, scale_y) = (%3.2f, %3.2f)\n", (double)scaling->dst_w / scaling->src_w, (double)scaling->dst_h / scaling->src_h);
-        }
-    } else
-        ALOGI("    SCALING : NULL(NO SCALE MODE)\n");
-
-}
-
-void printDataMatrix(int matrixType)
-{
-    ALOGI("    MATRIX\n");
-
-    if (matrixType & SkMatrix::kIdentity_Mask)
-        ALOGI("        Matrix_type : Identity_Mask\n");
-
-    if (matrixType & SkMatrix::kTranslate_Mask)
-        ALOGI("        Matrix_type : Translate_Mask(the matrix has translation)\n");
-
-    if (matrixType & SkMatrix::kScale_Mask)
-        ALOGI("        Matrix_type : Scale_Mask(the matrix has X or Y scale)\n");
-
-    if (matrixType & SkMatrix::kAffine_Mask)
-        ALOGI("        Matrix_type : Affine_Mask(the matrix skews or rotates)\n");
-
-    if (matrixType & SkMatrix::kPerspective_Mask)
-        ALOGI("        Matrix_type : Perspective_Mask(the matrix is in perspective)\n");
-}
diff --git a/exynos5/hal/libfimg4x/FimgApi.h b/exynos5/hal/libfimg4x/FimgApi.h
deleted file mode 100644
index 378fd1b..0000000
--- a/exynos5/hal/libfimg4x/FimgApi.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-**
-** Copyright 2009 Samsung Electronics Co, Ltd.
-** Copyright 2008, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-**
-**
-*/
-
-#ifndef FIMG_API_H
-#define FIMG_API_H
-
-#include <utils/Log.h>
-#include "SkMatrix.h"
-#include "sec_g2d_4x.h"
-
-#define REAL_DEBUG
-#define ANDROID_LOG
-
-#if defined(REAL_DEBUG)
-#ifdef ANDROID_LOG
-#define PRINT  ALOGE
-#define PRINTD ALOGD
-#else
-#define PRINT  printf
-#define PRINTD printf
-#endif
-#else
-void VOID_FUNC(const char *format, ...);
-
-#define PRINT  VOID_FUNC
-#define PRINTD VOID_FUNC
-#endif
-
-#ifdef __cplusplus
-
-struct blit_op_table {
-    int op;
-    const char *str;
-};
-
-extern struct blit_op_table optbl[];
-
-class FimgApi
-{
-public:
-#endif
-
-#ifdef __cplusplus
-private :
-    bool    m_flagCreate;
-
-protected :
-    FimgApi();
-    FimgApi(const FimgApi& rhs) {}
-    virtual ~FimgApi();
-
-public:
-    bool        Create(void);
-    bool        Destroy(void);
-    inline bool FlagCreate(void) { return m_flagCreate; }
-    bool        Stretch(struct fimg2d_blit *cmd);
-    bool        Sync(void);
-
-protected:
-    virtual bool t_Create(void);
-    virtual bool t_Destroy(void);
-    virtual bool t_Stretch(struct fimg2d_blit *cmd);
-    virtual bool t_Sync(void);
-    virtual bool t_Lock(void);
-    virtual bool t_UnLock(void);
-
-};
-#endif
-
-#ifdef __cplusplus
-extern "C"
-#endif
-struct FimgApi *createFimgApi();
-
-#ifdef __cplusplus
-extern "C"
-#endif
-void destroyFimgApi(FimgApi *ptrFimgApi);
-
-#ifdef __cplusplus
-extern "C"
-#endif
-int stretchFimgApi(struct fimg2d_blit *cmd);
-#ifdef __cplusplus
-extern "C"
-#endif
-int SyncFimgApi(void);
-
-void printDataBlit(char *title, struct fimg2d_blit *cmd);
-void printDataBlitRotate(enum rotation rotate);
-void printDataBlitImage(char *title, struct fimg2d_image *image);
-void printDataBlitRect(char *title, struct fimg2d_rect *rect);
-void printDataBlitClip(struct fimg2d_clip *clip);
-void printDataBlitScale(struct fimg2d_scale *scaling);
-void printDataMatrix(int matrixType);
-
-#endif //FIMG_API_H
diff --git a/exynos5/hal/libfimg4x/FimgExynos5.cpp b/exynos5/hal/libfimg4x/FimgExynos5.cpp
deleted file mode 100644
index 87c8527..0000000
--- a/exynos5/hal/libfimg4x/FimgExynos5.cpp
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
-**
-** Copyright 2009 Samsung Electronics Co, Ltd.
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-**
-**
-*/
-
-#define LOG_NDEBUG 0
-#define LOG_TAG "FimgExynos5"
-#include <utils/Log.h>
-
-#include "FimgExynos5.h"
-
-namespace android
-{
-Mutex      FimgV4x::m_instanceLock;
-int        FimgV4x::m_curFimgV4xIndex = 0;
-int        FimgV4x::m_numOfInstance    = 0;
-FimgApi *  FimgV4x::m_ptrFimgApiList[NUMBER_FIMG_LIST] = {NULL, };
-
-//---------------------------------------------------------------------------//
-
-FimgV4x::FimgV4x()
-         : m_g2dFd(0),
-           m_g2dVirtAddr(NULL),
-           m_g2dSize(0),
-           m_g2dSrcVirtAddr(NULL),
-           m_g2dSrcSize(0),
-           m_g2dDstVirtAddr(NULL),
-           m_g2dDstSize(0)
-{
-    m_lock = new Mutex(Mutex::SHARED, "FimgV4x");
-}
-
-FimgV4x::~FimgV4x()
-{
-    delete m_lock;
-}
-
-FimgApi *FimgV4x::CreateInstance()
-{
-    Mutex::Autolock autolock(m_instanceLock);
-
-    FimgApi *ptrFimg = NULL;
-
-    for(int i = m_curFimgV4xIndex; i < NUMBER_FIMG_LIST; i++) {
-        if (m_ptrFimgApiList[i] == NULL)
-            m_ptrFimgApiList[i] = new FimgV4x;
-
-        if (m_ptrFimgApiList[i]->FlagCreate() == false) {
-            if (m_ptrFimgApiList[i]->Create() == false) {
-                PRINT("%s::Create(%d) fail\n", __func__, i);
-                goto CreateInstance_End;
-            }
-            else
-                m_numOfInstance++;
-        }
-
-        if (i < NUMBER_FIMG_LIST - 1)
-            m_curFimgV4xIndex = i + 1;
-        else
-            m_curFimgV4xIndex = 0;
-
-        ptrFimg = m_ptrFimgApiList[i];
-        goto CreateInstance_End;
-    }
-
-CreateInstance_End :
-
-    return ptrFimg;
-}
-
-void FimgV4x::DestroyInstance(FimgApi * ptrFimgApi)
-{
-    Mutex::Autolock autolock(m_instanceLock);
-
-    for(int i = 0; i < NUMBER_FIMG_LIST; i++) {
-        if (m_ptrFimgApiList[i] != NULL && m_ptrFimgApiList[i] == ptrFimgApi) {
-            if (m_ptrFimgApiList[i]->FlagCreate() == true && m_ptrFimgApiList[i]->Destroy() == false) {
-                PRINT("%s::Destroy() fail\n", __func__);
-            } else {
-                FimgV4x * tempFimgV4x = (FimgV4x *)m_ptrFimgApiList[i];
-                delete tempFimgV4x;
-                m_ptrFimgApiList[i] = NULL;
-
-                m_numOfInstance--;
-            }
-
-            break;
-        }
-    }
-}
-
-void FimgV4x::DestroyAllInstance(void)
-{
-    Mutex::Autolock autolock(m_instanceLock);
-
-    for(int i = 0; i < NUMBER_FIMG_LIST; i++) {
-        if (m_ptrFimgApiList[i] != NULL) {
-            if (m_ptrFimgApiList[i]->FlagCreate() == true
-               && m_ptrFimgApiList[i]->Destroy() == false) {
-                    PRINT("%s::Destroy() fail\n", __func__);
-            } else {
-                FimgV4x * tempFimgV4x = (FimgV4x *)m_ptrFimgApiList[i];
-                delete tempFimgV4x;
-                m_ptrFimgApiList[i] = NULL;
-            }
-        }
-    }
-}
-
-bool FimgV4x::t_Create(void)
-{
-    bool ret = true;
-
-    if (m_CreateG2D() == false) {
-        PRINT("%s::m_CreateG2D() fail \n", __func__);
-
-        if (m_DestroyG2D() == false)
-            PRINT("%s::m_DestroyG2D() fail \n", __func__);
-
-        ret = false;
-    }
-
-    return ret;
-}
-
-bool FimgV4x::t_Destroy(void)
-{
-    bool ret = true;
-
-    if (m_DestroyG2D() == false) {
-        PRINT("%s::m_DestroyG2D() fail \n", __func__);
-        ret = false;
-    }
-
-    return ret;
-}
-
-bool FimgV4x::t_Stretch(struct fimg2d_blit *cmd)
-{
-#ifdef CHECK_FIMGV4x_PERFORMANCE
-#define NUM_OF_STEP (10)
-    StopWatch   stopWatch("CHECK_FIMGV4x_PERFORMANCE");
-    const char *stopWatchName[NUM_OF_STEP];
-    nsecs_t     stopWatchTime[NUM_OF_STEP];
-    int         stopWatchIndex = 0;
-#endif // CHECK_FIMGV4x_PERFORMANCE
-
-    if (m_DoG2D(cmd) == false) {
-        goto STRETCH_FAIL;
-    }
-
-#ifdef G2D_NONE_BLOCKING_MODE
-    if (m_PollG2D(&m_g2dPoll) == false)
-    {
-        PRINT("%s::m_PollG2D() fail\n", __func__);
-        goto STRETCH_FAIL;
-    }
-#endif
-
-    #ifdef CHECK_FIMGV4x_PERFORMANCE
-        m_PrintFimgV4xPerformance(src, dst, stopWatchIndex, stopWatchName, stopWatchTime);
-    #endif // CHECK_FIMGV4x_PERFORMANCE
-
-    return true;
-
-STRETCH_FAIL:
-    return false;
-
-}
-
-bool FimgV4x::t_Sync(void)
-{
-    if (m_PollG2D(&m_g2dPoll) == false)
-    {
-        PRINT("%s::m_PollG2D() fail\n", __func__);
-        goto SYNC_FAIL;
-    }
-    return true;
-
-SYNC_FAIL:
-    return false;
-
-}
-
-bool FimgV4x::t_Lock(void)
-{
-    m_lock->lock();
-    return true;
-}
-
-bool FimgV4x::t_UnLock(void)
-{
-    m_lock->unlock();
-    return true;
-}
-
-bool FimgV4x::m_CreateG2D(void)
-{
-    void * mmap_base;
-
-    if (m_g2dFd != 0) {
-        PRINT("%s::m_g2dFd(%d) is not 0 fail\n", __func__, m_g2dFd);
-        return false;
-    }
-
-#ifdef G2D_NONE_BLOCKING_MODE
-    m_g2dFd = open(SEC_G2D_DEV_NAME, O_RDWR | O_NONBLOCK);
-#else
-    m_g2dFd = open(SEC_G2D_DEV_NAME, O_RDWR);
-#endif
-    if (m_g2dFd < 0) {
-        PRINT("%s::open(%s) fail(%s)\n", __func__, SEC_G2D_DEV_NAME, strerror(errno));
-        m_g2dFd = 0;
-        return false;
-    }
-
-    memset(&m_g2dPoll, 0, sizeof(m_g2dPoll));
-    m_g2dPoll.fd     = m_g2dFd;
-    m_g2dPoll.events = POLLOUT | POLLERR;
-
-    return true;
-}
-
-bool FimgV4x::m_DestroyG2D(void)
-{
-    if (m_g2dVirtAddr != NULL) {
-        munmap(m_g2dVirtAddr, m_g2dSize);
-        m_g2dVirtAddr = NULL;
-        m_g2dSize = 0;
-    }
-
-    if (0 < m_g2dFd) {
-        close(m_g2dFd);
-    }
-    m_g2dFd = 0;
-
-    return true;
-}
-
-bool FimgV4x::m_DoG2D(struct fimg2d_blit *cmd)
-{
-
-    if (ioctl(m_g2dFd, FIMG2D_BITBLT_BLIT, cmd) < 0)
-        return false;
-
-    return true;
-}
-
-inline bool FimgV4x::m_PollG2D(struct pollfd * events)
-{
-#define G2D_POLL_TIME (1000)
-
-    int ret;
-
-    ret = poll(events, 1, G2D_POLL_TIME);
-
-    if (ret < 0) {
-        PRINT("%s::poll fail \n", __func__);
-        return false;
-    }
-    else if (ret == 0) {
-        PRINT("%s::No data in %d milli secs..\n", __func__, G2D_POLL_TIME);
-        return false;
-    }
-
-    return true;
-}
-
-//---------------------------------------------------------------------------//
-// extern function
-//---------------------------------------------------------------------------//
-extern "C" struct FimgApi * createFimgApi()
-{
-    if (fimgApiAutoFreeThread == 0)
-        fimgApiAutoFreeThread = new FimgApiAutoFreeThread();
-    else
-        fimgApiAutoFreeThread->SetOneMoreSleep();
-
-    return FimgV4x::CreateInstance();
-}
-
-extern "C" void destroyFimgApi(FimgApi * ptrFimgApi)
-{
-    // Dont' call DestroyInstance.
-}
-
-}; // namespace android
diff --git a/exynos5/hal/libfimg4x/FimgExynos5.h b/exynos5/hal/libfimg4x/FimgExynos5.h
deleted file mode 100644
index 71295a6..0000000
--- a/exynos5/hal/libfimg4x/FimgExynos5.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
-**
-** Copyright 2008, The Android Open Source Project
-** Copyright 2009 Samsung Electronics Co, Ltd. All Rights Reserved.
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-**
-**
-*/
-
-#ifndef FIMG_EXYNOS5_H
-#define FIMG_EXYNOS5_H
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#include <sys/ioctl.h>
-#include <sys/poll.h>
-#include <sys/stat.h>
-
-#include <linux/android_pmem.h>
-#include <utils/threads.h>
-#include <utils/StopWatch.h>
-
-#include "FimgApi.h"
-
-#include "sec_g2d_4x.h"
-
-namespace android
-{
-
-#define NUMBER_FIMG_LIST           (1)  // kcoolsw : because of pmem
-#define GET_RECT_SIZE(rect)        ((rect->full_w) * (rect->h) * (rect->bytes_per_pixel))
-#define GET_REAL_SIZE(rect)        ((rect->full_w) * (rect->h) * (rect->bytes_per_pixel))
-#define GET_START_ADDR(rect)       (rect->virt_addr + ((rect->y * rect->full_w) * rect->bytes_per_pixel))
-#define SLEEP_TIME                 (3000000) // 3 sec
-
-//---------------------------------------------------------------------------//
-// class FimgV4x : public FimgBase
-//---------------------------------------------------------------------------//
-class FimgV4x : public FimgApi
-{
-private :
-    int             m_g2dFd;
-
-    unsigned char  *m_g2dVirtAddr;
-    unsigned int    m_g2dSize;
-    unsigned char  *m_g2dSrcVirtAddr;
-    unsigned int    m_g2dSrcSize;
-    unsigned char  *m_g2dDstVirtAddr;
-    unsigned int    m_g2dDstSize;
-    struct pollfd   m_g2dPoll;
-
-    Mutex          *m_lock;
-
-    static Mutex    m_instanceLock;
-    static int      m_curFimgV4xIndex;
-    static int      m_numOfInstance;
-
-    static FimgApi *m_ptrFimgApiList[NUMBER_FIMG_LIST];
-
-protected :
-    FimgV4x();
-    virtual ~FimgV4x();
-
-public:
-    static FimgApi *CreateInstance();
-    static void     DestroyInstance(FimgApi *ptrFimgApi);
-    static void     DestroyAllInstance(void);
-
-protected:
-    virtual bool    t_Create(void);
-    virtual bool    t_Destroy(void);
-    virtual bool    t_Stretch(struct fimg2d_blit *cmd);
-    virtual bool    t_Sync(void);
-    virtual bool    t_Lock(void);
-    virtual bool    t_UnLock(void);
-
-private:
-    bool            m_CreateG2D(void);
-    bool            m_DestroyG2D(void);
-
-    bool            m_DoG2D(struct fimg2d_blit *cmd);
-
-    inline bool     m_PollG2D(struct pollfd *events);
-
-    inline int      m_ColorFormatFimgApi2FimgHw(int colorFormat);
-};
-
-class FimgApiAutoFreeThread;
-
-static sp<FimgApiAutoFreeThread> fimgApiAutoFreeThread = 0;
-
-class FimgApiAutoFreeThread : public Thread
-{
-private:
-    bool mOneMoreSleep;
-    bool mDestroyed;
-
-public:
-    FimgApiAutoFreeThread(void):
-                Thread(false),
-                mOneMoreSleep(true),
-                mDestroyed(false)
-                { }
-    ~FimgApiAutoFreeThread(void)
-    {
-        if (mDestroyed == false)
-        {
-            FimgV4x::DestroyAllInstance();
-            mDestroyed = true;
-        }
-    }
-
-    virtual void onFirstRef()
-    {
-        run("FimgApiAutoFreeThread", PRIORITY_BACKGROUND);
-    }
-
-    virtual bool threadLoop()
-    {
-
-        if (mOneMoreSleep == true)
-        {
-            mOneMoreSleep = false;
-            usleep(SLEEP_TIME);
-
-            return true;
-        }
-        else
-        {
-            if (mDestroyed == false)
-            {
-                FimgV4x::DestroyAllInstance();
-                mDestroyed = true;
-            }
-
-            fimgApiAutoFreeThread = 0;
-
-            return false;
-        }
-    }
-
-    void SetOneMoreSleep(void)
-    {
-        mOneMoreSleep = true;
-    }
-};
-
-}; // namespace android
-
-#endif // FIMG_EXYNOS5_H
diff --git a/exynos5/hal/libfimg4x/sec_g2d_4x.h b/exynos5/hal/libfimg4x/sec_g2d_4x.h
deleted file mode 100644
index b9ddbb2..0000000
--- a/exynos5/hal/libfimg4x/sec_g2d_4x.h
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright 2011, Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef __SEC_G2D_4X_H
-#define __SEC_G2D_4X_H __FILE__
-
-#define SEC_G2D_DEV_NAME             "/dev/fimg2d"
-
-/* ioctl commands */
-#define FIMG2D_IOCTL_MAGIC           'F'
-#define FIMG2D_BITBLT_BLIT           _IOWR(FIMG2D_IOCTL_MAGIC, 0, struct fimg2d_blit)
-#define FIMG2D_BITBLT_SYNC           _IO(FIMG2D_IOCTL_MAGIC, 1)
-#define FIMG2D_BITBLT_VERSION        _IOR(FIMG2D_IOCTL_MAGIC, 2, struct fimg2d_version)
-
-#define G2D_ALPHA_VALUE_MAX          (255)
-
-enum addr_space {
-    ADDR_UNKNOWN,
-    ADDR_PHYS,
-    ADDR_KERN,
-    ADDR_USER,
-    ADDR_DEVICE,
-};
-
-/**
- * DO NOT CHANGE THIS ORDER
- */
-enum pixel_order {
-    AX_RGB = 0,
-    RGB_AX,
-    AX_BGR,
-    BGR_AX,
-    ARGB_ORDER_END,
-
-    P1_CRY1CBY0,
-    P1_CBY1CRY0,
-    P1_Y1CRY0CB,
-    P1_Y1CBY0CR,
-    P1_ORDER_END,
-
-    P2_CRCB,
-    P2_CBCR,
-    P2_ORDER_END,
-};
-
-/**
- * DO NOT CHANGE THIS ORDER
- */
-enum color_format {
-    CF_XRGB_8888 = 0,
-    CF_ARGB_8888,
-    CF_RGB_565,
-    CF_XRGB_1555,
-    CF_ARGB_1555,
-    CF_XRGB_4444,
-    CF_ARGB_4444,
-    CF_RGB_888,
-    CF_YCBCR_444,
-    CF_YCBCR_422,
-    CF_YCBCR_420,
-    CF_A8,
-    CF_L8,
-    SRC_DST_FORMAT_END,
-
-    CF_MSK_1BIT,
-    CF_MSK_4BIT,
-    CF_MSK_8BIT,
-    CF_MSK_16BIT_565,
-    CF_MSK_16BIT_1555,
-    CF_MSK_16BIT_4444,
-    CF_MSK_32BIT_8888,
-    MSK_FORMAT_END,
-};
-
-enum rotation {
-    ORIGIN,
-    ROT_90,    /* clockwise */
-    ROT_180,
-    ROT_270,
-    XFLIP,    /* x-axis flip */
-    YFLIP,    /* y-axis flip */
-};
-
-/**
- * @NO_REPEAT: no effect
- * @REPEAT_NORMAL: repeat horizontally and vertically
- * @REPEAT_PAD: pad with pad color
- * @REPEAT_REFLECT: reflect horizontally and vertically
- * @REPEAT_CLAMP: pad with edge color of original image
- *
- * DO NOT CHANGE THIS ORDER
- */
-enum repeat {
-    NO_REPEAT = 0,
-    REPEAT_NORMAL,    /* default setting */
-    REPEAT_PAD,
-    REPEAT_REFLECT, REPEAT_MIRROR = REPEAT_REFLECT,
-    REPEAT_CLAMP,
-};
-
-enum scaling {
-    NO_SCALING,
-    SCALING_NEAREST,
-    SCALING_BILINEAR,
-};
-
-/**
- * @SCALING_PERCENTAGE: percentage of width, height
- * @SCALING_PIXELS: coordinate of src, dest
- */
-enum scaling_factor {
-    SCALING_PERCENTAGE,
-    SCALING_PIXELS,
-};
-
-/**
- * premultiplied alpha
- */
-enum premultiplied {
-    PREMULTIPLIED,
-    NON_PREMULTIPLIED,
-};
-
-/**
- * @TRANSP: discard bluescreen color
- * @BLUSCR: replace bluescreen color with background color
- */
-enum bluescreen {
-    OPAQUE,
-    TRANSP,
-    BLUSCR,
-};
-
-/**
- * DO NOT CHANGE THIS ORDER
- */
-enum blit_op {
-    BLIT_OP_SOLID_FILL = 0,
-
-    BLIT_OP_CLR,
-    BLIT_OP_SRC, BLIT_OP_SRC_COPY = BLIT_OP_SRC,
-    BLIT_OP_DST,
-    BLIT_OP_SRC_OVER,
-    BLIT_OP_DST_OVER, BLIT_OP_OVER_REV = BLIT_OP_DST_OVER,
-    BLIT_OP_SRC_IN,
-    BLIT_OP_DST_IN, BLIT_OP_IN_REV = BLIT_OP_DST_IN,
-    BLIT_OP_SRC_OUT,
-    BLIT_OP_DST_OUT, BLIT_OP_OUT_REV = BLIT_OP_DST_OUT,
-    BLIT_OP_SRC_ATOP,
-    BLIT_OP_DST_ATOP, BLIT_OP_ATOP_REV = BLIT_OP_DST_ATOP,
-    BLIT_OP_XOR,
-
-    BLIT_OP_ADD,
-    BLIT_OP_MULTIPLY,
-    BLIT_OP_SCREEN,
-    BLIT_OP_DARKEN,
-    BLIT_OP_LIGHTEN,
-
-    BLIT_OP_DISJ_SRC_OVER,
-    BLIT_OP_DISJ_DST_OVER, BLIT_OP_SATURATE = BLIT_OP_DISJ_DST_OVER,
-    BLIT_OP_DISJ_SRC_IN,
-    BLIT_OP_DISJ_DST_IN, BLIT_OP_DISJ_IN_REV = BLIT_OP_DISJ_DST_IN,
-    BLIT_OP_DISJ_SRC_OUT,
-    BLIT_OP_DISJ_DST_OUT, BLIT_OP_DISJ_OUT_REV = BLIT_OP_DISJ_DST_OUT,
-    BLIT_OP_DISJ_SRC_ATOP,
-    BLIT_OP_DISJ_DST_ATOP, BLIT_OP_DISJ_ATOP_REV = BLIT_OP_DISJ_DST_ATOP,
-    BLIT_OP_DISJ_XOR,
-
-    BLIT_OP_CONJ_SRC_OVER,
-    BLIT_OP_CONJ_DST_OVER, BLIT_OP_CONJ_OVER_REV = BLIT_OP_CONJ_DST_OVER,
-    BLIT_OP_CONJ_SRC_IN,
-    BLIT_OP_CONJ_DST_IN, BLIT_OP_CONJ_IN_REV = BLIT_OP_CONJ_DST_IN,
-    BLIT_OP_CONJ_SRC_OUT,
-    BLIT_OP_CONJ_DST_OUT, BLIT_OP_CONJ_OUT_REV = BLIT_OP_CONJ_DST_OUT,
-    BLIT_OP_CONJ_SRC_ATOP,
-    BLIT_OP_CONJ_DST_ATOP, BLIT_OP_CONJ_ATOP_REV = BLIT_OP_CONJ_DST_ATOP,
-    BLIT_OP_CONJ_XOR,
-
-    /* Add new operation type here */
-
-    /* user select coefficient manually */
-    BLIT_OP_USER_COEFF,
-
-    /* end of blit operation */
-    BLIT_OP_END,
-
-    /* driver not supporting format */
-    BLIT_OP_NOT_SUPPORTED
-};
-
-#define MAX_FIMG2D_BLIT_OP (int)BLIT_OP_END
-
-struct fimg2d_version {
-    unsigned int hw;
-    unsigned int sw;
-};
-
-/**
- * @start: start address or unique id of image
- * @size: whole length of allocated image
- * @cacheable: memory is cacheable
- * @pinnable: memory is pinnable. currently not supported.
- */
-struct fimg2d_addr {
-    enum addr_space type;
-    unsigned long start;
-    size_t size;
-    int cacheable;
-    int pinnable;
-};
-
-struct fimg2d_rect {
-    int x1;
-    int y1;
-    int x2;    /* x1 + width */
-    int y2; /* y1 + height */
-};
-
-/**
- * if factor is percentage, scale_w and scale_h are valid
- * if factor is pixels, src_w, src_h, dst_w, dst_h are valid
- */
-struct fimg2d_scale {
-    enum scaling mode;
-    enum scaling_factor factor;
-
-    /* percentage */
-    int scale_w;
-    int scale_h;
-
-    /* pixels */
-    int src_w, src_h;
-    int dst_w, dst_h;
-};
-
-/**
- * coordinate from start address(0,0) of image
- */
-struct fimg2d_clip {
-    bool enable;
-    int x1;
-    int y1;
-    int x2;    /* x1 + width */
-    int y2; /* y1 + height */
-};
-
-struct fimg2d_repeat {
-    enum repeat mode;
-    unsigned long pad_color;
-};
-
-/**
- * @bg_color: bg_color is valid only if bluescreen mode is BLUSCR.
- */
-struct fimg2d_bluscr {
-    enum bluescreen mode;
-    unsigned long bs_color;
-    unsigned long bg_color;
-};
-
-/**
- * @plane2: address info for CbCr in YCbCr 2plane mode
- */
-struct fimg2d_image {
-    struct fimg2d_addr addr;
-    struct fimg2d_addr plane2;
-    int width;
-    int height;
-    int stride;
-    enum pixel_order order;
-    enum color_format fmt;
-};
-
-struct fimg2d_param {
-    enum blit_op op;
-    unsigned long fillcolor;
-    unsigned char g_alpha;
-    enum premultiplied premult;
-    bool dither;
-    enum rotation rotate;
-    struct fimg2d_scale *scaling;
-    struct fimg2d_repeat *repeat;
-    struct fimg2d_bluscr *bluscr;
-    struct fimg2d_clip *clipping;
-};
-
-/**
- * @g_alpha: 0xff is opaque, 0x0 is transparnet
- * @seq_no: used for debugging
- */
-struct fimg2d_blit {
-    enum blit_op op;
-
-    enum premultiplied premult;
-    unsigned char g_alpha;
-    bool dither;
-    enum rotation rotate;
-    struct fimg2d_scale *scaling;
-    struct fimg2d_repeat *repeat;
-    struct fimg2d_bluscr *bluscr;
-    struct fimg2d_clip *clipping;
-
-    unsigned long solid_color;
-    struct fimg2d_image *src;
-    struct fimg2d_image *dst;
-    struct fimg2d_image *msk;
-
-    struct fimg2d_rect *src_rect;
-    struct fimg2d_rect *dst_rect;
-    struct fimg2d_rect *msk_rect;
-
-    unsigned int seq_no;
-};
-#endif /* __SEC_G2D_4X_H__ */
diff --git a/exynos5/hal/libgralloc_ump/Android.mk b/exynos5/hal/libgralloc_ump/Android.mk
deleted file mode 100644
index a4354d4..0000000
--- a/exynos5/hal/libgralloc_ump/Android.mk
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-# Copyright (C) 2010 ARM Limited. All rights reserved.
-#
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-LOCAL_PATH := $(call my-dir)
-
-# HAL module implemenation, not prelinked and stored in
-# hw/<OVERLAY_HARDWARE_MODULE_ID>.<ro.product.board>.so
-include $(CLEAR_VARS)
-LOCAL_PRELINK_MODULE := false
-LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
-LOCAL_SHARED_LIBRARIES := liblog libcutils libGLESv1_CM libGLES_mali libion
-LOCAL_MODULE_TAGS := eng optional
-
-# Include the UMP header files
-LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include
-
-LOCAL_SRC_FILES := \
-	gralloc_module.cpp \
-	alloc_device.cpp \
-	framebuffer_device.cpp
-
-# For now we override arch and ABI values to allow us to work with a
-# libmali that has been forced to armv7, eventually we can let android
-# pick for us
-
-ifeq ($(TARGET_PRODUCT), armboard_v7a)
-# Support for ARM platforms
-LOCAL_CFLAGS:= -DLOG_TAG=\"gralloc\" -DGRALLOC_16_BITS -DSTANDARD_LINUX_SCREEN \
-	-march=armv7-a \
-	-mfloat-abi=softfp
-LOCAL_MODULE := gralloc.default
-
-else
-#Default to goldfish
-LOCAL_CFLAGS:= -DLOG_TAG=\"gralloc\" -DSTANDARD_LINUX_SCREEN \
-	-march=armv7-a \
-	-mfloat-abi=softfp \
-	-DVITHAR_HACK
-
-LOCAL_MODULE := gralloc.smdk5250
-endif
-
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/exynos5/hal/libgralloc_ump/alloc_device.cpp b/exynos5/hal/libgralloc_ump/alloc_device.cpp
deleted file mode 100644
index 52c8724..0000000
--- a/exynos5/hal/libgralloc_ump/alloc_device.cpp
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
- *
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <string.h>
-#include <errno.h>
-#include <pthread.h>
-
-#include <cutils/log.h>
-#include <cutils/atomic.h>
-#include <hardware/hardware.h>
-#include <hardware/gralloc.h>
-
-#include "alloc_device.h"
-#include "gralloc_priv.h"
-#include "gralloc_helper.h"
-#include "framebuffer_device.h"
-
-#include "ump.h"
-
-#include "sec_format.h"
-
-#include <fcntl.h>
-
-#ifdef ION_ALLOC
-#include "ion.h"
-#endif
-
-#include <linux/ashmem.h>
-#include <cutils/ashmem.h>
-
-/* Treat GPU as UMP Device Z */
-#define GRALLOC_DEVICE_SHIFT UMP_DEVICE_Z_SHIFT
-
-#define EXYNOS_ALIGN( value, base ) (((value) + ((base) - 1)) & ~((base) - 1))
-static int gralloc_alloc_buffer(alloc_device_t* dev, size_t size, int usage,
-                                buffer_handle_t* pHandle, int w, int h,
-                                int format, int bpp, int stride_raw, int stride)
-{
-    ion_buffer ion_fd = 0;
-    ump_handle ump_mem_handle;
-    void *cpu_ptr   = NULL;
-    ump_secure_id ump_id=UMP_INVALID_SECURE_ID;
-    ump_alloc_flags ump_flags = UMP_PROT_SHAREABLE | UMP_HINT_CPU_RD | UMP_HINT_CPU_WR;
-    int sw_read_usage;
-    int sw_write_usage;
-    int hw_usage;
-    size = round_up_to_page_size(size);
-
-    unsigned int ion_flags = 0;
-    int priv_alloc_flag = private_handle_t::PRIV_FLAGS_USES_UMP;
-
-    if (usage & GRALLOC_USAGE_HW_ION) {
-        private_module_t* m = reinterpret_cast<private_module_t*>(dev->common.module);
-        ion_fd = ion_alloc(m->ion_client, size, 0, ION_HEAP_EXYNOS_MASK);
-        if (ion_fd < 0) {
-            ALOGE("Failed to ion_alloc");
-            return -1;
-        }
-
-        cpu_ptr = ion_map(ion_fd, size, 0);
-        if (NULL == cpu_ptr) {
-            ALOGE("Failed to ion_map");
-            ion_free(ion_fd);
-            return -1;
-        }
-        /* TODO: GPU does not use ION. */
-        ump_mem_handle = ump_import(UMP_EXTERNAL_MEM_TYPE_ION, &ion_fd, ump_flags);
-        if (UMP_INVALID_MEMORY_HANDLE != ump_mem_handle) {
-            priv_alloc_flag = private_handle_t::PRIV_FLAGS_USES_ION;
-        } else {
-            ALOGE("gralloc_alloc_buffer() failed to import ION memory");
-            ion_unmap(cpu_ptr, size);
-            ion_free(ion_fd);
-            return -1;
-        }
-    } else {
-        usage |= GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_RENDER;
-        sw_read_usage = usage & GRALLOC_USAGE_SW_READ_MASK;
-        sw_write_usage = usage & GRALLOC_USAGE_SW_WRITE_MASK;
-        hw_usage = usage & GRALLOC_USAGE_HW_MASK;
-
-        if (sw_read_usage) {
-            ump_flags |= UMP_PROT_CPU_RD;
-            if (sw_read_usage == GRALLOC_USAGE_SW_READ_OFTEN)
-                ump_flags |= UMP_HINT_CPU_RD;
-        }
-        if (sw_write_usage) {
-            ump_flags |= UMP_PROT_CPU_WR;
-            if (sw_write_usage == GRALLOC_USAGE_SW_WRITE_OFTEN)
-                ump_flags |= UMP_HINT_CPU_WR;
-        }
-
-        if (hw_usage) {
-            int hw_flags = 0;
-            if (hw_usage & (GRALLOC_USAGE_HW_TEXTURE))
-                hw_flags |= (UMP_PROT_DEVICE_RD | UMP_HINT_DEVICE_RD);
-
-            if (hw_usage & (GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_FB))
-                hw_flags |= (UMP_PROT_DEVICE_RD | UMP_HINT_DEVICE_RD | UMP_PROT_DEVICE_WR | UMP_HINT_DEVICE_WR);
-
-            ump_flags |= (hw_flags << GRALLOC_DEVICE_SHIFT);
-        }
-
-        ump_mem_handle = ump_allocate_64(size, ump_flags);
-        if (UMP_INVALID_MEMORY_HANDLE != ump_mem_handle)
-            cpu_ptr = ump_map(ump_mem_handle, 0, size);
-        else
-            ALOGE("gralloc_alloc_buffer() failed to allcoate UMP memory");
-    }
-
-    if (NULL != cpu_ptr) {
-        ump_id = ump_secure_id_get(ump_mem_handle);
-
-        if (UMP_INVALID_SECURE_ID != ump_id || usage & GRALLOC_USAGE_HW_ION) {
-            private_handle_t* hnd = new private_handle_t(priv_alloc_flag, size, (int)cpu_ptr,
-                                                        private_handle_t::LOCK_STATE_MAPPED,
-                                                        ump_id,
-                                                        ump_mem_handle);
-            if (NULL != hnd) {
-                *pHandle = hnd;
-                hnd->fd = ion_fd;
-                hnd->format = format;
-                hnd->usage = usage;
-                hnd->width = w;
-                hnd->height = h;
-                hnd->bpp = bpp;
-                hnd->stride = stride;
-                hnd->uoffset = ((EXYNOS_ALIGN(hnd->width, 16) * EXYNOS_ALIGN(hnd->height, 16)));
-                hnd->voffset = ((EXYNOS_ALIGN((hnd->width >> 1), 8) * EXYNOS_ALIGN((hnd->height >> 1), 8)));
-                return 0;
-            } else {
-                ALOGE("gralloc_alloc_buffer() failed to allocate handle");
-            }
-        } else {
-            ALOGE("gralloc_alloc_buffer() failed to retrieve valid secure id");
-        }
-
-        ump_unmap(ump_mem_handle, cpu_ptr, size);
-    } else {
-        ALOGE("gralloc_alloc_buffer() failed to map UMP memory");
-    }
-
-    ump_release(ump_mem_handle);
-
-    return -1;
-}
-
-static int gralloc_alloc_framebuffer_locked(alloc_device_t* dev, size_t size, int usage,
-                                            buffer_handle_t* pHandle, int w, int h,
-                                            int format, int bpp)
-{
-    private_module_t* m = reinterpret_cast<private_module_t*>(dev->common.module);
-
-    /* allocate the framebuffer */
-    if (m->framebuffer == NULL) {
-        /* initialize the framebuffer, the framebuffer is mapped once and forever. */
-        int err = init_frame_buffer_locked(m);
-
-        if (err < 0)
-            return err;
-    }
-
-    const uint32_t bufferMask = m->bufferMask;
-    const uint32_t numBuffers = m->numBuffers;
-    const size_t bufferSize = m->finfo.line_length * m->info.yres;
-
-    if (numBuffers == 1) {
-        /*
-         * If we have only one buffer, we never use page-flipping. Instead,
-         * we return a regular buffer which will be memcpy'ed to the main
-         * screen when post is called.
-         */
-        int newUsage = (usage & ~GRALLOC_USAGE_HW_FB) | GRALLOC_USAGE_HW_2D;
-
-        ALOGD("fallback to single buffering");
-
-        return gralloc_alloc_buffer(dev, bufferSize, newUsage, pHandle, w, h, format, bpp, 0, 0);
-    }
-
-    if (bufferMask >= ((1LU<<numBuffers)-1)) {
-        ALOGE("Ran out of buffers");
-        return -ENOMEM;
-    }
-
-    int vaddr = m->framebuffer->base;
-    /* find a free slot */
-    for (uint32_t i = 0; i < numBuffers; i++) {
-        if ((bufferMask & (1LU<<i)) == 0) {
-            m->bufferMask |= (1LU<<i);
-            break;
-        }
-        vaddr += bufferSize;
-    }
-
-    /* The entire framebuffer memory is already mapped, now create a buffer object for parts of this memory */
-    private_handle_t* hnd = new private_handle_t(private_handle_t::PRIV_FLAGS_FRAMEBUFFER, size, vaddr,
-                                                 0, dup(m->framebuffer->fd), vaddr - m->framebuffer->base);
-    hnd->format = format;
-    hnd->usage = usage;
-    hnd->width = w;
-    hnd->height = h;
-    hnd->bpp = bpp;
-    *pHandle = hnd;
-
-    return 0;
-}
-
-static int gralloc_alloc_framebuffer(alloc_device_t* dev, size_t size, int usage,
-                                     buffer_handle_t* pHandle, int w, int h,
-                                     int format, int bpp)
-{
-    private_module_t* m = reinterpret_cast<private_module_t*>(dev->common.module);
-    pthread_mutex_lock(&m->lock);
-    int err = gralloc_alloc_framebuffer_locked(dev, size, usage, pHandle, w, h, format, bpp);
-    pthread_mutex_unlock(&m->lock);
-
-    return err;
-}
-
-static int alloc_device_alloc(alloc_device_t* dev, int w, int h, int format,
-                              int usage, buffer_handle_t* pHandle, int* pStride)
-{
-    if (!pHandle || !pStride) {
-        ALOGE("Invalid Handle, Stride value");
-        return -EINVAL;
-    }
-
-    int err;
-    int align = 16;
-    int bpp = 0;
-    size_t stride_raw = 0;
-    size_t size = 0;
-    size_t stride = (w + 15) & ~15;
-    size_t vstride = (h + 15) & ~15;
-
-    switch (format) {
-    case HAL_PIXEL_FORMAT_RGBA_8888:
-    case HAL_PIXEL_FORMAT_RGBX_8888:
-    case HAL_PIXEL_FORMAT_BGRA_8888:
-        bpp = 4;
-        break;
-    case HAL_PIXEL_FORMAT_RGB_888:
-        bpp = 3;
-        break;
-    case HAL_PIXEL_FORMAT_RGB_565:
-    case HAL_PIXEL_FORMAT_RGBA_5551:
-    case HAL_PIXEL_FORMAT_RGBA_4444:
-        bpp = 2;
-        break;
-    case HAL_PIXEL_FORMAT_YCbCr_420_P:
-    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
-    case HAL_PIXEL_FORMAT_YV12:
-        size = stride * vstride * 2;
-        bpp = 4;
-        break;
-    default:
-        ALOGE("Not Support Pixel Format");
-        return -EINVAL;
-    }
-
-    if (format != HAL_PIXEL_FORMAT_YCbCr_420_P &&
-        format != HAL_PIXEL_FORMAT_YCbCr_420_SP &&
-        format != HAL_PIXEL_FORMAT_YV12) {
-        size_t bpr = (w * bpp + (align-1)) & ~(align-1);
-        size = bpr * h;
-        stride = bpr / bpp;
-        stride_raw = bpr;
-    }
-
-    if (usage & GRALLOC_USAGE_HW_FB)
-        err = gralloc_alloc_framebuffer(dev, size, usage, pHandle, w, h, format, 32);
-    else
-        err = gralloc_alloc_buffer(dev, size, usage, pHandle, w, h,
-                    format, 0, (int)stride_raw, (int)stride);
-
-    if (err < 0) {
-        ALOGE("Fail to alloc Gralloc memory");
-        return err;
-    }
-
-    *pStride = stride;
-    return 0;
-}
-
-static int alloc_device_free(alloc_device_t* dev, buffer_handle_t handle)
-{
-    if (private_handle_t::validate(handle) < 0) {
-        ALOGE("Invalid Value : private_handle");
-        return -EINVAL;
-    }
-
-    private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
-    if (hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) {
-        /* free this buffer */
-        private_module_t* m = reinterpret_cast<private_module_t*>(dev->common.module);
-        const size_t bufferSize = m->finfo.line_length * m->info.yres;
-        int index = (hnd->base - m->framebuffer->base) / bufferSize;
-        m->bufferMask &= ~(1<<index);
-        close(hnd->fd);
-    } else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) {
-        ump_unmap(hnd->ump_mem_handle, (void*)hnd->base, hnd->size);
-        ump_release(hnd->ump_mem_handle);
-    } else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) {
-        ump_mapped_pointer_release((ump_handle)hnd->ump_mem_handle);
-        ump_reference_release((ump_handle)hnd->ump_mem_handle);
-
-        ion_unmap((void*)hnd->base, hnd->size);
-        ion_free(hnd->fd);
-    }
-
-    delete hnd;
-
-    return 0;
-}
-
-static int alloc_device_close(struct hw_device_t *device)
-{
-    alloc_device_t* dev = reinterpret_cast<alloc_device_t*>(device);
-    if (dev) {
-        private_module_t* m = reinterpret_cast<private_module_t*>(dev->common.module);
-        ion_client_destroy(m->ion_client);
-        delete dev;
-        ump_close(); /* Our UMP memory refs will be released automatically here... */
-    }
-    return 0;
-}
-
-int alloc_device_open(hw_module_t const* module, const char* name, hw_device_t** device)
-{
-    alloc_device_t *dev;
-
-    dev = new alloc_device_t;
-    if (NULL == dev) {
-        ALOGE("Fail to create alloc_device");
-        return -1;
-    }
-
-    dev->common.module = const_cast<hw_module_t*>(module);
-    private_module_t* m = reinterpret_cast<private_module_t*>(dev->common.module);
-    m->ion_client=ion_client_create();
-    ALOGI("gralloc create ion_client %d", m->ion_client);
-
-    ump_result ump_res = ump_open();
-
-    if ((UMP_OK != ump_res) || (0 > m->ion_client)) {
-        ALOGE("UMP open failed, ump_res %d, ion_client %d", ump_res, m->ion_client);
-        delete dev;
-        return -1;
-    }
-
-    /* initialize our state here */
-    memset(dev, 0, sizeof(*dev));
-
-    /* initialize the procs */
-    dev->common.tag = HARDWARE_DEVICE_TAG;
-    dev->common.version = 0;
-    dev->common.module = const_cast<hw_module_t*>(module);
-    dev->common.close = alloc_device_close;
-    dev->alloc = alloc_device_alloc;
-    dev->free = alloc_device_free;
-
-    *device = &dev->common;
-
-    return 0;
-}
diff --git a/exynos5/hal/libgralloc_ump/alloc_device.h b/exynos5/hal/libgralloc_ump/alloc_device.h
deleted file mode 100644
index 9877d4d..0000000
--- a/exynos5/hal/libgralloc_ump/alloc_device.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
- *
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <hardware/hardware.h>
-
-// Create an alloc device
-int alloc_device_open(hw_module_t const* module, const char* name, hw_device_t** device);
diff --git a/exynos5/hal/libgralloc_ump/framebuffer_device.cpp b/exynos5/hal/libgralloc_ump/framebuffer_device.cpp
deleted file mode 100644
index 1e64d72..0000000
--- a/exynos5/hal/libgralloc_ump/framebuffer_device.cpp
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
- *
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <linux/fb.h>
-
-#include <cutils/log.h>
-#include <cutils/atomic.h>
-#include <hardware/hardware.h>
-#include <hardware/gralloc.h>
-
-#include <GLES/gl.h>
-
-#include "gralloc_priv.h"
-#include "gralloc_helper.h"
-
-#include "linux/fb.h"
-
-/* numbers of buffers for page flipping */
-#define NUM_BUFFERS 2
-
-enum {
-    PAGE_FLIP = 0x00000001,
-};
-
-static int fb_set_swap_interval(struct framebuffer_device_t* dev, int interval)
-{
-    if (interval < dev->minSwapInterval || interval > dev->maxSwapInterval)
-        return -EINVAL;
-
-    /* TODO: Currently not implemented */
-    return 0;
-}
-
-static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer)
-{
-    if (private_handle_t::validate(buffer) < 0)
-        return -EINVAL;
-
-    private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(buffer);
-    private_module_t* m = reinterpret_cast<private_module_t*>(dev->common.module);
-
-    if (m->currentBuffer) {
-        m->base.unlock(&m->base, m->currentBuffer);
-        m->currentBuffer = 0;
-    }
-
-    if (hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) {
-        m->base.lock(&m->base, buffer, private_module_t::PRIV_USAGE_LOCKED_FOR_POST,
-                0, 0, m->info.xres, m->info.yres, NULL);
-
-        const size_t offset = hnd->base - m->framebuffer->base;
-        m->info.activate = FB_ACTIVATE_VBL;
-        m->info.yoffset = offset / m->finfo.line_length;
-
-#ifdef STANDARD_LINUX_SCREEN
-        if (ioctl(m->framebuffer->fd, FBIOPAN_DISPLAY, &m->info) == -1) {
-            ALOGE("FBIOPAN_DISPLAY failed");
-            m->base.unlock(&m->base, buffer);
-            return 0;
-        }
-
-        /* wait for VSYNC */
-        int crtc = 0;
-        if (ioctl(m->framebuffer->fd, FBIO_WAITFORVSYNC, &crtc) < 0) {
-            ALOGE("FBIO_WAITFORVSYNC failed");
-            return 0;
-        }
-#else
-        /* Standard Android way */
-        if (ioctl(m->framebuffer->fd, FBIOPUT_VSCREENINFO, &m->info) == -1) {
-            ALOGE("FBIOPUT_VSCREENINFO failed");
-            m->base.unlock(&m->base, buffer);
-            return -errno;
-        }
-#endif
-
-        m->currentBuffer = buffer;
-    } else {
-        void* fb_vaddr;
-        void* buffer_vaddr;
-
-        m->base.lock(&m->base, m->framebuffer, GRALLOC_USAGE_SW_WRITE_RARELY,
-                0, 0, m->info.xres, m->info.yres, &fb_vaddr);
-
-        m->base.lock(&m->base, buffer, GRALLOC_USAGE_SW_READ_RARELY,
-                0, 0, m->info.xres, m->info.yres, &buffer_vaddr);
-
-        memcpy(fb_vaddr, buffer_vaddr, m->finfo.line_length * m->info.yres);
-
-        m->base.unlock(&m->base, buffer);
-        m->base.unlock(&m->base, m->framebuffer);
-    }
-
-    return 0;
-}
-
-int init_frame_buffer_locked(struct private_module_t* module)
-{
-    if (module->framebuffer)
-        return 0; /* Nothing to do, already initialized */
-
-    char const * const device_template[] = {
-        "/dev/graphics/fb%u",
-        "/dev/fb%u",
-        NULL
-    };
-
-    int fd = -1;
-    int i = 0;
-    char name[64];
-
-    while ((fd == -1) && device_template[i]) {
-        snprintf(name, 64, device_template[i], 0);
-        fd = open(name, O_RDWR, 0);
-        i++;
-    }
-
-    if (fd < 0) {
-        ALOGE("/dev/graphics/fb, /dev/fb Open fail");
-        return -errno;
-    }
-
-    struct fb_fix_screeninfo finfo;
-    if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo) == -1) {
-        ALOGE("Fail to get FB Screen Info");
-        return -errno;
-    }
-
-    struct fb_var_screeninfo info;
-    if (ioctl(fd, FBIOGET_VSCREENINFO, &info) == -1) {
-        ALOGE("First, Fail to get FB VScreen Info");
-        return -errno;
-    }
-
-    info.reserved[0] = 0;
-    info.reserved[1] = 0;
-    info.reserved[2] = 0;
-    info.xoffset = 0;
-    info.yoffset = 0;
-    info.activate = FB_ACTIVATE_NOW;
-
-#ifdef GRALLOC_16_BITS
-    /*
-     * Explicitly request 5/6/5
-     */
-    info.bits_per_pixel = 16;
-    info.red.offset     = 11;
-    info.red.length     = 5;
-    info.green.offset   = 5;
-    info.green.length   = 6;
-    info.blue.offset    = 0;
-    info.blue.length    = 5;
-    info.transp.offset  = 0;
-    info.transp.length  = 0;
-#else
-    /*
-     * Explicitly request 8/8/8
-     */
-    info.bits_per_pixel = 32;
-    info.red.offset     = 16;
-    info.red.length     = 8;
-    info.green.offset   = 8;
-    info.green.length   = 8;
-    info.blue.offset    = 0;
-    info.blue.length    = 8;
-    info.transp.offset  = 0;
-    info.transp.length  = 0;
-#endif
-
-    /*
-     * Request NUM_BUFFERS screens (at lest 2 for page flipping)
-     */
-    info.yres_virtual = info.yres * NUM_BUFFERS;
-
-    uint32_t flags = PAGE_FLIP;
-    if (ioctl(fd, FBIOPUT_VSCREENINFO, &info) == -1) {
-        info.yres_virtual = info.yres;
-        flags &= ~PAGE_FLIP;
-        ALOGW("FBIOPUT_VSCREENINFO failed, page flipping not supported");
-    }
-
-    if (info.yres_virtual < info.yres * 2) {
-        /* we need at least 2 for page-flipping */
-        info.yres_virtual = info.yres;
-        flags &= ~PAGE_FLIP;
-        ALOGW("page flipping not supported (yres_virtual=%d, requested=%d)",
-                info.yres_virtual, info.yres*2);
-    }
-
-    if (ioctl(fd, FBIOGET_VSCREENINFO, &info) == -1) {
-        ALOGE("Second, Fail to get FB VScreen Info");
-        return -errno;
-    }
-
-    int refreshRate = 1000000000000000LLU /
-    (
-        uint64_t( info.upper_margin + info.lower_margin + info.yres )
-        * ( info.left_margin  + info.right_margin + info.xres )
-        * info.pixclock
-    );
-
-    if (refreshRate == 0)
-        refreshRate = 60*1000;  /* 60 Hz */
-
-    if (int(info.width) <= 0 || int(info.height) <= 0) {
-        /* the driver doesn't return that information default to 160 dpi */
-        info.width  = ((info.xres * 25.4f) / 160.0f + 0.5f);
-        info.height = ((info.yres * 25.4f) / 160.0f + 0.5f);
-    }
-
-    float xdpi = (info.xres * 25.4f) / info.width;
-    float ydpi = (info.yres * 25.4f) / info.height;
-    float fps  = refreshRate / 1000.0f;
-
-    ALOGI("using (fd=%d)\n"
-         "id           = %s\n"
-         "xres         = %d px\n"
-         "yres         = %d px\n"
-         "xres_virtual = %d px\n"
-         "yres_virtual = %d px\n"
-         "bpp          = %d\n"
-         "r            = %2u:%u\n"
-         "g            = %2u:%u\n"
-         "b            = %2u:%u\n",
-         fd,
-         finfo.id,
-         info.xres,
-         info.yres,
-         info.xres_virtual,
-         info.yres_virtual,
-         info.bits_per_pixel,
-         info.red.offset, info.red.length,
-         info.green.offset, info.green.length,
-         info.blue.offset, info.blue.length);
-
-    ALOGI("width        = %d mm (%f dpi)\n"
-         "height       = %d mm (%f dpi)\n"
-         "refresh rate = %.2f Hz\n",
-         info.width,  xdpi,
-         info.height, ydpi,
-         fps);
-
-    if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo) == -1) {
-        ALOGE("Fail to get FScreen Info");
-        return -errno;
-    }
-
-    if (finfo.smem_len <= 0) {
-        ALOGE("Invalid Value : finfo.smem_len");
-        return -errno;
-    }
-
-    module->flags = flags;
-    module->info = info;
-    module->finfo = finfo;
-    module->xdpi = xdpi;
-    module->ydpi = ydpi;
-    module->fps = fps;
-
-    /*
-     * map the framebuffer
-     */
-    size_t fbSize = round_up_to_page_size(finfo.line_length * info.yres_virtual);
-    void* vaddr = mmap(0, fbSize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
-    if (vaddr == MAP_FAILED) {
-        ALOGE("Error mapping the framebuffer (%s)", strerror(errno));
-        return -errno;
-    }
-
-    memset(vaddr, 0, fbSize);
-
-    /* Create a "fake" buffer object for the entire frame buffer memory,
-     * and store it in the module */
-    module->framebuffer = new private_handle_t(private_handle_t::PRIV_FLAGS_FRAMEBUFFER,
-                                               fbSize, intptr_t(vaddr),
-                                               0, dup(fd), 0);
-
-    module->numBuffers = info.yres_virtual / info.yres;
-    module->bufferMask = 0;
-
-    return 0;
-}
-
-static int init_frame_buffer(struct private_module_t* module)
-{
-    pthread_mutex_lock(&module->lock);
-    int err = init_frame_buffer_locked(module);
-    pthread_mutex_unlock(&module->lock);
-    return err;
-}
-
-static int fb_close(struct hw_device_t *device)
-{
-    framebuffer_device_t* dev = reinterpret_cast<framebuffer_device_t*>(device);
-    if (dev) {
-        ump_close();
-        delete dev;
-    }
-    return 0;
-}
-
-int compositionComplete(struct framebuffer_device_t* dev)
-{
-    /* By doing a Finish here we force the GL driver to start rendering
-       all the drawcalls up to this point, and to wait for the rendering to be complete.*/
-
-    /* It move to HWComposit Module */
-
-    /* The rendering of the backbuffer is now completed.
-       When SurfaceFlinger later does a call to eglSwapBuffer(), the swap will be done
-       synchronously in the same thread, and not asynchronoulsy in a background thread later.
-       The SurfaceFlinger requires this behaviour since it releases the lock on all the
-       SourceBuffers (Layers) after the compositionComplete() function returns.
-       However this "bad" behaviour by SurfaceFlinger should not affect performance,
-       since the Applications that render the SourceBuffers (Layers) still get the
-       full renderpipeline using asynchronouls rendering. So they perform at maximum speed,
-       and because of their complexity compared to the Surface flinger jobs, the Surface flinger
-       is normally faster even if it does everyhing synchronous and serial.
-       */
-    return 0;
-}
-
-int framebuffer_device_open(hw_module_t const* module, const char* name, hw_device_t** device)
-{
-    int status = -EINVAL;
-
-    alloc_device_t* gralloc_device;
-    status = gralloc_open(module, &gralloc_device);
-    if (status < 0) {
-        ALOGE("Fail to Open gralloc device");
-        return status;
-    }
-
-    private_module_t* m = (private_module_t*)module;
-    status = init_frame_buffer(m);
-    if (status < 0) {
-        ALOGE("Fail to init framebuffer");
-        gralloc_close(gralloc_device);
-        return status;
-    }
-
-    /* initialize our state here */
-    framebuffer_device_t *dev = new framebuffer_device_t;
-    memset(dev, 0, sizeof(*dev));
-
-    /* initialize the procs */
-    dev->common.tag = HARDWARE_DEVICE_TAG;
-    dev->common.version = 0;
-    dev->common.module = const_cast<hw_module_t*>(module);
-    dev->common.close = fb_close;
-    dev->setSwapInterval = fb_set_swap_interval;
-    dev->post = fb_post;
-    dev->setUpdateRect = 0;
-    dev->compositionComplete = &compositionComplete;
-
-    int stride = m->finfo.line_length / (m->info.bits_per_pixel >> 3);
-    const_cast<uint32_t&>(dev->flags) = 0;
-    const_cast<uint32_t&>(dev->width) = m->info.xres;
-    const_cast<uint32_t&>(dev->height) = m->info.yres;
-    const_cast<int&>(dev->stride) = stride;
-#ifdef GRALLOC_16_BITS
-    const_cast<int&>(dev->format) = HAL_PIXEL_FORMAT_RGB_565;
-#else
-    const_cast<int&>(dev->format) = HAL_PIXEL_FORMAT_BGRA_8888;
-#endif
-    const_cast<float&>(dev->xdpi) = m->xdpi;
-    const_cast<float&>(dev->ydpi) = m->ydpi;
-    const_cast<float&>(dev->fps) = m->fps;
-    const_cast<int&>(dev->minSwapInterval) = 1;
-    const_cast<int&>(dev->maxSwapInterval) = 1;
-    *device = &dev->common;
-    status = 0;
-
-    return status;
-}
diff --git a/exynos5/hal/libgralloc_ump/framebuffer_device.h b/exynos5/hal/libgralloc_ump/framebuffer_device.h
deleted file mode 100644
index 4d84bef..0000000
--- a/exynos5/hal/libgralloc_ump/framebuffer_device.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
- *
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <hardware/hardware.h>
-
-// Create a framebuffer device
-int framebuffer_device_open(hw_module_t const* module, const char* name, hw_device_t** device);
-
-// Initialize the framebuffer (must keep module lock before calling
-int init_frame_buffer_locked(struct private_module_t* module);
diff --git a/exynos5/hal/libgralloc_ump/gralloc_helper.h b/exynos5/hal/libgralloc_ump/gralloc_helper.h
deleted file mode 100644
index 6a0a518..0000000
--- a/exynos5/hal/libgralloc_ump/gralloc_helper.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
- *
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef GRALLOC_HELPER_H_
-#define GRALLOC_HELPER_H_
-
-#include <sys/mman.h>
-
-inline size_t round_up_to_page_size(size_t x)
-{
-    return (x + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1);
-}
-
-#endif /* GRALLOC_HELPER_H_ */
diff --git a/exynos5/hal/libgralloc_ump/gralloc_module.cpp b/exynos5/hal/libgralloc_ump/gralloc_module.cpp
deleted file mode 100644
index d33e5d1..0000000
--- a/exynos5/hal/libgralloc_ump/gralloc_module.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (C) 2010-2011 ARM Limited. All rights reserved.
- *
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <errno.h>
-#include <pthread.h>
-
-#include <cutils/log.h>
-#include <cutils/atomic.h>
-#include <hardware/hardware.h>
-#include <hardware/gralloc.h>
-#include "ump.h"
-
-#include "gralloc_priv.h"
-#include "alloc_device.h"
-#include "framebuffer_device.h"
-#include "ion.h"
-#include <sys/mman.h>
-
-static pthread_mutex_t s_map_lock = PTHREAD_MUTEX_INITIALIZER;
-static int s_ump_is_open = 0;
-
-static int gralloc_map(gralloc_module_t const* module,
-        buffer_handle_t handle, void** vaddr)
-{
-    private_handle_t* hnd = (private_handle_t*)handle;
-    private_module_t* m = (private_module_t*)module;
-
-    if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) {
-        if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) {
-            size_t size = hnd->size;
-            hnd->ion_client = ion_client_create();
-            void *mappedAddress = ion_map(hnd->fd, size, 0);
-
-            if (mappedAddress == MAP_FAILED) {
-                ALOGE("Could not ion_map %s fd(%d)", strerror(errno), hnd->fd);
-                return -errno;
-            }
-
-            hnd->base = intptr_t(mappedAddress) + hnd->offset;
-            ALOGD("gralloc_map() succeeded fd=%d, off=%d, size=%d, vaddr=%p",
-                    hnd->fd, hnd->offset, hnd->size, mappedAddress);
-        } else {
-            ALOGE("In case of ION, It could not reach here!");
-        }
-    }
-    *vaddr = (void*)hnd->base;
-    return 0;
-}
-
-static int gralloc_unmap(gralloc_module_t const* module,
-            buffer_handle_t handle)
-{
-    private_handle_t* hnd = (private_handle_t*)handle;
-    private_module_t* m = (private_module_t*)module;
-
-    if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) {
-        if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) {
-            void* base = (void*)hnd->base;
-            size_t size = hnd->size;
-            ALOGD("unmapping from %p, size=%d", base, size);
-
-            if (ion_unmap(base, size) < 0)
-                ALOGE("Could not ion_unmap %s", strerror(errno));
-
-            ion_client_destroy(hnd->ion_client);
-        }
-    }
-    hnd->base = 0;
-    return 0;
-}
-
-static int gralloc_device_open(const hw_module_t* module, const char* name, hw_device_t** device)
-{
-    int status = -EINVAL;
-
-    ALOGI("Opening ARM Gralloc device");
-
-    if (!strcmp(name, GRALLOC_HARDWARE_GPU0))
-        status = alloc_device_open(module, name, device);
-    else if (!strcmp(name, GRALLOC_HARDWARE_FB0))
-        status = framebuffer_device_open(module, name, device);
-
-    return status;
-}
-
-static int gralloc_register_buffer(gralloc_module_t const* module, buffer_handle_t handle)
-{
-    int retval = -EINVAL;
-    void *vaddr;
-    if (private_handle_t::validate(handle) < 0) {
-        ALOGE("Registering invalid buffer, returning error");
-        return -EINVAL;
-    }
-
-    // if this handle was created in this process, then we keep it as is.
-    private_handle_t* hnd = (private_handle_t*)handle;
-    if (hnd->pid == getpid()) {
-        ALOGE("Invalid Process ID from Private_Handle");
-        return 0;
-    }
-
-    pthread_mutex_lock(&s_map_lock);
-    if (!s_ump_is_open) {
-        ump_result res = ump_open();
-        if (res != UMP_OK) {
-            pthread_mutex_unlock(&s_map_lock);
-            ALOGE("Failed to open UMP library");
-            return retval;
-        }
-        s_ump_is_open = 1;
-    }
-
-    if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) {
-        hnd->ump_mem_handle = ump_from_secure_id(hnd->ump_id);
-        if (UMP_INVALID_MEMORY_HANDLE != hnd->ump_mem_handle) {
-            hnd->base = (int)ump_map(hnd->ump_mem_handle, 0, hnd->size);
-            if (0 != hnd->base) {
-                hnd->lockState = private_handle_t::LOCK_STATE_MAPPED;
-                hnd->writeOwner = 0;
-                hnd->lockState = 0;
-
-                pthread_mutex_unlock(&s_map_lock);
-                return 0;
-            } else {
-                ALOGE("Failed to map UMP handle");
-            }
-
-            ump_release(hnd->ump_mem_handle);
-        } else {
-            ALOGE("Failed to create UMP handle");
-        }
-    } else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) {
-        hnd->ump_mem_handle = ump_handle_create_from_secure_id(hnd->ump_id);
-        retval = gralloc_map(module, handle, &vaddr);
-    } else {
-        ALOGE("registering non-UMP&ION buffer not supported");
-    }
-
-    pthread_mutex_unlock(&s_map_lock);
-
-    return retval;
-}
-
-static int gralloc_unregister_buffer(gralloc_module_t const* module, buffer_handle_t handle)
-{
-    if (private_handle_t::validate(handle) < 0) {
-        ALOGE("unregistering invalid buffer, returning error");
-        return -EINVAL;
-    }
-
-    private_handle_t* hnd = (private_handle_t*)handle;
-
-    ALOGE_IF(hnd->lockState & private_handle_t::LOCK_STATE_READ_MASK,
-                "[unregister] handle %p still locked (state=%08x)", hnd, hnd->lockState);
-
-    /* never unmap buffers that were created in this process */
-    if (hnd->pid != getpid()) {
-        pthread_mutex_lock(&s_map_lock);
-
-        if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) {
-            ump_unmap(hnd->ump_mem_handle, (void*)hnd->base, hnd->size);
-            hnd->base = 0;
-            ump_release(hnd->ump_mem_handle);
-            hnd->ump_mem_handle = UMP_INVALID_MEMORY_HANDLE;
-        } else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) {
-
-            ump_mapped_pointer_release((ump_handle)hnd->ump_mem_handle);
-            ump_reference_release((ump_handle)hnd->ump_mem_handle);
-            if (hnd->base)
-                gralloc_unmap(module, handle);
-
-            hnd->base = 0;
-            hnd->ump_mem_handle = (int)UMP_INVALID_MEMORY_HANDLE;
-            hnd->lockState  = 0;
-            hnd->writeOwner = 0;
-        } else {
-            ALOGE("unregistering non-UMP buffer not supported");
-        }
-
-        hnd->base = 0;
-        hnd->lockState  = 0;
-        hnd->writeOwner = 0;
-
-        pthread_mutex_unlock(&s_map_lock);
-    }
-
-    return 0;
-}
-
-static int gralloc_lock(gralloc_module_t const* module, buffer_handle_t handle,
-                        int usage, int l, int t, int w, int h, void** vaddr)
-{
-    if (private_handle_t::validate(handle) < 0) {
-        ALOGE("Locking invalid buffer, returning error");
-        return -EINVAL;
-    }
-
-    private_handle_t* hnd = (private_handle_t*)handle;
-    if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP) {
-        hnd->writeOwner = usage & GRALLOC_USAGE_SW_WRITE_MASK;
-
-        if (usage & GRALLOC_USAGE_SW_READ_MASK)
-            ump_cpu_msync_now(hnd->ump_mem_handle, UMP_MSYNC_CLEAN_AND_INVALIDATE,
-                    (void*)hnd->base, hnd->size);
-    }
-
-    if (usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK))
-        *vaddr = (void*)hnd->base;
-
-    if (usage & GRALLOC_USAGE_YUV_ADDR) {
-        vaddr[0] = (void*)hnd->base;
-        vaddr[1] = (void*)(hnd->base + hnd->uoffset);
-        vaddr[2] = (void*)(hnd->base + hnd->uoffset + hnd->voffset);
-    }
-    return 0;
-}
-
-static int gralloc_unlock(gralloc_module_t const* module, buffer_handle_t handle)
-{
-    if (private_handle_t::validate(handle) < 0) {
-        ALOGE("Unlocking invalid buffer, returning error");
-        return -EINVAL;
-    }
-
-    private_handle_t* hnd = (private_handle_t*)handle;
-    private_module_t* m = (private_module_t*)module;
-    int32_t current_value;
-    int32_t new_value;
-    int retry;
-
-    if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_UMP && hnd->writeOwner)
-        ump_cpu_msync_now(hnd->ump_mem_handle, UMP_MSYNC_CLEAN_AND_INVALIDATE, (void*)hnd->base, hnd->size);
-    else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION)
-        ion_msync(hnd->ion_client, hnd->fd, IMSYNC_DEV_TO_READ | IMSYNC_SYNC_FOR_DEV, hnd->size, hnd->offset);
-
-    return 0;
-}
-
-static struct hw_module_methods_t gralloc_module_methods =
-{
-    open: gralloc_device_open
-};
-
-struct private_module_t HAL_MODULE_INFO_SYM =
-{
-    base:
-    {
-        common:
-        {
-            tag: HARDWARE_MODULE_TAG,
-            version_major: 1,
-            version_minor: 0,
-            id: GRALLOC_HARDWARE_MODULE_ID,
-            name: "Graphics Memory Allocator Module",
-            author: "ARM Ltd.",
-            methods: &gralloc_module_methods,
-            dso: NULL,
-            reserved : {0,},
-        },
-        registerBuffer: gralloc_register_buffer,
-        unregisterBuffer: gralloc_unregister_buffer,
-        lock: gralloc_lock,
-        unlock: gralloc_unlock,
-        perform: NULL,
-        reserved_proc: {0,},
-    },
-    framebuffer: NULL,
-    flags: 0,
-    numBuffers: 0,
-    bufferMask: 0,
-    lock: PTHREAD_MUTEX_INITIALIZER,
-    currentBuffer: NULL,
-    ion_client: -1,
-};
diff --git a/exynos5/hal/libhdmi/Android.mk b/exynos5/hal/libhdmi/Android.mk
deleted file mode 100644
index 9acbc52..0000000
--- a/exynos5/hal/libhdmi/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-ifeq ($(filter-out exynos5,$(TARGET_BOARD_PLATFORM)),)
-include $(all-subdir-makefiles)
-endif
diff --git a/exynos5/hal/libhdmi/SecHdmi/Android.mk b/exynos5/hal/libhdmi/SecHdmi/Android.mk
deleted file mode 100644
index 61bd1a9..0000000
--- a/exynos5/hal/libhdmi/SecHdmi/Android.mk
+++ /dev/null
@@ -1,76 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-ifeq ($(BOARD_USES_HDMI),true)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := eng
-
-LOCAL_PRELINK_MODULE := false
-#LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
-LOCAL_SHARED_LIBRARIES := libutils liblog libedid libcec
-
-LOCAL_SRC_FILES := \
-	SecHdmiV4L2Utils.cpp \
-	SecHdmi.cpp \
-	SecGscaler.cpp \
-	fimd_api.c
-
-LOCAL_C_INCLUDES += $(LOCAL_PATH)
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../include
-
-ifeq ($(TARGET_SOC),exynos5250)
-	LOCAL_CFLAGS += -DSAMSUNG_EXYNOS5250
-endif
-
-LOCAL_CFLAGS  += \
-	-DSCREEN_WIDTH=$(SCREEN_WIDTH) \
-	-DSCREEN_HEIGHT=$(SCREEN_HEIGHT) \
-	-DDEFAULT_FB_NUM=$(DEFAULT_FB_NUM)
-
-LOCAL_SHARED_LIBRARIES += libion
-
-ifeq ($(BOARD_USES_HDMI_SUBTITLES),true)
-	LOCAL_CFLAGS  += -DBOARD_USES_HDMI_SUBTITLES
-endif
-
-ifeq ($(BOARD_USES_HDMI_FIMGAPI),true)
-	LOCAL_CFLAGS += -DBOARD_USES_HDMI_FIMGAPI
-	LOCAL_C_INCLUDES += device/samsung/$(TARGET_BOARD_PLATFORM)/libfimg4x
-	LOCAL_C_INCLUDES += external/skia/include/core
-	LOCAL_SHARED_LIBRARIES += libfimg
-endif
-
-ifeq ($(BOARD_HDMI_STD), STD_NTSC_M)
-	LOCAL_CFLAGS  += -DSTD_NTSC_M
-endif
-
-ifeq ($(BOARD_HDMI_STD),STD_480P)
-	LOCAL_CFLAGS  += -DSTD_480P
-endif
-
-ifeq ($(BOARD_HDMI_STD),STD_720P)
-	LOCAL_CFLAGS  += -DSTD_720P
-endif
-
-ifeq ($(BOARD_HDMI_STD),STD_1080P)
-	LOCAL_CFLAGS  += -DSTD_1080P
-endif
-
-LOCAL_MODULE := libhdmi
-include $(BUILD_SHARED_LIBRARY)
-
-endif
diff --git a/exynos5/hal/libhdmi/SecHdmi/SecGscaler.cpp b/exynos5/hal/libhdmi/SecHdmi/SecGscaler.cpp
deleted file mode 100644
index 5da1c72..0000000
--- a/exynos5/hal/libhdmi/SecHdmi/SecGscaler.cpp
+++ /dev/null
@@ -1,1524 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define DEBUG_LIB_FIMC
-#define LOG_TAG "libgscaler"
-//#define USE_GSC_USERPTR
-#include <cutils/log.h>
-#include "../libhdmi/SecHdmi/SecGscaler.h"
-
-#ifdef USE_GSC_USERPTR
-#define V4L2_MEMORY_TYPE V4L2_MEMORY_USERPTR
-#else
-#define V4L2_MEMORY_TYPE V4L2_MEMORY_MMAP
-#endif
-
-struct yuv_fmt_list yuv_list[] = {
-    { "V4L2_PIX_FMT_NV12",      "YUV420/2P/LSB_CBCR",   V4L2_PIX_FMT_NV12,      12, 1 },
-    { "V4L2_PIX_FMT_NV12M",     "YUV420/2P/LSB_CBCR",   V4L2_PIX_FMT_NV12M,     12, 2 },
-    { "V4L2_PIX_FMT_NV12MT",    "YUV420/2P/LSB_CBCR",   V4L2_PIX_FMT_NV12MT,    12, 2 },
-    { "V4L2_PIX_FMT_NV21",      "YUV420/2P/LSB_CRCB",   V4L2_PIX_FMT_NV21,      12, 1 },
-    { "V4L2_PIX_FMT_NV21X",     "YUV420/2P/MSB_CBCR",   V4L2_PIX_FMT_NV21X,     12, 2 },
-    { "V4L2_PIX_FMT_NV12X",     "YUV420/2P/MSB_CRCB",   V4L2_PIX_FMT_NV12X,     12, 2 },
-    { "V4L2_PIX_FMT_YUV420",    "YUV420/3P",            V4L2_PIX_FMT_YUV420,    12, 3 },
-    { "V4L2_PIX_FMT_YUV420M",   "YUV420/3P",            V4L2_PIX_FMT_YUV420M,   12, 3 },
-    { "V4L2_PIX_FMT_YUYV",      "YUV422/1P/YCBYCR",     V4L2_PIX_FMT_YUYV,      16, 1 },
-    { "V4L2_PIX_FMT_YVYU",      "YUV422/1P/YCRYCB",     V4L2_PIX_FMT_YVYU,      16, 1 },
-    { "V4L2_PIX_FMT_UYVY",      "YUV422/1P/CBYCRY",     V4L2_PIX_FMT_UYVY,      16, 1 },
-    { "V4L2_PIX_FMT_VYUY",      "YUV422/1P/CRYCBY",     V4L2_PIX_FMT_VYUY,      16, 1 },
-    { "V4L2_PIX_FMT_UV12",      "YUV422/2P/LSB_CBCR",   V4L2_PIX_FMT_NV16,      16, 2 },
-    { "V4L2_PIX_FMT_UV21",      "YUV422/2P/LSB_CRCB",   V4L2_PIX_FMT_NV61,      16, 2 },
-    { "V4L2_PIX_FMT_UV12X",     "YUV422/2P/MSB_CBCR",   V4L2_PIX_FMT_NV16X,     16, 2 },
-    { "V4L2_PIX_FMT_UV21X",     "YUV422/2P/MSB_CRCB",   V4L2_PIX_FMT_NV61X,     16, 2 },
-    { "V4L2_PIX_FMT_YUV422P",   "YUV422/3P",            V4L2_PIX_FMT_YUV422P,   16, 3 },
-};
-
-void dump_pixfmt_mp(struct v4l2_pix_format_mplane *pix_mp)
-{
-    ALOGI("w: %d", pix_mp->width);
-    ALOGI("h: %d", pix_mp->height);
-    ALOGI("color: %x", pix_mp->colorspace);
-
-    switch (pix_mp->pixelformat) {
-    case V4L2_PIX_FMT_YUYV:
-        ALOGI ("YUYV");
-        break;
-    case V4L2_PIX_FMT_UYVY:
-        ALOGI ("UYVY");
-        break;
-    case V4L2_PIX_FMT_RGB565:
-        ALOGI ("RGB565");
-        break;
-    case V4L2_PIX_FMT_RGB565X:
-        ALOGI ("RGB565X");
-        break;
-    default:
-        ALOGI("not supported");
-    }
-}
-
-void dump_crop(struct v4l2_rect *rect)
-{
-    ALOGI("crop l: %d", rect->left);
-    ALOGI("crop t: %d", rect->top);
-    ALOGI("crop w: %d", rect->width);
-    ALOGI("crop h: %d", rect->height);
-}
-
-void gsc_v4l2_dump_state(int fd)
-{
-    struct v4l2_format format;
-    struct v4l2_crop   crop;
-    struct v4l2_subdev_crop sCrop;
-
-    format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    if (ioctl(fd, VIDIOC_G_FMT, &format) < 0)
-        return;
-
-    ALOGI("dumping driver state:");
-    dump_pixfmt_mp(&format.fmt.pix_mp);
-
-    crop.type = format.type;
-    if (ioctl(fd, VIDIOC_G_CROP, &crop) < 0)
-        return;
-
-    ALOGI("input image crop:");
-    dump_crop(&(crop.c));
-
-    sCrop.pad   = GSC_SUBDEV_PAD_SOURCE;
-    sCrop.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-    if (ioctl(fd, VIDIOC_SUBDEV_G_CROP, &sCrop) < 0)
-        return;
-
-    ALOGI("output image crop:");
-    dump_crop(&(sCrop.rect));
-
-}
-
-int gsc_v4l2_querycap(int fd, char *node)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_capability v4l2cap;
-
-    if (ioctl(fd, VIDIOC_QUERYCAP, &v4l2cap) < 0) {
-        ALOGE("%s::VIDIOC_QUERYCAP failed", __func__);
-        return -1;
-    }
-
-    if (!(v4l2cap.capabilities & V4L2_CAP_STREAMING)) {
-        ALOGE("%s::%s is not support streaming", __func__, node);
-        return -1;
-    }
-
-    if (!(v4l2cap.capabilities & V4L2_CAP_VIDEO_OUTPUT_MPLANE)) {
-        ALOGE("%s::%s is not support video output mplane", __func__, node);
-        return -1;
-    }
-
-    return 0;
-}
-
-int gsc_v4l2_query_buf(int fd, SecBuffer *secBuf, enum v4l2_buf_type type, enum v4l2_memory memory, unsigned int buf_index, int num_plane)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_buffer buf;
-    struct v4l2_plane  planes[MAX_PLANES_GSCALER];
-
-    memset(&buf, 0, sizeof(struct v4l2_buffer));
-
-    for (int i = 0; i < MAX_PLANES_GSCALER; i++)
-        memset(&planes[i], 0, sizeof(struct v4l2_plane));
-
-    if (MAX_BUFFERS_GSCALER <= buf_index || MAX_PLANES_GSCALER < num_plane) {
-        ALOGE("%s::exceed MAX! : buf_index=%d, num_plane=%d", __func__, buf_index, num_plane);
-        return -1;
-    }
-
-    buf.type     = type;
-    buf.memory   = V4L2_MEMORY_MMAP;
-    buf.index    = buf_index;
-    buf.length   = num_plane;
-    buf.m.planes = planes;
-
-    if (ioctl(fd, VIDIOC_QUERYBUF, &buf) < 0) {
-        ALOGE("%s::VIDIOC_QUERYBUF failed, plane_cnt=%d", __func__, buf.length);
-        return -1;
-    }
-
-    for (int i = 0; i < num_plane; i++) {
-        if ((secBuf->virt.extP[i] = (char *)mmap(0, buf.m.planes[i].length,
-                 PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.planes[i].m.mem_offset)) < 0) {
-            ALOGE("%s::mmap failed", __func__);
-            ALOGE("%s::Offset = 0x%x", __func__, buf.m.planes[i].m.mem_offset);
-            ALOGE("%s::Legnth = %d"  , __func__, buf.m.planes[i].length);
-            ALOGE("%s::vaddr[%d][%d] = 0x%x", __func__, buf_index, i, (unsigned int)secBuf->virt.extP[i]);
-            return -1;
-        }
-        secBuf->size.extS[i] = buf.m.planes[i].length;
-
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s::vaddr[bufindex=%d][planeindex=%d] = 0x%x", __func__, buf_index, i, (unsigned int)secBuf->virt.extP[i]);
-    ALOGD("%s::Legnth = %d"  , __func__, buf.m.planes[i].length);
-#endif
-    }
-
-    return 0;
-}
-
-int gsc_v4l2_req_buf(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, unsigned int num_bufs)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_requestbuffers reqbuf;
-
-    reqbuf.type   = type;
-    reqbuf.memory = memory;
-    reqbuf.count  = num_bufs;
-
-#ifdef DEBUG_LIB_FIMC
-    ALOGI("%d buffers needed", reqbuf.count);
-#endif
-
-    if (ioctl(fd, VIDIOC_REQBUFS, &reqbuf) < 0) {
-        ALOGE("%s::VIDIOC_REQBUFS failed, reqbuf.count=%d", __func__, reqbuf.count);
-        return -1;
-    }
-
-#ifdef DEBUG_LIB_FIMC
-    ALOGI("%d buffers allocated", reqbuf.count);
-#endif
-
-    if (reqbuf.count < num_bufs) {
-        ALOGE("%s::VIDIOC_REQBUFS failed ((reqbuf.count(%d) < num_bufs(%d))",
-            __func__, reqbuf.count, num_bufs);
-        return -1;
-    }
-
-    return 0;
-}
-
-int gsc_v4l2_s_ctrl(int fd, int id, int value)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_control vc;
-
-    vc.id    = id;
-    vc.value = value;
-
-    if (ioctl(fd, VIDIOC_S_CTRL, &vc) < 0) {
-        ALOGE("%s::VIDIOC_S_CTRL (id=%d,value=%d) failed", __func__, id, value);
-        return -1;
-    }
-
-    return 0;
-}
-
-int gsc_v4l2_set_fmt(int fd, enum v4l2_buf_type type, enum v4l2_field field, s5p_fimc_img_info *img_info)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_format  fmt;
-    struct v4l2_crop    crop;
-
-    fmt.type = type;
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s::fmt.type=%d", __func__, fmt.type);
-#endif
-    if (ioctl(fd, VIDIOC_G_FMT, &fmt) < 0) {
-        ALOGE("%s::VIDIOC_G_FMT failed", __func__);
-        return -1;
-    }
-
-    switch (fmt.type) {
-    case V4L2_BUF_TYPE_VIDEO_OUTPUT:
-    case V4L2_BUF_TYPE_VIDEO_CAPTURE:
-        fmt.fmt.pix.width       = img_info->full_width;
-        fmt.fmt.pix.height      = img_info->full_height;
-        fmt.fmt.pix.pixelformat = img_info->color_space;
-        fmt.fmt.pix.field       = field;
-        break;
-    case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
-    case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
-        fmt.fmt.pix_mp.width       = img_info->full_width;
-        fmt.fmt.pix_mp.height      = img_info->full_height;
-        fmt.fmt.pix_mp.pixelformat = img_info->color_space;
-        fmt.fmt.pix_mp.field       = field;
-        fmt.fmt.pix_mp.num_planes  = img_info->planes;
-        break;
-    default:
-        ALOGE("%s::invalid buffer type", __func__);
-        return -1;
-        break;
-    }
-
-#ifdef DEBUG_LIB_FIMC
-for (int i = 0; i < 3; i++) {
-    ALOGD("%s::fmt.fmt.pix_mp. w=%d, h=%d, pixelformat=0x%08x, filed=%d, num_planes=%d",
-               __func__,
-               fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height,
-               fmt.fmt.pix_mp.pixelformat, fmt.fmt.pix_mp.field,
-               fmt.fmt.pix_mp.num_planes);
-}
-#endif
-
-    if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0) {
-        ALOGE("%s::VIDIOC_S_FMT failed", __func__);
-        return -1;
-    }
-
-#ifdef DEBUG_LIB_FIMC
-for (int i = 0; i < 3; i++) {
-    ALOGD("%s::pix_mp.pix_mp.plane_fmt[%d].sizeimage   =0x%08x", __func__, i, fmt.fmt.pix_mp.plane_fmt[i].sizeimage);
-    ALOGD("%s::pix_mp.pix_mp.plane_fmt[%d].bytesperline=0x%08x", __func__, i, fmt.fmt.pix_mp.plane_fmt[i].bytesperline);
-}
-#endif
-
-    crop.type     = type;
-    crop.c.left   = img_info->start_x;
-    crop.c.top    = img_info->start_y;
-    crop.c.width  = img_info->width;
-    crop.c.height = img_info->height;
-
-    if (ioctl(fd, VIDIOC_S_CROP, &crop) < 0) {
-        ALOGE("%s::VIDIOC_S_CROP (x=%d, y=%d, w=%d, h=%d) failed",
-            __func__,
-            img_info->start_x,
-            img_info->start_y,
-            img_info->width,
-            img_info->height);
-        return -1;
-    }
-
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s::pix_mp pixelformat=0x%08x", __func__, fmt.fmt.pix_mp.pixelformat);
-    ALOGD("%s::pix_mp w=%d, h=%d, planes=%d", __func__, fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, fmt.fmt.pix_mp.num_planes);
-    ALOGD("%s::crop   x=%d, y=%d, w=%d, h=%d", __func__, crop.c.left, crop.c.top, crop.c.width, crop.c.height);
-#endif
-
-    return 0;
-}
-
-int gsc_v4l2_stream_on(int fd, enum v4l2_buf_type type)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    if (ioctl(fd, VIDIOC_STREAMON, &type) < 0) {
-        ALOGE("%s::VIDIOC_STREAMON failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int gsc_v4l2_queue(int fd, SecBuffer *secBuf, enum v4l2_buf_type type, enum v4l2_memory memory, unsigned int index, int num_plane)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-    ALOGD("%s::num_plane=%d", __func__, num_plane);
-#endif
-    struct v4l2_buffer buf;
-    struct v4l2_plane  planes[MAX_PLANES_GSCALER];
-
-    memset(&buf, 0, sizeof(struct v4l2_buffer));
-
-    for (int i = 0; i < MAX_PLANES_GSCALER; i++)
-        memset(&planes[i], 0, sizeof(struct v4l2_plane));
-
-    buf.type     = type;
-    buf.memory   = memory;
-    buf.length   = num_plane;
-    buf.index    = index;
-    buf.m.planes = planes;
-
-    for (unsigned int i = 0; i < buf.length; i++) {
-        buf.m.planes[i].m.userptr = (unsigned long)secBuf->virt.extP[i];
-        buf.m.planes[i].length    = secBuf->size.extS[i];
-        buf.m.planes[i].bytesused = buf.m.planes[i].length;
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s::buf.index=%d", __func__, buf.index);
-    ALOGD("%s::buf.m.planes[%d].m.userptr=0x%08x", __func__, i, (unsigned int)buf.m.planes[i].m.userptr);
-    ALOGD("%s::buf.m.planes[%d].length   =0x%08x", __func__, i, buf.m.planes[i].length);
-    ALOGD("%s::buf.m.planes[%d].bytesused=0x%08x", __func__, i, buf.m.planes[i].bytesused);
-#endif
-    }
-
-    if (ioctl(fd, VIDIOC_QBUF, &buf) < 0) {
-        ALOGE("%s::VIDIOC_QBUF failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int gsc_v4l2_dequeue(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, unsigned int *index, int num_plane)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_buffer buf;
-    struct v4l2_plane  planes[MAX_PLANES_GSCALER];
-
-    memset(&buf, 0, sizeof(struct v4l2_buffer));
-
-    for (int i = 0; i < MAX_PLANES_GSCALER; i++)
-        memset(&planes[i], 0, sizeof(struct v4l2_plane));
-
-
-    buf.type     = type;
-    buf.memory   = memory;
-    buf.length   = num_plane;
-    buf.m.planes = planes;
-
-    if (ioctl(fd, VIDIOC_DQBUF, &buf) < 0) {
-        ALOGE("%s::VIDIOC_DQBUF failed", __func__);
-        return -1;
-    }
-
-    *index = buf.index;
-
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s::buf.index=%d", __func__, buf.index);
-#endif
-
-    return 0;
-}
-
-int gsc_v4l2_stream_off(int fd, enum v4l2_buf_type type)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    if (ioctl(fd, VIDIOC_STREAMOFF, &type) < 0) {
-        ALOGE("%s::VIDIOC_STREAMOFF failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int gsc_v4l2_clr_buf(int fd, enum v4l2_buf_type type, enum v4l2_memory memory)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_requestbuffers req;
-
-    req.count   = 0;
-    req.type    = type;
-    req.memory  = memory;
-
-    if (ioctl(fd, VIDIOC_REQBUFS, &req) < 0) {
-        ALOGE("%s::VIDIOC_REQBUFS failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int gsc_subdev_set_fmt(int fd, unsigned int pad, enum v4l2_mbus_pixelcode code, s5p_fimc_img_info *img_info)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_subdev_format fmt;
-    struct v4l2_subdev_crop   crop;
-
-    fmt.pad   = pad;
-    fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-    fmt.format.width  = img_info->full_width;
-    fmt.format.height = img_info->full_height;
-    fmt.format.code   = code;
-
-    if (ioctl(fd, VIDIOC_SUBDEV_S_FMT, &fmt) < 0) {
-        ALOGE("%s::VIDIOC_SUBDEV_S_FMT failed", __func__);
-        return -1;
-    }
-
-    crop.pad   = pad;
-    crop.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-    crop.rect.left   = img_info->start_x;
-    crop.rect.top    = img_info->start_y;
-    crop.rect.width  = img_info->width;
-    crop.rect.height = img_info->height;
-
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s::pix_mp w=%d, h=%d", __func__, fmt.format.width, fmt.format.height);
-    ALOGD("%s::crop   x=%d, y=%d, w=%d, h=%d", __func__, crop.rect.left, crop.rect.top, crop.rect.width, crop.rect.height);
-#endif
-
-    if (ioctl(fd, VIDIOC_SUBDEV_S_CROP, &crop) < 0) {
-        ALOGE("%s::VIDIOC_SUBDEV_S_CROP failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-static inline int multipleOfN(int number, int N)
-{
-    int result = number;
-    switch (N) {
-    case 1:
-    case 2:
-    case 4:
-    case 8:
-    case 16:
-    case 32:
-    case 64:
-    case 128:
-    case 256:
-        result = (number - (number & (N-1)));
-        break;
-    default:
-        result = number - (number % N);
-        break;
-    }
-    return result;
-}
-
-SecGscaler::SecGscaler()
-:   mFlagCreate(false)
-{
-}
-
-SecGscaler::~SecGscaler()
-{
-    if (mFlagCreate == true) {
-        ALOGE("%s::this is not Destroyed fail", __func__);
-
-        if (destroy() == false)
-            ALOGE("%s::destroy failed", __func__);
-    }
-}
-
-bool SecGscaler::create(enum DEV dev, enum MODE mode, unsigned int numOfBuf)
-{
-    create(dev, numOfBuf);
-    return true;
-}
-
-bool SecGscaler::create(enum DEV dev, unsigned int numOfBuf)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-    if (mFlagCreate == true) {
-        ALOGE("%s::Already Created", __func__);
-        return true;
-    }
-
-    char node[20];
-    char subdevname[32];
-    char videodevname[32];
-
-    struct v4l2_capability   v4l2cap;
-    struct media_entity_desc entity_desc;
-
-    mDev = dev;
-    mVideoNodeNum = dev;
-    mNumOfBuf = numOfBuf;
-
-    mVideodevFd = 0;
-    mMediadevFd = 0;
-    mSubdevFd = 0;
-
-    mSrcIndex = 0;
-    mRotVal = 0;
-    mFlagGlobalAlpha = false;
-    mGlobalAlpha = 0x0;
-    mFlagLocalAlpha = false;
-    mFlagColorKey = false;
-    mColorKey = 0x0;
-    mFlagSetSrcParam = false;
-    mFlagSetDstParam = false;
-    mFlagStreamOn = false;
-
-    memset(&mS5pFimc, 0, sizeof(s5p_fimc_t));
-
-    switch(mDev) {
-    case DEV_0:
-        mVideoNodeNum = 24;
-        mSubdevNodeNum = 4;
-        break;
-    case DEV_1:
-        mVideoNodeNum = 27;
-        mSubdevNodeNum = 5;
-        break;
-    case DEV_2:
-        mVideoNodeNum = 30;
-        mSubdevNodeNum = 6;
-        break;
-    case DEV_3:
-        mVideoNodeNum = 33;
-        mSubdevNodeNum = 3; // need to modify //carrotsm
-        break;
-    default:
-        ALOGE("%s::invalid mDev(%d)", __func__, mDev);
-        goto err;
-        break;
-    }
-
-    sprintf(node, "%s%d", PFX_NODE_MEDIADEV, 0);
-    mMediadevFd = open(node, O_RDONLY);
-
-    if (mMediadevFd < 0) {
-        ALOGE("%s::open(%s) failed : O_RDONLY", __func__, node);
-        goto err;
-    }
-
-    sprintf(subdevname,   PFX_ENTITY_SUBDEV_GSC, mDev);
-    sprintf(videodevname, PFX_ENTITY_OUTPUTDEV_GSC, mDev);
-
-    for (__u32 id = 0; ; id = entity_desc.id) {
-        entity_desc.id = id | MEDIA_ENT_ID_FLAG_NEXT;
-
-        if (ioctl(mMediadevFd, MEDIA_IOC_ENUM_ENTITIES, &entity_desc) < 0) {
-            if (errno == EINVAL) {
-                ALOGD("%s::MEDIA_IOC_ENUM_ENTITIES ended", __func__);
-                break;
-            }
-            ALOGE("%s::MEDIA_IOC_ENUM_ENTITIES failed", __func__);
-            goto err;
-        }
-
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s::entity_desc.id=%d, .minor=%d .name=%s", __func__, entity_desc.id, entity_desc.v4l.minor, entity_desc.name);
-#endif
-
-        if (strncmp(entity_desc.name, subdevname, strlen(subdevname)) == 0)
-            mSubdevEntity = entity_desc.id;
-
-        if (strncmp(entity_desc.name, videodevname, strlen(videodevname)) == 0)
-            mVideodevEntity = entity_desc.id;
-    }
-
-    if (0 < mMediadevFd)
-        close(mMediadevFd);
-    mMediadevFd = -1;
-
-    sprintf(node, "%s%d", PFX_NODE_SUBDEV, mSubdevNodeNum);
-    mSubdevFd = open(node, O_RDWR);
-    if (mSubdevFd < 0) {
-        ALOGE("%s::open(%s) failed", __func__, node);
-        goto err;
-    }
-
-    sprintf(node, "%s%d", PFX_NODE_VIDEODEV, mVideoNodeNum);
-    mVideodevFd = open(node, O_RDWR);
-    if (mVideodevFd < 0) {
-        ALOGE("%s::open(%s) failed", __func__, node);
-        goto err;
-    }
-
-    /* check capability */
-    if (gsc_v4l2_querycap(mVideodevFd, node) < 0 ) {
-        ALOGE("%s::tvout_std_v4l2_querycap failed", __func__);
-        goto err;
-    }
-
-    mFlagCreate = true;
-
-    return true;
-
-err :
-    if (0 < mVideodevFd)
-        close(mVideodevFd);
-
-    if (0 < mMediadevFd)
-        close(mMediadevFd);
-
-    if (0 < mSubdevFd)
-        close(mSubdevFd);
-
-    mVideodevFd = -1;
-    mMediadevFd = -1;
-    mSubdevFd = -1;
-
-    return false;
-}
-
-bool SecGscaler::destroy()
-{
-    s5p_fimc_params_t *params = &(mS5pFimc.params);
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Already Destroyed", __func__);
-        return true;
-    }
-
-    if (mFlagStreamOn == true) {
-        if (streamOff() == false) {
-            ALOGE("%s::streamOff() failed", __func__);
-            return false;
-        }
-
-        if (closeVideodevFd() == false) {
-            ALOGE("%s::closeVideodevFd() failed", __func__);
-            return false;
-        }
-
-        mFlagStreamOn = false;
-    }
-
-    if (0 < mMediadevFd)
-        close(mMediadevFd);
-
-    if (0 < mSubdevFd)
-        close(mSubdevFd);
-
-    mVideodevFd = -1;
-    mMediadevFd = -1;
-    mSubdevFd = -1;
-
-    mFlagCreate = false;
-
-    return true;
-}
-
-bool SecGscaler::flagCreate(void)
-{
-    return mFlagCreate;
-}
-
-int SecGscaler::getFd(void)
-{
-    return getVideodevFd();
-}
-
-int SecGscaler::getVideodevFd(void)
-{
-    return mVideodevFd;
-}
-
-bool SecGscaler::openVideodevFd(void)
-{
-    char node[32];
-
-    sprintf(node, "%s%d", PFX_NODE_VIDEODEV, mVideoNodeNum);
-    mVideodevFd = open(node, O_RDWR);
-    if (mVideodevFd < 0) {
-        ALOGE("%s::open(%s) failed", __func__, node);
-        return false;
-    }
-
-    return true;
-}
-
-bool SecGscaler::closeVideodevFd(void)
-{
-    if (mFlagSetSrcParam == true) {
-        if (gsc_v4l2_clr_buf(mVideodevFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_TYPE) < 0) {
-            ALOGE("%s::gsc_v4l2_clr_buf() failed", __func__);
-            return false;
-        }
-    }
-
-    if (0 < mVideodevFd) {
-        if (close(mVideodevFd) < 0) {
-            ALOGE("%s::close Videodev failed", __func__);
-            return false;
-        }
-    }
-    mVideodevFd = -1;
-
-    return true;
-}
-
-int SecGscaler::getSubdevFd(void)
-{
-    return mSubdevFd;
-}
-
-__u32 SecGscaler::getSubdevEntity(void)
-{
-    return mSubdevEntity;
-}
-
-__u32 SecGscaler::getVideodevEntity(void)
-{
-    return mVideodevEntity;
-}
-
-bool  SecGscaler::getFlagSteamOn(void)
-{
-    return mFlagStreamOn;
-}
-
-SecBuffer * SecGscaler::getSrcBufferAddr(int index)
-{
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    return &mSrcBuffer[index];
-}
-
-bool SecGscaler::setSrcParams(unsigned int width, unsigned int height,
-                              unsigned int cropX, unsigned int cropY,
-                              unsigned int *cropWidth, unsigned int *cropHeight,
-                              int colorFormat,
-                              bool forceChange)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    int v4l2ColorFormat = HAL_PIXEL_FORMAT_2_V4L2_PIX(colorFormat);
-    if (v4l2ColorFormat < 0) {
-        ALOGE("%s::not supported color format", __func__);
-        return false;
-    }
-
-    s5p_fimc_params_t *params = &(mS5pFimc.params);
-
-    unsigned int fimcWidth  = *cropWidth;
-    unsigned int fimcHeight = *cropHeight;
-    int src_planes = m_getYuvPlanes(v4l2ColorFormat);
-    int src_bpp    = m_getYuvBpp(v4l2ColorFormat);
-    unsigned int frame_size  = width * height;
-    unsigned int frame_ratio = 8;
-
-    if (m_checkSrcSize(width, height, cropX, cropY,
-                   &fimcWidth, &fimcHeight, v4l2ColorFormat, false) == false) {
-        ALOGE("%s::::size align error!", __func__);
-        return false;
-    }
-
-    if (fimcWidth != *cropWidth || fimcHeight != *cropHeight) {
-        if (forceChange == true) {
-#ifdef DEBUG_LIB_FIMC
-            ALOGD("size is changed from [w=%d, h=%d] to [w=%d, h=%d]",
-                    *cropWidth, *cropHeight, fimcWidth, fimcHeight);
-#endif
-        } else {
-            ALOGE("%s::invalid source params", __func__);
-            return false;
-        }
-    }
-
-    if (   (params->src.full_width == width)
-        && (params->src.full_height == height)
-        && (params->src.start_x == cropX)
-        && (params->src.start_y == cropY)
-        && (params->src.width == fimcWidth)
-        && (params->src.height == fimcHeight)
-        && (params->src.color_space == (unsigned int)v4l2ColorFormat))
-        return true;
-
-    params->src.full_width  = width;
-    params->src.full_height = height;
-    params->src.start_x     = cropX;
-    params->src.start_y     = cropY;
-    params->src.width       = fimcWidth;
-    params->src.height      = fimcHeight;
-    params->src.color_space = v4l2ColorFormat;
-    src_planes = (src_planes == -1) ? 1 : src_planes;
-    params->src.planes = src_planes;
-
-    mSrcBuffer[mSrcIndex].size.extS[0] = 0;
-    mSrcBuffer[mSrcIndex].size.extS[1] = 0;
-    mSrcBuffer[mSrcIndex].size.extS[2] = 0;
-
-    frame_ratio = frame_ratio * (src_planes -1) / (src_bpp - 8);
-#ifdef USE_GSC_USERPTR
-    for (int buf_index = 0; buf_index < MAX_BUFFERS_GSCALER; buf_index++) {
-        switch (src_planes) {
-        case 1:
-            switch (v4l2ColorFormat) {
-            case V4L2_PIX_FMT_BGR32:
-                params->src.color_space = V4L2_PIX_FMT_RGB32;
-            case V4L2_PIX_FMT_RGB32:
-                mSrcBuffer[buf_index].size.extS[0] = frame_size << 2;
-                break;
-            case V4L2_PIX_FMT_RGB565X:
-            case V4L2_PIX_FMT_NV16:
-            case V4L2_PIX_FMT_NV61:
-            case V4L2_PIX_FMT_YUYV:
-            case V4L2_PIX_FMT_UYVY:
-            case V4L2_PIX_FMT_VYUY:
-            case V4L2_PIX_FMT_YVYU:
-                mSrcBuffer[buf_index].size.extS[0] = frame_size << 1;
-                break;
-            case V4L2_PIX_FMT_YUV420:
-            case V4L2_PIX_FMT_NV12:
-            case V4L2_PIX_FMT_NV21:
-                mSrcBuffer[buf_index].size.extS[0] = (frame_size * 3) >> 1;
-                break;
-            default:
-                ALOGE("%s::invalid color type", __func__);
-                return false;
-                break;
-            }
-            mSrcBuffer[buf_index].size.extS[1] = 0;
-            mSrcBuffer[buf_index].size.extS[2] = 0;
-            break;
-        case 2:
-        case 3:
-            mSrcBuffer[buf_index].size.extS[0] = frame_size;
-            mSrcBuffer[buf_index].size.extS[1] = frame_size / frame_ratio;
-            mSrcBuffer[buf_index].size.extS[2] = frame_size / frame_ratio;
-            break;
-        default:
-            ALOGE("%s::invalid color foarmt", __func__);
-            return false;
-            break;
-        }
-    }
-#else
-    if (v4l2ColorFormat == V4L2_PIX_FMT_BGR32)
-        params->src.color_space = V4L2_PIX_FMT_RGB32;
-#endif
-
-    if (mFlagSetSrcParam == true) {
-        if (gsc_v4l2_clr_buf(mVideodevFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_TYPE) < 0) {
-            ALOGE("%s::gsc_v4l2_clr_buf() failed", __func__);
-            return false;
-        }
-    }
-
-    if (gsc_v4l2_set_fmt(mVideodevFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_FIELD_NONE, &(params->src)) < 0) {
-        ALOGE("%s::fimc_v4l2_set_fmt()[src] failed", __func__);
-        return false;
-    }
-
-    if (gsc_v4l2_req_buf(mVideodevFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_TYPE, mNumOfBuf) < 0) {
-        ALOGE("%s::fimc_v4l2_req_buf()[src] failed", __func__);
-        return false;
-    }
-#ifdef USE_GSC_USERPTR
-#else
-    for (unsigned int buf_index = 0; buf_index < MAX_BUFFERS_GSCALER; buf_index++) {
-        if (gsc_v4l2_query_buf(mVideodevFd, &mSrcBuffer[buf_index], V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_MMAP, buf_index, params->src.planes) < 0) {
-            ALOGE("%s::gsc_v4l2_query_buf() failed", __func__);
-            return false;
-        }
-    }
-#endif
-
-    *cropWidth  = fimcWidth;
-    *cropHeight = fimcHeight;
-
-    mFlagSetSrcParam = true;
-
-    return true;
-}
-
-bool SecGscaler::getSrcParams(unsigned int *width, unsigned int *height,
-                              unsigned int *cropX, unsigned int *cropY,
-                              unsigned int *cropWidth, unsigned int *cropHeight,
-                              int *v4l2colorFormat)
-{
-    struct v4l2_format fmt;
-    struct v4l2_crop   crop;
-
-    fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-
-    if (ioctl(mVideodevFd, VIDIOC_G_FMT, &fmt) < 0) {
-        ALOGE("%s::VIDIOC_G_FMT(fmt.type : %d) failed", __func__, fmt.type);
-        return false;
-    }
-
-    switch (fmt.type) {
-    case V4L2_BUF_TYPE_VIDEO_OUTPUT:
-    case V4L2_BUF_TYPE_VIDEO_CAPTURE:
-    case V4L2_BUF_TYPE_VIDEO_OVERLAY:
-        *width       = fmt.fmt.pix.width;
-        *height      = fmt.fmt.pix.height;
-        *v4l2colorFormat = fmt.fmt.pix.pixelformat;
-        break;
-    case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
-    case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
-        *width       = fmt.fmt.pix_mp.width;
-        *height      = fmt.fmt.pix_mp.height;
-        *v4l2colorFormat = fmt.fmt.pix_mp.pixelformat;
-        break;
-    default:
-        ALOGE("%s::Invalid buffer type", __func__);
-        return false;
-        break;
-    }
-
-    crop.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    if (ioctl(mVideodevFd, VIDIOC_G_CROP, &crop) < 0) {
-        ALOGE("%s::VIDIOC_G_CROP failed", __func__);
-        return false;
-    }
-
-    *cropX      = crop.c.left;
-    *cropY      = crop.c.top;
-    *cropWidth  = crop.c.width;
-    *cropHeight = crop.c.height;
-
-    return true;
-}
-
-bool SecGscaler::setSrcAddr(unsigned int YAddr,
-                            unsigned int CbAddr,
-                            unsigned int CrAddr,
-                            int colorFormat)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    if (mFlagSetSrcParam == false) {
-        ALOGE("%s::mFlagSetSrcParam == false", __func__);
-        return false;
-    }
-
-#ifdef USE_GSC_USERPTR
-    mSrcBuffer[mSrcIndex].virt.extP[0] = (char *)YAddr;
-    mSrcBuffer[mSrcIndex].virt.extP[1] = (char *)CbAddr;
-    mSrcBuffer[mSrcIndex].virt.extP[2] = (char *)CrAddr;
-#else
-    unsigned int srcAddr[MAX_PLANES_GSCALER];
-
-    srcAddr[0] = YAddr;
-    srcAddr[1] = CbAddr;
-    srcAddr[2] = CrAddr;
-
-    for (int plane_index = 0; plane_index < mS5pFimc.params.src.planes; plane_index++) {
-        memcpy((void *)mSrcBuffer[mSrcIndex].virt.extP[plane_index], (void *)srcAddr[plane_index], mSrcBuffer[mSrcIndex].size.extS[plane_index]);
-    }
-#endif
-
-    return true;
-}
-
-bool SecGscaler::setDstParams(unsigned int width, unsigned int height,
-                              unsigned int cropX, unsigned int cropY,
-                              unsigned int *cropWidth, unsigned int *cropHeight,
-                              int colorFormat,
-                              bool forceChange)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    int mbusFormat = V4L2_MBUS_FMT_YUV8_1X24;
-
-    s5p_fimc_params_t *params = &(mS5pFimc.params);
-
-    unsigned int fimcWidth  = *cropWidth;
-    unsigned int fimcHeight = *cropHeight;
-
-    if( m_checkDstSize(width, height, cropX, cropY,
-                   &fimcWidth, &fimcHeight, V4L2_PIX_FMT_YUV444,
-                   mRotVal, true) == false) {
-        ALOGE("%s::size align error!", __func__);
-        return false;
-    }
-
-
-    if (fimcWidth != *cropWidth || fimcHeight != *cropHeight) {
-        if (forceChange == true) {
-#ifdef DEBUG_LIB_FIMC
-            ALOGD("size is changed from [w = %d, h= %d] to [w = %d, h = %d]",
-                    *cropWidth, *cropHeight, fimcWidth, fimcHeight);
-#endif
-        } else {
-            ALOGE("%s::Invalid destination params", __func__);
-            return false;
-        }
-    }
-
-    if (90 == mRotVal || 270 == mRotVal) {
-        params->dst.full_width  = height;
-        params->dst.full_height = width;
-
-        if (90 == mRotVal) {
-            params->dst.start_x     = cropY;
-            params->dst.start_y     = width - (cropX + fimcWidth);
-        } else {
-            params->dst.start_x = height - (cropY + fimcHeight);
-            params->dst.start_y = cropX;
-        }
-
-        params->dst.width       = fimcHeight;
-        params->dst.height      = fimcWidth;
-
-        params->dst.start_y     += (fimcWidth - params->dst.height);
-
-    } else {
-        params->dst.full_width  = width;
-        params->dst.full_height = height;
-
-        if (180 == mRotVal) {
-            params->dst.start_x = width - (cropX + fimcWidth);
-            params->dst.start_y = height - (cropY + fimcHeight);
-        } else {
-            params->dst.start_x     = cropX;
-            params->dst.start_y     = cropY;
-        }
-
-        params->dst.width       = fimcWidth;
-        params->dst.height      = fimcHeight;
-    }
-
-    if (gsc_subdev_set_fmt(mSubdevFd, GSC_SUBDEV_PAD_SOURCE, V4L2_MBUS_FMT_YUV8_1X24, &(params->dst)) < 0) {
-        ALOGE("%s::gsc_subdev_set_fmt()[dst] failed", __func__);
-        return false;
-    }
-
-    mFlagSetDstParam = true;
-
-    return true;
-}
-
-bool SecGscaler::getDstParams(unsigned int *width, unsigned int *height,
-                              unsigned int *cropX, unsigned int *cropY,
-                              unsigned int *cropWidth, unsigned int *cropHeight,
-                              int *mbusColorFormat)
-{
-    struct v4l2_subdev_format fmt;
-    struct v4l2_subdev_crop   crop;
-
-    fmt.pad   = GSC_SUBDEV_PAD_SOURCE;
-    fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-
-    if (ioctl(mSubdevFd, VIDIOC_SUBDEV_G_FMT, &fmt) < 0) {
-        ALOGE("%s::VIDIOC_SUBDEV_S_FMT", __func__);
-        return -1;
-    }
-
-    *width  = fmt.format.width;
-    *height = fmt.format.height;
-    *mbusColorFormat = fmt.format.code;
-
-    crop.pad   = GSC_SUBDEV_PAD_SOURCE;
-    crop.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-
-    if (ioctl(mSubdevFd, VIDIOC_SUBDEV_G_CROP, &crop) < 0) {
-        ALOGE("%s::VIDIOC_SUBDEV_S_CROP", __func__);
-        return -1;
-    }
-
-    *cropX      = crop.rect.left;
-    *cropY      = crop.rect.top;
-    *cropWidth  = crop.rect.width;
-    *cropHeight = crop.rect.height;
-
-    return true;
-}
-
-bool SecGscaler::setDstAddr(unsigned int YAddr, unsigned int CbAddr, unsigned int CrAddr, int buf_index)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    return true;
-}
-
-bool SecGscaler::setRotVal(unsigned int rotVal)
-{
-    struct v4l2_control vc;
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    if (gsc_v4l2_s_ctrl(mVideodevFd, V4L2_CID_ROTATE, rotVal) < 0) {
-        ALOGE("%s::fimc_v4l2_s_ctrl(V4L2_CID_ROTATE) failed", __func__);
-        return false;
-    }
-
-    mRotVal = rotVal;
-    return true;
-}
-
-bool SecGscaler::setGlobalAlpha(bool enable, int alpha)
-{
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    if (mFlagStreamOn == true) {
-        ALOGE("%s::mFlagStreamOn == true", __func__);
-        return false;
-    }
-
-    mFlagGlobalAlpha = enable;
-    mGlobalAlpha     = alpha;
-
-    return true;
-
-}
-
-bool SecGscaler::setLocalAlpha(bool enable)
-{
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    if (mFlagStreamOn == true) {
-        ALOGE("%s::mFlagStreamOn == true", __func__);
-        return false;
-    }
-
-    if (mFlagLocalAlpha == enable)
-        return true;
-
-    return true;
-}
-
-bool SecGscaler::setColorKey(bool enable, int colorKey)
-{
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    if (mFlagStreamOn == true) {
-        ALOGE("%s::mFlagStreamOn == true", __func__);
-        return false;
-    }
-
-    mFlagColorKey = enable;
-    mColorKey = colorKey;
-
-    return true;
-}
-
-bool SecGscaler::run()
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    if (mFlagSetSrcParam == false) {
-        ALOGE("%s::faild : Need to set source parameters of Gscaler", __func__);
-        return false;
-    }
-
-    if (mFlagSetDstParam == false) {
-        ALOGE("%s::faild : Need to set destination parameters of Gscaler", __func__);
-        return false;
-    }
-
-    s5p_fimc_params_t *params = &(mS5pFimc.params);
-    int src_planes = m_getYuvPlanes(params->src.color_space);
-    unsigned int dqIndex = 0;
-    src_planes     = (src_planes == -1) ? 1 : src_planes;
-
-    if (gsc_v4l2_queue(mVideodevFd, &(mSrcBuffer[mSrcIndex]), V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_TYPE, mSrcIndex, src_planes) < 0) {
-        ALOGE("%s::fimc_v4l2_queue[src](mNumOfBuf : %d,mSrcIndex=%d) failed", __func__, mNumOfBuf, mSrcIndex);
-        return false;
-    }
-
-    mSrcIndex++;
-    if (mSrcIndex >= MAX_BUFFERS_GSCALER) {
-        mSrcIndex = 0;
-    }
-
-    if (gsc_v4l2_dequeue(mVideodevFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_TYPE, &dqIndex, src_planes) < 0) {
-        ALOGE("%s::fimc_v4l2_dequeue[src](mNumOfBuf : %d, dqIndex=%d) failed", __func__, mNumOfBuf, dqIndex);
-        return false;
-    }
-
-    return true;
-}
-
-bool SecGscaler::streamOn(void)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    if (mFlagStreamOn == true) {
-        ALOGE("%s::already streamon", __func__);
-        return true;
-    }
-
-    s5p_fimc_params_t *params = &(mS5pFimc.params);
-    int src_planes = m_getYuvPlanes(params->src.color_space);
-    src_planes     = (src_planes == -1) ? 1 : src_planes;
-
-    if (gsc_v4l2_queue(mVideodevFd, &(mSrcBuffer[mSrcIndex]), V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_TYPE, mSrcIndex, src_planes) < 0) {
-        ALOGE("%s::fimc_v4l2_queue[src](mNumOfBuf : %d,mSrcIndex=%d) failed", __func__, mNumOfBuf, mSrcIndex);
-        return false;
-    }
-
-    mSrcIndex++;
-    if (mSrcIndex == MAX_BUFFERS_GSCALER - 1) {
-        if (gsc_v4l2_stream_on(mVideodevFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) < 0) {
-            ALOGE("%s::fimc_v4l2_stream_on() failed", __func__);
-            return false;
-        }
-        mFlagStreamOn = true;
-    }
-
-    if (mSrcIndex >= MAX_BUFFERS_GSCALER) {
-        mSrcIndex = 0;
-    }
-
-    return true;
-}
-
-bool SecGscaler::streamOff(void)
-{
-#ifdef DEBUG_LIB_FIMC
-    ALOGD("%s", __func__);
-#endif
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    if (mFlagStreamOn == false) {
-        ALOGE("%s::already streamoff", __func__);
-        return true;
-    }
-
-    if (gsc_v4l2_stream_off(mVideodevFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) < 0) {
-        ALOGE("%s::fimc_v4l2_stream_off() failed", __func__);
-        return false;
-    }
-
-    mSrcIndex = 0;
-#ifdef USE_GSC_USERPTR
-    SecBuffer zeroBuf;
-    for (int buf_index = 0; buf_index < MAX_BUFFERS_GSCALER; buf_index++)
-        mSrcBuffer[buf_index] = zeroBuf;
-#else
-    for (int buf_index = 0; buf_index < MAX_BUFFERS_GSCALER; buf_index++) {
-        for (int plane_index = 0; plane_index < MAX_PLANES_GSCALER; plane_index++) {
-            munmap((void *)mSrcBuffer[buf_index].virt.extP[plane_index], mSrcBuffer[buf_index].size.extS[plane_index]);
-        }
-    }
-#endif
-
-    mFlagStreamOn = false;
-
-    return true;
-}
-
-bool SecGscaler::m_checkSrcSize(unsigned int width, unsigned int height,
-                             unsigned int cropX, unsigned int cropY,
-                             unsigned int *cropWidth, unsigned int *cropHeight,
-                             int colorFormat,
-                             bool forceChange)
-{
-    bool ret = true;
-
-    if (8 <= height && *cropHeight < 8) {
-        if (forceChange)
-            *cropHeight = 8;
-        ret = false;
-    }
-
-    if (16 <= width && *cropWidth < 16) {
-        if (forceChange)
-            *cropWidth = 16;
-        ret = false;
-    }
-
-    if (height < 8)
-        return false;
-
-    if (width % 16 != 0)
-        return false;
-
-    if (*cropWidth % 16 != 0) {
-        if (forceChange)
-            *cropWidth = multipleOfN(*cropWidth, 16);
-        ret = false;
-    }
-
-    return ret;
-}
-
-bool SecGscaler::m_checkDstSize(unsigned int width, unsigned int height,
-                             unsigned int cropX, unsigned int cropY,
-                             unsigned int *cropWidth, unsigned int *cropHeight,
-                             int colorFormat, int rotVal,  bool forceChange)
-{
-    bool ret = true;
-    unsigned int rotWidth;
-    unsigned int rotHeight;
-    unsigned int *rotCropWidth;
-    unsigned int *rotCropHeight;
-
-    if (rotVal == 90 || rotVal == 270) {
-        rotWidth = height;
-        rotHeight = width;
-        rotCropWidth = cropHeight;
-        rotCropHeight = cropWidth;
-    } else {
-        rotWidth = width;
-        rotHeight = height;
-        rotCropWidth = cropWidth;
-        rotCropHeight = cropHeight;
-    }
-
-    if (rotHeight < 8)
-        return false;
-
-    if (rotWidth % 8 != 0)
-        return false;
-
-    switch (colorFormat) {
-    case V4L2_PIX_FMT_NV21:
-    case V4L2_PIX_FMT_NV12:
-    case V4L2_PIX_FMT_NV12T:
-    case V4L2_PIX_FMT_NV12M:
-    case V4L2_PIX_FMT_NV12MT:
-    case V4L2_PIX_FMT_YUV420M:
-    case V4L2_PIX_FMT_YUV420:
-        if (*rotCropHeight % 2 != 0) {
-            if (forceChange)
-                *rotCropHeight = multipleOfN(*rotCropHeight, 2);
-            ret = false;
-        }
-    }
-    return ret;
-}
-
-int SecGscaler::m_widthOfFimc(int v4l2ColorFormat, int width)
-{
-    int newWidth = width;
-
-    switch (v4l2ColorFormat) {
-    case V4L2_PIX_FMT_RGB565:
-        newWidth = multipleOfN(width, 8);
-        break;
-    case V4L2_PIX_FMT_RGB32:
-        newWidth = multipleOfN(width, 4);
-        break;
-    case V4L2_PIX_FMT_YUYV:
-    case V4L2_PIX_FMT_UYVY:
-        newWidth = multipleOfN(width, 4);
-        break;
-    case V4L2_PIX_FMT_NV61:
-    case V4L2_PIX_FMT_NV16:
-        newWidth = multipleOfN(width, 8);
-        break;
-    case V4L2_PIX_FMT_YUV422P:
-        newWidth = multipleOfN(width, 16);
-        break;
-    case V4L2_PIX_FMT_NV21:
-    case V4L2_PIX_FMT_NV12:
-    case V4L2_PIX_FMT_NV12MT:
-        newWidth = multipleOfN(width, 8);
-        break;
-    case V4L2_PIX_FMT_YUV420:
-    case V4L2_PIX_FMT_YUV420M:
-        newWidth = multipleOfN(width, 16);
-        break;
-    default :
-        break;
-    }
-
-    return newWidth;
-}
-
-int SecGscaler::m_heightOfFimc(int v4l2ColorFormat, int height)
-{
-    int newHeight = height;
-
-    switch (v4l2ColorFormat) {
-    case V4L2_PIX_FMT_NV21:
-    case V4L2_PIX_FMT_NV12:
-    case V4L2_PIX_FMT_NV12T:
-    case V4L2_PIX_FMT_NV12MT:
-    case V4L2_PIX_FMT_YUV420:
-    case V4L2_PIX_FMT_YUV420M:
-        newHeight = multipleOfN(height, 2);
-        break;
-    default :
-        break;
-    }
-    return newHeight;
-}
-
-int SecGscaler::m_getYuvBpp(unsigned int fmt)
-{
-    int i, sel = -1;
-
-    for (i = 0; i < (int)(sizeof(yuv_list) / sizeof(struct yuv_fmt_list)); i++) {
-        if (yuv_list[i].fmt == fmt) {
-            sel = i;
-            break;
-        }
-    }
-
-    if (sel == -1)
-        return sel;
-    else
-        return yuv_list[sel].bpp;
-}
-
-int SecGscaler::m_getYuvPlanes(unsigned int fmt)
-{
-    int i, sel = -1;
-
-    for (i = 0; i < (int)(sizeof(yuv_list) / sizeof(struct yuv_fmt_list)); i++) {
-        if (yuv_list[i].fmt == fmt) {
-            sel = i;
-            break;
-        }
-    }
-
-    if (sel == -1)
-        return sel;
-    else
-        return yuv_list[sel].planes;
-}
diff --git a/exynos5/hal/libhdmi/SecHdmi/SecGscaler.h b/exynos5/hal/libhdmi/SecHdmi/SecGscaler.h
deleted file mode 100644
index e9867ed..0000000
--- a/exynos5/hal/libhdmi/SecHdmi/SecGscaler.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __SEC_GSC_OUT_H__
-#define __SEC_GSC_OUT_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <linux/fb.h>
-
-#include <stdint.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <asm/sizes.h>
-
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/poll.h>
-#include <sys/mman.h>
-#include <hardware/hardware.h>
-
-#include "utils/Timers.h"
-
-#include "s5p_fimc_v4l2.h"
-#include "sec_utils_v4l2.h"
-#include "media.h"
-#include "v4l2-subdev.h"
-
-#include "sec_format.h"
-
-#include "SecBuffer.h"
-
-#define PFX_NODE_MEDIADEV          "/dev/media"
-#define PFX_NODE_SUBDEV            "/dev/v4l-subdev"
-#define PFX_NODE_VIDEODEV          "/dev/video"
-#define PFX_ENTITY_SUBDEV_GSC      "exynos-gsc-sd.%d"
-#define PFX_ENTITY_OUTPUTDEV_GSC   "exynos-gsc.%d.output"
-
-#define GSC_SUBDEV_PAD_SINK      (0)
-#define GSC_SUBDEV_PAD_SOURCE    (1)
-#define GSC_VIDEODEV_PAD_SOURCE  (0)
-#define MAX_BUFFERS_GSCALER      (2)
-#define MAX_PLANES_GSCALER       (3)
-
-#ifdef __cplusplus
-}
-
-class SecGscaler
-{
-public:
-    enum DEV {
-        DEV_0 = 0,
-        DEV_1,
-        DEV_2,
-        DEV_3,
-        DEV_MAX,
-    };
-
-    enum MODE {
-        MODE_NONE = 0,
-        MODE_SINGLE_BUF,
-        MODE_MULTI_BUF,
-        MODE_DMA_AUTO,
-        MODE_MAX,
-    };
-
-private:
-    bool                        mFlagCreate;
-    int                         mDev;
-    int                         mVideoNodeNum;
-    int                         mSubdevNodeNum;
-    int                         mVideodevFd;
-    int                         mMediadevFd;
-    int                         mSubdevFd;
-    unsigned int                mNumOfBuf;
-    unsigned int                mSrcIndex;
-    int                         mRotVal;
-    bool                        mFlagGlobalAlpha;
-    int                         mGlobalAlpha;
-    bool                        mFlagLocalAlpha;
-    bool                        mFlagColorKey;
-    int                         mColorKey;
-    bool                        mFlagSetSrcParam;
-    bool                        mFlagSetDstParam;
-    bool                        mFlagStreamOn;
-
-    s5p_fimc_t                  mS5pFimc;
-    SecBuffer                   mSrcBuffer[MAX_BUFFERS_GSCALER];
-
-    __u32                       mSubdevEntity;
-    __u32                       mVideodevEntity;
-    //struct media_link_desc      mlink_desc;
-
-public:
-    SecGscaler();
-    virtual ~SecGscaler();
-
-    bool create(enum DEV dev, enum MODE mode, unsigned int numOfBuf);
-    bool create(enum DEV dev, unsigned int numOfBuf);
-
-    bool destroy(void);
-    bool flagCreate(void);
-
-    int   getFd(void);
-    int   getVideodevFd(void);
-    bool  openVideodevFd(void);
-    bool  closeVideodevFd(void);
-
-    int   getSubdevFd(void);
-    __u32 getSubdevEntity(void);
-    __u32 getVideodevEntity(void);
-    bool  getFlagSteamOn(void);
-
-    SecBuffer * getSrcBufferAddr(int index);
-
-    bool setSrcParams(unsigned int width, unsigned int height,
-                      unsigned int cropX, unsigned int cropY,
-                      unsigned int *cropWidth, unsigned int *cropHeight,
-                      int colorFormat,
-                      bool forceChange = true);
-
-    bool getSrcParams(unsigned int *width, unsigned int *height,
-                      unsigned int *cropX, unsigned int *cropY,
-                      unsigned int *cropWidth, unsigned int *cropHeight,
-                      int *v4l2colorFormat);
-
-    bool setSrcAddr(unsigned int YAddr,
-                    unsigned int CbAddr = 0,
-                    unsigned int CrAddr = 0,
-                    int colorFormat = 0);
-
-    bool setDstParams(unsigned int width, unsigned int height,
-                      unsigned int cropX, unsigned int cropY,
-                      unsigned int *cropWidth, unsigned int *cropHeight,
-                      int colorFormat,
-                      bool forceChange = true);
-
-    bool getDstParams(unsigned int *width, unsigned int *height,
-                      unsigned int *cropX, unsigned int *cropY,
-                      unsigned int *cropWidth, unsigned int *cropHeight,
-                      int *mbusColorFormat);
-
-    bool setDstAddr(unsigned int YAddr,
-                    unsigned int CbAddr = 0,
-                    unsigned int CrAddr = 0,
-                    int buf_index = 0);
-
-    bool setRotVal(unsigned int rotVal);
-    bool setGlobalAlpha(bool enable = true, int alpha = 0xff);
-    bool setLocalAlpha(bool enable);
-    bool setColorKey(bool enable = true, int colorKey = 0xff);
-
-    bool run(void);
-    bool streamOn(void);
-    bool streamOff(void);
-
-private:
-    bool m_checkSrcSize(unsigned int width, unsigned int height,
-                        unsigned int cropX, unsigned int cropY,
-                        unsigned int *cropWidth, unsigned int *cropHeight,
-                        int colorFormat,
-                        bool forceChange = false);
-
-    bool m_checkDstSize(unsigned int width, unsigned int height,
-                        unsigned int cropX, unsigned int cropY,
-                        unsigned int *cropWidth, unsigned int *cropHeight,
-                        int colorFormat,
-                        int rotVal,
-                        bool forceChange = false);
-    int  m_widthOfFimc(int v4l2ColorFormat, int width);
-    int  m_heightOfFimc(int v4l2ColorFormat, int height);
-    int  m_getYuvBpp(unsigned int fmt);
-    int  m_getYuvPlanes(unsigned int fmt);
-};
-#endif
-
-#endif //__SEC_GSC_OUT_H__
diff --git a/exynos5/hal/libhdmi/SecHdmi/SecHdmi.cpp b/exynos5/hal/libhdmi/SecHdmi/SecHdmi.cpp
deleted file mode 100644
index bb395d5..0000000
--- a/exynos5/hal/libhdmi/SecHdmi/SecHdmi.cpp
+++ /dev/null
@@ -1,1985 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define DEBUG_MSG_ENABLE
-//#define LOG_NDEBUG 0
-//#define LOG_TAG "libhdmi"
-#include <cutils/log.h>
-#include "ion.h"
-#include "SecHdmi.h"
-#include "SecHdmiV4L2Utils.h"
-
-#define CHECK_GRAPHIC_LAYER_TIME (0)
-
-namespace android {
-
-extern unsigned int output_type;
-extern v4l2_std_id t_std_id;
-extern int g_hpd_state;
-extern unsigned int g_hdcp_en;
-
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-extern unsigned int g2d_reserved_memory0;
-extern unsigned int g2d_reserved_memory1;
-extern unsigned int g2d_reserved_memory_size;
-extern unsigned int cur_g2d_address;
-#endif
-
-#if defined(BOARD_USES_CEC)
-SecHdmi::CECThread::~CECThread()
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    mFlagRunning = false;
-}
-
-bool SecHdmi::CECThread::threadLoop()
-{
-    unsigned char buffer[CEC_MAX_FRAME_SIZE];
-    int size;
-    unsigned char lsrc, ldst, opcode;
-
-    {
-        Mutex::Autolock lock(mThreadLoopLock);
-        mFlagRunning = true;
-
-        size = CECReceiveMessage(buffer, CEC_MAX_FRAME_SIZE, 100000);
-
-        if (!size) // no data available or ctrl-c
-            return true;
-
-        if (size == 1)
-            return true; // "Polling Message"
-
-        lsrc = buffer[0] >> 4;
-
-        /* ignore messages with src address == mLaddr*/
-        if (lsrc == mLaddr)
-            return true;
-
-        opcode = buffer[1];
-
-        if (CECIgnoreMessage(opcode, lsrc)) {
-            ALOGE("### ignore message coming from address 15 (unregistered)\n");
-            return true;
-        }
-
-        if (!CECCheckMessageSize(opcode, size)) {
-            ALOGE("### invalid message size: %d(opcode: 0x%x) ###\n", size, opcode);
-            return true;
-        }
-
-        /* check if message broadcasted/directly addressed */
-        if (!CECCheckMessageMode(opcode, (buffer[0] & 0x0F) == CEC_MSG_BROADCAST ? 1 : 0)) {
-            ALOGE("### invalid message mode (directly addressed/broadcast) ###\n");
-            return true;
-        }
-
-        ldst = lsrc;
-
-        //TODO: macroses to extract src and dst logical addresses
-        //TODO: macros to extract opcode
-
-        switch (opcode) {
-        case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS:
-            /* responce with "Report Physical Address" */
-            buffer[0] = (mLaddr << 4) | CEC_MSG_BROADCAST;
-            buffer[1] = CEC_OPCODE_REPORT_PHYSICAL_ADDRESS;
-            buffer[2] = (mPaddr >> 8) & 0xFF;
-            buffer[3] = mPaddr & 0xFF;
-            buffer[4] = mDevtype;
-            size = 5;
-            break;
-
-        case CEC_OPCODE_REQUEST_ACTIVE_SOURCE:
-            ALOGD("[CEC_OPCODE_REQUEST_ACTIVE_SOURCE]\n");
-            /* responce with "Active Source" */
-            buffer[0] = (mLaddr << 4) | CEC_MSG_BROADCAST;
-            buffer[1] = CEC_OPCODE_ACTIVE_SOURCE;
-            buffer[2] = (mPaddr >> 8) & 0xFF;
-            buffer[3] = mPaddr & 0xFF;
-            size = 4;
-            ALOGD("Tx : [CEC_OPCODE_ACTIVE_SOURCE]\n");
-            break;
-
-        case CEC_OPCODE_ABORT:
-        case CEC_OPCODE_FEATURE_ABORT:
-        default:
-            /* send "Feature Abort" */
-            buffer[0] = (mLaddr << 4) | ldst;
-            buffer[1] = CEC_OPCODE_FEATURE_ABORT;
-            buffer[2] = CEC_OPCODE_ABORT;
-            buffer[3] = 0x04; // "refused"
-            size = 4;
-            break;
-        }
-
-        if (CECSendMessage(buffer, size) != size)
-            ALOGE("CECSendMessage() failed!!!\n");
-
-    }
-    return true;
-}
-
-bool SecHdmi::CECThread::start()
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-
-    Mutex::Autolock lock(mThreadControlLock);
-    if (exitPending()) {
-        if (requestExitAndWait() == WOULD_BLOCK) {
-            ALOGE("mCECThread.requestExitAndWait() == WOULD_BLOCK");
-            return false;
-        }
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("EDIDGetCECPhysicalAddress");
-#endif
-    /* set to not valid physical address */
-    mPaddr = CEC_NOT_VALID_PHYSICAL_ADDRESS;
-
-    if (!EDIDGetCECPhysicalAddress(&mPaddr)) {
-        ALOGE("Error: EDIDGetCECPhysicalAddress() failed.\n");
-        return false;
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("CECOpen");
-#endif
-    if (!CECOpen()) {
-        ALOGE("CECOpen() failed!!!\n");
-        return false;
-    }
-
-    /* a logical address should only be allocated when a device \
-       has a valid physical address, at all other times a device \
-       should take the 'Unregistered' logical address (15)
-       */
-
-    /* if physical address is not valid device should take \
-       the 'Unregistered' logical address (15)
-       */
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("CECAllocLogicalAddress");
-#endif
-    mLaddr = CECAllocLogicalAddress(mPaddr, mDevtype);
-
-    if (!mLaddr) {
-        ALOGE("CECAllocLogicalAddress() failed!!!\n");
-        if (!CECClose())
-            ALOGE("CECClose() failed!\n");
-        return false;
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("request to run CECThread");
-#endif
-
-    status_t ret = run("SecHdmi::CECThread", PRIORITY_DISPLAY);
-    if (ret != NO_ERROR) {
-        ALOGE("%s fail to run thread", __func__);
-        return false;
-    }
-    return true;
-}
-
-bool SecHdmi::CECThread::stop()
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s request Exit", __func__);
-#endif
-    Mutex::Autolock lock(mThreadControlLock);
-    if (requestExitAndWait() == WOULD_BLOCK) {
-        ALOGE("mCECThread.requestExitAndWait() == WOULD_BLOCK");
-        return false;
-    }
-
-    if (!CECClose())
-        ALOGE("CECClose() failed!\n");
-
-    mFlagRunning = false;
-    return true;
-}
-#endif
-
-SecHdmi::SecHdmi():
-#if defined(BOARD_USES_CEC)
-    mCECThread(NULL),
-#endif
-    mFlagCreate(false),
-    mFlagConnected(false),
-    mPreviousHdmiPresetId(V4L2_DV_1080P60),
-    mHdmiDstWidth(0),
-    mHdmiDstHeight(0),
-    mHdmiSrcYAddr(0),
-    mHdmiSrcCbCrAddr(0),
-    mFBaddr(0),
-    mFBsize(0),
-    mFBionfd(-1),
-    mFBoffset(0),
-    mHdmiOutputMode(DEFAULT_OUPUT_MODE),
-    mHdmiResolutionValue(DEFAULT_HDMI_RESOLUTION_VALUE), // V4L2_STD_480P_60_4_3
-    mHdmiStdId(DEFAULT_HDMI_STD_ID), // V4L2_STD_480P_60_4_3
-    mCompositeStd(DEFAULT_COMPOSITE_STD),
-    mHdcpMode(false),
-    mAudioMode(2),
-    mUIRotVal(0),
-    mG2DUIRotVal(0),
-    mCurrentHdmiOutputMode(-1),
-    mCurrentHdmiResolutionValue(0), // 1080960
-    mCurrentHdcpMode(false),
-    mCurrentAudioMode(-1),
-    mHdmiInfoChange(true),
-    mFlagGscalerStart(false),
-    mGscalerDstColorFormat(0),
-    mDefaultFBFd(-1),
-    mCurrentsrcW(0),
-    mCurrentsrcH(0),
-    mCurrentsrcColorFormat(0),
-    mCurrentsrcYAddr(0),
-    mCurrentsrcCbAddr(0),
-    mCurrentdstX(0),
-    mCurrentdstY(0),
-    mCurrenthdmiLayer(0),
-    mCurrentNumOfHWCLayer(0),
-    mDisplayWidth(DEFALULT_DISPLAY_WIDTH),
-    mDisplayHeight(DEFALULT_DISPLAY_HEIGHT)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    for (int i = 0; i < HDMI_LAYER_MAX; i++) {
-        mFlagLayerEnable[i] = false;
-        mFlagHdmiStart[i] = false;
-
-        mSrcWidth      [i] = 0;
-        mSrcHeight     [i] = 0;
-        mSrcColorFormat[i] = 0;
-        mHdmiResolutionWidth  [i] = 0;
-        mHdmiResolutionHeight [i] = 0;
-        mPreviousNumofHwLayer [i] = 0;
-        mSrcIndex[i] = 0;
-    }
-
-    //All layer is on
-    mFlagLayerEnable[HDMI_LAYER_VIDEO] = true;
-    mFlagLayerEnable[HDMI_LAYER_GRAPHIC_0] = true;
-    mFlagLayerEnable[HDMI_LAYER_GRAPHIC_1] = true;
-
-    mHdmiSizeOfResolutionValueList = 14;
-
-    mHdmiResolutionValueList[0]  = 1080960;
-    mHdmiResolutionValueList[1]  = 1080950;
-    mHdmiResolutionValueList[2]  = 1080930;
-    mHdmiResolutionValueList[3]  = 1080924;
-    mHdmiResolutionValueList[4]  = 1080160;
-    mHdmiResolutionValueList[5]  = 1080150;
-    mHdmiResolutionValueList[6]  = 720960;
-    mHdmiResolutionValueList[7]  = 7209601;
-    mHdmiResolutionValueList[8]  = 720950;
-    mHdmiResolutionValueList[9]  = 7209501;
-    mHdmiResolutionValueList[10] = 5769501;
-    mHdmiResolutionValueList[11] = 5769502;
-    mHdmiResolutionValueList[12] = 4809601;
-    mHdmiResolutionValueList[13] = 4809602;
-
-#if defined(BOARD_USES_CEC)
-    mCECThread = new CECThread(this);
-#endif
-
-    mGscalerForceUpdate = false;
-}
-
-SecHdmi::~SecHdmi()
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    if (mFlagCreate == true)
-        ALOGE("%s::this is not Destroyed fail", __func__);
-    else
-        disconnect();
-}
-
-bool SecHdmi::create(int width, int height)
-{
-    Mutex::Autolock lock(mLock);
-    unsigned int fimc_buf_size = 0;
-    int stride;
-    int vstride;
-
-    int ionfd_G2D = 0;
-    void * ion_base_addr = NULL;
-
-    struct s3c_fb_user_ion_client ion_handle;
-    unsigned int FB_size = ALIGN(width, 16) * ALIGN(height, 16) * HDMI_G2D_BUFFER_BPP_SIZE * 2;
-    int ionfd_FB = 0;
-
-/*
- * Video plaback (I420): output buffer size of FIMC3 is (1920 x 1088 x 1.5)
- * Video plaback (NV12): FIMC3 is not used.
- * Camera preview (YV12): output buffer size of FIMC3 is (640 x 480 x 1.5)
- * UI mode (ARGB8888) : output buffer size of FIMC3 is (480 x 800 x 1.5)
- */
-#ifndef SUPPORT_1080P_FIMC_OUT
-    setDisplaySize(width, height);
-#endif
-
-    stride  = ALIGN(HDMI_MAX_WIDTH, 16);
-    vstride = ALIGN(HDMI_MAX_HEIGHT, 16);
-
-    fimc_buf_size = stride * vstride * HDMI_FIMC_BUFFER_BPP_SIZE;
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-    g2d_reserved_memory_size = stride * vstride * HDMI_G2D_BUFFER_BPP_SIZE;
-#endif
-
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    if (mFlagCreate == true) {
-        ALOGE("%s::Already Created", __func__);
-        return true;
-    }
-
-    if (mDefaultFBFd <= 0) {
-        if ((mDefaultFBFd = fb_open(DEFAULT_FB)) < 0) {
-            ALOGE("%s:Failed to open default FB", __func__);
-            return false;
-        }
-    }
-
-    if (mSecGscaler.create(SecGscaler::DEV_3, MAX_BUFFERS_GSCALER) == false) {
-        ALOGE("%s::SecGscaler create() failed", __func__);
-        goto CREATE_FAIL;
-    }
-
-    mIonClient = ion_client_create();
-    if (mIonClient < 0) {
-        mIonClient = -1;
-        ALOGE("%s::ion_client_create() failed", __func__);
-        goto CREATE_FAIL;
-    }
-
-    // get framebuffer virtual address for LCD
-    if (ioctl(mDefaultFBFd, S3CFB_GET_ION_USER_HANDLE, &ion_handle) == -1) {
-        ALOGE("%s:ioctl(S3CFB_GET_ION_USER_HANDLE) failed", __func__);
-        return false;
-    }
-
-    mFBaddr  = (unsigned int)ion_map(ion_handle.fd, ALIGN(FB_size, PAGE_SIZE), 0);
-    mFBsize  = FB_size;
-    mFBionfd = ion_handle.fd;
-
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-    ionfd_G2D = ion_alloc(mIonClient, ALIGN(g2d_reserved_memory_size * 2, PAGE_SIZE), 0, ION_HEAP_EXYNOS_MASK);
-
-    if (ionfd_G2D < 0) {
-        ALOGE("%s::ION memory allocation failed", __func__);
-    } else {
-        ion_base_addr = ion_map(ionfd_G2D, ALIGN(g2d_reserved_memory_size * 2, PAGE_SIZE), 0);
-        if (ion_base_addr == MAP_FAILED)
-            ALOGE("%s::ION mmap failed", __func__);
-    }
-
-    g2d_reserved_memory0 = (unsigned int)ion_base_addr;
-    g2d_reserved_memory1 = g2d_reserved_memory0 + g2d_reserved_memory_size;
-#endif
-
-    v4l2_std_id std_id;
-    __u32 preset_id;
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::mHdmiOutputMode(%d) \n", __func__, mHdmiOutputMode);
-#endif
-    if (mHdmiOutputMode == COMPOSITE_OUTPUT_MODE) {
-        std_id = composite_std_2_v4l2_std_id(mCompositeStd);
-        if ((int)std_id < 0) {
-            ALOGE("%s::composite_std_2_v4l2_std_id(%d) fail\n", __func__, mCompositeStd);
-            goto CREATE_FAIL;
-        }
-        if (m_setCompositeResolution(mCompositeStd) == false) {
-            ALOGE("%s::m_setCompositeResolution(%d) fail\n", __func__, mCompositeStd);
-            goto CREATE_FAIL;
-        }
-    } else if (mHdmiOutputMode >= HDMI_OUTPUT_MODE_YCBCR &&
-            mHdmiOutputMode <= HDMI_OUTPUT_MODE_DVI) {
-        if (hdmi_resolution_2_std_id(mHdmiResolutionValue, &mHdmiDstWidth, &mHdmiDstHeight, &std_id, &preset_id) < 0) {
-            ALOGE("%s::hdmi_resolution_2_std_id(%d) fail\n", __func__, mHdmiResolutionValue);
-            goto CREATE_FAIL;
-        }
-    }
-
-    if (m_setupLink() == false) {
-        ALOGE("%s:Enable the link failed", __func__);
-        return false;
-    }
-
-    for (int layer = HDMI_LAYER_BASE + 1; layer < HDMI_LAYER_MAX; layer++) {
-        if (m_openLayer(layer) == false)
-            ALOGE("%s::hdmi_init_layer(%d) failed", __func__, layer);
-    }
-
-    for (int layer = HDMI_LAYER_BASE + 2; layer < HDMI_LAYER_MAX; layer++) {
-        if (tvout_std_v4l2_s_ctrl(mVideodevFd[layer], V4L2_CID_TV_LAYER_BLEND_ENABLE, 1) < 0) {
-            ALOGE("%s::tvout_std_v4l2_s_ctrl [layer=%d] (V4L2_CID_TV_LAYER_BLEND_ENABLE) failed", __func__, layer);
-            return false;
-        }
-
-        if (tvout_std_v4l2_s_ctrl(mVideodevFd[layer], V4L2_CID_TV_PIXEL_BLEND_ENABLE, 1) < 0) {
-            ALOGE("%s::tvout_std_v4l2_s_ctrl [layer=%d] (V4L2_CID_TV_LAYER_BLEND_ENABLE) failed", __func__, layer);
-            return false;
-        }
-
-        if (tvout_std_v4l2_s_ctrl(mVideodevFd[layer], V4L2_CID_TV_LAYER_BLEND_ALPHA, 255) < 0) {
-            ALOGE("%s::tvout_std_v4l2_s_ctrl [layer=%d] (V4L2_CID_TV_LAYER_BLEND_ALPHA) failed", __func__, layer);
-            return false;
-        }
-    }
-
-    mFlagCreate = true;
-
-    return true;
-
-CREATE_FAIL :
-
-    if (mSecGscaler.flagCreate() == true &&
-        mSecGscaler.destroy()    == false)
-        ALOGE("%s::Gscaler destory failed", __func__);
-
-    return false;
-}
-
-bool SecHdmi::destroy(void)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    char node[32];
-    Mutex::Autolock lock(mLock);
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Already Destroyed fail \n", __func__);
-        goto DESTROY_FAIL;
-    }
-
-    for (int layer = HDMI_LAYER_BASE + 1; layer < HDMI_LAYER_MAX; layer++) {
-        if (mFlagHdmiStart[layer] == true && m_stopHdmi(layer) == false) {
-            ALOGE("%s::m_stopHdmi: layer[%d] fail \n", __func__, layer);
-            goto DESTROY_FAIL;
-        }
-    }
-
-    for (int layer = HDMI_LAYER_BASE + 1; layer < HDMI_LAYER_MAX; layer++) {
-        if (m_closeLayer(layer) == false)
-            ALOGE("%s::hdmi_deinit_layer(%d) failed", __func__, layer);
-    }
-
-    if (mSecGscaler.flagCreate() == true && mSecGscaler.destroy() == false) {
-        ALOGE("%s::fimc destory fail \n", __func__);
-        goto DESTROY_FAIL;
-    }
-
-#ifdef USE_LCD_ADDR_IN_HERE
-    {
-        if (0 < mDefaultFBFd) {
-            close(mDefaultFBFd);
-            mDefaultFBFd = -1;
-        }
-    }
-#endif //USE_LCD_ADDR_IN_HERE
-
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-    ion_unmap((void *)g2d_reserved_memory0, ALIGN(g2d_reserved_memory_size * 2, PAGE_SIZE));
-#endif
-
-    if (0 < mFBaddr)
-        ion_unmap((void *)mFBaddr, ALIGN(mFBsize, PAGE_SIZE));
-
-    if (0 < mFBionfd)
-        ion_free(mFBionfd);
-
-    sprintf(node, "%s%d", PFX_NODE_MEDIADEV, 0);
-    mMediadevFd = open(node, O_RDONLY);
-
-    if (mMediadevFd < 0) {
-        ALOGE("%s::open(%s) failed", __func__, node);
-        goto DESTROY_FAIL;
-    }
-
-    mlink_desc.flags = 0;
-    if (ioctl(mMediadevFd, MEDIA_IOC_SETUP_LINK, &mlink_desc) < 0) {
-        ALOGE("%s::MEDIA_IOC_SETUP_UNLINK failed", __func__);
-        goto DESTROY_FAIL;
-    }
-
-    for (int layer = HDMI_LAYER_BASE + 1; layer < HDMI_LAYER_MAX; layer++) {
-        if (m_closeLayer(layer) == false)
-            ALOGE("%s::hdmi_deinit_layer(%d) failed", __func__, layer);
-    }
-
-    if (0 < mMediadevFd)
-        close(mMediadevFd);
-
-    if (0 < mSubdevMixerFd)
-        close(mSubdevMixerFd);
-
-    mMediadevFd = -1;
-    mSubdevMixerFd = -1;
-
-    mFlagCreate = false;
-
-    return true;
-
-DESTROY_FAIL :
-
-    return false;
-}
-
-bool SecHdmi::connect(void)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    {
-        Mutex::Autolock lock(mLock);
-
-        if (mFlagCreate == false) {
-            ALOGE("%s::Not Yet Created \n", __func__);
-            return false;
-        }
-
-        if (mFlagConnected == true) {
-            ALOGD("%s::Already Connected.. \n", __func__);
-            return true;
-        }
-
-        if (mHdmiOutputMode >= HDMI_OUTPUT_MODE_YCBCR &&
-                mHdmiOutputMode <= HDMI_OUTPUT_MODE_DVI) {
-            if (m_flagHWConnected() == false) {
-                ALOGD("%s::m_flagHWConnected() fail \n", __func__);
-                return false;
-            }
-
-#if defined(BOARD_USES_EDID)
-            if (!EDIDOpen())
-                ALOGE("EDIDInit() failed!\n");
-
-            if (!EDIDRead()) {
-                ALOGE("EDIDRead() failed!\n");
-                if (!EDIDClose())
-                    ALOGE("EDIDClose() failed!\n");
-            }
-#endif
-
-#if defined(BOARD_USES_CEC)
-            if (!(mCECThread->mFlagRunning))
-                mCECThread->start();
-#endif
-        }
-    }
-
-    if (this->setHdmiOutputMode(mHdmiOutputMode, true) == false)
-        ALOGE("%s::setHdmiOutputMode(%d) fail \n", __func__, mHdmiOutputMode);
-
-    if (mHdmiOutputMode >= HDMI_OUTPUT_MODE_YCBCR &&
-            mHdmiOutputMode <= HDMI_OUTPUT_MODE_DVI) {
-        if (this->setHdmiResolution(mHdmiResolutionValue, true) == false)
-            ALOGE("%s::setHdmiResolution(%d) fail \n", __func__, mHdmiResolutionValue);
-
-        if (this->setHdcpMode(mHdcpMode, false) == false)
-            ALOGE("%s::setHdcpMode(%d) fail \n", __func__, mHdcpMode);
-
-/*        if (this->m_setAudioMode(mAudioMode) == false)
-            ALOGE("%s::m_setAudioMode(%d) fail \n", __func__, mAudioMode);
-*/
-        mHdmiInfoChange = true;
-        mFlagConnected = true;
-
-#if defined(BOARD_USES_EDID)
-        display_menu();
-#endif
-    }
-
-    return true;
-}
-
-bool SecHdmi::disconnect(void)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    Mutex::Autolock lock(mLock);
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not Yet Created \n", __func__);
-        return false;
-    }
-
-    if (mFlagConnected == false) {
-        ALOGE("%s::Already Disconnected.. \n", __func__);
-        return true;
-    }
-
-    if (mHdmiOutputMode >= HDMI_OUTPUT_MODE_YCBCR &&
-        mHdmiOutputMode <= HDMI_OUTPUT_MODE_DVI) {
-#if defined(BOARD_USES_CEC)
-        if (mCECThread->mFlagRunning)
-            mCECThread->stop();
-#endif
-
-#if defined(BOARD_USES_EDID)
-        if (!EDIDClose()) {
-            ALOGE("EDIDClose() failed!\n");
-            return false;
-        }
-#endif
-    }
-
-    for (int layer = HDMI_LAYER_BASE + 1; layer < HDMI_LAYER_MAX; layer++) {
-        if (mFlagHdmiStart[layer] == true && m_stopHdmi(layer) == false) {
-            ALOGE("%s::hdmiLayer(%d) layer fail \n", __func__, layer);
-            return false;
-        }
-    }
-
-    mFlagConnected = false;
-    mPreviousHdmiPresetId = V4L2_DV_1080P60;
-
-    mHdmiOutputMode = DEFAULT_OUPUT_MODE;
-    mHdmiResolutionValue = DEFAULT_HDMI_RESOLUTION_VALUE;
-    mHdmiStdId = DEFAULT_HDMI_STD_ID;
-    mCompositeStd = DEFAULT_COMPOSITE_STD;
-    mAudioMode = 2;
-    mCurrentHdmiOutputMode = -1;
-    mCurrentHdmiResolutionValue = 0;
-    mCurrentAudioMode = -1;
-
-    return true;
-}
-
-bool SecHdmi::startHdmi(int hdmiLayer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    Mutex::Autolock lock(mLock);
-    if (mFlagHdmiStart[hdmiLayer] == false &&
-            m_startHdmi(hdmiLayer) == false) {
-        ALOGE("%s::hdmiLayer(%d) fail \n", __func__, hdmiLayer);
-        return false;
-    }
-    return true;
-}
-
-bool SecHdmi::stopHdmi(int hdmiLayer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    Mutex::Autolock lock(mLock);
-    if (mFlagHdmiStart[hdmiLayer] == true &&
-            m_stopHdmi(hdmiLayer) == false) {
-        ALOGE("%s::hdmiLayer(%d) layer fail \n", __func__, hdmiLayer);
-        return false;
-    }
-    tvout_deinit();
-    return true;
-}
-
-bool SecHdmi::flagConnected(void)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    Mutex::Autolock lock(mLock);
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not Yet Created \n", __func__);
-        return false;
-    }
-
-    return mFlagConnected;
-}
-
-bool SecHdmi::flush(int srcW, int srcH, int srcColorFormat,
-        unsigned int srcYAddr, unsigned int srcCbAddr, unsigned int srcCrAddr,
-        int dstX, int dstY,
-        int hdmiLayer,
-        int num_of_hwc_layer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::hdmiLayer=%d", __func__, hdmiLayer);
-#endif
-
-    Mutex::Autolock lock(mLock);
-
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s [srcW = %d, srcH = %d, srcColorFormat = 0x%x, srcYAddr= 0x%x, srcCbAddr = 0x%x, srcCrAddr = 0x%x, dstX = %d, dstY = %d, hdmiLayer = %d, num_of_hwc_layer=%d",
-         __func__, srcW, srcH, srcColorFormat,
-                   srcYAddr, srcCbAddr, srcCrAddr,
-                   dstX, dstY, hdmiLayer, num_of_hwc_layer);
-    ALOGD("saved param(%d, %d, %d)",
-            mSrcWidth[hdmiLayer], mSrcHeight[hdmiLayer], mSrcColorFormat[hdmiLayer]);
-#endif
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not Yet Created", __func__);
-        return false;
-    }
-
-    if (srcW != mSrcWidth[hdmiLayer] ||
-        srcH != mSrcHeight[hdmiLayer] ||
-        srcColorFormat != mSrcColorFormat[hdmiLayer] ||
-        mHdmiDstWidth != mHdmiResolutionWidth[hdmiLayer] ||
-        mHdmiDstHeight != mHdmiResolutionHeight[hdmiLayer] ||
-        num_of_hwc_layer != mPreviousNumofHwLayer[hdmiLayer] ||
-        mHdmiInfoChange == true) {
-#ifdef DEBUG_MSG_ENABLE
-        ALOGD("m_reset param(%d, %d, %d, %d, %d, %d, %d)",
-            srcW, mSrcWidth[hdmiLayer],
-            srcH, mSrcHeight[hdmiLayer],
-            srcColorFormat, mSrcColorFormat[hdmiLayer],
-            hdmiLayer);
-#endif
-        if (m_reset(srcW, srcH, dstX, dstY, srcColorFormat, hdmiLayer, num_of_hwc_layer) == false) {
-            ALOGE("%s::m_reset(%d, %d, %d, %d) failed", __func__, srcW, srcH, srcColorFormat, hdmiLayer);
-            return false;
-        }
-    }
-
-    if (srcYAddr == 0) {
-        unsigned int FB_size = ALIGN(srcW, 16) * ALIGN(srcH, 16) * HDMI_G2D_BUFFER_BPP_SIZE;
-
-        srcYAddr = (unsigned int)mFBaddr + mFBoffset;
-        srcCbAddr = srcYAddr;
-
-        mFBoffset += FB_size;
-        if (FB_size < mFBoffset)
-            mFBoffset = 0;
-
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::mFBaddr=0x%08x, srcYAddr=0x%08x, mFBoffset=0x%08x", __func__, mFBaddr, srcYAddr, mFBoffset);
-#endif
-    }
-
-    if (hdmiLayer == HDMI_LAYER_VIDEO) {
-        if (mSecGscaler.setSrcAddr(srcYAddr, srcCbAddr, srcCrAddr, srcColorFormat) == false) {
-            ALOGE("%s::setSrcAddr(0x%08x, 0x%08x, 0x%08x)", __func__, srcYAddr, srcCbAddr, srcCrAddr);
-            return false;
-        }
-    } else {
-#if CHECK_GRAPHIC_LAYER_TIME
-        nsecs_t start, end;
-        start = systemTime();
-#endif
-
-        if (num_of_hwc_layer == 0) { /* UI only mode */
-            struct v4l2_rect rect;
-
-            if (mG2DUIRotVal == 0 || mG2DUIRotVal == 180) {
-                hdmi_cal_rect(srcW, srcH, mHdmiDstWidth, mHdmiDstHeight, &rect);
-            } else {
-                hdmi_cal_rect(srcH, srcW, mHdmiDstWidth, mHdmiDstHeight, &rect);
-            }
-
-            rect.left = ALIGN(rect.left, 16);
-
-            if (hdmi_set_graphiclayer(mSubdevMixerFd, mVideodevFd[hdmiLayer], hdmiLayer,
-                            srcColorFormat,
-                            srcW, srcH,
-                            srcYAddr, &mSrcBuffer[hdmiLayer][mSrcIndex[hdmiLayer]],
-                            rect.left, rect.top,
-                            rect.width, rect.height,
-                            mG2DUIRotVal) < 0)
-            return false;
-
-        } else { // Video Playback + UI Mode
-            if (hdmi_set_graphiclayer(mSubdevMixerFd, mVideodevFd[hdmiLayer], hdmiLayer,
-                            srcColorFormat,
-                            srcW, srcH,
-                            srcYAddr, &mSrcBuffer[hdmiLayer][mSrcIndex[hdmiLayer]],
-                            dstX, dstY,
-                            mHdmiDstWidth, mHdmiDstHeight,
-                            mG2DUIRotVal) < 0)
-            return false;
-        }
-
-#if CHECK_GRAPHIC_LAYER_TIME
-        end = systemTime();
-        ALOGD("[UI] hdmi_gl_set_param[end-start] = %ld ms", long(ns2ms(end)) - long(ns2ms(start)));
-#endif
-    }
-
-    if (mFlagConnected) {
-        if (mFlagHdmiStart[hdmiLayer] == true) {
-            if (m_run(hdmiLayer) == false) {
-                ALOGE("%s::m_run(%d) failed", __func__, hdmiLayer);
-                return false;
-            }
-        }
-
-        if (mFlagHdmiStart[hdmiLayer] == false && m_startHdmi(hdmiLayer) == false) {
-            ALOGE("%s::start hdmiLayer(%d) failed", __func__, hdmiLayer);
-            return false;
-        }
-    }
-    return true;
-}
-
-bool SecHdmi::clear(int hdmiLayer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::hdmiLayer = %d", __func__, hdmiLayer);
-#endif
-
-    Mutex::Autolock lock(mLock);
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not Yet Created \n", __func__);
-        return false;
-    }
-    if (mFlagHdmiStart[hdmiLayer] == true && m_stopHdmi(hdmiLayer) == false) {
-        ALOGE("%s::m_stopHdmi: layer[%d] fail \n", __func__, hdmiLayer);
-        return false;
-    }
-    return true;
-}
-
-void SecHdmi::clearGraphicLayer(int hdmiLayer)
-{
-    mSrcWidth[hdmiLayer] = 0;
-    mSrcHeight[hdmiLayer] = 0;
-    mSrcColorFormat[hdmiLayer] = 0;
-}
-
-bool SecHdmi::enableGraphicLayer(int hdmiLayer)
-{
-    Mutex::Autolock lock(mLock);
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::hdmiLayer(%d)",__func__, hdmiLayer);
-#endif
-    switch (hdmiLayer) {
-    case HDMI_LAYER_VIDEO:
-    case HDMI_LAYER_GRAPHIC_0:
-    case HDMI_LAYER_GRAPHIC_1:
-        mFlagLayerEnable[hdmiLayer] = true;
-        if (mFlagConnected == true)
-            m_startHdmi(hdmiLayer);
-        break;
-    default:
-        return false;
-    }
-    return true;
-}
-
-bool SecHdmi::disableGraphicLayer(int hdmiLayer)
-{
-    Mutex::Autolock lock(mLock);
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::hdmiLayer(%d)",__func__, hdmiLayer);
-#endif
-    switch (hdmiLayer) {
-    case HDMI_LAYER_VIDEO:
-    case HDMI_LAYER_GRAPHIC_0:
-    case HDMI_LAYER_GRAPHIC_1:
-        if (mFlagConnected == true && mFlagLayerEnable[hdmiLayer])
-            if (m_stopHdmi(hdmiLayer) == false )
-                ALOGE("%s::m_stopHdmi: layer[%d] fail \n", __func__, hdmiLayer);
-
-        mFlagLayerEnable[hdmiLayer] = false;
-        break;
-    default:
-        return false;
-    }
-    return true;
-}
-
-bool SecHdmi::setHdmiOutputMode(int hdmiOutputMode, bool forceRun)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::hdmiOutputMode = %d, forceRun = %d", __func__, hdmiOutputMode, forceRun);
-#endif
-
-    Mutex::Autolock lock(mLock);
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not Yet Created \n", __func__);
-        return false;
-    }
-
-    if (forceRun == false && mHdmiOutputMode == hdmiOutputMode) {
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("%s::same hdmiOutputMode(%d) \n", __func__, hdmiOutputMode);
-#endif
-        return true;
-    }
-
-    int newHdmiOutputMode = hdmiOutputMode;
-
-    int v4l2OutputType = hdmi_outputmode_2_v4l2_output_type(hdmiOutputMode);
-    if (v4l2OutputType < 0) {
-        ALOGD("%s::hdmi_outputmode_2_v4l2_output_type(%d) fail\n", __func__, hdmiOutputMode);
-        return false;
-    }
-
-#if defined(BOARD_USES_EDID)
-    int newV4l2OutputType = hdmi_check_output_mode(v4l2OutputType);
-    if (newV4l2OutputType != v4l2OutputType) {
-        newHdmiOutputMode = hdmi_v4l2_output_type_2_outputmode(newV4l2OutputType);
-        if (newHdmiOutputMode < 0) {
-            ALOGD("%s::hdmi_v4l2_output_type_2_outputmode(%d) fail\n", __func__, newV4l2OutputType);
-            return false;
-        }
-
-        ALOGD("%s::calibration mode(%d -> %d)... \n", __func__, hdmiOutputMode, newHdmiOutputMode);
-        mHdmiInfoChange = true;
-    }
-#endif
-
-    if (mHdmiOutputMode != newHdmiOutputMode) {
-        mHdmiOutputMode = newHdmiOutputMode;
-        mHdmiInfoChange = true;
-    }
-
-    return true;
-}
-
-bool SecHdmi::setHdmiResolution(unsigned int hdmiResolutionValue, bool forceRun)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::hdmiResolutionValue = %d, forceRun = %d", __func__, hdmiResolutionValue, forceRun);
-#endif
-
-    Mutex::Autolock lock(mLock);
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not Yet Created \n", __func__);
-        return false;
-    }
-
-    if (forceRun == false && mHdmiResolutionValue == hdmiResolutionValue) {
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("%s::same hdmiResolutionValue(%d) \n", __func__, hdmiResolutionValue);
-#endif
-        return true;
-    }
-
-    unsigned int newHdmiResolutionValue = hdmiResolutionValue;
-    int w = 0;
-    int h = 0;
-    v4l2_std_id std_id;
-    __u32 preset_id;
-
-#if defined(BOARD_USES_EDID)
-    // find perfect resolutions..
-    if (hdmi_resolution_2_std_id(newHdmiResolutionValue, &w, &h, &std_id, &preset_id) < 0 ||
-        hdmi_check_resolution(std_id) < 0) {
-        bool flagFoundIndex = false;
-        int resolutionValueIndex = m_resolutionValueIndex(newHdmiResolutionValue);
-
-        for (int i = resolutionValueIndex + 1; i < mHdmiSizeOfResolutionValueList; i++) {
-            if (hdmi_resolution_2_std_id(mHdmiResolutionValueList[i], &w, &h, &std_id, &preset_id) == 0 &&
-                hdmi_check_resolution(std_id) == 0) {
-                newHdmiResolutionValue = mHdmiResolutionValueList[i];
-                flagFoundIndex = true;
-                break;
-            }
-        }
-
-        if (flagFoundIndex == false) {
-            ALOGE("%s::hdmi cannot control this resolution(%d) fail \n", __func__, hdmiResolutionValue);
-            // Set resolution to 480P
-            newHdmiResolutionValue = mHdmiResolutionValueList[mHdmiSizeOfResolutionValueList-2];
-        } else {
-            ALOGD("%s::HDMI resolutions size is calibrated(%d -> %d)..\n", __func__, hdmiResolutionValue, newHdmiResolutionValue);
-        }
-    } else {
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("%s::find resolutions(%d) at once\n", __func__, hdmiResolutionValue);
-#endif
-    }
-#endif
-
-    if (mHdmiResolutionValue != newHdmiResolutionValue) {
-        mHdmiResolutionValue = newHdmiResolutionValue;
-        mHdmiInfoChange = true;
-    }
-
-    return true;
-}
-
-bool SecHdmi::setHdcpMode(bool hdcpMode, bool forceRun)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    Mutex::Autolock lock(mLock);
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not Yet Created \n", __func__);
-        return false;
-    }
-
-    if (forceRun == false && mHdcpMode == hdcpMode) {
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("%s::same hdcpMode(%d) \n", __func__, hdcpMode);
-#endif
-        return true;
-    }
-
-    mHdcpMode = hdcpMode;
-    mHdmiInfoChange = true;
-
-    return true;
-}
-
-bool SecHdmi::setUIRotation(unsigned int rotVal, unsigned int hwcLayer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    Mutex::Autolock lock(mLock);
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not Yet Created \n", __func__);
-        return false;
-    }
-
-    if (rotVal % 90 != 0) {
-        ALOGE("%s::Invalid rotation value(%d)", __func__, rotVal);
-        return false;
-    }
-
-    /* G2D rotation */
-    if (rotVal != mG2DUIRotVal) {
-        mG2DUIRotVal = rotVal;
-        mHdmiInfoChange = true;
-    }
-
-    /* FIMC rotation */
-    if (hwcLayer == 0) { /* Rotate in UI only mode */
-        if (rotVal != mUIRotVal) {
-            mSecGscaler.setRotVal(rotVal);
-            mUIRotVal = rotVal;
-            mHdmiInfoChange = true;
-        }
-    } else { /* Don't rotate video layer when video is played. */
-        rotVal = 0;
-        if (rotVal != mUIRotVal) {
-            mSecGscaler.setRotVal(rotVal);
-            mUIRotVal = rotVal;
-            mHdmiInfoChange = true;
-        }
-    }
-
-    return true;
-}
-
-bool SecHdmi::setDisplaySize(int width, int height)
-{
-    mDisplayWidth = width;
-    mDisplayHeight = height;
-
-    return true;
-}
-
-void SecHdmi::setDisplayInfo(int srcW, int srcH, int srcColorFormat,
-        unsigned int srcYAddr, unsigned int srcCbAddr,
-        int dstX, int dstY,
-        int hdmiLayer,
-        int num_of_hwc_layer)
-{
-#ifdef DEBUG_MSG_ENABLE
-ALOGD("%s [srcW = %d, srcH = %d, srcColorFormat = 0x%x, srcYAddr= 0x%x, srcCbAddr = 0x%x, dstX = %d, dstY = %d, hdmiLayer = %d",
-            __func__, srcW, srcH, srcColorFormat, srcYAddr, srcCbAddr, dstX, dstY, hdmiLayer);
-#endif
-
-    mCurrentsrcW = srcW;
-    mCurrentsrcH = srcH;
-    mCurrentsrcColorFormat = srcColorFormat;
-    mCurrentsrcYAddr = srcYAddr;
-    mCurrentsrcCbAddr = srcCbAddr,
-    mCurrentdstX = dstX;
-    mCurrentdstY = dstY;
-    mCurrenthdmiLayer = hdmiLayer;
-    mCurrentNumOfHWCLayer = num_of_hwc_layer;
-
-    return;
-}
-
-bool SecHdmi::m_setupLink(void)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-    int  ret;
-    char node[32];
-    char subdevname[32];
-    char videodevname[32];
-
-    struct v4l2_capability   v4l2cap;
-    struct media_entity_desc entity_desc;
-
-    sprintf(node, "%s%d", PFX_NODE_MEDIADEV, 0);
-    mMediadevFd = open(node, O_RDWR);
-    if (mMediadevFd < 0) {
-        ALOGE("%s::open(%s) failed", __func__, node);
-        goto err;
-    }
-
-    /* open subdev fd */
-    sprintf(subdevname, PFX_ENTITY_SUBDEV_MIXER, 0);
-    for (__u32 id = 0; ; id = entity_desc.id) {
-        entity_desc.id = id | MEDIA_ENT_ID_FLAG_NEXT;
-
-        if (ioctl(mMediadevFd, MEDIA_IOC_ENUM_ENTITIES, &entity_desc) < 0) {
-            if (errno == EINVAL) {
-                ALOGD("%s::MEDIA_IOC_ENUM_ENTITIES ended", __func__);
-                break;
-            }
-            ALOGE("%s::MEDIA_IOC_ENUM_ENTITIES failed", __func__);
-            goto err;
-        }
-        ALOGD("%s::entity_desc.id=%d, .minor=%d .name=%s", __func__, entity_desc.id, entity_desc.v4l.minor, entity_desc.name);
-
-        if (strncmp(entity_desc.name, subdevname, strlen(subdevname)) == 0)
-            mMixerSubdevEntity = entity_desc.id;
-    }
-
-    mlink_desc.source.entity = mSecGscaler.getSubdevEntity();
-    mlink_desc.source.index  = GSCALER_SUBDEV_PAD_SOURCE;
-    mlink_desc.source.flags  = MEDIA_PAD_FL_SOURCE;
-
-    mlink_desc.sink.entity   = mMixerSubdevEntity;
-    mlink_desc.sink.index    = MIXER_V_SUBDEV_PAD_SINK;
-    mlink_desc.sink.flags    = MEDIA_PAD_FL_SINK;
-    mlink_desc.flags         = MEDIA_LNK_FL_ENABLED;
-
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::mlink_desc.source.entity=%02d, .pad=%d", __func__, mlink_desc.source.entity, mlink_desc.source.index);
-    ALOGD("%s::mlink_desc.sink.entity  =%02d, .pad=%d", __func__, mlink_desc.sink.entity, mlink_desc.sink.index);
-#endif
-
-    if (ioctl(mMediadevFd, MEDIA_IOC_SETUP_LINK, &mlink_desc) < 0) {
-        ALOGE("%s::MEDIA_IOC_SETUP_LINK [src.entity=%d->sink.entity=%d] failed", __func__, mlink_desc.source.entity, mlink_desc.sink.entity);
-        goto err;
-    }
-
-    sprintf(node, "%s%d", PFX_NODE_SUBDEV, 4); // Mixer0 minor=132 /dev/v4l-subdev4 // need to modify //carrotsm
-    mSubdevMixerFd = open(node, O_RDWR, 0);
-    if (mSubdevMixerFd < 0) {
-        ALOGE("%s::open(%s) failed", __func__, node);
-        goto err;
-    }
-
-    if (0 < mMediadevFd)
-        close(mMediadevFd);
-    mMediadevFd = -1;
-
-   return true;
-
-err :
-
-    if (0 < mMediadevFd)
-        close(mMediadevFd);
-
-    if (0 < mSubdevMixerFd)
-        close(mSubdevMixerFd);
-
-    mMediadevFd = -1;
-    mSubdevMixerFd = -1;
-
-    return false;
-}
-
-bool SecHdmi::m_openLayer(int layer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::layer=%d", __func__, layer);
-#endif
-    char node[32];
-
-    switch (layer) {
-    case HDMI_LAYER_VIDEO:
-        mVideodevFd[layer] = mSecGscaler.getVideodevFd();
-
-        if (0 < mVideodevFd[layer]) {
-            ALOGD("%s::Layer[%d] device already opened", __func__, layer);
-            return true;
-        }
-
-        if (mSecGscaler.openVideodevFd() == false)
-            ALOGE("%s::open(%s) failed", __func__, node);
-        else
-            mVideodevFd[layer] = mSecGscaler.getVideodevFd();
-
-        goto open_success;
-        break;
-    case HDMI_LAYER_GRAPHIC_0:
-        sprintf(node, "%s", TVOUT0_DEV_G0);
-        break;
-    case HDMI_LAYER_GRAPHIC_1:
-        sprintf(node, "%s", TVOUT0_DEV_G1);
-        break;
-    default:
-        ALOGE("%s::unmatched layer[%d]", __func__, layer);
-        return false;
-        break;
-    }
-
-    mVideodevFd[layer] = open(node, O_RDWR);
-    if (mVideodevFd[layer] < 0) {
-        ALOGE("%s::open(%s) failed", __func__, node);
-        goto err;
-    }
-
-open_success :
-
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("layer=%d, mVideodevFd=%d", layer, mVideodevFd[layer]);
-#endif
-
-    if (tvout_std_v4l2_querycap(mVideodevFd[layer], node) < 0 ) {
-        ALOGE("%s::tvout_std_v4l2_querycap failed", __func__);
-        goto err;
-    }
-
-    return true;
-
-err :
-
-    if (0 < mVideodevFd[layer])
-        close(mVideodevFd[layer]);
-
-    mVideodevFd[layer] = -1;
-
-    return false;
-
-}
-
-bool SecHdmi::m_closeLayer(int layer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::layer=%d", __func__, layer);
-#endif
-    switch (layer) {
-    case HDMI_LAYER_VIDEO:
-        mVideodevFd[layer] = mSecGscaler.getVideodevFd();
-
-        if (mVideodevFd[layer] < 0) {
-            ALOGD("%s::Layer[%d] device already closed", __func__, layer);
-            return true;
-        } else {
-            mSecGscaler.closeVideodevFd();
-            mVideodevFd[layer] = mSecGscaler.getVideodevFd();
-        }
-        goto close_success;
-        break;
-    case HDMI_LAYER_GRAPHIC_0:
-    case HDMI_LAYER_GRAPHIC_1:
-        /* clear buffer */
-        if (0 < mVideodevFd[layer]) {
-            if (tvout_std_v4l2_reqbuf(mVideodevFd[layer], V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_USERPTR, 0) < 0) {
-                ALOGE("%s::tvout_std_v4l2_reqbuf(buf_num=%d)[graphic layer] failed", __func__, 0);
-                return -1;
-            }
-        }
-        break;
-    default:
-        ALOGE("%s::unmatched layer[%d]", __func__, layer);
-        return false;
-        break;
-    }
-
-    if (0 < mVideodevFd[layer]) {
-        if (close(mVideodevFd[layer]) < 0) {
-            ALOGE("%s::close %d layer failed", __func__, layer);
-            return false;
-        }
-    }
-
-    mVideodevFd[layer] = -1;
-
-close_success :
-
-    return true;
-}
-
-bool SecHdmi::m_reset(int w, int h, int dstX, int dstY, int colorFormat, int hdmiLayer, int num_of_hwc_layer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::w=%d, h=%d, dstX=%d, dstY=%d, colorFormat=%d, hdmiLayer=%d, num_of_hwc_layer=%d",
-        __func__, w, h, dstX, dstY, colorFormat, hdmiLayer, num_of_hwc_layer);
-#endif
-
-    v4l2_std_id std_id = 0;
-
-    int srcW = w;
-    int srcH = h;
-    int dstW = 0;
-    int dstH = 0;
-
-    if (mFlagHdmiStart[hdmiLayer] == true && m_stopHdmi(hdmiLayer) == false) {
-        ALOGE("%s::m_stopHdmi: layer[%d] failed", __func__, hdmiLayer);
-        return false;
-    }
-
-    if (m_closeLayer(hdmiLayer) == false) {
-        ALOGE("%s::m_closeLayer: layer[%d] failed", __func__, hdmiLayer);
-        return false;
-    }
-
-    if (m_openLayer(hdmiLayer) == false) {
-        ALOGE("%s::m_closeLayer: layer[%d] failed", __func__, hdmiLayer);
-        return false;
-    }
-
-    if (w != mSrcWidth[hdmiLayer] ||
-        h != mSrcHeight[hdmiLayer] ||
-        mHdmiDstWidth != mHdmiResolutionWidth[hdmiLayer] ||
-        mHdmiDstHeight != mHdmiResolutionHeight[hdmiLayer] ||
-        num_of_hwc_layer != mPreviousNumofHwLayer[hdmiLayer] ||
-        colorFormat != mSrcColorFormat[hdmiLayer] ||
-        mHdmiInfoChange == true) {
-        int preVideoSrcColorFormat = mSrcColorFormat[hdmiLayer];
-        int videoSrcColorFormat = colorFormat;
-
-        if (preVideoSrcColorFormat != HAL_PIXEL_FORMAT_YCbCr_420_SP &&
-            preVideoSrcColorFormat != HAL_PIXEL_FORMAT_YCrCb_420_SP &&
-            preVideoSrcColorFormat != HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP &&
-            preVideoSrcColorFormat != HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP &&
-            preVideoSrcColorFormat != HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED) {
-                ALOGI("%s: Unsupported preVideoSrcColorFormat = 0x%x", __func__, preVideoSrcColorFormat);
-                preVideoSrcColorFormat = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED;
-        }
-
-        if (hdmiLayer == HDMI_LAYER_VIDEO) {
-            unsigned int full_wdith  = ALIGN(w, 16);
-            unsigned int full_height = ALIGN(h, 16);
-
-            if (mSecGscaler.setSrcParams(full_wdith, full_height, 0, 0,
-                        (unsigned int*)&w, (unsigned int*)&h, colorFormat, true) == false) {
-                ALOGE("%s::mSecGscaler.setSrcParams(w=%d, h=%d, color=%d) failed",
-                        __func__, w, h, colorFormat);
-                return false;
-            }
-            mGscalerDstColorFormat = V4L2_MBUS_FMT_YUV8_1X24;
-
-            /* calculate destination buffer width and height */
-            struct v4l2_rect rect;
-
-            if (mUIRotVal == 0 || mUIRotVal == 180) {
-                hdmi_cal_rect(srcW, srcH, mHdmiDstWidth, mHdmiDstHeight, &rect);
-            } else {
-                hdmi_cal_rect(srcH, srcW, mHdmiDstWidth, mHdmiDstHeight, &rect);
-            }
-
-            rect.width = ALIGN(rect.width, 16);
-
-            if (mSecGscaler.setDstParams((unsigned int)rect.width, (unsigned int)rect.height, 0, 0,
-                        (unsigned int*)&rect.width, (unsigned int*)&rect.height, mGscalerDstColorFormat, true) == false) {
-                ALOGE("%s::mSecGscaler.setDstParams(w=%d, h=%d, V4L2_MBUS_FMT_YUV8_1X24) failed",
-                        __func__, rect.width, rect.height);
-                return false;
-            }
-
-            hdmi_set_videolayer(mSubdevMixerFd, mHdmiDstWidth, mHdmiDstHeight, &rect);
-        } else {
-            if (tvout_std_v4l2_s_ctrl(mVideodevFd[hdmiLayer], V4L2_CID_TV_LAYER_BLEND_ENABLE, 1) < 0) {
-                ALOGE("%s::tvout_std_v4l2_s_ctrl [layer=%d] (V4L2_CID_TV_LAYER_BLEND_ENABLE) failed", __func__, hdmiLayer);
-                return false;
-            }
-
-            if (tvout_std_v4l2_s_ctrl(mVideodevFd[hdmiLayer], V4L2_CID_TV_PIXEL_BLEND_ENABLE, 1) < 0) {
-                ALOGE("%s::tvout_std_v4l2_s_ctrl [layer=%d] (V4L2_CID_TV_LAYER_BLEND_ENABLE) failed", __func__, hdmiLayer);
-                return false;
-            }
-
-            if (tvout_std_v4l2_s_ctrl(mVideodevFd[hdmiLayer], V4L2_CID_TV_LAYER_BLEND_ALPHA, 255) < 0) {
-                ALOGE("%s::tvout_std_v4l2_s_ctrl [layer=%d] (V4L2_CID_TV_LAYER_BLEND_ALPHA) failed", __func__, hdmiLayer);
-                return false;
-            }
-
-            struct v4l2_rect rect;
-            int tempSrcW, tempSrcH;
-            int gr_frame_size = 0;
-
-            if (mG2DUIRotVal == 0 || mG2DUIRotVal == 180) {
-                tempSrcW = srcW;
-                tempSrcH = srcH;
-            } else {
-                tempSrcW = srcH;
-                tempSrcH = srcW;
-            }
-
-            hdmi_cal_rect(tempSrcW, tempSrcH, mHdmiDstWidth, mHdmiDstHeight, &rect);
-            rect.left = ALIGN(rect.left, 16);
-
-            if (num_of_hwc_layer == 0) { /* UI only mode */
-                hdmi_set_g_Params(mSubdevMixerFd, mVideodevFd[hdmiLayer], hdmiLayer,
-                                  colorFormat, srcW, srcH,
-                                  rect.left, rect.top, rect.width, rect.height);
-                dstW = rect.width;
-                dstH = rect.height;
-            } else { /* Video Playback + UI Mode */
-                hdmi_set_g_Params(mSubdevMixerFd, mVideodevFd[hdmiLayer], hdmiLayer,
-                                  colorFormat, srcW, srcH,
-                                  dstX, dstY, mHdmiDstWidth, mHdmiDstHeight);
-                dstW = mHdmiDstWidth;
-                dstH = mHdmiDstHeight;
-            }
-
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-            gr_frame_size = dstW * dstH;
-#else
-            gr_frame_size = srcW * srcH;
-#endif
-            for (int buf_index = 0; buf_index < MAX_BUFFERS_MIXER; buf_index++) {
-                int v4l2ColorFormat = HAL_PIXEL_FORMAT_2_V4L2_PIX(colorFormat);
-                switch (v4l2ColorFormat) {
-                case V4L2_PIX_FMT_BGR32:
-                case V4L2_PIX_FMT_RGB32:
-                    mSrcBuffer[hdmiLayer][buf_index].size.s = gr_frame_size << 2;
-                    break;
-                case V4L2_PIX_FMT_RGB565X:
-                    mSrcBuffer[hdmiLayer][buf_index].size.s = gr_frame_size << 1;
-                    break;
-                default:
-                    ALOGE("%s::invalid color type", __func__);
-                    return false;
-                    break;
-                }
-            }
-
-        }
-
-        if (preVideoSrcColorFormat != videoSrcColorFormat)
-            mHdmiInfoChange = true;
-
-        mSrcWidth[hdmiLayer] = srcW;
-        mSrcHeight[hdmiLayer] = srcH;
-        mSrcColorFormat[hdmiLayer] = colorFormat;
-
-        mHdmiResolutionWidth[hdmiLayer] = mHdmiDstWidth;
-        mHdmiResolutionHeight[hdmiLayer] = mHdmiDstHeight;
-        mPreviousNumofHwLayer[hdmiLayer] = num_of_hwc_layer;
-
-#ifdef DEBUG_MSG_ENABLE
-        ALOGD("m_reset saved param(%d, %d, %d, %d, %d, %d, %d)",
-            srcW, mSrcWidth[hdmiLayer], \
-            srcH, mSrcHeight[hdmiLayer], \
-            colorFormat,mSrcColorFormat[hdmiLayer], \
-            hdmiLayer);
-#endif
-    }
-
-    if (mHdmiInfoChange == true) {
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("mHdmiInfoChange: %d", mHdmiInfoChange);
-#endif
-
-#if defined(BOARD_USES_CEC)
-        if (mHdmiOutputMode >= HDMI_OUTPUT_MODE_YCBCR &&
-            mHdmiOutputMode <= HDMI_OUTPUT_MODE_DVI) {
-            if (mCECThread->mFlagRunning)
-                mCECThread->stop();
-        }
-#endif
-
-        if (m_setHdmiOutputMode(mHdmiOutputMode) == false) {
-            ALOGE("%s::m_setHdmiOutputMode() failed", __func__);
-            return false;
-        }
-        if (mHdmiOutputMode == COMPOSITE_OUTPUT_MODE) {
-            std_id = composite_std_2_v4l2_std_id(mCompositeStd);
-            if ((int)std_id < 0) {
-                ALOGE("%s::composite_std_2_v4l2_std_id(%d) failed", __func__, mCompositeStd);
-                return false;
-            }
-            if (m_setCompositeResolution(mCompositeStd) == false) {
-                ALOGE("%s::m_setCompositeRsolution() failed", __func__);
-                return false;
-            }
-        } else if (mHdmiOutputMode >= HDMI_OUTPUT_MODE_YCBCR &&
-                   mHdmiOutputMode <= HDMI_OUTPUT_MODE_DVI) {
-            if (m_setHdmiResolution(mHdmiResolutionValue) == false) {
-                ALOGE("%s::m_setHdmiResolution() failed", __func__);
-                return false;
-            }
-
-            if (m_setHdcpMode(mHdcpMode) == false) {
-                ALOGE("%s::m_setHdcpMode() failed", __func__);
-                return false;
-            }
-            std_id = mHdmiStdId;
-        }
-
-        if (mPreviousHdmiPresetId != mHdmiPresetId) {
-            for (int layer = HDMI_LAYER_BASE + 1; layer < HDMI_LAYER_MAX; layer++) {
-                if (m_stopHdmi(layer) == false) {
-                    ALOGE("%s::m_stopHdmi(%d) failed", __func__, layer);
-                    return false;
-                }
-            }
-
-            if (tvout_init(mVideodevFd[HDMI_LAYER_GRAPHIC_0], mHdmiPresetId) < 0) {
-                ALOGE("%s::tvout_init(mHdmiPresetId=%d) failed", __func__, mHdmiPresetId);
-                return false;
-            }
-            mPreviousHdmiPresetId = mHdmiPresetId;
-        }
-
-        if (mHdmiOutputMode >= HDMI_OUTPUT_MODE_YCBCR &&
-            mHdmiOutputMode <= HDMI_OUTPUT_MODE_DVI) {
-#if defined(BOARD_USES_CEC)
-            if (!(mCECThread->mFlagRunning))
-                mCECThread->start();
-#endif
-
-/*            if (m_setAudioMode(mAudioMode) == false)
-                ALOGE("%s::m_setAudioMode() failed", __func__);
-*/
-        }
-
-        mHdmiInfoChange = false;
-
-    }
-
-    return true;
-}
-
-bool SecHdmi::m_streamOn(int hdmiLayer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::hdmiLayer = %d", __func__, hdmiLayer);
-#endif
-
-    if (mFlagCreate == false) {
-        ALOGE("%s::Not yet created", __func__);
-        return false;
-    }
-
-    if (mFlagHdmiStart[hdmiLayer] == true) {
-        ALOGE("%s::[layer=%d] already streamon", __func__, hdmiLayer);
-        return true;
-    }
-
-    switch(hdmiLayer) {
-    case HDMI_LAYER_GRAPHIC_0:
-        break;
-    case HDMI_LAYER_GRAPHIC_1:
-        break;
-    default :
-        ALOGE("%s::unmathced layer(%d) failed", __func__, hdmiLayer);
-        return false;
-        break;
-    }
-
-    if (tvout_std_v4l2_qbuf(mVideodevFd[hdmiLayer], V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_USERPTR,
-                            mSrcIndex[hdmiLayer], 1, &mSrcBuffer[hdmiLayer][0]) < 0) {
-        ALOGE("%s::gsc_v4l2_queue(index : %d) (mSrcBufNum : %d) failed", __func__, mSrcIndex[hdmiLayer], 1);
-        return false;
-    }
-
-    mSrcIndex[hdmiLayer]++;
-    if (mSrcIndex[hdmiLayer] == MAX_BUFFERS_MIXER) {
-        if (tvout_std_v4l2_streamon(mVideodevFd[hdmiLayer], V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) < 0) {
-            ALOGE("%s::gsc_v4l2_stream_on() failed", __func__);
-            return false;
-        }
-        mFlagHdmiStart[hdmiLayer] = true;
-    }
-
-    if (mSrcIndex[hdmiLayer] >= MAX_BUFFERS_MIXER) {
-        mSrcIndex[hdmiLayer] = 0;
-    }
-
-    return true;
-}
-
-bool SecHdmi::m_run(int hdmiLayer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::hdmiLayer = %d", __func__, hdmiLayer);
-#endif
-
-    int buf_index = 0;
-
-    if (mFlagHdmiStart[hdmiLayer] == false || mFlagLayerEnable[hdmiLayer] == false) {
-        ALOGD("%s::HDMI(%d layer) started not yet", __func__, hdmiLayer);
-        return true;
-    }
-
-    switch (hdmiLayer) {
-    case HDMI_LAYER_VIDEO:
-        if (mSecGscaler.run() == false) {
-            ALOGE("%s::mSecGscaler.draw() failed", __func__);
-            return false;
-        }
-        break;
-    case HDMI_LAYER_GRAPHIC_0 :
-    case HDMI_LAYER_GRAPHIC_1 :
-        if (tvout_std_v4l2_dqbuf(mVideodevFd[hdmiLayer], V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_USERPTR, &buf_index, 1) < 0) {
-            ALOGE("%s::tvout_std_v4l2_dqbuf(mNumOfBuf : %d, dqIndex=%d) failed", __func__, 1, buf_index);
-            return false;
-        }
-
-        if (tvout_std_v4l2_qbuf(mVideodevFd[hdmiLayer], V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_USERPTR,
-                                mSrcIndex[hdmiLayer], 1, &mSrcBuffer[hdmiLayer][mSrcIndex[hdmiLayer]]) < 0) {
-            ALOGE("%s::tvout_std_v4l2_qbuf(mNumOfBuf : %d,mSrcIndex=%d) failed", __func__, 1, mSrcIndex[hdmiLayer]);
-            return false;
-        }
-
-        mSrcIndex[hdmiLayer]++;
-        if (mSrcIndex[hdmiLayer] >= MAX_BUFFERS_MIXER) {
-            mSrcIndex[hdmiLayer] = 0;
-        }
-
-        break;
-    default :
-        ALOGE("%s::unmathced layer(%d) failed", __func__, hdmiLayer);
-        return false;
-        break;
-    }
-
-    return true;
-}
-
-bool SecHdmi::m_startHdmi(int hdmiLayer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::hdmiLayer = %d", __func__, hdmiLayer);
-#endif
-
-    int buf_index = 0;
-
-    if (mFlagHdmiStart[hdmiLayer] == true) {
-        ALOGD("%s::already HDMI(%d layer) started..", __func__, hdmiLayer);
-        return true;
-    }
-
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("### %s: hdmiLayer(%d) called", __func__, hdmiLayer);
-#endif
-    switch (hdmiLayer) {
-    case HDMI_LAYER_VIDEO:
-        if (mSecGscaler.streamOn() == false) {
-            ALOGE("%s::mSecGscaler.streamOn() failed", __func__);
-            return false;
-        }
-        if (mSecGscaler.getFlagSteamOn() == true)
-            mFlagHdmiStart[hdmiLayer] = true;
-        break;
-    case HDMI_LAYER_GRAPHIC_0 :
-    case HDMI_LAYER_GRAPHIC_1 :
-        if (m_streamOn(hdmiLayer) == false) {
-            ALOGE("%s::m_streamOn layer(%d) failed", __func__, hdmiLayer);
-            return false;
-        }
-        break;
-    default :
-        ALOGE("%s::unmathced layer(%d) failed", __func__, hdmiLayer);
-        return false;
-        break;
-    }
-    return true;
-}
-
-bool SecHdmi::m_stopHdmi(int hdmiLayer)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s::hdmiLayer = %d", __func__, hdmiLayer);
-#endif
-
-    if (mFlagHdmiStart[hdmiLayer] == false) {
-        ALOGD("%s::already HDMI(%d layer) stopped..", __func__, hdmiLayer);
-        return true;
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("### %s : layer[%d] called", __func__, hdmiLayer);
-#endif
-
-    switch (hdmiLayer) {
-     case HDMI_LAYER_VIDEO:
-        if (mSecGscaler.streamOff() == false) {
-            ALOGE("%s::mSecGscaler.streamOff() failed", __func__);
-            return false;
-        }
-        mFlagHdmiStart[hdmiLayer] = false;
-        break;
-    case HDMI_LAYER_GRAPHIC_1 :
-    case HDMI_LAYER_GRAPHIC_0 :
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-        cur_g2d_address = 0;
-#endif
-        if (tvout_std_v4l2_streamoff(mVideodevFd[hdmiLayer], V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) < 0) {
-            ALOGE("%s::tvout_std_v4l2_streamon layer(%d) failed", __func__, hdmiLayer);
-            return false;
-        }
-
-        mSrcIndex[hdmiLayer] = 0;
-        mFlagHdmiStart[hdmiLayer] = false;
-        break;
-    default :
-        ALOGE("%s::unmathced layer(%d) failed", __func__, hdmiLayer);
-        return false;
-        break;
-    }
-
-    return true;
-}
-
-bool SecHdmi::m_setHdmiOutputMode(int hdmiOutputMode)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    if (hdmiOutputMode == mCurrentHdmiOutputMode) {
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("%s::same hdmiOutputMode(%d) \n", __func__, hdmiOutputMode);
-#endif
-        return true;
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("### %s called\n", __func__);
-#endif
-
-    int v4l2OutputType = hdmi_outputmode_2_v4l2_output_type(hdmiOutputMode);
-    if (v4l2OutputType < 0) {
-        ALOGE("%s::hdmi_outputmode_2_v4l2_output_type(%d) fail\n", __func__, hdmiOutputMode);
-        return false;
-    }
-
-    output_type = v4l2OutputType;
-
-    mCurrentHdmiOutputMode = hdmiOutputMode;
-
-    return true;
-}
-
-bool SecHdmi::m_setCompositeResolution(unsigned int compositeStdId)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("### %s called\n", __func__);
-#endif
-
-    int w = 0;
-    int h = 0;
-
-    if (mHdmiOutputMode != COMPOSITE_OUTPUT_MODE) {
-        ALOGE("%s::not supported output type \n", __func__);
-        return false;
-    }
-
-    switch (compositeStdId) {
-    case COMPOSITE_STD_NTSC_M:
-    case COMPOSITE_STD_NTSC_443:
-        w = 704;
-        h = 480;
-        break;
-    case COMPOSITE_STD_PAL_BDGHI:
-    case COMPOSITE_STD_PAL_M:
-    case COMPOSITE_STD_PAL_N:
-    case COMPOSITE_STD_PAL_Nc:
-    case COMPOSITE_STD_PAL_60:
-        w = 704;
-        h = 576;
-        break;
-    default:
-        ALOGE("%s::unmathced composite_std(%d)", __func__, compositeStdId);
-        return false;
-    }
-
-    t_std_id      = composite_std_2_v4l2_std_id(mCompositeStd);
-
-    mHdmiDstWidth  = w;
-    mHdmiDstHeight = h;
-
-    mCurrentHdmiResolutionValue = -1;
-    return true;
-}
-
-bool SecHdmi::m_setHdmiResolution(unsigned int hdmiResolutionValue)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    if (hdmiResolutionValue == mCurrentHdmiResolutionValue) {
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("%s::same hdmiResolutionValue(%d) \n", __func__, hdmiResolutionValue);
-#endif
-        return true;
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("### %s called\n", __func__);
-#endif
-
-    int w = 0;
-    int h = 0;
-
-    v4l2_std_id std_id;
-    if (mHdmiOutputMode >= HDMI_OUTPUT_MODE_YCBCR &&
-        mHdmiOutputMode <= HDMI_OUTPUT_MODE_DVI) {
-        if (hdmi_resolution_2_std_id(hdmiResolutionValue, &w, &h, &std_id, &mHdmiPresetId) < 0) {
-            ALOGE("%s::hdmi_resolution_2_std_id(%d) fail\n", __func__, hdmiResolutionValue);
-            return false;
-        }
-        mHdmiStdId    = std_id;
-    } else {
-        ALOGE("%s::not supported output type \n", __func__);
-        return false;
-    }
-
-    t_std_id      = std_id;
-
-    mHdmiDstWidth  = w;
-    mHdmiDstHeight = h;
-
-    mCurrentHdmiResolutionValue = hdmiResolutionValue;
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("%s::mHdmiDstWidth = %d, mHdmiDstHeight = %d, mHdmiStdId = 0x%x, hdmiResolutionValue = 0x%x\n",
-                __func__,
-                mHdmiDstWidth,
-                mHdmiDstHeight,
-                mHdmiStdId,
-                hdmiResolutionValue);
-#endif
-
-    return true;
-}
-
-bool SecHdmi::m_setHdcpMode(bool hdcpMode)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    if (hdcpMode == mCurrentHdcpMode) {
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("%s::same hdcpMode(%d) \n", __func__, hdcpMode);
-#endif
-
-        return true;
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("### %s called\n", __func__);
-#endif
-
-    if (hdcpMode == true)
-        g_hdcp_en = 1;
-    else
-        g_hdcp_en = 0;
-
-    mCurrentHdcpMode = hdcpMode;
-
-    return true;
-}
-
-bool SecHdmi::m_setAudioMode(int audioMode)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    if (audioMode == mCurrentAudioMode) {
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("%s::same audioMode(%d) \n", __func__, audioMode);
-#endif
-        return true;
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("### %s called\n", __func__);
-#endif
-
-    if (hdmi_check_audio(mVideodevFd[HDMI_LAYER_GRAPHIC_0]) < 0) {
-        ALOGE("%s::hdmi_check_audio() fail \n", __func__);
-        return false;
-    }
-
-    mCurrentAudioMode = audioMode;
-
-    return true;
-}
-
-int SecHdmi::m_resolutionValueIndex(unsigned int ResolutionValue)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-    int index = -1;
-
-    for (int i = 0; i < mHdmiSizeOfResolutionValueList; i++) {
-        if (mHdmiResolutionValueList[i] == ResolutionValue) {
-            index = i;
-            break;
-        }
-    }
-    return index;
-}
-
-bool SecHdmi::m_flagHWConnected(void)
-{
-#ifdef DEBUG_MSG_ENABLE
-    ALOGD("%s", __func__);
-#endif
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("### %s called\n", __func__);
-#endif
-
-    bool ret = true;
-    int hdmiStatus = hdmi_cable_status();
-
-    if (hdmiStatus <= 0) {
-#ifdef DEBUG_HDMI_HW_LEVEL
-            ALOGD("%s::hdmi_cable_status() fail \n", __func__);
-#endif
-        ret = false;
-    } else {
-        ret = true;
-    }
-
-    return ret;
-}
-
-}; // namespace android
diff --git a/exynos5/hal/libhdmi/SecHdmi/SecHdmiCommon.h b/exynos5/hal/libhdmi/SecHdmi/SecHdmiCommon.h
deleted file mode 100644
index 5ca9e4e..0000000
--- a/exynos5/hal/libhdmi/SecHdmi/SecHdmiCommon.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-**
-** @author Sangwoo, Park(sw5771.park@samsung.com)
-** @date   2010-09-10
-**
-*/
-
-//#define LOG_NDEBUG 0
-//#define LOG_TAG "libhdmi"
-#include <cutils/log.h>
-
-#include "../libhdmi/SecHdmi/fimd_api.h"
-
-//#define DEBUG_MSG_ENABLE
-//#define DEBUG_HDMI_HW_LEVEL
-//#define BOARD_USES_EDID
-//#define BOARD_USES_CEC
-//#define SUPPORT_G2D_UI_MODE
-
-#define DEFAULT_FB      (0)
-#define MAX_MIXER_NUM               (1)
-#define MAX_BUFFERS_MIXER           (2)
-#define MAX_PLANES_MIXER            (3)
-
-#define HDMI_GSCALER_BUF_NUM        (3)
-#define HDMI_FIMC_BUFFER_BPP_SIZE   (1.5)   //NV12 Tiled is 1.5 bytes, RGB565 is 2, RGB888 is 4, Default is NV12 Tiled
-#define HDMI_G2D_BUFFER_BPP_SIZE    (4)     //NV12 Tiled is 1.5 bytes, RGB565 is 2, RGB888 is 4
-#define SUPPORT_1080P_FIMC_OUT
-#define HDMI_MAX_WIDTH              (1920)
-#define HDMI_MAX_HEIGHT             (1080)
-
-#define ALIGN(x, a)    (((x) + (a) - 1) & ~((a) - 1))
-
-#if defined(STD_NTSC_M)
-    #define DEFAULT_OUPUT_MODE            (COMPOSITE_OUTPUT_MODE)
-    #define DEFAULT_HDMI_RESOLUTION_VALUE (1080960) // 1080P_60
-    #define DEFAULT_HDMI_STD_ID           (V4L2_STD_1080P_60)
-    #define DEFALULT_DISPLAY_WIDTH            (720)
-    #define DEFALULT_DISPLAY_HEIGHT            (480)
-    #define DEFAULT_COMPOSITE_STD         (COMPOSITE_STD_NTSC_M)
-#elif (STD_1080P)
-    #define DEFAULT_OUPUT_MODE            (HDMI_OUTPUT_MODE_RGB)
-    #define DEFAULT_HDMI_RESOLUTION_VALUE (1080960) // 1080P_60
-    #define DEFAULT_HDMI_STD_ID           (V4L2_STD_1080P_60)
-    #define DEFALULT_DISPLAY_WIDTH            (1920)
-    #define DEFALULT_DISPLAY_HEIGHT            (1080)
-    #define DEFAULT_COMPOSITE_STD      (COMPOSITE_STD_NTSC_M)
-#elif defined(STD_720P)
-    #define DEFAULT_OUPUT_MODE            (HDMI_OUTPUT_MODE_YCBCR)
-    #define DEFAULT_HDMI_RESOLUTION_VALUE (720960) // 720P_60
-    #define DEFAULT_HDMI_STD_ID           (V4L2_STD_720P_60)
-    #define DEFALULT_DISPLAY_WIDTH            (1280)
-    #define DEFALULT_DISPLAY_HEIGHT            (720)
-    #define DEFAULT_COMPOSITE_STD      (COMPOSITE_STD_NTSC_M)
-#elif defined(STD_480P)
-    #define DEFAULT_OUPUT_MODE            (HDMI_OUTPUT_MODE_YCBCR)
-    #define DEFAULT_HDMI_RESOLUTION_VALUE (4809601) // 480P_60_4_3
-    #define DEFAULT_HDMI_STD_ID           (V4L2_STD_480P_60_16_9)
-    #define DEFALULT_DISPLAY_WIDTH            (720)
-    #define DEFALULT_DISPLAY_HEIGHT            (480)
-    #define DEFAULT_COMPOSITE_STD      (COMPOSITE_STD_NTSC_M)
-#else
-    #define DEFAULT_OUPUT_MODE            (HDMI_OUTPUT_MODE_YCBCR)
-    #define DEFAULT_HDMI_RESOLUTION_VALUE (4809602) // 480P_60_4_3
-    #define DEFAULT_HDMI_STD_ID           (V4L2_STD_480P_60_4_3)
-    #define DEFALULT_DISPLAY_WIDTH            (720)
-    #define DEFALULT_DISPLAY_HEIGHT            (480)
-    #define DEFAULT_COMPOSITE_STD      (COMPOSITE_STD_NTSC_M)
-#endif
-
-enum hdp_cable_status {
-    HPD_CABLE_OUT = 0, // HPD_CABLE_OUT indicates HDMI cable out.
-    HPD_CABLE_IN       // HPD_CABLE_IN indicates HDMI cable in.
-};
-
-enum state {
-    OFF = 0,
-    ON = 1,
-    NOT_SUPPORT = 2,
-};
-
-enum tv_mode {
-    HDMI_OUTPUT_MODE_YCBCR = 0,
-    HDMI_OUTPUT_MODE_RGB = 1,
-    HDMI_OUTPUT_MODE_DVI = 2,
-    COMPOSITE_OUTPUT_MODE = 3
-};
-
-enum composite_std {
-    COMPOSITE_STD_NTSC_M = 0,
-    COMPOSITE_STD_PAL_BDGHI = 1,
-    COMPOSITE_STD_PAL_M = 2,
-    COMPOSITE_STD_PAL_N = 3,
-    COMPOSITE_STD_PAL_Nc = 4,
-    COMPOSITE_STD_PAL_60 = 5,
-    COMPOSITE_STD_NTSC_443 = 6
-};
-
-enum hdmi_layer {
-    HDMI_LAYER_BASE   = 0,
-    HDMI_LAYER_VIDEO,
-    HDMI_LAYER_GRAPHIC_0,
-    HDMI_LAYER_GRAPHIC_1,
-    HDMI_LAYER_MAX,
-};
diff --git a/exynos5/hal/libhdmi/SecHdmi/SecHdmiV4L2Utils.cpp b/exynos5/hal/libhdmi/SecHdmi/SecHdmiV4L2Utils.cpp
deleted file mode 100644
index 9a66d6d..0000000
--- a/exynos5/hal/libhdmi/SecHdmi/SecHdmiV4L2Utils.cpp
+++ /dev/null
@@ -1,1350 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define LOG_NDEBUG 0
-//#define LOG_TAG "libhdmi"
-//#define DEBUG_HDMI_HW_LEVEL
-#include <cutils/log.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <signal.h>
-
-#include "sec_utils_v4l2.h"
-#include "s5p_tvout_v4l2.h"
-
-#include "videodev2.h"
-
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-#include "sec_g2d_4x.h"
-#include "FimgApi.h"
-#endif
-
-#include "audio.h"
-#include "video.h"
-#include "../libhdmi/libsForhdmi/libedid/libedid.h"
-#include "../libhdmi/libsForhdmi/libcec/libcec.h"
-
-#include "SecGscaler.h"
-#include "SecHdmiCommon.h"
-#include "SecHdmiV4L2Utils.h"
-
-namespace android {
-
-unsigned int output_type  = V4L2_OUTPUT_TYPE_DIGITAL;
-v4l2_std_id  t_std_id     = V4L2_STD_1080P_30;
-int          g_hpd_state  = HPD_CABLE_OUT;
-unsigned int g_hdcp_en    = 0;
-
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-unsigned int g2d_reserved_memory0     = 0;
-unsigned int g2d_reserved_memory1     = 0;
-unsigned int g2d_reserved_memory_size = 0;
-unsigned int cur_g2d_address          = 0;
-#endif
-
-void display_menu(void)
-{
-    struct HDMIVideoParameter video;
-    struct HDMIAudioParameter audio;
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-
-    audio.formatCode = LPCM_FORMAT;
-    audio.outPacket  = HDMI_ASP;
-    audio.channelNum = CH_2;
-    audio.sampleFreq = SF_44KHZ;
-
-    ALOGI("=============== HDMI Audio  =============\n");
-
-    if (EDIDAudioModeSupport(&audio))
-        ALOGI("=  2CH_PCM 44100Hz audio supported      =\n");
-
-    ALOGI("========= HDMI Mode & Color Space =======\n");
-
-    video.mode = HDMI;
-    if (EDIDHDMIModeSupport(&video)) {
-        video.colorSpace = HDMI_CS_YCBCR444;
-        if (EDIDColorSpaceSupport(&video))
-            ALOGI("=  1. HDMI(YCbCr)                       =\n");
-
-        video.colorSpace = HDMI_CS_RGB;
-        if (EDIDColorSpaceSupport(&video))
-            ALOGI("=  2. HDMI(RGB)                         =\n");
-    } else {
-        video.mode = DVI;
-        if (EDIDHDMIModeSupport(&video))
-            ALOGI("=  3. DVI                               =\n");
-    }
-
-    ALOGI("===========    HDMI Rseolution   ========\n");
-
-    /* 480P */
-    video.resolution = v720x480p_60Hz;
-    video.pixelAspectRatio = HDMI_PIXEL_RATIO_16_9;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  4. 480P_60_16_9    (0x04000000)    =\n");
-
-    video.resolution = v640x480p_60Hz;
-    video.pixelAspectRatio = HDMI_PIXEL_RATIO_4_3;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  5. 480P_60_4_3 (0x05000000)    =\n");
-
-    /* 576P */
-    video.resolution = v720x576p_50Hz;
-    video.pixelAspectRatio = HDMI_PIXEL_RATIO_16_9;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  6. 576P_50_16_9    (0x06000000)    =\n");
-
-    video.pixelAspectRatio = HDMI_PIXEL_RATIO_4_3;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  7. 576P_50_4_3 (0x07000000)    =\n");
-
-    /* 720P 60 */
-    video.resolution = v1280x720p_60Hz;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  8. 720P_60         (0x08000000)    =\n");
-
-    /* 720P_50 */
-    video.resolution = v1280x720p_50Hz;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  9. 720P_50         (0x09000000)    =\n");
-
-    /* 1080P_60 */
-    video.resolution = v1920x1080p_60Hz;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  a. 1080P_60        (0x0a000000)    =\n");
-
-    /* 1080P_50 */
-    video.resolution = v1920x1080p_50Hz;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  b. 1080P_50        (0x0b000000)    =\n");
-
-    /* 1080I_60 */
-    video.resolution = v1920x1080i_60Hz;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  c. 1080I_60        (0x0c000000)    =\n");
-
-    /* 1080I_50 */
-    video.resolution = v1920x1080i_50Hz;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  d. 1080I_50        (0x0d000000)    =\n");
-
-    /* 1080P_30 */
-    video.resolution = v1920x1080p_30Hz;
-    video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  e. 1080P_30        (0x12000000)    =\n");
-
-    ALOGI("===========    HDMI 3D Format   ========\n");
-
-    /* 720P_60_SBS_HALF */
-    video.resolution = v1280x720p_60Hz;
-    video.hdmi_3d_format = HDMI_3D_SSH_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  f. 720P_60_SBS_HALF    (0x13000000)    =\n");
-
-    /* 720P_59_SBS_HALF */
-    video.resolution = v1280x720p_60Hz;
-    video.hdmi_3d_format = HDMI_3D_SSH_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  10. 720P_59_SBS_HALF    (0x14000000)    =\n");
-
-    /* 720P_50_TB */
-    video.resolution = v1280x720p_50Hz;
-    video.hdmi_3d_format = HDMI_3D_TB_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  11. 720P_50_TB          (0x15000000)    =\n");
-
-    /* 1080P_24_TB */
-    video.resolution = v1920x1080p_24Hz;
-    video.hdmi_3d_format = HDMI_3D_TB_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  12. 1080P_24_TB          (0x16000000)    =\n");
-
-    /* 1080P_23_TB */
-    video.resolution = v1920x1080p_24Hz;
-    video.hdmi_3d_format = HDMI_3D_TB_FORMAT;
-    if (EDIDVideoResolutionSupport(&video))
-        ALOGI("=  13. 1080P_24_TB          (0x17000000)    =\n");
-    ALOGI("=========================================\n");
-}
-
-int tvout_init(int fd_tvout, __u32 preset_id)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::preset_id = 0x%x", __func__, preset_id);
-#endif
-
-    int ret;
-    struct v4l2_output output;
-    struct v4l2_dv_preset preset;
-
-    unsigned int matched = 0, i = 0;
-    int output_index;
-
-    if (fd_tvout <= 0) {
-        fd_tvout = open(TVOUT0_DEV_G0, O_RDWR);
-        if (fd_tvout < 0) {
-            ALOGE("%s::fd_tvout open failed", __func__);
-            return -1;
-        }
-    }
-/*
-    if (output_type >= V4L2_OUTPUT_TYPE_DIGITAL &&
-        output_type <= V4L2_OUTPUT_TYPE_DVI)
-        if (ioctl(fd_tvout, VIDIOC_HDCP_ENABLE, g_hdcp_en) < 0)
-            ALOGE("%s::VIDIOC_HDCP_ENABLE failed %d", __func__, errno);
-*/
-    i = 0;
-
-    do {
-        output.index = i;
-        ret = tvout_v4l2_enum_output(fd_tvout, &output);
-        ALOGV("%s::output_type=%d output.index=%d .name=%s", __func__, output_type, output.index, output.name);
-        if (output.type == output_type) {
-            matched = 1;
-            break;
-        }
-        i++;
-    } while (ret >=0);
-/*
-    if (!matched) {
-        ALOGE("%s::no matched output type [type=0x%08x]", __func__, output_type);
-        return -1;
-    }
-
-    tvout_v4l2_s_output(fd_tvout, output.index);
-    output_index = 0;
-    tvout_v4l2_g_output(fd_tvout, &output_index);
-*/
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::input preset_id=0x%08x", __func__, preset_id);
-#endif
-
-    if (output.capabilities & V4L2_OUT_CAP_PRESETS) {
-        tvout_std_v4l2_enum_dv_presets(fd_tvout);
-        preset.preset = preset_id;
-        if (tvout_std_v4l2_s_dv_preset(fd_tvout, &preset) < 0 ) {
-            ALOGE("%s::tvout_std_v4l2_s_dv_preset failed", __func__);
-            return -1;
-        }
-    }
-
-    return fd_tvout;
-}
-
-int tvout_deinit()
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-
-    return 0;
-}
-
-int tvout_std_v4l2_querycap(int fd, char *node)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_capability v4l2cap;
-
-    if (ioctl(fd, VIDIOC_QUERYCAP, &v4l2cap) < 0) {
-        ALOGE("%s::VIDIOC_QUERYCAP failed", __func__);
-        return -1;
-    }
-
-    if (!(v4l2cap.capabilities & V4L2_CAP_STREAMING)) {
-        ALOGE("%s::%s is not support streaming", __func__, node);
-        return -1;
-    }
-
-    if (!(v4l2cap.capabilities & V4L2_CAP_VIDEO_OUTPUT_MPLANE)) {
-        ALOGE("%s::%s is not support video output mplane", __func__, node);
-        return -1;
-    }
-
-    return 0;
-}
-
-int tvout_std_v4l2_s_fmt(int fd, enum v4l2_buf_type type, enum v4l2_field field, int w, int h, int colorformat, int num_planes)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-
-    struct v4l2_format fmt;
-
-    fmt.type = type;
-    if (ioctl(fd, VIDIOC_G_FMT, &fmt) < 0) {
-        ALOGE("%s::VIDIOC_G_FMT failed", __func__);
-        return -1;
-    }
-
-    switch (fmt.type) {
-    case V4L2_BUF_TYPE_VIDEO_OUTPUT:
-    case V4L2_BUF_TYPE_VIDEO_CAPTURE:
-        fmt.fmt.pix.width       = w;
-        fmt.fmt.pix.height      = h;
-        fmt.fmt.pix.pixelformat = colorformat;
-        fmt.fmt.pix.field       = field;
-        break;
-    case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
-    case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
-        fmt.fmt.pix_mp.width       = w;
-        fmt.fmt.pix_mp.height      = h;
-        fmt.fmt.pix_mp.pixelformat = colorformat;
-        fmt.fmt.pix_mp.field       = field;
-        fmt.fmt.pix_mp.num_planes  = num_planes;
-        break;
-    default:
-        ALOGE("%s::invalid buffer type", __func__);
-        return -1;
-        break;
-    }
-
-    if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0) {
-        ALOGE("%s::VIDIOC_S_FMT failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int tvout_std_v4l2_s_crop(int fd, enum v4l2_buf_type type, enum v4l2_field, int x, int y, int w, int h)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_crop crop;
-
-    crop.type     = type;
-    crop.c.left   = x;
-    crop.c.top    = y;
-    crop.c.width  = w;
-    crop.c.height = h;
-
-    if (ioctl(fd, VIDIOC_S_CROP, &crop) < 0) {
-        ALOGE("%s::VIDIOC_S_CROP (x=%d, y=%d, w=%d, h=%d) failed",
-            __func__, x, y, w, h);
-        return -1;
-    }
-
-    return 0;
-}
-
-int tvout_std_v4l2_s_ctrl(int fd, int id, int value)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_control vc;
-
-    vc.id    = id;
-    vc.value = value;
-
-    if (ioctl(fd, VIDIOC_S_CTRL, &vc) < 0) {
-        ALOGE("%s::VIDIOC_S_CTRL (id=%d,value=%d) failed", __func__, id, value);
-        return -1;
-    }
-
-    return 0;
-}
-
-int tvout_std_v4l2_reqbuf(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, unsigned int num_bufs)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_requestbuffers reqbuf;
-
-    reqbuf.type   = type;
-    reqbuf.memory = memory;
-    reqbuf.count  = num_bufs;
-
-    if (ioctl(fd, VIDIOC_REQBUFS, &reqbuf) < 0) {
-        ALOGE("%s::VIDIOC_REQBUFS failed", __func__);
-        return -1;
-    }
-
-    if (reqbuf.count < num_bufs) {
-        ALOGE("%s::VIDIOC_REQBUFS failed ((reqbuf.count(%d) < num_bufs(%d))",
-            __func__, reqbuf.count, num_bufs);
-        return -1;
-    }
-
-    return 0;
-}
-
-int tvout_std_v4l2_querybuf(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, unsigned int buf_index, unsigned int num_planes, SecBuffer *secBuf)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_buffer buf;
-    struct v4l2_plane  planes[MAX_PLANES_MIXER];
-
-    memset(&buf, 0, sizeof(struct v4l2_buffer));
-
-    for (int i = 0; i < MAX_PLANES_MIXER; i++)
-        memset(&planes[i], 0, sizeof(struct v4l2_plane));
-
-    if (MAX_BUFFERS_MIXER <= buf_index || MAX_PLANES_MIXER <= num_planes) {
-        ALOGE("%s::exceed MAX! : buf_index=%d, num_plane=%d", __func__, buf_index, num_planes);
-        return -1;
-    }
-
-    buf.type     = type;
-    buf.memory   = V4L2_MEMORY_MMAP;
-    buf.index    = buf_index;
-    buf.length   = num_planes;
-    buf.m.planes = planes;
-
-    if (ioctl(fd, VIDIOC_QUERYBUF, &buf) < 0) {
-        ALOGE("%s::VIDIOC_QUERYBUF failed, plane_cnt=%d", __func__, buf.length);
-        return -1;
-    }
-
-    for (unsigned int i = 0; i < num_planes; i++) {
-        if ((secBuf->virt.extP[i] = (char *)mmap(0, buf.m.planes[i].length,
-                 PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.planes[i].m.mem_offset)) < 0) {
-            ALOGE("%s::mmap failed", __func__);
-            ALOGE("%s::Offset = 0x%x", __func__, buf.m.planes[i].m.mem_offset);
-            ALOGE("%s::Legnth = %d"  , __func__, buf.m.planes[i].length);
-            ALOGE("%s::vaddr[%d][%d] = 0x%x", __func__, buf_index, i, (unsigned int)secBuf->virt.extP[i]);
-            return -1;
-        }
-        secBuf->size.extS[i] = buf.m.planes[i].length;
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::vaddr[bufindex=%d][planeidx=%d] = 0x%x", __func__, buf_index, i, (unsigned int)secBuf->virt.extP[i]);
-    ALOGD("%s::Legnth = %d"  , __func__, buf.m.planes[i].length);
-#endif
-    }
-
-    return 0;
-}
-
-int tvout_std_v4l2_qbuf(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, int buf_index, int num_planes, SecBuffer *secBuf)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_buffer buf;
-    struct v4l2_plane  planes[MAX_PLANES_MIXER];
-
-    memset(&buf, 0, sizeof(struct v4l2_buffer));
-
-    for (int i = 0; i < MAX_PLANES_MIXER; i++)
-        memset(&planes[i], 0, sizeof(struct v4l2_plane));
-
-    buf.type     = type;
-    buf.memory   = memory;
-    buf.length   = num_planes;
-    buf.index    = buf_index;
-    buf.m.planes = planes;
-
-    for (unsigned int i = 0; i < buf.length; i++) {
-        buf.m.planes[i].m.userptr = (unsigned long)secBuf->virt.extP[i];
-        buf.m.planes[i].length    = secBuf->size.extS[i];
-        buf.m.planes[i].bytesused = buf.m.planes[i].length;
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-        ALOGD("%s::buf.index=%d", __func__, buf.index);
-        ALOGD("%s::buf.m.planes[%d].m.userptr=0x%08x", __func__, i, (unsigned int)buf.m.planes[i].m.userptr);
-        ALOGD("%s::buf.m.planes[%d].length   =0x%08x", __func__, i, buf.m.planes[i].length);
-        ALOGD("%s::buf.m.planes[%d].bytesused=0x%08x", __func__, i, buf.m.planes[i].bytesused);
-#endif
-    }
-
-    if (ioctl(fd, VIDIOC_QBUF, &buf) < 0) {
-        ALOGE("%s::VIDIOC_QBUF failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int tvout_std_v4l2_dqbuf(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, int *buf_index, int num_planes)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_buffer buf;
-    struct v4l2_plane  planes[MAX_PLANES_MIXER];
-
-    memset(&buf, 0, sizeof(struct v4l2_buffer));
-
-    for (int i = 0; i < MAX_PLANES_GSCALER; i++)
-        memset(&planes[i], 0, sizeof(struct v4l2_plane));
-
-
-    buf.type     = type;
-    buf.memory   = memory;
-    buf.length   = num_planes;
-    buf.m.planes = planes;
-
-    if (ioctl(fd, VIDIOC_DQBUF, &buf) < 0) {
-        ALOGE("%s::VIDIOC_DQBUF failed", __func__);
-        return -1;
-    }
-    *buf_index = buf.index;
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::buf.index=%d", __func__, buf.index);
-#endif
-
-    return 0;
-}
-
-int tvout_std_v4l2_streamon(int fd, enum v4l2_buf_type type)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    if (ioctl(fd, VIDIOC_STREAMON, &type) < 0) {
-        ALOGE("%s::VIDIOC_STREAMON failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int tvout_std_v4l2_streamoff(int fd, enum v4l2_buf_type type)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    if (ioctl(fd, VIDIOC_STREAMOFF, &type) < 0) {
-        ALOGE("%s::VIDIOC_STREAMOFF failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int tvout_v4l2_enum_output(int fd, struct v4l2_output *output)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    int ret = -1 ;
-    ret = ioctl(fd, VIDIOC_ENUMOUTPUT, output);
-
-    if (ret < 0) {
-        if (errno == EINVAL)
-            return -1;
-        ALOGE("%s::VIDIOC_ENUMOUTPUT", __func__);
-        return -1;
-    }
-    ALOGD("%s::index=%d, type=0x%08x, name=%s",
-          __func__, output->index, output->type, output->name);
-
-    return ret;
-}
-
-int tvout_v4l2_s_output(int fd, int index)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    if (ioctl(fd, VIDIOC_S_OUTPUT, &index) < 0) {
-        ALOGE("%s::VIDIOC_S_OUTPUT failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int tvout_v4l2_g_output(int fd, int *index)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    if (ioctl(fd, VIDIOC_G_OUTPUT, index) < 0) {
-        ALOGE("%s::VIDIOC_G_OUTPUT failed", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int tvout_std_v4l2_enum_dv_presets(int fd)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_dv_enum_preset enum_preset;
-    int ret = -1;
-
-    for (int index = 0; ; index++) {
-        enum_preset.index = index;
-        ret = ioctl(fd, VIDIOC_ENUM_DV_PRESETS, &enum_preset);
-
-        if (ret < 0) {
-            if (errno == EINVAL)
-                break;
-            ALOGE("%s::VIDIOC_ENUM_DV_PRESETS", __func__);
-            return -1;
-        }
-        ALOGD("%s::index=%d, preset=0x%08x, name=%s, w=%d, h=%d",
-              __func__, enum_preset.index, enum_preset.preset, enum_preset.name, enum_preset.width, enum_preset.height);
-    }
-
-    return 0;
-}
-
-int tvout_std_v4l2_s_dv_preset(int fd, struct v4l2_dv_preset *preset)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    if (ioctl(fd, VIDIOC_S_DV_PRESET, preset) < 0) {
-        ALOGE("%s::VIDIOC_S_DV_PRESET failed preset_id=%d", __func__, preset->preset);
-        return -1;
-    }
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::preset_id=%d", __func__, preset->preset);
-#endif
-    return 0;
-}
-
-int tvout_std_subdev_s_fmt(int fd, unsigned int pad, int w, int h, enum v4l2_mbus_pixelcode code)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_subdev_format fmt;
-
-    fmt.pad   = pad;
-    fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-    fmt.format.width  = w;
-    fmt.format.height = h;
-    fmt.format.code   = code;
-
-    if (ioctl(fd, VIDIOC_SUBDEV_S_FMT, &fmt) < 0) {
-        ALOGE("%s::VIDIOC_SUBDEV_S_FMT", __func__);
-        return -1;
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::format w=%d, h=%d", __func__, fmt.format.width, fmt.format.height);
-#endif
-    return 0;
-}
-int tvout_std_subdev_s_crop(int fd, unsigned int pad, int x, int y, int w, int h)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::pad=%d, crop x=%d, y=%d, w=%d, h=%d", __func__, pad, x, y, w, h);
-#endif
-
-    struct v4l2_subdev_crop   crop;
-
-    crop.pad   = pad;
-    crop.which = V4L2_SUBDEV_FORMAT_ACTIVE;
-    crop.rect.left   = x;
-    crop.rect.top    = y;
-    crop.rect.width  = w;
-    crop.rect.height = h;
-
-    if (ioctl(fd, VIDIOC_SUBDEV_S_CROP, &crop) < 0) {
-        ALOGE("%s::VIDIOC_SUBDEV_S_CROP", __func__);
-        return -1;
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s::pad=%d, crop x=%d, y=%d, w=%d, h=%d", __func__, pad, crop.rect.left, crop.rect.top, crop.rect.width, crop.rect.height);
-#endif
-
-    return 0;
-}
-
-#define ROUND_UP(value, boundary) ((((uint32_t)(value)) + \
-                                  (((uint32_t) boundary)-1)) & \
-                                  (~(((uint32_t) boundary)-1)))
-
-void hdmi_cal_rect(int src_w, int src_h, int dst_w, int dst_h, struct v4l2_rect *dst_rect)
-{
-    if (dst_w * src_h <= dst_h * src_w) {
-        dst_rect->left   = 0;
-        dst_rect->top    = (dst_h - ((dst_w * src_h) / src_w)) >> 1;
-        dst_rect->width  = dst_w;
-        dst_rect->height = ((dst_w * src_h) / src_w);
-    } else {
-        dst_rect->left   = (dst_w - ((dst_h * src_w) / src_h)) >> 1;
-        dst_rect->top    = 0;
-        dst_rect->width  = ((dst_h * src_w) / src_h);
-        dst_rect->height = dst_h;
-    }
-}
-
-int hdmi_set_videolayer(int fd, int hdmiW, int hdmiH, struct v4l2_rect * rect)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    if (tvout_std_subdev_s_fmt(fd, MIXER_V_SUBDEV_PAD_SINK, hdmiW, hdmiH, V4L2_MBUS_FMT_YUV8_1X24) < 0) {
-        ALOGE("%s::tvout_std_subdev_s_fmt(PAD=%d)[videolayer] failed", __func__, MIXER_V_SUBDEV_PAD_SINK);
-        return -1;
-    }
-
-    if (tvout_std_subdev_s_crop(fd, MIXER_V_SUBDEV_PAD_SINK, 0, 0, rect->width, rect->height) < 0) {
-        ALOGE("%s::tvout_std_subdev_s_crop(PAD=%d)[videolayer] failed", __func__, MIXER_V_SUBDEV_PAD_SINK);
-        return -1;
-    }
-
-    if (tvout_std_subdev_s_crop(fd, MIXER_V_SUBDEV_PAD_SOURCE, rect->left, rect->top, rect->width, rect->height) < 0) {
-        ALOGE("%s::tvout_std_subdev_s_crop(PAD=%d)[videolayer] failed", __func__, MIXER_V_SUBDEV_PAD_SOURCE);
-        return -1;
-    }
-    return 0;
-}
-
-int hdmi_set_graphiclayer(int fd_subdev, int fd_videodev,int layer,
-        int srcColorFormat,
-        int src_w, int src_h,
-        unsigned int src_address, SecBuffer * dstBuffer,
-        int dst_x, int dst_y, int dst_w, int dst_h,
-        int rotVal)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-    int             dst_color_format;
-    int             dst_bpp;
-    unsigned char   *dst_addr;
-    fimg2d_blit     BlitParam;
-    rotation        g2d_rotation;
-
-    fimg2d_addr  srcAddr;
-    fimg2d_image srcImage;
-    fimg2d_rect  srcRect;
-
-    fimg2d_addr  dstAddr;
-    fimg2d_image dstImage;
-    fimg2d_rect  dstRect;
-
-    fimg2d_clip  dstClip;
-    fimg2d_scale Scaling;
-
-    switch (t_std_id) {
-    case V4L2_STD_1080P_60:
-    case V4L2_STD_1080P_30:
-    case V4L2_STD_1080I_60:
-    case V4L2_STD_TVOUT_720P_60_SBS_HALF:
-    case V4L2_STD_TVOUT_720P_59_SBS_HALF:
-    case V4L2_STD_TVOUT_1080P_24_TB:
-    case V4L2_STD_TVOUT_1080P_23_TB:
-        dst_color_format = CF_ARGB_8888;
-        dst_bpp = 4;
-        break;
-    case V4L2_STD_480P_60_16_9:
-    case V4L2_STD_576P_50_16_9:
-    case V4L2_STD_720P_60:
-    case V4L2_STD_TVOUT_720P_50_TB:
-    default:
-        dst_color_format = CF_ARGB_4444;
-        dst_bpp = 2;
-        break;
-    }
-
-    static unsigned int prev_src_addr = 0;
-
-    if ((cur_g2d_address == 0) || (src_address != prev_src_addr)) {
-        if ((cur_g2d_address == 0) || (cur_g2d_address == g2d_reserved_memory1))
-            dst_addr = (unsigned char *)g2d_reserved_memory0;
-        else
-            dst_addr = (unsigned char *)g2d_reserved_memory1;
-
-        cur_g2d_address = (unsigned int)dst_addr;
-        prev_src_addr = src_address;
-
-        srcAddr  = {(addr_space)ADDR_USER, (unsigned long)src_address, src_w*src_h*4, 1, 0};
-        srcImage = {srcAddr, srcAddr, src_w, src_h, src_w*4, AX_RGB, CF_ARGB_8888};
-        srcRect = {0, 0, src_w, src_h};
-
-        dstAddr  = {(addr_space)ADDR_USER, (unsigned long)dst_addr, dst_w*dst_h*dst_bpp, 1, 0};
-        dstImage = {dstAddr, dstAddr, dst_w, dst_h, dst_w*dst_bpp, AX_RGB, (color_format)dst_color_format};
-        dstRect  = {0, 0, dst_w, dst_h};
-        dstClip  = {0, 0, 0, dst_w, dst_h};
-
-        if (rotVal == 0 || rotVal == 180)
-            Scaling = {SCALING_BILINEAR, SCALING_PIXELS, 0, 0, src_w, src_h, dst_w, dst_h};
-        else
-            Scaling = {SCALING_BILINEAR, SCALING_PIXELS, 0, 0, src_w, src_h, dst_h, dst_w};
-
-        switch (rotVal) {
-        case 0:
-            g2d_rotation = ORIGIN;
-            break;
-        case 90:
-            g2d_rotation = ROT_90;
-            break;
-        case 180:
-            g2d_rotation = ROT_180;
-            break;
-        case 270:
-            g2d_rotation = ROT_270;
-            break;
-        default:
-            ALOGE("%s::invalid rotVal(%d) : failed", __func__, rotVal);
-            return -1;
-            break;
-        }
-
-        BlitParam = {BLIT_OP_SRC, NON_PREMULTIPLIED, 0xff, 0, g2d_rotation, &Scaling, 0, 0, &dstClip, 0, &srcImage, &dstImage, NULL, &srcRect, &dstRect, NULL, 0};
-
-        if (stretchFimgApi(&BlitParam) < 0) {
-            ALOGE("%s::stretchFimgApi() failed", __func__);
-            return -1;
-        }
-
-        dstBuffer->virt.p = (char *)dst_addr;
-    }
-#else
-    dstBuffer->virt.p = (char *)src_address;
-#endif
-
-    return 0;
-}
-
-int hdmi_set_g_Params(int fd_subdev, int fd_videodev, int layer,
-                      int srcColorFormat,
-                      int src_w, int src_h,
-                      int dst_x, int dst_y, int dst_w, int dst_h)
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-    struct v4l2_rect rect;
-    int src_pad = 0;
-    int sink_pad = 0;
-    int v4l2ColorFormat = HAL_PIXEL_FORMAT_2_V4L2_PIX(srcColorFormat);
-
-    switch (layer) {
-    case HDMI_LAYER_GRAPHIC_0:
-        sink_pad = MIXER_G0_SUBDEV_PAD_SINK;
-        src_pad  = MIXER_G0_SUBDEV_PAD_SOURCE;
-        break;
-    case HDMI_LAYER_GRAPHIC_1:
-        sink_pad = MIXER_G1_SUBDEV_PAD_SINK;
-        src_pad  = MIXER_G1_SUBDEV_PAD_SOURCE;
-        break;
-    default:
-        ALOGE("%s::invalid layer(%d)", __func__, layer);
-        break;
-    };
-
-    rect.left   = dst_x;
-    rect.top    = dst_y;
-
-#if defined(BOARD_USES_HDMI_FIMGAPI)
-    rect.width  = dst_w;
-    rect.height = dst_h;
-#else
-    rect.width  = src_w;
-    rect.height = src_h;
-#endif
-
-    /* set sub device for mixer graphic layer input */
-    if (tvout_std_subdev_s_fmt(fd_subdev, sink_pad, rect.width, rect.height, V4L2_MBUS_FMT_XRGB8888_4X8_LE) < 0) {
-        ALOGE("%s::tvout_std_subdev_s_fmt(PAD=%d)[graphic layer] failed", __func__, sink_pad);
-        return -1;
-    }
-
-    if (tvout_std_subdev_s_crop(fd_subdev, sink_pad, 0, 0, rect.width, rect.height) < 0) {
-        ALOGE("%s::tvout_std_subdev_s_crop(PAD=%d)[graphic layer] failed", __func__, sink_pad);
-        return -1;
-    }
-
-    if (tvout_std_subdev_s_crop(fd_subdev, src_pad, rect.left, rect.top, rect.width, rect.height) < 0) {
-        ALOGE("%s::tvout_std_subdev_s_crop(PAD=%d)[graphic layer] failed", __func__, src_pad);
-        return -1;
-    }
-
-    /* set format for mixer graphic layer input device*/
-    if (tvout_std_v4l2_s_fmt(fd_videodev, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_FIELD_ANY, rect.width, rect.height, v4l2ColorFormat, 1) < 0) {
-        ALOGE("%s::tvout_std_v4l2_s_fmt()[graphic layer] failed", __func__);
-        return -1;
-    }
-
-    if (tvout_std_v4l2_s_crop(fd_videodev, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_FIELD_ANY, rect.left, rect.top, rect.width, rect.height) < 0) {
-        ALOGE("%s::tvout_std_v4l2_s_crop()[graphic layer] failed", __func__);
-        return -1;
-    }
-
-    /* request buffer for mixer graphic layer input device */
-    if (tvout_std_v4l2_reqbuf(fd_videodev, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_USERPTR, 2) < 0) {
-        ALOGE("%s::tvout_std_v4l2_reqbuf(buf_num=%d)[graphic layer] failed", __func__, 2);
-        return -1;
-    }
-
-    return 0;
-}
-
-int hdmi_cable_status()
-{
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("%s", __func__);
-#endif
-
-    int cable_status = 0;
-    int fd = 0;
-    struct v4l2_control ctrl;
-
-    fd = open(TVOUT0_DEV_G0, O_RDWR);
-    if (fd <= 0) {
-        ALOGE("%s: graphic layer 0 drv open failed", __func__);
-        return -1;
-    }
-
-    ctrl.id = V4L2_CID_TV_HPD_STATUS;
-
-    if (ioctl(fd, VIDIOC_S_CTRL, &ctrl) < 0) {
-        ALOGE("Get HPD_STATUS fail");
-        cable_status = -1;
-    } else {
-        cable_status = ctrl.value;
-    }
-
-#ifdef DEBUG_HDMI_HW_LEVEL
-    ALOGD("HPD_STATUS = %d", cable_status);
-#endif
-
-    close(fd);
-
-    return cable_status;
-}
-
-int hdmi_outputmode_2_v4l2_output_type(int output_mode)
-{
-    int v4l2_output_type = -1;
-
-    switch (output_mode) {
-    case HDMI_OUTPUT_MODE_YCBCR:
-        v4l2_output_type = V4L2_OUTPUT_TYPE_DIGITAL;
-        break;
-    case HDMI_OUTPUT_MODE_RGB:
-        v4l2_output_type = V4L2_OUTPUT_TYPE_HDMI_RGB;
-        break;
-    case HDMI_OUTPUT_MODE_DVI:
-        v4l2_output_type = V4L2_OUTPUT_TYPE_DVI;
-        break;
-    case COMPOSITE_OUTPUT_MODE:
-        v4l2_output_type = V4L2_OUTPUT_TYPE_COMPOSITE;
-        break;
-    default:
-        ALOGE("%s::unmathced HDMI_mode(%d)", __func__, output_mode);
-        v4l2_output_type = -1;
-        break;
-    }
-
-    return v4l2_output_type;
-}
-
-int hdmi_v4l2_output_type_2_outputmode(int v4l2_output_type)
-{
-    int outputMode = -1;
-
-    switch (v4l2_output_type) {
-    case V4L2_OUTPUT_TYPE_DIGITAL:
-        outputMode = HDMI_OUTPUT_MODE_YCBCR;
-        break;
-    case V4L2_OUTPUT_TYPE_HDMI_RGB:
-        outputMode = HDMI_OUTPUT_MODE_RGB;
-        break;
-    case V4L2_OUTPUT_TYPE_DVI:
-        outputMode = HDMI_OUTPUT_MODE_DVI;
-        break;
-    case V4L2_OUTPUT_TYPE_COMPOSITE:
-        outputMode = COMPOSITE_OUTPUT_MODE;
-        break;
-    default:
-        ALOGE("%s::unmathced v4l2_output_type(%d)", __func__, v4l2_output_type);
-        outputMode = -1;
-        break;
-    }
-
-    return outputMode;
-}
-
-int composite_std_2_v4l2_std_id(int std)
-{
-    int std_id = -1;
-
-    switch (std) {
-    case COMPOSITE_STD_NTSC_M:
-        std_id = V4L2_STD_NTSC_M;
-        break;
-    case COMPOSITE_STD_NTSC_443:
-        std_id = V4L2_STD_NTSC_443;
-        break;
-    case COMPOSITE_STD_PAL_BDGHI:
-        std_id = V4L2_STD_PAL_BDGHI;
-        break;
-    case COMPOSITE_STD_PAL_M:
-        std_id = V4L2_STD_PAL_M;
-        break;
-    case COMPOSITE_STD_PAL_N:
-        std_id = V4L2_STD_PAL_N;
-        break;
-    case COMPOSITE_STD_PAL_Nc:
-        std_id = V4L2_STD_PAL_Nc;
-        break;
-    case COMPOSITE_STD_PAL_60:
-        std_id = V4L2_STD_PAL_60;
-        break;
-    default:
-        ALOGE("%s::unmathced composite_std(%d)", __func__, std);
-        break;
-    }
-
-    return std_id;
-}
-
-int hdmi_check_output_mode(int v4l2_output_type)
-{
-    struct HDMIVideoParameter video;
-    struct HDMIAudioParameter audio;
-    int    calbirate_v4l2_mode = v4l2_output_type;
-
-    audio.formatCode = LPCM_FORMAT;
-    audio.outPacket  = HDMI_ASP;
-    audio.channelNum = CH_2;
-    audio.sampleFreq = SF_44KHZ;
-
-    switch (v4l2_output_type) {
-    case V4L2_OUTPUT_TYPE_DIGITAL :
-        video.mode = HDMI;
-        if (!EDIDHDMIModeSupport(&video)) {
-            calbirate_v4l2_mode = V4L2_OUTPUT_TYPE_DVI;
-            ALOGI("Change mode into DVI\n");
-            break;
-        }
-
-        video.colorSpace = HDMI_CS_YCBCR444;
-        if (!EDIDColorSpaceSupport(&video)) {
-            calbirate_v4l2_mode = V4L2_OUTPUT_TYPE_HDMI_RGB;
-            ALOGI("Change mode into HDMI_RGB\n");
-        }
-        break;
-
-    case V4L2_OUTPUT_TYPE_HDMI_RGB:
-        video.mode = HDMI;
-        if (!EDIDHDMIModeSupport(&video)) {
-            calbirate_v4l2_mode = V4L2_OUTPUT_TYPE_DVI;
-            ALOGI("Change mode into DVI\n");
-            break;
-        }
-
-        video.colorSpace = HDMI_CS_RGB;
-        if (!EDIDColorSpaceSupport(&video)) {
-            calbirate_v4l2_mode = V4L2_OUTPUT_TYPE_DIGITAL;
-            ALOGI("Change mode into HDMI_YCBCR\n");
-        }
-        break;
-
-    case V4L2_OUTPUT_TYPE_DVI:
-        video.mode = DVI;
-        if (!EDIDHDMIModeSupport(&video)) {
-            video.colorSpace = HDMI_CS_YCBCR444;
-            if (!EDIDColorSpaceSupport(&video)) {
-                calbirate_v4l2_mode = V4L2_OUTPUT_TYPE_HDMI_RGB;
-                ALOGI("Change mode into HDMI_RGB\n");
-            } else {
-                calbirate_v4l2_mode = V4L2_OUTPUT_TYPE_DIGITAL;
-                ALOGI("Change mode into HDMI_YCBCR\n");
-            }
-            break;
-        }
-
-        break;
-
-    default:
-        break;
-    }
-    return calbirate_v4l2_mode;
-}
-
-int hdmi_check_resolution(v4l2_std_id std_id)
-{
-    struct HDMIVideoParameter video;
-    struct HDMIAudioParameter audio;
-
-    switch (std_id) {
-    case V4L2_STD_480P_60_16_9:
-        video.resolution = v720x480p_60Hz;
-        video.pixelAspectRatio = HDMI_PIXEL_RATIO_16_9;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_480P_60_4_3:
-        video.resolution = v640x480p_60Hz;
-        video.pixelAspectRatio = HDMI_PIXEL_RATIO_4_3;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_576P_50_16_9:
-        video.resolution = v720x576p_50Hz;
-        video.pixelAspectRatio = HDMI_PIXEL_RATIO_16_9;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_576P_50_4_3:
-        video.resolution = v720x576p_50Hz;
-        video.pixelAspectRatio = HDMI_PIXEL_RATIO_4_3;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_720P_60:
-        video.resolution = v1280x720p_60Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_720P_50:
-        video.resolution = v1280x720p_50Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_1080P_60:
-        video.resolution = v1920x1080p_60Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_1080P_50:
-        video.resolution = v1920x1080p_50Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_1080I_60:
-        video.resolution = v1920x1080i_60Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_1080I_50:
-        video.resolution = v1920x1080i_50Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_480P_59:
-        video.resolution = v720x480p_60Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_720P_59:
-        video.resolution = v1280x720p_60Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_1080I_59:
-        video.resolution = v1920x1080i_60Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_1080P_59:
-        video.resolution = v1920x1080p_60Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_1080P_30:
-        video.resolution = v1920x1080p_30Hz;
-        video.hdmi_3d_format = HDMI_2D_VIDEO_FORMAT;
-        break;
-    case V4L2_STD_TVOUT_720P_60_SBS_HALF:
-        video.resolution = v1280x720p_60Hz;
-        video.hdmi_3d_format = HDMI_3D_SSH_FORMAT;
-        break;
-    case V4L2_STD_TVOUT_720P_59_SBS_HALF:
-        video.resolution = v1280x720p_60Hz;
-        video.hdmi_3d_format = HDMI_3D_SSH_FORMAT;
-        break;
-    case V4L2_STD_TVOUT_720P_50_TB:
-        video.resolution = v1280x720p_50Hz;
-        video.hdmi_3d_format = HDMI_3D_TB_FORMAT;
-        break;
-    case V4L2_STD_TVOUT_1080P_24_TB:
-        video.resolution = v1920x1080p_24Hz;
-        video.hdmi_3d_format = HDMI_3D_TB_FORMAT;
-        break;
-    case V4L2_STD_TVOUT_1080P_23_TB:
-        video.resolution = v1920x1080p_24Hz;
-        video.hdmi_3d_format = HDMI_3D_TB_FORMAT;
-        break;
-    default:
-        ALOGE("%s::unmathced std_id(%lld)", __func__, std_id);
-        return -1;
-        break;
-    }
-
-    if (!EDIDVideoResolutionSupport(&video)) {
-#ifdef DEBUG_MSG_ENABLE
-        ALOGD("%s::EDIDVideoResolutionSupport(%llx) fail (not suppoted std_id) \n", __func__, std_id);
-#endif
-        return -1;
-    }
-
-    return 0;
-}
-
-int hdmi_resolution_2_std_id(unsigned int resolution, int * w, int * h, v4l2_std_id * std_id, __u32 *preset_id)
-{
-    int ret = 0;
-
-    switch (resolution) {
-    case 1080960:
-        *std_id = V4L2_STD_1080P_60;
-        *w      = 1920;
-        *h      = 1080;
-        *preset_id = V4L2_DV_1080P60;
-        break;
-    case 1080950:
-        *std_id = V4L2_STD_1080P_50;
-        *w      = 1920;
-        *h      = 1080;
-        *preset_id = V4L2_DV_1080P50;
-        break;
-    case 1080930:
-        *std_id = V4L2_STD_1080P_30;
-        *w      = 1920;
-        *h      = 1080;
-        *preset_id = V4L2_DV_1080P30;
-        break;
-    case 1080924:
-        *std_id = V4L2_STD_TVOUT_1080P_24_TB;
-        *w      = 1920;
-        *h      = 1080;
-        *preset_id = V4L2_DV_1080P24_TB;
-        break;
-    case 1080160:
-        *std_id = V4L2_STD_1080I_60;
-        *w      = 1920;
-        *h      = 1080;
-        *preset_id = V4L2_DV_1080I60;
-        break;
-    case 1080150:
-        *std_id = V4L2_STD_1080I_50;
-        *w      = 1920;
-        *h      = 1080;
-        *preset_id = V4L2_DV_1080I50;
-        break;
-    case 720960:
-        *std_id = V4L2_STD_720P_60;
-        *w      = 1280;
-        *h      = 720;
-        *preset_id = V4L2_DV_720P60;
-        break;
-    case 7209601:
-        *std_id = V4L2_STD_TVOUT_720P_60_SBS_HALF;
-        *w      = 1280;
-        *h      = 720;
-        *preset_id = V4L2_DV_720P60_SB_HALF;
-        break;
-    case 720950:
-        *std_id = V4L2_STD_720P_50;
-        *w      = 1280;
-        *h      = 720;
-        *preset_id = V4L2_DV_720P50;
-        break;
-    case 7209501:
-        *std_id = V4L2_STD_TVOUT_720P_50_TB;
-        *w      = 1280;
-        *h      = 720;
-        *preset_id = V4L2_DV_720P50_TB;
-        break;
-    case 5769501:
-        *std_id = V4L2_STD_576P_50_16_9;
-        *w      = 720;
-        *h      = 576;
-        *preset_id = V4L2_DV_576P50;
-        break;
-    case 5769502:
-        *std_id = V4L2_STD_576P_50_4_3;
-        *w      = 720;
-        *h      = 576;
-        *preset_id = V4L2_DV_576P50;
-       break;
-    case 4809601:
-        *std_id = V4L2_STD_480P_60_16_9;
-        *w      = 720;
-        *h      = 480;
-        *preset_id = V4L2_DV_480P60;
-       break;
-    case 4809602:
-        *std_id = V4L2_STD_480P_60_4_3;
-        *w     = 720;
-        *h     = 480;
-        *preset_id = V4L2_DV_480P60;
-      break;
-    default:
-        ALOGE("%s::unmathced resolution(%d)", __func__, resolution);
-        ret = -1;
-        break;
-    }
-
-    return ret;
-}
-
-int hdmi_enable_hdcp(int fd, unsigned int hdcp_en)
-{
-    if (ioctl(fd, VIDIOC_HDCP_ENABLE, hdcp_en) < 0) {
-        ALOGD("%s::VIDIOC_HDCP_ENABLE(%d) fail \n", __func__, hdcp_en);
-        return -1;
-    }
-
-    return 0;
-}
-
-int hdmi_check_audio(int fd)
-{
-    struct HDMIAudioParameter audio;
-    enum state audio_state = ON;
-    int ret = 0;
-
-    audio.formatCode = LPCM_FORMAT;
-    audio.outPacket  = HDMI_ASP;
-    audio.channelNum = CH_2;
-    audio.sampleFreq = SF_44KHZ;
-
-#if defined(BOARD_USES_EDID)
-    if (!EDIDAudioModeSupport(&audio))
-        audio_state = NOT_SUPPORT;
-    else
-        audio_state = ON;
-#endif
-    if (audio_state == ON) {
-        if (ioctl(fd, VIDIOC_INIT_AUDIO, 1) < 0) {
-            ALOGE("%s::VIDIOC_INIT_AUDIO(1) failed", __func__);
-            ret = -1;
-        }
-    } else {
-        if (ioctl(fd, VIDIOC_INIT_AUDIO, 0) < 0) {
-            ALOGE("%s::VIDIOC_INIT_AUDIO(0) failed", __func__);
-            ret = -1;
-        }
-    }
-
-    return ret;
-}
-
-}
diff --git a/exynos5/hal/libhdmi/SecHdmi/SecHdmiV4L2Utils.h b/exynos5/hal/libhdmi/SecHdmi/SecHdmiV4L2Utils.h
deleted file mode 100644
index 67c0729..0000000
--- a/exynos5/hal/libhdmi/SecHdmi/SecHdmiV4L2Utils.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __HDMI_HAL_V4L2_UTILS_H__
-#define __HDMI_HAL_V4L2_UTILS_H__
-
-//#define LOG_NDEBUG 0
-//#define LOG_TAG "libhdmi"
-
-#include "fimd_api.h"
-#include "SecBuffer.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-namespace android {
-
-void display_menu(void);
-
-int tvout_init(int fd_tvout, __u32 preset_id);
-int tvout_deinit();
-int tvout_std_v4l2_querycap(int fd, char *node);
-int tvout_std_v4l2_s_fmt(int fd, enum v4l2_buf_type type, enum v4l2_field field, int w, int h, int colorformat, int num_planes);
-int tvout_std_v4l2_s_crop(int fd, enum v4l2_buf_type type, enum v4l2_field field, int x, int y, int w, int h);
-int tvout_std_v4l2_s_ctrl(int fd, int id, int value);
-int tvout_std_v4l2_reqbuf(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, unsigned int num_bufs);
-int tvout_std_v4l2_querybuf(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, unsigned int buf_index, unsigned int num_planes, SecBuffer *secBuf);
-int tvout_std_v4l2_qbuf(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, int buf_index, int num_planes, SecBuffer *secBuf);
-int tvout_std_v4l2_dqbuf(int fd, enum v4l2_buf_type type, enum v4l2_memory memory, int *buf_index, int num_planes);
-int tvout_std_v4l2_streamon(int fd, enum v4l2_buf_type type);
-int tvout_std_v4l2_streamoff(int fd, enum v4l2_buf_type type);
-
-int tvout_v4l2_enum_output(int fp, struct v4l2_output *output);
-int tvout_v4l2_s_output(int fp, int index);
-int tvout_v4l2_g_output(int fp, int *index);
-int tvout_std_v4l2_enum_dv_presets(int fd);
-int tvout_std_v4l2_s_dv_preset(int fd, struct v4l2_dv_preset *preset);
-int tvout_std_subdev_s_fmt(int fd, unsigned int pad, int w, int h, enum v4l2_mbus_pixelcode code);
-int tvout_std_subdev_s_crop(int fd, unsigned int pad, int w, int h, int x, int y);
-
-void hdmi_cal_rect(int src_w, int src_h, int dst_w, int dst_h, struct v4l2_rect *dst_rect);
-int hdmi_set_videolayer(int fd, int hdmiW, int hdmiH, struct v4l2_rect * rect);
-int hdmi_set_graphiclayer(int fd_subdev, int fd_videodev,int layer,
-        int srcColorFormat,
-        int src_w, int src_h,
-        unsigned int src_address, SecBuffer * dstBuffer,
-        int dst_x, int dst_y, int dst_w, int dst_h,
-        int rotVal);
-int hdmi_set_g_Params(int fd_subdev, int fd_videodev, int layer,
-                      int srcColorFormat,
-                      int src_w, int src_h,
-                      int dst_x, int dst_y, int dst_w, int dst_h);
-
-int hdmi_cable_status();
-int hdmi_outputmode_2_v4l2_output_type(int output_mode);
-int hdmi_v4l2_output_type_2_outputmode(int v4l2_output_type);
-int composite_std_2_v4l2_std_id(int std);
-
-int hdmi_check_output_mode(int v4l2_output_type);
-int hdmi_check_resolution(v4l2_std_id std_id);
-
-int hdmi_resolution_2_std_id(unsigned int resolution, int *w, int *h, v4l2_std_id *std_id, __u32 *preset_id);
-int hdmi_enable_hdcp(int fd, unsigned int hdcp_en);
-int hdmi_check_audio(int fd);
-
-#ifdef __cplusplus
-}
-#endif
-
-}  //namespace android
-
-#endif //__HDMI_HAL_V4L2_UTILS_H__
diff --git a/exynos5/hal/libhdmi/SecHdmi/fimd_api.c b/exynos5/hal/libhdmi/SecHdmi/fimd_api.c
deleted file mode 100644
index 0f14f5d..0000000
--- a/exynos5/hal/libhdmi/SecHdmi/fimd_api.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
-* Copyright@ Samsung Electronics Co. LTD
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#include <linux/vt.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <poll.h>
-#include <signal.h>
-#include <cutils/log.h>
-
-#include "fimd_api.h"
-
-int fb_open(int win)
-{
-    char node[20];
-    int fp = -1;
-
-    sprintf(node, "%s%d", PFX_NODE_FB, win);
-
-    fp = open(node, O_RDWR);
-    if (fp < 0)
-        ALOGE("%s: fb[%d] open failed", __func__, win);
-
-    return fp;
-}
-
-int fb_close(int fp)
-{
-    if (fp)
-        close(fp);
-    else
-        ALOGE("%s: fb is not allocated %d", __func__, fp);
-
-    return 0;
-}
-
-int get_fscreeninfo(int fp, struct fb_fix_screeninfo *fix)
-{
-    int ret = -1;
-
-    ret = ioctl(fp, FBIOGET_FSCREENINFO, fix);
-    if (ret)
-        ALOGE("%s: FBIOGET_FSCREENINFO failed", __func__);
-
-    return ret;
-}
-
-int get_vscreeninfo(int fp, struct fb_var_screeninfo *var)
-{
-    int ret = -1;
-
-    ret = ioctl(fp, FBIOGET_VSCREENINFO, var);
-    if (ret)
-        ALOGE("%s:: FBIOGET_VSCREENINFO failed", __func__);
-
-    return ret;
-}
-
-int put_vscreeninfo(int fp, struct fb_var_screeninfo *var)
-{
-    int ret = -1;
-
-    ret = ioctl(fp, FBIOPUT_VSCREENINFO, var);
-    if (ret)
-        ALOGE("%s:: FBIOPUT_VSCREENINFO failed", __func__);
-
-    return ret;
-}
-
-int get_bytes_per_pixel(int bits_per_pixel)
-{
-    return (bits_per_pixel == 24 || bits_per_pixel == 25 ||
-        bits_per_pixel == 28) ? 4 : bits_per_pixel / 8;
-}
-
-char *fb_mmap(__u32 size, int fp)
-{
-    char *buffer;
-
-    buffer = (char *)mmap(0, size, PROT_READ | PROT_WRITE,
-                  MAP_SHARED, fp, 0);
-    if (!buffer) {
-        ALOGE("%s:: mmap failed", __func__);
-        return NULL;
-    }
-
-    return buffer;
-}
-
-int fb_ioctl(int fp, __u32 cmd, void *arg)
-{
-    int ret = -1;
-
-    ret = ioctl(fp, cmd, arg);
-    if (ret < 0)
-        ALOGE("%s:: ioctl (%d) failed", __func__, cmd);
-
-    return ret;
-}
-
-int fb_on(int fp)
-{
-    int ret = -1;
-
-    ret = ioctl(fp, FBIOBLANK, FB_BLANK_UNBLANK);
-    if (ret)
-        ALOGE("%s:: FBIOBLANK failed", __func__);
-
-    return ret;
-}
-
-int fb_off(int fp)
-{
-    int ret = -1;
-
-    ret = ioctl(fp, FBIOBLANK, FB_BLANK_POWERDOWN);
-    if (ret)
-        ALOGE("%s:: FBIOBLANK failed", __func__);
-
-    return ret;
-}
-
-int fb_off_all()
-{
-    int fp, i;
-
-    for (i = 0; i < TOTAL_FB_NUM; i++) {
-        fp = fb_open(i);
-        if (fp < 0)
-            return -1;
-
-        if (ioctl(fp, FBIOBLANK, FB_BLANK_POWERDOWN) < 0)
-            ALOGE("%s:: FBIOBLANK failed", __func__);
-
-        fb_off(fp);
-        fb_close(fp);
-    }
-
-    return 0;
-}
-
-char *fb_init_display(int fp, int width, int height, int left_x, int top_y,
-              int bpp)
-{
-    struct fb_var_screeninfo var;
-    struct s5ptvfb_user_window window;
-    int fb_size;
-    char *fb = NULL;
-
-    var.xres = width;
-    var.yres = height;
-    var.bits_per_pixel = bpp;
-    window.x = left_x;
-    window.y = top_y;
-
-    var.xres_virtual = var.xres;
-    var.yres_virtual = var.yres;
-    var.xoffset = 0;
-    var.yoffset = 0;
-    var.width = 0;
-    var.height = 0;
-    var.transp.length = 0;
-    var.activate = FB_ACTIVATE_FORCE;
-    fb_size = var.xres_virtual * var.yres_virtual * bpp / 8;
-
-    /* FBIOPUT_VSCREENINFO should be first */
-    put_vscreeninfo(fp, &var);
-    fb_ioctl(fp, S5PTVFB_WIN_POSITION, &window);
-
-    /* draw image */
-    fb = fb_mmap(fb_size, fp);
-    memset(fb, 0x0, fb_size);
-
-    return fb;
-}
-
-int simple_draw(char *dest, const char *src, int img_width,
-        struct fb_var_screeninfo *var)
-{
-    int bytes_per_pixel = get_bytes_per_pixel(var->bits_per_pixel);
-    unsigned int y;
-
-    for (y = 0; y < var->yres; y++)
-        memcpy(dest + y * var->xres * bytes_per_pixel,
-               src + y * img_width * bytes_per_pixel,
-               var->xres * bytes_per_pixel);
-
-    return 0;
-}
-
-int draw(char *dest, const char *src, int img_width,
-     struct fb_var_screeninfo *var)
-{
-    int bytes_per_pixel = get_bytes_per_pixel(var->bits_per_pixel);
-    unsigned int y;
-
-    if (var->bits_per_pixel == 16) {
-        memcpy(dest, src, var->xres * var->yres * 2);
-    } else {
-        for (y = 0; y < var->yres; y++)
-            memcpy(dest + y * var->xres * bytes_per_pixel,
-                   src + y * img_width * bytes_per_pixel,
-                   var->xres * bytes_per_pixel);
-    }
-
-    return 0;
-}
diff --git a/exynos5/hal/libhdmi/SecHdmi/fimd_api.h b/exynos5/hal/libhdmi/SecHdmi/fimd_api.h
deleted file mode 100644
index a8561a4..0000000
--- a/exynos5/hal/libhdmi/SecHdmi/fimd_api.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __FIMD_API_H__
-#define __FIMD_API_H__
-
-#include <linux/fb.h>
-#include "s5p_tvout.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define TOTAL_FB_NUM        5
-
-int fb_open(int win);
-int fb_close(int fp);
-int fb_on(int fp);
-int fb_off(int fp);
-int fb_off_all(void);
-char *fb_init_display(int fp, int width, int height,\
-            int left_x, int top_y, int bpp);
-int fb_ioctl(int fp, __u32 cmd, void *arg);
-char *fb_mmap(__u32 size, int fp);
-int simple_draw(char *dest, const char *src,\
-        int img_width, struct fb_var_screeninfo *var);
-int draw(char *dest, const char *src,\
-    int img_width, struct fb_var_screeninfo *var);
-int get_fscreeninfo(int fp, struct fb_fix_screeninfo *fix);
-int get_vscreeninfo(int fp, struct fb_var_screeninfo *var);
-int put_vscreeninfo(int fp, struct fb_var_screeninfo *var);
-int get_bytes_per_pixel(int bits_per_pixel);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __FIMD_API_H__ */
diff --git a/exynos5/hal/libhdmi/libhdmiservice/Android.mk b/exynos5/hal/libhdmi/libhdmiservice/Android.mk
deleted file mode 100644
index bc0aa0d..0000000
--- a/exynos5/hal/libhdmi/libhdmiservice/Android.mk
+++ /dev/null
@@ -1,95 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-ifeq ($(filter-out exynos5,$(TARGET_BOARD_PLATFORM)),)
-ifeq ($(BOARD_USES_HDMI),true)
-
-LOCAL_PATH:= $(call my-dir)
-
-#
-# libTVOut
-#
-
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-LOCAL_PRELINK_MODULE := false
-
-LOCAL_SRC_FILES := \
-	SecTVOutService.cpp \
-	ISecTVOut.cpp \
-	MessageQueue.cpp
-
-LOCAL_C_INCLUDES := \
-
-LOCAL_SHARED_LIBRARIES := \
-	libbinder \
-	libutils \
-	libcutils
-
-LOCAL_C_INCLUDES += device/samsung/$(TARGET_BOARD_PLATFORM)/include
-LOCAL_C_INCLUDES += device/samsung/$(TARGET_BOARD_PLATFORM)/libhdmi
-LOCAL_SHARED_LIBRARIES += libhdmi
-
-ifeq ($(BOARD_USES_HDMI_SUBTITLES),true)
-	LOCAL_CFLAGS  += -DBOARD_USES_HDMI_SUBTITLES
-endif
-
-LOCAL_MODULE := libTVOut
-
-include $(BUILD_SHARED_LIBRARY)
-
-#
-# libhdmiclient
-#
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-LOCAL_PRELINK_MODULE := false
-
-LOCAL_SRC_FILES:= \
-    SecHdmiClient.cpp
-
-LOCAL_C_INCLUDES += \
-	$(JNI_H_INCLUDE)
-
-LOCAL_SHARED_LIBRARIES := \
-	libbinder \
-	libutils \
-	libTVOut
-
-ifeq ($(TARGET_SIMULATOR),true)
-ifeq ($(TARGET_OS),linux)
-ifeq ($(TARGET_ARCH),x86)
-LOCAL_LDLIBS += -lpthread -ldl -lrt
-endif
-endif
-endif
-
-ifeq ($(WITH_MALLOC_LEAK_CHECK),true)
-	LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK
-endif
-
-ifeq ($(TARGET_SOC),exynos5250)
-LOCAL_CFLAGS += -DSAMSUNG_EXYNOS5250
-endif
-
-LOCAL_CFLAGS     += -DBOARD_USES_HDMI
-
-LOCAL_MODULE:= libhdmiclient
-
-include $(BUILD_SHARED_LIBRARY)
-
-endif
-endif
diff --git a/exynos5/hal/libhdmi/libhdmiservice/Barrier.h b/exynos5/hal/libhdmi/libhdmiservice/Barrier.h
deleted file mode 100644
index 6f8507e..0000000
--- a/exynos5/hal/libhdmi/libhdmiservice/Barrier.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_BARRIER_H
-#define ANDROID_BARRIER_H
-
-#include <stdint.h>
-#include <sys/types.h>
-#include <utils/threads.h>
-
-namespace android {
-
-class Barrier
-{
-public:
-    inline Barrier() : state(CLOSED) { }
-    inline ~Barrier() { }
-    void open() {
-        Mutex::Autolock _l(lock);
-        state = OPENED;
-        cv.broadcast();
-    }
-    void close() {
-        Mutex::Autolock _l(lock);
-        state = CLOSED;
-    }
-    void wait() const {
-        Mutex::Autolock _l(lock);
-        while (state == CLOSED) {
-            cv.wait(lock);
-        }
-    }
-private:
-    enum { OPENED, CLOSED };
-    mutable     Mutex       lock;
-    mutable     Condition   cv;
-    volatile    int         state;
-};
-
-}; // namespace android
-
-#endif // ANDROID_BARRIER_H
diff --git a/exynos5/hal/libhdmi/libhdmiservice/ISecTVOut.cpp b/exynos5/hal/libhdmi/libhdmiservice/ISecTVOut.cpp
deleted file mode 100644
index a013bf1..0000000
--- a/exynos5/hal/libhdmi/libhdmiservice/ISecTVOut.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
-**
-** Copyright 2008, The Android Open Source Project
-** Copyright 2010, Samsung Electronics Co. LTD
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-/*
-**
-** @author  Taikyung, Yu(taikyung.yu@samsung.com)
-** @date    2011-07-06
-*/
-
-#include <stdint.h>
-#include <sys/types.h>
-#include <binder/Parcel.h>
-#include <utils/Log.h>
-#include "ISecTVOut.h"
-
-namespace android {
-
-    enum {
-        SET_HDMI_STATUS = IBinder::FIRST_CALL_TRANSACTION,
-        SET_HDMI_MODE,
-        SET_HDMI_RESOLUTION,
-        SET_HDMI_HDCP,
-        SET_HDMI_ROTATE,
-        SET_HDMI_HWCLAYER,
-        BLIT_2_HDMI
-    };
-
-    void BpSecTVOut::setHdmiCableStatus(uint32_t status)
-    {
-        Parcel data, reply;
-        data.writeInt32(status);
-        remote()->transact(SET_HDMI_STATUS, data, &reply);
-    }
-
-    void BpSecTVOut::setHdmiMode(uint32_t mode)
-    {
-        Parcel data, reply;
-        data.writeInt32(mode);
-        remote()->transact(SET_HDMI_MODE, data, &reply);
-    }
-
-    void BpSecTVOut::setHdmiResolution(uint32_t resolution)
-    {
-        Parcel data, reply;
-        data.writeInt32(resolution);
-        remote()->transact(SET_HDMI_RESOLUTION, data, &reply);
-    }
-
-    void BpSecTVOut::setHdmiHdcp(uint32_t resolution)
-    {
-        Parcel data, reply;
-        data.writeInt32(resolution);
-        remote()->transact(SET_HDMI_HDCP, data, &reply);
-    }
-
-    void BpSecTVOut::setHdmiRotate(uint32_t rotVal, uint32_t hwcLayer)
-    {
-        Parcel data, reply;
-        data.writeInt32(rotVal);
-        data.writeInt32(hwcLayer);
-        remote()->transact(SET_HDMI_ROTATE, data, &reply);
-    }
-
-    void BpSecTVOut::setHdmiHwcLayer(uint32_t hwcLayer)
-    {
-        Parcel data, reply;
-        data.writeInt32(hwcLayer);
-        remote()->transact(SET_HDMI_HWCLAYER, data, &reply);
-    }
-
-    void BpSecTVOut::blit2Hdmi(uint32_t w, uint32_t h,
-                                        uint32_t colorFormat,
-                                        uint32_t physYAddr,
-                                        uint32_t physCbAddr,
-                                        uint32_t physCrAddr,
-                                        uint32_t dstX,
-                                        uint32_t dstY,
-                                        uint32_t hdmiLayer,
-                                        uint32_t num_of_hwc_layer)
-    {
-        Parcel data, reply;
-        data.writeInt32(w);
-        data.writeInt32(h);
-        data.writeInt32(colorFormat);
-        data.writeInt32(physYAddr);
-        data.writeInt32(physCbAddr);
-        data.writeInt32(physCrAddr);
-        data.writeInt32(dstX);
-        data.writeInt32(dstY);
-        data.writeInt32(hdmiLayer);
-        data.writeInt32(num_of_hwc_layer);
-        remote()->transact(BLIT_2_HDMI, data, &reply);
-    }
-
-    IMPLEMENT_META_INTERFACE(SecTVOut, "android.os.ISecTVOut");
-};
diff --git a/exynos5/hal/libhdmi/libhdmiservice/ISecTVOut.h b/exynos5/hal/libhdmi/libhdmiservice/ISecTVOut.h
deleted file mode 100644
index 5506b57..0000000
--- a/exynos5/hal/libhdmi/libhdmiservice/ISecTVOut.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
-**
-** Copyright 2008, The Android Open Source Project
-** Copyright 2010, Samsung Electronics Co. LTD
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-/*
-**
-** @author  Taikyung, Yu(taikyung.yu@samsung.com)
-** @date    2011-07-06
-*/
-
-#ifndef ISECTVOUT_H
-#define ISECTVOUT_H
-#include <utils/RefBase.h>
-#include <binder/IInterface.h>
-#include <binder/Parcel.h>
-
-namespace android {
-    class ISecTVOut: public IInterface
-    {
-        public:
-            DECLARE_META_INTERFACE(SecTVOut);
-            virtual void setHdmiCableStatus(uint32_t status) = 0;
-            virtual void setHdmiMode(uint32_t mode) = 0;
-            virtual void setHdmiResolution(uint32_t resolution) = 0;
-            virtual void setHdmiHdcp(uint32_t enHdcp) = 0;
-            virtual void setHdmiRotate(uint32_t rotVal, uint32_t hwcLayer) = 0;
-            virtual void setHdmiHwcLayer(uint32_t hwcLayer) = 0;
-            virtual void blit2Hdmi(uint32_t w, uint32_t h,
-                                        uint32_t colorFormat,
-                                        uint32_t physYAddr,
-                                        uint32_t physCbAddr,
-                                        uint32_t physCrAddr,
-                                        uint32_t dstX,
-                                        uint32_t dstY,
-                                        uint32_t hdmiLayer,
-                                        uint32_t num_of_hwc_layer) = 0;
-    };
-    //--------------------------------------------------------------
-    class BpSecTVOut: public BpInterface<ISecTVOut>
-    {
-        public:
-            BpSecTVOut(const sp<IBinder>& impl): BpInterface<ISecTVOut>(impl){}
-            virtual void setHdmiCableStatus(uint32_t status);
-            virtual void setHdmiMode(uint32_t mode);
-            virtual void setHdmiResolution(uint32_t resolution);
-            virtual void setHdmiHdcp(uint32_t enHdcp);
-            virtual void setHdmiRotate(uint32_t rotVal, uint32_t hwcLayer);
-            virtual void setHdmiHwcLayer(uint32_t hwcLayer);
-            virtual void blit2Hdmi(uint32_t w, uint32_t h,
-                                        uint32_t colorFormat,
-                                        uint32_t physYAddr,
-                                        uint32_t physCbAddr,
-                                        uint32_t physCrAddr,
-                                        uint32_t dstX,
-                                        uint32_t dstY,
-                                        uint32_t hdmiLayer,
-                                        uint32_t num_of_hwc_layer);
-    };
-};
-#endif
diff --git a/exynos5/hal/libhdmi/libhdmiservice/MessageQueue.cpp b/exynos5/hal/libhdmi/libhdmiservice/MessageQueue.cpp
deleted file mode 100644
index 91f3336..0000000
--- a/exynos5/hal/libhdmi/libhdmiservice/MessageQueue.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/types.h>
-
-#include <utils/threads.h>
-#include <utils/Timers.h>
-#include <utils/Log.h>
-#include <binder/IPCThreadState.h>
-
-#include "MessageQueue.h"
-
-namespace android {
-
-void MessageList::insert(const sp<MessageBase>& node)
-{
-    LIST::iterator cur(mList.begin());
-    LIST::iterator end(mList.end());
-    while (cur != end) {
-        if (*node < **cur) {
-            mList.insert(cur, node);
-            return;
-        }
-        ++cur;
-    }
-    mList.insert(++end, node);
-}
-
-void MessageList::remove(MessageList::LIST::iterator pos)
-{
-    mList.erase(pos);
-}
-
-MessageQueue::MessageQueue()
-    : mInvalidate(false)
-{
-    mInvalidateMessage = new MessageBase(INVALIDATE);
-}
-
-MessageQueue::~MessageQueue()
-{
-}
-
-sp<MessageBase> MessageQueue::waitMessage(nsecs_t timeout)
-{
-    sp<MessageBase> result;
-
-    bool again;
-    do {
-        const nsecs_t timeoutTime = systemTime() + timeout;
-        while (true) {
-            Mutex::Autolock _l(mLock);
-            nsecs_t now = systemTime();
-            nsecs_t nextEventTime = -1;
-
-            LIST::iterator cur(mMessages.begin());
-            if (cur != mMessages.end()) {
-                result = *cur;
-            }
-
-            if (result != 0) {
-                if (result->when <= now) {
-                    // there is a message to deliver
-                    mMessages.remove(cur);
-                    break;
-                }
-                nextEventTime = result->when;
-                result = 0;
-            }
-
-            // see if we have an invalidate message
-            if (mInvalidate) {
-                mInvalidate = false;
-                mInvalidateMessage->when = now;
-                result = mInvalidateMessage;
-                break;
-            }
-
-            if (timeout >= 0) {
-                if (timeoutTime < now) {
-                    // we timed-out, return a NULL message
-                    result = 0;
-                    break;
-                }
-                if (nextEventTime > 0) {
-                    if (nextEventTime > timeoutTime) {
-                        nextEventTime = timeoutTime;
-                    }
-                } else {
-                    nextEventTime = timeoutTime;
-                }
-            }
-
-            if (nextEventTime >= 0) {
-                //ALOGD("nextEventTime = %lld ms", nextEventTime);
-                if (nextEventTime > 0) {
-                    // we're about to wait, flush the binder command buffer
-                    IPCThreadState::self()->flushCommands();
-                    const nsecs_t reltime = nextEventTime - systemTime();
-                    if (reltime > 0) {
-                        mCondition.waitRelative(mLock, reltime);
-                    }
-                }
-            } else {
-                //ALOGD("going to wait");
-                // we're about to wait, flush the binder command buffer
-                IPCThreadState::self()->flushCommands();
-                mCondition.wait(mLock);
-            }
-        }
-        // here we're not holding the lock anymore
-
-        if (result == 0)
-            break;
-
-        again = result->handler();
-        if (again) {
-            // the message has been processed. release our reference to it
-            // without holding the lock.
-            result->notify();
-            result = 0;
-        }
-    } while (again);
-
-    return result;
-}
-
-status_t MessageQueue::postMessage(
-        const sp<MessageBase>& message, nsecs_t relTime, uint32_t flags)
-{
-    return queueMessage(message, relTime, flags);
-}
-
-status_t MessageQueue::invalidate() {
-    Mutex::Autolock _l(mLock);
-    mInvalidate = true;
-    mCondition.signal();
-    return NO_ERROR;
-}
-
-status_t MessageQueue::queueMessage(
-        const sp<MessageBase>& message, nsecs_t relTime, uint32_t flags)
-{
-    Mutex::Autolock _l(mLock);
-    message->when = systemTime() + relTime;
-    mMessages.insert(message);
-
-    //ALOGD("MessageQueue::queueMessage time = %lld ms", message->when);
-    //dumpLocked(message);
-
-    mCondition.signal();
-    return NO_ERROR;
-}
-
-void MessageQueue::dump(const sp<MessageBase>& message)
-{
-    Mutex::Autolock _l(mLock);
-    dumpLocked(message);
-}
-
-void MessageQueue::dumpLocked(const sp<MessageBase>& message)
-{
-    LIST::const_iterator cur(mMessages.begin());
-    LIST::const_iterator end(mMessages.end());
-    int c = 0;
-    while (cur != end) {
-        const char tick = (*cur == message) ? '>' : ' ';
-        ALOGD("%c %d: msg{.what=%08x, when=%lld}",
-                tick, c, (*cur)->what, (*cur)->when);
-        ++cur;
-        c++;
-    }
-}
-
-}; // namespace android
diff --git a/exynos5/hal/libhdmi/libhdmiservice/MessageQueue.h b/exynos5/hal/libhdmi/libhdmiservice/MessageQueue.h
deleted file mode 100644
index 4fc752f..0000000
--- a/exynos5/hal/libhdmi/libhdmiservice/MessageQueue.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_MESSAGE_QUEUE_H
-#define ANDROID_MESSAGE_QUEUE_H
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/types.h>
-
-#include <utils/threads.h>
-#include <utils/Timers.h>
-#include <utils/List.h>
-
-#include "Barrier.h"
-
-namespace android {
-
-class MessageBase;
-
-class MessageList
-{
-    List< sp<MessageBase> > mList;
-    typedef List< sp<MessageBase> > LIST;
-public:
-    inline LIST::iterator begin()                { return mList.begin(); }
-    inline LIST::const_iterator begin() const    { return mList.begin(); }
-    inline LIST::iterator end()                  { return mList.end(); }
-    inline LIST::const_iterator end() const      { return mList.end(); }
-    inline bool isEmpty() const { return mList.empty(); }
-    void insert(const sp<MessageBase>& node);
-    void remove(LIST::iterator pos);
-};
-
-class MessageBase :
-    public LightRefBase<MessageBase>
-{
-public:
-    nsecs_t     when;
-    uint32_t    what;
-    int32_t     arg0;
-
-    MessageBase() : when(0), what(0), arg0(0) { }
-    MessageBase(uint32_t what, int32_t arg0=0)
-        : when(0), what(what), arg0(arg0) { }
-
-    // return true if message has a handler
-    virtual bool handler() { return false; }
-
-    // waits for the handler to be processed
-    void wait() const { barrier.wait(); }
-
-    // releases all waiters. this is done automatically if
-    // handler returns true
-    void notify() const { barrier.open(); }
-
-protected:
-    virtual ~MessageBase() { }
-
-private:
-    mutable Barrier barrier;
-    friend class LightRefBase<MessageBase>;
-};
-
-inline bool operator < (const MessageBase& lhs, const MessageBase& rhs) {
-    return lhs.when < rhs.when;
-}
-
-class MessageQueue
-{
-    typedef List< sp<MessageBase> > LIST;
-public:
-
-    MessageQueue();
-    ~MessageQueue();
-
-    // pre-defined messages
-    enum {
-        INVALIDATE = '_upd'
-    };
-
-    sp<MessageBase> waitMessage(nsecs_t timeout = -1);
-
-    status_t postMessage(const sp<MessageBase>& message,
-            nsecs_t reltime=0, uint32_t flags = 0);
-
-    status_t invalidate();
-
-    void dump(const sp<MessageBase>& message);
-
-private:
-    status_t queueMessage(const sp<MessageBase>& message,
-            nsecs_t reltime, uint32_t flags);
-    void dumpLocked(const sp<MessageBase>& message);
-
-    Mutex           mLock;
-    Condition       mCondition;
-    MessageList     mMessages;
-    bool            mInvalidate;
-    sp<MessageBase> mInvalidateMessage;
-};
-
-}; // namespace android
-
-#endif /* ANDROID_MESSAGE_QUEUE_H */
diff --git a/exynos5/hal/libhdmi/libhdmiservice/SecHdmiClient.cpp b/exynos5/hal/libhdmi/libhdmiservice/SecHdmiClient.cpp
deleted file mode 100644
index 21cac99..0000000
--- a/exynos5/hal/libhdmi/libhdmiservice/SecHdmiClient.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
-**
-** Copyright 2008, The Android Open Source Project
-** Copyright 2010, Samsung Electronics Co. LTD
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-/*
-**
-** @author  Taikyung, Yu(taikyung.yu@samsung.com)
-** @date    2011-07-06
-*/
-
-#define LOG_TAG "libhdmiclient"
-
-#include "SecHdmiClient.h"
-
-namespace android {
-
-static sp<ISecTVOut> g_SecTVOutService = 0;
-
-SecHdmiClient::SecHdmiClient()
-{
-    g_SecTVOutService = m_getSecTVOutService();
-}
-
-SecHdmiClient::~SecHdmiClient()
-{
-}
-
-SecHdmiClient * SecHdmiClient::getInstance(void)
-{
-    static SecHdmiClient singleton;
-    return &singleton;
-}
-
-void SecHdmiClient::setHdmiCableStatus(int status)
-{
-    ALOGD("%s HDMI status: %d\n", __func__, status);
-
-    if (g_SecTVOutService != 0)
-        g_SecTVOutService->setHdmiCableStatus(status);
-}
-
-void SecHdmiClient::setHdmiMode(int mode)
-{
-    //ALOGD("%s HDMI Mode: %d\n", __func__, mode);
-
-    if (g_SecTVOutService != 0)
-        g_SecTVOutService->setHdmiMode(mode);
-}
-
-void SecHdmiClient::setHdmiResolution(int resolution)
-{
-    //ALOGD("%s HDMI Resolution: %d\n", __func__, resolution);
-
-    if (g_SecTVOutService != 0)
-        g_SecTVOutService->setHdmiResolution(resolution);
-}
-
-void SecHdmiClient::setHdmiHdcp(int enHdcp)
-{
-    //ALOGD("%s HDMI HDCP: %d\n", __func__, enHdcp);
-
-    if (g_SecTVOutService != 0)
-        g_SecTVOutService->setHdmiHdcp(enHdcp);
-}
-
-void SecHdmiClient::setHdmiRotate(int rotVal, uint32_t hwcLayer)
-{
-    //ALOGD("%s HDMI ROTATE: %d\n", __func__, rotVal);
-
-    if (g_SecTVOutService != 0)
-        g_SecTVOutService->setHdmiRotate(rotVal, hwcLayer);
-}
-
-void SecHdmiClient::setHdmiHwcLayer(uint32_t hwcLayer)
-{
-    //ALOGD("%s HDMI HWCLAYER: %d\n", __func__, hwcLayer);
-
-    if (g_SecTVOutService != 0)
-        g_SecTVOutService->setHdmiHwcLayer(hwcLayer);
-}
-
-void SecHdmiClient::blit2Hdmi(uint32_t w, uint32_t h,
-                                uint32_t colorFormat,
-                                uint32_t physYAddr,
-                                uint32_t physCbAddr,
-                                uint32_t physCrAddr,
-                                uint32_t dstX,
-                                uint32_t dstY,
-                                uint32_t hdmiLayer,
-                                uint32_t num_of_hwc_layer)
-{
-    if (g_SecTVOutService != 0 )
-        g_SecTVOutService->blit2Hdmi(w, h, colorFormat, physYAddr, physCbAddr, physCrAddr, dstX, dstY, hdmiLayer, num_of_hwc_layer);
-}
-
-sp<ISecTVOut> SecHdmiClient::m_getSecTVOutService(void)
-{
-    int ret = 0;
-
-    if (g_SecTVOutService == 0) {
-        sp<IBinder> binder;
-        sp<ISecTVOut> sc;
-        sp<IServiceManager> sm = defaultServiceManager();
-        int getSvcTimes = 0;
-        for(getSvcTimes = 0; getSvcTimes < GETSERVICETIMEOUT; getSvcTimes++) {
-            binder = sm->getService(String16("SecTVOutService"));
-            if (binder == 0) {
-                ALOGW("SecTVOutService not published, waiting...");
-                usleep(500000); // 0.5 s
-            } else {
-                break;
-            }
-        }
-        // grab the lock again for updating g_surfaceFlinger
-        if (getSvcTimes < GETSERVICETIMEOUT) {
-            sc = interface_cast<ISecTVOut>(binder);
-            g_SecTVOutService = sc;
-        } else {
-            ALOGW("Failed to get SecTVOutService... SecHdmiClient will get it later..");
-        }
-    }
-    return g_SecTVOutService;
-}
-
-}
diff --git a/exynos5/hal/libhdmi/libhdmiservice/SecHdmiClient.h b/exynos5/hal/libhdmi/libhdmiservice/SecHdmiClient.h
deleted file mode 100644
index e94e19a..0000000
--- a/exynos5/hal/libhdmi/libhdmiservice/SecHdmiClient.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
-**
-** Copyright 2008, The Android Open Source Project
-** Copyright 2010, Samsung Electronics Co. LTD
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-/*
-**
-** @author  Taikyung, Yu(taikyung.yu@samsung.com)
-** @date    2011-07-06
-*/
-
-#ifndef __SEC_HDMI_CLIENT_H__
-#define __SEC_HDMI_CLIENT_H__
-
-#include "utils/Log.h"
-
-#include <linux/errno.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <utils/RefBase.h>
-#include <cutils/log.h>
-#include <binder/IBinder.h>
-#include <binder/IServiceManager.h>
-#include <surfaceflinger/ISurfaceComposer.h>
-#include <surfaceflinger/SurfaceComposerClient.h>
-#include "ISecTVOut.h"
-
-#define GETSERVICETIMEOUT (5)
-
-namespace android {
-
-class SecHdmiClient
-{
-public:
-    enum HDMI_MODE
-    {
-        HDMI_MODE_NONE = 0,
-        HDMI_MODE_UI,
-        HDMI_MODE_VIDEO,
-    };
-
-private:
-    SecHdmiClient();
-    virtual ~SecHdmiClient();
-
-public:
-        static SecHdmiClient * getInstance(void);
-        void setHdmiCableStatus(int status);
-        void setHdmiMode(int mode);
-        void setHdmiResolution(int resolution);
-        void setHdmiHdcp(int enHdcp);
-        void setHdmiRotate(int rotVal, uint32_t hwcLayer);
-        void setHdmiHwcLayer(uint32_t hwcLayer);
-        virtual void blit2Hdmi(uint32_t w, uint32_t h,
-                                        uint32_t colorFormat,
-                                        uint32_t physYAddr,
-                                        uint32_t physCbAddr,
-                                        uint32_t physCrAddr,
-                                        uint32_t dstX,
-                                        uint32_t dstY,
-                                        uint32_t hdmiLayer,
-                                        uint32_t num_of_hwc_layer);
-
-private:
-        sp<ISecTVOut> m_getSecTVOutService(void);
-
-};
-
-};
-
-#endif
diff --git a/exynos5/hal/libhdmi/libhdmiservice/SecTVOutService.cpp b/exynos5/hal/libhdmi/libhdmiservice/SecTVOutService.cpp
deleted file mode 100644
index 453cf70..0000000
--- a/exynos5/hal/libhdmi/libhdmiservice/SecTVOutService.cpp
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
-**
-** Copyright 2008, The Android Open Source Project
-** Copyright 2010, Samsung Electronics Co. LTD
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-/*
-**
-** @author  Taikyung, Yu(taikyung.yu@samsung.com)
-** @date    2011-07-06
-*/
-
-#define LOG_TAG "SecTVOutService"
-
-#include <binder/IServiceManager.h>
-#include <utils/RefBase.h>
-#include <binder/IInterface.h>
-#include <binder/Parcel.h>
-#include <utils/Log.h>
-#include "SecTVOutService.h"
-#include <linux/fb.h>
-
-namespace android {
-#define DEFAULT_LCD_WIDTH               1280
-#define DEFAULT_LCD_HEIGHT              800
-
-#define DIRECT_VIDEO_RENDERING          (1)
-#define DIRECT_UI_RENDERING             (0)
-
-    enum {
-        SET_HDMI_STATUS = IBinder::FIRST_CALL_TRANSACTION,
-        SET_HDMI_MODE,
-        SET_HDMI_RESOLUTION,
-        SET_HDMI_HDCP,
-        SET_HDMI_ROTATE,
-        SET_HDMI_HWCLAYER,
-        BLIT_2_HDMI
-    };
-
-    int SecTVOutService::HdmiFlushThread()
-    {
-        while (!mExitHdmiFlushThread) {
-            nsecs_t timeout = -1;
-            sp<MessageBase> msg = mHdmiEventQueue.waitMessage(timeout);
-        }
-
-        return 0;
-    }
-
-    int SecTVOutService::instantiate()
-    {
-        ALOGD("SecTVOutService instantiate");
-        int r = defaultServiceManager()->addService(String16( "SecTVOutService"), new SecTVOutService ());
-        ALOGD("SecTVOutService r=%d", r);
-
-        return r;
-    }
-
-    SecTVOutService::SecTVOutService () {
-        ALOGV("SecTVOutService created");
-        mHdmiCableInserted = false;
-#ifdef SUPPORT_G2D_UI_MODE
-        mUILayerMode = SecHdmi::HDMI_LAYER_GRAPHIC_1;
-#else
-        mUILayerMode = SecHdmi::HDMI_LAYER_VIDEO;
-#endif
-        mHwcLayer = 0;
-        mExitHdmiFlushThread = false;
-
-        setLCDsize();
-        if (mSecHdmi.create(mLCD_width, mLCD_height) == false)
-            ALOGE("%s::mSecHdmi.create() fail", __func__);
-        else
-            setHdmiStatus(1);
-
-        mHdmiFlushThread = new HDMIFlushThread(this);
-    }
-
-    void SecTVOutService::setLCDsize(void) {
-            char const * const device_template[] = {
-                "/dev/graphics/fb%u",
-                "/dev/fb%u",
-                0 };
-
-            int fd = -1;
-            int i = 0;
-            char name[64];
-
-            while ((fd==-1) && device_template[i]) {
-                snprintf(name, 64, device_template[i], 0);
-                fd = open(name, O_RDWR, 0);
-                i++;
-            }
-            if (fd > 0) {
-                struct fb_var_screeninfo info;
-                if (ioctl(fd, FBIOGET_VSCREENINFO, &info) != -1) {
-                    mLCD_width  = info.xres;
-                    mLCD_height = info.yres;
-                } else {
-                    mLCD_width  = DEFAULT_LCD_WIDTH;
-                    mLCD_height = DEFAULT_LCD_HEIGHT;
-                }
-                close(fd);
-            }
-            return;
-    }
-
-    SecTVOutService::~SecTVOutService () {
-        ALOGV ("SecTVOutService destroyed");
-
-        if (mHdmiFlushThread != NULL) {
-            mHdmiFlushThread->requestExit();
-            mExitHdmiFlushThread = true;
-            mHdmiFlushThread->requestExitAndWait();
-            mHdmiFlushThread.clear();
-        }
-    }
-
-    status_t SecTVOutService::onTransact(uint32_t code, const Parcel & data, Parcel * reply, uint32_t flags)
-    {
-        switch (code) {
-        case SET_HDMI_STATUS: {
-            int status = data.readInt32();
-            setHdmiStatus(status);
-        } break;
-
-        case SET_HDMI_MODE: {
-            int mode = data.readInt32();
-            setHdmiMode(mode);
-        } break;
-
-        case SET_HDMI_RESOLUTION: {
-            int resolution = data.readInt32();
-            setHdmiResolution(resolution);
-        } break;
-
-        case SET_HDMI_HDCP: {
-            int enHdcp = data.readInt32();
-            setHdmiHdcp(enHdcp);
-        } break;
-
-        case SET_HDMI_ROTATE: {
-            int rotVal = data.readInt32();
-            int hwcLayer = data.readInt32();
-            setHdmiRotate(rotVal, hwcLayer);
-        } break;
-
-        case SET_HDMI_HWCLAYER: {
-            int hwcLayer = data.readInt32();
-            setHdmiHwcLayer((uint32_t)hwcLayer);
-        } break;
-
-        case BLIT_2_HDMI: {
-            uint32_t w = data.readInt32();
-            uint32_t h = data.readInt32();
-            uint32_t colorFormat = data.readInt32();
-            uint32_t physYAddr  = data.readInt32();
-            uint32_t physCbAddr = data.readInt32();
-            uint32_t physCrAddr = data.readInt32();
-            uint32_t dstX   = data.readInt32();
-            uint32_t dstY   = data.readInt32();
-            uint32_t hdmiLayer   = data.readInt32();
-            uint32_t num_of_hwc_layer = data.readInt32();
-
-            blit2Hdmi(w, h, colorFormat, physYAddr, physCbAddr, physCrAddr, dstX, dstY, hdmiLayer, num_of_hwc_layer);
-        } break;
-
-        default :
-            ALOGE ( "onTransact::default");
-            return BBinder::onTransact (code, data, reply, flags);
-        }
-
-        return NO_ERROR;
-    }
-
-    void SecTVOutService::setHdmiStatus(uint32_t status)
-    {
-        ALOGD("%s HDMI cable status = %d", __func__, status);
-        {
-            Mutex::Autolock _l(mLock);
-
-            bool hdmiCableInserted = (bool)status;
-
-            if (mHdmiCableInserted == hdmiCableInserted)
-                return;
-
-            if (hdmiCableInserted == true) {
-                if (mSecHdmi.connect() == false) {
-                    ALOGE("%s::mSecHdmi.connect() fail", __func__);
-                    hdmiCableInserted = false;
-                }
-            } else {
-                if (mSecHdmi.disconnect() == false)
-                    ALOGE("%s::mSecHdmi.disconnect() fail", __func__);
-            }
-
-            mHdmiCableInserted = hdmiCableInserted;
-        }
-
-        if (hdmiCableInserted() == true)
-            this->blit2Hdmi(mLCD_width, mLCD_height, HAL_PIXEL_FORMAT_BGRA_8888, 0, 0, 0, 0, 0, HDMI_MODE_UI, 0);
-    }
-
-    void SecTVOutService::setHdmiMode(uint32_t mode)
-    {
-        ALOGD("%s TV mode = %d", __func__, mode);
-        Mutex::Autolock _l(mLock);
-
-        if ((hdmiCableInserted() == true) && (mSecHdmi.setHdmiOutputMode(mode)) == false) {
-            ALOGE("%s::mSecHdmi.setHdmiOutputMode() fail", __func__);
-            return;
-        }
-    }
-
-    void SecTVOutService::setHdmiResolution(uint32_t resolution)
-    {
-        ALOGD("%s TV resolution = %d", __func__, resolution);
-        Mutex::Autolock _l(mLock);
-
-        if ((hdmiCableInserted() == true) && (mSecHdmi.setHdmiResolution(resolution)) == false) {
-            ALOGE("%s::mSecHdmi.setHdmiResolution() fail", __func__);
-            return;
-        }
-    }
-
-    void SecTVOutService::setHdmiHdcp(uint32_t hdcp_en)
-    {
-        ALOGD("%s TV HDCP = %d", __func__, hdcp_en);
-        Mutex::Autolock _l(mLock);
-
-        if ((hdmiCableInserted() == true) && (mSecHdmi.setHdcpMode(hdcp_en)) == false) {
-            ALOGE("%s::mSecHdmi.setHdcpMode() fail", __func__);
-            return;
-        }
-    }
-
-    void SecTVOutService::setHdmiRotate(uint32_t rotVal, uint32_t hwcLayer)
-    {
-        //ALOGD("%s TV ROTATE = %d", __func__, rotVal);
-        Mutex::Autolock _l(mLock);
-
-        if ((hdmiCableInserted() == true) && (mSecHdmi.setUIRotation(rotVal, hwcLayer)) == false) {
-            ALOGE("%s::mSecHdmi.setUIRotation() fail", __func__);
-            return;
-        }
-    }
-
-    void SecTVOutService::setHdmiHwcLayer(uint32_t hwcLayer)
-    {
-        //ALOGD("%s TV HWCLAYER = %d", __func__, hwcLayer);
-        Mutex::Autolock _l(mLock);
-
-        mHwcLayer = hwcLayer;
-        return;
-    }
-
-    void SecTVOutService::blit2Hdmi(uint32_t w, uint32_t h, uint32_t colorFormat,
-                                 uint32_t pPhyYAddr, uint32_t pPhyCbAddr, uint32_t pPhyCrAddr,
-                                 uint32_t dstX, uint32_t dstY,
-                                 uint32_t hdmiMode,
-                                 uint32_t num_of_hwc_layer)
-    {
-        Mutex::Autolock _l(mLock);
-
-        if (hdmiCableInserted() == false)
-            return;
-
-        int hdmiLayer = SecHdmi::HDMI_LAYER_VIDEO;
-#if defined(CHECK_UI_TIME) || defined(CHECK_VIDEO_TIME)
-        nsecs_t start, end;
-#endif
-
-        sp<MessageBase> msg;
-
-        switch (hdmiMode) {
-        case HDMI_MODE_UI :
-            if (mHwcLayer >= 2)
-                hdmiLayer = SecHdmi::HDMI_LAYER_GRAPHIC_0;
-            else if (mHwcLayer == 1)
-                hdmiLayer = SecHdmi::HDMI_LAYER_GRAPHIC_1;
-            else
-#ifdef SUPPORT_G2D_UI_MODE
-                hdmiLayer = SecHdmi::HDMI_LAYER_GRAPHIC_1;
-#else
-                hdmiLayer = SecHdmi::HDMI_LAYER_VIDEO;
-#endif
-
-            if (mHwcLayer == 0) {
-                for (int layer = SecHdmi::HDMI_LAYER_BASE + 1; layer < SecHdmi::HDMI_LAYER_MAX; layer++) {
-                    if (layer != mUILayerMode) {
-                        if (mSecHdmi.clear(layer) == false)
-                            ALOGE("%s::mSecHdmi.clear(%d) fail", __func__, layer);
-                    }
-                }
-            }
-
-            if (mUILayerMode != hdmiLayer) {
-                if (mSecHdmi.clear(mUILayerMode) == false)
-                    ALOGE("%s::mSecHdmi.clear(%d) fail", __func__, mUILayerMode);
-            }
-
-            mUILayerMode = hdmiLayer;
-
-#if !defined(BOARD_USES_HDMI_SUBTITLES)
-            if (mHwcLayer == 0)
-#endif
-#if (DIRECT_UI_RENDERING == 1)
-            {
-#ifdef CHECK_UI_TIME
-                start = systemTime();
-#endif
-                if (mSecHdmi.flush(w, h, colorFormat, pPhyYAddr, pPhyCbAddr, pPhyCrAddr, dstX, dstY,
-                                    mUILayerMode, mHwcLayer) == false)
-                    ALOGE("%s::mSecHdmi.flush() on HDMI_MODE_UI fail", __func__);
-#ifdef CHECK_UI_TIME
-                end = systemTime();
-                ALOGD("[UI] mSecHdmi.flush[end-start] = %ld ms", long(ns2ms(end)) - long(ns2ms(start)));
-#endif
-            }
-#else
-            {
-                msg = new SecHdmiEventMsg(&mSecHdmi, w, h, colorFormat, pPhyYAddr, pPhyCbAddr, pPhyCrAddr,
-                                            dstX, dstY, mUILayerMode, mHwcLayer, HDMI_MODE_UI);
-
-                /* post to HdmiEventQueue */
-                mHdmiEventQueue.postMessage(msg, 0, 0);
-            }
-#endif
-            break;
-
-        case HDMI_MODE_VIDEO :
-#if (DIRECT_VIDEO_RENDERING == 1)
-#ifdef CHECK_VIDEO_TIME
-            start = systemTime();
-#endif
-            if (mSecHdmi.flush(w, h, colorFormat, pPhyYAddr, pPhyCbAddr, pPhyCrAddr, dstX, dstY,
-                                SecHdmi::HDMI_LAYER_VIDEO, mHwcLayer) == false)
-                ALOGE("%s::mSecHdmi.flush() on HDMI_MODE_VIDEO fail", __func__);
-#ifdef CHECK_VIDEO_TIME
-            end = systemTime();
-            ALOGD("[Video] mSecHdmi.flush[end-start] = %ld ms", long(ns2ms(end)) - long(ns2ms(start)));
-#endif
-#else
-            msg = new SecHdmiEventMsg(&mSecHdmi, w, h, colorFormat, pPhyYAddr, pPhyCbAddr, pPhyCrAddr,
-                                        dstX, dstY, SecHdmi::HDMI_LAYER_VIDEO, mHwcLayer, HDMI_MODE_VIDEO);
-
-            /* post to HdmiEventQueue */
-            mHdmiEventQueue.postMessage(msg, 0, 0);
-#endif
-            break;
-
-        default:
-            ALOGE("unmatched HDMI_MODE : %d", hdmiMode);
-            break;
-        }
-
-        return;
-    }
-
-    bool SecTVOutService::hdmiCableInserted(void)
-    {
-        return mHdmiCableInserted;
-    }
-
-}
diff --git a/exynos5/hal/libhdmi/libhdmiservice/SecTVOutService.h b/exynos5/hal/libhdmi/libhdmiservice/SecTVOutService.h
deleted file mode 100644
index e6616a2..0000000
--- a/exynos5/hal/libhdmi/libhdmiservice/SecTVOutService.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
-**
-** Copyright 2008, The Android Open Source Project
-** Copyright 2010, Samsung Electronics Co. LTD
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-**     http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-
-/*
-**
-** @author  Taikyung, Yu(taikyung.yu@samsung.com)
-** @date    2011-07-06
-*/
-
-#ifndef SECTVOUTSERVICE_H
-#define SECTVOUTSERVICE_H
-
-#include <stdint.h>
-#include <sys/types.h>
-#include <binder/Parcel.h>
-#include <utils/KeyedVector.h>
-
-#include "ISecTVOut.h"
-#include "SecHdmi.h"
-#include "sec_format.h"
-#include "sec_utils_v4l2.h"
-#include "MessageQueue.h"
-
-namespace android {
-//#define CHECK_VIDEO_TIME
-//#define CHECK_UI_TIME
-
-    class SecTVOutService : public BBinder
-    {
-        public :
-            enum {
-                HDMI_MODE_NONE = 0,
-                HDMI_MODE_UI,
-                HDMI_MODE_VIDEO,
-            };
-
-            mutable Mutex mLock;
-
-            class HDMIFlushThread : public Thread {
-                SecTVOutService *mTVOutService;
-            public:
-                HDMIFlushThread(SecTVOutService *service):
-                Thread(false),
-                mTVOutService(service) { }
-                virtual void onFirstRef() {
-                    run("HDMIFlushThread", PRIORITY_URGENT_DISPLAY);
-                }
-                virtual bool threadLoop() {
-                    mTVOutService->HdmiFlushThread();
-                    return false;
-                }
-            };
-
-            sp<HDMIFlushThread> mHdmiFlushThread;
-            int                 HdmiFlushThread();
-
-            mutable MessageQueue    mHdmiEventQueue;
-            bool                mExitHdmiFlushThread;
-
-            SecTVOutService();
-            static int instantiate ();
-            virtual status_t onTransact(uint32_t, const Parcel &, Parcel *, uint32_t);
-            virtual ~SecTVOutService ();
-
-            virtual void                        setHdmiStatus(uint32_t status);
-            virtual void                        setHdmiMode(uint32_t mode);
-            virtual void                        setHdmiResolution(uint32_t resolution);
-            virtual void                        setHdmiHdcp(uint32_t enHdcp);
-            virtual void                        setHdmiRotate(uint32_t rotVal, uint32_t hwcLayer);
-            virtual void                        setHdmiHwcLayer(uint32_t hwcLayer);
-            virtual void                        blit2Hdmi(uint32_t w, uint32_t h,
-                                                uint32_t colorFormat,
-                                                uint32_t pPhyYAddr, uint32_t pPhyCbAddr, uint32_t pPhyCrAddr,
-                                                uint32_t dstX, uint32_t dstY,
-                                                uint32_t hdmiMode, uint32_t num_of_hwc_layer);
-            bool                                hdmiCableInserted(void);
-            void                                setLCDsize(void);
-
-        private:
-            SecHdmi                     mSecHdmi;
-            bool                        mHdmiCableInserted;
-            int                         mUILayerMode;
-            uint32_t                    mLCD_width, mLCD_height;
-            uint32_t                    mHwcLayer;
-    };
-
-    class SecHdmiEventMsg : public MessageBase {
-        public:
-            enum {
-                HDMI_MODE_NONE = 0,
-                HDMI_MODE_UI,
-                HDMI_MODE_VIDEO,
-            };
-
-            mutable     Mutex mBlitLock;
-
-            SecHdmi     *pSecHdmi;
-            uint32_t                    mSrcWidth, mSrcHeight;
-            uint32_t                    mSrcColorFormat;
-            uint32_t                    mSrcYAddr, mSrcCbAddr, mSrcCrAddr;
-            uint32_t                    mDstX, mDstY;
-            uint32_t                    mHdmiMode;
-            uint32_t    mHdmiLayer, mHwcLayer;
-
-            SecHdmiEventMsg(SecHdmi *SecHdmi, uint32_t srcWidth, uint32_t srcHeight, uint32_t srcColorFormat,
-                    uint32_t srcYAddr, uint32_t srcCbAddr, uint32_t srcCrAddr,
-                    uint32_t dstX, uint32_t dstY, uint32_t hdmiLayer, uint32_t hwcLayer, uint32_t hdmiMode)
-                : pSecHdmi(SecHdmi), mSrcWidth(srcWidth), mSrcHeight(srcHeight), mSrcColorFormat(srcColorFormat),
-                mSrcYAddr(srcYAddr), mSrcCbAddr(srcCbAddr), mSrcCrAddr(srcCrAddr),
-                mDstX(dstX), mDstY(dstY), mHdmiLayer(hdmiLayer), mHwcLayer(hwcLayer), mHdmiMode(hdmiMode) {
-            }
-
-            virtual bool handler() {
-                Mutex::Autolock _l(mBlitLock);
-                bool ret = true;
-#if defined(CHECK_UI_TIME) || defined(CHECK_VIDEO_TIME)
-                nsecs_t start, end;
-#endif
-
-                switch (mHdmiMode) {
-                case HDMI_MODE_UI:
-#ifdef CHECK_UI_TIME
-                    start = systemTime();
-#endif
-                    if (pSecHdmi->flush(mSrcWidth, mSrcHeight, mSrcColorFormat, mSrcYAddr, mSrcCbAddr, mSrcCrAddr,
-                                mDstX, mDstY, mHdmiLayer, mHwcLayer) == false) {
-                        ALOGE("%s::pSecHdmi->flush() fail on HDMI_MODE_UI", __func__);
-                        ret = false;
-                    }
-
-#ifdef CHECK_UI_TIME
-                    end = systemTime();
-                    ALOGD("[UI] pSecHdmi->flush[end-start] = %ld ms", long(ns2ms(end)) - long(ns2ms(start)));
-#endif
-                    break;
-                case HDMI_MODE_VIDEO:
-#ifdef CHECK_VIDEO_TIME
-                    start = systemTime();
-#endif
-                    if (pSecHdmi->flush(mSrcWidth, mSrcHeight, mSrcColorFormat, mSrcYAddr, mSrcCbAddr, mSrcCrAddr,
-                                mDstX, mDstY, mHdmiLayer, mHwcLayer) == false) {
-                        ALOGE("%s::pSecHdmi->flush() fail on HDMI_MODE_VIDEO", __func__);
-                        ret = false;
-                    }
-#ifdef CHECK_VIDEO_TIME
-                    end = systemTime();
-                    ALOGD("[VIDEO] pSecHdmi->flush[end-start] = %ld ms", long(ns2ms(end)) - long(ns2ms(start)));
-#endif
-                    break;
-                default:
-                    ALOGE("Undefined HDMI_MODE");
-                    ret = false;
-                    break;
-                }
-                return ret;
-            }
-    };
-
-};
-#endif
diff --git a/exynos5/hal/libhdmi/libsForhdmi/Android.mk b/exynos5/hal/libhdmi/libsForhdmi/Android.mk
deleted file mode 100644
index 9acbc52..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-ifeq ($(filter-out exynos5,$(TARGET_BOARD_PLATFORM)),)
-include $(all-subdir-makefiles)
-endif
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libcec/Android.mk b/exynos5/hal/libhdmi/libsForhdmi/libcec/Android.mk
deleted file mode 100644
index 9a4b721..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libcec/Android.mk
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-ifeq ($(BOARD_USES_HDMI),true)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := eng
-
-LOCAL_PRELINK_MODULE := false
-LOCAL_SHARED_LIBRARIES := liblog
-LOCAL_SRC_FILES := libcec.c
-
-LOCAL_C_INCLUDES := \
-	$(LOCAL_PATH) \
-	$(LOCAL_PATH)/../../../include
-
-LOCAL_MODULE := libcec
-include $(BUILD_SHARED_LIBRARY)
-
-endif
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libcec/cec.h b/exynos5/hal/libhdmi/libsForhdmi/libcec/cec.h
deleted file mode 100644
index 4b0d3af..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libcec/cec.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef _LINUX_CEC_H_
-#define _LINUX_CEC_H_
-
-#define CEC_IOC_MAGIC        'c'
-
-/**
- * CEC device request code to set logical address.
- */
-#define CEC_IOC_SETLADDR     _IOW(CEC_IOC_MAGIC, 0, unsigned int)
-
-#endif /* _LINUX_CEC_H_ */
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libcec/libcec.c b/exynos5/hal/libhdmi/libsForhdmi/libcec/libcec.c
deleted file mode 100644
index e088346..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libcec/libcec.c
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
-* Copyright@ Samsung Electronics Co. LTD
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <cutils/log.h>
-
-/* drv. header */
-#include "cec.h"
-
-#include "libcec.h"
-
-#define CEC_DEBUG 0
-
-/**
- * @def CEC_DEVICE_NAME
- * Defines simbolic name of the CEC device.
- */
-#define CEC_DEVICE_NAME         "/dev/CEC"
-
-static struct {
-    enum CECDeviceType devtype;
-    unsigned char laddr;
-} laddresses[] = {
-    { CEC_DEVICE_RECODER, 1  },
-    { CEC_DEVICE_RECODER, 2  },
-    { CEC_DEVICE_TUNER,   3  },
-    { CEC_DEVICE_PLAYER,  4  },
-    { CEC_DEVICE_AUDIO,   5  },
-    { CEC_DEVICE_TUNER,   6  },
-    { CEC_DEVICE_TUNER,   7  },
-    { CEC_DEVICE_PLAYER,  8  },
-    { CEC_DEVICE_RECODER, 9  },
-    { CEC_DEVICE_TUNER,   10 },
-    { CEC_DEVICE_PLAYER,  11 },
-};
-
-static int CECSetLogicalAddr(unsigned int laddr);
-
-#ifdef CEC_DEBUG
-inline static void CECPrintFrame(unsigned char *buffer, unsigned int size);
-#endif
-
-static int fd = -1;
-
-/**
- * Open device driver and assign CEC file descriptor.
- *
- * @return  If success to assign CEC file descriptor, return 1; otherwise, return 0.
- */
-int CECOpen()
-{
-    int res = 1;
-
-    if (fd != -1)
-        CECClose();
-
-    if ((fd = open(CEC_DEVICE_NAME, O_RDWR)) < 0) {
-        ALOGE("Can't open %s!\n", CEC_DEVICE_NAME);
-        res = 0;
-    }
-
-    return res;
-}
-
-/**
- * Close CEC file descriptor.
- *
- * @return  If success to close CEC file descriptor, return 1; otherwise, return 0.
- */
-int CECClose()
-{
-    int res = 1;
-
-    if (fd != -1) {
-        if (close(fd) != 0) {
-            ALOGE("close() failed!\n");
-            res = 0;
-        }
-        fd = -1;
-    }
-
-    return res;
-}
-
-/**
- * Allocate logical address.
- *
- * @param paddr   [in] CEC device physical address.
- * @param devtype [in] CEC device type.
- *
- * @return new logical address, or 0 if an arror occured.
- */
-int CECAllocLogicalAddress(int paddr, enum CECDeviceType devtype)
-{
-    unsigned char laddr = CEC_LADDR_UNREGISTERED;
-    int i = 0;
-
-    if (fd == -1) {
-        ALOGE("open device first!\n");
-        return 0;
-    }
-
-    if (CECSetLogicalAddr(laddr) < 0) {
-        ALOGE("CECSetLogicalAddr() failed!\n");
-        return 0;
-    }
-
-    if (paddr == CEC_NOT_VALID_PHYSICAL_ADDRESS)
-        return CEC_LADDR_UNREGISTERED;
-
-    /* send "Polling Message" */
-    while (i < sizeof(laddresses)/sizeof(laddresses[0])) {
-        if (laddresses[i].devtype == devtype) {
-            unsigned char _laddr = laddresses[i].laddr;
-            unsigned char message = ((_laddr << 4) | _laddr);
-            if (CECSendMessage(&message, 1) != 1) {
-                laddr = _laddr;
-                break;
-            }
-        }
-        i++;
-    }
-
-    if (laddr == CEC_LADDR_UNREGISTERED) {
-        ALOGE("All LA addresses in use!!!\n");
-        return CEC_LADDR_UNREGISTERED;
-    }
-
-    if (CECSetLogicalAddr(laddr) < 0) {
-        ALOGE("CECSetLogicalAddr() failed!\n");
-        return 0;
-    }
-
-    /* broadcast "Report Physical Address" */
-    unsigned char buffer[5];
-    buffer[0] = (laddr << 4) | CEC_MSG_BROADCAST;
-    buffer[1] = CEC_OPCODE_REPORT_PHYSICAL_ADDRESS;
-    buffer[2] = (paddr >> 8) & 0xFF;
-    buffer[3] = paddr & 0xFF;
-    buffer[4] = devtype;
-
-    if (CECSendMessage(buffer, 5) != 5) {
-        ALOGE("CECSendMessage() failed!\n");
-        return 0;
-    }
-
-    return laddr;
-}
-
-/**
- * Send CEC message.
- *
- * @param *buffer   [in] pointer to buffer address where message located.
- * @param size      [in] message size.
- *
- * @return number of bytes written, or 0 if an arror occured.
- */
-int CECSendMessage(unsigned char *buffer, int size)
-{
-    if (fd == -1) {
-        ALOGE("open device first!\n");
-        return 0;
-    }
-
-    if (size > CEC_MAX_FRAME_SIZE) {
-        ALOGE("size should not exceed %d\n", CEC_MAX_FRAME_SIZE);
-        return 0;
-    }
-
-#if CEC_DEBUG
-    ALOGI("CECSendMessage() : ");
-    CECPrintFrame(buffer, size);
-#endif
-
-    return write(fd, buffer, size);
-}
-
-/**
- * Receive CEC message.
- *
- * @param *buffer   [in] pointer to buffer address where message will be stored.
- * @param size      [in] buffer size.
- * @param timeout   [in] timeout in microseconds.
- *
- * @return number of bytes received, or 0 if an arror occured.
- */
-int CECReceiveMessage(unsigned char *buffer, int size, long timeout)
-{
-    int bytes = 0;
-    fd_set rfds;
-    struct timeval tv;
-    int retval;
-
-    if (fd == -1) {
-        ALOGE("open device first!\n");
-        return 0;
-    }
-
-    tv.tv_sec = 0;
-    tv.tv_usec = timeout;
-
-    FD_ZERO(&rfds);
-    FD_SET(fd, &rfds);
-
-    retval = select(fd + 1, &rfds, NULL, NULL, &tv);
-
-    if (retval == -1) {
-        return 0;
-    } else if (retval) {
-        bytes = read(fd, buffer, size);
-#if CEC_DEBUG
-        ALOGI("CECReceiveMessage() : size(%d)", bytes);
-        if(bytes > 0)
-            CECPrintFrame(buffer, bytes);
-#endif
-    }
-
-    return bytes;
-}
-
-/**
- * Set CEC logical address.
- *
- * @return 1 if success, otherwise, return 0.
- */
-int CECSetLogicalAddr(unsigned int laddr)
-{
-    if (ioctl(fd, CEC_IOC_SETLADDR, &laddr)) {
-        ALOGE("ioctl(CEC_IOC_SETLA) failed!\n");
-        return 0;
-    }
-
-    return 1;
-}
-
-#if CEC_DEBUG
-/**
- * Print CEC frame.
- */
-void CECPrintFrame(unsigned char *buffer, unsigned int size)
-{
-    if (size > 0) {
-        int i;
-        ALOGI("fsize: %d ", size);
-        ALOGI("frame: ");
-        for (i = 0; i < size; i++)
-            ALOGI("0x%02x ", buffer[i]);
-
-        ALOGI("\n");
-    }
-}
-#endif
-
-/**
- * Check CEC message.
- *
- * @param opcode   [in] pointer to buffer address where message will be stored.
- * @param lsrc     [in] buffer size.
- *
- * @return 1 if message should be ignored, otherwise, return 0.
- */
-//TODO: not finished
-int CECIgnoreMessage(unsigned char opcode, unsigned char lsrc)
-{
-    int retval = 0;
-
-    /* if a message coming from address 15 (unregistered) */
-    if (lsrc == CEC_LADDR_UNREGISTERED) {
-        switch (opcode) {
-        case CEC_OPCODE_DECK_CONTROL:
-        case CEC_OPCODE_PLAY:
-            retval = 1;
-        default:
-            break;
-        }
-    }
-
-    return retval;
-}
-
-/**
- * Check CEC message.
- *
- * @param opcode   [in] pointer to buffer address where message will be stored.
- * @param size     [in] message size.
- *
- * @return 0 if message should be ignored, otherwise, return 1.
- */
-//TODO: not finished
-int CECCheckMessageSize(unsigned char opcode, int size)
-{
-    int retval = 1;
-
-    switch (opcode) {
-    case CEC_OPCODE_REQUEST_ACTIVE_SOURCE:
-        if (size != 1)
-            retval = 0;
-        break;
-    case CEC_OPCODE_SET_SYSTEM_AUDIO_MODE:
-        if (size != 2)
-            retval = 0;
-        break;
-    case CEC_OPCODE_PLAY:
-    case CEC_OPCODE_DECK_CONTROL:
-    case CEC_OPCODE_SET_MENU_LANGUAGE:
-    case CEC_OPCODE_ACTIVE_SOURCE:
-    case CEC_OPCODE_ROUTING_INFORMATION:
-    case CEC_OPCODE_SET_STREAM_PATH:
-        if (size != 3)
-            retval = 0;
-        break;
-    case CEC_OPCODE_FEATURE_ABORT:
-    case CEC_OPCODE_DEVICE_VENDOR_ID:
-    case CEC_OPCODE_REPORT_PHYSICAL_ADDRESS:
-        if (size != 4)
-            retval = 0;
-        break;
-    case CEC_OPCODE_ROUTING_CHANGE:
-        if (size != 5)
-            retval = 0;
-        break;
-    /* CDC - 1.4 */
-    case 0xf8:
-        if (!(size > 5 && size <= 16))
-            retval = 0;
-        break;
-    default:
-        break;
-    }
-
-    return retval;
-}
-
-/**
- * Check CEC message.
- *
- * @param opcode    [in] pointer to buffer address where message will be stored.
- * @param broadcast [in] broadcast/direct message.
- *
- * @return 0 if message should be ignored, otherwise, return 1.
- */
-//TODO: not finished
-int CECCheckMessageMode(unsigned char opcode, int broadcast)
-{
-    int retval = 1;
-
-    switch (opcode) {
-    case CEC_OPCODE_REQUEST_ACTIVE_SOURCE:
-    case CEC_OPCODE_SET_MENU_LANGUAGE:
-    case CEC_OPCODE_ACTIVE_SOURCE:
-        if (!broadcast)
-            retval = 0;
-        break;
-    case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS:
-    case CEC_OPCODE_DECK_CONTROL:
-    case CEC_OPCODE_PLAY:
-    case CEC_OPCODE_FEATURE_ABORT:
-    case CEC_OPCODE_ABORT:
-        if (broadcast)
-            retval = 0;
-        break;
-    default:
-        break;
-    }
-
-    return retval;
-}
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libcec/libcec.h b/exynos5/hal/libhdmi/libsForhdmi/libcec/libcec.h
deleted file mode 100644
index 5bbfc15..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libcec/libcec.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _LIBCEC_H_
-#define _LIBCEC_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** Maximum CEC frame size */
-#define CEC_MAX_FRAME_SIZE                16
-/** Not valid CEC physical address */
-#define CEC_NOT_VALID_PHYSICAL_ADDRESS    0xFFFF
-
-/** CEC broadcast address (as destination address) */
-#define CEC_MSG_BROADCAST        0x0F
-/** CEC unregistered address (as initiator address) */
-#define CEC_LADDR_UNREGISTERED   0x0F
-
-/*
- * CEC Messages
- */
-
-//@{
-/** @name Messages for the One Touch Play Feature */
-#define CEC_OPCODE_ACTIVE_SOURCE            0x82
-#define CEC_OPCODE_IMAGE_VIEW_ON            0x04
-#define CEC_OPCODE_TEXT_VIEW_ON             0x0D
-//@}
-
-//@{
-/** @name Messages for the Routing Control Feature */
-#define CEC_OPCODE_INACTIVE_SOURCE          0x9D
-#define CEC_OPCODE_REQUEST_ACTIVE_SOURCE    0x85
-#define CEC_OPCODE_ROUTING_CHANGE           0x80
-#define CEC_OPCODE_ROUTING_INFORMATION      0x81
-#define CEC_OPCODE_SET_STREAM_PATH          0x86
-//@}
-
-//@{
-/** @name Messages for the Standby Feature */
-#define CEC_OPCODE_STANDBY                  0x36
-//@}
-
-//@{
-/** @name Messages for the One Touch Record Feature */
-#define CEC_OPCODE_RECORD_OFF               0x0B
-#define CEC_OPCODE_RECORD_ON                0x09
-#define CEC_OPCODE_RECORD_STATUS            0x0A
-#define CEC_OPCODE_RECORD_TV_SCREEN         0x0F
-//@}
-
-//@{
-/** @name Messages for the Timer Programming Feature */
-#define CEC_OPCODE_CLEAR_ANALOGUE_TIMER     0x33
-#define CEC_OPCODE_CLEAR_DIGITAL_TIMER      0x99
-#define CEC_OPCODE_CLEAR_EXTERNAL_TIMER     0xA1
-#define CEC_OPCODE_SET_ANALOGUE_TIMER       0x34
-#define CEC_OPCODE_SET_DIGITAL_TIMER        0x97
-#define CEC_OPCODE_SET_EXTERNAL_TIMER       0xA2
-#define CEC_OPCODE_SET_TIMER_PROGRAM_TITLE  0x67
-#define CEC_OPCODE_TIMER_CLEARED_STATUS     0x43
-#define CEC_OPCODE_TIMER_STATUS             0x35
-//@}
-
-//@{
-/** @name Messages for the System Information Feature */
-#define CEC_OPCODE_CEC_VERSION              0x9E
-#define CEC_OPCODE_GET_CEC_VERSION          0x9F
-#define CEC_OPCODE_GIVE_PHYSICAL_ADDRESS    0x83
-#define CEC_OPCODE_GET_MENU_LANGUAGE        0x91
-//#define CEC_OPCODE_POLLING_MESSAGE
-#define CEC_OPCODE_REPORT_PHYSICAL_ADDRESS  0x84
-#define CEC_OPCODE_SET_MENU_LANGUAGE        0x32
-//@}
-
-//@{
-/** @name Messages for the Deck Control Feature */
-#define CEC_OPCODE_DECK_CONTROL             0x42
-#define CEC_OPCODE_DECK_STATUS              0x1B
-#define CEC_OPCODE_GIVE_DECK_STATUS         0x1A
-#define CEC_OPCODE_PLAY                     0x41
-//@}
-
-//@{
-/** @name Messages for the Tuner Control Feature */
-#define CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS 0x08
-#define CEC_OPCODE_SELECT_ANALOGUE_SERVICE  0x92
-#define CEC_OPCODE_SELECT_DIGITAL_SERVICE   0x93
-#define CEC_OPCODE_TUNER_DEVICE_STATUS      0x07
-#define CEC_OPCODE_TUNER_STEP_DECREMENT     0x06
-#define CEC_OPCODE_TUNER_STEP_INCREMENT     0x05
-//@}
-
-//@{
-/** @name Messages for the Vendor Specific Commands Feature */
-#define CEC_OPCODE_DEVICE_VENDOR_ID         0x87
-#define CEC_OPCODE_GET_DEVICE_VENDOR_ID     0x8C
-#define CEC_OPCODE_VENDOR_COMMAND           0x89
-#define CEC_OPCODE_VENDOR_COMMAND_WITH_ID   0xA0
-#define CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN 0x8A
-#define CEC_OPCODE_VENDOR_REMOVE_BUTTON_UP  0x8B
-//@}
-
-//@{
-/** @name Messages for the OSD Display Feature */
-#define CEC_OPCODE_SET_OSD_STRING           0x64
-//@}
-
-//@{
-/** @name Messages for the Device OSD Transfer Feature */
-#define CEC_OPCODE_GIVE_OSD_NAME            0x46
-#define CEC_OPCODE_SET_OSD_NAME             0x47
-//@}
-
-//@{
-/** @name Messages for the Device Menu Control Feature */
-#define CEC_OPCODE_MENU_REQUEST             0x8D
-#define CEC_OPCODE_MENU_STATUS              0x8E
-#define CEC_OPCODE_USER_CONTROL_PRESSED     0x44
-#define CEC_OPCODE_USER_CONTROL_RELEASED    0x45
-//@}
-
-//@{
-/** @name Messages for the Remote Control Passthrough Feature */
-//@}
-
-//@{
-/** @name Messages for the Power Status Feature */
-#define CEC_OPCODE_GIVE_DEVICE_POWER_STATUS 0x8F
-#define CEC_OPCODE_REPORT_POWER_STATUS      0x90
-//@}
-
-//@{
-/** @name Messages for General Protocol messages */
-#define CEC_OPCODE_FEATURE_ABORT            0x00
-#define CEC_OPCODE_ABORT                    0xFF
-//@}
-
-//@{
-/** @name Messages for the System Audio Control Feature */
-#define CEC_OPCODE_GIVE_AUDIO_STATUS        0x71
-#define CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS 0x7D
-#define CEC_OPCODE_REPORT_AUDIO_STATUS      0x7A
-#define CEC_OPCODE_SET_SYSTEM_AUDIO_MODE    0x72
-#define CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST 0x70
-#define CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS 0x7E
-//@}
-
-//@{
-/** @name Messages for the Audio Rate Control Feature */
-#define CEC_OPCODE_SET_AUDIO_RATE           0x9A
-//@}
-
-//@{
-/** @name CEC Operands */
-
-//TODO: not finished
-
-#define CEC_DECK_CONTROL_MODE_STOP      0x03
-#define CEC_PLAY_MODE_PLAY_FORWARD      0x24
-//@}
-
-/**
- * @enum CECDeviceType
- * Type of CEC device
- */
-enum CECDeviceType {
-    /** TV */
-    CEC_DEVICE_TV,
-    /** Recording Device */
-    CEC_DEVICE_RECODER,
-    /** Tuner */
-    CEC_DEVICE_TUNER,
-    /** Playback Device */
-    CEC_DEVICE_PLAYER,
-    /** Audio System */
-    CEC_DEVICE_AUDIO,
-};
-
-int CECOpen();
-int CECClose();
-int CECAllocLogicalAddress(int paddr, enum CECDeviceType devtype);
-int CECSendMessage(unsigned char *buffer, int size);
-int CECReceiveMessage(unsigned char *buffer, int size, long timeout);
-
-int CECIgnoreMessage(unsigned char opcode, unsigned char lsrc);
-int CECCheckMessageSize(unsigned char opcode, int size);
-int CECCheckMessageMode(unsigned char opcode, int broadcast);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _LIBCEC_H_ */
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libddc/Android.mk b/exynos5/hal/libhdmi/libsForhdmi/libddc/Android.mk
deleted file mode 100644
index 99af09b..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libddc/Android.mk
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-ifeq ($(BOARD_USES_HDMI),true)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := eng
-
-LOCAL_PRELINK_MODULE := false
-LOCAL_SHARED_LIBRARIES := liblog
-LOCAL_SRC_FILES := libddc.c
-
-LOCAL_C_INCLUDES := \
-	$(LOCAL_PATH) \
-	$(LOCAL_PATH)/../../../include
-
-ifeq ($(BOARD_HDMI_DDC_CH), DDC_CH_I2C_7)
-LOCAL_CFLAGS  += -DDDC_CH_I2C_7
-endif
-
-ifeq ($(BOARD_HDMI_DDC_CH), DDC_CH_I2C_1)
-LOCAL_CFLAGS  += -DDDC_CH_I2C_1
-endif
-
-ifeq ($(BOARD_HDMI_DDC_CH), DDC_CH_I2C_2)
-LOCAL_CFLAGS  += -DDDC_CH_I2C_2
-endif
-
-ifeq ($(BOARD_HDMI_DDC_CH), DDC_CH_I2C_8)
-LOCAL_CFLAGS  += -DDDC_CH_I2C_8
-endif
-
-LOCAL_MODULE := libddc
-include $(BUILD_SHARED_LIBRARY)
-
-endif
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libddc/libddc.c b/exynos5/hal/libhdmi/libsForhdmi/libddc/libddc.c
deleted file mode 100644
index c9e64a5..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libddc/libddc.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
-* Copyright@ Samsung Electronics Co. LTD
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <linux/i2c.h>
-#include <cutils/log.h>
-#include "i2c-dev.h"
-
-#include "libddc.h"
-
-#define DDC_DEBUG 0
-
-/**
- * @brief DDC device name.
- * User should change this.
- */
-#ifdef DDC_CH_I2C_1
-#define DEV_NAME    "/dev/i2c-1"
-#endif
-
-#ifdef DDC_CH_I2C_2
-#define DEV_NAME    "/dev/i2c-2"
-#endif
-
-#ifdef DDC_CH_I2C_7
-#define DEV_NAME    "/dev/i2c-7"
-#endif
-
-#ifdef DDC_CH_I2C_8
-#define DEV_NAME    "/dev/i2c-8"
-#endif
-
-/**
- * DDC file descriptor
- */
-static int ddc_fd = -1;
-
-/**
- * Reference count of DDC file descriptor
- */
-static unsigned int ref_cnt = 0;
-
-/**
- * Check if DDC file is already opened or not
- * @return  If DDC file is already opened, return 1; Otherwise, return 0.
- */
-static int DDCFileAvailable()
-{
-    return (ddc_fd < 0) ? 0 : 1;
-}
-
-/**
- * Initialze DDC library. Open DDC device
- * @return  If succeed in opening DDC device or it is already opened, return 1;@n
- *         Otherwise, return 0.
- */
-int DDCOpen()
-{
-    int ret = 1;
-
-    // check already open??
-    if (ref_cnt > 0) {
-        ref_cnt++;
-        return 1;
-    }
-
-    // open
-    if ((ddc_fd = open(DEV_NAME,O_RDWR)) < 0) {
-        ALOGE("%s: Cannot open I2C_DDC : %s",__func__, DEV_NAME);
-        ret = 0;
-    }
-
-    ref_cnt++;
-    return ret;
-}
-
-/**
- * Finalize DDC library. Close DDC device
- * @return  If succeed in closing DDC device or it is being used yet, return 1;@n
- *          Otherwise, return 0.
- */
-int DDCClose()
-{
-    int ret = 1;
-    // check if fd is available
-    if (ref_cnt == 0) {
-#if DDC_DEBUG
-        ALOGE("%s: I2C_DDC is not available!!!!", __func__);
-#endif
-        return 1;
-    }
-
-    // close
-    if (ref_cnt > 1) {
-        ref_cnt--;
-        return 1;
-    }
-
-    if (close(ddc_fd) < 0) {
-#if DDC_DEBUG
-        ALOGE("%s: Cannot close I2C_DDC : %s",__func__,DEV_NAME);
-#endif
-        ret = 0;
-    }
-
-    ref_cnt--;
-    ddc_fd = -1;
-
-    return ret;
-}
-
-/**
- * Read data though DDC. For more information of DDC, refer DDC Spec.
- * @param   addr    [in]    Device address
- * @param   offset  [in]    Byte offset
- * @param   size    [in]    Sizes of data
- * @param   buffer  [out]   Pointer to buffer to store data
- * @return  If succeed in reading, return 1; Otherwise, return 0.
- */
-int DDCRead(unsigned char addr, unsigned char offset,
-            unsigned int size, unsigned char* buffer)
-{
-    struct i2c_rdwr_ioctl_data msgset;
-    struct i2c_msg msgs[2];
-    int ret = 1;
-
-    if (!DDCFileAvailable()) {
-#if DDC_DEBUG
-        ALOGE("%s: I2C_DDC is not available!!!!", __func__);
-#endif
-        return 0;
-    }
-
-    // set offset
-    msgs[0].addr = addr>>1;
-    msgs[0].flags = 0;
-    msgs[0].len = 1;
-    msgs[0].buf = &offset;
-
-    // read data
-    msgs[1].addr = addr>>1;
-    msgs[1].flags = I2C_M_RD;
-    msgs[1].len = size;
-    msgs[1].buf = buffer;
-
-    // set rdwr ioctl data
-    msgset.nmsgs = 2;
-    msgset.msgs = msgs;
-
-    // i2c fast read
-    if ((ret = ioctl(ddc_fd, I2C_RDWR, &msgset)) < 0) {
-        perror("ddc error:");
-        ret = 0;
-    }
-
-    return ret;
-}
-
-/**
- * Read data though E-DDC. For more information of E-DDC, refer E-DDC Spec.
- * @param   segpointer  [in]    Segment pointer
- * @param   segment     [in]    Segment number
- * @param   addr        [in]    Device address
- * @param   offset      [in]    Byte offset
- * @param   size        [in]    Sizes of data
- * @param   buffer      [out]   Pointer to buffer to store data
- * @return  If succeed in reading, return 1; Otherwise, return 0.
- */
-
-int EDDCRead(unsigned char segpointer, unsigned char segment, unsigned char addr,
-  unsigned char offset, unsigned int size, unsigned char* buffer)
-{
-    struct i2c_rdwr_ioctl_data msgset;
-    struct i2c_msg msgs[3];
-    int ret = 1;
-
-    if (!DDCFileAvailable()) {
-#if DDC_DEBUG
-        ALOGE("%s: I2C_DDC is not available!!!!", __func__);
-#endif
-        return 0;
-    }
-
-    // set segment pointer
-    msgs[0].addr  = segpointer>>1;
-    // ignore ack only if segment is "0"
-    if (segment == 0)
-        msgs[0].flags = I2C_M_IGNORE_NAK;
-    else
-        msgs[0].flags = 0;
-
-    msgs[0].len   = 1;
-    msgs[0].buf   = &segment;
-
-    // set offset
-    msgs[1].addr  = addr>>1;
-    msgs[1].flags = 0;
-    msgs[1].len   = 1;
-    msgs[1].buf   = &offset;
-
-    // read data
-    msgs[2].addr  = addr>>1;
-    msgs[2].flags = I2C_M_RD;
-    msgs[2].len   = size;
-    msgs[2].buf   = buffer;
-
-    msgset.nmsgs = 3;
-    msgset.msgs  = msgs;
-
-    // eddc read
-    if (ioctl(ddc_fd, I2C_RDWR, &msgset) < 0) {
-#if DDC_DEBUG
-        ALOGE("%s: ioctl(I2C_RDWR) failed!!!", __func__);
-#endif
-        ret = 0;
-    }
-    return ret;
-}
-
-/**
- * Write data though DDC. For more information of DDC, refer DDC Spec.
- * @param   addr    [in]    Device address
- * @param   offset  [in]    Byte offset
- * @param   size    [in]    Sizes of data
- * @param   buffer  [out]   Pointer to buffer to write
- * @return  If succeed in writing, return 1; Otherwise, return 0.
- */
-int DDCWrite(unsigned char addr, unsigned char offset, unsigned int size, unsigned char* buffer)
-{
-    unsigned char* temp;
-    int bytes;
-    int retval = 0;
-
-    // allocate temporary buffer
-    temp = (unsigned char*) malloc((size+1)*sizeof(unsigned char));
-    if (!temp) {
-        ALOGE("%s: not enough resources at %s", __FUNCTION__);
-        goto exit;
-    }
-
-    temp[0] = offset;
-    memcpy(temp+1,buffer,size);
-
-    if (!DDCFileAvailable()) {
-        ALOGE("%s: I2C_DDC is not available!!!!", __func__);
-        goto exit;
-    }
-
-    if (ioctl(ddc_fd, I2C_SLAVE, addr>>1) < 0) {
-        ALOGE("%s: cannot set slave address 0x%02x", __func__,addr);
-        goto exit;
-    }
-
-    // write temp buffer
-    if ((bytes = write(ddc_fd,temp,size+1)) != (size+1)) {
-        ALOGE("%s: fail to write %d bytes, only write %d bytes",__func__, size, bytes);
-        goto exit;
-    }
-
-    retval = 1;
-
-exit:
-    // free temp buffer
-    if (temp)
-        free(temp);
-
-    return retval;
-}
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libddc/libddc.h b/exynos5/hal/libhdmi/libsForhdmi/libddc/libddc.h
deleted file mode 100644
index 368855b..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libddc/libddc.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _LIBDDC_H_
-#define _LIBDDC_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int DDCOpen();
-int DDCRead(unsigned char addr, unsigned char offset, unsigned int size, unsigned char* buffer);
-int DDCWrite(unsigned char addr, unsigned char offset, unsigned int size, unsigned char* buffer);
-int EDDCRead(unsigned char segpointer, unsigned char segment, unsigned char addr,
-  unsigned char offset, unsigned int size, unsigned char* buffer);
-int DDCClose();
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _LIBDDC_H_ */
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libedid/Android.mk b/exynos5/hal/libhdmi/libsForhdmi/libedid/Android.mk
deleted file mode 100644
index 602ae4d..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libedid/Android.mk
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-ifeq ($(BOARD_USES_HDMI),true)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := eng
-
-LOCAL_PRELINK_MODULE := false
-LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
-LOCAL_SHARED_LIBRARIES := liblog libddc
-LOCAL_SRC_FILES := libedid.c
-
-LOCAL_C_INCLUDES := \
-	$(LOCAL_PATH) \
-	$(LOCAL_PATH)/../../../include
-
-LOCAL_MODULE := libedid
-include $(BUILD_SHARED_LIBRARY)
-
-endif
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libedid/edid.h b/exynos5/hal/libhdmi/libsForhdmi/libedid/edid.h
deleted file mode 100644
index aea1309..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libedid/edid.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _EDID_H_
-#define _EDID_H_
-
-//@{
-/**
- * @name EDID Addresses
- */
-#define EDID_ADDR                                       (0xA0)
-#define EDID_SEGMENT_POINTER                            (0x60)
-//@}
-
-//@{
-/**
- * @name EDID offset and bit values
- */
-#define SIZEOFBYTE                                      (8)
-#define SIZEOFEDIDBLOCK                                 (0x80)
-#define EDID_EXTENSION_NUMBER_POS                       (0x7E)
-
-#define EDID_TIMING_EXT_TAG_ADDR_POS                    (0)
-#define EDID_TIMING_EXT_REV_NUMBER_POS                  (1)
-#define EDID_DETAILED_TIMING_OFFSET_POS                 (2)
-#define EDID_DATA_BLOCK_START_POS                       (4)
-
-// for Extension Data Block
-#define EDID_TIMING_EXT_TAG_VAL                         (0x02)
-#define EDID_BLOCK_MAP_EXT_TAG_VAL                      (0xF0)
-
-#define EDID_SHORT_AUD_DEC_TAG_VAL                      (1<<5)
-#define EDID_SHORT_VID_DEC_TAG_VAL                      (2<<5)
-#define EDID_VSDB_TAG_VAL                               (3<<5)
-#define EDID_SPEAKER_ALLOCATION_TAG_VAL                 (4<<5)
-#define EDID_VESA_DTC_TAG_VAL                           (5<<5)
-#define EDID_RESERVED_TAG_VAL                           (6<<5)
-
-#define EDID_EXTENDED_TAG_VAL                           (7<<5)
-#define EDID_EXTENDED_COLORIMETRY_VAL                   (5)
-#define EDID_EXTENDED_COLORIMETRY_BLOCK_LEN             (3)
-
-#define EDID_TAG_CODE_MASK                              (1<<7 | 1<<6 | 1<<5)
-#define EDID_DATA_BLOCK_SIZE_MASK                       (1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0)
-
-#define EDID_VSDB_MIN_LENGTH_VAL                        (5)
-
-// for Established Timings
-#define EDID_ET_POS                                     (0x23)
-#define EDID_ET_640x480p_VAL                            (0x20)
-
-// for DTD
-#define EDID_DTD_START_ADDR                             (0x36)
-#define EDID_DTD_BYTE_LENGTH                            (18)
-#define EDID_DTD_TOTAL_LENGTH                           (EDID_DTD_BYTE_LENGTH*4)
-
-#define EDID_DTD_PIXELCLOCK_POS1                        (0)
-#define EDID_DTD_PIXELCLOCK_POS2                        (1)
-
-#define EDID_DTD_HBLANK_POS1                            (3)
-#define EDID_DTD_HBLANK_POS2                            (4)
-#define EDID_DTD_HBLANK_POS2_MASK                       (0xF)
-
-#define EDID_DTD_HACTIVE_POS1                           (2)
-#define EDID_DTD_HACTIVE_POS2                           (4)
-#define EDID_DTD_HACTIVE_POS2_MASK                      (0xF0)
-
-#define EDID_DTD_VBLANK_POS1                            (6)
-#define EDID_DTD_VBLANK_POS2                            (7)
-#define EDID_DTD_VBLANK_POS2_MASK                       (0x0F)
-
-#define EDID_DTD_VACTIVE_POS1                           (5)
-#define EDID_DTD_VACTIVE_POS2                           (7)
-#define EDID_DTD_VACTIVE_POS2_MASK                      (0xF0)
-
-#define EDID_DTD_INTERLACE_POS                          (17)
-#define EDID_DTD_INTERLACE_MASK                         (1<<7)
-
-// for SVD
-#define EDID_SVD_VIC_MASK                               (0x7F)
-
-// for CS
-#define EDID_COLOR_SPACE_POS                            (3)
-#define EDID_YCBCR444_CS_MASK                           (1<<5)
-#define EDID_YCBCR422_CS_MASK                           (1<<4)
-
-// for Color Depth
-#define EDID_DC_48_VAL                                  (1<<6)
-#define EDID_DC_36_VAL                                  (1<<5)
-#define EDID_DC_30_VAL                                  (1<<4)
-#define EDID_DC_YCBCR_VAL                               (1<<3)
-
-#define EDID_DC_POS                                     (6)
-#define EDID_DC_MASK                                    (EDID_DC_48_VAL | EDID_DC_36_VAL| EDID_DC_30_VAL | EDID_DC_YCBCR_VAL)
-
-// for colorimetry
-#define EDID_XVYCC601_MASK                              (1<<0)
-#define EDID_XVYCC709_MASK                              (1<<1)
-#define EDID_EXTENDED_MASK                              (1<<0|1<<1|1<<2)
-
-// for SAD
-#define SHORT_AUD_DESCRIPTOR_LPCM                       (1<<0)
-#define SHORT_AUD_DESCRIPTOR_AC3                        (1<<1)
-#define SHORT_AUD_DESCRIPTOR_MPEG1                      (1<<2)
-#define SHORT_AUD_DESCRIPTOR_MP3                        (1<<3)
-#define SHORT_AUD_DESCRIPTOR_MPEG2                      (1<<4)
-#define SHORT_AUD_DESCRIPTOR_AAC                        (1<<5)
-#define SHORT_AUD_DESCRIPTOR_DTS                        (1<<6)
-#define SHORT_AUD_DESCRIPTOR_ATRAC                      (1<<7)
-
-#define EDID_SAD_CODE_MASK                              (1<<6 | 1<<5 | 1<<4 | 1<<3)
-#define EDID_SAD_CHANNEL_MASK                           (1<<2 | 1<<1 | 1<<0)
-#define EDID_SAD_192KHZ_MASK                            (1<<6)
-#define EDID_SAD_176KHZ_MASK                            (1<<5)
-#define EDID_SAD_96KHZ_MASK                             (1<<4)
-#define EDID_SAD_88KHZ_MASK                             (1<<3)
-#define EDID_SAD_48KHZ_MASK                             (1<<2)
-#define EDID_SAD_44KHZ_MASK                             (1<<1)
-#define EDID_SAD_32KHZ_MASK                             (1<<0)
-
-#define EDID_SAD_WORD_24_MASK                           (1<<2)
-#define EDID_SAD_WORD_20_MASK                           (1<<1)
-#define EDID_SAD_WORD_16_MASK                           (1<<0)
-
-// for CEC
-#define EDID_CEC_PHYICAL_ADDR                           (4)
-
-// for 3D
-#define EDID_HDMI_EXT_POS                               (8)
-#define EDID_HDMI_VIDEO_PRESENT_MASK                    (1<<5)
-
-// latency
-#define EDID_HDMI_LATENCY_MASK                          (1<<7|1<<6)
-#define EDID_HDMI_LATENCY_POS                           (6)
-
-#define EDID_HDMI_3D_PRESENT_POS                        (13)
-#define EDID_HDMI_3D_PRESENT_MASK                       (1<<7)
-#define EDID_HDMI_3D_MULTI_PRESENT_MASK                 (1<<6 | 1<<5)
-#define EDID_HDMI_3D_MULTI_PRESENT_BIT                  5
-
-#define EDID_3D_STRUCTURE_ONLY_EXIST                    (1<<5)
-#define EDID_3D_STRUCTURE_MASK_EXIST                    (1<<6)
-
-#define EDID_3D_STRUCTURE_FP                            (0)
-#define EDID_3D_STRUCTURE_FA                            (1)
-#define EDID_3D_STRUCTURE_LA                            (2)
-#define EDID_3D_STRUCTURE_SSF                           (3)
-#define EDID_3D_STRUCTURE_LD                            (4)
-#define EDID_3D_STRUCTURE_LDGFX                         (5)
-#define EDID_3D_STRUCTURE_TB                            (6)
-#define EDID_3D_STRUCTURE_SSH                           (8)
-
-#define EDID_HDMI_EXT_LENGTH_POS                        (14)
-#define EDID_HDMI_VSDB_VIC_LEN_BIT                      (5)
-#define EDID_HDMI_VSDB_VIC_LEN_MASK                     (1<<7|1<<6|1<<5)
-#define EDID_HDMI_VSDB_3D_LEN_MASK                      (1<<4|1<<3|1<<2|1<<1|1<<0)
-
-#define EDID_HDMI_2D_VIC_ORDER_MASK                     (1<<7|1<<6|1<<5|1<<4)
-#define EDID_HDMI_3D_STRUCTURE_MASK                     (1<<3|1<<2|1<<1|1<<0)
-
-// for MAX TMDS
-#define EDID_MAX_TMDS_POS                               (7)
-
-// for 3D Structure
-#define NUM_OF_VIC_FOR_3D                               16
-//@}
-
-#endif /* _EDID_H_ */
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libedid/libedid.c b/exynos5/hal/libhdmi/libsForhdmi/libedid/libedid.c
deleted file mode 100644
index 60c61ce..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libedid/libedid.c
+++ /dev/null
@@ -1,1265 +0,0 @@
-/*
-* Copyright@ Samsung Electronics Co. LTD
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <cutils/log.h>
-
-#include "edid.h"
-#include "libedid.h"
-#include "../libddc/libddc.h"
-
-//#define EDID_DEBUG 1
-
-#ifdef EDID_DEBUG
-#define DPRINTF(args...)    ALOGI(args)
-#else
-#define DPRINTF(args...)
-#endif
-
-#define NUM_OF_VIC_FOR_3D           16
-
-/**
- * @var gEdidData
- * Pointer to EDID data
- */
-static unsigned char* gEdidData;
-
-/**
- * @var gExtensions
- * Number of EDID extensions
- */
-static int gExtensions;
-
-
-/**
- * @var aVIC
- * This contains first 16 VIC in EDID
- */
-static unsigned char aVIC[NUM_OF_VIC_FOR_3D];
-
-//! Structure for parsing video timing parameter in EDID
-static const struct edid_params {
-    /** H Total */
-    unsigned int HTotal;
-
-    /** H Blank */
-    unsigned int HBlank;
-
-    /** V Total */
-    unsigned int VTotal;
-
-    /** V Blank */
-    unsigned int VBlank;
-
-    /** CEA VIC */
-    unsigned char  VIC;
-
-    /** CEA VIC for 16:9 aspect ratio */
-    unsigned char  VIC16_9;
-
-    /** 0 if progressive, 1 if interlaced */
-    unsigned char  interlaced;
-
-    /** Pixel frequency */
-    enum PixelFreq PixelClock;
-} aVideoParams[] =
-{
-    { 800 , 160 , 525 , 45, 1 , 1 , 0, PIXEL_FREQ_25_200 ,},        // v640x480p_60Hz
-    { 858 , 138 , 525 , 45, 2 , 3 , 0, PIXEL_FREQ_27_027 ,},        // v720x480p_60Hz
-    { 1650, 370 , 750 , 30, 4 , 4 , 0, PIXEL_FREQ_74_250 ,},        // v1280x720p_60Hz
-    { 2200, 280 , 1125, 22, 5 , 5 , 1, PIXEL_FREQ_74_250 ,},        // v1920x1080i_60H
-    { 1716, 276 , 525 , 22, 6 , 7 , 1, PIXEL_FREQ_74_250 ,},        // v720x480i_60Hz
-    { 1716, 276 , 262 , 22, 8 , 9 , 0, PIXEL_FREQ_27_027 ,},        // v720x240p_60Hz
-    //{ 1716, 276 , 263 , 23, 8 , 9 , 0, PIXEL_FREQ_27_027 , },     // v720x240p_60Hz(mode 2)
-    { 3432, 552 , 525 , 22, 10, 11, 1, PIXEL_FREQ_54_054 , },       // v2880x480i_60Hz
-    { 3432, 552 , 262 , 22, 12, 13, 0, PIXEL_FREQ_54_054 , },       // v2880x240p_60Hz
-    //{ 3432, 552 , 263 , 23, 12, 13, 0, PIXEL_FREQ_54_054 , },     // v2880x240p_60Hz(mode 2)
-    { 1716, 276 , 525 , 45, 14, 15, 0, PIXEL_FREQ_54_054 , },       // v1440x480p_60Hz
-    { 2200, 280 , 1125, 45, 16, 16, 0, PIXEL_FREQ_148_500, },       // v1920x1080p_60H
-    { 864 , 144 , 625 , 49, 17, 18, 0, PIXEL_FREQ_27 , },           // v720x576p_50Hz
-    { 1980, 700 , 750 , 30, 19, 19, 0, PIXEL_FREQ_74_250 , },       // v1280x720p_50Hz
-    { 2640, 720 , 1125, 22, 20, 20, 1, PIXEL_FREQ_74_250 , },       // v1920x1080i_50H
-    { 1728, 288 , 625 , 24, 21, 22, 1, PIXEL_FREQ_27 , },           // v720x576i_50Hz
-    { 1728, 288 , 312 , 24, 23, 24, 0, PIXEL_FREQ_27 , },           // v720x288p_50Hz
-    //{ 1728, 288 , 313 , 25, 23, 24, 0, PIXEL_FREQ_27 , },         // v720x288p_50Hz(mode 2)
-    //{ 1728, 288 , 314 , 26, 23, 24, 0, PIXEL_FREQ_27 , },         // v720x288p_50Hz(mode 3)
-    { 3456, 576 , 625 , 24, 25, 26, 1, PIXEL_FREQ_54 , },           // v2880x576i_50Hz
-    { 3456, 576 , 312 , 24, 27, 28, 0, PIXEL_FREQ_54 , },           // v2880x288p_50Hz
-    //{ 3456, 576 , 313 , 25, 27, 28, 0, PIXEL_FREQ_54 , },         // v2880x288p_50Hz(mode 2)
-    //{ 3456, 576 , 314 , 26, 27, 28, 0, PIXEL_FREQ_54 , },         // v2880x288p_50Hz(mode 3)
-    { 1728, 288 , 625 , 49, 29, 30, 0, PIXEL_FREQ_54 , },           // v1440x576p_50Hz
-    { 2640, 720 , 1125, 45, 31, 31, 0, PIXEL_FREQ_148_500,},        // v1920x1080p_50Hz
-    { 2750, 830 , 1125, 45, 32, 32, 0, PIXEL_FREQ_74_250 ,},        // v1920x1080p_24Hz
-    { 2640, 720 , 1125, 45, 33, 33, 0, PIXEL_FREQ_74_250 ,},        // v1920x1080p_25Hz
-    { 2200, 280 , 1125, 45, 34, 34, 0, PIXEL_FREQ_74_250 ,},        // v1920x1080p_30Hz
-    { 3432, 552 , 525 , 45, 35, 36, 0, PIXEL_FREQ_108_108,},        // v2880x480p_60Hz
-    { 3456, 576 , 625 , 49, 37, 38, 0, PIXEL_FREQ_108 ,},           // v2880x576p_50Hz
-    { 2304, 384 , 1250, 85, 39, 39, 1, PIXEL_FREQ_72 ,},            // v1920x1080i_50Hz(1250)
-    { 2640, 720 , 1125, 22, 40, 40, 1, PIXEL_FREQ_148_500, },       // v1920x1080i_100Hz
-    { 1980, 700 , 750 , 30, 41, 41, 0, PIXEL_FREQ_148_500, },       // v1280x720p_100Hz
-    { 864 , 144 , 625 , 49, 42, 43, 0, PIXEL_FREQ_54 , },           // v720x576p_100Hz
-    { 1728, 288 , 625 , 24, 44, 45, 1, PIXEL_FREQ_54 , },           // v720x576i_100Hz
-    { 2200, 280 , 1125, 22, 46, 46, 1, PIXEL_FREQ_148_500, },       // v1920x1080i_120Hz
-    { 1650, 370 , 750 , 30, 47, 47, 0, PIXEL_FREQ_148_500, },       // v1280x720p_120Hz
-    { 858 , 138 , 525 , 54, 48, 49, 0, PIXEL_FREQ_54_054 , },       // v720x480p_120Hz
-    { 1716, 276 , 525 , 22, 50, 51, 1, PIXEL_FREQ_54_054 , },       // v720x480i_120Hz
-    { 864 , 144 , 625 , 49, 52, 53, 0, PIXEL_FREQ_108 , },          // v720x576p_200Hz
-    { 1728, 288 , 625 , 24, 54, 55, 1, PIXEL_FREQ_108 , },          // v720x576i_200Hz
-    { 858 , 138 , 525 , 45, 56, 57, 0, PIXEL_FREQ_108_108, },       // v720x480p_240Hz
-    { 1716, 276 , 525 , 22, 58, 59, 1, PIXEL_FREQ_108_108, },       // v720x480i_240Hz
-    // PHY Freq is not available yet
-    //{ 3300, 2020, 750 , 30, 60, 60, 0, PIXEL_FREQ_59_400 ,},      // v1280x720p24Hz
-    { 3960, 2680, 750 , 30, 61, 61, 0, PIXEL_FREQ_74_250 , },       // v1280x720p25Hz
-    { 3300, 2020, 750 , 30, 62, 62, 0, PIXEL_FREQ_74_250 ,},        // v1280x720p30Hz
-    // PHY Freq is not available yet
-    //{ 2200, 280 , 1125, 45, 63, 63, 0, PIXEL_FREQ_297, },         // v1920x1080p120Hz
-    //{ 2640, 720 , 1125, 45, 64, 64, 0, PIXEL_FREQ_297, },         // v1920x1080p100Hz
-    //{ 4400, 560 , 2250, 90,  1, 1, 0, 0,  PIXEL_FREQ_297, },      // v4Kx2K30Hz
-};
-
-//! Structure for Checking 3D Mandatory Format in EDID
-static const struct edid_3d_mandatory {
-    /** video Format */
-    enum VideoFormat resolution;
-
-    /** 3D Structure */
-    enum HDMI3DVideoStructure hdmi_3d_format;
-} edid_3d [] =
-{
-    { v1920x1080p_24Hz, HDMI_3D_FP_FORMAT },    // 1920x1080p @ 23.98/24Hz
-    { v1280x720p_60Hz, HDMI_3D_FP_FORMAT },     // 1280x720p @ 59.94/60Hz
-    { v1920x1080i_60Hz, HDMI_3D_SSH_FORMAT },   // 1920x1080i @ 59.94/60Hz
-    { v1920x1080p_24Hz, HDMI_3D_TB_FORMAT },    // 1920x1080p @ 23.98/24Hz
-    { v1280x720p_60Hz, HDMI_3D_TB_FORMAT },     // 1280x720p @ 59.94/60Hz
-    { v1280x720p_50Hz, HDMI_3D_FP_FORMAT },     // 1280x720p @ 50Hz
-    { v1920x1080i_50Hz, HDMI_3D_SSH_FORMAT },   // 1920x1080i @ 50Hz
-    { v1280x720p_50Hz, HDMI_3D_TB_FORMAT },     // 1280x720p @ 50Hz
-};
-
-/**
- * Calculate a checksum.
- *
- * @param   buffer  [in]    Pointer to data to calculate a checksum
- * @param   size    [in]    Sizes of data
- *
- * @return  If checksum result is 0, return 1; Otherwise, return 0.
- */
-static int CalcChecksum(const unsigned char* const buffer, const int size)
-{
-    unsigned char i,sum;
-    int ret = 1;
-
-    // check parameter
-    if (buffer == NULL ) {
-        DPRINTF("invalid parameter : buffer\n");
-        return 0;
-    }
-    for (sum = 0, i = 0 ; i < size; i++)
-        sum += buffer[i];
-
-    // check checksum
-    if (sum != 0)
-        ret = 0;
-
-    return ret;
-}
-
-/**
- * Read EDID Block(128 bytes)
- *
- * @param   blockNum    [in]    Number of block to read @n
- *                  For example, EDID block = 0, EDID first Extension = 1, and so on.
- * @param   outBuffer   [out]   Pointer to buffer to store EDID data
- *
- * @return  If fail to read, return 0; Otherwise, return 1.
- */
-static int ReadEDIDBlock(const unsigned int blockNum, unsigned char* const outBuffer)
-{
-    int segNum, offset, dataPtr;
-
-    // check parameter
-    if (outBuffer == NULL) {
-        DPRINTF("invalid parameter : outBuffer\n");
-        return 0;
-    }
-
-    // calculate
-    segNum = blockNum / 2;
-    offset = (blockNum % 2) * SIZEOFEDIDBLOCK;
-    dataPtr = (blockNum) * SIZEOFEDIDBLOCK;
-
-    // read block
-    if (!EDDCRead(EDID_SEGMENT_POINTER, segNum, EDID_ADDR, offset, SIZEOFEDIDBLOCK, outBuffer)) {
-        DPRINTF("Fail to Read %dth EDID Block\n", blockNum);
-        return 0;
-    }
-
-    if (!CalcChecksum(outBuffer, SIZEOFEDIDBLOCK)) {
-        DPRINTF("CheckSum fail : %dth EDID Block\n", blockNum);
-        return 0;
-    }
-
-    // print data
-#ifdef EDID_DEBUG
-    offset = 0;
-    do {
-        ALOGI("0x%02X", outBuffer[offset++]);
-        if (offset % 16)
-            ALOGI(" ");
-        else
-            ALOGI("\n");
-    } while (SIZEOFEDIDBLOCK > offset);
-#endif // EDID_DEBUG
-    return 1;
-}
-
-/**
- * Check if EDID data is valid or not.
- *
- * @return  if EDID data is valid, return 1; Otherwise, return 0.
- */
-static inline int EDIDValid(void)
-{
-    return (gEdidData == NULL) ?  0 : 1;
-}
-
-/**
- * Search HDMI Vender Specific Data Block(VSDB) in EDID extension block.
- *
- * @param   extension   [in]    the number of EDID extension block to check
- *
- * @return  if there is a HDMI VSDB, return the offset from start of @n
- *        EDID extension block. if there is no VSDB, return 0.
- */
-static int GetVSDBOffset(const int extension)
-{
-    unsigned int BlockOffset = extension*SIZEOFEDIDBLOCK;
-    unsigned int offset = BlockOffset + EDID_DATA_BLOCK_START_POS;
-    unsigned int tag,blockLen,DTDOffset;
-
-    if (!EDIDValid() || (extension > gExtensions)) {
-        DPRINTF("EDID Data is not available\n");
-        return 0;
-    }
-
-    DTDOffset = gEdidData[BlockOffset + EDID_DETAILED_TIMING_OFFSET_POS];
-
-    // check if there is HDMI VSDB
-    while (offset < BlockOffset + DTDOffset) {
-        // find the block tag and length
-        // tag
-        tag = gEdidData[offset] & EDID_TAG_CODE_MASK;
-        // block len
-        blockLen = (gEdidData[offset] & EDID_DATA_BLOCK_SIZE_MASK) + 1;
-
-        // check if it is HDMI VSDB
-        // if so, check identifier value, if it's hdmi vsbd - return offset
-        if (tag == EDID_VSDB_TAG_VAL &&
-            gEdidData[offset+1] == 0x03 &&
-            gEdidData[offset+2] == 0x0C &&
-            gEdidData[offset+3] == 0x0 &&
-            blockLen > EDID_VSDB_MIN_LENGTH_VAL )
-            return offset;
-
-        // else find next block
-        offset += blockLen;
-    }
-
-    // return error
-    return 0;
-}
-
-/**
- * Check if Sink supports the HDMI mode.
- * @return  If Sink supports HDMI mode, return 1; Otherwise, return 0.
- */
-static int CheckHDMIMode(void)
-{
-    int i;
-
-    // read EDID
-    if (!EDIDRead())
-        return 0;
-
-    // find VSDB
-    for (i = 1; i <= gExtensions; i++)
-        if (GetVSDBOffset(i) > 0) // if there is a VSDB, it means RX support HDMI mode
-            return 1;
-
-    return 0;
-}
-
-/**
- * Check if EDID extension block is timing extension block or not.
- * @param   extension   [in] The number of EDID extension block to check
- * @return  If the block is timing extension, return 1; Otherwise, return 0.
- */
-static int IsTimingExtension(const int extension)
-{
-    int ret = 0;
-    if (!EDIDValid() || (extension > gExtensions)) {
-        DPRINTF("EDID Data is not available\n");
-        return ret;
-    }
-
-    if (gEdidData[extension*SIZEOFEDIDBLOCK] == EDID_TIMING_EXT_TAG_VAL) {
-        // check extension revsion number
-        // revision num == 3
-        if (gEdidData[extension*SIZEOFEDIDBLOCK + EDID_TIMING_EXT_REV_NUMBER_POS] == 3)
-            ret = 1;
-        // revison num != 3 && DVI mode
-        else if (!CheckHDMIMode() &&
-                gEdidData[extension*SIZEOFEDIDBLOCK + EDID_TIMING_EXT_REV_NUMBER_POS] != 2)
-            ret = 1;
-    }
-    return ret;
-}
-
-/**
- * Check if the video format is contained in - @n
- * Detailed Timing Descriptor(DTD) of EDID extension block.
- * @param   extension   [in]    Number of EDID extension block to check
- * @param   videoFormat [in]    Video format to check
- * @return  If the video format is contained in DTD of EDID extension block, -@n
- *        return 1; Otherwise, return 0.
- */
-static int IsContainVideoDTD(const int extension,const enum VideoFormat videoFormat)
-{
-    int i, StartOffset, EndOffset;
-
-    if (!EDIDValid() || (extension > gExtensions)) {
-        DPRINTF("EDID Data is not available\n");
-        return 0;
-    }
-
-    // if edid block( 0th block )
-    if (extension == 0) {
-        StartOffset = EDID_DTD_START_ADDR;
-        EndOffset = StartOffset + EDID_DTD_TOTAL_LENGTH;
-    } else { // if edid extension block
-        StartOffset = extension*SIZEOFEDIDBLOCK + gEdidData[extension*SIZEOFEDIDBLOCK + EDID_DETAILED_TIMING_OFFSET_POS];
-        EndOffset = (extension+1)*SIZEOFEDIDBLOCK;
-    }
-
-    // check DTD(Detailed Timing Description)
-    for (i = StartOffset; i < EndOffset; i+= EDID_DTD_BYTE_LENGTH) {
-        unsigned int hblank = 0, hactive = 0, vblank = 0, vactive = 0, interlaced = 0, pixelclock = 0;
-        unsigned int vHActive = 0, vVActive = 0, vVBlank = 0;
-
-        // get pixel clock
-        pixelclock = (gEdidData[i+EDID_DTD_PIXELCLOCK_POS2] << SIZEOFBYTE);
-        pixelclock |= gEdidData[i+EDID_DTD_PIXELCLOCK_POS1];
-
-        if (!pixelclock)
-            continue;
-
-        // get HBLANK value in pixels
-        hblank = gEdidData[i+EDID_DTD_HBLANK_POS2] & EDID_DTD_HBLANK_POS2_MASK;
-        hblank <<= SIZEOFBYTE; // lower 4 bits
-        hblank |= gEdidData[i+EDID_DTD_HBLANK_POS1];
-
-        // get HACTIVE value in pixels
-        hactive = gEdidData[i+EDID_DTD_HACTIVE_POS2] & EDID_DTD_HACTIVE_POS2_MASK;
-        hactive <<= (SIZEOFBYTE/2); // upper 4 bits
-        hactive |= gEdidData[i+EDID_DTD_HACTIVE_POS1];
-
-        // get VBLANK value in pixels
-        vblank = gEdidData[i+EDID_DTD_VBLANK_POS2] & EDID_DTD_VBLANK_POS2_MASK;
-        vblank <<= SIZEOFBYTE; // lower 4 bits
-        vblank |= gEdidData[i+EDID_DTD_VBLANK_POS1];
-
-        // get VACTIVE value in pixels
-        vactive = gEdidData[i+EDID_DTD_VACTIVE_POS2] & EDID_DTD_VACTIVE_POS2_MASK;
-        vactive <<= (SIZEOFBYTE/2); // upper 4 bits
-        vactive |= gEdidData[i+EDID_DTD_VACTIVE_POS1];
-
-        vHActive = aVideoParams[videoFormat].HTotal - aVideoParams[videoFormat].HBlank;
-        if (aVideoParams[videoFormat].interlaced == 1) {
-            if (aVideoParams[videoFormat].VIC == v1920x1080i_50Hz_1250) { // VTOP and VBOT are same
-                vVActive = (aVideoParams[videoFormat].VTotal - aVideoParams[videoFormat].VBlank*2)/2;
-                vVBlank = aVideoParams[videoFormat].VBlank;
-            } else {
-                vVActive = (aVideoParams[videoFormat].VTotal - aVideoParams[videoFormat].VBlank*2 - 1)/2;
-                vVBlank = aVideoParams[videoFormat].VBlank;
-            }
-        } else {
-            vVActive = aVideoParams[videoFormat].VTotal - aVideoParams[videoFormat].VBlank;
-            vVBlank = aVideoParams[videoFormat].VBlank;
-        }
-
-        // get Interlaced Mode Value
-        interlaced = (int)(gEdidData[i+EDID_DTD_INTERLACE_POS] & EDID_DTD_INTERLACE_MASK);
-        if (interlaced)
-            interlaced = 1;
-
-        DPRINTF("EDID: hblank = %d,vblank = %d, hactive = %d, vactive = %d\n"
-                            ,hblank,vblank,hactive,vactive);
-        DPRINTF("REQ: hblank = %d,vblank = %d, hactive = %d, vactive = %d\n"
-                            ,aVideoParams[videoFormat].HBlank
-                            ,vVBlank,vHActive,vVActive);
-
-        if (hblank == aVideoParams[videoFormat].HBlank && vblank == vVBlank // blank
-            && hactive == vHActive && vactive == vVActive) { //line
-            unsigned int EDIDpixelclock = aVideoParams[videoFormat].PixelClock;
-            EDIDpixelclock /= 100; pixelclock /= 100;
-
-            if (pixelclock == EDIDpixelclock) {
-                DPRINTF("Sink Support the Video mode\n");
-                return 1;
-            }
-        }
-    }
-    return 0;
-}
-
-/**
- * Check if a VIC(Video Identification Code) is contained in -@n
- * EDID extension block.
- * @param   extension   [in]    Number of EDID extension block to check
- * @param   VIC      [in]   VIC to check
- * @return  If the VIC is contained in contained in EDID extension block, -@n
- *        return 1; Otherwise, return 0.
- */
-static int IsContainVIC(const int extension, const int VIC)
-{
-    unsigned int StartAddr = extension*SIZEOFEDIDBLOCK;
-    unsigned int ExtAddr = StartAddr + EDID_DATA_BLOCK_START_POS;
-    unsigned int tag,blockLen;
-    unsigned int DTDStartAddr = gEdidData[StartAddr + EDID_DETAILED_TIMING_OFFSET_POS];
-
-    if (!EDIDValid() || (extension > gExtensions)) {
-        DPRINTF("EDID Data is not available\n");
-        return 0;
-    }
-
-    // while
-    while (ExtAddr < StartAddr + DTDStartAddr) {
-        // find the block tag and length
-        // tag
-        tag = gEdidData[ExtAddr] & EDID_TAG_CODE_MASK;
-        // block len
-        blockLen = (gEdidData[ExtAddr] & EDID_DATA_BLOCK_SIZE_MASK) + 1;
-        DPRINTF("tag = %d\n",tag);
-        DPRINTF("blockLen = %d\n",blockLen-1);
-
-        // check if it is short video description
-        if (tag == EDID_SHORT_VID_DEC_TAG_VAL) {
-            // if so, check SVD
-            unsigned int i;
-            for (i = 1; i < blockLen; i++) {
-                DPRINTF("EDIDVIC = %d\n",gEdidData[ExtAddr+i] & EDID_SVD_VIC_MASK);
-                DPRINTF("VIC = %d\n",VIC);
-
-                // check VIC with SVDB
-                if (VIC == (gEdidData[ExtAddr+i] & EDID_SVD_VIC_MASK)) {
-                    DPRINTF("Sink Device supports requested video mode\n");
-                    return 1;
-                }
-            }
-        }
-        // else find next block
-        ExtAddr += blockLen;
-    }
-
-    return 0;
-}
-
-/**
- * Check if EDID contains the video format.
- * @param   videoFormat [in]    Video format to check
- * @param   pixelRatio  [in]    Pixel aspect ratio of video format to check
- * @return  if EDID contains the video format, return 1; Otherwise, return 0.
- */
-static int CheckResolution(const enum VideoFormat videoFormat,
-                            const enum PixelAspectRatio pixelRatio)
-{
-    int i, vic;
-
-    // read EDID
-    if (!EDIDRead())
-        return 0;
-
-    // check ET(Established Timings) for 640x480p@60Hz
-    if (videoFormat == v640x480p_60Hz // if it's 640x480p@60Hz
-        && (gEdidData[EDID_ET_POS] & EDID_ET_640x480p_VAL)) // it support
-         return 1;
-
-    // check STI(Standard Timing Identification)
-    // do not need
-
-    // check DTD(Detailed Timing Description) of EDID block(0th)
-    if (IsContainVideoDTD(0,videoFormat))
-        return 1;
-
-    // check EDID Extension
-    vic = (pixelRatio == HDMI_PIXEL_RATIO_16_9) ?
-            aVideoParams[videoFormat].VIC16_9 : aVideoParams[videoFormat].VIC;
-
-    // find VSDB
-    for (i = 1; i <= gExtensions; i++) {
-        if (IsTimingExtension(i)) // if it's timing block
-            if (IsContainVIC(i, vic) || IsContainVideoDTD(i, videoFormat))
-                return 1;
-    }
-
-    return 0;
-}
-
-/**
- * Check if EDID supports the color depth.
- * @param   depth [in]  Color depth
- * @param   space [in]  Color space
- * @return  If EDID supports the color depth, return 1; Otherwise, return 0.
- */
-static int CheckColorDepth(const enum ColorDepth depth,const enum ColorSpace space)
-{
-    int i;
-    unsigned int StartAddr;
-
-    // if color depth == 24 bit, no need to check
-    if (depth == HDMI_CD_24)
-        return 1;
-
-    // check EDID data is valid or not
-    // read EDID
-    if (!EDIDRead())
-        return 0;
-
-    // find VSDB
-    for (i = 1; i <= gExtensions; i++) {
-        if (IsTimingExtension(i) // if it's timing block
-            && ((StartAddr = GetVSDBOffset(i)) > 0)) { // check block
-            int blockLength = gEdidData[StartAddr] & EDID_DATA_BLOCK_SIZE_MASK;
-            if (blockLength >= EDID_DC_POS) {
-                // get supported DC value
-                int deepColor = gEdidData[StartAddr + EDID_DC_POS] & EDID_DC_MASK;
-                DPRINTF("EDID deepColor = %x\n",deepColor);
-                // check supported DeepColor
-                // if YCBCR444
-                if (space == HDMI_CS_YCBCR444) {
-                    if ( !(deepColor & EDID_DC_YCBCR_VAL))
-                        return 0;
-                }
-
-                // check colorDepth
-                switch (depth) {
-                case HDMI_CD_36:
-                    deepColor &= EDID_DC_36_VAL;
-                    break;
-                case HDMI_CD_30:
-                    deepColor &= EDID_DC_30_VAL;
-                    break;
-                case HDMI_CD_24:
-                    deepColor = 1;
-                    break;
-                default :
-                    deepColor = 0;
-                }
-                if (deepColor)
-                    return 1;
-                else
-                    return 0;
-            }
-        }
-    }
-
-    return 0;
-}
-
-/**
- * Check if EDID supports the color space.
- * @param   space [in]  Color space
- * @return  If EDID supports the color space, return 1; Otherwise, return 0.
- */
-static int CheckColorSpace(const enum ColorSpace space)
-{
-    int i;
-
-    // RGB is default
-    if (space == HDMI_CS_RGB)
-        return 1;
-
-    // check EDID data is valid or not
-    // read EDID
-    if (!EDIDRead())
-        return 0;
-
-    // find VSDB
-    for (i = 1; i <= gExtensions; i++) {
-        if (IsTimingExtension(i)) { // if it's timing block
-            // read Color Space
-            int CS = gEdidData[i*SIZEOFEDIDBLOCK + EDID_COLOR_SPACE_POS];
-
-            if ((space == HDMI_CS_YCBCR444 && (CS & EDID_YCBCR444_CS_MASK)) || // YCBCR444
-                    (space == HDMI_CS_YCBCR422 && (CS & EDID_YCBCR422_CS_MASK))) // YCBCR422
-                return 1;
-        }
-    }
-    return 0;
-}
-
-/**
- * Check if EDID supports the colorimetry.
- * @param   color [in]  Colorimetry
- * @return  If EDID supports the colorimetry, return 1; Otherwise, return 0.
- */
-static int CheckColorimetry(const enum HDMIColorimetry color)
-{
-    int i;
-
-    // do not need to parse if not extended colorimetry
-    if (color == HDMI_COLORIMETRY_NO_DATA ||
-            color == HDMI_COLORIMETRY_ITU601 ||
-            color == HDMI_COLORIMETRY_ITU709)
-        return 1;
-
-    // read EDID
-    if (!EDIDRead())
-       return 0;
-
-    // find VSDB
-    for (i = 1; i <= gExtensions; i++) {
-        if (IsTimingExtension(i)) { // if it's timing block
-            // check address
-            unsigned int ExtAddr = i*SIZEOFEDIDBLOCK + EDID_DATA_BLOCK_START_POS;
-            unsigned int EndAddr = i*SIZEOFEDIDBLOCK + gEdidData[i*SIZEOFEDIDBLOCK + EDID_DETAILED_TIMING_OFFSET_POS];
-            unsigned int tag,blockLen;
-
-            while (ExtAddr < EndAddr) {
-                // find the block tag and length
-                // tag
-                tag = gEdidData[ExtAddr] & EDID_TAG_CODE_MASK;
-                // block len
-                blockLen = (gEdidData[ExtAddr] & EDID_DATA_BLOCK_SIZE_MASK) + 1;
-
-                // check if it is colorimetry block
-                if (tag == EDID_EXTENDED_TAG_VAL && // extended tag
-                    gEdidData[ExtAddr+1] == EDID_EXTENDED_COLORIMETRY_VAL && // colorimetry block
-                    (blockLen-1) == EDID_EXTENDED_COLORIMETRY_BLOCK_LEN) { // check length
-                    // get supported DC value
-                    int colorimetry = (gEdidData[ExtAddr + 2]);
-                    int metadata = (gEdidData[ExtAddr + 3]);
-
-                    DPRINTF("EDID extened colorimetry = %x\n",colorimetry);
-                    DPRINTF("EDID gamut metadata profile = %x\n",metadata);
-
-                    // check colorDepth
-                    switch (color) {
-                    case HDMI_COLORIMETRY_EXTENDED_xvYCC601:
-                        if (colorimetry & EDID_XVYCC601_MASK && metadata)
-                            return 1;
-                        break;
-                    case HDMI_COLORIMETRY_EXTENDED_xvYCC709:
-                        if (colorimetry & EDID_XVYCC709_MASK && metadata)
-                            return 1;
-                        break;
-                    default:
-                        break;
-                    }
-                    return 0;
-                }
-                // else find next block
-                ExtAddr += blockLen;
-            }
-        }
-    }
-
-    return 0;
-}
-
-/**
- * Get Max TMDS clock that HDMI Rx can receive.
- * @return  If available, return MaxTMDS clock; Otherwise, return 0.
- */
-static unsigned int GetMaxTMDS(void)
-{
-    int i;
-    unsigned int StartAddr;
-
-    // find VSDB
-    for (i = 1; i <= gExtensions; i++) {
-        if (IsTimingExtension(i) // if it's timing block
-            && ((StartAddr = GetVSDBOffset(i)) > 0)) { // check block
-            int blockLength = gEdidData[StartAddr] & EDID_DATA_BLOCK_SIZE_MASK;
-            if (blockLength >= EDID_MAX_TMDS_POS) {
-                // get supported DC value
-                return gEdidData[StartAddr + EDID_MAX_TMDS_POS];
-            }
-        }
-    }
-
-    return 0;
-}
-
-/**
- * Save first 16 VIC of EDID
- */
-static void SaveVIC(void)
-{
-    int extension;
-    int vic_count = 0;
-    for (extension = 1; extension <= gExtensions && vic_count < NUM_OF_VIC_FOR_3D; extension++) {
-        unsigned int StartAddr = extension*SIZEOFEDIDBLOCK;
-        unsigned int ExtAddr = StartAddr + EDID_DATA_BLOCK_START_POS;
-        unsigned int tag,blockLen;
-        unsigned int DTDStartAddr = gEdidData[StartAddr + EDID_DETAILED_TIMING_OFFSET_POS];
-
-        while (ExtAddr < StartAddr + DTDStartAddr) {
-            // find the block tag and length
-            // tag
-            tag = gEdidData[ExtAddr] & EDID_TAG_CODE_MASK;
-            // block len
-            blockLen = (gEdidData[ExtAddr] & EDID_DATA_BLOCK_SIZE_MASK) + 1;
-
-            // check if it is short video description
-            if (tag == EDID_SHORT_VID_DEC_TAG_VAL) {
-                // if so, check SVD
-                unsigned int edid_index;
-                for (edid_index = 1; edid_index < blockLen && vic_count < NUM_OF_VIC_FOR_3D; edid_index++) {
-                    DPRINTF("EDIDVIC = %d\r\n", gEdidData[ExtAddr+edid_index] & EDID_SVD_VIC_MASK);
-
-                    // check VIC with SVDB
-                    aVIC[vic_count++] = (gEdidData[ExtAddr+edid_index] & EDID_SVD_VIC_MASK);
-                }
-            }
-            // else find next block
-            ExtAddr += blockLen;
-        }
-    }
-}
-
-/**
- * Check if Rx supports requested 3D format.
- * @param   pVideo [in]   HDMI Video Parameter
- * @return  If Rx supports requested 3D format, return 1; Otherwise, return 0.
- */
-static int EDID3DFormatSupport(const struct HDMIVideoParameter * const pVideo)
-{
-    int edid_index;
-    unsigned int StartAddr;
-    unsigned int vic;
-    vic = (pVideo->pixelAspectRatio == HDMI_PIXEL_RATIO_16_9) ?
-            aVideoParams[pVideo->resolution].VIC16_9 : aVideoParams[pVideo->resolution].VIC;
-
-    // if format == 2D, no need to check
-    if (pVideo->hdmi_3d_format == HDMI_2D_VIDEO_FORMAT)
-        return 1;
-
-    // check EDID data is valid or not
-    if (!EDIDRead())
-        return 0;
-
-    // save first 16 VIC to check
-    SaveVIC();
-
-    // find VSDB
-    for (edid_index = 1; edid_index <= gExtensions; edid_index++) {
-        if (IsTimingExtension(edid_index) // if it's timing block
-            && ((StartAddr = GetVSDBOffset(edid_index)) > 0)) { // check block
-            unsigned int blockLength = gEdidData[StartAddr] & EDID_DATA_BLOCK_SIZE_MASK;
-            unsigned int VSDBHdmiVideoPre = 0;
-            unsigned int VSDB3DPresent = 0;
-            unsigned int VSDB3DMultiPresent = 0;
-            unsigned int HDMIVICLen;
-            unsigned int HDMI3DLen;
-            int Hdmi3DStructure = 0;
-            unsigned int Hdmi3DMask = 0xFFFF;
-            unsigned int latency_offset = 0;
-
-            DPRINTF("VSDB Block length[0x%x] = 0x%x\r\n",StartAddr,blockLength);
-
-            // get HDMI Video Present  value
-            if (blockLength >= EDID_HDMI_EXT_POS) {
-                VSDBHdmiVideoPre = gEdidData[StartAddr + EDID_HDMI_EXT_POS]
-                            & EDID_HDMI_VIDEO_PRESENT_MASK;
-                DPRINTF("EDID HDMI Video Present = 0x%x\n",VSDBHdmiVideoPre);
-            } else { // data related to 3D format is not available
-                return 0;
-            }
-
-            // check if latency field is available
-            latency_offset = (gEdidData[StartAddr + EDID_HDMI_EXT_POS]
-                                                        & EDID_HDMI_LATENCY_MASK) >> EDID_HDMI_LATENCY_POS;
-            if (latency_offset == 0)
-                latency_offset = 4;
-            else if (latency_offset == 3)
-                latency_offset = 0;
-            else
-                latency_offset = 2;
-
-            StartAddr -= latency_offset;
-
-            // HDMI_VIC_LEN
-            HDMIVICLen = (gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS]
-                    & EDID_HDMI_VSDB_VIC_LEN_MASK) >> EDID_HDMI_VSDB_VIC_LEN_BIT;
-
-            if (pVideo->hdmi_3d_format == HDMI_VIC_FORMAT) {
-                if (HDMIVICLen) {
-                    for (edid_index = 0; edid_index < (int)HDMIVICLen; edid_index++) {
-                        if (vic == gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS + edid_index])
-                            return 1;
-                    }
-                    return 0;
-                } else {
-                    return 0;
-                }
-            }
-
-            // HDMI_3D_LEN
-            HDMI3DLen = gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS]
-                        & EDID_HDMI_VSDB_3D_LEN_MASK;
-
-            DPRINTF("HDMI VIC LENGTH[%x] = %x\r\n",
-                                    StartAddr + EDID_HDMI_EXT_LENGTH_POS, HDMIVICLen);
-            DPRINTF("HDMI 3D LENGTH[%x] = %x\r\n",
-                                    StartAddr + EDID_HDMI_EXT_LENGTH_POS, HDMI3DLen);
-
-            // check 3D_Present bit
-            if (blockLength >= (EDID_HDMI_3D_PRESENT_POS - latency_offset)) {
-                VSDB3DPresent = gEdidData[StartAddr + EDID_HDMI_3D_PRESENT_POS]
-                                & EDID_HDMI_3D_PRESENT_MASK;
-                VSDB3DMultiPresent = gEdidData[StartAddr + EDID_HDMI_3D_PRESENT_POS]
-                                & EDID_HDMI_3D_MULTI_PRESENT_MASK;
-            }
-
-            if (VSDB3DPresent) {
-                DPRINTF("VSDB 3D Present!!!\r\n");
-                // check with 3D madatory format
-                if (CheckResolution(pVideo->resolution, pVideo->pixelAspectRatio)) {
-                    int size = sizeof(edid_3d)/sizeof(struct edid_3d_mandatory);
-                    for (edid_index = 0; edid_index < size; edid_index++) {
-                        if (edid_3d[edid_index].resolution == pVideo->resolution &&
-                            edid_3d[edid_index].hdmi_3d_format == pVideo->hdmi_3d_format )
-                            return 1;
-                    }
-                }
-            }
-
-            // check 3D_Multi_Present bit
-            if (VSDB3DMultiPresent) {
-                DPRINTF("VSDB 3D Multi Present!!! = 0x%02x\r\n",VSDB3DMultiPresent);
-                // 3D Structure only
-                if (VSDB3DMultiPresent == EDID_3D_STRUCTURE_ONLY_EXIST) {
-                    // 3D Structure All
-                    Hdmi3DStructure = (gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS + HDMIVICLen + 1] << 8);
-                    Hdmi3DStructure |= gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS + HDMIVICLen + 2];
-                    DPRINTF("VSDB 3D Structure!!! = [0x%02x]\r\n",Hdmi3DStructure);
-                }
-
-                // 3D Structure and Mask
-                if (VSDB3DMultiPresent == EDID_3D_STRUCTURE_MASK_EXIST) {
-                    // 3D Structure All
-                    Hdmi3DStructure = (gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS + HDMIVICLen + 1] << 8);
-                    Hdmi3DStructure |= gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS + HDMIVICLen + 2];
-                    // 3D Structure Mask
-                    Hdmi3DMask |= (gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS + HDMIVICLen + 3] << 8);
-                    Hdmi3DMask |= gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS + HDMIVICLen + 4];
-                    DPRINTF("VSDB 3D Structure!!! = [0x%02x]\r\n",Hdmi3DStructure);
-                    DPRINTF("VSDB 3D Mask!!! = [0x%02x]\r\n",Hdmi3DMask);
-                    DPRINTF("Current 3D Video format!!! = [%d]\r\n",pVideo->hdmi_3d_format);
-                    DPRINTF("Current 3D Video format!!! = [0x%02x]\r\n",1<<pVideo->hdmi_3d_format);
-                }
-
-                // check 3D Structure and Mask
-                if (Hdmi3DStructure & (1<<pVideo->hdmi_3d_format)) {
-                    DPRINTF("VSDB 3D Structure Contains Current Video Structure!!!\r\n");
-                    // check first 16 EDID
-                    for (edid_index = 0; edid_index < NUM_OF_VIC_FOR_3D; edid_index++) {
-                        DPRINTF("VIC = %d, EDID Vic = %d!!!\r\n",vic,aVIC[edid_index]);
-                        if (Hdmi3DMask & (1<<edid_index)) {
-                            if (vic == aVIC[edid_index]) {
-                                DPRINTF("VSDB 3D Mask Contains Current Video format!!!\r\n");
-                                return 1;
-                            }
-                        }
-                    }
-                }
-            }
-
-            // check block length if HDMI_VIC or HDMI Multi available
-            if (blockLength >= (EDID_HDMI_EXT_LENGTH_POS - latency_offset)) {
-                unsigned int HDMI3DExtLen = HDMI3DLen - (VSDB3DMultiPresent>>EDID_HDMI_3D_MULTI_PRESENT_BIT)*2;
-                unsigned int VICOrder;
-
-                // check if there is 3D extra data ?
-                //TODO: check 3D_Detail in case of SSH
-                if (HDMI3DExtLen) {
-                    // check HDMI 3D Extra Data
-                    for (edid_index = 0; edid_index < (int)(HDMI3DExtLen / 2); edid_index++) {
-                        VICOrder = gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS + HDMIVICLen +
-                                          (VSDB3DMultiPresent>>EDID_HDMI_3D_MULTI_PRESENT_BIT) * 2 + edid_index * 2]
-                                                    & EDID_HDMI_2D_VIC_ORDER_MASK;
-                        VICOrder = (1<<VICOrder);
-                        Hdmi3DStructure = gEdidData[StartAddr + EDID_HDMI_EXT_LENGTH_POS + HDMIVICLen +
-                                                 (VSDB3DMultiPresent>>EDID_HDMI_3D_MULTI_PRESENT_BIT) * 2 + edid_index * 2]
-                                                 & EDID_HDMI_3D_STRUCTURE_MASK;
-                        Hdmi3DStructure = (1<<Hdmi3DStructure);
-                        if (Hdmi3DStructure == pVideo->hdmi_3d_format && vic == aVIC[VICOrder])
-                            return 1;
-                    }
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-/**
- * Initialize EDID library. This will intialize DDC library.
- * @return  If success, return 1; Otherwise, return 0.
- */
-int EDIDOpen(void)
-{
-    // init DDC
-    return DDCOpen();
-}
-
-/**
- * Finalize EDID library. This will finalize DDC library.
- * @return  If success, return 1; Otherwise, return 0.
- */
-int EDIDClose(void)
-{
-    // reset EDID
-    EDIDReset();
-
-    // close EDDC
-    return DDCClose();
-}
-
-/**
- * Read EDID data of Rx.
- * @return If success, return 1; Otherwise, return 0;
- */
-int EDIDRead(void)
-{
-    int block,dataPtr;
-    unsigned char temp[SIZEOFEDIDBLOCK];
-
-    // if already read??
-    if (EDIDValid())
-        return 1;
-
-    // read EDID Extension Number
-    // read EDID
-    if (!ReadEDIDBlock(0,temp))
-        return 0;
-
-    // get extension
-    gExtensions = temp[EDID_EXTENSION_NUMBER_POS];
-
-    // prepare buffer
-    gEdidData = (unsigned char*)malloc((gExtensions+1)*SIZEOFEDIDBLOCK);
-    if (!gEdidData)
-        return 0;
-
-    // copy EDID Block 0
-    memcpy(gEdidData,temp,SIZEOFEDIDBLOCK);
-
-    // read EDID Extension
-    for (block = 1,dataPtr = SIZEOFEDIDBLOCK; block <= gExtensions; block++,dataPtr+=SIZEOFEDIDBLOCK) {
-        // read extension 1~gExtensions
-        if (!ReadEDIDBlock(block, gEdidData+dataPtr)) {
-            // reset buffer
-            EDIDReset();
-            return 0;
-        }
-    }
-
-    // check if extension is more than 1, and first extension block is not block map.
-    if (gExtensions > 1 && gEdidData[SIZEOFEDIDBLOCK] != EDID_BLOCK_MAP_EXT_TAG_VAL) {
-        // reset buffer
-        DPRINTF("EDID has more than 1 extension but, first extension block is not block map\n");
-        EDIDReset();
-        return 0;
-    }
-
-    return 1;
-}
-
-/**
- * Reset stored EDID data.
- */
-void EDIDReset(void)
-{
-    if (gEdidData) {
-        free(gEdidData);
-        gEdidData = NULL;
-        DPRINTF("\t\t\t\tEDID is reset!!!\n");
-    }
-}
-
-/**
- * Get CEC physical address.
- * @param   outAddr [out]   CEC physical address. LSB 2 bytes is available. [0:0:AB:CD]
- * @return  If success, return 1; Otherwise, return 0.
- */
-int EDIDGetCECPhysicalAddress(int* const outAddr)
-{
-    int i;
-    unsigned int StartAddr;
-
-    // check EDID data is valid or not
-    // read EDID
-    if (!EDIDRead())
-        return 0;
-
-    // find VSDB
-    for (i = 1; i <= gExtensions; i++) {
-        if (IsTimingExtension(i) // if it's timing block
-            && (StartAddr = GetVSDBOffset(i)) > 0) { // check block
-            // get supported DC value
-            // int tempDC1 = (int)(gEdidData[tempAddr+EDID_DC_POS]);
-            int phyAddr = gEdidData[StartAddr + EDID_CEC_PHYICAL_ADDR] << 8;
-            phyAddr |= gEdidData[StartAddr + EDID_CEC_PHYICAL_ADDR+1];
-
-            DPRINTF("phyAddr = %x\n",phyAddr);
-
-            *outAddr = phyAddr;
-
-            return 1;
-        }
-    }
-
-    return 0;
-}
-
-/**
- * Check if Rx supports HDMI/DVI mode or not.
- * @param   video [in]   HDMI or DVI mode to check
- * @return  If Rx supports requested mode, return 1; Otherwise, return 0.
- */
-int EDIDHDMIModeSupport(struct HDMIVideoParameter * const video)
-{
-    // check if read edid?
-    if (!EDIDRead()) {
-        DPRINTF("EDID Read Fail!!!\n");
-        return 0;
-    }
-
-    // check hdmi mode
-    if (video->mode == HDMI) {
-        if (!CheckHDMIMode()) {
-            DPRINTF("HDMI mode Not Supported\n");
-            return 0;
-        }
-    }
-    return 1;
-}
-
-/**
- * Check if Rx supports requested video resoultion or not.
- * @param   video [in]   Video parameters to check
- * @return  If Rx supports video parameters, return 1; Otherwise, return 0.
- */
-int EDIDVideoResolutionSupport(struct HDMIVideoParameter * const video)
-{
-    unsigned int TMDSClock;
-    unsigned int MaxTMDS = 0;
-
-    // check if read edid?
-    if (!EDIDRead()) {
-        DPRINTF("EDID Read Fail!!!\n");
-        return 0;
-    }
-
-    // get max tmds
-    MaxTMDS = GetMaxTMDS()*5;
-
-    // Check MAX TMDS
-    TMDSClock = aVideoParams[video->resolution].PixelClock/100;
-    if (video->colorDepth == HDMI_CD_36)
-        TMDSClock *= 1.5;
-    else if (video->colorDepth == HDMI_CD_30)
-        TMDSClock *=1.25;
-
-    DPRINTF("MAX TMDS = %d, Current TMDS = %d\n",MaxTMDS, TMDSClock);
-    if (MaxTMDS != 0 && MaxTMDS < TMDSClock) {
-        DPRINTF("Pixel clock is beyond Maximun TMDS in EDID\n");
-        return 0;
-    }
-
-    // check resolution
-    if (!CheckResolution(video->resolution,video->pixelAspectRatio)) {
-        DPRINTF("Video Resolution Not Supported\n");
-        return 0;
-    }
-
-    // check 3D format
-    if (!EDID3DFormatSupport(video)) {
-        DPRINTF("3D Format Not Supported\n");
-        return 0;
-    }
-
-    return 1;
-}
-
-/**
- * Check if Rx supports requested color depth or not.
- * @param   video [in]   Video parameters to check
- * @return  If Rx supports video parameters, return 1; Otherwise, return 0.
- */
-int EDIDColorDepthSupport(struct HDMIVideoParameter * const video)
-{
-    // check if read edid?
-    if (!EDIDRead()) {
-        DPRINTF("EDID Read Fail!!!\n");
-        return 0;
-    }
-
-    // check resolution
-    if (!CheckColorDepth(video->colorDepth,video->colorSpace)) {
-        DPRINTF("Color Depth Not Supported\n");
-        return 0;
-    }
-
-    return 1;
-}
-
-/**
- * Check if Rx supports requested color space or not.
- * @param   video [in]   Video parameters to check
- * @return  If Rx supports video parameters, return 1; Otherwise, return 0.
- */
-int EDIDColorSpaceSupport(struct HDMIVideoParameter * const video)
-{
-    // check if read edid?
-    if (!EDIDRead()) {
-        DPRINTF("EDID Read Fail!!!\n");
-        return 0;
-    }
-    // check color space
-    if (!CheckColorSpace(video->colorSpace)) {
-        DPRINTF("Color Space Not Supported\n");
-        return 0;
-    }
-
-    return 1;
-}
-
-/**
- * Check if Rx supports requested colorimetry or not.
- * @param   video [in]   Video parameters to check
- * @return  If Rx supports video parameters, return 1; Otherwise, return 0.
- */
-int EDIDColorimetrySupport(struct HDMIVideoParameter * const video)
-{
-    // check if read edid?
-    if (!EDIDRead()) {
-        DPRINTF("EDID Read Fail!!!\n");
-        return 0;
-    }
-
-    // check colorimetry
-    if (!CheckColorimetry(video->colorimetry)) {
-        DPRINTF("Colorimetry Not Supported\n");
-        return 0;
-    }
-
-    return 1;
-}
-
-/**
- * Check if Rx supports requested audio parameters or not.
- * @param   audio [in]   Audio parameters to check
- * @return  If Rx supports audio parameters, return 1; Otherwise, return 0.
- */
-int EDIDAudioModeSupport(struct HDMIAudioParameter * const audio)
-{
-    int i;
-
-    // read EDID
-    if (!EDIDRead()) {
-        DPRINTF("EDID Read Fail!!!\n");
-        return 0;
-    }
-
-    // check EDID Extension
-    // find timing block
-    for (i = 1; i <= gExtensions; i++) {
-        if (IsTimingExtension(i)) { // if it's timing block
-            // find Short Audio Description
-            unsigned int StartAddr = i*SIZEOFEDIDBLOCK;
-            unsigned int ExtAddr = StartAddr + EDID_DATA_BLOCK_START_POS;
-            unsigned int tag,blockLen;
-            unsigned int DTDStartAddr = gEdidData[StartAddr + EDID_DETAILED_TIMING_OFFSET_POS];
-
-            while (ExtAddr < StartAddr + DTDStartAddr) {
-                // find the block tag and length
-                // tag
-                tag = gEdidData[ExtAddr] & EDID_TAG_CODE_MASK;
-                // block len
-                blockLen = (gEdidData[ExtAddr] & EDID_DATA_BLOCK_SIZE_MASK) + 1;
-
-                DPRINTF("tag = %d\n",tag);
-                DPRINTF("blockLen = %d\n",blockLen-1);
-
-                // check if it is short video description
-                if (tag == EDID_SHORT_AUD_DEC_TAG_VAL) {
-                    // if so, check SAD
-                    unsigned int j, channelNum;
-                    int audioFormat,sampleFreq,wordLen;
-                    for (j = 1; j < blockLen; j += 3) {
-                        audioFormat = gEdidData[ExtAddr+j] & EDID_SAD_CODE_MASK;
-                        channelNum = gEdidData[ExtAddr+j] & EDID_SAD_CHANNEL_MASK;
-                        sampleFreq = gEdidData[ExtAddr+j+1];
-                        wordLen = gEdidData[ExtAddr+j+2];
-
-                        DPRINTF("request = %d, EDIDAudioFormatCode = %d\n",(audio->formatCode)<<3, audioFormat);
-                        DPRINTF("request = %d, EDIDChannelNumber= %d\n",(audio->channelNum)-1, channelNum);
-                        DPRINTF("request = %d, EDIDSampleFreq= %d\n",1<<(audio->sampleFreq), sampleFreq);
-                        DPRINTF("request = %d, EDIDWordLeng= %d\n",1<<(audio->wordLength), wordLen);
-
-                        // check parameter
-                        // check audioFormat
-                        if (audioFormat & ( (audio->formatCode) << 3) &&  // format code
-                                channelNum >= ( (audio->channelNum) -1) &&  // channel number
-                                (sampleFreq & (1<<(audio->sampleFreq)))) { // sample frequency
-                            if (audioFormat == LPCM_FORMAT) { // check wordLen
-                                int ret = 0;
-                                switch (audio->wordLength) {
-                                case WORD_16:
-                                case WORD_17:
-                                case WORD_18:
-                                case WORD_19:
-                                case WORD_20:
-                                    ret = wordLen & (1<<1);
-                                    break;
-                                case WORD_21:
-                                case WORD_22:
-                                case WORD_23:
-                                case WORD_24:
-                                    ret = wordLen & (1<<2);
-                                    break;
-                                }
-                                return ret;
-                            }
-                            return 1; // if not LPCM
-                        }
-                    }
-                }
-                // else find next block
-                ExtAddr += blockLen;
-            }
-        }
-    }
-
-    return 0;
-}
diff --git a/exynos5/hal/libhdmi/libsForhdmi/libedid/libedid.h b/exynos5/hal/libhdmi/libsForhdmi/libedid/libedid.h
deleted file mode 100644
index dfd3096..0000000
--- a/exynos5/hal/libhdmi/libsForhdmi/libedid/libedid.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright@ Samsung Electronics Co. LTD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _LIBEDID_H_
-#define _LIBEDID_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "video.h"
-#include "audio.h"
-
-int EDIDOpen(void);
-int EDIDRead(void);
-void EDIDReset(void);
-int EDIDHDMIModeSupport(struct HDMIVideoParameter *video);
-int EDIDVideoResolutionSupport(struct HDMIVideoParameter *video);
-int EDIDColorDepthSupport(struct HDMIVideoParameter *video);
-int EDIDColorSpaceSupport(struct HDMIVideoParameter *video);
-int EDIDColorimetrySupport(struct HDMIVideoParameter *video);
-int EDIDAudioModeSupport(struct HDMIAudioParameter *audio);
-int EDIDGetCECPhysicalAddress(int* outAddr);
-int EDIDClose(void);
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* _LIBEDID_H_ */
diff --git a/exynos5/hal/libhwcomposer/Android.mk b/exynos5/hal/libhwcomposer/Android.mk
deleted file mode 100644
index 982d1be..0000000
--- a/exynos5/hal/libhwcomposer/Android.mk
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-LOCAL_PATH:= $(call my-dir)
-# HAL module implemenation, not prelinked and stored in
-# hw/<COPYPIX_HARDWARE_MODULE_ID>.<ro.product.board>.so
-
-include $(CLEAR_VARS)
-LOCAL_PRELINK_MODULE := false
-LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
-LOCAL_SHARED_LIBRARIES := liblog libcutils libEGL \
-			  libGLESv1_CM
-
-LOCAL_SHARED_LIBRARIES += libion
-
-LOCAL_C_INCLUDES := \
-	$(LOCAL_PATH)/../include
-
-LOCAL_SRC_FILES := SecHWCLog.cpp SecHWCUtils.cpp SecHWC.cpp
-
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/../libfimg
-
-ifeq ($(TARGET_SOC),exynos4210)
-LOCAL_CFLAGS += -DSAMSUNG_EXYNOS4210
-endif
-
-ifeq ($(TARGET_SOC),exynos4212)
-LOCAL_CFLAGS += -DSAMSUNG_EXYNOS4212
-endif
-
-ifeq ($(TARGET_SOC),exynos5250)
-LOCAL_CFLAGS += -DSAMSUNG_EXYNOS5250
-endif
-
-ifeq ($(BOARD_USES_HDMI),true)
-LOCAL_C_INCLUDES += \
-	device/samsung/$(TARGET_BOARD_PLATFORM)/libhwcomposer \
-	device/samsung/$(TARGET_BOARD_PLATFORM)/include \
-	device/samsung/$(TARGET_BOARD_PLATFORM)/libhdmi/libhdmiservice
-
-LOCAL_SHARED_LIBRARIES 	+= libhdmiclient libTVOut
-
-LOCAL_CFLAGS += -DBOARD_USES_HDMI
-LOCAL_CFLAGS += -DBOARD_HDMI_STD=$(BOARD_HDMI_STD)
-LOCAL_CFLAGS += -DVIDEO_DUAL_DISPLAY
-
-ifeq ($(BOARD_USES_HDMI_SUBTITLES),true)
-	LOCAL_CFLAGS += -DBOARD_USES_HDMI_SUBTITLES
-endif
-
-ifeq ($(BOARD_HDMI_STD), STD_NTSC_M)
-LOCAL_CFLAGS  += -DSTD_NTSC_M
-endif
-
-ifeq ($(BOARD_HDMI_STD),STD_480P)
-LOCAL_CFLAGS  += -DSTD_480P
-endif
-
-ifeq ($(BOARD_HDMI_STD),STD_720P)
-LOCAL_CFLAGS  += -DSTD_720P
-endif
-
-ifeq ($(BOARD_HDMI_STD),STD_1080P)
-LOCAL_CFLAGS  += -DSTD_1080P
-endif
-endif
-
-LOCAL_MODULE := hwcomposer.$(TARGET_BOARD_PLATFORM)
-LOCAL_MODULE_TAGS := optional
-include $(BUILD_SHARED_LIBRARY)
diff --git a/exynos5/hal/libhwcomposer/SecHWC.cpp b/exynos5/hal/libhwcomposer/SecHWC.cpp
deleted file mode 100644
index aa07972..0000000
--- a/exynos5/hal/libhwcomposer/SecHWC.cpp
+++ /dev/null
@@ -1,901 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- *
- * @author Rama, Meka(v.meka@samsung.com)
-           Sangwoo, Park(sw5771.park@samsung.com)
-           Jamie Oh (jung-min.oh@samsung.com)
- * @date   2011-03-11
- *
- */
-
-#include <cutils/log.h>
-#include <cutils/atomic.h>
-#include <EGL/egl.h>
-
-#include "SecHWCUtils.h"
-#include "gralloc_priv.h"
-
-#ifdef HWC_HWOVERLAY
-#include <GLES/gl.h>
-#endif
-
-//#define CHECK_EGL_FPS
-#ifdef CHECK_EGL_FPS
-extern void check_fps();
-#endif
-
-#if defined(BOARD_USES_HDMI)
-#include "SecHdmiClient.h"
-#include "SecTVOutService.h"
-#include "SecHdmi.h"
-
-static int lcd_width, lcd_height;
-static int prev_format = 0;
-
-#define CHECK_TIME_DEBUG 0
-#define SUPPORT_AUTO_UI_ROTATE
-#endif
-
-static int hwc_device_open(const struct hw_module_t* module, const char* name,
-        struct hw_device_t** device);
-
-static struct hw_module_methods_t hwc_module_methods = {
-    open: hwc_device_open
-};
-
-hwc_module_t HAL_MODULE_INFO_SYM = {
-    common: {
-        tag: HARDWARE_MODULE_TAG,
-        version_major: 1,
-        version_minor: 0,
-        id: HWC_HARDWARE_MODULE_ID,
-        name: "Samsung S5PC21X hwcomposer module",
-        author: "SAMSUNG",
-        methods: &hwc_module_methods,
-    }
-};
-
-/*****************************************************************************/
-
-static void dump_layer(hwc_layer_t const* l) {
-    ALOGD("\ttype=%d, flags=%08x, handle=%p, tr=%02x, blend=%04x, "
-            "{%d,%d,%d,%d}, {%d,%d,%d,%d}",
-            l->compositionType, l->flags, l->handle, l->transform, l->blending,
-            l->sourceCrop.left,
-            l->sourceCrop.top,
-            l->sourceCrop.right,
-            l->sourceCrop.bottom,
-            l->displayFrame.left,
-            l->displayFrame.top,
-            l->displayFrame.right,
-            l->displayFrame.bottom);
-}
-
-void calculate_rect(struct hwc_win_info_t *win, hwc_layer_t *cur,
-        sec_rect *rect)
-{
-    rect->x = cur->displayFrame.left;
-    rect->y = cur->displayFrame.top;
-    rect->w = cur->displayFrame.right - cur->displayFrame.left;
-    rect->h = cur->displayFrame.bottom - cur->displayFrame.top;
-
-    if (rect->x < 0) {
-        if (rect->w + rect->x > win->lcd_info.xres)
-            rect->w = win->lcd_info.xres;
-        else
-            rect->w = rect->w + rect->x;
-        rect->x = 0;
-    } else {
-        if (rect->w + rect->x > win->lcd_info.xres)
-            rect->w = win->lcd_info.xres - rect->x;
-    }
-    if (rect->y < 0) {
-        if (rect->h + rect->y > win->lcd_info.yres)
-            rect->h = win->lcd_info.yres;
-        else
-            rect->h = rect->h + rect->y;
-        rect->y = 0;
-    } else {
-        if (rect->h + rect->y > win->lcd_info.yres)
-            rect->h = win->lcd_info.yres - rect->y;
-    }
-}
-
-static int set_src_dst_img_rect(hwc_layer_t *cur,
-        struct hwc_win_info_t *win,
-        struct sec_img *src_img,
-        struct sec_img *dst_img,
-        struct sec_rect *src_rect,
-        struct sec_rect *dst_rect,
-        int win_idx)
-{
-    private_handle_t *prev_handle = (private_handle_t *)(cur->handle);
-    sec_rect rect;
-
-    /* 1. Set src_img from prev_handle */
-    src_img->f_w     = prev_handle->width;
-    src_img->f_h     = prev_handle->height;
-    src_img->w       = prev_handle->width;
-    src_img->h       = prev_handle->height;
-    src_img->format  = prev_handle->format;
-    src_img->base    = (uint32_t)prev_handle->base;
-    src_img->offset  = prev_handle->offset;
-    src_img->mem_id  = prev_handle->fd;
-    src_img->paddr  = prev_handle->paddr;
-    src_img->usage  = prev_handle->usage;
-    src_img->uoffset  = prev_handle->uoffset;
-    src_img->voffset  = prev_handle->voffset;
-
-    switch (src_img->format) {
-    case HAL_PIXEL_FORMAT_YV12:
-    case HAL_PIXEL_FORMAT_YCbCr_420_P:
-    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
-    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR:
-    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL:
-        src_img->f_w = (src_img->f_w + 15) & ~15;
-        src_img->f_h = (src_img->f_h + 15) & ~15;
-        break;
-    default:
-        src_img->f_w = src_img->w;
-        src_img->f_h = src_img->h;
-        break;
-    }
-
-    /* 2. Set dst_img from window(lcd) */
-    calculate_rect(win, cur, &rect);
-    dst_img->f_w = win->lcd_info.xres;
-    dst_img->f_h = win->lcd_info.yres;
-    dst_img->w = rect.w;
-    dst_img->h = rect.h;
-
-    switch (win->lcd_info.bits_per_pixel) {
-    case 32:
-        dst_img->format = HAL_PIXEL_FORMAT_RGBX_8888;
-        break;
-    default:
-        dst_img->format = HAL_PIXEL_FORMAT_RGB_565;
-        break;
-    }
-
-    dst_img->base     = win->addr[win->buf_index];
-    dst_img->offset   = 0;
-    dst_img->mem_id   = 0;
-
-    /* 3. Set src_rect(crop rect) */
-    if (cur->displayFrame.left < 0) {
-        src_rect->x =
-            (0 - cur->displayFrame.left)
-            *(src_img->w)
-            /(cur->displayFrame.right - cur->displayFrame.left + 1);
-        if (cur->displayFrame.right + 1 > win->lcd_info.xres) {
-            src_rect->w =
-                (cur->sourceCrop.right - cur->sourceCrop.left + 1) -
-                src_rect->x -
-                (cur->displayFrame.right - win->lcd_info.xres)
-                *(src_img->w)
-                /(cur->displayFrame.right - cur->displayFrame.left + 1);
-        } else {
-            src_rect->w =
-                (cur->sourceCrop.right - cur->sourceCrop.left + 1) -
-                src_rect->x;
-        }
-    } else {
-        src_rect->x = cur->sourceCrop.left;
-        if (cur->displayFrame.right + 1 > win->lcd_info.xres) {
-            src_rect->w =
-                (cur->sourceCrop.right - cur->sourceCrop.left + 1) -
-                src_rect->x -
-                (cur->displayFrame.right - win->lcd_info.xres)
-                *(src_img->w)
-                /(cur->displayFrame.right - cur->displayFrame.left + 1);
-        } else {
-            src_rect->w =
-                (cur->sourceCrop.right - cur->sourceCrop.left + 1);
-        }
-    }
-    if (cur->displayFrame.top < 0) {
-        src_rect->y =
-            (0 - cur->displayFrame.top)
-            *(src_img->h)
-            /(cur->displayFrame.bottom - cur->displayFrame.top + 1);
-        if (cur->displayFrame.bottom + 1 > win->lcd_info.yres) {
-            src_rect->h =
-                (cur->sourceCrop.bottom - cur->sourceCrop.top + 1) -
-                src_rect->y -
-                (cur->displayFrame.bottom - win->lcd_info.yres)
-                *(src_img->h)
-                /(cur->displayFrame.bottom - cur->displayFrame.top + 1);
-        } else {
-            src_rect->h =
-                (cur->sourceCrop.bottom - cur->sourceCrop.top + 1) -
-                src_rect->y;
-        }
-    } else {
-        src_rect->y = cur->sourceCrop.top;
-        if (cur->displayFrame.bottom + 1 > win->lcd_info.yres) {
-            src_rect->h =
-                (cur->sourceCrop.bottom - cur->sourceCrop.top + 1) -
-                src_rect->y -
-                (cur->displayFrame.bottom - win->lcd_info.yres)
-                *(src_img->h)
-                /(cur->displayFrame.bottom - cur->displayFrame.top + 1);
-        } else {
-            src_rect->h =
-                (cur->sourceCrop.bottom - cur->sourceCrop.top + 1);
-        }
-    }
-
-    SEC_HWC_Log(HWC_ALOG_DEBUG,
-            "crop information()::"
-            "sourceCrop left(%d),top(%d),right(%d),bottom(%d),"
-            "src_rect x(%d),y(%d),w(%d),h(%d),"
-            "prev_handle w(%d),h(%d)",
-            cur->sourceCrop.left,
-            cur->sourceCrop.top,
-            cur->sourceCrop.right,
-            cur->sourceCrop.bottom,
-            src_rect->x, src_rect->y, src_rect->w, src_rect->h,
-            prev_handle->width, prev_handle->height);
-
-    src_rect->x = SEC_MAX(src_rect->x, 0);
-    src_rect->y = SEC_MAX(src_rect->y, 0);
-    src_rect->w = SEC_MAX(src_rect->w, 0);
-    src_rect->w = SEC_MIN(src_rect->w, prev_handle->width);
-    src_rect->h = SEC_MAX(src_rect->h, 0);
-    src_rect->h = SEC_MIN(src_rect->h, prev_handle->height);
-
-    /* 4. Set dst_rect(fb or lcd)
-     *    fimc dst image will be stored from left top corner
-     */
-    dst_rect->x = 0;
-    dst_rect->y = 0;
-    dst_rect->w = win->rect_info.w;
-    dst_rect->h = win->rect_info.h;
-
-    /* Summery */
-    SEC_HWC_Log(HWC_ALOG_DEBUG,
-            "set_src_dst_img_rect()::"
-            "SRC w(%d),h(%d),f_w(%d),f_h(%d),fmt(0x%x),"
-            "base(0x%x),offset(%d),paddr(0x%X)=>\r\n"
-            "   DST w(%d),h(%d),f(0x%x),base(0x%x),"
-            "offset(%d),mem_id(%d),"
-            "rot(%d),win_idx(%d)"
-            "   SRC_RECT x(%d),y(%d),w(%d),h(%d)=>"
-            "DST_RECT x(%d),y(%d),w(%d),h(%d)",
-            src_img->w, src_img->h, src_img->f_w, src_img->f_h, src_img->format,
-            src_img->base, src_img->offset, src_img->paddr,
-            dst_img->w, dst_img->h,  dst_img->format, dst_img->base,
-            dst_img->offset, dst_img->mem_id,
-            cur->transform, win_idx,
-            src_rect->x, src_rect->y, src_rect->w, src_rect->h,
-            dst_rect->x, dst_rect->y, dst_rect->w, dst_rect->h);
-
-    return 0;
-}
-
-static int get_hwc_compos_decision(hwc_layer_t* cur, int iter, int win_cnt)
-{
-    if(cur->flags & HWC_SKIP_LAYER  || !cur->handle) {
-        SEC_HWC_Log(HWC_ALOG_DEBUG, "%s::is_skip_layer  %d  cur->handle %x ",
-                __func__, cur->flags & HWC_SKIP_LAYER, cur->handle);
-
-        return HWC_FRAMEBUFFER;
-    }
-
-    private_handle_t *prev_handle = (private_handle_t *)(cur->handle);
-    int compositionType = HWC_FRAMEBUFFER;
-
-    if (iter == 0) {
-    /* check here....if we have any resolution constraints */
-        if (((cur->sourceCrop.right - cur->sourceCrop.left + 1) < 16) ||
-            ((cur->sourceCrop.bottom - cur->sourceCrop.top + 1) < 8))
-            return compositionType;
-
-        if ((cur->transform == HAL_TRANSFORM_ROT_90) ||
-            (cur->transform == HAL_TRANSFORM_ROT_270)) {
-            if (((cur->displayFrame.right - cur->displayFrame.left + 1) < 4) ||
-                ((cur->displayFrame.bottom - cur->displayFrame.top + 1) < 8))
-                return compositionType;
-        } else if (((cur->displayFrame.right - cur->displayFrame.left + 1) < 8) ||
-                   ((cur->displayFrame.bottom - cur->displayFrame.top + 1) < 4)) {
-            return compositionType;
-        }
-
-        switch (prev_handle->format) {
-        case HAL_PIXEL_FORMAT_YV12:                 /* YCrCb_420_P */
-        case HAL_PIXEL_FORMAT_YCbCr_420_P:
-        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
-        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
-        case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR:
-        case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL:
-        case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR:
-        case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL:
-            if ((prev_handle->usage & GRALLOC_USAGE_HWC_HWOVERLAY) &&
-                 (cur->blending == HWC_BLENDING_NONE))
-                compositionType = HWC_OVERLAY;
-            else
-                compositionType = HWC_FRAMEBUFFER;
-            break;
-        default:
-            compositionType = HWC_FRAMEBUFFER;
-            break;
-        }
-    }
-
-#ifdef SUB_TITLES_HWC
-    else if ((win_cnt > 0) &&
-            (prev_handle->usage & GRALLOC_USAGE_EXTERNAL_DISP)) {
-        switch (prev_handle->format) {
-        case HAL_PIXEL_FORMAT_RGBA_8888:
-        case HAL_PIXEL_FORMAT_RGBX_8888:
-        case HAL_PIXEL_FORMAT_BGRA_8888:
-        case HAL_PIXEL_FORMAT_RGB_888:
-        case HAL_PIXEL_FORMAT_RGB_565:
-        case HAL_PIXEL_FORMAT_RGBA_5551:
-        case HAL_PIXEL_FORMAT_RGBA_4444:
-            compositionType = HWC_OVERLAY;
-            break;
-        default:
-            compositionType = HWC_FRAMEBUFFER;
-            break;
-        }
-
-        SEC_HWC_Log(HWC_ALOG_DEBUG, "2nd iter###%s:: compositionType %d bpp %d"
-                " format %x src[%d %d %d %d] dst[%d %d %d %d] srcImg[%d %d]",
-                __func__, compositionType, prev_handle->bpp,
-                prev_handle->format,
-                cur->sourceCrop.left, cur->sourceCrop.right,
-                cur->sourceCrop.top, cur->sourceCrop.bottom,
-                cur->displayFrame.left, cur->displayFrame.right,
-                cur->displayFrame.top, cur->displayFrame.bottom,
-                prev_handle->width, prev_handle->height);
-    }
-#endif
-
-    SEC_HWC_Log(HWC_ALOG_DEBUG,
-            "%s::compositionType(%d)=>0:FB,1:OVERLAY \r\n"
-            "   format(0x%x),magic(0x%x),flags(%d),size(%d),offset(%d)"
-            "b_addr(0x%x),usage(%d),w(%d),h(%d),bpp(%d)",
-            "get_hwc_compos_decision()", compositionType,
-            prev_handle->format, prev_handle->magic, prev_handle->flags,
-            prev_handle->size, prev_handle->offset, prev_handle->base,
-            prev_handle->usage, prev_handle->width, prev_handle->height,
-            prev_handle->bpp);
-
-    return  compositionType;
-}
-
-static void reset_win_rect_info(hwc_win_info_t *win)
-{
-    win->rect_info.x = 0;
-    win->rect_info.y = 0;
-    win->rect_info.w = 0;
-    win->rect_info.h = 0;
-    return;
-}
-
-
-static int assign_overlay_window(struct hwc_context_t *ctx, hwc_layer_t *cur,
-        int win_idx, int layer_idx)
-{
-    struct hwc_win_info_t   *win;
-    sec_rect   rect;
-    int ret = 0;
-
-    if (NUM_OF_WIN <= win_idx)
-        return -1;
-
-    win = &ctx->win[win_idx];
-
-    SEC_HWC_Log(HWC_ALOG_DEBUG,
-            "%s:: left(%d),top(%d),right(%d),bottom(%d),transform(%d)"
-            "lcd_info.xres(%d),lcd_info.yres(%d)",
-            "++assign_overlay_window()",
-            cur->displayFrame.left, cur->displayFrame.top,
-            cur->displayFrame.right, cur->displayFrame.bottom, cur->transform,
-            win->lcd_info.xres, win->lcd_info.yres);
-
-    calculate_rect(win, cur, &rect);
-
-    if ((rect.x != win->rect_info.x) || (rect.y != win->rect_info.y) ||
-        (rect.w != win->rect_info.w) || (rect.h != win->rect_info.h)){
-        win->rect_info.x = rect.x;
-        win->rect_info.y = rect.y;
-        win->rect_info.w = rect.w;
-        win->rect_info.h = rect.h;
-            //turnoff the window and set the window position with new conf...
-        if (window_set_pos(win) < 0) {
-            SEC_HWC_Log(HWC_ALOG_ERROR, "%s::window_set_pos is failed : %s",
-                    __func__, strerror(errno));
-            ret = -1;
-        }
-        ctx->layer_prev_buf[win_idx] = 0;
-    }
-
-    win->layer_index = layer_idx;
-    win->status = HWC_WIN_RESERVED;
-
-    SEC_HWC_Log(HWC_ALOG_DEBUG,
-            "%s:: win_x %d win_y %d win_w %d win_h %d  lay_idx %d win_idx %d\n",
-            "--assign_overlay_window()",
-            win->rect_info.x, win->rect_info.y, win->rect_info.w,
-            win->rect_info.h, win->layer_index, win_idx );
-
-    return 0;
-}
-
-static int hwc_prepare(hwc_composer_device_t *dev, hwc_layer_list_t* list)
-{
-    struct hwc_context_t* ctx = (struct hwc_context_t*)dev;
-    int overlay_win_cnt = 0;
-    int compositionType = 0;
-    int ret;
-
-    //if geometry is not changed, there is no need to do any work here
-    if (!list || (!(list->flags & HWC_GEOMETRY_CHANGED)))
-        return 0;
-
-    //all the windows are free here....
-    for (int i = 0 ; i < NUM_OF_WIN; i++) {
-        ctx->win[i].status = HWC_WIN_FREE;
-        ctx->win[i].buf_index = 0;
-    }
-
-    ctx->num_of_hwc_layer = 0;
-    ctx->num_of_fb_layer = 0;
-    ctx->num_2d_blit_layer = 0;
-
-    for (int i = 0; i < list->numHwLayers ; i++) {
-        hwc_layer_t* cur = &list->hwLayers[i];
-
-        if (overlay_win_cnt < NUM_OF_WIN) {
-            compositionType = get_hwc_compos_decision(cur, 0, overlay_win_cnt);
-
-            if (compositionType == HWC_FRAMEBUFFER) {
-                cur->compositionType = HWC_FRAMEBUFFER;
-                ctx->num_of_fb_layer++;
-            } else {
-                ret = assign_overlay_window(ctx, cur, overlay_win_cnt, i);
-                if (ret != 0) {
-                    ALOGE("assign_overlay_window fail, change to frambuffer");
-                    cur->compositionType = HWC_FRAMEBUFFER;
-                    ctx->num_of_fb_layer++;
-                    continue;
-                }
-
-                cur->compositionType = HWC_OVERLAY;
-                cur->hints = HWC_HINT_CLEAR_FB;
-                overlay_win_cnt++;
-                ctx->num_of_hwc_layer++;
-            }
-        } else {
-            cur->compositionType = HWC_FRAMEBUFFER;
-            ctx->num_of_fb_layer++;
-        }
-    }
-
-#ifdef SUB_TITLES_HWC
-    for (int i = 0; i < list->numHwLayers ; i++) {
-        if (overlay_win_cnt < NUM_OF_WIN) {
-            hwc_layer_t* cur = &list->hwLayers[i];
-            if (get_hwc_compos_decision(cur, 1, overlay_win_cnt) == HWC_OVERLAY) {
-                ret = assign_overlay_window(ctx, cur, overlay_win_cnt, i);
-                if (ret == 0) {
-                    cur->compositionType = HWC_OVERLAY;
-                    cur->hints = HWC_HINT_CLEAR_FB;
-                    overlay_win_cnt++;
-                    ctx->num_of_hwc_layer++;
-                    ctx->num_of_fb_layer--;
-                    ctx->num_2d_blit_layer = 1;
-                }
-            }
-        }
-        else
-            break;
-    }
-#endif
-
-#if defined(BOARD_USES_HDMI)
-    android::SecHdmiClient *mHdmiClient = android::SecHdmiClient::getInstance();
-    mHdmiClient->setHdmiHwcLayer(ctx->num_of_hwc_layer);
-#endif
-
-    if (list->numHwLayers != (ctx->num_of_fb_layer + ctx->num_of_hwc_layer))
-        SEC_HWC_Log(HWC_ALOG_DEBUG,
-                "%s:: numHwLayers %d num_of_fb_layer %d num_of_hwc_layer %d ",
-                __func__, list->numHwLayers, ctx->num_of_fb_layer,
-                ctx->num_of_hwc_layer);
-
-    if (overlay_win_cnt < NUM_OF_WIN) {
-        //turn off the free windows
-        for (int i = overlay_win_cnt; i < NUM_OF_WIN; i++) {
-            window_hide(&ctx->win[i]);
-            reset_win_rect_info(&ctx->win[i]);
-        }
-    }
-
-    return 0;
-}
-
-static int hwc_set(hwc_composer_device_t *dev,
-                   hwc_display_t dpy,
-                   hwc_surface_t sur,
-                   hwc_layer_list_t* list)
-{
-    struct hwc_context_t *ctx = (struct hwc_context_t *)dev;
-    int skipped_window_mask = 0;
-    hwc_layer_t* cur;
-    struct hwc_win_info_t   *win;
-    int ret;
-    int pmem_phyaddr;
-    struct sec_img src_img;
-    struct sec_img dst_img;
-    struct sec_rect src_work_rect;
-    struct sec_rect dst_work_rect;
-#if defined(BOARD_USES_HDMI)
-    int skip_hdmi_rendering = 0;
-    int rotVal = 0;
-#endif
-    if (!list) {
-        //turn off the all windows
-        for (int i = 0; i < NUM_OF_WIN; i++) {
-            window_hide(&ctx->win[i]);
-            reset_win_rect_info(&ctx->win[i]);
-            ctx->win[i].status = HWC_WIN_FREE;
-        }
-        ctx->num_of_hwc_layer = 0;
-    }
-
-    if(ctx->num_of_hwc_layer > NUM_OF_WIN)
-        ctx->num_of_hwc_layer = NUM_OF_WIN;
-
-    //compose hardware layers here
-    for (int i = 0; i < ctx->num_of_hwc_layer - ctx->num_2d_blit_layer; i++) {
-        win = &ctx->win[i];
-        if (win->status == HWC_WIN_RESERVED) {
-            cur = &list->hwLayers[win->layer_index];
-
-            if (cur->compositionType == HWC_OVERLAY) {
-                if (ctx->layer_prev_buf[i] == (uint32_t)cur->handle) {
-                    /*
-                     * In android platform, all the graphic buffer are at least
-                     * double buffered (2 or more) this buffer is already rendered.
-                     * It is the redundant src buffer for FIMC rendering.
-                     */
-                    ALOGD("SKIP FIMC rendering for Layer%d", win->layer_index);
-#if defined(BOARD_USES_HDMI)
-                    skip_hdmi_rendering = 1;
-#endif
-                    continue;
-                }
-                ctx->layer_prev_buf[i] = (uint32_t)cur->handle;
-                // initialize the src & dist context for fimc
-                set_src_dst_img_rect(cur, win, &src_img, &dst_img,
-                                &src_work_rect, &dst_work_rect, i);
-
-                ret = runFimc(ctx,
-                            &src_img, &src_work_rect,
-                            &dst_img, &dst_work_rect,
-                            cur->transform);
-
-                if (ret < 0) {
-                    SEC_HWC_Log(HWC_ALOG_ERROR, "%s::runFimc fail : ret=%d\n",
-                                __func__, ret);
-                    skipped_window_mask |= (1 << i);
-                    continue;
-                }
-
-                window_pan_display(win);
-
-                win->buf_index = (win->buf_index + 1) % NUM_OF_WIN_BUF;
-                if (win->power_state == 0)
-                    window_show(win);
-            } else {
-                SEC_HWC_Log(HWC_ALOG_ERROR,
-                        "%s:: error : layer %d compositionType should have been"
-                        " HWC_OVERLAY ", __func__, win->layer_index);
-                skipped_window_mask |= (1 << i);
-                continue;
-            }
-        } else {
-            SEC_HWC_Log(HWC_ALOG_ERROR, "%s:: error : window status should have "
-                    "been HWC_WIN_RESERVED by now... ", __func__);
-             skipped_window_mask |= (1 << i);
-             continue;
-        }
-    }
-
-#ifdef SUB_TITLES_HWC
-    if (ctx->num_2d_blit_layer) {
-        g2d_rect srcRect;
-        g2d_rect dstRect;
-
-        win = &ctx->win[ctx->num_of_hwc_layer - 1];
-        cur = &list->hwLayers[win->layer_index];
-        set_src_dst_g2d_rect(cur, win, &srcRect, &dstRect);
-        ret = runG2d(ctx, &srcRect,  &dstRect,
-                        cur->transform);
-         if (ret < 0) {
-            SEC_HWC_Log(HWC_ALOG_ERROR, "%s::runG2d fail : ret=%d\n",
-                    __func__, ret);
-                   skipped_window_mask |= (1 << (ctx->num_of_hwc_layer - 1));
-                   goto g2d_error;
-         }
-
-         window_pan_display(win);
-
-         win->buf_index = (win->buf_index + 1) % NUM_OF_WIN_BUF;
-         if (win->power_state == 0)
-             window_show(win);
-    }
-
-g2d_error:
-#endif
-
-    if (skipped_window_mask) {
-        //turn off the free windows
-        for (int i = 0; i < NUM_OF_WIN; i++) {
-            if (skipped_window_mask & (1 << i)) {
-                window_hide(&ctx->win[i]);
-                reset_win_rect_info(&ctx->win[i]);
-            }
-        }
-    }
-
-    if (0 < ctx->num_of_fb_layer) {
-#ifdef CHECK_EGL_FPS
-        check_fps();
-#endif
-#ifdef HWC_HWOVERLAY
-        glFinish();
-#endif
-        EGLBoolean sucess = eglSwapBuffers((EGLDisplay)dpy, (EGLSurface)sur);
-        if (!sucess)
-            return HWC_EGL_ERROR;
-    }
-
-#if defined(BOARD_USES_HDMI)
-    if (list == NULL || skip_hdmi_rendering == 1)
-        return 0;
-
-    android::SecHdmiClient *mHdmiClient = android::SecHdmiClient::getInstance();
-
-#ifdef SUPPORT_AUTO_UI_ROTATE
-    cur = &list->hwLayers[0];
-
-    if (cur->transform == HAL_TRANSFORM_ROT_90 || cur->transform == HAL_TRANSFORM_ROT_270)
-        mHdmiClient->setHdmiRotate(270, ctx->num_of_hwc_layer);
-    else
-        mHdmiClient->setHdmiRotate(0, ctx->num_of_hwc_layer);
-#endif
-
-    if (src_img.usage & GRALLOC_USAGE_PRIVATE_SBS_LR)
-        src_img.format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR;
-    else if (src_img.usage & GRALLOC_USAGE_PRIVATE_SBS_RL)
-        src_img.format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL;
-    else if (src_img.usage & GRALLOC_USAGE_PRIVATE_TB_LR)
-        src_img.format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR;
-    else if (src_img.usage & GRALLOC_USAGE_PRIVATE_TB_RL)
-        src_img.format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL;
-
-    // To support S3D video playback (automatic TV mode change to 3D mode)
-    if (ctx->num_of_hwc_layer == 1) {
-        if (src_img.format != prev_format) {
-            if ((src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR) ||
-                (src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL))
-                mHdmiClient->setHdmiResolution(7209601);    // V4L2_STD_TVOUT_720P_60_SBS_HALF
-            else if ((src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR) ||
-                    (src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL))
-                mHdmiClient->setHdmiResolution(1080924);    // V4L2_STD_TVOUT_1080P_24_TB
-            else
-                mHdmiClient->setHdmiResolution(DEFAULT_HDMI_RESOLUTION_VALUE);    // V4L2_STD_1080P_60
-        }
-        prev_format = src_img.format;
-    } else {
-        if ((prev_format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR) ||
-            (prev_format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL) ||
-            (prev_format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR) ||
-            (prev_format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL))
-            mHdmiClient->setHdmiResolution(DEFAULT_HDMI_RESOLUTION_VALUE);    // V4L2_STD_1080P_60
-        prev_format = HAL_PIXEL_FORMAT_BGRA_8888;
-    }
-
-    if (ctx->num_of_hwc_layer == 1) {
-        if ((src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED)||
-            (src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP) ||
-            (src_img.format == HAL_PIXEL_FORMAT_YCbCr_420_SP) ||
-                    (src_img.format == HAL_PIXEL_FORMAT_YCrCb_420_SP) ||
-                    (src_img.format == HAL_PIXEL_FORMAT_YCbCr_420_P) ||
-                    (src_img.format == HAL_PIXEL_FORMAT_YV12) ||
-                    (src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR) ||
-                    (src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL) ||
-                    (src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR) ||
-                    (src_img.format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL)) {
-            mHdmiClient->blit2Hdmi(src_img.w, src_img.h,
-                                   src_img.format,
-                                   src_img.base,
-                                   src_img.base + src_img.uoffset,
-                                   src_img.base + src_img.uoffset + src_img.voffset,
-                                   0, 0,
-                                   android::SecHdmiClient::HDMI_MODE_VIDEO,
-                                   ctx->num_of_hwc_layer);
-        } else {
-            ALOGE("%s: Unsupported format = %d", __func__, src_img.format);
-        }
-    }
-#endif
-    return 0;
-}
-
-static int hwc_device_close(struct hw_device_t *dev)
-{
-    struct hwc_context_t* ctx = (struct hwc_context_t*)dev;
-    int ret = 0;
-    int i;
-    if (ctx) {
-        if (destroyVideoDev(&ctx->fimc) < 0) {
-            SEC_HWC_Log(HWC_ALOG_ERROR, "%s::destroyVideoDev fail", __func__);
-            ret = -1;
-        }
-#ifdef SUB_TITLES_HWC
-        if (destroyG2d(&ctx->g2d) < 0) {
-            SEC_HWC_Log(HWC_ALOG_ERROR, "%s::destroyG2d() fail", __func__);
-            ret = -1;
-        }
-#endif
-        for (i = 0; i < NUM_OF_WIN; i++) {
-            if (window_close(&ctx->win[i]) < 0)
-                SEC_HWC_Log(HWC_ALOG_DEBUG, "%s::window_close() fail", __func__);
-        }
-
-        free(ctx);
-    }
-    return ret;
-}
-
-static int hwc_device_open(const struct hw_module_t* module, const char* name,
-        struct hw_device_t** device)
-{
-    int status = 0;
-    struct hwc_win_info_t   *win;
-
-    if (strcmp(name, HWC_HARDWARE_COMPOSER))
-        return  -EINVAL;
-
-    struct hwc_context_t *dev;
-    dev = (hwc_context_t*)malloc(sizeof(*dev));
-
-    /* initialize our state here */
-    memset(dev, 0, sizeof(*dev));
-
-    /* initialize the procs */
-    dev->device.common.tag = HARDWARE_DEVICE_TAG;
-    dev->device.common.version = 0;
-    dev->device.common.module = const_cast<hw_module_t*>(module);
-    dev->device.common.close = hwc_device_close;
-
-    dev->device.prepare = hwc_prepare;
-    dev->device.set = hwc_set;
-
-    *device = &dev->device.common;
-
-    //initializing
-    memset(&(dev->fimc),    0, sizeof(s5p_fimc_t));
-    memset(&(dev->s3c_mem), 0, sizeof(struct s3c_mem_t));
-#ifdef USE_HW_PMEM
-    memset(&(dev->sec_pmem),    0, sizeof(sec_pmem_t));
-#endif
-     /* open WIN0 & WIN1 here */
-     for (int i = 0; i < NUM_OF_WIN; i++) {
-        if (window_open(&(dev->win[i]), i)  < 0) {
-            SEC_HWC_Log(HWC_ALOG_ERROR,
-                    "%s:: Failed to open window %d device ", __func__, i);
-             status = -EINVAL;
-             goto err;
-        }
-     }
-
-    if (window_get_global_lcd_info(dev->win[0].fd, &dev->lcd_info) < 0) {
-        SEC_HWC_Log(HWC_ALOG_ERROR,
-                "%s::window_get_global_lcd_info is failed : %s",
-                __func__, strerror(errno));
-        status = -EINVAL;
-        goto err;
-    }
-
-#if defined(BOARD_USES_HDMI)
-    lcd_width   = dev->lcd_info.xres;
-    lcd_height  = dev->lcd_info.yres;
-#endif
-
-    /* initialize the window context */
-    for (int i = 0; i < NUM_OF_WIN; i++) {
-        win = &dev->win[i];
-        memcpy(&win->lcd_info, &dev->lcd_info, sizeof(struct fb_var_screeninfo));
-        memcpy(&win->var_info, &dev->lcd_info, sizeof(struct fb_var_screeninfo));
-
-        win->rect_info.x = 0;
-        win->rect_info.y = 0;
-        win->rect_info.w = win->var_info.xres;
-        win->rect_info.h = win->var_info.yres;
-
-       if (window_set_pos(win) < 0) {
-            SEC_HWC_Log(HWC_ALOG_ERROR, "%s::window_set_pos is failed : %s",
-                    __func__, strerror(errno));
-            status = -EINVAL;
-            goto err;
-        }
-
-        if (window_get_info(win, i) < 0) {
-            SEC_HWC_Log(HWC_ALOG_ERROR, "%s::window_get_info is failed : %s",
-                    __func__, strerror(errno));
-            status = -EINVAL;
-            goto err;
-        }
-
-    }
-
-#ifdef USE_HW_PMEM
-    if (createPmem(&dev->sec_pmem, PMEM_SIZE) < 0) {
-        SEC_HWC_Log(HWC_ALOG_ERROR, "%s::initPmem(%d) fail", __func__, PMEM_SIZE);
-    }
-#endif
-
-    //create PP
-    if (createVideoDev(&dev->fimc) < 0) {
-        SEC_HWC_Log(HWC_ALOG_ERROR, "%s::creatFimc() fail", __func__);
-        status = -EINVAL;
-        goto err;
-    }
-
-#ifdef SUB_TITLES_HWC
-   if (createG2d(&dev->g2d) < 0) {
-        SEC_HWC_Log(HWC_ALOG_ERROR, "%s::createG2d() fail", __func__);
-        status = -EINVAL;
-        goto err;
-    }
-#endif
-
-    SEC_HWC_Log(HWC_ALOG_DEBUG, "%s:: hwc_device_open: SUCCESS", __func__);
-    return 0;
-
-err:
-    if (destroyVideoDev(&dev->fimc) < 0)
-        SEC_HWC_Log(HWC_ALOG_ERROR, "%s::destroyVideoDev() fail", __func__);
-#ifdef SUB_TITLES_HWC
-     if (destroyG2d(&dev->g2d) < 0)
-        SEC_HWC_Log(HWC_ALOG_ERROR, "%s::destroyG2d() fail", __func__);
-#endif
-    if (destroyMem(&dev->s3c_mem) < 0)
-        SEC_HWC_Log(HWC_ALOG_ERROR, "%s::destroyMem() fail", __func__);
-
-#ifdef USE_HW_PMEM
-    if (destroyPmem(&dev->sec_pmem) < 0)
-        SEC_HWC_Log(HWC_ALOG_ERROR, "%s::destroyPmem() fail", __func__);
-#endif
-
-    for (int i = 0; i < NUM_OF_WIN; i++) {
-        if (window_close(&dev->win[i]) < 0)
-            SEC_HWC_Log(HWC_ALOG_DEBUG, "%s::window_close() fail", __func__);
-    }
-
-    return status;
-}
diff --git a/exynos5/hal/libhwcomposer/SecHWCLog.cpp b/exynos5/hal/libhwcomposer/SecHWCLog.cpp
deleted file mode 100644
index 6ad4283..0000000
--- a/exynos5/hal/libhwcomposer/SecHWCLog.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- *
- * @author Rama, Meka(v.meka@samsung.com)
-           Sangwoo, Park(sw5771.park@samsung.com)
-           Jamie Oh (jung-min.oh@samsung.com)
- * @date   2011-03-11
- *
- */
-
-#include <utils/Log.h>
-
-#include "SecHWCUtils.h"
-
-void _SEC_HWC_Log(HWC_LOG_LEVEL logLevel, const char *tag, const char *msg, ...)
-{
-    va_list argptr;
-
-    va_start(argptr, msg);
-
-    switch (logLevel) {
-    case HWC_LOG_DEBUG:
-        __android_log_vprint(ANDROID_LOG_DEBUG, tag, msg, argptr);
-        break;
-    case HWC_LOG_WARNING:
-        __android_log_vprint(ANDROID_LOG_WARN, tag, msg, argptr);
-        break;
-    case HWC_LOG_ERROR:
-        __android_log_vprint(ANDROID_LOG_ERROR, tag, msg, argptr);
-        break;
-    default:
-        __android_log_vprint(ANDROID_LOG_VERBOSE, tag, msg, argptr);
-    }
-
-    va_end(argptr);
-}
diff --git a/exynos5/hal/libhwcomposer/SecHWCUtils.cpp b/exynos5/hal/libhwcomposer/SecHWCUtils.cpp
deleted file mode 100644
index f165a2d..0000000
--- a/exynos5/hal/libhwcomposer/SecHWCUtils.cpp
+++ /dev/null
@@ -1,1703 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- *
- * @author Rama, Meka(v.meka@samsung.com)
-           Sangwoo, Park(sw5771.park@samsung.com)
-           Jamie Oh (jung-min.oh@samsung.com)
- * @date   2011-03-11
- *
- */
-
-#include "SecHWCUtils.h"
-
-#define V4L2_BUF_TYPE_OUTPUT V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE
-#define V4L2_BUF_TYPE_CAPTURE V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
-#define EXYNOS4_ALIGN( value, base ) (((value) + ((base) - 1)) & ~((base) - 1))
-
-//#define CHECK_FPS
-#ifdef CHECK_FPS
-#include <sys/time.h>
-#include <unistd.h>
-#define CHK_FRAME_CNT 30
-
-void check_fps()
-{
-    static struct timeval tick, tick_old;
-    static int total = 0;
-    static int cnt = 0;
-    int FPS;
-    cnt++;
-    gettimeofday(&tick, NULL);
-    if (cnt > 10) {
-        if (tick.tv_sec > tick_old.tv_sec)
-            total += ((tick.tv_usec/1000) + (tick.tv_sec - tick_old.tv_sec)*1000 - (tick_old.tv_usec/1000));
-        else
-            total += ((tick.tv_usec - tick_old.tv_usec)/1000);
-
-        memcpy(&tick_old, &tick, sizeof(timeval));
-        if (cnt == (10 + CHK_FRAME_CNT)) {
-            FPS = 1000*CHK_FRAME_CNT/total;
-            ALOGE("[FPS]:%d\n", FPS);
-            total = 0;
-            cnt = 10;
-        }
-    } else {
-        memcpy(&tick_old, &tick, sizeof(timeval));
-        total = 0;
-    }
-}
-#endif
-
-struct yuv_fmt_list yuv_list[] = {
-    { "V4L2_PIX_FMT_NV12",      "YUV420/2P/LSB_CBCR",   V4L2_PIX_FMT_NV12,     12, 2 },
-    { "V4L2_PIX_FMT_NV12T",     "YUV420/2P/LSB_CBCR",   V4L2_PIX_FMT_NV12T,    12, 2 },
-    { "V4L2_PIX_FMT_NV21",      "YUV420/2P/LSB_CRCB",   V4L2_PIX_FMT_NV21,     12, 2 },
-    { "V4L2_PIX_FMT_NV21X",     "YUV420/2P/MSB_CBCR",   V4L2_PIX_FMT_NV21X,    12, 2 },
-    { "V4L2_PIX_FMT_NV12X",     "YUV420/2P/MSB_CRCB",   V4L2_PIX_FMT_NV12X,    12, 2 },
-    { "V4L2_PIX_FMT_YUV420",    "YUV420/3P",            V4L2_PIX_FMT_YUV420,   12, 3 },
-    { "V4L2_PIX_FMT_YUV420M",   "YUV420/3P",            V4L2_PIX_FMT_YUV420M,  12, 3 },
-    { "V4L2_PIX_FMT_YVU420M",   "YVU420/3P",            V4L2_PIX_FMT_YVU420M,  12, 3 },
-    { "V4L2_PIX_FMT_NV12M",     "YUV420/2P/LSB_CBCR",   V4L2_PIX_FMT_NV12M,    12, 2 },
-    { "V4L2_PIX_FMT_YUYV",      "YUV422/1P/YCBYCR",     V4L2_PIX_FMT_YUYV,     16, 1 },
-    { "V4L2_PIX_FMT_YVYU",      "YUV422/1P/YCRYCB",     V4L2_PIX_FMT_YVYU,     16, 1 },
-    { "V4L2_PIX_FMT_UYVY",      "YUV422/1P/CBYCRY",     V4L2_PIX_FMT_UYVY,     16, 1 },
-    { "V4L2_PIX_FMT_VYUY",      "YUV422/1P/CRYCBY",     V4L2_PIX_FMT_VYUY,     16, 1 },
-    { "V4L2_PIX_FMT_UV12",      "YUV422/2P/LSB_CBCR",   V4L2_PIX_FMT_NV16,     16, 2 },
-    { "V4L2_PIX_FMT_UV21",      "YUV422/2P/LSB_CRCB",   V4L2_PIX_FMT_NV61,     16, 2 },
-    { "V4L2_PIX_FMT_UV12X",     "YUV422/2P/MSB_CBCR",   V4L2_PIX_FMT_NV16X,    16, 2 },
-    { "V4L2_PIX_FMT_UV21X",     "YUV422/2P/MSB_CRCB",   V4L2_PIX_FMT_NV61X,    16, 2 },
-    { "V4L2_PIX_FMT_YUV422P",   "YUV422/3P",            V4L2_PIX_FMT_YUV422P,  16, 3 },
-};
-
-int window_open(struct hwc_win_info_t *win, int id)
-{
-    int fd = 0;
-    char name[64];
-    int vsync = 1;
-    int real_id = id;
-
-    char const * const device_template = "/dev/graphics/fb%u";
-    // window & FB maping
-    // fb0 -> win-id : 2
-    // fb1 -> win-id : 1
-    // fb2 -> win-id : 0
-    // fb3 -> no device node
-    // fb4 -> no device node
-    // it is pre assumed that ...win0 or win1 is used here..
-
-    switch (id) {
-    case 0:
-        real_id = 2;
-        break;
-    case 1:
-        real_id = 1;
-        break;
-    default:
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::id(%d) is weird", __func__, id);
-        goto error;
-}
-
-    snprintf(name, 64, device_template, real_id);
-
-    win->fd = open(name, O_RDWR);
-    if (win->fd <= 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::Failed to open window device (%s) : %s",
-                __func__, strerror(errno), name);
-        goto error;
-    }
-
-#ifdef ENABLE_FIMD_VSYNC
-    vsync = 1;
-    if (ioctl(win->fd, S3CFB_SET_VSYNC_INT, &vsync) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3CFB_SET_VSYNC_INT fail", __func__);
-        goto error;
-    }
-#endif
-
-    return 0;
-
-error:
-    if (0 < win->fd)
-        close(win->fd);
-    win->fd = 0;
-
-    return -1;
-}
-
-int window_close(struct hwc_win_info_t *win)
-{
-    int ret = 0;
-
-    if (0 < win->fd) {
-        ion_unmap((void *)win->addr[0], ALIGN(win->size * NUM_OF_WIN_BUF, PAGE_SIZE));
-        ion_free(win->ion_fd);
-
-#ifdef ENABLE_FIMD_VSYNC
-        /* Set using VSYNC Interrupt for FIMD_0   */
-        int vsync = 0;
-        if (ioctl(win->fd, S3CFB_SET_VSYNC_INT, &vsync) < 0)
-            SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3CFB_SET_VSYNC_INT fail", __func__);
-#endif
-        ret = close(win->fd);
-    }
-    win->fd = 0;
-
-    return ret;
-}
-
-int window_set_pos(struct hwc_win_info_t *win)
-{
-    struct s3cfb_user_window window;
-
-    //before changing the screen configuration...powerdown the window
-    if (window_hide(win) != 0)
-        return -1;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG, "%s:: x(%d), y(%d)",
-            __func__, win->rect_info.x, win->rect_info.y);
-
-    win->var_info.xres_virtual = (win->lcd_info.xres + 15) & ~ 15;
-    win->var_info.yres_virtual = win->lcd_info.yres * NUM_OF_WIN_BUF;
-    win->var_info.xres = win->rect_info.w;
-    win->var_info.yres = win->rect_info.h;
-    win->var_info.activate &= ~FB_ACTIVATE_MASK;
-    win->var_info.activate |= FB_ACTIVATE_FORCE;
-    if (ioctl(win->fd, FBIOPUT_VSCREENINFO, &(win->var_info)) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::FBIOPUT_VSCREENINFO(%d, %d) fail",
-          __func__, win->rect_info.w, win->rect_info.h);
-        return -1;
-    }
-
-    window.x = win->rect_info.x;
-    window.y = win->rect_info.y;
-    if (ioctl(win->fd, S3CFB_WIN_POSITION, &window) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3CFB_WIN_POSITION(%d, %d) fail",
-            __func__, window.x, window.y);
-      return -1;
-    }
-
-    return 0;
-}
-
-int window_get_info(struct hwc_win_info_t *win, int win_num)
-{
-    int temp_size = 0;
-
-    if (ioctl(win->fd, FBIOGET_FSCREENINFO, &win->fix_info) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "FBIOGET_FSCREENINFO failed : %s",
-                strerror(errno));
-        goto error;
-    }
-
-    win->size = win->fix_info.line_length * win->var_info.yres;
-
-    struct s3c_fb_user_ion_client ion_handle;
-    void *ion_start_addr;
-    if (ioctl(win->fd, S3CFB_GET_ION_USER_HANDLE, &ion_handle) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Get fb ion client is failed\n");
-        return -1;
-    }
-
-    win->ion_fd = ion_handle.fd;
-    ion_start_addr = ion_map(win->ion_fd, ALIGN(win->size * NUM_OF_WIN_BUF, PAGE_SIZE), 0);
-
-    for (int j = 0; j < NUM_OF_WIN_BUF; j++) {
-        temp_size = win->size * j;
-        win->addr[j] = (uint32_t)ion_start_addr + temp_size;
-        SEC_HWC_Log(HWC_LOG_DEBUG, "%s::win-%d add[%d]  %x ",
-                __func__, win_num, j,  win->addr[j]);
-    }
-    return 0;
-
-error:
-    win->fix_info.smem_start = 0;
-
-    return -1;
-}
-
-int window_pan_display(struct hwc_win_info_t *win)
-{
-    struct fb_var_screeninfo *lcd_info = &(win->lcd_info);
-
-#ifdef ENABLE_FIMD_VSYNC
-    int pan_num = 0;
-    if (ioctl(win->fd, FBIO_WAITFORVSYNC, &pan_num) < 0)
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::FBIO_WAITFORVSYNC fail(%s)",
-                __func__, strerror(errno));
-#endif
-
-    lcd_info->yoffset = lcd_info->yres * win->buf_index;
-
-    if (ioctl(win->fd, FBIOPAN_DISPLAY, lcd_info) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::FBIOPAN_DISPLAY(%d / %d / %d) fail(%s)",
-            __func__,
-            lcd_info->yres,
-            win->buf_index, lcd_info->yres_virtual,
-            strerror(errno));
-        return -1;
-    }
-    return 0;
-}
-
-int window_show(struct hwc_win_info_t *win)
-{
-    if (win->power_state == 0) {
-        if (ioctl(win->fd, FBIOBLANK, FB_BLANK_UNBLANK) < 0) {
-            SEC_HWC_Log(HWC_LOG_ERROR, "%s::FBIOBLANK failed : (%d:%s)",
-                __func__, win->fd, strerror(errno));
-            return -1;
-        }
-        win->power_state = 1;
-    }
-    return 0;
-}
-
-int window_hide(struct hwc_win_info_t *win)
-{
-    if (win->power_state == 1) {
-        if (ioctl(win->fd, FBIOBLANK, FB_BLANK_POWERDOWN) < 0) {
-            SEC_HWC_Log(HWC_LOG_ERROR, "%s::FBIOBLANK failed : (%d:%s)",
-             __func__, win->fd, strerror(errno));
-            return -1;
-        }
-        win->power_state = 0;
-    }
-    return 0;
-}
-
-int window_get_global_lcd_info(int fd, struct fb_var_screeninfo *lcd_info)
-{
-    if (ioctl(fd, FBIOGET_VSCREENINFO, lcd_info) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "FBIOGET_VSCREENINFO failed : %s",
-                strerror(errno));
-        return -1;
-    }
-
-    SEC_HWC_Log(HWC_LOG_DEBUG, "%s:: Default LCD x(%d),y(%d)",
-            __func__, lcd_info->xres, lcd_info->yres);
-    return 0;
-}
-
-int fimc_v4l2_set_src(int fd, s5p_fimc_img_info *src)
-{
-    struct v4l2_format  fmt;
-    struct v4l2_cropcap cropcap;
-    struct v4l2_crop    crop;
-    struct v4l2_requestbuffers req;
-
-    /* You MUST initialize structure for v4l2 */
-    memset(&fmt, 0, sizeof(fmt));
-    memset(&cropcap, 0, sizeof(cropcap));
-    memset(&crop, 0, sizeof(crop));
-    memset(&req, 0, sizeof(req));
-
-    /**************  To set size & format for source image (DMA-INPUT) **************/
-    fmt.fmt.pix_mp.num_planes  = src->planes;
-    fmt.fmt.pix_mp.width       = src->full_width;
-    fmt.fmt.pix_mp.height      = src->full_height;
-    fmt.fmt.pix_mp.pixelformat = src->color_space;
-    fmt.fmt.pix_mp.field       = V4L2_FIELD_ANY;
-    fmt.type                = V4L2_BUF_TYPE_OUTPUT;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-        "fimc_v4l2_set_src-VIDIOC_S_FMT, type(%d), field(%d), plane(%d)"
-        "pixelformat(0x%X), width(%d), height(%d)",
-        fmt.type,  fmt.fmt.pix.field, fmt.fmt.pix_mp.num_planes,
-        fmt.fmt.pix_mp.pixelformat, fmt.fmt.pix_mp.width,  fmt.fmt.pix_mp.height);
-
-    if (ioctl(fd, VIDIOC_S_FMT, &fmt) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::VIDIOC_S_FMT failed : errno=%d (%s)"
-                " : fd=%d\n", __func__, errno, strerror(errno), fd);
-        return -1;
-    }
-
-    /************** crop input size **************/
-    crop.type = V4L2_BUF_TYPE_OUTPUT;
-    crop.c.width  = src->width;
-    crop.c.height = src->height;
-    crop.c.left   = src->start_x;
-    crop.c.top    = src->start_y;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-        "fimc_v4l2_set_src-VIDIOC_S_CROP, type(%d), XY(%d,%d), WH(%d,%d)",
-        crop.type,  crop.c.left, crop.c.top, crop.c.width, crop.c.height);
-
-    if (ioctl(fd, VIDIOC_S_CROP, &crop) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_CROP :"
-                "crop.c.left : (%d), crop.c.top : (%d), crop.c.width : (%d), crop.c.height : (%d)",
-                __func__, crop.c.left, crop.c.top, crop.c.width, crop.c.height);
-        return -1;
-    }
-
-    /************** input buffer type **************/
-    req.count       = 1;
-    req.memory      = V4L2_MEMORY_USERPTR;
-    req.type        = V4L2_BUF_TYPE_OUTPUT;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-        "fimc_v4l2_set_src-VIDIOC_REQBUFS, count(%d), type(%d), memory(%d)",
-        req.count,  req.type, req.memory);
-
-    if (ioctl(fd, VIDIOC_REQBUFS, &req) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in VIDIOC_REQBUFS", __func__);
-        return -1;
-    }
-
-    return 0;
-}
-
-int fimc_v4l2_set_dst(int fd, s5p_fimc_img_info *dst,
-        int rotation, int hflip, int vflip, unsigned int addr)
-{
-    struct v4l2_format      sFormat;
-    struct v4l2_control     vc;
-    struct v4l2_framebuffer fbuf;
-    struct v4l2_crop    crop;
-    struct v4l2_requestbuffers req;
-    int ret;
-
-    /* You MUST initialize structure for v4l2 */
-    memset(&sFormat, 0, sizeof(sFormat));
-    memset(&vc, 0, sizeof(vc));
-    memset(&fbuf, 0, sizeof(fbuf));
-    memset(&crop, 0, sizeof(crop));
-    memset(&req, 0, sizeof(req));
-
-    /************** set rotation configuration **************/
-    vc.id = V4L2_CID_ROTATE;
-    vc.value = rotation;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-        "fimc_v4l2_set_dst-V4L2_CID_ROTATE, rot(%d)",vc.value);
-
-    ret = ioctl(fd, VIDIOC_S_CTRL, &vc);
-    if (ret < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR,
-                "%s::Error in video VIDIOC_S_CTRL - rotation (%d)"
-                "vc.id : (%d), vc.value : (%d)", __func__, ret, vc.id, vc.value);
-        return -1;
-    }
-
-    /************** set hflip configuration **************/
-    vc.id = V4L2_CID_HFLIP;
-    vc.value = hflip;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-        "fimc_v4l2_set_dst-V4L2_CID_HFLIP, hflip(%d)",vc.value);
-
-    ret = ioctl(fd, VIDIOC_S_CTRL, &vc);
-    if (ret < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR,
-                "%s::Error in video VIDIOC_S_CTRL - hflip (%d)"
-                "vc.id : (%d), vc.value : (%d)", __func__, ret, vc.id, vc.value);
-        return -1;
-    }
-
-    /************** set vflip configuration **************/
-    vc.id = V4L2_CID_VFLIP;
-    vc.value = vflip;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-        "fimc_v4l2_set_dst-V4L2_CID_VFLIP, vflip(%d)",vc.value);
-
-    ret = ioctl(fd, VIDIOC_S_CTRL, &vc);
-    if (ret < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR,
-                "%s::Error in video VIDIOC_S_CTRL - vflip (%d)"
-                "vc.id : (%d), vc.value : (%d)", __func__, ret, vc.id, vc.value);
-        return -1;
-    }
-
-    /************** set destination **************/
-    sFormat.type             = V4L2_BUF_TYPE_CAPTURE;
-    sFormat.fmt.pix_mp.width         = dst->full_width;
-    sFormat.fmt.pix_mp.height        = dst->full_height;
-    sFormat.fmt.pix_mp.pixelformat    = dst->color_space;
-    sFormat.fmt.pix_mp.num_planes    = dst->planes;
-    sFormat.fmt.pix.field            = V4L2_FIELD_ANY;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-        "fimc_v4l2_set_dst-VIDIOC_S_FMT, type(%d), field(%d), plane(%d)"
-        "pixelformat(0x%X), width(%d), height(%d)",
-        sFormat.type,  sFormat.fmt.pix.field, sFormat.fmt.pix_mp.num_planes,
-        sFormat.fmt.pix_mp.pixelformat, sFormat.fmt.pix_mp.width,  sFormat.fmt.pix_mp.height);
-
-    ret = ioctl(fd, VIDIOC_S_FMT, &sFormat);
-    if (ret < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_FMT (%d)", __func__, ret);
-        return -1;
-    }
-
-    /************** set destination window**************/
-    crop.type     = V4L2_BUF_TYPE_CAPTURE;
-    crop.c.left   = dst->start_x;
-    crop.c.top    = dst->start_y;
-    crop.c.width  = dst->width;
-    crop.c.height = dst->height;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-        "fimc_v4l2_set_dst-VIDIOC_S_CROP, type(%d), XY(%d,%d), WH(%d,%d)",
-        crop.type,  crop.c.left, crop.c.top, crop.c.width, crop.c.height);
-
-    ret = ioctl(fd, VIDIOC_S_CROP, &crop);
-    if (ret < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_S_CROP (%d)", __func__, ret);
-        return -1;
-    }
-
-    /************** input buffer type **************/
-    req.count       = 1;
-    req.type        = V4L2_BUF_TYPE_CAPTURE;
-    req.memory      = V4L2_MEMORY_USERPTR;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-        "fimc_v4l2_set_dst-VIDIOC_REQBUFS, count(%d), type(%d), memory(%d)",
-        req.count,  req.type, req.memory);
-
-    ret = ioctl (fd, VIDIOC_REQBUFS, &req);
-    if (ret < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in VIDIOC_REQBUFS (%d)", __func__, ret);
-        return -1;
-    }
-
-    return 0;
-}
-
-int fimc_v4l2_stream_on(int fd, enum v4l2_buf_type type)
-{
-    SEC_HWC_Log(HWC_LOG_DEBUG,"fimc_v4l2_stream_on-VIDIOC_STREAMON, type(%d)",type);
-
-    if (-1 == ioctl(fd, VIDIOC_STREAMON, &type)) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Error in VIDIOC_STREAMON\n");
-        return -1;
-    }
-
-    return 0;
-}
-
-int fimc_v4l2_queue(int fd, struct fimc_buf *fimc_buf, enum v4l2_buf_type type, int index)
-{
-    struct v4l2_plane plane[3];
-    struct v4l2_buffer buf;
-    int i;
-    int ret;
-
-    buf.length      = fimc_buf->planes;
-    buf.memory      = V4L2_MEMORY_USERPTR;
-    buf.index       = index;
-    buf.type        = type;
-
-    if (buf.type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
-        buf.type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
-        for (i = 0; i < buf.length; i++) {
-            plane[i].m.userptr = fimc_buf->base[i];
-            plane[i].length = fimc_buf->size[i];
-        }
-    }
-    buf.m.planes = plane;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,"fimc_v4l2_queue-VIDIOC_QBUF, type(%d),"
-        "length(%d), memory(%d), index(%d)",
-        buf.type, buf.length, buf.memory, buf.index);
-
-    ret = ioctl(fd, VIDIOC_QBUF, &buf);
-    if (0 > ret) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Error in VIDIOC_QBUF : (%d)", ret);
-        return -1;
-    }
-
-    return 0;
-}
-
-int fimc_v4l2_dequeue(int fd, struct fimc_buf *fimc_buf, enum v4l2_buf_type type)
-{
-    struct v4l2_buffer          buf;
-    struct v4l2_plane plane[3];
-
-    buf.m.planes    = plane;
-    buf.length      = fimc_buf->planes;
-    buf.memory      = V4L2_MEMORY_USERPTR;
-    buf.type        = type;
-
-    if (-1 == ioctl(fd, VIDIOC_DQBUF, &buf)) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Error in VIDIOC_DQBUF\n");
-        return -1;
-    }
-
-    return buf.index;
-}
-
-int fimc_v4l2_stream_off(int fd, enum v4l2_buf_type type)
-{
-    SEC_HWC_Log(HWC_LOG_DEBUG,"fimc_v4l2_stream_off-VIDIOC_STREAMOFF, type(%d),",type);
-
-    if (-1 == ioctl(fd, VIDIOC_STREAMOFF, &type)) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Error in VIDIOC_STREAMOFF\n");
-        return -1;
-    }
-
-    return 0;
-}
-
-int fimc_v4l2_clr_buf(int fd, enum v4l2_buf_type type)
-{
-    struct v4l2_requestbuffers req;
-
-    req.count   = 0;
-    req.memory  = V4L2_MEMORY_USERPTR;
-    req.type    = type;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,"fimc_v4l2_clr_buf-VIDIOC_REQBUFS,"
-        "count(%d), memory(%d), type(%d)",
-        req.count, req.memory, req.type);
-
-    if (ioctl(fd, VIDIOC_REQBUFS, &req) == -1) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Error in VIDIOC_REQBUFS");
-    }
-
-    return 0;
-}
-
-int fimc_v4l2_S_ctrl(int fd)
-{
-    struct v4l2_control vc;
-
-    vc.id = V4L2_CID_CACHEABLE;
-    vc.value = 1;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,"fimc_v4l2_S_ctrl-VIDIOC_S_CTRL,"
-        "id(%d), value(%d)",vc.id , vc.value);
-
-    if (ioctl(fd, VIDIOC_S_CTRL, &vc) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Error in VIDIOC_S_CTRL");
-        return -1;
-    }
-
-    return 0;
-}
-
-int fimc_handle_oneshot(int fd, struct fimc_buf *fimc_src_buf, struct fimc_buf *fimc_dst_buf)
-{
-#ifdef CHECK_FPS
-    check_fps();
-#endif
-
-    if (fimc_v4l2_queue(fd, fimc_src_buf, V4L2_BUF_TYPE_OUTPUT, 0) < 0) {
-         SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_queue()");
-         return -1;
-     }
-
-    if (fimc_v4l2_queue(fd, fimc_dst_buf, V4L2_BUF_TYPE_CAPTURE, 0) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_queue()");
-        return -2;
-    }
-
-    if (fimc_v4l2_stream_on(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_stream_on()");
-        return -3;
-    }
-
-    if (fimc_v4l2_stream_on(fd, V4L2_BUF_TYPE_CAPTURE) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_stream_on()");
-        return -4;
-    }
-
-    if (fimc_v4l2_dequeue(fd, fimc_src_buf, V4L2_BUF_TYPE_OUTPUT) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_dequeue()");
-        return -6;
-    }
-
-    if (fimc_v4l2_dequeue(fd, fimc_dst_buf, V4L2_BUF_TYPE_CAPTURE) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_dequeue()");
-        return -7;
-    }
-
-STREAM_OFF:
-    if (fimc_v4l2_stream_off(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC  v4l2_stream_off()");
-        return -8;
-    }
-
-    if (fimc_v4l2_stream_off(fd, V4L2_BUF_TYPE_CAPTURE) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST  v4l2_stream_off()");
-        return -9;
-    }
-
-    if (fimc_v4l2_clr_buf(fd, V4L2_BUF_TYPE_OUTPUT) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Fail : SRC v4l2_clr_buf()");
-        return -10;
-    }
-
-    if (fimc_v4l2_clr_buf(fd, V4L2_BUF_TYPE_CAPTURE)< 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "Fail : DST v4l2_clr_buf()");
-        return -11;
-    }
-
-    return 0;
-}
-
-static int memcpy_rect(void *dst, void *src, int fullW, int fullH, int realW, int realH, int format)
-{
-    unsigned char *srcCb, *srcCr;
-    unsigned char *dstCb, *dstCr;
-    unsigned char *srcY, *dstY;
-    int srcCbOffset, srcCrOffset;
-    int dstCbOffset, dstFrameOffset, dstCrOffset;
-    int cbFullW, cbRealW, cbFullH, cbRealH;
-    int ySrcFW, ySrcFH, ySrcRW, ySrcRH;
-    int planes;
-    int i;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-            "++memcpy_rect()::"
-            "dst(0x%x),src(0x%x),f.w(%d),f.h(%d),r.w(%d),r.h(%d),format(0x%x)",
-            (unsigned int)dst, (unsigned int)src, fullW, fullH, realW, realH, format);
-
-// Set dst Y, Cb, Cr address for FIMC
-    {
-        cbFullW = fullW >> 1;
-        cbRealW = realW >> 1;
-        cbFullH = fullH >> 1;
-        cbRealH = realH >> 1;
-        dstFrameOffset = fullW * fullH;
-        dstCrOffset = cbFullW * cbFullH;
-        dstY = (unsigned char *)dst;
-        dstCb = (unsigned char *)dst + dstFrameOffset;
-        dstCr = (unsigned char *)dstCb + dstCrOffset;
-    }
-
-// Get src Y, Cb, Cr address for source buffer.
-// Each address is aligned by 16's multiple for GPU both width and height.
-    {
-        ySrcFW = fullW;
-        ySrcFH = fullH;
-        ySrcRW = realW;
-        ySrcRH = realH;
-        srcCbOffset = EXYNOS4_ALIGN(ySrcRW,16)* EXYNOS4_ALIGN(ySrcRH,16);
-        srcCrOffset = EXYNOS4_ALIGN(cbRealW,16)* EXYNOS4_ALIGN(cbRealH,16);
-        srcY =  (unsigned char *)src;
-        srcCb = (unsigned char *)src + srcCbOffset;
-        srcCr = (unsigned char *)srcCb + srcCrOffset;
-    }
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-            "--memcpy_rect()::\n"
-            "dstY(0x%x),dstCb(0x%x),dstCr(0x%x) \n"
-            "srcY(0x%x),srcCb(0x%x),srcCr(0x%x) \n"
-            "cbRealW(%d),cbRealH(%d)",
-            (unsigned int)dstY,(unsigned int)dstCb,(unsigned int)dstCr,
-            (unsigned int)srcY,(unsigned int)srcCb,(unsigned int)srcCr,
-            cbRealW, cbRealH);
-
-    if (format == HAL_PIXEL_FORMAT_YV12) { //YV12(Y,Cr,Cv)
-        planes = 3;
-//This is code for VE, deleted temporory by SSONG 2011.09.22
-// This will be enabled later.
-/*
-        //as defined in hardware.h, cb & cr full_width should be aligned to 16. ALIGN(y_stride/2, 16).
-        ////Alignment is hard coded to 16.
-        ////for example...check frameworks/media/libvideoeditor/lvpp/VideoEditorTools.cpp file for UV stride cal
-        cbSrcFW = (cbSrcFW + 15) & (~15);
-        srcCbOffset = ySrcFW * fullH;
-        srcCrOffset = srcCbOffset + ((cbSrcFW * fullH) >> 1);
-        srcY =  (unsigned char *)src;
-        srcCb = (unsigned char *)src + srcCbOffset;
-        srcCr = (unsigned char *)src + srcCrOffset;
-*/
-    } else if ((format == HAL_PIXEL_FORMAT_YCbCr_420_P) ||
-        (format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_LR) ||
-        (format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_SBS_RL) ||
-        (format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_LR) ||
-        (format == HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_P_TB_RL)) {
-        planes = 3;
-    } else if (format == HAL_PIXEL_FORMAT_YCbCr_420_SP || format == HAL_PIXEL_FORMAT_YCrCb_420_SP) {
-        planes = 2;
-    } else {
-        SEC_HWC_Log(HWC_LOG_ERROR, "use default memcpy instead of memcpy_rect");
-        return -1;
-    }
-//#define CHECK_PERF
-#ifdef CHECK_PERF
-    struct timeval start, end;
-    gettimeofday(&start, NULL);
-#endif
-    for (i = 0; i < realH; i++)
-        memcpy(dstY + fullW * i, srcY + ySrcFW * i, ySrcRW);
-    if (planes == 2) {
-        for (i = 0; i < cbRealH; i++)
-            memcpy(dstCb + ySrcFW * i, srcCb + ySrcFW * i, ySrcRW);
-    } else if (planes == 3) {
-        for (i = 0; i < cbRealH; i++)
-            memcpy(dstCb + cbFullW * i, srcCb + cbFullW * i, cbRealW);
-        for (i = 0; i < cbRealH; i++)
-            memcpy(dstCr + cbFullW * i, srcCr + cbFullW * i, cbRealW);
-    }
-#ifdef CHECK_PERF
-    gettimeofday(&end, NULL);
-    SEC_HWC_Log(HWC_LOG_ERROR, "[COPY]=%d,",(end.tv_sec - start.tv_sec)*1000+(end.tv_usec - start.tv_usec)/1000);
-#endif
-
-    return 0;
-}
-
-/*****************************************************************************/
-static int get_src_phys_addr(struct hwc_context_t *ctx,
-        sec_img *src_img, sec_rect *src_rect)
-{
-    s5p_fimc_t *fimc = &ctx->fimc;
-    struct s3c_mem_alloc *ptr_mem_alloc = &ctx->s3c_mem.mem_alloc[0];
-    struct s3c_mem_dma_param s3c_mem_dma;
-
-    unsigned int src_virt_addr  = 0;
-    unsigned int src_phys_addr  = 0;
-    unsigned int src_frame_size = 0;
-
-    // error check routine
-    if (0 == src_img->base) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s invalid src image base\n", __func__);
-        return 0;
-    }
-
-            fimc->params.src.buf_addr_phy_rgb_y = src_img->base;
-            fimc->params.src.buf_addr_phy_cb = src_img->base + src_img->uoffset;
-            fimc->params.src.buf_addr_phy_cr = src_img->base + src_img->uoffset + src_img->voffset;
-            src_phys_addr = fimc->params.src.buf_addr_phy_rgb_y;
-
-    return src_phys_addr;
-}
-
-static int get_dst_phys_addr(struct hwc_context_t *ctx, sec_img *dst_img,
-        sec_rect *dst_rect, int *dst_memcpy_flag)
-{
-    unsigned int dst_phys_addr  = 0;
-
-        dst_phys_addr = dst_img->base;
-
-    return dst_phys_addr;
-}
-
-static inline int rotateValueHAL2PP(unsigned char transform)
-{
-    int rotate_flag = transform & 0x7;
-
-    switch (rotate_flag) {
-    case HAL_TRANSFORM_ROT_90:  return 90;
-    case HAL_TRANSFORM_ROT_180: return 180;
-    case HAL_TRANSFORM_ROT_270: return 270;
-    case HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90: return 90;
-    case HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90: return 90;
-    case HAL_TRANSFORM_FLIP_H: return 0;
-    case HAL_TRANSFORM_FLIP_V: return 0;
-    }
-    return 0;
-}
-
-static inline int hflipValueHAL2PP(unsigned char transform)
-{
-    int flip_flag = transform & 0x7;
-    switch (flip_flag) {
-    case HAL_TRANSFORM_FLIP_H:
-    case HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90:
-        return 1;
-    case HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90:
-    case HAL_TRANSFORM_ROT_90:
-    case HAL_TRANSFORM_ROT_180:
-    case HAL_TRANSFORM_ROT_270:
-    case HAL_TRANSFORM_FLIP_V:
-        break;
-    }
-    return 0;
-}
-
-static inline int vflipValueHAL2PP(unsigned char transform)
-{
-    int flip_flag = transform & 0x7;
-    switch (flip_flag) {
-    case HAL_TRANSFORM_FLIP_V:
-    case HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90:
-        return 1;
-    case HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90:
-    case HAL_TRANSFORM_ROT_90:
-    case HAL_TRANSFORM_ROT_180:
-    case HAL_TRANSFORM_ROT_270:
-    case HAL_TRANSFORM_FLIP_H:
-        break;
-    }
-    return 0;
-}
-
-static inline int multipleOf2(int number)
-{
-    if (number % 2 == 1)
-        return (number - 1);
-    else
-        return number;
-}
-
-static inline int multipleOf4(int number)
-{
-    int remain_number = number % 4;
-
-    if (remain_number != 0)
-        return (number - remain_number);
-    else
-        return number;
-}
-
-static inline int multipleOf8(int number)
-{
-    int remain_number = number % 8;
-
-    if (remain_number != 0)
-        return (number - remain_number);
-    else
-        return number;
-}
-
-static inline int multipleOf16(int number)
-{
-    int remain_number = number % 16;
-
-    if (remain_number != 0)
-        return (number - remain_number);
-    else
-        return number;
-}
-
-static inline int widthOfPP( int pp_color_format, int number)
-{
-    switch (pp_color_format) {
-    /* 422 1/2/3 plane */
-    case V4L2_PIX_FMT_YUYV:
-    case V4L2_PIX_FMT_UYVY:
-    case V4L2_PIX_FMT_NV61:
-    case V4L2_PIX_FMT_NV16:
-    case V4L2_PIX_FMT_YUV422P:
-
-    /* 420 2/3 plane */
-    case V4L2_PIX_FMT_NV21:
-    case V4L2_PIX_FMT_NV12:
-    case V4L2_PIX_FMT_NV12T:
-    case V4L2_PIX_FMT_YUV420:
-        return multipleOf2(number);
-
-    default :
-        return number;
-    }
-
-}
-
-static inline int heightOfPP(int pp_color_format, int number)
-{
-    switch (pp_color_format) {
-    case V4L2_PIX_FMT_NV21:
-    case V4L2_PIX_FMT_NV12:
-    case V4L2_PIX_FMT_NV12T:
-    case V4L2_PIX_FMT_YUV420:
-        return multipleOf2(number);
-
-    default :
-        return number;
-        break;
-    }
-    return number;
-}
-
-static unsigned int get_yuv_bpp(unsigned int fmt)
-{
-    int i, sel = -1;
-
-    for (i = 0; i < (int)(sizeof(yuv_list) / sizeof(struct yuv_fmt_list)); i++) {
-        if (yuv_list[i].fmt == fmt) {
-            sel = i;
-            break;
-        }
-    }
-
-    if (sel == -1)
-        return sel;
-    else
-        return yuv_list[sel].bpp;
-}
-
-static unsigned int get_yuv_planes(unsigned int fmt)
-{
-    int i, sel = -1;
-
-    for (i = 0; i < (int)(sizeof(yuv_list) / sizeof(struct yuv_fmt_list)); i++) {
-        if (yuv_list[i].fmt == fmt) {
-            sel = i;
-            break;
-        }
-    }
-
-    if (sel == -1)
-        return sel;
-    else
-        return yuv_list[sel].planes;
-}
-
-static int runFimcCore(struct hwc_context_t *ctx,
-        unsigned int src_phys_addr, sec_img *src_img, sec_rect *src_rect,
-        uint32_t src_color_space,
-        unsigned int dst_phys_addr, sec_img *dst_img, sec_rect *dst_rect,
-        uint32_t dst_color_space, int transform)
-{
-    s5p_fimc_t        * fimc = &ctx->fimc;
-    s5p_fimc_params_t * params = &(fimc->params);
-
-    struct fimc_buf fimc_src_buf;
-    int src_bpp, src_planes;
-
-    struct fimc_buf fimc_dst_buf;
-    int dst_bpp, dst_planes;
-    unsigned int src_frame_size = 0;
-    unsigned int dst_frame_size = 0;
-    unsigned int frame_size = 0;
-
-    bool src_cbcr_order = true;
-    int rotate_value = rotateValueHAL2PP(transform);
-    int hflip = hflipValueHAL2PP(transform);
-    int vflip = vflipValueHAL2PP(transform);
-
-    /* 1. param(fimc config)->src information
-     *    - src_img,src_rect => s_fw,s_fh,s_w,s_h,s_x,s_y
-     */
-    params->src.full_width  = src_img->f_w;
-    params->src.full_height = src_img->f_h;
-    params->src.width       = src_rect->w;
-    params->src.height      = src_rect->h;
-    params->src.start_x     = src_rect->x;
-    params->src.start_y     = src_rect->y;
-    params->src.color_space = src_color_space;
-    params->src.buf_addr_phy_rgb_y = src_phys_addr;
-
-    params->dst.buf_addr_phy_rgb_y = dst_phys_addr;
-
-    /* check src minimum */
-    if (src_rect->w < 64 || src_rect->h < 32) {
-        SEC_HWC_Log(HWC_LOG_ERROR,
-                "%s src size is not supported by fimc : f_w=%d f_h=%d "
-                "x=%d y=%d w=%d h=%d (ow=%d oh=%d) format=0x%x", __func__,
-                params->src.full_width, params->src.full_height,
-                params->src.start_x, params->src.start_y,
-                params->src.width, params->src.height,
-                src_rect->w, src_rect->h,
-                params->src.color_space);
-        return -1;
-    }
-
-    params->dst.full_width  = dst_img->f_w;
-    params->dst.full_height = dst_img->f_h;
-    params->dst.start_x     = dst_rect->x;
-    params->dst.start_y     = dst_rect->y;
-    params->dst.width       = widthOfPP(dst_color_space, dst_rect->w);
-    params->dst.height      = heightOfPP(dst_color_space, dst_rect->h);
-    params->dst.color_space = dst_color_space;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-            "runFimcCore()::"
-            "SRC f.w(%d),f.h(%d),x(%d),y(%d),w(%d),h(%d)=>"
-            "DST f.w(%d),f.h(%d),x(%d),y(%d),w(%d),h(%d)",
-            params->src.full_width, params->src.full_height,
-            params->src.start_x, params->src.start_y,
-            params->src.width, params->src.height,
-            params->dst.full_width, params->dst.full_height,
-            params->dst.start_x, params->dst.start_y,
-            params->dst.width, params->dst.height);
-
-    /* check dst minimum */
-#if (GSC_VERSION == GSC_EVT0)
-    if (dst_rect->w  < 64 || dst_rect->h < 32) {
-#else
-    if (dst_rect->w  < 32 || dst_rect->h < 8) {
-#endif
-
-        SEC_HWC_Log(HWC_LOG_ERROR,
-                "%s dst size is not supported by fimc : f_w=%d f_h=%d "
-                "x=%d y=%d w=%d h=%d (ow=%d oh=%d) format=0x%x", __func__,
-                params->dst.full_width, params->dst.full_height,
-                params->dst.start_x, params->dst.start_y,
-                params->dst.width, params->dst.height,
-                dst_rect->w, dst_rect->h, params->dst.color_space);
-        return -1;
-    }
-
-   /* 2. Set configuration related to destination (DMA-OUT)
-     *   - set input format & size
-     *   - crop input size
-     *   - set input buffer
-     *   - set buffer type (V4L2_MEMORY_USERPTR)
-     */
-    switch (dst_img->format) {
-    case HAL_PIXEL_FORMAT_RGBA_8888:
-    case HAL_PIXEL_FORMAT_RGBX_8888:
-    case HAL_PIXEL_FORMAT_RGB_888:
-    case HAL_PIXEL_FORMAT_BGRA_8888:
-        dst_planes = 1;
-        dst_bpp = 32;
-        break;
-
-    case HAL_PIXEL_FORMAT_RGB_565:
-    case HAL_PIXEL_FORMAT_RGBA_5551:
-    case HAL_PIXEL_FORMAT_RGBA_4444:
-        dst_planes = 1;
-        dst_bpp = 16;
-        break;
-    }
-
-    dst_frame_size = params->dst.width * params->dst.height ;
-    params->dst.planes = dst_planes;
-
-    if (dst_planes == 1) {
-        fimc_dst_buf.base[0] = params->dst.buf_addr_phy_rgb_y;
-        if (dst_bpp == 32)
-            fimc_dst_buf.size[0] = dst_frame_size * 4;
-        else if (dst_bpp == 16)
-             fimc_dst_buf.size[0] = dst_frame_size * 2;
-    }
-
-    if (fimc_v4l2_set_dst(fimc->dev_fd, &params->dst, rotate_value, hflip, vflip, dst_phys_addr) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "fimc_v4l2_set_dst is failed\n");
-        return -1;
-    }
-
-    /* 3. Set input dma address (Y/RGB, Cb, Cr)
-     * set source frame size
-     */
-    src_frame_size = params->src.full_width * params->src.full_height;
-    fimc_src_buf.size[0] = src_frame_size;
-    fimc_src_buf.size[1] = src_frame_size >> 2;
-    fimc_src_buf.size[2] = src_frame_size >> 2;
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-            "runFimcCore - Y_length=%d, U_length=%d, V_length=%d\n",
-            fimc_src_buf.size[0], fimc_src_buf.size[1],fimc_src_buf.size[2]);
-
-    /* set source Y image */
-    fimc_src_buf.base[0] = params->src.buf_addr_phy_rgb_y;
-    /* set source Cb,Cr images for 2 or 3 planes */
-    src_bpp    = get_yuv_bpp(src_color_space);
-    src_planes = get_yuv_planes(src_color_space);
-    if (2 == src_planes) {          /* 2 planes */
-        frame_size = params->src.full_width * params->src.full_height;
-        params->src.buf_addr_phy_cb =
-            params->src.buf_addr_phy_rgb_y + frame_size;
-        /* CbCr */
-        fimc_src_buf.base[1] = params->src.buf_addr_phy_cb;
-    } else if (3 == src_planes) {   /* 3 planes */
-        frame_size = params->src.full_width * params->src.full_height;
-        params->src.buf_addr_phy_cb =
-            params->src.buf_addr_phy_rgb_y + frame_size;
-        if (12 == src_bpp)
-            params->src.buf_addr_phy_cr =
-                params->src.buf_addr_phy_cb + (frame_size >> 2);
-        else
-            params->src.buf_addr_phy_cr =
-                params->src.buf_addr_phy_cb + (frame_size >> 1);
-        /* Cb, Cr */
-        if (src_cbcr_order == true) {
-            fimc_src_buf.base[1] = params->src.buf_addr_phy_cb;
-            fimc_src_buf.base[2] = params->src.buf_addr_phy_cr;
-        }
-        else {
-            fimc_src_buf.base[2] = params->src.buf_addr_phy_cb;
-            fimc_src_buf.base[1] = params->src.buf_addr_phy_cr;
-        }
-    }
-
-    SEC_HWC_Log(HWC_LOG_DEBUG,
-            "runFimcCore - Y=0x%X, U=0x%X, V=0x%X\n",
-            fimc_src_buf.base[0], fimc_src_buf.base[1],fimc_src_buf.base[2]);
-
-    int ret = 0;
-    params->src.planes = src_planes;
-
-   /* 4. Set configuration related to source (DMA-INPUT)
-     *   - set input format & size
-     *   - crop input size
-     *   - set input buffer
-     *   - set buffer type (V4L2_MEMORY_USERPTR)
-     */
-    if (fimc_v4l2_set_src(fimc->dev_fd, &params->src) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "fimc_v4l2_set_src is failed\n");
-        return -1;
-    }
-
-    fimc_src_buf.planes = src_planes;
-    fimc_dst_buf.planes = dst_planes;
-
-    /* 5. Run FIMC
-     *    - stream on => queue => dequeue => stream off => clear buf
-     */
-    ret = fimc_handle_oneshot(fimc->dev_fd, &fimc_src_buf, &fimc_dst_buf);
-
-    if (ret < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR,"fimc_handle_oneshot = %d\n",ret);
-        if (ret == -2) {
-            fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_OUTPUT);
-        } else if (ret == -3) {
-            fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_OUTPUT);
-            fimc_v4l2_clr_buf(fimc->dev_fd, V4L2_BUF_TYPE_CAPTURE);
-        }
-        return ret;
-    }
-
-    return 0;
-}
-
-#ifdef SUB_TITLES_HWC
-int createG2d(sec_g2d_t *g2d)
-{
-    g2d->dev_fd = open(SEC_G2D_DEV_NAME, O_RDWR);
-
-    if (g2d->dev_fd <= 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::G2d open error (%d)", __func__, errno);
-        goto err;
-    }
-
-    return 0;
-err:
-    if (0 < g2d->dev_fd)
-        close(g2d->dev_fd);
-    g2d->dev_fd =0;
-
-    return -1;
-}
-
-int destroyG2d(sec_g2d_t *g2d)
-{
-    // close
-    if (0 < g2d->dev_fd)
-        close(g2d->dev_fd);
-    g2d->dev_fd = 0;
-
-    return 0;
-}
-#endif
-
-int createVideoDev(s5p_fimc_t *fimc)
-{
-    struct v4l2_capability cap;
-    struct v4l2_format fmt;
-    struct v4l2_control vc;
-
-    // open device file
-    if (fimc->dev_fd <= 0)
-        fimc->dev_fd = open(PP_DEVICE_DEV_NAME, O_RDWR);
-
-    if (fimc->dev_fd <= 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::Post processor open error (%d)",
-                __func__, errno);
-        goto err;
-    }
-
-    /* Initial debug log level for video driver.
-        User can use command below to change log level.
-        # echo 7 > /sys/module/gsc/parameters/gsc_dbg
-        # echo 8 > /proc/sys/kernel/printk
-        Each number for gsc_dgb means,
-        3: error
-        4: waring
-        6: info
-        7: debug
-    */
-    system("echo 3 > /sys/module/gsc/parameters/gsc_dbg");
-
-    // check capability
-    if (ioctl(fimc->dev_fd, VIDIOC_QUERYCAP, &cap) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "VIDIOC_QUERYCAP failed");
-        goto err;
-    }
-
-    if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%d has no streaming support", fimc->dev_fd);
-        goto err;
-    }
-
-    if (!(cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%d is no video output", fimc->dev_fd);
-        goto err;
-    }
-
-    /*
-     * malloc fimc_outinfo structure
-     */
-    fmt.type = V4L2_BUF_TYPE_OUTPUT;
-    if (ioctl(fimc->dev_fd, VIDIOC_G_FMT, &fmt) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::Error in video VIDIOC_G_FMT", __func__);
-        goto err;
-    }
-
-    return 0;
-
-err:
-    if (0 < fimc->dev_fd)
-        close(fimc->dev_fd);
-    fimc->dev_fd =0;
-
-    return -1;
-}
-
-int destroyVideoDev(s5p_fimc_t *fimc)
-{
-    if (fimc->out_buf.virt_addr != NULL) {
-        fimc->out_buf.virt_addr = NULL;
-        fimc->out_buf.length = 0;
-    }
-
-    // close
-    if (0 < fimc->dev_fd)
-        close(fimc->dev_fd);
-    fimc->dev_fd = 0;
-
-    return 0;
-}
-
-int runFimc(struct hwc_context_t *ctx,
-            struct sec_img *src_img, struct sec_rect *src_rect,
-            struct sec_img *dst_img, struct sec_rect *dst_rect,
-            uint32_t transform)
-{
-    s5p_fimc_t *  fimc = &ctx->fimc;
-
-    unsigned int src_phys_addr  = 0;
-    unsigned int dst_phys_addr  = 0;
-    int          rotate_value   = 0;
-    int          flag_force_memcpy = 0;
-    int32_t      src_color_space;
-    int32_t      dst_color_space;
-
-    /* 1. source address and size */
-    src_phys_addr = get_src_phys_addr(ctx, src_img, src_rect);
-    if (0 == src_phys_addr)
-        return -1;
-
-    /* 2. destination address and size */
-    dst_phys_addr = get_dst_phys_addr(ctx, dst_img, dst_rect, &flag_force_memcpy);
-    if (0 == dst_phys_addr)
-        return -2;
-
-    /* 3. check whether fimc supports the src format */
-    src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(src_img->format);
-    if (0 > src_color_space)
-        return -3;
-    dst_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(dst_img->format);
-    if (0 > dst_color_space)
-        return -4;
-
-    /* 4. FIMC: src_rect of src_img => dst_rect of dst_img */
-    if (runFimcCore(ctx, src_phys_addr, src_img, src_rect,
-                (uint32_t)src_color_space, dst_phys_addr, dst_img, dst_rect,
-                (uint32_t)dst_color_space, transform) < 0)
-        return -5;
-
-    return 0;
-}
-
-#ifdef SUB_TITLES_HWC
-static int get_g2d_src_phys_addr(struct hwc_context_t  *ctx, g2d_rect *src_rect)
-{
-    sec_g2d_t  *g2d = &ctx->g2d;
-    struct s3c_mem_alloc *ptr_mem_alloc = &ctx->s3c_mem.mem_alloc[0];
-#ifdef USE_HW_PMEM
-    sec_pmem_alloc_t *pm_alloc = &ctx->sec_pmem.sec_pmem_alloc[0];
-#endif
-
-    unsigned int src_virt_addr  = 0;
-    unsigned int src_phys_addr  = 0;
-    unsigned int src_frame_size = 0;
-
-    struct pmem_region region;
-
-    // error check routine
-    if (0 == src_rect->virt_addr) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s invalid src address\n", __func__);
-        return 0;
-    }
-
-    src_frame_size = FRAME_SIZE(src_rect->color_format,
-            src_rect->full_w, src_rect->full_h);
-    if (src_frame_size == 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::FRAME_SIZE fail", __func__);
-        return 0;
-    }
-
-#ifdef USE_HW_PMEM
-    if (0 <= checkPmem(&ctx->sec_pmem, 0, src_frame_size)) {
-        src_virt_addr   = pm_alloc->virt_addr;
-        src_phys_addr   = pm_alloc->phys_addr;
-        pm_alloc->size  = src_frame_size;
-    } else
-#endif
-    if (0 <= checkMem(&ctx->s3c_mem, 0, src_frame_size)) {
-        src_virt_addr       = ptr_mem_alloc->vir_addr;
-        src_phys_addr       = ptr_mem_alloc->phy_addr;
-        ptr_mem_alloc->size = src_frame_size;
-    } else {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::check_mem fail", __func__);
-        return 0;
-    }
-    memcpy((void *)src_virt_addr, (void*)((unsigned int)src_rect->virt_addr), src_frame_size);
-
-    return src_phys_addr;
-}
-
-int get_HAL_2_G2D_FORMAT(int format)
-{
-    switch (format) {
-    case    HAL_PIXEL_FORMAT_RGBA_8888:     return  G2D_ABGR_8888;
-    case    HAL_PIXEL_FORMAT_RGBX_8888:     return  G2D_XBGR_8888;
-    case    HAL_PIXEL_FORMAT_BGRA_8888:     return  G2D_ARGB_8888;
-    case    HAL_PIXEL_FORMAT_RGB_888:       return  G2D_PACKED_BGR_888;
-    case    HAL_PIXEL_FORMAT_RGB_565:       return  G2D_RGB_565;
-    case    HAL_PIXEL_FORMAT_RGBA_5551:     return  G2D_RGBA_5551;
-    case    HAL_PIXEL_FORMAT_RGBA_4444:     return  G2D_RGBA_4444;
-    default:
-        return -1;
-    }
-}
-
-static inline int rotateValueHAL2G2D(unsigned char transform)
-{
-    int rotate_flag = transform & 0x7;
-
-    switch (rotate_flag) {
-    case HAL_TRANSFORM_ROT_90:  return G2D_ROT_90;
-    case HAL_TRANSFORM_ROT_180: return G2D_ROT_180;
-    case HAL_TRANSFORM_ROT_270: return G2D_ROT_270;
-    default:
-        return G2D_ROT_0;
-    }
-}
-
-int runG2d(struct hwc_context_t *ctx, g2d_rect *src_rect, g2d_rect *dst_rect,
-            uint32_t transform)
-{
-    sec_g2d_t *  g2d = &ctx->g2d;
-    g2d_flag flag = {G2D_ROT_0, G2D_ALPHA_BLENDING_OPAQUE, 0, 0, 0, 0, 0, 0};
-    int          rotate_value   = 0;
-
-    // 1 : source address and size
-    src_rect->phys_addr = get_g2d_src_phys_addr(ctx, src_rect);
-    if (0 == src_rect->phys_addr)
-        return -1;
-
-    // 2 : destination address and size
-    if (0 == dst_rect->phys_addr)
-        return -2;
-
-    // check whether g2d supports the src format
-    src_rect->color_format = get_HAL_2_G2D_FORMAT(src_rect->color_format);
-    if (0 > src_rect->color_format)
-        return -3;
-
-    dst_rect->color_format = get_HAL_2_G2D_FORMAT(dst_rect->color_format);
-    if (0 > dst_rect->color_format)
-        return -4;
-
-    flag.rotate_val = rotateValueHAL2G2D(transform);
-
-   // scale and rotate and alpha with FIMG
-    if(stretchSecFimg(src_rect, dst_rect, &flag) < 0)
-        return -5;
-
-    return 0;
-}
-#endif
-
-int createMem(struct s3c_mem_t *mem, unsigned int index, unsigned int size)
-{
-    struct s3c_mem_alloc *ptr_mem_alloc;
-    struct s3c_mem_alloc mem_alloc_info;
-
-    if (index >= NUM_OF_MEM_OBJ) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::invalid index (%d >= %d)",
-                __func__, index, NUM_OF_MEM_OBJ);
-        goto err;
-    }
-
-    ptr_mem_alloc = &mem->mem_alloc[index];
-
-    if (mem->fd <= 0) {
-        mem->fd = open(S3C_MEM_DEV_NAME, O_RDWR);
-        if (mem->fd <= 0) {
-            SEC_HWC_Log(HWC_LOG_ERROR, "%s::open(%s) fail(%s)",
-                    __func__, S3C_MEM_DEV_NAME, strerror(errno));
-            goto err;
-        }
-    }
-
-    // kcoolsw : what the hell of this line??
-    if (0 == size)
-        return 0;
-
-    mem_alloc_info.size = size;
-
-    if (ioctl(mem->fd, S3C_MEM_CACHEABLE_ALLOC, &mem_alloc_info) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_ALLOC(size : %d) fail",
-                __func__, mem_alloc_info.size);
-        goto err;
-    }
-
-    ptr_mem_alloc->phy_addr = mem_alloc_info.phy_addr;
-    ptr_mem_alloc->vir_addr = mem_alloc_info.vir_addr;
-    ptr_mem_alloc->size     = mem_alloc_info.size;
-
-    return 0;
-
-err:
-    if (0 < mem->fd)
-        close(mem->fd);
-    mem->fd = 0;
-
-    return 0;
-}
-
-int destroyMem(struct s3c_mem_t *mem)
-{
-    int i;
-    struct s3c_mem_alloc *ptr_mem_alloc;
-
-    if (mem->fd <= 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::invalied fd(%d) fail", __func__, mem->fd);
-        return -1;
-    }
-
-    for (i = 0; i < NUM_OF_MEM_OBJ; i++) {
-        ptr_mem_alloc = &mem->mem_alloc[i];
-
-        if (0 != ptr_mem_alloc->vir_addr) {
-            if (ioctl(mem->fd, S3C_MEM_FREE, ptr_mem_alloc) < 0) {
-                SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_FREE fail", __func__);
-                return -1;
-            }
-
-            ptr_mem_alloc->phy_addr = 0;
-            ptr_mem_alloc->vir_addr = 0;
-            ptr_mem_alloc->size     = 0;
-        }
-    }
-
-    close(mem->fd);
-    mem->fd = 0;
-
-    return 0;
-}
-
-int checkMem(struct s3c_mem_t *mem, unsigned int index, unsigned int size)
-{
-    int ret;
-    struct s3c_mem_alloc *ptr_mem_alloc;
-    struct s3c_mem_alloc mem_alloc_info;
-
-    if (index >= NUM_OF_MEM_OBJ) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "%s::invalid index (%d >= %d)", __func__,
-                index, NUM_OF_MEM_OBJ);
-        return -1;
-    }
-
-    if (mem->fd <= 0) {
-        ret = createMem(mem, index, size);
-        return ret;
-    }
-
-    ptr_mem_alloc = &mem->mem_alloc[index];
-
-    if (ptr_mem_alloc->size < (int)size) {
-        if (0 < ptr_mem_alloc->size) {
-            // free allocated mem
-            if (ioctl(mem->fd, S3C_MEM_FREE, ptr_mem_alloc) < 0) {
-                SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_FREE fail", __func__);
-                return -1;
-            }
-        }
-
-        // allocate mem with requested size
-        mem_alloc_info.size = size;
-        if (ioctl(mem->fd, S3C_MEM_CACHEABLE_ALLOC, &mem_alloc_info) < 0) {
-            SEC_HWC_Log(HWC_LOG_ERROR, "%s::S3C_MEM_ALLOC(size : %d)  fail",
-                    __func__, mem_alloc_info.size);
-            return -1;
-        }
-
-        ptr_mem_alloc->phy_addr = mem_alloc_info.phy_addr;
-        ptr_mem_alloc->vir_addr = mem_alloc_info.vir_addr;
-        ptr_mem_alloc->size     = mem_alloc_info.size;
-    }
-
-    return 0;
-}
-
-#ifdef USE_HW_PMEM
-int createPmem(sec_pmem_t *pm, unsigned int buf_size)
-{
-    int    master_fd, err = 0, i;
-    void  *base;
-    unsigned int phys_base;
-    size_t size, sub_size[NUM_OF_MEM_OBJ];
-    struct pmem_region region;
-
-    master_fd = open(PMEM_DEVICE_DEV_NAME, O_RDWR, 0);
-    if (master_fd < 0) {
-        pm->pmem_master_fd = -1;
-        if (EACCES == errno) {
-            return 0;
-        } else {
-            SEC_HWC_Log(HWC_LOG_ERROR, "%s::open(%s) fail(%s)",
-                    __func__, PMEM_DEVICE_DEV_NAME, strerror(errno));
-            return -errno;
-        }
-    }
-
-    if (ioctl(master_fd, PMEM_GET_TOTAL_SIZE, &region) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "PMEM_GET_TOTAL_SIZE failed, default mode");
-        size = 8<<20;   // 8 MiB
-    } else {
-        size = region.len;
-    }
-
-    base = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, master_fd, 0);
-    if (base == MAP_FAILED) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "[%s] mmap failed : %d (%s)", __func__,
-                errno, strerror(errno));
-        base = 0;
-        close(master_fd);
-        master_fd = -1;
-        return -errno;
-    }
-
-    if (ioctl(master_fd, PMEM_GET_PHYS, &region) < 0) {
-        SEC_HWC_Log(HWC_LOG_ERROR, "PMEM_GET_PHYS failed, limp mode");
-        region.offset = 0;
-    }
-
-    pm->pmem_master_fd   = master_fd;
-    pm->pmem_master_base = base;
-    pm->pmem_total_size  = size;
-    //pm->pmem_master_phys_base = region.offset;
-    phys_base = region.offset;
-
-    // sec_pmem_alloc[0] for temporary buffer for source
-    sub_size[0] = buf_size;
-    sub_size[0] = roundUpToPageSize(sub_size[0]);
-
-    for (i = 0; i < NUM_OF_MEM_OBJ; i++) {
-        sec_pmem_alloc_t *pm_alloc = &(pm->sec_pmem_alloc[i]);
-        int fd, ret;
-        int offset = i ? sub_size[i-1] : 0;
-        struct pmem_region sub = { offset, sub_size[i] };
-
-        // create the "sub-heap"
-        if (0 > (fd = open(PMEM_DEVICE_DEV_NAME, O_RDWR, 0))) {
-            SEC_HWC_Log(HWC_LOG_ERROR,
-                    "[%s][index=%d] open failed (%dL) : %d (%s)",
-                    __func__, i, __LINE__, errno, strerror(errno));
-            return -errno;
-        }
-
-        // connect to it
-        if (0 != (ret = ioctl(fd, PMEM_CONNECT, pm->pmem_master_fd))) {
-            SEC_HWC_Log(HWC_LOG_ERROR,
-                    "[%s][index=%d] ioctl(PMEM_CONNECT) failed : %d (%s)",
-                    __func__, i, errno, strerror(errno));
-            close(fd);
-            return -errno;
-        }
-
-        // make it available to the client process
-        if (0 != (ret = ioctl(fd, PMEM_MAP, &sub))) {
-            SEC_HWC_Log(HWC_LOG_ERROR,
-                    "[%s][index=%d] ioctl(PMEM_MAP) failed : %d (%s)",
-                    __func__, i, errno, strerror(errno));
-            close(fd);
-            return -errno;
-        }
-
-        pm_alloc->fd         = fd;
-        pm_alloc->total_size = sub_size[i];
-        pm_alloc->offset     = offset;
-        pm_alloc->virt_addr  = (unsigned int)base + (unsigned int)offset;
-        pm_alloc->phys_addr  = (unsigned int)phys_base + (unsigned int)offset;
-
-#if defined (PMEM_DEBUG)
-        SEC_HWC_Log(HWC_LOG_DEBUG, "[%s] pm_alloc[%d] fd=%d total_size=%d "
-                "offset=0x%x virt_addr=0x%x phys_addr=0x%x",
-                __func__, i, pm_alloc->fd, pm_alloc->total_size,
-                pm_alloc->offset, pm_alloc->virt_addr, pm_alloc->phys_addr);
-#endif
-    }
-
-    return err;
-}
-
-int destroyPmem(sec_pmem_t *pm)
-{
-    int i, err;
-
-    for (i=0; i<NUM_OF_MEM_OBJ; i++) {
-        sec_pmem_alloc_t *pm_alloc = &(pm->sec_pmem_alloc[i]);
-
-        if (0 <= pm_alloc->fd) {
-            struct pmem_region sub = { pm_alloc->offset, pm_alloc->total_size };
-
-            if (0 > (err = ioctl(pm_alloc->fd, PMEM_UNMAP, &sub)))
-                SEC_HWC_Log(HWC_LOG_ERROR,
-                        "[%s][index=%d] ioctl(PMEM_UNMAP) failed : %d (%s)",
-                        __func__, i, errno, strerror(errno));
-#if defined (PMEM_DEBUG)
-            else
-                SEC_HWC_Log(HWC_LOG_DEBUG,
-                        "[%s] pm_alloc[%d] unmap fd=%d total_size=%d offset=0x%x",
-                        __func__, i, pm_alloc->fd, pm_alloc->total_size,
-                        pm_alloc->offset);
-#endif
-            close(pm_alloc->fd);
-
-            pm_alloc->fd         = -1;
-            pm_alloc->total_size = 0;
-            pm_alloc->offset     = 0;
-            pm_alloc->virt_addr  = 0;
-            pm_alloc->phys_addr  = 0;
-        }
-    }
-
-    if (0 <= pm->pmem_master_fd) {
-        munmap(pm->pmem_master_base, pm->pmem_total_size);
-        close(pm->pmem_master_fd);
-        pm->pmem_master_fd = -1;
-    }
-
-    pm->pmem_master_base = 0;
-    pm->pmem_total_size  = 0;
-
-    return 0;
-}
-
-int checkPmem(sec_pmem_t *pm, unsigned int index, unsigned int requested_size)
-{
-    sec_pmem_alloc_t *pm_alloc = &(pm->sec_pmem_alloc[index]);
-
-    if (0 < pm_alloc->virt_addr &&
-            requested_size <= (unsigned int)(pm_alloc->total_size))
-        return 0;
-
-    pm_alloc->size = 0;
-    return -1;
-}
-
-#endif
diff --git a/exynos5/hal/libhwcomposer/SecHWCUtils.h b/exynos5/hal/libhwcomposer/SecHWCUtils.h
deleted file mode 100644
index 799fc65..0000000
--- a/exynos5/hal/libhwcomposer/SecHWCUtils.h
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- *
- * @author Rama, Meka(v.meka@samsung.com)
-           Sangwoo, Park(sw5771.park@samsung.com)
-           Jamie, Oh (jung-min.oh@samsung.com)
- * @date   2011-03-11
- *
- */
-
-#ifndef ANDROID_SEC_HWC_UTILS_H_
-#define ANDROID_SEC_HWC_UTILS_H_
-
-#include <stdlib.h>
-#include <hardware/hardware.h>
-#include <hardware/hwcomposer.h>
-
-#include <fcntl.h>
-#include <errno.h>
-#include <cutils/log.h>
-
-#include <ion.h>
-#include "s5p_fimc_v4l2.h"
-#include "sec_utils_v4l2.h"
-
-#include <linux/android_pmem.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <hardware/gralloc.h>
-
-#include "linux/fb.h"
-
-#include "s3c_lcd.h"
-#include "s3c_mem.h"
-#include "sec_format.h"
-
-//#define HWC_DEBUG
-#if defined(BOARD_USES_FIMGAPI)
-#include "sec_g2d.h"
-//#define SUB_TITLES_HWC
-#endif
-
-#define NUM_OF_WIN          (2)
-#define NUM_OF_WIN_BUF      (2)
-#define NUM_OF_MEM_OBJ      (1)
-
-#if (NUM_OF_WIN_BUF < 2)
-    #define ENABLE_FIMD_VSYNC
-#endif
-
-#ifdef SAMSUNG_EXYNOS5250
-#define PP_DEVICE_DEV_NAME  "/dev/video29"
-#endif
-
-#define S3C_MEM_DEV_NAME "/dev/s3c-mem"
-#define PMEM_DEVICE_DEV_NAME "/dev/pmem_gpu1"
-
-#define GSC_VERSION            GSC_EVT1
-//#define USE_HW_PMEM
-
-#define PMEM_SIZE (1920 * 1280 * 2)
-
-struct sec_rect {
-    int32_t x;
-    int32_t y;
-    int32_t w;
-    int32_t h;
-};
-
-struct sec_img {
-    uint32_t f_w;
-    uint32_t f_h;
-    uint32_t w;
-    uint32_t h;
-    uint32_t format;
-    uint32_t base;
-    uint32_t offset;
-    uint32_t paddr;
-    uint32_t uoffset;
-    uint32_t voffset;
-    int      usage;
-    int      mem_id;
-};
-
-inline int SEC_MIN(int x, int y)
-{
-    return ((x < y) ? x : y);
-}
-
-inline int SEC_MAX(int x, int y)
-{
-    return ((x > y) ? x : y);
-}
-
-struct s3c_mem_t {
-    int                  fd;
-    struct s3c_mem_alloc mem_alloc[NUM_OF_MEM_OBJ];
-};
-
-#ifdef USE_HW_PMEM
-typedef struct __sec_pmem_alloc {
-    int          fd;
-    int          total_size;
-    int          offset;
-    int          size;
-    unsigned int virt_addr;
-    unsigned int phys_addr;
-} sec_pmem_alloc_t;
-
-typedef struct __sec_pmem {
-    int    pmem_master_fd;
-    void  *pmem_master_base;
-    int    pmem_total_size;
-    sec_pmem_alloc_t sec_pmem_alloc[NUM_OF_MEM_OBJ];
-} sec_pmem_t;
-
-inline size_t roundUpToPageSize(size_t x)
-{
-    return (x + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1);
-}
-#endif
-
-struct hwc_win_info_t {
-    int        fd;
-    int        size;
-    sec_rect   rect_info;
-    uint32_t   addr[NUM_OF_WIN_BUF];
-    int        buf_index;
-
-    int        power_state;
-    int        blending;
-    int        layer_index;
-    int        status;
-    int        vsync;
-    int        ion_fd;
-
-    struct fb_fix_screeninfo fix_info;
-    struct fb_var_screeninfo var_info;
-    struct fb_var_screeninfo lcd_info;
-};
-
-enum {
-    HWC_WIN_FREE = 0,
-    HWC_WIN_RESERVED,
-};
-
-enum {
-    HWC_UNKNOWN_MEM_TYPE = 0,
-    HWC_PHYS_MEM_TYPE,
-    HWC_VIRT_MEM_TYPE,
-};
-
-struct hwc_context_t {
-    hwc_composer_device_t device;
-
-    /* our private state goes below here */
-    struct hwc_win_info_t     win[NUM_OF_WIN];
-    struct fb_var_screeninfo  lcd_info;
-    s5p_fimc_t         fimc;
-#ifdef SUB_TITLES_HWC
-    sec_g2d_t          g2d;
-#endif
-    struct s3c_mem_t          s3c_mem;
-#ifdef USE_HW_PMEM
-    sec_pmem_t                sec_pmem;
-#endif
-    int                       num_of_fb_layer;
-    int                       num_of_hwc_layer;
-    int            num_2d_blit_layer;
-    uint32_t                  layer_prev_buf[NUM_OF_WIN];
-};
-
-typedef enum _LOG_LEVEL {
-    HWC_LOG_DEBUG,
-    HWC_LOG_WARNING,
-    HWC_LOG_ERROR,
-} HWC_LOG_LEVEL;
-
-#define SEC_HWC_LOG_TAG     "SECHWC_LOG"
-
-#ifdef HWC_DEBUG
-#define SEC_HWC_Log(a, ...)    ((void)_SEC_HWC_Log(a, SEC_HWC_LOG_TAG, __VA_ARGS__))
-#else
-#define SEC_HWC_Log(a, ...)                                         \
-    do {                                                            \
-        if (a == HWC_LOG_ERROR)                                     \
-            ((void)_SEC_HWC_Log(a, SEC_HWC_LOG_TAG, __VA_ARGS__)); \
-    } while (0)
-#endif
-
-extern void _SEC_HWC_Log(HWC_LOG_LEVEL logLevel, const char *tag, const char *msg, ...);
-
-/* copied from gralloc module ..*/
-typedef struct {
-    native_handle_t base;
-
-    /* These fields can be sent cross process. They are also valid
-     * to duplicate within the same process.
-     *
-     * A table is stored within psPrivateData on gralloc_module_t (this
-     * is obviously per-process) which maps stamps to a mapped
-     * PVRSRV_CLIENT_MEM_INFO in that process. Each map entry has a lock
-     * count associated with it, satisfying the requirements of the
-     * Android API. This also prevents us from leaking maps/allocations.
-     *
-     * This table has entries inserted either by alloc()
-     * (alloc_device_t) or map() (gralloc_module_t). Entries are removed
-     * by free() (alloc_device_t) and unmap() (gralloc_module_t).
-     *
-     * As a special case for framebuffer_device_t, framebuffer_open()
-     * will add and framebuffer_close() will remove from this table.
-     */
-
-#define IMG_NATIVE_HANDLE_NUMFDS 1
-    /* The `fd' field is used to "export" a meminfo to another process.
-     * Therefore, it is allocated by alloc_device_t, and consumed by
-     * gralloc_module_t. The framebuffer_device_t does not need a handle,
-     * and the special value IMG_FRAMEBUFFER_FD is used instead.
-     */
-    int fd;
-
-#if 1
-    int format;
-    int magic;
-    int flags;
-    int size;
-    int offset;
-    int base_addr;
-#define IMG_NATIVE_HANDLE_NUMINTS ((sizeof(uint64_t) / sizeof(int)) + 4 + 6)
-#else
-#define IMG_NATIVE_HANDLE_NUMINTS ((sizeof(IMG_UINT64) / sizeof(int)) + 4)
-#endif
-    /* A KERNEL unique identifier for any exported kernel meminfo. Each
-     * exported kernel meminfo will have a unique stamp, but note that in
-     * userspace, several meminfos across multiple processes could have
-     * the same stamp. As the native_handle can be dup(2)'d, there could be
-     * multiple handles with the same stamp but different file descriptors.
-     */
-    uint64_t ui64Stamp;
-
-    /* We could live without this, but it lets us perform some additional
-     * validation on the client side. Normally, we'd have no visibility
-     * of the allocated usage, just the lock usage.
-     */
-    int usage;
-
-    /* In order to do efficient cache flushes we need the buffer dimensions
-     * and format. These are available on the android_native_buffer_t,
-     * but the platform doesn't pass them down to the graphics HAL.
-     *
-     * TODO: Ideally the platform would be modified to not require this.
-     */
-    int width;
-    int height;
-    int bpp;
-}
-__attribute__((aligned(sizeof(int)),packed)) sec_native_handle_t;
-
-int window_open       (struct hwc_win_info_t *win, int id);
-int window_close      (struct hwc_win_info_t *win);
-int window_set_pos    (struct hwc_win_info_t *win);
-int window_get_info   (struct hwc_win_info_t *win, int win_num);
-int window_pan_display(struct hwc_win_info_t *win);
-int window_show       (struct hwc_win_info_t *win);
-int window_hide       (struct hwc_win_info_t *win);
-int window_get_global_lcd_info(int fd, struct fb_var_screeninfo *lcd_info);
-
-int createVideoDev (s5p_fimc_t *fimc);
-int destroyVideoDev(s5p_fimc_t *fimc);
-int runFimc(struct hwc_context_t *ctx,
-            struct sec_img *src_img, struct sec_rect *src_rect,
-            struct sec_img *dst_img, struct sec_rect *dst_rect,
-            uint32_t transform);
-
-#ifdef SUB_TITLES_HWC
-int runG2d(struct hwc_context_t *ctx,
-            g2d_rect *src_rect,  g2d_rect *dst_rect,
-            uint32_t transform);
-
-int destroyG2d(sec_g2d_t *g2d);
-int createG2d(sec_g2d_t *g2d);
-#endif
-
-int createMem (struct s3c_mem_t *mem, unsigned int index, unsigned int size);
-int destroyMem(struct s3c_mem_t *mem);
-int checkMem  (struct s3c_mem_t *mem, unsigned int index, unsigned int size);
-
-#ifdef USE_HW_PMEM
-int createPmem (sec_pmem_t *pm, unsigned int size);
-int destroyPmem(sec_pmem_t *pm);
-int checkPmem  (sec_pmem_t *pm, unsigned int index, unsigned int size);
-#endif
-
-#endif /* ANDROID_SEC_HWC_UTILS_H_*/
diff --git a/exynos5/hal/libhwjpeg/Android.mk b/exynos5/hal/libhwjpeg/Android.mk
deleted file mode 100644
index 70e25fe..0000000
--- a/exynos5/hal/libhwjpeg/Android.mk
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_C_INCLUDES := $(LOCAL_PATH) \
-	$(LOCAL_PATH)/../include
-
-LOCAL_SRC_FILES:= \
-	SecJpegCodecHal.cpp \
-	SecJpegEncoderHal.cpp \
-	SecJpegEncoder.cpp \
-	SecJpegDecoderHal.cpp
-
-LOCAL_SHARED_LIBRARIES :=    \
-	libcutils	\
-	libion
-
-#LOCAL_STATIC_LIBRARIES := \
-
-LOCAL_MODULE:= libhwjpeg
-
-LOCAL_MODULE_TAGS := eng
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/exynos5/hal/libhwjpeg/SecJpegCodecHal.cpp b/exynos5/hal/libhwjpeg/SecJpegCodecHal.cpp
deleted file mode 100644
index b78212b..0000000
--- a/exynos5/hal/libhwjpeg/SecJpegCodecHal.cpp
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright Samsung Electronics Co.,LTD.
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <string.h>
-#include <errno.h>
-#include <signal.h>
-#include <math.h>
-#include <sys/poll.h>
-
-#include <cutils/log.h>
-
-#include <utils/Log.h>
-
-#include "SecJpegCodecHal.h"
-
-#define JPEG_ERROR_LOG(fmt,...)
-
-SecJpegCodecHal::SecJpegCodecHal()
-{
-}
-
-SecJpegCodecHal::~SecJpegCodecHal()
-{
-}
-
-int SecJpegCodecHal::t_v4l2Querycap(int iFd)
-{
-    struct v4l2_capability cap;
-    int iRet = ERROR_NONE;
-
-    iRet = ioctl(iFd, VIDIOC_QUERYCAP, &cap);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: VIDIOC_QUERYCAP failed", __func__, iRet);
-        return iRet;
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2SetJpegcomp(int iFd, int iQuality)
-{
-    struct v4l2_jpegcompression arg;
-    int iRet = ERROR_NONE;
-
-    arg.quality = iQuality;
-
-    iRet = ioctl(iFd, VIDIOC_S_JPEGCOMP, &arg);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: VIDIOC_S_JPEGCOMP failed", __func__, iRet);
-        return iRet;
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2SetFmt(int iFd, enum v4l2_buf_type eType, struct CONFIG *pstConfig)
-{
-    struct v4l2_format fmt;
-    int iRet = ERROR_NONE;
-
-    fmt.type = eType;
-    fmt.fmt.pix_mp.width = pstConfig->width;
-    fmt.fmt.pix_mp.height = pstConfig->height;
-    fmt.fmt.pix_mp.field = V4L2_FIELD_ANY;
-    fmt.fmt.pix_mp.num_planes = pstConfig->numOfPlanes;
-
-    if (pstConfig->mode == MODE_ENCODE)
-        fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_JPEG;
-
-    switch (fmt.type) {
-    case V4L2_BUF_TYPE_VIDEO_OUTPUT:    // fall through
-    case V4L2_BUF_TYPE_VIDEO_CAPTURE:
-        break;
-    case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
-        if (pstConfig->mode == MODE_ENCODE) {
-            fmt.fmt.pix_mp.pixelformat = pstConfig->pix.enc_fmt.in_fmt;
-        } else {
-            fmt.fmt.pix_mp.pixelformat = pstConfig->pix.dec_fmt.in_fmt;
-            fmt.fmt.pix_mp.plane_fmt[0].sizeimage = pstConfig->sizeJpeg;
-        }
-        break;
-    case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
-        if (pstConfig->mode == MODE_ENCODE) {
-            fmt.fmt.pix_mp.pixelformat = pstConfig->pix.enc_fmt.out_fmt;
-        } else {
-            fmt.fmt.pix_mp.pixelformat = pstConfig->pix.dec_fmt.out_fmt;
-            fmt.fmt.pix_mp.width = pstConfig->scaled_width;
-            fmt.fmt.pix_mp.height = pstConfig->scaled_height;
-        }
-        break;
-    default:
-            return -ERROR_INVALID_V4l2_BUF_TYPE;
-            break;
-    }
-
-    iRet = ioctl(iFd, VIDIOC_S_FMT, &fmt);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: VIDIOC_S_FMT failed", __func__, iRet);
-        return iRet;
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2GetFmt(int iFd, enum v4l2_buf_type eType, struct CONFIG *pstConfig)
-{
-    struct v4l2_format fmt;
-    int iRet = ERROR_NONE;
-
-    fmt.type = eType;
-    iRet = ioctl(iFd, VIDIOC_G_FMT, &fmt);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: VIDIOC_G_FMT failed", __func__, iRet);
-        return iRet;
-    }
-
-    switch (fmt.type) {
-    case V4L2_BUF_TYPE_VIDEO_OUTPUT:    // fall through
-    case V4L2_BUF_TYPE_VIDEO_CAPTURE:
-        pstConfig->width = fmt.fmt.pix.width;
-        pstConfig->height = fmt.fmt.pix.height;
-        break;
-    case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
-        pstConfig->width = fmt.fmt.pix_mp.width;
-        pstConfig->height = fmt.fmt.pix_mp.height;
-        if (pstConfig->mode == MODE_ENCODE)
-            pstConfig->pix.enc_fmt.in_fmt = fmt.fmt.pix_mp.pixelformat;
-        else
-            pstConfig->pix.dec_fmt.in_fmt = fmt.fmt.pix_mp.pixelformat;
-        break;
-    case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
-        pstConfig->width = fmt.fmt.pix_mp.width;
-        pstConfig->height = fmt.fmt.pix_mp.height;
-        if (pstConfig->mode == MODE_ENCODE)
-            pstConfig->pix.enc_fmt.out_fmt = fmt.fmt.pix_mp.pixelformat;
-        else
-            pstConfig->pix.dec_fmt.out_fmt = fmt.fmt.pix_mp.pixelformat;
-        break;
-    default:
-        return -ERROR_INVALID_V4l2_BUF_TYPE;
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2Reqbufs(int iFd, int iBufCount, struct BUF_INFO *pstBufInfo)
-{
-    struct v4l2_requestbuffers req;
-    int iRet = ERROR_NONE;
-
-    memset(&req, 0, sizeof(req));
-
-    req.type = pstBufInfo->buf_type;
-    req.memory = pstBufInfo->memory;
-
-    //if (pstBufInfo->memory == V4L2_MEMORY_MMAP)
-        req.count = iBufCount;
-
-    iRet = ioctl(iFd, VIDIOC_REQBUFS, &req);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: VIDIOC_REQBUFS failed", __func__, iRet);
-        return iRet;
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2Querybuf(int iFd, struct BUF_INFO *pstBufInfo, struct BUFFER *pstBuf)
-{
-    struct v4l2_buffer v4l2_buf;
-    struct v4l2_plane plane[JPEG_MAX_PLANE_CNT];
-    int iRet = ERROR_NONE;
-    int i;
-
-    memset(plane, 0, (int)JPEG_MAX_PLANE_CNT * sizeof(struct v4l2_plane));
-
-    v4l2_buf.index = 0;
-    v4l2_buf.type = pstBufInfo->buf_type;
-    v4l2_buf.memory = pstBufInfo->memory;
-    v4l2_buf.length = pstBufInfo->numOfPlanes;
-    v4l2_buf.m.planes = plane;
-
-    iRet = ioctl(iFd, VIDIOC_QUERYBUF, &v4l2_buf);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: VIDIOC_QUERYBUF failed", __func__, iRet);
-        return iRet;
-    }
-
-    for (i= 0; i < v4l2_buf.length; i++) {
-        pstBuf->size[i] = v4l2_buf.m.planes[i].length;
-        pstBuf->addr[i] = (char *) mmap(0,
-            pstBuf->size[i],
-            PROT_READ | PROT_WRITE, MAP_SHARED, iFd,
-            v4l2_buf.m.planes[i].m.mem_offset);
-
-        if (pstBuf->addr[i] == MAP_FAILED) {
-            JPEG_ERROR_LOG("[%s]: mmap failed", __func__);
-            return -ERROR_MMAP_FAILED;
-        }
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2Qbuf(int iFd, struct BUF_INFO *pstBufInfo, struct BUFFER *pstBuf)
-{
-    struct v4l2_buffer v4l2_buf;
-    struct v4l2_plane plane[JPEG_MAX_PLANE_CNT];
-    int i;
-    int iRet = ERROR_NONE;
-
-    memset(&v4l2_buf, 0, sizeof(struct v4l2_buffer));
-    memset(plane, 0, (int)JPEG_MAX_PLANE_CNT * sizeof(struct v4l2_plane));
-
-    v4l2_buf.index = 0;
-    v4l2_buf.type = pstBufInfo->buf_type;
-    v4l2_buf.memory = pstBufInfo->memory;
-    v4l2_buf.length = pstBufInfo->numOfPlanes;
-    v4l2_buf.m.planes = plane;
-
-    if (pstBufInfo->memory == V4L2_MEMORY_USERPTR) {
-        for (i = 0; i < pstBufInfo->numOfPlanes; i++) {
-            v4l2_buf.m.planes[i].m.userptr = (unsigned long)pstBuf->addr[i];
-            v4l2_buf.m.planes[i].length = pstBuf->size[i];
-        }
-    }
-
-    iRet = ioctl(iFd, VIDIOC_QBUF, &v4l2_buf);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d] VIDIOC_QBUF failed", __func__, iRet);
-        pstBuf->numOfPlanes = 0;
-        return iRet;
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2Dqbuf(int iFd, enum v4l2_buf_type eType, enum v4l2_memory eMemory)
-{
-    struct v4l2_buffer buf;
-    int iRet = ERROR_NONE;
-
-    memset(&buf, 0, sizeof(struct v4l2_buffer));
-
-    buf.type = eType;
-    buf.memory = eMemory;
-
-    iRet = ioctl(iFd, VIDIOC_DQBUF, &buf);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d] VIDIOC_DQBUF failed", __func__, iRet);
-        return iRet;
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2StreamOn(int iFd, enum v4l2_buf_type eType)
-{
-    int iRet = ERROR_NONE;
-
-    iRet = ioctl(iFd, VIDIOC_STREAMON, &eType);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d] VIDIOC_STREAMON failed", __func__, iRet);
-        return iRet;
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2StreamOff(int iFd, enum v4l2_buf_type eType)
-{
-    int iRet = ERROR_NONE;
-
-    iRet = ioctl(iFd, VIDIOC_STREAMOFF, &eType);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d] VIDIOC_STREAMOFF failed", __func__, iRet);
-        return iRet;
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2SetCtrl(int iFd, int iCid, int iValue)
-{
-    struct v4l2_control vc;
-    int iRet = ERROR_NONE;
-
-    vc.id = iCid;
-    vc.value = iValue;
-
-    iRet = ioctl(iFd, VIDIOC_S_CTRL, &vc);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s] VIDIOC_S_CTRL failed : cid(%d), value(%d)\n", __func__, iCid, iValue);
-        return iRet;
-    }
-
-    return iRet;
-}
-
-int SecJpegCodecHal::t_v4l2GetCtrl(int iFd, int iCid)
-{
-    struct v4l2_control ctrl;
-    int iRet = ERROR_NONE;
-
-    ctrl.id = iCid;
-
-    iRet = ioctl(iFd, VIDIOC_G_CTRL, &ctrl);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s] VIDIOC_G_CTRL failed : cid(%d)\n", __func__, ctrl.id);
-        return iRet;
-    }
-
-    return ctrl.value;
-}
-
diff --git a/exynos5/hal/libhwjpeg/SecJpegDecoderHal.cpp b/exynos5/hal/libhwjpeg/SecJpegDecoderHal.cpp
deleted file mode 100644
index 12b9dfc..0000000
--- a/exynos5/hal/libhwjpeg/SecJpegDecoderHal.cpp
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * Copyright Samsung Electronics Co.,LTD.
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <string.h>
-#include <errno.h>
-#include <signal.h>
-#include <math.h>
-#include <sys/poll.h>
-
-#include <cutils/log.h>
-
-#include <utils/Log.h>
-
-#include "SecJpegCodecHal.h"
-
-#define JPEG_ERROR_ALOG(fmt,...)
-
-#define NUM_PLANES (1)
-#define NUM_BUFFERS (1)
-
-SecJpegDecoderHal::SecJpegDecoderHal()
-{
-    t_iJpegFd = -1;
-    t_bFlagCreate = false;
-}
-
-SecJpegDecoderHal::~SecJpegDecoderHal()
-{
-    if (t_bFlagCreate == true) {
-        this->destroy();
-    }
-}
-
-int SecJpegDecoderHal::create(void)
-{
-    if (t_bFlagCreate == true) {
-        return ERROR_JPEG_DEVICE_ALREADY_CREATE;
-    }
-
-    int iRet = ERROR_NONE;
-
-    t_iJpegFd = open(JPEG_DEC_NODE, O_RDWR, 0);
-
-    if (t_iJpegFd < 0) {
-        t_iJpegFd = -1;
-        JPEG_ERROR_ALOG("[%s]: JPEG_DEC_NODE open failed", __func__);
-        return ERROR_CANNOT_OPEN_JPEG_DEVICE;
-    }
-
-    if (t_iJpegFd <= 0) {
-        t_iJpegFd = -1;
-        JPEG_ERROR_ALOG("ERR(%s):JPEG device was closed\n", __func__);
-        return ERROR_JPEG_DEVICE_ALREADY_CLOSED;
-    }
-
-    iRet = t_v4l2Querycap(t_iJpegFd);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s]: QUERYCAP failed", __func__);
-        close(t_iJpegFd);
-        return ERROR_CANNOT_OPEN_JPEG_DEVICE;
-    }
-
-    memset(&t_stJpegConfig, 0, sizeof(struct CONFIG));
-    memset(&t_stJpegInbuf, 0, sizeof(struct BUFFER));
-    memset(&t_stJpegOutbuf, 0, sizeof(struct BUFFER));
-
-    t_stJpegConfig.mode = MODE_DECODE;
-
-    t_bFlagCreate = true;
-    t_bFlagCreateInBuf = false;
-    t_bFlagCreateOutBuf = false;
-    t_bFlagExcute = false;
-
-    t_iPlaneNum = 0;
-
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::destroy(void)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_ALREADY_DESTROY;
-    }
-
-    if (t_iJpegFd > 0) {
-        struct BUF_INFO stBufInfo;
-        int iRet = ERROR_NONE;
-
-        if (t_bFlagExcute) {
-            iRet = t_v4l2StreamOff(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
-        }
-
-        if (t_bFlagExcute) {
-            stBufInfo.numOfPlanes = NUM_PLANES;
-            stBufInfo.memory = V4L2_MEMORY_MMAP;
-
-            stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-            iRet = t_v4l2Reqbufs(t_iJpegFd, 0, &stBufInfo);
-
-            stBufInfo.numOfPlanes = t_iPlaneNum;
-            stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-            iRet = t_v4l2Reqbufs(t_iJpegFd, 0, &stBufInfo);
-        }
-
-        iRet = close(t_iJpegFd);
-        if (iRet < 0) {
-            JPEG_ERROR_ALOG("[%s:%d]: JPEG_DEC_NODE close failed", __func__, iRet);
-        }
-    }
-
-    t_iJpegFd = -1;
-    t_bFlagCreate = false;
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::setSize(int iW, int iH)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (iW < 0 || MAX_JPG_WIDTH < iW) {
-        return ERROR_INVALID_IMAGE_SIZE;
-    }
-
-    if (iH < 0 || MAX_JPG_HEIGHT < iH) {
-        return ERROR_INVALID_IMAGE_SIZE;
-    }
-
-    t_stJpegConfig.width = iW;
-    t_stJpegConfig.height = iH;
-
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::setJpegConfig(void *pConfig)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (pConfig == NULL) {
-        return ERROR_JPEG_CONFIG_POINTER_NULL;
-    }
-
-    memcpy(&t_stJpegConfig, pConfig, sizeof(struct CONFIG));
-
-    if (t_stJpegConfig.pix.dec_fmt.out_fmt == V4L2_PIX_FMT_NV12) {
-        t_iPlaneNum = 2;
-    } else {
-        t_iPlaneNum = 1;
-    }
-
-    return ERROR_NONE;
-}
-
-void *SecJpegDecoderHal::getJpegConfig(void)
-{
-    if (t_bFlagCreate == false) {
-        return NULL;
-    }
-
-    return &t_stJpegConfig;
-}
-
-char *SecJpegDecoderHal::getInBuf(int *piInputSize)
-{
-    if (t_bFlagCreate == false) {
-        return NULL;
-    }
-
-     if (t_bFlagCreateInBuf == false) {
-
-        *piInputSize = 0;
-        return NULL;
-    }
-
-    *piInputSize = t_stJpegInbuf.size[0];
-
-    return (char *)(t_stJpegInbuf.addr[0]);
-}
-
-char **SecJpegDecoderHal::getOutBuf(int *piOutputSize)
-{
-    if (t_bFlagCreate == false) {
-        return NULL;
-    }
-
-    if (t_bFlagCreateOutBuf == false) {
-
-        *piOutputSize = 0;
-        return NULL;
-    }
-
-    for (int i=0;i<t_iPlaneNum;i++) {
-        piOutputSize[i] = t_stJpegOutbuf.size[i];
-    }
-
-    return t_stJpegOutbuf.addr;
-}
-
-int  SecJpegDecoderHal::setInBuf(char *pcBuf, int iSize)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (pcBuf == NULL) {
-        return ERROR_BUFFR_IS_NULL;
-    }
-
-    if (iSize<=0) {
-        return ERROR_BUFFER_TOO_SMALL;
-    }
-
-    t_stJpegInbuf.addr[0] = pcBuf;
-    t_stJpegInbuf.size[0] = iSize;
-    t_stJpegInbuf.numOfPlanes = NUM_PLANES;
-
-    t_bFlagCreateInBuf = true;
-
-    return ERROR_NONE;
-}
-
-int  SecJpegDecoderHal::setOutBuf(char **pcBuf, int *iSize)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (pcBuf == NULL) {
-        return ERROR_BUFFR_IS_NULL;
-    }
-
-    if (iSize<=0) {
-        return ERROR_BUFFER_TOO_SMALL;
-    }
-
-    for(int i=0;i<t_iPlaneNum;i++) {
-        t_stJpegOutbuf.addr[i] = pcBuf[i];
-        t_stJpegOutbuf.size[i] = iSize[i];
-    }
-
-    t_stJpegOutbuf.numOfPlanes = t_iPlaneNum;
-
-    t_bFlagCreateOutBuf = true;
-
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::setCache(int iValue)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (t_v4l2SetCtrl(t_iJpegFd, V4L2_CID_CACHEABLE, iValue)<0) {
-        JPEG_ERROR_ALOG("%s::cache setting failed\n", __func__);
-        return ERROR_CANNOT_CHANGE_CACHE_SETTING;
-    }
-
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::getSize(int *piW, int *piH)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    int iRet = t_v4l2GetFmt(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, &t_stJpegConfig);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s,%d]: get image size failed", __func__,iRet);
-        return ERROR_GET_SIZE_FAIL;
-    }
-
-    *piW = t_stJpegConfig.width;
-    *piH = t_stJpegConfig.height;
-
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::setColorFormat(int iV4l2ColorFormat)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    switch(iV4l2ColorFormat) {
-    case V4L2_PIX_FMT_YUYV:
-    case V4L2_PIX_FMT_RGB565X:
-    case V4L2_PIX_FMT_BGR32:
-    case V4L2_PIX_FMT_RGB32:
-        t_stJpegConfig.pix.dec_fmt.out_fmt = iV4l2ColorFormat;
-        break;
-    default:
-        t_iPlaneNum = 0;
-        return ERROR_INVALID_COLOR_FORMAT;
-        break;
-    }
-
-    if (iV4l2ColorFormat == V4L2_PIX_FMT_NV12) {
-        t_iPlaneNum = 2;
-    } else {
-        t_iPlaneNum = 1;
-    }
-
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::setJpegFormat(int iV4l2JpegFormat)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    switch(iV4l2JpegFormat) {
-    case V4L2_PIX_FMT_JPEG_444:
-    case V4L2_PIX_FMT_JPEG_422:
-    case V4L2_PIX_FMT_JPEG_420:
-    case V4L2_PIX_FMT_JPEG_GRAY:
-        t_stJpegConfig.pix.dec_fmt.in_fmt = iV4l2JpegFormat;
-        break;
-    default:
-        return ERROR_INVALID_JPEG_FORMAT;
-        break;
-    }
-
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::updateConfig(void)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    int iRet = ERROR_NONE;
-
-    t_stJpegConfig.numOfPlanes = NUM_PLANES;
-
-    t_stJpegConfig.mode = MODE_DECODE;
-
-    iRet = t_v4l2SetFmt(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, &t_stJpegConfig);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s,%d]: jpeg input S_FMT failed", __func__,iRet);
-        return ERROR_INVALID_JPEG_CONFIG;
-    }
-
-    struct BUF_INFO stBufInfo;
-
-    stBufInfo.numOfPlanes = NUM_PLANES;
-    stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    stBufInfo.memory = V4L2_MEMORY_USERPTR;
-
-    iRet = t_v4l2Reqbufs(t_iJpegFd, NUM_BUFFERS, &stBufInfo);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s:%d]: Input REQBUFS failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-
-    t_stJpegConfig.numOfPlanes = t_iPlaneNum;
-    iRet = t_v4l2SetFmt(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, &t_stJpegConfig);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s,%d]: jpeg output S_FMT failed", __func__,iRet);
-        return ERROR_INVALID_JPEG_CONFIG;
-    }
-
-    stBufInfo.numOfPlanes = t_iPlaneNum;
-    stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-
-    iRet = t_v4l2Reqbufs(t_iJpegFd, NUM_BUFFERS, &stBufInfo);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s:%d]: Output REQBUFS failed", __func__, iRet);
-        return ERROR_REQBUF_FAIL;
-    }
-
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::setScaledSize(int iW, int iH)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (iW < 0 || MAX_JPG_WIDTH < iW) {
-        return ERROR_INVALID_IMAGE_SIZE;
-    }
-
-    if (iH < 0 || MAX_JPG_HEIGHT < iH) {
-        return ERROR_INVALID_IMAGE_SIZE;
-    }
-
-    t_stJpegConfig.scaled_width = iW;
-    t_stJpegConfig.scaled_height = iH;
-
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::setJpegSize(int iJpegSize)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (iJpegSize<=0) {
-        return ERROR_JPEG_SIZE_TOO_SMALL;
-    }
-
-    t_stJpegConfig.sizeJpeg = iJpegSize;
-
-    return ERROR_NONE;
-}
-
-int SecJpegDecoderHal::decode(void)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    struct BUF_INFO stBufInfo;
-    int iRet = ERROR_NONE;
-
-    t_bFlagExcute = true;
-
-    stBufInfo.numOfPlanes = NUM_PLANES;
-    stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-
-    stBufInfo.memory = V4L2_MEMORY_USERPTR;
-
-    iRet = t_v4l2Qbuf(t_iJpegFd, &stBufInfo, &t_stJpegInbuf);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s:%d]: Input QBUF failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-
-    stBufInfo.numOfPlanes = t_iPlaneNum;
-    stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-
-    iRet = t_v4l2Qbuf(t_iJpegFd, &stBufInfo, &t_stJpegOutbuf);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s:%d]: Output QBUF failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-
-    stBufInfo.numOfPlanes = NUM_PLANES;
-    iRet = t_v4l2StreamOn(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s:%d]: input stream on failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-    stBufInfo.numOfPlanes = t_iPlaneNum;
-    iRet = t_v4l2StreamOn(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s:%d]: output stream on failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-
-    stBufInfo.numOfPlanes = NUM_PLANES;
-    iRet = t_v4l2Dqbuf(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_MMAP);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s:%d]: Intput DQBUF failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-    stBufInfo.numOfPlanes = t_iPlaneNum;
-    iRet = t_v4l2Dqbuf(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP);
-    if (iRet < 0) {
-        JPEG_ERROR_ALOG("[%s:%d]: Output DQBUF failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-
-    return ERROR_NONE;
-}
-
diff --git a/exynos5/hal/libhwjpeg/SecJpegEncoder.cpp b/exynos5/hal/libhwjpeg/SecJpegEncoder.cpp
deleted file mode 100644
index 0ceac31..0000000
--- a/exynos5/hal/libhwjpeg/SecJpegEncoder.cpp
+++ /dev/null
@@ -1,952 +0,0 @@
-/*
- * Copyright Samsung Electronics Co.,LTD.
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <utils/Log.h>
-
-#include "SecJpegEncoder.h"
-
-static const char ExifAsciiPrefix[] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 };
-
-#define JPEG_ERROR_ALOG(fmt,...)
-
-#define JPEG_MAIN_DUMP  (0)
-#define JPEG_THUMB_DUMP (0)
-
-SecJpegEncoder::SecJpegEncoder()
-{
-    m_flagCreate = false;
-    m_jpegMain = NULL;
-    m_jpegThumb = NULL;
-    m_thumbnailW = 0;
-    m_thumbnailH = 0;
-    m_pThumbInputBuffer = NULL;
-    m_pThumbOutputBuffer = NULL;
-#ifdef JPEG_WA_FOR_PAGEFAULT
-    m_pJpegInputBuffer = 0;
-    m_pExtInBuf = NULL;
-    m_iInBufSize = 0;
-#endif // JPEG_WA_FOR_PAGEFAULT
-    m_ionJpegClient = 0;;
-    m_ionThumbInBuffer = 0;
-    m_ionThumbOutBuffer = 0;
-#ifdef JPEG_WA_FOR_PAGEFAULT
-    m_ionJpegInBuffer = 0;;
-#endif // JPEG_WA_FOR_PAGEFAULT
-}
-
-SecJpegEncoder::~SecJpegEncoder()
-{
-    if (m_flagCreate == true) {
-        this->destroy();
-    }
-}
-
-bool SecJpegEncoder::flagCreate(void)
-{
-    return m_flagCreate;
-}
-
-int SecJpegEncoder::create(void)
-{
-    int ret = ERROR_NONE;
-    if (m_flagCreate == true) {
-        return ERROR_ALREADY_CREATE;
-    }
-
-    if (m_jpegMain == NULL) {
-        m_jpegMain = new SecJpegEncoderHal;
-
-        if (m_jpegMain == NULL) {
-            JPEG_ERROR_ALOG("ERR(%s):Cannot create SecJpegEncoderHal class\n", __func__);
-            return ERROR_CANNOT_CREATE_SEC_JPEG_ENC_HAL;
-        }
-
-        ret = m_jpegMain->create();
-        if (ret) {
-            return ret;
-        }
-
-        ret = m_jpegMain->setCache(JPEG_CACHE_ON);
-
-        if (ret) {
-            m_jpegMain->destroy();
-            return ret;
-        }
-    }
-
-    m_flagCreate = true;
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoder::destroy(void)
-{
-    if (m_flagCreate == false) {
-        return ERROR_ALREADY_DESTROY;
-    }
-
-    if (m_jpegMain != NULL) {
-        m_jpegMain->destroy();
-        delete m_jpegMain;
-        m_jpegMain = NULL;
-    }
-
-    if (m_jpegThumb != NULL) {
-        int iSize = sizeof(char)*m_thumbnailW*m_thumbnailH*4;
-
-#ifdef JPEG_WA_FOR_PAGEFAULT
-        iSize += JPEG_WA_BUFFER_SIZE;
-
-        freeJpegIonMemory(m_ionJpegClient, &m_ionJpegInBuffer, &m_pJpegInputBuffer, m_iInBufSize);
-#endif //JPEG_WA_FOR_PAGEFAULT
-
-        freeJpegIonMemory(m_ionJpegClient, &m_ionThumbInBuffer, &m_pThumbInputBuffer, iSize);
-        freeJpegIonMemory(m_ionJpegClient, &m_ionThumbOutBuffer, &m_pThumbOutputBuffer, iSize);
-
-        if (m_ionJpegClient != 0) {
-            ion_client_destroy(m_ionJpegClient);
-            m_ionJpegClient = 0;
-        }
-
-        m_jpegThumb->destroy();
-        delete m_jpegThumb;
-        m_jpegThumb = NULL;
-    }
-
-    m_flagCreate = false;
-    m_thumbnailW = 0;
-    m_thumbnailH = 0;
-    return ERROR_NONE;
-}
-
-int SecJpegEncoder::setSize(int w, int h)
-{
-    if (m_flagCreate == false) {
-        return ERROR_NOT_YET_CREATED;
-    }
-
-    return m_jpegMain->setSize(w, h);
-}
-
-
-int SecJpegEncoder::setQuality(int quality)
-{
-    if (m_flagCreate == false) {
-        return ERROR_NOT_YET_CREATED;
-    }
-
-    return m_jpegMain->setQuality(quality);
-}
-
-int SecJpegEncoder::setColorFormat(int colorFormat)
-{
-    if (m_flagCreate == false) {
-        return ERROR_NOT_YET_CREATED;
-    }
-
-    return m_jpegMain->setColorFormat(colorFormat);
-}
-
-int SecJpegEncoder::setJpegFormat(int jpegFormat)
-{
-    if (m_flagCreate == false) {
-        return ERROR_NOT_YET_CREATED;
-    }
-
-    return m_jpegMain->setJpegFormat(jpegFormat);
-}
-
-int SecJpegEncoder::updateConfig(void)
-{
-    if (m_flagCreate == false) {
-        return ERROR_NOT_YET_CREATED;
-    }
-
-    return m_jpegMain->updateConfig();
-}
-
-char *SecJpegEncoder::getInBuf(int *input_size)
-{
-    if (m_flagCreate == false) {
-        return NULL;
-    }
-
-    int inSize = 0;
-    char *inBuf = *(m_jpegMain->getInBuf(&inSize));
-
-    if (inBuf == NULL) {
-        JPEG_ERROR_ALOG("%s::Fail to JPEG input buffer!!\n", __func__);
-        return NULL;
-    }
-
-    *input_size = inSize;
-
-    return inBuf;
-}
-
-char *SecJpegEncoder::getOutBuf(int *output_size)
-{
-    if (m_flagCreate == false) {
-        return NULL;
-    }
-
-    int outSize = 0;
-    char *outBuf = m_jpegMain->getOutBuf(&outSize);
-
-    if (outBuf == NULL) {
-        JPEG_ERROR_ALOG("%s::Fail to JPEG input buffer!!\n", __func__);
-        return NULL;
-    }
-
-    *output_size = outSize;
-
-    return outBuf;
-}
-
-int  SecJpegEncoder::setInBuf(char *buf, int size)
-{
-    if (m_flagCreate == false) {
-        return ERROR_NOT_YET_CREATED;
-    }
-
-    if (buf == NULL) {
-        return ERROR_BUFFR_IS_NULL;
-    }
-
-    if (size<=0) {
-        return ERROR_BUFFER_TOO_SMALL;
-    }
-
-    int ret = ERROR_NONE;
-
-#ifdef JPEG_WA_FOR_PAGEFAULT
-    size += JPEG_WA_BUFFER_SIZE;
-
-    freeJpegIonMemory(m_ionJpegClient, &m_ionJpegInBuffer, &m_pJpegInputBuffer, size);
-
-    if (m_ionJpegClient == 0) {
-        m_ionJpegClient = ion_client_create();
-        if (m_ionJpegClient < 0) {
-            JPEG_ERROR_ALOG("[%s]src ion client create failed, value = %d\n", __func__, size);
-            m_ionJpegClient = 0;
-            return ret;
-        }
-    }
-
-    ret = allocJpegIonMemory(m_ionJpegClient, &m_ionJpegInBuffer, &m_pJpegInputBuffer, size);
-    if (ret != ERROR_NONE) {
-        return ret;
-    }
-
-    ret = m_jpegMain->setInBuf(&m_pJpegInputBuffer, &size);
-    if (ret) {
-        JPEG_ERROR_ALOG("%s::Fail to JPEG input buffer!!\n", __func__);
-        return ret;
-    }
-    m_iInBufSize = size;
-
-    m_pExtInBuf = buf;
-
-#else // NO JPEG_WA_FOR_PAGEFAULT
-    ret = m_jpegMain->setInBuf(&buf, &size);
-    if (ret) {
-        JPEG_ERROR_ALOG("%s::Fail to JPEG input buffer!!\n", __func__);
-        return ret;
-    }
-#endif // JPEG_WA_FOR_PAGEFAULT
-
-    return ERROR_NONE;
-}
-
-int  SecJpegEncoder::setOutBuf(char *buf, int size)
-{
-    if (m_flagCreate == false) {
-        return ERROR_NOT_YET_CREATED;
-    }
-
-    if (buf == NULL) {
-        return ERROR_BUFFR_IS_NULL;
-    }
-
-    if (size<=0) {
-        return ERROR_BUFFER_TOO_SMALL;
-    }
-
-    int ret = ERROR_NONE;
-    ret = m_jpegMain->setOutBuf(buf, size);
-    if (ret) {
-        JPEG_ERROR_ALOG("%s::Fail to JPEG output buffer!!\n", __func__);
-        return ret;
-    }
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoder::encode(int *size, exif_attribute_t *exifInfo)
-{
-    int ret = ERROR_NONE;
-    unsigned char *exifOut = NULL;
-
-    if (m_flagCreate == false) {
-        return ERROR_NOT_YET_CREATED;
-    }
-
-#ifdef JPEG_WA_FOR_PAGEFAULT
-    memcpy(m_pJpegInputBuffer, m_pExtInBuf, m_iInBufSize-JPEG_WA_BUFFER_SIZE);
-#endif // JPEG_WA_FOR_PAGEFAULT
-
-    ret = m_jpegMain->encode();
-    if (ret) {
-        JPEG_ERROR_ALOG("encode failed\n");
-        return ret;
-    }
-
-    int iJpegSize = m_jpegMain->getJpegSize();
-
-    if (iJpegSize<=0) {
-        JPEG_ERROR_ALOG("%s:: output_size is too small(%d)!!\n", __func__, iJpegSize);
-        return ERROR_OUT_BUFFER_SIZE_TOO_SMALL;
-    }
-
-    int iOutputSize = 0;
-    char *pcJpegBuffer = m_jpegMain->getOutBuf(&iOutputSize);
-
-    if (pcJpegBuffer == NULL) {
-        JPEG_ERROR_ALOG("%s::buffer is null!!\n", __func__);
-        return ERROR_OUT_BUFFER_CREATE_FAIL;
-    }
-
-    if (exifInfo != NULL) {
-        unsigned int thumbLen, exifLen;
-
-        unsigned int bufSize = 0;
-        if (exifInfo->enableThumb) {
-            if (encodeThumbnail(&thumbLen)) {
-                bufSize = EXIF_FILE_SIZE;
-                exifInfo->enableThumb = false;
-            } else {
-                if (thumbLen > EXIF_LIMIT_SIZE) {
-                    bufSize = EXIF_FILE_SIZE;
-                    exifInfo->enableThumb = false;
-                }
-                else {
-                    bufSize = EXIF_FILE_SIZE + thumbLen;
-                }
-            }
-        } else {
-            bufSize = EXIF_FILE_SIZE;
-            exifInfo->enableThumb = false;
-        }
-
-        exifOut = new unsigned char[bufSize];
-        if (exifOut == NULL) {
-            JPEG_ERROR_ALOG("%s::Failed to allocate for exifOut", __func__);
-            delete[] exifOut;
-            return ERROR_EXIFOUT_ALLOC_FAIL;
-        }
-        memset(exifOut, 0, bufSize);
-
-        if (makeExif (exifOut, exifInfo, &exifLen)) {
-            JPEG_ERROR_ALOG("%s::Failed to make EXIF", __func__);
-            delete[] exifOut;
-            return ERROR_MAKE_EXIF_FAIL;
-        }
-
-        if (exifLen <= EXIF_LIMIT_SIZE) {
-            memmove(pcJpegBuffer+exifLen+2, pcJpegBuffer+2, iJpegSize - 2);
-            memcpy(pcJpegBuffer+2, exifOut, exifLen);
-            iJpegSize += exifLen;
-        }
-
-        delete[] exifOut;
-    }
-
-    *size = iJpegSize;
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoder::makeExif (unsigned char *exifOut,
-                              exif_attribute_t *exifInfo,
-                              unsigned int *size,
-                              bool useMainbufForThumb)
-{
-    unsigned char *pCur, *pApp1Start, *pIfdStart, *pGpsIfdPtr, *pNextIfdOffset;
-    unsigned int tmp, LongerTagOffest = 0, exifSizeExceptThumb;
-    pApp1Start = pCur = exifOut;
-
-    //2 Exif Identifier Code & TIFF Header
-    pCur += 4;  // Skip 4 Byte for APP1 marker and length
-    unsigned char ExifIdentifierCode[6] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
-    memcpy(pCur, ExifIdentifierCode, 6);
-    pCur += 6;
-
-    /* Byte Order - little endian, Offset of IFD - 0x00000008.H */
-    unsigned char TiffHeader[8] = { 0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00 };
-    memcpy(pCur, TiffHeader, 8);
-    pIfdStart = pCur;
-    pCur += 8;
-
-    //2 0th IFD TIFF Tags
-    if (exifInfo->enableGps)
-        tmp = NUM_0TH_IFD_TIFF;
-    else
-        tmp = NUM_0TH_IFD_TIFF - 1;
-
-    memcpy(pCur, &tmp, NUM_SIZE);
-    pCur += NUM_SIZE;
-
-    LongerTagOffest += 8 + NUM_SIZE + tmp*IFD_SIZE + OFFSET_SIZE;
-
-    writeExifIfd(&pCur, EXIF_TAG_IMAGE_WIDTH, EXIF_TYPE_LONG,
-                 1, exifInfo->width);
-    writeExifIfd(&pCur, EXIF_TAG_IMAGE_HEIGHT, EXIF_TYPE_LONG,
-                 1, exifInfo->height);
-    writeExifIfd(&pCur, EXIF_TAG_MAKE, EXIF_TYPE_ASCII,
-                 strlen((char *)exifInfo->maker) + 1, exifInfo->maker, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_MODEL, EXIF_TYPE_ASCII,
-                 strlen((char *)exifInfo->model) + 1, exifInfo->model, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT,
-                 1, exifInfo->orientation);
-    writeExifIfd(&pCur, EXIF_TAG_SOFTWARE, EXIF_TYPE_ASCII,
-                 strlen((char *)exifInfo->software) + 1, exifInfo->software, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME, EXIF_TYPE_ASCII,
-                 20, exifInfo->date_time, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_YCBCR_POSITIONING, EXIF_TYPE_SHORT,
-                 1, exifInfo->ycbcr_positioning);
-    writeExifIfd(&pCur, EXIF_TAG_EXIF_IFD_POINTER, EXIF_TYPE_LONG,
-                 1, LongerTagOffest);
-    if (exifInfo->enableGps) {
-        pGpsIfdPtr = pCur;
-        pCur += IFD_SIZE;   // Skip a ifd size for gps IFD pointer
-    }
-
-    pNextIfdOffset = pCur;  // Skip a offset size for next IFD offset
-    pCur += OFFSET_SIZE;
-
-    //2 0th IFD Exif Private Tags
-    pCur = pIfdStart + LongerTagOffest;
-
-    tmp = NUM_0TH_IFD_EXIF;
-    memcpy(pCur, &tmp , NUM_SIZE);
-    pCur += NUM_SIZE;
-
-    LongerTagOffest += NUM_SIZE + NUM_0TH_IFD_EXIF*IFD_SIZE + OFFSET_SIZE;
-
-    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_TIME, EXIF_TYPE_RATIONAL,
-                 1, &exifInfo->exposure_time, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_FNUMBER, EXIF_TYPE_RATIONAL,
-                 1, &exifInfo->fnumber, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_PROGRAM, EXIF_TYPE_SHORT,
-                 1, exifInfo->exposure_program);
-    writeExifIfd(&pCur, EXIF_TAG_ISO_SPEED_RATING, EXIF_TYPE_SHORT,
-                 1, exifInfo->iso_speed_rating);
-    writeExifIfd(&pCur, EXIF_TAG_EXIF_VERSION, EXIF_TYPE_UNDEFINED,
-                 4, exifInfo->exif_version);
-    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME_ORG, EXIF_TYPE_ASCII,
-                 20, exifInfo->date_time, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_DATE_TIME_DIGITIZE, EXIF_TYPE_ASCII,
-                 20, exifInfo->date_time, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_SHUTTER_SPEED, EXIF_TYPE_SRATIONAL,
-                 1, (rational_t *)&exifInfo->shutter_speed, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_APERTURE, EXIF_TYPE_RATIONAL,
-                 1, &exifInfo->aperture, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_BRIGHTNESS, EXIF_TYPE_SRATIONAL,
-                 1, (rational_t *)&exifInfo->brightness, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_BIAS, EXIF_TYPE_SRATIONAL,
-                 1, (rational_t *)&exifInfo->exposure_bias, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_MAX_APERTURE, EXIF_TYPE_RATIONAL,
-                 1, &exifInfo->max_aperture, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_METERING_MODE, EXIF_TYPE_SHORT,
-                 1, exifInfo->metering_mode);
-    writeExifIfd(&pCur, EXIF_TAG_FLASH, EXIF_TYPE_SHORT,
-                 1, exifInfo->flash);
-    writeExifIfd(&pCur, EXIF_TAG_FOCAL_LENGTH, EXIF_TYPE_RATIONAL,
-                 1, &exifInfo->focal_length, &LongerTagOffest, pIfdStart);
-    char code[8] = { 0x00, 0x00, 0x00, 0x49, 0x49, 0x43, 0x53, 0x41 };
-    int commentsLen = strlen((char *)exifInfo->user_comment) + 1;
-    memmove(exifInfo->user_comment + sizeof(code), exifInfo->user_comment, commentsLen);
-    memcpy(exifInfo->user_comment, code, sizeof(code));
-    writeExifIfd(&pCur, EXIF_TAG_USER_COMMENT, EXIF_TYPE_UNDEFINED,
-                 commentsLen + sizeof(code), exifInfo->user_comment, &LongerTagOffest, pIfdStart);
-    writeExifIfd(&pCur, EXIF_TAG_COLOR_SPACE, EXIF_TYPE_SHORT,
-                 1, exifInfo->color_space);
-    writeExifIfd(&pCur, EXIF_TAG_PIXEL_X_DIMENSION, EXIF_TYPE_LONG,
-                 1, exifInfo->width);
-    writeExifIfd(&pCur, EXIF_TAG_PIXEL_Y_DIMENSION, EXIF_TYPE_LONG,
-                 1, exifInfo->height);
-    writeExifIfd(&pCur, EXIF_TAG_EXPOSURE_MODE, EXIF_TYPE_LONG,
-                 1, exifInfo->exposure_mode);
-    writeExifIfd(&pCur, EXIF_TAG_WHITE_BALANCE, EXIF_TYPE_LONG,
-                 1, exifInfo->white_balance);
-    writeExifIfd(&pCur, EXIF_TAG_SCENCE_CAPTURE_TYPE, EXIF_TYPE_LONG,
-                 1, exifInfo->scene_capture_type);
-    tmp = 0;
-    memcpy(pCur, &tmp, OFFSET_SIZE); // next IFD offset
-    pCur += OFFSET_SIZE;
-
-    //2 0th IFD GPS Info Tags
-    if (exifInfo->enableGps) {
-        writeExifIfd(&pGpsIfdPtr, EXIF_TAG_GPS_IFD_POINTER, EXIF_TYPE_LONG,
-                     1, LongerTagOffest); // GPS IFD pointer skipped on 0th IFD
-
-        pCur = pIfdStart + LongerTagOffest;
-
-        if (exifInfo->gps_processing_method[0] == 0) {
-            // don't create GPS_PROCESSING_METHOD tag if there isn't any
-            tmp = NUM_0TH_IFD_GPS - 1;
-        } else {
-            tmp = NUM_0TH_IFD_GPS;
-        }
-        memcpy(pCur, &tmp, NUM_SIZE);
-        pCur += NUM_SIZE;
-
-        LongerTagOffest += NUM_SIZE + tmp*IFD_SIZE + OFFSET_SIZE;
-
-        writeExifIfd(&pCur, EXIF_TAG_GPS_VERSION_ID, EXIF_TYPE_BYTE,
-                     4, exifInfo->gps_version_id);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_LATITUDE_REF, EXIF_TYPE_ASCII,
-                     2, exifInfo->gps_latitude_ref);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_LATITUDE, EXIF_TYPE_RATIONAL,
-                     3, exifInfo->gps_latitude, &LongerTagOffest, pIfdStart);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_LONGITUDE_REF, EXIF_TYPE_ASCII,
-                     2, exifInfo->gps_longitude_ref);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_LONGITUDE, EXIF_TYPE_RATIONAL,
-                     3, exifInfo->gps_longitude, &LongerTagOffest, pIfdStart);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_ALTITUDE_REF, EXIF_TYPE_BYTE,
-                     1, exifInfo->gps_altitude_ref);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_ALTITUDE, EXIF_TYPE_RATIONAL,
-                     1, &exifInfo->gps_altitude, &LongerTagOffest, pIfdStart);
-        writeExifIfd(&pCur, EXIF_TAG_GPS_TIMESTAMP, EXIF_TYPE_RATIONAL,
-                     3, exifInfo->gps_timestamp, &LongerTagOffest, pIfdStart);
-        tmp = strlen((char*)exifInfo->gps_processing_method);
-        if (tmp > 0) {
-            if (tmp > 100) {
-                tmp = 100;
-            }
-            unsigned char tmp_buf[100+sizeof(ExifAsciiPrefix)];
-            memcpy(tmp_buf, ExifAsciiPrefix, sizeof(ExifAsciiPrefix));
-            memcpy(&tmp_buf[sizeof(ExifAsciiPrefix)], exifInfo->gps_processing_method, tmp);
-            writeExifIfd(&pCur, EXIF_TAG_GPS_PROCESSING_METHOD, EXIF_TYPE_UNDEFINED,
-                         tmp+sizeof(ExifAsciiPrefix), tmp_buf, &LongerTagOffest, pIfdStart);
-        }
-        writeExifIfd(&pCur, EXIF_TAG_GPS_DATESTAMP, EXIF_TYPE_ASCII,
-                     11, exifInfo->gps_datestamp, &LongerTagOffest, pIfdStart);
-        tmp = 0;
-        memcpy(pCur, &tmp, OFFSET_SIZE); // next IFD offset
-        pCur += OFFSET_SIZE;
-    }
-
-    //2 1th IFD TIFF Tags
-    char *thumbBuf = NULL;
-    unsigned int thumbSize = 0;
-
-    if (useMainbufForThumb) {
-        if (m_jpegMain) {
-            thumbBuf = m_jpegMain->getOutBuf((int *)&thumbSize);
-            thumbSize = m_jpegMain->getJpegSize();
-        }
-    } else {
-        if (m_jpegThumb) {
-            thumbBuf = m_jpegThumb->getOutBuf((int *)&thumbSize);
-            thumbSize = m_jpegThumb->getJpegSize();
-        }
-    }
-
-    if (exifInfo->enableThumb && (thumbBuf != NULL) && (thumbSize != 0)) {
-        exifSizeExceptThumb = tmp = LongerTagOffest;
-        memcpy(pNextIfdOffset, &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
-
-        pCur = pIfdStart + LongerTagOffest;
-
-        tmp = NUM_1TH_IFD_TIFF;
-        memcpy(pCur, &tmp, NUM_SIZE);
-        pCur += NUM_SIZE;
-
-        LongerTagOffest += NUM_SIZE + NUM_1TH_IFD_TIFF*IFD_SIZE + OFFSET_SIZE;
-
-        writeExifIfd(&pCur, EXIF_TAG_IMAGE_WIDTH, EXIF_TYPE_LONG,
-                     1, exifInfo->widthThumb);
-        writeExifIfd(&pCur, EXIF_TAG_IMAGE_HEIGHT, EXIF_TYPE_LONG,
-                     1, exifInfo->heightThumb);
-        writeExifIfd(&pCur, EXIF_TAG_COMPRESSION_SCHEME, EXIF_TYPE_SHORT,
-                     1, exifInfo->compression_scheme);
-        writeExifIfd(&pCur, EXIF_TAG_ORIENTATION, EXIF_TYPE_SHORT,
-                     1, exifInfo->orientation);
-        writeExifIfd(&pCur, EXIF_TAG_X_RESOLUTION, EXIF_TYPE_RATIONAL,
-                     1, &exifInfo->x_resolution, &LongerTagOffest, pIfdStart);
-        writeExifIfd(&pCur, EXIF_TAG_Y_RESOLUTION, EXIF_TYPE_RATIONAL,
-                     1, &exifInfo->y_resolution, &LongerTagOffest, pIfdStart);
-        writeExifIfd(&pCur, EXIF_TAG_RESOLUTION_UNIT, EXIF_TYPE_SHORT,
-                     1, exifInfo->resolution_unit);
-        writeExifIfd(&pCur, EXIF_TAG_JPEG_INTERCHANGE_FORMAT, EXIF_TYPE_LONG,
-                     1, LongerTagOffest);
-        writeExifIfd(&pCur, EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LEN, EXIF_TYPE_LONG,
-                     1, thumbSize);
-
-        tmp = 0;
-        memcpy(pCur, &tmp, OFFSET_SIZE); // next IFD offset
-        pCur += OFFSET_SIZE;
-
-        memcpy(pIfdStart + LongerTagOffest,
-               thumbBuf, thumbSize);
-        LongerTagOffest += thumbSize;
-        if (LongerTagOffest > EXIF_LIMIT_SIZE) {
-            LongerTagOffest = exifSizeExceptThumb;
-            tmp = 0;
-            memcpy(pNextIfdOffset, &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
-        }
-    } else {
-        tmp = 0;
-        memcpy(pNextIfdOffset, &tmp, OFFSET_SIZE);  // NEXT IFD offset skipped on 0th IFD
-    }
-
-    unsigned char App1Marker[2] = { 0xff, 0xe1 };
-    memcpy(pApp1Start, App1Marker, 2);
-    pApp1Start += 2;
-
-    *size = 10 + LongerTagOffest;
-    tmp = *size - 2;    // APP1 Maker isn't counted
-    unsigned char size_mm[2] = {(tmp >> 8) & 0xFF, tmp & 0xFF};
-    memcpy(pApp1Start, size_mm, 2);
-
-    return ERROR_NONE;
-}
-
-/*
- * private member functions
-*/
-inline void SecJpegEncoder::writeExifIfd(unsigned char **pCur,
-                                             unsigned short tag,
-                                             unsigned short type,
-                                             unsigned int count,
-                                             unsigned int value)
-{
-    memcpy(*pCur, &tag, 2);
-    *pCur += 2;
-    memcpy(*pCur, &type, 2);
-    *pCur += 2;
-    memcpy(*pCur, &count, 4);
-    *pCur += 4;
-    memcpy(*pCur, &value, 4);
-    *pCur += 4;
-}
-
-inline void SecJpegEncoder::writeExifIfd(unsigned char **pCur,
-                                             unsigned short tag,
-                                             unsigned short type,
-                                             unsigned int count,
-                                             unsigned char *pValue)
-{
-    char buf[4] = { 0,};
-
-    memcpy(buf, pValue, count);
-    memcpy(*pCur, &tag, 2);
-    *pCur += 2;
-    memcpy(*pCur, &type, 2);
-    *pCur += 2;
-    memcpy(*pCur, &count, 4);
-    *pCur += 4;
-    memcpy(*pCur, buf, 4);
-    *pCur += 4;
-}
-
-inline void SecJpegEncoder::writeExifIfd(unsigned char **pCur,
-                                             unsigned short tag,
-                                             unsigned short type,
-                                             unsigned int count,
-                                             unsigned char *pValue,
-                                             unsigned int *offset,
-                                             unsigned char *start)
-{
-    memcpy(*pCur, &tag, 2);
-    *pCur += 2;
-    memcpy(*pCur, &type, 2);
-    *pCur += 2;
-    memcpy(*pCur, &count, 4);
-    *pCur += 4;
-    memcpy(*pCur, offset, 4);
-    *pCur += 4;
-    memcpy(start + *offset, pValue, count);
-    *offset += count;
-}
-
-inline void SecJpegEncoder::writeExifIfd(unsigned char **pCur,
-                                             unsigned short tag,
-                                             unsigned short type,
-                                             unsigned int count,
-                                             rational_t *pValue,
-                                             unsigned int *offset,
-                                             unsigned char *start)
-{
-    memcpy(*pCur, &tag, 2);
-    *pCur += 2;
-    memcpy(*pCur, &type, 2);
-    *pCur += 2;
-    memcpy(*pCur, &count, 4);
-    *pCur += 4;
-    memcpy(*pCur, offset, 4);
-    *pCur += 4;
-    memcpy(start + *offset, pValue, 8 * count);
-    *offset += 8 * count;
-}
-
-int SecJpegEncoder::m_scaleDownYuv422(char *srcBuf, unsigned int srcW, unsigned int srcH,
-                                           char *dstBuf, unsigned int dstW, unsigned int dstH)
-{
-    int step_x, step_y;
-    int iXsrc, iXdst;
-    int x, y, src_y_start_pos, dst_pos, src_pos;
-
-    if (dstW & 0x01 || dstH & 0x01) {
-        return ERROR_INVALID_SCALING_WIDTH_HEIGHT;
-    }
-
-    step_x = srcW / dstW;
-    step_y = srcH / dstH;
-
-    unsigned int srcWStride = srcW * 2;
-    unsigned int stepXStride = step_x * 2;
-
-    dst_pos = 0;
-    for (unsigned int y = 0; y < dstH; y++) {
-        src_y_start_pos = srcWStride * step_y * y;
-
-        for (unsigned int x = 0; x < dstW; x += 2) {
-            src_pos = src_y_start_pos + (stepXStride * x);
-
-            dstBuf[dst_pos++] = srcBuf[src_pos    ];
-            dstBuf[dst_pos++] = srcBuf[src_pos + 1];
-            dstBuf[dst_pos++] = srcBuf[src_pos + 2];
-            dstBuf[dst_pos++] = srcBuf[src_pos + 3];
-        }
-    }
-
-    return ERROR_NONE;
-}
-
-// thumbnail
-int SecJpegEncoder::setThumbnailSize(int w, int h)
-{
-    if (m_flagCreate == false) {
-        return ERROR_CANNOT_CREATE_SEC_JPEG_ENC_HAL;
-    }
-
-    if (w < 0 || MAX_JPG_WIDTH < w) {
-        return false;
-    }
-
-    if (h < 0 || MAX_JPG_HEIGHT < h) {
-        return false;
-    }
-
-    m_thumbnailW = w;
-    m_thumbnailH = h;
-    return ERROR_NONE;
-}
-
-
-int SecJpegEncoder::encodeThumbnail(unsigned int *size, bool useMain)
-{
-    int ret = ERROR_NONE;
-
-    if (m_flagCreate == false) {
-        return ERROR_CANNOT_CREATE_SEC_JPEG_ENC_HAL;
-    }
-
-    // create jpeg thumbnail class
-    if (m_jpegThumb == NULL) {
-        m_jpegThumb = new SecJpegEncoderHal;
-
-        if (m_jpegThumb == NULL) {
-            JPEG_ERROR_ALOG("ERR(%s):Cannot open a jpeg device file\n", __func__);
-            return ERROR_CANNOT_CREATE_SEC_THUMB;
-        }
-    }
-
-    ret = m_jpegThumb->create();
-    if (ret) {
-        JPEG_ERROR_ALOG("ERR(%s):Fail create\n", __func__);
-        return ret;
-    }
-
-        ret = m_jpegThumb->setCache(JPEG_CACHE_ON);
-    if (ret) {
-        JPEG_ERROR_ALOG("ERR(%s):Fail cache set\n", __func__);
-        return ret;
-    }
-
-    void *pConfig = m_jpegMain->getJpegConfig();
-    if (pConfig == NULL) {
-        JPEG_ERROR_ALOG("ERR(%s):Fail getJpegConfig\n", __func__);
-        return ERROR_BUFFR_IS_NULL;
-    }
-
-    ret = m_jpegThumb->setJpegConfig(pConfig);
-    if (ret) {
-        JPEG_ERROR_ALOG("ERR(%s):Fail setJpegConfig\n", __func__);
-        return ret;
-    }
-
-    ret = m_jpegThumb->setQuality(JPEG_THUMBNAIL_QUALITY);
-    if (ret) {
-        JPEG_ERROR_ALOG("ERR(%s):Fail setQuality\n", __func__);
-        return ret;
-    }
-
-    ret = m_jpegThumb->setSize(m_thumbnailW, m_thumbnailH);
-    if (ret) {
-        JPEG_ERROR_ALOG("ERR(%s):Fail setSize\n", __func__);
-        return ret;
-    }
-
-    int iThumbSize = sizeof(char)*m_thumbnailW*m_thumbnailH*4;
-#ifdef JPEG_WA_FOR_PAGEFAULT
-    iThumbSize += JPEG_WA_BUFFER_SIZE;
-#endif //JPEG_WA_FOR_PAGEFAULT
-
-    freeJpegIonMemory(m_ionJpegClient, &m_ionThumbInBuffer, &m_pThumbInputBuffer, iThumbSize);
-    freeJpegIonMemory(m_ionJpegClient, &m_ionThumbOutBuffer, &m_pThumbOutputBuffer, iThumbSize);
-
-    if (m_ionJpegClient == 0) {
-        m_ionJpegClient = ion_client_create();
-        if (m_ionJpegClient < 0) {
-            JPEG_ERROR_ALOG("[%s]src ion client create failed, value = %d\n", __func__, m_ionJpegClient);
-            m_ionJpegClient = 0;
-            return ret;
-        }
-    }
-
-    ret = allocJpegIonMemory(m_ionJpegClient, &m_ionThumbInBuffer, &m_pThumbInputBuffer, iThumbSize);
-    if (ret != ERROR_NONE) {
-        return ret;
-    }
-
-    ret = m_jpegThumb->setInBuf(&m_pThumbInputBuffer, &iThumbSize);
-    if (ret) {
-        JPEG_ERROR_ALOG("ERR(%s):Fail setInBuf\n", __func__);
-        return ret;
-    }
-
-    ret = allocJpegIonMemory(m_ionJpegClient, &m_ionThumbOutBuffer, &m_pThumbOutputBuffer, iThumbSize);
-    if (ret != ERROR_NONE) {
-        return ret;
-    }
-
-    ret = m_jpegThumb->setOutBuf((char *)m_pThumbOutputBuffer, iThumbSize);
-    if (ret) {
-        JPEG_ERROR_ALOG("ERR(%s):Fail setOutBuf\n", __func__);
-        return ret;
-    }
-
-    ret = m_jpegThumb->updateConfig();
-    if (ret) {
-        JPEG_ERROR_ALOG("update config failed\n");
-        return ret;
-    }
-
-    if (useMain) {
-
-        int iW=0, iH=0;
-        int input_sizeMain=0, input_sizeThumb=0;
-
-        ret = m_jpegMain->getSize(&iW, &iH);
-        if (ret) {
-            JPEG_ERROR_ALOG("ERR(%s):Fail setJpegConfig\n", __func__);
-            return ret;
-        }
-
-        ret = m_scaleDownYuv422(*(m_jpegMain->getInBuf(&input_sizeMain)),
-                              iW,
-                              iH,
-                              *(m_jpegThumb->getInBuf(&input_sizeThumb)),
-                              m_thumbnailW,
-                              m_thumbnailH);
-        if (ret) {
-            JPEG_ERROR_ALOG("%s::m_scaleDownYuv422(%d, %d, %d, %d) fail", __func__, iW, iH, m_thumbnailW, m_thumbnailH);
-            return ret;
-        }
-    }
-    else {
-        return ERROR_IMPLEMENT_NOT_YET;
-    }
-
-    int outSizeThumb;
-
-    ret = m_jpegThumb->encode();
-    if (ret) {
-        JPEG_ERROR_ALOG("encode failed\n");
-        return ret;
-    }
-
-    outSizeThumb = m_jpegThumb->getJpegSize();
-    if (outSizeThumb<=0) {
-        JPEG_ERROR_ALOG("jpeg size is too small\n");
-        return ERROR_THUMB_JPEG_SIZE_TOO_SMALL;
-    }
-
-    *size = (unsigned int)outSizeThumb;
-
-    return ERROR_NONE;
-
-}
-
-int SecJpegEncoder::allocJpegIonMemory(ion_client ionClient, ion_buffer *ionBuffer, char **buffer, int size)
-{
-    int ret = ERROR_NONE;
-
-    if (ionClient == 0) {
-        JPEG_ERROR_ALOG("[%s]ionClient is zero (%d)\n", __func__, ionClient);
-        return ERROR_BUFFR_IS_NULL;
-    }
-
-    *ionBuffer = ion_alloc(ionClient, size, 0, ION_HEAP_SYSTEM_MASK);
-    if (*ionBuffer == -1) {
-        JPEG_ERROR_ALOG("[%s]ion_alloc(%d) failed\n", __func__, size);
-        *ionBuffer = 0;
-        return ret;
-    }
-
-    *buffer = (char *)ion_map(*ionBuffer, size, 0);
-    if (*buffer == MAP_FAILED) {
-        JPEG_ERROR_ALOG("[%s]src ion map failed(%d)\n", __func__, size);
-        ion_free(*ionBuffer);
-        *ionBuffer = 0;
-        *buffer = NULL;
-        return ret;
-    }
-
-    return ret;
-}
-
-void SecJpegEncoder::freeJpegIonMemory(ion_client ionClient, ion_buffer *ionBuffer, char **buffer, int size)
-{
-    if (ionClient == 0) {
-        return;
-    }
-
-    if (*buffer != NULL) {
-        ion_unmap(*buffer, size);
-        *buffer = NULL;
-    }
-
-    if (*ionBuffer != 0) {
-        ion_free(*ionBuffer);
-        *ionBuffer = 0;
-    }
-}
-
diff --git a/exynos5/hal/libhwjpeg/SecJpegEncoderHal.cpp b/exynos5/hal/libhwjpeg/SecJpegEncoderHal.cpp
deleted file mode 100644
index 1a3deca..0000000
--- a/exynos5/hal/libhwjpeg/SecJpegEncoderHal.cpp
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- * Copyright Samsung Electronics Co.,LTD.
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <string.h>
-#include <errno.h>
-#include <signal.h>
-#include <math.h>
-#include <sys/poll.h>
-
-#include <cutils/log.h>
-
-#include <utils/Log.h>
-
-#include "SecJpegCodecHal.h"
-
-#define JPEG_ERROR_LOG(fmt,...)
-
-#define NUM_PLANES (1)
-#define NUM_BUFFERS (1)
-
-SecJpegEncoderHal::SecJpegEncoderHal()
-{
-    t_iJpegFd = -1;
-    t_bFlagCreate = false;
-}
-
-SecJpegEncoderHal::~SecJpegEncoderHal()
-{
-    if (t_bFlagCreate == true) {
-        this->destroy();
-    }
-}
-
-int SecJpegEncoderHal::create(void)
-{
-    if (t_bFlagCreate == true) {
-        return ERROR_JPEG_DEVICE_ALREADY_CREATE;
-    }
-
-    int iRet = ERROR_NONE;
-
-    t_iJpegFd = open(JPEG_ENC_NODE, O_RDWR, 0);
-
-    if (t_iJpegFd < 0) {
-        t_iJpegFd = -1;
-        JPEG_ERROR_LOG("[%s]: JPEG_ENC_NODE open failed", __func__);
-        return ERROR_CANNOT_OPEN_JPEG_DEVICE;
-    }
-
-    if (t_iJpegFd <= 0) {
-        t_iJpegFd = -1;
-        JPEG_ERROR_LOG("ERR(%s):JPEG device was closed\n", __func__);
-        return ERROR_JPEG_DEVICE_ALREADY_CLOSED;
-    }
-
-    iRet = t_v4l2Querycap(t_iJpegFd);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s]: QUERYCAP failed", __func__);
-        close(t_iJpegFd);
-        return ERROR_CANNOT_OPEN_JPEG_DEVICE;
-    }
-
-    memset(&t_stJpegConfig, 0, sizeof(struct CONFIG));
-    memset(&t_stJpegInbuf, 0, sizeof(struct BUFFER));
-    memset(&t_stJpegOutbuf, 0, sizeof(struct BUFFER));
-
-    t_stJpegConfig.mode = MODE_ENCODE;
-
-    t_bFlagCreate = true;
-    t_bFlagCreateInBuf = false;
-    t_bFlagCreateOutBuf = false;
-    t_bFlagExcute = false;
-
-    t_iPlaneNum = 0;
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoderHal::destroy(void)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_ALREADY_DESTROY;
-    }
-
-    if (t_iJpegFd > 0) {
-        struct BUF_INFO stBufInfo;
-        int iRet = ERROR_NONE;
-
-        if (t_bFlagExcute) {
-            iRet = t_v4l2StreamOff(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
-        }
-
-        if (t_bFlagExcute) {
-            stBufInfo.numOfPlanes = t_iPlaneNum;
-            stBufInfo.memory = V4L2_MEMORY_MMAP;
-
-            stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-            iRet = t_v4l2Reqbufs(t_iJpegFd, 0, &stBufInfo);
-
-            stBufInfo.numOfPlanes = NUM_PLANES;
-            stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-            iRet = t_v4l2Reqbufs(t_iJpegFd, 0, &stBufInfo);
-        }
-
-        iRet = close(t_iJpegFd);
-    }
-
-    t_iJpegFd = -1;
-    t_bFlagCreate = false;
-    return ERROR_NONE;
-}
-
-int SecJpegEncoderHal::setSize(int iW, int iH)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (iW < 0 || MAX_JPG_WIDTH < iW) {
-        return ERROR_INVALID_IMAGE_SIZE;
-    }
-
-    if (iH < 0 || MAX_JPG_HEIGHT < iH) {
-        return ERROR_INVALID_IMAGE_SIZE;
-    }
-
-    t_stJpegConfig.width = iW;
-    t_stJpegConfig.height = iH;
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoderHal::setJpegConfig(void *pConfig)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (pConfig == NULL) {
-        return ERROR_JPEG_CONFIG_POINTER_NULL;
-    }
-
-    memcpy(&t_stJpegConfig, pConfig, sizeof(struct CONFIG));
-
-    if (t_stJpegConfig.pix.enc_fmt.in_fmt == V4L2_PIX_FMT_NV12) {
-        t_iPlaneNum = 2;
-    } else {
-        t_iPlaneNum = 1;
-    }
-
-    return ERROR_NONE;
-}
-
-void *SecJpegEncoderHal::getJpegConfig(void)
-{
-    if (t_bFlagCreate == false) {
-        return NULL;
-    }
-
-    return &t_stJpegConfig;
-}
-
-char **SecJpegEncoderHal::getInBuf(int *piInputSize)
-{
-    if (t_bFlagCreate == false) {
-        return NULL;
-    }
-
-     if (t_bFlagCreateInBuf == false) {
-
-        *piInputSize = 0;
-        return NULL;
-    }
-
-    for (int i=0;i<t_iPlaneNum;i++) {
-        piInputSize[i] = t_stJpegInbuf.size[i];
-    }
-
-    return t_stJpegInbuf.addr;
-}
-
-char *SecJpegEncoderHal::getOutBuf(int *piOutputSize)
-{
-    if (t_bFlagCreate == false) {
-        return NULL;
-    }
-
-    if (t_bFlagCreateOutBuf == false) {
-
-        *piOutputSize = 0;
-        return NULL;
-    }
-
-    *piOutputSize = t_stJpegOutbuf.size[0];
-
-    return (char *)(t_stJpegOutbuf.addr[0]);
-}
-
-int SecJpegEncoderHal::setInBuf(char **pcBuf, int *iSize)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (pcBuf == NULL) {
-        return ERROR_BUFFR_IS_NULL;
-    }
-
-    if (iSize<=0) {
-        return ERROR_BUFFER_TOO_SMALL;
-    }
-
-    for(int i=0;i<t_iPlaneNum;i++) {
-        t_stJpegInbuf.addr[i] = pcBuf[i];
-        t_stJpegInbuf.size[i] = iSize[i];
-    }
-
-    t_stJpegInbuf.numOfPlanes = t_iPlaneNum;
-
-    t_bFlagCreateInBuf = true;
-
-    return ERROR_NONE;
-}
-
-int  SecJpegEncoderHal::setOutBuf(char *pcBuf, int iSize)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (pcBuf == NULL) {
-        return ERROR_BUFFR_IS_NULL;
-    }
-
-    if (iSize<=0) {
-        return ERROR_BUFFER_TOO_SMALL;
-    }
-
-    t_stJpegOutbuf.addr[0] = pcBuf;
-    t_stJpegOutbuf.size[0] = iSize;
-    t_stJpegOutbuf.numOfPlanes = NUM_PLANES;
-
-    t_bFlagCreateOutBuf = true;
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoderHal::setCache(int iValue)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (t_v4l2SetCtrl(t_iJpegFd, V4L2_CID_CACHEABLE, iValue)<0) {
-        JPEG_ERROR_LOG("%s::cache setting failed\n", __func__);
-        return ERROR_CANNOT_CHANGE_CACHE_SETTING;
-    }
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoderHal::getSize(int *piW, int *piH)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (t_stJpegConfig.width == 0 && t_stJpegConfig.height == 0) {
-        return ERROR_SIZE_NOT_SET_YET;
-    }
-
-    *piW = t_stJpegConfig.width;
-    *piH = t_stJpegConfig.height;
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoderHal::setColorFormat(int iV4l2ColorFormat)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    switch(iV4l2ColorFormat) {
-    case V4L2_PIX_FMT_YUYV:
-    case V4L2_PIX_FMT_RGB565X:
-    case V4L2_PIX_FMT_BGR32:
-    case V4L2_PIX_FMT_RGB32:
-        t_stJpegConfig.pix.enc_fmt.in_fmt = iV4l2ColorFormat;
-        break;
-    default:
-        t_iPlaneNum = 0;
-        return ERROR_INVALID_COLOR_FORMAT;
-        break;
-    }
-
-    if (iV4l2ColorFormat == V4L2_PIX_FMT_NV12) {
-        t_iPlaneNum = 2;
-    } else {
-        t_iPlaneNum = 1;
-    }
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoderHal::setJpegFormat(int iV4l2JpegFormat)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    switch(iV4l2JpegFormat) {
-    case V4L2_PIX_FMT_JPEG_444:
-    case V4L2_PIX_FMT_JPEG_422:
-    case V4L2_PIX_FMT_JPEG_420:
-    case V4L2_PIX_FMT_JPEG_GRAY:
-        t_stJpegConfig.pix.enc_fmt.out_fmt = iV4l2JpegFormat;
-        break;
-    default:
-        return ERROR_INVALID_JPEG_FORMAT;
-        break;
-    }
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoderHal::updateConfig(void)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    int iRet = ERROR_NONE;
-
-    iRet = t_v4l2SetJpegcomp(t_iJpegFd, t_stJpegConfig.enc_qual);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s,%d]: S_JPEGCOMP failed", __func__,iRet);
-        return ERROR_INVALID_JPEG_CONFIG;
-    }
-
-    t_stJpegConfig.numOfPlanes = t_iPlaneNum;
-
-    t_stJpegConfig.mode = MODE_ENCODE;
-
-    iRet = t_v4l2SetFmt(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, &t_stJpegConfig);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s,%d]: jpeg input S_FMT failed", __func__,iRet);
-        return ERROR_INVALID_JPEG_CONFIG;
-    }
-
-    struct BUF_INFO stBufInfo;
-
-    stBufInfo.numOfPlanes = t_iPlaneNum;
-    stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-    stBufInfo.memory = V4L2_MEMORY_USERPTR;
-
-    iRet = t_v4l2Reqbufs(t_iJpegFd, NUM_BUFFERS, &stBufInfo);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: Input REQBUFS failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-
-    t_stJpegConfig.numOfPlanes = NUM_PLANES;
-    iRet = t_v4l2SetFmt(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, &t_stJpegConfig);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s,%d]: jpeg output S_FMT failed", __func__,iRet);
-        return ERROR_INVALID_JPEG_CONFIG;
-    }
-
-    stBufInfo.numOfPlanes = NUM_PLANES;
-    stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-
-    iRet = t_v4l2Reqbufs(t_iJpegFd, NUM_BUFFERS, &stBufInfo);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: Output REQBUFS failed", __func__, iRet);
-        return ERROR_REQBUF_FAIL;
-    }
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoderHal::setQuality(int iV4l2Quality)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    if (iV4l2Quality >= 90)
-        t_stJpegConfig.enc_qual = QUALITY_LEVEL_1;
-    else if (iV4l2Quality >= 80)
-        t_stJpegConfig.enc_qual = QUALITY_LEVEL_2;
-    else if (iV4l2Quality >= 70)
-        t_stJpegConfig.enc_qual = QUALITY_LEVEL_3;
-    else
-        t_stJpegConfig.enc_qual = QUALITY_LEVEL_4;
-
-    return ERROR_NONE;
-}
-
-int SecJpegEncoderHal::getJpegSize(void)
-{
-    if (t_bFlagCreate == false) {
-        return 0;
-    }
-
-    int iSize = t_v4l2GetCtrl(t_iJpegFd, V4L2_CID_CAM_JPEG_ENCODEDSIZE);
-
-    if (iSize < 0) {
-        JPEG_ERROR_LOG("%s::Fail to JPEG output buffer!!\n", __func__);
-        return 0;
-    }
-
-    return iSize;
-}
-
-int SecJpegEncoderHal::encode(void)
-{
-    if (t_bFlagCreate == false) {
-        return ERROR_JPEG_DEVICE_NOT_CREATE_YET;
-    }
-
-    struct BUF_INFO stBufInfo;
-    int iRet = ERROR_NONE;
-
-    t_bFlagExcute = true;
-
-    stBufInfo.numOfPlanes = t_iPlaneNum;
-    stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
-
-    stBufInfo.memory = V4L2_MEMORY_USERPTR;
-
-    iRet = t_v4l2Qbuf(t_iJpegFd, &stBufInfo, &t_stJpegInbuf);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: Input QBUF failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-
-    stBufInfo.numOfPlanes = NUM_PLANES;
-    stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
-
-    iRet = t_v4l2Qbuf(t_iJpegFd, &stBufInfo, &t_stJpegOutbuf);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: Output QBUF failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-
-    stBufInfo.numOfPlanes = t_iPlaneNum;
-    iRet = t_v4l2StreamOn(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: input stream on failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-    stBufInfo.numOfPlanes = NUM_PLANES;
-    iRet = t_v4l2StreamOn(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: output stream on failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-
-    stBufInfo.numOfPlanes = t_iPlaneNum;
-    iRet = t_v4l2Dqbuf(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_MMAP);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: Intput DQBUF failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-    stBufInfo.numOfPlanes = NUM_PLANES;
-    iRet = t_v4l2Dqbuf(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP);
-    if (iRet < 0) {
-        JPEG_ERROR_LOG("[%s:%d]: Output DQBUF failed", __func__, iRet);
-        return ERROR_EXCUTE_FAIL;
-    }
-    return ERROR_NONE;
-}
-
