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);