1/* 2 * Copyright (C) 2009 QUALCOMM Incorporated. 3 */ 4 5#include "mt9p012.h" 6#include <linux/kernel.h> 7 8/*Micron settings from Applications for lower power consumption.*/ 9struct reg_struct mt9p012_reg_pat[2] = { 10 { /* Preview */ 11 /* vt_pix_clk_div REG=0x0300 */ 12 6, /* 5 */ 13 14 /* vt_sys_clk_div REG=0x0302 */ 15 1, 16 17 /* pre_pll_clk_div REG=0x0304 */ 18 2, 19 20 /* pll_multiplier REG=0x0306 */ 21 60, 22 23 /* op_pix_clk_div REG=0x0308 */ 24 8, /* 10 */ 25 26 /* op_sys_clk_div REG=0x030A */ 27 1, 28 29 /* scale_m REG=0x0404 */ 30 16, 31 32 /* row_speed REG=0x3016 */ 33 0x0111, 34 35 /* x_addr_start REG=0x3004 */ 36 8, 37 38 /* x_addr_end REG=0x3008 */ 39 2597, 40 41 /* y_addr_start REG=0x3002 */ 42 8, 43 44 /* y_addr_end REG=0x3006 */ 45 1949, 46 47 /* read_mode REG=0x3040 48 * Preview 2x2 skipping */ 49 0x00C3, 50 51 /* x_output_size REG=0x034C */ 52 1296, 53 54 /* y_output_size REG=0x034E */ 55 972, 56 57 /* line_length_pck REG=0x300C */ 58 3784, 59 60 /* frame_length_lines REG=0x300A */ 61 1057, 62 63 /* coarse_integration_time REG=0x3012 */ 64 16, 65 66 /* fine_integration_time REG=0x3014 */ 67 1764 68 }, 69 { /*Snapshot*/ 70 /* vt_pix_clk_div REG=0x0300 */ 71 6, 72 73 /* vt_sys_clk_div REG=0x0302 */ 74 1, 75 76 /* pre_pll_clk_div REG=0x0304 */ 77 2, 78 79 /* pll_multiplier REG=0x0306 80 * 60 for 10fps snapshot */ 81 60, 82 83 /* op_pix_clk_div REG=0x0308 */ 84 8, 85 86 /* op_sys_clk_div REG=0x030A */ 87 1, 88 89 /* scale_m REG=0x0404 */ 90 16, 91 92 /* row_speed REG=0x3016 */ 93 0x0111, 94 95 /* x_addr_start REG=0x3004 */ 96 8, 97 98 /* x_addr_end REG=0x3008 */ 99 2615, 100 101 /* y_addr_start REG=0x3002 */ 102 8, 103 104 /* y_addr_end REG=0x3006 */ 105 1967, 106 107 /* read_mode REG=0x3040 */ 108 0x0041, 109 110 /* x_output_size REG=0x034C */ 111 2608, 112 113 /* y_output_size REG=0x034E */ 114 1960, 115 116 /* line_length_pck REG=0x300C */ 117 3911, 118 119 /* frame_length_lines REG=0x300A //10 fps snapshot */ 120 2045, 121 122 /* coarse_integration_time REG=0x3012 */ 123 16, 124 125 /* fine_integration_time REG=0x3014 */ 126 882 127 } 128}; 129 130 131struct mt9p012_i2c_reg_conf mt9p012_test_tbl[] = { 132 {0x3044, 0x0544 & 0xFBFF}, 133 {0x30CA, 0x0004 | 0x0001}, 134 {0x30D4, 0x9020 & 0x7FFF}, 135 {0x31E0, 0x0003 & 0xFFFE}, 136 {0x3180, 0x91FF & 0x7FFF}, 137 {0x301A, (0x10CC | 0x8000) & 0xFFF7}, 138 {0x301E, 0x0000}, 139 {0x3780, 0x0000}, 140}; 141 142 143struct mt9p012_i2c_reg_conf mt9p012_lc_tbl[] = { 144 /* [Lens shading 85 Percent TL84] */ 145 /* P_RD_P0Q0 */ 146 {0x360A, 0x7FEF}, 147 /* P_RD_P0Q1 */ 148 {0x360C, 0x232C}, 149 /* P_RD_P0Q2 */ 150 {0x360E, 0x7050}, 151 /* P_RD_P0Q3 */ 152 {0x3610, 0xF3CC}, 153 /* P_RD_P0Q4 */ 154 {0x3612, 0x89D1}, 155 /* P_RD_P1Q0 */ 156 {0x364A, 0xBE0D}, 157 /* P_RD_P1Q1 */ 158 {0x364C, 0x9ACB}, 159 /* P_RD_P1Q2 */ 160 {0x364E, 0x2150}, 161 /* P_RD_P1Q3 */ 162 {0x3650, 0xB26B}, 163 /* P_RD_P1Q4 */ 164 {0x3652, 0x9511}, 165 /* P_RD_P2Q0 */ 166 {0x368A, 0x2151}, 167 /* P_RD_P2Q1 */ 168 {0x368C, 0x00AD}, 169 /* P_RD_P2Q2 */ 170 {0x368E, 0x8334}, 171 /* P_RD_P2Q3 */ 172 {0x3690, 0x478E}, 173 /* P_RD_P2Q4 */ 174 {0x3692, 0x0515}, 175 /* P_RD_P3Q0 */ 176 {0x36CA, 0x0710}, 177 /* P_RD_P3Q1 */ 178 {0x36CC, 0x452D}, 179 /* P_RD_P3Q2 */ 180 {0x36CE, 0xF352}, 181 /* P_RD_P3Q3 */ 182 {0x36D0, 0x190F}, 183 /* P_RD_P3Q4 */ 184 {0x36D2, 0x4413}, 185 /* P_RD_P4Q0 */ 186 {0x370A, 0xD112}, 187 /* P_RD_P4Q1 */ 188 {0x370C, 0xF50F}, 189 /* P_RD_P4Q2 */ 190 {0x370C, 0xF50F}, 191 /* P_RD_P4Q3 */ 192 {0x3710, 0xDC11}, 193 /* P_RD_P4Q4 */ 194 {0x3712, 0xD776}, 195 /* P_GR_P0Q0 */ 196 {0x3600, 0x1750}, 197 /* P_GR_P0Q1 */ 198 {0x3602, 0xF0AC}, 199 /* P_GR_P0Q2 */ 200 {0x3604, 0x4711}, 201 /* P_GR_P0Q3 */ 202 {0x3606, 0x07CE}, 203 /* P_GR_P0Q4 */ 204 {0x3608, 0x96B2}, 205 /* P_GR_P1Q0 */ 206 {0x3640, 0xA9AE}, 207 /* P_GR_P1Q1 */ 208 {0x3642, 0xF9AC}, 209 /* P_GR_P1Q2 */ 210 {0x3644, 0x39F1}, 211 /* P_GR_P1Q3 */ 212 {0x3646, 0x016F}, 213 /* P_GR_P1Q4 */ 214 {0x3648, 0x8AB2}, 215 /* P_GR_P2Q0 */ 216 {0x3680, 0x1752}, 217 /* P_GR_P2Q1 */ 218 {0x3682, 0x70F0}, 219 /* P_GR_P2Q2 */ 220 {0x3684, 0x83F5}, 221 /* P_GR_P2Q3 */ 222 {0x3686, 0x8392}, 223 /* P_GR_P2Q4 */ 224 {0x3688, 0x1FD6}, 225 /* P_GR_P3Q0 */ 226 {0x36C0, 0x1131}, 227 /* P_GR_P3Q1 */ 228 {0x36C2, 0x3DAF}, 229 /* P_GR_P3Q2 */ 230 {0x36C4, 0x89B4}, 231 /* P_GR_P3Q3 */ 232 {0x36C6, 0xA391}, 233 /* P_GR_P3Q4 */ 234 {0x36C8, 0x1334}, 235 /* P_GR_P4Q0 */ 236 {0x3700, 0xDC13}, 237 /* P_GR_P4Q1 */ 238 {0x3702, 0xD052}, 239 /* P_GR_P4Q2 */ 240 {0x3704, 0x5156}, 241 /* P_GR_P4Q3 */ 242 {0x3706, 0x1F13}, 243 /* P_GR_P4Q4 */ 244 {0x3708, 0x8C38}, 245 /* P_BL_P0Q0 */ 246 {0x3614, 0x0050}, 247 /* P_BL_P0Q1 */ 248 {0x3616, 0xBD4C}, 249 /* P_BL_P0Q2 */ 250 {0x3618, 0x41B0}, 251 /* P_BL_P0Q3 */ 252 {0x361A, 0x660D}, 253 /* P_BL_P0Q4 */ 254 {0x361C, 0xC590}, 255 /* P_BL_P1Q0 */ 256 {0x3654, 0x87EC}, 257 /* P_BL_P1Q1 */ 258 {0x3656, 0xE44C}, 259 /* P_BL_P1Q2 */ 260 {0x3658, 0x302E}, 261 /* P_BL_P1Q3 */ 262 {0x365A, 0x106E}, 263 /* P_BL_P1Q4 */ 264 {0x365C, 0xB58E}, 265 /* P_BL_P2Q0 */ 266 {0x3694, 0x0DD1}, 267 /* P_BL_P2Q1 */ 268 {0x3696, 0x2A50}, 269 /* P_BL_P2Q2 */ 270 {0x3698, 0xC793}, 271 /* P_BL_P2Q3 */ 272 {0x369A, 0xE8F1}, 273 /* P_BL_P2Q4 */ 274 {0x369C, 0x4174}, 275 /* P_BL_P3Q0 */ 276 {0x36D4, 0x01EF}, 277 /* P_BL_P3Q1 */ 278 {0x36D6, 0x06CF}, 279 /* P_BL_P3Q2 */ 280 {0x36D8, 0x8D91}, 281 /* P_BL_P3Q3 */ 282 {0x36DA, 0x91F0}, 283 /* P_BL_P3Q4 */ 284 {0x36DC, 0x52EF}, 285 /* P_BL_P4Q0 */ 286 {0x3714, 0xA6D2}, 287 /* P_BL_P4Q1 */ 288 {0x3716, 0xA312}, 289 /* P_BL_P4Q2 */ 290 {0x3718, 0x2695}, 291 /* P_BL_P4Q3 */ 292 {0x371A, 0x3953}, 293 /* P_BL_P4Q4 */ 294 {0x371C, 0x9356}, 295 /* P_GB_P0Q0 */ 296 {0x361E, 0x7EAF}, 297 /* P_GB_P0Q1 */ 298 {0x3620, 0x2A4C}, 299 /* P_GB_P0Q2 */ 300 {0x3622, 0x49F0}, 301 {0x3624, 0xF1EC}, 302 /* P_GB_P0Q4 */ 303 {0x3626, 0xC670}, 304 /* P_GB_P1Q0 */ 305 {0x365E, 0x8E0C}, 306 /* P_GB_P1Q1 */ 307 {0x3660, 0xC2A9}, 308 /* P_GB_P1Q2 */ 309 {0x3662, 0x274F}, 310 /* P_GB_P1Q3 */ 311 {0x3664, 0xADAB}, 312 /* P_GB_P1Q4 */ 313 {0x3666, 0x8EF0}, 314 /* P_GB_P2Q0 */ 315 {0x369E, 0x09B1}, 316 /* P_GB_P2Q1 */ 317 {0x36A0, 0xAA2E}, 318 /* P_GB_P2Q2 */ 319 {0x36A2, 0xC3D3}, 320 /* P_GB_P2Q3 */ 321 {0x36A4, 0x7FAF}, 322 /* P_GB_P2Q4 */ 323 {0x36A6, 0x3F34}, 324 /* P_GB_P3Q0 */ 325 {0x36DE, 0x4C8F}, 326 /* P_GB_P3Q1 */ 327 {0x36E0, 0x886E}, 328 /* P_GB_P3Q2 */ 329 {0x36E2, 0xE831}, 330 /* P_GB_P3Q3 */ 331 {0x36E4, 0x1FD0}, 332 /* P_GB_P3Q4 */ 333 {0x36E6, 0x1192}, 334 /* P_GB_P4Q0 */ 335 {0x371E, 0xB952}, 336 /* P_GB_P4Q1 */ 337 {0x3720, 0x6DCF}, 338 /* P_GB_P4Q2 */ 339 {0x3722, 0x1B55}, 340 /* P_GB_P4Q3 */ 341 {0x3724, 0xA112}, 342 /* P_GB_P4Q4 */ 343 {0x3726, 0x82F6}, 344 /* POLY_ORIGIN_C */ 345 {0x3782, 0x0510}, 346 /* POLY_ORIGIN_R */ 347 {0x3784, 0x0390}, 348 /* POLY_SC_ENABLE */ 349 {0x3780, 0x8000}, 350}; 351 352/* rolloff table for illuminant A */ 353struct mt9p012_i2c_reg_conf mt9p012_rolloff_tbl[] = { 354 /* P_RD_P0Q0 */ 355 {0x360A, 0x7FEF}, 356 /* P_RD_P0Q1 */ 357 {0x360C, 0x232C}, 358 /* P_RD_P0Q2 */ 359 {0x360E, 0x7050}, 360 /* P_RD_P0Q3 */ 361 {0x3610, 0xF3CC}, 362 /* P_RD_P0Q4 */ 363 {0x3612, 0x89D1}, 364 /* P_RD_P1Q0 */ 365 {0x364A, 0xBE0D}, 366 /* P_RD_P1Q1 */ 367 {0x364C, 0x9ACB}, 368 /* P_RD_P1Q2 */ 369 {0x364E, 0x2150}, 370 /* P_RD_P1Q3 */ 371 {0x3650, 0xB26B}, 372 /* P_RD_P1Q4 */ 373 {0x3652, 0x9511}, 374 /* P_RD_P2Q0 */ 375 {0x368A, 0x2151}, 376 /* P_RD_P2Q1 */ 377 {0x368C, 0x00AD}, 378 /* P_RD_P2Q2 */ 379 {0x368E, 0x8334}, 380 /* P_RD_P2Q3 */ 381 {0x3690, 0x478E}, 382 /* P_RD_P2Q4 */ 383 {0x3692, 0x0515}, 384 /* P_RD_P3Q0 */ 385 {0x36CA, 0x0710}, 386 /* P_RD_P3Q1 */ 387 {0x36CC, 0x452D}, 388 /* P_RD_P3Q2 */ 389 {0x36CE, 0xF352}, 390 /* P_RD_P3Q3 */ 391 {0x36D0, 0x190F}, 392 /* P_RD_P3Q4 */ 393 {0x36D2, 0x4413}, 394 /* P_RD_P4Q0 */ 395 {0x370A, 0xD112}, 396 /* P_RD_P4Q1 */ 397 {0x370C, 0xF50F}, 398 /* P_RD_P4Q2 */ 399 {0x370E, 0x6375}, 400 /* P_RD_P4Q3 */ 401 {0x3710, 0xDC11}, 402 /* P_RD_P4Q4 */ 403 {0x3712, 0xD776}, 404 /* P_GR_P0Q0 */ 405 {0x3600, 0x1750}, 406 /* P_GR_P0Q1 */ 407 {0x3602, 0xF0AC}, 408 /* P_GR_P0Q2 */ 409 {0x3604, 0x4711}, 410 /* P_GR_P0Q3 */ 411 {0x3606, 0x07CE}, 412 /* P_GR_P0Q4 */ 413 {0x3608, 0x96B2}, 414 /* P_GR_P1Q0 */ 415 {0x3640, 0xA9AE}, 416 /* P_GR_P1Q1 */ 417 {0x3642, 0xF9AC}, 418 /* P_GR_P1Q2 */ 419 {0x3644, 0x39F1}, 420 /* P_GR_P1Q3 */ 421 {0x3646, 0x016F}, 422 /* P_GR_P1Q4 */ 423 {0x3648, 0x8AB2}, 424 /* P_GR_P2Q0 */ 425 {0x3680, 0x1752}, 426 /* P_GR_P2Q1 */ 427 {0x3682, 0x70F0}, 428 /* P_GR_P2Q2 */ 429 {0x3684, 0x83F5}, 430 /* P_GR_P2Q3 */ 431 {0x3686, 0x8392}, 432 /* P_GR_P2Q4 */ 433 {0x3688, 0x1FD6}, 434 /* P_GR_P3Q0 */ 435 {0x36C0, 0x1131}, 436 /* P_GR_P3Q1 */ 437 {0x36C2, 0x3DAF}, 438 /* P_GR_P3Q2 */ 439 {0x36C4, 0x89B4}, 440 /* P_GR_P3Q3 */ 441 {0x36C6, 0xA391}, 442 /* P_GR_P3Q4 */ 443 {0x36C8, 0x1334}, 444 /* P_GR_P4Q0 */ 445 {0x3700, 0xDC13}, 446 /* P_GR_P4Q1 */ 447 {0x3702, 0xD052}, 448 /* P_GR_P4Q2 */ 449 {0x3704, 0x5156}, 450 /* P_GR_P4Q3 */ 451 {0x3706, 0x1F13}, 452 /* P_GR_P4Q4 */ 453 {0x3708, 0x8C38}, 454 /* P_BL_P0Q0 */ 455 {0x3614, 0x0050}, 456 /* P_BL_P0Q1 */ 457 {0x3616, 0xBD4C}, 458 /* P_BL_P0Q2 */ 459 {0x3618, 0x41B0}, 460 /* P_BL_P0Q3 */ 461 {0x361A, 0x660D}, 462 /* P_BL_P0Q4 */ 463 {0x361C, 0xC590}, 464 /* P_BL_P1Q0 */ 465 {0x3654, 0x87EC}, 466 /* P_BL_P1Q1 */ 467 {0x3656, 0xE44C}, 468 /* P_BL_P1Q2 */ 469 {0x3658, 0x302E}, 470 /* P_BL_P1Q3 */ 471 {0x365A, 0x106E}, 472 /* P_BL_P1Q4 */ 473 {0x365C, 0xB58E}, 474 /* P_BL_P2Q0 */ 475 {0x3694, 0x0DD1}, 476 /* P_BL_P2Q1 */ 477 {0x3696, 0x2A50}, 478 /* P_BL_P2Q2 */ 479 {0x3698, 0xC793}, 480 /* P_BL_P2Q3 */ 481 {0x369A, 0xE8F1}, 482 /* P_BL_P2Q4 */ 483 {0x369C, 0x4174}, 484 /* P_BL_P3Q0 */ 485 {0x36D4, 0x01EF}, 486 /* P_BL_P3Q1 */ 487 {0x36D6, 0x06CF}, 488 /* P_BL_P3Q2 */ 489 {0x36D8, 0x8D91}, 490 /* P_BL_P3Q3 */ 491 {0x36DA, 0x91F0}, 492 /* P_BL_P3Q4 */ 493 {0x36DC, 0x52EF}, 494 /* P_BL_P4Q0 */ 495 {0x3714, 0xA6D2}, 496 /* P_BL_P4Q1 */ 497 {0x3716, 0xA312}, 498 /* P_BL_P4Q2 */ 499 {0x3718, 0x2695}, 500 /* P_BL_P4Q3 */ 501 {0x371A, 0x3953}, 502 /* P_BL_P4Q4 */ 503 {0x371C, 0x9356}, 504 /* P_GB_P0Q0 */ 505 {0x361E, 0x7EAF}, 506 /* P_GB_P0Q1 */ 507 {0x3620, 0x2A4C}, 508 /* P_GB_P0Q2 */ 509 {0x3622, 0x49F0}, 510 {0x3624, 0xF1EC}, 511 /* P_GB_P0Q4 */ 512 {0x3626, 0xC670}, 513 /* P_GB_P1Q0 */ 514 {0x365E, 0x8E0C}, 515 /* P_GB_P1Q1 */ 516 {0x3660, 0xC2A9}, 517 /* P_GB_P1Q2 */ 518 {0x3662, 0x274F}, 519 /* P_GB_P1Q3 */ 520 {0x3664, 0xADAB}, 521 /* P_GB_P1Q4 */ 522 {0x3666, 0x8EF0}, 523 /* P_GB_P2Q0 */ 524 {0x369E, 0x09B1}, 525 /* P_GB_P2Q1 */ 526 {0x36A0, 0xAA2E}, 527 /* P_GB_P2Q2 */ 528 {0x36A2, 0xC3D3}, 529 /* P_GB_P2Q3 */ 530 {0x36A4, 0x7FAF}, 531 /* P_GB_P2Q4 */ 532 {0x36A6, 0x3F34}, 533 /* P_GB_P3Q0 */ 534 {0x36DE, 0x4C8F}, 535 /* P_GB_P3Q1 */ 536 {0x36E0, 0x886E}, 537 /* P_GB_P3Q2 */ 538 {0x36E2, 0xE831}, 539 /* P_GB_P3Q3 */ 540 {0x36E4, 0x1FD0}, 541 /* P_GB_P3Q4 */ 542 {0x36E6, 0x1192}, 543 /* P_GB_P4Q0 */ 544 {0x371E, 0xB952}, 545 /* P_GB_P4Q1 */ 546 {0x3720, 0x6DCF}, 547 /* P_GB_P4Q2 */ 548 {0x3722, 0x1B55}, 549 /* P_GB_P4Q3 */ 550 {0x3724, 0xA112}, 551 /* P_GB_P4Q4 */ 552 {0x3726, 0x82F6}, 553 /* POLY_ORIGIN_C */ 554 {0x3782, 0x0510}, 555 /* POLY_ORIGIN_R */ 556 {0x3784, 0x0390}, 557 /* POLY_SC_ENABLE */ 558 {0x3780, 0x8000}, 559}; 560 561 562struct mt9p012_reg mt9p012_regs = { 563 .reg_pat = &mt9p012_reg_pat[0], 564 .reg_pat_size = ARRAY_SIZE(mt9p012_reg_pat), 565 .ttbl = &mt9p012_test_tbl[0], 566 .ttbl_size = ARRAY_SIZE(mt9p012_test_tbl), 567 .lctbl = &mt9p012_lc_tbl[0], 568 .lctbl_size = ARRAY_SIZE(mt9p012_lc_tbl), 569 .rftbl = &mt9p012_rolloff_tbl[0], 570 .rftbl_size = ARRAY_SIZE(mt9p012_rolloff_tbl) 571}; 572