• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * A V4L2 driver for nvp6324 cameras and AHD Coax protocol.
3  *
4  * Copyright (c) 2017 by Allwinnertech Co., Ltd.  http://www.allwinnertech.com
5  *
6  * Authors:  Li Huiyu <lihuiyu@allwinnertech.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 
13 #include <linux/string.h>
14 #include <linux/delay.h>
15 #include "jaguar1_common.h"
16 #include "jaguar1_mipi.h"
17 #include "jaguar1_mipi_table.h"
18 #include "../sensor_helper.h"
19 
20 #define SENSOR_NAME "nvp6324_mipi"
21 
22 
23 static unsigned char mipi_dtype, arb_dtype, en_param;
24 
25 /*-------------------------------------------------------------------
26 
27   Arbiter function
28 
29   -------------------------------------------------------------------*/
30 
arb_scale_set(video_input_init * dev_ch_info,unsigned char val)31 static void arb_scale_set(video_input_init *dev_ch_info, unsigned char val)
32 {
33 	int devnum = dev_ch_info->ch / 4;
34 	unsigned char arb_scale = 0;
35 
36 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x20);
37 
38 	arb_scale = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x01);
39 	arb_scale &= ~(0x3<<(dev_ch_info->ch*2));
40 	arb_scale |= val<<(dev_ch_info->ch*2);
41 
42 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x01, arb_scale);
43 }
44 
arb_enable(int dev_num)45 static void arb_enable(int dev_num)
46 {
47 	if ((dev_num < 0) || (dev_num > 3)) {
48 		sensor_dbg("[DRV] %s input channel Error (%d)\n", __func__, dev_num);
49 		return;
50 	}
51 
52 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xff, 0x20);
53 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x00, en_param);
54 	sensor_dbg("VDEC_ARBITER_INIT done 0x%X\n", en_param);
55 }
56 
57 
arb_disable(int dev_num)58 static void arb_disable(int dev_num)
59 {
60 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xff, 0x20);
61 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x00, 0x00);
62 }
63 
arb_init(int dev_num)64 void arb_init(int dev_num)
65 {
66 	arb_disable(dev_num);
67 
68 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xff, 0x20);
69 
70 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x40, 0x01);
71 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x0F, arb_dtype);
72 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x0D, 0x01);
73 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x40, 0x00);
74 
75 	arb_enable(dev_num);
76 }
77 
78 
79 /*-------------------------------------------------------------------
80 
81   MIPI function
82 
83 -------------------------------------------------------------------*/
84 
mipi_frame_opt_set(video_input_init * dev_ch_info,unsigned char val)85 static void mipi_frame_opt_set(video_input_init *dev_ch_info, unsigned char val)
86 {
87 	int devnum = dev_ch_info->ch / 4;
88 	unsigned char mipi_frame_opt;
89 
90 	gpio_i2c_write(jaguar1_i2c_addr[devnum], 0xFF, 0x21);
91 
92 	switch (dev_ch_info->ch) {
93 	case 0:
94 			mipi_frame_opt = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x3E);
95 			mipi_frame_opt = (mipi_frame_opt & 0xF0) | val;
96 			gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x3E, mipi_frame_opt);
97 			break;
98 	case 1:
99 			mipi_frame_opt = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x3E);
100 			mipi_frame_opt = (mipi_frame_opt & 0x0F) | val;
101 			gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x3E, mipi_frame_opt);
102 			break;
103 	case 2:
104 			mipi_frame_opt = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x3F);
105 			mipi_frame_opt = (mipi_frame_opt & 0xF0) | val;
106 			gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x3F, mipi_frame_opt);
107 			break;
108 	case 3:
109 			mipi_frame_opt = gpio_i2c_read(jaguar1_i2c_addr[devnum], 0x3F);
110 			mipi_frame_opt = (mipi_frame_opt & 0x0F) | val;
111 			gpio_i2c_write(jaguar1_i2c_addr[devnum], 0x3F, mipi_frame_opt);
112 			break;
113 	}
114 }
115 
mipi_video_format_set(video_input_init * dev_ch_info)116 void mipi_video_format_set(video_input_init *dev_ch_info)
117 {
118 	mipi_vdfmt_set_s mipi_vd_fmt = (mipi_vdfmt_set_s)decoder_mipi_fmtdef[dev_ch_info->format];
119 
120 	if (dev_ch_info->interface != _DISABLE) {
121 		en_param |= 0x11<<(dev_ch_info->ch);
122 	}
123 
124 	mipi_frame_opt_set(dev_ch_info, mipi_vd_fmt.mipi_frame_opt);
125 	arb_scale_set(dev_ch_info, mipi_vd_fmt.arb_scale);
126 }
127 
mipi_datatype_set(unsigned char data_type)128 int mipi_datatype_set(unsigned char data_type)
129 {
130 	int ret = 0;
131 
132 	switch (data_type) {
133 		sensor_dbg("data type %d\n", data_type);
134 	case VD_DATA_TYPE_YUV422:
135 			mipi_dtype = 0x1E;
136 			arb_dtype = 0x00;
137 			break;
138 	case VD_DATA_TYPE_YUV420:
139 			mipi_dtype = 0x18;
140 			arb_dtype = 0xAA;
141 			break;
142 	case VD_DATA_TYPE_LEGACY420:
143 			mipi_dtype = 0x1A;
144 			arb_dtype = 0x55;
145 			break;
146 	default:
147 			sensor_dbg("[DRV]%s : invalid data type [0x%X]\n", __func__,  data_type);
148 			ret = -1;
149 			break;
150 	}
151 
152 	return ret;
153 }
154 
mipi_tx_init(int dev_num)155 void mipi_tx_init(int dev_num)
156 {
157 
158 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xFF, 0x21);
159 #if 1
160 	/*SET_MIPI_1242MHZ 1080P */
161 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x40, 0xBC);
162 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x41, 0x00);
163 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x42, 0x03);
164 
165 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x43, 0x43);
166 
167 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x11, 0x08);
168 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x10, 0x13);
169 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x12, 0x0B);
170 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x13, 0x12);
171 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x17, 0x02);
172 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x18, 0x12);
173 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x15, 0x07);
174 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x14, 0x2D);
175 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x16, 0x0B);
176 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x19, 0x09);
177 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x1A, 0x15);
178 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x1B, 0x11);
179 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x1C, 0x0E);
180 
181 
182 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x44, 0x00);
183 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x49, 0xF3);
184 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x49, 0xF0);
185 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x44, 0x02);
186 
187 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x08, 0x40);
188 
189 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x0F, 0x01);
190 
191 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x38, mipi_dtype);
192 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x39, mipi_dtype);
193 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x3A, mipi_dtype);
194 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x3B, mipi_dtype);
195 
196 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x07, 0x0F);
197 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x2D, 0x01);
198 #else
199 	/* 720P */
200 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xFF, 0x21);
201 
202 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x40, 0xDC);
203 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x41, 0x10);
204 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x42, 0x03);
205 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x43, 0x43);
206 
207 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x10, 0x0C);
208 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x11, 0x05);
209 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x12, 0x07);
210 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x13, 0x0B);
211 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x14, 0x1C);
212 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x15, 0x04);
213 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x16, 0x07);
214 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x17, 0x01);
215 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x18, 0x0E);
216 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x19, 0x06);
217 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x1A, 0x0D);
218 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x1B, 0x0B);
219 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x1C, 0x09);
220 
221 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x44, 0x00);
222 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x49, 0xF3);
223 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x49, 0xF0);
224 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x44, 0x02);
225 
226 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x08, 0x40);
227 
228 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x0F, 0x01);
229 
230 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x38, mipi_dtype);
231 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x39, mipi_dtype);
232 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x3A, mipi_dtype);
233 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x3B, mipi_dtype);
234 
235 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0x07, 0x0F);
236 #endif
237 	sensor_dbg("VDEC_MIPI_TX_INIT done\n");
238 }
239 
disable_parallel(int dev_num)240 void disable_parallel(int dev_num)
241 {
242 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xFF, 0x01);
243 
244 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xC8, 0x00);
245 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xC9, 0x00);
246 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xCA, 0x00);
247 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xCB, 0x00);
248 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xCC, 0x00);
249 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xCD, 0x00);
250 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xCE, 0x00);
251 	gpio_i2c_write(jaguar1_i2c_addr[dev_num], 0xCF, 0x00);
252 	sensor_dbg("Parallel block Disable\n");
253 }
254 
255