.. | .. |
---|
11 | 11 | * V0.0X01.0X04 fix hdr ae error |
---|
12 | 12 | * V0.0X01.0X05 add quick stream on/off |
---|
13 | 13 | * V0.0X01.0X06 Increase hdr exposure restrictions |
---|
14 | | - * V0.0X01.0X07 add binning resolution |
---|
15 | 14 | */ |
---|
16 | 15 | |
---|
17 | 16 | #define DEBUG |
---|
.. | .. |
---|
34 | 33 | #include <linux/pinctrl/consumer.h> |
---|
35 | 34 | #include <linux/rk-preisp.h> |
---|
36 | 35 | |
---|
37 | | -#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x07) |
---|
| 36 | +#define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x06) |
---|
38 | 37 | |
---|
39 | 38 | #ifndef V4L2_CID_DIGITAL_GAIN |
---|
40 | 39 | #define V4L2_CID_DIGITAL_GAIN V4L2_CID_GAIN |
---|
41 | 40 | #endif |
---|
42 | 41 | |
---|
43 | 42 | #define MIPI_FREQ_594M 594000000 |
---|
44 | | -#define MIPI_FREQ_445M 445000000 |
---|
45 | 43 | |
---|
46 | 44 | #define IMX335_4LANES 4 |
---|
47 | 45 | |
---|
.. | .. |
---|
160 | 158 | |
---|
161 | 159 | #define IMX335_NUM_SUPPLIES ARRAY_SIZE(imx335_supply_names) |
---|
162 | 160 | |
---|
163 | | -enum imx335_max_pad { |
---|
164 | | - PAD0, /* link to isp */ |
---|
165 | | - PAD1, /* link to csi wr0 | hdr x2:L x3:M */ |
---|
166 | | - PAD2, /* link to csi wr1 | hdr x3:L */ |
---|
167 | | - PAD3, /* link to csi wr2 | hdr x2:M x3:S */ |
---|
168 | | - PAD_MAX, |
---|
169 | | -}; |
---|
170 | | - |
---|
171 | 161 | struct regval { |
---|
172 | 162 | u16 addr; |
---|
173 | 163 | u8 val; |
---|
.. | .. |
---|
182 | 172 | u32 vts_def; |
---|
183 | 173 | u32 exp_def; |
---|
184 | 174 | u32 bpp; |
---|
185 | | - u32 mipi_freq_idx; |
---|
186 | 175 | const struct regval *reg_list; |
---|
187 | 176 | u32 hdr_mode; |
---|
188 | 177 | u32 vc[PAD_MAX]; |
---|
.. | .. |
---|
227 | 216 | /* |
---|
228 | 217 | * Xclk 37.125Mhz |
---|
229 | 218 | */ |
---|
230 | | -static const struct regval imx335_linear_12bit_1296x972_regs[] = { |
---|
231 | | - {0x3002, 0x00}, |
---|
232 | | - {0x3018, 0x01}, |
---|
233 | | - {0x300C, 0x5B}, |
---|
234 | | - {0x300D, 0x40}, |
---|
235 | | - {0x3034, 0x26}, |
---|
236 | | - {0x3035, 0x02}, |
---|
237 | | - {0x3048, 0x00}, |
---|
238 | | - {0x3049, 0x00}, |
---|
239 | | - {0x304A, 0x03}, |
---|
240 | | - {0x304B, 0x01}, |
---|
241 | | - {0x304C, 0x14}, |
---|
242 | | - {0x3050, 0x00}, |
---|
243 | | - {0x3056, 0xd8}, |
---|
244 | | - {0x3057, 0x03}, |
---|
245 | | - {0x3058, 0x4E}, |
---|
246 | | - {0x3059, 0x0C}, |
---|
247 | | - {0x305C, 0x12}, |
---|
248 | | - {0x3060, 0xE8}, |
---|
249 | | - {0x3061, 0x00}, |
---|
250 | | - {0x3068, 0xce}, |
---|
251 | | - {0x3069, 0x00}, |
---|
252 | | - {0x306C, 0x68}, |
---|
253 | | - {0x306D, 0x06}, |
---|
254 | | - {0x3072, 0x30}, |
---|
255 | | - {0x3074, 0xa8}, |
---|
256 | | - {0x3075, 0x00}, |
---|
257 | | - {0x3076, 0x60}, |
---|
258 | | - {0x3077, 0x0f}, |
---|
259 | | - {0x3078, 0x04}, |
---|
260 | | - {0x3079, 0xFD}, |
---|
261 | | - {0x307A, 0x04}, |
---|
262 | | - {0x307B, 0xFE},//binning |
---|
263 | | - {0x307C, 0x04}, |
---|
264 | | - {0x307D, 0xFB}, |
---|
265 | | - {0x307E, 0x04}, |
---|
266 | | - {0x307F, 0x02}, /* Each frame gain adjustment disabled in linear mode */ |
---|
267 | | - {0x3080, 0x04}, |
---|
268 | | - {0x3081, 0xFD}, |
---|
269 | | - {0x3082, 0x04},//binning |
---|
270 | | - {0x3083, 0xFE}, |
---|
271 | | - {0x3084, 0x04}, |
---|
272 | | - {0x3085, 0xFB}, |
---|
273 | | - {0x3086, 0x04}, |
---|
274 | | - {0x3087, 0x02}, |
---|
275 | | - {0x30A4, 0x77}, |
---|
276 | | - {0x30A8, 0x20}, |
---|
277 | | - {0x30A9, 0x00}, |
---|
278 | | - {0x30AC, 0x08}, |
---|
279 | | - {0x30AD, 0x08}, |
---|
280 | | - {0x30B0, 0x20}, |
---|
281 | | - {0x30B1, 0x00}, |
---|
282 | | - {0x30B4, 0x10}, |
---|
283 | | - {0x30B5, 0x10}, |
---|
284 | | - {0x30E8, 0x14}, |
---|
285 | | - {0x3112, 0x10}, |
---|
286 | | - {0x3116, 0x10}, |
---|
287 | | - {0x314C, 0xC0}, |
---|
288 | | - {0x315A, 0x06}, |
---|
289 | | - {0x316A, 0x7E}, |
---|
290 | | - {0x3199, 0x30}, |
---|
291 | | - {0x319D, 0x01}, |
---|
292 | | - {0x319E, 0x02}, |
---|
293 | | - {0x31A1, 0x00}, |
---|
294 | | - {0x31D7, 0x00}, |
---|
295 | | - {0x3200, 0x01}, |
---|
296 | | - {0x3288, 0x21}, |
---|
297 | | - {0x328A, 0x02}, |
---|
298 | | - {0x3300, 0x01}, |
---|
299 | | - {0x3414, 0x05}, |
---|
300 | | - {0x3416, 0x18}, |
---|
301 | | - {0x341C, 0xFF}, |
---|
302 | | - {0x341D, 0x01}, |
---|
303 | | - {0x3648, 0x01}, |
---|
304 | | - {0x364A, 0x04}, |
---|
305 | | - {0x364C, 0x04}, |
---|
306 | | - {0x3678, 0x01}, |
---|
307 | | - {0x367C, 0x31}, |
---|
308 | | - {0x367E, 0x31}, |
---|
309 | | - {0x3706, 0x10}, |
---|
310 | | - {0x3708, 0x03}, |
---|
311 | | - {0x3714, 0x02}, |
---|
312 | | - {0x3715, 0x02}, |
---|
313 | | - {0x3716, 0x01}, |
---|
314 | | - {0x3717, 0x03}, |
---|
315 | | - {0x371C, 0x3D}, |
---|
316 | | - {0x371D, 0x3F}, |
---|
317 | | - {0x372C, 0x00}, |
---|
318 | | - {0x372D, 0x00}, |
---|
319 | | - {0x372E, 0x46}, |
---|
320 | | - {0x372F, 0x00}, |
---|
321 | | - {0x3730, 0x89}, |
---|
322 | | - {0x3731, 0x00}, |
---|
323 | | - {0x3732, 0x08}, |
---|
324 | | - {0x3733, 0x01}, |
---|
325 | | - {0x3734, 0xFE}, |
---|
326 | | - {0x3735, 0x05}, |
---|
327 | | - {0x3740, 0x02}, |
---|
328 | | - {0x375D, 0x00}, |
---|
329 | | - {0x375E, 0x00}, |
---|
330 | | - {0x375F, 0x11}, |
---|
331 | | - {0x3760, 0x01}, |
---|
332 | | - {0x3768, 0x1B}, |
---|
333 | | - {0x3769, 0x1B}, |
---|
334 | | - {0x376A, 0x1B}, |
---|
335 | | - {0x376B, 0x1B}, |
---|
336 | | - {0x376C, 0x1A}, |
---|
337 | | - {0x376D, 0x17}, |
---|
338 | | - {0x376E, 0x0F}, |
---|
339 | | - {0x3776, 0x00}, |
---|
340 | | - {0x3777, 0x00}, |
---|
341 | | - {0x3778, 0x46}, |
---|
342 | | - {0x3779, 0x00}, |
---|
343 | | - {0x377A, 0x89}, |
---|
344 | | - {0x377B, 0x00}, |
---|
345 | | - {0x377C, 0x08}, |
---|
346 | | - {0x377D, 0x01}, |
---|
347 | | - {0x377E, 0x23}, |
---|
348 | | - {0x377F, 0x02}, |
---|
349 | | - {0x3780, 0xD9}, |
---|
350 | | - {0x3781, 0x03}, |
---|
351 | | - {0x3782, 0xF5}, |
---|
352 | | - {0x3783, 0x06}, |
---|
353 | | - {0x3784, 0xA5}, |
---|
354 | | - {0x3788, 0x0F}, |
---|
355 | | - {0x378A, 0xD9}, |
---|
356 | | - {0x378B, 0x03}, |
---|
357 | | - {0x378C, 0xEB}, |
---|
358 | | - {0x378D, 0x05}, |
---|
359 | | - {0x378E, 0x87}, |
---|
360 | | - {0x378F, 0x06}, |
---|
361 | | - {0x3790, 0xF5}, |
---|
362 | | - {0x3792, 0x43}, |
---|
363 | | - {0x3794, 0x7A}, |
---|
364 | | - {0x3796, 0xA1}, |
---|
365 | | - {0x3A18, 0x7F}, |
---|
366 | | - {0x3A1A, 0x37}, |
---|
367 | | - {0x3A1C, 0x37}, |
---|
368 | | - {0x3A1E, 0xF7}, |
---|
369 | | - {0x3A1F, 0x00}, |
---|
370 | | - {0x3A20, 0x3F}, |
---|
371 | | - {0x3A22, 0x6F}, |
---|
372 | | - {0x3A24, 0x3F}, |
---|
373 | | - {0x3A26, 0x5F}, |
---|
374 | | - {0x3A28, 0x2F}, |
---|
375 | | - {REG_NULL, 0x00}, |
---|
376 | | -}; |
---|
377 | | - |
---|
378 | 219 | static const struct regval imx335_linear_10bit_2592x1944_regs[] = { |
---|
379 | 220 | {0x3002, 0x00}, |
---|
380 | | - {0x3018, 0x00}, |
---|
381 | 221 | {0x300C, 0x5B}, |
---|
382 | 222 | {0x300D, 0x40}, |
---|
383 | 223 | {0x3034, 0x26}, |
---|
.. | .. |
---|
388 | 228 | {0x304B, 0x01}, |
---|
389 | 229 | {0x304C, 0x14}, |
---|
390 | 230 | {0x3050, 0x00}, |
---|
391 | | - {0x3056, 0xac}, |
---|
392 | | - {0x3057, 0x07}, |
---|
393 | 231 | {0x3058, 0x09}, |
---|
394 | 232 | {0x3059, 0x00}, |
---|
395 | 233 | {0x305C, 0x12}, |
---|
.. | .. |
---|
399 | 237 | {0x3069, 0x00}, |
---|
400 | 238 | {0x306C, 0x88}, |
---|
401 | 239 | {0x306D, 0x06}, |
---|
402 | | - {0x3072, 0x28}, |
---|
403 | | - {0x3074, 0xb0}, |
---|
404 | | - {0x3075, 0x00}, |
---|
405 | | - {0x3076, 0x58}, |
---|
406 | | - {0x3077, 0x0f}, |
---|
407 | | - {0x3078, 0x01}, |
---|
408 | | - {0x3079, 0x02}, |
---|
409 | | - {0x307A, 0xff}, |
---|
410 | | - {0x307B, 0x02}, |
---|
411 | | - {0x307C, 0x00}, |
---|
412 | | - {0x307D, 0x00}, |
---|
413 | | - {0x307E, 0x00}, |
---|
414 | | - {0x307F, 0x00}, |
---|
415 | | - {0x3080, 0x01}, |
---|
416 | | - {0x3081, 0x02}, |
---|
417 | | - {0x3082, 0xff}, |
---|
418 | | - {0x3083, 0x02}, |
---|
419 | | - {0x3084, 0x00}, |
---|
420 | | - {0x3085, 0x00}, |
---|
421 | | - {0x3086, 0x00}, |
---|
422 | | - {0x3087, 0x00}, |
---|
423 | | - {0x30A4, 0x33}, |
---|
424 | | - {0x30A8, 0x10}, |
---|
425 | | - {0x30A9, 0x04}, |
---|
426 | | - {0x30AC, 0x00}, |
---|
427 | | - {0x30AD, 0x00}, |
---|
428 | | - {0x30B0, 0x10}, |
---|
429 | | - {0x30B1, 0x08}, |
---|
430 | | - {0x30B4, 0x00}, |
---|
431 | | - {0x30B5, 0x00}, |
---|
432 | 240 | {0x30E8, 0x00}, |
---|
433 | | - {0x3112, 0x08}, |
---|
434 | | - {0x3116, 0x08},//full |
---|
435 | | - {0x314C, 0x80}, |
---|
436 | 241 | {0x315A, 0x02}, |
---|
437 | 242 | {0x316A, 0x7E}, |
---|
438 | | - {0x3199, 0x00}, /* Each frame gain adjustment disabled in linear mode */ |
---|
439 | 243 | {0x319D, 0x00}, |
---|
440 | | - {0x319E, 0x01}, |
---|
441 | | - {0x31A1, 0x00},//full |
---|
| 244 | + {0x31A1, 0x00}, |
---|
442 | 245 | {0x31D7, 0x00}, |
---|
443 | | - {0x3200, 0x01}, |
---|
| 246 | + {0x3200, 0x01}, /* Each frame gain adjustment disabed in linear mode */ |
---|
444 | 247 | {0x3288, 0x21}, |
---|
445 | 248 | {0x328A, 0x02}, |
---|
446 | | - {0x3300, 0x00}, |
---|
447 | 249 | {0x3414, 0x05}, |
---|
448 | 250 | {0x3416, 0x18}, |
---|
449 | 251 | {0x341C, 0xFF}, |
---|
.. | .. |
---|
510 | 312 | {0x3792, 0x43}, |
---|
511 | 313 | {0x3794, 0x7A}, |
---|
512 | 314 | {0x3796, 0xA1}, |
---|
513 | | - {0x3A18, 0x8F}, |
---|
514 | | - {0x3A1A, 0x4f}, |
---|
515 | | - {0x3A1C, 0x47}, |
---|
516 | | - {0x3A1E, 0x37}, |
---|
517 | | - {0x3A1F, 0x01}, |
---|
518 | | - {0x3A20, 0x4F}, |
---|
519 | | - {0x3A22, 0x87}, |
---|
520 | | - {0x3A24, 0x4F}, |
---|
521 | | - {0x3A26, 0x7F}, |
---|
522 | | - {0x3A28, 0x3F}, |
---|
523 | 315 | {REG_NULL, 0x00}, |
---|
524 | 316 | }; |
---|
525 | 317 | |
---|
526 | 318 | static const struct regval imx335_hdr2_10bit_2592x1944_regs[] = { |
---|
527 | 319 | {0x3002, 0x00}, |
---|
528 | | - {0x3018, 0x00}, |
---|
529 | 320 | {0x300C, 0x5B}, |
---|
530 | 321 | {0x300D, 0x40}, |
---|
531 | 322 | {0x3034, 0x13}, |
---|
.. | .. |
---|
536 | 327 | {0x304B, 0x03}, |
---|
537 | 328 | {0x304C, 0x13}, |
---|
538 | 329 | {0x3050, 0x00}, |
---|
539 | | - {0x3056, 0xac}, |
---|
540 | | - {0x3057, 0x07}, |
---|
541 | 330 | {0x3058, 0x48}, |
---|
542 | 331 | {0x3059, 0x12}, |
---|
543 | 332 | {0x305C, 0x12}, |
---|
.. | .. |
---|
547 | 336 | {0x3069, 0x01}, |
---|
548 | 337 | {0x306C, 0x68}, |
---|
549 | 338 | {0x306D, 0x06}, |
---|
550 | | - {0x3072, 0x28}, |
---|
551 | | - {0x3074, 0xb0}, |
---|
552 | | - {0x3075, 0x00}, |
---|
553 | | - {0x3076, 0x58}, |
---|
554 | | - {0x3077, 0x0f}, |
---|
555 | | - {0x3078, 0x01}, |
---|
556 | | - {0x3079, 0x02},//full |
---|
557 | | - {0x307A, 0xff}, |
---|
558 | | - {0x307B, 0x02}, |
---|
559 | | - {0x307C, 0x00}, |
---|
560 | | - {0x307D, 0x00}, /* Each frame gain adjustment EN */ |
---|
561 | | - {0x307E, 0x00}, |
---|
562 | | - {0x307F, 0x00}, |
---|
563 | | - {0x3080, 0x01},//full |
---|
564 | | - {0x3081, 0x02}, |
---|
565 | | - {0x3082, 0xff}, |
---|
566 | | - {0x3083, 0x02}, |
---|
567 | | - {0x3084, 0x00}, |
---|
568 | | - {0x3085, 0x00}, |
---|
569 | | - {0x3086, 0x00}, |
---|
570 | | - {0x3087, 0x00}, |
---|
571 | | - {0x30A4, 0x33}, |
---|
572 | | - {0x30A8, 0x10}, |
---|
573 | | - {0x30A9, 0x04}, |
---|
574 | | - {0x30AC, 0x00}, |
---|
575 | | - {0x30AD, 0x00}, |
---|
576 | | - {0x30B0, 0x10}, |
---|
577 | | - {0x30B1, 0x08}, |
---|
578 | | - {0x30B4, 0x00}, |
---|
579 | | - {0x30B5, 0x00}, |
---|
580 | 339 | {0x30E8, 0x00}, |
---|
581 | | - {0x3112, 0x08}, |
---|
582 | | - {0x3116, 0x08}, |
---|
583 | | - {0x314C, 0x80}, |
---|
584 | 340 | {0x315A, 0x02}, |
---|
585 | 341 | {0x316A, 0x7E}, |
---|
586 | | - {0x3199, 0x00}, |
---|
587 | 342 | {0x319D, 0x00}, |
---|
588 | | - {0x319E, 0x01}, |
---|
589 | 343 | {0x31A1, 0x00}, |
---|
590 | 344 | {0x31D7, 0x01}, |
---|
591 | | - {0x3200, 0x00}, |
---|
| 345 | + {0x3200, 0x00}, /* Each frame gain adjustment EN */ |
---|
592 | 346 | {0x3288, 0x21}, |
---|
593 | 347 | {0x328A, 0x02}, |
---|
594 | | - {0x3300, 0x00}, |
---|
595 | 348 | {0x3414, 0x05}, |
---|
596 | 349 | {0x3416, 0x18}, |
---|
597 | 350 | {0x341C, 0xFF}, |
---|
.. | .. |
---|
658 | 411 | {0x3792, 0x43}, |
---|
659 | 412 | {0x3794, 0x7A}, |
---|
660 | 413 | {0x3796, 0xA1}, |
---|
661 | | - {0x3A18, 0x8F}, |
---|
662 | | - {0x3A1A, 0x4f}, |
---|
663 | | - {0x3A1C, 0x47}, |
---|
664 | | - {0x3A1E, 0x37}, |
---|
665 | | - {0x3A1F, 0x01}, |
---|
666 | | - {0x3A20, 0x4F}, |
---|
667 | | - {0x3A22, 0x87}, |
---|
668 | | - {0x3A24, 0x4F}, |
---|
669 | | - {0x3A26, 0x7F}, |
---|
670 | | - {0x3A28, 0x3F}, |
---|
671 | 414 | {REG_NULL, 0x00}, |
---|
672 | 415 | }; |
---|
673 | 416 | |
---|
674 | 417 | static const struct regval imx335_hdr3_10bit_2592x1944_regs[] = { |
---|
675 | 418 | {0x3002, 0x00}, |
---|
676 | | - {0x3018, 0x00}, |
---|
677 | 419 | {0x300C, 0x5B}, |
---|
678 | 420 | {0x300D, 0x40}, |
---|
679 | 421 | {0x3034, 0x13}, |
---|
.. | .. |
---|
684 | 426 | {0x304B, 0x03}, |
---|
685 | 427 | {0x304C, 0x13}, |
---|
686 | 428 | {0x3050, 0x00}, |
---|
687 | | - {0x3056, 0xac}, |
---|
688 | | - {0x3057, 0x07}, |
---|
689 | 429 | {0x3058, 0xC4}, |
---|
690 | 430 | {0x3059, 0x3B}, |
---|
691 | 431 | {0x305C, 0x1A}, |
---|
.. | .. |
---|
695 | 435 | {0x3069, 0x01}, |
---|
696 | 436 | {0x306C, 0x6C}, |
---|
697 | 437 | {0x306D, 0x01}, |
---|
698 | | - {0x3072, 0x28}, |
---|
699 | | - {0x3074, 0xb0}, |
---|
700 | | - {0x3075, 0x00}, |
---|
701 | | - {0x3076, 0x58}, |
---|
702 | | - {0x3077, 0x0f}, |
---|
703 | | - {0x3078, 0x01}, |
---|
704 | | - {0x3079, 0x02}, |
---|
705 | | - {0x307A, 0xff}, |
---|
706 | | - {0x307B, 0x02}, |
---|
707 | | - {0x307C, 0x00}, |
---|
708 | | - {0x307D, 0x00}, |
---|
709 | | - {0x307E, 0x00}, |
---|
710 | | - {0x307F, 0x00}, |
---|
711 | | - {0x3080, 0x01}, |
---|
712 | | - {0x3081, 0x02}, |
---|
713 | | - {0x3082, 0xff}, |
---|
714 | | - {0x3083, 0x02}, |
---|
715 | | - {0x3084, 0x00}, |
---|
716 | | - {0x3085, 0x00}, |
---|
717 | | - {0x3086, 0x00}, |
---|
718 | | - {0x3087, 0x00}, |
---|
719 | | - {0x30A4, 0x33}, |
---|
720 | | - {0x30A8, 0x10}, |
---|
721 | | - {0x30A9, 0x04}, |
---|
722 | | - {0x30AC, 0x00}, |
---|
723 | | - {0x30AD, 0x00}, |
---|
724 | | - {0x30B0, 0x10}, |
---|
725 | | - {0x30B1, 0x08}, |
---|
726 | | - {0x30B4, 0x00}, |
---|
727 | | - {0x30B5, 0x00}, |
---|
728 | 438 | {0x30E8, 0x14}, |
---|
729 | | - {0x3112, 0x08}, |
---|
730 | | - {0x3116, 0x08}, |
---|
731 | | - {0x314C, 0x80}, |
---|
732 | 439 | {0x315A, 0x02}, |
---|
733 | 440 | {0x316A, 0x7E}, |
---|
734 | | - {0x3199, 0x00}, |
---|
735 | 441 | {0x319D, 0x00}, |
---|
736 | | - {0x319E, 0x01}, |
---|
737 | 442 | {0x31A1, 0x00}, |
---|
738 | 443 | {0x31D7, 0x03}, |
---|
739 | | - {0x3200, 0x00}, |
---|
| 444 | + {0x3200, 0x00}, /* Each frame gain adjustment EN */ |
---|
740 | 445 | {0x3288, 0x21}, |
---|
741 | 446 | {0x328A, 0x02}, |
---|
742 | | - {0x3300, 0x00}, |
---|
743 | 447 | {0x3414, 0x05}, |
---|
744 | 448 | {0x3416, 0x18}, |
---|
745 | 449 | {0x341C, 0xFF}, |
---|
.. | .. |
---|
775 | 479 | {0x3760, 0x01}, |
---|
776 | 480 | {0x3768, 0x1B}, |
---|
777 | 481 | {0x3769, 0x1B}, |
---|
778 | | - {0x376A, 0x1B},//full |
---|
| 482 | + {0x376A, 0x1B}, |
---|
779 | 483 | {0x376B, 0x1B}, |
---|
780 | 484 | {0x376C, 0x1A}, |
---|
781 | 485 | {0x376D, 0x17}, |
---|
782 | | - {0x376E, 0x0F}, /* Each frame gain adjustment EN */ |
---|
| 486 | + {0x376E, 0x0F}, |
---|
783 | 487 | {0x3776, 0x00}, |
---|
784 | 488 | {0x3777, 0x00}, |
---|
785 | | - {0x3778, 0x46},//full |
---|
| 489 | + {0x3778, 0x46}, |
---|
786 | 490 | {0x3779, 0x00}, |
---|
787 | 491 | {0x377A, 0x89}, |
---|
788 | 492 | {0x377B, 0x00}, |
---|
.. | .. |
---|
806 | 510 | {0x3792, 0x43}, |
---|
807 | 511 | {0x3794, 0x7A}, |
---|
808 | 512 | {0x3796, 0xA1}, |
---|
809 | | - {0x3A18, 0x8F}, |
---|
810 | | - {0x3A1A, 0x4f}, |
---|
811 | | - {0x3A1C, 0x47}, |
---|
812 | | - {0x3A1E, 0x37}, |
---|
813 | | - {0x3A1F, 0x01}, |
---|
814 | | - {0x3A20, 0x4F}, |
---|
815 | | - {0x3A22, 0x87}, |
---|
816 | | - {0x3A24, 0x4F}, |
---|
817 | | - {0x3A26, 0x7F}, |
---|
818 | | - {0x3A28, 0x3F}, |
---|
819 | 513 | {REG_NULL, 0x00}, |
---|
820 | 514 | }; |
---|
821 | 515 | |
---|
.. | .. |
---|
848 | 542 | .reg_list = imx335_linear_10bit_2592x1944_regs, |
---|
849 | 543 | .hdr_mode = NO_HDR, |
---|
850 | 544 | .bpp = 10, |
---|
851 | | - .mipi_freq_idx = 1, |
---|
852 | | - }, |
---|
853 | | - { |
---|
854 | | - /* 1H period = 7.4us */ |
---|
855 | | - .bus_fmt = MEDIA_BUS_FMT_SRGGB12_1X12, |
---|
856 | | - .width = 1308, |
---|
857 | | - .height = 984, |
---|
858 | | - .max_fps = { |
---|
859 | | - .numerator = 10000, |
---|
860 | | - .denominator = 300000, |
---|
861 | | - }, |
---|
862 | | - .exp_def = 0x600, |
---|
863 | | - .hts_def = 0x0226 * IMX335_4LANES * 2, |
---|
864 | | - .vts_def = 0x1194, |
---|
865 | | - .reg_list = imx335_linear_12bit_1296x972_regs, |
---|
866 | | - .hdr_mode = NO_HDR, |
---|
867 | | - .bpp = 12, |
---|
868 | | - .mipi_freq_idx = 0, |
---|
869 | 545 | }, |
---|
870 | 546 | { |
---|
871 | 547 | /* 1H period = 3.70us */ |
---|
.. | .. |
---|
886 | 562 | .reg_list = imx335_hdr2_10bit_2592x1944_regs, |
---|
887 | 563 | .hdr_mode = HDR_X2, |
---|
888 | 564 | .bpp = 10, |
---|
889 | | - .mipi_freq_idx = 1, |
---|
890 | 565 | .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_1, |
---|
891 | 566 | .vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr0 |
---|
892 | 567 | .vc[PAD2] = V4L2_MBUS_CSI2_CHANNEL_1, |
---|
.. | .. |
---|
911 | 586 | .reg_list = imx335_hdr3_10bit_2592x1944_regs, |
---|
912 | 587 | .hdr_mode = HDR_X3, |
---|
913 | 588 | .bpp = 10, |
---|
914 | | - .mipi_freq_idx = 1, |
---|
915 | 589 | .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_2, |
---|
916 | 590 | .vc[PAD1] = V4L2_MBUS_CSI2_CHANNEL_1,//M->csi wr0 |
---|
917 | 591 | .vc[PAD2] = V4L2_MBUS_CSI2_CHANNEL_0,//L->csi wr0 |
---|
.. | .. |
---|
920 | 594 | }; |
---|
921 | 595 | |
---|
922 | 596 | static const s64 link_freq_items[] = { |
---|
923 | | - MIPI_FREQ_445M, |
---|
924 | 597 | MIPI_FREQ_594M, |
---|
925 | 598 | }; |
---|
926 | 599 | |
---|
.. | .. |
---|
1044 | 717 | struct imx335 *imx335 = to_imx335(sd); |
---|
1045 | 718 | const struct imx335_mode *mode; |
---|
1046 | 719 | s64 h_blank, vblank_def; |
---|
1047 | | - s64 dst_pixel_rate = 0; |
---|
1048 | 720 | |
---|
1049 | 721 | mutex_lock(&imx335->mutex); |
---|
1050 | 722 | |
---|
.. | .. |
---|
1065 | 737 | __v4l2_ctrl_modify_range(imx335->vblank, vblank_def, |
---|
1066 | 738 | IMX335_VTS_MAX - mode->height, |
---|
1067 | 739 | 1, vblank_def); |
---|
1068 | | - dst_pixel_rate = ((u32)link_freq_items[mode->mipi_freq_idx]) / |
---|
1069 | | - mode->bpp * 2 * IMX335_4LANES; |
---|
1070 | | - __v4l2_ctrl_s_ctrl_int64(imx335->pixel_rate, |
---|
1071 | | - dst_pixel_rate); |
---|
1072 | | - __v4l2_ctrl_s_ctrl(imx335->link_freq, |
---|
1073 | | - mode->mipi_freq_idx); |
---|
1074 | 740 | } |
---|
1075 | 741 | |
---|
1076 | 742 | mutex_unlock(&imx335->mutex); |
---|
.. | .. |
---|
1142 | 808 | struct imx335 *imx335 = to_imx335(sd); |
---|
1143 | 809 | const struct imx335_mode *mode = imx335->cur_mode; |
---|
1144 | 810 | |
---|
1145 | | - mutex_lock(&imx335->mutex); |
---|
1146 | 811 | fi->interval = mode->max_fps; |
---|
1147 | | - mutex_unlock(&imx335->mutex); |
---|
1148 | 812 | |
---|
1149 | 813 | return 0; |
---|
1150 | 814 | } |
---|
1151 | 815 | |
---|
1152 | | -static int imx335_g_mbus_config(struct v4l2_subdev *sd, |
---|
| 816 | +static int imx335_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id, |
---|
1153 | 817 | struct v4l2_mbus_config *config) |
---|
1154 | 818 | { |
---|
1155 | 819 | u32 val = 0; |
---|
.. | .. |
---|
1163 | 827 | val |= V4L2_MBUS_CSI2_CHANNEL_1; |
---|
1164 | 828 | if (mode->hdr_mode == HDR_X3) |
---|
1165 | 829 | val |= V4L2_MBUS_CSI2_CHANNEL_2; |
---|
1166 | | - config->type = V4L2_MBUS_CSI2; |
---|
| 830 | + config->type = V4L2_MBUS_CSI2_DPHY; |
---|
1167 | 831 | config->flags = val; |
---|
1168 | 832 | |
---|
1169 | 833 | return 0; |
---|
.. | .. |
---|
1261 | 925 | } |
---|
1262 | 926 | |
---|
1263 | 927 | rhs1 = SHR1_MIN + s_exp_time; |
---|
1264 | | - rhs1 = (rhs1 + 7u) / 8 * 8 + 2; /* shall be 8n + 2 */ |
---|
| 928 | + rhs1 = (rhs1 & ~0x7) + 2; /* shall be 8n + 2 */ |
---|
1265 | 929 | if (rhs1 > rhs1_max) |
---|
1266 | 930 | rhs1 = rhs1_max; |
---|
1267 | 931 | if (rhs1 < rhs1_min) |
---|
.. | .. |
---|
1591 | 1255 | u32 i, h, w; |
---|
1592 | 1256 | long ret = 0; |
---|
1593 | 1257 | u32 stream = 0; |
---|
1594 | | - s64 dst_pixel_rate = 0; |
---|
1595 | 1258 | |
---|
1596 | 1259 | switch (cmd) { |
---|
1597 | 1260 | case PREISP_CMD_SET_HDRAE_EXP: |
---|
.. | .. |
---|
1632 | 1295 | __v4l2_ctrl_modify_range(imx335->vblank, h, |
---|
1633 | 1296 | IMX335_VTS_MAX - imx335->cur_mode->height, |
---|
1634 | 1297 | 1, h); |
---|
1635 | | - dst_pixel_rate = ((u32)link_freq_items[imx335->cur_mode->mipi_freq_idx]) / |
---|
1636 | | - imx335->cur_mode->bpp * 2 * IMX335_4LANES; |
---|
1637 | | - __v4l2_ctrl_s_ctrl_int64(imx335->pixel_rate, |
---|
1638 | | - dst_pixel_rate); |
---|
1639 | | - __v4l2_ctrl_s_ctrl(imx335->link_freq, |
---|
1640 | | - imx335->cur_mode->mipi_freq_idx); |
---|
1641 | 1298 | } |
---|
1642 | 1299 | break; |
---|
1643 | 1300 | case RKMODULE_SET_QUICK_STREAM: |
---|
.. | .. |
---|
1650 | 1307 | else |
---|
1651 | 1308 | imx335_write_reg(imx335->client, IMX335_REG_CTRL_MODE, |
---|
1652 | 1309 | IMX335_REG_VALUE_08BIT, 1); |
---|
1653 | | - break; |
---|
1654 | | - case RKMODULE_GET_READOUT_LINE_CNT_PER_LINE: |
---|
1655 | | - if (imx335->cur_mode->width == 2616 && imx335->cur_mode->height == 1964) |
---|
1656 | | - *((u32 *)arg) = 2; |
---|
1657 | | - else |
---|
1658 | | - *((u32 *)arg) = 4; |
---|
1659 | 1310 | break; |
---|
1660 | 1311 | default: |
---|
1661 | 1312 | ret = -ENOIOCTLCMD; |
---|
.. | .. |
---|
1676 | 1327 | struct preisp_hdrae_exp_s *hdrae; |
---|
1677 | 1328 | long ret; |
---|
1678 | 1329 | u32 stream = 0; |
---|
1679 | | - u32 readout = 0; |
---|
1680 | 1330 | |
---|
1681 | 1331 | switch (cmd) { |
---|
1682 | 1332 | case RKMODULE_GET_MODULE_INFO: |
---|
.. | .. |
---|
1687 | 1337 | } |
---|
1688 | 1338 | |
---|
1689 | 1339 | ret = imx335_ioctl(sd, cmd, inf); |
---|
1690 | | - if (!ret) { |
---|
1691 | | - if (copy_to_user(up, inf, sizeof(*inf))) |
---|
1692 | | - ret = -EFAULT; |
---|
1693 | | - } |
---|
| 1340 | + if (!ret) |
---|
| 1341 | + ret = copy_to_user(up, inf, sizeof(*inf)); |
---|
1694 | 1342 | kfree(inf); |
---|
1695 | 1343 | break; |
---|
1696 | 1344 | case RKMODULE_AWB_CFG: |
---|
.. | .. |
---|
1703 | 1351 | ret = copy_from_user(cfg, up, sizeof(*cfg)); |
---|
1704 | 1352 | if (!ret) |
---|
1705 | 1353 | ret = imx335_ioctl(sd, cmd, cfg); |
---|
1706 | | - else |
---|
1707 | | - ret = -EFAULT; |
---|
1708 | 1354 | kfree(cfg); |
---|
1709 | 1355 | break; |
---|
1710 | 1356 | case RKMODULE_GET_HDR_CFG: |
---|
.. | .. |
---|
1715 | 1361 | } |
---|
1716 | 1362 | |
---|
1717 | 1363 | ret = imx335_ioctl(sd, cmd, hdr); |
---|
1718 | | - if (!ret) { |
---|
1719 | | - if (copy_to_user(up, hdr, sizeof(*hdr))) |
---|
1720 | | - ret = -EFAULT; |
---|
1721 | | - } |
---|
| 1364 | + if (!ret) |
---|
| 1365 | + ret = copy_to_user(up, hdr, sizeof(*hdr)); |
---|
1722 | 1366 | kfree(hdr); |
---|
1723 | 1367 | break; |
---|
1724 | 1368 | case RKMODULE_SET_HDR_CFG: |
---|
.. | .. |
---|
1731 | 1375 | ret = copy_from_user(hdr, up, sizeof(*hdr)); |
---|
1732 | 1376 | if (!ret) |
---|
1733 | 1377 | ret = imx335_ioctl(sd, cmd, hdr); |
---|
1734 | | - else |
---|
1735 | | - ret = -EFAULT; |
---|
1736 | 1378 | kfree(hdr); |
---|
1737 | 1379 | break; |
---|
1738 | 1380 | case PREISP_CMD_SET_HDRAE_EXP: |
---|
.. | .. |
---|
1745 | 1387 | ret = copy_from_user(hdrae, up, sizeof(*hdrae)); |
---|
1746 | 1388 | if (!ret) |
---|
1747 | 1389 | ret = imx335_ioctl(sd, cmd, hdrae); |
---|
1748 | | - else |
---|
1749 | | - ret = -EFAULT; |
---|
1750 | 1390 | kfree(hdrae); |
---|
1751 | 1391 | break; |
---|
1752 | 1392 | case RKMODULE_SET_QUICK_STREAM: |
---|
1753 | 1393 | ret = copy_from_user(&stream, up, sizeof(u32)); |
---|
1754 | 1394 | if (!ret) |
---|
1755 | 1395 | ret = imx335_ioctl(sd, cmd, &stream); |
---|
1756 | | - else |
---|
1757 | | - ret = -EFAULT; |
---|
1758 | | - break; |
---|
1759 | | - case RKMODULE_GET_READOUT_LINE_CNT_PER_LINE: |
---|
1760 | | - ret = imx335_ioctl(sd, cmd, &readout); |
---|
1761 | | - if (!ret) { |
---|
1762 | | - if (copy_to_user(up, &readout, sizeof(u32))) |
---|
1763 | | - ret = -EFAULT; |
---|
1764 | | - } |
---|
1765 | 1396 | break; |
---|
1766 | 1397 | default: |
---|
1767 | 1398 | ret = -ENOIOCTLCMD; |
---|
.. | .. |
---|
2005 | 1636 | |
---|
2006 | 1637 | #define DST_WIDTH 2592 |
---|
2007 | 1638 | #define DST_HEIGHT 1944 |
---|
2008 | | -#define BINNING_WIDTH 1296 |
---|
2009 | | -#define BINNING_HEIGHT 972 |
---|
2010 | 1639 | |
---|
2011 | 1640 | /* |
---|
2012 | 1641 | * The resolution of the driver configuration needs to be exactly |
---|
.. | .. |
---|
2021 | 1650 | struct v4l2_subdev_pad_config *cfg, |
---|
2022 | 1651 | struct v4l2_subdev_selection *sel) |
---|
2023 | 1652 | { |
---|
2024 | | - struct imx335 *imx335 = to_imx335(sd); |
---|
2025 | 1653 | /* |
---|
2026 | 1654 | * From "Pixel Array Image Drawing in All scan mode", |
---|
2027 | 1655 | * there are 12 pixel offset on horizontal and vertical. |
---|
2028 | 1656 | */ |
---|
2029 | 1657 | if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) { |
---|
2030 | | - if (imx335->cur_mode->width == 2616 && imx335->cur_mode->height == 1964) { |
---|
2031 | | - sel->r.left = 12; |
---|
2032 | | - sel->r.width = DST_WIDTH; |
---|
2033 | | - sel->r.top = 12; |
---|
2034 | | - sel->r.height = DST_HEIGHT; |
---|
2035 | | - } else { |
---|
2036 | | - sel->r.left = 4; |
---|
2037 | | - sel->r.width = BINNING_WIDTH; |
---|
2038 | | - sel->r.top = 8; |
---|
2039 | | - sel->r.height = BINNING_HEIGHT; |
---|
2040 | | - } |
---|
| 1658 | + sel->r.left = 12; |
---|
| 1659 | + sel->r.width = DST_WIDTH; |
---|
| 1660 | + sel->r.top = 12; |
---|
| 1661 | + sel->r.height = DST_HEIGHT; |
---|
2041 | 1662 | return 0; |
---|
2042 | 1663 | } |
---|
2043 | 1664 | return -EINVAL; |
---|
.. | .. |
---|
2063 | 1684 | static const struct v4l2_subdev_video_ops imx335_video_ops = { |
---|
2064 | 1685 | .s_stream = imx335_s_stream, |
---|
2065 | 1686 | .g_frame_interval = imx335_g_frame_interval, |
---|
2066 | | - .g_mbus_config = imx335_g_mbus_config, |
---|
2067 | 1687 | }; |
---|
2068 | 1688 | |
---|
2069 | 1689 | static const struct v4l2_subdev_pad_ops imx335_pad_ops = { |
---|
.. | .. |
---|
2073 | 1693 | .get_fmt = imx335_get_fmt, |
---|
2074 | 1694 | .set_fmt = imx335_set_fmt, |
---|
2075 | 1695 | .get_selection = imx335_get_selection, |
---|
| 1696 | + .get_mbus_config = imx335_g_mbus_config, |
---|
2076 | 1697 | }; |
---|
2077 | 1698 | |
---|
2078 | 1699 | static const struct v4l2_subdev_ops imx335_subdev_ops = { |
---|
.. | .. |
---|
2111 | 1732 | switch (ctrl->id) { |
---|
2112 | 1733 | case V4L2_CID_EXPOSURE: |
---|
2113 | 1734 | if (imx335->cur_mode->hdr_mode != NO_HDR) |
---|
2114 | | - return ret; |
---|
| 1735 | + goto ctrl_end; |
---|
2115 | 1736 | shr0 = imx335->cur_vts - ctrl->val; |
---|
2116 | 1737 | ret = imx335_write_reg(imx335->client, IMX335_LF_EXPO_REG_L, |
---|
2117 | 1738 | IMX335_REG_VALUE_08BIT, |
---|
.. | .. |
---|
2127 | 1748 | break; |
---|
2128 | 1749 | case V4L2_CID_ANALOGUE_GAIN: |
---|
2129 | 1750 | if (imx335->cur_mode->hdr_mode != NO_HDR) |
---|
2130 | | - return ret; |
---|
| 1751 | + goto ctrl_end; |
---|
2131 | 1752 | ret = imx335_write_reg(imx335->client, IMX335_LF_GAIN_REG_H, |
---|
2132 | 1753 | IMX335_REG_VALUE_08BIT, |
---|
2133 | 1754 | IMX335_FETCH_GAIN_H(ctrl->val)); |
---|
.. | .. |
---|
2166 | 1787 | break; |
---|
2167 | 1788 | case V4L2_CID_HFLIP: |
---|
2168 | 1789 | ret = imx335_write_reg(imx335->client, IMX335_HREVERSE_REG, |
---|
2169 | | - IMX335_REG_VALUE_08BIT, ctrl->val); |
---|
| 1790 | + IMX335_REG_VALUE_08BIT, !!ctrl->val); |
---|
2170 | 1791 | break; |
---|
2171 | 1792 | case V4L2_CID_VFLIP: |
---|
2172 | 1793 | if (ctrl->val) { |
---|
2173 | 1794 | ret = imx335_write_reg(imx335->client, IMX335_VREVERSE_REG, |
---|
2174 | | - IMX335_REG_VALUE_08BIT, ctrl->val); |
---|
2175 | | - if (imx335->cur_mode->width == 2616 && imx335->cur_mode->height == 1964) { |
---|
2176 | | - ret |= imx335_write_reg(imx335->client, 0x3078, |
---|
2177 | | - IMX335_REG_VALUE_08BIT, 0x01); |
---|
2178 | | - ret |= imx335_write_reg(imx335->client, 0x3079, |
---|
2179 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2180 | | - ret |= imx335_write_reg(imx335->client, 0x307a, |
---|
2181 | | - IMX335_REG_VALUE_08BIT, 0xff); |
---|
2182 | | - ret |= imx335_write_reg(imx335->client, 0x307b, |
---|
2183 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2184 | | - ret |= imx335_write_reg(imx335->client, 0x307c, |
---|
2185 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2186 | | - ret |= imx335_write_reg(imx335->client, 0x307d, |
---|
2187 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2188 | | - ret |= imx335_write_reg(imx335->client, 0x307e, |
---|
2189 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2190 | | - ret |= imx335_write_reg(imx335->client, 0x307f, |
---|
2191 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2192 | | - ret |= imx335_write_reg(imx335->client, 0x3080, |
---|
2193 | | - IMX335_REG_VALUE_08BIT, 0x01); |
---|
2194 | | - ret |= imx335_write_reg(imx335->client, 0x3081, |
---|
2195 | | - IMX335_REG_VALUE_08BIT, 0xfe); |
---|
2196 | | - ret |= imx335_write_reg(imx335->client, 0x3082, |
---|
2197 | | - IMX335_REG_VALUE_08BIT, 0xff); |
---|
2198 | | - ret |= imx335_write_reg(imx335->client, 0x3083, |
---|
2199 | | - IMX335_REG_VALUE_08BIT, 0xfe); |
---|
2200 | | - ret |= imx335_write_reg(imx335->client, 0x3084, |
---|
2201 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2202 | | - ret |= imx335_write_reg(imx335->client, 0x3085, |
---|
2203 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2204 | | - ret |= imx335_write_reg(imx335->client, 0x3086, |
---|
2205 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2206 | | - ret |= imx335_write_reg(imx335->client, 0x3087, |
---|
2207 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2208 | | - ret |= imx335_write_reg(imx335->client, 0x30a4, |
---|
2209 | | - IMX335_REG_VALUE_08BIT, 0x33); |
---|
2210 | | - ret |= imx335_write_reg(imx335->client, 0x30a8, |
---|
2211 | | - IMX335_REG_VALUE_08BIT, 0x10); |
---|
2212 | | - ret |= imx335_write_reg(imx335->client, 0x30a9, |
---|
2213 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2214 | | - ret |= imx335_write_reg(imx335->client, 0x30ac, |
---|
2215 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2216 | | - ret |= imx335_write_reg(imx335->client, 0x30ad, |
---|
2217 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2218 | | - ret |= imx335_write_reg(imx335->client, 0x30b0, |
---|
2219 | | - IMX335_REG_VALUE_08BIT, 0x10); |
---|
2220 | | - ret |= imx335_write_reg(imx335->client, 0x30b1, |
---|
2221 | | - IMX335_REG_VALUE_08BIT, 0x08); |
---|
2222 | | - ret |= imx335_write_reg(imx335->client, 0x30b4, |
---|
2223 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2224 | | - ret |= imx335_write_reg(imx335->client, 0x30b5, |
---|
2225 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2226 | | - ret |= imx335_write_reg(imx335->client, 0x30b6, |
---|
2227 | | - IMX335_REG_VALUE_08BIT, 0xfa); |
---|
2228 | | - ret |= imx335_write_reg(imx335->client, 0x30b7, |
---|
2229 | | - IMX335_REG_VALUE_08BIT, 0x01); |
---|
2230 | | - ret |= imx335_write_reg(imx335->client, 0x3112, |
---|
2231 | | - IMX335_REG_VALUE_08BIT, 0x08); |
---|
2232 | | - ret |= imx335_write_reg(imx335->client, 0x3113, |
---|
2233 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2234 | | - ret |= imx335_write_reg(imx335->client, 0x3116, |
---|
2235 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2236 | | - ret |= imx335_write_reg(imx335->client, 0x3117, |
---|
2237 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2238 | | - } else { |
---|
2239 | | - ret |= imx335_write_reg(imx335->client, 0x3078, |
---|
2240 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2241 | | - ret |= imx335_write_reg(imx335->client, 0x3079, |
---|
2242 | | - IMX335_REG_VALUE_08BIT, 0xfd); |
---|
2243 | | - ret |= imx335_write_reg(imx335->client, 0x307a, |
---|
2244 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2245 | | - ret |= imx335_write_reg(imx335->client, 0x307b, |
---|
2246 | | - IMX335_REG_VALUE_08BIT, 0xfe); |
---|
2247 | | - ret |= imx335_write_reg(imx335->client, 0x307c, |
---|
2248 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2249 | | - ret |= imx335_write_reg(imx335->client, 0x307d, |
---|
2250 | | - IMX335_REG_VALUE_08BIT, 0xfb); |
---|
2251 | | - ret |= imx335_write_reg(imx335->client, 0x307e, |
---|
2252 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2253 | | - ret |= imx335_write_reg(imx335->client, 0x307f, |
---|
2254 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2255 | | - ret |= imx335_write_reg(imx335->client, 0x3080, |
---|
2256 | | - IMX335_REG_VALUE_08BIT, 0xfc); |
---|
2257 | | - ret |= imx335_write_reg(imx335->client, 0x3081, |
---|
2258 | | - IMX335_REG_VALUE_08BIT, 0x05); |
---|
2259 | | - ret |= imx335_write_reg(imx335->client, 0x3082, |
---|
2260 | | - IMX335_REG_VALUE_08BIT, 0xfc); |
---|
2261 | | - ret |= imx335_write_reg(imx335->client, 0x3083, |
---|
2262 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2263 | | - ret |= imx335_write_reg(imx335->client, 0x3084, |
---|
2264 | | - IMX335_REG_VALUE_08BIT, 0xfc); |
---|
2265 | | - ret |= imx335_write_reg(imx335->client, 0x3085, |
---|
2266 | | - IMX335_REG_VALUE_08BIT, 0x03); |
---|
2267 | | - ret |= imx335_write_reg(imx335->client, 0x3086, |
---|
2268 | | - IMX335_REG_VALUE_08BIT, 0xfc); |
---|
2269 | | - ret |= imx335_write_reg(imx335->client, 0x3087, |
---|
2270 | | - IMX335_REG_VALUE_08BIT, 0xfe); |
---|
2271 | | - ret |= imx335_write_reg(imx335->client, 0x30a4, |
---|
2272 | | - IMX335_REG_VALUE_08BIT, 0x77); |
---|
2273 | | - ret |= imx335_write_reg(imx335->client, 0x30a8, |
---|
2274 | | - IMX335_REG_VALUE_08BIT, 0x20); |
---|
2275 | | - ret |= imx335_write_reg(imx335->client, 0x30a9, |
---|
2276 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2277 | | - ret |= imx335_write_reg(imx335->client, 0x30ac, |
---|
2278 | | - IMX335_REG_VALUE_08BIT, 0x08); |
---|
2279 | | - ret |= imx335_write_reg(imx335->client, 0x30ad, |
---|
2280 | | - IMX335_REG_VALUE_08BIT, 0x78); |
---|
2281 | | - ret |= imx335_write_reg(imx335->client, 0x30b0, |
---|
2282 | | - IMX335_REG_VALUE_08BIT, 0x20); |
---|
2283 | | - ret |= imx335_write_reg(imx335->client, 0x30b1, |
---|
2284 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2285 | | - ret |= imx335_write_reg(imx335->client, 0x30b4, |
---|
2286 | | - IMX335_REG_VALUE_08BIT, 0x10); |
---|
2287 | | - ret |= imx335_write_reg(imx335->client, 0x30b5, |
---|
2288 | | - IMX335_REG_VALUE_08BIT, 0x70); |
---|
2289 | | - ret |= imx335_write_reg(imx335->client, 0x30b6, |
---|
2290 | | - IMX335_REG_VALUE_08BIT, 0xf2); |
---|
2291 | | - ret |= imx335_write_reg(imx335->client, 0x30b7, |
---|
2292 | | - IMX335_REG_VALUE_08BIT, 0x01); |
---|
2293 | | - ret |= imx335_write_reg(imx335->client, 0x3112, |
---|
2294 | | - IMX335_REG_VALUE_08BIT, 0x10); |
---|
2295 | | - ret |= imx335_write_reg(imx335->client, 0x3113, |
---|
2296 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2297 | | - ret |= imx335_write_reg(imx335->client, 0x3116, |
---|
2298 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2299 | | - ret |= imx335_write_reg(imx335->client, 0x3117, |
---|
2300 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2301 | | - } |
---|
| 1795 | + IMX335_REG_VALUE_08BIT, !!ctrl->val); |
---|
| 1796 | + ret |= imx335_write_reg(imx335->client, 0x3081, |
---|
| 1797 | + IMX335_REG_VALUE_08BIT, 0xfe); |
---|
| 1798 | + ret |= imx335_write_reg(imx335->client, 0x3083, |
---|
| 1799 | + IMX335_REG_VALUE_08BIT, 0xfe); |
---|
| 1800 | + ret |= imx335_write_reg(imx335->client, 0x30b6, |
---|
| 1801 | + IMX335_REG_VALUE_08BIT, 0xfa); |
---|
| 1802 | + ret |= imx335_write_reg(imx335->client, 0x30b7, |
---|
| 1803 | + IMX335_REG_VALUE_08BIT, 0x01); |
---|
| 1804 | + ret |= imx335_write_reg(imx335->client, 0x3116, |
---|
| 1805 | + IMX335_REG_VALUE_08BIT, 0x02); |
---|
| 1806 | + ret |= imx335_write_reg(imx335->client, 0x3117, |
---|
| 1807 | + IMX335_REG_VALUE_08BIT, 0x00); |
---|
2302 | 1808 | } else { |
---|
2303 | 1809 | ret = imx335_write_reg(imx335->client, IMX335_VREVERSE_REG, |
---|
2304 | | - IMX335_REG_VALUE_08BIT, ctrl->val); |
---|
2305 | | - if (imx335->cur_mode->width == 2616 && imx335->cur_mode->height == 1964) { |
---|
2306 | | - ret |= imx335_write_reg(imx335->client, 0x3078, |
---|
2307 | | - IMX335_REG_VALUE_08BIT, 0x01); |
---|
2308 | | - ret |= imx335_write_reg(imx335->client, 0x3079, |
---|
2309 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2310 | | - ret |= imx335_write_reg(imx335->client, 0x307a, |
---|
2311 | | - IMX335_REG_VALUE_08BIT, 0xff); |
---|
2312 | | - ret |= imx335_write_reg(imx335->client, 0x307b, |
---|
2313 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2314 | | - ret |= imx335_write_reg(imx335->client, 0x307c, |
---|
2315 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2316 | | - ret |= imx335_write_reg(imx335->client, 0x307d, |
---|
2317 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2318 | | - ret |= imx335_write_reg(imx335->client, 0x307e, |
---|
2319 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2320 | | - ret |= imx335_write_reg(imx335->client, 0x307f, |
---|
2321 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2322 | | - ret |= imx335_write_reg(imx335->client, 0x3080, |
---|
2323 | | - IMX335_REG_VALUE_08BIT, 0x01); |
---|
2324 | | - ret |= imx335_write_reg(imx335->client, 0x3081, |
---|
2325 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2326 | | - ret |= imx335_write_reg(imx335->client, 0x3082, |
---|
2327 | | - IMX335_REG_VALUE_08BIT, 0xff); |
---|
2328 | | - ret |= imx335_write_reg(imx335->client, 0x3083, |
---|
2329 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2330 | | - ret |= imx335_write_reg(imx335->client, 0x3084, |
---|
2331 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2332 | | - ret |= imx335_write_reg(imx335->client, 0x3085, |
---|
2333 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2334 | | - ret |= imx335_write_reg(imx335->client, 0x3086, |
---|
2335 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2336 | | - ret |= imx335_write_reg(imx335->client, 0x3087, |
---|
2337 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2338 | | - ret |= imx335_write_reg(imx335->client, 0x30a4, |
---|
2339 | | - IMX335_REG_VALUE_08BIT, 0x33); |
---|
2340 | | - ret |= imx335_write_reg(imx335->client, 0x30a8, |
---|
2341 | | - IMX335_REG_VALUE_08BIT, 0x10); |
---|
2342 | | - ret |= imx335_write_reg(imx335->client, 0x30a9, |
---|
2343 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2344 | | - ret |= imx335_write_reg(imx335->client, 0x30ac, |
---|
2345 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2346 | | - ret |= imx335_write_reg(imx335->client, 0x30ad, |
---|
2347 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2348 | | - ret |= imx335_write_reg(imx335->client, 0x30b0, |
---|
2349 | | - IMX335_REG_VALUE_08BIT, 0x10); |
---|
2350 | | - ret |= imx335_write_reg(imx335->client, 0x30b1, |
---|
2351 | | - IMX335_REG_VALUE_08BIT, 0x08); |
---|
2352 | | - ret |= imx335_write_reg(imx335->client, 0x30b4, |
---|
2353 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2354 | | - ret |= imx335_write_reg(imx335->client, 0x30b5, |
---|
2355 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2356 | | - ret |= imx335_write_reg(imx335->client, 0x30b6, |
---|
2357 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2358 | | - ret |= imx335_write_reg(imx335->client, 0x30b7, |
---|
2359 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2360 | | - ret |= imx335_write_reg(imx335->client, 0x3112, |
---|
2361 | | - IMX335_REG_VALUE_08BIT, 0x08); |
---|
2362 | | - ret |= imx335_write_reg(imx335->client, 0x3113, |
---|
2363 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2364 | | - ret |= imx335_write_reg(imx335->client, 0x3116, |
---|
2365 | | - IMX335_REG_VALUE_08BIT, 0x08); |
---|
2366 | | - ret |= imx335_write_reg(imx335->client, 0x3117, |
---|
2367 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2368 | | - } else { |
---|
2369 | | - ret |= imx335_write_reg(imx335->client, 0x3078, |
---|
2370 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2371 | | - ret |= imx335_write_reg(imx335->client, 0x3079, |
---|
2372 | | - IMX335_REG_VALUE_08BIT, 0xfd); |
---|
2373 | | - ret |= imx335_write_reg(imx335->client, 0x307a, |
---|
2374 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2375 | | - ret |= imx335_write_reg(imx335->client, 0x307b, |
---|
2376 | | - IMX335_REG_VALUE_08BIT, 0xfe); |
---|
2377 | | - ret |= imx335_write_reg(imx335->client, 0x307c, |
---|
2378 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2379 | | - ret |= imx335_write_reg(imx335->client, 0x307d, |
---|
2380 | | - IMX335_REG_VALUE_08BIT, 0xfb); |
---|
2381 | | - ret |= imx335_write_reg(imx335->client, 0x307e, |
---|
2382 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2383 | | - ret |= imx335_write_reg(imx335->client, 0x307f, |
---|
2384 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2385 | | - ret |= imx335_write_reg(imx335->client, 0x3080, |
---|
2386 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2387 | | - ret |= imx335_write_reg(imx335->client, 0x3081, |
---|
2388 | | - IMX335_REG_VALUE_08BIT, 0xfd); |
---|
2389 | | - ret |= imx335_write_reg(imx335->client, 0x3082, |
---|
2390 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2391 | | - ret |= imx335_write_reg(imx335->client, 0x3083, |
---|
2392 | | - IMX335_REG_VALUE_08BIT, 0xfe); |
---|
2393 | | - ret |= imx335_write_reg(imx335->client, 0x3084, |
---|
2394 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2395 | | - ret |= imx335_write_reg(imx335->client, 0x3085, |
---|
2396 | | - IMX335_REG_VALUE_08BIT, 0xfb); |
---|
2397 | | - ret |= imx335_write_reg(imx335->client, 0x3086, |
---|
2398 | | - IMX335_REG_VALUE_08BIT, 0x04); |
---|
2399 | | - ret |= imx335_write_reg(imx335->client, 0x3087, |
---|
2400 | | - IMX335_REG_VALUE_08BIT, 0x02); |
---|
2401 | | - ret |= imx335_write_reg(imx335->client, 0x30a4, |
---|
2402 | | - IMX335_REG_VALUE_08BIT, 0x77); |
---|
2403 | | - ret |= imx335_write_reg(imx335->client, 0x30a8, |
---|
2404 | | - IMX335_REG_VALUE_08BIT, 0x20); |
---|
2405 | | - ret |= imx335_write_reg(imx335->client, 0x30a9, |
---|
2406 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2407 | | - ret |= imx335_write_reg(imx335->client, 0x30ac, |
---|
2408 | | - IMX335_REG_VALUE_08BIT, 0x08); |
---|
2409 | | - ret |= imx335_write_reg(imx335->client, 0x30ad, |
---|
2410 | | - IMX335_REG_VALUE_08BIT, 0x08); |
---|
2411 | | - ret |= imx335_write_reg(imx335->client, 0x30b0, |
---|
2412 | | - IMX335_REG_VALUE_08BIT, 0x20); |
---|
2413 | | - ret |= imx335_write_reg(imx335->client, 0x30b1, |
---|
2414 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2415 | | - ret |= imx335_write_reg(imx335->client, 0x30b4, |
---|
2416 | | - IMX335_REG_VALUE_08BIT, 0x10); |
---|
2417 | | - ret |= imx335_write_reg(imx335->client, 0x30b5, |
---|
2418 | | - IMX335_REG_VALUE_08BIT, 0x10); |
---|
2419 | | - ret |= imx335_write_reg(imx335->client, 0x30b6, |
---|
2420 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2421 | | - ret |= imx335_write_reg(imx335->client, 0x30b7, |
---|
2422 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2423 | | - ret |= imx335_write_reg(imx335->client, 0x3112, |
---|
2424 | | - IMX335_REG_VALUE_08BIT, 0x10); |
---|
2425 | | - ret |= imx335_write_reg(imx335->client, 0x3113, |
---|
2426 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2427 | | - ret |= imx335_write_reg(imx335->client, 0x3116, |
---|
2428 | | - IMX335_REG_VALUE_08BIT, 0x10); |
---|
2429 | | - ret |= imx335_write_reg(imx335->client, 0x3117, |
---|
2430 | | - IMX335_REG_VALUE_08BIT, 0x00); |
---|
2431 | | - } |
---|
| 1810 | + IMX335_REG_VALUE_08BIT, !!ctrl->val); |
---|
| 1811 | + ret |= imx335_write_reg(imx335->client, 0x3081, |
---|
| 1812 | + IMX335_REG_VALUE_08BIT, 0x02); |
---|
| 1813 | + ret |= imx335_write_reg(imx335->client, 0x3083, |
---|
| 1814 | + IMX335_REG_VALUE_08BIT, 0x02); |
---|
| 1815 | + ret |= imx335_write_reg(imx335->client, 0x30b6, |
---|
| 1816 | + IMX335_REG_VALUE_08BIT, 0x00); |
---|
| 1817 | + ret |= imx335_write_reg(imx335->client, 0x30b7, |
---|
| 1818 | + IMX335_REG_VALUE_08BIT, 0x00); |
---|
| 1819 | + ret |= imx335_write_reg(imx335->client, 0x3116, |
---|
| 1820 | + IMX335_REG_VALUE_08BIT, 0x08); |
---|
| 1821 | + ret |= imx335_write_reg(imx335->client, 0x3117, |
---|
| 1822 | + IMX335_REG_VALUE_08BIT, 0x00); |
---|
2432 | 1823 | } |
---|
2433 | 1824 | break; |
---|
2434 | 1825 | default: |
---|
.. | .. |
---|
2437 | 1828 | break; |
---|
2438 | 1829 | } |
---|
2439 | 1830 | |
---|
| 1831 | +ctrl_end: |
---|
2440 | 1832 | pm_runtime_put(&client->dev); |
---|
2441 | 1833 | |
---|
2442 | 1834 | return ret; |
---|
.. | .. |
---|
2468 | 1860 | link_freq_items); |
---|
2469 | 1861 | |
---|
2470 | 1862 | /* pixel rate = link frequency * 2 * lanes / BITS_PER_SAMPLE */ |
---|
2471 | | - pixel_rate = (u32)link_freq_items[mode->mipi_freq_idx] / mode->bpp * 2 * IMX335_4LANES; |
---|
| 1863 | + pixel_rate = (u32)link_freq_items[0] / mode->bpp * 2 * IMX335_4LANES; |
---|
2472 | 1864 | imx335->pixel_rate = v4l2_ctrl_new_std(handler, NULL, |
---|
2473 | 1865 | V4L2_CID_PIXEL_RATE, 0, pixel_rate, 1, pixel_rate); |
---|
2474 | 1866 | |
---|