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