1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * mt9m114.c onsemi MT9M114 sensor driver 4 * 5 * Copyright (c) 2020-2023 Laurent Pinchart <laurent.pinchart@ideasonboard.com> 6 * Copyright (c) 2012 Analog Devices Inc. 7 * 8 * Almost complete rewrite of work by Scott Jiang <Scott.Jiang.Linux@gmail.com> 9 * itself based on work from Andrew Chew <achew@nvidia.com>. 10 */ 11 12 #include <linux/clk.h> 13 #include <linux/delay.h> 14 #include <linux/errno.h> 15 #include <linux/gpio/consumer.h> 16 #include <linux/i2c.h> 17 #include <linux/mod_devicetable.h> 18 #include <linux/module.h> 19 #include <linux/mutex.h> 20 #include <linux/pm_runtime.h> 21 #include <linux/regmap.h> 22 #include <linux/regulator/consumer.h> 23 #include <linux/types.h> 24 #include <linux/videodev2.h> 25 26 #include <media/v4l2-async.h> 27 #include <media/v4l2-cci.h> 28 #include <media/v4l2-ctrls.h> 29 #include <media/v4l2-device.h> 30 #include <media/v4l2-fwnode.h> 31 #include <media/v4l2-mediabus.h> 32 #include <media/v4l2-subdev.h> 33 34 /* Sysctl registers */ 35 #define MT9M114_CHIP_ID CCI_REG16(0x0000) 36 #define MT9M114_COMMAND_REGISTER CCI_REG16(0x0080) 37 #define MT9M114_COMMAND_REGISTER_APPLY_PATCH BIT(0) 38 #define MT9M114_COMMAND_REGISTER_SET_STATE BIT(1) 39 #define MT9M114_COMMAND_REGISTER_REFRESH BIT(2) 40 #define MT9M114_COMMAND_REGISTER_WAIT_FOR_EVENT BIT(3) 41 #define MT9M114_COMMAND_REGISTER_OK BIT(15) 42 #define MT9M114_RESET_AND_MISC_CONTROL CCI_REG16(0x001a) 43 #define MT9M114_RESET_SOC BIT(0) 44 #define MT9M114_PAD_SLEW CCI_REG16(0x001e) 45 #define MT9M114_PAD_CONTROL CCI_REG16(0x0032) 46 47 /* XDMA registers */ 48 #define MT9M114_ACCESS_CTL_STAT CCI_REG16(0x0982) 49 #define MT9M114_PHYSICAL_ADDRESS_ACCESS CCI_REG16(0x098a) 50 #define MT9M114_LOGICAL_ADDRESS_ACCESS CCI_REG16(0x098e) 51 52 /* Sensor Core registers */ 53 #define MT9M114_COARSE_INTEGRATION_TIME CCI_REG16(0x3012) 54 #define MT9M114_FINE_INTEGRATION_TIME CCI_REG16(0x3014) 55 #define MT9M114_RESET_REGISTER CCI_REG16(0x301a) 56 #define MT9M114_RESET_REGISTER_LOCK_REG BIT(3) 57 #define MT9M114_RESET_REGISTER_MASK_BAD BIT(9) 58 #define MT9M114_FLASH CCI_REG16(0x3046) 59 #define MT9M114_GREEN1_GAIN CCI_REG16(0x3056) 60 #define MT9M114_BLUE_GAIN CCI_REG16(0x3058) 61 #define MT9M114_RED_GAIN CCI_REG16(0x305a) 62 #define MT9M114_GREEN2_GAIN CCI_REG16(0x305c) 63 #define MT9M114_GLOBAL_GAIN CCI_REG16(0x305e) 64 #define MT9M114_GAIN_DIGITAL_GAIN(n) ((n) << 12) 65 #define MT9M114_GAIN_DIGITAL_GAIN_MASK (0xf << 12) 66 #define MT9M114_GAIN_ANALOG_GAIN(n) ((n) << 0) 67 #define MT9M114_GAIN_ANALOG_GAIN_MASK (0xff << 0) 68 #define MT9M114_CUSTOMER_REV CCI_REG16(0x31fe) 69 70 /* Monitor registers */ 71 #define MT9M114_MON_MAJOR_VERSION CCI_REG16(0x8000) 72 #define MT9M114_MON_MINOR_VERSION CCI_REG16(0x8002) 73 #define MT9M114_MON_RELEASE_VERSION CCI_REG16(0x8004) 74 75 /* Auto-Exposure Track registers */ 76 #define MT9M114_AE_TRACK_ALGO CCI_REG16(0xa804) 77 #define MT9M114_AE_TRACK_EXEC_AUTOMATIC_EXPOSURE BIT(0) 78 #define MT9M114_AE_TRACK_AE_TRACKING_DAMPENING_SPEED CCI_REG8(0xa80a) 79 80 /* Color Correction Matrix registers */ 81 #define MT9M114_CCM_ALGO CCI_REG16(0xb404) 82 #define MT9M114_CCM_EXEC_CALC_CCM_MATRIX BIT(4) 83 #define MT9M114_CCM_DELTA_GAIN CCI_REG8(0xb42a) 84 85 /* Camera Control registers */ 86 #define MT9M114_CAM_SENSOR_CFG_Y_ADDR_START CCI_REG16(0xc800) 87 #define MT9M114_CAM_SENSOR_CFG_X_ADDR_START CCI_REG16(0xc802) 88 #define MT9M114_CAM_SENSOR_CFG_Y_ADDR_END CCI_REG16(0xc804) 89 #define MT9M114_CAM_SENSOR_CFG_X_ADDR_END CCI_REG16(0xc806) 90 #define MT9M114_CAM_SENSOR_CFG_PIXCLK CCI_REG32(0xc808) 91 #define MT9M114_CAM_SENSOR_CFG_ROW_SPEED CCI_REG16(0xc80c) 92 #define MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MIN CCI_REG16(0xc80e) 93 #define MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MAX CCI_REG16(0xc810) 94 #define MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES CCI_REG16(0xc812) 95 #define MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES_MAX 65535 96 #define MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK CCI_REG16(0xc814) 97 #define MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK_MAX 8191 98 #define MT9M114_CAM_SENSOR_CFG_FINE_CORRECTION CCI_REG16(0xc816) 99 #define MT9M114_CAM_SENSOR_CFG_CPIPE_LAST_ROW CCI_REG16(0xc818) 100 #define MT9M114_CAM_SENSOR_CFG_REG_0_DATA CCI_REG16(0xc826) 101 #define MT9M114_CAM_SENSOR_CONTROL_READ_MODE CCI_REG16(0xc834) 102 #define MT9M114_CAM_SENSOR_CONTROL_HORZ_MIRROR_EN BIT(0) 103 #define MT9M114_CAM_SENSOR_CONTROL_VERT_FLIP_EN BIT(1) 104 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_NORMAL (0 << 4) 105 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SKIPPING (1 << 4) 106 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_AVERAGE (2 << 4) 107 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SUMMING (3 << 4) 108 #define MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_MASK (3 << 4) 109 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_NORMAL (0 << 8) 110 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SKIPPING (1 << 8) 111 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SUMMING (3 << 8) 112 #define MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_MASK (3 << 8) 113 #define MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN CCI_REG16(0xc836) 114 #define MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME CCI_REG16(0xc83c) 115 #define MT9M114_CAM_SENSOR_CONTROL_FINE_INTEGRATION_TIME CCI_REG16(0xc83e) 116 #define MT9M114_CAM_MODE_SELECT CCI_REG8(0xc84c) 117 #define MT9M114_CAM_MODE_SELECT_NORMAL (0 << 0) 118 #define MT9M114_CAM_MODE_SELECT_LENS_CALIBRATION (1 << 0) 119 #define MT9M114_CAM_MODE_SELECT_TEST_PATTERN (2 << 0) 120 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT CCI_REG8(0xc84d) 121 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID (1 << 0) 122 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID_BARS (4 << 0) 123 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_RANDOM (5 << 0) 124 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_FADING_BARS (8 << 0) 125 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_10B (10 << 0) 126 #define MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_8B (11 << 0) 127 #define MT9M114_CAM_MODE_TEST_PATTERN_RED CCI_REG16(0xc84e) 128 #define MT9M114_CAM_MODE_TEST_PATTERN_GREEN CCI_REG16(0xc850) 129 #define MT9M114_CAM_MODE_TEST_PATTERN_BLUE CCI_REG16(0xc852) 130 #define MT9M114_CAM_CROP_WINDOW_XOFFSET CCI_REG16(0xc854) 131 #define MT9M114_CAM_CROP_WINDOW_YOFFSET CCI_REG16(0xc856) 132 #define MT9M114_CAM_CROP_WINDOW_WIDTH CCI_REG16(0xc858) 133 #define MT9M114_CAM_CROP_WINDOW_HEIGHT CCI_REG16(0xc85a) 134 #define MT9M114_CAM_CROP_CROPMODE CCI_REG8(0xc85c) 135 #define MT9M114_CAM_CROP_MODE_AE_AUTO_CROP_EN BIT(0) 136 #define MT9M114_CAM_CROP_MODE_AWB_AUTO_CROP_EN BIT(1) 137 #define MT9M114_CAM_OUTPUT_WIDTH CCI_REG16(0xc868) 138 #define MT9M114_CAM_OUTPUT_HEIGHT CCI_REG16(0xc86a) 139 #define MT9M114_CAM_OUTPUT_FORMAT CCI_REG16(0xc86c) 140 #define MT9M114_CAM_OUTPUT_FORMAT_SWAP_RED_BLUE BIT(0) 141 #define MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES BIT(1) 142 #define MT9M114_CAM_OUTPUT_FORMAT_MONO_ENABLE BIT(2) 143 #define MT9M114_CAM_OUTPUT_FORMAT_BT656_ENABLE BIT(3) 144 #define MT9M114_CAM_OUTPUT_FORMAT_BT656_CROP_SCALE_DISABLE BIT(4) 145 #define MT9M114_CAM_OUTPUT_FORMAT_FVLV_DISABLE BIT(5) 146 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV (0 << 8) 147 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB (1 << 8) 148 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER (2 << 8) 149 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_NONE (3 << 8) 150 #define MT9M114_CAM_OUTPUT_FORMAT_FORMAT_MASK (3 << 8) 151 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_RAWR10 (0 << 10) 152 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PRELSC_8_2 (1 << 10) 153 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_POSTLSC_8_2 (2 << 10) 154 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PROCESSED8 (3 << 10) 155 #define MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_MASK (3 << 10) 156 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB (0 << 12) 157 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_555RGB (1 << 12) 158 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_444xRGB (2 << 12) 159 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_444RGBx (3 << 12) 160 #define MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_MASK (3 << 12) 161 #define MT9M114_CAM_OUTPUT_FORMAT_YUV CCI_REG16(0xc86e) 162 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_CLIP BIT(5) 163 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_AUV_OFFSET BIT(4) 164 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SELECT_601 BIT(3) 165 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_NORMALISE BIT(2) 166 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_EVEN_UV (0 << 0) 167 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_ODD_UV (1 << 0) 168 #define MT9M114_CAM_OUTPUT_FORMAT_YUV_SAMPLING_EVENU_ODDV (2 << 0) 169 #define MT9M114_CAM_OUTPUT_Y_OFFSET CCI_REG8(0xc870) 170 #define MT9M114_CAM_AET_AEMODE CCI_REG8(0xc878) 171 #define MT9M114_CAM_AET_EXEC_SET_INDOOR BIT(0) 172 #define MT9M114_CAM_AET_DISCRETE_FRAMERATE BIT(1) 173 #define MT9M114_CAM_AET_ADAPTATIVE_TARGET_LUMA BIT(2) 174 #define MT9M114_CAM_AET_ADAPTATIVE_SKIP_FRAMES BIT(3) 175 #define MT9M114_CAM_AET_SKIP_FRAMES CCI_REG8(0xc879) 176 #define MT9M114_CAM_AET_TARGET_AVERAGE_LUMA CCI_REG8(0xc87a) 177 #define MT9M114_CAM_AET_TARGET_AVERAGE_LUMA_DARK CCI_REG8(0xc87b) 178 #define MT9M114_CAM_AET_BLACK_CLIPPING_TARGET CCI_REG16(0xc87c) 179 #define MT9M114_CAM_AET_AE_MIN_VIRT_INT_TIME_PCLK CCI_REG16(0xc87e) 180 #define MT9M114_CAM_AET_AE_MIN_VIRT_DGAIN CCI_REG16(0xc880) 181 #define MT9M114_CAM_AET_AE_MAX_VIRT_DGAIN CCI_REG16(0xc882) 182 #define MT9M114_CAM_AET_AE_MIN_VIRT_AGAIN CCI_REG16(0xc884) 183 #define MT9M114_CAM_AET_AE_MAX_VIRT_AGAIN CCI_REG16(0xc886) 184 #define MT9M114_CAM_AET_AE_VIRT_GAIN_TH_EG CCI_REG16(0xc888) 185 #define MT9M114_CAM_AET_AE_EG_GATE_PERCENTAGE CCI_REG8(0xc88a) 186 #define MT9M114_CAM_AET_FLICKER_FREQ_HZ CCI_REG8(0xc88b) 187 #define MT9M114_CAM_AET_MAX_FRAME_RATE CCI_REG16(0xc88c) 188 #define MT9M114_CAM_AET_MIN_FRAME_RATE CCI_REG16(0xc88e) 189 #define MT9M114_CAM_AET_TARGET_GAIN CCI_REG16(0xc890) 190 #define MT9M114_CAM_AWB_CCM_L(n) CCI_REG16(0xc892 + (n) * 2) 191 #define MT9M114_CAM_AWB_CCM_M(n) CCI_REG16(0xc8a4 + (n) * 2) 192 #define MT9M114_CAM_AWB_CCM_R(n) CCI_REG16(0xc8b6 + (n) * 2) 193 #define MT9M114_CAM_AWB_CCM_L_RG_GAIN CCI_REG16(0xc8c8) 194 #define MT9M114_CAM_AWB_CCM_L_BG_GAIN CCI_REG16(0xc8ca) 195 #define MT9M114_CAM_AWB_CCM_M_RG_GAIN CCI_REG16(0xc8cc) 196 #define MT9M114_CAM_AWB_CCM_M_BG_GAIN CCI_REG16(0xc8ce) 197 #define MT9M114_CAM_AWB_CCM_R_RG_GAIN CCI_REG16(0xc8d0) 198 #define MT9M114_CAM_AWB_CCM_R_BG_GAIN CCI_REG16(0xc8d2) 199 #define MT9M114_CAM_AWB_CCM_L_CTEMP CCI_REG16(0xc8d4) 200 #define MT9M114_CAM_AWB_CCM_M_CTEMP CCI_REG16(0xc8d6) 201 #define MT9M114_CAM_AWB_CCM_R_CTEMP CCI_REG16(0xc8d8) 202 #define MT9M114_CAM_AWB_AWB_XSCALE CCI_REG8(0xc8f2) 203 #define MT9M114_CAM_AWB_AWB_YSCALE CCI_REG8(0xc8f3) 204 #define MT9M114_CAM_AWB_AWB_WEIGHTS(n) CCI_REG16(0xc8f4 + (n) * 2) 205 #define MT9M114_CAM_AWB_AWB_XSHIFT_PRE_ADJ CCI_REG16(0xc904) 206 #define MT9M114_CAM_AWB_AWB_YSHIFT_PRE_ADJ CCI_REG16(0xc906) 207 #define MT9M114_CAM_AWB_AWBMODE CCI_REG8(0xc909) 208 #define MT9M114_CAM_AWB_MODE_AUTO BIT(1) 209 #define MT9M114_CAM_AWB_MODE_EXCLUSIVE_AE BIT(0) 210 #define MT9M114_CAM_AWB_K_R_L CCI_REG8(0xc90c) 211 #define MT9M114_CAM_AWB_K_G_L CCI_REG8(0xc90d) 212 #define MT9M114_CAM_AWB_K_B_L CCI_REG8(0xc90e) 213 #define MT9M114_CAM_AWB_K_R_R CCI_REG8(0xc90f) 214 #define MT9M114_CAM_AWB_K_G_R CCI_REG8(0xc910) 215 #define MT9M114_CAM_AWB_K_B_R CCI_REG8(0xc911) 216 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART CCI_REG16(0xc914) 217 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART CCI_REG16(0xc916) 218 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND CCI_REG16(0xc918) 219 #define MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YEND CCI_REG16(0xc91a) 220 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XSTART CCI_REG16(0xc91c) 221 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YSTART CCI_REG16(0xc91e) 222 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XEND CCI_REG16(0xc920) 223 #define MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YEND CCI_REG16(0xc922) 224 #define MT9M114_CAM_LL_LLMODE CCI_REG16(0xc924) 225 #define MT9M114_CAM_LL_START_BRIGHTNESS CCI_REG16(0xc926) 226 #define MT9M114_CAM_LL_STOP_BRIGHTNESS CCI_REG16(0xc928) 227 #define MT9M114_CAM_LL_START_SATURATION CCI_REG8(0xc92a) 228 #define MT9M114_CAM_LL_END_SATURATION CCI_REG8(0xc92b) 229 #define MT9M114_CAM_LL_START_DESATURATION CCI_REG8(0xc92c) 230 #define MT9M114_CAM_LL_END_DESATURATION CCI_REG8(0xc92d) 231 #define MT9M114_CAM_LL_START_DEMOSAICING CCI_REG8(0xc92e) 232 #define MT9M114_CAM_LL_START_AP_GAIN CCI_REG8(0xc92f) 233 #define MT9M114_CAM_LL_START_AP_THRESH CCI_REG8(0xc930) 234 #define MT9M114_CAM_LL_STOP_DEMOSAICING CCI_REG8(0xc931) 235 #define MT9M114_CAM_LL_STOP_AP_GAIN CCI_REG8(0xc932) 236 #define MT9M114_CAM_LL_STOP_AP_THRESH CCI_REG8(0xc933) 237 #define MT9M114_CAM_LL_START_NR_RED CCI_REG8(0xc934) 238 #define MT9M114_CAM_LL_START_NR_GREEN CCI_REG8(0xc935) 239 #define MT9M114_CAM_LL_START_NR_BLUE CCI_REG8(0xc936) 240 #define MT9M114_CAM_LL_START_NR_THRESH CCI_REG8(0xc937) 241 #define MT9M114_CAM_LL_STOP_NR_RED CCI_REG8(0xc938) 242 #define MT9M114_CAM_LL_STOP_NR_GREEN CCI_REG8(0xc939) 243 #define MT9M114_CAM_LL_STOP_NR_BLUE CCI_REG8(0xc93a) 244 #define MT9M114_CAM_LL_STOP_NR_THRESH CCI_REG8(0xc93b) 245 #define MT9M114_CAM_LL_START_CONTRAST_BM CCI_REG16(0xc93c) 246 #define MT9M114_CAM_LL_STOP_CONTRAST_BM CCI_REG16(0xc93e) 247 #define MT9M114_CAM_LL_GAMMA CCI_REG16(0xc940) 248 #define MT9M114_CAM_LL_START_CONTRAST_GRADIENT CCI_REG8(0xc942) 249 #define MT9M114_CAM_LL_STOP_CONTRAST_GRADIENT CCI_REG8(0xc943) 250 #define MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE CCI_REG8(0xc944) 251 #define MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE CCI_REG8(0xc945) 252 #define MT9M114_CAM_LL_START_GAIN_METRIC CCI_REG16(0xc946) 253 #define MT9M114_CAM_LL_STOP_GAIN_METRIC CCI_REG16(0xc948) 254 #define MT9M114_CAM_LL_START_FADE_TO_BLACK_LUMA CCI_REG16(0xc94a) 255 #define MT9M114_CAM_LL_STOP_FADE_TO_BLACK_LUMA CCI_REG16(0xc94c) 256 #define MT9M114_CAM_LL_CLUSTER_DC_TH_BM CCI_REG16(0xc94e) 257 #define MT9M114_CAM_LL_CLUSTER_DC_GATE_PERCENTAGE CCI_REG8(0xc950) 258 #define MT9M114_CAM_LL_SUMMING_SENSITIVITY_FACTOR CCI_REG8(0xc951) 259 #define MT9M114_CAM_LL_START_TARGET_LUMA_BM CCI_REG16(0xc952) 260 #define MT9M114_CAM_LL_STOP_TARGET_LUMA_BM CCI_REG16(0xc954) 261 #define MT9M114_CAM_PGA_PGA_CONTROL CCI_REG16(0xc95e) 262 #define MT9M114_CAM_SYSCTL_PLL_ENABLE CCI_REG8(0xc97e) 263 #define MT9M114_CAM_SYSCTL_PLL_ENABLE_VALUE BIT(0) 264 #define MT9M114_CAM_SYSCTL_PLL_DISABLE_VALUE 0x00 265 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_M_N CCI_REG16(0xc980) 266 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_VALUE(m, n) (((n) << 8) | (m)) 267 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_P CCI_REG16(0xc982) 268 #define MT9M114_CAM_SYSCTL_PLL_DIVIDER_P_VALUE(p) ((p) << 8) 269 #define MT9M114_CAM_PORT_OUTPUT_CONTROL CCI_REG16(0xc984) 270 #define MT9M114_CAM_PORT_PORT_SELECT_PARALLEL (0 << 0) 271 #define MT9M114_CAM_PORT_PORT_SELECT_MIPI (1 << 0) 272 #define MT9M114_CAM_PORT_CLOCK_SLOWDOWN BIT(3) 273 #define MT9M114_CAM_PORT_TRUNCATE_RAW_BAYER BIT(4) 274 #define MT9M114_CAM_PORT_PIXCLK_GATE BIT(5) 275 #define MT9M114_CAM_PORT_CONT_MIPI_CLK BIT(6) 276 #define MT9M114_CAM_PORT_CHAN_NUM(vc) ((vc) << 8) 277 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_ZERO CCI_REG16(0xc988) 278 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_ZERO_VALUE(n) ((n) << 8) 279 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_EXIT_TRAIL CCI_REG16(0xc98a) 280 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_EXIT_VALUE(n) ((n) << 8) 281 #define MT9M114_CAM_PORT_MIPI_TIMING_T_HS_TRAIL_VALUE(n) ((n) << 0) 282 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_POST_PRE CCI_REG16(0xc98c) 283 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_POST_VALUE(n) ((n) << 8) 284 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_PRE_VALUE(n) ((n) << 0) 285 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_TRAIL_ZERO CCI_REG16(0xc98e) 286 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_TRAIL_VALUE(n) ((n) << 8) 287 #define MT9M114_CAM_PORT_MIPI_TIMING_T_CLK_ZERO_VALUE(n) ((n) << 0) 288 289 /* System Manager registers */ 290 #define MT9M114_SYSMGR_NEXT_STATE CCI_REG8(0xdc00) 291 #define MT9M114_SYSMGR_CURRENT_STATE CCI_REG8(0xdc01) 292 #define MT9M114_SYSMGR_CMD_STATUS CCI_REG8(0xdc02) 293 294 /* Patch Loader registers */ 295 #define MT9M114_PATCHLDR_LOADER_ADDRESS CCI_REG16(0xe000) 296 #define MT9M114_PATCHLDR_PATCH_ID CCI_REG16(0xe002) 297 #define MT9M114_PATCHLDR_FIRMWARE_ID CCI_REG32(0xe004) 298 #define MT9M114_PATCHLDR_APPLY_STATUS CCI_REG8(0xe008) 299 #define MT9M114_PATCHLDR_NUM_PATCHES CCI_REG8(0xe009) 300 #define MT9M114_PATCHLDR_PATCH_ID_0 CCI_REG16(0xe00a) 301 #define MT9M114_PATCHLDR_PATCH_ID_1 CCI_REG16(0xe00c) 302 #define MT9M114_PATCHLDR_PATCH_ID_2 CCI_REG16(0xe00e) 303 #define MT9M114_PATCHLDR_PATCH_ID_3 CCI_REG16(0xe010) 304 #define MT9M114_PATCHLDR_PATCH_ID_4 CCI_REG16(0xe012) 305 #define MT9M114_PATCHLDR_PATCH_ID_5 CCI_REG16(0xe014) 306 #define MT9M114_PATCHLDR_PATCH_ID_6 CCI_REG16(0xe016) 307 #define MT9M114_PATCHLDR_PATCH_ID_7 CCI_REG16(0xe018) 308 309 /* SYS_STATE values (for SYSMGR_NEXT_STATE and SYSMGR_CURRENT_STATE) */ 310 #define MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE 0x28 311 #define MT9M114_SYS_STATE_STREAMING 0x31 312 #define MT9M114_SYS_STATE_START_STREAMING 0x34 313 #define MT9M114_SYS_STATE_ENTER_SUSPEND 0x40 314 #define MT9M114_SYS_STATE_SUSPENDED 0x41 315 #define MT9M114_SYS_STATE_ENTER_STANDBY 0x50 316 #define MT9M114_SYS_STATE_STANDBY 0x52 317 #define MT9M114_SYS_STATE_LEAVE_STANDBY 0x54 318 319 /* Result status of last SET_STATE comamnd */ 320 #define MT9M114_SET_STATE_RESULT_ENOERR 0x00 321 #define MT9M114_SET_STATE_RESULT_EINVAL 0x0c 322 #define MT9M114_SET_STATE_RESULT_ENOSPC 0x0d 323 324 /* 325 * The minimum amount of horizontal and vertical blanking is undocumented. The 326 * minimum values that have been seen in register lists are 303 and 38, use 327 * them. 328 * 329 * Set the default to achieve 1280x960 at 30fps. 330 */ 331 #define MT9M114_MIN_HBLANK 303 332 #define MT9M114_MIN_VBLANK 38 333 #define MT9M114_DEF_HBLANK 323 334 #define MT9M114_DEF_VBLANK 39 335 336 #define MT9M114_DEF_FRAME_RATE 30 337 #define MT9M114_MAX_FRAME_RATE 120 338 339 #define MT9M114_PIXEL_ARRAY_WIDTH 1296U 340 #define MT9M114_PIXEL_ARRAY_HEIGHT 976U 341 342 /* 343 * These values are not well documented and are semi-arbitrary. The pixel array 344 * minimum output size is 8 pixels larger than the minimum scaler cropped input 345 * width to account for the demosaicing. 346 */ 347 #define MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH (32U + 8U) 348 #define MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT (32U + 8U) 349 #define MT9M114_SCALER_CROPPED_INPUT_WIDTH 32U 350 #define MT9M114_SCALER_CROPPED_INPUT_HEIGHT 32U 351 352 /* Indices into the mt9m114.ifp.tpg array. */ 353 #define MT9M114_TPG_PATTERN 0 354 #define MT9M114_TPG_RED 1 355 #define MT9M114_TPG_GREEN 2 356 #define MT9M114_TPG_BLUE 3 357 358 /* ----------------------------------------------------------------------------- 359 * Data Structures 360 */ 361 362 enum mt9m114_format_flag { 363 MT9M114_FMT_FLAG_PARALLEL = BIT(0), 364 MT9M114_FMT_FLAG_CSI2 = BIT(1), 365 }; 366 367 struct mt9m114_format_info { 368 u32 code; 369 u32 output_format; 370 u32 flags; 371 }; 372 373 struct mt9m114 { 374 struct i2c_client *client; 375 struct regmap *regmap; 376 377 struct clk *clk; 378 struct gpio_desc *reset; 379 struct regulator_bulk_data supplies[3]; 380 struct v4l2_fwnode_endpoint bus_cfg; 381 bool bypass_pll; 382 383 struct { 384 unsigned int m; 385 unsigned int n; 386 unsigned int p; 387 } pll; 388 389 unsigned int pixrate; 390 bool streaming; 391 392 /* Pixel Array */ 393 struct { 394 struct v4l2_subdev sd; 395 struct media_pad pad; 396 397 struct v4l2_ctrl_handler hdl; 398 struct v4l2_ctrl *exposure; 399 struct v4l2_ctrl *gain; 400 struct v4l2_ctrl *hblank; 401 struct v4l2_ctrl *vblank; 402 } pa; 403 404 /* Image Flow Processor */ 405 struct { 406 struct v4l2_subdev sd; 407 struct media_pad pads[2]; 408 409 struct v4l2_ctrl_handler hdl; 410 unsigned int frame_rate; 411 412 struct v4l2_ctrl *tpg[4]; 413 } ifp; 414 }; 415 416 /* ----------------------------------------------------------------------------- 417 * Formats 418 */ 419 420 static const struct mt9m114_format_info mt9m114_format_infos[] = { 421 { 422 /* 423 * The first two entries are used as defaults, for parallel and 424 * CSI-2 buses respectively. Keep them in that order. 425 */ 426 .code = MEDIA_BUS_FMT_UYVY8_2X8, 427 .flags = MT9M114_FMT_FLAG_PARALLEL, 428 .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV, 429 }, { 430 .code = MEDIA_BUS_FMT_UYVY8_1X16, 431 .flags = MT9M114_FMT_FLAG_CSI2, 432 .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV, 433 }, { 434 .code = MEDIA_BUS_FMT_YUYV8_2X8, 435 .flags = MT9M114_FMT_FLAG_PARALLEL, 436 .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV 437 | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES, 438 }, { 439 .code = MEDIA_BUS_FMT_YUYV8_1X16, 440 .flags = MT9M114_FMT_FLAG_CSI2, 441 .output_format = MT9M114_CAM_OUTPUT_FORMAT_FORMAT_YUV 442 | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES, 443 }, { 444 .code = MEDIA_BUS_FMT_RGB565_2X8_LE, 445 .flags = MT9M114_FMT_FLAG_PARALLEL, 446 .output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB 447 | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB 448 | MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES, 449 }, { 450 .code = MEDIA_BUS_FMT_RGB565_2X8_BE, 451 .flags = MT9M114_FMT_FLAG_PARALLEL, 452 .output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB 453 | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB, 454 }, { 455 .code = MEDIA_BUS_FMT_RGB565_1X16, 456 .flags = MT9M114_FMT_FLAG_CSI2, 457 .output_format = MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_565RGB 458 | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_RGB, 459 }, { 460 .code = MEDIA_BUS_FMT_SGRBG8_1X8, 461 .output_format = MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_PROCESSED8 462 | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER, 463 .flags = MT9M114_FMT_FLAG_PARALLEL | MT9M114_FMT_FLAG_CSI2, 464 }, { 465 /* Keep the format compatible with the IFP sink pad last. */ 466 .code = MEDIA_BUS_FMT_SGRBG10_1X10, 467 .output_format = MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_RAWR10 468 | MT9M114_CAM_OUTPUT_FORMAT_FORMAT_BAYER, 469 .flags = MT9M114_FMT_FLAG_PARALLEL | MT9M114_FMT_FLAG_CSI2, 470 } 471 }; 472 473 static const struct mt9m114_format_info * 474 mt9m114_default_format_info(struct mt9m114 *sensor) 475 { 476 if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) 477 return &mt9m114_format_infos[1]; 478 else 479 return &mt9m114_format_infos[0]; 480 } 481 482 static const struct mt9m114_format_info * 483 mt9m114_format_info(struct mt9m114 *sensor, unsigned int pad, u32 code) 484 { 485 const unsigned int num_formats = ARRAY_SIZE(mt9m114_format_infos); 486 unsigned int flag; 487 unsigned int i; 488 489 switch (pad) { 490 case 0: 491 return &mt9m114_format_infos[num_formats - 1]; 492 493 case 1: 494 if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) 495 flag = MT9M114_FMT_FLAG_CSI2; 496 else 497 flag = MT9M114_FMT_FLAG_PARALLEL; 498 499 for (i = 0; i < num_formats; ++i) { 500 const struct mt9m114_format_info *info = 501 &mt9m114_format_infos[i]; 502 503 if (info->code == code && info->flags & flag) 504 return info; 505 } 506 507 return mt9m114_default_format_info(sensor); 508 509 default: 510 return NULL; 511 } 512 } 513 514 /* ----------------------------------------------------------------------------- 515 * Initialization 516 */ 517 518 static const struct cci_reg_sequence mt9m114_init[] = { 519 { MT9M114_RESET_REGISTER, MT9M114_RESET_REGISTER_MASK_BAD | 520 MT9M114_RESET_REGISTER_LOCK_REG | 521 0x0010 }, 522 523 /* Sensor optimization */ 524 { CCI_REG16(0x316a), 0x8270 }, 525 { CCI_REG16(0x316c), 0x8270 }, 526 { CCI_REG16(0x3ed0), 0x2305 }, 527 { CCI_REG16(0x3ed2), 0x77cf }, 528 { CCI_REG16(0x316e), 0x8202 }, 529 { CCI_REG16(0x3180), 0x87ff }, 530 { CCI_REG16(0x30d4), 0x6080 }, 531 { CCI_REG16(0xa802), 0x0008 }, 532 533 { CCI_REG16(0x3e14), 0xff39 }, 534 535 /* APGA */ 536 { MT9M114_CAM_PGA_PGA_CONTROL, 0x0000 }, 537 538 /* Automatic White balance */ 539 { MT9M114_CAM_AWB_CCM_L(0), 0x0267 }, 540 { MT9M114_CAM_AWB_CCM_L(1), 0xff1a }, 541 { MT9M114_CAM_AWB_CCM_L(2), 0xffb3 }, 542 { MT9M114_CAM_AWB_CCM_L(3), 0xff80 }, 543 { MT9M114_CAM_AWB_CCM_L(4), 0x0166 }, 544 { MT9M114_CAM_AWB_CCM_L(5), 0x0003 }, 545 { MT9M114_CAM_AWB_CCM_L(6), 0xff9a }, 546 { MT9M114_CAM_AWB_CCM_L(7), 0xfeb4 }, 547 { MT9M114_CAM_AWB_CCM_L(8), 0x024d }, 548 { MT9M114_CAM_AWB_CCM_M(0), 0x01bf }, 549 { MT9M114_CAM_AWB_CCM_M(1), 0xff01 }, 550 { MT9M114_CAM_AWB_CCM_M(2), 0xfff3 }, 551 { MT9M114_CAM_AWB_CCM_M(3), 0xff75 }, 552 { MT9M114_CAM_AWB_CCM_M(4), 0x0198 }, 553 { MT9M114_CAM_AWB_CCM_M(5), 0xfffd }, 554 { MT9M114_CAM_AWB_CCM_M(6), 0xff9a }, 555 { MT9M114_CAM_AWB_CCM_M(7), 0xfee7 }, 556 { MT9M114_CAM_AWB_CCM_M(8), 0x02a8 }, 557 { MT9M114_CAM_AWB_CCM_R(0), 0x01d9 }, 558 { MT9M114_CAM_AWB_CCM_R(1), 0xff26 }, 559 { MT9M114_CAM_AWB_CCM_R(2), 0xfff3 }, 560 { MT9M114_CAM_AWB_CCM_R(3), 0xffb3 }, 561 { MT9M114_CAM_AWB_CCM_R(4), 0x0132 }, 562 { MT9M114_CAM_AWB_CCM_R(5), 0xffe8 }, 563 { MT9M114_CAM_AWB_CCM_R(6), 0xffda }, 564 { MT9M114_CAM_AWB_CCM_R(7), 0xfecd }, 565 { MT9M114_CAM_AWB_CCM_R(8), 0x02c2 }, 566 { MT9M114_CAM_AWB_CCM_L_RG_GAIN, 0x0075 }, 567 { MT9M114_CAM_AWB_CCM_L_BG_GAIN, 0x011c }, 568 { MT9M114_CAM_AWB_CCM_M_RG_GAIN, 0x009a }, 569 { MT9M114_CAM_AWB_CCM_M_BG_GAIN, 0x0105 }, 570 { MT9M114_CAM_AWB_CCM_R_RG_GAIN, 0x00a4 }, 571 { MT9M114_CAM_AWB_CCM_R_BG_GAIN, 0x00ac }, 572 { MT9M114_CAM_AWB_CCM_L_CTEMP, 0x0a8c }, 573 { MT9M114_CAM_AWB_CCM_M_CTEMP, 0x0f0a }, 574 { MT9M114_CAM_AWB_CCM_R_CTEMP, 0x1964 }, 575 { MT9M114_CAM_AWB_AWB_XSHIFT_PRE_ADJ, 51 }, 576 { MT9M114_CAM_AWB_AWB_YSHIFT_PRE_ADJ, 60 }, 577 { MT9M114_CAM_AWB_AWB_XSCALE, 3 }, 578 { MT9M114_CAM_AWB_AWB_YSCALE, 2 }, 579 { MT9M114_CAM_AWB_AWB_WEIGHTS(0), 0x0000 }, 580 { MT9M114_CAM_AWB_AWB_WEIGHTS(1), 0x0000 }, 581 { MT9M114_CAM_AWB_AWB_WEIGHTS(2), 0x0000 }, 582 { MT9M114_CAM_AWB_AWB_WEIGHTS(3), 0xe724 }, 583 { MT9M114_CAM_AWB_AWB_WEIGHTS(4), 0x1583 }, 584 { MT9M114_CAM_AWB_AWB_WEIGHTS(5), 0x2045 }, 585 { MT9M114_CAM_AWB_AWB_WEIGHTS(6), 0x03ff }, 586 { MT9M114_CAM_AWB_AWB_WEIGHTS(7), 0x007c }, 587 { MT9M114_CAM_AWB_K_R_L, 0x80 }, 588 { MT9M114_CAM_AWB_K_G_L, 0x80 }, 589 { MT9M114_CAM_AWB_K_B_L, 0x80 }, 590 { MT9M114_CAM_AWB_K_R_R, 0x88 }, 591 { MT9M114_CAM_AWB_K_G_R, 0x80 }, 592 { MT9M114_CAM_AWB_K_B_R, 0x80 }, 593 594 /* Low-Light Image Enhancements */ 595 { MT9M114_CAM_LL_START_BRIGHTNESS, 0x0020 }, 596 { MT9M114_CAM_LL_STOP_BRIGHTNESS, 0x009a }, 597 { MT9M114_CAM_LL_START_GAIN_METRIC, 0x0070 }, 598 { MT9M114_CAM_LL_STOP_GAIN_METRIC, 0x00f3 }, 599 { MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE, 0x20 }, 600 { MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE, 0x9a }, 601 { MT9M114_CAM_LL_START_SATURATION, 0x80 }, 602 { MT9M114_CAM_LL_END_SATURATION, 0x4b }, 603 { MT9M114_CAM_LL_START_DESATURATION, 0x00 }, 604 { MT9M114_CAM_LL_END_DESATURATION, 0xff }, 605 { MT9M114_CAM_LL_START_DEMOSAICING, 0x3c }, 606 { MT9M114_CAM_LL_START_AP_GAIN, 0x02 }, 607 { MT9M114_CAM_LL_START_AP_THRESH, 0x06 }, 608 { MT9M114_CAM_LL_STOP_DEMOSAICING, 0x64 }, 609 { MT9M114_CAM_LL_STOP_AP_GAIN, 0x01 }, 610 { MT9M114_CAM_LL_STOP_AP_THRESH, 0x0c }, 611 { MT9M114_CAM_LL_START_NR_RED, 0x3c }, 612 { MT9M114_CAM_LL_START_NR_GREEN, 0x3c }, 613 { MT9M114_CAM_LL_START_NR_BLUE, 0x3c }, 614 { MT9M114_CAM_LL_START_NR_THRESH, 0x0f }, 615 { MT9M114_CAM_LL_STOP_NR_RED, 0x64 }, 616 { MT9M114_CAM_LL_STOP_NR_GREEN, 0x64 }, 617 { MT9M114_CAM_LL_STOP_NR_BLUE, 0x64 }, 618 { MT9M114_CAM_LL_STOP_NR_THRESH, 0x32 }, 619 { MT9M114_CAM_LL_START_CONTRAST_BM, 0x0020 }, 620 { MT9M114_CAM_LL_STOP_CONTRAST_BM, 0x009a }, 621 { MT9M114_CAM_LL_GAMMA, 0x00dc }, 622 { MT9M114_CAM_LL_START_CONTRAST_GRADIENT, 0x38 }, 623 { MT9M114_CAM_LL_STOP_CONTRAST_GRADIENT, 0x30 }, 624 { MT9M114_CAM_LL_START_CONTRAST_LUMA_PERCENTAGE, 0x50 }, 625 { MT9M114_CAM_LL_STOP_CONTRAST_LUMA_PERCENTAGE, 0x19 }, 626 { MT9M114_CAM_LL_START_FADE_TO_BLACK_LUMA, 0x0230 }, 627 { MT9M114_CAM_LL_STOP_FADE_TO_BLACK_LUMA, 0x0010 }, 628 { MT9M114_CAM_LL_CLUSTER_DC_TH_BM, 0x01cd }, 629 { MT9M114_CAM_LL_CLUSTER_DC_GATE_PERCENTAGE, 0x05 }, 630 { MT9M114_CAM_LL_SUMMING_SENSITIVITY_FACTOR, 0x40 }, 631 632 /* Auto-Exposure */ 633 { MT9M114_CAM_AET_TARGET_AVERAGE_LUMA_DARK, 0x1b }, 634 { MT9M114_CAM_AET_AEMODE, 0x00 }, 635 { MT9M114_CAM_AET_TARGET_GAIN, 0x0080 }, 636 { MT9M114_CAM_AET_AE_MAX_VIRT_AGAIN, 0x0100 }, 637 { MT9M114_CAM_AET_BLACK_CLIPPING_TARGET, 0x005a }, 638 639 { MT9M114_CCM_DELTA_GAIN, 0x05 }, 640 { MT9M114_AE_TRACK_AE_TRACKING_DAMPENING_SPEED, 0x20 }, 641 642 /* Pixel array timings and integration time */ 643 { MT9M114_CAM_SENSOR_CFG_ROW_SPEED, 1 }, 644 { MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MIN, 219 }, 645 { MT9M114_CAM_SENSOR_CFG_FINE_INTEG_TIME_MAX, 1459 }, 646 { MT9M114_CAM_SENSOR_CFG_FINE_CORRECTION, 96 }, 647 { MT9M114_CAM_SENSOR_CFG_REG_0_DATA, 32 }, 648 649 /* Miscellaneous settings */ 650 { MT9M114_PAD_SLEW, 0x0777 }, 651 }; 652 653 /* ----------------------------------------------------------------------------- 654 * Hardware Configuration 655 */ 656 657 /* Wait for a command to complete. */ 658 static int mt9m114_poll_command(struct mt9m114 *sensor, u32 command) 659 { 660 unsigned int i; 661 u64 value; 662 int ret; 663 664 for (i = 0; i < 100; ++i) { 665 ret = cci_read(sensor->regmap, MT9M114_COMMAND_REGISTER, &value, 666 NULL); 667 if (ret < 0) 668 return ret; 669 670 if (!(value & command)) 671 break; 672 673 usleep_range(5000, 6000); 674 } 675 676 if (value & command) { 677 dev_err(&sensor->client->dev, "Command %u completion timeout\n", 678 command); 679 return -ETIMEDOUT; 680 } 681 682 if (!(value & MT9M114_COMMAND_REGISTER_OK)) { 683 dev_err(&sensor->client->dev, "Command %u failed\n", command); 684 return -EIO; 685 } 686 687 return 0; 688 } 689 690 /* Wait for a state to be entered. */ 691 static int mt9m114_poll_state(struct mt9m114 *sensor, u32 state) 692 { 693 unsigned int i; 694 u64 value; 695 int ret; 696 697 for (i = 0; i < 100; ++i) { 698 ret = cci_read(sensor->regmap, MT9M114_SYSMGR_CURRENT_STATE, 699 &value, NULL); 700 if (ret < 0) 701 return ret; 702 703 if (value == state) 704 return 0; 705 706 usleep_range(1000, 1500); 707 } 708 709 dev_err(&sensor->client->dev, "Timeout waiting for state 0x%02x\n", 710 state); 711 return -ETIMEDOUT; 712 } 713 714 static int mt9m114_set_state(struct mt9m114 *sensor, u8 next_state) 715 { 716 int ret = 0; 717 718 /* Set the next desired state and start the state transition. */ 719 cci_write(sensor->regmap, MT9M114_SYSMGR_NEXT_STATE, next_state, &ret); 720 cci_write(sensor->regmap, MT9M114_COMMAND_REGISTER, 721 MT9M114_COMMAND_REGISTER_OK | 722 MT9M114_COMMAND_REGISTER_SET_STATE, &ret); 723 if (ret < 0) 724 return ret; 725 726 /* Wait for the state transition to complete. */ 727 ret = mt9m114_poll_command(sensor, MT9M114_COMMAND_REGISTER_SET_STATE); 728 if (ret < 0) 729 return ret; 730 731 return 0; 732 } 733 734 static int mt9m114_initialize(struct mt9m114 *sensor) 735 { 736 u32 value; 737 int ret; 738 739 ret = cci_multi_reg_write(sensor->regmap, mt9m114_init, 740 ARRAY_SIZE(mt9m114_init), NULL); 741 if (ret < 0) { 742 dev_err(&sensor->client->dev, 743 "Failed to initialize the sensor\n"); 744 return ret; 745 } 746 747 /* Configure the PLL. */ 748 if (sensor->bypass_pll) { 749 cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_ENABLE, 750 MT9M114_CAM_SYSCTL_PLL_DISABLE_VALUE, &ret); 751 } else { 752 cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_ENABLE, 753 MT9M114_CAM_SYSCTL_PLL_ENABLE_VALUE, &ret); 754 cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_DIVIDER_M_N, 755 MT9M114_CAM_SYSCTL_PLL_DIVIDER_VALUE(sensor->pll.m, 756 sensor->pll.n), 757 &ret); 758 cci_write(sensor->regmap, MT9M114_CAM_SYSCTL_PLL_DIVIDER_P, 759 MT9M114_CAM_SYSCTL_PLL_DIVIDER_P_VALUE(sensor->pll.p), 760 &ret); 761 } 762 763 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_PIXCLK, 764 sensor->pixrate, &ret); 765 766 /* Configure the output mode. */ 767 if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) { 768 value = MT9M114_CAM_PORT_PORT_SELECT_MIPI 769 | MT9M114_CAM_PORT_CHAN_NUM(0) 770 | 0x8000; 771 if (!(sensor->bus_cfg.bus.mipi_csi2.flags & 772 V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK)) 773 value |= MT9M114_CAM_PORT_CONT_MIPI_CLK; 774 } else { 775 value = MT9M114_CAM_PORT_PORT_SELECT_PARALLEL 776 | 0x8000; 777 } 778 cci_write(sensor->regmap, MT9M114_CAM_PORT_OUTPUT_CONTROL, value, &ret); 779 if (ret < 0) 780 return ret; 781 782 ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE); 783 if (ret < 0) 784 return ret; 785 786 ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_SUSPEND); 787 if (ret < 0) 788 return ret; 789 790 return 0; 791 } 792 793 static int mt9m114_configure_pa(struct mt9m114 *sensor, 794 struct v4l2_subdev_state *state) 795 { 796 const struct v4l2_mbus_framefmt *format; 797 const struct v4l2_rect *crop; 798 unsigned int hratio, vratio; 799 u64 read_mode; 800 int ret; 801 802 format = v4l2_subdev_state_get_format(state, 0); 803 crop = v4l2_subdev_state_get_crop(state, 0); 804 805 ret = cci_read(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_READ_MODE, 806 &read_mode, NULL); 807 if (ret < 0) 808 return ret; 809 810 hratio = crop->width / format->width; 811 vratio = crop->height / format->height; 812 813 /* 814 * Pixel array crop and binning. The CAM_SENSOR_CFG_CPIPE_LAST_ROW 815 * register isn't clearly documented, but is always set to the number 816 * of active rows minus 4 divided by the vertical binning factor in all 817 * example sensor modes. 818 */ 819 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_X_ADDR_START, 820 crop->left, &ret); 821 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_Y_ADDR_START, 822 crop->top, &ret); 823 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_X_ADDR_END, 824 crop->width + crop->left - 1, &ret); 825 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_Y_ADDR_END, 826 crop->height + crop->top - 1, &ret); 827 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_CPIPE_LAST_ROW, 828 (crop->height - 4) / vratio - 1, &ret); 829 830 read_mode &= ~(MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_MASK | 831 MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_MASK); 832 833 if (hratio > 1) 834 read_mode |= MT9M114_CAM_SENSOR_CONTROL_X_READ_OUT_SUMMING; 835 if (vratio > 1) 836 read_mode |= MT9M114_CAM_SENSOR_CONTROL_Y_READ_OUT_SUMMING; 837 838 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_READ_MODE, 839 read_mode, &ret); 840 841 return ret; 842 } 843 844 static int mt9m114_configure_ifp(struct mt9m114 *sensor, 845 struct v4l2_subdev_state *state) 846 { 847 const struct mt9m114_format_info *info; 848 const struct v4l2_mbus_framefmt *format; 849 const struct v4l2_rect *crop; 850 const struct v4l2_rect *compose; 851 u64 output_format; 852 int ret = 0; 853 854 format = v4l2_subdev_state_get_format(state, 1); 855 info = mt9m114_format_info(sensor, 1, format->code); 856 crop = v4l2_subdev_state_get_crop(state, 0); 857 compose = v4l2_subdev_state_get_compose(state, 0); 858 859 ret = cci_read(sensor->regmap, MT9M114_CAM_OUTPUT_FORMAT, 860 &output_format, NULL); 861 if (ret < 0) 862 return ret; 863 864 /* 865 * Color pipeline (IFP) cropping and scaling. Subtract 4 from the left 866 * and top coordinates to compensate for the lines and columns removed 867 * by demosaicing that are taken into account in the crop rectangle but 868 * not in the hardware. 869 */ 870 cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_XOFFSET, 871 crop->left - 4, &ret); 872 cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_YOFFSET, 873 crop->top - 4, &ret); 874 cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_WIDTH, 875 crop->width, &ret); 876 cci_write(sensor->regmap, MT9M114_CAM_CROP_WINDOW_HEIGHT, 877 crop->height, &ret); 878 879 cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_WIDTH, 880 compose->width, &ret); 881 cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_HEIGHT, 882 compose->height, &ret); 883 884 /* AWB and AE windows, use the full frame. */ 885 cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XSTART, 886 0, &ret); 887 cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YSTART, 888 0, &ret); 889 cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_XEND, 890 compose->width - 1, &ret); 891 cci_write(sensor->regmap, MT9M114_CAM_STAT_AWB_CLIP_WINDOW_YEND, 892 compose->height - 1, &ret); 893 894 cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XSTART, 895 0, &ret); 896 cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YSTART, 897 0, &ret); 898 cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_XEND, 899 compose->width / 5 - 1, &ret); 900 cci_write(sensor->regmap, MT9M114_CAM_STAT_AE_INITIAL_WINDOW_YEND, 901 compose->height / 5 - 1, &ret); 902 903 cci_write(sensor->regmap, MT9M114_CAM_CROP_CROPMODE, 904 MT9M114_CAM_CROP_MODE_AWB_AUTO_CROP_EN | 905 MT9M114_CAM_CROP_MODE_AE_AUTO_CROP_EN, &ret); 906 907 /* Set the media bus code. */ 908 output_format &= ~(MT9M114_CAM_OUTPUT_FORMAT_RGB_FORMAT_MASK | 909 MT9M114_CAM_OUTPUT_FORMAT_BAYER_FORMAT_MASK | 910 MT9M114_CAM_OUTPUT_FORMAT_FORMAT_MASK | 911 MT9M114_CAM_OUTPUT_FORMAT_SWAP_BYTES | 912 MT9M114_CAM_OUTPUT_FORMAT_SWAP_RED_BLUE); 913 output_format |= info->output_format; 914 915 cci_write(sensor->regmap, MT9M114_CAM_OUTPUT_FORMAT, 916 output_format, &ret); 917 918 return ret; 919 } 920 921 static int mt9m114_set_frame_rate(struct mt9m114 *sensor) 922 { 923 u16 frame_rate = sensor->ifp.frame_rate << 8; 924 int ret = 0; 925 926 cci_write(sensor->regmap, MT9M114_CAM_AET_MIN_FRAME_RATE, 927 frame_rate, &ret); 928 cci_write(sensor->regmap, MT9M114_CAM_AET_MAX_FRAME_RATE, 929 frame_rate, &ret); 930 931 return ret; 932 } 933 934 static int mt9m114_start_streaming(struct mt9m114 *sensor, 935 struct v4l2_subdev_state *pa_state, 936 struct v4l2_subdev_state *ifp_state) 937 { 938 int ret; 939 940 ret = pm_runtime_resume_and_get(&sensor->client->dev); 941 if (ret) 942 return ret; 943 944 ret = mt9m114_configure_ifp(sensor, ifp_state); 945 if (ret) 946 goto error; 947 948 ret = mt9m114_configure_pa(sensor, pa_state); 949 if (ret) 950 goto error; 951 952 ret = mt9m114_set_frame_rate(sensor); 953 if (ret) 954 goto error; 955 956 ret = __v4l2_ctrl_handler_setup(&sensor->pa.hdl); 957 if (ret) 958 goto error; 959 960 ret = __v4l2_ctrl_handler_setup(&sensor->ifp.hdl); 961 if (ret) 962 goto error; 963 964 /* 965 * The Change-Config state is transient and moves to the streaming 966 * state automatically. 967 */ 968 ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE); 969 if (ret) 970 goto error; 971 972 sensor->streaming = true; 973 974 return 0; 975 976 error: 977 pm_runtime_put_autosuspend(&sensor->client->dev); 978 979 return ret; 980 } 981 982 static int mt9m114_stop_streaming(struct mt9m114 *sensor) 983 { 984 int ret; 985 986 sensor->streaming = false; 987 988 ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_SUSPEND); 989 990 pm_runtime_put_autosuspend(&sensor->client->dev); 991 992 return ret; 993 } 994 995 /* ----------------------------------------------------------------------------- 996 * Common Subdev Operations 997 */ 998 999 static const struct media_entity_operations mt9m114_entity_ops = { 1000 .link_validate = v4l2_subdev_link_validate, 1001 }; 1002 1003 /* ----------------------------------------------------------------------------- 1004 * Pixel Array Control Operations 1005 */ 1006 1007 static inline struct mt9m114 *pa_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl) 1008 { 1009 return container_of(ctrl->handler, struct mt9m114, pa.hdl); 1010 } 1011 1012 static int mt9m114_pa_g_ctrl(struct v4l2_ctrl *ctrl) 1013 { 1014 struct mt9m114 *sensor = pa_ctrl_to_mt9m114(ctrl); 1015 u64 value; 1016 int ret; 1017 1018 if (!pm_runtime_get_if_in_use(&sensor->client->dev)) 1019 return 0; 1020 1021 switch (ctrl->id) { 1022 case V4L2_CID_EXPOSURE: 1023 ret = cci_read(sensor->regmap, 1024 MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME, 1025 &value, NULL); 1026 if (ret) 1027 break; 1028 1029 ctrl->val = value; 1030 break; 1031 1032 case V4L2_CID_ANALOGUE_GAIN: 1033 ret = cci_read(sensor->regmap, 1034 MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN, 1035 &value, NULL); 1036 if (ret) 1037 break; 1038 1039 ctrl->val = value; 1040 break; 1041 1042 default: 1043 ret = -EINVAL; 1044 break; 1045 } 1046 1047 pm_runtime_put_autosuspend(&sensor->client->dev); 1048 1049 return ret; 1050 } 1051 1052 static int mt9m114_pa_s_ctrl(struct v4l2_ctrl *ctrl) 1053 { 1054 struct mt9m114 *sensor = pa_ctrl_to_mt9m114(ctrl); 1055 const struct v4l2_mbus_framefmt *format; 1056 struct v4l2_subdev_state *state; 1057 int ret = 0; 1058 u64 mask; 1059 1060 /* V4L2 controls values are applied only when power is up. */ 1061 if (!pm_runtime_get_if_in_use(&sensor->client->dev)) 1062 return 0; 1063 1064 state = v4l2_subdev_get_locked_active_state(&sensor->pa.sd); 1065 format = v4l2_subdev_state_get_format(state, 0); 1066 1067 switch (ctrl->id) { 1068 case V4L2_CID_HBLANK: 1069 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK, 1070 ctrl->val + format->width, &ret); 1071 break; 1072 1073 case V4L2_CID_VBLANK: 1074 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES, 1075 ctrl->val + format->height, &ret); 1076 break; 1077 1078 case V4L2_CID_EXPOSURE: 1079 cci_write(sensor->regmap, 1080 MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME, 1081 ctrl->val, &ret); 1082 break; 1083 1084 case V4L2_CID_ANALOGUE_GAIN: 1085 /* 1086 * The CAM_SENSOR_CONTROL_ANALOG_GAIN contains linear analog 1087 * gain values that are mapped to the GLOBAL_GAIN register 1088 * values by the sensor firmware. 1089 */ 1090 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN, 1091 ctrl->val, &ret); 1092 break; 1093 1094 case V4L2_CID_HFLIP: 1095 mask = MT9M114_CAM_SENSOR_CONTROL_HORZ_MIRROR_EN; 1096 ret = cci_update_bits(sensor->regmap, 1097 MT9M114_CAM_SENSOR_CONTROL_READ_MODE, 1098 mask, ctrl->val ? mask : 0, NULL); 1099 break; 1100 1101 case V4L2_CID_VFLIP: 1102 mask = MT9M114_CAM_SENSOR_CONTROL_VERT_FLIP_EN; 1103 ret = cci_update_bits(sensor->regmap, 1104 MT9M114_CAM_SENSOR_CONTROL_READ_MODE, 1105 mask, ctrl->val ? mask : 0, NULL); 1106 break; 1107 1108 default: 1109 ret = -EINVAL; 1110 break; 1111 } 1112 1113 pm_runtime_put_autosuspend(&sensor->client->dev); 1114 1115 return ret; 1116 } 1117 1118 static const struct v4l2_ctrl_ops mt9m114_pa_ctrl_ops = { 1119 .g_volatile_ctrl = mt9m114_pa_g_ctrl, 1120 .s_ctrl = mt9m114_pa_s_ctrl, 1121 }; 1122 1123 static void mt9m114_pa_ctrl_update_exposure(struct mt9m114 *sensor, bool manual) 1124 { 1125 /* 1126 * Update the volatile flag on the manual exposure and gain controls. 1127 * If the controls have switched to manual, read their current value 1128 * from the hardware to ensure that control read and write operations 1129 * will behave correctly 1130 */ 1131 if (manual) { 1132 mt9m114_pa_g_ctrl(sensor->pa.exposure); 1133 sensor->pa.exposure->cur.val = sensor->pa.exposure->val; 1134 sensor->pa.exposure->flags &= ~V4L2_CTRL_FLAG_VOLATILE; 1135 1136 mt9m114_pa_g_ctrl(sensor->pa.gain); 1137 sensor->pa.gain->cur.val = sensor->pa.gain->val; 1138 sensor->pa.gain->flags &= ~V4L2_CTRL_FLAG_VOLATILE; 1139 } else { 1140 sensor->pa.exposure->flags |= V4L2_CTRL_FLAG_VOLATILE; 1141 sensor->pa.gain->flags |= V4L2_CTRL_FLAG_VOLATILE; 1142 } 1143 } 1144 1145 static void mt9m114_pa_ctrl_update_blanking(struct mt9m114 *sensor, 1146 const struct v4l2_mbus_framefmt *format) 1147 { 1148 unsigned int max_blank; 1149 1150 /* Update the blanking controls ranges based on the output size. */ 1151 max_blank = MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK_MAX 1152 - format->width; 1153 __v4l2_ctrl_modify_range(sensor->pa.hblank, MT9M114_MIN_HBLANK, 1154 max_blank, 1, MT9M114_DEF_HBLANK); 1155 1156 max_blank = MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES_MAX 1157 - format->height; 1158 __v4l2_ctrl_modify_range(sensor->pa.vblank, MT9M114_MIN_VBLANK, 1159 max_blank, 1, MT9M114_DEF_VBLANK); 1160 } 1161 1162 /* ----------------------------------------------------------------------------- 1163 * Pixel Array Subdev Operations 1164 */ 1165 1166 static inline struct mt9m114 *pa_to_mt9m114(struct v4l2_subdev *sd) 1167 { 1168 return container_of(sd, struct mt9m114, pa.sd); 1169 } 1170 1171 static int mt9m114_pa_init_state(struct v4l2_subdev *sd, 1172 struct v4l2_subdev_state *state) 1173 { 1174 struct v4l2_mbus_framefmt *format; 1175 struct v4l2_rect *crop; 1176 1177 crop = v4l2_subdev_state_get_crop(state, 0); 1178 1179 crop->left = 0; 1180 crop->top = 0; 1181 crop->width = MT9M114_PIXEL_ARRAY_WIDTH; 1182 crop->height = MT9M114_PIXEL_ARRAY_HEIGHT; 1183 1184 format = v4l2_subdev_state_get_format(state, 0); 1185 1186 format->width = MT9M114_PIXEL_ARRAY_WIDTH; 1187 format->height = MT9M114_PIXEL_ARRAY_HEIGHT; 1188 format->code = MEDIA_BUS_FMT_SGRBG10_1X10; 1189 format->field = V4L2_FIELD_NONE; 1190 format->colorspace = V4L2_COLORSPACE_RAW; 1191 format->ycbcr_enc = V4L2_YCBCR_ENC_601; 1192 format->quantization = V4L2_QUANTIZATION_FULL_RANGE; 1193 format->xfer_func = V4L2_XFER_FUNC_NONE; 1194 1195 return 0; 1196 } 1197 1198 static int mt9m114_pa_enum_mbus_code(struct v4l2_subdev *sd, 1199 struct v4l2_subdev_state *state, 1200 struct v4l2_subdev_mbus_code_enum *code) 1201 { 1202 if (code->index > 0) 1203 return -EINVAL; 1204 1205 code->code = MEDIA_BUS_FMT_SGRBG10_1X10; 1206 1207 return 0; 1208 } 1209 1210 static int mt9m114_pa_enum_framesizes(struct v4l2_subdev *sd, 1211 struct v4l2_subdev_state *state, 1212 struct v4l2_subdev_frame_size_enum *fse) 1213 { 1214 if (fse->index > 1) 1215 return -EINVAL; 1216 1217 if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10) 1218 return -EINVAL; 1219 1220 /* Report binning capability through frame size enumeration. */ 1221 fse->min_width = MT9M114_PIXEL_ARRAY_WIDTH / (fse->index + 1); 1222 fse->max_width = MT9M114_PIXEL_ARRAY_WIDTH / (fse->index + 1); 1223 fse->min_height = MT9M114_PIXEL_ARRAY_HEIGHT / (fse->index + 1); 1224 fse->max_height = MT9M114_PIXEL_ARRAY_HEIGHT / (fse->index + 1); 1225 1226 return 0; 1227 } 1228 1229 static int mt9m114_pa_set_fmt(struct v4l2_subdev *sd, 1230 struct v4l2_subdev_state *state, 1231 struct v4l2_subdev_format *fmt) 1232 { 1233 struct mt9m114 *sensor = pa_to_mt9m114(sd); 1234 struct v4l2_mbus_framefmt *format; 1235 struct v4l2_rect *crop; 1236 unsigned int hscale; 1237 unsigned int vscale; 1238 1239 crop = v4l2_subdev_state_get_crop(state, fmt->pad); 1240 format = v4l2_subdev_state_get_format(state, fmt->pad); 1241 1242 /* The sensor can bin horizontally and vertically. */ 1243 hscale = DIV_ROUND_CLOSEST(crop->width, fmt->format.width ? : 1); 1244 vscale = DIV_ROUND_CLOSEST(crop->height, fmt->format.height ? : 1); 1245 format->width = crop->width / clamp(hscale, 1U, 2U); 1246 format->height = crop->height / clamp(vscale, 1U, 2U); 1247 1248 fmt->format = *format; 1249 1250 if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) 1251 mt9m114_pa_ctrl_update_blanking(sensor, format); 1252 1253 return 0; 1254 } 1255 1256 static int mt9m114_pa_get_selection(struct v4l2_subdev *sd, 1257 struct v4l2_subdev_state *state, 1258 struct v4l2_subdev_selection *sel) 1259 { 1260 switch (sel->target) { 1261 case V4L2_SEL_TGT_CROP: 1262 sel->r = *v4l2_subdev_state_get_crop(state, sel->pad); 1263 return 0; 1264 1265 case V4L2_SEL_TGT_CROP_DEFAULT: 1266 case V4L2_SEL_TGT_CROP_BOUNDS: 1267 case V4L2_SEL_TGT_NATIVE_SIZE: 1268 sel->r.left = 0; 1269 sel->r.top = 0; 1270 sel->r.width = MT9M114_PIXEL_ARRAY_WIDTH; 1271 sel->r.height = MT9M114_PIXEL_ARRAY_HEIGHT; 1272 return 0; 1273 1274 default: 1275 return -EINVAL; 1276 } 1277 } 1278 1279 static int mt9m114_pa_set_selection(struct v4l2_subdev *sd, 1280 struct v4l2_subdev_state *state, 1281 struct v4l2_subdev_selection *sel) 1282 { 1283 struct mt9m114 *sensor = pa_to_mt9m114(sd); 1284 struct v4l2_mbus_framefmt *format; 1285 struct v4l2_rect *crop; 1286 1287 if (sel->target != V4L2_SEL_TGT_CROP) 1288 return -EINVAL; 1289 1290 crop = v4l2_subdev_state_get_crop(state, sel->pad); 1291 format = v4l2_subdev_state_get_format(state, sel->pad); 1292 1293 /* 1294 * Clamp the crop rectangle. The vertical coordinates must be even, and 1295 * the horizontal coordinates must be a multiple of 4. 1296 * 1297 * FIXME: The horizontal coordinates must be a multiple of 8 when 1298 * binning, but binning is configured after setting the selection, so 1299 * we can't know tell here if it will be used. 1300 */ 1301 crop->left = ALIGN(sel->r.left, 4); 1302 crop->top = ALIGN(sel->r.top, 2); 1303 crop->width = clamp_t(unsigned int, ALIGN(sel->r.width, 4), 1304 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH, 1305 MT9M114_PIXEL_ARRAY_WIDTH - crop->left); 1306 crop->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2), 1307 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT, 1308 MT9M114_PIXEL_ARRAY_HEIGHT - crop->top); 1309 1310 sel->r = *crop; 1311 1312 /* Reset the format. */ 1313 format->width = crop->width; 1314 format->height = crop->height; 1315 1316 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) 1317 mt9m114_pa_ctrl_update_blanking(sensor, format); 1318 1319 return 0; 1320 } 1321 1322 static const struct v4l2_subdev_pad_ops mt9m114_pa_pad_ops = { 1323 .enum_mbus_code = mt9m114_pa_enum_mbus_code, 1324 .enum_frame_size = mt9m114_pa_enum_framesizes, 1325 .get_fmt = v4l2_subdev_get_fmt, 1326 .set_fmt = mt9m114_pa_set_fmt, 1327 .get_selection = mt9m114_pa_get_selection, 1328 .set_selection = mt9m114_pa_set_selection, 1329 }; 1330 1331 static const struct v4l2_subdev_ops mt9m114_pa_ops = { 1332 .pad = &mt9m114_pa_pad_ops, 1333 }; 1334 1335 static const struct v4l2_subdev_internal_ops mt9m114_pa_internal_ops = { 1336 .init_state = mt9m114_pa_init_state, 1337 }; 1338 1339 static int mt9m114_pa_init(struct mt9m114 *sensor) 1340 { 1341 struct v4l2_ctrl_handler *hdl = &sensor->pa.hdl; 1342 struct v4l2_subdev *sd = &sensor->pa.sd; 1343 struct media_pad *pads = &sensor->pa.pad; 1344 const struct v4l2_mbus_framefmt *format; 1345 struct v4l2_subdev_state *state; 1346 unsigned int max_exposure; 1347 int ret; 1348 1349 /* Initialize the subdev. */ 1350 v4l2_subdev_init(sd, &mt9m114_pa_ops); 1351 sd->internal_ops = &mt9m114_pa_internal_ops; 1352 v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " pixel array"); 1353 1354 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 1355 sd->owner = THIS_MODULE; 1356 sd->dev = &sensor->client->dev; 1357 v4l2_set_subdevdata(sd, sensor->client); 1358 1359 /* Initialize the media entity. */ 1360 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; 1361 sd->entity.ops = &mt9m114_entity_ops; 1362 pads[0].flags = MEDIA_PAD_FL_SOURCE; 1363 ret = media_entity_pads_init(&sd->entity, 1, pads); 1364 if (ret < 0) 1365 return ret; 1366 1367 /* Initialize the control handler. */ 1368 v4l2_ctrl_handler_init(hdl, 7); 1369 1370 /* The range of the HBLANK and VBLANK controls will be updated below. */ 1371 sensor->pa.hblank = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1372 V4L2_CID_HBLANK, 1373 MT9M114_DEF_HBLANK, 1374 MT9M114_DEF_HBLANK, 1, 1375 MT9M114_DEF_HBLANK); 1376 sensor->pa.vblank = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1377 V4L2_CID_VBLANK, 1378 MT9M114_DEF_VBLANK, 1379 MT9M114_DEF_VBLANK, 1, 1380 MT9M114_DEF_VBLANK); 1381 1382 /* 1383 * The maximum coarse integration time is the frame length in lines 1384 * minus two. The default is taken directly from the datasheet, but 1385 * makes little sense as auto-exposure is enabled by default. 1386 */ 1387 max_exposure = MT9M114_PIXEL_ARRAY_HEIGHT + MT9M114_MIN_VBLANK - 2; 1388 sensor->pa.exposure = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1389 V4L2_CID_EXPOSURE, 1, 1390 max_exposure, 1, 16); 1391 if (sensor->pa.exposure) 1392 sensor->pa.exposure->flags |= V4L2_CTRL_FLAG_VOLATILE; 1393 1394 sensor->pa.gain = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1395 V4L2_CID_ANALOGUE_GAIN, 1, 1396 511, 1, 32); 1397 if (sensor->pa.gain) 1398 sensor->pa.gain->flags |= V4L2_CTRL_FLAG_VOLATILE; 1399 1400 v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1401 V4L2_CID_PIXEL_RATE, 1402 sensor->pixrate, sensor->pixrate, 1, 1403 sensor->pixrate); 1404 1405 v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1406 V4L2_CID_HFLIP, 1407 0, 1, 1, 0); 1408 v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1409 V4L2_CID_VFLIP, 1410 0, 1, 1, 0); 1411 1412 if (hdl->error) { 1413 ret = hdl->error; 1414 goto error; 1415 } 1416 1417 sd->state_lock = hdl->lock; 1418 1419 ret = v4l2_subdev_init_finalize(sd); 1420 if (ret) 1421 goto error; 1422 1423 /* Update the range of the blanking controls based on the format. */ 1424 state = v4l2_subdev_lock_and_get_active_state(sd); 1425 format = v4l2_subdev_state_get_format(state, 0); 1426 mt9m114_pa_ctrl_update_blanking(sensor, format); 1427 v4l2_subdev_unlock_state(state); 1428 1429 sd->ctrl_handler = hdl; 1430 1431 return 0; 1432 1433 error: 1434 v4l2_ctrl_handler_free(&sensor->pa.hdl); 1435 media_entity_cleanup(&sensor->pa.sd.entity); 1436 return ret; 1437 } 1438 1439 static void mt9m114_pa_cleanup(struct mt9m114 *sensor) 1440 { 1441 v4l2_ctrl_handler_free(&sensor->pa.hdl); 1442 media_entity_cleanup(&sensor->pa.sd.entity); 1443 } 1444 1445 /* ----------------------------------------------------------------------------- 1446 * Image Flow Processor Control Operations 1447 */ 1448 1449 static const char * const mt9m114_test_pattern_menu[] = { 1450 "Disabled", 1451 "Solid Color", 1452 "100% Color Bars", 1453 "Pseudo-Random", 1454 "Fade-to-Gray Color Bars", 1455 "Walking Ones 10-bit", 1456 "Walking Ones 8-bit", 1457 }; 1458 1459 /* Keep in sync with mt9m114_test_pattern_menu */ 1460 static const unsigned int mt9m114_test_pattern_value[] = { 1461 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID, 1462 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID_BARS, 1463 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_RANDOM, 1464 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_FADING_BARS, 1465 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_10B, 1466 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_8B, 1467 }; 1468 1469 static inline struct mt9m114 *ifp_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl) 1470 { 1471 return container_of(ctrl->handler, struct mt9m114, ifp.hdl); 1472 } 1473 1474 static int mt9m114_ifp_s_ctrl(struct v4l2_ctrl *ctrl) 1475 { 1476 struct mt9m114 *sensor = ifp_ctrl_to_mt9m114(ctrl); 1477 u32 value; 1478 int ret = 0; 1479 1480 if (ctrl->id == V4L2_CID_EXPOSURE_AUTO) 1481 mt9m114_pa_ctrl_update_exposure(sensor, 1482 ctrl->val != V4L2_EXPOSURE_AUTO); 1483 1484 /* V4L2 controls values are applied only when power is up. */ 1485 if (!pm_runtime_get_if_in_use(&sensor->client->dev)) 1486 return 0; 1487 1488 switch (ctrl->id) { 1489 case V4L2_CID_AUTO_WHITE_BALANCE: 1490 /* Control both the AWB mode and the CCM algorithm. */ 1491 if (ctrl->val) 1492 value = MT9M114_CAM_AWB_MODE_AUTO 1493 | MT9M114_CAM_AWB_MODE_EXCLUSIVE_AE; 1494 else 1495 value = 0; 1496 1497 cci_write(sensor->regmap, MT9M114_CAM_AWB_AWBMODE, value, &ret); 1498 1499 if (ctrl->val) 1500 value = MT9M114_CCM_EXEC_CALC_CCM_MATRIX | 0x22; 1501 else 1502 value = 0; 1503 1504 cci_write(sensor->regmap, MT9M114_CCM_ALGO, value, &ret); 1505 break; 1506 1507 case V4L2_CID_EXPOSURE_AUTO: 1508 if (ctrl->val == V4L2_EXPOSURE_AUTO) 1509 value = MT9M114_AE_TRACK_EXEC_AUTOMATIC_EXPOSURE 1510 | 0x00fe; 1511 else 1512 value = 0; 1513 1514 cci_write(sensor->regmap, MT9M114_AE_TRACK_ALGO, value, &ret); 1515 if (ret) 1516 break; 1517 1518 break; 1519 1520 case V4L2_CID_TEST_PATTERN: 1521 case V4L2_CID_TEST_PATTERN_RED: 1522 case V4L2_CID_TEST_PATTERN_GREENR: 1523 case V4L2_CID_TEST_PATTERN_BLUE: { 1524 unsigned int pattern = sensor->ifp.tpg[MT9M114_TPG_PATTERN]->val; 1525 1526 if (pattern) { 1527 cci_write(sensor->regmap, MT9M114_CAM_MODE_SELECT, 1528 MT9M114_CAM_MODE_SELECT_TEST_PATTERN, &ret); 1529 cci_write(sensor->regmap, 1530 MT9M114_CAM_MODE_TEST_PATTERN_SELECT, 1531 mt9m114_test_pattern_value[pattern - 1], &ret); 1532 cci_write(sensor->regmap, 1533 MT9M114_CAM_MODE_TEST_PATTERN_RED, 1534 sensor->ifp.tpg[MT9M114_TPG_RED]->val, &ret); 1535 cci_write(sensor->regmap, 1536 MT9M114_CAM_MODE_TEST_PATTERN_GREEN, 1537 sensor->ifp.tpg[MT9M114_TPG_GREEN]->val, &ret); 1538 cci_write(sensor->regmap, 1539 MT9M114_CAM_MODE_TEST_PATTERN_BLUE, 1540 sensor->ifp.tpg[MT9M114_TPG_BLUE]->val, &ret); 1541 } else { 1542 cci_write(sensor->regmap, MT9M114_CAM_MODE_SELECT, 1543 MT9M114_CAM_MODE_SELECT_NORMAL, &ret); 1544 } 1545 1546 /* 1547 * A Config-Change needs to be issued for the change to take 1548 * effect. If we're not streaming ignore this, the change will 1549 * be applied when the stream is started. 1550 */ 1551 if (ret || !sensor->streaming) 1552 break; 1553 1554 ret = mt9m114_set_state(sensor, 1555 MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE); 1556 break; 1557 } 1558 1559 default: 1560 ret = -EINVAL; 1561 break; 1562 } 1563 1564 pm_runtime_put_autosuspend(&sensor->client->dev); 1565 1566 return ret; 1567 } 1568 1569 static const struct v4l2_ctrl_ops mt9m114_ifp_ctrl_ops = { 1570 .s_ctrl = mt9m114_ifp_s_ctrl, 1571 }; 1572 1573 /* ----------------------------------------------------------------------------- 1574 * Image Flow Processor Subdev Operations 1575 */ 1576 1577 static inline struct mt9m114 *ifp_to_mt9m114(struct v4l2_subdev *sd) 1578 { 1579 return container_of(sd, struct mt9m114, ifp.sd); 1580 } 1581 1582 static int mt9m114_ifp_s_stream(struct v4l2_subdev *sd, int enable) 1583 { 1584 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1585 struct v4l2_subdev_state *pa_state; 1586 struct v4l2_subdev_state *ifp_state; 1587 int ret; 1588 1589 if (!enable) 1590 return mt9m114_stop_streaming(sensor); 1591 1592 ifp_state = v4l2_subdev_lock_and_get_active_state(&sensor->ifp.sd); 1593 pa_state = v4l2_subdev_lock_and_get_active_state(&sensor->pa.sd); 1594 1595 ret = mt9m114_start_streaming(sensor, pa_state, ifp_state); 1596 1597 v4l2_subdev_unlock_state(pa_state); 1598 v4l2_subdev_unlock_state(ifp_state); 1599 1600 return ret; 1601 } 1602 1603 static int mt9m114_ifp_get_frame_interval(struct v4l2_subdev *sd, 1604 struct v4l2_subdev_state *sd_state, 1605 struct v4l2_subdev_frame_interval *interval) 1606 { 1607 struct v4l2_fract *ival = &interval->interval; 1608 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1609 1610 /* 1611 * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2 1612 * subdev active state API. 1613 */ 1614 if (interval->which != V4L2_SUBDEV_FORMAT_ACTIVE) 1615 return -EINVAL; 1616 1617 ival->numerator = 1; 1618 ival->denominator = sensor->ifp.frame_rate; 1619 1620 return 0; 1621 } 1622 1623 static int mt9m114_ifp_set_frame_interval(struct v4l2_subdev *sd, 1624 struct v4l2_subdev_state *sd_state, 1625 struct v4l2_subdev_frame_interval *interval) 1626 { 1627 struct v4l2_fract *ival = &interval->interval; 1628 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1629 int ret = 0; 1630 1631 /* 1632 * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2 1633 * subdev active state API. 1634 */ 1635 if (interval->which != V4L2_SUBDEV_FORMAT_ACTIVE) 1636 return -EINVAL; 1637 1638 if (ival->numerator != 0 && ival->denominator != 0) 1639 sensor->ifp.frame_rate = min_t(unsigned int, 1640 ival->denominator / ival->numerator, 1641 MT9M114_MAX_FRAME_RATE); 1642 else 1643 sensor->ifp.frame_rate = MT9M114_MAX_FRAME_RATE; 1644 1645 ival->numerator = 1; 1646 ival->denominator = sensor->ifp.frame_rate; 1647 1648 if (sensor->streaming) 1649 ret = mt9m114_set_frame_rate(sensor); 1650 1651 return ret; 1652 } 1653 1654 static int mt9m114_ifp_init_state(struct v4l2_subdev *sd, 1655 struct v4l2_subdev_state *state) 1656 { 1657 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1658 struct v4l2_mbus_framefmt *format; 1659 struct v4l2_rect *crop; 1660 struct v4l2_rect *compose; 1661 1662 format = v4l2_subdev_state_get_format(state, 0); 1663 1664 format->width = MT9M114_PIXEL_ARRAY_WIDTH; 1665 format->height = MT9M114_PIXEL_ARRAY_HEIGHT; 1666 format->code = MEDIA_BUS_FMT_SGRBG10_1X10; 1667 format->field = V4L2_FIELD_NONE; 1668 format->colorspace = V4L2_COLORSPACE_RAW; 1669 format->ycbcr_enc = V4L2_YCBCR_ENC_601; 1670 format->quantization = V4L2_QUANTIZATION_FULL_RANGE; 1671 format->xfer_func = V4L2_XFER_FUNC_NONE; 1672 1673 crop = v4l2_subdev_state_get_crop(state, 0); 1674 1675 crop->left = 4; 1676 crop->top = 4; 1677 crop->width = format->width - 8; 1678 crop->height = format->height - 8; 1679 1680 compose = v4l2_subdev_state_get_compose(state, 0); 1681 1682 compose->left = 0; 1683 compose->top = 0; 1684 compose->width = crop->width; 1685 compose->height = crop->height; 1686 1687 format = v4l2_subdev_state_get_format(state, 1); 1688 1689 format->width = compose->width; 1690 format->height = compose->height; 1691 format->code = mt9m114_default_format_info(sensor)->code; 1692 format->field = V4L2_FIELD_NONE; 1693 format->colorspace = V4L2_COLORSPACE_SRGB; 1694 format->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; 1695 format->quantization = V4L2_QUANTIZATION_DEFAULT; 1696 format->xfer_func = V4L2_XFER_FUNC_DEFAULT; 1697 1698 return 0; 1699 } 1700 1701 static int mt9m114_ifp_enum_mbus_code(struct v4l2_subdev *sd, 1702 struct v4l2_subdev_state *state, 1703 struct v4l2_subdev_mbus_code_enum *code) 1704 { 1705 const unsigned int num_formats = ARRAY_SIZE(mt9m114_format_infos); 1706 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1707 unsigned int index = 0; 1708 unsigned int flag; 1709 unsigned int i; 1710 1711 switch (code->pad) { 1712 case 0: 1713 if (code->index != 0) 1714 return -EINVAL; 1715 1716 code->code = mt9m114_format_infos[num_formats - 1].code; 1717 return 0; 1718 1719 case 1: 1720 if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) 1721 flag = MT9M114_FMT_FLAG_CSI2; 1722 else 1723 flag = MT9M114_FMT_FLAG_PARALLEL; 1724 1725 for (i = 0; i < num_formats; ++i) { 1726 const struct mt9m114_format_info *info = 1727 &mt9m114_format_infos[i]; 1728 1729 if (info->flags & flag) { 1730 if (index == code->index) { 1731 code->code = info->code; 1732 return 0; 1733 } 1734 1735 index++; 1736 } 1737 } 1738 1739 return -EINVAL; 1740 1741 default: 1742 return -EINVAL; 1743 } 1744 } 1745 1746 static int mt9m114_ifp_enum_framesizes(struct v4l2_subdev *sd, 1747 struct v4l2_subdev_state *state, 1748 struct v4l2_subdev_frame_size_enum *fse) 1749 { 1750 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1751 const struct mt9m114_format_info *info; 1752 1753 if (fse->index > 0) 1754 return -EINVAL; 1755 1756 info = mt9m114_format_info(sensor, fse->pad, fse->code); 1757 if (!info || info->code != fse->code) 1758 return -EINVAL; 1759 1760 if (fse->pad == 0) { 1761 fse->min_width = MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH; 1762 fse->max_width = MT9M114_PIXEL_ARRAY_WIDTH; 1763 fse->min_height = MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT; 1764 fse->max_height = MT9M114_PIXEL_ARRAY_HEIGHT; 1765 } else { 1766 const struct v4l2_rect *crop; 1767 1768 crop = v4l2_subdev_state_get_crop(state, 0); 1769 1770 fse->max_width = crop->width; 1771 fse->max_height = crop->height; 1772 1773 fse->min_width = fse->max_width / 4; 1774 fse->min_height = fse->max_height / 4; 1775 } 1776 1777 return 0; 1778 } 1779 1780 static int mt9m114_ifp_enum_frameintervals(struct v4l2_subdev *sd, 1781 struct v4l2_subdev_state *state, 1782 struct v4l2_subdev_frame_interval_enum *fie) 1783 { 1784 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1785 const struct mt9m114_format_info *info; 1786 1787 if (fie->index > 0) 1788 return -EINVAL; 1789 1790 info = mt9m114_format_info(sensor, fie->pad, fie->code); 1791 if (!info || info->code != fie->code) 1792 return -EINVAL; 1793 1794 fie->interval.numerator = 1; 1795 fie->interval.denominator = MT9M114_MAX_FRAME_RATE; 1796 1797 return 0; 1798 } 1799 1800 static int mt9m114_ifp_set_fmt(struct v4l2_subdev *sd, 1801 struct v4l2_subdev_state *state, 1802 struct v4l2_subdev_format *fmt) 1803 { 1804 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1805 struct v4l2_mbus_framefmt *format; 1806 1807 format = v4l2_subdev_state_get_format(state, fmt->pad); 1808 1809 if (fmt->pad == 0) { 1810 /* Only the size can be changed on the sink pad. */ 1811 format->width = clamp(ALIGN(fmt->format.width, 8), 1812 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH, 1813 MT9M114_PIXEL_ARRAY_WIDTH); 1814 format->height = clamp(ALIGN(fmt->format.height, 8), 1815 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT, 1816 MT9M114_PIXEL_ARRAY_HEIGHT); 1817 } else { 1818 const struct mt9m114_format_info *info; 1819 1820 /* Only the media bus code can be changed on the source pad. */ 1821 info = mt9m114_format_info(sensor, 1, fmt->format.code); 1822 1823 format->code = info->code; 1824 1825 /* If the output format is RAW10, bypass the scaler. */ 1826 if (format->code == MEDIA_BUS_FMT_SGRBG10_1X10) 1827 *format = *v4l2_subdev_state_get_format(state, 0); 1828 } 1829 1830 fmt->format = *format; 1831 1832 return 0; 1833 } 1834 1835 static int mt9m114_ifp_get_selection(struct v4l2_subdev *sd, 1836 struct v4l2_subdev_state *state, 1837 struct v4l2_subdev_selection *sel) 1838 { 1839 const struct v4l2_mbus_framefmt *format; 1840 const struct v4l2_rect *crop; 1841 int ret = 0; 1842 1843 /* Crop and compose are only supported on the sink pad. */ 1844 if (sel->pad != 0) 1845 return -EINVAL; 1846 1847 switch (sel->target) { 1848 case V4L2_SEL_TGT_CROP: 1849 sel->r = *v4l2_subdev_state_get_crop(state, 0); 1850 break; 1851 1852 case V4L2_SEL_TGT_CROP_DEFAULT: 1853 case V4L2_SEL_TGT_CROP_BOUNDS: 1854 /* 1855 * The crop default and bounds are equal to the sink 1856 * format size minus 4 pixels on each side for demosaicing. 1857 */ 1858 format = v4l2_subdev_state_get_format(state, 0); 1859 1860 sel->r.left = 4; 1861 sel->r.top = 4; 1862 sel->r.width = format->width - 8; 1863 sel->r.height = format->height - 8; 1864 break; 1865 1866 case V4L2_SEL_TGT_COMPOSE: 1867 sel->r = *v4l2_subdev_state_get_compose(state, 0); 1868 break; 1869 1870 case V4L2_SEL_TGT_COMPOSE_DEFAULT: 1871 case V4L2_SEL_TGT_COMPOSE_BOUNDS: 1872 /* 1873 * The compose default and bounds sizes are equal to the sink 1874 * crop rectangle size. 1875 */ 1876 crop = v4l2_subdev_state_get_crop(state, 0); 1877 sel->r.left = 0; 1878 sel->r.top = 0; 1879 sel->r.width = crop->width; 1880 sel->r.height = crop->height; 1881 break; 1882 1883 default: 1884 ret = -EINVAL; 1885 break; 1886 } 1887 1888 return ret; 1889 } 1890 1891 static int mt9m114_ifp_set_selection(struct v4l2_subdev *sd, 1892 struct v4l2_subdev_state *state, 1893 struct v4l2_subdev_selection *sel) 1894 { 1895 struct v4l2_mbus_framefmt *format; 1896 struct v4l2_rect *crop; 1897 struct v4l2_rect *compose; 1898 1899 if (sel->target != V4L2_SEL_TGT_CROP && 1900 sel->target != V4L2_SEL_TGT_COMPOSE) 1901 return -EINVAL; 1902 1903 /* Crop and compose are only supported on the sink pad. */ 1904 if (sel->pad != 0) 1905 return -EINVAL; 1906 1907 format = v4l2_subdev_state_get_format(state, 0); 1908 crop = v4l2_subdev_state_get_crop(state, 0); 1909 compose = v4l2_subdev_state_get_compose(state, 0); 1910 1911 if (sel->target == V4L2_SEL_TGT_CROP) { 1912 /* 1913 * Clamp the crop rectangle. Demosaicing removes 4 pixels on 1914 * each side of the image. 1915 */ 1916 crop->left = clamp_t(unsigned int, ALIGN(sel->r.left, 2), 4, 1917 format->width - 4 - 1918 MT9M114_SCALER_CROPPED_INPUT_WIDTH); 1919 crop->top = clamp_t(unsigned int, ALIGN(sel->r.top, 2), 4, 1920 format->height - 4 - 1921 MT9M114_SCALER_CROPPED_INPUT_HEIGHT); 1922 crop->width = clamp_t(unsigned int, ALIGN(sel->r.width, 2), 1923 MT9M114_SCALER_CROPPED_INPUT_WIDTH, 1924 format->width - 4 - crop->left); 1925 crop->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2), 1926 MT9M114_SCALER_CROPPED_INPUT_HEIGHT, 1927 format->height - 4 - crop->top); 1928 1929 sel->r = *crop; 1930 1931 /* Propagate to the compose rectangle. */ 1932 compose->width = crop->width; 1933 compose->height = crop->height; 1934 } else { 1935 /* 1936 * Clamp the compose rectangle. The scaler can only downscale. 1937 */ 1938 compose->left = 0; 1939 compose->top = 0; 1940 compose->width = clamp_t(unsigned int, ALIGN(sel->r.width, 2), 1941 MT9M114_SCALER_CROPPED_INPUT_WIDTH, 1942 crop->width); 1943 compose->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2), 1944 MT9M114_SCALER_CROPPED_INPUT_HEIGHT, 1945 crop->height); 1946 1947 sel->r = *compose; 1948 } 1949 1950 /* Propagate the compose rectangle to the source format. */ 1951 format = v4l2_subdev_state_get_format(state, 1); 1952 format->width = compose->width; 1953 format->height = compose->height; 1954 1955 return 0; 1956 } 1957 1958 static void mt9m114_ifp_unregistered(struct v4l2_subdev *sd) 1959 { 1960 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1961 1962 v4l2_device_unregister_subdev(&sensor->pa.sd); 1963 } 1964 1965 static int mt9m114_ifp_registered(struct v4l2_subdev *sd) 1966 { 1967 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1968 int ret; 1969 1970 ret = v4l2_device_register_subdev(sd->v4l2_dev, &sensor->pa.sd); 1971 if (ret < 0) { 1972 dev_err(&sensor->client->dev, 1973 "Failed to register pixel array subdev\n"); 1974 return ret; 1975 } 1976 1977 ret = media_create_pad_link(&sensor->pa.sd.entity, 0, 1978 &sensor->ifp.sd.entity, 0, 1979 MEDIA_LNK_FL_ENABLED | 1980 MEDIA_LNK_FL_IMMUTABLE); 1981 if (ret < 0) { 1982 dev_err(&sensor->client->dev, 1983 "Failed to link pixel array to ifp\n"); 1984 v4l2_device_unregister_subdev(&sensor->pa.sd); 1985 return ret; 1986 } 1987 1988 return 0; 1989 } 1990 1991 static const struct v4l2_subdev_video_ops mt9m114_ifp_video_ops = { 1992 .s_stream = mt9m114_ifp_s_stream, 1993 }; 1994 1995 static const struct v4l2_subdev_pad_ops mt9m114_ifp_pad_ops = { 1996 .enum_mbus_code = mt9m114_ifp_enum_mbus_code, 1997 .enum_frame_size = mt9m114_ifp_enum_framesizes, 1998 .enum_frame_interval = mt9m114_ifp_enum_frameintervals, 1999 .get_fmt = v4l2_subdev_get_fmt, 2000 .set_fmt = mt9m114_ifp_set_fmt, 2001 .get_selection = mt9m114_ifp_get_selection, 2002 .set_selection = mt9m114_ifp_set_selection, 2003 .get_frame_interval = mt9m114_ifp_get_frame_interval, 2004 .set_frame_interval = mt9m114_ifp_set_frame_interval, 2005 }; 2006 2007 static const struct v4l2_subdev_ops mt9m114_ifp_ops = { 2008 .video = &mt9m114_ifp_video_ops, 2009 .pad = &mt9m114_ifp_pad_ops, 2010 }; 2011 2012 static const struct v4l2_subdev_internal_ops mt9m114_ifp_internal_ops = { 2013 .init_state = mt9m114_ifp_init_state, 2014 .registered = mt9m114_ifp_registered, 2015 .unregistered = mt9m114_ifp_unregistered, 2016 }; 2017 2018 static int mt9m114_ifp_init(struct mt9m114 *sensor) 2019 { 2020 struct v4l2_subdev *sd = &sensor->ifp.sd; 2021 struct media_pad *pads = sensor->ifp.pads; 2022 struct v4l2_ctrl_handler *hdl = &sensor->ifp.hdl; 2023 struct v4l2_ctrl *link_freq; 2024 int ret; 2025 2026 /* Initialize the subdev. */ 2027 v4l2_i2c_subdev_init(sd, sensor->client, &mt9m114_ifp_ops); 2028 v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " ifp"); 2029 2030 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 2031 sd->internal_ops = &mt9m114_ifp_internal_ops; 2032 2033 /* Initialize the media entity. */ 2034 sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_ISP; 2035 sd->entity.ops = &mt9m114_entity_ops; 2036 pads[0].flags = MEDIA_PAD_FL_SINK; 2037 pads[1].flags = MEDIA_PAD_FL_SOURCE; 2038 ret = media_entity_pads_init(&sd->entity, 2, pads); 2039 if (ret < 0) 2040 return ret; 2041 2042 sensor->ifp.frame_rate = MT9M114_DEF_FRAME_RATE; 2043 2044 /* Initialize the control handler. */ 2045 v4l2_ctrl_handler_init(hdl, 8); 2046 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2047 V4L2_CID_AUTO_WHITE_BALANCE, 2048 0, 1, 1, 1); 2049 v4l2_ctrl_new_std_menu(hdl, &mt9m114_ifp_ctrl_ops, 2050 V4L2_CID_EXPOSURE_AUTO, 2051 V4L2_EXPOSURE_MANUAL, 0, 2052 V4L2_EXPOSURE_AUTO); 2053 2054 link_freq = v4l2_ctrl_new_int_menu(hdl, &mt9m114_ifp_ctrl_ops, 2055 V4L2_CID_LINK_FREQ, 2056 sensor->bus_cfg.nr_of_link_frequencies - 1, 2057 0, sensor->bus_cfg.link_frequencies); 2058 if (link_freq) 2059 link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; 2060 2061 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2062 V4L2_CID_PIXEL_RATE, 2063 sensor->pixrate, sensor->pixrate, 1, 2064 sensor->pixrate); 2065 2066 sensor->ifp.tpg[MT9M114_TPG_PATTERN] = 2067 v4l2_ctrl_new_std_menu_items(hdl, &mt9m114_ifp_ctrl_ops, 2068 V4L2_CID_TEST_PATTERN, 2069 ARRAY_SIZE(mt9m114_test_pattern_menu) - 1, 2070 0, 0, mt9m114_test_pattern_menu); 2071 sensor->ifp.tpg[MT9M114_TPG_RED] = 2072 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2073 V4L2_CID_TEST_PATTERN_RED, 2074 0, 1023, 1, 1023); 2075 sensor->ifp.tpg[MT9M114_TPG_GREEN] = 2076 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2077 V4L2_CID_TEST_PATTERN_GREENR, 2078 0, 1023, 1, 1023); 2079 sensor->ifp.tpg[MT9M114_TPG_BLUE] = 2080 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2081 V4L2_CID_TEST_PATTERN_BLUE, 2082 0, 1023, 1, 1023); 2083 2084 v4l2_ctrl_cluster(ARRAY_SIZE(sensor->ifp.tpg), sensor->ifp.tpg); 2085 2086 if (hdl->error) { 2087 ret = hdl->error; 2088 goto error; 2089 } 2090 2091 sd->ctrl_handler = hdl; 2092 sd->state_lock = hdl->lock; 2093 2094 ret = v4l2_subdev_init_finalize(sd); 2095 if (ret) 2096 goto error; 2097 2098 return 0; 2099 2100 error: 2101 v4l2_ctrl_handler_free(&sensor->ifp.hdl); 2102 media_entity_cleanup(&sensor->ifp.sd.entity); 2103 return ret; 2104 } 2105 2106 static void mt9m114_ifp_cleanup(struct mt9m114 *sensor) 2107 { 2108 v4l2_ctrl_handler_free(&sensor->ifp.hdl); 2109 media_entity_cleanup(&sensor->ifp.sd.entity); 2110 } 2111 2112 /* ----------------------------------------------------------------------------- 2113 * Power Management 2114 */ 2115 2116 static int mt9m114_power_on(struct mt9m114 *sensor) 2117 { 2118 int ret; 2119 2120 /* Enable power and clocks. */ 2121 ret = regulator_bulk_enable(ARRAY_SIZE(sensor->supplies), 2122 sensor->supplies); 2123 if (ret < 0) 2124 return ret; 2125 2126 ret = clk_prepare_enable(sensor->clk); 2127 if (ret < 0) 2128 goto error_regulator; 2129 2130 /* Perform a hard reset if available, or a soft reset otherwise. */ 2131 if (sensor->reset) { 2132 long freq = clk_get_rate(sensor->clk); 2133 unsigned int duration; 2134 2135 /* 2136 * The minimum duration is 50 clock cycles, thus typically 2137 * around 2µs. Double it to be safe. 2138 */ 2139 duration = DIV_ROUND_UP(2 * 50 * 1000000, freq); 2140 2141 gpiod_set_value(sensor->reset, 1); 2142 fsleep(duration); 2143 gpiod_set_value(sensor->reset, 0); 2144 } else { 2145 /* 2146 * The power may have just been turned on, we need to wait for 2147 * the sensor to be ready to accept I2C commands. 2148 */ 2149 usleep_range(44500, 50000); 2150 2151 cci_write(sensor->regmap, MT9M114_RESET_AND_MISC_CONTROL, 2152 MT9M114_RESET_SOC, &ret); 2153 cci_write(sensor->regmap, MT9M114_RESET_AND_MISC_CONTROL, 0, 2154 &ret); 2155 2156 if (ret < 0) { 2157 dev_err(&sensor->client->dev, "Soft reset failed\n"); 2158 goto error_clock; 2159 } 2160 } 2161 2162 /* 2163 * Wait for the sensor to be ready to accept I2C commands by polling the 2164 * command register to wait for initialization to complete. 2165 */ 2166 usleep_range(44500, 50000); 2167 2168 ret = mt9m114_poll_command(sensor, MT9M114_COMMAND_REGISTER_SET_STATE); 2169 if (ret < 0) 2170 goto error_clock; 2171 2172 if (sensor->bus_cfg.bus_type == V4L2_MBUS_PARALLEL) { 2173 /* 2174 * In parallel mode (OE set to low), the sensor will enter the 2175 * streaming state after initialization. Enter the standby 2176 * manually to stop streaming. 2177 */ 2178 ret = mt9m114_set_state(sensor, 2179 MT9M114_SYS_STATE_ENTER_STANDBY); 2180 if (ret < 0) 2181 goto error_clock; 2182 } 2183 2184 /* 2185 * Before issuing any Set-State command, we must ensure that the sensor 2186 * reaches the standby mode (either initiated manually above in 2187 * parallel mode, or automatically after reset in MIPI mode). 2188 */ 2189 ret = mt9m114_poll_state(sensor, MT9M114_SYS_STATE_STANDBY); 2190 if (ret < 0) 2191 goto error_clock; 2192 2193 return 0; 2194 2195 error_clock: 2196 clk_disable_unprepare(sensor->clk); 2197 error_regulator: 2198 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); 2199 return ret; 2200 } 2201 2202 static void mt9m114_power_off(struct mt9m114 *sensor) 2203 { 2204 clk_disable_unprepare(sensor->clk); 2205 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); 2206 } 2207 2208 static int __maybe_unused mt9m114_runtime_resume(struct device *dev) 2209 { 2210 struct v4l2_subdev *sd = dev_get_drvdata(dev); 2211 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2212 int ret; 2213 2214 ret = mt9m114_power_on(sensor); 2215 if (ret) 2216 return ret; 2217 2218 ret = mt9m114_initialize(sensor); 2219 if (ret) { 2220 mt9m114_power_off(sensor); 2221 return ret; 2222 } 2223 2224 return 0; 2225 } 2226 2227 static int __maybe_unused mt9m114_runtime_suspend(struct device *dev) 2228 { 2229 struct v4l2_subdev *sd = dev_get_drvdata(dev); 2230 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2231 2232 mt9m114_power_off(sensor); 2233 2234 return 0; 2235 } 2236 2237 static const struct dev_pm_ops mt9m114_pm_ops = { 2238 SET_RUNTIME_PM_OPS(mt9m114_runtime_suspend, mt9m114_runtime_resume, NULL) 2239 }; 2240 2241 /* ----------------------------------------------------------------------------- 2242 * Probe & Remove 2243 */ 2244 2245 static int mt9m114_verify_link_frequency(struct mt9m114 *sensor, 2246 unsigned int pixrate) 2247 { 2248 unsigned int link_freq = sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY 2249 ? pixrate * 8 : pixrate * 2; 2250 2251 if (sensor->bus_cfg.nr_of_link_frequencies != 1 || 2252 sensor->bus_cfg.link_frequencies[0] != link_freq) 2253 return -EINVAL; 2254 2255 return 0; 2256 } 2257 2258 static int mt9m114_clk_init(struct mt9m114 *sensor) 2259 { 2260 unsigned int pixrate; 2261 2262 /* Hardcode the PLL multiplier and dividers to default settings. */ 2263 sensor->pll.m = 32; 2264 sensor->pll.n = 1; 2265 sensor->pll.p = 7; 2266 2267 /* 2268 * Calculate the pixel rate and link frequency. The CSI-2 bus is clocked 2269 * for 16-bit per pixel, transmitted in DDR over a single lane. For 2270 * parallel mode, the sensor ouputs one pixel in two PIXCLK cycles. 2271 */ 2272 2273 /* 2274 * Check if EXTCLK fits the configured link frequency. Bypass the PLL 2275 * in this case. 2276 */ 2277 pixrate = clk_get_rate(sensor->clk) / 2; 2278 if (mt9m114_verify_link_frequency(sensor, pixrate) == 0) { 2279 sensor->pixrate = pixrate; 2280 sensor->bypass_pll = true; 2281 return 0; 2282 } 2283 2284 /* Check if the PLL configuration fits the configured link frequency. */ 2285 pixrate = clk_get_rate(sensor->clk) * sensor->pll.m 2286 / ((sensor->pll.n + 1) * (sensor->pll.p + 1)); 2287 if (mt9m114_verify_link_frequency(sensor, pixrate) == 0) { 2288 sensor->pixrate = pixrate; 2289 sensor->bypass_pll = false; 2290 return 0; 2291 } 2292 2293 dev_err(&sensor->client->dev, "Unsupported DT link-frequencies\n"); 2294 return -EINVAL; 2295 } 2296 2297 static int mt9m114_identify(struct mt9m114 *sensor) 2298 { 2299 u64 major, minor, release, customer; 2300 u64 value; 2301 int ret; 2302 2303 ret = cci_read(sensor->regmap, MT9M114_CHIP_ID, &value, NULL); 2304 if (ret) { 2305 dev_err(&sensor->client->dev, "Failed to read chip ID\n"); 2306 return -ENXIO; 2307 } 2308 2309 if (value != 0x2481) { 2310 dev_err(&sensor->client->dev, "Invalid chip ID 0x%04llx\n", 2311 value); 2312 return -ENXIO; 2313 } 2314 2315 cci_read(sensor->regmap, MT9M114_MON_MAJOR_VERSION, &major, &ret); 2316 cci_read(sensor->regmap, MT9M114_MON_MINOR_VERSION, &minor, &ret); 2317 cci_read(sensor->regmap, MT9M114_MON_RELEASE_VERSION, &release, &ret); 2318 cci_read(sensor->regmap, MT9M114_CUSTOMER_REV, &customer, &ret); 2319 if (ret) { 2320 dev_err(&sensor->client->dev, "Failed to read version\n"); 2321 return -ENXIO; 2322 } 2323 2324 dev_dbg(&sensor->client->dev, 2325 "monitor v%llu.%llu.%04llx customer rev 0x%04llx\n", 2326 major, minor, release, customer); 2327 2328 return 0; 2329 } 2330 2331 static int mt9m114_parse_dt(struct mt9m114 *sensor) 2332 { 2333 struct fwnode_handle *fwnode = dev_fwnode(&sensor->client->dev); 2334 struct fwnode_handle *ep; 2335 int ret; 2336 2337 ep = fwnode_graph_get_next_endpoint(fwnode, NULL); 2338 if (!ep) { 2339 dev_err(&sensor->client->dev, "No endpoint found\n"); 2340 return -EINVAL; 2341 } 2342 2343 sensor->bus_cfg.bus_type = V4L2_MBUS_UNKNOWN; 2344 ret = v4l2_fwnode_endpoint_alloc_parse(ep, &sensor->bus_cfg); 2345 fwnode_handle_put(ep); 2346 if (ret < 0) { 2347 dev_err(&sensor->client->dev, "Failed to parse endpoint\n"); 2348 goto error; 2349 } 2350 2351 switch (sensor->bus_cfg.bus_type) { 2352 case V4L2_MBUS_CSI2_DPHY: 2353 case V4L2_MBUS_PARALLEL: 2354 break; 2355 2356 default: 2357 dev_err(&sensor->client->dev, "unsupported bus type %u\n", 2358 sensor->bus_cfg.bus_type); 2359 ret = -EINVAL; 2360 goto error; 2361 } 2362 2363 return 0; 2364 2365 error: 2366 v4l2_fwnode_endpoint_free(&sensor->bus_cfg); 2367 return ret; 2368 } 2369 2370 static int mt9m114_probe(struct i2c_client *client) 2371 { 2372 struct device *dev = &client->dev; 2373 struct mt9m114 *sensor; 2374 int ret; 2375 2376 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); 2377 if (!sensor) 2378 return -ENOMEM; 2379 2380 sensor->client = client; 2381 2382 sensor->regmap = devm_cci_regmap_init_i2c(client, 16); 2383 if (IS_ERR(sensor->regmap)) { 2384 dev_err(dev, "Unable to initialize I2C\n"); 2385 return -ENODEV; 2386 } 2387 2388 ret = mt9m114_parse_dt(sensor); 2389 if (ret < 0) 2390 return ret; 2391 2392 /* Acquire clocks, GPIOs and regulators. */ 2393 sensor->clk = devm_clk_get(dev, NULL); 2394 if (IS_ERR(sensor->clk)) { 2395 ret = PTR_ERR(sensor->clk); 2396 dev_err_probe(dev, ret, "Failed to get clock\n"); 2397 goto error_ep_free; 2398 } 2399 2400 sensor->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); 2401 if (IS_ERR(sensor->reset)) { 2402 ret = PTR_ERR(sensor->reset); 2403 dev_err_probe(dev, ret, "Failed to get reset GPIO\n"); 2404 goto error_ep_free; 2405 } 2406 2407 sensor->supplies[0].supply = "vddio"; 2408 sensor->supplies[1].supply = "vdd"; 2409 sensor->supplies[2].supply = "vaa"; 2410 2411 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(sensor->supplies), 2412 sensor->supplies); 2413 if (ret < 0) { 2414 dev_err_probe(dev, ret, "Failed to get regulators\n"); 2415 goto error_ep_free; 2416 } 2417 2418 ret = mt9m114_clk_init(sensor); 2419 if (ret) 2420 goto error_ep_free; 2421 2422 /* 2423 * Identify the sensor. The driver supports runtime PM, but needs to 2424 * work when runtime PM is disabled in the kernel. To that end, power 2425 * the sensor on manually here, and initialize it after identification 2426 * to reach the same state as if resumed through runtime PM. 2427 */ 2428 ret = mt9m114_power_on(sensor); 2429 if (ret < 0) { 2430 dev_err_probe(dev, ret, "Could not power on the device\n"); 2431 goto error_ep_free; 2432 } 2433 2434 ret = mt9m114_identify(sensor); 2435 if (ret < 0) 2436 goto error_power_off; 2437 2438 ret = mt9m114_initialize(sensor); 2439 if (ret < 0) 2440 goto error_power_off; 2441 2442 /* 2443 * Enable runtime PM with autosuspend. As the device has been powered 2444 * manually, mark it as active, and increase the usage count without 2445 * resuming the device. 2446 */ 2447 pm_runtime_set_active(dev); 2448 pm_runtime_get_noresume(dev); 2449 pm_runtime_enable(dev); 2450 pm_runtime_set_autosuspend_delay(dev, 1000); 2451 pm_runtime_use_autosuspend(dev); 2452 2453 /* Initialize the subdevices. */ 2454 ret = mt9m114_pa_init(sensor); 2455 if (ret < 0) 2456 goto error_pm_cleanup; 2457 2458 ret = mt9m114_ifp_init(sensor); 2459 if (ret < 0) 2460 goto error_pa_cleanup; 2461 2462 ret = v4l2_async_register_subdev(&sensor->ifp.sd); 2463 if (ret < 0) 2464 goto error_ifp_cleanup; 2465 2466 /* 2467 * Decrease the PM usage count. The device will get suspended after the 2468 * autosuspend delay, turning the power off. 2469 */ 2470 pm_runtime_put_autosuspend(dev); 2471 2472 return 0; 2473 2474 error_ifp_cleanup: 2475 mt9m114_ifp_cleanup(sensor); 2476 error_pa_cleanup: 2477 mt9m114_pa_cleanup(sensor); 2478 error_pm_cleanup: 2479 pm_runtime_disable(dev); 2480 pm_runtime_put_noidle(dev); 2481 error_power_off: 2482 mt9m114_power_off(sensor); 2483 error_ep_free: 2484 v4l2_fwnode_endpoint_free(&sensor->bus_cfg); 2485 return ret; 2486 } 2487 2488 static void mt9m114_remove(struct i2c_client *client) 2489 { 2490 struct v4l2_subdev *sd = i2c_get_clientdata(client); 2491 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2492 struct device *dev = &client->dev; 2493 2494 v4l2_async_unregister_subdev(&sensor->ifp.sd); 2495 2496 mt9m114_ifp_cleanup(sensor); 2497 mt9m114_pa_cleanup(sensor); 2498 v4l2_fwnode_endpoint_free(&sensor->bus_cfg); 2499 2500 /* 2501 * Disable runtime PM. In case runtime PM is disabled in the kernel, 2502 * make sure to turn power off manually. 2503 */ 2504 pm_runtime_disable(dev); 2505 if (!pm_runtime_status_suspended(dev)) 2506 mt9m114_power_off(sensor); 2507 pm_runtime_set_suspended(dev); 2508 } 2509 2510 static const struct of_device_id mt9m114_of_ids[] = { 2511 { .compatible = "onnn,mt9m114" }, 2512 { /* sentinel */ }, 2513 }; 2514 MODULE_DEVICE_TABLE(of, mt9m114_of_ids); 2515 2516 static struct i2c_driver mt9m114_driver = { 2517 .driver = { 2518 .name = "mt9m114", 2519 .pm = &mt9m114_pm_ops, 2520 .of_match_table = mt9m114_of_ids, 2521 }, 2522 .probe = mt9m114_probe, 2523 .remove = mt9m114_remove, 2524 }; 2525 2526 module_i2c_driver(mt9m114_driver); 2527 2528 MODULE_DESCRIPTION("onsemi MT9M114 Sensor Driver"); 2529 MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@ideasonboard.com>"); 2530 MODULE_LICENSE("GPL"); 2531