Lines Matching refs:sc031gs

104 struct sc031gs {  struct
131 #define to_sc031gs(sd) container_of(sd, struct sc031gs, subdev) argument
455 struct sc031gs *sc031gs = to_sc031gs(sd); in sc031gs_set_fmt() local
459 mutex_lock(&sc031gs->mutex); in sc031gs_set_fmt()
470 mutex_unlock(&sc031gs->mutex); in sc031gs_set_fmt()
474 sc031gs->cur_mode = mode; in sc031gs_set_fmt()
476 __v4l2_ctrl_modify_range(sc031gs->hblank, h_blank, in sc031gs_set_fmt()
479 __v4l2_ctrl_modify_range(sc031gs->vblank, vblank_def, in sc031gs_set_fmt()
482 sc031gs->cur_fps = mode->max_fps; in sc031gs_set_fmt()
483 sc031gs->cur_vts = mode->vts_def; in sc031gs_set_fmt()
486 mutex_unlock(&sc031gs->mutex); in sc031gs_set_fmt()
495 struct sc031gs *sc031gs = to_sc031gs(sd); in sc031gs_get_fmt() local
496 const struct sc031gs_mode *mode = sc031gs->cur_mode; in sc031gs_get_fmt()
498 mutex_lock(&sc031gs->mutex); in sc031gs_get_fmt()
503 mutex_unlock(&sc031gs->mutex); in sc031gs_get_fmt()
512 mutex_unlock(&sc031gs->mutex); in sc031gs_get_fmt()
546 static int sc031gs_enable_test_pattern(struct sc031gs *sc031gs, u32 pattern) in sc031gs_enable_test_pattern() argument
555 return sc031gs_write_reg(sc031gs->client, SC031GS_REG_TEST_PATTERN, in sc031gs_enable_test_pattern()
559 static void sc031gs_get_module_inf(struct sc031gs *sc031gs, in sc031gs_get_module_inf() argument
564 strlcpy(inf->base.module, sc031gs->module_name, in sc031gs_get_module_inf()
566 strlcpy(inf->base.lens, sc031gs->len_name, sizeof(inf->base.lens)); in sc031gs_get_module_inf()
571 struct sc031gs *sc031gs = to_sc031gs(sd); in sc031gs_ioctl() local
577 sc031gs_get_module_inf(sc031gs, (struct rkmodule_inf *)arg); in sc031gs_ioctl()
584 ret = sc031gs_write_reg(sc031gs->client, SC031GS_REG_CTRL_MODE, in sc031gs_ioctl()
587 ret = sc031gs_write_reg(sc031gs->client, SC031GS_REG_CTRL_MODE, in sc031gs_ioctl()
651 static int sc031gs_set_ctrl_gain(struct sc031gs *sc031gs, u32 a_gain) in sc031gs_set_ctrl_gain() argument
699 ret |= sc031gs_write_reg(sc031gs->client, 0x3314, in sc031gs_set_ctrl_gain()
701 ret |= sc031gs_write_reg(sc031gs->client, 0x3317, in sc031gs_set_ctrl_gain()
704 ret |= sc031gs_write_reg(sc031gs->client, 0x3314, in sc031gs_set_ctrl_gain()
706 ret |= sc031gs_write_reg(sc031gs->client, 0x3317, in sc031gs_set_ctrl_gain()
709 ret |= sc031gs_write_reg(sc031gs->client, in sc031gs_set_ctrl_gain()
713 ret |= sc031gs_write_reg(sc031gs->client, in sc031gs_set_ctrl_gain()
718 ret |= sc031gs_write_reg(sc031gs->client, 0x3e06, in sc031gs_set_ctrl_gain()
724 static int __sc031gs_start_stream(struct sc031gs *sc031gs) in __sc031gs_start_stream() argument
731 ret = sc031gs_write_array(sc031gs->client, sc031gs->cur_mode->reg_list); in __sc031gs_start_stream()
736 mutex_unlock(&sc031gs->mutex); in __sc031gs_start_stream()
737 ret = v4l2_ctrl_handler_setup(&sc031gs->ctrl_handler); in __sc031gs_start_stream()
738 mutex_lock(&sc031gs->mutex); in __sc031gs_start_stream()
742 return sc031gs_write_reg(sc031gs->client, SC031GS_REG_CTRL_MODE, in __sc031gs_start_stream()
746 static int __sc031gs_stop_stream(struct sc031gs *sc031gs) in __sc031gs_stop_stream() argument
748 return sc031gs_write_reg(sc031gs->client, SC031GS_REG_CTRL_MODE, in __sc031gs_stop_stream()
754 struct sc031gs *sc031gs = to_sc031gs(sd); in sc031gs_s_stream() local
755 struct i2c_client *client = sc031gs->client; in sc031gs_s_stream()
758 mutex_lock(&sc031gs->mutex); in sc031gs_s_stream()
760 if (on == sc031gs->streaming) in sc031gs_s_stream()
770 ret = __sc031gs_start_stream(sc031gs); in sc031gs_s_stream()
777 __sc031gs_stop_stream(sc031gs); in sc031gs_s_stream()
781 sc031gs->streaming = on; in sc031gs_s_stream()
784 mutex_unlock(&sc031gs->mutex); in sc031gs_s_stream()
792 struct sc031gs *sc031gs = to_sc031gs(sd); in sc031gs_g_frame_interval() local
793 const struct sc031gs_mode *mode = sc031gs->cur_mode; in sc031gs_g_frame_interval()
795 if (sc031gs->streaming) in sc031gs_g_frame_interval()
796 fi->interval = sc031gs->cur_fps; in sc031gs_g_frame_interval()
805 struct sc031gs *sc031gs = to_sc031gs(sd); in sc031gs_s_power() local
806 struct i2c_client *client = sc031gs->client; in sc031gs_s_power()
809 mutex_lock(&sc031gs->mutex); in sc031gs_s_power()
812 if (sc031gs->power_on == !!on) in sc031gs_s_power()
822 sc031gs->power_on = true; in sc031gs_s_power()
825 sc031gs->power_on = false; in sc031gs_s_power()
829 mutex_unlock(&sc031gs->mutex); in sc031gs_s_power()
840 static int __sc031gs_power_on(struct sc031gs *sc031gs) in __sc031gs_power_on() argument
844 struct device *dev = &sc031gs->client->dev; in __sc031gs_power_on()
846 ret = clk_set_rate(sc031gs->xvclk, SC031GS_XVCLK_FREQ); in __sc031gs_power_on()
849 if (clk_get_rate(sc031gs->xvclk) != SC031GS_XVCLK_FREQ) in __sc031gs_power_on()
851 ret = clk_prepare_enable(sc031gs->xvclk); in __sc031gs_power_on()
857 ret = regulator_bulk_enable(SC031GS_NUM_SUPPLIES, sc031gs->supplies); in __sc031gs_power_on()
863 if (!IS_ERR(sc031gs->pwdn_gpio)) in __sc031gs_power_on()
864 gpiod_set_value_cansleep(sc031gs->pwdn_gpio, 1); in __sc031gs_power_on()
873 clk_disable_unprepare(sc031gs->xvclk); in __sc031gs_power_on()
878 static void __sc031gs_power_off(struct sc031gs *sc031gs) in __sc031gs_power_off() argument
880 if (!IS_ERR(sc031gs->pwdn_gpio)) in __sc031gs_power_off()
881 gpiod_set_value_cansleep(sc031gs->pwdn_gpio, 0); in __sc031gs_power_off()
882 clk_disable_unprepare(sc031gs->xvclk); in __sc031gs_power_off()
884 regulator_bulk_disable(SC031GS_NUM_SUPPLIES, sc031gs->supplies); in __sc031gs_power_off()
891 struct sc031gs *sc031gs = to_sc031gs(sd); in sc031gs_runtime_resume() local
893 return __sc031gs_power_on(sc031gs); in sc031gs_runtime_resume()
900 struct sc031gs *sc031gs = to_sc031gs(sd); in sc031gs_runtime_suspend() local
902 __sc031gs_power_off(sc031gs); in sc031gs_runtime_suspend()
910 struct sc031gs *sc031gs = to_sc031gs(sd); in sc031gs_open() local
915 mutex_lock(&sc031gs->mutex); in sc031gs_open()
922 mutex_unlock(&sc031gs->mutex); in sc031gs_open()
997 static void sc031gs_modify_fps_info(struct sc031gs *sc031gs) in sc031gs_modify_fps_info() argument
999 const struct sc031gs_mode *mode = sc031gs->cur_mode; in sc031gs_modify_fps_info()
1001 sc031gs->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def / in sc031gs_modify_fps_info()
1002 sc031gs->cur_vts; in sc031gs_modify_fps_info()
1007 struct sc031gs *sc031gs = container_of(ctrl->handler, in sc031gs_set_ctrl() local
1008 struct sc031gs, ctrl_handler); in sc031gs_set_ctrl()
1009 struct i2c_client *client = sc031gs->client; in sc031gs_set_ctrl()
1017 max = sc031gs->cur_mode->height + ctrl->val - 4; in sc031gs_set_ctrl()
1018 __v4l2_ctrl_modify_range(sc031gs->exposure, in sc031gs_set_ctrl()
1019 sc031gs->exposure->minimum, max, in sc031gs_set_ctrl()
1020 sc031gs->exposure->step, in sc031gs_set_ctrl()
1021 sc031gs->exposure->default_value); in sc031gs_set_ctrl()
1031 ret = sc031gs_write_reg(sc031gs->client, SC031GS_REG_EXPOSURE, in sc031gs_set_ctrl()
1035 ret = sc031gs_set_ctrl_gain(sc031gs, ctrl->val); in sc031gs_set_ctrl()
1038 ret = sc031gs_write_reg(sc031gs->client, SC031GS_REG_VTS, in sc031gs_set_ctrl()
1040 ctrl->val + sc031gs->cur_mode->height); in sc031gs_set_ctrl()
1042 sc031gs->cur_vts = ctrl->val + sc031gs->cur_mode->height; in sc031gs_set_ctrl()
1043 sc031gs_modify_fps_info(sc031gs); in sc031gs_set_ctrl()
1046 ret = sc031gs_enable_test_pattern(sc031gs, ctrl->val); in sc031gs_set_ctrl()
1063 static int sc031gs_initialize_controls(struct sc031gs *sc031gs) in sc031gs_initialize_controls() argument
1072 handler = &sc031gs->ctrl_handler; in sc031gs_initialize_controls()
1073 mode = sc031gs->cur_mode; in sc031gs_initialize_controls()
1077 handler->lock = &sc031gs->mutex; in sc031gs_initialize_controls()
1088 sc031gs->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in sc031gs_initialize_controls()
1090 if (sc031gs->hblank) in sc031gs_initialize_controls()
1091 sc031gs->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in sc031gs_initialize_controls()
1094 sc031gs->cur_vts = mode->vts_def; in sc031gs_initialize_controls()
1095 sc031gs->vblank = v4l2_ctrl_new_std(handler, &sc031gs_ctrl_ops, in sc031gs_initialize_controls()
1101 sc031gs->exposure = v4l2_ctrl_new_std(handler, &sc031gs_ctrl_ops, in sc031gs_initialize_controls()
1106 sc031gs->anal_gain = v4l2_ctrl_new_std(handler, &sc031gs_ctrl_ops, in sc031gs_initialize_controls()
1111 sc031gs->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in sc031gs_initialize_controls()
1118 dev_err(&sc031gs->client->dev, in sc031gs_initialize_controls()
1123 sc031gs->subdev.ctrl_handler = handler; in sc031gs_initialize_controls()
1124 sc031gs->cur_fps = mode->max_fps; in sc031gs_initialize_controls()
1134 static int sc031gs_check_sensor_id(struct sc031gs *sc031gs, in sc031gs_check_sensor_id() argument
1137 struct device *dev = &sc031gs->client->dev; in sc031gs_check_sensor_id()
1153 static int sc031gs_configure_regulators(struct sc031gs *sc031gs) in sc031gs_configure_regulators() argument
1158 sc031gs->supplies[i].supply = sc031gs_supply_names[i]; in sc031gs_configure_regulators()
1160 return devm_regulator_bulk_get(&sc031gs->client->dev, in sc031gs_configure_regulators()
1162 sc031gs->supplies); in sc031gs_configure_regulators()
1170 struct sc031gs *sc031gs; in sc031gs_probe() local
1180 sc031gs = devm_kzalloc(dev, sizeof(*sc031gs), GFP_KERNEL); in sc031gs_probe()
1181 if (!sc031gs) in sc031gs_probe()
1185 &sc031gs->module_index); in sc031gs_probe()
1187 &sc031gs->module_facing); in sc031gs_probe()
1189 &sc031gs->module_name); in sc031gs_probe()
1191 &sc031gs->len_name); in sc031gs_probe()
1197 sc031gs->client = client; in sc031gs_probe()
1198 sc031gs->cur_mode = &supported_modes[0]; in sc031gs_probe()
1200 sc031gs->xvclk = devm_clk_get(dev, "xvclk"); in sc031gs_probe()
1201 if (IS_ERR(sc031gs->xvclk)) { in sc031gs_probe()
1206 sc031gs->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in sc031gs_probe()
1207 if (IS_ERR(sc031gs->reset_gpio)) in sc031gs_probe()
1210 sc031gs->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in sc031gs_probe()
1211 if (IS_ERR(sc031gs->pwdn_gpio)) in sc031gs_probe()
1213 ret = sc031gs_configure_regulators(sc031gs); in sc031gs_probe()
1219 mutex_init(&sc031gs->mutex); in sc031gs_probe()
1221 sd = &sc031gs->subdev; in sc031gs_probe()
1223 ret = sc031gs_initialize_controls(sc031gs); in sc031gs_probe()
1227 ret = __sc031gs_power_on(sc031gs); in sc031gs_probe()
1231 ret = sc031gs_check_sensor_id(sc031gs, client); in sc031gs_probe()
1241 sc031gs->pad.flags = MEDIA_PAD_FL_SOURCE; in sc031gs_probe()
1243 ret = media_entity_pads_init(&sd->entity, 1, &sc031gs->pad); in sc031gs_probe()
1249 if (strcmp(sc031gs->module_facing, "back") == 0) in sc031gs_probe()
1255 sc031gs->module_index, facing, in sc031gs_probe()
1274 __sc031gs_power_off(sc031gs); in sc031gs_probe()
1276 v4l2_ctrl_handler_free(&sc031gs->ctrl_handler); in sc031gs_probe()
1278 mutex_destroy(&sc031gs->mutex); in sc031gs_probe()
1286 struct sc031gs *sc031gs = to_sc031gs(sd); in sc031gs_remove() local
1292 v4l2_ctrl_handler_free(&sc031gs->ctrl_handler); in sc031gs_remove()
1293 mutex_destroy(&sc031gs->mutex); in sc031gs_remove()
1297 __sc031gs_power_off(sc031gs); in sc031gs_remove()