exynos_gscaler.c revision e76fa9446516eb7526f66d760c7a77b8dad56739
170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang/*
270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Copyright (C) 2008 The Android Open Source Project
370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Copyright@ Samsung Electronics Co. LTD
470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *
570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Licensed under the Apache License, Version 2.0 (the "License");
670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * you may not use this file except in compliance with the License.
770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * You may obtain a copy of the License at
870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *
970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *      http://www.apache.org/licenses/LICENSE-2.0
1070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *
1170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Unless required by applicable law or agreed to in writing, software
1270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * distributed under the License is distributed on an "AS IS" BASIS,
1370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * See the License for the specific language governing permissions and
1570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * limitations under the License.
1670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang */
1770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang/*!
1970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * \file      exynos_gscaler.c
2070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * \brief     header file for Gscaler HAL
2170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * \author    ShinWon Lee (shinwon.lee@samsung.com)
2270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * \date      2012/01/09
2370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *
2470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * <b>Revision History: </b>
2570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * - 2012.01.09 : ShinWon Lee(shinwon.lee@samsung.com) \n
2670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *   Create
2770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *
2870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * - 2012.02.07 : ShinWon Lee(shinwon.lee@samsung.com) \n
2970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *   Change file name to exynos_gscaler.h
3070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *
3170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * - 2012.02.09 : Sangwoo, Parkk(sw5771.park@samsung.com) \n
3270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *   Use Multiple Gscaler by Multiple Process
3370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *
3470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * - 2012.02.20 : Sangwoo, Park(sw5771.park@samsung.com) \n
3570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *   Add exynos_gsc_set_rotation() API
3670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *
3770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * - 2012.02.20 : ShinWon Lee(shinwon.lee@samsung.com) \n
3870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *   Add size constrain
3970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *
4070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang */
4170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
4270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang//#define LOG_NDEBUG 0
4370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include "exynos_gsc_utils.h"
4470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
4570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic unsigned int m_gsc_get_plane_count(
4670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int v4l_pixel_format)
4770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
4870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int plane_count = 0;
4970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
5070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (v4l_pixel_format) {
5170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB32:
5270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_BGR32:
5370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB24:
5470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB565:
5570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB555X:
5670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB444:
5770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YUYV:
5870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_UYVY:
5923dac69caf127d309df8157099f7a8a21102c830Sungjoong Kang    case V4L2_PIX_FMT_NV16:
6023dac69caf127d309df8157099f7a8a21102c830Sungjoong Kang    case V4L2_PIX_FMT_NV61:
6170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_count = 1;
6270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
6370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV12M:
6470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV12MT_16X16:
652607aa30bcae2244e1bc68cbc0a0fc5a2b4ef570Yongbae Song    case V4L2_PIX_FMT_NV12:
6670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV21:
6766e91991f45bf7c56f4993a2c5c2356421017368Sungjoong Kang    case V4L2_PIX_FMT_NV21M:
6870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_count = 2;
6970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
7070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YVU420M:
7170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YUV422P:
724006f615bd7b5ad1f11120ad3172b5b4981e37b9Yongbae Song    case V4L2_PIX_FMT_YUV420M:
7370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_count = 3;
7470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
7570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
766134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::unmatched v4l_pixel_format color_space(0x%x)\n",
7770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang             __func__, v4l_pixel_format);
7870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_count = -1;
7970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
8070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
8170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
8270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return plane_count;
8370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
8470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
8570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic unsigned int m_gsc_get_plane_size(
8670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int *plane_size,
8770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int  width,
8870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int  height,
8970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int           v4l_pixel_format)
9070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
9170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (v4l_pixel_format) {
9270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* 1 plane */
9370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB32:
9470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_BGR32:
9570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[0] = width * height * 4;
9670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[1] = 0;
9770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = 0;
9870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
9970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB24:
10070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[0] = width * height * 3;
10170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[1] = 0;
10270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = 0;
10370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
10470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB565:
10570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB555X:
10670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB444:
10770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YUYV:
10870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_UYVY:
10970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[0] = width * height * 2;
11070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[1] = 0;
11170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = 0;
11270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
11370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* 2 planes */
11470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV12M:
1152607aa30bcae2244e1bc68cbc0a0fc5a2b4ef570Yongbae Song    case V4L2_PIX_FMT_NV12:
11670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV21:
11766e91991f45bf7c56f4993a2c5c2356421017368Sungjoong Kang    case V4L2_PIX_FMT_NV21M:
118e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        plane_size[0] = width * height;
119e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        plane_size[1] = width * (height / 2);
120e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        plane_size[2] = 0;
121e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        break;
12270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV16:
12370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV61:
12435b3cc218cb21f5d003e39cf15bb4c5bb01fe114Jiyoung Shin        plane_size[0] = width * height * 2;
12535b3cc218cb21f5d003e39cf15bb4c5bb01fe114Jiyoung Shin        plane_size[1] = 0;
12670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = 0;
12770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
12870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV12MT_16X16:
12970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[0] = ALIGN(width, 16) * ALIGN(height, 16);
13070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[1] = ALIGN(width, 16) * ALIGN(height / 2, 8);
13170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = 0;
13270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
13370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* 3 planes */
13470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YVU420M:
13570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YUV422P:
13670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[0] = width * height;
13770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[1] = (width / 2) * (height / 2);
13870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = (width / 2) * (height / 2);
13970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
14070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
1416134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::unmatched v4l_pixel_format color_space(0x%x)\n",
14270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang             __func__, v4l_pixel_format);
14370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
14470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
14570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
14670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
14770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
14870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
14970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
150e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavinstatic int m_exynos_gsc_multiple_of_n(
151e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    int number, int N)
152e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin{
153e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    int result = number;
154e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    switch (N) {
155e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 1:
156e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 2:
157e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 4:
158e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 8:
159e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 16:
160e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 32:
161e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 64:
162e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 128:
163e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 256:
164e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        result = (number - (number & (N-1)));
165e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
166e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    default:
167e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        result = number - (number % N);
168e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
169e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
170e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    return result;
171e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin}
172e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
173e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavinstatic bool m_exynos_gsc_check_src_size(
174e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *w,      unsigned int *h,
175e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *crop_x, unsigned int *crop_y,
176e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *crop_w, unsigned int *crop_h,
177e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    int v4l2_colorformat)
178e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin{
179e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (*w < GSC_MIN_W_SIZE || *h < GSC_MIN_H_SIZE) {
180e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)",
181e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            __func__, GSC_MIN_W_SIZE, *w, GSC_MIN_H_SIZE, *h);
182e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        return false;
183e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
184e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
185e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (*crop_w < GSC_MIN_W_SIZE || *crop_h < GSC_MIN_H_SIZE) {
186e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)",
187e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            __func__, GSC_MIN_W_SIZE,* crop_w, GSC_MIN_H_SIZE, *crop_h);
188e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        return false;
189e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
190e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
191e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    switch (v4l2_colorformat) {
192e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // YUV420
193e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUV420M:
194e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YVU420M:
195e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV12M:
196e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV12MT:
197e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV21:
198e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV21M:
199e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *w = (*w + 15) & ~15;
200e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *h = (*h + 15) & ~15;
201e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        //*w      = m_exynos_gsc_multiple_of_n(*w, 16);
202e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        //*h      = m_exynos_gsc_multiple_of_n(*h, 16);
203e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_w = m_exynos_gsc_multiple_of_n(*crop_w, 4);
204e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_h = m_exynos_gsc_multiple_of_n(*crop_h, 4);
205e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
206e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // YUV422
207e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUYV:
208e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUV422P:
209e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_UYVY:
210e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV16:
211e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YVYU:
212e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_VYUY:
213e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *h = (*h + 7) & ~7;
214e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        //*h      = m_exynos_gsc_multiple_of_n(*h, 8);
215e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_w = m_exynos_gsc_multiple_of_n(*crop_w, 4);
216e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_h = m_exynos_gsc_multiple_of_n(*crop_h, 2);
217e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
218e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // RGB
219e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB32:
220e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB24:
221e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB565:
222e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_BGR32:
223e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB555X:
224e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB444:
225e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    default:
226e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *h = (*h + 7) & ~7;
227e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        //*h      = m_exynos_gsc_multiple_of_n(*h, 8);
228e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_w = m_exynos_gsc_multiple_of_n(*crop_w, 2);
229e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_h = m_exynos_gsc_multiple_of_n(*crop_h, 2);
230e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
231e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
232e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
233e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    return true;
234e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin}
235e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
236e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavinstatic bool m_exynos_gsc_check_dst_size(
237e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *w,      unsigned int *h,
238e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *crop_x, unsigned int *crop_y,
239e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *crop_w, unsigned int *crop_h,
240e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    int v4l2_colorformat,
241e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    int rotation)
242e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin{
243e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *new_w;
244e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *new_h;
245e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *new_crop_w;
246e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *new_crop_h;
247e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
248e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        new_w = w;
249e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        new_h = h;
250e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        new_crop_w = crop_w;
251e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        new_crop_h = crop_h;
252e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
253e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (*w < GSC_MIN_W_SIZE || *h < GSC_MIN_H_SIZE) {
254e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)",
255e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            __func__, GSC_MIN_W_SIZE, *w, GSC_MIN_H_SIZE, *h);
256e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        return false;
257e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
258e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
259e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (*crop_w < GSC_MIN_W_SIZE || *crop_h < GSC_MIN_H_SIZE) {
260e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)",
261e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            __func__, GSC_MIN_W_SIZE,* crop_w, GSC_MIN_H_SIZE, *crop_h);
262e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        return false;
263e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
264e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
265e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    switch (v4l2_colorformat) {
266e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // YUV420
267e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV12M:
268e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV12MT:
269e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV21:
270e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV21M:
271e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUV420M:
272e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YVU420M:
273e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *new_w = m_exynos_gsc_multiple_of_n(*new_w, 2);
274e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *new_h = m_exynos_gsc_multiple_of_n(*new_h, 2);
275e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
276e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // YUV422
277e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUYV:
278e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUV422P:
279e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_UYVY:
280e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV16:
281e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YVYU:
282e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_VYUY:
283e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *new_w = m_exynos_gsc_multiple_of_n(*new_w, 2);
284e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
285e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // RGB
286e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB32:
287e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB24:
288e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB565:
289e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_BGR32:
290e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB555X:
291e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB444:
292e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    default:
293e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
294e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
295e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
296e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    return true;
297e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin}
298e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
29970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic int m_exynos_gsc_output_create(
30070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle,
30170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int dev_num,
30270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int out_mode)
30370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
304e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    struct media_device *media0;
30570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct media_entity *gsc_sd_entity;
30670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct media_entity *gsc_vd_entity;
30770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct media_entity *sink_sd_entity;
30870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct media_link *links;
30970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char node[32];
31070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char devname[32];
31170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int cap;
31270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int         i;
31370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int         fd = 0;
314e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
315e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
316e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
31770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ((out_mode != GSC_OUT_FIMD) &&
31870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        (out_mode != GSC_OUT_TV))
31970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
32070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
32170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->out_mode = out_mode;
32270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* GSCX => FIMD_WINX : arbitrary linking is not allowed */
32370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ((out_mode == GSC_OUT_FIMD) &&
32452cf3b06437639812b555d7a552ead7882bbddfcGreg Hackmann        (dev_num > 2))
32570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
32670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
32770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* media0 */
32870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(node, "%s%d", PFX_NODE_MEDIADEV, 0);
32970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    media0 = exynos_media_open(node);
33070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (media0 == NULL) {
3316134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_media_open failed (node=%s)", __func__, node);
33270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
33370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
33470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
33570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* Get the sink subdev entity by name and make the node of sink subdev*/
33670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (out_mode == GSC_OUT_FIMD)
33770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sprintf(devname, PFX_FIMD_ENTITY, dev_num);
33870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    else
33970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sprintf(devname, PFX_MXR_ENTITY, 0);
34070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
341e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    sink_sd_entity = exynos_media_get_entity_by_name(media0, devname, strlen(devname));
34270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sink_sd_entity->fd = exynos_subdev_open_devname(devname, O_RDWR);
34370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ( sink_sd_entity->fd < 0) {
3446134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:: failed to open sink subdev node", __func__);
34570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto gsc_output_err;
34670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
34770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
34870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* get GSC video dev & sub dev entity by name*/
34970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(devname, PFX_GSC_VIDEODEV_ENTITY, dev_num);
35070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_vd_entity= exynos_media_get_entity_by_name(media0, devname, strlen(devname));
35170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
35270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(devname, PFX_GSC_SUBDEV_ENTITY, dev_num);
35370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_sd_entity= exynos_media_get_entity_by_name(media0, devname, strlen(devname));
35470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
35570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* gsc sub-dev open */
35670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(devname, PFX_GSC_SUBDEV_ENTITY, dev_num);
35770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_sd_entity->fd = exynos_subdev_open_devname(devname, O_RDWR);
35870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
35970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* setup link : GSC : video device --> sub device */
36070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < (int) gsc_vd_entity->num_links; i++) {
36170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        links = &gsc_vd_entity->links[i];
36270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
36370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (links == NULL ||
36470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            links->source->entity != gsc_vd_entity ||
36570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            links->sink->entity   != gsc_sd_entity) {
36670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            continue;
36770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        } else if (exynos_media_setup_link(media0,  links->source,  links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
3686134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_media_setup_link [src.entity=%d->sink.entity=%d] failed",
36970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                  __func__, links->source->entity->info.id, links->sink->entity->info.id);
37070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
37170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
37270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
37370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
37470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* setup link : GSC: sub device --> sink device */
37570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < (int) gsc_sd_entity->num_links; i++) {
37670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        links = &gsc_sd_entity->links[i];
37770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
37870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (links == NULL || links->source->entity != gsc_sd_entity ||
37970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                             links->sink->entity   != sink_sd_entity) {
38070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            continue;
38170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        } else if (exynos_media_setup_link(media0,  links->source,  links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
3826134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_media_setup_link [src.entity=%d->sink.entity=%d] failed",
38370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                  __func__, links->source->entity->info.id, links->sink->entity->info.id);
38470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
38570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
38670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
38770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
38870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* gsc video-dev open */
38970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(devname, PFX_GSC_VIDEODEV_ENTITY, dev_num);
39070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_vd_entity->fd = exynos_v4l2_open_devname(devname, O_RDWR);
39170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    cap = V4L2_CAP_STREAMING |
39270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang          V4L2_CAP_VIDEO_OUTPUT_MPLANE;
39370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
39470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_querycap(gsc_vd_entity->fd, cap) == false) {
3956134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_querycap() fail", __func__);
39670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto gsc_output_err;
39770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
39870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_sd_entity = gsc_sd_entity;
39970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_vd_entity = gsc_vd_entity;
40070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->sink_sd_entity = sink_sd_entity;
401e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle->media0 = media0;
402e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
403e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
404e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
40570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
40670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
40770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changgsc_output_err:
40870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* to do */
40970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return -1;
41070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
41170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
41270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
413e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changstatic int m_exynos_gsc_m2m_create(
41470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int dev)
41570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
41670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int          fd = 0;
41770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int          video_node_num;
41870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int cap;
41970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char         node[32];
42070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
421e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
422e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
42370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch(dev) {
42470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 0:
42570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        video_node_num = NODE_NUM_GSC_0;
42670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
42770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 1:
42870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        video_node_num = NODE_NUM_GSC_1;
42970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
43070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 2:
43170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        video_node_num = NODE_NUM_GSC_2;
43270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
43370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 3:
43470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        video_node_num = NODE_NUM_GSC_3;
43570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
43670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
4376134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::unexpected dev(%d) fail", __func__, dev);
43870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
43970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
44070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
44170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
44270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(node, "%s%d", PFX_NODE_GSC, video_node_num);
44370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fd = exynos_v4l2_open(node, O_RDWR);
44470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (fd < 0) {
4456134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_open(%s) fail", __func__, node);
44670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
44770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
44870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
44970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    cap = V4L2_CAP_STREAMING |
45070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang          V4L2_CAP_VIDEO_OUTPUT_MPLANE |
45170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang          V4L2_CAP_VIDEO_CAPTURE_MPLANE;
45270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
45370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_querycap(fd, cap) == false) {
4546134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_querycap() fail", __func__);
45570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (0 < fd)
45670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            close(fd);
45770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        fd = 0;
45870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
45970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
460e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
461e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
462e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
46370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return fd;
46470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
46570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
46670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
467e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changstatic bool m_exynos_gsc_out_destroy(struct GSC_HANDLE *gsc_handle)
46870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
46970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct media_link * links;
47070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i;
47170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
472e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
473e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
47470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle == NULL) {
4756134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::gsc_handle is NULL", __func__);
47670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
47770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
47870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
47970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->src.stream_on == true) {
48070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_gsc_out_stop((void *)gsc_handle) < 0)
4816134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_gsc_out_stop() fail", __func__);
48270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
48370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            gsc_handle->src.stream_on = false;
48470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
48570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
486e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    /* unlink : gscaler-out --> fimd */
48770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        for (i = 0; i < (int) gsc_handle->gsc_sd_entity->num_links; i++) {
48870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            links = &gsc_handle->gsc_sd_entity->links[i];
48970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
49070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if (links == NULL || links->source->entity != gsc_handle->gsc_sd_entity ||
49170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                                 links->sink->entity   != gsc_handle->sink_sd_entity) {
49270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                continue;
49370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            } else if (exynos_media_setup_link(gsc_handle->media0,  links->source,
49470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                                                                        links->sink, 0) < 0) {
4956134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                ALOGE("%s::exynos_media_setup_unlink [src.entity=%d->sink.entity=%d] failed",
49670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                      __func__, links->source->entity->info.id, links->sink->entity->info.id);
49770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
49870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
49970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
50070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        close(gsc_handle->gsc_vd_entity->fd);
50170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        close(gsc_handle->gsc_sd_entity->fd);
50270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->gsc_vd_entity->fd = -1;
50370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->gsc_vd_entity->fd = -1;
50470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
505e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        Exynos_gsc_Out();
506e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
50770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return true;
50870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
50970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
51070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
51170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool m_exynos_gsc_destroy(
51270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle)
51370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
514e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
515e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
51670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->src.stream_on == true) {
51770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_v4l2_streamoff(gsc_handle->gsc_fd, gsc_handle->src.buf_type) < 0)
5186134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_v4l2_streamoff() fail", __func__);
51970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
52070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->src.stream_on = false;
52170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
52270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
52370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->dst.stream_on == true) {
52470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_v4l2_streamoff(gsc_handle->gsc_fd, gsc_handle->dst.buf_type) < 0)
5256134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_v4l2_streamoff() fail", __func__);
52670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
52770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->dst.stream_on = false;
52870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
52970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
53070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (0 < gsc_handle->gsc_fd)
53170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        close(gsc_handle->gsc_fd);
53270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_fd = 0;
53370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
534e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
535e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
53670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return true;
53770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
53870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
53970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changbool m_exynos_gsc_find_and_trylock_and_create(
54070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle)
54170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
54270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int          i                 = 0;
54370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    bool         flag_find_new_gsc = false;
54470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int total_sleep_time  = 0;
54570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
546e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
547e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
54870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    do {
54970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        for (i = 0; i < NUM_OF_GSC_HW; i++) {
55070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            // HACK : HWComposer, HDMI uses gscaler with their own code.
55170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            //        So, This obj_mutex cannot defense their open()
552e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            if (i == 0 || i == 3)
55370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                continue;
55470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
55570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if (exynos_mutex_trylock(gsc_handle->obj_mutex[i]) == true) {
55670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
55770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                // destroy old one.
55870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                m_exynos_gsc_destroy(gsc_handle);
55970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
56070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                // create new one.
561e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                gsc_handle->gsc_fd = m_exynos_gsc_m2m_create(i);
56270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                if (gsc_handle->gsc_fd < 0) {
56370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                    gsc_handle->gsc_fd = 0;
56470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                    exynos_mutex_unlock(gsc_handle->obj_mutex[i]);
56570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                    continue;
56670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                }
56770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
56870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                if (gsc_handle->cur_obj_mutex)
56970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                    exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
57070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
57170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                gsc_handle->cur_obj_mutex = gsc_handle->obj_mutex[i];
57270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
57370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                flag_find_new_gsc = true;
57470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                break;
57570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
57670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
57770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
57870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        // waiting for another process doesn't use gscaler.
57970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        // we need to make decision how to do.
58070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (flag_find_new_gsc == false) {
58170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            usleep(GSC_WAITING_TIME_FOR_TRYLOCK);
58270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            total_sleep_time += GSC_WAITING_TIME_FOR_TRYLOCK;
5836134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGV("%s::waiting for anthere process doens't use gscaler", __func__);
58470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
58570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
58670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    } while(   flag_find_new_gsc == false
58770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            && total_sleep_time < MAX_GSC_WAITING_TIME_FOR_TRYLOCK);
58870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
58970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (flag_find_new_gsc == false)
5906134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::we don't have no available gsc.. fail", __func__);
59170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
592e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
593e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
59470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return flag_find_new_gsc;
59570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
59670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
59770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool m_exynos_gsc_set_format(
59870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int              fd,
5995f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    struct gsc_info *info)
60070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
601e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
602e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
60370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_requestbuffers req_buf;
60470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int                        plane_count;
60570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
60670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    plane_count = m_gsc_get_plane_count(info->v4l2_colorformat);
60770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (plane_count < 0) {
6086134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::not supported v4l2_colorformat", __func__);
60970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
61070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
61170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
61270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (info->stream_on == true) {
61370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_v4l2_streamoff(fd, info->buf_type) < 0) {
6146134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_v4l2_streamoff() fail", __func__);
61570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return false;
61670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
61770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        info->stream_on = false;
61870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
61970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
62070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_ctrl(fd, V4L2_CID_ROTATE, info->rotation) < 0) {
6216134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_ROTATE) fail", __func__);
62270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
62370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
62470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
62570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_ctrl(fd, V4L2_CID_VFLIP, info->flip_horizontal) < 0) {
6266134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_VFLIP) fail", __func__);
62770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
62870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
62970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
63070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_ctrl(fd, V4L2_CID_HFLIP, info->flip_vertical) < 0) {
6316134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_HFLIP) fail", __func__);
63270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
63370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
634e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    info->format.type = info->buf_type;
63570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->format.fmt.pix_mp.width       = info->width;
63670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->format.fmt.pix_mp.height      = info->height;
63770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->format.fmt.pix_mp.pixelformat = info->v4l2_colorformat;
63870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->format.fmt.pix_mp.field       = V4L2_FIELD_ANY;
63970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->format.fmt.pix_mp.num_planes  = plane_count;
64070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
64170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_fmt(fd, &info->format) < 0) {
6426134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_fmt() fail", __func__);
64370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
64470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
64570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
64670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->crop.type     = info->buf_type;
64770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->crop.c.left   = info->crop_left;
64870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->crop.c.top    = info->crop_top;
64970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->crop.c.width  = info->crop_width;
65070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->crop.c.height = info->crop_height;
65170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
65270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_crop(fd, &info->crop) < 0) {
6536134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_crop() fail", __func__);
65470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
65570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
65670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
65770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_ctrl(fd, V4L2_CID_CACHEABLE, info->cacheable) < 0) {
6586134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_ctrl() fail", __func__);
65970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
66070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
66170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
6620db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim    if (exynos_v4l2_s_ctrl(fd, V4L2_CID_CONTENT_PROTECTION, info->mode_drm) < 0) {
6630db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim        ALOGE("%s::exynos_v4l2_s_ctrl() fail", __func__);
6640db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim        return false;
6650db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim    }
6660db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim
66770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    req_buf.count  = 1;
66870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    req_buf.type   = info->buf_type;
669776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    req_buf.memory = V4L2_MEMORY_DMABUF;
67070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_reqbufs(fd, &req_buf) < 0) {
6716134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_reqbufs() fail", __func__);
67270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
67370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
67470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
675e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
676e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
67770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return true;
67870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
67970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
68070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool m_exynos_gsc_set_addr(
68170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int              fd,
68270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct gsc_info *info)
68370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
68470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int i;
68570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int plane_size[NUM_OF_GSC_PLANES];
68670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
68770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    m_gsc_get_plane_size(plane_size,
68870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                         info->width,
68970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                         info->height,
69070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                         info->v4l2_colorformat);
69170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
69270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->buffer.index    = 0;
69370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->buffer.type     = info->buf_type;
694776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    info->buffer.memory   = V4L2_MEMORY_DMABUF;
69570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->buffer.m.planes = info->planes;
69670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->buffer.length   = info->format.fmt.pix_mp.num_planes;
69770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
69870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < info->format.fmt.pix_mp.num_planes; i++) {
699776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby        info->buffer.m.planes[i].m.fd = (int)info->addr[i];
70070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        info->buffer.m.planes[i].length    = plane_size[i];
70170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        info->buffer.m.planes[i].bytesused = 0;
70270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
70370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
70470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_qbuf(fd, &info->buffer) < 0) {
7056134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_qbuf() fail", __func__);
70670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
70770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
70870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
70970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return true;
71070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
71170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
71270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid *exynos_gsc_create(
71370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void)
71470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
71570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i     = 0;
71670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int op_id = 0;
71770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char mutex_name[32];
71870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
719e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
720e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
72170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)malloc(sizeof(struct GSC_HANDLE));
72270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle == NULL) {
7236134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::malloc(struct GSC_HANDLE) fail", __func__);
72470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
72570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
72670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
72770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_fd = 0;
72870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    memset(&gsc_handle->src, 0, sizeof(struct gsc_info));
72970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    memset(&gsc_handle->dst, 0, sizeof(struct gsc_info));
73070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
73170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
73270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
73370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
73470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->op_mutex = NULL;
73570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < NUM_OF_GSC_HW; i++)
73670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->obj_mutex[i] = NULL;
73770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
73870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->cur_obj_mutex = NULL;
73970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_local_path = false;
74070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_exclusive_open = false;
74170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
74270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    srand(time(NULL));
74370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    op_id = rand() % 1000000; // just make random id
74470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(mutex_name, "%sOp%d", LOG_TAG, op_id);
74570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->op_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_PRIVATE, mutex_name);
74670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->op_mutex == NULL) {
7476134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name);
74870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
74970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
75070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
75170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
75270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
75370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    // check if it is available
75470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < NUM_OF_GSC_HW; i++) {
75570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sprintf(mutex_name, "%sObject%d", LOG_TAG, i);
75670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
75770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->obj_mutex[i] = exynos_mutex_create(EXYNOS_MUTEX_TYPE_SHARED, mutex_name);
75870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->obj_mutex[i] == NULL) {
7596134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name);
76070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            goto err;
76170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
76270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
76370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
76470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (m_exynos_gsc_find_and_trylock_and_create(gsc_handle) == false) {
7656134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::m_exynos_gsc_find_and_trylock_and_create() fail", __func__);
76670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
76770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
76870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
76970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
77070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
77170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
77270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return (void *)gsc_handle;
77370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
77470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changerr:
77570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle) {
77670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        m_exynos_gsc_destroy(gsc_handle);
77770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
77870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->cur_obj_mutex)
77970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
78070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
78170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        for (i = 0; i < NUM_OF_GSC_HW; i++) {
78270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if ((gsc_handle->obj_mutex[i] != NULL) &&
783e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                (exynos_mutex_get_created_status(gsc_handle->obj_mutex[i]) == true)) {
78470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                if (exynos_mutex_destroy(gsc_handle->obj_mutex[i]) == false)
7856134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                    ALOGE("%s::exynos_mutex_destroy() fail", __func__);
78670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
78770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
78870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
78970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->op_mutex)
79070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            exynos_mutex_unlock(gsc_handle->op_mutex);
79170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
79270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_mutex_destroy(gsc_handle->op_mutex) == false)
7936134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_mutex_destroy(op_mutex) fail", __func__);
79470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
79570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        free(gsc_handle);
79670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
79770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
798e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
799e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
80070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return NULL;
80170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
80270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
80370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid *exynos_gsc_reserve(int dev_num)
80470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
80570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char mutex_name[32];
80670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int total_sleep_time  = 0;
80770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    bool    gsc_flag = false;
80870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
80970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ((dev_num < 0) || (dev_num >= NUM_OF_GSC_HW)) {
8106134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::fail:: dev_num is not valid(%d) ", __func__, dev_num);
81170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return NULL;
81270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
81370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
81470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)malloc(sizeof(struct GSC_HANDLE));
81570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle == NULL) {
8166134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::malloc(struct GSC_HANDLE) fail", __func__);
81770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
81870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
81970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
82070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_fd = -1;
82170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->op_mutex = NULL;
82270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->cur_obj_mutex = NULL;
82370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
82470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(mutex_name, "%sObject%d", LOG_TAG, dev_num);
82570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->cur_obj_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_SHARED, mutex_name);
82670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->cur_obj_mutex == NULL) {
8276134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name);
82870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
82970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
83070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
83170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    do {
83270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_mutex_trylock(gsc_handle->cur_obj_mutex) == true) {
83370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            gsc_flag = true;
83470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
83570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
83670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        usleep(GSC_WAITING_TIME_FOR_TRYLOCK);
83770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        total_sleep_time += GSC_WAITING_TIME_FOR_TRYLOCK;
8386134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGV("%s::waiting for another process to release the requested gscaler", __func__);
83970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    } while(total_sleep_time < MAX_GSC_WAITING_TIME_FOR_TRYLOCK);
84070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
84170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_flag == true)
84270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang         return (void *)gsc_handle;
84370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
84470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changerr:
84570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle) {
84670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        free(gsc_handle);
84770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
84870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
84970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return NULL;
85070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
85170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
85270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid exynos_gsc_release(void *handle)
85370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
85470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)handle;
85570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
85670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
8576134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
85870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return;
85970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
86070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
86170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
86270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_destroy(gsc_handle->cur_obj_mutex);
86370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    free(gsc_handle);
86470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return;
86570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
86670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
86770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid *exynos_gsc_create_exclusive(
86870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int dev_num,
86970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int mode,
87070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int out_mode)
87170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
87270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i     = 0;
87370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int op_id = 0;
87470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char mutex_name[32];
87570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int total_sleep_time  = 0;
87670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    bool    gsc_flag = false;
87770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret = 0;
878e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
879e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
880e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
88170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ((dev_num < 0) || (dev_num >= NUM_OF_GSC_HW)) {
8826134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::fail:: dev_num is not valid(%d) ", __func__, dev_num);
88370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return NULL;
88470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
88570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
88670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ((mode < 0) || (mode >= NUM_OF_GSC_HW)) {
8876134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::fail:: mode is not valid(%d) ", __func__, mode);
88870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return NULL;
88970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
89070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
89170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)malloc(sizeof(struct GSC_HANDLE));
89270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle == NULL) {
8936134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::malloc(struct GSC_HANDLE) fail", __func__);
89470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
89570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
89670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    memset(gsc_handle, 0, sizeof(struct GSC_HANDLE));
897e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle->gsc_fd = -1;
89870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_mode = mode;
89970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
90070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
90170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
90270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
90370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->op_mutex = NULL;
90470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < NUM_OF_GSC_HW; i++)
90570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->obj_mutex[i] = NULL;
90670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
90770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->cur_obj_mutex = NULL;
90870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_local_path = false;
90970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_exclusive_open = true;
91070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
91170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    srand(time(NULL));
91270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    op_id = rand() % 1000000; // just make random id
91370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(mutex_name, "%sOp%d", LOG_TAG, op_id);
91470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->op_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_PRIVATE, mutex_name);
91570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->op_mutex == NULL) {
9166134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name);
91770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
91870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
91970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
92070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
92170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
92270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(mutex_name, "%sObject%d", LOG_TAG, dev_num);
92370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->cur_obj_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_SHARED, mutex_name);
92470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->cur_obj_mutex == NULL) {
9256134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name);
92670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
92770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
92870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
92970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    do {
93070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_mutex_trylock(gsc_handle->cur_obj_mutex) == true) {
93170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if (mode == GSC_M2M_MODE) {
932e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                gsc_handle->gsc_fd = m_exynos_gsc_m2m_create(dev_num);
933e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                if (gsc_handle->gsc_fd < 0) {
934e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                    ALOGE("%s::m_exynos_gsc_m2m_create(%i) fail", __func__, dev_num);
935e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                    goto err;
936e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                }
93770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            } else if (mode == GSC_OUTPUT_MODE) {
93870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                ret = m_exynos_gsc_output_create(gsc_handle, dev_num, out_mode);
93970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                if (ret < 0) {
9406134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                    ALOGE("%s::m_exynos_gsc_output_create(%i) fail", __func__, dev_num);
94170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                    goto err;
94270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                }
94370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
94470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            /*else
94570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                gsc_handle->gsc_fd = m_exynos_gsc_capture_create(dev_num);*/
946e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
94770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            gsc_flag = true;
94870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
94970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
95070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        usleep(GSC_WAITING_TIME_FOR_TRYLOCK);
95170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        total_sleep_time += GSC_WAITING_TIME_FOR_TRYLOCK;
9526134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGV("%s::waiting for anthere process doens't use gscaler", __func__);
95370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    } while(total_sleep_time < MAX_GSC_WAITING_TIME_FOR_TRYLOCK);
95470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
95570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
956e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (gsc_flag == true) {
957e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        Exynos_gsc_Out();
958e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        return (void *)gsc_handle;
959e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        }
96070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
96170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changerr:
96270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle) {
96370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        m_exynos_gsc_destroy(gsc_handle);
96470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
96570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->cur_obj_mutex)
96670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
96770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
96870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        for (i = 0; i < NUM_OF_GSC_HW; i++) {
96970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if ((gsc_handle->obj_mutex[i] != NULL) &&
970e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                (exynos_mutex_get_created_status(gsc_handle->obj_mutex[i]) == true)) {
97170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                if (exynos_mutex_destroy(gsc_handle->obj_mutex[i]) == false)
9726134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                    ALOGE("%s::exynos_mutex_destroy() fail", __func__);
97370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
97470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
97570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
97670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->op_mutex)
97770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            exynos_mutex_unlock(gsc_handle->op_mutex);
97870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
97970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_mutex_destroy(gsc_handle->op_mutex) == false)
9806134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_mutex_destroy(op_mutex) fail", __func__);
98170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
98270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        free(gsc_handle);
98370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
98470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
985e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
986e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
98770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return NULL;
98870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
98970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
99070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid exynos_gsc_destroy(
99170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle)
99270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
99370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i = 0;
99470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)handle;
99570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
996e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
997e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
99870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
9996134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
100070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return;
100170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
100270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
100370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
100470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
100570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->flag_exclusive_open == false)
100670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        exynos_mutex_lock(gsc_handle->cur_obj_mutex);
100770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
100870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->gsc_mode == GSC_OUTPUT_MODE)
1009e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        m_exynos_gsc_out_destroy(gsc_handle);
1010e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    else
1011e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        m_exynos_gsc_destroy(gsc_handle);
101270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
101370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
101470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
101570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < NUM_OF_GSC_HW; i++) {
101670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if ((gsc_handle->obj_mutex[i] != NULL) &&
1017e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            (exynos_mutex_get_created_status(gsc_handle->obj_mutex[i]) == true)) {
101870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if (exynos_mutex_destroy(gsc_handle->obj_mutex[i]) == false)
10196134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                ALOGE("%s::exynos_mutex_destroy(obj_mutex) fail", __func__);
102070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
102170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
102270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
102370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
102470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
102570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_mutex_destroy(gsc_handle->op_mutex) == false)
10266134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_mutex_destroy(op_mutex) fail", __func__);
102770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
102870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle)
102970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        free(gsc_handle);
1030e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1031e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1032e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
103370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
103470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
103570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_src_format(
103670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void        *handle,
103770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int width,
103870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int height,
103970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_left,
104070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_top,
104170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_width,
104270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_height,
104370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int v4l2_colorformat,
1044e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int cacheable,
1045e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int mode_drm)
104670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
1047e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1048e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
104970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
105070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
105170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
105270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
10536134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
105470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
105570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
105670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
105770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
105870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
105970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.width            = width;
106070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.height           = height;
106170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.crop_left        = crop_left;
106270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.crop_top         = crop_top;
106370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.crop_width       = crop_width;
106470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.crop_height      = crop_height;
106570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.v4l2_colorformat = v4l2_colorformat;
106670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.cacheable        = cacheable;
1067e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle->src.mode_drm         = mode_drm;
106870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
106970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
107070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
107170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1072e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1073e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
107470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
107570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
107670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
107770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_dst_format(
107870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void        *handle,
107970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int width,
108070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int height,
108170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_left,
108270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_top,
108370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_width,
108470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_height,
108570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int v4l2_colorformat,
1086e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int cacheable,
1087e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int mode_drm)
108870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
1089e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1090e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
109170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
109270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
109370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
109470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
10956134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
109670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
109770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
109870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
109970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
110070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
110170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.width            = width;
110270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.height           = height;
110370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.crop_left        = crop_left;
110470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.crop_top         = crop_top;
110570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.crop_width       = crop_width;
110670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.crop_height      = crop_height;
110770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.v4l2_colorformat = v4l2_colorformat;
110870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.cacheable        = cacheable;
1109e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle->dst.mode_drm         = mode_drm;
111070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
111170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
111270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1113e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1114e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    return 0;
1115e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang}
1116e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
111770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_rotation(
111870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle,
111970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int   rotation,
112070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int   flip_horizontal,
112170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int   flip_vertical)
112270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
112370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret = -1;
112470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
112570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
112670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
112770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
11286134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
112970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return ret;
113070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
113170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
113270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
113370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
113470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int new_rotation = rotation % 360;
113570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
113670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (new_rotation % 90 != 0) {
11376134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::rotation(%d) cannot be acceptable fail", __func__, rotation);
113870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto done;
113970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
114070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
114170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if(new_rotation < 0)
114270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        new_rotation = -new_rotation;
114370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
114470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.rotation        = new_rotation;
114570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.flip_horizontal = flip_horizontal;
114670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.flip_vertical   = flip_vertical;
114770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
114870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    ret = 0;
114970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changdone:
115070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
115170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
115270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
115370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
115470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
115570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_src_addr(
115670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle,
115770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *addr[3])
115870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
115970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
116070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
116170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1162e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1163e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
116470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
11656134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
116670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
116770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
116870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
116970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
117070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
117170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.addr[0] = addr[0];
117270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.addr[1] = addr[1];
117370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.addr[2] = addr[2];
117470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
117570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
117670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
117770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1178e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1179e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
118070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
118170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
118270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
118370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_dst_addr(
118470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle,
118570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *addr[3])
118670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
118770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
118870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
1189994ebe9bc7c3b1da00ab8d6c80075cce0da6e47cGreg Hackmann    int ret = 0;
119070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1191e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1192e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
119370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
11946134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
119570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
119670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
119770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
119870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
119970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
120070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.addr[0] = addr[0];
120170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.addr[1] = addr[1];
120270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.addr[2] = addr[2];
120370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
120470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
120570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
120670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1207e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1208e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1209994ebe9bc7c3b1da00ab8d6c80075cce0da6e47cGreg Hackmann    return ret;
121070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
121170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
121270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic void rotateValueHAL2GSC(unsigned int transform,
121370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int *rotate,
121470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int *hflip,
121570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int *vflip)
121670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
121770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int rotate_flag = transform & 0x7;
121870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    *rotate = 0;
121970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    *hflip = 0;
122070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    *vflip = 0;
122170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
122270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (rotate_flag) {
122370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_ROT_90:
122470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *rotate = 90;
122570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
122670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_ROT_180:
122770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *rotate = 180;
122870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
122970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_ROT_270:
123070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *rotate = 270;
123170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
123270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90:
123370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *rotate = 90;
123470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *vflip = 1; /* set vflip to compensate the rot & flip order. */
123570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
123670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90:
123770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *rotate = 90;
123870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *hflip = 1; /* set hflip to compensate the rot & flip order. */
123970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
124070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_FLIP_H:
124170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *hflip = 1;
124270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang         break;
124370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_FLIP_V:
124470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *vflip = 1;
124570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang         break;
124670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
124770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
124870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
124970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
125070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
125170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool get_plane_size(int V4L2_PIX,
125270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int * size,
125370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int frame_size,
1254e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    int src_planes)
125570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
1256e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int frame_ratio = 1;
125770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int src_bpp    = get_yuv_bpp(V4L2_PIX);
125870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
125970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_planes = (src_planes == -1) ? 1 : src_planes;
126070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    frame_ratio = 8 * (src_planes -1) / (src_bpp - 8);
126170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
126270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (src_planes) {
126370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 1:
126470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        switch (V4L2_PIX) {
126570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_BGR32:
126670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_RGB32:
126770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            size[0] = frame_size << 2;
126870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
126970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_RGB565X:
127070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_NV16:
127170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_NV61:
127270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_YUYV:
127370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_UYVY:
127470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_VYUY:
127570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_YVYU:
127670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            size[0] = frame_size << 1;
127770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
127870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_YUV420:
127970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_NV12:
128070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_NV21:
128166e91991f45bf7c56f4993a2c5c2356421017368Sungjoong Kang        case V4L2_PIX_FMT_NV21M:
128270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            size[0] = (frame_size * 3) >> 1;
128370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
128470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        default:
12856134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::invalid color type", __func__);
128670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return false;
128770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
128870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
128970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[1] = 0;
129070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[2] = 0;
129170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
129270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 2:
129370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[0] = frame_size;
129470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[1] = frame_size / frame_ratio;
129570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[2] = 0;
129670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
129770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 3:
129870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[0] = frame_size;
129970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[1] = frame_size / frame_ratio;
130070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[2] = frame_size / frame_ratio;
130170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
130270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
13036134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::invalid color foarmt", __func__);
130470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
130570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
130670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
130770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
130870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return true;
130970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
131070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1311e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changint exynos_gsc_m2m_config(void *handle,
1312e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *src_img,
1313e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *dst_img)
1314e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang{
1315e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    struct GSC_HANDLE *gsc_handle;
1316e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    int32_t      src_color_space;
1317e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    int32_t      dst_color_space;
1318e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    int ret;
1319e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int rotate;
1320e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int hflip;
1321e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int vflip;
1322e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1323e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1324e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1325e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
1326e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang     if (gsc_handle == NULL) {
1327e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ALOGE("%s::gsc_handle == NULL() fail", __func__);
1328e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        return -1;
1329e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
1330e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1331e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(src_img->format);
1332e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    dst_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(dst_img->format);
1333e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    rotateValueHAL2GSC(dst_img->rot, &rotate, &hflip, &vflip);
1334e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_set_rotation(gsc_handle, rotate, hflip, vflip);
1335e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1336e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    ret = exynos_gsc_set_src_format(gsc_handle,  src_img->fw, src_img->fh,
1337e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                                  src_img->x, src_img->y, src_img->w, src_img->h,
1338e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                                  src_color_space, src_img->cacheable, src_img->drmMode);
1339e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (ret < 0) {
1340e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ALOGE("%s: fail: exynos_gsc_set_src_format [fw %d fh %d x %d y %d w %d h %d f %x rot %d]",
1341e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            __func__, src_img->fw, src_img->fh, src_img->x, src_img->y, src_img->w, src_img->h,
1342e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            src_color_space, src_img->rot);
1343e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        return -1;
1344e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
1345e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1346e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    ret = exynos_gsc_set_dst_format(gsc_handle, dst_img->fw, dst_img->fh,
1347e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                                  dst_img->x, dst_img->y, dst_img->w, dst_img->h,
13480db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim                                  dst_color_space, dst_img->cacheable, dst_img->drmMode);
1349e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (ret < 0) {
1350e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ALOGE("%s: fail: exynos_gsc_set_dst_format [fw %d fh %d x %d y %d w %d h %d f %x rot %d]",
1351e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            __func__, dst_img->fw, dst_img->fh, dst_img->x, dst_img->y, dst_img->w, dst_img->h,
1352e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            src_color_space, dst_img->rot);
1353e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        return -1;
1354e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
1355e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1356e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1357e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1358e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    return 0;
1359e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang}
1360e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
136170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_out_config(void *handle,
1362e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *src_img,
1363e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *dst_img)
136470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
136570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
136670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_format  fmt;
136770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_crop    crop;
136870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_requestbuffers reqbuf;
136970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_subdev_format sd_fmt;
137070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_subdev_crop   sd_crop;
137170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i;
137270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int rotate;
137370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int hflip;
137470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int vflip;
137570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int plane_size[NUM_OF_GSC_PLANES];
1376cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann    bool rgb;
137770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
137870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_rect dst_rect;
137970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int32_t      src_color_space;
138070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int32_t      dst_color_space;
138170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int32_t      src_planes;
1382e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
138370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
138470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     if (gsc_handle == NULL) {
13856134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::gsc_handle == NULL() fail", __func__);
138670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
138770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
138870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1389e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1390e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
139170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     if (gsc_handle->src.stream_on != false) {
13926134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("Error: Src is already streamed on !!!!");
139370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
139470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     }
139570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1396e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    memcpy(&gsc_handle->src_img, src_img, sizeof(exynos_gsc_img));
1397e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    memcpy(&gsc_handle->dst_img, dst_img, sizeof(exynos_gsc_img));
139870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(src_img->format);
139970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    dst_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(dst_img->format);
140070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_planes = get_yuv_planes(src_color_space);
1401ba718a434c6a2ed414752043c933a4abcc821fc0Benoit Goby    src_planes = (src_planes == -1) ? 1 : src_planes;
1402ba718a434c6a2ed414752043c933a4abcc821fc0Benoit Goby    rgb = get_yuv_planes(dst_color_space) == -1;
140370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    rotateValueHAL2GSC(dst_img->rot, &rotate, &hflip, &vflip);
140470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1405e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (m_exynos_gsc_check_src_size(&gsc_handle->src_img.fw, &gsc_handle->src_img.fh,
1406e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        &gsc_handle->src_img.x, &gsc_handle->src_img.y,
1407e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        &gsc_handle->src_img.w, &gsc_handle->src_img.h,
1408e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        src_color_space) == false) {
1409e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            ALOGE("%s::m_exynos_gsc_check_src_size() fail", __func__);
1410e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            return -1;
1411e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
1412e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
1413e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (m_exynos_gsc_check_dst_size(&gsc_handle->dst_img.fw, &gsc_handle->dst_img.fh,
1414e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        &gsc_handle->dst_img.x, &gsc_handle->dst_img.y,
1415e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        &gsc_handle->dst_img.w, &gsc_handle->dst_img.h,
1416e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        dst_color_space,
1417e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        rotate) == false) {
1418e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            ALOGE("%s::m_exynos_gsc_check_dst_size() fail", __func__);
1419e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            return -1;
142070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
142170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
142270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /*set: src v4l2_buffer*/
142370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.src_buf_idx = 0;
142470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.qbuf_cnt = 0;
142570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* set format: src pad of GSC sub-dev*/
142670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_fmt.pad   = GSCALER_SUBDEV_PAD_SOURCE;
142770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1428aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    if (gsc_handle->out_mode == GSC_OUT_FIMD) {
1429aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.width  = gsc_handle->dst_img.fw;
1430aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.height = gsc_handle->dst_img.fh;
1431aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    } else {
1432aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.width  = gsc_handle->dst_img.w;
1433aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.height = gsc_handle->dst_img.h;
1434aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    }
1435cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann    sd_fmt.format.code   = rgb ? V4L2_MBUS_FMT_XRGB8888_4X8_LE :
1436cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann                                    V4L2_MBUS_FMT_YUV8_1X24;
143770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_subdev_s_fmt(gsc_handle->gsc_sd_entity->fd, &sd_fmt) < 0) {
14386134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::GSC subdev set format failed", __func__);
143970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
144070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
144170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
144270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* set crop: src crop of GSC sub-dev*/
144370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_crop.pad   = GSCALER_SUBDEV_PAD_SOURCE;
144470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1445aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    if (gsc_handle->out_mode == GSC_OUT_FIMD) {
1446aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.left   = gsc_handle->dst_img.x;
1447aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.top    = gsc_handle->dst_img.y;
1448aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.width  = gsc_handle->dst_img.w;
1449aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.height = gsc_handle->dst_img.h;
1450aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    } else {
1451aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.left   = 0;
1452aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.top    = 0;
1453aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.width  = gsc_handle->dst_img.w;
1454aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.height = gsc_handle->dst_img.h;
1455aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    }
145670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_subdev_s_crop(gsc_handle->gsc_sd_entity->fd, &sd_crop) < 0) {
14576134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::GSC subdev set crop failed", __func__);
145870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
145970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
146070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
146170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* sink pad is connected to GSC out */
146270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /*  set format: sink sub-dev */
1463aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    if (gsc_handle->out_mode == GSC_OUT_FIMD) {
146470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sd_fmt.pad   = FIMD_SUBDEV_PAD_SINK;
1465aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.width  = gsc_handle->dst_img.w;
1466aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.height = gsc_handle->dst_img.h;
1467aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    } else {
146870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sd_fmt.pad   = MIXER_V_SUBDEV_PAD_SINK;
1469aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.width  = gsc_handle->dst_img.w + gsc_handle->dst_img.x*2;
1470aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.height = gsc_handle->dst_img.h + gsc_handle->dst_img.y*2;
1471aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    }
1472e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
147370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1474cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann    sd_fmt.format.code   = rgb ? V4L2_MBUS_FMT_XRGB8888_4X8_LE :
1475cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann                                    V4L2_MBUS_FMT_YUV8_1X24;
147670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_subdev_s_fmt(gsc_handle->sink_sd_entity->fd, &sd_fmt) < 0) {
14776134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::sink:set format failed (PAD=%d)", __func__, sd_fmt.pad);
147870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
147970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
148070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
148170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /*  set crop: sink sub-dev */
148270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->out_mode == GSC_OUT_FIMD)
148370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sd_crop.pad   = FIMD_SUBDEV_PAD_SINK;
148470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    else
148570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sd_crop.pad   = MIXER_V_SUBDEV_PAD_SINK;
148670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
148770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1488aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    if (gsc_handle->out_mode == GSC_OUT_FIMD) {
1489aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.left   = gsc_handle->dst_img.x;
1490aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.top    = gsc_handle->dst_img.y;
1491aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.width  = gsc_handle->dst_img.w;
1492aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.height = gsc_handle->dst_img.h;
1493aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    } else {
1494aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.left   = 0;
1495aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.top    = 0;
1496aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.width  = gsc_handle->dst_img.w;
1497aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.height = gsc_handle->dst_img.h;
1498aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    }
149970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_subdev_s_crop(gsc_handle->sink_sd_entity->fd, &sd_crop) < 0) {
15006134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::sink: subdev set crop failed(PAD=%d)", __func__, sd_crop.pad);
150170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
150270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
150370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1504aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    if (gsc_handle->out_mode != GSC_OUT_FIMD) {
1505aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.pad   = MIXER_V_SUBDEV_PAD_SOURCE;
1506aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1507aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.width  = gsc_handle->dst_img.w + gsc_handle->dst_img.x*2;
1508aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.height = gsc_handle->dst_img.h + gsc_handle->dst_img.y*2;
1509aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.code   = V4L2_MBUS_FMT_XRGB8888_4X8_LE;
1510aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        if (exynos_subdev_s_fmt(gsc_handle->sink_sd_entity->fd, &sd_fmt) < 0) {
1511aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby            ALOGE("%s::sink:set format failed (PAD=%d)", __func__, sd_fmt.pad);
1512aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby            return -1;
1513aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        }
1514aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby
1515aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.pad   = MIXER_V_SUBDEV_PAD_SOURCE;
1516aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1517aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.left   = gsc_handle->dst_img.x;
1518aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.top    = gsc_handle->dst_img.y;
1519aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.width  = gsc_handle->dst_img.w;
1520aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.height = gsc_handle->dst_img.h;
1521aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        if (exynos_subdev_s_crop(gsc_handle->sink_sd_entity->fd, &sd_crop) < 0) {
1522aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby            ALOGE("%s::sink: subdev set crop failed(PAD=%d)", __func__, sd_crop.pad);
1523aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby            return -1;
1524aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        }
1525aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    }
1526aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby
152770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /*set GSC ctrls */
1528e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_ROTATE, rotate) < 0) {
15296134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_ROTATE: %d) failed", __func__,  rotate);
153070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
153170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
153270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1533e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_HFLIP, hflip) < 0) {
15346134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_HFLIP: %d) failed", __func__,  hflip);
153570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
153670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
153770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1538e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_VFLIP, vflip) < 0) {
15396134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_VFLIP: %d) failed", __func__,  vflip);
154070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
154170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
154270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1543e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang     if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_CACHEABLE, 1) < 0) {
15446134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_CACHEABLE: 1) failed", __func__);
154570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
154670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
154770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
15480db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim    if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd,
15490db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim        V4L2_CID_CONTENT_PROTECTION, gsc_handle->src_img.drmMode) < 0) {
15500db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CONTENT_PROTECTION) fail", __func__);
15510db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim        return -1;
15520db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim    }
15530db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim
155470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang      /* set src format  :GSC video dev*/
155570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.type  = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
155670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.fmt.pix_mp.width            = gsc_handle->src_img.fw;
155770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.fmt.pix_mp.height           = gsc_handle->src_img.fh;
155870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.fmt.pix_mp.pixelformat    = src_color_space;
155970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.fmt.pix_mp.field              = V4L2_FIELD_NONE;
156070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.fmt.pix_mp.num_planes   = src_planes;
1561e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
156270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_fmt(gsc_handle->gsc_vd_entity->fd, &fmt) < 0) {
15636134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::videodev set format failed", __func__);
156470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
156570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
156670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
156770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* set src crop info :GSC video dev*/
156870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    crop.type     = fmt.type;
156970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    crop.c.left    = gsc_handle->src_img.x;
157070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    crop.c.top     = gsc_handle->src_img.y;
157170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    crop.c.width  = gsc_handle->src_img.w;
157270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    crop.c.height = gsc_handle->src_img.h;
157370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
157470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_crop(gsc_handle->gsc_vd_entity->fd, &crop) < 0) {
15756134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::videodev set crop failed", __func__);
157670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
157770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1578e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
157970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    reqbuf.type   = fmt.type;
1580776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    reqbuf.memory = V4L2_MEMORY_DMABUF;
158170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    reqbuf.count  = MAX_BUFFERS_GSCALER_OUT;
158270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
158370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_reqbufs(gsc_handle->gsc_vd_entity->fd, &reqbuf) < 0) {
15846134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::request buffers failed", __func__);
158570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
158670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1587e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1588e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1589e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
159070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
159170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
159270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
159370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_out_run(void *handle,
159470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int yAddr,
159570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int uAddr,
159670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int vAddr)
159770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
159870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
159970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_plane  planes[NUM_OF_GSC_PLANES];
160070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_buffer buf;
160170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int32_t      src_color_space;
160270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int32_t      src_planes;
160370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int             i;
160470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int plane_size[NUM_OF_GSC_PLANES];
160570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
160670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
160770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
16086134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
160970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
161070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
161170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
161270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    memset(&buf, 0, sizeof(struct v4l2_buffer));
161370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < NUM_OF_GSC_PLANES; i++)
161470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        memset(&planes[i], 0, sizeof(struct v4l2_plane));
161570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
161670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(gsc_handle->src_img.format);
161770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_planes = get_yuv_planes(src_color_space);
161870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_planes = (src_planes == -1) ? 1 : src_planes;
161970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
162070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.type     = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1621776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    buf.memory   = V4L2_MEMORY_DMABUF;
162270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.length   = src_planes;
162370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.index    = gsc_handle->src.src_buf_idx;
162470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.m.planes = planes;
162570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
162670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.addr[0] = (void *)yAddr;
162770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.addr[1] = (void *)uAddr;
162870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.addr[2] = (void *)vAddr;
162970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
163070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (get_plane_size(src_color_space, plane_size,
163170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->src_img.fw * gsc_handle->src_img.fh, src_planes) != true) {
16326134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:get_plane_size:fail", __func__);
163370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
163470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
163570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
163670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < buf.length; i++) {
1637776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby        buf.m.planes[i].m.fd = (int)gsc_handle->src.addr[i];
163870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        buf.m.planes[i].length    = plane_size[i];
163970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        buf.m.planes[i].bytesused = plane_size[i];
164070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
164170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
164270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* Queue the buf */
164370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_qbuf(gsc_handle->gsc_vd_entity->fd, &buf) < 0) {
16446134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::queue buffer failed (index=%d)(mSrcBufNum=%d)", __func__,
164570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            gsc_handle->src.src_buf_idx, MAX_BUFFERS_GSCALER_OUT);
164670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
164770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
164870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.src_buf_idx++;
164970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.qbuf_cnt++;
165070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
165170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->src.stream_on == false) {
1652e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        /* stream on after queing the second buffer
1653e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            to do: below logic should be changed to handle the single frame videos */
1654e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang#ifndef GSC_OUT_DELAYED_STREAMON
1655e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        if (gsc_handle->src.src_buf_idx == (MAX_BUFFERS_GSCALER_OUT - 2)) {
1656e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang#else
165770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->src.src_buf_idx == (MAX_BUFFERS_GSCALER_OUT - 1)) {
1658e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang#endif
165970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if (exynos_v4l2_streamon(gsc_handle->gsc_vd_entity->fd, buf.type) < 0) {
16606134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                ALOGE("%s::stream on failed", __func__);
166170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                return -1;
166270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
166370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            gsc_handle->src.stream_on = true;
166470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
166570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->src.src_buf_idx = gsc_handle->src.src_buf_idx % MAX_BUFFERS_GSCALER_OUT;
1666e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang#ifndef GSC_OUT_DMA_BLOCKING
166770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return 0;
1668e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang#endif
166970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1670e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1671e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (gsc_handle->src.qbuf_cnt < MAX_BUFFERS_GSCALER_OUT)
1672e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        return 0;
1673e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
167470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.src_buf_idx = gsc_handle->src.src_buf_idx % MAX_BUFFERS_GSCALER_OUT;
167570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < MAX_BUFFERS_GSCALER_OUT; i++)
167670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        memset(&planes[i], 0, sizeof(struct v4l2_plane));
167770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
167870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.type     = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1679776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    buf.memory   = V4L2_MEMORY_DMABUF;
168070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.length   = src_planes;
168170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.m.planes = planes;
168270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
168370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     /* DeQueue a buf */
168470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     if (exynos_v4l2_dqbuf(gsc_handle->gsc_vd_entity->fd, &buf) < 0) {
16856134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::dequeue buffer failed (index=%d)(mSrcBufNum=%d)", __func__,
168670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            gsc_handle->src.src_buf_idx, MAX_BUFFERS_GSCALER_OUT);
168770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
168870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     }
1689e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang     return 0;
169070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
169170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
169270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_out_stop(void *handle)
169370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
169470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
169570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_requestbuffers reqbuf;
169670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_buffer buf;
169770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_plane  planes[NUM_OF_GSC_PLANES];
169870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i;
169970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1700e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1701e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
170270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
170370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
17046134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
170570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
170670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1707e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
170870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->src.stream_on == false) {
170970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        /* to handle special scenario.*/
171070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            gsc_handle->src.src_buf_idx = 0;
1711e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        gsc_handle->src.qbuf_cnt = 0;
17126134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGD("%s::GSC is already stopped", __func__);
1713e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        goto SKIP_STREAMOFF;
171470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
171570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.src_buf_idx = 0;
171670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.qbuf_cnt = 0;
1717e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle->src.stream_on = false;
171870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
171970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_streamoff(gsc_handle->gsc_vd_entity->fd,
172070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                                V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) < 0) {
17216134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::stream off failed", __func__);
172270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
172370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1724e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho ChangSKIP_STREAMOFF:
172570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* Clear Buffer */
172670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /*todo: support for other buffer type & memory */
172770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    reqbuf.type   = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1728776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    reqbuf.memory = V4L2_MEMORY_DMABUF;
172970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    reqbuf.count  = 0;
173070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
173170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_reqbufs(gsc_handle->gsc_vd_entity->fd, &reqbuf) < 0) {
17326134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::request buffers failed", __func__);
173370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
173470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1735e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1736e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1737e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
173870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
173970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
174070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
17417b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songstatic int exynos_gsc_m2m_run_core(void *handle)
174270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
174370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
17447b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
174570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
174670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1747e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1748e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
174970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
17506134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
175170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
175270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
175370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1754e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
1755e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (m_exynos_gsc_check_src_size(&gsc_handle->src.width, &gsc_handle->src.height,
1756e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    &gsc_handle->src.crop_left, &gsc_handle->src.crop_top,
1757e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    &gsc_handle->src.crop_width, &gsc_handle->src.crop_height,
1758e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    gsc_handle->src.v4l2_colorformat) == false) {
1759e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::m_exynos_gsc_check_src_size() fail", __func__);
1760e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        goto done;
1761e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
1762e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
1763e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (m_exynos_gsc_check_dst_size(&gsc_handle->dst.width, &gsc_handle->dst.height,
1764e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    &gsc_handle->dst.crop_left, &gsc_handle->dst.crop_top,
1765e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    &gsc_handle->dst.crop_width, &gsc_handle->dst.crop_height,
1766e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    gsc_handle->dst.v4l2_colorformat,
1767e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    gsc_handle->dst.rotation) == false) {
1768e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::m_exynos_gsc_check_dst_size() fail", __func__);
1769e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        goto done;
17705f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    }
177170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
17725f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    if (m_exynos_gsc_set_format(gsc_handle->gsc_fd, &gsc_handle->src) == false) {
17735f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        ALOGE("%s::m_exynos_gsc_set_format(src) fail", __func__);
17745f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        goto done;
17755f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    }
177670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
17775f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    if (m_exynos_gsc_set_format(gsc_handle->gsc_fd, &gsc_handle->dst) == false) {
17785f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        ALOGE("%s::m_exynos_gsc_set_format(dst) fail", __func__);
17795f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        goto done;
17805f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    }
178170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
17825f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    if (m_exynos_gsc_set_addr(gsc_handle->gsc_fd, &gsc_handle->src) == false) {
17835f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        ALOGE("%s::m_exynos_gsc_set_addr(src) fail", __func__);
17845f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        goto done;
17855f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    }
178670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
17875f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    if (m_exynos_gsc_set_addr(gsc_handle->gsc_fd, &gsc_handle->dst) == false) {
17885f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        ALOGE("%s::m_exynos_gsc_set_addr(dst) fail", __func__);
17895f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        goto done;
179070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
179170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
179270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->src.stream_on == false) {
179370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_v4l2_streamon(gsc_handle->gsc_fd, gsc_handle->src.buf_type) < 0) {
17946134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_v4l2_streamon(src) fail", __func__);
179570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            goto done;
179670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
179770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->src.stream_on = true;
179870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
179970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
180070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->dst.stream_on == false) {
180170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_v4l2_streamon(gsc_handle->gsc_fd, gsc_handle->dst.buf_type) < 0) {
18026134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_v4l2_streamon(dst) fail", __func__);
180370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            goto done;
180470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
180570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->dst.stream_on = true;
180670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
180770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
18087b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_Out();
18097b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18107b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    return 0;
18117b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18127b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songdone:
18137b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    return -1;
18147b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song}
18157b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18167b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songstatic int exynos_gsc_m2m_wait_frame_done(void *handle)
18177b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song{
18187b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    struct GSC_HANDLE *gsc_handle;
18197b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    struct v4l2_requestbuffers req_buf;
18207b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18217b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    gsc_handle = (struct GSC_HANDLE *)handle;
18227b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18237b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_In();
18247b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18257b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (handle == NULL) {
18267b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::handle == NULL() fail", __func__);
18277b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
18287b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
18297b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18307b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if ((gsc_handle->src.stream_on == false) || (gsc_handle->dst.stream_on == false)) {
18317b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s:: src_strean_on or dst_stream_on are false", __func__);
18327b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
18337b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
18347b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
183570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_dqbuf(gsc_handle->gsc_fd, &gsc_handle->src.buffer) < 0) {
18366134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_dqbuf(src) fail", __func__);
18377b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
183870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
183970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
184070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_dqbuf(gsc_handle->gsc_fd, &gsc_handle->dst.buffer) < 0) {
18416134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_dqbuf(dst) fail", __func__);
18427b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
18437b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
18447b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18457b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (exynos_v4l2_streamoff(gsc_handle->gsc_fd, gsc_handle->src.buf_type) < 0) {
18467b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::exynos_v4l2_streamoff(src) fail", __func__);
18477b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
18487b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
18497b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    gsc_handle->src.stream_on = false;
18507b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18517b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (exynos_v4l2_streamoff(gsc_handle->gsc_fd, gsc_handle->dst.buf_type) < 0) {
18527b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::exynos_v4l2_streamoff(dst) fail", __func__);
18537b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
18547b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
18557b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    gsc_handle->dst.stream_on = false;
18567b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18577b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    /* src: clear_buf */
18587b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.count  = 0;
18597b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.type   = gsc_handle->src.buf_type;
18607b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.memory = V4L2_MEMORY_DMABUF;
18617b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (exynos_v4l2_reqbufs(gsc_handle->gsc_fd, &req_buf) < 0) {
18627b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::exynos_v4l2_reqbufs():src: fail", __func__);
18637b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
18647b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
18657b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18667b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    /* dst: clear_buf */
18677b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.count  = 0;
18687b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.type   = gsc_handle->dst.buf_type;
18697b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.memory = V4L2_MEMORY_DMABUF;
18707b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (exynos_v4l2_reqbufs(gsc_handle->gsc_fd, &req_buf) < 0) {
18717b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::exynos_v4l2_reqbufs():dst: fail", __func__);
18727b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
18737b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
18747b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18757b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_Out();
18767b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18777b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song     return 0;
18787b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song}
18797b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18807b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songint exynos_gsc_convert(
18817b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    void *handle)
18827b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song{
18837b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    struct GSC_HANDLE *gsc_handle;
18847b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    int ret    = -1;
18857b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    gsc_handle = (struct GSC_HANDLE *)handle;
18867b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18877b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_In();
18887b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18897b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (handle == NULL) {
18907b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::handle == NULL() fail", __func__);
18917b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
18927b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
18937b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18947b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    exynos_mutex_lock(gsc_handle->op_mutex);
18957b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
18967b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (gsc_handle->flag_local_path == true) {
18977b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::this exynos_gsc is connected by another hw internaly. So, don't call exynos_gsc_convert()", __func__);
18987b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song            goto done;
18997b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        }
19007b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
19017b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (exynos_gsc_m2m_run_core(handle) < 0) {
19027b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::exynos_gsc_run_core fail", __func__);
19037b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song            goto done;
19047b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        }
19057b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
19067b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (exynos_gsc_m2m_wait_frame_done(handle) < 0) {
19077b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::exynos_gsc_m2m_wait_frame_done", __func__);
190870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto done;
190970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
191070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
191170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    ret = 0;
191270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
191370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changdone:
191470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->flag_exclusive_open == false) {
191570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->flag_local_path == false)
191670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
191770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
191870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
191970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
192070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1921e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1922e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
192370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
192470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
192570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1926e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changint exynos_gsc_m2m_run(void *handle,
1927e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *src_img,
1928e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *dst_img)
1929e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang{
1930e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    void *addr[3] = {NULL, NULL, NULL};
1931e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    int ret = 0;
1932e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1933e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1934e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1935e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[0] = (void *)src_img->yaddr;
1936e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[1] = (void *)src_img->uaddr;
1937e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[2] = (void *)src_img->vaddr;
1938e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1939e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    ret = exynos_gsc_set_src_addr(handle, addr);
1940e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (ret < 0) {
1941e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ALOGE("%s::fail: exynos_gsc_set_src_addr[%x %x %x]", __func__,
1942e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            (unsigned int)addr[0], (unsigned int)addr[1], (unsigned int)addr[2]);
19437b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
1944e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
1945e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1946e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[0] = (void *)dst_img->yaddr;
1947e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[1] = (void *)dst_img->uaddr;
1948e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[2] = (void *)dst_img->vaddr;
1949e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    ret = exynos_gsc_set_dst_addr(handle, addr);
1950e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (ret < 0) {
1951e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ALOGE("%s::fail: exynos_gsc_set_dst_addr[%x %x %x]", __func__,
1952e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            (unsigned int)addr[0], (unsigned int)addr[1], (unsigned int)addr[2]);
19537b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
1954e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
1955e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
19567b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    ret = exynos_gsc_m2m_run_core(handle);
1957e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang     if (ret < 0) {
19587b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::fail: exynos_gsc_m2m_run_core", __func__);
19597b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
1960e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
1961e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1962e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1963e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1964e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    return 0;
1965e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang}
1966e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
196770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_config_exclusive(void *handle,
1968e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *src_img,
1969e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *dst_img)
197070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
1971e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1972e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1973e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
197470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     struct GSC_HANDLE *gsc_handle;
197570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret = 0;
197670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
197770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
19786134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
197970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
198070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
198170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
198270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (gsc_handle->gsc_mode) {
198370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_M2M_MODE:
1984e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ret = exynos_gsc_m2m_config(handle, src_img, dst_img);
198570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
198670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_OUTPUT_MODE:
198770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        ret = exynos_gsc_out_config(handle, src_img, dst_img);
198870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
198970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case  GSC_CAPTURE_MODE:
199070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        //to do
199170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
199270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
199370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
199470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1995e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1996e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1997e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
199870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
199970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
200070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
200170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
200270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_run_exclusive(void *handle,
2003e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *src_img,
2004e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *dst_img)
200570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
200670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
200770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret = 0;
20087b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20097b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_In();
20107b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
201170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
201270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
20136134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
201470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
201570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
201670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
201770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (gsc_handle->gsc_mode) {
201870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_M2M_MODE:
2019e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ret = exynos_gsc_m2m_run(handle, src_img, dst_img);
202070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
202170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_OUTPUT_MODE:
202270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        ret = exynos_gsc_out_run(handle, src_img->yaddr,
202370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                                                src_img->uaddr, src_img->vaddr);
202470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
202570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case  GSC_CAPTURE_MODE:
202670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        //to do
202770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
202870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
202970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
203070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
20317b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20327b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_Out();
20337b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
203470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
203570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
203670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
203770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_stop_exclusive(void *handle)
203870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
203970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
204070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret = 0;
204170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
2042e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2043e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
2044e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
204570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
20466134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
204770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
204870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
204970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
205070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (gsc_handle->gsc_mode) {
205170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_M2M_MODE:
20527b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ret = exynos_gsc_m2m_wait_frame_done(handle);
205370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
205470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_OUTPUT_MODE:
205570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        ret = exynos_gsc_out_stop(handle);
205670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
205770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case  GSC_CAPTURE_MODE:
205870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        //to do
205970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
206070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
2061e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        break;
206270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
2063e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2064e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
2065e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
206670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
206770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
206870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
206970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_connect(
207070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle,
207170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *hw)
207270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
207370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
207470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret    = -1;
207570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
207670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
2077e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
2078e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
207970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
20806134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
208170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
208270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
208370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
208470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
208570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
208670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_local_path = true;
208770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
208870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_mutex_trylock(gsc_handle->cur_obj_mutex) == false) {
208970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (m_exynos_gsc_find_and_trylock_and_create(gsc_handle) == false) {
20906134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::m_exynos_gsc_find_and_trylock_and_create() fail", __func__);
209170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            goto done;
209270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
209370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
209470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
209570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    ret = 0;
209670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
2097e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
2098e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
209970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changdone:
210070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
210170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
210270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
210370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
210470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
210570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_disconnect(
210670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle,
210770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *hw)
210870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
210970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
211070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
211170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
2112e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
2113e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
211470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
21156134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
211670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
211770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
211870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
211970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
212070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
212170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_local_path = false;
212270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
212370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
212470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
212570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
212670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
2127e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
2128e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
212970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
213070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
2131