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"
4433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin#include "content_protect.h"
4570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
469f6d828714b4b232205235a1c75f24ec23f8b888Benoit Gobystatic int exynos_gsc_m2m_wait_frame_done(void *handle);
4733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavinstatic int exynos_gsc_m2m_stop(void *handle);
489f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby
4970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic unsigned int m_gsc_get_plane_count(
5070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int v4l_pixel_format)
5170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
5270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int plane_count = 0;
5370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
5470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (v4l_pixel_format) {
5570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB32:
5670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_BGR32:
5770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB24:
5870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB565:
5970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB555X:
6070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB444:
6170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YUYV:
6270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_UYVY:
6323dac69caf127d309df8157099f7a8a21102c830Sungjoong Kang    case V4L2_PIX_FMT_NV16:
6423dac69caf127d309df8157099f7a8a21102c830Sungjoong Kang    case V4L2_PIX_FMT_NV61:
6570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_count = 1;
6670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
6770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV12M:
6870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV12MT_16X16:
692607aa30bcae2244e1bc68cbc0a0fc5a2b4ef570Yongbae Song    case V4L2_PIX_FMT_NV12:
7070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV21:
7166e91991f45bf7c56f4993a2c5c2356421017368Sungjoong Kang    case V4L2_PIX_FMT_NV21M:
7270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_count = 2;
7370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
7470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YVU420M:
7570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YUV422P:
764006f615bd7b5ad1f11120ad3172b5b4981e37b9Yongbae Song    case V4L2_PIX_FMT_YUV420M:
7770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_count = 3;
7870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
7970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
806134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::unmatched v4l_pixel_format color_space(0x%x)\n",
8170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang             __func__, v4l_pixel_format);
8270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_count = -1;
8370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
8470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
8570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
8670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return plane_count;
8770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
8870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
8970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic unsigned int m_gsc_get_plane_size(
9070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int *plane_size,
9170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int  width,
9270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int  height,
9370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int           v4l_pixel_format)
9470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
9570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (v4l_pixel_format) {
9670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* 1 plane */
9770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB32:
9870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_BGR32:
9970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[0] = width * height * 4;
10070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[1] = 0;
10170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = 0;
10270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
10370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB24:
10470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[0] = width * height * 3;
10570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[1] = 0;
10670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = 0;
10770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
10870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB565:
10970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB555X:
11070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_RGB444:
11170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YUYV:
11270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_UYVY:
11370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[0] = width * height * 2;
11470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[1] = 0;
11570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = 0;
11670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
11770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* 2 planes */
11870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV12M:
1192607aa30bcae2244e1bc68cbc0a0fc5a2b4ef570Yongbae Song    case V4L2_PIX_FMT_NV12:
12070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV21:
12166e91991f45bf7c56f4993a2c5c2356421017368Sungjoong Kang    case V4L2_PIX_FMT_NV21M:
122e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        plane_size[0] = width * height;
123e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        plane_size[1] = width * (height / 2);
124e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        plane_size[2] = 0;
125e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        break;
12670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV16:
12770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV61:
12835b3cc218cb21f5d003e39cf15bb4c5bb01fe114Jiyoung Shin        plane_size[0] = width * height * 2;
12935b3cc218cb21f5d003e39cf15bb4c5bb01fe114Jiyoung Shin        plane_size[1] = 0;
13070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = 0;
13170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
13270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_NV12MT_16X16:
13370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[0] = ALIGN(width, 16) * ALIGN(height, 16);
13470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[1] = ALIGN(width, 16) * ALIGN(height / 2, 8);
13570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = 0;
13670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
13770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* 3 planes */
13870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YVU420M:
13970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case V4L2_PIX_FMT_YUV422P:
14070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[0] = width * height;
14170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[1] = (width / 2) * (height / 2);
14270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        plane_size[2] = (width / 2) * (height / 2);
14370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
14470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
1456134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::unmatched v4l_pixel_format color_space(0x%x)\n",
14670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang             __func__, v4l_pixel_format);
14770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
14870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
14970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
15070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
15170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
15270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
15370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
154e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavinstatic int m_exynos_gsc_multiple_of_n(
155e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    int number, int N)
156e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin{
157e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    int result = number;
158e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    switch (N) {
159e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 1:
160e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 2:
161e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 4:
162e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 8:
163e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 16:
164e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 32:
165e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 64:
166e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 128:
167e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case 256:
168e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        result = (number - (number & (N-1)));
169e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
170e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    default:
171e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        result = number - (number % N);
172e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
173e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
174e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    return result;
175e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin}
176e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
177e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavinstatic bool m_exynos_gsc_check_src_size(
178e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *w,      unsigned int *h,
179e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *crop_x, unsigned int *crop_y,
180e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *crop_w, unsigned int *crop_h,
181e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    int v4l2_colorformat)
182e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin{
183e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (*w < GSC_MIN_W_SIZE || *h < GSC_MIN_H_SIZE) {
184e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)",
185e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            __func__, GSC_MIN_W_SIZE, *w, GSC_MIN_H_SIZE, *h);
186e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        return false;
187e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
188e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
189e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (*crop_w < GSC_MIN_W_SIZE || *crop_h < GSC_MIN_H_SIZE) {
190e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)",
191e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            __func__, GSC_MIN_W_SIZE,* crop_w, GSC_MIN_H_SIZE, *crop_h);
192e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        return false;
193e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
194e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
195e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    switch (v4l2_colorformat) {
196e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // YUV420
197e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUV420M:
198e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YVU420M:
199e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV12M:
200e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV12MT:
201e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV21:
202e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV21M:
203e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *w = (*w + 15) & ~15;
204e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *h = (*h + 15) & ~15;
205e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        //*w      = m_exynos_gsc_multiple_of_n(*w, 16);
206e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        //*h      = m_exynos_gsc_multiple_of_n(*h, 16);
207e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_w = m_exynos_gsc_multiple_of_n(*crop_w, 4);
208e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_h = m_exynos_gsc_multiple_of_n(*crop_h, 4);
209e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
210e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // YUV422
211e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUYV:
212e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUV422P:
213e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_UYVY:
214e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV16:
215e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YVYU:
216e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_VYUY:
217e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *h = (*h + 7) & ~7;
218e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        //*h      = m_exynos_gsc_multiple_of_n(*h, 8);
219e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_w = m_exynos_gsc_multiple_of_n(*crop_w, 4);
220e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_h = m_exynos_gsc_multiple_of_n(*crop_h, 2);
221e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
222e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // RGB
223e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB32:
224e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB24:
225e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB565:
226e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_BGR32:
227e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB555X:
228e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB444:
229e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    default:
230e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *h = (*h + 7) & ~7;
231e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        //*h      = m_exynos_gsc_multiple_of_n(*h, 8);
232e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_w = m_exynos_gsc_multiple_of_n(*crop_w, 2);
233e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *crop_h = m_exynos_gsc_multiple_of_n(*crop_h, 2);
234e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
235e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
236e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
237e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    return true;
238e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin}
239e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
240e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavinstatic bool m_exynos_gsc_check_dst_size(
241e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *w,      unsigned int *h,
242e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *crop_x, unsigned int *crop_y,
243e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *crop_w, unsigned int *crop_h,
244e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    int v4l2_colorformat,
245e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    int rotation)
246e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin{
247e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *new_w;
248e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *new_h;
249e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *new_crop_w;
250e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    unsigned int *new_crop_h;
251e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
252e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        new_w = w;
253e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        new_h = h;
254e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        new_crop_w = crop_w;
255e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        new_crop_h = crop_h;
256e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
257e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (*w < GSC_MIN_W_SIZE || *h < GSC_MIN_H_SIZE) {
258e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)",
259e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            __func__, GSC_MIN_W_SIZE, *w, GSC_MIN_H_SIZE, *h);
260e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        return false;
261e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
262e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
263e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (*crop_w < GSC_MIN_W_SIZE || *crop_h < GSC_MIN_H_SIZE) {
264e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)",
265e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            __func__, GSC_MIN_W_SIZE,* crop_w, GSC_MIN_H_SIZE, *crop_h);
266e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        return false;
267e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
268e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
269e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    switch (v4l2_colorformat) {
270e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // YUV420
271e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV12M:
272e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV12MT:
273e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV21:
274e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV21M:
275e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUV420M:
276e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YVU420M:
277e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *new_w = m_exynos_gsc_multiple_of_n(*new_w, 2);
278e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *new_h = m_exynos_gsc_multiple_of_n(*new_h, 2);
279e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
280e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // YUV422
281e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUYV:
282e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YUV422P:
283e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_UYVY:
284e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_NV16:
285e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_YVYU:
286e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_VYUY:
287e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        *new_w = m_exynos_gsc_multiple_of_n(*new_w, 2);
288e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
289e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    // RGB
290e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB32:
291e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB24:
292e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB565:
293e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_BGR32:
294e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB555X:
295e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    case V4L2_PIX_FMT_RGB444:
296e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    default:
297e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        break;
298e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
299e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
300e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    return true;
301e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin}
302e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
30370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic int m_exynos_gsc_output_create(
30470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle,
30570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int dev_num,
30670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int out_mode)
30770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
308e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    struct media_device *media0;
30970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct media_entity *gsc_sd_entity;
31070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct media_entity *gsc_vd_entity;
31170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct media_entity *sink_sd_entity;
31270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct media_link *links;
31370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char node[32];
31470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char devname[32];
31570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int cap;
31670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int         i;
31770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int         fd = 0;
318e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
319e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
320e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
32170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ((out_mode != GSC_OUT_FIMD) &&
32270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        (out_mode != GSC_OUT_TV))
32370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
32470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
32570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->out_mode = out_mode;
32670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* GSCX => FIMD_WINX : arbitrary linking is not allowed */
32770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ((out_mode == GSC_OUT_FIMD) &&
32852cf3b06437639812b555d7a552ead7882bbddfcGreg Hackmann        (dev_num > 2))
32970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
33070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
33170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* media0 */
33270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(node, "%s%d", PFX_NODE_MEDIADEV, 0);
33370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    media0 = exynos_media_open(node);
33470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (media0 == NULL) {
3356134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_media_open failed (node=%s)", __func__, node);
33670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
33770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
33870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
33970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* Get the sink subdev entity by name and make the node of sink subdev*/
34070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (out_mode == GSC_OUT_FIMD)
34170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sprintf(devname, PFX_FIMD_ENTITY, dev_num);
34270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    else
34370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sprintf(devname, PFX_MXR_ENTITY, 0);
34470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
345e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    sink_sd_entity = exynos_media_get_entity_by_name(media0, devname, strlen(devname));
34670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sink_sd_entity->fd = exynos_subdev_open_devname(devname, O_RDWR);
34770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ( sink_sd_entity->fd < 0) {
3486134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:: failed to open sink subdev node", __func__);
34970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto gsc_output_err;
35070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
35170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
35270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* get GSC video dev & sub dev entity by name*/
35370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(devname, PFX_GSC_VIDEODEV_ENTITY, dev_num);
35470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_vd_entity= exynos_media_get_entity_by_name(media0, devname, strlen(devname));
35570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
35670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(devname, PFX_GSC_SUBDEV_ENTITY, dev_num);
35770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_sd_entity= exynos_media_get_entity_by_name(media0, devname, strlen(devname));
35870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
35970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* gsc sub-dev open */
36070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(devname, PFX_GSC_SUBDEV_ENTITY, dev_num);
36170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_sd_entity->fd = exynos_subdev_open_devname(devname, O_RDWR);
36270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
36370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* setup link : GSC : video device --> sub device */
36470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < (int) gsc_vd_entity->num_links; i++) {
36570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        links = &gsc_vd_entity->links[i];
36670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
36770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (links == NULL ||
36870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            links->source->entity != gsc_vd_entity ||
36970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            links->sink->entity   != gsc_sd_entity) {
37070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            continue;
37170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        } else if (exynos_media_setup_link(media0,  links->source,  links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
3726134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_media_setup_link [src.entity=%d->sink.entity=%d] failed",
37370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                  __func__, links->source->entity->info.id, links->sink->entity->info.id);
37470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
37570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
37670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
37770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
37870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* setup link : GSC: sub device --> sink device */
37970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < (int) gsc_sd_entity->num_links; i++) {
38070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        links = &gsc_sd_entity->links[i];
38170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
38270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (links == NULL || links->source->entity != gsc_sd_entity ||
38370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                             links->sink->entity   != sink_sd_entity) {
38470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            continue;
38570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        } else if (exynos_media_setup_link(media0,  links->source,  links->sink, MEDIA_LNK_FL_ENABLED) < 0) {
3866134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_media_setup_link [src.entity=%d->sink.entity=%d] failed",
38770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                  __func__, links->source->entity->info.id, links->sink->entity->info.id);
38870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
38970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
39070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
39170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
39270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* gsc video-dev open */
39370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(devname, PFX_GSC_VIDEODEV_ENTITY, dev_num);
39470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_vd_entity->fd = exynos_v4l2_open_devname(devname, O_RDWR);
39570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    cap = V4L2_CAP_STREAMING |
39670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang          V4L2_CAP_VIDEO_OUTPUT_MPLANE;
39770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
39870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_querycap(gsc_vd_entity->fd, cap) == false) {
3996134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_querycap() fail", __func__);
40070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto gsc_output_err;
40170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
40270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_sd_entity = gsc_sd_entity;
40370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_vd_entity = gsc_vd_entity;
40470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->sink_sd_entity = sink_sd_entity;
405e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle->media0 = media0;
406e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
407e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
408e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
40970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
41070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
41170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changgsc_output_err:
41270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* to do */
41370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return -1;
41470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
41570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
41670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
417e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changstatic int m_exynos_gsc_m2m_create(
41870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int dev)
41970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
42070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int          fd = 0;
42170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int          video_node_num;
42270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int cap;
42370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char         node[32];
42470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
425e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
426e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
42770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch(dev) {
42870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 0:
42970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        video_node_num = NODE_NUM_GSC_0;
43070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
43170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 1:
43270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        video_node_num = NODE_NUM_GSC_1;
43370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
43470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 2:
43570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        video_node_num = NODE_NUM_GSC_2;
43670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
43770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 3:
43870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        video_node_num = NODE_NUM_GSC_3;
43970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
44070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
4416134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::unexpected dev(%d) fail", __func__, dev);
44270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
44370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
44470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
44570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
44670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(node, "%s%d", PFX_NODE_GSC, video_node_num);
44770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fd = exynos_v4l2_open(node, O_RDWR);
44870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (fd < 0) {
4496134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_open(%s) fail", __func__, node);
45070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
45170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
45270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
45370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    cap = V4L2_CAP_STREAMING |
45470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang          V4L2_CAP_VIDEO_OUTPUT_MPLANE |
45570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang          V4L2_CAP_VIDEO_CAPTURE_MPLANE;
45670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
45770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_querycap(fd, cap) == false) {
4586134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_querycap() fail", __func__);
45970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (0 < fd)
46070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            close(fd);
46170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        fd = 0;
46270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
46370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
464e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
465e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
466e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
46770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return fd;
46870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
46970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
47070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
471e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changstatic bool m_exynos_gsc_out_destroy(struct GSC_HANDLE *gsc_handle)
47270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
47370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct media_link * links;
47470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i;
47570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
476e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
477e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
47870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle == NULL) {
4796134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::gsc_handle is NULL", __func__);
48070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
48170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
48270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
48370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->src.stream_on == true) {
48470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_gsc_out_stop((void *)gsc_handle) < 0)
4856134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_gsc_out_stop() fail", __func__);
48670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
48770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            gsc_handle->src.stream_on = false;
48870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
48970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
490e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    /* unlink : gscaler-out --> fimd */
49170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        for (i = 0; i < (int) gsc_handle->gsc_sd_entity->num_links; i++) {
49270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            links = &gsc_handle->gsc_sd_entity->links[i];
49370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
49470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if (links == NULL || links->source->entity != gsc_handle->gsc_sd_entity ||
49570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                                 links->sink->entity   != gsc_handle->sink_sd_entity) {
49670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                continue;
49770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            } else if (exynos_media_setup_link(gsc_handle->media0,  links->source,
49870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                                                                        links->sink, 0) < 0) {
4996134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                ALOGE("%s::exynos_media_setup_unlink [src.entity=%d->sink.entity=%d] failed",
50070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                      __func__, links->source->entity->info.id, links->sink->entity->info.id);
50170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
50270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
50370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
50470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        close(gsc_handle->gsc_vd_entity->fd);
50570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        close(gsc_handle->gsc_sd_entity->fd);
50670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->gsc_vd_entity->fd = -1;
50770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->gsc_vd_entity->fd = -1;
50870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
509e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        Exynos_gsc_Out();
510e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
51170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return true;
51270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
51370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
51470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
51570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool m_exynos_gsc_destroy(
51670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle)
51770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
518e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
519e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
52033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    /* just in case, we call stop here because we cannot afford to leave
52133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * secure side protection on if things failed.
52233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     */
52333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    exynos_gsc_m2m_stop(gsc_handle);
52470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
52570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (0 < gsc_handle->gsc_fd)
52670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        close(gsc_handle->gsc_fd);
52770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_fd = 0;
52870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
529e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
530e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
53170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return true;
53270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
53370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
53470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changbool m_exynos_gsc_find_and_trylock_and_create(
53570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle)
53670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
53770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int          i                 = 0;
53870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    bool         flag_find_new_gsc = false;
53970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int total_sleep_time  = 0;
54070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
541e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
542e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
54370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    do {
54470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        for (i = 0; i < NUM_OF_GSC_HW; i++) {
54570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            // HACK : HWComposer, HDMI uses gscaler with their own code.
54670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            //        So, This obj_mutex cannot defense their open()
547e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            if (i == 0 || i == 3)
54870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                continue;
54970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
55070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if (exynos_mutex_trylock(gsc_handle->obj_mutex[i]) == true) {
55170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
55270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                // destroy old one.
55370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                m_exynos_gsc_destroy(gsc_handle);
55470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
55570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                // create new one.
55633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin                gsc_handle->gsc_id = i;
557e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                gsc_handle->gsc_fd = m_exynos_gsc_m2m_create(i);
55870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                if (gsc_handle->gsc_fd < 0) {
55970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                    gsc_handle->gsc_fd = 0;
56070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                    exynos_mutex_unlock(gsc_handle->obj_mutex[i]);
56170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                    continue;
56270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                }
56370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
564d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen                /* Trade temporary object for one in the pool */
565d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen                if (gsc_handle->cur_obj_mutex) {
56670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                    exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
567d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen                    if (gsc_handle->destroy_cur_obj_mutex)
568d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen                        exynos_mutex_destroy(gsc_handle->cur_obj_mutex);
569d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen                }
57070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
571d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen                gsc_handle->destroy_cur_obj_mutex = false;
57270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                gsc_handle->cur_obj_mutex = gsc_handle->obj_mutex[i];
57370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
57470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                flag_find_new_gsc = true;
57570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                break;
57670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
57770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
57870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
57970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        // waiting for another process doesn't use gscaler.
58070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        // we need to make decision how to do.
58170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (flag_find_new_gsc == false) {
58270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            usleep(GSC_WAITING_TIME_FOR_TRYLOCK);
58370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            total_sleep_time += GSC_WAITING_TIME_FOR_TRYLOCK;
5846134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGV("%s::waiting for anthere process doens't use gscaler", __func__);
58570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
58670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
58770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    } while(   flag_find_new_gsc == false
58870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            && total_sleep_time < MAX_GSC_WAITING_TIME_FOR_TRYLOCK);
58970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
59070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (flag_find_new_gsc == false)
5916134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::we don't have no available gsc.. fail", __func__);
59270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
593e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
594e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
59570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return flag_find_new_gsc;
59670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
59770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
59870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool m_exynos_gsc_set_format(
59970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int              fd,
6005f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    struct gsc_info *info)
60170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
602e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
603e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
60470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_requestbuffers req_buf;
60570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int                        plane_count;
60670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
60770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    plane_count = m_gsc_get_plane_count(info->v4l2_colorformat);
60870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (plane_count < 0) {
6096134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::not supported v4l2_colorformat", __func__);
61070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
61170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
61270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
61370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_ctrl(fd, V4L2_CID_ROTATE, info->rotation) < 0) {
6146134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_ROTATE) fail", __func__);
61570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
61670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
61770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
61870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_ctrl(fd, V4L2_CID_VFLIP, info->flip_horizontal) < 0) {
6196134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_VFLIP) fail", __func__);
62070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
62170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
62270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
62370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_ctrl(fd, V4L2_CID_HFLIP, info->flip_vertical) < 0) {
6246134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_HFLIP) fail", __func__);
62570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
62670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
627bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann
628bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann    if (exynos_v4l2_s_ctrl(fd, V4L2_CID_CSC_RANGE, info->csc_range) < 0) {
629bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CSC_RANGE) fail", __func__);
630bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann        return false;
631bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann    }
632e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    info->format.type = info->buf_type;
63370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->format.fmt.pix_mp.width       = info->width;
63470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->format.fmt.pix_mp.height      = info->height;
63570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->format.fmt.pix_mp.pixelformat = info->v4l2_colorformat;
63670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->format.fmt.pix_mp.field       = V4L2_FIELD_ANY;
63770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->format.fmt.pix_mp.num_planes  = plane_count;
63870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
63970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_fmt(fd, &info->format) < 0) {
6406134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_fmt() fail", __func__);
64170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
64270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
64370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
64470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->crop.type     = info->buf_type;
64570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->crop.c.left   = info->crop_left;
64670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->crop.c.top    = info->crop_top;
64770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->crop.c.width  = info->crop_width;
64870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->crop.c.height = info->crop_height;
64970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
65070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_crop(fd, &info->crop) < 0) {
6516134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_crop() fail", __func__);
65270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
65370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
65470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
65570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_ctrl(fd, V4L2_CID_CACHEABLE, info->cacheable) < 0) {
6566134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_s_ctrl() fail", __func__);
65770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
65870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
65970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
66070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    req_buf.count  = 1;
66170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    req_buf.type   = info->buf_type;
662776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    req_buf.memory = V4L2_MEMORY_DMABUF;
66370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_reqbufs(fd, &req_buf) < 0) {
6646134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_reqbufs() fail", __func__);
66570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
66670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
66770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
668e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
669e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
67070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return true;
67170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
67270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
67370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool m_exynos_gsc_set_addr(
67470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int              fd,
67570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct gsc_info *info)
67670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
67770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int i;
67870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int plane_size[NUM_OF_GSC_PLANES];
67970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
68070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    m_gsc_get_plane_size(plane_size,
68170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                         info->width,
68270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                         info->height,
68370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                         info->v4l2_colorformat);
68470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
68570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->buffer.index    = 0;
6869f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    info->buffer.flags    = V4L2_BUF_FLAG_USE_SYNC;
68770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->buffer.type     = info->buf_type;
688776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    info->buffer.memory   = V4L2_MEMORY_DMABUF;
68970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->buffer.m.planes = info->planes;
69070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    info->buffer.length   = info->format.fmt.pix_mp.num_planes;
6919f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    info->buffer.reserved = info->acquireFenceFd;
69270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
69370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < info->format.fmt.pix_mp.num_planes; i++) {
694776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby        info->buffer.m.planes[i].m.fd = (int)info->addr[i];
69570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        info->buffer.m.planes[i].length    = plane_size[i];
69670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        info->buffer.m.planes[i].bytesused = 0;
69770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
69870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
69970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_qbuf(fd, &info->buffer) < 0) {
7006134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_v4l2_qbuf() fail", __func__);
70170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
70270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
7039f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    info->buffer_queued = true;
7049f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby
7059f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    info->releaseFenceFd = info->buffer.reserved;
70670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
70770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return true;
70870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
70970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
71070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid *exynos_gsc_create(
71170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void)
71270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
71370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i     = 0;
71470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int op_id = 0;
71570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char mutex_name[32];
71670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
717e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
718e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
71970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)malloc(sizeof(struct GSC_HANDLE));
72070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle == NULL) {
7216134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::malloc(struct GSC_HANDLE) fail", __func__);
72270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
72370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
72470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
72570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_fd = 0;
72670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    memset(&gsc_handle->src, 0, sizeof(struct gsc_info));
72770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    memset(&gsc_handle->dst, 0, sizeof(struct gsc_info));
72870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
72970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
73070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
73170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
73270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->op_mutex = NULL;
73370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < NUM_OF_GSC_HW; i++)
73470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->obj_mutex[i] = NULL;
73570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
73670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->cur_obj_mutex = NULL;
737d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen    gsc_handle->destroy_cur_obj_mutex = false;
73870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_local_path = false;
73970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_exclusive_open = false;
74070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
74170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    srand(time(NULL));
74270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    op_id = rand() % 1000000; // just make random id
74370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(mutex_name, "%sOp%d", LOG_TAG, op_id);
74470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->op_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_PRIVATE, mutex_name);
74570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->op_mutex == NULL) {
7466134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name);
74770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
74870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
74970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
75070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
75170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
75270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    // check if it is available
75370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < NUM_OF_GSC_HW; i++) {
75470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sprintf(mutex_name, "%sObject%d", LOG_TAG, i);
75570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
75670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->obj_mutex[i] = exynos_mutex_create(EXYNOS_MUTEX_TYPE_SHARED, mutex_name);
75770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->obj_mutex[i] == NULL) {
7586134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name);
75970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            goto err;
76070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
76170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
76270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
76370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (m_exynos_gsc_find_and_trylock_and_create(gsc_handle) == false) {
7646134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::m_exynos_gsc_find_and_trylock_and_create() fail", __func__);
76570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
76670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
76770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
76870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
76970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
77070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
77170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return (void *)gsc_handle;
77270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
77370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changerr:
77470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle) {
77570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        m_exynos_gsc_destroy(gsc_handle);
77670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
77770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->cur_obj_mutex)
77870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
77970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
78070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        for (i = 0; i < NUM_OF_GSC_HW; i++) {
78170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if ((gsc_handle->obj_mutex[i] != NULL) &&
782e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                (exynos_mutex_get_created_status(gsc_handle->obj_mutex[i]) == true)) {
78370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                if (exynos_mutex_destroy(gsc_handle->obj_mutex[i]) == false)
7846134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                    ALOGE("%s::exynos_mutex_destroy() fail", __func__);
78570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
78670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
78770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
78870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->op_mutex)
78970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            exynos_mutex_unlock(gsc_handle->op_mutex);
79070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
79170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_mutex_destroy(gsc_handle->op_mutex) == false)
7926134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_mutex_destroy(op_mutex) fail", __func__);
79370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
79470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        free(gsc_handle);
79570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
79670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
797e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
798e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
79970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return NULL;
80070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
80170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
80270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid *exynos_gsc_reserve(int dev_num)
80370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
80470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char mutex_name[32];
80570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int total_sleep_time  = 0;
80670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    bool    gsc_flag = false;
80770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
80870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ((dev_num < 0) || (dev_num >= NUM_OF_GSC_HW)) {
8096134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::fail:: dev_num is not valid(%d) ", __func__, dev_num);
81070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return NULL;
81170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
81270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
81370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)malloc(sizeof(struct GSC_HANDLE));
81470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle == NULL) {
8156134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::malloc(struct GSC_HANDLE) fail", __func__);
81670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
81770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
81870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
81970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_fd = -1;
82070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->op_mutex = NULL;
82170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->cur_obj_mutex = NULL;
822d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen    gsc_handle->destroy_cur_obj_mutex = true;
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,
87033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    int out_mode,
87133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    int allow_drm)
87270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
87370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i     = 0;
87470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int op_id = 0;
87570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    char mutex_name[32];
87670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int total_sleep_time  = 0;
87770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    bool    gsc_flag = false;
87870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret = 0;
879e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
880e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
881e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
88270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ((dev_num < 0) || (dev_num >= NUM_OF_GSC_HW)) {
8836134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::fail:: dev_num is not valid(%d) ", __func__, dev_num);
88470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return NULL;
88570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
88670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
88770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if ((mode < 0) || (mode >= NUM_OF_GSC_HW)) {
8886134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::fail:: mode is not valid(%d) ", __func__, mode);
88970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return NULL;
89070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
89170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
89233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    /* currently only gscalers 0 and 3 are DRM capable */
89333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (allow_drm && (dev_num != 0 && dev_num != 3)) {
89433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        ALOGE("%s::fail:: gscaler %d does not support drm\n", __func__,
89533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin              dev_num);
89633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        return NULL;
89733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    }
89833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
89970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)malloc(sizeof(struct GSC_HANDLE));
90070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle == NULL) {
9016134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::malloc(struct GSC_HANDLE) fail", __func__);
90270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
90370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
90470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    memset(gsc_handle, 0, sizeof(struct GSC_HANDLE));
905e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle->gsc_fd = -1;
90670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->gsc_mode = mode;
90733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    gsc_handle->gsc_id = dev_num;
90833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    gsc_handle->allow_drm = allow_drm;
90970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
91070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
91170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
91270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
91370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->op_mutex = NULL;
91470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < NUM_OF_GSC_HW; i++)
91570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->obj_mutex[i] = NULL;
91670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
91770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->cur_obj_mutex = NULL;
918d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen    gsc_handle->destroy_cur_obj_mutex = false;
91970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_local_path = false;
92070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_exclusive_open = true;
92170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
92270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    srand(time(NULL));
92370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    op_id = rand() % 1000000; // just make random id
92470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(mutex_name, "%sOp%d", LOG_TAG, op_id);
92570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->op_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_PRIVATE, mutex_name);
92670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->op_mutex == NULL) {
9276134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name);
92870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
92970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
93070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
93170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
93270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
93370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sprintf(mutex_name, "%sObject%d", LOG_TAG, dev_num);
93470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->cur_obj_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_SHARED, mutex_name);
93570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->cur_obj_mutex == NULL) {
9366134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name);
93770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto err;
93870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
939d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen    gsc_handle->destroy_cur_obj_mutex = true;
94070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
94170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    do {
94270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_mutex_trylock(gsc_handle->cur_obj_mutex) == true) {
94370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if (mode == GSC_M2M_MODE) {
944e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                gsc_handle->gsc_fd = m_exynos_gsc_m2m_create(dev_num);
945e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                if (gsc_handle->gsc_fd < 0) {
946e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                    ALOGE("%s::m_exynos_gsc_m2m_create(%i) fail", __func__, dev_num);
947e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                    goto err;
948e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                }
94970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            } else if (mode == GSC_OUTPUT_MODE) {
95070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                ret = m_exynos_gsc_output_create(gsc_handle, dev_num, out_mode);
95170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                if (ret < 0) {
9526134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                    ALOGE("%s::m_exynos_gsc_output_create(%i) fail", __func__, dev_num);
95370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                    goto err;
95470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                }
95570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
95670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            /*else
95770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                gsc_handle->gsc_fd = m_exynos_gsc_capture_create(dev_num);*/
958e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
95970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            gsc_flag = true;
96070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
96170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
96270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        usleep(GSC_WAITING_TIME_FOR_TRYLOCK);
96370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        total_sleep_time += GSC_WAITING_TIME_FOR_TRYLOCK;
9646134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGV("%s::waiting for anthere process doens't use gscaler", __func__);
96570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    } while(total_sleep_time < MAX_GSC_WAITING_TIME_FOR_TRYLOCK);
96670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
96770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
968e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (gsc_flag == true) {
969e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        Exynos_gsc_Out();
970e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        return (void *)gsc_handle;
971e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        }
97270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
97370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changerr:
97470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle) {
97570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        m_exynos_gsc_destroy(gsc_handle);
97670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
977d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen        if (gsc_handle->cur_obj_mutex) {
97870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
979d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen            if (gsc_handle->destroy_cur_obj_mutex)
980d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen                exynos_mutex_destroy(gsc_handle->cur_obj_mutex);
981d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen        }
98270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
98370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        for (i = 0; i < NUM_OF_GSC_HW; i++) {
98470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if ((gsc_handle->obj_mutex[i] != NULL) &&
985e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                (exynos_mutex_get_created_status(gsc_handle->obj_mutex[i]) == true)) {
98670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang                if (exynos_mutex_destroy(gsc_handle->obj_mutex[i]) == false)
9876134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                    ALOGE("%s::exynos_mutex_destroy() fail", __func__);
98870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            }
98970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
99070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
99170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->op_mutex)
99270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            exynos_mutex_unlock(gsc_handle->op_mutex);
99370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
99470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_mutex_destroy(gsc_handle->op_mutex) == false)
9956134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_mutex_destroy(op_mutex) fail", __func__);
99670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
99770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        free(gsc_handle);
99870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
99970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1000e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1001e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
100270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return NULL;
100370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
100470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
100570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid exynos_gsc_destroy(
100670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle)
100770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
100870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i = 0;
100970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)handle;
101070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1011e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1012e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
101370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
10146134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
101570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return;
101670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
101770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
101870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
101970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
102070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->flag_exclusive_open == false)
102170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        exynos_mutex_lock(gsc_handle->cur_obj_mutex);
102270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
102370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->gsc_mode == GSC_OUTPUT_MODE)
1024e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        m_exynos_gsc_out_destroy(gsc_handle);
1025e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    else
1026e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        m_exynos_gsc_destroy(gsc_handle);
102770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
102870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
102970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
103070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < NUM_OF_GSC_HW; i++) {
103170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if ((gsc_handle->obj_mutex[i] != NULL) &&
1032e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            (exynos_mutex_get_created_status(gsc_handle->obj_mutex[i]) == true)) {
103370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            if (exynos_mutex_destroy(gsc_handle->obj_mutex[i]) == false)
10346134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin                ALOGE("%s::exynos_mutex_destroy(obj_mutex) fail", __func__);
103570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
103670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
103770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1038d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen    if (gsc_handle->destroy_cur_obj_mutex)
1039d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen        exynos_mutex_destroy(gsc_handle->cur_obj_mutex);
1040d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen
104170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
104270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
104370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_mutex_destroy(gsc_handle->op_mutex) == false)
10446134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::exynos_mutex_destroy(op_mutex) fail", __func__);
104570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
104670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle)
104770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        free(gsc_handle);
1048e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1049e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1050e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
105170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
105270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
105370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_src_format(
105470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void        *handle,
105570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int width,
105670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int height,
105770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_left,
105870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_top,
105970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_width,
106070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_height,
106170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int v4l2_colorformat,
1062e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int cacheable,
1063e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int mode_drm)
106470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
1065e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1066e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
106770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
106870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
106970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
107070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
10716134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
107270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
107370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
107470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
107570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
107670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
107770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.width            = width;
107870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.height           = height;
107970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.crop_left        = crop_left;
108070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.crop_top         = crop_top;
108170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.crop_width       = crop_width;
108270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.crop_height      = crop_height;
108370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.v4l2_colorformat = v4l2_colorformat;
108470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.cacheable        = cacheable;
1085e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle->src.mode_drm         = mode_drm;
1086e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann    gsc_handle->src.dirty            = true;
108770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
108870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
108970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
109070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1091e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1092e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
109370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
109470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
109570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
109670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_dst_format(
109770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void        *handle,
109870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int width,
109970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int height,
110070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_left,
110170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_top,
110270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_width,
110370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int crop_height,
110470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int v4l2_colorformat,
1105e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int cacheable,
1106bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann    unsigned int mode_drm,
1107bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann    unsigned int narrowRgb)
110870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
1109e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1110e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
111170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
111270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
111370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
111470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
11156134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
111670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
111770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
111870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
111970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
112070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
112170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.width            = width;
112270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.height           = height;
112370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.crop_left        = crop_left;
112470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.crop_top         = crop_top;
112570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.crop_width       = crop_width;
112670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.crop_height      = crop_height;
112770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.v4l2_colorformat = v4l2_colorformat;
112870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.cacheable        = cacheable;
1129e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle->dst.mode_drm         = mode_drm;
1130e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann    gsc_handle->dst.dirty            = true;
1131bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann    gsc_handle->dst.csc_range        = !narrowRgb;
113270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
113370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
113470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1135e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1136e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    return 0;
1137e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang}
1138e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
113970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_rotation(
114070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle,
114170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int   rotation,
114270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int   flip_horizontal,
114370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int   flip_vertical)
114470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
114570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret = -1;
114670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
114770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
114870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
114970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
11506134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
115170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return ret;
115270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
115370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
115470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
115570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
115670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int new_rotation = rotation % 360;
115770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
115870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (new_rotation % 90 != 0) {
11596134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::rotation(%d) cannot be acceptable fail", __func__, rotation);
116070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto done;
116170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
116270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
116370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if(new_rotation < 0)
116470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        new_rotation = -new_rotation;
116570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
116670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.rotation        = new_rotation;
116770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.flip_horizontal = flip_horizontal;
116870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.flip_vertical   = flip_vertical;
116970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
117070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    ret = 0;
117170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changdone:
117270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
117370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
117470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
117570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
117670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
117770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_src_addr(
117870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle,
11799f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    void *addr[3],
11809f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    int acquireFenceFd)
118170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
118270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
118370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
118470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1185e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1186e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
118770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
11886134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
118970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
119070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
119170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
119270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
119370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
119470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.addr[0] = addr[0];
119570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.addr[1] = addr[1];
119670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.addr[2] = addr[2];
11979f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    gsc_handle->src.acquireFenceFd = acquireFenceFd;
119870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
119970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
120070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1201e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1202e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
120370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
120470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
120570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
120670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_dst_addr(
120770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle,
12089f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    void *addr[3],
12099f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    int acquireFenceFd)
121070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
121170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
121270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
1213994ebe9bc7c3b1da00ab8d6c80075cce0da6e47cGreg Hackmann    int ret = 0;
121470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1215e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1216e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
121770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
12186134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
121970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
122070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
122170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
122270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
122370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
122470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.addr[0] = addr[0];
122570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.addr[1] = addr[1];
122670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->dst.addr[2] = addr[2];
12279f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    gsc_handle->dst.acquireFenceFd = acquireFenceFd;
122870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
122970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
123070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
123170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1232e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1233e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1234994ebe9bc7c3b1da00ab8d6c80075cce0da6e47cGreg Hackmann    return ret;
123570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
123670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
123770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic void rotateValueHAL2GSC(unsigned int transform,
123870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int *rotate,
123970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int *hflip,
124070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int *vflip)
124170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
124270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int rotate_flag = transform & 0x7;
124370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    *rotate = 0;
124470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    *hflip = 0;
124570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    *vflip = 0;
124670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
124770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (rotate_flag) {
124870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_ROT_90:
124970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *rotate = 90;
125070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
125170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_ROT_180:
125270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *rotate = 180;
125370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
125470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_ROT_270:
125570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *rotate = 270;
125670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
125770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90:
125870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *rotate = 90;
125970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *vflip = 1; /* set vflip to compensate the rot & flip order. */
126070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
126170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90:
126270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *rotate = 90;
126370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *hflip = 1; /* set hflip to compensate the rot & flip order. */
126470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
126570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_FLIP_H:
126670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *hflip = 1;
126770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang         break;
126870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case HAL_TRANSFORM_FLIP_V:
126970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        *vflip = 1;
127070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang         break;
127170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
127270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
127370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
127470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
127570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
127670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool get_plane_size(int V4L2_PIX,
127770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int * size,
127870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int frame_size,
1279e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    int src_planes)
128070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
1281e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int frame_ratio = 1;
128270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int src_bpp    = get_yuv_bpp(V4L2_PIX);
128370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
128470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_planes = (src_planes == -1) ? 1 : src_planes;
128570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    frame_ratio = 8 * (src_planes -1) / (src_bpp - 8);
128670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
128770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (src_planes) {
128870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 1:
128970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        switch (V4L2_PIX) {
129070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_BGR32:
129170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_RGB32:
129270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            size[0] = frame_size << 2;
129370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
129470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_RGB565X:
129570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_NV16:
129670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_NV61:
129770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_YUYV:
129870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_UYVY:
129970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_VYUY:
130070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_YVYU:
130170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            size[0] = frame_size << 1;
130270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
130370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_YUV420:
130470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_NV12:
130570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        case V4L2_PIX_FMT_NV21:
130666e91991f45bf7c56f4993a2c5c2356421017368Sungjoong Kang        case V4L2_PIX_FMT_NV21M:
130770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            size[0] = (frame_size * 3) >> 1;
130870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
130970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        default:
13106134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::invalid color type", __func__);
131170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return false;
131270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            break;
131370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
131470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[1] = 0;
131570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[2] = 0;
131670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
131770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 2:
131870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[0] = frame_size;
131970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[1] = frame_size / frame_ratio;
132070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[2] = 0;
132170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
132270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case 3:
132370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[0] = frame_size;
132470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[1] = frame_size / frame_ratio;
132570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        size[2] = frame_size / frame_ratio;
132670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
132770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
13286134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::invalid color foarmt", __func__);
132970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return false;
133070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
133170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
133270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
133370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return true;
133470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
133570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1336e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changint exynos_gsc_m2m_config(void *handle,
1337e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *src_img,
1338e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *dst_img)
1339e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang{
1340e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    struct GSC_HANDLE *gsc_handle;
1341e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    int32_t      src_color_space;
1342e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    int32_t      dst_color_space;
1343e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    int ret;
1344e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int rotate;
1345e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int hflip;
1346e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    unsigned int vflip;
1347e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1348e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1349e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1350e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
135133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (gsc_handle == NULL) {
1352e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ALOGE("%s::gsc_handle == NULL() fail", __func__);
1353e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        return -1;
1354e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
1355e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
135633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if ((src_img->drmMode && !gsc_handle->allow_drm) ||
135733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        (src_img->drmMode != dst_img->drmMode)) {
135833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        ALOGE("%s::invalid drm state request for gsc%d (s=%d d=%d)",
135933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin              __func__, gsc_handle->gsc_id,
136033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin              src_img->drmMode, dst_img->drmMode);
136133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        return -1;
136233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    }
136333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
1364e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(src_img->format);
1365e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    dst_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(dst_img->format);
1366e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    rotateValueHAL2GSC(dst_img->rot, &rotate, &hflip, &vflip);
1367e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_set_rotation(gsc_handle, rotate, hflip, vflip);
1368e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1369e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    ret = exynos_gsc_set_src_format(gsc_handle,  src_img->fw, src_img->fh,
1370e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                                  src_img->x, src_img->y, src_img->w, src_img->h,
1371e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                                  src_color_space, src_img->cacheable, src_img->drmMode);
1372e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (ret < 0) {
1373e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho 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]",
1374e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            __func__, src_img->fw, src_img->fh, src_img->x, src_img->y, src_img->w, src_img->h,
1375e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            src_color_space, src_img->rot);
1376e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        return -1;
1377e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
1378e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1379e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    ret = exynos_gsc_set_dst_format(gsc_handle, dst_img->fw, dst_img->fh,
1380e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang                                  dst_img->x, dst_img->y, dst_img->w, dst_img->h,
1381bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann                                  dst_color_space, dst_img->cacheable, dst_img->drmMode,
1382bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann                                  dst_img->narrowRgb);
1383e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (ret < 0) {
1384e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho 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]",
1385e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            __func__, dst_img->fw, dst_img->fh, dst_img->x, dst_img->y, dst_img->w, dst_img->h,
1386e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            src_color_space, dst_img->rot);
1387e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        return -1;
1388e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
1389e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1390e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1391e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1392e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    return 0;
1393e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang}
1394e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
139570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_out_config(void *handle,
1396e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *src_img,
1397e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *dst_img)
139870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
139970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
140070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_format  fmt;
140170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_crop    crop;
140270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_requestbuffers reqbuf;
140370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_subdev_format sd_fmt;
140470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_subdev_crop   sd_crop;
140570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i;
140670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int rotate;
140770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int hflip;
140870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int vflip;
140970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int plane_size[NUM_OF_GSC_PLANES];
1410cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann    bool rgb;
1411bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann    int csc_range = !dst_img->narrowRgb;
141270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
141370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_rect dst_rect;
141470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int32_t      src_color_space;
141570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int32_t      dst_color_space;
141670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int32_t      src_planes;
1417e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
141870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
141970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     if (gsc_handle == NULL) {
14206134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::gsc_handle == NULL() fail", __func__);
142170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
142270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
142370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1424e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1425e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
142670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     if (gsc_handle->src.stream_on != false) {
14276134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("Error: Src is already streamed on !!!!");
142870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
142970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     }
143070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1431e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    memcpy(&gsc_handle->src_img, src_img, sizeof(exynos_gsc_img));
1432e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    memcpy(&gsc_handle->dst_img, dst_img, sizeof(exynos_gsc_img));
143370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(src_img->format);
143470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    dst_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(dst_img->format);
143570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_planes = get_yuv_planes(src_color_space);
1436ba718a434c6a2ed414752043c933a4abcc821fc0Benoit Goby    src_planes = (src_planes == -1) ? 1 : src_planes;
1437ba718a434c6a2ed414752043c933a4abcc821fc0Benoit Goby    rgb = get_yuv_planes(dst_color_space) == -1;
143870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    rotateValueHAL2GSC(dst_img->rot, &rotate, &hflip, &vflip);
143970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1440e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (m_exynos_gsc_check_src_size(&gsc_handle->src_img.fw, &gsc_handle->src_img.fh,
1441e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        &gsc_handle->src_img.x, &gsc_handle->src_img.y,
1442e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        &gsc_handle->src_img.w, &gsc_handle->src_img.h,
1443e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        src_color_space) == false) {
1444e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            ALOGE("%s::m_exynos_gsc_check_src_size() fail", __func__);
1445e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            return -1;
1446e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
1447e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
1448e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (m_exynos_gsc_check_dst_size(&gsc_handle->dst_img.fw, &gsc_handle->dst_img.fh,
1449e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        &gsc_handle->dst_img.x, &gsc_handle->dst_img.y,
1450e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        &gsc_handle->dst_img.w, &gsc_handle->dst_img.h,
1451e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        dst_color_space,
1452e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                        rotate) == false) {
1453e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            ALOGE("%s::m_exynos_gsc_check_dst_size() fail", __func__);
1454e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin            return -1;
145570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
145670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
145770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /*set: src v4l2_buffer*/
145870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.src_buf_idx = 0;
145970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.qbuf_cnt = 0;
146070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* set format: src pad of GSC sub-dev*/
146170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_fmt.pad   = GSCALER_SUBDEV_PAD_SOURCE;
146270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1463aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    if (gsc_handle->out_mode == GSC_OUT_FIMD) {
1464aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.width  = gsc_handle->dst_img.fw;
1465aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.height = gsc_handle->dst_img.fh;
1466aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    } else {
1467aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.width  = gsc_handle->dst_img.w;
1468aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.height = gsc_handle->dst_img.h;
1469aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    }
1470cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann    sd_fmt.format.code   = rgb ? V4L2_MBUS_FMT_XRGB8888_4X8_LE :
1471cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann                                    V4L2_MBUS_FMT_YUV8_1X24;
147270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_subdev_s_fmt(gsc_handle->gsc_sd_entity->fd, &sd_fmt) < 0) {
14736134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::GSC subdev set format failed", __func__);
147470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
147570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
147670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
147770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* set crop: src crop of GSC sub-dev*/
147870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_crop.pad   = GSCALER_SUBDEV_PAD_SOURCE;
147970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1480aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    if (gsc_handle->out_mode == GSC_OUT_FIMD) {
1481aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.left   = gsc_handle->dst_img.x;
1482aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.top    = gsc_handle->dst_img.y;
1483aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.width  = gsc_handle->dst_img.w;
1484aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.height = gsc_handle->dst_img.h;
1485aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    } else {
1486aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.left   = 0;
1487aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.top    = 0;
1488aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.width  = gsc_handle->dst_img.w;
1489aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.height = gsc_handle->dst_img.h;
1490aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    }
149170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_subdev_s_crop(gsc_handle->gsc_sd_entity->fd, &sd_crop) < 0) {
14926134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::GSC subdev set crop failed", __func__);
149370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
149470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
149570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
149670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* sink pad is connected to GSC out */
149770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /*  set format: sink sub-dev */
1498aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    if (gsc_handle->out_mode == GSC_OUT_FIMD) {
149970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sd_fmt.pad   = FIMD_SUBDEV_PAD_SINK;
1500aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.width  = gsc_handle->dst_img.w;
1501aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.height = gsc_handle->dst_img.h;
1502aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    } else {
150370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sd_fmt.pad   = MIXER_V_SUBDEV_PAD_SINK;
1504aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.width  = gsc_handle->dst_img.w + gsc_handle->dst_img.x*2;
1505aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.height = gsc_handle->dst_img.h + gsc_handle->dst_img.y*2;
1506aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    }
1507e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
150870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1509cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann    sd_fmt.format.code   = rgb ? V4L2_MBUS_FMT_XRGB8888_4X8_LE :
1510cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann                                    V4L2_MBUS_FMT_YUV8_1X24;
151170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_subdev_s_fmt(gsc_handle->sink_sd_entity->fd, &sd_fmt) < 0) {
15126134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::sink:set format failed (PAD=%d)", __func__, sd_fmt.pad);
151370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
151470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
151570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
151670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /*  set crop: sink sub-dev */
151770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->out_mode == GSC_OUT_FIMD)
151870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sd_crop.pad   = FIMD_SUBDEV_PAD_SINK;
151970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    else
152070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        sd_crop.pad   = MIXER_V_SUBDEV_PAD_SINK;
152170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
152270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1523aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    if (gsc_handle->out_mode == GSC_OUT_FIMD) {
1524aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.left   = gsc_handle->dst_img.x;
1525aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.top    = gsc_handle->dst_img.y;
1526aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.width  = gsc_handle->dst_img.w;
1527aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.height = gsc_handle->dst_img.h;
1528aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    } else {
1529aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.left   = 0;
1530aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.top    = 0;
1531aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.width  = gsc_handle->dst_img.w;
1532aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.height = gsc_handle->dst_img.h;
1533aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    }
153470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_subdev_s_crop(gsc_handle->sink_sd_entity->fd, &sd_crop) < 0) {
15356134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::sink: subdev set crop failed(PAD=%d)", __func__, sd_crop.pad);
153670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
153770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
153870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1539aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    if (gsc_handle->out_mode != GSC_OUT_FIMD) {
1540aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.pad   = MIXER_V_SUBDEV_PAD_SOURCE;
1541aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1542aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.width  = gsc_handle->dst_img.w + gsc_handle->dst_img.x*2;
1543aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.height = gsc_handle->dst_img.h + gsc_handle->dst_img.y*2;
1544aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.format.code   = V4L2_MBUS_FMT_XRGB8888_4X8_LE;
1545aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        if (exynos_subdev_s_fmt(gsc_handle->sink_sd_entity->fd, &sd_fmt) < 0) {
1546aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby            ALOGE("%s::sink:set format failed (PAD=%d)", __func__, sd_fmt.pad);
1547aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby            return -1;
1548aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        }
1549aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby
1550aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_fmt.pad   = MIXER_V_SUBDEV_PAD_SOURCE;
1551aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE;
1552aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.left   = gsc_handle->dst_img.x;
1553aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.top    = gsc_handle->dst_img.y;
1554aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.width  = gsc_handle->dst_img.w;
1555aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        sd_crop.rect.height = gsc_handle->dst_img.h;
1556aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        if (exynos_subdev_s_crop(gsc_handle->sink_sd_entity->fd, &sd_crop) < 0) {
1557aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby            ALOGE("%s::sink: subdev set crop failed(PAD=%d)", __func__, sd_crop.pad);
1558aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby            return -1;
1559aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby        }
1560aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby    }
1561aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby
156270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /*set GSC ctrls */
1563e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_ROTATE, rotate) < 0) {
15646134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_ROTATE: %d) failed", __func__,  rotate);
156570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
156670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
156770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1568e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_HFLIP, hflip) < 0) {
15696134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_HFLIP: %d) failed", __func__,  hflip);
157070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
157170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
157270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1573e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_VFLIP, vflip) < 0) {
15746134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_VFLIP: %d) failed", __func__,  vflip);
157570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
157670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
157770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1578e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang     if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_CACHEABLE, 1) < 0) {
15796134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_CACHEABLE: 1) failed", __func__);
158070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
158170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
158270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
15830db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim    if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd,
15840db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim        V4L2_CID_CONTENT_PROTECTION, gsc_handle->src_img.drmMode) < 0) {
15850db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CONTENT_PROTECTION) fail", __func__);
15860db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim        return -1;
15870db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim    }
15880db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim
1589bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann    if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_CSC_RANGE,
1590bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann            csc_range)) {
1591bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CSC_RANGE: %d) fail", __func__,
1592bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann                csc_range);
1593bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann        return -1;
1594bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann    }
1595bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann
159670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang      /* set src format  :GSC video dev*/
159770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.type  = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
159870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.fmt.pix_mp.width            = gsc_handle->src_img.fw;
159970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.fmt.pix_mp.height           = gsc_handle->src_img.fh;
160070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.fmt.pix_mp.pixelformat    = src_color_space;
160170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.fmt.pix_mp.field              = V4L2_FIELD_NONE;
160270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    fmt.fmt.pix_mp.num_planes   = src_planes;
1603e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
160470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_fmt(gsc_handle->gsc_vd_entity->fd, &fmt) < 0) {
16056134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::videodev set format failed", __func__);
160670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            return -1;
160770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
160870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
160970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* set src crop info :GSC video dev*/
161070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    crop.type     = fmt.type;
161170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    crop.c.left    = gsc_handle->src_img.x;
161270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    crop.c.top     = gsc_handle->src_img.y;
161370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    crop.c.width  = gsc_handle->src_img.w;
161470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    crop.c.height = gsc_handle->src_img.h;
161570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
161670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_s_crop(gsc_handle->gsc_vd_entity->fd, &crop) < 0) {
16176134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::videodev set crop failed", __func__);
161870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
161970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1620e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
162170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    reqbuf.type   = fmt.type;
1622776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    reqbuf.memory = V4L2_MEMORY_DMABUF;
162370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    reqbuf.count  = MAX_BUFFERS_GSCALER_OUT;
162470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
162570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_reqbufs(gsc_handle->gsc_vd_entity->fd, &reqbuf) < 0) {
16266134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::request buffers failed", __func__);
162770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
162870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1629e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1630e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1631e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
163270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
163370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
163470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
16355f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Gobystatic int exynos_gsc_out_run(void *handle,
16365f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    exynos_gsc_img *src_img)
163770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
163870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
163970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_plane  planes[NUM_OF_GSC_PLANES];
164070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_buffer buf;
164170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int32_t      src_color_space;
164270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int32_t      src_planes;
164370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int             i;
164470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    unsigned int plane_size[NUM_OF_GSC_PLANES];
164570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
164670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
164770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
16486134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
164970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
165070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
165170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
16525f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    /* All buffers have been queued, dequeue one */
16535f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    if (gsc_handle->src.qbuf_cnt == MAX_BUFFERS_GSCALER_OUT) {
16545f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        memset(&buf, 0, sizeof(struct v4l2_buffer));
16555f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        for (i = 0; i < MAX_BUFFERS_GSCALER_OUT; i++)
16565f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby            memset(&planes[i], 0, sizeof(struct v4l2_plane));
16575f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby
16585f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        buf.type     = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
16595f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        buf.memory   = V4L2_MEMORY_DMABUF;
16605f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        buf.length   = src_planes;
16615f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        buf.m.planes = planes;
16625f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby
16635f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        if (exynos_v4l2_dqbuf(gsc_handle->gsc_vd_entity->fd, &buf) < 0) {
16645f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby            ALOGE("%s::dequeue buffer failed (index=%d)(mSrcBufNum=%d)", __func__,
16655f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby                gsc_handle->src.src_buf_idx, MAX_BUFFERS_GSCALER_OUT);
16665f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby            return -1;
16675f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        }
16685f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        gsc_handle->src.qbuf_cnt--;
16695f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    }
16705f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby
167170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    memset(&buf, 0, sizeof(struct v4l2_buffer));
167270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < NUM_OF_GSC_PLANES; i++)
167370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        memset(&planes[i], 0, sizeof(struct v4l2_plane));
167470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
167570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(gsc_handle->src_img.format);
167670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_planes = get_yuv_planes(src_color_space);
167770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    src_planes = (src_planes == -1) ? 1 : src_planes;
167870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
167970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.type     = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1680776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    buf.memory   = V4L2_MEMORY_DMABUF;
16815f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    buf.flags    = V4L2_BUF_FLAG_USE_SYNC;
168270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.length   = src_planes;
168370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.index    = gsc_handle->src.src_buf_idx;
168470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    buf.m.planes = planes;
16855f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    buf.reserved = src_img->acquireFenceFd;
168670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
16875f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    gsc_handle->src.addr[0] = src_img->yaddr;
16885f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    gsc_handle->src.addr[1] = src_img->uaddr;
16895f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    gsc_handle->src.addr[2] = src_img->vaddr;
169070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
169170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (get_plane_size(src_color_space, plane_size,
169270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->src_img.fw * gsc_handle->src_img.fh, src_planes) != true) {
16936134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s:get_plane_size:fail", __func__);
169470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
169570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
169670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
169770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    for (i = 0; i < buf.length; i++) {
1698776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby        buf.m.planes[i].m.fd = (int)gsc_handle->src.addr[i];
169970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        buf.m.planes[i].length    = plane_size[i];
170070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        buf.m.planes[i].bytesused = plane_size[i];
170170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
170270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
170370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    /* Queue the buf */
170470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_qbuf(gsc_handle->gsc_vd_entity->fd, &buf) < 0) {
17056134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::queue buffer failed (index=%d)(mSrcBufNum=%d)", __func__,
170670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            gsc_handle->src.src_buf_idx, MAX_BUFFERS_GSCALER_OUT);
170770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
170870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
170970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.src_buf_idx++;
17105f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    gsc_handle->src.src_buf_idx = gsc_handle->src.src_buf_idx % MAX_BUFFERS_GSCALER_OUT;
171170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.qbuf_cnt++;
171270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
171370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->src.stream_on == false) {
17145f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        if (exynos_v4l2_streamon(gsc_handle->gsc_vd_entity->fd, buf.type) < 0) {
17155f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby            ALOGE("%s::stream on failed", __func__);
17165f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby            return -1;
171770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
17185f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        gsc_handle->src.stream_on = true;
171970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1720e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
17215f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    src_img->releaseFenceFd = buf.reserved;
17225f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    return 0;
172370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
172470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
172570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_out_stop(void *handle)
172670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
172770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
172870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_requestbuffers reqbuf;
172970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_buffer buf;
173070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct v4l2_plane  planes[NUM_OF_GSC_PLANES];
173170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int i;
173270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1733e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1734e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
173570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
173670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
17376134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
173870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
173970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1740e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
17415f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby    if (gsc_handle->src.stream_on == true) {
17425f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        if (exynos_v4l2_streamoff(gsc_handle->gsc_vd_entity->fd,
17435f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby                                V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) < 0) {
17445f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby            ALOGE("%s::stream off failed", __func__);
17455f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby            return -1;
17465f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        }
17475f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        gsc_handle->src.stream_on = false;
174870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
17495f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby
175070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.src_buf_idx = 0;
175170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->src.qbuf_cnt = 0;
175270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
175370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    reqbuf.type   = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1754776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby    reqbuf.memory = V4L2_MEMORY_DMABUF;
175570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    reqbuf.count  = 0;
175670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
175770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_v4l2_reqbufs(gsc_handle->gsc_vd_entity->fd, &reqbuf) < 0) {
17586134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::request buffers failed", __func__);
175970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
176070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
1761e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
1762e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
1763e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
176470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
176570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
176670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
17677b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songstatic int exynos_gsc_m2m_run_core(void *handle)
176870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
176970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
177033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    bool is_dirty;
177133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    bool is_drm;
17727b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
177370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
177470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1775e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
1776e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
177770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
17786134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
177970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
178070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
178170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
178233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    is_dirty = gsc_handle->src.dirty || gsc_handle->dst.dirty;
178333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    is_drm = gsc_handle->src.mode_drm;
178433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
178533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (is_dirty && (gsc_handle->src.mode_drm != gsc_handle->dst.mode_drm)) {
178633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        ALOGE("%s: drm mode mismatch between src and dst, gsc%d (s=%d d=%d)",
178733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin              __func__, gsc_handle->gsc_id, gsc_handle->src.mode_drm,
178833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin              gsc_handle->dst.mode_drm);
178933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        return -1;
179033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    } else if (is_drm && !gsc_handle->allow_drm) {
179133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        ALOGE("%s: drm mode is not supported on gsc%d", __func__,
179233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin              gsc_handle->gsc_id);
179333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        return -1;
179433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    }
1795e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
1796e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (m_exynos_gsc_check_src_size(&gsc_handle->src.width, &gsc_handle->src.height,
1797e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    &gsc_handle->src.crop_left, &gsc_handle->src.crop_top,
1798e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    &gsc_handle->src.crop_width, &gsc_handle->src.crop_height,
1799e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    gsc_handle->src.v4l2_colorformat) == false) {
1800e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::m_exynos_gsc_check_src_size() fail", __func__);
180133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        return -1;
1802e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    }
1803e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin
1804e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin    if (m_exynos_gsc_check_dst_size(&gsc_handle->dst.width, &gsc_handle->dst.height,
1805e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    &gsc_handle->dst.crop_left, &gsc_handle->dst.crop_top,
1806e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    &gsc_handle->dst.crop_width, &gsc_handle->dst.crop_height,
1807e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    gsc_handle->dst.v4l2_colorformat,
1808e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin                                    gsc_handle->dst.rotation) == false) {
1809e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin        ALOGE("%s::m_exynos_gsc_check_dst_size() fail", __func__);
181033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        return -1;
18115f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    }
181270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
181333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    /* dequeue buffers from previous work if necessary */
181433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (gsc_handle->src.stream_on == true) {
181533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        if (exynos_gsc_m2m_wait_frame_done(handle) < 0) {
181633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            ALOGE("%s::exynos_gsc_m2m_wait_frame_done fail", __func__);
181733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            return -1;
181833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        }
181933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    }
182033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
182133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    /*
182233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * need to set the content protection flag before doing reqbufs
182333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * in set_format
182433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     */
182533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (is_dirty && gsc_handle->allow_drm && is_drm) {
182633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        if (exynos_v4l2_s_ctrl(gsc_handle->gsc_fd,
182733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin                               V4L2_CID_CONTENT_PROTECTION, is_drm) < 0) {
182833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            ALOGE("%s::exynos_v4l2_s_ctrl() fail", __func__);
182933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            return -1;
183033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        }
183133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    }
183233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
183333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    /*
183433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * from this point on, we have to ensure to call stop to clean up whatever
183533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * state we have set.
183633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     */
183733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
1838e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann    if (gsc_handle->src.dirty) {
1839e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann        if (m_exynos_gsc_set_format(gsc_handle->gsc_fd, &gsc_handle->src) == false) {
1840e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann            ALOGE("%s::m_exynos_gsc_set_format(src) fail", __func__);
1841e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann            goto done;
1842e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann        }
1843e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann        gsc_handle->src.dirty = false;
18445f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    }
184570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
1846e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann    if (gsc_handle->dst.dirty) {
1847e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann        if (m_exynos_gsc_set_format(gsc_handle->gsc_fd, &gsc_handle->dst) == false) {
1848e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann            ALOGE("%s::m_exynos_gsc_set_format(dst) fail", __func__);
1849e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann            goto done;
1850e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann        }
1851e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann        gsc_handle->dst.dirty = false;
18525f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    }
185370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
185433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    /* if we are enabling drm, make sure to enable hw protection.
185533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * Need to do this before queuing buffers so that the mmu is reserved
185633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * and power domain is kept on.
185733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     */
185833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (is_dirty && gsc_handle->allow_drm && is_drm) {
185933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        unsigned int protect_id = 0;
186033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
186133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        if (gsc_handle->gsc_id == 0) {
186233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            protect_id = CP_PROTECT_GSC0;
186333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        } else if (gsc_handle->gsc_id == 3) {
186433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            protect_id = CP_PROTECT_GSC3;
186533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        } else {
186633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            ALOGE("%s::invalid gscaler id %d for content protection", __func__,
186733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin                  gsc_handle->gsc_id);
186833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            goto done;
186933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        }
187033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
187133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        if (CP_Enable_Path_Protection(protect_id) != 0) {
187233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            ALOGE("%s::CP_Enable_Path_Protection failed", __func__);
18739f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby            goto done;
18749f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        }
187533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        gsc_handle->protection_enabled = true;
18769f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    }
18779f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby
18785f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    if (m_exynos_gsc_set_addr(gsc_handle->gsc_fd, &gsc_handle->src) == false) {
18795f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        ALOGE("%s::m_exynos_gsc_set_addr(src) fail", __func__);
18805f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        goto done;
18815f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    }
188270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
18835f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim    if (m_exynos_gsc_set_addr(gsc_handle->gsc_fd, &gsc_handle->dst) == false) {
18845f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        ALOGE("%s::m_exynos_gsc_set_addr(dst) fail", __func__);
18855f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim        goto done;
188670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
188770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
188870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->src.stream_on == false) {
188970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_v4l2_streamon(gsc_handle->gsc_fd, gsc_handle->src.buf_type) < 0) {
18906134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_v4l2_streamon(src) fail", __func__);
189170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            goto done;
189270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
189370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->src.stream_on = true;
189470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
189570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
189670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->dst.stream_on == false) {
189770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (exynos_v4l2_streamon(gsc_handle->gsc_fd, gsc_handle->dst.buf_type) < 0) {
18986134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::exynos_v4l2_streamon(dst) fail", __func__);
189970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            goto done;
190070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
190170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        gsc_handle->dst.stream_on = true;
190270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
190370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
19047b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_Out();
19057b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
19067b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    return 0;
19077b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
19087b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songdone:
190933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    exynos_gsc_m2m_stop(handle);
19107b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    return -1;
19117b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song}
19127b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
19137b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songstatic int exynos_gsc_m2m_wait_frame_done(void *handle)
19147b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song{
19157b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    struct GSC_HANDLE *gsc_handle;
19167b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
19177b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    gsc_handle = (struct GSC_HANDLE *)handle;
19187b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
19197b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_In();
19207b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
19217b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (handle == NULL) {
19227b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::handle == NULL() fail", __func__);
19237b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
19247b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
19257b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
19267b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if ((gsc_handle->src.stream_on == false) || (gsc_handle->dst.stream_on == false)) {
19277b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s:: src_strean_on or dst_stream_on are false", __func__);
19287b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
19297b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
19307b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
19319f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    if (gsc_handle->src.buffer_queued) {
19329f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        if (exynos_v4l2_dqbuf(gsc_handle->gsc_fd, &gsc_handle->src.buffer) < 0) {
19339f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby            ALOGE("%s::exynos_v4l2_dqbuf(src) fail", __func__);
19349f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby            return -1;
19359f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        }
19369f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        gsc_handle->src.buffer_queued = false;
193770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
193870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
19399f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    if (gsc_handle->dst.buffer_queued) {
19409f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        if (exynos_v4l2_dqbuf(gsc_handle->gsc_fd, &gsc_handle->dst.buffer) < 0) {
19419f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby            ALOGE("%s::exynos_v4l2_dqbuf(dst) fail", __func__);
19429f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby            return -1;
19439f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        }
19449f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        gsc_handle->dst.buffer_queued = false;
19457b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
19467b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
194743b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    Exynos_gsc_Out();
194843b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
194943b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    return 0;
195043b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann}
195143b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
195243b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmannstatic int exynos_gsc_m2m_stop(void *handle)
195343b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann{
195443b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    struct GSC_HANDLE *gsc_handle;
195543b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    struct v4l2_requestbuffers req_buf;
195633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    int ret = 0;
195743b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
195843b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    gsc_handle = (struct GSC_HANDLE *)handle;
195943b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
196043b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    Exynos_gsc_In();
196143b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
196233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (!gsc_handle->src.stream_on && !gsc_handle->dst.stream_on) {
196333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        /* wasn't streaming, return success */
196433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        return 0;
196533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    } else if (gsc_handle->src.stream_on != gsc_handle->dst.stream_on) {
196633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        ALOGE("%s: invalid state, queue stream state doesn't match (%d != %d)",
196733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin              __func__, gsc_handle->src.stream_on, gsc_handle->dst.stream_on);
196833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        ret = -1;
196933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    }
197033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
197133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    /*
197233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * we need to plow forward on errors below to make sure that if we had
197333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * turned on content protection on secure side, we turn it off.
197433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     *
197533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * also, if we only failed to turn on one of the streams, we'll turn
197633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     * the other one off correctly.
197733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin     */
197833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (gsc_handle->src.stream_on == true) {
197933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        if (exynos_v4l2_streamoff(gsc_handle->gsc_fd, gsc_handle->src.buf_type) < 0) {
198033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            ALOGE("%s::exynos_v4l2_streamoff(src) fail", __func__);
198133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            ret = -1;
198233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        }
198333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        gsc_handle->src.stream_on = false;
19847b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
19857b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
198633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
198733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (gsc_handle->dst.stream_on == true) {
198833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        if (exynos_v4l2_streamoff(gsc_handle->gsc_fd, gsc_handle->dst.buf_type) < 0) {
198933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            ALOGE("%s::exynos_v4l2_streamoff(dst) fail", __func__);
199033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            ret = -1;
199133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        }
199233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        gsc_handle->dst.stream_on = false;
199333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    }
199433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
199533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    /* if drm is enabled */
199633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (gsc_handle->allow_drm && gsc_handle->protection_enabled) {
199733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        unsigned int protect_id = 0;
199833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
199933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        if (gsc_handle->gsc_id == 0)
200033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            protect_id = CP_PROTECT_GSC0;
200133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        else if (gsc_handle->gsc_id == 3)
200233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin            protect_id = CP_PROTECT_GSC3;
200333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
200433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        CP_Disable_Path_Protection(protect_id);
200533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        gsc_handle->protection_enabled = false;
200633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    }
200733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin
200833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    if (exynos_v4l2_s_ctrl(gsc_handle->gsc_fd,
200933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin                           V4L2_CID_CONTENT_PROTECTION, 0) < 0) {
201033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CONTENT_PROTECTION) fail",
201133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin              __func__);
201233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        ret = -1;
20137b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
20147b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20157b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    /* src: clear_buf */
20167b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.count  = 0;
20177b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.type   = gsc_handle->src.buf_type;
20187b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.memory = V4L2_MEMORY_DMABUF;
20197b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (exynos_v4l2_reqbufs(gsc_handle->gsc_fd, &req_buf) < 0) {
20207b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::exynos_v4l2_reqbufs():src: fail", __func__);
202133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        ret = -1;
20227b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
20237b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20247b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    /* dst: clear_buf */
20257b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.count  = 0;
20267b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.type   = gsc_handle->dst.buf_type;
20277b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    req_buf.memory = V4L2_MEMORY_DMABUF;
20287b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (exynos_v4l2_reqbufs(gsc_handle->gsc_fd, &req_buf) < 0) {
20297b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::exynos_v4l2_reqbufs():dst: fail", __func__);
203033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin        ret = -1;
20317b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
20327b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20337b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_Out();
20347b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
203533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin    return ret;
20367b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song}
20377b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20387b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songint exynos_gsc_convert(
20397b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    void *handle)
20407b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song{
20417b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    struct GSC_HANDLE *gsc_handle;
20427b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    int ret    = -1;
20437b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    gsc_handle = (struct GSC_HANDLE *)handle;
20447b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20457b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_In();
20467b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20477b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (handle == NULL) {
20487b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::handle == NULL() fail", __func__);
20497b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
20507b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    }
20517b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20527b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    exynos_mutex_lock(gsc_handle->op_mutex);
20537b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20547b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (gsc_handle->flag_local_path == true) {
20557b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::this exynos_gsc is connected by another hw internaly. So, don't call exynos_gsc_convert()", __func__);
20567b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song            goto done;
20577b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        }
20587b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20597b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (exynos_gsc_m2m_run_core(handle) < 0) {
20607b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::exynos_gsc_run_core fail", __func__);
20617b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song            goto done;
20627b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        }
20637b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
20647b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    if (exynos_gsc_m2m_wait_frame_done(handle) < 0) {
20657b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::exynos_gsc_m2m_wait_frame_done", __func__);
206670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        goto done;
206770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
206870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
20699f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    if (gsc_handle->src.releaseFenceFd >= 0) {
20709f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        close(gsc_handle->src.releaseFenceFd);
20719f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        gsc_handle->src.releaseFenceFd = -1;
20729f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    }
20739f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby
20749f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    if (gsc_handle->dst.releaseFenceFd >= 0) {
20759f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        close(gsc_handle->dst.releaseFenceFd);
20769f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby        gsc_handle->dst.releaseFenceFd = -1;
20779f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    }
20789f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby
207943b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    if (exynos_gsc_m2m_stop(handle) < 0) {
208043b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann        ALOGE("%s::exynos_gsc_m2m_stop", __func__);
208143b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann        goto done;
208243b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    }
208343b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
208470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    ret = 0;
208570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
208670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changdone:
208770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (gsc_handle->flag_exclusive_open == false) {
208870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (gsc_handle->flag_local_path == false)
208970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
209070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
209170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
209270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
209370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
2094e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
2095e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
209670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
209770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
209870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
2099e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changint exynos_gsc_m2m_run(void *handle,
2100e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *src_img,
2101e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *dst_img)
2102e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang{
21039f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    struct GSC_HANDLE *gsc_handle = handle;
2104e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    void *addr[3] = {NULL, NULL, NULL};
2105e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    int ret = 0;
2106e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2107e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
2108e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2109e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[0] = (void *)src_img->yaddr;
2110e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[1] = (void *)src_img->uaddr;
2111e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[2] = (void *)src_img->vaddr;
21129f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    ret = exynos_gsc_set_src_addr(handle, addr, src_img->acquireFenceFd);
2113e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (ret < 0) {
2114e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ALOGE("%s::fail: exynos_gsc_set_src_addr[%x %x %x]", __func__,
2115e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            (unsigned int)addr[0], (unsigned int)addr[1], (unsigned int)addr[2]);
21167b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
2117e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
2118e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2119e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[0] = (void *)dst_img->yaddr;
2120e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[1] = (void *)dst_img->uaddr;
2121e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    addr[2] = (void *)dst_img->vaddr;
21229f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    ret = exynos_gsc_set_dst_addr(handle, addr, dst_img->acquireFenceFd);
2123e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    if (ret < 0) {
2124e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ALOGE("%s::fail: exynos_gsc_set_dst_addr[%x %x %x]", __func__,
2125e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang            (unsigned int)addr[0], (unsigned int)addr[1], (unsigned int)addr[2]);
21267b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
2127e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
2128e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
21297b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    ret = exynos_gsc_m2m_run_core(handle);
2130e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang     if (ret < 0) {
21317b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        ALOGE("%s::fail: exynos_gsc_m2m_run_core", __func__);
21327b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song        return -1;
2133e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    }
2134e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2135de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby    if (src_img->acquireFenceFd >= 0) {
2136de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby        close(src_img->acquireFenceFd);
2137de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby        src_img->acquireFenceFd = -1;
2138de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby    }
2139de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby
2140de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby    if (dst_img->acquireFenceFd >= 0) {
2141de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby        close(dst_img->acquireFenceFd);
2142de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby        dst_img->acquireFenceFd = -1;
2143de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby    }
2144de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby
21459f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    src_img->releaseFenceFd = gsc_handle->src.releaseFenceFd;
21469f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby    dst_img->releaseFenceFd = gsc_handle->dst.releaseFenceFd;
21479f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby
2148e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
2149e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2150e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    return 0;
2151e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang}
2152e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
215370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_config_exclusive(void *handle,
2154e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *src_img,
2155e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *dst_img)
215670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
2157e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2158e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
2159e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
216070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang     struct GSC_HANDLE *gsc_handle;
216170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret = 0;
216270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
216370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
21646134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
216570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
216670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
216770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
216870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (gsc_handle->gsc_mode) {
216970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_M2M_MODE:
2170e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ret = exynos_gsc_m2m_config(handle, src_img, dst_img);
217170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
217270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_OUTPUT_MODE:
217370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        ret = exynos_gsc_out_config(handle, src_img, dst_img);
217470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
217570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case  GSC_CAPTURE_MODE:
217670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        //to do
217770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
217870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
217970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
218070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
2181e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2182e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
2183e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
218470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
218570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
218670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
218770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
218870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_run_exclusive(void *handle,
2189e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *src_img,
2190e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    exynos_gsc_img *dst_img)
219170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
219270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
219370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret = 0;
21947b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
21957b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_In();
21967b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
219770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
219870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
21996134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
220070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
220170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
220270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
220370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (gsc_handle->gsc_mode) {
220470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_M2M_MODE:
2205e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        ret = exynos_gsc_m2m_run(handle, src_img, dst_img);
220670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
220770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_OUTPUT_MODE:
22085f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby        ret = exynos_gsc_out_run(handle, src_img);
220970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
221070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case  GSC_CAPTURE_MODE:
221170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        //to do
221270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
221370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
221470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
221570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
22167b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
22177b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song    Exynos_gsc_Out();
22187b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song
221970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
222070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
222170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
222243b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmannint exynos_gsc_wait_frame_done_exclusive(void *handle)
222343b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann{
222443b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    struct GSC_HANDLE *gsc_handle;
222543b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    int ret = 0;
222643b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    gsc_handle = (struct GSC_HANDLE *)handle;
222743b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
222843b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    Exynos_gsc_In();
222943b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
223043b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    if (handle == NULL) {
223143b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann        ALOGE("%s::handle == NULL() fail", __func__);
223243b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann        return -1;
223343b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    }
223443b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
223543b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    if (gsc_handle->gsc_mode == GSC_M2M_MODE)
223643b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann        ret = exynos_gsc_m2m_wait_frame_done(handle);
223743b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
223843b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    Exynos_gsc_Out();
223943b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
224043b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann    return ret;
224143b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann}
224243b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann
224370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_stop_exclusive(void *handle)
224470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
224570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
224670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret = 0;
224770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
2248e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2249e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
2250e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
225170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
22526134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
225370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
225470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
225570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
225670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    switch (gsc_handle->gsc_mode) {
225770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_M2M_MODE:
225843b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann        ret = exynos_gsc_m2m_stop(handle);
225970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
226070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case GSC_OUTPUT_MODE:
226170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        ret = exynos_gsc_out_stop(handle);
226270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
226370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    case  GSC_CAPTURE_MODE:
226470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        //to do
226570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        break;
226670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    default:
2267e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang        break;
226870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
2269e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
2270e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
2271e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
227270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
227370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
227470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
227570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_connect(
227670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle,
227770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *hw)
227870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
227970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
228070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    int ret    = -1;
228170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
228270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
2283e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
2284e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
228570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
22866134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
228770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
228870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
228970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
229070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
229170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
229270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_local_path = true;
229370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
229470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (exynos_mutex_trylock(gsc_handle->cur_obj_mutex) == false) {
229570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        if (m_exynos_gsc_find_and_trylock_and_create(gsc_handle) == false) {
22966134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin            ALOGE("%s::m_exynos_gsc_find_and_trylock_and_create() fail", __func__);
229770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang            goto done;
229870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        }
229970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
230070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
230170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    ret = 0;
230270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
2303e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
2304e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
230570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changdone:
230670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
230770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
230870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return ret;
230970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
231070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
231170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_disconnect(
231270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *handle,
231370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    void *hw)
231470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{
231570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    struct GSC_HANDLE *gsc_handle;
231670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle = (struct GSC_HANDLE *)handle;
231770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
2318e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_In();
2319e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
232070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    if (handle == NULL) {
23216134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin        ALOGE("%s::handle == NULL() fail", __func__);
232270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang        return -1;
232370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    }
232470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
232570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_lock(gsc_handle->op_mutex);
232670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
232770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    gsc_handle->flag_local_path = false;
232870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
232970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->cur_obj_mutex);
233070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
233170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    exynos_mutex_unlock(gsc_handle->op_mutex);
233270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang
2333e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang    Exynos_gsc_Out();
2334e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang
233570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang    return 0;
233670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}
2337