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_mark_last_busy(&sensor->client->dev); 978 pm_runtime_put_autosuspend(&sensor->client->dev); 979 980 return ret; 981 } 982 983 static int mt9m114_stop_streaming(struct mt9m114 *sensor) 984 { 985 int ret; 986 987 sensor->streaming = false; 988 989 ret = mt9m114_set_state(sensor, MT9M114_SYS_STATE_ENTER_SUSPEND); 990 991 pm_runtime_mark_last_busy(&sensor->client->dev); 992 pm_runtime_put_autosuspend(&sensor->client->dev); 993 994 return ret; 995 } 996 997 /* ----------------------------------------------------------------------------- 998 * Common Subdev Operations 999 */ 1000 1001 static const struct media_entity_operations mt9m114_entity_ops = { 1002 .link_validate = v4l2_subdev_link_validate, 1003 }; 1004 1005 /* ----------------------------------------------------------------------------- 1006 * Pixel Array Control Operations 1007 */ 1008 1009 static inline struct mt9m114 *pa_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl) 1010 { 1011 return container_of(ctrl->handler, struct mt9m114, pa.hdl); 1012 } 1013 1014 static int mt9m114_pa_g_ctrl(struct v4l2_ctrl *ctrl) 1015 { 1016 struct mt9m114 *sensor = pa_ctrl_to_mt9m114(ctrl); 1017 u64 value; 1018 int ret; 1019 1020 if (!pm_runtime_get_if_in_use(&sensor->client->dev)) 1021 return 0; 1022 1023 switch (ctrl->id) { 1024 case V4L2_CID_EXPOSURE: 1025 ret = cci_read(sensor->regmap, 1026 MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME, 1027 &value, NULL); 1028 if (ret) 1029 break; 1030 1031 ctrl->val = value; 1032 break; 1033 1034 case V4L2_CID_ANALOGUE_GAIN: 1035 ret = cci_read(sensor->regmap, 1036 MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN, 1037 &value, NULL); 1038 if (ret) 1039 break; 1040 1041 ctrl->val = value; 1042 break; 1043 1044 default: 1045 ret = -EINVAL; 1046 break; 1047 } 1048 1049 pm_runtime_mark_last_busy(&sensor->client->dev); 1050 pm_runtime_put_autosuspend(&sensor->client->dev); 1051 1052 return ret; 1053 } 1054 1055 static int mt9m114_pa_s_ctrl(struct v4l2_ctrl *ctrl) 1056 { 1057 struct mt9m114 *sensor = pa_ctrl_to_mt9m114(ctrl); 1058 const struct v4l2_mbus_framefmt *format; 1059 struct v4l2_subdev_state *state; 1060 int ret = 0; 1061 u64 mask; 1062 1063 /* V4L2 controls values are applied only when power is up. */ 1064 if (!pm_runtime_get_if_in_use(&sensor->client->dev)) 1065 return 0; 1066 1067 state = v4l2_subdev_get_locked_active_state(&sensor->pa.sd); 1068 format = v4l2_subdev_state_get_format(state, 0); 1069 1070 switch (ctrl->id) { 1071 case V4L2_CID_HBLANK: 1072 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK, 1073 ctrl->val + format->width, &ret); 1074 break; 1075 1076 case V4L2_CID_VBLANK: 1077 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES, 1078 ctrl->val + format->height, &ret); 1079 break; 1080 1081 case V4L2_CID_EXPOSURE: 1082 cci_write(sensor->regmap, 1083 MT9M114_CAM_SENSOR_CONTROL_COARSE_INTEGRATION_TIME, 1084 ctrl->val, &ret); 1085 break; 1086 1087 case V4L2_CID_ANALOGUE_GAIN: 1088 /* 1089 * The CAM_SENSOR_CONTROL_ANALOG_GAIN contains linear analog 1090 * gain values that are mapped to the GLOBAL_GAIN register 1091 * values by the sensor firmware. 1092 */ 1093 cci_write(sensor->regmap, MT9M114_CAM_SENSOR_CONTROL_ANALOG_GAIN, 1094 ctrl->val, &ret); 1095 break; 1096 1097 case V4L2_CID_HFLIP: 1098 mask = MT9M114_CAM_SENSOR_CONTROL_HORZ_MIRROR_EN; 1099 ret = cci_update_bits(sensor->regmap, 1100 MT9M114_CAM_SENSOR_CONTROL_READ_MODE, 1101 mask, ctrl->val ? mask : 0, NULL); 1102 break; 1103 1104 case V4L2_CID_VFLIP: 1105 mask = MT9M114_CAM_SENSOR_CONTROL_VERT_FLIP_EN; 1106 ret = cci_update_bits(sensor->regmap, 1107 MT9M114_CAM_SENSOR_CONTROL_READ_MODE, 1108 mask, ctrl->val ? mask : 0, NULL); 1109 break; 1110 1111 default: 1112 ret = -EINVAL; 1113 break; 1114 } 1115 1116 pm_runtime_mark_last_busy(&sensor->client->dev); 1117 pm_runtime_put_autosuspend(&sensor->client->dev); 1118 1119 return ret; 1120 } 1121 1122 static const struct v4l2_ctrl_ops mt9m114_pa_ctrl_ops = { 1123 .g_volatile_ctrl = mt9m114_pa_g_ctrl, 1124 .s_ctrl = mt9m114_pa_s_ctrl, 1125 }; 1126 1127 static void mt9m114_pa_ctrl_update_exposure(struct mt9m114 *sensor, bool manual) 1128 { 1129 /* 1130 * Update the volatile flag on the manual exposure and gain controls. 1131 * If the controls have switched to manual, read their current value 1132 * from the hardware to ensure that control read and write operations 1133 * will behave correctly 1134 */ 1135 if (manual) { 1136 mt9m114_pa_g_ctrl(sensor->pa.exposure); 1137 sensor->pa.exposure->cur.val = sensor->pa.exposure->val; 1138 sensor->pa.exposure->flags &= ~V4L2_CTRL_FLAG_VOLATILE; 1139 1140 mt9m114_pa_g_ctrl(sensor->pa.gain); 1141 sensor->pa.gain->cur.val = sensor->pa.gain->val; 1142 sensor->pa.gain->flags &= ~V4L2_CTRL_FLAG_VOLATILE; 1143 } else { 1144 sensor->pa.exposure->flags |= V4L2_CTRL_FLAG_VOLATILE; 1145 sensor->pa.gain->flags |= V4L2_CTRL_FLAG_VOLATILE; 1146 } 1147 } 1148 1149 static void mt9m114_pa_ctrl_update_blanking(struct mt9m114 *sensor, 1150 const struct v4l2_mbus_framefmt *format) 1151 { 1152 unsigned int max_blank; 1153 1154 /* Update the blanking controls ranges based on the output size. */ 1155 max_blank = MT9M114_CAM_SENSOR_CFG_LINE_LENGTH_PCK_MAX 1156 - format->width; 1157 __v4l2_ctrl_modify_range(sensor->pa.hblank, MT9M114_MIN_HBLANK, 1158 max_blank, 1, MT9M114_DEF_HBLANK); 1159 1160 max_blank = MT9M114_CAM_SENSOR_CFG_FRAME_LENGTH_LINES_MAX 1161 - format->height; 1162 __v4l2_ctrl_modify_range(sensor->pa.vblank, MT9M114_MIN_VBLANK, 1163 max_blank, 1, MT9M114_DEF_VBLANK); 1164 } 1165 1166 /* ----------------------------------------------------------------------------- 1167 * Pixel Array Subdev Operations 1168 */ 1169 1170 static inline struct mt9m114 *pa_to_mt9m114(struct v4l2_subdev *sd) 1171 { 1172 return container_of(sd, struct mt9m114, pa.sd); 1173 } 1174 1175 static int mt9m114_pa_init_state(struct v4l2_subdev *sd, 1176 struct v4l2_subdev_state *state) 1177 { 1178 struct v4l2_mbus_framefmt *format; 1179 struct v4l2_rect *crop; 1180 1181 crop = v4l2_subdev_state_get_crop(state, 0); 1182 1183 crop->left = 0; 1184 crop->top = 0; 1185 crop->width = MT9M114_PIXEL_ARRAY_WIDTH; 1186 crop->height = MT9M114_PIXEL_ARRAY_HEIGHT; 1187 1188 format = v4l2_subdev_state_get_format(state, 0); 1189 1190 format->width = MT9M114_PIXEL_ARRAY_WIDTH; 1191 format->height = MT9M114_PIXEL_ARRAY_HEIGHT; 1192 format->code = MEDIA_BUS_FMT_SGRBG10_1X10; 1193 format->field = V4L2_FIELD_NONE; 1194 format->colorspace = V4L2_COLORSPACE_RAW; 1195 format->ycbcr_enc = V4L2_YCBCR_ENC_601; 1196 format->quantization = V4L2_QUANTIZATION_FULL_RANGE; 1197 format->xfer_func = V4L2_XFER_FUNC_NONE; 1198 1199 return 0; 1200 } 1201 1202 static int mt9m114_pa_enum_mbus_code(struct v4l2_subdev *sd, 1203 struct v4l2_subdev_state *state, 1204 struct v4l2_subdev_mbus_code_enum *code) 1205 { 1206 if (code->index > 0) 1207 return -EINVAL; 1208 1209 code->code = MEDIA_BUS_FMT_SGRBG10_1X10; 1210 1211 return 0; 1212 } 1213 1214 static int mt9m114_pa_enum_framesizes(struct v4l2_subdev *sd, 1215 struct v4l2_subdev_state *state, 1216 struct v4l2_subdev_frame_size_enum *fse) 1217 { 1218 if (fse->index > 1) 1219 return -EINVAL; 1220 1221 if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10) 1222 return -EINVAL; 1223 1224 /* Report binning capability through frame size enumeration. */ 1225 fse->min_width = MT9M114_PIXEL_ARRAY_WIDTH / (fse->index + 1); 1226 fse->max_width = MT9M114_PIXEL_ARRAY_WIDTH / (fse->index + 1); 1227 fse->min_height = MT9M114_PIXEL_ARRAY_HEIGHT / (fse->index + 1); 1228 fse->max_height = MT9M114_PIXEL_ARRAY_HEIGHT / (fse->index + 1); 1229 1230 return 0; 1231 } 1232 1233 static int mt9m114_pa_set_fmt(struct v4l2_subdev *sd, 1234 struct v4l2_subdev_state *state, 1235 struct v4l2_subdev_format *fmt) 1236 { 1237 struct mt9m114 *sensor = pa_to_mt9m114(sd); 1238 struct v4l2_mbus_framefmt *format; 1239 struct v4l2_rect *crop; 1240 unsigned int hscale; 1241 unsigned int vscale; 1242 1243 crop = v4l2_subdev_state_get_crop(state, fmt->pad); 1244 format = v4l2_subdev_state_get_format(state, fmt->pad); 1245 1246 /* The sensor can bin horizontally and vertically. */ 1247 hscale = DIV_ROUND_CLOSEST(crop->width, fmt->format.width ? : 1); 1248 vscale = DIV_ROUND_CLOSEST(crop->height, fmt->format.height ? : 1); 1249 format->width = crop->width / clamp(hscale, 1U, 2U); 1250 format->height = crop->height / clamp(vscale, 1U, 2U); 1251 1252 fmt->format = *format; 1253 1254 if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) 1255 mt9m114_pa_ctrl_update_blanking(sensor, format); 1256 1257 return 0; 1258 } 1259 1260 static int mt9m114_pa_get_selection(struct v4l2_subdev *sd, 1261 struct v4l2_subdev_state *state, 1262 struct v4l2_subdev_selection *sel) 1263 { 1264 switch (sel->target) { 1265 case V4L2_SEL_TGT_CROP: 1266 sel->r = *v4l2_subdev_state_get_crop(state, sel->pad); 1267 return 0; 1268 1269 case V4L2_SEL_TGT_CROP_DEFAULT: 1270 case V4L2_SEL_TGT_CROP_BOUNDS: 1271 case V4L2_SEL_TGT_NATIVE_SIZE: 1272 sel->r.left = 0; 1273 sel->r.top = 0; 1274 sel->r.width = MT9M114_PIXEL_ARRAY_WIDTH; 1275 sel->r.height = MT9M114_PIXEL_ARRAY_HEIGHT; 1276 return 0; 1277 1278 default: 1279 return -EINVAL; 1280 } 1281 } 1282 1283 static int mt9m114_pa_set_selection(struct v4l2_subdev *sd, 1284 struct v4l2_subdev_state *state, 1285 struct v4l2_subdev_selection *sel) 1286 { 1287 struct mt9m114 *sensor = pa_to_mt9m114(sd); 1288 struct v4l2_mbus_framefmt *format; 1289 struct v4l2_rect *crop; 1290 1291 if (sel->target != V4L2_SEL_TGT_CROP) 1292 return -EINVAL; 1293 1294 crop = v4l2_subdev_state_get_crop(state, sel->pad); 1295 format = v4l2_subdev_state_get_format(state, sel->pad); 1296 1297 /* 1298 * Clamp the crop rectangle. The vertical coordinates must be even, and 1299 * the horizontal coordinates must be a multiple of 4. 1300 * 1301 * FIXME: The horizontal coordinates must be a multiple of 8 when 1302 * binning, but binning is configured after setting the selection, so 1303 * we can't know tell here if it will be used. 1304 */ 1305 crop->left = ALIGN(sel->r.left, 4); 1306 crop->top = ALIGN(sel->r.top, 2); 1307 crop->width = clamp_t(unsigned int, ALIGN(sel->r.width, 4), 1308 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH, 1309 MT9M114_PIXEL_ARRAY_WIDTH - crop->left); 1310 crop->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2), 1311 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT, 1312 MT9M114_PIXEL_ARRAY_HEIGHT - crop->top); 1313 1314 sel->r = *crop; 1315 1316 /* Reset the format. */ 1317 format->width = crop->width; 1318 format->height = crop->height; 1319 1320 if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE) 1321 mt9m114_pa_ctrl_update_blanking(sensor, format); 1322 1323 return 0; 1324 } 1325 1326 static const struct v4l2_subdev_pad_ops mt9m114_pa_pad_ops = { 1327 .enum_mbus_code = mt9m114_pa_enum_mbus_code, 1328 .enum_frame_size = mt9m114_pa_enum_framesizes, 1329 .get_fmt = v4l2_subdev_get_fmt, 1330 .set_fmt = mt9m114_pa_set_fmt, 1331 .get_selection = mt9m114_pa_get_selection, 1332 .set_selection = mt9m114_pa_set_selection, 1333 }; 1334 1335 static const struct v4l2_subdev_ops mt9m114_pa_ops = { 1336 .pad = &mt9m114_pa_pad_ops, 1337 }; 1338 1339 static const struct v4l2_subdev_internal_ops mt9m114_pa_internal_ops = { 1340 .init_state = mt9m114_pa_init_state, 1341 }; 1342 1343 static int mt9m114_pa_init(struct mt9m114 *sensor) 1344 { 1345 struct v4l2_ctrl_handler *hdl = &sensor->pa.hdl; 1346 struct v4l2_subdev *sd = &sensor->pa.sd; 1347 struct media_pad *pads = &sensor->pa.pad; 1348 const struct v4l2_mbus_framefmt *format; 1349 struct v4l2_subdev_state *state; 1350 unsigned int max_exposure; 1351 int ret; 1352 1353 /* Initialize the subdev. */ 1354 v4l2_subdev_init(sd, &mt9m114_pa_ops); 1355 sd->internal_ops = &mt9m114_pa_internal_ops; 1356 v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " pixel array"); 1357 1358 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 1359 sd->owner = THIS_MODULE; 1360 sd->dev = &sensor->client->dev; 1361 v4l2_set_subdevdata(sd, sensor->client); 1362 1363 /* Initialize the media entity. */ 1364 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; 1365 sd->entity.ops = &mt9m114_entity_ops; 1366 pads[0].flags = MEDIA_PAD_FL_SOURCE; 1367 ret = media_entity_pads_init(&sd->entity, 1, pads); 1368 if (ret < 0) 1369 return ret; 1370 1371 /* Initialize the control handler. */ 1372 v4l2_ctrl_handler_init(hdl, 7); 1373 1374 /* The range of the HBLANK and VBLANK controls will be updated below. */ 1375 sensor->pa.hblank = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1376 V4L2_CID_HBLANK, 1377 MT9M114_DEF_HBLANK, 1378 MT9M114_DEF_HBLANK, 1, 1379 MT9M114_DEF_HBLANK); 1380 sensor->pa.vblank = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1381 V4L2_CID_VBLANK, 1382 MT9M114_DEF_VBLANK, 1383 MT9M114_DEF_VBLANK, 1, 1384 MT9M114_DEF_VBLANK); 1385 1386 /* 1387 * The maximum coarse integration time is the frame length in lines 1388 * minus two. The default is taken directly from the datasheet, but 1389 * makes little sense as auto-exposure is enabled by default. 1390 */ 1391 max_exposure = MT9M114_PIXEL_ARRAY_HEIGHT + MT9M114_MIN_VBLANK - 2; 1392 sensor->pa.exposure = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1393 V4L2_CID_EXPOSURE, 1, 1394 max_exposure, 1, 16); 1395 if (sensor->pa.exposure) 1396 sensor->pa.exposure->flags |= V4L2_CTRL_FLAG_VOLATILE; 1397 1398 sensor->pa.gain = v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1399 V4L2_CID_ANALOGUE_GAIN, 1, 1400 511, 1, 32); 1401 if (sensor->pa.gain) 1402 sensor->pa.gain->flags |= V4L2_CTRL_FLAG_VOLATILE; 1403 1404 v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1405 V4L2_CID_PIXEL_RATE, 1406 sensor->pixrate, sensor->pixrate, 1, 1407 sensor->pixrate); 1408 1409 v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1410 V4L2_CID_HFLIP, 1411 0, 1, 1, 0); 1412 v4l2_ctrl_new_std(hdl, &mt9m114_pa_ctrl_ops, 1413 V4L2_CID_VFLIP, 1414 0, 1, 1, 0); 1415 1416 if (hdl->error) { 1417 ret = hdl->error; 1418 goto error; 1419 } 1420 1421 sd->state_lock = hdl->lock; 1422 1423 ret = v4l2_subdev_init_finalize(sd); 1424 if (ret) 1425 goto error; 1426 1427 /* Update the range of the blanking controls based on the format. */ 1428 state = v4l2_subdev_lock_and_get_active_state(sd); 1429 format = v4l2_subdev_state_get_format(state, 0); 1430 mt9m114_pa_ctrl_update_blanking(sensor, format); 1431 v4l2_subdev_unlock_state(state); 1432 1433 sd->ctrl_handler = hdl; 1434 1435 return 0; 1436 1437 error: 1438 v4l2_ctrl_handler_free(&sensor->pa.hdl); 1439 media_entity_cleanup(&sensor->pa.sd.entity); 1440 return ret; 1441 } 1442 1443 static void mt9m114_pa_cleanup(struct mt9m114 *sensor) 1444 { 1445 v4l2_ctrl_handler_free(&sensor->pa.hdl); 1446 media_entity_cleanup(&sensor->pa.sd.entity); 1447 } 1448 1449 /* ----------------------------------------------------------------------------- 1450 * Image Flow Processor Control Operations 1451 */ 1452 1453 static const char * const mt9m114_test_pattern_menu[] = { 1454 "Disabled", 1455 "Solid Color", 1456 "100% Color Bars", 1457 "Pseudo-Random", 1458 "Fade-to-Gray Color Bars", 1459 "Walking Ones 10-bit", 1460 "Walking Ones 8-bit", 1461 }; 1462 1463 /* Keep in sync with mt9m114_test_pattern_menu */ 1464 static const unsigned int mt9m114_test_pattern_value[] = { 1465 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID, 1466 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_SOLID_BARS, 1467 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_RANDOM, 1468 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_FADING_BARS, 1469 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_10B, 1470 MT9M114_CAM_MODE_TEST_PATTERN_SELECT_WALKING_1S_8B, 1471 }; 1472 1473 static inline struct mt9m114 *ifp_ctrl_to_mt9m114(struct v4l2_ctrl *ctrl) 1474 { 1475 return container_of(ctrl->handler, struct mt9m114, ifp.hdl); 1476 } 1477 1478 static int mt9m114_ifp_s_ctrl(struct v4l2_ctrl *ctrl) 1479 { 1480 struct mt9m114 *sensor = ifp_ctrl_to_mt9m114(ctrl); 1481 u32 value; 1482 int ret = 0; 1483 1484 if (ctrl->id == V4L2_CID_EXPOSURE_AUTO) 1485 mt9m114_pa_ctrl_update_exposure(sensor, 1486 ctrl->val != V4L2_EXPOSURE_AUTO); 1487 1488 /* V4L2 controls values are applied only when power is up. */ 1489 if (!pm_runtime_get_if_in_use(&sensor->client->dev)) 1490 return 0; 1491 1492 switch (ctrl->id) { 1493 case V4L2_CID_AUTO_WHITE_BALANCE: 1494 /* Control both the AWB mode and the CCM algorithm. */ 1495 if (ctrl->val) 1496 value = MT9M114_CAM_AWB_MODE_AUTO 1497 | MT9M114_CAM_AWB_MODE_EXCLUSIVE_AE; 1498 else 1499 value = 0; 1500 1501 cci_write(sensor->regmap, MT9M114_CAM_AWB_AWBMODE, value, &ret); 1502 1503 if (ctrl->val) 1504 value = MT9M114_CCM_EXEC_CALC_CCM_MATRIX | 0x22; 1505 else 1506 value = 0; 1507 1508 cci_write(sensor->regmap, MT9M114_CCM_ALGO, value, &ret); 1509 break; 1510 1511 case V4L2_CID_EXPOSURE_AUTO: 1512 if (ctrl->val == V4L2_EXPOSURE_AUTO) 1513 value = MT9M114_AE_TRACK_EXEC_AUTOMATIC_EXPOSURE 1514 | 0x00fe; 1515 else 1516 value = 0; 1517 1518 cci_write(sensor->regmap, MT9M114_AE_TRACK_ALGO, value, &ret); 1519 if (ret) 1520 break; 1521 1522 break; 1523 1524 case V4L2_CID_TEST_PATTERN: 1525 case V4L2_CID_TEST_PATTERN_RED: 1526 case V4L2_CID_TEST_PATTERN_GREENR: 1527 case V4L2_CID_TEST_PATTERN_BLUE: { 1528 unsigned int pattern = sensor->ifp.tpg[MT9M114_TPG_PATTERN]->val; 1529 1530 if (pattern) { 1531 cci_write(sensor->regmap, MT9M114_CAM_MODE_SELECT, 1532 MT9M114_CAM_MODE_SELECT_TEST_PATTERN, &ret); 1533 cci_write(sensor->regmap, 1534 MT9M114_CAM_MODE_TEST_PATTERN_SELECT, 1535 mt9m114_test_pattern_value[pattern - 1], &ret); 1536 cci_write(sensor->regmap, 1537 MT9M114_CAM_MODE_TEST_PATTERN_RED, 1538 sensor->ifp.tpg[MT9M114_TPG_RED]->val, &ret); 1539 cci_write(sensor->regmap, 1540 MT9M114_CAM_MODE_TEST_PATTERN_GREEN, 1541 sensor->ifp.tpg[MT9M114_TPG_GREEN]->val, &ret); 1542 cci_write(sensor->regmap, 1543 MT9M114_CAM_MODE_TEST_PATTERN_BLUE, 1544 sensor->ifp.tpg[MT9M114_TPG_BLUE]->val, &ret); 1545 } else { 1546 cci_write(sensor->regmap, MT9M114_CAM_MODE_SELECT, 1547 MT9M114_CAM_MODE_SELECT_NORMAL, &ret); 1548 } 1549 1550 /* 1551 * A Config-Change needs to be issued for the change to take 1552 * effect. If we're not streaming ignore this, the change will 1553 * be applied when the stream is started. 1554 */ 1555 if (ret || !sensor->streaming) 1556 break; 1557 1558 ret = mt9m114_set_state(sensor, 1559 MT9M114_SYS_STATE_ENTER_CONFIG_CHANGE); 1560 break; 1561 } 1562 1563 default: 1564 ret = -EINVAL; 1565 break; 1566 } 1567 1568 pm_runtime_mark_last_busy(&sensor->client->dev); 1569 pm_runtime_put_autosuspend(&sensor->client->dev); 1570 1571 return ret; 1572 } 1573 1574 static const struct v4l2_ctrl_ops mt9m114_ifp_ctrl_ops = { 1575 .s_ctrl = mt9m114_ifp_s_ctrl, 1576 }; 1577 1578 /* ----------------------------------------------------------------------------- 1579 * Image Flow Processor Subdev Operations 1580 */ 1581 1582 static inline struct mt9m114 *ifp_to_mt9m114(struct v4l2_subdev *sd) 1583 { 1584 return container_of(sd, struct mt9m114, ifp.sd); 1585 } 1586 1587 static int mt9m114_ifp_s_stream(struct v4l2_subdev *sd, int enable) 1588 { 1589 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1590 struct v4l2_subdev_state *pa_state; 1591 struct v4l2_subdev_state *ifp_state; 1592 int ret; 1593 1594 if (!enable) 1595 return mt9m114_stop_streaming(sensor); 1596 1597 ifp_state = v4l2_subdev_lock_and_get_active_state(&sensor->ifp.sd); 1598 pa_state = v4l2_subdev_lock_and_get_active_state(&sensor->pa.sd); 1599 1600 ret = mt9m114_start_streaming(sensor, pa_state, ifp_state); 1601 1602 v4l2_subdev_unlock_state(pa_state); 1603 v4l2_subdev_unlock_state(ifp_state); 1604 1605 return ret; 1606 } 1607 1608 static int mt9m114_ifp_get_frame_interval(struct v4l2_subdev *sd, 1609 struct v4l2_subdev_state *sd_state, 1610 struct v4l2_subdev_frame_interval *interval) 1611 { 1612 struct v4l2_fract *ival = &interval->interval; 1613 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1614 1615 /* 1616 * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2 1617 * subdev active state API. 1618 */ 1619 if (interval->which != V4L2_SUBDEV_FORMAT_ACTIVE) 1620 return -EINVAL; 1621 1622 ival->numerator = 1; 1623 ival->denominator = sensor->ifp.frame_rate; 1624 1625 return 0; 1626 } 1627 1628 static int mt9m114_ifp_set_frame_interval(struct v4l2_subdev *sd, 1629 struct v4l2_subdev_state *sd_state, 1630 struct v4l2_subdev_frame_interval *interval) 1631 { 1632 struct v4l2_fract *ival = &interval->interval; 1633 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1634 int ret = 0; 1635 1636 /* 1637 * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2 1638 * subdev active state API. 1639 */ 1640 if (interval->which != V4L2_SUBDEV_FORMAT_ACTIVE) 1641 return -EINVAL; 1642 1643 if (ival->numerator != 0 && ival->denominator != 0) 1644 sensor->ifp.frame_rate = min_t(unsigned int, 1645 ival->denominator / ival->numerator, 1646 MT9M114_MAX_FRAME_RATE); 1647 else 1648 sensor->ifp.frame_rate = MT9M114_MAX_FRAME_RATE; 1649 1650 ival->numerator = 1; 1651 ival->denominator = sensor->ifp.frame_rate; 1652 1653 if (sensor->streaming) 1654 ret = mt9m114_set_frame_rate(sensor); 1655 1656 return ret; 1657 } 1658 1659 static int mt9m114_ifp_init_state(struct v4l2_subdev *sd, 1660 struct v4l2_subdev_state *state) 1661 { 1662 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1663 struct v4l2_mbus_framefmt *format; 1664 struct v4l2_rect *crop; 1665 struct v4l2_rect *compose; 1666 1667 format = v4l2_subdev_state_get_format(state, 0); 1668 1669 format->width = MT9M114_PIXEL_ARRAY_WIDTH; 1670 format->height = MT9M114_PIXEL_ARRAY_HEIGHT; 1671 format->code = MEDIA_BUS_FMT_SGRBG10_1X10; 1672 format->field = V4L2_FIELD_NONE; 1673 format->colorspace = V4L2_COLORSPACE_RAW; 1674 format->ycbcr_enc = V4L2_YCBCR_ENC_601; 1675 format->quantization = V4L2_QUANTIZATION_FULL_RANGE; 1676 format->xfer_func = V4L2_XFER_FUNC_NONE; 1677 1678 crop = v4l2_subdev_state_get_crop(state, 0); 1679 1680 crop->left = 4; 1681 crop->top = 4; 1682 crop->width = format->width - 8; 1683 crop->height = format->height - 8; 1684 1685 compose = v4l2_subdev_state_get_compose(state, 0); 1686 1687 compose->left = 0; 1688 compose->top = 0; 1689 compose->width = crop->width; 1690 compose->height = crop->height; 1691 1692 format = v4l2_subdev_state_get_format(state, 1); 1693 1694 format->width = compose->width; 1695 format->height = compose->height; 1696 format->code = mt9m114_default_format_info(sensor)->code; 1697 format->field = V4L2_FIELD_NONE; 1698 format->colorspace = V4L2_COLORSPACE_SRGB; 1699 format->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; 1700 format->quantization = V4L2_QUANTIZATION_DEFAULT; 1701 format->xfer_func = V4L2_XFER_FUNC_DEFAULT; 1702 1703 return 0; 1704 } 1705 1706 static int mt9m114_ifp_enum_mbus_code(struct v4l2_subdev *sd, 1707 struct v4l2_subdev_state *state, 1708 struct v4l2_subdev_mbus_code_enum *code) 1709 { 1710 const unsigned int num_formats = ARRAY_SIZE(mt9m114_format_infos); 1711 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1712 unsigned int index = 0; 1713 unsigned int flag; 1714 unsigned int i; 1715 1716 switch (code->pad) { 1717 case 0: 1718 if (code->index != 0) 1719 return -EINVAL; 1720 1721 code->code = mt9m114_format_infos[num_formats - 1].code; 1722 return 0; 1723 1724 case 1: 1725 if (sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) 1726 flag = MT9M114_FMT_FLAG_CSI2; 1727 else 1728 flag = MT9M114_FMT_FLAG_PARALLEL; 1729 1730 for (i = 0; i < num_formats; ++i) { 1731 const struct mt9m114_format_info *info = 1732 &mt9m114_format_infos[i]; 1733 1734 if (info->flags & flag) { 1735 if (index == code->index) { 1736 code->code = info->code; 1737 return 0; 1738 } 1739 1740 index++; 1741 } 1742 } 1743 1744 return -EINVAL; 1745 1746 default: 1747 return -EINVAL; 1748 } 1749 } 1750 1751 static int mt9m114_ifp_enum_framesizes(struct v4l2_subdev *sd, 1752 struct v4l2_subdev_state *state, 1753 struct v4l2_subdev_frame_size_enum *fse) 1754 { 1755 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1756 const struct mt9m114_format_info *info; 1757 1758 if (fse->index > 0) 1759 return -EINVAL; 1760 1761 info = mt9m114_format_info(sensor, fse->pad, fse->code); 1762 if (!info || info->code != fse->code) 1763 return -EINVAL; 1764 1765 if (fse->pad == 0) { 1766 fse->min_width = MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH; 1767 fse->max_width = MT9M114_PIXEL_ARRAY_WIDTH; 1768 fse->min_height = MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT; 1769 fse->max_height = MT9M114_PIXEL_ARRAY_HEIGHT; 1770 } else { 1771 const struct v4l2_rect *crop; 1772 1773 crop = v4l2_subdev_state_get_crop(state, 0); 1774 1775 fse->max_width = crop->width; 1776 fse->max_height = crop->height; 1777 1778 fse->min_width = fse->max_width / 4; 1779 fse->min_height = fse->max_height / 4; 1780 } 1781 1782 return 0; 1783 } 1784 1785 static int mt9m114_ifp_enum_frameintervals(struct v4l2_subdev *sd, 1786 struct v4l2_subdev_state *state, 1787 struct v4l2_subdev_frame_interval_enum *fie) 1788 { 1789 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1790 const struct mt9m114_format_info *info; 1791 1792 if (fie->index > 0) 1793 return -EINVAL; 1794 1795 info = mt9m114_format_info(sensor, fie->pad, fie->code); 1796 if (!info || info->code != fie->code) 1797 return -EINVAL; 1798 1799 fie->interval.numerator = 1; 1800 fie->interval.denominator = MT9M114_MAX_FRAME_RATE; 1801 1802 return 0; 1803 } 1804 1805 static int mt9m114_ifp_set_fmt(struct v4l2_subdev *sd, 1806 struct v4l2_subdev_state *state, 1807 struct v4l2_subdev_format *fmt) 1808 { 1809 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1810 struct v4l2_mbus_framefmt *format; 1811 1812 format = v4l2_subdev_state_get_format(state, fmt->pad); 1813 1814 if (fmt->pad == 0) { 1815 /* Only the size can be changed on the sink pad. */ 1816 format->width = clamp(ALIGN(fmt->format.width, 8), 1817 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_WIDTH, 1818 MT9M114_PIXEL_ARRAY_WIDTH); 1819 format->height = clamp(ALIGN(fmt->format.height, 8), 1820 MT9M114_PIXEL_ARRAY_MIN_OUTPUT_HEIGHT, 1821 MT9M114_PIXEL_ARRAY_HEIGHT); 1822 } else { 1823 const struct mt9m114_format_info *info; 1824 1825 /* Only the media bus code can be changed on the source pad. */ 1826 info = mt9m114_format_info(sensor, 1, fmt->format.code); 1827 1828 format->code = info->code; 1829 1830 /* If the output format is RAW10, bypass the scaler. */ 1831 if (format->code == MEDIA_BUS_FMT_SGRBG10_1X10) 1832 *format = *v4l2_subdev_state_get_format(state, 0); 1833 } 1834 1835 fmt->format = *format; 1836 1837 return 0; 1838 } 1839 1840 static int mt9m114_ifp_get_selection(struct v4l2_subdev *sd, 1841 struct v4l2_subdev_state *state, 1842 struct v4l2_subdev_selection *sel) 1843 { 1844 const struct v4l2_mbus_framefmt *format; 1845 const struct v4l2_rect *crop; 1846 int ret = 0; 1847 1848 /* Crop and compose are only supported on the sink pad. */ 1849 if (sel->pad != 0) 1850 return -EINVAL; 1851 1852 switch (sel->target) { 1853 case V4L2_SEL_TGT_CROP: 1854 sel->r = *v4l2_subdev_state_get_crop(state, 0); 1855 break; 1856 1857 case V4L2_SEL_TGT_CROP_DEFAULT: 1858 case V4L2_SEL_TGT_CROP_BOUNDS: 1859 /* 1860 * The crop default and bounds are equal to the sink 1861 * format size minus 4 pixels on each side for demosaicing. 1862 */ 1863 format = v4l2_subdev_state_get_format(state, 0); 1864 1865 sel->r.left = 4; 1866 sel->r.top = 4; 1867 sel->r.width = format->width - 8; 1868 sel->r.height = format->height - 8; 1869 break; 1870 1871 case V4L2_SEL_TGT_COMPOSE: 1872 sel->r = *v4l2_subdev_state_get_compose(state, 0); 1873 break; 1874 1875 case V4L2_SEL_TGT_COMPOSE_DEFAULT: 1876 case V4L2_SEL_TGT_COMPOSE_BOUNDS: 1877 /* 1878 * The compose default and bounds sizes are equal to the sink 1879 * crop rectangle size. 1880 */ 1881 crop = v4l2_subdev_state_get_crop(state, 0); 1882 sel->r.left = 0; 1883 sel->r.top = 0; 1884 sel->r.width = crop->width; 1885 sel->r.height = crop->height; 1886 break; 1887 1888 default: 1889 ret = -EINVAL; 1890 break; 1891 } 1892 1893 return ret; 1894 } 1895 1896 static int mt9m114_ifp_set_selection(struct v4l2_subdev *sd, 1897 struct v4l2_subdev_state *state, 1898 struct v4l2_subdev_selection *sel) 1899 { 1900 struct v4l2_mbus_framefmt *format; 1901 struct v4l2_rect *crop; 1902 struct v4l2_rect *compose; 1903 1904 if (sel->target != V4L2_SEL_TGT_CROP && 1905 sel->target != V4L2_SEL_TGT_COMPOSE) 1906 return -EINVAL; 1907 1908 /* Crop and compose are only supported on the sink pad. */ 1909 if (sel->pad != 0) 1910 return -EINVAL; 1911 1912 format = v4l2_subdev_state_get_format(state, 0); 1913 crop = v4l2_subdev_state_get_crop(state, 0); 1914 compose = v4l2_subdev_state_get_compose(state, 0); 1915 1916 if (sel->target == V4L2_SEL_TGT_CROP) { 1917 /* 1918 * Clamp the crop rectangle. Demosaicing removes 4 pixels on 1919 * each side of the image. 1920 */ 1921 crop->left = clamp_t(unsigned int, ALIGN(sel->r.left, 2), 4, 1922 format->width - 4 - 1923 MT9M114_SCALER_CROPPED_INPUT_WIDTH); 1924 crop->top = clamp_t(unsigned int, ALIGN(sel->r.top, 2), 4, 1925 format->height - 4 - 1926 MT9M114_SCALER_CROPPED_INPUT_HEIGHT); 1927 crop->width = clamp_t(unsigned int, ALIGN(sel->r.width, 2), 1928 MT9M114_SCALER_CROPPED_INPUT_WIDTH, 1929 format->width - 4 - crop->left); 1930 crop->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2), 1931 MT9M114_SCALER_CROPPED_INPUT_HEIGHT, 1932 format->height - 4 - crop->top); 1933 1934 sel->r = *crop; 1935 1936 /* Propagate to the compose rectangle. */ 1937 compose->width = crop->width; 1938 compose->height = crop->height; 1939 } else { 1940 /* 1941 * Clamp the compose rectangle. The scaler can only downscale. 1942 */ 1943 compose->left = 0; 1944 compose->top = 0; 1945 compose->width = clamp_t(unsigned int, ALIGN(sel->r.width, 2), 1946 MT9M114_SCALER_CROPPED_INPUT_WIDTH, 1947 crop->width); 1948 compose->height = clamp_t(unsigned int, ALIGN(sel->r.height, 2), 1949 MT9M114_SCALER_CROPPED_INPUT_HEIGHT, 1950 crop->height); 1951 1952 sel->r = *compose; 1953 } 1954 1955 /* Propagate the compose rectangle to the source format. */ 1956 format = v4l2_subdev_state_get_format(state, 1); 1957 format->width = compose->width; 1958 format->height = compose->height; 1959 1960 return 0; 1961 } 1962 1963 static void mt9m114_ifp_unregistered(struct v4l2_subdev *sd) 1964 { 1965 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1966 1967 v4l2_device_unregister_subdev(&sensor->pa.sd); 1968 } 1969 1970 static int mt9m114_ifp_registered(struct v4l2_subdev *sd) 1971 { 1972 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 1973 int ret; 1974 1975 ret = v4l2_device_register_subdev(sd->v4l2_dev, &sensor->pa.sd); 1976 if (ret < 0) { 1977 dev_err(&sensor->client->dev, 1978 "Failed to register pixel array subdev\n"); 1979 return ret; 1980 } 1981 1982 ret = media_create_pad_link(&sensor->pa.sd.entity, 0, 1983 &sensor->ifp.sd.entity, 0, 1984 MEDIA_LNK_FL_ENABLED | 1985 MEDIA_LNK_FL_IMMUTABLE); 1986 if (ret < 0) { 1987 dev_err(&sensor->client->dev, 1988 "Failed to link pixel array to ifp\n"); 1989 v4l2_device_unregister_subdev(&sensor->pa.sd); 1990 return ret; 1991 } 1992 1993 return 0; 1994 } 1995 1996 static const struct v4l2_subdev_video_ops mt9m114_ifp_video_ops = { 1997 .s_stream = mt9m114_ifp_s_stream, 1998 }; 1999 2000 static const struct v4l2_subdev_pad_ops mt9m114_ifp_pad_ops = { 2001 .enum_mbus_code = mt9m114_ifp_enum_mbus_code, 2002 .enum_frame_size = mt9m114_ifp_enum_framesizes, 2003 .enum_frame_interval = mt9m114_ifp_enum_frameintervals, 2004 .get_fmt = v4l2_subdev_get_fmt, 2005 .set_fmt = mt9m114_ifp_set_fmt, 2006 .get_selection = mt9m114_ifp_get_selection, 2007 .set_selection = mt9m114_ifp_set_selection, 2008 .get_frame_interval = mt9m114_ifp_get_frame_interval, 2009 .set_frame_interval = mt9m114_ifp_set_frame_interval, 2010 }; 2011 2012 static const struct v4l2_subdev_ops mt9m114_ifp_ops = { 2013 .video = &mt9m114_ifp_video_ops, 2014 .pad = &mt9m114_ifp_pad_ops, 2015 }; 2016 2017 static const struct v4l2_subdev_internal_ops mt9m114_ifp_internal_ops = { 2018 .init_state = mt9m114_ifp_init_state, 2019 .registered = mt9m114_ifp_registered, 2020 .unregistered = mt9m114_ifp_unregistered, 2021 }; 2022 2023 static int mt9m114_ifp_init(struct mt9m114 *sensor) 2024 { 2025 struct v4l2_subdev *sd = &sensor->ifp.sd; 2026 struct media_pad *pads = sensor->ifp.pads; 2027 struct v4l2_ctrl_handler *hdl = &sensor->ifp.hdl; 2028 struct v4l2_ctrl *link_freq; 2029 int ret; 2030 2031 /* Initialize the subdev. */ 2032 v4l2_i2c_subdev_init(sd, sensor->client, &mt9m114_ifp_ops); 2033 v4l2_i2c_subdev_set_name(sd, sensor->client, NULL, " ifp"); 2034 2035 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; 2036 sd->internal_ops = &mt9m114_ifp_internal_ops; 2037 2038 /* Initialize the media entity. */ 2039 sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_ISP; 2040 sd->entity.ops = &mt9m114_entity_ops; 2041 pads[0].flags = MEDIA_PAD_FL_SINK; 2042 pads[1].flags = MEDIA_PAD_FL_SOURCE; 2043 ret = media_entity_pads_init(&sd->entity, 2, pads); 2044 if (ret < 0) 2045 return ret; 2046 2047 sensor->ifp.frame_rate = MT9M114_DEF_FRAME_RATE; 2048 2049 /* Initialize the control handler. */ 2050 v4l2_ctrl_handler_init(hdl, 8); 2051 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2052 V4L2_CID_AUTO_WHITE_BALANCE, 2053 0, 1, 1, 1); 2054 v4l2_ctrl_new_std_menu(hdl, &mt9m114_ifp_ctrl_ops, 2055 V4L2_CID_EXPOSURE_AUTO, 2056 V4L2_EXPOSURE_MANUAL, 0, 2057 V4L2_EXPOSURE_AUTO); 2058 2059 link_freq = v4l2_ctrl_new_int_menu(hdl, &mt9m114_ifp_ctrl_ops, 2060 V4L2_CID_LINK_FREQ, 2061 sensor->bus_cfg.nr_of_link_frequencies - 1, 2062 0, sensor->bus_cfg.link_frequencies); 2063 if (link_freq) 2064 link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; 2065 2066 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2067 V4L2_CID_PIXEL_RATE, 2068 sensor->pixrate, sensor->pixrate, 1, 2069 sensor->pixrate); 2070 2071 sensor->ifp.tpg[MT9M114_TPG_PATTERN] = 2072 v4l2_ctrl_new_std_menu_items(hdl, &mt9m114_ifp_ctrl_ops, 2073 V4L2_CID_TEST_PATTERN, 2074 ARRAY_SIZE(mt9m114_test_pattern_menu) - 1, 2075 0, 0, mt9m114_test_pattern_menu); 2076 sensor->ifp.tpg[MT9M114_TPG_RED] = 2077 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2078 V4L2_CID_TEST_PATTERN_RED, 2079 0, 1023, 1, 1023); 2080 sensor->ifp.tpg[MT9M114_TPG_GREEN] = 2081 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2082 V4L2_CID_TEST_PATTERN_GREENR, 2083 0, 1023, 1, 1023); 2084 sensor->ifp.tpg[MT9M114_TPG_BLUE] = 2085 v4l2_ctrl_new_std(hdl, &mt9m114_ifp_ctrl_ops, 2086 V4L2_CID_TEST_PATTERN_BLUE, 2087 0, 1023, 1, 1023); 2088 2089 v4l2_ctrl_cluster(ARRAY_SIZE(sensor->ifp.tpg), sensor->ifp.tpg); 2090 2091 if (hdl->error) { 2092 ret = hdl->error; 2093 goto error; 2094 } 2095 2096 sd->ctrl_handler = hdl; 2097 sd->state_lock = hdl->lock; 2098 2099 ret = v4l2_subdev_init_finalize(sd); 2100 if (ret) 2101 goto error; 2102 2103 return 0; 2104 2105 error: 2106 v4l2_ctrl_handler_free(&sensor->ifp.hdl); 2107 media_entity_cleanup(&sensor->ifp.sd.entity); 2108 return ret; 2109 } 2110 2111 static void mt9m114_ifp_cleanup(struct mt9m114 *sensor) 2112 { 2113 v4l2_ctrl_handler_free(&sensor->ifp.hdl); 2114 media_entity_cleanup(&sensor->ifp.sd.entity); 2115 } 2116 2117 /* ----------------------------------------------------------------------------- 2118 * Power Management 2119 */ 2120 2121 static int mt9m114_power_on(struct mt9m114 *sensor) 2122 { 2123 int ret; 2124 2125 /* Enable power and clocks. */ 2126 ret = regulator_bulk_enable(ARRAY_SIZE(sensor->supplies), 2127 sensor->supplies); 2128 if (ret < 0) 2129 return ret; 2130 2131 ret = clk_prepare_enable(sensor->clk); 2132 if (ret < 0) 2133 goto error_regulator; 2134 2135 /* Perform a hard reset if available, or a soft reset otherwise. */ 2136 if (sensor->reset) { 2137 long freq = clk_get_rate(sensor->clk); 2138 unsigned int duration; 2139 2140 /* 2141 * The minimum duration is 50 clock cycles, thus typically 2142 * around 2µs. Double it to be safe. 2143 */ 2144 duration = DIV_ROUND_UP(2 * 50 * 1000000, freq); 2145 2146 gpiod_set_value(sensor->reset, 1); 2147 fsleep(duration); 2148 gpiod_set_value(sensor->reset, 0); 2149 } else { 2150 /* 2151 * The power may have just been turned on, we need to wait for 2152 * the sensor to be ready to accept I2C commands. 2153 */ 2154 usleep_range(44500, 50000); 2155 2156 cci_write(sensor->regmap, MT9M114_RESET_AND_MISC_CONTROL, 2157 MT9M114_RESET_SOC, &ret); 2158 cci_write(sensor->regmap, MT9M114_RESET_AND_MISC_CONTROL, 0, 2159 &ret); 2160 2161 if (ret < 0) { 2162 dev_err(&sensor->client->dev, "Soft reset failed\n"); 2163 goto error_clock; 2164 } 2165 } 2166 2167 /* 2168 * Wait for the sensor to be ready to accept I2C commands by polling the 2169 * command register to wait for initialization to complete. 2170 */ 2171 usleep_range(44500, 50000); 2172 2173 ret = mt9m114_poll_command(sensor, MT9M114_COMMAND_REGISTER_SET_STATE); 2174 if (ret < 0) 2175 goto error_clock; 2176 2177 if (sensor->bus_cfg.bus_type == V4L2_MBUS_PARALLEL) { 2178 /* 2179 * In parallel mode (OE set to low), the sensor will enter the 2180 * streaming state after initialization. Enter the standby 2181 * manually to stop streaming. 2182 */ 2183 ret = mt9m114_set_state(sensor, 2184 MT9M114_SYS_STATE_ENTER_STANDBY); 2185 if (ret < 0) 2186 goto error_clock; 2187 } 2188 2189 /* 2190 * Before issuing any Set-State command, we must ensure that the sensor 2191 * reaches the standby mode (either initiated manually above in 2192 * parallel mode, or automatically after reset in MIPI mode). 2193 */ 2194 ret = mt9m114_poll_state(sensor, MT9M114_SYS_STATE_STANDBY); 2195 if (ret < 0) 2196 goto error_clock; 2197 2198 return 0; 2199 2200 error_clock: 2201 clk_disable_unprepare(sensor->clk); 2202 error_regulator: 2203 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); 2204 return ret; 2205 } 2206 2207 static void mt9m114_power_off(struct mt9m114 *sensor) 2208 { 2209 clk_disable_unprepare(sensor->clk); 2210 regulator_bulk_disable(ARRAY_SIZE(sensor->supplies), sensor->supplies); 2211 } 2212 2213 static int __maybe_unused mt9m114_runtime_resume(struct device *dev) 2214 { 2215 struct v4l2_subdev *sd = dev_get_drvdata(dev); 2216 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2217 int ret; 2218 2219 ret = mt9m114_power_on(sensor); 2220 if (ret) 2221 return ret; 2222 2223 ret = mt9m114_initialize(sensor); 2224 if (ret) { 2225 mt9m114_power_off(sensor); 2226 return ret; 2227 } 2228 2229 return 0; 2230 } 2231 2232 static int __maybe_unused mt9m114_runtime_suspend(struct device *dev) 2233 { 2234 struct v4l2_subdev *sd = dev_get_drvdata(dev); 2235 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2236 2237 mt9m114_power_off(sensor); 2238 2239 return 0; 2240 } 2241 2242 static const struct dev_pm_ops mt9m114_pm_ops = { 2243 SET_RUNTIME_PM_OPS(mt9m114_runtime_suspend, mt9m114_runtime_resume, NULL) 2244 }; 2245 2246 /* ----------------------------------------------------------------------------- 2247 * Probe & Remove 2248 */ 2249 2250 static int mt9m114_verify_link_frequency(struct mt9m114 *sensor, 2251 unsigned int pixrate) 2252 { 2253 unsigned int link_freq = sensor->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY 2254 ? pixrate * 8 : pixrate * 2; 2255 2256 if (sensor->bus_cfg.nr_of_link_frequencies != 1 || 2257 sensor->bus_cfg.link_frequencies[0] != link_freq) 2258 return -EINVAL; 2259 2260 return 0; 2261 } 2262 2263 static int mt9m114_clk_init(struct mt9m114 *sensor) 2264 { 2265 unsigned int pixrate; 2266 2267 /* Hardcode the PLL multiplier and dividers to default settings. */ 2268 sensor->pll.m = 32; 2269 sensor->pll.n = 1; 2270 sensor->pll.p = 7; 2271 2272 /* 2273 * Calculate the pixel rate and link frequency. The CSI-2 bus is clocked 2274 * for 16-bit per pixel, transmitted in DDR over a single lane. For 2275 * parallel mode, the sensor ouputs one pixel in two PIXCLK cycles. 2276 */ 2277 2278 /* 2279 * Check if EXTCLK fits the configured link frequency. Bypass the PLL 2280 * in this case. 2281 */ 2282 pixrate = clk_get_rate(sensor->clk) / 2; 2283 if (mt9m114_verify_link_frequency(sensor, pixrate) == 0) { 2284 sensor->pixrate = pixrate; 2285 sensor->bypass_pll = true; 2286 return 0; 2287 } 2288 2289 /* Check if the PLL configuration fits the configured link frequency. */ 2290 pixrate = clk_get_rate(sensor->clk) * sensor->pll.m 2291 / ((sensor->pll.n + 1) * (sensor->pll.p + 1)); 2292 if (mt9m114_verify_link_frequency(sensor, pixrate) == 0) { 2293 sensor->pixrate = pixrate; 2294 sensor->bypass_pll = false; 2295 return 0; 2296 } 2297 2298 dev_err(&sensor->client->dev, "Unsupported DT link-frequencies\n"); 2299 return -EINVAL; 2300 } 2301 2302 static int mt9m114_identify(struct mt9m114 *sensor) 2303 { 2304 u64 major, minor, release, customer; 2305 u64 value; 2306 int ret; 2307 2308 ret = cci_read(sensor->regmap, MT9M114_CHIP_ID, &value, NULL); 2309 if (ret) { 2310 dev_err(&sensor->client->dev, "Failed to read chip ID\n"); 2311 return -ENXIO; 2312 } 2313 2314 if (value != 0x2481) { 2315 dev_err(&sensor->client->dev, "Invalid chip ID 0x%04llx\n", 2316 value); 2317 return -ENXIO; 2318 } 2319 2320 cci_read(sensor->regmap, MT9M114_MON_MAJOR_VERSION, &major, &ret); 2321 cci_read(sensor->regmap, MT9M114_MON_MINOR_VERSION, &minor, &ret); 2322 cci_read(sensor->regmap, MT9M114_MON_RELEASE_VERSION, &release, &ret); 2323 cci_read(sensor->regmap, MT9M114_CUSTOMER_REV, &customer, &ret); 2324 if (ret) { 2325 dev_err(&sensor->client->dev, "Failed to read version\n"); 2326 return -ENXIO; 2327 } 2328 2329 dev_dbg(&sensor->client->dev, 2330 "monitor v%llu.%llu.%04llx customer rev 0x%04llx\n", 2331 major, minor, release, customer); 2332 2333 return 0; 2334 } 2335 2336 static int mt9m114_parse_dt(struct mt9m114 *sensor) 2337 { 2338 struct fwnode_handle *fwnode = dev_fwnode(&sensor->client->dev); 2339 struct fwnode_handle *ep; 2340 int ret; 2341 2342 ep = fwnode_graph_get_next_endpoint(fwnode, NULL); 2343 if (!ep) { 2344 dev_err(&sensor->client->dev, "No endpoint found\n"); 2345 return -EINVAL; 2346 } 2347 2348 sensor->bus_cfg.bus_type = V4L2_MBUS_UNKNOWN; 2349 ret = v4l2_fwnode_endpoint_alloc_parse(ep, &sensor->bus_cfg); 2350 fwnode_handle_put(ep); 2351 if (ret < 0) { 2352 dev_err(&sensor->client->dev, "Failed to parse endpoint\n"); 2353 goto error; 2354 } 2355 2356 switch (sensor->bus_cfg.bus_type) { 2357 case V4L2_MBUS_CSI2_DPHY: 2358 case V4L2_MBUS_PARALLEL: 2359 break; 2360 2361 default: 2362 dev_err(&sensor->client->dev, "unsupported bus type %u\n", 2363 sensor->bus_cfg.bus_type); 2364 ret = -EINVAL; 2365 goto error; 2366 } 2367 2368 return 0; 2369 2370 error: 2371 v4l2_fwnode_endpoint_free(&sensor->bus_cfg); 2372 return ret; 2373 } 2374 2375 static int mt9m114_probe(struct i2c_client *client) 2376 { 2377 struct device *dev = &client->dev; 2378 struct mt9m114 *sensor; 2379 int ret; 2380 2381 sensor = devm_kzalloc(dev, sizeof(*sensor), GFP_KERNEL); 2382 if (!sensor) 2383 return -ENOMEM; 2384 2385 sensor->client = client; 2386 2387 sensor->regmap = devm_cci_regmap_init_i2c(client, 16); 2388 if (IS_ERR(sensor->regmap)) { 2389 dev_err(dev, "Unable to initialize I2C\n"); 2390 return -ENODEV; 2391 } 2392 2393 ret = mt9m114_parse_dt(sensor); 2394 if (ret < 0) 2395 return ret; 2396 2397 /* Acquire clocks, GPIOs and regulators. */ 2398 sensor->clk = devm_clk_get(dev, NULL); 2399 if (IS_ERR(sensor->clk)) { 2400 ret = PTR_ERR(sensor->clk); 2401 dev_err_probe(dev, ret, "Failed to get clock\n"); 2402 goto error_ep_free; 2403 } 2404 2405 sensor->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); 2406 if (IS_ERR(sensor->reset)) { 2407 ret = PTR_ERR(sensor->reset); 2408 dev_err_probe(dev, ret, "Failed to get reset GPIO\n"); 2409 goto error_ep_free; 2410 } 2411 2412 sensor->supplies[0].supply = "vddio"; 2413 sensor->supplies[1].supply = "vdd"; 2414 sensor->supplies[2].supply = "vaa"; 2415 2416 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(sensor->supplies), 2417 sensor->supplies); 2418 if (ret < 0) { 2419 dev_err_probe(dev, ret, "Failed to get regulators\n"); 2420 goto error_ep_free; 2421 } 2422 2423 ret = mt9m114_clk_init(sensor); 2424 if (ret) 2425 goto error_ep_free; 2426 2427 /* 2428 * Identify the sensor. The driver supports runtime PM, but needs to 2429 * work when runtime PM is disabled in the kernel. To that end, power 2430 * the sensor on manually here, and initialize it after identification 2431 * to reach the same state as if resumed through runtime PM. 2432 */ 2433 ret = mt9m114_power_on(sensor); 2434 if (ret < 0) { 2435 dev_err_probe(dev, ret, "Could not power on the device\n"); 2436 goto error_ep_free; 2437 } 2438 2439 ret = mt9m114_identify(sensor); 2440 if (ret < 0) 2441 goto error_power_off; 2442 2443 ret = mt9m114_initialize(sensor); 2444 if (ret < 0) 2445 goto error_power_off; 2446 2447 /* 2448 * Enable runtime PM with autosuspend. As the device has been powered 2449 * manually, mark it as active, and increase the usage count without 2450 * resuming the device. 2451 */ 2452 pm_runtime_set_active(dev); 2453 pm_runtime_get_noresume(dev); 2454 pm_runtime_enable(dev); 2455 pm_runtime_set_autosuspend_delay(dev, 1000); 2456 pm_runtime_use_autosuspend(dev); 2457 2458 /* Initialize the subdevices. */ 2459 ret = mt9m114_pa_init(sensor); 2460 if (ret < 0) 2461 goto error_pm_cleanup; 2462 2463 ret = mt9m114_ifp_init(sensor); 2464 if (ret < 0) 2465 goto error_pa_cleanup; 2466 2467 ret = v4l2_async_register_subdev(&sensor->ifp.sd); 2468 if (ret < 0) 2469 goto error_ifp_cleanup; 2470 2471 /* 2472 * Decrease the PM usage count. The device will get suspended after the 2473 * autosuspend delay, turning the power off. 2474 */ 2475 pm_runtime_mark_last_busy(dev); 2476 pm_runtime_put_autosuspend(dev); 2477 2478 return 0; 2479 2480 error_ifp_cleanup: 2481 mt9m114_ifp_cleanup(sensor); 2482 error_pa_cleanup: 2483 mt9m114_pa_cleanup(sensor); 2484 error_pm_cleanup: 2485 pm_runtime_disable(dev); 2486 pm_runtime_put_noidle(dev); 2487 error_power_off: 2488 mt9m114_power_off(sensor); 2489 error_ep_free: 2490 v4l2_fwnode_endpoint_free(&sensor->bus_cfg); 2491 return ret; 2492 } 2493 2494 static void mt9m114_remove(struct i2c_client *client) 2495 { 2496 struct v4l2_subdev *sd = i2c_get_clientdata(client); 2497 struct mt9m114 *sensor = ifp_to_mt9m114(sd); 2498 struct device *dev = &client->dev; 2499 2500 v4l2_async_unregister_subdev(&sensor->ifp.sd); 2501 2502 mt9m114_ifp_cleanup(sensor); 2503 mt9m114_pa_cleanup(sensor); 2504 v4l2_fwnode_endpoint_free(&sensor->bus_cfg); 2505 2506 /* 2507 * Disable runtime PM. In case runtime PM is disabled in the kernel, 2508 * make sure to turn power off manually. 2509 */ 2510 pm_runtime_disable(dev); 2511 if (!pm_runtime_status_suspended(dev)) 2512 mt9m114_power_off(sensor); 2513 pm_runtime_set_suspended(dev); 2514 } 2515 2516 static const struct of_device_id mt9m114_of_ids[] = { 2517 { .compatible = "onnn,mt9m114" }, 2518 { /* sentinel */ }, 2519 }; 2520 MODULE_DEVICE_TABLE(of, mt9m114_of_ids); 2521 2522 static struct i2c_driver mt9m114_driver = { 2523 .driver = { 2524 .name = "mt9m114", 2525 .pm = &mt9m114_pm_ops, 2526 .of_match_table = mt9m114_of_ids, 2527 }, 2528 .probe = mt9m114_probe, 2529 .remove = mt9m114_remove, 2530 }; 2531 2532 module_i2c_driver(mt9m114_driver); 2533 2534 MODULE_DESCRIPTION("onsemi MT9M114 Sensor Driver"); 2535 MODULE_AUTHOR("Laurent Pinchart <laurent.pinchart@ideasonboard.com>"); 2536 MODULE_LICENSE("GPL"); 2537