Lines Matching refs:gc2385
105 struct gc2385 { struct
132 #define to_gc2385(sd) container_of(sd, struct gc2385, subdev) argument
351 struct gc2385 *gc2385 = to_gc2385(sd); in gc2385_set_fmt() local
355 mutex_lock(&gc2385->mutex); in gc2385_set_fmt()
366 mutex_unlock(&gc2385->mutex); in gc2385_set_fmt()
370 gc2385->cur_mode = mode; in gc2385_set_fmt()
372 __v4l2_ctrl_modify_range(gc2385->hblank, h_blank, in gc2385_set_fmt()
375 __v4l2_ctrl_modify_range(gc2385->vblank, vblank_def, in gc2385_set_fmt()
380 mutex_unlock(&gc2385->mutex); in gc2385_set_fmt()
389 struct gc2385 *gc2385 = to_gc2385(sd); in gc2385_get_fmt() local
390 const struct gc2385_mode *mode = gc2385->cur_mode; in gc2385_get_fmt()
392 mutex_lock(&gc2385->mutex); in gc2385_get_fmt()
397 mutex_unlock(&gc2385->mutex); in gc2385_get_fmt()
406 mutex_unlock(&gc2385->mutex); in gc2385_get_fmt()
443 struct gc2385 *gc2385 = to_gc2385(sd); in gc2385_g_frame_interval() local
444 const struct gc2385_mode *mode = gc2385->cur_mode; in gc2385_g_frame_interval()
451 static void gc2385_get_module_inf(struct gc2385 *gc2385, in gc2385_get_module_inf() argument
456 strlcpy(inf->base.module, gc2385->module_name, in gc2385_get_module_inf()
458 strlcpy(inf->base.lens, gc2385->len_name, sizeof(inf->base.lens)); in gc2385_get_module_inf()
463 struct gc2385 *gc2385 = to_gc2385(sd); in gc2385_ioctl() local
469 gc2385_get_module_inf(gc2385, (struct rkmodule_inf *)arg); in gc2385_ioctl()
476 ret = gc2385_write_reg(gc2385->client, in gc2385_ioctl()
479 ret |= gc2385_write_reg(gc2385->client, in gc2385_ioctl()
483 ret = gc2385_write_reg(gc2385->client, in gc2385_ioctl()
485 ret |= gc2385_write_reg(gc2385->client, in gc2385_ioctl()
546 static int __gc2385_start_stream(struct gc2385 *gc2385) in __gc2385_start_stream() argument
550 ret = gc2385_write_array(gc2385->client, gc2385->cur_mode->reg_list); in __gc2385_start_stream()
555 mutex_unlock(&gc2385->mutex); in __gc2385_start_stream()
556 ret = v4l2_ctrl_handler_setup(&gc2385->ctrl_handler); in __gc2385_start_stream()
557 mutex_lock(&gc2385->mutex); in __gc2385_start_stream()
560 ret = gc2385_write_reg(gc2385->client, in __gc2385_start_stream()
563 ret |= gc2385_write_reg(gc2385->client, in __gc2385_start_stream()
569 static int __gc2385_stop_stream(struct gc2385 *gc2385) in __gc2385_stop_stream() argument
573 ret = gc2385_write_reg(gc2385->client, in __gc2385_stop_stream()
575 ret |= gc2385_write_reg(gc2385->client, in __gc2385_stop_stream()
582 struct gc2385 *gc2385 = to_gc2385(sd); in gc2385_s_stream() local
583 struct i2c_client *client = gc2385->client; in gc2385_s_stream()
586 mutex_lock(&gc2385->mutex); in gc2385_s_stream()
588 if (on == gc2385->streaming) in gc2385_s_stream()
598 ret = __gc2385_start_stream(gc2385); in gc2385_s_stream()
605 __gc2385_stop_stream(gc2385); in gc2385_s_stream()
609 gc2385->streaming = on; in gc2385_s_stream()
612 mutex_unlock(&gc2385->mutex); in gc2385_s_stream()
619 struct gc2385 *gc2385 = to_gc2385(sd); in gc2385_s_power() local
620 struct i2c_client *client = gc2385->client; in gc2385_s_power()
623 mutex_lock(&gc2385->mutex); in gc2385_s_power()
626 if (gc2385->power_on == !!on) in gc2385_s_power()
636 ret = gc2385_write_array(gc2385->client, gc2385_global_regs); in gc2385_s_power()
643 gc2385->power_on = true; in gc2385_s_power()
646 gc2385->power_on = false; in gc2385_s_power()
650 mutex_unlock(&gc2385->mutex); in gc2385_s_power()
661 static int __gc2385_power_on(struct gc2385 *gc2385) in __gc2385_power_on() argument
665 struct device *dev = &gc2385->client->dev; in __gc2385_power_on()
667 if (!IS_ERR_OR_NULL(gc2385->pins_default)) { in __gc2385_power_on()
668 ret = pinctrl_select_state(gc2385->pinctrl, in __gc2385_power_on()
669 gc2385->pins_default); in __gc2385_power_on()
673 ret = clk_set_rate(gc2385->xvclk, GC2385_XVCLK_FREQ); in __gc2385_power_on()
676 if (clk_get_rate(gc2385->xvclk) != GC2385_XVCLK_FREQ) in __gc2385_power_on()
678 ret = clk_prepare_enable(gc2385->xvclk); in __gc2385_power_on()
683 if (!IS_ERR(gc2385->reset_gpio)) in __gc2385_power_on()
684 gpiod_set_value_cansleep(gc2385->reset_gpio, 1); in __gc2385_power_on()
686 ret = regulator_bulk_enable(GC2385_NUM_SUPPLIES, gc2385->supplies); in __gc2385_power_on()
693 if (!IS_ERR(gc2385->reset_gpio)) in __gc2385_power_on()
694 gpiod_set_value_cansleep(gc2385->reset_gpio, 0); in __gc2385_power_on()
697 if (!IS_ERR(gc2385->pwdn_gpio)) in __gc2385_power_on()
698 gpiod_set_value_cansleep(gc2385->pwdn_gpio, 1); in __gc2385_power_on()
707 clk_disable_unprepare(gc2385->xvclk); in __gc2385_power_on()
712 static void __gc2385_power_off(struct gc2385 *gc2385) in __gc2385_power_off() argument
716 if (!IS_ERR(gc2385->pwdn_gpio)) in __gc2385_power_off()
717 gpiod_set_value_cansleep(gc2385->pwdn_gpio, 0); in __gc2385_power_off()
718 clk_disable_unprepare(gc2385->xvclk); in __gc2385_power_off()
719 if (!IS_ERR(gc2385->reset_gpio)) in __gc2385_power_off()
720 gpiod_set_value_cansleep(gc2385->reset_gpio, 1); in __gc2385_power_off()
721 if (!IS_ERR_OR_NULL(gc2385->pins_sleep)) { in __gc2385_power_off()
722 ret = pinctrl_select_state(gc2385->pinctrl, in __gc2385_power_off()
723 gc2385->pins_sleep); in __gc2385_power_off()
725 dev_dbg(&gc2385->client->dev, "could not set pins\n"); in __gc2385_power_off()
727 regulator_bulk_disable(GC2385_NUM_SUPPLIES, gc2385->supplies); in __gc2385_power_off()
734 struct gc2385 *gc2385 = to_gc2385(sd); in gc2385_runtime_resume() local
736 return __gc2385_power_on(gc2385); in gc2385_runtime_resume()
743 struct gc2385 *gc2385 = to_gc2385(sd); in gc2385_runtime_suspend() local
745 __gc2385_power_off(gc2385); in gc2385_runtime_suspend()
753 struct gc2385 *gc2385 = to_gc2385(sd); in gc2385_open() local
758 mutex_lock(&gc2385->mutex); in gc2385_open()
765 mutex_unlock(&gc2385->mutex); in gc2385_open()
849 static int gc2385_set_gain_reg(struct gc2385 *gc2385, u32 a_gain) in gc2385_set_gain_reg() argument
854 ret = gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
858 ret |= gc2385_write_reg(gc2385->client, 0x20, 0x73); in gc2385_set_gain_reg()
859 ret |= gc2385_write_reg(gc2385->client, 0x22, 0xa2); in gc2385_set_gain_reg()
860 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
863 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
865 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
869 ret |= gc2385_write_reg(gc2385->client, 0x20, 0x73); in gc2385_set_gain_reg()
870 ret |= gc2385_write_reg(gc2385->client, 0x22, 0xa2); in gc2385_set_gain_reg()
871 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
874 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
876 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
880 ret |= gc2385_write_reg(gc2385->client, 0x20, 0x73); in gc2385_set_gain_reg()
881 ret |= gc2385_write_reg(gc2385->client, 0x22, 0xa2); in gc2385_set_gain_reg()
882 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
885 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
887 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
891 ret |= gc2385_write_reg(gc2385->client, 0x20, 0x73); in gc2385_set_gain_reg()
892 ret |= gc2385_write_reg(gc2385->client, 0x22, 0xa2); in gc2385_set_gain_reg()
893 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
896 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
898 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
902 ret |= gc2385_write_reg(gc2385->client, 0x20, 0x73); in gc2385_set_gain_reg()
903 ret |= gc2385_write_reg(gc2385->client, 0x22, 0xa3); in gc2385_set_gain_reg()
904 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
907 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
909 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
913 ret |= gc2385_write_reg(gc2385->client, 0x20, 0x73); in gc2385_set_gain_reg()
914 ret |= gc2385_write_reg(gc2385->client, 0x22, 0xa3); in gc2385_set_gain_reg()
915 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
918 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
920 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
924 ret |= gc2385_write_reg(gc2385->client, 0x20, 0x74); in gc2385_set_gain_reg()
925 ret |= gc2385_write_reg(gc2385->client, 0x22, 0xa3); in gc2385_set_gain_reg()
926 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
929 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
931 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
935 ret |= gc2385_write_reg(gc2385->client, 0x20, 0x74); in gc2385_set_gain_reg()
936 ret |= gc2385_write_reg(gc2385->client, 0x22, 0xa3); in gc2385_set_gain_reg()
937 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
940 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
942 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
945 ret |= gc2385_write_reg(gc2385->client, 0x20, 0x75); in gc2385_set_gain_reg()
946 ret |= gc2385_write_reg(gc2385->client, 0x22, 0xa4); in gc2385_set_gain_reg()
947 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
950 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
952 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_gain_reg()
960 struct gc2385 *gc2385 = container_of(ctrl->handler, in gc2385_set_ctrl() local
961 struct gc2385, ctrl_handler); in gc2385_set_ctrl()
962 struct i2c_client *client = gc2385->client; in gc2385_set_ctrl()
970 max = gc2385->cur_mode->height + ctrl->val - 4; in gc2385_set_ctrl()
971 __v4l2_ctrl_modify_range(gc2385->exposure, in gc2385_set_ctrl()
972 gc2385->exposure->minimum, max, in gc2385_set_ctrl()
973 gc2385->exposure->step, in gc2385_set_ctrl()
974 gc2385->exposure->default_value); in gc2385_set_ctrl()
984 ret = gc2385_write_reg(gc2385->client, in gc2385_set_ctrl()
987 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_ctrl()
990 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_ctrl()
995 ret = gc2385_set_gain_reg(gc2385, ctrl->val); in gc2385_set_ctrl()
998 ret = gc2385_write_reg(gc2385->client, in gc2385_set_ctrl()
1001 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_ctrl()
1004 ret |= gc2385_write_reg(gc2385->client, in gc2385_set_ctrl()
1023 static int gc2385_initialize_controls(struct gc2385 *gc2385) in gc2385_initialize_controls() argument
1032 handler = &gc2385->ctrl_handler; in gc2385_initialize_controls()
1033 mode = gc2385->cur_mode; in gc2385_initialize_controls()
1037 handler->lock = &gc2385->mutex; in gc2385_initialize_controls()
1048 gc2385->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in gc2385_initialize_controls()
1050 if (gc2385->hblank) in gc2385_initialize_controls()
1051 gc2385->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in gc2385_initialize_controls()
1054 gc2385->vblank = v4l2_ctrl_new_std(handler, &gc2385_ctrl_ops, in gc2385_initialize_controls()
1060 gc2385->exposure = v4l2_ctrl_new_std(handler, &gc2385_ctrl_ops, in gc2385_initialize_controls()
1065 gc2385->anal_gain = v4l2_ctrl_new_std(handler, &gc2385_ctrl_ops, in gc2385_initialize_controls()
1071 dev_err(&gc2385->client->dev, in gc2385_initialize_controls()
1076 gc2385->subdev.ctrl_handler = handler; in gc2385_initialize_controls()
1086 static int gc2385_check_sensor_id(struct gc2385 *gc2385, in gc2385_check_sensor_id() argument
1089 struct device *dev = &gc2385->client->dev; in gc2385_check_sensor_id()
1095 ret = gc2385_write_reg(gc2385->client, in gc2385_check_sensor_id()
1108 static int gc2385_configure_regulators(struct gc2385 *gc2385) in gc2385_configure_regulators() argument
1113 gc2385->supplies[i].supply = gc2385_supply_names[i]; in gc2385_configure_regulators()
1115 return devm_regulator_bulk_get(&gc2385->client->dev, in gc2385_configure_regulators()
1117 gc2385->supplies); in gc2385_configure_regulators()
1125 struct gc2385 *gc2385; in gc2385_probe() local
1135 gc2385 = devm_kzalloc(dev, sizeof(*gc2385), GFP_KERNEL); in gc2385_probe()
1136 if (!gc2385) in gc2385_probe()
1140 &gc2385->module_index); in gc2385_probe()
1142 &gc2385->module_facing); in gc2385_probe()
1144 &gc2385->module_name); in gc2385_probe()
1146 &gc2385->len_name); in gc2385_probe()
1151 gc2385->client = client; in gc2385_probe()
1152 gc2385->cur_mode = &supported_modes[0]; in gc2385_probe()
1154 gc2385->xvclk = devm_clk_get(dev, "xvclk"); in gc2385_probe()
1155 if (IS_ERR(gc2385->xvclk)) { in gc2385_probe()
1160 gc2385->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in gc2385_probe()
1161 if (IS_ERR(gc2385->reset_gpio)) in gc2385_probe()
1164 gc2385->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in gc2385_probe()
1165 if (IS_ERR(gc2385->pwdn_gpio)) in gc2385_probe()
1168 ret = gc2385_configure_regulators(gc2385); in gc2385_probe()
1174 gc2385->pinctrl = devm_pinctrl_get(dev); in gc2385_probe()
1175 if (!IS_ERR(gc2385->pinctrl)) { in gc2385_probe()
1176 gc2385->pins_default = in gc2385_probe()
1177 pinctrl_lookup_state(gc2385->pinctrl, in gc2385_probe()
1179 if (IS_ERR(gc2385->pins_default)) in gc2385_probe()
1182 gc2385->pins_sleep = in gc2385_probe()
1183 pinctrl_lookup_state(gc2385->pinctrl, in gc2385_probe()
1185 if (IS_ERR(gc2385->pins_sleep)) in gc2385_probe()
1189 mutex_init(&gc2385->mutex); in gc2385_probe()
1191 sd = &gc2385->subdev; in gc2385_probe()
1193 ret = gc2385_initialize_controls(gc2385); in gc2385_probe()
1197 ret = __gc2385_power_on(gc2385); in gc2385_probe()
1201 ret = gc2385_check_sensor_id(gc2385, client); in gc2385_probe()
1211 gc2385->pad.flags = MEDIA_PAD_FL_SOURCE; in gc2385_probe()
1213 ret = media_entity_pads_init(&sd->entity, 1, &gc2385->pad); in gc2385_probe()
1219 if (strcmp(gc2385->module_facing, "back") == 0) in gc2385_probe()
1225 gc2385->module_index, facing, in gc2385_probe()
1244 __gc2385_power_off(gc2385); in gc2385_probe()
1246 v4l2_ctrl_handler_free(&gc2385->ctrl_handler); in gc2385_probe()
1248 mutex_destroy(&gc2385->mutex); in gc2385_probe()
1256 struct gc2385 *gc2385 = to_gc2385(sd); in gc2385_remove() local
1262 v4l2_ctrl_handler_free(&gc2385->ctrl_handler); in gc2385_remove()
1263 mutex_destroy(&gc2385->mutex); in gc2385_remove()
1267 __gc2385_power_off(gc2385); in gc2385_remove()