1/* 2 * Copyright (C) 2008-2009 QUALCOMM Incorporated. 3 */ 4 5#include "mt9d112.h" 6 7struct register_address_value_pair 8preview_snapshot_mode_reg_settings_array[] = { 9 {0x338C, 0x2703}, 10 {0x3390, 800}, /* Output Width (P) = 640 */ 11 {0x338C, 0x2705}, 12 {0x3390, 600}, /* Output Height (P) = 480 */ 13 {0x338C, 0x2707}, 14 {0x3390, 0x0640}, /* Output Width (S) = 1600 */ 15 {0x338C, 0x2709}, 16 {0x3390, 0x04B0}, /* Output Height (S) = 1200 */ 17 {0x338C, 0x270D}, 18 {0x3390, 0x0000}, /* Row Start (P) = 0 */ 19 {0x338C, 0x270F}, 20 {0x3390, 0x0000}, /* Column Start (P) = 0 */ 21 {0x338C, 0x2711}, 22 {0x3390, 0x04BD}, /* Row End (P) = 1213 */ 23 {0x338C, 0x2713}, 24 {0x3390, 0x064D}, /* Column End (P) = 1613 */ 25 {0x338C, 0x2715}, 26 {0x3390, 0x0000}, /* Extra Delay (P) = 0 */ 27 {0x338C, 0x2717}, 28 {0x3390, 0x2111}, /* Row Speed (P) = 8465 */ 29 {0x338C, 0x2719}, 30 {0x3390, 0x046C}, /* Read Mode (P) = 1132 */ 31 {0x338C, 0x271B}, 32 {0x3390, 0x024F}, /* Sensor_Sample_Time_pck(P) = 591 */ 33 {0x338C, 0x271D}, 34 {0x3390, 0x0102}, /* Sensor_Fine_Correction(P) = 258 */ 35 {0x338C, 0x271F}, 36 {0x3390, 0x0279}, /* Sensor_Fine_IT_min(P) = 633 */ 37 {0x338C, 0x2721}, 38 {0x3390, 0x0155}, /* Sensor_Fine_IT_max_margin(P) = 341 */ 39 {0x338C, 0x2723}, 40 {0x3390, 659}, /* Frame Lines (P) = 679 */ 41 {0x338C, 0x2725}, 42 {0x3390, 0x0824}, /* Line Length (P) = 2084 */ 43 {0x338C, 0x2727}, 44 {0x3390, 0x2020}, 45 {0x338C, 0x2729}, 46 {0x3390, 0x2020}, 47 {0x338C, 0x272B}, 48 {0x3390, 0x1020}, 49 {0x338C, 0x272D}, 50 {0x3390, 0x2007}, 51 {0x338C, 0x272F}, 52 {0x3390, 0x0004}, /* Row Start(S) = 4 */ 53 {0x338C, 0x2731}, 54 {0x3390, 0x0004}, /* Column Start(S) = 4 */ 55 {0x338C, 0x2733}, 56 {0x3390, 0x04BB}, /* Row End(S) = 1211 */ 57 {0x338C, 0x2735}, 58 {0x3390, 0x064B}, /* Column End(S) = 1611 */ 59 {0x338C, 0x2737}, 60 {0x3390, 0x04CE}, /* Extra Delay(S) = 1230 */ 61 {0x338C, 0x2739}, 62 {0x3390, 0x2111}, /* Row Speed(S) = 8465 */ 63 {0x338C, 0x273B}, 64 {0x3390, 0x0024}, /* Read Mode(S) = 36 */ 65 {0x338C, 0x273D}, 66 {0x3390, 0x0120}, /* Sensor sample time pck(S) = 288 */ 67 {0x338C, 0x2741}, 68 {0x3390, 0x0169}, /* Sensor_Fine_IT_min(P) = 361 */ 69 {0x338C, 0x2745}, 70 {0x3390, 0x04FF}, /* Frame Lines(S) = 1279 */ 71 {0x338C, 0x2747}, 72 {0x3390, 0x0824}, /* Line Length(S) = 2084 */ 73 {0x338C, 0x2751}, 74 {0x3390, 0x0000}, /* Crop_X0(P) = 0 */ 75 {0x338C, 0x2753}, 76 {0x3390, 0x0320}, /* Crop_X1(P) = 800 */ 77 {0x338C, 0x2755}, 78 {0x3390, 0x0000}, /* Crop_Y0(P) = 0 */ 79 {0x338C, 0x2757}, 80 {0x3390, 0x0258}, /* Crop_Y1(P) = 600 */ 81 {0x338C, 0x275F}, 82 {0x3390, 0x0000}, /* Crop_X0(S) = 0 */ 83 {0x338C, 0x2761}, 84 {0x3390, 0x0640}, /* Crop_X1(S) = 1600 */ 85 {0x338C, 0x2763}, 86 {0x3390, 0x0000}, /* Crop_Y0(S) = 0 */ 87 {0x338C, 0x2765}, 88 {0x3390, 0x04B0}, /* Crop_Y1(S) = 1200 */ 89 {0x338C, 0x222E}, 90 {0x3390, 0x00A0}, /* R9 Step = 160 */ 91 {0x338C, 0xA408}, 92 {0x3390, 0x001F}, 93 {0x338C, 0xA409}, 94 {0x3390, 0x0021}, 95 {0x338C, 0xA40A}, 96 {0x3390, 0x0025}, 97 {0x338C, 0xA40B}, 98 {0x3390, 0x0027}, 99 {0x338C, 0x2411}, 100 {0x3390, 0x00A0}, 101 {0x338C, 0x2413}, 102 {0x3390, 0x00C0}, 103 {0x338C, 0x2415}, 104 {0x3390, 0x00A0}, 105 {0x338C, 0x2417}, 106 {0x3390, 0x00C0}, 107 {0x338C, 0x2799}, 108 {0x3390, 0x6408}, /* MODE_SPEC_EFFECTS(P) */ 109 {0x338C, 0x279B}, 110 {0x3390, 0x6408}, /* MODE_SPEC_EFFECTS(S) */ 111}; 112 113static struct register_address_value_pair 114noise_reduction_reg_settings_array[] = { 115 {0x338C, 0xA76D}, 116 {0x3390, 0x0003}, 117 {0x338C, 0xA76E}, 118 {0x3390, 0x0003}, 119 {0x338C, 0xA76F}, 120 {0x3390, 0}, 121 {0x338C, 0xA770}, 122 {0x3390, 21}, 123 {0x338C, 0xA771}, 124 {0x3390, 37}, 125 {0x338C, 0xA772}, 126 {0x3390, 63}, 127 {0x338C, 0xA773}, 128 {0x3390, 100}, 129 {0x338C, 0xA774}, 130 {0x3390, 128}, 131 {0x338C, 0xA775}, 132 {0x3390, 151}, 133 {0x338C, 0xA776}, 134 {0x3390, 169}, 135 {0x338C, 0xA777}, 136 {0x3390, 186}, 137 {0x338C, 0xA778}, 138 {0x3390, 199}, 139 {0x338C, 0xA779}, 140 {0x3390, 210}, 141 {0x338C, 0xA77A}, 142 {0x3390, 220}, 143 {0x338C, 0xA77B}, 144 {0x3390, 228}, 145 {0x338C, 0xA77C}, 146 {0x3390, 234}, 147 {0x338C, 0xA77D}, 148 {0x3390, 240}, 149 {0x338C, 0xA77E}, 150 {0x3390, 244}, 151 {0x338C, 0xA77F}, 152 {0x3390, 248}, 153 {0x338C, 0xA780}, 154 {0x3390, 252}, 155 {0x338C, 0xA781}, 156 {0x3390, 255}, 157 {0x338C, 0xA782}, 158 {0x3390, 0}, 159 {0x338C, 0xA783}, 160 {0x3390, 21}, 161 {0x338C, 0xA784}, 162 {0x3390, 37}, 163 {0x338C, 0xA785}, 164 {0x3390, 63}, 165 {0x338C, 0xA786}, 166 {0x3390, 100}, 167 {0x338C, 0xA787}, 168 {0x3390, 128}, 169 {0x338C, 0xA788}, 170 {0x3390, 151}, 171 {0x338C, 0xA789}, 172 {0x3390, 169}, 173 {0x338C, 0xA78A}, 174 {0x3390, 186}, 175 {0x338C, 0xA78B}, 176 {0x3390, 199}, 177 {0x338C, 0xA78C}, 178 {0x3390, 210}, 179 {0x338C, 0xA78D}, 180 {0x3390, 220}, 181 {0x338C, 0xA78E}, 182 {0x3390, 228}, 183 {0x338C, 0xA78F}, 184 {0x3390, 234}, 185 {0x338C, 0xA790}, 186 {0x3390, 240}, 187 {0x338C, 0xA791}, 188 {0x3390, 244}, 189 {0x338C, 0xA793}, 190 {0x3390, 252}, 191 {0x338C, 0xA794}, 192 {0x3390, 255}, 193 {0x338C, 0xA103}, 194 {0x3390, 6}, 195}; 196 197static const struct mt9d112_i2c_reg_conf const lens_roll_off_tbl[] = { 198 { 0x34CE, 0x81A0, WORD_LEN, 0 }, 199 { 0x34D0, 0x6331, WORD_LEN, 0 }, 200 { 0x34D2, 0x3394, WORD_LEN, 0 }, 201 { 0x34D4, 0x9966, WORD_LEN, 0 }, 202 { 0x34D6, 0x4B25, WORD_LEN, 0 }, 203 { 0x34D8, 0x2670, WORD_LEN, 0 }, 204 { 0x34DA, 0x724C, WORD_LEN, 0 }, 205 { 0x34DC, 0xFFFD, WORD_LEN, 0 }, 206 { 0x34DE, 0x00CA, WORD_LEN, 0 }, 207 { 0x34E6, 0x00AC, WORD_LEN, 0 }, 208 { 0x34EE, 0x0EE1, WORD_LEN, 0 }, 209 { 0x34F6, 0x0D87, WORD_LEN, 0 }, 210 { 0x3500, 0xE1F7, WORD_LEN, 0 }, 211 { 0x3508, 0x1CF4, WORD_LEN, 0 }, 212 { 0x3510, 0x1D28, WORD_LEN, 0 }, 213 { 0x3518, 0x1F26, WORD_LEN, 0 }, 214 { 0x3520, 0x2220, WORD_LEN, 0 }, 215 { 0x3528, 0x333D, WORD_LEN, 0 }, 216 { 0x3530, 0x15D9, WORD_LEN, 0 }, 217 { 0x3538, 0xCFB8, WORD_LEN, 0 }, 218 { 0x354C, 0x05FE, WORD_LEN, 0 }, 219 { 0x3544, 0x05F8, WORD_LEN, 0 }, 220 { 0x355C, 0x0596, WORD_LEN, 0 }, 221 { 0x3554, 0x0611, WORD_LEN, 0 }, 222 { 0x34E0, 0x00F2, WORD_LEN, 0 }, 223 { 0x34E8, 0x00A8, WORD_LEN, 0 }, 224 { 0x34F0, 0x0F7B, WORD_LEN, 0 }, 225 { 0x34F8, 0x0CD7, WORD_LEN, 0 }, 226 { 0x3502, 0xFEDB, WORD_LEN, 0 }, 227 { 0x350A, 0x13E4, WORD_LEN, 0 }, 228 { 0x3512, 0x1F2C, WORD_LEN, 0 }, 229 { 0x351A, 0x1D20, WORD_LEN, 0 }, 230 { 0x3522, 0x2422, WORD_LEN, 0 }, 231 { 0x352A, 0x2925, WORD_LEN, 0 }, 232 { 0x3532, 0x1D04, WORD_LEN, 0 }, 233 { 0x353A, 0xFBF2, WORD_LEN, 0 }, 234 { 0x354E, 0x0616, WORD_LEN, 0 }, 235 { 0x3546, 0x0597, WORD_LEN, 0 }, 236 { 0x355E, 0x05CD, WORD_LEN, 0 }, 237 { 0x3556, 0x0529, WORD_LEN, 0 }, 238 { 0x34E4, 0x00B2, WORD_LEN, 0 }, 239 { 0x34EC, 0x005E, WORD_LEN, 0 }, 240 { 0x34F4, 0x0F43, WORD_LEN, 0 }, 241 { 0x34FC, 0x0E2F, WORD_LEN, 0 }, 242 { 0x3506, 0xF9FC, WORD_LEN, 0 }, 243 { 0x350E, 0x0CE4, WORD_LEN, 0 }, 244 { 0x3516, 0x1E1E, WORD_LEN, 0 }, 245 { 0x351E, 0x1B19, WORD_LEN, 0 }, 246 { 0x3526, 0x151B, WORD_LEN, 0 }, 247 { 0x352E, 0x1416, WORD_LEN, 0 }, 248 { 0x3536, 0x10FC, WORD_LEN, 0 }, 249 { 0x353E, 0xC018, WORD_LEN, 0 }, 250 { 0x3552, 0x06B4, WORD_LEN, 0 }, 251 { 0x354A, 0x0506, WORD_LEN, 0 }, 252 { 0x3562, 0x06AB, WORD_LEN, 0 }, 253 { 0x355A, 0x063A, WORD_LEN, 0 }, 254 { 0x34E2, 0x00E5, WORD_LEN, 0 }, 255 { 0x34EA, 0x008B, WORD_LEN, 0 }, 256 { 0x34F2, 0x0E4C, WORD_LEN, 0 }, 257 { 0x34FA, 0x0CA3, WORD_LEN, 0 }, 258 { 0x3504, 0x0907, WORD_LEN, 0 }, 259 { 0x350C, 0x1DFD, WORD_LEN, 0 }, 260 { 0x3514, 0x1E24, WORD_LEN, 0 }, 261 { 0x351C, 0x2529, WORD_LEN, 0 }, 262 { 0x3524, 0x1D20, WORD_LEN, 0 }, 263 { 0x352C, 0x2332, WORD_LEN, 0 }, 264 { 0x3534, 0x10E9, WORD_LEN, 0 }, 265 { 0x353C, 0x0BCB, WORD_LEN, 0 }, 266 { 0x3550, 0x04EF, WORD_LEN, 0 }, 267 { 0x3548, 0x0609, WORD_LEN, 0 }, 268 { 0x3560, 0x0580, WORD_LEN, 0 }, 269 { 0x3558, 0x05DD, WORD_LEN, 0 }, 270 { 0x3540, 0x0000, WORD_LEN, 0 }, 271 { 0x3542, 0x0000, WORD_LEN, 0 } 272}; 273 274static const struct mt9d112_i2c_reg_conf const pll_setup_tbl[] = { 275 { 0x341E, 0x8F09, WORD_LEN, 0 }, 276 { 0x341C, 0x0250, WORD_LEN, 0 }, 277 { 0x341E, 0x8F09, WORD_LEN, 5 }, 278 { 0x341E, 0x8F08, WORD_LEN, 0 } 279}; 280 281/* Refresh Sequencer */ 282static const struct mt9d112_i2c_reg_conf const sequencer_tbl[] = { 283 { 0x338C, 0x2799, WORD_LEN, 0}, 284 { 0x3390, 0x6440, WORD_LEN, 5}, 285 { 0x338C, 0x279B, WORD_LEN, 0}, 286 { 0x3390, 0x6440, WORD_LEN, 5}, 287 { 0x338C, 0xA103, WORD_LEN, 0}, 288 { 0x3390, 0x0005, WORD_LEN, 5}, 289 { 0x338C, 0xA103, WORD_LEN, 0}, 290 { 0x3390, 0x0006, WORD_LEN, 5} 291}; 292 293struct mt9d112_reg mt9d112_regs = { 294 .prev_snap_reg_settings = &preview_snapshot_mode_reg_settings_array[0], 295 .prev_snap_reg_settings_size = ARRAY_SIZE(preview_snapshot_mode_reg_settings_array), 296 .noise_reduction_reg_settings = &noise_reduction_reg_settings_array[0], 297 .noise_reduction_reg_settings_size = ARRAY_SIZE(noise_reduction_reg_settings_array), 298 .plltbl = pll_setup_tbl, 299 .plltbl_size = ARRAY_SIZE(pll_setup_tbl), 300 .stbl = sequencer_tbl, 301 .stbl_size = ARRAY_SIZE(sequencer_tbl), 302 .rftbl = lens_roll_off_tbl, 303 .rftbl_size = ARRAY_SIZE(lens_roll_off_tbl) 304}; 305