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