// SPDX-License-Identifier: GPL-2.0 /******************************************************************************** * * Copyright (C) 2017 NEXTCHIP Inc. All rights reserved. * Module : jaguar1_drv.c * Description : * Author : * Date : * Version : Version 1.0 * ******************************************************************************** * History : * * ********************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "jaguar1_common.h" #include "jaguar1_video.h" #include "jaguar1_coax_protocol.h" #include "jaguar1_motion.h" #include "jaguar1_ioctl.h" #include "jaguar1_video_eq.h" #include "jaguar1_mipi.h" #include "jaguar1_drv.h" #ifdef FOR_IMX6 #include "imx_mipi.h" #endif //#include "video_eq.h" //To do //#define STREAM_ON_DEFLAULT #define I2C_0 (0) #define I2C_1 (1) #define I2C_2 (2) #define I2C_3 (3) #define JAGUAR1_4PORT_R0_ID 0xB0 #define JAGUAR1_2PORT_R0_ID 0xA0 #define JAGUAR1_1PORT_R0_ID 0xA2 #define AFE_NVP6134E_R0_ID 0x80 #define JAGUAR1_4PORT_REV_ID 0x00 #define JAGUAR1_2PORT_REV_ID 0x00 #define JAGUAR1_1PORT_REV_ID 0x00 static int chip_id[4]; static int rev_id[4]; static int jaguar1_cnt; unsigned int jaguar1_i2c_addr[4] = {0x60, 0x62, 0x64, 0x66}; unsigned int jaguar1_mclk = 0; //0:756 1:594 2:378 3:1242 module_param_named(jaguar1_mclk, jaguar1_mclk, uint, S_IRUGO); unsigned int jaguar1_lane = 4; //2 or 4 module_param_named(jaguar1_lane, jaguar1_lane, uint, S_IRUGO); static unsigned int chn = 4; module_param_named(jaguar1_chn, chn, uint, S_IRUGO); static unsigned int init = 0; module_param_named(jaguar1_init, init, uint, S_IRUGO); static unsigned int fmt = 2; //0:960H;1:720P 2:1080P 3:960P 4:SH720 module_param_named(jaguar1_fmt, fmt, uint, S_IRUGO); static unsigned int ntpal = 0; module_param_named(jaguar1_ntpal, ntpal, uint, S_IRUGO); static bool jaguar1_init_state; struct semaphore jaguar1_lock; struct i2c_client* jaguar1_client; static struct i2c_board_info hi_info = { I2C_BOARD_INFO("jaguar1", 0x60), }; decoder_get_information_str decoder_inform; unsigned int acp_mode_enable = 1; module_param(acp_mode_enable, uint, S_IRUGO); static void vd_pattern_enable(void) { gpio_i2c_write(0x60, 0xFF, 0x00); gpio_i2c_write(0x60, 0x1C, 0x1A); gpio_i2c_write(0x60, 0x1D, 0x1A); gpio_i2c_write(0x60, 0x1E, 0x1A); gpio_i2c_write(0x60, 0x1F, 0x1A); gpio_i2c_write(0x60, 0xFF, 0x05); gpio_i2c_write(0x60, 0x6A, 0x80); gpio_i2c_write(0x60, 0xFF, 0x06); gpio_i2c_write(0x60, 0x6A, 0x80); gpio_i2c_write(0x60, 0xFF, 0x07); gpio_i2c_write(0x60, 0x6A, 0x80); gpio_i2c_write(0x60, 0xFF, 0x08); gpio_i2c_write(0x60, 0x6A, 0x80); } /******************************************************************************* * Description : Sample function - for select video format * Argurments : int dev_num(i2c_address array's num) * Return value : void * Modify : * warning : *******************************************************************************/ #if 0 static void set_default_video_fmt(int dev_num) { #if 0 // Activate this block if a default video-setting is required. int i; video_input_init video_val; /* default video datatype setting */ mipi_datatype_set(VD_DATA_TYPE_YUV422); /* mipi_tx_initial */ mipi_tx_init(dev_num); /* run default video format setting */ for( i=0 ; i<4 ; i++) { video_val.ch = i; /* select video format, include struct'vd_vi_init_list' in jaguar1_video_table.h * ex > AHD20_1080P_30P / AHD20_720P_25P_EX_Btype / AHD20_SD_H960_2EX_Btype_NT */ video_val.format = AHD20_720P_30P_EX_Btype; // select analog input type, SINGLE_ENDED or DIFFERENTIAL video_val.input = SINGLE_ENDED; // select decoder to soc interface video_val.interface = YUV_422; // run video setting vd_jaguar1_init_set(&video_val); // run video format setting for mipi/arbiter mipi_video_format_set(&video_val); set_imx_video_format(&video_val); init_imx_mipi(i); } arb_init(dev_num); disable_parallel(dev_num); #endif } #endif /******************************************************************************* * Description : Check ID * Argurments : dec(slave address) * Return value : Device ID * Modify : * warning : *******************************************************************************/ static void vd_set_all(video_init_all *param) { int i, dev_num=0; video_input_init video_val[4]; #if 0 for(i=0 ; i<4 ; i++) { printk("[DRV || %s] ch%d / fmt:%d / input:%d / interface:%d\n",__func__ , param->ch_param[i].ch , param->ch_param[i].format , param->ch_param[i].input , param->ch_param[i].interface); } #endif mipi_datatype_set(VD_DATA_TYPE_YUV422); // to do mipi_tx_init(dev_num); for( i=0 ; i<4 ; i++) { video_val[i].ch = param->ch_param[i].ch; video_val[i].format = param->ch_param[i].format; video_val[i].input = param->ch_param[i].input; if(ich_param[i].interface; else video_val[i].interface = DISABLE; vd_jaguar1_init_set(&video_val[i]); mipi_video_format_set(&video_val[i]); #ifdef FOR_IMX6 set_imx_video_format(&video_val[i]); if(video_val[i].interface == DISABLE) { printk("[DRV] Nothing selected [video ch : %d]\n", i); } else { init_imx_mipi(i); } #endif } arb_init(dev_num); disable_parallel(dev_num); vd_pattern_enable(); } /******************************************************************************* * Description : Check ID * Argurments : dec(slave address) * Return value : Device ID * Modify : * warning : *******************************************************************************/ static int check_id(unsigned int dec) { int ret; gpio_i2c_write(dec, 0xFF, 0x00); ret = gpio_i2c_read(dec, 0xf4); return ret; } /******************************************************************************* * Description : Get rev ID * Argurments : dec(slave address) * Return value : rev ID * Modify : * warning : *******************************************************************************/ static int check_rev(unsigned int dec) { int ret; gpio_i2c_write(dec, 0xFF, 0x00); ret = gpio_i2c_read(dec, 0xf5); return ret; } /******************************************************************************* * Description : Check decoder count * Argurments : void * Return value : (total chip count - 1) or -1(not found any chip) * Modify : * warning : *******************************************************************************/ static int check_decoder_count(void) { int chip, i; int ret = -1; for(chip=0;chip<4;chip++) { chip_id[chip] = check_id(jaguar1_i2c_addr[chip]); rev_id[chip] = check_rev(jaguar1_i2c_addr[chip]); if( (chip_id[chip] != JAGUAR1_4PORT_R0_ID ) && (chip_id[chip] != JAGUAR1_2PORT_R0_ID) && (chip_id[chip] != JAGUAR1_1PORT_R0_ID) && (chip_id[chip] != AFE_NVP6134E_R0_ID) ) { printk("Device ID Error... %x, Chip Count:[%d]\n", chip_id[chip], chip); chip_id[chip] = 0xFF; } else { printk("Device (0x%x) ID OK... %x , Chip Count:[%d]\n", jaguar1_i2c_addr[chip], chip_id[chip], chip); printk("Device (0x%x) REV %x\n", jaguar1_i2c_addr[chip], rev_id[chip]); jaguar1_i2c_addr[jaguar1_cnt] = jaguar1_i2c_addr[chip]; if(jaguar1_cnt