Lines Matching defs:mt9v032
26 #include <media/i2c/mt9v032.h>
184 struct mt9v032 {
220 static struct mt9v032 *to_mt9v032(struct v4l2_subdev *sd)
222 return container_of(sd, struct mt9v032, subdev);
226 mt9v032_update_aec_agc(struct mt9v032 *mt9v032, u16 which, int enable)
228 struct regmap *map = mt9v032->regmap;
229 u16 value = mt9v032->aec_agc;
241 mt9v032->aec_agc = value;
246 mt9v032_update_hblank(struct mt9v032 *mt9v032)
248 struct v4l2_rect *crop = &mt9v032->crop;
249 unsigned int min_hblank = mt9v032->model->data->min_hblank;
252 if (mt9v032->version->version == MT9V034_CHIP_ID_REV1)
253 min_hblank += (mt9v032->hratio - 1) * 10;
254 min_hblank = max_t(int, mt9v032->model->data->min_row_time - crop->width,
256 hblank = max_t(unsigned int, mt9v032->hblank, min_hblank);
258 return regmap_write(mt9v032->regmap, MT9V032_HORIZONTAL_BLANKING,
262 static int mt9v032_power_on(struct mt9v032 *mt9v032)
264 struct regmap *map = mt9v032->regmap;
267 gpiod_set_value_cansleep(mt9v032->reset_gpio, 1);
269 ret = clk_set_rate(mt9v032->clk, mt9v032->sysclk);
274 ret = clk_prepare_enable(mt9v032->clk);
280 if (mt9v032->reset_gpio) {
281 gpiod_set_value_cansleep(mt9v032->reset_gpio, 0);
308 clk_disable_unprepare(mt9v032->clk);
312 static void mt9v032_power_off(struct mt9v032 *mt9v032)
314 clk_disable_unprepare(mt9v032->clk);
317 static int __mt9v032_set_power(struct mt9v032 *mt9v032, bool on)
319 struct regmap *map = mt9v032->regmap;
323 mt9v032_power_off(mt9v032);
327 ret = mt9v032_power_on(mt9v032);
332 if (mt9v032->pdata && mt9v032->pdata->clk_pol) {
333 ret = regmap_write(map, mt9v032->model->data->pclk_reg,
344 return v4l2_ctrl_handler_setup(&mt9v032->ctrls);
352 __mt9v032_get_pad_format(struct mt9v032 *mt9v032,
358 return v4l2_subdev_get_try_format(&mt9v032->subdev, sd_state,
361 return &mt9v032->format;
368 __mt9v032_get_pad_crop(struct mt9v032 *mt9v032,
374 return v4l2_subdev_get_try_crop(&mt9v032->subdev, sd_state,
377 return &mt9v032->crop;
387 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
388 struct v4l2_rect *crop = &mt9v032->crop;
389 struct regmap *map = mt9v032->regmap;
398 hbin = fls(mt9v032->hratio) - 1;
399 vbin = fls(mt9v032->vratio) - 1;
423 ret = mt9v032_update_hblank(mt9v032);
435 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
440 code->code = mt9v032->format.code;
448 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
452 if (mt9v032->format.code != fse->code)
467 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
469 format->format = *__mt9v032_get_pad_format(mt9v032, sd_state,
475 static void mt9v032_configure_pixel_rate(struct mt9v032 *mt9v032)
477 struct i2c_client *client = v4l2_get_subdevdata(&mt9v032->subdev);
480 ret = v4l2_ctrl_s_ctrl_int64(mt9v032->pixel_rate,
481 mt9v032->sysclk / mt9v032->hratio);
503 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
511 __crop = __mt9v032_get_pad_crop(mt9v032, sd_state, format->pad,
527 __format = __mt9v032_get_pad_format(mt9v032, sd_state, format->pad,
533 mt9v032->hratio = hratio;
534 mt9v032->vratio = vratio;
535 mt9v032_configure_pixel_rate(mt9v032);
547 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
552 sel->r = *__mt9v032_get_pad_crop(mt9v032, sd_state, sel->pad,
561 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
590 __crop = __mt9v032_get_pad_crop(mt9v032, sd_state, sel->pad,
597 __format = __mt9v032_get_pad_format(mt9v032, sd_state,
603 mt9v032->hratio = 1;
604 mt9v032->vratio = 1;
605 mt9v032_configure_pixel_rate(mt9v032);
651 struct mt9v032 *mt9v032 =
652 container_of(ctrl->handler, struct mt9v032, ctrls);
653 struct regmap *map = mt9v032->regmap;
659 return mt9v032_update_aec_agc(mt9v032, MT9V032_AGC_ENABLE,
666 return mt9v032_update_aec_agc(mt9v032, MT9V032_AEC_ENABLE,
674 mt9v032->hblank = ctrl->val;
675 return mt9v032_update_hblank(mt9v032);
683 if (mt9v032->link_freq == NULL)
686 freq = mt9v032->pdata->link_freqs[mt9v032->link_freq->val];
687 *mt9v032->pixel_rate->p_new.p_s64 = freq;
688 mt9v032->sysclk = freq;
692 switch (mt9v032->test_pattern->val) {
709 data = (mt9v032->test_pattern_color->val <<
737 mt9v032->model->data->aec_max_shutter_reg,
852 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
855 mutex_lock(&mt9v032->power_lock);
860 if (mt9v032->power_count == !on) {
861 ret = __mt9v032_set_power(mt9v032, !!on);
867 mt9v032->power_count += on ? 1 : -1;
868 WARN_ON(mt9v032->power_count < 0);
871 mutex_unlock(&mt9v032->power_lock);
882 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
890 ret = mt9v032_power_on(mt9v032);
897 ret = regmap_read(mt9v032->regmap, MT9V032_CHIP_VERSION, &version);
899 mt9v032_power_off(mt9v032);
908 mt9v032->version = &mt9v032_versions[i];
913 if (mt9v032->version == NULL) {
920 mt9v032->version->name, client->addr);
922 mt9v032_configure_pixel_rate(mt9v032);
929 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
941 if (mt9v032->model->color)
1051 struct mt9v032 *mt9v032;
1055 mt9v032 = devm_kzalloc(&client->dev, sizeof(*mt9v032), GFP_KERNEL);
1056 if (!mt9v032)
1059 mt9v032->regmap = devm_regmap_init_i2c(client, &mt9v032_regmap_config);
1060 if (IS_ERR(mt9v032->regmap))
1061 return PTR_ERR(mt9v032->regmap);
1063 mt9v032->clk = devm_clk_get(&client->dev, NULL);
1064 if (IS_ERR(mt9v032->clk))
1065 return PTR_ERR(mt9v032->clk);
1067 mt9v032->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
1069 if (IS_ERR(mt9v032->reset_gpio))
1070 return PTR_ERR(mt9v032->reset_gpio);
1072 mt9v032->standby_gpio = devm_gpiod_get_optional(&client->dev, "standby",
1074 if (IS_ERR(mt9v032->standby_gpio))
1075 return PTR_ERR(mt9v032->standby_gpio);
1077 mutex_init(&mt9v032->power_lock);
1078 mt9v032->pdata = pdata;
1079 mt9v032->model = (const void *)did->driver_data;
1081 v4l2_ctrl_handler_init(&mt9v032->ctrls, 11 +
1084 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
1086 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
1089 v4l2_ctrl_new_std_menu(&mt9v032->ctrls, &mt9v032_ctrl_ops,
1092 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
1093 V4L2_CID_EXPOSURE, mt9v032->model->data->min_shutter,
1094 mt9v032->model->data->max_shutter, 1,
1096 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
1097 V4L2_CID_HBLANK, mt9v032->model->data->min_hblank,
1100 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
1101 V4L2_CID_VBLANK, mt9v032->model->data->min_vblank,
1102 mt9v032->model->data->max_vblank, 1,
1104 mt9v032->test_pattern = v4l2_ctrl_new_std_menu_items(&mt9v032->ctrls,
1108 mt9v032->test_pattern_color = v4l2_ctrl_new_custom(&mt9v032->ctrls,
1111 v4l2_ctrl_new_custom(&mt9v032->ctrls,
1112 mt9v032->model->data->aec_max_shutter_v4l2_ctrl,
1115 v4l2_ctrl_new_custom(&mt9v032->ctrls, &mt9v032_aegc_controls[i],
1118 v4l2_ctrl_cluster(2, &mt9v032->test_pattern);
1120 mt9v032->pixel_rate =
1121 v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops,
1132 mt9v032->link_freq =
1133 v4l2_ctrl_new_int_menu(&mt9v032->ctrls,
1137 v4l2_ctrl_cluster(2, &mt9v032->link_freq);
1141 mt9v032->subdev.ctrl_handler = &mt9v032->ctrls;
1143 if (mt9v032->ctrls.error) {
1145 mt9v032->ctrls.error);
1146 ret = mt9v032->ctrls.error;
1150 mt9v032->crop.left = MT9V032_COLUMN_START_DEF;
1151 mt9v032->crop.top = MT9V032_ROW_START_DEF;
1152 mt9v032->crop.width = MT9V032_WINDOW_WIDTH_DEF;
1153 mt9v032->crop.height = MT9V032_WINDOW_HEIGHT_DEF;
1155 if (mt9v032->model->color)
1156 mt9v032->format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
1158 mt9v032->format.code = MEDIA_BUS_FMT_Y10_1X10;
1160 mt9v032->format.width = MT9V032_WINDOW_WIDTH_DEF;
1161 mt9v032->format.height = MT9V032_WINDOW_HEIGHT_DEF;
1162 mt9v032->format.field = V4L2_FIELD_NONE;
1163 mt9v032->format.colorspace = V4L2_COLORSPACE_SRGB;
1165 mt9v032->hratio = 1;
1166 mt9v032->vratio = 1;
1168 mt9v032->aec_agc = MT9V032_AEC_ENABLE | MT9V032_AGC_ENABLE;
1169 mt9v032->hblank = MT9V032_HORIZONTAL_BLANKING_DEF;
1170 mt9v032->sysclk = MT9V032_SYSCLK_FREQ_DEF;
1172 v4l2_i2c_subdev_init(&mt9v032->subdev, client, &mt9v032_subdev_ops);
1173 mt9v032->subdev.internal_ops = &mt9v032_subdev_internal_ops;
1174 mt9v032->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
1176 mt9v032->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR;
1177 mt9v032->pad.flags = MEDIA_PAD_FL_SOURCE;
1178 ret = media_entity_pads_init(&mt9v032->subdev.entity, 1, &mt9v032->pad);
1182 mt9v032->subdev.dev = &client->dev;
1183 ret = v4l2_async_register_subdev(&mt9v032->subdev);
1190 media_entity_cleanup(&mt9v032->subdev.entity);
1191 v4l2_ctrl_handler_free(&mt9v032->ctrls);
1198 struct mt9v032 *mt9v032 = to_mt9v032(subdev);
1201 v4l2_ctrl_handler_free(&mt9v032->ctrls);
1271 { "mt9v032", (kernel_ulong_t)&mt9v032_models[MT9V032_MODEL_V032_COLOR] },
1285 { .compatible = "aptina,mt9v032" },
1296 .name = "mt9v032",