Lines Matching refs:sc035gs

108 struct sc035gs {  struct
140 #define to_sc035gs(sd) container_of(sd, struct sc035gs, subdev) argument
431 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_set_fmt() local
435 mutex_lock(&sc035gs->mutex); in sc035gs_set_fmt()
446 mutex_unlock(&sc035gs->mutex); in sc035gs_set_fmt()
450 sc035gs->cur_mode = mode; in sc035gs_set_fmt()
452 __v4l2_ctrl_modify_range(sc035gs->hblank, h_blank, in sc035gs_set_fmt()
455 __v4l2_ctrl_modify_range(sc035gs->vblank, vblank_def, in sc035gs_set_fmt()
458 __v4l2_ctrl_s_ctrl_int64(sc035gs->pixel_rate, mode->pixel_rate); in sc035gs_set_fmt()
459 __v4l2_ctrl_s_ctrl(sc035gs->link_freq, mode->link_freq_index); in sc035gs_set_fmt()
460 sc035gs->cur_vts = mode->vts_def; in sc035gs_set_fmt()
461 sc035gs->cur_fps = mode->max_fps; in sc035gs_set_fmt()
464 mutex_unlock(&sc035gs->mutex); in sc035gs_set_fmt()
473 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_get_fmt() local
474 const struct sc035gs_mode *mode = sc035gs->cur_mode; in sc035gs_get_fmt()
476 mutex_lock(&sc035gs->mutex); in sc035gs_get_fmt()
481 mutex_unlock(&sc035gs->mutex); in sc035gs_get_fmt()
490 mutex_unlock(&sc035gs->mutex); in sc035gs_get_fmt()
499 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_enum_mbus_code() local
503 code->code = sc035gs->cur_mode->bus_fmt; in sc035gs_enum_mbus_code()
526 static int sc035gs_enable_test_pattern(struct sc035gs *sc035gs, u32 pattern) in sc035gs_enable_test_pattern() argument
535 return sc035gs_write_reg(sc035gs->client, SC035GS_REG_TEST_PATTERN, in sc035gs_enable_test_pattern()
539 static void sc035gs_get_module_inf(struct sc035gs *sc035gs, in sc035gs_get_module_inf() argument
544 strscpy(inf->base.module, sc035gs->module_name, in sc035gs_get_module_inf()
546 strscpy(inf->base.lens, sc035gs->len_name, sizeof(inf->base.lens)); in sc035gs_get_module_inf()
551 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_ioctl() local
557 sc035gs_get_module_inf(sc035gs, (struct rkmodule_inf *)arg); in sc035gs_ioctl()
564 ret = sc035gs_write_reg(sc035gs->client, SC035GS_REG_CTRL_MODE, in sc035gs_ioctl()
567 ret = sc035gs_write_reg(sc035gs->client, SC035GS_REG_CTRL_MODE, in sc035gs_ioctl()
618 static int sc035gs_set_ctrl_gain(struct sc035gs *sc035gs, u32 a_gain) in sc035gs_set_ctrl_gain() argument
647 ret |= sc035gs_write_reg(sc035gs->client, 0x3631, in sc035gs_set_ctrl_gain()
649 ret |= sc035gs_write_reg(sc035gs->client, 0x3630, in sc035gs_set_ctrl_gain()
652 ret |= sc035gs_write_reg(sc035gs->client, 0x3631, in sc035gs_set_ctrl_gain()
654 ret |= sc035gs_write_reg(sc035gs->client, 0x3630, in sc035gs_set_ctrl_gain()
658 ret |= sc035gs_write_reg(sc035gs->client, in sc035gs_set_ctrl_gain()
662 ret |= sc035gs_write_reg(sc035gs->client, in sc035gs_set_ctrl_gain()
671 static int __sc035gs_start_stream(struct sc035gs *sc035gs) in __sc035gs_start_stream() argument
675 ret = sc035gs_write_array(sc035gs->client, sc035gs->cur_mode->reg_list); in __sc035gs_start_stream()
680 mutex_unlock(&sc035gs->mutex); in __sc035gs_start_stream()
681 ret = v4l2_ctrl_handler_setup(&sc035gs->ctrl_handler); in __sc035gs_start_stream()
682 mutex_lock(&sc035gs->mutex); in __sc035gs_start_stream()
686 ret = sc035gs_write_reg(sc035gs->client, SC035GS_REG_CTRL_MODE, in __sc035gs_start_stream()
691 ret |= sc035gs_write_reg(sc035gs->client, 0x4418, in __sc035gs_start_stream()
693 ret |= sc035gs_write_reg(sc035gs->client, 0x4419, in __sc035gs_start_stream()
698 static int __sc035gs_stop_stream(struct sc035gs *sc035gs) in __sc035gs_stop_stream() argument
700 return sc035gs_write_reg(sc035gs->client, SC035GS_REG_CTRL_MODE, in __sc035gs_stop_stream()
706 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_s_stream() local
707 struct i2c_client *client = sc035gs->client; in sc035gs_s_stream()
711 mutex_lock(&sc035gs->mutex); in sc035gs_s_stream()
713 if (on == sc035gs->streaming) in sc035gs_s_stream()
716 fps = DIV_ROUND_CLOSEST(sc035gs->cur_mode->max_fps.denominator, in sc035gs_s_stream()
717 sc035gs->cur_mode->max_fps.numerator); in sc035gs_s_stream()
719 dev_info(&sc035gs->client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on, in sc035gs_s_stream()
720 sc035gs->cur_mode->width, in sc035gs_s_stream()
721 sc035gs->cur_mode->height, in sc035gs_s_stream()
731 ret = __sc035gs_start_stream(sc035gs); in sc035gs_s_stream()
738 __sc035gs_stop_stream(sc035gs); in sc035gs_s_stream()
742 sc035gs->streaming = on; in sc035gs_s_stream()
745 mutex_unlock(&sc035gs->mutex); in sc035gs_s_stream()
752 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_s_power() local
753 struct i2c_client *client = sc035gs->client; in sc035gs_s_power()
756 mutex_lock(&sc035gs->mutex); in sc035gs_s_power()
759 if (sc035gs->power_on == !!on) in sc035gs_s_power()
768 sc035gs->power_on = true; in sc035gs_s_power()
771 sc035gs->power_on = false; in sc035gs_s_power()
775 mutex_unlock(&sc035gs->mutex); in sc035gs_s_power()
783 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_g_frame_interval() local
784 const struct sc035gs_mode *mode = sc035gs->cur_mode; in sc035gs_g_frame_interval()
786 if (sc035gs->streaming) in sc035gs_g_frame_interval()
787 fi->interval = sc035gs->cur_fps; in sc035gs_g_frame_interval()
800 static int __sc035gs_power_on(struct sc035gs *sc035gs) in __sc035gs_power_on() argument
804 struct device *dev = &sc035gs->client->dev; in __sc035gs_power_on()
806 if (!IS_ERR_OR_NULL(sc035gs->pins_default)) { in __sc035gs_power_on()
807 ret = pinctrl_select_state(sc035gs->pinctrl, in __sc035gs_power_on()
808 sc035gs->pins_default); in __sc035gs_power_on()
813 ret = clk_set_rate(sc035gs->xvclk, SC035GS_XVCLK_FREQ); in __sc035gs_power_on()
816 if (clk_get_rate(sc035gs->xvclk) != SC035GS_XVCLK_FREQ) in __sc035gs_power_on()
818 ret = clk_prepare_enable(sc035gs->xvclk); in __sc035gs_power_on()
824 ret = regulator_bulk_enable(SC035GS_NUM_SUPPLIES, sc035gs->supplies); in __sc035gs_power_on()
830 if (!IS_ERR(sc035gs->reset_gpio)) in __sc035gs_power_on()
831 gpiod_set_value_cansleep(sc035gs->reset_gpio, 1); in __sc035gs_power_on()
835 if (!IS_ERR(sc035gs->pwdn_gpio)) in __sc035gs_power_on()
836 gpiod_set_value_cansleep(sc035gs->pwdn_gpio, 1); in __sc035gs_power_on()
838 if (!IS_ERR(sc035gs->reset_gpio)) in __sc035gs_power_on()
839 gpiod_set_value_cansleep(sc035gs->reset_gpio, 0); in __sc035gs_power_on()
848 clk_disable_unprepare(sc035gs->xvclk); in __sc035gs_power_on()
853 static void __sc035gs_power_off(struct sc035gs *sc035gs) in __sc035gs_power_off() argument
857 if (!IS_ERR(sc035gs->reset_gpio)) in __sc035gs_power_off()
858 gpiod_set_value_cansleep(sc035gs->reset_gpio, 1); in __sc035gs_power_off()
860 if (!IS_ERR(sc035gs->pwdn_gpio)) in __sc035gs_power_off()
861 gpiod_set_value_cansleep(sc035gs->pwdn_gpio, 0); in __sc035gs_power_off()
862 clk_disable_unprepare(sc035gs->xvclk); in __sc035gs_power_off()
863 if (!IS_ERR_OR_NULL(sc035gs->pins_sleep)) { in __sc035gs_power_off()
864 ret = pinctrl_select_state(sc035gs->pinctrl, in __sc035gs_power_off()
865 sc035gs->pins_sleep); in __sc035gs_power_off()
867 dev_dbg(&sc035gs->client->dev, "could not set pins\n"); in __sc035gs_power_off()
869 regulator_bulk_disable(SC035GS_NUM_SUPPLIES, sc035gs->supplies); in __sc035gs_power_off()
876 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_runtime_resume() local
878 return __sc035gs_power_on(sc035gs); in sc035gs_runtime_resume()
885 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_runtime_suspend() local
887 __sc035gs_power_off(sc035gs); in sc035gs_runtime_suspend()
895 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_open() local
900 mutex_lock(&sc035gs->mutex); in sc035gs_open()
907 mutex_unlock(&sc035gs->mutex); in sc035gs_open()
932 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_g_mbus_config() local
934 val = 1 << (sc035gs->cur_mode->lanes - 1) | in sc035gs_g_mbus_config()
982 static void sc035gs_modify_fps_info(struct sc035gs *sc035gs) in sc035gs_modify_fps_info() argument
984 const struct sc035gs_mode *mode = sc035gs->cur_mode; in sc035gs_modify_fps_info()
986 sc035gs->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def / in sc035gs_modify_fps_info()
987 sc035gs->cur_vts; in sc035gs_modify_fps_info()
992 struct sc035gs *sc035gs = container_of(ctrl->handler, in sc035gs_set_ctrl() local
993 struct sc035gs, ctrl_handler); in sc035gs_set_ctrl()
994 struct i2c_client *client = sc035gs->client; in sc035gs_set_ctrl()
1002 max = sc035gs->cur_mode->height + ctrl->val - 6; in sc035gs_set_ctrl()
1003 __v4l2_ctrl_modify_range(sc035gs->exposure, in sc035gs_set_ctrl()
1004 sc035gs->exposure->minimum, max, in sc035gs_set_ctrl()
1005 sc035gs->exposure->step, in sc035gs_set_ctrl()
1006 sc035gs->exposure->default_value); in sc035gs_set_ctrl()
1016 ret = sc035gs_write_reg(sc035gs->client, SC035GS_REG_EXPOSURE, in sc035gs_set_ctrl()
1020 ret = sc035gs_set_ctrl_gain(sc035gs, ctrl->val); in sc035gs_set_ctrl()
1023 ret = sc035gs_write_reg(sc035gs->client, SC035GS_REG_VTS, in sc035gs_set_ctrl()
1025 ctrl->val + sc035gs->cur_mode->height); in sc035gs_set_ctrl()
1027 sc035gs->cur_vts = ctrl->val + sc035gs->cur_mode->height; in sc035gs_set_ctrl()
1028 sc035gs_modify_fps_info(sc035gs); in sc035gs_set_ctrl()
1031 ret = sc035gs_enable_test_pattern(sc035gs, ctrl->val); in sc035gs_set_ctrl()
1048 static int sc035gs_initialize_controls(struct sc035gs *sc035gs) in sc035gs_initialize_controls() argument
1056 handler = &sc035gs->ctrl_handler; in sc035gs_initialize_controls()
1057 mode = sc035gs->cur_mode; in sc035gs_initialize_controls()
1061 handler->lock = &sc035gs->mutex; in sc035gs_initialize_controls()
1063 sc035gs->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ, in sc035gs_initialize_controls()
1067 sc035gs->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in sc035gs_initialize_controls()
1072 __v4l2_ctrl_s_ctrl(sc035gs->link_freq, mode->pixel_rate); in sc035gs_initialize_controls()
1075 sc035gs->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in sc035gs_initialize_controls()
1077 if (sc035gs->hblank) in sc035gs_initialize_controls()
1078 sc035gs->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in sc035gs_initialize_controls()
1081 sc035gs->cur_vts = mode->vts_def; in sc035gs_initialize_controls()
1082 sc035gs->cur_fps = mode->max_fps; in sc035gs_initialize_controls()
1083 sc035gs->vblank = v4l2_ctrl_new_std(handler, &sc035gs_ctrl_ops, in sc035gs_initialize_controls()
1089 sc035gs->exposure = v4l2_ctrl_new_std(handler, &sc035gs_ctrl_ops, in sc035gs_initialize_controls()
1094 sc035gs->anal_gain = v4l2_ctrl_new_std(handler, &sc035gs_ctrl_ops, in sc035gs_initialize_controls()
1099 sc035gs->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in sc035gs_initialize_controls()
1106 dev_err(&sc035gs->client->dev, in sc035gs_initialize_controls()
1111 sc035gs->subdev.ctrl_handler = handler; in sc035gs_initialize_controls()
1121 static int sc035gs_check_sensor_id(struct sc035gs *sc035gs, in sc035gs_check_sensor_id() argument
1124 struct device *dev = &sc035gs->client->dev; in sc035gs_check_sensor_id()
1140 static int sc035gs_configure_regulators(struct sc035gs *sc035gs) in sc035gs_configure_regulators() argument
1145 sc035gs->supplies[i].supply = sc035gs_supply_names[i]; in sc035gs_configure_regulators()
1147 return devm_regulator_bulk_get(&sc035gs->client->dev, in sc035gs_configure_regulators()
1149 sc035gs->supplies); in sc035gs_configure_regulators()
1157 struct sc035gs *sc035gs; in sc035gs_probe() local
1167 sc035gs = devm_kzalloc(dev, sizeof(*sc035gs), GFP_KERNEL); in sc035gs_probe()
1168 if (!sc035gs) in sc035gs_probe()
1172 &sc035gs->module_index); in sc035gs_probe()
1174 &sc035gs->module_facing); in sc035gs_probe()
1176 &sc035gs->module_name); in sc035gs_probe()
1178 &sc035gs->len_name); in sc035gs_probe()
1183 sc035gs->client = client; in sc035gs_probe()
1184 sc035gs->cur_mode = &supported_modes[0]; in sc035gs_probe()
1186 sc035gs->xvclk = devm_clk_get(dev, "xvclk"); in sc035gs_probe()
1187 if (IS_ERR(sc035gs->xvclk)) { in sc035gs_probe()
1192 sc035gs->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in sc035gs_probe()
1193 if (IS_ERR(sc035gs->reset_gpio)) in sc035gs_probe()
1196 sc035gs->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in sc035gs_probe()
1197 if (IS_ERR(sc035gs->pwdn_gpio)) in sc035gs_probe()
1199 ret = sc035gs_configure_regulators(sc035gs); in sc035gs_probe()
1205 sc035gs->pinctrl = devm_pinctrl_get(dev); in sc035gs_probe()
1206 if (!IS_ERR(sc035gs->pinctrl)) { in sc035gs_probe()
1207 sc035gs->pins_default = in sc035gs_probe()
1208 pinctrl_lookup_state(sc035gs->pinctrl, in sc035gs_probe()
1210 if (IS_ERR(sc035gs->pins_default)) in sc035gs_probe()
1213 sc035gs->pins_sleep = in sc035gs_probe()
1214 pinctrl_lookup_state(sc035gs->pinctrl, in sc035gs_probe()
1216 if (IS_ERR(sc035gs->pins_sleep)) in sc035gs_probe()
1219 mutex_init(&sc035gs->mutex); in sc035gs_probe()
1221 sd = &sc035gs->subdev; in sc035gs_probe()
1223 ret = sc035gs_initialize_controls(sc035gs); in sc035gs_probe()
1227 ret = __sc035gs_power_on(sc035gs); in sc035gs_probe()
1231 ret = sc035gs_check_sensor_id(sc035gs, client); in sc035gs_probe()
1241 sc035gs->pad.flags = MEDIA_PAD_FL_SOURCE; in sc035gs_probe()
1243 ret = media_entity_pads_init(&sd->entity, 1, &sc035gs->pad); in sc035gs_probe()
1249 if (strcmp(sc035gs->module_facing, "back") == 0) in sc035gs_probe()
1255 sc035gs->module_index, facing, in sc035gs_probe()
1274 __sc035gs_power_off(sc035gs); in sc035gs_probe()
1276 v4l2_ctrl_handler_free(&sc035gs->ctrl_handler); in sc035gs_probe()
1278 mutex_destroy(&sc035gs->mutex); in sc035gs_probe()
1286 struct sc035gs *sc035gs = to_sc035gs(sd); in sc035gs_remove() local
1292 v4l2_ctrl_handler_free(&sc035gs->ctrl_handler); in sc035gs_remove()
1293 mutex_destroy(&sc035gs->mutex); in sc035gs_remove()
1297 __sc035gs_power_off(sc035gs); in sc035gs_remove()