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