mt9v032 220 drivers/media/i2c/mt9v032.c static struct mt9v032 *to_mt9v032(struct v4l2_subdev *sd) mt9v032 222 drivers/media/i2c/mt9v032.c return container_of(sd, struct mt9v032, subdev); mt9v032 226 drivers/media/i2c/mt9v032.c mt9v032_update_aec_agc(struct mt9v032 *mt9v032, u16 which, int enable) mt9v032 228 drivers/media/i2c/mt9v032.c struct regmap *map = mt9v032->regmap; mt9v032 229 drivers/media/i2c/mt9v032.c u16 value = mt9v032->aec_agc; mt9v032 241 drivers/media/i2c/mt9v032.c mt9v032->aec_agc = value; mt9v032 246 drivers/media/i2c/mt9v032.c mt9v032_update_hblank(struct mt9v032 *mt9v032) mt9v032 248 drivers/media/i2c/mt9v032.c struct v4l2_rect *crop = &mt9v032->crop; mt9v032 249 drivers/media/i2c/mt9v032.c unsigned int min_hblank = mt9v032->model->data->min_hblank; mt9v032 252 drivers/media/i2c/mt9v032.c if (mt9v032->version->version == MT9V034_CHIP_ID_REV1) mt9v032 253 drivers/media/i2c/mt9v032.c min_hblank += (mt9v032->hratio - 1) * 10; mt9v032 254 drivers/media/i2c/mt9v032.c min_hblank = max_t(int, mt9v032->model->data->min_row_time - crop->width, mt9v032 256 drivers/media/i2c/mt9v032.c hblank = max_t(unsigned int, mt9v032->hblank, min_hblank); mt9v032 258 drivers/media/i2c/mt9v032.c return regmap_write(mt9v032->regmap, MT9V032_HORIZONTAL_BLANKING, mt9v032 262 drivers/media/i2c/mt9v032.c static int mt9v032_power_on(struct mt9v032 *mt9v032) mt9v032 264 drivers/media/i2c/mt9v032.c struct regmap *map = mt9v032->regmap; mt9v032 267 drivers/media/i2c/mt9v032.c gpiod_set_value_cansleep(mt9v032->reset_gpio, 1); mt9v032 269 drivers/media/i2c/mt9v032.c ret = clk_set_rate(mt9v032->clk, mt9v032->sysclk); mt9v032 274 drivers/media/i2c/mt9v032.c ret = clk_prepare_enable(mt9v032->clk); mt9v032 280 drivers/media/i2c/mt9v032.c if (mt9v032->reset_gpio) { mt9v032 281 drivers/media/i2c/mt9v032.c gpiod_set_value_cansleep(mt9v032->reset_gpio, 0); mt9v032 308 drivers/media/i2c/mt9v032.c clk_disable_unprepare(mt9v032->clk); mt9v032 312 drivers/media/i2c/mt9v032.c static void mt9v032_power_off(struct mt9v032 *mt9v032) mt9v032 314 drivers/media/i2c/mt9v032.c clk_disable_unprepare(mt9v032->clk); mt9v032 317 drivers/media/i2c/mt9v032.c static int __mt9v032_set_power(struct mt9v032 *mt9v032, bool on) mt9v032 319 drivers/media/i2c/mt9v032.c struct regmap *map = mt9v032->regmap; mt9v032 323 drivers/media/i2c/mt9v032.c mt9v032_power_off(mt9v032); mt9v032 327 drivers/media/i2c/mt9v032.c ret = mt9v032_power_on(mt9v032); mt9v032 332 drivers/media/i2c/mt9v032.c if (mt9v032->pdata && mt9v032->pdata->clk_pol) { mt9v032 333 drivers/media/i2c/mt9v032.c ret = regmap_write(map, mt9v032->model->data->pclk_reg, mt9v032 344 drivers/media/i2c/mt9v032.c return v4l2_ctrl_handler_setup(&mt9v032->ctrls); mt9v032 352 drivers/media/i2c/mt9v032.c __mt9v032_get_pad_format(struct mt9v032 *mt9v032, struct v4l2_subdev_pad_config *cfg, mt9v032 357 drivers/media/i2c/mt9v032.c return v4l2_subdev_get_try_format(&mt9v032->subdev, cfg, pad); mt9v032 359 drivers/media/i2c/mt9v032.c return &mt9v032->format; mt9v032 366 drivers/media/i2c/mt9v032.c __mt9v032_get_pad_crop(struct mt9v032 *mt9v032, struct v4l2_subdev_pad_config *cfg, mt9v032 371 drivers/media/i2c/mt9v032.c return v4l2_subdev_get_try_crop(&mt9v032->subdev, cfg, pad); mt9v032 373 drivers/media/i2c/mt9v032.c return &mt9v032->crop; mt9v032 383 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 384 drivers/media/i2c/mt9v032.c struct v4l2_rect *crop = &mt9v032->crop; mt9v032 385 drivers/media/i2c/mt9v032.c struct regmap *map = mt9v032->regmap; mt9v032 394 drivers/media/i2c/mt9v032.c hbin = fls(mt9v032->hratio) - 1; mt9v032 395 drivers/media/i2c/mt9v032.c vbin = fls(mt9v032->vratio) - 1; mt9v032 419 drivers/media/i2c/mt9v032.c ret = mt9v032_update_hblank(mt9v032); mt9v032 431 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 436 drivers/media/i2c/mt9v032.c code->code = mt9v032->format.code; mt9v032 444 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 448 drivers/media/i2c/mt9v032.c if (mt9v032->format.code != fse->code) mt9v032 463 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 465 drivers/media/i2c/mt9v032.c format->format = *__mt9v032_get_pad_format(mt9v032, cfg, format->pad, mt9v032 470 drivers/media/i2c/mt9v032.c static void mt9v032_configure_pixel_rate(struct mt9v032 *mt9v032) mt9v032 472 drivers/media/i2c/mt9v032.c struct i2c_client *client = v4l2_get_subdevdata(&mt9v032->subdev); mt9v032 475 drivers/media/i2c/mt9v032.c ret = v4l2_ctrl_s_ctrl_int64(mt9v032->pixel_rate, mt9v032 476 drivers/media/i2c/mt9v032.c mt9v032->sysclk / mt9v032->hratio); mt9v032 498 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 506 drivers/media/i2c/mt9v032.c __crop = __mt9v032_get_pad_crop(mt9v032, cfg, format->pad, mt9v032 522 drivers/media/i2c/mt9v032.c __format = __mt9v032_get_pad_format(mt9v032, cfg, format->pad, mt9v032 528 drivers/media/i2c/mt9v032.c mt9v032->hratio = hratio; mt9v032 529 drivers/media/i2c/mt9v032.c mt9v032->vratio = vratio; mt9v032 530 drivers/media/i2c/mt9v032.c mt9v032_configure_pixel_rate(mt9v032); mt9v032 542 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 547 drivers/media/i2c/mt9v032.c sel->r = *__mt9v032_get_pad_crop(mt9v032, cfg, sel->pad, sel->which); mt9v032 555 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 584 drivers/media/i2c/mt9v032.c __crop = __mt9v032_get_pad_crop(mt9v032, cfg, sel->pad, sel->which); mt9v032 590 drivers/media/i2c/mt9v032.c __format = __mt9v032_get_pad_format(mt9v032, cfg, sel->pad, mt9v032 595 drivers/media/i2c/mt9v032.c mt9v032->hratio = 1; mt9v032 596 drivers/media/i2c/mt9v032.c mt9v032->vratio = 1; mt9v032 597 drivers/media/i2c/mt9v032.c mt9v032_configure_pixel_rate(mt9v032); mt9v032 643 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = mt9v032 644 drivers/media/i2c/mt9v032.c container_of(ctrl->handler, struct mt9v032, ctrls); mt9v032 645 drivers/media/i2c/mt9v032.c struct regmap *map = mt9v032->regmap; mt9v032 651 drivers/media/i2c/mt9v032.c return mt9v032_update_aec_agc(mt9v032, MT9V032_AGC_ENABLE, mt9v032 658 drivers/media/i2c/mt9v032.c return mt9v032_update_aec_agc(mt9v032, MT9V032_AEC_ENABLE, mt9v032 666 drivers/media/i2c/mt9v032.c mt9v032->hblank = ctrl->val; mt9v032 667 drivers/media/i2c/mt9v032.c return mt9v032_update_hblank(mt9v032); mt9v032 675 drivers/media/i2c/mt9v032.c if (mt9v032->link_freq == NULL) mt9v032 678 drivers/media/i2c/mt9v032.c freq = mt9v032->pdata->link_freqs[mt9v032->link_freq->val]; mt9v032 679 drivers/media/i2c/mt9v032.c *mt9v032->pixel_rate->p_new.p_s64 = freq; mt9v032 680 drivers/media/i2c/mt9v032.c mt9v032->sysclk = freq; mt9v032 684 drivers/media/i2c/mt9v032.c switch (mt9v032->test_pattern->val) { mt9v032 701 drivers/media/i2c/mt9v032.c data = (mt9v032->test_pattern_color->val << mt9v032 729 drivers/media/i2c/mt9v032.c mt9v032->model->data->aec_max_shutter_reg, mt9v032 844 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 847 drivers/media/i2c/mt9v032.c mutex_lock(&mt9v032->power_lock); mt9v032 852 drivers/media/i2c/mt9v032.c if (mt9v032->power_count == !on) { mt9v032 853 drivers/media/i2c/mt9v032.c ret = __mt9v032_set_power(mt9v032, !!on); mt9v032 859 drivers/media/i2c/mt9v032.c mt9v032->power_count += on ? 1 : -1; mt9v032 860 drivers/media/i2c/mt9v032.c WARN_ON(mt9v032->power_count < 0); mt9v032 863 drivers/media/i2c/mt9v032.c mutex_unlock(&mt9v032->power_lock); mt9v032 874 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 882 drivers/media/i2c/mt9v032.c ret = mt9v032_power_on(mt9v032); mt9v032 889 drivers/media/i2c/mt9v032.c ret = regmap_read(mt9v032->regmap, MT9V032_CHIP_VERSION, &version); mt9v032 891 drivers/media/i2c/mt9v032.c mt9v032_power_off(mt9v032); mt9v032 900 drivers/media/i2c/mt9v032.c mt9v032->version = &mt9v032_versions[i]; mt9v032 905 drivers/media/i2c/mt9v032.c if (mt9v032->version == NULL) { mt9v032 912 drivers/media/i2c/mt9v032.c mt9v032->version->name, client->addr); mt9v032 914 drivers/media/i2c/mt9v032.c mt9v032_configure_pixel_rate(mt9v032); mt9v032 921 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 933 drivers/media/i2c/mt9v032.c if (mt9v032->model->color) mt9v032 1043 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032; mt9v032 1047 drivers/media/i2c/mt9v032.c mt9v032 = devm_kzalloc(&client->dev, sizeof(*mt9v032), GFP_KERNEL); mt9v032 1048 drivers/media/i2c/mt9v032.c if (!mt9v032) mt9v032 1051 drivers/media/i2c/mt9v032.c mt9v032->regmap = devm_regmap_init_i2c(client, &mt9v032_regmap_config); mt9v032 1052 drivers/media/i2c/mt9v032.c if (IS_ERR(mt9v032->regmap)) mt9v032 1053 drivers/media/i2c/mt9v032.c return PTR_ERR(mt9v032->regmap); mt9v032 1055 drivers/media/i2c/mt9v032.c mt9v032->clk = devm_clk_get(&client->dev, NULL); mt9v032 1056 drivers/media/i2c/mt9v032.c if (IS_ERR(mt9v032->clk)) mt9v032 1057 drivers/media/i2c/mt9v032.c return PTR_ERR(mt9v032->clk); mt9v032 1059 drivers/media/i2c/mt9v032.c mt9v032->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset", mt9v032 1061 drivers/media/i2c/mt9v032.c if (IS_ERR(mt9v032->reset_gpio)) mt9v032 1062 drivers/media/i2c/mt9v032.c return PTR_ERR(mt9v032->reset_gpio); mt9v032 1064 drivers/media/i2c/mt9v032.c mt9v032->standby_gpio = devm_gpiod_get_optional(&client->dev, "standby", mt9v032 1066 drivers/media/i2c/mt9v032.c if (IS_ERR(mt9v032->standby_gpio)) mt9v032 1067 drivers/media/i2c/mt9v032.c return PTR_ERR(mt9v032->standby_gpio); mt9v032 1069 drivers/media/i2c/mt9v032.c mutex_init(&mt9v032->power_lock); mt9v032 1070 drivers/media/i2c/mt9v032.c mt9v032->pdata = pdata; mt9v032 1071 drivers/media/i2c/mt9v032.c mt9v032->model = (const void *)did->driver_data; mt9v032 1073 drivers/media/i2c/mt9v032.c v4l2_ctrl_handler_init(&mt9v032->ctrls, 11 + mt9v032 1076 drivers/media/i2c/mt9v032.c v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, mt9v032 1078 drivers/media/i2c/mt9v032.c v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, mt9v032 1081 drivers/media/i2c/mt9v032.c v4l2_ctrl_new_std_menu(&mt9v032->ctrls, &mt9v032_ctrl_ops, mt9v032 1084 drivers/media/i2c/mt9v032.c v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, mt9v032 1085 drivers/media/i2c/mt9v032.c V4L2_CID_EXPOSURE, mt9v032->model->data->min_shutter, mt9v032 1086 drivers/media/i2c/mt9v032.c mt9v032->model->data->max_shutter, 1, mt9v032 1088 drivers/media/i2c/mt9v032.c v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, mt9v032 1089 drivers/media/i2c/mt9v032.c V4L2_CID_HBLANK, mt9v032->model->data->min_hblank, mt9v032 1092 drivers/media/i2c/mt9v032.c v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, mt9v032 1093 drivers/media/i2c/mt9v032.c V4L2_CID_VBLANK, mt9v032->model->data->min_vblank, mt9v032 1094 drivers/media/i2c/mt9v032.c mt9v032->model->data->max_vblank, 1, mt9v032 1096 drivers/media/i2c/mt9v032.c mt9v032->test_pattern = v4l2_ctrl_new_std_menu_items(&mt9v032->ctrls, mt9v032 1100 drivers/media/i2c/mt9v032.c mt9v032->test_pattern_color = v4l2_ctrl_new_custom(&mt9v032->ctrls, mt9v032 1103 drivers/media/i2c/mt9v032.c v4l2_ctrl_new_custom(&mt9v032->ctrls, mt9v032 1104 drivers/media/i2c/mt9v032.c mt9v032->model->data->aec_max_shutter_v4l2_ctrl, mt9v032 1107 drivers/media/i2c/mt9v032.c v4l2_ctrl_new_custom(&mt9v032->ctrls, &mt9v032_aegc_controls[i], mt9v032 1110 drivers/media/i2c/mt9v032.c v4l2_ctrl_cluster(2, &mt9v032->test_pattern); mt9v032 1112 drivers/media/i2c/mt9v032.c mt9v032->pixel_rate = mt9v032 1113 drivers/media/i2c/mt9v032.c v4l2_ctrl_new_std(&mt9v032->ctrls, &mt9v032_ctrl_ops, mt9v032 1124 drivers/media/i2c/mt9v032.c mt9v032->link_freq = mt9v032 1125 drivers/media/i2c/mt9v032.c v4l2_ctrl_new_int_menu(&mt9v032->ctrls, mt9v032 1129 drivers/media/i2c/mt9v032.c v4l2_ctrl_cluster(2, &mt9v032->link_freq); mt9v032 1133 drivers/media/i2c/mt9v032.c mt9v032->subdev.ctrl_handler = &mt9v032->ctrls; mt9v032 1135 drivers/media/i2c/mt9v032.c if (mt9v032->ctrls.error) { mt9v032 1137 drivers/media/i2c/mt9v032.c mt9v032->ctrls.error); mt9v032 1138 drivers/media/i2c/mt9v032.c ret = mt9v032->ctrls.error; mt9v032 1142 drivers/media/i2c/mt9v032.c mt9v032->crop.left = MT9V032_COLUMN_START_DEF; mt9v032 1143 drivers/media/i2c/mt9v032.c mt9v032->crop.top = MT9V032_ROW_START_DEF; mt9v032 1144 drivers/media/i2c/mt9v032.c mt9v032->crop.width = MT9V032_WINDOW_WIDTH_DEF; mt9v032 1145 drivers/media/i2c/mt9v032.c mt9v032->crop.height = MT9V032_WINDOW_HEIGHT_DEF; mt9v032 1147 drivers/media/i2c/mt9v032.c if (mt9v032->model->color) mt9v032 1148 drivers/media/i2c/mt9v032.c mt9v032->format.code = MEDIA_BUS_FMT_SGRBG10_1X10; mt9v032 1150 drivers/media/i2c/mt9v032.c mt9v032->format.code = MEDIA_BUS_FMT_Y10_1X10; mt9v032 1152 drivers/media/i2c/mt9v032.c mt9v032->format.width = MT9V032_WINDOW_WIDTH_DEF; mt9v032 1153 drivers/media/i2c/mt9v032.c mt9v032->format.height = MT9V032_WINDOW_HEIGHT_DEF; mt9v032 1154 drivers/media/i2c/mt9v032.c mt9v032->format.field = V4L2_FIELD_NONE; mt9v032 1155 drivers/media/i2c/mt9v032.c mt9v032->format.colorspace = V4L2_COLORSPACE_SRGB; mt9v032 1157 drivers/media/i2c/mt9v032.c mt9v032->hratio = 1; mt9v032 1158 drivers/media/i2c/mt9v032.c mt9v032->vratio = 1; mt9v032 1160 drivers/media/i2c/mt9v032.c mt9v032->aec_agc = MT9V032_AEC_ENABLE | MT9V032_AGC_ENABLE; mt9v032 1161 drivers/media/i2c/mt9v032.c mt9v032->hblank = MT9V032_HORIZONTAL_BLANKING_DEF; mt9v032 1162 drivers/media/i2c/mt9v032.c mt9v032->sysclk = MT9V032_SYSCLK_FREQ_DEF; mt9v032 1164 drivers/media/i2c/mt9v032.c v4l2_i2c_subdev_init(&mt9v032->subdev, client, &mt9v032_subdev_ops); mt9v032 1165 drivers/media/i2c/mt9v032.c mt9v032->subdev.internal_ops = &mt9v032_subdev_internal_ops; mt9v032 1166 drivers/media/i2c/mt9v032.c mt9v032->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; mt9v032 1168 drivers/media/i2c/mt9v032.c mt9v032->subdev.entity.function = MEDIA_ENT_F_CAM_SENSOR; mt9v032 1169 drivers/media/i2c/mt9v032.c mt9v032->pad.flags = MEDIA_PAD_FL_SOURCE; mt9v032 1170 drivers/media/i2c/mt9v032.c ret = media_entity_pads_init(&mt9v032->subdev.entity, 1, &mt9v032->pad); mt9v032 1174 drivers/media/i2c/mt9v032.c mt9v032->subdev.dev = &client->dev; mt9v032 1175 drivers/media/i2c/mt9v032.c ret = v4l2_async_register_subdev(&mt9v032->subdev); mt9v032 1182 drivers/media/i2c/mt9v032.c media_entity_cleanup(&mt9v032->subdev.entity); mt9v032 1183 drivers/media/i2c/mt9v032.c v4l2_ctrl_handler_free(&mt9v032->ctrls); mt9v032 1190 drivers/media/i2c/mt9v032.c struct mt9v032 *mt9v032 = to_mt9v032(subdev); mt9v032 1193 drivers/media/i2c/mt9v032.c v4l2_ctrl_handler_free(&mt9v032->ctrls);