ov5645            117 drivers/media/i2c/ov5645.c static inline struct ov5645 *to_ov5645(struct v4l2_subdev *sd)
ov5645            119 drivers/media/i2c/ov5645.c 	return container_of(sd, struct ov5645, sd);
ov5645            544 drivers/media/i2c/ov5645.c static int ov5645_write_reg(struct ov5645 *ov5645, u16 reg, u8 val)
ov5645            553 drivers/media/i2c/ov5645.c 	ret = i2c_master_send(ov5645->i2c_client, regbuf, 3);
ov5645            555 drivers/media/i2c/ov5645.c 		dev_err(ov5645->dev, "%s: write reg error %d: reg=%x, val=%x\n",
ov5645            563 drivers/media/i2c/ov5645.c static int ov5645_read_reg(struct ov5645 *ov5645, u16 reg, u8 *val)
ov5645            571 drivers/media/i2c/ov5645.c 	ret = i2c_master_send(ov5645->i2c_client, regbuf, 2);
ov5645            573 drivers/media/i2c/ov5645.c 		dev_err(ov5645->dev, "%s: write reg error %d: reg=%x\n",
ov5645            578 drivers/media/i2c/ov5645.c 	ret = i2c_master_recv(ov5645->i2c_client, val, 1);
ov5645            580 drivers/media/i2c/ov5645.c 		dev_err(ov5645->dev, "%s: read reg error %d: reg=%x\n",
ov5645            588 drivers/media/i2c/ov5645.c static int ov5645_set_aec_mode(struct ov5645 *ov5645, u32 mode)
ov5645            590 drivers/media/i2c/ov5645.c 	u8 val = ov5645->aec_pk_manual;
ov5645            598 drivers/media/i2c/ov5645.c 	ret = ov5645_write_reg(ov5645, OV5645_AEC_PK_MANUAL, val);
ov5645            600 drivers/media/i2c/ov5645.c 		ov5645->aec_pk_manual = val;
ov5645            605 drivers/media/i2c/ov5645.c static int ov5645_set_agc_mode(struct ov5645 *ov5645, u32 enable)
ov5645            607 drivers/media/i2c/ov5645.c 	u8 val = ov5645->aec_pk_manual;
ov5645            615 drivers/media/i2c/ov5645.c 	ret = ov5645_write_reg(ov5645, OV5645_AEC_PK_MANUAL, val);
ov5645            617 drivers/media/i2c/ov5645.c 		ov5645->aec_pk_manual = val;
ov5645            622 drivers/media/i2c/ov5645.c static int ov5645_set_register_array(struct ov5645 *ov5645,
ov5645            630 drivers/media/i2c/ov5645.c 		ret = ov5645_write_reg(ov5645, settings->reg, settings->val);
ov5645            638 drivers/media/i2c/ov5645.c static int ov5645_set_power_on(struct ov5645 *ov5645)
ov5645            642 drivers/media/i2c/ov5645.c 	ret = regulator_bulk_enable(OV5645_NUM_SUPPLIES, ov5645->supplies);
ov5645            646 drivers/media/i2c/ov5645.c 	ret = clk_prepare_enable(ov5645->xclk);
ov5645            648 drivers/media/i2c/ov5645.c 		dev_err(ov5645->dev, "clk prepare enable failed\n");
ov5645            649 drivers/media/i2c/ov5645.c 		regulator_bulk_disable(OV5645_NUM_SUPPLIES, ov5645->supplies);
ov5645            654 drivers/media/i2c/ov5645.c 	gpiod_set_value_cansleep(ov5645->enable_gpio, 1);
ov5645            657 drivers/media/i2c/ov5645.c 	gpiod_set_value_cansleep(ov5645->rst_gpio, 0);
ov5645            664 drivers/media/i2c/ov5645.c static void ov5645_set_power_off(struct ov5645 *ov5645)
ov5645            666 drivers/media/i2c/ov5645.c 	gpiod_set_value_cansleep(ov5645->rst_gpio, 1);
ov5645            667 drivers/media/i2c/ov5645.c 	gpiod_set_value_cansleep(ov5645->enable_gpio, 0);
ov5645            668 drivers/media/i2c/ov5645.c 	clk_disable_unprepare(ov5645->xclk);
ov5645            669 drivers/media/i2c/ov5645.c 	regulator_bulk_disable(OV5645_NUM_SUPPLIES, ov5645->supplies);
ov5645            674 drivers/media/i2c/ov5645.c 	struct ov5645 *ov5645 = to_ov5645(sd);
ov5645            677 drivers/media/i2c/ov5645.c 	mutex_lock(&ov5645->power_lock);
ov5645            682 drivers/media/i2c/ov5645.c 	if (ov5645->power_count == !on) {
ov5645            684 drivers/media/i2c/ov5645.c 			ret = ov5645_set_power_on(ov5645);
ov5645            688 drivers/media/i2c/ov5645.c 			ret = ov5645_set_register_array(ov5645,
ov5645            692 drivers/media/i2c/ov5645.c 				dev_err(ov5645->dev,
ov5645            694 drivers/media/i2c/ov5645.c 				ov5645_set_power_off(ov5645);
ov5645            700 drivers/media/i2c/ov5645.c 			ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x58);
ov5645            701 drivers/media/i2c/ov5645.c 			ov5645_set_power_off(ov5645);
ov5645            706 drivers/media/i2c/ov5645.c 	ov5645->power_count += on ? 1 : -1;
ov5645            707 drivers/media/i2c/ov5645.c 	WARN_ON(ov5645->power_count < 0);
ov5645            710 drivers/media/i2c/ov5645.c 	mutex_unlock(&ov5645->power_lock);
ov5645            715 drivers/media/i2c/ov5645.c static int ov5645_set_saturation(struct ov5645 *ov5645, s32 value)
ov5645            720 drivers/media/i2c/ov5645.c 	ret = ov5645_write_reg(ov5645, OV5645_SDE_SAT_U, reg_value);
ov5645            724 drivers/media/i2c/ov5645.c 	return ov5645_write_reg(ov5645, OV5645_SDE_SAT_V, reg_value);
ov5645            727 drivers/media/i2c/ov5645.c static int ov5645_set_hflip(struct ov5645 *ov5645, s32 value)
ov5645            729 drivers/media/i2c/ov5645.c 	u8 val = ov5645->timing_tc_reg21;
ov5645            737 drivers/media/i2c/ov5645.c 	ret = ov5645_write_reg(ov5645, OV5645_TIMING_TC_REG21, val);
ov5645            739 drivers/media/i2c/ov5645.c 		ov5645->timing_tc_reg21 = val;
ov5645            744 drivers/media/i2c/ov5645.c static int ov5645_set_vflip(struct ov5645 *ov5645, s32 value)
ov5645            746 drivers/media/i2c/ov5645.c 	u8 val = ov5645->timing_tc_reg20;
ov5645            754 drivers/media/i2c/ov5645.c 	ret = ov5645_write_reg(ov5645, OV5645_TIMING_TC_REG20, val);
ov5645            756 drivers/media/i2c/ov5645.c 		ov5645->timing_tc_reg20 = val;
ov5645            761 drivers/media/i2c/ov5645.c static int ov5645_set_test_pattern(struct ov5645 *ov5645, s32 value)
ov5645            770 drivers/media/i2c/ov5645.c 	return ov5645_write_reg(ov5645, OV5645_PRE_ISP_TEST_SETTING_1, val);
ov5645            781 drivers/media/i2c/ov5645.c static int ov5645_set_awb(struct ov5645 *ov5645, s32 enable_auto)
ov5645            788 drivers/media/i2c/ov5645.c 	return ov5645_write_reg(ov5645, OV5645_AWB_MANUAL_CONTROL, val);
ov5645            793 drivers/media/i2c/ov5645.c 	struct ov5645 *ov5645 = container_of(ctrl->handler,
ov5645            794 drivers/media/i2c/ov5645.c 					     struct ov5645, ctrls);
ov5645            797 drivers/media/i2c/ov5645.c 	mutex_lock(&ov5645->power_lock);
ov5645            798 drivers/media/i2c/ov5645.c 	if (!ov5645->power_count) {
ov5645            799 drivers/media/i2c/ov5645.c 		mutex_unlock(&ov5645->power_lock);
ov5645            805 drivers/media/i2c/ov5645.c 		ret = ov5645_set_saturation(ov5645, ctrl->val);
ov5645            808 drivers/media/i2c/ov5645.c 		ret = ov5645_set_awb(ov5645, ctrl->val);
ov5645            811 drivers/media/i2c/ov5645.c 		ret = ov5645_set_agc_mode(ov5645, ctrl->val);
ov5645            814 drivers/media/i2c/ov5645.c 		ret = ov5645_set_aec_mode(ov5645, ctrl->val);
ov5645            817 drivers/media/i2c/ov5645.c 		ret = ov5645_set_test_pattern(ov5645, ctrl->val);
ov5645            820 drivers/media/i2c/ov5645.c 		ret = ov5645_set_hflip(ov5645, ctrl->val);
ov5645            823 drivers/media/i2c/ov5645.c 		ret = ov5645_set_vflip(ov5645, ctrl->val);
ov5645            830 drivers/media/i2c/ov5645.c 	mutex_unlock(&ov5645->power_lock);
ov5645            870 drivers/media/i2c/ov5645.c __ov5645_get_pad_format(struct ov5645 *ov5645,
ov5645            877 drivers/media/i2c/ov5645.c 		return v4l2_subdev_get_try_format(&ov5645->sd, cfg, pad);
ov5645            879 drivers/media/i2c/ov5645.c 		return &ov5645->fmt;
ov5645            889 drivers/media/i2c/ov5645.c 	struct ov5645 *ov5645 = to_ov5645(sd);
ov5645            891 drivers/media/i2c/ov5645.c 	format->format = *__ov5645_get_pad_format(ov5645, cfg, format->pad,
ov5645            897 drivers/media/i2c/ov5645.c __ov5645_get_pad_crop(struct ov5645 *ov5645, struct v4l2_subdev_pad_config *cfg,
ov5645            902 drivers/media/i2c/ov5645.c 		return v4l2_subdev_get_try_crop(&ov5645->sd, cfg, pad);
ov5645            904 drivers/media/i2c/ov5645.c 		return &ov5645->crop;
ov5645            914 drivers/media/i2c/ov5645.c 	struct ov5645 *ov5645 = to_ov5645(sd);
ov5645            920 drivers/media/i2c/ov5645.c 	__crop = __ov5645_get_pad_crop(ov5645, cfg, format->pad,
ov5645            932 drivers/media/i2c/ov5645.c 		ret = v4l2_ctrl_s_ctrl_int64(ov5645->pixel_clock,
ov5645            937 drivers/media/i2c/ov5645.c 		ret = v4l2_ctrl_s_ctrl(ov5645->link_freq,
ov5645            942 drivers/media/i2c/ov5645.c 		ov5645->current_mode = new_mode;
ov5645            945 drivers/media/i2c/ov5645.c 	__format = __ov5645_get_pad_format(ov5645, cfg, format->pad,
ov5645            976 drivers/media/i2c/ov5645.c 	struct ov5645 *ov5645 = to_ov5645(sd);
ov5645            981 drivers/media/i2c/ov5645.c 	sel->r = *__ov5645_get_pad_crop(ov5645, cfg, sel->pad,
ov5645            988 drivers/media/i2c/ov5645.c 	struct ov5645 *ov5645 = to_ov5645(subdev);
ov5645            992 drivers/media/i2c/ov5645.c 		ret = ov5645_set_register_array(ov5645,
ov5645            993 drivers/media/i2c/ov5645.c 					ov5645->current_mode->data,
ov5645            994 drivers/media/i2c/ov5645.c 					ov5645->current_mode->data_size);
ov5645            996 drivers/media/i2c/ov5645.c 			dev_err(ov5645->dev, "could not set mode %dx%d\n",
ov5645            997 drivers/media/i2c/ov5645.c 				ov5645->current_mode->width,
ov5645            998 drivers/media/i2c/ov5645.c 				ov5645->current_mode->height);
ov5645           1001 drivers/media/i2c/ov5645.c 		ret = v4l2_ctrl_handler_setup(&ov5645->ctrls);
ov5645           1003 drivers/media/i2c/ov5645.c 			dev_err(ov5645->dev, "could not sync v4l2 controls\n");
ov5645           1007 drivers/media/i2c/ov5645.c 		ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x45);
ov5645           1011 drivers/media/i2c/ov5645.c 		ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
ov5645           1016 drivers/media/i2c/ov5645.c 		ret = ov5645_write_reg(ov5645, OV5645_IO_MIPI_CTRL00, 0x40);
ov5645           1020 drivers/media/i2c/ov5645.c 		ret = ov5645_write_reg(ov5645, OV5645_SYSTEM_CTRL0,
ov5645           1056 drivers/media/i2c/ov5645.c 	struct ov5645 *ov5645;
ov5645           1062 drivers/media/i2c/ov5645.c 	ov5645 = devm_kzalloc(dev, sizeof(struct ov5645), GFP_KERNEL);
ov5645           1063 drivers/media/i2c/ov5645.c 	if (!ov5645)
ov5645           1066 drivers/media/i2c/ov5645.c 	ov5645->i2c_client = client;
ov5645           1067 drivers/media/i2c/ov5645.c 	ov5645->dev = dev;
ov5645           1076 drivers/media/i2c/ov5645.c 					 &ov5645->ep);
ov5645           1085 drivers/media/i2c/ov5645.c 	if (ov5645->ep.bus_type != V4L2_MBUS_CSI2_DPHY) {
ov5645           1091 drivers/media/i2c/ov5645.c 	ov5645->xclk = devm_clk_get(dev, "xclk");
ov5645           1092 drivers/media/i2c/ov5645.c 	if (IS_ERR(ov5645->xclk)) {
ov5645           1094 drivers/media/i2c/ov5645.c 		return PTR_ERR(ov5645->xclk);
ov5645           1110 drivers/media/i2c/ov5645.c 	ret = clk_set_rate(ov5645->xclk, xclk_freq);
ov5645           1117 drivers/media/i2c/ov5645.c 		ov5645->supplies[i].supply = ov5645_supply_name[i];
ov5645           1120 drivers/media/i2c/ov5645.c 				      ov5645->supplies);
ov5645           1124 drivers/media/i2c/ov5645.c 	ov5645->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH);
ov5645           1125 drivers/media/i2c/ov5645.c 	if (IS_ERR(ov5645->enable_gpio)) {
ov5645           1127 drivers/media/i2c/ov5645.c 		return PTR_ERR(ov5645->enable_gpio);
ov5645           1130 drivers/media/i2c/ov5645.c 	ov5645->rst_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
ov5645           1131 drivers/media/i2c/ov5645.c 	if (IS_ERR(ov5645->rst_gpio)) {
ov5645           1133 drivers/media/i2c/ov5645.c 		return PTR_ERR(ov5645->rst_gpio);
ov5645           1136 drivers/media/i2c/ov5645.c 	mutex_init(&ov5645->power_lock);
ov5645           1138 drivers/media/i2c/ov5645.c 	v4l2_ctrl_handler_init(&ov5645->ctrls, 9);
ov5645           1139 drivers/media/i2c/ov5645.c 	v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops,
ov5645           1141 drivers/media/i2c/ov5645.c 	v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops,
ov5645           1143 drivers/media/i2c/ov5645.c 	v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops,
ov5645           1145 drivers/media/i2c/ov5645.c 	v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops,
ov5645           1147 drivers/media/i2c/ov5645.c 	v4l2_ctrl_new_std(&ov5645->ctrls, &ov5645_ctrl_ops,
ov5645           1149 drivers/media/i2c/ov5645.c 	v4l2_ctrl_new_std_menu(&ov5645->ctrls, &ov5645_ctrl_ops,
ov5645           1152 drivers/media/i2c/ov5645.c 	v4l2_ctrl_new_std_menu_items(&ov5645->ctrls, &ov5645_ctrl_ops,
ov5645           1156 drivers/media/i2c/ov5645.c 	ov5645->pixel_clock = v4l2_ctrl_new_std(&ov5645->ctrls,
ov5645           1160 drivers/media/i2c/ov5645.c 	ov5645->link_freq = v4l2_ctrl_new_int_menu(&ov5645->ctrls,
ov5645           1165 drivers/media/i2c/ov5645.c 	if (ov5645->link_freq)
ov5645           1166 drivers/media/i2c/ov5645.c 		ov5645->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
ov5645           1168 drivers/media/i2c/ov5645.c 	ov5645->sd.ctrl_handler = &ov5645->ctrls;
ov5645           1170 drivers/media/i2c/ov5645.c 	if (ov5645->ctrls.error) {
ov5645           1172 drivers/media/i2c/ov5645.c 		       __func__, ov5645->ctrls.error);
ov5645           1173 drivers/media/i2c/ov5645.c 		ret = ov5645->ctrls.error;
ov5645           1177 drivers/media/i2c/ov5645.c 	v4l2_i2c_subdev_init(&ov5645->sd, client, &ov5645_subdev_ops);
ov5645           1178 drivers/media/i2c/ov5645.c 	ov5645->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
ov5645           1179 drivers/media/i2c/ov5645.c 	ov5645->pad.flags = MEDIA_PAD_FL_SOURCE;
ov5645           1180 drivers/media/i2c/ov5645.c 	ov5645->sd.dev = &client->dev;
ov5645           1181 drivers/media/i2c/ov5645.c 	ov5645->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
ov5645           1183 drivers/media/i2c/ov5645.c 	ret = media_entity_pads_init(&ov5645->sd.entity, 1, &ov5645->pad);
ov5645           1189 drivers/media/i2c/ov5645.c 	ret = ov5645_s_power(&ov5645->sd, true);
ov5645           1195 drivers/media/i2c/ov5645.c 	ret = ov5645_read_reg(ov5645, OV5645_CHIP_ID_HIGH, &chip_id_high);
ov5645           1201 drivers/media/i2c/ov5645.c 	ret = ov5645_read_reg(ov5645, OV5645_CHIP_ID_LOW, &chip_id_low);
ov5645           1210 drivers/media/i2c/ov5645.c 	ret = ov5645_read_reg(ov5645, OV5645_AEC_PK_MANUAL,
ov5645           1211 drivers/media/i2c/ov5645.c 			      &ov5645->aec_pk_manual);
ov5645           1218 drivers/media/i2c/ov5645.c 	ret = ov5645_read_reg(ov5645, OV5645_TIMING_TC_REG20,
ov5645           1219 drivers/media/i2c/ov5645.c 			      &ov5645->timing_tc_reg20);
ov5645           1226 drivers/media/i2c/ov5645.c 	ret = ov5645_read_reg(ov5645, OV5645_TIMING_TC_REG21,
ov5645           1227 drivers/media/i2c/ov5645.c 			      &ov5645->timing_tc_reg21);
ov5645           1234 drivers/media/i2c/ov5645.c 	ov5645_s_power(&ov5645->sd, false);
ov5645           1236 drivers/media/i2c/ov5645.c 	ret = v4l2_async_register_subdev(&ov5645->sd);
ov5645           1242 drivers/media/i2c/ov5645.c 	ov5645_entity_init_cfg(&ov5645->sd, NULL);
ov5645           1247 drivers/media/i2c/ov5645.c 	ov5645_s_power(&ov5645->sd, false);
ov5645           1249 drivers/media/i2c/ov5645.c 	media_entity_cleanup(&ov5645->sd.entity);
ov5645           1251 drivers/media/i2c/ov5645.c 	v4l2_ctrl_handler_free(&ov5645->ctrls);
ov5645           1252 drivers/media/i2c/ov5645.c 	mutex_destroy(&ov5645->power_lock);
ov5645           1260 drivers/media/i2c/ov5645.c 	struct ov5645 *ov5645 = to_ov5645(sd);
ov5645           1262 drivers/media/i2c/ov5645.c 	v4l2_async_unregister_subdev(&ov5645->sd);
ov5645           1263 drivers/media/i2c/ov5645.c 	media_entity_cleanup(&ov5645->sd.entity);
ov5645           1264 drivers/media/i2c/ov5645.c 	v4l2_ctrl_handler_free(&ov5645->ctrls);
ov5645           1265 drivers/media/i2c/ov5645.c 	mutex_destroy(&ov5645->power_lock);