/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "msm_sensor.h" #include "msm_cci.h" #include "msm_camera_io_util.h" #define MT9M114_SENSOR_NAME "mt9m114" #define PLATFORM_DRIVER_NAME "msm_camera_mt9m114" #define mt9m114_obj mt9m114_##obj #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) /* Sysctl registers */ #define MT9M114_COMMAND_REGISTER 0x0080 #define MT9M114_COMMAND_REGISTER_APPLY_PATCH (1 << 0) #define MT9M114_COMMAND_REGISTER_SET_STATE (1 << 1) #define MT9M114_COMMAND_REGISTER_REFRESH (1 << 2) #define MT9M114_COMMAND_REGISTER_WAIT_FOR_EVENT (1 << 3) #define MT9M114_COMMAND_REGISTER_OK (1 << 15) DEFINE_MSM_MUTEX(mt9m114_mut); static struct msm_sensor_ctrl_t mt9m114_s_ctrl; static struct msm_sensor_power_setting mt9m114_power_setting[] = { { .seq_type = SENSOR_VREG, .seq_val = CAM_VIO, .config_val = 0, .delay = 0, }, { .seq_type = SENSOR_VREG, .seq_val = CAM_VDIG, .config_val = 0, .delay = 0, }, { .seq_type = SENSOR_VREG, .seq_val = CAM_VANA, .config_val = 0, .delay = 0, }, { .seq_type = SENSOR_GPIO, .seq_val = SENSOR_GPIO_RESET, .config_val = GPIO_OUT_LOW, .delay = 1, }, { .seq_type = SENSOR_GPIO, .seq_val = SENSOR_GPIO_RESET, .config_val = GPIO_OUT_HIGH, .delay = 30, }, { .seq_type = SENSOR_CLK, .seq_val = SENSOR_CAM_MCLK, .config_val = 0, .delay = 100, }, { .seq_type = SENSOR_I2C_MUX, .seq_val = 0, .config_val = 0, .delay = 0, }, }; static struct msm_camera_i2c_reg_conf mt9m114_720p_settings[] = { {0xdc00, 0x50, MSM_CAMERA_I2C_BYTE_DATA, MSM_CAMERA_I2C_CMD_WRITE}, {MT9M114_COMMAND_REGISTER, MT9M114_COMMAND_REGISTER_SET_STATE, MSM_CAMERA_I2C_UNSET_WORD_MASK, MSM_CAMERA_I2C_CMD_POLL}, {MT9M114_COMMAND_REGISTER, (MT9M114_COMMAND_REGISTER_OK | MT9M114_COMMAND_REGISTER_SET_STATE), MSM_CAMERA_I2C_WORD_DATA, MSM_CAMERA_I2C_CMD_WRITE}, {MT9M114_COMMAND_REGISTER, MT9M114_COMMAND_REGISTER_SET_STATE, MSM_CAMERA_I2C_UNSET_WORD_MASK, MSM_CAMERA_I2C_CMD_POLL}, {0xDC01, 0x52, MSM_CAMERA_I2C_BYTE_DATA, MSM_CAMERA_I2C_CMD_POLL}, {0x098E, 0, MSM_CAMERA_I2C_BYTE_DATA}, {0xC800, 0x007C,},/*y_addr_start = 124*/ {0xC802, 0x0004,},/*x_addr_start = 4*/ {0xC804, 0x0353,},/*y_addr_end = 851*/ {0xC806, 0x050B,},/*x_addr_end = 1291*/ {0xC808, 0x02DC,},/*pixclk = 48000000*/ {0xC80A, 0x6C00,},/*pixclk = 48000000*/ {0xC80C, 0x0001,},/*row_speed = 1*/ {0xC80E, 0x00DB,},/*fine_integ_time_min = 219*/ {0xC810, 0x05BD,},/*fine_integ_time_max = 1469*/ {0xC812, 0x03E8,},/*frame_length_lines = 1000*/ {0xC814, 0x0640,},/*line_length_pck = 1600*/ {0xC816, 0x0060,},/*fine_correction = 96*/ {0xC818, 0x02D3,},/*cpipe_last_row = 723*/ {0xC826, 0x0020,},/*reg_0_data = 32*/ {0xC834, 0x0000,},/*sensor_control_read_mode = 0*/ {0xC854, 0x0000,},/*crop_window_xoffset = 0*/ {0xC856, 0x0000,},/*crop_window_yoffset = 0*/ {0xC858, 0x0500,},/*crop_window_width = 1280*/ {0xC85A, 0x02D0,},/*crop_window_height = 720*/ {0xC85C, 0x03, MSM_CAMERA_I2C_BYTE_DATA}, /*crop_cropmode = 3*/ {0xC868, 0x0500,},/*output_width = 1280*/ {0xC86A, 0x02D0,},/*output_height = 720*/ {0xC878, 0x00, MSM_CAMERA_I2C_BYTE_DATA}, /*aet_aemode = 0*/ {0xC88C, 0x1E00,},/*aet_max_frame_rate = 7680*/ {0xC88E, 0x1E00,},/*aet_min_frame_rate = 7680*/ {0xC914, 0x0000,},/*stat_awb_window_xstart = 0*/ {0xC916, 0x0000,},/*stat_awb_window_ystart = 0*/ {0xC918, 0x04FF,},/*stat_awb_window_xend = 1279*/ {0xC91A, 0x02CF,},/*stat_awb_window_yend = 719*/ {0xC91C, 0x0000,},/*stat_ae_window_xstart = 0*/ {0xC91E, 0x0000,},/*stat_ae_window_ystart = 0*/ {0xC920, 0x00FF,},/*stat_ae_window_xend = 255*/ {0xC922, 0x008F,},/*stat_ae_window_yend = 143*/ }; static struct msm_camera_i2c_reg_conf mt9m114_recommend_settings[] = { {0x301A, 0x0200, MSM_CAMERA_I2C_SET_WORD_MASK}, {0x098E, 0, MSM_CAMERA_I2C_BYTE_DATA}, /*cam_sysctl_pll_enable = 1*/ {0xC97E, 0x01, MSM_CAMERA_I2C_BYTE_DATA}, /*cam_sysctl_pll_divider_m_n = 288*/ {0xC980, 0x0120,}, /*cam_sysctl_pll_divider_p = 1792*/ {0xC982, 0x0700,}, /*output_control = 32769*/ {0xC984, 0x8001,}, /*mipi_timing_t_hs_zero = 3840*/ {0xC988, 0x0F00,}, /*mipi_timing_t_hs_exit_hs_trail = 2823*/ {0xC98A, 0x0B07,}, /*mipi_timing_t_clk_post_clk_pre = 3329*/ {0xC98C, 0x0D01,}, /*mipi_timing_t_clk_trail_clk_zero = 1821*/ {0xC98E, 0x071D,}, /*mipi_timing_t_lpx = 6*/ {0xC990, 0x0006,}, /*mipi_timing_init_timing = 2572*/ {0xC992, 0x0A0C,}, {0xC800, 0x007C,},/*y_addr_start = 124*/ {0xC802, 0x0004,},/*x_addr_start = 4*/ {0xC804, 0x0353,},/*y_addr_end = 851*/ {0xC806, 0x050B,},/*x_addr_end = 1291*/ {0xC808, 0x02DC,},/*pixclk = 48000000*/ {0xC80A, 0x6C00,},/*pixclk = 48000000*/ {0xC80C, 0x0001,},/*row_speed = 1*/ {0xC80E, 0x00DB,},/*fine_integ_time_min = 219*/ {0xC810, 0x05BD,},/*fine_integ_time_max = 1469*/ {0xC812, 0x03E8,},/*frame_length_lines = 1000*/ {0xC814, 0x0640,},/*line_length_pck = 1600*/ {0xC816, 0x0060,},/*fine_correction = 96*/ {0xC818, 0x02D3,},/*cpipe_last_row = 723*/ {0xC826, 0x0020,},/*reg_0_data = 32*/ {0xC834, 0x0000,},/*sensor_control_read_mode = 0*/ {0xC854, 0x0000,},/*crop_window_xoffset = 0*/ {0xC856, 0x0000,},/*crop_window_yoffset = 0*/ {0xC858, 0x0500,},/*crop_window_width = 1280*/ {0xC85A, 0x02D0,},/*crop_window_height = 720*/ {0xC85C, 0x03, MSM_CAMERA_I2C_BYTE_DATA}, /*crop_cropmode = 3*/ {0xC868, 0x0500,},/*output_width = 1280*/ {0xC86A, 0x02D0,},/*output_height = 720*/ {0xC878, 0x00, MSM_CAMERA_I2C_BYTE_DATA}, /*aet_aemode = 0*/ {0xC88C, 0x1E00,},/*aet_max_frame_rate = 7680*/ {0xC88E, 0x1E00,},/*aet_min_frame_rate = 7680*/ {0xC914, 0x0000,},/*stat_awb_window_xstart = 0*/ {0xC916, 0x0000,},/*stat_awb_window_ystart = 0*/ {0xC918, 0x04FF,},/*stat_awb_window_xend = 1279*/ {0xC91A, 0x02CF,},/*stat_awb_window_yend = 719*/ {0xC91C, 0x0000,},/*stat_ae_window_xstart = 0*/ {0xC91E, 0x0000,},/*stat_ae_window_ystart = 0*/ {0xC920, 0x00FF,},/*stat_ae_window_xend = 255*/ {0xC922, 0x008F,},/*stat_ae_window_yend = 143*/ /*Sensor optimization*/ {0x316A, 0x8270,}, {0x316C, 0x8270,}, {0x3ED0, 0x2305,}, {0x3ED2, 0x77CF,}, {0x316E, 0x8202,}, {0x3180, 0x87FF,}, {0x30D4, 0x6080,}, {0xA802, 0x0008,},/*AE_TRACK_MODE*/ {0x3E14, 0xFF39,}, {0x0982, 0x0001,},/*ACCESS_CTL_STAT*/ {0x098A, 0x5000,},/*PHYSICAL_ADDRESS_ACCESS*/ {0xD000, 0x70CF,}, {0xD002, 0xFFFF,}, {0xD004, 0xC5D4,}, {0xD006, 0x903A,}, {0xD008, 0x2144,}, {0xD00A, 0x0C00,}, {0xD00C, 0x2186,}, {0xD00E, 0x0FF3,}, {0xD010, 0xB844,}, {0xD012, 0xB948,}, {0xD014, 0xE082,}, {0xD016, 0x20CC,}, {0xD018, 0x80E2,}, {0xD01A, 0x21CC,}, {0xD01C, 0x80A2,}, {0xD01E, 0x21CC,}, {0xD020, 0x80E2,}, {0xD022, 0xF404,}, {0xD024, 0xD801,}, {0xD026, 0xF003,}, {0xD028, 0xD800,}, {0xD02A, 0x7EE0,}, {0xD02C, 0xC0F1,}, {0xD02E, 0x08BA,}, {0xD030, 0x0600,}, {0xD032, 0xC1A1,}, {0xD034, 0x76CF,}, {0xD036, 0xFFFF,}, {0xD038, 0xC130,}, {0xD03A, 0x6E04,}, {0xD03C, 0xC040,}, {0xD03E, 0x71CF,}, {0xD040, 0xFFFF,}, {0xD042, 0xC790,}, {0xD044, 0x8103,}, {0xD046, 0x77CF,}, {0xD048, 0xFFFF,}, {0xD04A, 0xC7C0,}, {0xD04C, 0xE001,}, {0xD04E, 0xA103,}, {0xD050, 0xD800,}, {0xD052, 0x0C6A,}, {0xD054, 0x04E0,}, {0xD056, 0xB89E,}, {0xD058, 0x7508,}, {0xD05A, 0x8E1C,}, {0xD05C, 0x0809,}, {0xD05E, 0x0191,}, {0xD060, 0xD801,}, {0xD062, 0xAE1D,}, {0xD064, 0xE580,}, {0xD066, 0x20CA,}, {0xD068, 0x0022,}, {0xD06A, 0x20CF,}, {0xD06C, 0x0522,}, {0xD06E, 0x0C5C,}, {0xD070, 0x04E2,}, {0xD072, 0x21CA,}, {0xD074, 0x0062,}, {0xD076, 0xE580,}, {0xD078, 0xD901,}, {0xD07A, 0x79C0,}, {0xD07C, 0xD800,}, {0xD07E, 0x0BE6,}, {0xD080, 0x04E0,}, {0xD082, 0xB89E,}, {0xD084, 0x70CF,}, {0xD086, 0xFFFF,}, {0xD088, 0xC8D4,}, {0xD08A, 0x9002,}, {0xD08C, 0x0857,}, {0xD08E, 0x025E,}, {0xD090, 0xFFDC,}, {0xD092, 0xE080,}, {0xD094, 0x25CC,}, {0xD096, 0x9022,}, {0xD098, 0xF225,}, {0xD09A, 0x1700,}, {0xD09C, 0x108A,}, {0xD09E, 0x73CF,}, {0xD0A0, 0xFF00,}, {0xD0A2, 0x3174,}, {0xD0A4, 0x9307,}, {0xD0A6, 0x2A04,}, {0xD0A8, 0x103E,}, {0xD0AA, 0x9328,}, {0xD0AC, 0x2942,}, {0xD0AE, 0x7140,}, {0xD0B0, 0x2A04,}, {0xD0B2, 0x107E,}, {0xD0B4, 0x9349,}, {0xD0B6, 0x2942,}, {0xD0B8, 0x7141,}, {0xD0BA, 0x2A04,}, {0xD0BC, 0x10BE,}, {0xD0BE, 0x934A,}, {0xD0C0, 0x2942,}, {0xD0C2, 0x714B,}, {0xD0C4, 0x2A04,}, {0xD0C6, 0x10BE,}, {0xD0C8, 0x130C,}, {0xD0CA, 0x010A,}, {0xD0CC, 0x2942,}, {0xD0CE, 0x7142,}, {0xD0D0, 0x2250,}, {0xD0D2, 0x13CA,}, {0xD0D4, 0x1B0C,}, {0xD0D6, 0x0284,}, {0xD0D8, 0xB307,}, {0xD0DA, 0xB328,}, {0xD0DC, 0x1B12,}, {0xD0DE, 0x02C4,}, {0xD0E0, 0xB34A,}, {0xD0E2, 0xED88,}, {0xD0E4, 0x71CF,}, {0xD0E6, 0xFF00,}, {0xD0E8, 0x3174,}, {0xD0EA, 0x9106,}, {0xD0EC, 0xB88F,}, {0xD0EE, 0xB106,}, {0xD0F0, 0x210A,}, {0xD0F2, 0x8340,}, {0xD0F4, 0xC000,}, {0xD0F6, 0x21CA,}, {0xD0F8, 0x0062,}, {0xD0FA, 0x20F0,}, {0xD0FC, 0x0040,}, {0xD0FE, 0x0B02,}, {0xD100, 0x0320,}, {0xD102, 0xD901,}, {0xD104, 0x07F1,}, {0xD106, 0x05E0,}, {0xD108, 0xC0A1,}, {0xD10A, 0x78E0,}, {0xD10C, 0xC0F1,}, {0xD10E, 0x71CF,}, {0xD110, 0xFFFF,}, {0xD112, 0xC7C0,}, {0xD114, 0xD840,}, {0xD116, 0xA900,}, {0xD118, 0x71CF,}, {0xD11A, 0xFFFF,}, {0xD11C, 0xD02C,}, {0xD11E, 0xD81E,}, {0xD120, 0x0A5A,}, {0xD122, 0x04E0,}, {0xD124, 0xDA00,}, {0xD126, 0xD800,}, {0xD128, 0xC0D1,}, {0xD12A, 0x7EE0,}, {0x098E, 0x0000,}, {0x0982, 0x0001,}, {0x098A, 0x5C10,}, {0xDC10, 0xC0F1,}, {0xDC12, 0x0CDA,}, {0xDC14, 0x0580,}, {0xDC16, 0x76CF,}, {0xDC18, 0xFF00,}, {0xDC1A, 0x2184,}, {0xDC1C, 0x9624,}, {0xDC1E, 0x218C,}, {0xDC20, 0x8FC3,}, {0xDC22, 0x75CF,}, {0xDC24, 0xFFFF,}, {0xDC26, 0xE058,}, {0xDC28, 0xF686,}, {0xDC2A, 0x1550,}, {0xDC2C, 0x1080,}, {0xDC2E, 0xE001,}, {0xDC30, 0x1D50,}, {0xDC32, 0x1002,}, {0xDC34, 0x1552,}, {0xDC36, 0x1100,}, {0xDC38, 0x6038,}, {0xDC3A, 0x1D52,}, {0xDC3C, 0x1004,}, {0xDC3E, 0x1540,}, {0xDC40, 0x1080,}, {0xDC42, 0x081B,}, {0xDC44, 0x00D1,}, {0xDC46, 0x8512,}, {0xDC48, 0x1000,}, {0xDC4A, 0x00C0,}, {0xDC4C, 0x7822,}, {0xDC4E, 0x2089,}, {0xDC50, 0x0FC1,}, {0xDC52, 0x2008,}, {0xDC54, 0x0F81,}, {0xDC56, 0xFFFF,}, {0xDC58, 0xFF80,}, {0xDC5A, 0x8512,}, {0xDC5C, 0x1801,}, {0xDC5E, 0x0052,}, {0xDC60, 0xA512,}, {0xDC62, 0x1544,}, {0xDC64, 0x1080,}, {0xDC66, 0xB861,}, {0xDC68, 0x262F,}, {0xDC6A, 0xF007,}, {0xDC6C, 0x1D44,}, {0xDC6E, 0x1002,}, {0xDC70, 0x20CA,}, {0xDC72, 0x0021,}, {0xDC74, 0x20CF,}, {0xDC76, 0x04E1,}, {0xDC78, 0x0850,}, {0xDC7A, 0x04A1,}, {0xDC7C, 0x21CA,}, {0xDC7E, 0x0021,}, {0xDC80, 0x1542,}, {0xDC82, 0x1140,}, {0xDC84, 0x8D2C,}, {0xDC86, 0x6038,}, {0xDC88, 0x1D42,}, {0xDC8A, 0x1004,}, {0xDC8C, 0x1542,}, {0xDC8E, 0x1140,}, {0xDC90, 0xB601,}, {0xDC92, 0x046D,}, {0xDC94, 0x0580,}, {0xDC96, 0x78E0,}, {0xDC98, 0xD800,}, {0xDC9A, 0xB893,}, {0xDC9C, 0x002D,}, {0xDC9E, 0x04A0,}, {0xDCA0, 0xD900,}, {0xDCA2, 0x78E0,}, {0xDCA4, 0x72CF,}, {0xDCA6, 0xFFFF,}, {0xDCA8, 0xE058,}, {0xDCAA, 0x2240,}, {0xDCAC, 0x0340,}, {0xDCAE, 0xA212,}, {0xDCB0, 0x208A,}, {0xDCB2, 0x0FFF,}, {0xDCB4, 0x1A42,}, {0xDCB6, 0x0004,}, {0xDCB8, 0xD830,}, {0xDCBA, 0x1A44,}, {0xDCBC, 0x0002,}, {0xDCBE, 0xD800,}, {0xDCC0, 0x1A50,}, {0xDCC2, 0x0002,}, {0xDCC4, 0x1A52,}, {0xDCC6, 0x0004,}, {0xDCC8, 0x1242,}, {0xDCCA, 0x0140,}, {0xDCCC, 0x8A2C,}, {0xDCCE, 0x6038,}, {0xDCD0, 0x1A42,}, {0xDCD2, 0x0004,}, {0xDCD4, 0x1242,}, {0xDCD6, 0x0141,}, {0xDCD8, 0x70CF,}, {0xDCDA, 0xFF00,}, {0xDCDC, 0x2184,}, {0xDCDE, 0xB021,}, {0xDCE0, 0xD800,}, {0xDCE2, 0xB893,}, {0xDCE4, 0x07E5,}, {0xDCE6, 0x0460,}, {0xDCE8, 0xD901,}, {0xDCEA, 0x78E0,}, {0xDCEC, 0xC0F1,}, {0xDCEE, 0x0BFA,}, {0xDCF0, 0x05A0,}, {0xDCF2, 0x216F,}, {0xDCF4, 0x0043,}, {0xDCF6, 0xC1A4,}, {0xDCF8, 0x220A,}, {0xDCFA, 0x1F80,}, {0xDCFC, 0xFFFF,}, {0xDCFE, 0xE058,}, {0xDD00, 0x2240,}, {0xDD02, 0x134F,}, {0xDD04, 0x1A48,}, {0xDD06, 0x13C0,}, {0xDD08, 0x1248,}, {0xDD0A, 0x1002,}, {0xDD0C, 0x70CF,}, {0xDD0E, 0x7FFF,}, {0xDD10, 0xFFFF,}, {0xDD12, 0xE230,}, {0xDD14, 0xC240,}, {0xDD16, 0xDA00,}, {0xDD18, 0xF00C,}, {0xDD1A, 0x1248,}, {0xDD1C, 0x1003,}, {0xDD1E, 0x1301,}, {0xDD20, 0x04CB,}, {0xDD22, 0x7261,}, {0xDD24, 0x2108,}, {0xDD26, 0x0081,}, {0xDD28, 0x2009,}, {0xDD2A, 0x0080,}, {0xDD2C, 0x1A48,}, {0xDD2E, 0x10C0,}, {0xDD30, 0x1248,}, {0xDD32, 0x100B,}, {0xDD34, 0xC300,}, {0xDD36, 0x0BE7,}, {0xDD38, 0x90C4,}, {0xDD3A, 0x2102,}, {0xDD3C, 0x0003,}, {0xDD3E, 0x238C,}, {0xDD40, 0x8FC3,}, {0xDD42, 0xF6C7,}, {0xDD44, 0xDAFF,}, {0xDD46, 0x1A05,}, {0xDD48, 0x1082,}, {0xDD4A, 0xC241,}, {0xDD4C, 0xF005,}, {0xDD4E, 0x7A6F,}, {0xDD50, 0xC241,}, {0xDD52, 0x1A05,}, {0xDD54, 0x10C2,}, {0xDD56, 0x2000,}, {0xDD58, 0x8040,}, {0xDD5A, 0xDA00,}, {0xDD5C, 0x20C0,}, {0xDD5E, 0x0064,}, {0xDD60, 0x781C,}, {0xDD62, 0xC042,}, {0xDD64, 0x1C0E,}, {0xDD66, 0x3082,}, {0xDD68, 0x1A48,}, {0xDD6A, 0x13C0,}, {0xDD6C, 0x7548,}, {0xDD6E, 0x7348,}, {0xDD70, 0x7148,}, {0xDD72, 0x7648,}, {0xDD74, 0xF002,}, {0xDD76, 0x7608,}, {0xDD78, 0x1248,}, {0xDD7A, 0x1000,}, {0xDD7C, 0x1400,}, {0xDD7E, 0x300B,}, {0xDD80, 0x084D,}, {0xDD82, 0x02C5,}, {0xDD84, 0x1248,}, {0xDD86, 0x1000,}, {0xDD88, 0xE101,}, {0xDD8A, 0x1001,}, {0xDD8C, 0x04CB,}, {0xDD8E, 0x1A48,}, {0xDD90, 0x1000,}, {0xDD92, 0x7361,}, {0xDD94, 0x1408,}, {0xDD96, 0x300B,}, {0xDD98, 0x2302,}, {0xDD9A, 0x02C0,}, {0xDD9C, 0x780D,}, {0xDD9E, 0x2607,}, {0xDDA0, 0x903E,}, {0xDDA2, 0x07D6,}, {0xDDA4, 0xFFE3,}, {0xDDA6, 0x792F,}, {0xDDA8, 0x09CF,}, {0xDDAA, 0x8152,}, {0xDDAC, 0x1248,}, {0xDDAE, 0x100E,}, {0xDDB0, 0x2400,}, {0xDDB2, 0x334B,}, {0xDDB4, 0xE501,}, {0xDDB6, 0x7EE2,}, {0xDDB8, 0x0DBF,}, {0xDDBA, 0x90F2,}, {0xDDBC, 0x1B0C,}, {0xDDBE, 0x1382,}, {0xDDC0, 0xC123,}, {0xDDC2, 0x140E,}, {0xDDC4, 0x3080,}, {0xDDC6, 0x7822,}, {0xDDC8, 0x1A07,}, {0xDDCA, 0x1002,}, {0xDDCC, 0x124C,}, {0xDDCE, 0x1000,}, {0xDDD0, 0x120B,}, {0xDDD2, 0x1081,}, {0xDDD4, 0x1207,}, {0xDDD6, 0x1083,}, {0xDDD8, 0x2142,}, {0xDDDA, 0x004B,}, {0xDDDC, 0x781B,}, {0xDDDE, 0x0B21,}, {0xDDE0, 0x02E2,}, {0xDDE2, 0x1A4C,}, {0xDDE4, 0x1000,}, {0xDDE6, 0xE101,}, {0xDDE8, 0x0915,}, {0xDDEA, 0x00C2,}, {0xDDEC, 0xC101,}, {0xDDEE, 0x1204,}, {0xDDF0, 0x1083,}, {0xDDF2, 0x090D,}, {0xDDF4, 0x00C2,}, {0xDDF6, 0xE001,}, {0xDDF8, 0x1A4C,}, {0xDDFA, 0x1000,}, {0xDDFC, 0x1A06,}, {0xDDFE, 0x1002,}, {0xDE00, 0x234A,}, {0xDE02, 0x1000,}, {0xDE04, 0x7169,}, {0xDE06, 0xF008,}, {0xDE08, 0x2053,}, {0xDE0A, 0x0003,}, {0xDE0C, 0x6179,}, {0xDE0E, 0x781C,}, {0xDE10, 0x2340,}, {0xDE12, 0x104B,}, {0xDE14, 0x1203,}, {0xDE16, 0x1083,}, {0xDE18, 0x0BF1,}, {0xDE1A, 0x90C2,}, {0xDE1C, 0x1202,}, {0xDE1E, 0x1080,}, {0xDE20, 0x091D,}, {0xDE22, 0x0004,}, {0xDE24, 0x70CF,}, {0xDE26, 0xFFFF,}, {0xDE28, 0xC644,}, {0xDE2A, 0x881B,}, {0xDE2C, 0xE0B2,}, {0xDE2E, 0xD83C,}, {0xDE30, 0x20CA,}, {0xDE32, 0x0CA2,}, {0xDE34, 0x1A01,}, {0xDE36, 0x1002,}, {0xDE38, 0x1A4C,}, {0xDE3A, 0x1080,}, {0xDE3C, 0x02B9,}, {0xDE3E, 0x05A0,}, {0xDE40, 0xC0A4,}, {0xDE42, 0x78E0,}, {0xDE44, 0xC0F1,}, {0xDE46, 0xFF95,}, {0xDE48, 0xD800,}, {0xDE4A, 0x71CF,}, {0xDE4C, 0xFF00,}, {0xDE4E, 0x1FE0,}, {0xDE50, 0x19D0,}, {0xDE52, 0x001C,}, {0xDE54, 0x19D1,}, {0xDE56, 0x001C,}, {0xDE58, 0x70CF,}, {0xDE5A, 0xFFFF,}, {0xDE5C, 0xE058,}, {0xDE5E, 0x901F,}, {0xDE60, 0xB861,}, {0xDE62, 0x19D2,}, {0xDE64, 0x001C,}, {0xDE66, 0xC0D1,}, {0xDE68, 0x7EE0,}, {0xDE6A, 0x78E0,}, {0xDE6C, 0xC0F1,}, {0xDE6E, 0x0A7A,}, {0xDE70, 0x0580,}, {0xDE72, 0x70CF,}, {0xDE74, 0xFFFF,}, {0xDE76, 0xC5D4,}, {0xDE78, 0x9041,}, {0xDE7A, 0x9023,}, {0xDE7C, 0x75CF,}, {0xDE7E, 0xFFFF,}, {0xDE80, 0xE058,}, {0xDE82, 0x7942,}, {0xDE84, 0xB967,}, {0xDE86, 0x7F30,}, {0xDE88, 0xB53F,}, {0xDE8A, 0x71CF,}, {0xDE8C, 0xFFFF,}, {0xDE8E, 0xC84C,}, {0xDE90, 0x91D3,}, {0xDE92, 0x108B,}, {0xDE94, 0x0081,}, {0xDE96, 0x2615,}, {0xDE98, 0x1380,}, {0xDE9A, 0x090F,}, {0xDE9C, 0x0C91,}, {0xDE9E, 0x0A8E,}, {0xDEA0, 0x05A0,}, {0xDEA2, 0xD906,}, {0xDEA4, 0x7E10,}, {0xDEA6, 0x2615,}, {0xDEA8, 0x1380,}, {0xDEAA, 0x0A82,}, {0xDEAC, 0x05A0,}, {0xDEAE, 0xD960,}, {0xDEB0, 0x790F,}, {0xDEB2, 0x090D,}, {0xDEB4, 0x0133,}, {0xDEB6, 0xAD0C,}, {0xDEB8, 0xD904,}, {0xDEBA, 0xAD2C,}, {0xDEBC, 0x79EC,}, {0xDEBE, 0x2941,}, {0xDEC0, 0x7402,}, {0xDEC2, 0x71CF,}, {0xDEC4, 0xFF00,}, {0xDEC6, 0x2184,}, {0xDEC8, 0xB142,}, {0xDECA, 0x1906,}, {0xDECC, 0x0E44,}, {0xDECE, 0xFFDE,}, {0xDED0, 0x70C9,}, {0xDED2, 0x0A5A,}, {0xDED4, 0x05A0,}, {0xDED6, 0x8D2C,}, {0xDED8, 0xAD0B,}, {0xDEDA, 0xD800,}, {0xDEDC, 0xAD01,}, {0xDEDE, 0x0219,}, {0xDEE0, 0x05A0,}, {0xDEE2, 0xA513,}, {0xDEE4, 0xC0F1,}, {0xDEE6, 0x71CF,}, {0xDEE8, 0xFFFF,}, {0xDEEA, 0xC644,}, {0xDEEC, 0xA91B,}, {0xDEEE, 0xD902,}, {0xDEF0, 0x70CF,}, {0xDEF2, 0xFFFF,}, {0xDEF4, 0xC84C,}, {0xDEF6, 0x093E,}, {0xDEF8, 0x03A0,}, {0xDEFA, 0xA826,}, {0xDEFC, 0xFFDC,}, {0xDEFE, 0xF1B5,}, {0xDF00, 0xC0F1,}, {0xDF02, 0x09EA,}, {0xDF04, 0x0580,}, {0xDF06, 0x75CF,}, {0xDF08, 0xFFFF,}, {0xDF0A, 0xE058,}, {0xDF0C, 0x1540,}, {0xDF0E, 0x1080,}, {0xDF10, 0x08A7,}, {0xDF12, 0x0010,}, {0xDF14, 0x8D00,}, {0xDF16, 0x0813,}, {0xDF18, 0x009E,}, {0xDF1A, 0x1540,}, {0xDF1C, 0x1081,}, {0xDF1E, 0xE181,}, {0xDF20, 0x20CA,}, {0xDF22, 0x00A1,}, {0xDF24, 0xF24B,}, {0xDF26, 0x1540,}, {0xDF28, 0x1081,}, {0xDF2A, 0x090F,}, {0xDF2C, 0x0050,}, {0xDF2E, 0x1540,}, {0xDF30, 0x1081,}, {0xDF32, 0x0927,}, {0xDF34, 0x0091,}, {0xDF36, 0x1550,}, {0xDF38, 0x1081,}, {0xDF3A, 0xDE00,}, {0xDF3C, 0xAD2A,}, {0xDF3E, 0x1D50,}, {0xDF40, 0x1382,}, {0xDF42, 0x1552,}, {0xDF44, 0x1101,}, {0xDF46, 0x1D52,}, {0xDF48, 0x1384,}, {0xDF4A, 0xB524,}, {0xDF4C, 0x082D,}, {0xDF4E, 0x015F,}, {0xDF50, 0xFF55,}, {0xDF52, 0xD803,}, {0xDF54, 0xF033,}, {0xDF56, 0x1540,}, {0xDF58, 0x1081,}, {0xDF5A, 0x0967,}, {0xDF5C, 0x00D1,}, {0xDF5E, 0x1550,}, {0xDF60, 0x1081,}, {0xDF62, 0xDE00,}, {0xDF64, 0xAD2A,}, {0xDF66, 0x1D50,}, {0xDF68, 0x1382,}, {0xDF6A, 0x1552,}, {0xDF6C, 0x1101,}, {0xDF6E, 0x1D52,}, {0xDF70, 0x1384,}, {0xDF72, 0xB524,}, {0xDF74, 0x0811,}, {0xDF76, 0x019E,}, {0xDF78, 0xB8A0,}, {0xDF7A, 0xAD00,}, {0xDF7C, 0xFF47,}, {0xDF7E, 0x1D40,}, {0xDF80, 0x1382,}, {0xDF82, 0xF01F,}, {0xDF84, 0xFF5A,}, {0xDF86, 0x8D01,}, {0xDF88, 0x8D40,}, {0xDF8A, 0xE812,}, {0xDF8C, 0x71CF,}, {0xDF8E, 0xFFFF,}, {0xDF90, 0xC644,}, {0xDF92, 0x893B,}, {0xDF94, 0x7030,}, {0xDF96, 0x22D1,}, {0xDF98, 0x8062,}, {0xDF9A, 0xF20A,}, {0xDF9C, 0x0A0F,}, {0xDF9E, 0x009E,}, {0xDFA0, 0x71CF,}, {0xDFA2, 0xFFFF,}, {0xDFA4, 0xC84C,}, {0xDFA6, 0x893B,}, {0xDFA8, 0xE902,}, {0xDFAA, 0xFFCF,}, {0xDFAC, 0x8D00,}, {0xDFAE, 0xB8E7,}, {0xDFB0, 0x26CA,}, {0xDFB2, 0x1022,}, {0xDFB4, 0xF5E2,}, {0xDFB6, 0xFF3C,}, {0xDFB8, 0xD801,}, {0xDFBA, 0x1D40,}, {0xDFBC, 0x1002,}, {0xDFBE, 0x0141,}, {0xDFC0, 0x0580,}, {0xDFC2, 0x78E0,}, {0xDFC4, 0xC0F1,}, {0xDFC6, 0xC5E1,}, {0xDFC8, 0xFF34,}, {0xDFCA, 0xDD00,}, {0xDFCC, 0x70CF,}, {0xDFCE, 0xFFFF,}, {0xDFD0, 0xE090,}, {0xDFD2, 0xA8A8,}, {0xDFD4, 0xD800,}, {0xDFD6, 0xB893,}, {0xDFD8, 0x0C8A,}, {0xDFDA, 0x0460,}, {0xDFDC, 0xD901,}, {0xDFDE, 0x71CF,}, {0xDFE0, 0xFFFF,}, {0xDFE2, 0xDC10,}, {0xDFE4, 0xD813,}, {0xDFE6, 0x0B96,}, {0xDFE8, 0x0460,}, {0xDFEA, 0x72A9,}, {0xDFEC, 0x0119,}, {0xDFEE, 0x0580,}, {0xDFF0, 0xC0F1,}, {0xDFF2, 0x71CF,}, {0xDFF4, 0x0000,}, {0xDFF6, 0x5BAE,}, {0xDFF8, 0x7940,}, {0xDFFA, 0xFF9D,}, {0xDFFC, 0xF135,}, {0xDFFE, 0x78E0,}, {0xE000, 0xC0F1,}, {0xE002, 0x70CF,}, {0xE004, 0x0000,}, {0xE006, 0x5CBA,}, {0xE008, 0x7840,}, {0xE00A, 0x70CF,}, {0xE00C, 0xFFFF,}, {0xE00E, 0xE058,}, {0xE010, 0x8800,}, {0xE012, 0x0815,}, {0xE014, 0x001E,}, {0xE016, 0x70CF,}, {0xE018, 0xFFFF,}, {0xE01A, 0xC84C,}, {0xE01C, 0x881A,}, {0xE01E, 0xE080,}, {0xE020, 0x0EE0,}, {0xE022, 0xFFC1,}, {0xE024, 0xF121,}, {0xE026, 0x78E0,}, {0xE028, 0xC0F1,}, {0xE02A, 0xD900,}, {0xE02C, 0xF009,}, {0xE02E, 0x70CF,}, {0xE030, 0xFFFF,}, {0xE032, 0xE0AC,}, {0xE034, 0x7835,}, {0xE036, 0x8041,}, {0xE038, 0x8000,}, {0xE03A, 0xE102,}, {0xE03C, 0xA040,}, {0xE03E, 0x09F3,}, {0xE040, 0x8114,}, {0xE042, 0x71CF,}, {0xE044, 0xFFFF,}, {0xE046, 0xE058,}, {0xE048, 0x70CF,}, {0xE04A, 0xFFFF,}, {0xE04C, 0xC594,}, {0xE04E, 0xB030,}, {0xE050, 0xFFDD,}, {0xE052, 0xD800,}, {0xE054, 0xF109,}, {0xE056, 0x0000,}, {0xE058, 0x0300,}, {0xE05A, 0x0204,}, {0xE05C, 0x0700,}, {0xE05E, 0x0000,}, {0xE060, 0x0000,}, {0xE062, 0x0000,}, {0xE064, 0x0000,}, {0xE066, 0x0000,}, {0xE068, 0x0000,}, {0xE06A, 0x0000,}, {0xE06C, 0x0000,}, {0xE06E, 0x0000,}, {0xE070, 0x0000,}, {0xE072, 0x0000,}, {0xE074, 0x0000,}, {0xE076, 0x0000,}, {0xE078, 0x0000,}, {0xE07A, 0x0000,}, {0xE07C, 0x0000,}, {0xE07E, 0x0000,}, {0xE080, 0x0000,}, {0xE082, 0x0000,}, {0xE084, 0x0000,}, {0xE086, 0x0000,}, {0xE088, 0x0000,}, {0xE08A, 0x0000,}, {0xE08C, 0x0000,}, {0xE08E, 0x0000,}, {0xE090, 0x0000,}, {0xE092, 0x0000,}, {0xE094, 0x0000,}, {0xE096, 0x0000,}, {0xE098, 0x0000,}, {0xE09A, 0x0000,}, {0xE09C, 0x0000,}, {0xE09E, 0x0000,}, {0xE0A0, 0x0000,}, {0xE0A2, 0x0000,}, {0xE0A4, 0x0000,}, {0xE0A6, 0x0000,}, {0xE0A8, 0x0000,}, {0xE0AA, 0x0000,}, {0xE0AC, 0xFFFF,}, {0xE0AE, 0xCB68,}, {0xE0B0, 0xFFFF,}, {0xE0B2, 0xDFF0,}, {0xE0B4, 0xFFFF,}, {0xE0B6, 0xCB6C,}, {0xE0B8, 0xFFFF,}, {0xE0BA, 0xE000,}, {0x098E, 0x0000,}, /*MIPI setting for SOC1040*/ {0x3C5A, 0x0009,}, {0x3C44, 0x0080,},/*MIPI_CUSTOM_SHORT_PKT*/ /*[Tuning_settings]*/ /*[CCM]*/ {0xC892, 0x0267,},/*CAM_AWB_CCM_L_0*/ {0xC894, 0xFF1A,},/*CAM_AWB_CCM_L_1*/ {0xC896, 0xFFB3,},/*CAM_AWB_CCM_L_2*/ {0xC898, 0xFF80,},/*CAM_AWB_CCM_L_3*/ {0xC89A, 0x0166,},/*CAM_AWB_CCM_L_4*/ {0xC89C, 0x0003,},/*CAM_AWB_CCM_L_5*/ {0xC89E, 0xFF9A,},/*CAM_AWB_CCM_L_6*/ {0xC8A0, 0xFEB4,},/*CAM_AWB_CCM_L_7*/ {0xC8A2, 0x024D,},/*CAM_AWB_CCM_L_8*/ {0xC8A4, 0x01BF,},/*CAM_AWB_CCM_M_0*/ {0xC8A6, 0xFF01,},/*CAM_AWB_CCM_M_1*/ {0xC8A8, 0xFFF3,},/*CAM_AWB_CCM_M_2*/ {0xC8AA, 0xFF75,},/*CAM_AWB_CCM_M_3*/ {0xC8AC, 0x0198,},/*CAM_AWB_CCM_M_4*/ {0xC8AE, 0xFFFD,},/*CAM_AWB_CCM_M_5*/ {0xC8B0, 0xFF9A,},/*CAM_AWB_CCM_M_6*/ {0xC8B2, 0xFEE7,},/*CAM_AWB_CCM_M_7*/ {0xC8B4, 0x02A8,},/*CAM_AWB_CCM_M_8*/ {0xC8B6, 0x01D9,},/*CAM_AWB_CCM_R_0*/ {0xC8B8, 0xFF26,},/*CAM_AWB_CCM_R_1*/ {0xC8BA, 0xFFF3,},/*CAM_AWB_CCM_R_2*/ {0xC8BC, 0xFFB3,},/*CAM_AWB_CCM_R_3*/ {0xC8BE, 0x0132,},/*CAM_AWB_CCM_R_4*/ {0xC8C0, 0xFFE8,},/*CAM_AWB_CCM_R_5*/ {0xC8C2, 0xFFDA,},/*CAM_AWB_CCM_R_6*/ {0xC8C4, 0xFECD,},/*CAM_AWB_CCM_R_7*/ {0xC8C6, 0x02C2,},/*CAM_AWB_CCM_R_8*/ {0xC8C8, 0x0075,},/*CAM_AWB_CCM_L_RG_GAIN*/ {0xC8CA, 0x011C,},/*CAM_AWB_CCM_L_BG_GAIN*/ {0xC8CC, 0x009A,},/*CAM_AWB_CCM_M_RG_GAIN*/ {0xC8CE, 0x0105,},/*CAM_AWB_CCM_M_BG_GAIN*/ {0xC8D0, 0x00A4,},/*CAM_AWB_CCM_R_RG_GAIN*/ {0xC8D2, 0x00AC,},/*CAM_AWB_CCM_R_BG_GAIN*/ {0xC8D4, 0x0A8C,},/*CAM_AWB_CCM_L_CTEMP*/ {0xC8D6, 0x0F0A,},/*CAM_AWB_CCM_M_CTEMP*/ {0xC8D8, 0x1964,},/*CAM_AWB_CCM_R_CTEMP*/ /*[AWB]*/ {0xC914, 0x0000,},/*CAM_STAT_AWB_CLIP_WINDOW_XSTART*/ {0xC916, 0x0000,},/*CAM_STAT_AWB_CLIP_WINDOW_YSTART*/ {0xC918, 0x04FF,},/*CAM_STAT_AWB_CLIP_WINDOW_XEND*/ {0xC91A, 0x02CF,},/*CAM_STAT_AWB_CLIP_WINDOW_YEND*/ {0xC904, 0x0033,},/*CAM_AWB_AWB_XSHIFT_PRE_ADJ*/ {0xC906, 0x0040,},/*CAM_AWB_AWB_YSHIFT_PRE_ADJ*/ {0xC8F2, 0x03, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_AWB_AWB_XSCALE*/ {0xC8F3, 0x02, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_AWB_AWB_YSCALE*/ {0xC906, 0x003C,},/*CAM_AWB_AWB_YSHIFT_PRE_ADJ*/ {0xC8F4, 0x0000,},/*CAM_AWB_AWB_WEIGHTS_0*/ {0xC8F6, 0x0000,},/*CAM_AWB_AWB_WEIGHTS_1*/ {0xC8F8, 0x0000,},/*CAM_AWB_AWB_WEIGHTS_2*/ {0xC8FA, 0xE724,},/*CAM_AWB_AWB_WEIGHTS_3*/ {0xC8FC, 0x1583,},/*CAM_AWB_AWB_WEIGHTS_4*/ {0xC8FE, 0x2045,},/*CAM_AWB_AWB_WEIGHTS_5*/ {0xC900, 0x03FF,},/*CAM_AWB_AWB_WEIGHTS_6*/ {0xC902, 0x007C,},/*CAM_AWB_AWB_WEIGHTS_7*/ {0xC90C, 0x80, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_AWB_K_R_L*/ {0xC90D, 0x80, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_AWB_K_G_L*/ {0xC90E, 0x80, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_AWB_K_B_L*/ {0xC90F, 0x88, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_AWB_K_R_R*/ {0xC910, 0x80, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_AWB_K_G_R*/ {0xC911, 0x80, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_AWB_K_B_R*/ /*[Step7-CPIPE_Preference]*/ {0xC926, 0x0020,},/*CAM_LL_START_BRIGHTNESS*/ {0xC928, 0x009A,},/*CAM_LL_STOP_BRIGHTNESS*/ {0xC946, 0x0070,},/*CAM_LL_START_GAIN_METRIC*/ {0xC948, 0x00F3,},/*CAM_LL_STOP_GAIN_METRIC*/ {0xC952, 0x0020,},/*CAM_LL_START_TARGET_LUMA_BM*/ {0xC954, 0x009A,},/*CAM_LL_STOP_TARGET_LUMA_BM*/ {0xC92A, 0x80, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_START_SATURATION*/ {0xC92B, 0x4B, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_END_SATURATION*/ {0xC92C, 0x00, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_START_DESATURATION*/ {0xC92D, 0xFF, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_END_DESATURATION*/ {0xC92E, 0x3C, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_START_DEMOSAIC*/ {0xC92F, 0x02, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_START_AP_GAIN*/ {0xC930, 0x06, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_START_AP_THRESH*/ {0xC931, 0x64, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_STOP_DEMOSAIC*/ {0xC932, 0x01, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_STOP_AP_GAIN*/ {0xC933, 0x0C, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_STOP_AP_THRESH*/ {0xC934, 0x3C, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_START_NR_RED*/ {0xC935, 0x3C, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_START_NR_GREEN*/ {0xC936, 0x3C, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_START_NR_BLUE*/ {0xC937, 0x0F, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_START_NR_THRESH*/ {0xC938, 0x64, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_STOP_NR_RED*/ {0xC939, 0x64, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_STOP_NR_GREEN*/ {0xC93A, 0x64, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_STOP_NR_BLUE*/ {0xC93B, 0x32, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_STOP_NR_THRESH*/ {0xC93C, 0x0020,},/*CAM_LL_START_CONTRAST_BM*/ {0xC93E, 0x009A,},/*CAM_LL_STOP_CONTRAST_BM*/ {0xC940, 0x00DC,},/*CAM_LL_GAMMA*/ /*CAM_LL_START_CONTRAST_GRADIENT*/ {0xC942, 0x38, MSM_CAMERA_I2C_BYTE_DATA}, /*CAM_LL_STOP_CONTRAST_GRADIENT*/ {0xC943, 0x30, MSM_CAMERA_I2C_BYTE_DATA}, {0xC944, 0x50, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_START_CONTRAST_LUMA*/ {0xC945, 0x19, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_STOP_CONTRAST_LUMA*/ {0xC94A, 0x0230,},/*CAM_LL_START_FADE_TO_BLACK_LUMA*/ {0xC94C, 0x0010,},/*CAM_LL_STOP_FADE_TO_BLACK_LUMA*/ {0xC94E, 0x01CD,},/*CAM_LL_CLUSTER_DC_TH_BM*/ {0xC950, 0x05, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_CLUSTER_DC_GATE*/ {0xC951, 0x40, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_LL_SUMMING_SENSITIVITY*/ /*CAM_AET_TARGET_AVERAGE_LUMA_DARK*/ {0xC87B, 0x1B, MSM_CAMERA_I2C_BYTE_DATA}, {0xC878, 0x0E, MSM_CAMERA_I2C_BYTE_DATA},/*CAM_AET_AEMODE*/ {0xC890, 0x0080,},/*CAM_AET_TARGET_GAIN*/ {0xC886, 0x0100,},/*CAM_AET_AE_MAX_VIRT_AGAIN*/ {0xC87C, 0x005A,},/*CAM_AET_BLACK_CLIPPING_TARGET*/ {0xB42A, 0x05, MSM_CAMERA_I2C_BYTE_DATA},/*CCM_DELTA_GAIN*/ /*AE_TRACK_AE_TRACKING_DAMPENING*/ {0xA80A, 0x20, MSM_CAMERA_I2C_BYTE_DATA}, {0x3C44, 0x0080,}, {0x3C40, 0x0004, MSM_CAMERA_I2C_UNSET_WORD_MASK}, {0xA802, 0x08, MSM_CAMERA_I2C_SET_BYTE_MASK}, {0xC908, 0x01, MSM_CAMERA_I2C_BYTE_DATA}, {0xC879, 0x01, MSM_CAMERA_I2C_BYTE_DATA}, {0xC909, 0x01, MSM_CAMERA_I2C_UNSET_BYTE_MASK}, {0xA80A, 0x18, MSM_CAMERA_I2C_BYTE_DATA}, {0xA80B, 0x18, MSM_CAMERA_I2C_BYTE_DATA}, {0xAC16, 0x18, MSM_CAMERA_I2C_BYTE_DATA}, {0xC878, 0x08, MSM_CAMERA_I2C_SET_BYTE_MASK}, {0xBC02, 0x08, MSM_CAMERA_I2C_UNSET_BYTE_MASK}, }; static struct v4l2_subdev_info mt9m114_subdev_info[] = { { .code = V4L2_MBUS_FMT_YUYV8_2X8, .colorspace = V4L2_COLORSPACE_JPEG, .fmt = 1, .order = 0, }, }; static struct msm_camera_i2c_reg_conf mt9m114_config_change_settings[] = { {0xdc00, 0x28, MSM_CAMERA_I2C_BYTE_DATA, MSM_CAMERA_I2C_CMD_WRITE}, {MT9M114_COMMAND_REGISTER, MT9M114_COMMAND_REGISTER_SET_STATE, MSM_CAMERA_I2C_UNSET_WORD_MASK, MSM_CAMERA_I2C_CMD_POLL}, {MT9M114_COMMAND_REGISTER, (MT9M114_COMMAND_REGISTER_OK | MT9M114_COMMAND_REGISTER_SET_STATE), MSM_CAMERA_I2C_WORD_DATA, MSM_CAMERA_I2C_CMD_WRITE}, {MT9M114_COMMAND_REGISTER, MT9M114_COMMAND_REGISTER_SET_STATE, MSM_CAMERA_I2C_UNSET_WORD_MASK, MSM_CAMERA_I2C_CMD_POLL}, {0xDC01, 0x31, MSM_CAMERA_I2C_BYTE_DATA}, }; static const struct i2c_device_id mt9m114_i2c_id[] = { {MT9M114_SENSOR_NAME, (kernel_ulong_t)&mt9m114_s_ctrl}, { } }; static int32_t msm_mt9m114_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { return msm_sensor_i2c_probe(client, id, &mt9m114_s_ctrl); } static struct i2c_driver mt9m114_i2c_driver = { .id_table = mt9m114_i2c_id, .probe = msm_mt9m114_i2c_probe, .driver = { .name = MT9M114_SENSOR_NAME, }, }; static struct msm_camera_i2c_client mt9m114_sensor_i2c_client = { .addr_type = MSM_CAMERA_I2C_WORD_ADDR, }; static const struct of_device_id mt9m114_dt_match[] = { {.compatible = "qcom,mt9m114", .data = &mt9m114_s_ctrl}, {} }; MODULE_DEVICE_TABLE(of, mt9m114_dt_match); static struct platform_driver mt9m114_platform_driver = { .driver = { .name = "qcom,mt9m114", .owner = THIS_MODULE, .of_match_table = mt9m114_dt_match, }, }; static int32_t mt9m114_platform_probe(struct platform_device *pdev) { int32_t rc; const struct of_device_id *match; match = of_match_device(mt9m114_dt_match, &pdev->dev); if (match) rc = msm_sensor_platform_probe(pdev, match->data); else { pr_err("%s:%d match is null\n", __func__, __LINE__); rc = -EINVAL; } return rc; } static int __init mt9m114_init_module(void) { int32_t rc; pr_info("%s:%d\n", __func__, __LINE__); rc = platform_driver_probe(&mt9m114_platform_driver, mt9m114_platform_probe); if (!rc) return rc; pr_err("%s:%d rc %d\n", __func__, __LINE__, rc); return i2c_add_driver(&mt9m114_i2c_driver); } static void __exit mt9m114_exit_module(void) { pr_info("%s:%d\n", __func__, __LINE__); if (mt9m114_s_ctrl.pdev) { msm_sensor_free_sensor_data(&mt9m114_s_ctrl); platform_driver_unregister(&mt9m114_platform_driver); } else i2c_del_driver(&mt9m114_i2c_driver); return; } int32_t mt9m114_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void __user *argp) { struct sensorb_cfg_data *cdata = (struct sensorb_cfg_data *)argp; int32_t rc = 0; int32_t i = 0; mutex_lock(s_ctrl->msm_sensor_mutex); CDBG("%s:%d %s cfgtype = %d\n", __func__, __LINE__, s_ctrl->sensordata->sensor_name, cdata->cfgtype); switch (cdata->cfgtype) { case CFG_GET_SENSOR_INFO: memcpy(cdata->cfg.sensor_info.sensor_name, s_ctrl->sensordata->sensor_name, sizeof(cdata->cfg.sensor_info.sensor_name)); cdata->cfg.sensor_info.session_id = s_ctrl->sensordata->sensor_info->session_id; for (i = 0; i < SUB_MODULE_MAX; i++) { cdata->cfg.sensor_info.subdev_id[i] = s_ctrl->sensordata->sensor_info->subdev_id[i]; cdata->cfg.sensor_info.subdev_intf[i] = s_ctrl->sensordata->sensor_info->subdev_intf[i]; } cdata->cfg.sensor_info.is_mount_angle_valid = s_ctrl->sensordata->sensor_info->is_mount_angle_valid; cdata->cfg.sensor_info.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; CDBG("%s:%d sensor name %s\n", __func__, __LINE__, cdata->cfg.sensor_info.sensor_name); CDBG("%s:%d session id %d\n", __func__, __LINE__, cdata->cfg.sensor_info.session_id); for (i = 0; i < SUB_MODULE_MAX; i++) CDBG("%s:%d subdev_id[%d] %d\n", __func__, __LINE__, i, cdata->cfg.sensor_info.subdev_id[i]); CDBG("%s:%d mount angle valid %d value %d\n", __func__, __LINE__, cdata->cfg.sensor_info.is_mount_angle_valid, cdata->cfg.sensor_info.sensor_mount_angle); break; case CFG_SET_INIT_SETTING: /* 1. Write Recommend settings */ /* 2. Write change settings */ rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_recommend_settings, ARRAY_SIZE(mt9m114_recommend_settings), MSM_CAMERA_I2C_WORD_DATA); rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_config_change_settings, ARRAY_SIZE(mt9m114_config_change_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_SET_RESOLUTION: rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_720p_settings, ARRAY_SIZE(mt9m114_720p_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_SET_STOP_STREAM: break; case CFG_SET_START_STREAM: rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_config_change_settings, ARRAY_SIZE(mt9m114_config_change_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_GET_SENSOR_INIT_PARAMS: cdata->cfg.sensor_init_params.modes_supported = s_ctrl->sensordata->sensor_info->modes_supported; cdata->cfg.sensor_init_params.position = s_ctrl->sensordata->sensor_info->position; cdata->cfg.sensor_init_params.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; CDBG("%s:%d init params mode %d pos %d mount %d\n", __func__, __LINE__, cdata->cfg.sensor_init_params.modes_supported, cdata->cfg.sensor_init_params.position, cdata->cfg.sensor_init_params.sensor_mount_angle); break; case CFG_WRITE_I2C_ARRAY: { struct msm_camera_i2c_reg_setting conf_array; struct msm_camera_i2c_reg_array *reg_setting = NULL; if (copy_from_user(&conf_array, (void *)cdata->cfg.setting, sizeof(struct msm_camera_i2c_reg_setting))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } if (!conf_array.size || conf_array.size > I2C_SEQ_REG_DATA_MAX) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } reg_setting = kzalloc(conf_array.size * (sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL); if (!reg_setting) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -ENOMEM; break; } if (copy_from_user(reg_setting, (void *)conf_array.reg_setting, conf_array.size * sizeof(struct msm_camera_i2c_reg_array))) { pr_err("%s:%d failed\n", __func__, __LINE__); kfree(reg_setting); rc = -EFAULT; break; } conf_array.reg_setting = reg_setting; rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write_table( s_ctrl->sensor_i2c_client, &conf_array); kfree(reg_setting); break; } case CFG_POWER_UP: if (s_ctrl->func_tbl->sensor_power_up) rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl); else rc = -EFAULT; break; case CFG_POWER_DOWN: if (s_ctrl->func_tbl->sensor_power_down) rc = s_ctrl->func_tbl->sensor_power_down(s_ctrl); else rc = -EFAULT; break; case CFG_SET_STOP_STREAM_SETTING: { struct msm_camera_i2c_reg_setting *stop_setting = &s_ctrl->stop_setting; struct msm_camera_i2c_reg_array *reg_setting = NULL; if (copy_from_user(stop_setting, (void *)cdata->cfg.setting, sizeof(struct msm_camera_i2c_reg_setting))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } reg_setting = stop_setting->reg_setting; stop_setting->reg_setting = kzalloc(stop_setting->size * (sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL); if (!stop_setting->reg_setting) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -ENOMEM; break; } if (copy_from_user(stop_setting->reg_setting, (void *)reg_setting, stop_setting->size * sizeof(struct msm_camera_i2c_reg_array))) { pr_err("%s:%d failed\n", __func__, __LINE__); kfree(stop_setting->reg_setting); stop_setting->reg_setting = NULL; stop_setting->size = 0; rc = -EFAULT; break; } break; } case CFG_SET_SATURATION: { int32_t sat_lev; if (copy_from_user(&sat_lev, (void *)cdata->cfg.setting, sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Saturation Value is %d", __func__, sat_lev); break; } case CFG_SET_CONTRAST: { int32_t con_lev; if (copy_from_user(&con_lev, (void *)cdata->cfg.setting, sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Contrast Value is %d", __func__, con_lev); break; } case CFG_SET_SHARPNESS: { int32_t shp_lev; if (copy_from_user(&shp_lev, (void *)cdata->cfg.setting, sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Sharpness Value is %d", __func__, shp_lev); break; } case CFG_SET_AUTOFOCUS: { /* TO-DO: set the Auto Focus */ pr_debug("%s: Setting Auto Focus", __func__); break; } case CFG_CANCEL_AUTOFOCUS: { /* TO-DO: Cancel the Auto Focus */ pr_debug("%s: Cancelling Auto Focus", __func__); break; } case CFG_SET_WHITE_BALANCE: break; case CFG_SET_EXPOSURE_COMPENSATION: break; case CFG_SET_EFFECT: break; case CFG_SET_ANTIBANDING: break; case CFG_SET_BESTSHOT_MODE: break; case CFG_SET_ISO: break; default: rc = -EFAULT; break; } mutex_unlock(s_ctrl->msm_sensor_mutex); return rc; } #ifdef CONFIG_COMPAT int32_t mt9m114_sensor_config32(struct msm_sensor_ctrl_t *s_ctrl, void __user *argp) { struct sensorb_cfg_data32 *cdata = (struct sensorb_cfg_data32 *)argp; int32_t rc = 0; int32_t i = 0; mutex_lock(s_ctrl->msm_sensor_mutex); CDBG("%s:%d %s cfgtype = %d\n", __func__, __LINE__, s_ctrl->sensordata->sensor_name, cdata->cfgtype); switch (cdata->cfgtype) { case CFG_GET_SENSOR_INFO: memcpy(cdata->cfg.sensor_info.sensor_name, s_ctrl->sensordata->sensor_name, sizeof(cdata->cfg.sensor_info.sensor_name)); cdata->cfg.sensor_info.session_id = s_ctrl->sensordata->sensor_info->session_id; for (i = 0; i < SUB_MODULE_MAX; i++) { cdata->cfg.sensor_info.subdev_id[i] = s_ctrl->sensordata->sensor_info->subdev_id[i]; cdata->cfg.sensor_info.subdev_intf[i] = s_ctrl->sensordata->sensor_info->subdev_intf[i]; } cdata->cfg.sensor_info.is_mount_angle_valid = s_ctrl->sensordata->sensor_info->is_mount_angle_valid; cdata->cfg.sensor_info.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; CDBG("%s:%d sensor name %s\n", __func__, __LINE__, cdata->cfg.sensor_info.sensor_name); CDBG("%s:%d session id %d\n", __func__, __LINE__, cdata->cfg.sensor_info.session_id); for (i = 0; i < SUB_MODULE_MAX; i++) CDBG("%s:%d subdev_id[%d] %d\n", __func__, __LINE__, i, cdata->cfg.sensor_info.subdev_id[i]); CDBG("%s:%d mount angle valid %d value %d\n", __func__, __LINE__, cdata->cfg.sensor_info.is_mount_angle_valid, cdata->cfg.sensor_info.sensor_mount_angle); break; case CFG_SET_INIT_SETTING: /* 1. Write Recommend settings */ /* 2. Write change settings */ rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_recommend_settings, ARRAY_SIZE(mt9m114_recommend_settings), MSM_CAMERA_I2C_WORD_DATA); rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_config_change_settings, ARRAY_SIZE(mt9m114_config_change_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_SET_RESOLUTION: rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_720p_settings, ARRAY_SIZE(mt9m114_720p_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_SET_STOP_STREAM: break; case CFG_SET_START_STREAM: rc = s_ctrl->sensor_i2c_client->i2c_func_tbl-> i2c_write_conf_tbl( s_ctrl->sensor_i2c_client, mt9m114_config_change_settings, ARRAY_SIZE(mt9m114_config_change_settings), MSM_CAMERA_I2C_WORD_DATA); break; case CFG_GET_SENSOR_INIT_PARAMS: cdata->cfg.sensor_init_params.modes_supported = s_ctrl->sensordata->sensor_info->modes_supported; cdata->cfg.sensor_init_params.position = s_ctrl->sensordata->sensor_info->position; cdata->cfg.sensor_init_params.sensor_mount_angle = s_ctrl->sensordata->sensor_info->sensor_mount_angle; CDBG("%s:%d init params mode %d pos %d mount %d\n", __func__, __LINE__, cdata->cfg.sensor_init_params.modes_supported, cdata->cfg.sensor_init_params.position, cdata->cfg.sensor_init_params.sensor_mount_angle); break; case CFG_WRITE_I2C_ARRAY: { struct msm_camera_i2c_reg_setting32 conf_array32; struct msm_camera_i2c_reg_setting conf_array; struct msm_camera_i2c_reg_array *reg_setting = NULL; if (copy_from_user(&conf_array32, (void *)compat_ptr(cdata->cfg.setting), sizeof(struct msm_camera_i2c_reg_setting32))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } conf_array.addr_type = conf_array32.addr_type; conf_array.data_type = conf_array32.data_type; conf_array.delay = conf_array32.delay; conf_array.size = conf_array32.size; conf_array.reg_setting = compat_ptr(conf_array32.reg_setting); if (!conf_array.size || conf_array.size > I2C_SEQ_REG_DATA_MAX) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } reg_setting = kzalloc(conf_array.size * (sizeof(struct msm_camera_i2c_reg_array)), GFP_KERNEL); if (!reg_setting) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -ENOMEM; break; } if (copy_from_user(reg_setting, (void *)conf_array.reg_setting, conf_array.size * sizeof(struct msm_camera_i2c_reg_array))) { pr_err("%s:%d failed\n", __func__, __LINE__); kfree(reg_setting); rc = -EFAULT; break; } conf_array.reg_setting = reg_setting; rc = s_ctrl->sensor_i2c_client->i2c_func_tbl->i2c_write_table( s_ctrl->sensor_i2c_client, &conf_array); kfree(reg_setting); break; } case CFG_POWER_UP: if (s_ctrl->func_tbl->sensor_power_up) rc = s_ctrl->func_tbl->sensor_power_up(s_ctrl); else rc = -EFAULT; break; case CFG_POWER_DOWN: if (s_ctrl->func_tbl->sensor_power_down) rc = s_ctrl->func_tbl->sensor_power_down(s_ctrl); else rc = -EFAULT; break; case CFG_SET_SATURATION: { int32_t sat_lev; if (copy_from_user(&sat_lev, (void *)compat_ptr(cdata->cfg.setting), sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Saturation Value is %d", __func__, sat_lev); break; } case CFG_SET_CONTRAST: { int32_t con_lev; if (copy_from_user(&con_lev, (void *)compat_ptr(cdata->cfg.setting), sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Contrast Value is %d", __func__, con_lev); break; } case CFG_SET_SHARPNESS: { int32_t shp_lev; if (copy_from_user(&shp_lev, (void *)compat_ptr(cdata->cfg.setting), sizeof(int32_t))) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; } pr_debug("%s: Sharpness Value is %d", __func__, shp_lev); break; } case CFG_SET_AUTOFOCUS: { /* TO-DO: set the Auto Focus */ pr_debug("%s: Setting Auto Focus", __func__); break; } case CFG_CANCEL_AUTOFOCUS: { /* TO-DO: Cancel the Auto Focus */ pr_debug("%s: Cancelling Auto Focus", __func__); break; } case CFG_SET_WHITE_BALANCE: break; case CFG_SET_EXPOSURE_COMPENSATION: break; case CFG_SET_EFFECT: break; case CFG_SET_ANTIBANDING: break; case CFG_SET_BESTSHOT_MODE: break; case CFG_SET_ISO: break; default: pr_err("Invalid cfgtype func %s line %d cfgtype = %d\n", __func__, __LINE__, (int32_t)cdata->cfgtype); rc = -EFAULT; break; } mutex_unlock(s_ctrl->msm_sensor_mutex); return rc; } #endif static struct msm_sensor_fn_t mt9m114_sensor_func_tbl = { .sensor_config = mt9m114_sensor_config, #ifdef CONFIG_COMPAT .sensor_config32 = mt9m114_sensor_config32, #endif .sensor_power_up = msm_sensor_power_up, .sensor_power_down = msm_sensor_power_down, .sensor_match_id = msm_sensor_match_id, }; static struct msm_sensor_ctrl_t mt9m114_s_ctrl = { .sensor_i2c_client = &mt9m114_sensor_i2c_client, .power_setting_array.power_setting = mt9m114_power_setting, .power_setting_array.size = ARRAY_SIZE(mt9m114_power_setting), .msm_sensor_mutex = &mt9m114_mut, .sensor_v4l2_subdev_info = mt9m114_subdev_info, .sensor_v4l2_subdev_info_size = ARRAY_SIZE(mt9m114_subdev_info), .func_tbl = &mt9m114_sensor_func_tbl, }; module_init(mt9m114_init_module); module_exit(mt9m114_exit_module); MODULE_DESCRIPTION("Aptina 1.26MP YUV sensor driver"); MODULE_LICENSE("GPL v2");