1f5fbb83fSMauro Carvalho Chehab // SPDX-License-Identifier: GPL-2.0 29d4fa1a1SMauro Carvalho Chehab /* 39d4fa1a1SMauro Carvalho Chehab * Support for Intel Camera Imaging ISP subsystem. 49d4fa1a1SMauro Carvalho Chehab * Copyright (c) 2015, Intel Corporation. 59d4fa1a1SMauro Carvalho Chehab * 69d4fa1a1SMauro Carvalho Chehab * This program is free software; you can redistribute it and/or modify it 79d4fa1a1SMauro Carvalho Chehab * under the terms and conditions of the GNU General Public License, 89d4fa1a1SMauro Carvalho Chehab * version 2, as published by the Free Software Foundation. 99d4fa1a1SMauro Carvalho Chehab * 109d4fa1a1SMauro Carvalho Chehab * This program is distributed in the hope it will be useful, but WITHOUT 119d4fa1a1SMauro Carvalho Chehab * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 129d4fa1a1SMauro Carvalho Chehab * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 139d4fa1a1SMauro Carvalho Chehab * more details. 149d4fa1a1SMauro Carvalho Chehab */ 159d4fa1a1SMauro Carvalho Chehab 16662fb4fcSMauro Carvalho Chehab #include <linux/string.h> /* for memcpy() */ 17662fb4fcSMauro Carvalho Chehab 189d4fa1a1SMauro Carvalho Chehab #include "system_global.h" 199d4fa1a1SMauro Carvalho Chehab 20641c2292SMauro Carvalho Chehab #ifdef ISP2401 219d4fa1a1SMauro Carvalho Chehab 229d4fa1a1SMauro Carvalho Chehab #include "ia_css_isys.h" 239d4fa1a1SMauro Carvalho Chehab #include "ia_css_debug.h" 249d4fa1a1SMauro Carvalho Chehab #include "math_support.h" 259d4fa1a1SMauro Carvalho Chehab #include "virtual_isys.h" 269d4fa1a1SMauro Carvalho Chehab #include "isp.h" 279d4fa1a1SMauro Carvalho Chehab #include "sh_css_defs.h" 289d4fa1a1SMauro Carvalho Chehab 299d4fa1a1SMauro Carvalho Chehab /************************************************* 309d4fa1a1SMauro Carvalho Chehab * 319d4fa1a1SMauro Carvalho Chehab * Forwarded Declaration 329d4fa1a1SMauro Carvalho Chehab * 339d4fa1a1SMauro Carvalho Chehab *************************************************/ 349d4fa1a1SMauro Carvalho Chehab 359d4fa1a1SMauro Carvalho Chehab static bool create_input_system_channel( 36284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *cfg, 379d4fa1a1SMauro Carvalho Chehab bool metadata, 389d4fa1a1SMauro Carvalho Chehab input_system_channel_t *channel); 399d4fa1a1SMauro Carvalho Chehab 409d4fa1a1SMauro Carvalho Chehab static void destroy_input_system_channel( 419d4fa1a1SMauro Carvalho Chehab input_system_channel_t *channel); 429d4fa1a1SMauro Carvalho Chehab 439d4fa1a1SMauro Carvalho Chehab static bool create_input_system_input_port( 44284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *cfg, 459d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *input_port); 469d4fa1a1SMauro Carvalho Chehab 479d4fa1a1SMauro Carvalho Chehab static void destroy_input_system_input_port( 489d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *input_port); 499d4fa1a1SMauro Carvalho Chehab 509d4fa1a1SMauro Carvalho Chehab static bool calculate_input_system_channel_cfg( 519d4fa1a1SMauro Carvalho Chehab input_system_channel_t *channel, 529d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *input_port, 53284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *isys_cfg, 549d4fa1a1SMauro Carvalho Chehab input_system_channel_cfg_t *channel_cfg, 559d4fa1a1SMauro Carvalho Chehab bool metadata); 569d4fa1a1SMauro Carvalho Chehab 579d4fa1a1SMauro Carvalho Chehab static bool calculate_input_system_input_port_cfg( 589d4fa1a1SMauro Carvalho Chehab input_system_channel_t *channel, 599d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *input_port, 60284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *isys_cfg, 619d4fa1a1SMauro Carvalho Chehab input_system_input_port_cfg_t *input_port_cfg); 629d4fa1a1SMauro Carvalho Chehab 639d4fa1a1SMauro Carvalho Chehab static bool acquire_sid( 649d4fa1a1SMauro Carvalho Chehab stream2mmio_ID_t stream2mmio, 659d4fa1a1SMauro Carvalho Chehab stream2mmio_sid_ID_t *sid); 669d4fa1a1SMauro Carvalho Chehab 679d4fa1a1SMauro Carvalho Chehab static void release_sid( 689d4fa1a1SMauro Carvalho Chehab stream2mmio_ID_t stream2mmio, 699d4fa1a1SMauro Carvalho Chehab stream2mmio_sid_ID_t *sid); 709d4fa1a1SMauro Carvalho Chehab 719d4fa1a1SMauro Carvalho Chehab static bool acquire_ib_buffer( 729d4fa1a1SMauro Carvalho Chehab s32 bits_per_pixel, 739d4fa1a1SMauro Carvalho Chehab s32 pixels_per_line, 749d4fa1a1SMauro Carvalho Chehab s32 lines_per_frame, 759d4fa1a1SMauro Carvalho Chehab s32 align_in_bytes, 769d4fa1a1SMauro Carvalho Chehab bool online, 77284be891SMauro Carvalho Chehab isp2401_ib_buffer_t *buf); 789d4fa1a1SMauro Carvalho Chehab 799d4fa1a1SMauro Carvalho Chehab static void release_ib_buffer( 80284be891SMauro Carvalho Chehab isp2401_ib_buffer_t *buf); 819d4fa1a1SMauro Carvalho Chehab 829d4fa1a1SMauro Carvalho Chehab static bool acquire_dma_channel( 839d4fa1a1SMauro Carvalho Chehab isys2401_dma_ID_t dma_id, 849d4fa1a1SMauro Carvalho Chehab isys2401_dma_channel *channel); 859d4fa1a1SMauro Carvalho Chehab 869d4fa1a1SMauro Carvalho Chehab static void release_dma_channel( 879d4fa1a1SMauro Carvalho Chehab isys2401_dma_ID_t dma_id, 889d4fa1a1SMauro Carvalho Chehab isys2401_dma_channel *channel); 899d4fa1a1SMauro Carvalho Chehab 909d4fa1a1SMauro Carvalho Chehab static bool acquire_be_lut_entry( 919d4fa1a1SMauro Carvalho Chehab csi_rx_backend_ID_t backend, 929d4fa1a1SMauro Carvalho Chehab csi_mipi_packet_type_t packet_type, 939d4fa1a1SMauro Carvalho Chehab csi_rx_backend_lut_entry_t *entry); 949d4fa1a1SMauro Carvalho Chehab 959d4fa1a1SMauro Carvalho Chehab static void release_be_lut_entry( 969d4fa1a1SMauro Carvalho Chehab csi_rx_backend_ID_t backend, 979d4fa1a1SMauro Carvalho Chehab csi_mipi_packet_type_t packet_type, 989d4fa1a1SMauro Carvalho Chehab csi_rx_backend_lut_entry_t *entry); 999d4fa1a1SMauro Carvalho Chehab 1009d4fa1a1SMauro Carvalho Chehab static bool calculate_tpg_cfg( 1019d4fa1a1SMauro Carvalho Chehab input_system_channel_t *channel, 1029d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *input_port, 103284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *isys_cfg, 1049d4fa1a1SMauro Carvalho Chehab pixelgen_tpg_cfg_t *cfg); 1059d4fa1a1SMauro Carvalho Chehab 1069d4fa1a1SMauro Carvalho Chehab static bool calculate_prbs_cfg( 1079d4fa1a1SMauro Carvalho Chehab input_system_channel_t *channel, 1089d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *input_port, 109284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *isys_cfg, 1109d4fa1a1SMauro Carvalho Chehab pixelgen_prbs_cfg_t *cfg); 1119d4fa1a1SMauro Carvalho Chehab 1129d4fa1a1SMauro Carvalho Chehab static bool calculate_fe_cfg( 113284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 1149d4fa1a1SMauro Carvalho Chehab csi_rx_frontend_cfg_t *cfg); 1159d4fa1a1SMauro Carvalho Chehab 1169d4fa1a1SMauro Carvalho Chehab static bool calculate_be_cfg( 1179d4fa1a1SMauro Carvalho Chehab const input_system_input_port_t *input_port, 118284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 1199d4fa1a1SMauro Carvalho Chehab bool metadata, 1209d4fa1a1SMauro Carvalho Chehab csi_rx_backend_cfg_t *cfg); 1219d4fa1a1SMauro Carvalho Chehab 1229d4fa1a1SMauro Carvalho Chehab static bool calculate_stream2mmio_cfg( 123284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 1249d4fa1a1SMauro Carvalho Chehab bool metadata, 1259d4fa1a1SMauro Carvalho Chehab stream2mmio_cfg_t *cfg); 1269d4fa1a1SMauro Carvalho Chehab 1279d4fa1a1SMauro Carvalho Chehab static bool calculate_ibuf_ctrl_cfg( 1289d4fa1a1SMauro Carvalho Chehab const input_system_channel_t *channel, 1299d4fa1a1SMauro Carvalho Chehab const input_system_input_port_t *input_port, 130284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 1319d4fa1a1SMauro Carvalho Chehab ibuf_ctrl_cfg_t *cfg); 1329d4fa1a1SMauro Carvalho Chehab 1339d4fa1a1SMauro Carvalho Chehab static bool calculate_isys2401_dma_cfg( 1349d4fa1a1SMauro Carvalho Chehab const input_system_channel_t *channel, 135284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 1369d4fa1a1SMauro Carvalho Chehab isys2401_dma_cfg_t *cfg); 1379d4fa1a1SMauro Carvalho Chehab 1389d4fa1a1SMauro Carvalho Chehab static bool calculate_isys2401_dma_port_cfg( 139284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 1409d4fa1a1SMauro Carvalho Chehab bool raw_packed, 1419d4fa1a1SMauro Carvalho Chehab bool metadata, 1429d4fa1a1SMauro Carvalho Chehab isys2401_dma_port_cfg_t *cfg); 1439d4fa1a1SMauro Carvalho Chehab 1449d4fa1a1SMauro Carvalho Chehab static csi_mipi_packet_type_t get_csi_mipi_packet_type( 1459d4fa1a1SMauro Carvalho Chehab int32_t data_type); 1469d4fa1a1SMauro Carvalho Chehab 1479d4fa1a1SMauro Carvalho Chehab static int32_t calculate_stride( 1489d4fa1a1SMauro Carvalho Chehab s32 bits_per_pixel, 1499d4fa1a1SMauro Carvalho Chehab s32 pixels_per_line, 1509d4fa1a1SMauro Carvalho Chehab bool raw_packed, 1519d4fa1a1SMauro Carvalho Chehab int32_t align_in_bytes); 1529d4fa1a1SMauro Carvalho Chehab 1539d4fa1a1SMauro Carvalho Chehab /* end of Forwarded Declaration */ 1549d4fa1a1SMauro Carvalho Chehab 1559d4fa1a1SMauro Carvalho Chehab /************************************************** 1569d4fa1a1SMauro Carvalho Chehab * 1579d4fa1a1SMauro Carvalho Chehab * Public Methods 1589d4fa1a1SMauro Carvalho Chehab * 1599d4fa1a1SMauro Carvalho Chehab **************************************************/ 1609d4fa1a1SMauro Carvalho Chehab ia_css_isys_error_t ia_css_isys_stream_create( 1619d4fa1a1SMauro Carvalho Chehab ia_css_isys_descr_t *isys_stream_descr, 1629d4fa1a1SMauro Carvalho Chehab ia_css_isys_stream_h isys_stream, 1639d4fa1a1SMauro Carvalho Chehab uint32_t isys_stream_id) 1649d4fa1a1SMauro Carvalho Chehab { 1659d4fa1a1SMauro Carvalho Chehab ia_css_isys_error_t rc; 1669d4fa1a1SMauro Carvalho Chehab 1679d4fa1a1SMauro Carvalho Chehab if (!isys_stream_descr || !isys_stream || 1689d4fa1a1SMauro Carvalho Chehab isys_stream_id >= SH_CSS_MAX_ISYS_CHANNEL_NODES) 1699d4fa1a1SMauro Carvalho Chehab return false; 1709d4fa1a1SMauro Carvalho Chehab 1719d4fa1a1SMauro Carvalho Chehab ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, 1729d4fa1a1SMauro Carvalho Chehab "ia_css_isys_stream_create() enter:\n"); 1739d4fa1a1SMauro Carvalho Chehab 1749d4fa1a1SMauro Carvalho Chehab /*Reset isys_stream to 0*/ 1759d4fa1a1SMauro Carvalho Chehab memset(isys_stream, 0, sizeof(*isys_stream)); 1769d4fa1a1SMauro Carvalho Chehab isys_stream->enable_metadata = isys_stream_descr->metadata.enable; 1779d4fa1a1SMauro Carvalho Chehab isys_stream->id = isys_stream_id; 1789d4fa1a1SMauro Carvalho Chehab 1799d4fa1a1SMauro Carvalho Chehab isys_stream->linked_isys_stream_id = isys_stream_descr->linked_isys_stream_id; 1809d4fa1a1SMauro Carvalho Chehab rc = create_input_system_input_port(isys_stream_descr, 1819d4fa1a1SMauro Carvalho Chehab &isys_stream->input_port); 182*c606970dSAditya Srivastava if (!rc) 1839d4fa1a1SMauro Carvalho Chehab return false; 1849d4fa1a1SMauro Carvalho Chehab 1859d4fa1a1SMauro Carvalho Chehab rc = create_input_system_channel(isys_stream_descr, false, 1869d4fa1a1SMauro Carvalho Chehab &isys_stream->channel); 187*c606970dSAditya Srivastava if (!rc) { 1889d4fa1a1SMauro Carvalho Chehab destroy_input_system_input_port(&isys_stream->input_port); 1899d4fa1a1SMauro Carvalho Chehab return false; 1909d4fa1a1SMauro Carvalho Chehab } 1919d4fa1a1SMauro Carvalho Chehab 1929d4fa1a1SMauro Carvalho Chehab #ifdef ISP2401 1939d4fa1a1SMauro Carvalho Chehab /* 1949d4fa1a1SMauro Carvalho Chehab * Early polling is required for timestamp accuracy in certain cause. 1959d4fa1a1SMauro Carvalho Chehab * The ISYS HW polling is started on 1969d4fa1a1SMauro Carvalho Chehab * ia_css_isys_stream_capture_indication() instead of 1979d4fa1a1SMauro Carvalho Chehab * ia_css_pipeline_sp_wait_for_isys_stream_N() as isp processing of 1989d4fa1a1SMauro Carvalho Chehab * capture takes longer than getting an ISYS frame 1999d4fa1a1SMauro Carvalho Chehab */ 2009d4fa1a1SMauro Carvalho Chehab isys_stream->polling_mode = isys_stream_descr->polling_mode; 2019d4fa1a1SMauro Carvalho Chehab 2029d4fa1a1SMauro Carvalho Chehab #endif 2039d4fa1a1SMauro Carvalho Chehab /* create metadata channel */ 2049d4fa1a1SMauro Carvalho Chehab if (isys_stream_descr->metadata.enable) { 2059d4fa1a1SMauro Carvalho Chehab rc = create_input_system_channel(isys_stream_descr, true, 2069d4fa1a1SMauro Carvalho Chehab &isys_stream->md_channel); 207*c606970dSAditya Srivastava if (!rc) { 2089d4fa1a1SMauro Carvalho Chehab destroy_input_system_input_port(&isys_stream->input_port); 2099d4fa1a1SMauro Carvalho Chehab destroy_input_system_channel(&isys_stream->channel); 2109d4fa1a1SMauro Carvalho Chehab return false; 2119d4fa1a1SMauro Carvalho Chehab } 2129d4fa1a1SMauro Carvalho Chehab } 2139d4fa1a1SMauro Carvalho Chehab ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, 2149d4fa1a1SMauro Carvalho Chehab "ia_css_isys_stream_create() leave:\n"); 2159d4fa1a1SMauro Carvalho Chehab 2169d4fa1a1SMauro Carvalho Chehab return true; 2179d4fa1a1SMauro Carvalho Chehab } 2189d4fa1a1SMauro Carvalho Chehab 2199d4fa1a1SMauro Carvalho Chehab void ia_css_isys_stream_destroy( 2209d4fa1a1SMauro Carvalho Chehab ia_css_isys_stream_h isys_stream) 2219d4fa1a1SMauro Carvalho Chehab { 2229d4fa1a1SMauro Carvalho Chehab destroy_input_system_input_port(&isys_stream->input_port); 2239d4fa1a1SMauro Carvalho Chehab destroy_input_system_channel(&isys_stream->channel); 2249d4fa1a1SMauro Carvalho Chehab if (isys_stream->enable_metadata) { 2259d4fa1a1SMauro Carvalho Chehab /* Destroy metadata channel only if its allocated*/ 2269d4fa1a1SMauro Carvalho Chehab destroy_input_system_channel(&isys_stream->md_channel); 2279d4fa1a1SMauro Carvalho Chehab } 2289d4fa1a1SMauro Carvalho Chehab } 2299d4fa1a1SMauro Carvalho Chehab 2309d4fa1a1SMauro Carvalho Chehab ia_css_isys_error_t ia_css_isys_stream_calculate_cfg( 2319d4fa1a1SMauro Carvalho Chehab ia_css_isys_stream_h isys_stream, 2329d4fa1a1SMauro Carvalho Chehab ia_css_isys_descr_t *isys_stream_descr, 2339d4fa1a1SMauro Carvalho Chehab ia_css_isys_stream_cfg_t *isys_stream_cfg) 2349d4fa1a1SMauro Carvalho Chehab { 2359d4fa1a1SMauro Carvalho Chehab ia_css_isys_error_t rc; 2369d4fa1a1SMauro Carvalho Chehab 2379d4fa1a1SMauro Carvalho Chehab if (!isys_stream_cfg || 2389d4fa1a1SMauro Carvalho Chehab !isys_stream_descr || 2399d4fa1a1SMauro Carvalho Chehab !isys_stream) 2409d4fa1a1SMauro Carvalho Chehab return false; 2419d4fa1a1SMauro Carvalho Chehab 2429d4fa1a1SMauro Carvalho Chehab ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, 2439d4fa1a1SMauro Carvalho Chehab "ia_css_isys_stream_calculate_cfg() enter:\n"); 2449d4fa1a1SMauro Carvalho Chehab 2459d4fa1a1SMauro Carvalho Chehab rc = calculate_input_system_channel_cfg( 2469d4fa1a1SMauro Carvalho Chehab &isys_stream->channel, 2479d4fa1a1SMauro Carvalho Chehab &isys_stream->input_port, 2489d4fa1a1SMauro Carvalho Chehab isys_stream_descr, 2499d4fa1a1SMauro Carvalho Chehab &isys_stream_cfg->channel_cfg, 2509d4fa1a1SMauro Carvalho Chehab false); 251*c606970dSAditya Srivastava if (!rc) 2529d4fa1a1SMauro Carvalho Chehab return false; 2539d4fa1a1SMauro Carvalho Chehab 2549d4fa1a1SMauro Carvalho Chehab /* configure metadata channel */ 2559d4fa1a1SMauro Carvalho Chehab if (isys_stream_descr->metadata.enable) { 2569d4fa1a1SMauro Carvalho Chehab isys_stream_cfg->enable_metadata = true; 2579d4fa1a1SMauro Carvalho Chehab rc = calculate_input_system_channel_cfg( 2589d4fa1a1SMauro Carvalho Chehab &isys_stream->md_channel, 2599d4fa1a1SMauro Carvalho Chehab &isys_stream->input_port, 2609d4fa1a1SMauro Carvalho Chehab isys_stream_descr, 2619d4fa1a1SMauro Carvalho Chehab &isys_stream_cfg->md_channel_cfg, 2629d4fa1a1SMauro Carvalho Chehab true); 263*c606970dSAditya Srivastava if (!rc) 2649d4fa1a1SMauro Carvalho Chehab return false; 2659d4fa1a1SMauro Carvalho Chehab } 2669d4fa1a1SMauro Carvalho Chehab 2679d4fa1a1SMauro Carvalho Chehab rc = calculate_input_system_input_port_cfg( 2689d4fa1a1SMauro Carvalho Chehab &isys_stream->channel, 2699d4fa1a1SMauro Carvalho Chehab &isys_stream->input_port, 2709d4fa1a1SMauro Carvalho Chehab isys_stream_descr, 2719d4fa1a1SMauro Carvalho Chehab &isys_stream_cfg->input_port_cfg); 272*c606970dSAditya Srivastava if (!rc) 2739d4fa1a1SMauro Carvalho Chehab return false; 2749d4fa1a1SMauro Carvalho Chehab 2759d4fa1a1SMauro Carvalho Chehab isys_stream->valid = 1; 2769d4fa1a1SMauro Carvalho Chehab isys_stream_cfg->valid = 1; 2779d4fa1a1SMauro Carvalho Chehab ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE_PRIVATE, 2789d4fa1a1SMauro Carvalho Chehab "ia_css_isys_stream_calculate_cfg() leave:\n"); 2799d4fa1a1SMauro Carvalho Chehab return rc; 2809d4fa1a1SMauro Carvalho Chehab } 2819d4fa1a1SMauro Carvalho Chehab 2829d4fa1a1SMauro Carvalho Chehab /* end of Public Methods */ 2839d4fa1a1SMauro Carvalho Chehab 2849d4fa1a1SMauro Carvalho Chehab /************************************************** 2859d4fa1a1SMauro Carvalho Chehab * 2869d4fa1a1SMauro Carvalho Chehab * Private Methods 2879d4fa1a1SMauro Carvalho Chehab * 2889d4fa1a1SMauro Carvalho Chehab **************************************************/ 2899d4fa1a1SMauro Carvalho Chehab static bool create_input_system_channel( 290284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *cfg, 2919d4fa1a1SMauro Carvalho Chehab bool metadata, 2929d4fa1a1SMauro Carvalho Chehab input_system_channel_t *me) 2939d4fa1a1SMauro Carvalho Chehab { 2949d4fa1a1SMauro Carvalho Chehab bool rc = true; 2959d4fa1a1SMauro Carvalho Chehab 2969d4fa1a1SMauro Carvalho Chehab me->dma_id = ISYS2401_DMA0_ID; 2979d4fa1a1SMauro Carvalho Chehab 2989d4fa1a1SMauro Carvalho Chehab switch (cfg->input_port_id) { 2999d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_CSI_PORT0_ID: 3009d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_PIXELGEN_PORT0_ID: 3019d4fa1a1SMauro Carvalho Chehab me->stream2mmio_id = STREAM2MMIO0_ID; 3029d4fa1a1SMauro Carvalho Chehab me->ibuf_ctrl_id = IBUF_CTRL0_ID; 3039d4fa1a1SMauro Carvalho Chehab break; 3049d4fa1a1SMauro Carvalho Chehab 3059d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_CSI_PORT1_ID: 3069d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_PIXELGEN_PORT1_ID: 3079d4fa1a1SMauro Carvalho Chehab me->stream2mmio_id = STREAM2MMIO1_ID; 3089d4fa1a1SMauro Carvalho Chehab me->ibuf_ctrl_id = IBUF_CTRL1_ID; 3099d4fa1a1SMauro Carvalho Chehab break; 3109d4fa1a1SMauro Carvalho Chehab 3119d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_CSI_PORT2_ID: 3129d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_PIXELGEN_PORT2_ID: 3139d4fa1a1SMauro Carvalho Chehab me->stream2mmio_id = STREAM2MMIO2_ID; 3149d4fa1a1SMauro Carvalho Chehab me->ibuf_ctrl_id = IBUF_CTRL2_ID; 3159d4fa1a1SMauro Carvalho Chehab break; 3169d4fa1a1SMauro Carvalho Chehab default: 3179d4fa1a1SMauro Carvalho Chehab rc = false; 3189d4fa1a1SMauro Carvalho Chehab break; 3199d4fa1a1SMauro Carvalho Chehab } 3209d4fa1a1SMauro Carvalho Chehab 3219d4fa1a1SMauro Carvalho Chehab if (!rc) 3229d4fa1a1SMauro Carvalho Chehab return false; 3239d4fa1a1SMauro Carvalho Chehab 3249d4fa1a1SMauro Carvalho Chehab if (!acquire_sid(me->stream2mmio_id, &me->stream2mmio_sid_id)) { 3259d4fa1a1SMauro Carvalho Chehab return false; 3269d4fa1a1SMauro Carvalho Chehab } 3279d4fa1a1SMauro Carvalho Chehab 3289d4fa1a1SMauro Carvalho Chehab if (!acquire_ib_buffer( 3299d4fa1a1SMauro Carvalho Chehab metadata ? cfg->metadata.bits_per_pixel : 3309d4fa1a1SMauro Carvalho Chehab cfg->input_port_resolution.bits_per_pixel, 3319d4fa1a1SMauro Carvalho Chehab metadata ? cfg->metadata.pixels_per_line : 3329d4fa1a1SMauro Carvalho Chehab cfg->input_port_resolution.pixels_per_line, 3339d4fa1a1SMauro Carvalho Chehab metadata ? cfg->metadata.lines_per_frame : 3349d4fa1a1SMauro Carvalho Chehab cfg->input_port_resolution.lines_per_frame, 3359d4fa1a1SMauro Carvalho Chehab metadata ? cfg->metadata.align_req_in_bytes : 3369d4fa1a1SMauro Carvalho Chehab cfg->input_port_resolution.align_req_in_bytes, 3379d4fa1a1SMauro Carvalho Chehab cfg->online, 3389d4fa1a1SMauro Carvalho Chehab &me->ib_buffer)) { 3399d4fa1a1SMauro Carvalho Chehab release_sid(me->stream2mmio_id, &me->stream2mmio_sid_id); 3409d4fa1a1SMauro Carvalho Chehab return false; 3419d4fa1a1SMauro Carvalho Chehab } 3429d4fa1a1SMauro Carvalho Chehab 3439d4fa1a1SMauro Carvalho Chehab if (!acquire_dma_channel(me->dma_id, &me->dma_channel)) { 3449d4fa1a1SMauro Carvalho Chehab release_sid(me->stream2mmio_id, &me->stream2mmio_sid_id); 3459d4fa1a1SMauro Carvalho Chehab release_ib_buffer(&me->ib_buffer); 3469d4fa1a1SMauro Carvalho Chehab return false; 3479d4fa1a1SMauro Carvalho Chehab } 3489d4fa1a1SMauro Carvalho Chehab 3499d4fa1a1SMauro Carvalho Chehab return true; 3509d4fa1a1SMauro Carvalho Chehab } 3519d4fa1a1SMauro Carvalho Chehab 3529d4fa1a1SMauro Carvalho Chehab static void destroy_input_system_channel( 3539d4fa1a1SMauro Carvalho Chehab input_system_channel_t *me) 3549d4fa1a1SMauro Carvalho Chehab { 3559d4fa1a1SMauro Carvalho Chehab release_sid(me->stream2mmio_id, 3569d4fa1a1SMauro Carvalho Chehab &me->stream2mmio_sid_id); 3579d4fa1a1SMauro Carvalho Chehab 3589d4fa1a1SMauro Carvalho Chehab release_ib_buffer(&me->ib_buffer); 3599d4fa1a1SMauro Carvalho Chehab 3609d4fa1a1SMauro Carvalho Chehab release_dma_channel(me->dma_id, &me->dma_channel); 3619d4fa1a1SMauro Carvalho Chehab } 3629d4fa1a1SMauro Carvalho Chehab 3639d4fa1a1SMauro Carvalho Chehab static bool create_input_system_input_port( 364284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *cfg, 3659d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *me) 3669d4fa1a1SMauro Carvalho Chehab { 3679d4fa1a1SMauro Carvalho Chehab csi_mipi_packet_type_t packet_type; 3689d4fa1a1SMauro Carvalho Chehab bool rc = true; 3699d4fa1a1SMauro Carvalho Chehab 3709d4fa1a1SMauro Carvalho Chehab switch (cfg->input_port_id) { 3719d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_CSI_PORT0_ID: 3729d4fa1a1SMauro Carvalho Chehab me->csi_rx.frontend_id = CSI_RX_FRONTEND0_ID; 3739d4fa1a1SMauro Carvalho Chehab me->csi_rx.backend_id = CSI_RX_BACKEND0_ID; 3749d4fa1a1SMauro Carvalho Chehab 3759d4fa1a1SMauro Carvalho Chehab packet_type = get_csi_mipi_packet_type(cfg->csi_port_attr.fmt_type); 3769d4fa1a1SMauro Carvalho Chehab me->csi_rx.packet_type = packet_type; 3779d4fa1a1SMauro Carvalho Chehab 3789d4fa1a1SMauro Carvalho Chehab rc = acquire_be_lut_entry( 3799d4fa1a1SMauro Carvalho Chehab me->csi_rx.backend_id, 3809d4fa1a1SMauro Carvalho Chehab packet_type, 3819d4fa1a1SMauro Carvalho Chehab &me->csi_rx.backend_lut_entry); 3829d4fa1a1SMauro Carvalho Chehab break; 3839d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_PIXELGEN_PORT0_ID: 3849d4fa1a1SMauro Carvalho Chehab me->pixelgen.pixelgen_id = PIXELGEN0_ID; 3859d4fa1a1SMauro Carvalho Chehab break; 3869d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_CSI_PORT1_ID: 3879d4fa1a1SMauro Carvalho Chehab me->csi_rx.frontend_id = CSI_RX_FRONTEND1_ID; 3889d4fa1a1SMauro Carvalho Chehab me->csi_rx.backend_id = CSI_RX_BACKEND1_ID; 3899d4fa1a1SMauro Carvalho Chehab 3909d4fa1a1SMauro Carvalho Chehab packet_type = get_csi_mipi_packet_type(cfg->csi_port_attr.fmt_type); 3919d4fa1a1SMauro Carvalho Chehab me->csi_rx.packet_type = packet_type; 3929d4fa1a1SMauro Carvalho Chehab 3939d4fa1a1SMauro Carvalho Chehab rc = acquire_be_lut_entry( 3949d4fa1a1SMauro Carvalho Chehab me->csi_rx.backend_id, 3959d4fa1a1SMauro Carvalho Chehab packet_type, 3969d4fa1a1SMauro Carvalho Chehab &me->csi_rx.backend_lut_entry); 3979d4fa1a1SMauro Carvalho Chehab break; 3989d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_PIXELGEN_PORT1_ID: 3999d4fa1a1SMauro Carvalho Chehab me->pixelgen.pixelgen_id = PIXELGEN1_ID; 4009d4fa1a1SMauro Carvalho Chehab 4019d4fa1a1SMauro Carvalho Chehab break; 4029d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_CSI_PORT2_ID: 4039d4fa1a1SMauro Carvalho Chehab me->csi_rx.frontend_id = CSI_RX_FRONTEND2_ID; 4049d4fa1a1SMauro Carvalho Chehab me->csi_rx.backend_id = CSI_RX_BACKEND2_ID; 4059d4fa1a1SMauro Carvalho Chehab 4069d4fa1a1SMauro Carvalho Chehab packet_type = get_csi_mipi_packet_type(cfg->csi_port_attr.fmt_type); 4079d4fa1a1SMauro Carvalho Chehab me->csi_rx.packet_type = packet_type; 4089d4fa1a1SMauro Carvalho Chehab 4099d4fa1a1SMauro Carvalho Chehab rc = acquire_be_lut_entry( 4109d4fa1a1SMauro Carvalho Chehab me->csi_rx.backend_id, 4119d4fa1a1SMauro Carvalho Chehab packet_type, 4129d4fa1a1SMauro Carvalho Chehab &me->csi_rx.backend_lut_entry); 4139d4fa1a1SMauro Carvalho Chehab break; 4149d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_PIXELGEN_PORT2_ID: 4159d4fa1a1SMauro Carvalho Chehab me->pixelgen.pixelgen_id = PIXELGEN2_ID; 4169d4fa1a1SMauro Carvalho Chehab break; 4179d4fa1a1SMauro Carvalho Chehab default: 4189d4fa1a1SMauro Carvalho Chehab rc = false; 4199d4fa1a1SMauro Carvalho Chehab break; 4209d4fa1a1SMauro Carvalho Chehab } 4219d4fa1a1SMauro Carvalho Chehab 4229d4fa1a1SMauro Carvalho Chehab me->source_type = cfg->mode; 4239d4fa1a1SMauro Carvalho Chehab 4249d4fa1a1SMauro Carvalho Chehab /* for metadata */ 4259d4fa1a1SMauro Carvalho Chehab me->metadata.packet_type = CSI_MIPI_PACKET_TYPE_UNDEFINED; 4269d4fa1a1SMauro Carvalho Chehab if (rc && cfg->metadata.enable) { 4279d4fa1a1SMauro Carvalho Chehab me->metadata.packet_type = get_csi_mipi_packet_type( 4289d4fa1a1SMauro Carvalho Chehab cfg->metadata.fmt_type); 4299d4fa1a1SMauro Carvalho Chehab rc = acquire_be_lut_entry( 4309d4fa1a1SMauro Carvalho Chehab me->csi_rx.backend_id, 4319d4fa1a1SMauro Carvalho Chehab me->metadata.packet_type, 4329d4fa1a1SMauro Carvalho Chehab &me->metadata.backend_lut_entry); 4339d4fa1a1SMauro Carvalho Chehab } 4349d4fa1a1SMauro Carvalho Chehab 4359d4fa1a1SMauro Carvalho Chehab return rc; 4369d4fa1a1SMauro Carvalho Chehab } 4379d4fa1a1SMauro Carvalho Chehab 4389d4fa1a1SMauro Carvalho Chehab static void destroy_input_system_input_port( 4399d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *me) 4409d4fa1a1SMauro Carvalho Chehab { 4419d4fa1a1SMauro Carvalho Chehab if (me->source_type == INPUT_SYSTEM_SOURCE_TYPE_SENSOR) { 4429d4fa1a1SMauro Carvalho Chehab release_be_lut_entry( 4439d4fa1a1SMauro Carvalho Chehab me->csi_rx.backend_id, 4449d4fa1a1SMauro Carvalho Chehab me->csi_rx.packet_type, 4459d4fa1a1SMauro Carvalho Chehab &me->csi_rx.backend_lut_entry); 4469d4fa1a1SMauro Carvalho Chehab } 4479d4fa1a1SMauro Carvalho Chehab 4489d4fa1a1SMauro Carvalho Chehab if (me->metadata.packet_type != CSI_MIPI_PACKET_TYPE_UNDEFINED) { 4499d4fa1a1SMauro Carvalho Chehab /*Free the backend lut allocated for metadata*/ 4509d4fa1a1SMauro Carvalho Chehab release_be_lut_entry( 4519d4fa1a1SMauro Carvalho Chehab me->csi_rx.backend_id, 4529d4fa1a1SMauro Carvalho Chehab me->metadata.packet_type, 4539d4fa1a1SMauro Carvalho Chehab &me->metadata.backend_lut_entry); 4549d4fa1a1SMauro Carvalho Chehab } 4559d4fa1a1SMauro Carvalho Chehab } 4569d4fa1a1SMauro Carvalho Chehab 4579d4fa1a1SMauro Carvalho Chehab static bool calculate_input_system_channel_cfg( 4589d4fa1a1SMauro Carvalho Chehab input_system_channel_t *channel, 4599d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *input_port, 460284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *isys_cfg, 4619d4fa1a1SMauro Carvalho Chehab input_system_channel_cfg_t *channel_cfg, 4629d4fa1a1SMauro Carvalho Chehab bool metadata) 4639d4fa1a1SMauro Carvalho Chehab { 4649d4fa1a1SMauro Carvalho Chehab bool rc; 4659d4fa1a1SMauro Carvalho Chehab 4669d4fa1a1SMauro Carvalho Chehab rc = calculate_stream2mmio_cfg(isys_cfg, metadata, 4679d4fa1a1SMauro Carvalho Chehab &channel_cfg->stream2mmio_cfg); 4689d4fa1a1SMauro Carvalho Chehab if (!rc) 4699d4fa1a1SMauro Carvalho Chehab return false; 4709d4fa1a1SMauro Carvalho Chehab 4719d4fa1a1SMauro Carvalho Chehab rc = calculate_ibuf_ctrl_cfg( 4729d4fa1a1SMauro Carvalho Chehab channel, 4739d4fa1a1SMauro Carvalho Chehab input_port, 4749d4fa1a1SMauro Carvalho Chehab isys_cfg, 4759d4fa1a1SMauro Carvalho Chehab &channel_cfg->ibuf_ctrl_cfg); 4769d4fa1a1SMauro Carvalho Chehab if (!rc) 4779d4fa1a1SMauro Carvalho Chehab return false; 4789d4fa1a1SMauro Carvalho Chehab if (metadata) 4799d4fa1a1SMauro Carvalho Chehab channel_cfg->ibuf_ctrl_cfg.stores_per_frame = 4809d4fa1a1SMauro Carvalho Chehab isys_cfg->metadata.lines_per_frame; 4819d4fa1a1SMauro Carvalho Chehab 4829d4fa1a1SMauro Carvalho Chehab rc = calculate_isys2401_dma_cfg( 4839d4fa1a1SMauro Carvalho Chehab channel, 4849d4fa1a1SMauro Carvalho Chehab isys_cfg, 4859d4fa1a1SMauro Carvalho Chehab &channel_cfg->dma_cfg); 4869d4fa1a1SMauro Carvalho Chehab if (!rc) 4879d4fa1a1SMauro Carvalho Chehab return false; 4889d4fa1a1SMauro Carvalho Chehab 4899d4fa1a1SMauro Carvalho Chehab rc = calculate_isys2401_dma_port_cfg( 4909d4fa1a1SMauro Carvalho Chehab isys_cfg, 4919d4fa1a1SMauro Carvalho Chehab false, 4929d4fa1a1SMauro Carvalho Chehab metadata, 4939d4fa1a1SMauro Carvalho Chehab &channel_cfg->dma_src_port_cfg); 4949d4fa1a1SMauro Carvalho Chehab if (!rc) 4959d4fa1a1SMauro Carvalho Chehab return false; 4969d4fa1a1SMauro Carvalho Chehab 4979d4fa1a1SMauro Carvalho Chehab rc = calculate_isys2401_dma_port_cfg( 4989d4fa1a1SMauro Carvalho Chehab isys_cfg, 4999d4fa1a1SMauro Carvalho Chehab isys_cfg->raw_packed, 5009d4fa1a1SMauro Carvalho Chehab metadata, 5019d4fa1a1SMauro Carvalho Chehab &channel_cfg->dma_dest_port_cfg); 5029d4fa1a1SMauro Carvalho Chehab if (!rc) 5039d4fa1a1SMauro Carvalho Chehab return false; 5049d4fa1a1SMauro Carvalho Chehab 5059d4fa1a1SMauro Carvalho Chehab return true; 5069d4fa1a1SMauro Carvalho Chehab } 5079d4fa1a1SMauro Carvalho Chehab 5089d4fa1a1SMauro Carvalho Chehab static bool calculate_input_system_input_port_cfg( 5099d4fa1a1SMauro Carvalho Chehab input_system_channel_t *channel, 5109d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *input_port, 511284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *isys_cfg, 5129d4fa1a1SMauro Carvalho Chehab input_system_input_port_cfg_t *input_port_cfg) 5139d4fa1a1SMauro Carvalho Chehab { 5149d4fa1a1SMauro Carvalho Chehab bool rc; 5159d4fa1a1SMauro Carvalho Chehab 5169d4fa1a1SMauro Carvalho Chehab switch (input_port->source_type) { 5179d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_SOURCE_TYPE_SENSOR: 5189d4fa1a1SMauro Carvalho Chehab rc = calculate_fe_cfg( 5199d4fa1a1SMauro Carvalho Chehab isys_cfg, 5209d4fa1a1SMauro Carvalho Chehab &input_port_cfg->csi_rx_cfg.frontend_cfg); 5219d4fa1a1SMauro Carvalho Chehab 5229d4fa1a1SMauro Carvalho Chehab rc &= calculate_be_cfg( 5239d4fa1a1SMauro Carvalho Chehab input_port, 5249d4fa1a1SMauro Carvalho Chehab isys_cfg, 5259d4fa1a1SMauro Carvalho Chehab false, 5269d4fa1a1SMauro Carvalho Chehab &input_port_cfg->csi_rx_cfg.backend_cfg); 5279d4fa1a1SMauro Carvalho Chehab 5289d4fa1a1SMauro Carvalho Chehab if (rc && isys_cfg->metadata.enable) 5299d4fa1a1SMauro Carvalho Chehab rc &= calculate_be_cfg(input_port, isys_cfg, true, 5309d4fa1a1SMauro Carvalho Chehab &input_port_cfg->csi_rx_cfg.md_backend_cfg); 5319d4fa1a1SMauro Carvalho Chehab break; 5329d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_SOURCE_TYPE_TPG: 5339d4fa1a1SMauro Carvalho Chehab rc = calculate_tpg_cfg( 5349d4fa1a1SMauro Carvalho Chehab channel, 5359d4fa1a1SMauro Carvalho Chehab input_port, 5369d4fa1a1SMauro Carvalho Chehab isys_cfg, 5379d4fa1a1SMauro Carvalho Chehab &input_port_cfg->pixelgen_cfg.tpg_cfg); 5389d4fa1a1SMauro Carvalho Chehab break; 5399d4fa1a1SMauro Carvalho Chehab case INPUT_SYSTEM_SOURCE_TYPE_PRBS: 5409d4fa1a1SMauro Carvalho Chehab rc = calculate_prbs_cfg( 5419d4fa1a1SMauro Carvalho Chehab channel, 5429d4fa1a1SMauro Carvalho Chehab input_port, 5439d4fa1a1SMauro Carvalho Chehab isys_cfg, 5449d4fa1a1SMauro Carvalho Chehab &input_port_cfg->pixelgen_cfg.prbs_cfg); 5459d4fa1a1SMauro Carvalho Chehab break; 5469d4fa1a1SMauro Carvalho Chehab default: 5479d4fa1a1SMauro Carvalho Chehab rc = false; 5489d4fa1a1SMauro Carvalho Chehab break; 5499d4fa1a1SMauro Carvalho Chehab } 5509d4fa1a1SMauro Carvalho Chehab 5519d4fa1a1SMauro Carvalho Chehab return rc; 5529d4fa1a1SMauro Carvalho Chehab } 5539d4fa1a1SMauro Carvalho Chehab 5549d4fa1a1SMauro Carvalho Chehab static bool acquire_sid( 5559d4fa1a1SMauro Carvalho Chehab stream2mmio_ID_t stream2mmio, 5569d4fa1a1SMauro Carvalho Chehab stream2mmio_sid_ID_t *sid) 5579d4fa1a1SMauro Carvalho Chehab { 5589d4fa1a1SMauro Carvalho Chehab return ia_css_isys_stream2mmio_sid_rmgr_acquire(stream2mmio, sid); 5599d4fa1a1SMauro Carvalho Chehab } 5609d4fa1a1SMauro Carvalho Chehab 5619d4fa1a1SMauro Carvalho Chehab static void release_sid( 5629d4fa1a1SMauro Carvalho Chehab stream2mmio_ID_t stream2mmio, 5639d4fa1a1SMauro Carvalho Chehab stream2mmio_sid_ID_t *sid) 5649d4fa1a1SMauro Carvalho Chehab { 5659d4fa1a1SMauro Carvalho Chehab ia_css_isys_stream2mmio_sid_rmgr_release(stream2mmio, sid); 5669d4fa1a1SMauro Carvalho Chehab } 5679d4fa1a1SMauro Carvalho Chehab 5689d4fa1a1SMauro Carvalho Chehab /* See also: ia_css_dma_configure_from_info() */ 5699d4fa1a1SMauro Carvalho Chehab static int32_t calculate_stride( 5709d4fa1a1SMauro Carvalho Chehab s32 bits_per_pixel, 5719d4fa1a1SMauro Carvalho Chehab s32 pixels_per_line, 5729d4fa1a1SMauro Carvalho Chehab bool raw_packed, 5739d4fa1a1SMauro Carvalho Chehab int32_t align_in_bytes) 5749d4fa1a1SMauro Carvalho Chehab { 5759d4fa1a1SMauro Carvalho Chehab s32 bytes_per_line; 5769d4fa1a1SMauro Carvalho Chehab s32 pixels_per_word; 5779d4fa1a1SMauro Carvalho Chehab s32 words_per_line; 5789d4fa1a1SMauro Carvalho Chehab s32 pixels_per_line_padded; 5799d4fa1a1SMauro Carvalho Chehab 5809d4fa1a1SMauro Carvalho Chehab pixels_per_line_padded = CEIL_MUL(pixels_per_line, align_in_bytes); 5819d4fa1a1SMauro Carvalho Chehab 5829d4fa1a1SMauro Carvalho Chehab if (!raw_packed) 5839d4fa1a1SMauro Carvalho Chehab bits_per_pixel = CEIL_MUL(bits_per_pixel, 8); 5849d4fa1a1SMauro Carvalho Chehab 5859d4fa1a1SMauro Carvalho Chehab pixels_per_word = HIVE_ISP_DDR_WORD_BITS / bits_per_pixel; 5869d4fa1a1SMauro Carvalho Chehab words_per_line = ceil_div(pixels_per_line_padded, pixels_per_word); 5879d4fa1a1SMauro Carvalho Chehab bytes_per_line = HIVE_ISP_DDR_WORD_BYTES * words_per_line; 5889d4fa1a1SMauro Carvalho Chehab 5899d4fa1a1SMauro Carvalho Chehab return bytes_per_line; 5909d4fa1a1SMauro Carvalho Chehab } 5919d4fa1a1SMauro Carvalho Chehab 5929d4fa1a1SMauro Carvalho Chehab static bool acquire_ib_buffer( 5939d4fa1a1SMauro Carvalho Chehab s32 bits_per_pixel, 5949d4fa1a1SMauro Carvalho Chehab s32 pixels_per_line, 5959d4fa1a1SMauro Carvalho Chehab s32 lines_per_frame, 5969d4fa1a1SMauro Carvalho Chehab s32 align_in_bytes, 5979d4fa1a1SMauro Carvalho Chehab bool online, 598284be891SMauro Carvalho Chehab isp2401_ib_buffer_t *buf) 5999d4fa1a1SMauro Carvalho Chehab { 6009d4fa1a1SMauro Carvalho Chehab buf->stride = calculate_stride(bits_per_pixel, pixels_per_line, false, 6019d4fa1a1SMauro Carvalho Chehab align_in_bytes); 6029d4fa1a1SMauro Carvalho Chehab if (online) 6039d4fa1a1SMauro Carvalho Chehab buf->lines = 4; /* use double buffering for online usecases */ 6049d4fa1a1SMauro Carvalho Chehab else 6059d4fa1a1SMauro Carvalho Chehab buf->lines = 2; 6069d4fa1a1SMauro Carvalho Chehab 6079d4fa1a1SMauro Carvalho Chehab (void)(lines_per_frame); 6089d4fa1a1SMauro Carvalho Chehab return ia_css_isys_ibuf_rmgr_acquire(buf->stride * buf->lines, 6099d4fa1a1SMauro Carvalho Chehab &buf->start_addr); 6109d4fa1a1SMauro Carvalho Chehab } 6119d4fa1a1SMauro Carvalho Chehab 6129d4fa1a1SMauro Carvalho Chehab static void release_ib_buffer( 613284be891SMauro Carvalho Chehab isp2401_ib_buffer_t *buf) 6149d4fa1a1SMauro Carvalho Chehab { 6159d4fa1a1SMauro Carvalho Chehab ia_css_isys_ibuf_rmgr_release(&buf->start_addr); 6169d4fa1a1SMauro Carvalho Chehab } 6179d4fa1a1SMauro Carvalho Chehab 6189d4fa1a1SMauro Carvalho Chehab static bool acquire_dma_channel( 6199d4fa1a1SMauro Carvalho Chehab isys2401_dma_ID_t dma_id, 6209d4fa1a1SMauro Carvalho Chehab isys2401_dma_channel *channel) 6219d4fa1a1SMauro Carvalho Chehab { 6229d4fa1a1SMauro Carvalho Chehab return ia_css_isys_dma_channel_rmgr_acquire(dma_id, channel); 6239d4fa1a1SMauro Carvalho Chehab } 6249d4fa1a1SMauro Carvalho Chehab 6259d4fa1a1SMauro Carvalho Chehab static void release_dma_channel( 6269d4fa1a1SMauro Carvalho Chehab isys2401_dma_ID_t dma_id, 6279d4fa1a1SMauro Carvalho Chehab isys2401_dma_channel *channel) 6289d4fa1a1SMauro Carvalho Chehab { 6299d4fa1a1SMauro Carvalho Chehab ia_css_isys_dma_channel_rmgr_release(dma_id, channel); 6309d4fa1a1SMauro Carvalho Chehab } 6319d4fa1a1SMauro Carvalho Chehab 6329d4fa1a1SMauro Carvalho Chehab static bool acquire_be_lut_entry( 6339d4fa1a1SMauro Carvalho Chehab csi_rx_backend_ID_t backend, 6349d4fa1a1SMauro Carvalho Chehab csi_mipi_packet_type_t packet_type, 6359d4fa1a1SMauro Carvalho Chehab csi_rx_backend_lut_entry_t *entry) 6369d4fa1a1SMauro Carvalho Chehab { 6379d4fa1a1SMauro Carvalho Chehab return ia_css_isys_csi_rx_lut_rmgr_acquire(backend, packet_type, entry); 6389d4fa1a1SMauro Carvalho Chehab } 6399d4fa1a1SMauro Carvalho Chehab 6409d4fa1a1SMauro Carvalho Chehab static void release_be_lut_entry( 6419d4fa1a1SMauro Carvalho Chehab csi_rx_backend_ID_t backend, 6429d4fa1a1SMauro Carvalho Chehab csi_mipi_packet_type_t packet_type, 6439d4fa1a1SMauro Carvalho Chehab csi_rx_backend_lut_entry_t *entry) 6449d4fa1a1SMauro Carvalho Chehab { 6459d4fa1a1SMauro Carvalho Chehab ia_css_isys_csi_rx_lut_rmgr_release(backend, packet_type, entry); 6469d4fa1a1SMauro Carvalho Chehab } 6479d4fa1a1SMauro Carvalho Chehab 6489d4fa1a1SMauro Carvalho Chehab static bool calculate_tpg_cfg( 6499d4fa1a1SMauro Carvalho Chehab input_system_channel_t *channel, 6509d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *input_port, 651284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *isys_cfg, 6529d4fa1a1SMauro Carvalho Chehab pixelgen_tpg_cfg_t *cfg) 6539d4fa1a1SMauro Carvalho Chehab { 654662fb4fcSMauro Carvalho Chehab memcpy(cfg, &isys_cfg->tpg_port_attr, sizeof(pixelgen_tpg_cfg_t)); 6559d4fa1a1SMauro Carvalho Chehab 6569d4fa1a1SMauro Carvalho Chehab return true; 6579d4fa1a1SMauro Carvalho Chehab } 6589d4fa1a1SMauro Carvalho Chehab 6599d4fa1a1SMauro Carvalho Chehab static bool calculate_prbs_cfg( 6609d4fa1a1SMauro Carvalho Chehab input_system_channel_t *channel, 6619d4fa1a1SMauro Carvalho Chehab input_system_input_port_t *input_port, 662284be891SMauro Carvalho Chehab isp2401_input_system_cfg_t *isys_cfg, 6639d4fa1a1SMauro Carvalho Chehab pixelgen_prbs_cfg_t *cfg) 6649d4fa1a1SMauro Carvalho Chehab { 665662fb4fcSMauro Carvalho Chehab memcpy(cfg, &isys_cfg->prbs_port_attr, sizeof(pixelgen_prbs_cfg_t)); 6669d4fa1a1SMauro Carvalho Chehab 6679d4fa1a1SMauro Carvalho Chehab return true; 6689d4fa1a1SMauro Carvalho Chehab } 6699d4fa1a1SMauro Carvalho Chehab 6709d4fa1a1SMauro Carvalho Chehab static bool calculate_fe_cfg( 671284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 6729d4fa1a1SMauro Carvalho Chehab csi_rx_frontend_cfg_t *cfg) 6739d4fa1a1SMauro Carvalho Chehab { 6749d4fa1a1SMauro Carvalho Chehab cfg->active_lanes = isys_cfg->csi_port_attr.active_lanes; 6759d4fa1a1SMauro Carvalho Chehab return true; 6769d4fa1a1SMauro Carvalho Chehab } 6779d4fa1a1SMauro Carvalho Chehab 6789d4fa1a1SMauro Carvalho Chehab static bool calculate_be_cfg( 6799d4fa1a1SMauro Carvalho Chehab const input_system_input_port_t *input_port, 680284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 6819d4fa1a1SMauro Carvalho Chehab bool metadata, 6829d4fa1a1SMauro Carvalho Chehab csi_rx_backend_cfg_t *cfg) 6839d4fa1a1SMauro Carvalho Chehab { 684662fb4fcSMauro Carvalho Chehab memcpy(&cfg->lut_entry, 685662fb4fcSMauro Carvalho Chehab metadata ? &input_port->metadata.backend_lut_entry : 686662fb4fcSMauro Carvalho Chehab &input_port->csi_rx.backend_lut_entry, 6879d4fa1a1SMauro Carvalho Chehab sizeof(csi_rx_backend_lut_entry_t)); 6889d4fa1a1SMauro Carvalho Chehab 6899d4fa1a1SMauro Carvalho Chehab cfg->csi_mipi_cfg.virtual_channel = isys_cfg->csi_port_attr.ch_id; 6909d4fa1a1SMauro Carvalho Chehab if (metadata) { 6919d4fa1a1SMauro Carvalho Chehab cfg->csi_mipi_packet_type = get_csi_mipi_packet_type( 6929d4fa1a1SMauro Carvalho Chehab isys_cfg->metadata.fmt_type); 6939d4fa1a1SMauro Carvalho Chehab cfg->csi_mipi_cfg.comp_enable = false; 6949d4fa1a1SMauro Carvalho Chehab cfg->csi_mipi_cfg.data_type = isys_cfg->metadata.fmt_type; 6959d4fa1a1SMauro Carvalho Chehab } else { 6969d4fa1a1SMauro Carvalho Chehab cfg->csi_mipi_packet_type = get_csi_mipi_packet_type( 6979d4fa1a1SMauro Carvalho Chehab isys_cfg->csi_port_attr.fmt_type); 6989d4fa1a1SMauro Carvalho Chehab cfg->csi_mipi_cfg.data_type = isys_cfg->csi_port_attr.fmt_type; 6999d4fa1a1SMauro Carvalho Chehab cfg->csi_mipi_cfg.comp_enable = isys_cfg->csi_port_attr.comp_enable; 7009d4fa1a1SMauro Carvalho Chehab cfg->csi_mipi_cfg.comp_scheme = isys_cfg->csi_port_attr.comp_scheme; 7019d4fa1a1SMauro Carvalho Chehab cfg->csi_mipi_cfg.comp_predictor = isys_cfg->csi_port_attr.comp_predictor; 7029d4fa1a1SMauro Carvalho Chehab cfg->csi_mipi_cfg.comp_bit_idx = cfg->csi_mipi_cfg.data_type - 7039d4fa1a1SMauro Carvalho Chehab MIPI_FORMAT_CUSTOM0; 7049d4fa1a1SMauro Carvalho Chehab } 7059d4fa1a1SMauro Carvalho Chehab 7069d4fa1a1SMauro Carvalho Chehab return true; 7079d4fa1a1SMauro Carvalho Chehab } 7089d4fa1a1SMauro Carvalho Chehab 7099d4fa1a1SMauro Carvalho Chehab static bool calculate_stream2mmio_cfg( 710284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 7119d4fa1a1SMauro Carvalho Chehab bool metadata, 7129d4fa1a1SMauro Carvalho Chehab stream2mmio_cfg_t *cfg 7139d4fa1a1SMauro Carvalho Chehab ) 7149d4fa1a1SMauro Carvalho Chehab { 7159d4fa1a1SMauro Carvalho Chehab cfg->bits_per_pixel = metadata ? isys_cfg->metadata.bits_per_pixel : 7169d4fa1a1SMauro Carvalho Chehab isys_cfg->input_port_resolution.bits_per_pixel; 7179d4fa1a1SMauro Carvalho Chehab 7189d4fa1a1SMauro Carvalho Chehab cfg->enable_blocking = 7199d4fa1a1SMauro Carvalho Chehab ((isys_cfg->mode == INPUT_SYSTEM_SOURCE_TYPE_TPG) || 7209d4fa1a1SMauro Carvalho Chehab (isys_cfg->mode == INPUT_SYSTEM_SOURCE_TYPE_PRBS)); 7219d4fa1a1SMauro Carvalho Chehab 7229d4fa1a1SMauro Carvalho Chehab return true; 7239d4fa1a1SMauro Carvalho Chehab } 7249d4fa1a1SMauro Carvalho Chehab 7259d4fa1a1SMauro Carvalho Chehab static bool calculate_ibuf_ctrl_cfg( 7269d4fa1a1SMauro Carvalho Chehab const input_system_channel_t *channel, 7279d4fa1a1SMauro Carvalho Chehab const input_system_input_port_t *input_port, 728284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 7299d4fa1a1SMauro Carvalho Chehab ibuf_ctrl_cfg_t *cfg) 7309d4fa1a1SMauro Carvalho Chehab { 7319d4fa1a1SMauro Carvalho Chehab const s32 bits_per_byte = 8; 7329d4fa1a1SMauro Carvalho Chehab s32 bits_per_pixel; 7339d4fa1a1SMauro Carvalho Chehab s32 bytes_per_pixel; 7349d4fa1a1SMauro Carvalho Chehab s32 left_padding; 7359d4fa1a1SMauro Carvalho Chehab 7369d4fa1a1SMauro Carvalho Chehab (void)input_port; 7379d4fa1a1SMauro Carvalho Chehab 7389d4fa1a1SMauro Carvalho Chehab bits_per_pixel = isys_cfg->input_port_resolution.bits_per_pixel; 7399d4fa1a1SMauro Carvalho Chehab bytes_per_pixel = ceil_div(bits_per_pixel, bits_per_byte); 7409d4fa1a1SMauro Carvalho Chehab 7419d4fa1a1SMauro Carvalho Chehab left_padding = CEIL_MUL(isys_cfg->output_port_attr.left_padding, ISP_VEC_NELEMS) 7429d4fa1a1SMauro Carvalho Chehab * bytes_per_pixel; 7439d4fa1a1SMauro Carvalho Chehab 7449d4fa1a1SMauro Carvalho Chehab cfg->online = isys_cfg->online; 7459d4fa1a1SMauro Carvalho Chehab 7469d4fa1a1SMauro Carvalho Chehab cfg->dma_cfg.channel = channel->dma_channel; 7479d4fa1a1SMauro Carvalho Chehab cfg->dma_cfg.cmd = _DMA_V2_MOVE_A2B_NO_SYNC_CHK_COMMAND; 7489d4fa1a1SMauro Carvalho Chehab 7499d4fa1a1SMauro Carvalho Chehab cfg->dma_cfg.shift_returned_items = 0; 7509d4fa1a1SMauro Carvalho Chehab cfg->dma_cfg.elems_per_word_in_ibuf = 0; 7519d4fa1a1SMauro Carvalho Chehab cfg->dma_cfg.elems_per_word_in_dest = 0; 7529d4fa1a1SMauro Carvalho Chehab 7539d4fa1a1SMauro Carvalho Chehab cfg->ib_buffer.start_addr = channel->ib_buffer.start_addr; 7549d4fa1a1SMauro Carvalho Chehab cfg->ib_buffer.stride = channel->ib_buffer.stride; 7559d4fa1a1SMauro Carvalho Chehab cfg->ib_buffer.lines = channel->ib_buffer.lines; 7569d4fa1a1SMauro Carvalho Chehab 7579d4fa1a1SMauro Carvalho Chehab /* 7589d4fa1a1SMauro Carvalho Chehab #ifndef ISP2401 7599d4fa1a1SMauro Carvalho Chehab * zhengjie.lu@intel.com: 7609d4fa1a1SMauro Carvalho Chehab #endif 7619d4fa1a1SMauro Carvalho Chehab * "dest_buf_cfg" should be part of the input system output 7629d4fa1a1SMauro Carvalho Chehab * port configuration. 7639d4fa1a1SMauro Carvalho Chehab * 7649d4fa1a1SMauro Carvalho Chehab * TODO: move "dest_buf_cfg" to the input system output 7659d4fa1a1SMauro Carvalho Chehab * port configuration. 7669d4fa1a1SMauro Carvalho Chehab */ 7679d4fa1a1SMauro Carvalho Chehab 7689d4fa1a1SMauro Carvalho Chehab /* input_buf addr only available in sched mode; 7699d4fa1a1SMauro Carvalho Chehab this buffer is allocated in isp, crun mode addr 7709d4fa1a1SMauro Carvalho Chehab can be passed by after ISP allocation */ 7719d4fa1a1SMauro Carvalho Chehab if (cfg->online) { 7729d4fa1a1SMauro Carvalho Chehab cfg->dest_buf_cfg.start_addr = ISP_INPUT_BUF_START_ADDR + left_padding; 7739d4fa1a1SMauro Carvalho Chehab cfg->dest_buf_cfg.stride = bytes_per_pixel 7749d4fa1a1SMauro Carvalho Chehab * isys_cfg->output_port_attr.max_isp_input_width; 7759d4fa1a1SMauro Carvalho Chehab cfg->dest_buf_cfg.lines = LINES_OF_ISP_INPUT_BUF; 7769d4fa1a1SMauro Carvalho Chehab } else if (isys_cfg->raw_packed) { 7779d4fa1a1SMauro Carvalho Chehab cfg->dest_buf_cfg.stride = calculate_stride(bits_per_pixel, 7789d4fa1a1SMauro Carvalho Chehab isys_cfg->input_port_resolution.pixels_per_line, 7799d4fa1a1SMauro Carvalho Chehab isys_cfg->raw_packed, 7809d4fa1a1SMauro Carvalho Chehab isys_cfg->input_port_resolution.align_req_in_bytes); 7819d4fa1a1SMauro Carvalho Chehab } else { 7829d4fa1a1SMauro Carvalho Chehab cfg->dest_buf_cfg.stride = channel->ib_buffer.stride; 7839d4fa1a1SMauro Carvalho Chehab } 7849d4fa1a1SMauro Carvalho Chehab 7859d4fa1a1SMauro Carvalho Chehab /* 7869d4fa1a1SMauro Carvalho Chehab #ifndef ISP2401 7879d4fa1a1SMauro Carvalho Chehab * zhengjie.lu@intel.com: 7889d4fa1a1SMauro Carvalho Chehab #endif 7899d4fa1a1SMauro Carvalho Chehab * "items_per_store" is hard coded as "1", which is ONLY valid 7909d4fa1a1SMauro Carvalho Chehab * when the CSI-MIPI long packet is transferred. 7919d4fa1a1SMauro Carvalho Chehab * 7929d4fa1a1SMauro Carvalho Chehab * TODO: After the 1st stage of MERR+, make the proper solution to 7939d4fa1a1SMauro Carvalho Chehab * configure "items_per_store" so that it can also handle the CSI-MIPI 7949d4fa1a1SMauro Carvalho Chehab * short packet. 7959d4fa1a1SMauro Carvalho Chehab */ 7969d4fa1a1SMauro Carvalho Chehab cfg->items_per_store = 1; 7979d4fa1a1SMauro Carvalho Chehab 7989d4fa1a1SMauro Carvalho Chehab cfg->stores_per_frame = isys_cfg->input_port_resolution.lines_per_frame; 7999d4fa1a1SMauro Carvalho Chehab 8009d4fa1a1SMauro Carvalho Chehab cfg->stream2mmio_cfg.sync_cmd = _STREAM2MMIO_CMD_TOKEN_SYNC_FRAME; 8019d4fa1a1SMauro Carvalho Chehab 8029d4fa1a1SMauro Carvalho Chehab /* TODO: Define conditions as when to use store words vs store packets */ 8039d4fa1a1SMauro Carvalho Chehab cfg->stream2mmio_cfg.store_cmd = _STREAM2MMIO_CMD_TOKEN_STORE_PACKETS; 8049d4fa1a1SMauro Carvalho Chehab 8059d4fa1a1SMauro Carvalho Chehab return true; 8069d4fa1a1SMauro Carvalho Chehab } 8079d4fa1a1SMauro Carvalho Chehab 8089d4fa1a1SMauro Carvalho Chehab static bool calculate_isys2401_dma_cfg( 8099d4fa1a1SMauro Carvalho Chehab const input_system_channel_t *channel, 810284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 8119d4fa1a1SMauro Carvalho Chehab isys2401_dma_cfg_t *cfg) 8129d4fa1a1SMauro Carvalho Chehab { 8139d4fa1a1SMauro Carvalho Chehab cfg->channel = channel->dma_channel; 8149d4fa1a1SMauro Carvalho Chehab 8159d4fa1a1SMauro Carvalho Chehab /* only online/sensor mode goto vmem 8169d4fa1a1SMauro Carvalho Chehab offline/buffered_sensor, tpg and prbs will go to ddr */ 8179d4fa1a1SMauro Carvalho Chehab if (isys_cfg->online) 8189d4fa1a1SMauro Carvalho Chehab cfg->connection = isys2401_dma_ibuf_to_vmem_connection; 8199d4fa1a1SMauro Carvalho Chehab else 8209d4fa1a1SMauro Carvalho Chehab cfg->connection = isys2401_dma_ibuf_to_ddr_connection; 8219d4fa1a1SMauro Carvalho Chehab 8229d4fa1a1SMauro Carvalho Chehab cfg->extension = isys2401_dma_zero_extension; 8239d4fa1a1SMauro Carvalho Chehab cfg->height = 1; 8249d4fa1a1SMauro Carvalho Chehab 8259d4fa1a1SMauro Carvalho Chehab return true; 8269d4fa1a1SMauro Carvalho Chehab } 8279d4fa1a1SMauro Carvalho Chehab 8289d4fa1a1SMauro Carvalho Chehab /* See also: ia_css_dma_configure_from_info() */ 8299d4fa1a1SMauro Carvalho Chehab static bool calculate_isys2401_dma_port_cfg( 830284be891SMauro Carvalho Chehab const isp2401_input_system_cfg_t *isys_cfg, 8319d4fa1a1SMauro Carvalho Chehab bool raw_packed, 8329d4fa1a1SMauro Carvalho Chehab bool metadata, 8339d4fa1a1SMauro Carvalho Chehab isys2401_dma_port_cfg_t *cfg) 8349d4fa1a1SMauro Carvalho Chehab { 8359d4fa1a1SMauro Carvalho Chehab s32 bits_per_pixel; 8369d4fa1a1SMauro Carvalho Chehab s32 pixels_per_line; 8379d4fa1a1SMauro Carvalho Chehab s32 align_req_in_bytes; 8389d4fa1a1SMauro Carvalho Chehab 8399d4fa1a1SMauro Carvalho Chehab /* TODO: Move metadata away from isys_cfg to application layer */ 8409d4fa1a1SMauro Carvalho Chehab if (metadata) { 8419d4fa1a1SMauro Carvalho Chehab bits_per_pixel = isys_cfg->metadata.bits_per_pixel; 8429d4fa1a1SMauro Carvalho Chehab pixels_per_line = isys_cfg->metadata.pixels_per_line; 8439d4fa1a1SMauro Carvalho Chehab align_req_in_bytes = isys_cfg->metadata.align_req_in_bytes; 8449d4fa1a1SMauro Carvalho Chehab } else { 8459d4fa1a1SMauro Carvalho Chehab bits_per_pixel = isys_cfg->input_port_resolution.bits_per_pixel; 8469d4fa1a1SMauro Carvalho Chehab pixels_per_line = isys_cfg->input_port_resolution.pixels_per_line; 8479d4fa1a1SMauro Carvalho Chehab align_req_in_bytes = isys_cfg->input_port_resolution.align_req_in_bytes; 8489d4fa1a1SMauro Carvalho Chehab } 8499d4fa1a1SMauro Carvalho Chehab 8509d4fa1a1SMauro Carvalho Chehab cfg->stride = calculate_stride(bits_per_pixel, pixels_per_line, raw_packed, 8519d4fa1a1SMauro Carvalho Chehab align_req_in_bytes); 8529d4fa1a1SMauro Carvalho Chehab 8539d4fa1a1SMauro Carvalho Chehab if (!raw_packed) 8549d4fa1a1SMauro Carvalho Chehab bits_per_pixel = CEIL_MUL(bits_per_pixel, 8); 8559d4fa1a1SMauro Carvalho Chehab 8569d4fa1a1SMauro Carvalho Chehab cfg->elements = HIVE_ISP_DDR_WORD_BITS / bits_per_pixel; 8579d4fa1a1SMauro Carvalho Chehab cfg->cropping = 0; 8589d4fa1a1SMauro Carvalho Chehab cfg->width = CEIL_DIV(cfg->stride, HIVE_ISP_DDR_WORD_BYTES); 8599d4fa1a1SMauro Carvalho Chehab 8609d4fa1a1SMauro Carvalho Chehab return true; 8619d4fa1a1SMauro Carvalho Chehab } 8629d4fa1a1SMauro Carvalho Chehab 8639d4fa1a1SMauro Carvalho Chehab static csi_mipi_packet_type_t get_csi_mipi_packet_type( 8649d4fa1a1SMauro Carvalho Chehab int32_t data_type) 8659d4fa1a1SMauro Carvalho Chehab { 8669d4fa1a1SMauro Carvalho Chehab csi_mipi_packet_type_t packet_type; 8679d4fa1a1SMauro Carvalho Chehab 8689d4fa1a1SMauro Carvalho Chehab packet_type = CSI_MIPI_PACKET_TYPE_RESERVED; 8699d4fa1a1SMauro Carvalho Chehab 8709d4fa1a1SMauro Carvalho Chehab if (data_type >= 0 && data_type <= MIPI_FORMAT_SHORT8) 8719d4fa1a1SMauro Carvalho Chehab packet_type = CSI_MIPI_PACKET_TYPE_SHORT; 8729d4fa1a1SMauro Carvalho Chehab 8739d4fa1a1SMauro Carvalho Chehab if (data_type > MIPI_FORMAT_SHORT8 && data_type <= N_MIPI_FORMAT) 8749d4fa1a1SMauro Carvalho Chehab packet_type = CSI_MIPI_PACKET_TYPE_LONG; 8759d4fa1a1SMauro Carvalho Chehab 8769d4fa1a1SMauro Carvalho Chehab return packet_type; 8779d4fa1a1SMauro Carvalho Chehab } 8789d4fa1a1SMauro Carvalho Chehab 8799d4fa1a1SMauro Carvalho Chehab /* end of Private Methods */ 8809d4fa1a1SMauro Carvalho Chehab #endif 881