| /* Copyright (c) 2011-2014, 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 |
| |
| /*#define CONFIG_MSMB_CAMERA_DEBUG*/ |
| #undef CDBG |
| #ifdef CONFIG_MSMB_CAMERA_DEBUG |
| #define CDBG(fmt, args...) pr_err(fmt, ##args) |
| #else |
| #define CDBG(fmt, args...) do { } while (0) |
| #endif |
| |
| /* 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); |
| rc = msm_sensor_platform_probe(pdev, match->data); |
| 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; |
| long 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.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_SET_SLAVE_INFO: { |
| struct msm_camera_sensor_slave_info sensor_slave_info; |
| struct msm_camera_power_ctrl_t *p_ctrl; |
| uint16_t size; |
| int slave_index = 0; |
| if (copy_from_user(&sensor_slave_info, |
| (void *)cdata->cfg.setting, |
| sizeof(struct msm_camera_sensor_slave_info))) { |
| pr_err("%s:%d failed\n", __func__, __LINE__); |
| rc = -EFAULT; |
| break; |
| } |
| /* Update sensor slave address */ |
| if (sensor_slave_info.slave_addr) { |
| s_ctrl->sensor_i2c_client->cci_client->sid = |
| sensor_slave_info.slave_addr >> 1; |
| } |
| |
| /* Update sensor address type */ |
| s_ctrl->sensor_i2c_client->addr_type = |
| sensor_slave_info.addr_type; |
| |
| /* Update power up / down sequence */ |
| p_ctrl = &s_ctrl->sensordata->power_info; |
| size = sensor_slave_info.power_setting_array.size; |
| if (p_ctrl->power_setting_size < size) { |
| struct msm_sensor_power_setting *tmp; |
| tmp = kmalloc(sizeof(struct msm_sensor_power_setting) |
| * size, GFP_KERNEL); |
| if (!tmp) { |
| pr_err("%s: failed to alloc mem\n", __func__); |
| rc = -ENOMEM; |
| break; |
| } |
| kfree(p_ctrl->power_setting); |
| p_ctrl->power_setting = tmp; |
| } |
| p_ctrl->power_setting_size = size; |
| |
| rc = copy_from_user(p_ctrl->power_setting, (void *) |
| sensor_slave_info.power_setting_array.power_setting, |
| size * sizeof(struct msm_sensor_power_setting)); |
| if (rc) { |
| pr_err("%s:%d failed\n", __func__, __LINE__); |
| rc = -EFAULT; |
| break; |
| } |
| CDBG("%s sensor id %x\n", __func__, |
| sensor_slave_info.slave_addr); |
| CDBG("%s sensor addr type %d\n", __func__, |
| sensor_slave_info.addr_type); |
| CDBG("%s sensor reg %x\n", __func__, |
| sensor_slave_info.sensor_id_info.sensor_id_reg_addr); |
| CDBG("%s sensor id %x\n", __func__, |
| sensor_slave_info.sensor_id_info.sensor_id); |
| for (slave_index = 0; slave_index < |
| p_ctrl->power_setting_size; slave_index++) { |
| CDBG("%s i %d power setting %d %d %ld %d\n", __func__, |
| slave_index, |
| p_ctrl->power_setting[slave_index].seq_type, |
| p_ctrl->power_setting[slave_index].seq_val, |
| p_ctrl->power_setting[slave_index].config_val, |
| p_ctrl->power_setting[slave_index].delay); |
| } |
| 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; |
| } |
| |
| 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_WRITE_I2C_SEQ_ARRAY: { |
| struct msm_camera_i2c_seq_reg_setting conf_array; |
| struct msm_camera_i2c_seq_reg_array *reg_setting = NULL; |
| |
| if (copy_from_user(&conf_array, |
| (void *)cdata->cfg.setting, |
| sizeof(struct msm_camera_i2c_seq_reg_setting))) { |
| pr_err("%s:%d failed\n", __func__, __LINE__); |
| rc = -EFAULT; |
| break; |
| } |
| |
| reg_setting = kzalloc(conf_array.size * |
| (sizeof(struct msm_camera_i2c_seq_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_seq_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_seq_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; |
| } |
| default: |
| rc = -EFAULT; |
| break; |
| } |
| |
| mutex_unlock(s_ctrl->msm_sensor_mutex); |
| |
| return rc; |
| } |
| |
| static struct msm_sensor_fn_t mt9m114_sensor_func_tbl = { |
| .sensor_config = mt9m114_sensor_config, |
| .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"); |