xref: /OK3568_Linux_fs/kernel/drivers/media/i2c/jaguar1_drv/jaguar1_drv.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /********************************************************************************
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *  Copyright (C) 2017 	NEXTCHIP Inc. All rights reserved.
5*4882a593Smuzhiyun  *  Module		: jaguar1_drv.c
6*4882a593Smuzhiyun  *  Description	:
7*4882a593Smuzhiyun  *  Author		:
8*4882a593Smuzhiyun  *  Date        :
9*4882a593Smuzhiyun  *  Version		: Version 1.0
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  ********************************************************************************
12*4882a593Smuzhiyun  *  History     :
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  ********************************************************************************/
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <linux/kernel.h>
18*4882a593Smuzhiyun #include <linux/version.h>
19*4882a593Smuzhiyun #include <linux/module.h>
20*4882a593Smuzhiyun #include <linux/types.h>
21*4882a593Smuzhiyun #include <linux/errno.h>
22*4882a593Smuzhiyun #include <linux/fcntl.h>
23*4882a593Smuzhiyun #include <linux/mm.h>
24*4882a593Smuzhiyun #include <linux/proc_fs.h>
25*4882a593Smuzhiyun #include <linux/miscdevice.h>
26*4882a593Smuzhiyun #include <linux/fs.h>
27*4882a593Smuzhiyun #include <linux/slab.h>
28*4882a593Smuzhiyun #include <linux/init.h>
29*4882a593Smuzhiyun #include <linux/uaccess.h>
30*4882a593Smuzhiyun #include <asm/io.h>
31*4882a593Smuzhiyun #include <linux/interrupt.h>
32*4882a593Smuzhiyun #include <linux/ioport.h>
33*4882a593Smuzhiyun #include <linux/string.h>
34*4882a593Smuzhiyun #include <linux/list.h>
35*4882a593Smuzhiyun #include <asm/delay.h>
36*4882a593Smuzhiyun #include <linux/timer.h>
37*4882a593Smuzhiyun #include <linux/delay.h>
38*4882a593Smuzhiyun #include <linux/proc_fs.h>
39*4882a593Smuzhiyun #include <linux/poll.h>
40*4882a593Smuzhiyun #include <asm/bitops.h>
41*4882a593Smuzhiyun #include <linux/uaccess.h>
42*4882a593Smuzhiyun #include <asm/irq.h>
43*4882a593Smuzhiyun #include <linux/moduleparam.h>
44*4882a593Smuzhiyun #include <linux/ioport.h>
45*4882a593Smuzhiyun #include <linux/interrupt.h>
46*4882a593Smuzhiyun #include <linux/semaphore.h>
47*4882a593Smuzhiyun #include <linux/kthread.h>
48*4882a593Smuzhiyun #include <linux/i2c.h>
49*4882a593Smuzhiyun #include <linux/i2c-dev.h>
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #include "jaguar1_common.h"
52*4882a593Smuzhiyun #include "jaguar1_video.h"
53*4882a593Smuzhiyun #include "jaguar1_coax_protocol.h"
54*4882a593Smuzhiyun #include "jaguar1_motion.h"
55*4882a593Smuzhiyun #include "jaguar1_ioctl.h"
56*4882a593Smuzhiyun #include "jaguar1_video_eq.h"
57*4882a593Smuzhiyun #include "jaguar1_mipi.h"
58*4882a593Smuzhiyun #include "jaguar1_drv.h"
59*4882a593Smuzhiyun #ifdef FOR_IMX6
60*4882a593Smuzhiyun #include "imx_mipi.h"
61*4882a593Smuzhiyun #endif
62*4882a593Smuzhiyun //#include "video_eq.h" //To do
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun //#define STREAM_ON_DEFLAULT
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define I2C_0       (0)
67*4882a593Smuzhiyun #define I2C_1       (1)
68*4882a593Smuzhiyun #define I2C_2       (2)
69*4882a593Smuzhiyun #define I2C_3       (3)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #define JAGUAR1_4PORT_R0_ID 0xB0
72*4882a593Smuzhiyun #define JAGUAR1_2PORT_R0_ID 0xA0
73*4882a593Smuzhiyun #define JAGUAR1_1PORT_R0_ID 0xA2
74*4882a593Smuzhiyun #define AFE_NVP6134E_R0_ID 	0x80
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun #define JAGUAR1_4PORT_REV_ID 0x00
77*4882a593Smuzhiyun #define JAGUAR1_2PORT_REV_ID 0x00
78*4882a593Smuzhiyun #define JAGUAR1_1PORT_REV_ID 0x00
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun static int chip_id[4];
81*4882a593Smuzhiyun static int rev_id[4];
82*4882a593Smuzhiyun static int jaguar1_cnt;
83*4882a593Smuzhiyun unsigned int jaguar1_i2c_addr[4] = {0x60, 0x62, 0x64, 0x66};
84*4882a593Smuzhiyun unsigned int jaguar1_mclk = 0; //0:756 1:594 2:378 3:1242
85*4882a593Smuzhiyun module_param_named(jaguar1_mclk, jaguar1_mclk, uint, S_IRUGO);
86*4882a593Smuzhiyun unsigned int jaguar1_lane = 4; //2 or 4
87*4882a593Smuzhiyun module_param_named(jaguar1_lane, jaguar1_lane, uint, S_IRUGO);
88*4882a593Smuzhiyun static unsigned int chn = 4;
89*4882a593Smuzhiyun module_param_named(jaguar1_chn, chn, uint, S_IRUGO);
90*4882a593Smuzhiyun static unsigned int init = 0;
91*4882a593Smuzhiyun module_param_named(jaguar1_init, init, uint, S_IRUGO);
92*4882a593Smuzhiyun static unsigned int fmt = 2;  //0:960H;1:720P 2:1080P 3:960P 4:SH720
93*4882a593Smuzhiyun module_param_named(jaguar1_fmt, fmt, uint, S_IRUGO);
94*4882a593Smuzhiyun static unsigned int ntpal = 0;
95*4882a593Smuzhiyun module_param_named(jaguar1_ntpal, ntpal, uint, S_IRUGO);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun static bool jaguar1_init_state;
98*4882a593Smuzhiyun struct semaphore jaguar1_lock;
99*4882a593Smuzhiyun struct i2c_client* jaguar1_client;
100*4882a593Smuzhiyun static struct i2c_board_info hi_info =
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun 	I2C_BOARD_INFO("jaguar1", 0x60),
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun decoder_get_information_str decoder_inform;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun unsigned int acp_mode_enable = 1;
107*4882a593Smuzhiyun module_param(acp_mode_enable, uint, S_IRUGO);
108*4882a593Smuzhiyun 
vd_pattern_enable(void)109*4882a593Smuzhiyun static void vd_pattern_enable(void)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0xFF, 0x00);
112*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0x1C, 0x1A);
113*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0x1D, 0x1A);
114*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0x1E, 0x1A);
115*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0x1F, 0x1A);
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0xFF, 0x05);
118*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0x6A, 0x80);
119*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0xFF, 0x06);
120*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0x6A, 0x80);
121*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0xFF, 0x07);
122*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0x6A, 0x80);
123*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0xFF, 0x08);
124*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0x6A, 0x80);
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /*******************************************************************************
128*4882a593Smuzhiyun  *	Description		: Sample function - for select video format
129*4882a593Smuzhiyun  *	Argurments		: int dev_num(i2c_address array's num)
130*4882a593Smuzhiyun  *	Return value	: void
131*4882a593Smuzhiyun  *	Modify			:
132*4882a593Smuzhiyun  *	warning			:
133*4882a593Smuzhiyun  *******************************************************************************/
134*4882a593Smuzhiyun #if 0
135*4882a593Smuzhiyun static void set_default_video_fmt(int dev_num)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun #if 0 // Activate this block if a default video-setting is required.
138*4882a593Smuzhiyun 	int i;
139*4882a593Smuzhiyun 	video_input_init  video_val;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	/* default video datatype setting */
142*4882a593Smuzhiyun 	mipi_datatype_set(VD_DATA_TYPE_YUV422);
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	/* mipi_tx_initial */
145*4882a593Smuzhiyun 	mipi_tx_init(dev_num);
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	/* run default video format setting */
148*4882a593Smuzhiyun 	for( i=0 ; i<4 ; i++)
149*4882a593Smuzhiyun 	{
150*4882a593Smuzhiyun 		video_val.ch = i;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 		/* select video format, include struct'vd_vi_init_list' in jaguar1_video_table.h
153*4882a593Smuzhiyun 		 *  ex > AHD20_1080P_30P / AHD20_720P_25P_EX_Btype / AHD20_SD_H960_2EX_Btype_NT */
154*4882a593Smuzhiyun 		video_val.format = AHD20_720P_30P_EX_Btype;
155*4882a593Smuzhiyun 		// select analog input type, SINGLE_ENDED or DIFFERENTIAL
156*4882a593Smuzhiyun 		video_val.input = SINGLE_ENDED;
157*4882a593Smuzhiyun 		// select decoder to soc interface
158*4882a593Smuzhiyun 		video_val.interface = YUV_422;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 		// run video setting
161*4882a593Smuzhiyun 		vd_jaguar1_init_set(&video_val);
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 		// run video format setting for mipi/arbiter
164*4882a593Smuzhiyun 		mipi_video_format_set(&video_val);
165*4882a593Smuzhiyun 		set_imx_video_format(&video_val);
166*4882a593Smuzhiyun 		init_imx_mipi(i);
167*4882a593Smuzhiyun 	}
168*4882a593Smuzhiyun 	arb_init(dev_num);
169*4882a593Smuzhiyun 	disable_parallel(dev_num);
170*4882a593Smuzhiyun #endif
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun #endif
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun /*******************************************************************************
175*4882a593Smuzhiyun  *	Description		: Check ID
176*4882a593Smuzhiyun  *	Argurments		: dec(slave address)
177*4882a593Smuzhiyun  *	Return value	: Device ID
178*4882a593Smuzhiyun  *	Modify			:
179*4882a593Smuzhiyun  *	warning			:
180*4882a593Smuzhiyun  *******************************************************************************/
vd_set_all(video_init_all * param)181*4882a593Smuzhiyun static void vd_set_all(video_init_all *param)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun 	int i, dev_num=0;
184*4882a593Smuzhiyun 	video_input_init  video_val[4];
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun #if 0
187*4882a593Smuzhiyun 	for(i=0 ; i<4 ; i++)
188*4882a593Smuzhiyun 	{
189*4882a593Smuzhiyun 		printk("[DRV || %s] ch%d / fmt:%d / input:%d / interface:%d\n",__func__
190*4882a593Smuzhiyun 				, param->ch_param[i].ch
191*4882a593Smuzhiyun 				, param->ch_param[i].format
192*4882a593Smuzhiyun 				, param->ch_param[i].input
193*4882a593Smuzhiyun 				, param->ch_param[i].interface);
194*4882a593Smuzhiyun 	}
195*4882a593Smuzhiyun #endif
196*4882a593Smuzhiyun 	mipi_datatype_set(VD_DATA_TYPE_YUV422); // to do
197*4882a593Smuzhiyun 	mipi_tx_init(dev_num);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	for( i=0 ; i<4 ; i++)
200*4882a593Smuzhiyun 	{
201*4882a593Smuzhiyun 		video_val[i].ch = param->ch_param[i].ch;
202*4882a593Smuzhiyun 		video_val[i].format = param->ch_param[i].format;
203*4882a593Smuzhiyun 		video_val[i].input = param->ch_param[i].input;
204*4882a593Smuzhiyun 		if(i<chn)
205*4882a593Smuzhiyun 			video_val[i].interface = param->ch_param[i].interface;
206*4882a593Smuzhiyun 		else
207*4882a593Smuzhiyun 			video_val[i].interface = DISABLE;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 		vd_jaguar1_init_set(&video_val[i]);
210*4882a593Smuzhiyun 		mipi_video_format_set(&video_val[i]);
211*4882a593Smuzhiyun #ifdef FOR_IMX6
212*4882a593Smuzhiyun 		set_imx_video_format(&video_val[i]);
213*4882a593Smuzhiyun 		if(video_val[i].interface == DISABLE)
214*4882a593Smuzhiyun 		{
215*4882a593Smuzhiyun 			printk("[DRV] Nothing selected [video ch : %d]\n", i);
216*4882a593Smuzhiyun 		}
217*4882a593Smuzhiyun 		else
218*4882a593Smuzhiyun 		{
219*4882a593Smuzhiyun 			init_imx_mipi(i);
220*4882a593Smuzhiyun 		}
221*4882a593Smuzhiyun #endif
222*4882a593Smuzhiyun 	}
223*4882a593Smuzhiyun 	arb_init(dev_num);
224*4882a593Smuzhiyun 	disable_parallel(dev_num);
225*4882a593Smuzhiyun 	vd_pattern_enable();
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun /*******************************************************************************
229*4882a593Smuzhiyun  *	Description		: Check ID
230*4882a593Smuzhiyun  *	Argurments		: dec(slave address)
231*4882a593Smuzhiyun  *	Return value	: Device ID
232*4882a593Smuzhiyun  *	Modify			:
233*4882a593Smuzhiyun  *	warning			:
234*4882a593Smuzhiyun  *******************************************************************************/
check_id(unsigned int dec)235*4882a593Smuzhiyun static int check_id(unsigned int dec)
236*4882a593Smuzhiyun {
237*4882a593Smuzhiyun 	int ret;
238*4882a593Smuzhiyun 	gpio_i2c_write(dec, 0xFF, 0x00);
239*4882a593Smuzhiyun 	ret = gpio_i2c_read(dec, 0xf4);
240*4882a593Smuzhiyun 	return ret;
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun /*******************************************************************************
244*4882a593Smuzhiyun  *	Description		: Get rev ID
245*4882a593Smuzhiyun  *	Argurments		: dec(slave address)
246*4882a593Smuzhiyun  *	Return value	: rev ID
247*4882a593Smuzhiyun  *	Modify			:
248*4882a593Smuzhiyun  *	warning			:
249*4882a593Smuzhiyun  *******************************************************************************/
check_rev(unsigned int dec)250*4882a593Smuzhiyun static int check_rev(unsigned int dec)
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun 	int ret;
253*4882a593Smuzhiyun 	gpio_i2c_write(dec, 0xFF, 0x00);
254*4882a593Smuzhiyun 	ret = gpio_i2c_read(dec, 0xf5);
255*4882a593Smuzhiyun 	return ret;
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun /*******************************************************************************
259*4882a593Smuzhiyun  *	Description		: Check decoder count
260*4882a593Smuzhiyun  *	Argurments		: void
261*4882a593Smuzhiyun  *	Return value	: (total chip count - 1) or -1(not found any chip)
262*4882a593Smuzhiyun  *	Modify			:
263*4882a593Smuzhiyun  *	warning			:
264*4882a593Smuzhiyun  *******************************************************************************/
check_decoder_count(void)265*4882a593Smuzhiyun static int check_decoder_count(void)
266*4882a593Smuzhiyun {
267*4882a593Smuzhiyun 	int chip, i;
268*4882a593Smuzhiyun 	int ret = -1;
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 	for(chip=0;chip<4;chip++)
271*4882a593Smuzhiyun 	{
272*4882a593Smuzhiyun 		chip_id[chip] = check_id(jaguar1_i2c_addr[chip]);
273*4882a593Smuzhiyun 		rev_id[chip]  = check_rev(jaguar1_i2c_addr[chip]);
274*4882a593Smuzhiyun 		if( (chip_id[chip] != JAGUAR1_4PORT_R0_ID )  	&&
275*4882a593Smuzhiyun 				(chip_id[chip] != JAGUAR1_2PORT_R0_ID) 		&&
276*4882a593Smuzhiyun 				(chip_id[chip] != JAGUAR1_1PORT_R0_ID)		&&
277*4882a593Smuzhiyun 				(chip_id[chip] != AFE_NVP6134E_R0_ID)
278*4882a593Smuzhiyun 		  )
279*4882a593Smuzhiyun 		{
280*4882a593Smuzhiyun 			printk("Device ID Error... %x, Chip Count:[%d]\n", chip_id[chip], chip);
281*4882a593Smuzhiyun 			jaguar1_i2c_addr[chip] = 0xFF;
282*4882a593Smuzhiyun 			chip_id[chip] = 0xFF;
283*4882a593Smuzhiyun 		}
284*4882a593Smuzhiyun 		else
285*4882a593Smuzhiyun 		{
286*4882a593Smuzhiyun 			printk("Device (0x%x) ID OK... %x , Chip Count:[%d]\n", jaguar1_i2c_addr[chip], chip_id[chip], chip);
287*4882a593Smuzhiyun 			printk("Device (0x%x) REV %x\n", jaguar1_i2c_addr[chip], rev_id[chip]);
288*4882a593Smuzhiyun 			jaguar1_i2c_addr[jaguar1_cnt] = jaguar1_i2c_addr[chip];
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 			if(jaguar1_cnt<chip)
291*4882a593Smuzhiyun 			{
292*4882a593Smuzhiyun 				jaguar1_i2c_addr[chip] = 0xFF;
293*4882a593Smuzhiyun 			}
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 			chip_id[jaguar1_cnt] = chip_id[chip];
296*4882a593Smuzhiyun 			rev_id[jaguar1_cnt]  = rev_id[chip];
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 			jaguar1_cnt++;
299*4882a593Smuzhiyun 		}
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 		if((chip == 3) && (jaguar1_cnt < chip))
302*4882a593Smuzhiyun 		{
303*4882a593Smuzhiyun 			for(i = jaguar1_cnt; i < 4; i++)
304*4882a593Smuzhiyun 			{
305*4882a593Smuzhiyun 				chip_id[i] = 0xff;
306*4882a593Smuzhiyun 				rev_id[i]  = 0xff;
307*4882a593Smuzhiyun 			}
308*4882a593Smuzhiyun 		}
309*4882a593Smuzhiyun 	}
310*4882a593Smuzhiyun 	printk("Chip Count = %d\n", jaguar1_cnt);
311*4882a593Smuzhiyun 	printk("Address [0x%x][0x%x][0x%x][0x%x]\n",jaguar1_i2c_addr[0],jaguar1_i2c_addr[1],jaguar1_i2c_addr[2],jaguar1_i2c_addr[3]);
312*4882a593Smuzhiyun 	printk("Chip Id [0x%x][0x%x][0x%x][0x%x]\n",chip_id[0],chip_id[1],chip_id[2],chip_id[3]);
313*4882a593Smuzhiyun 	printk("Rev Id [0x%x][0x%x][0x%x][0x%x]\n",rev_id[0],rev_id[1],rev_id[2],rev_id[3]);
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	for( i = 0; i < 4; i++ )
316*4882a593Smuzhiyun 	{
317*4882a593Smuzhiyun 		decoder_inform.chip_id[i] = chip_id[i];
318*4882a593Smuzhiyun 		decoder_inform.chip_rev[i] = rev_id[i];
319*4882a593Smuzhiyun 		decoder_inform.chip_addr[i] = jaguar1_i2c_addr[i];
320*4882a593Smuzhiyun 	}
321*4882a593Smuzhiyun 	decoder_inform.Total_Chip_Cnt = jaguar1_cnt;
322*4882a593Smuzhiyun 	ret = jaguar1_cnt;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	return ret;
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun /*******************************************************************************
328*4882a593Smuzhiyun  *	Description		: Video decoder initial
329*4882a593Smuzhiyun  *	Argurments		: void
330*4882a593Smuzhiyun  *	Return value	: void
331*4882a593Smuzhiyun  *	Modify			:
332*4882a593Smuzhiyun  *	warning			:
333*4882a593Smuzhiyun  *******************************************************************************/
video_decoder_init(void)334*4882a593Smuzhiyun static void video_decoder_init(void)
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun 	int ii = 0;
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	// Pad Control Setting
339*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0xff, 0x04);
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	for(ii =0; ii<36; ii++)
342*4882a593Smuzhiyun 	{
343*4882a593Smuzhiyun 		gpio_i2c_write(jaguar1_i2c_addr[0], 0xa0 + ii , 0x24);
344*4882a593Smuzhiyun 	}
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun 	// Clock Delay Setting
347*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0xff, 0x01);
348*4882a593Smuzhiyun 	for(ii =0; ii<4; ii++)
349*4882a593Smuzhiyun 	{
350*4882a593Smuzhiyun 		gpio_i2c_write(jaguar1_i2c_addr[0], 0xcc + ii , 0x64);
351*4882a593Smuzhiyun 	}
352*4882a593Smuzhiyun #if 1
353*4882a593Smuzhiyun 	// MIPI_V_REG_OFF
354*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0xff, 0x21);
355*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0x07, 0x80);
356*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0x07, 0x00);
357*4882a593Smuzhiyun #endif
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun #if 1
360*4882a593Smuzhiyun 	// AGC_OFF  08.31
361*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0xff, 0x0A);
362*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0x77, 0x8F);
363*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0xF7, 0x8F);
364*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0xff, 0x0B);
365*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0x77, 0x8F);
366*4882a593Smuzhiyun 	gpio_i2c_write(jaguar1_i2c_addr[0], 0xF7, 0x8F);
367*4882a593Smuzhiyun #endif
368*4882a593Smuzhiyun }
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun /*******************************************************************************
371*4882a593Smuzhiyun  *	Description		: Driver open
372*4882a593Smuzhiyun  *	Argurments		:
373*4882a593Smuzhiyun  *	Return value	:
374*4882a593Smuzhiyun  *	Modify			:
375*4882a593Smuzhiyun  *	warning			:
376*4882a593Smuzhiyun  *******************************************************************************/
jaguar1_open(struct inode * inode,struct file * file)377*4882a593Smuzhiyun static int jaguar1_open(struct inode * inode, struct file * file)
378*4882a593Smuzhiyun {
379*4882a593Smuzhiyun 	printk("[DRV] Jaguar1 Driver Open\n");
380*4882a593Smuzhiyun 	printk("[DRV] Jaguar1 Driver Ver::%s\n", DRIVER_VER);
381*4882a593Smuzhiyun 	return 0;
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun /*******************************************************************************
385*4882a593Smuzhiyun  *	Description		: Driver close
386*4882a593Smuzhiyun  *	Argurments		:
387*4882a593Smuzhiyun  *	Return value	:
388*4882a593Smuzhiyun  *	Modify			:
389*4882a593Smuzhiyun  *	warning			:
390*4882a593Smuzhiyun  *******************************************************************************/
jaguar1_close(struct inode * inode,struct file * file)391*4882a593Smuzhiyun static int jaguar1_close(struct inode * inode, struct file * file)
392*4882a593Smuzhiyun {
393*4882a593Smuzhiyun 	printk("[DRV] Jaguar1 Driver Close\n");
394*4882a593Smuzhiyun 	return 0;
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun /*******************************************************************************
398*4882a593Smuzhiyun  *	Description		: Driver IOCTL function
399*4882a593Smuzhiyun  *	Argurments		:
400*4882a593Smuzhiyun  *	Return value	:
401*4882a593Smuzhiyun  *	Modify			:
402*4882a593Smuzhiyun  *	warning			:
403*4882a593Smuzhiyun  *******************************************************************************/
jaguar1_ioctl(struct file * file,unsigned int cmd,unsigned long arg)404*4882a593Smuzhiyun static long jaguar1_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun 	int cpy2usr_ret;
407*4882a593Smuzhiyun 	unsigned int __user *argp = (unsigned int __user *)arg;
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 	/* AllVideo Variable */
410*4882a593Smuzhiyun 	video_init_all all_vd_val;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	/* Video Variable */
413*4882a593Smuzhiyun 	video_input_init  video_val;
414*4882a593Smuzhiyun 	video_output_init vo_seq_set;
415*4882a593Smuzhiyun 	video_equalizer_info_s video_eq;
416*4882a593Smuzhiyun 	video_video_loss_s vidloss;
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	/* Coaxial Protocol Variable */
419*4882a593Smuzhiyun 	NC_VD_COAX_STR           coax_val;
420*4882a593Smuzhiyun 	NC_VD_COAX_BANK_DUMP_STR coax_bank_dump;
421*4882a593Smuzhiyun 	FIRMWARE_UP_FILE_INFO    coax_fw_val;
422*4882a593Smuzhiyun 	NC_VD_COAX_TEST_STR      coax_test_val;
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun 	/* Motion Variable */
425*4882a593Smuzhiyun 	motion_mode motion_set;
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	nc_acp_rw_data ispdata;
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 	down(&jaguar1_lock);
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 	switch (cmd)
432*4882a593Smuzhiyun 	{
433*4882a593Smuzhiyun 		/*===============================================================================================
434*4882a593Smuzhiyun 		 * Set All - for MIPI Interface
435*4882a593Smuzhiyun 		 *===============================================================================================*/
436*4882a593Smuzhiyun 		case IOC_VDEC_INIT_ALL:
437*4882a593Smuzhiyun 			if(copy_from_user(&all_vd_val, argp, sizeof(video_init_all)))
438*4882a593Smuzhiyun 				printk("IOC_VDEC_INPUT_INIT error\n");
439*4882a593Smuzhiyun 			vd_set_all(&all_vd_val);
440*4882a593Smuzhiyun 			break;
441*4882a593Smuzhiyun 		/*===============================================================================================
442*4882a593Smuzhiyun 		 * Video Initialize
443*4882a593Smuzhiyun 		 *===============================================================================================*/
444*4882a593Smuzhiyun 		case IOC_VDEC_INPUT_INIT:
445*4882a593Smuzhiyun 			if(copy_from_user(&video_val, argp, sizeof(video_input_init)))
446*4882a593Smuzhiyun 				printk("IOC_VDEC_INPUT_INIT error\n");
447*4882a593Smuzhiyun 			vd_jaguar1_init_set(&video_val);
448*4882a593Smuzhiyun 			break;
449*4882a593Smuzhiyun 		case IOC_VDEC_OUTPUT_SEQ_SET:
450*4882a593Smuzhiyun 			if(copy_from_user(&vo_seq_set, argp, sizeof(video_output_init)))
451*4882a593Smuzhiyun 				printk("IOC_VDEC_INPUT_INIT error\n");
452*4882a593Smuzhiyun 			vd_jaguar1_vo_ch_seq_set(&vo_seq_set);
453*4882a593Smuzhiyun 			break;
454*4882a593Smuzhiyun 		case IOC_VDEC_VIDEO_EQ_SET:
455*4882a593Smuzhiyun 			if(copy_from_user(&video_eq, argp, sizeof(video_equalizer_info_s)))
456*4882a593Smuzhiyun 				printk("IOC_VDEC_INPUT_INIT error\n");
457*4882a593Smuzhiyun 			video_input_eq_val_set(&video_eq);
458*4882a593Smuzhiyun 			break;
459*4882a593Smuzhiyun 		case IOC_VDEC_VIDEO_SW_RESET:
460*4882a593Smuzhiyun 			if(copy_from_user(&video_val, argp, sizeof(video_input_init)))
461*4882a593Smuzhiyun 				printk("IOC_VDEC_INPUT_INIT error\n");
462*4882a593Smuzhiyun 			vd_jaguar1_sw_reset(&video_val);
463*4882a593Smuzhiyun 			break;
464*4882a593Smuzhiyun 		case IOC_VDEC_VIDEO_EQ_CABLE_SET:
465*4882a593Smuzhiyun 			if(copy_from_user(&video_eq, argp, sizeof(video_equalizer_info_s)))
466*4882a593Smuzhiyun 				printk("IOC_VDEC_INPUT_INIT error\n");
467*4882a593Smuzhiyun 			video_input_eq_cable_set(&video_eq);
468*4882a593Smuzhiyun 			break;
469*4882a593Smuzhiyun 		case IOC_VDEC_VIDEO_EQ_ANALOG_INPUT_SET:
470*4882a593Smuzhiyun 			if(copy_from_user(&video_eq, argp, sizeof(video_equalizer_info_s)))
471*4882a593Smuzhiyun 				printk("IOC_VDEC_INPUT_INIT error\n");
472*4882a593Smuzhiyun 			video_input_eq_analog_input_set(&video_eq);
473*4882a593Smuzhiyun 			break;
474*4882a593Smuzhiyun 		case IOC_VDEC_VIDEO_GET_VIDEO_LOSS:
475*4882a593Smuzhiyun 			if(copy_from_user(&vidloss, argp, sizeof(video_video_loss_s)))
476*4882a593Smuzhiyun 				printk("IOC_VDEC_VIDEO_GET_VIDEO_LOSS error\n");
477*4882a593Smuzhiyun 			vd_jaguar1_get_novideo(&vidloss);
478*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &vidloss, sizeof(video_video_loss_s));
479*4882a593Smuzhiyun 			break;
480*4882a593Smuzhiyun 			/*===============================================================================================
481*4882a593Smuzhiyun 			 * Coaxial Protocol
482*4882a593Smuzhiyun 			 *===============================================================================================*/
483*4882a593Smuzhiyun 		case IOC_VDEC_COAX_TX_INIT:   //SK_CHANGE 170703
484*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
485*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_TX_INIT error\n");
486*4882a593Smuzhiyun 			coax_tx_init(&coax_val);
487*4882a593Smuzhiyun 			break;
488*4882a593Smuzhiyun 		case IOC_VDEC_COAX_TX_16BIT_INIT:   //SK_CHANGE 170703
489*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
490*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_TX_INIT error\n");
491*4882a593Smuzhiyun 			coax_tx_16bit_init(&coax_val);
492*4882a593Smuzhiyun 			break;
493*4882a593Smuzhiyun 		case IOC_VDEC_COAX_TX_CMD_SEND: //SK_CHANGE 170703
494*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
495*4882a593Smuzhiyun 				printk(" IOC_VDEC_COAX_TX_CMD_SEND error\n");
496*4882a593Smuzhiyun 			coax_tx_cmd_send(&coax_val);
497*4882a593Smuzhiyun 			break;
498*4882a593Smuzhiyun 		case IOC_VDEC_COAX_TX_16BIT_CMD_SEND: //SK_CHANGE 170703
499*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
500*4882a593Smuzhiyun 				printk(" IOC_VDEC_COAX_TX_CMD_SEND error\n");
501*4882a593Smuzhiyun 			coax_tx_16bit_cmd_send(&coax_val);
502*4882a593Smuzhiyun 			break;
503*4882a593Smuzhiyun 		case IOC_VDEC_COAX_TX_CVI_NEW_CMD_SEND: //SK_CHANGE 170703
504*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
505*4882a593Smuzhiyun 				printk(" IOC_VDEC_COAX_TX_CMD_SEND error\n");
506*4882a593Smuzhiyun 			coax_tx_cvi_new_cmd_send(&coax_val);
507*4882a593Smuzhiyun 			break;
508*4882a593Smuzhiyun 		case IOC_VDEC_COAX_RX_INIT:
509*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
510*4882a593Smuzhiyun 				printk(" IOC_VDEC_COAX_RX_INIT error\n");
511*4882a593Smuzhiyun 			coax_rx_init(&coax_val);
512*4882a593Smuzhiyun 			break;
513*4882a593Smuzhiyun 		case IOC_VDEC_COAX_RX_DATA_READ:
514*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
515*4882a593Smuzhiyun 				printk(" IOC_VDEC_COAX_RX_DATA_READ error\n");
516*4882a593Smuzhiyun 			coax_rx_data_get(&coax_val);
517*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_val, sizeof(NC_VD_COAX_STR));
518*4882a593Smuzhiyun 			break;
519*4882a593Smuzhiyun 		case IOC_VDEC_COAX_RX_BUF_CLEAR:
520*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
521*4882a593Smuzhiyun 				printk(" IOC_VDEC_COAX_RX_BUF_CLEAR error\n");
522*4882a593Smuzhiyun 			coax_rx_buffer_clear(&coax_val);
523*4882a593Smuzhiyun 			break;
524*4882a593Smuzhiyun 		case IOC_VDEC_COAX_RX_DEINIT:
525*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
526*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_RX_DEINIT error\n");
527*4882a593Smuzhiyun 			coax_rx_deinit(&coax_val);
528*4882a593Smuzhiyun 			break;
529*4882a593Smuzhiyun 		case IOC_VDEC_COAX_BANK_DUMP_GET:
530*4882a593Smuzhiyun 			if(copy_from_user(&coax_bank_dump, argp, sizeof(NC_VD_COAX_BANK_DUMP_STR)))
531*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_BANK_DUMP_GET error\n");
532*4882a593Smuzhiyun 			coax_test_Bank_dump_get(&coax_bank_dump);
533*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_bank_dump, sizeof(NC_VD_COAX_BANK_DUMP_STR));
534*4882a593Smuzhiyun 			break;
535*4882a593Smuzhiyun 		case IOC_VDEC_COAX_RX_DETECTION_READ:
536*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
537*4882a593Smuzhiyun 				printk(" IOC_VDEC_COAX_RX_DATA_READ error\n");
538*4882a593Smuzhiyun 			coax_acp_rx_detect_get(&coax_val);
539*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_val, sizeof(NC_VD_COAX_STR));
540*4882a593Smuzhiyun 			break;
541*4882a593Smuzhiyun 			/*===============================================================================================
542*4882a593Smuzhiyun 			 * Coaxial Protocol. Function
543*4882a593Smuzhiyun 			 *===============================================================================================*/
544*4882a593Smuzhiyun 		case IOC_VDEC_COAX_RT_NRT_MODE_CHANGE_SET:
545*4882a593Smuzhiyun 			if(copy_from_user(&coax_val, argp, sizeof(NC_VD_COAX_STR)))
546*4882a593Smuzhiyun 				printk(" IOC_VDEC_COAX_SHOT_SET error\n");
547*4882a593Smuzhiyun 			coax_option_rt_nrt_mode_change_set(&coax_val);
548*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_val, sizeof(NC_VD_COAX_STR));
549*4882a593Smuzhiyun 			break;
550*4882a593Smuzhiyun 		case IOC_VDEC_ACP_WRITE:
551*4882a593Smuzhiyun 			if (copy_from_user(&ispdata, argp, sizeof(nc_acp_rw_data))) {
552*4882a593Smuzhiyun 				up(&jaguar1_lock);
553*4882a593Smuzhiyun 				return -1;
554*4882a593Smuzhiyun 			}
555*4882a593Smuzhiyun 			if(ispdata.opt == 0)
556*4882a593Smuzhiyun 				acp_isp_write(ispdata.ch, ispdata.addr, ispdata.data);
557*4882a593Smuzhiyun 			else
558*4882a593Smuzhiyun 			{
559*4882a593Smuzhiyun 				ispdata.data = acp_isp_read(ispdata.ch, ispdata.addr);
560*4882a593Smuzhiyun 				if(copy_to_user(argp, &ispdata, sizeof(nc_acp_rw_data)))
561*4882a593Smuzhiyun 					printk("IOC_VDEC_ACP_WRITE error\n");
562*4882a593Smuzhiyun 			}
563*4882a593Smuzhiyun 			break;
564*4882a593Smuzhiyun 			/*===============================================================================================
565*4882a593Smuzhiyun 			 * Coaxial Protocol FW Update
566*4882a593Smuzhiyun 			 *===============================================================================================*/
567*4882a593Smuzhiyun 		case IOC_VDEC_COAX_FW_ACP_HEADER_GET:
568*4882a593Smuzhiyun 			if(copy_from_user(&coax_fw_val, argp, sizeof(FIRMWARE_UP_FILE_INFO)))
569*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_FW_READY_CMD_SET error\n");
570*4882a593Smuzhiyun 			coax_fw_ready_header_check_from_isp_recv(&coax_fw_val);
571*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_fw_val, sizeof(FIRMWARE_UP_FILE_INFO));
572*4882a593Smuzhiyun 			break;
573*4882a593Smuzhiyun 		case IOC_VDEC_COAX_FW_READY_CMD_SET:
574*4882a593Smuzhiyun 			if(copy_from_user(&coax_fw_val, argp, sizeof(FIRMWARE_UP_FILE_INFO)))
575*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_FW_READY_CMD_SET error\n");
576*4882a593Smuzhiyun 			coax_fw_ready_cmd_to_isp_send(&coax_fw_val);
577*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_fw_val, sizeof(FIRMWARE_UP_FILE_INFO));
578*4882a593Smuzhiyun 			break;
579*4882a593Smuzhiyun 		case IOC_VDEC_COAX_FW_READY_ACK_GET:
580*4882a593Smuzhiyun 			if(copy_from_user(&coax_fw_val, argp, sizeof(FIRMWARE_UP_FILE_INFO)))
581*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_FW_READY_ISP_STATUS_GET error\n");
582*4882a593Smuzhiyun 			coax_fw_ready_cmd_ack_from_isp_recv(&coax_fw_val);
583*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_fw_val, sizeof(FIRMWARE_UP_FILE_INFO));
584*4882a593Smuzhiyun 			break;
585*4882a593Smuzhiyun 		case IOC_VDEC_COAX_FW_START_CMD_SET:
586*4882a593Smuzhiyun 			if(copy_from_user(&coax_fw_val, argp, sizeof(FIRMWARE_UP_FILE_INFO)))
587*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_FW_START_CMD_SET error\n");
588*4882a593Smuzhiyun 			coax_fw_start_cmd_to_isp_send(&coax_fw_val);
589*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_fw_val, sizeof(FIRMWARE_UP_FILE_INFO));
590*4882a593Smuzhiyun 			break;
591*4882a593Smuzhiyun 		case IOC_VDEC_COAX_FW_START_ACK_GET:
592*4882a593Smuzhiyun 			if(copy_from_user(&coax_fw_val, argp, sizeof(FIRMWARE_UP_FILE_INFO)))
593*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_FW_START_CMD_SET error\n");
594*4882a593Smuzhiyun 			coax_fw_start_cmd_ack_from_isp_recv(&coax_fw_val);
595*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_fw_val, sizeof(FIRMWARE_UP_FILE_INFO));
596*4882a593Smuzhiyun 			break;
597*4882a593Smuzhiyun 		case IOC_VDEC_COAX_FW_SEND_DATA_SET:
598*4882a593Smuzhiyun 			if(copy_from_user(&coax_fw_val, argp, sizeof(FIRMWARE_UP_FILE_INFO)))
599*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_FW_START_CMD_SET error\n");
600*4882a593Smuzhiyun 			coax_fw_one_packet_data_to_isp_send(&coax_fw_val);
601*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_fw_val, sizeof(FIRMWARE_UP_FILE_INFO));
602*4882a593Smuzhiyun 			break;
603*4882a593Smuzhiyun 		case IOC_VDEC_COAX_FW_SEND_ACK_GET:
604*4882a593Smuzhiyun 			if(copy_from_user(&coax_fw_val, argp, sizeof(FIRMWARE_UP_FILE_INFO)))
605*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_FW_START_CMD_SET error\n");
606*4882a593Smuzhiyun 			coax_fw_one_packet_data_ack_from_isp_recv(&coax_fw_val);
607*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_fw_val, sizeof(FIRMWARE_UP_FILE_INFO));
608*4882a593Smuzhiyun 			break;
609*4882a593Smuzhiyun 		case IOC_VDEC_COAX_FW_END_CMD_SET:
610*4882a593Smuzhiyun 			if(copy_from_user(&coax_fw_val, argp, sizeof(FIRMWARE_UP_FILE_INFO)))
611*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_FW_START_CMD_SET error\n");
612*4882a593Smuzhiyun 			coax_fw_end_cmd_to_isp_send(&coax_fw_val);
613*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_fw_val, sizeof(FIRMWARE_UP_FILE_INFO));
614*4882a593Smuzhiyun 			break;
615*4882a593Smuzhiyun 		case IOC_VDEC_COAX_FW_END_ACK_GET:
616*4882a593Smuzhiyun 			if(copy_from_user(&coax_fw_val, argp, sizeof(FIRMWARE_UP_FILE_INFO)))
617*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_FW_START_CMD_SET error\n");
618*4882a593Smuzhiyun 			coax_fw_end_cmd_ack_from_isp_recv(&coax_fw_val);
619*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_fw_val, sizeof(FIRMWARE_UP_FILE_INFO));
620*4882a593Smuzhiyun 			break;
621*4882a593Smuzhiyun 			/*===============================================================================================
622*4882a593Smuzhiyun 			 * Test Function
623*4882a593Smuzhiyun 			 *===============================================================================================*/
624*4882a593Smuzhiyun 		case IOC_VDEC_COAX_TEST_TX_INIT_DATA_READ:
625*4882a593Smuzhiyun 			if(copy_from_user(&coax_test_val, argp, sizeof(NC_VD_COAX_TEST_STR)))
626*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_INIT_SET error\n");
627*4882a593Smuzhiyun 			coax_test_tx_init_read(&coax_test_val);
628*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_test_val, sizeof(NC_VD_COAX_TEST_STR));
629*4882a593Smuzhiyun 			break;
630*4882a593Smuzhiyun 		case IOC_VDEC_COAX_TEST_DATA_SET:
631*4882a593Smuzhiyun 			if(copy_from_user(&coax_test_val, argp, sizeof(NC_VD_COAX_TEST_STR)))
632*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_TEST_DATA_SET error\n");
633*4882a593Smuzhiyun 			coax_test_data_set(&coax_test_val);
634*4882a593Smuzhiyun 			break;
635*4882a593Smuzhiyun 		case IOC_VDEC_COAX_TEST_DATA_READ:
636*4882a593Smuzhiyun 			if(copy_from_user(&coax_test_val, argp, sizeof(NC_VD_COAX_TEST_STR)))
637*4882a593Smuzhiyun 				printk("IOC_VDEC_COAX_TEST_DATA_SET error\n");
638*4882a593Smuzhiyun 			coax_test_data_get(&coax_test_val);
639*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &coax_test_val, sizeof(NC_VD_COAX_TEST_STR));
640*4882a593Smuzhiyun 			break;
641*4882a593Smuzhiyun 			/*===============================================================================================
642*4882a593Smuzhiyun 			 * Motion
643*4882a593Smuzhiyun 			 *===============================================================================================*/
644*4882a593Smuzhiyun 		case IOC_VDEC_MOTION_DETECTION_GET :
645*4882a593Smuzhiyun 			if(copy_from_user(&motion_set, argp, sizeof(motion_set)))
646*4882a593Smuzhiyun 				printk("IOC_VDEC_MOTION_SET error\n");
647*4882a593Smuzhiyun 			motion_detection_get(&motion_set);
648*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &motion_set, sizeof(motion_mode));
649*4882a593Smuzhiyun 			break;
650*4882a593Smuzhiyun 		case IOC_VDEC_MOTION_SET :
651*4882a593Smuzhiyun 			if(copy_from_user(&motion_set, argp, sizeof(motion_set)))
652*4882a593Smuzhiyun 				printk("IOC_VDEC_MOTION_SET error\n");
653*4882a593Smuzhiyun 			motion_onoff_set(&motion_set);
654*4882a593Smuzhiyun 			break;
655*4882a593Smuzhiyun 		case IOC_VDEC_MOTION_PIXEL_SET :
656*4882a593Smuzhiyun 			if(copy_from_user(&motion_set, argp, sizeof(motion_set)))
657*4882a593Smuzhiyun 				printk("IOC_VDEC_MOTION_Pixel_SET error\n");
658*4882a593Smuzhiyun 			motion_pixel_onoff_set(&motion_set);
659*4882a593Smuzhiyun 			break;
660*4882a593Smuzhiyun 		case IOC_VDEC_MOTION_PIXEL_GET :
661*4882a593Smuzhiyun 			if(copy_from_user(&motion_set, argp, sizeof(motion_set)))
662*4882a593Smuzhiyun 				printk("IOC_VDEC_MOTION_Pixel_SET error\n");
663*4882a593Smuzhiyun 			motion_pixel_onoff_get(&motion_set);
664*4882a593Smuzhiyun 			cpy2usr_ret = copy_to_user(argp, &motion_set, sizeof(motion_mode));
665*4882a593Smuzhiyun 			break;
666*4882a593Smuzhiyun 		case IOC_VDEC_MOTION_ALL_PIXEL_SET :
667*4882a593Smuzhiyun 			if(copy_from_user(&motion_set, argp, sizeof(motion_set)))
668*4882a593Smuzhiyun 				printk("IOC_VDEC_MOTION_Pixel_SET error\n");
669*4882a593Smuzhiyun 			motion_pixel_all_onoff_set(&motion_set);
670*4882a593Smuzhiyun 			break;
671*4882a593Smuzhiyun 		case IOC_VDEC_MOTION_TSEN_SET :
672*4882a593Smuzhiyun 			if(copy_from_user(&motion_set, argp, sizeof(motion_set)))
673*4882a593Smuzhiyun 				printk("IOC_VDEC_MOTION_TSEN_SET error\n");
674*4882a593Smuzhiyun 			motion_tsen_set(&motion_set);
675*4882a593Smuzhiyun 			break;
676*4882a593Smuzhiyun 		case IOC_VDEC_MOTION_PSEN_SET :
677*4882a593Smuzhiyun 			if(copy_from_user(&motion_set, argp, sizeof(motion_set)))
678*4882a593Smuzhiyun 				printk("IOC_VDEC_MOTION_PSEN_SET error\n");
679*4882a593Smuzhiyun 			motion_psen_set(&motion_set);
680*4882a593Smuzhiyun 			break;
681*4882a593Smuzhiyun 			/*===============================================================================================
682*4882a593Smuzhiyun 			 * Version
683*4882a593Smuzhiyun 			 *===============================================================================================*/
684*4882a593Smuzhiyun 		case IOC_VDEC_GET_DRIVERVER :
685*4882a593Smuzhiyun 			if(copy_to_user(argp, &DRIVER_VER, sizeof(DRIVER_VER)))
686*4882a593Smuzhiyun 				printk("IOC_VDEC_GET_DRIVERVER error\n");
687*4882a593Smuzhiyun 			break;
688*4882a593Smuzhiyun 	}
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun 	up(&jaguar1_lock);
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun 	return 0;
693*4882a593Smuzhiyun }
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun /*
696*4882a593Smuzhiyun  * mclk
697*4882a593Smuzhiyun  * default: 756MHZ
698*4882a593Smuzhiyun  *       1: 378MHZ
699*4882a593Smuzhiyun  *       2: 594MHZ
700*4882a593Smuzhiyun  *	 3: 1242MHZ
701*4882a593Smuzhiyun  */
jaguar1_set_mclk(unsigned int mclk)702*4882a593Smuzhiyun void jaguar1_set_mclk(unsigned int mclk)
703*4882a593Smuzhiyun {
704*4882a593Smuzhiyun 	jaguar1_mclk = mclk;
705*4882a593Smuzhiyun }
706*4882a593Smuzhiyun 
jaguar1_start(video_init_all * video_init)707*4882a593Smuzhiyun void jaguar1_start(video_init_all *video_init)
708*4882a593Smuzhiyun {
709*4882a593Smuzhiyun 	down(&jaguar1_lock);
710*4882a593Smuzhiyun 	vd_set_all(video_init);
711*4882a593Smuzhiyun 	up(&jaguar1_lock);
712*4882a593Smuzhiyun }
713*4882a593Smuzhiyun 
jaguar1_stop(void)714*4882a593Smuzhiyun void jaguar1_stop(void)
715*4882a593Smuzhiyun {
716*4882a593Smuzhiyun 	video_input_init  video_val;
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun 	down(&jaguar1_lock);
719*4882a593Smuzhiyun 	arb_disable(0);
720*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0xff, 0x20);
721*4882a593Smuzhiyun 
722*4882a593Smuzhiyun 	// ARB RESET High
723*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0x40, 0x11);
724*4882a593Smuzhiyun 	usleep_range(3000, 5000);
725*4882a593Smuzhiyun 	gpio_i2c_write(0x60, 0x40, 0x00);
726*4882a593Smuzhiyun 	vd_jaguar1_sw_reset(&video_val);
727*4882a593Smuzhiyun 	up(&jaguar1_lock);
728*4882a593Smuzhiyun }
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun /*******************************************************************************
731*4882a593Smuzhiyun  *	Description		: i2c client initial
732*4882a593Smuzhiyun  *	Argurments		: void
733*4882a593Smuzhiyun  *	Return value	: 0
734*4882a593Smuzhiyun  *	Modify			:
735*4882a593Smuzhiyun  *	warning			:
736*4882a593Smuzhiyun  *******************************************************************************/
i2c_client_init(int i2c_bus)737*4882a593Smuzhiyun static int i2c_client_init(int i2c_bus)
738*4882a593Smuzhiyun {
739*4882a593Smuzhiyun 	struct i2c_adapter* i2c_adap;
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun 	printk("[DRV] I2C Client Init \n");
742*4882a593Smuzhiyun 	i2c_adap = i2c_get_adapter(i2c_bus);
743*4882a593Smuzhiyun 	if (!i2c_adap)
744*4882a593Smuzhiyun 		return -EINVAL;
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 	jaguar1_client = i2c_new_client_device(i2c_adap, &hi_info);
747*4882a593Smuzhiyun 	i2c_put_adapter(i2c_adap);
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun 	return 0;
750*4882a593Smuzhiyun }
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun /*******************************************************************************
753*4882a593Smuzhiyun  *	Description		: i2c client release
754*4882a593Smuzhiyun  *	Argurments		: void
755*4882a593Smuzhiyun  *	Return value	: void
756*4882a593Smuzhiyun  *	Modify			:
757*4882a593Smuzhiyun  *	warning			:
758*4882a593Smuzhiyun  *******************************************************************************/
i2c_client_exit(void)759*4882a593Smuzhiyun static void i2c_client_exit(void)
760*4882a593Smuzhiyun {
761*4882a593Smuzhiyun 	i2c_unregister_device(jaguar1_client);
762*4882a593Smuzhiyun }
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun static struct file_operations jaguar1_fops = {
765*4882a593Smuzhiyun 	.owner      = THIS_MODULE,
766*4882a593Smuzhiyun 	.unlocked_ioctl	= jaguar1_ioctl,
767*4882a593Smuzhiyun 	.open       = jaguar1_open,
768*4882a593Smuzhiyun 	.release    = jaguar1_close
769*4882a593Smuzhiyun };
770*4882a593Smuzhiyun 
771*4882a593Smuzhiyun static struct miscdevice jaguar1_dev = {
772*4882a593Smuzhiyun 	.minor		= MISC_DYNAMIC_MINOR,
773*4882a593Smuzhiyun 	.name		= "jaguar1",
774*4882a593Smuzhiyun 	.fops  		= &jaguar1_fops,
775*4882a593Smuzhiyun };
776*4882a593Smuzhiyun 
jaguar1_init(int i2c_bus)777*4882a593Smuzhiyun int jaguar1_init(int i2c_bus)
778*4882a593Smuzhiyun {
779*4882a593Smuzhiyun 	int ret = 0;
780*4882a593Smuzhiyun #ifdef FMT_SETTING_SAMPLE
781*4882a593Smuzhiyun 	int dev_num = 0;
782*4882a593Smuzhiyun #endif
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun 	if (jaguar1_init_state)
785*4882a593Smuzhiyun 		return 0;
786*4882a593Smuzhiyun 
787*4882a593Smuzhiyun 	ret = i2c_client_init(i2c_bus);
788*4882a593Smuzhiyun 	if (ret) {
789*4882a593Smuzhiyun 		printk(KERN_ERR "ERROR: could not find jaguar1\n");
790*4882a593Smuzhiyun 		return ret;
791*4882a593Smuzhiyun 	}
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun 	/* decoder count function */
794*4882a593Smuzhiyun 	ret = check_decoder_count();
795*4882a593Smuzhiyun 	if (ret <= 0) {
796*4882a593Smuzhiyun 		printk(KERN_ERR "ERROR: could not find jaguar1 devices:%#x\n", ret);
797*4882a593Smuzhiyun 		i2c_client_exit();
798*4882a593Smuzhiyun 		return -ENODEV;
799*4882a593Smuzhiyun 	}
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun 	/* initialize semaphore */
802*4882a593Smuzhiyun 	sema_init(&jaguar1_lock, 1);
803*4882a593Smuzhiyun 	down(&jaguar1_lock);
804*4882a593Smuzhiyun 	video_decoder_init();
805*4882a593Smuzhiyun 	up(&jaguar1_lock);
806*4882a593Smuzhiyun 	jaguar1_init_state = true;
807*4882a593Smuzhiyun 
808*4882a593Smuzhiyun 	return 0;
809*4882a593Smuzhiyun }
810*4882a593Smuzhiyun 
jaguar1_exit(void)811*4882a593Smuzhiyun void jaguar1_exit(void)
812*4882a593Smuzhiyun {
813*4882a593Smuzhiyun 	i2c_client_exit();
814*4882a593Smuzhiyun 	jaguar1_init_state = false;
815*4882a593Smuzhiyun }
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun /*******************************************************************************
818*4882a593Smuzhiyun  *	Description		: It is called when "insmod jaguar1.ko" command run
819*4882a593Smuzhiyun  *	Argurments		: void
820*4882a593Smuzhiyun  *	Return value	: -1(could not register jaguar1 device), 0(success)
821*4882a593Smuzhiyun  *	Modify			:
822*4882a593Smuzhiyun  *	warning			:
823*4882a593Smuzhiyun  *******************************************************************************/
jaguar1_module_init(void)824*4882a593Smuzhiyun static int __init jaguar1_module_init(void)
825*4882a593Smuzhiyun {
826*4882a593Smuzhiyun 	int ret = 0;
827*4882a593Smuzhiyun #ifdef STREAM_ON_DEFLAULT
828*4882a593Smuzhiyun 	video_init_all sVideoall;
829*4882a593Smuzhiyun 	int ch;
830*4882a593Smuzhiyun 
831*4882a593Smuzhiyun 	jaguar1_mclk= 3;
832*4882a593Smuzhiyun 	init = true;
833*4882a593Smuzhiyun 	fmt = 2;
834*4882a593Smuzhiyun #endif
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun 	ret = misc_register(&jaguar1_dev);
837*4882a593Smuzhiyun 	if (ret)
838*4882a593Smuzhiyun 	{
839*4882a593Smuzhiyun 		printk(KERN_ERR "ERROR: could not register jaguar1-i2c :%#x\n", ret);
840*4882a593Smuzhiyun 		return -1;
841*4882a593Smuzhiyun 	}
842*4882a593Smuzhiyun 
843*4882a593Smuzhiyun #ifdef STREAM_ON_DEFLAULT
844*4882a593Smuzhiyun 	ret = jaguar1_init(I2C_3);
845*4882a593Smuzhiyun 	if (ret)
846*4882a593Smuzhiyun 	{
847*4882a593Smuzhiyun 		printk(KERN_ERR "ERROR: jaguar1 init failed\n");
848*4882a593Smuzhiyun 		return -1;
849*4882a593Smuzhiyun 	}
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun 	down(&jaguar1_lock);
852*4882a593Smuzhiyun 	if(init)
853*4882a593Smuzhiyun 	{
854*4882a593Smuzhiyun 		for(ch=0;ch<jaguar1_cnt*4;ch++)
855*4882a593Smuzhiyun 		{
856*4882a593Smuzhiyun 			sVideoall.ch_param[ch].ch = ch;
857*4882a593Smuzhiyun 			switch(fmt)
858*4882a593Smuzhiyun 			{
859*4882a593Smuzhiyun 				case 0:
860*4882a593Smuzhiyun 					sVideoall.ch_param[ch].format = AHD20_SD_H960_2EX_Btype_NT+ntpal;
861*4882a593Smuzhiyun 				break;
862*4882a593Smuzhiyun 				case 2:
863*4882a593Smuzhiyun 					sVideoall.ch_param[ch].format = AHD20_1080P_25P+ntpal;
864*4882a593Smuzhiyun 				break;
865*4882a593Smuzhiyun 				case 3:
866*4882a593Smuzhiyun 					sVideoall.ch_param[ch].format = AHD20_720P_960P_30P+ntpal;
867*4882a593Smuzhiyun 				break;
868*4882a593Smuzhiyun 				case 4:
869*4882a593Smuzhiyun 					sVideoall.ch_param[ch].format = AHD20_SD_SH720_NT+ntpal;
870*4882a593Smuzhiyun 				break;
871*4882a593Smuzhiyun 				default:
872*4882a593Smuzhiyun 					sVideoall.ch_param[ch].format = AHD20_720P_30P_EX_Btype+ntpal;
873*4882a593Smuzhiyun 				break;
874*4882a593Smuzhiyun 			}
875*4882a593Smuzhiyun 			sVideoall.ch_param[ch].input = SINGLE_ENDED;
876*4882a593Smuzhiyun 			if(ch<chn)
877*4882a593Smuzhiyun 				sVideoall.ch_param[ch].interface = YUV_422;
878*4882a593Smuzhiyun 			else
879*4882a593Smuzhiyun 				sVideoall.ch_param[ch].interface = DISABLE;
880*4882a593Smuzhiyun 		}
881*4882a593Smuzhiyun 		vd_set_all(&sVideoall);
882*4882a593Smuzhiyun 	}
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun 	up(&jaguar1_lock);
885*4882a593Smuzhiyun #endif
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun 	return 0;
888*4882a593Smuzhiyun }
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun /*******************************************************************************
891*4882a593Smuzhiyun  *	Description		: It is called when "rmmod nvp61XX_ex.ko" command run
892*4882a593Smuzhiyun  *	Argurments		: void
893*4882a593Smuzhiyun  *	Return value	: void
894*4882a593Smuzhiyun  *	Modify			:
895*4882a593Smuzhiyun  *	warning			:
896*4882a593Smuzhiyun  *******************************************************************************/
jaguar1_module_exit(void)897*4882a593Smuzhiyun static void __exit jaguar1_module_exit(void)
898*4882a593Smuzhiyun {
899*4882a593Smuzhiyun #ifdef FOR_IMX6
900*4882a593Smuzhiyun 	close_imx_mipi();
901*4882a593Smuzhiyun #endif
902*4882a593Smuzhiyun 	misc_deregister(&jaguar1_dev);
903*4882a593Smuzhiyun 
904*4882a593Smuzhiyun #ifdef STREAM_ON_DEFLAULT
905*4882a593Smuzhiyun 	jaguar1_exit();
906*4882a593Smuzhiyun #endif
907*4882a593Smuzhiyun 
908*4882a593Smuzhiyun 	printk("JAGUAR1 DEVICE DRIVER UNLOAD SUCCESS\n");
909*4882a593Smuzhiyun }
910*4882a593Smuzhiyun 
911*4882a593Smuzhiyun module_init(jaguar1_module_init);
912*4882a593Smuzhiyun module_exit(jaguar1_module_exit);
913*4882a593Smuzhiyun 
914*4882a593Smuzhiyun MODULE_LICENSE("GPL");
915*4882a593Smuzhiyun 
916*4882a593Smuzhiyun /*******************************************************************************
917*4882a593Smuzhiyun  *	End of file
918*4882a593Smuzhiyun  *******************************************************************************/
919