Lines Matching refs:sc132gs

114 struct sc132gs {  struct
146 #define to_sc132gs(sd) container_of(sd, struct sc132gs, subdev) argument
550 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_set_fmt() local
554 mutex_lock(&sc132gs->mutex); in sc132gs_set_fmt()
565 mutex_unlock(&sc132gs->mutex); in sc132gs_set_fmt()
569 sc132gs->cur_mode = mode; in sc132gs_set_fmt()
571 __v4l2_ctrl_modify_range(sc132gs->hblank, h_blank, in sc132gs_set_fmt()
574 __v4l2_ctrl_modify_range(sc132gs->vblank, vblank_def, in sc132gs_set_fmt()
577 __v4l2_ctrl_s_ctrl_int64(sc132gs->pixel_rate, mode->pixel_rate); in sc132gs_set_fmt()
578 __v4l2_ctrl_s_ctrl(sc132gs->link_freq, mode->link_freq_index); in sc132gs_set_fmt()
579 sc132gs->cur_fps = mode->max_fps; in sc132gs_set_fmt()
580 sc132gs->cur_vts = mode->vts_def; in sc132gs_set_fmt()
583 mutex_unlock(&sc132gs->mutex); in sc132gs_set_fmt()
592 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_get_fmt() local
593 const struct sc132gs_mode *mode = sc132gs->cur_mode; in sc132gs_get_fmt()
595 mutex_lock(&sc132gs->mutex); in sc132gs_get_fmt()
600 mutex_unlock(&sc132gs->mutex); in sc132gs_get_fmt()
609 mutex_unlock(&sc132gs->mutex); in sc132gs_get_fmt()
618 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_enum_mbus_code() local
622 code->code = sc132gs->cur_mode->bus_fmt; in sc132gs_enum_mbus_code()
645 static int sc132gs_enable_test_pattern(struct sc132gs *sc132gs, u32 pattern) in sc132gs_enable_test_pattern() argument
654 return sc132gs_write_reg(sc132gs->client, SC132GS_REG_TEST_PATTERN, in sc132gs_enable_test_pattern()
658 static void sc132gs_get_module_inf(struct sc132gs *sc132gs, in sc132gs_get_module_inf() argument
663 strlcpy(inf->base.module, sc132gs->module_name, in sc132gs_get_module_inf()
665 strlcpy(inf->base.lens, sc132gs->len_name, sizeof(inf->base.lens)); in sc132gs_get_module_inf()
670 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_ioctl() local
676 sc132gs_get_module_inf(sc132gs, (struct rkmodule_inf *)arg); in sc132gs_ioctl()
683 ret = sc132gs_write_reg(sc132gs->client, SC132GS_REG_CTRL_MODE, in sc132gs_ioctl()
686 ret = sc132gs_write_reg(sc132gs->client, SC132GS_REG_CTRL_MODE, in sc132gs_ioctl()
737 static int sc132gs_set_ctrl_gain(struct sc132gs *sc132gs, u32 a_gain) in sc132gs_set_ctrl_gain() argument
783 ret |= sc132gs_write_reg(sc132gs->client, in sc132gs_set_ctrl_gain()
787 ret |= sc132gs_write_reg(sc132gs->client, in sc132gs_set_ctrl_gain()
794 static int __sc132gs_start_stream(struct sc132gs *sc132gs) in __sc132gs_start_stream() argument
798 ret = sc132gs_write_array(sc132gs->client, sc132gs->cur_mode->reg_list); in __sc132gs_start_stream()
803 mutex_unlock(&sc132gs->mutex); in __sc132gs_start_stream()
804 ret = v4l2_ctrl_handler_setup(&sc132gs->ctrl_handler); in __sc132gs_start_stream()
805 mutex_lock(&sc132gs->mutex); in __sc132gs_start_stream()
809 return sc132gs_write_reg(sc132gs->client, SC132GS_REG_CTRL_MODE, in __sc132gs_start_stream()
813 static int __sc132gs_stop_stream(struct sc132gs *sc132gs) in __sc132gs_stop_stream() argument
815 return sc132gs_write_reg(sc132gs->client, SC132GS_REG_CTRL_MODE, in __sc132gs_stop_stream()
821 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_s_stream() local
822 struct i2c_client *client = sc132gs->client; in sc132gs_s_stream()
826 mutex_lock(&sc132gs->mutex); in sc132gs_s_stream()
828 if (on == sc132gs->streaming) in sc132gs_s_stream()
831 fps = DIV_ROUND_CLOSEST(sc132gs->cur_mode->max_fps.denominator, in sc132gs_s_stream()
832 sc132gs->cur_mode->max_fps.numerator); in sc132gs_s_stream()
834 dev_info(&sc132gs->client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on, in sc132gs_s_stream()
835 sc132gs->cur_mode->width, in sc132gs_s_stream()
836 sc132gs->cur_mode->height, in sc132gs_s_stream()
846 ret = __sc132gs_start_stream(sc132gs); in sc132gs_s_stream()
853 __sc132gs_stop_stream(sc132gs); in sc132gs_s_stream()
857 sc132gs->streaming = on; in sc132gs_s_stream()
860 mutex_unlock(&sc132gs->mutex); in sc132gs_s_stream()
867 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_s_power() local
868 struct i2c_client *client = sc132gs->client; in sc132gs_s_power()
871 mutex_lock(&sc132gs->mutex); in sc132gs_s_power()
874 if (sc132gs->power_on == !!on) in sc132gs_s_power()
883 sc132gs->power_on = true; in sc132gs_s_power()
886 sc132gs->power_on = false; in sc132gs_s_power()
890 mutex_unlock(&sc132gs->mutex); in sc132gs_s_power()
898 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_g_frame_interval() local
899 const struct sc132gs_mode *mode = sc132gs->cur_mode; in sc132gs_g_frame_interval()
901 if (sc132gs->streaming) in sc132gs_g_frame_interval()
902 fi->interval = sc132gs->cur_fps; in sc132gs_g_frame_interval()
915 static int __sc132gs_power_on(struct sc132gs *sc132gs) in __sc132gs_power_on() argument
919 struct device *dev = &sc132gs->client->dev; in __sc132gs_power_on()
921 if (!IS_ERR_OR_NULL(sc132gs->pins_default)) { in __sc132gs_power_on()
922 ret = pinctrl_select_state(sc132gs->pinctrl, in __sc132gs_power_on()
923 sc132gs->pins_default); in __sc132gs_power_on()
928 ret = clk_set_rate(sc132gs->xvclk, SC132GS_XVCLK_FREQ); in __sc132gs_power_on()
931 if (clk_get_rate(sc132gs->xvclk) != SC132GS_XVCLK_FREQ) in __sc132gs_power_on()
933 ret = clk_prepare_enable(sc132gs->xvclk); in __sc132gs_power_on()
939 ret = regulator_bulk_enable(SC132GS_NUM_SUPPLIES, sc132gs->supplies); in __sc132gs_power_on()
945 if (!IS_ERR(sc132gs->reset_gpio)) in __sc132gs_power_on()
946 gpiod_set_value_cansleep(sc132gs->reset_gpio, 1); in __sc132gs_power_on()
950 if (!IS_ERR(sc132gs->pwdn_gpio)) in __sc132gs_power_on()
951 gpiod_set_value_cansleep(sc132gs->pwdn_gpio, 1); in __sc132gs_power_on()
953 if (!IS_ERR(sc132gs->reset_gpio)) in __sc132gs_power_on()
954 gpiod_set_value_cansleep(sc132gs->reset_gpio, 0); in __sc132gs_power_on()
963 clk_disable_unprepare(sc132gs->xvclk); in __sc132gs_power_on()
968 static void __sc132gs_power_off(struct sc132gs *sc132gs) in __sc132gs_power_off() argument
972 if (!IS_ERR(sc132gs->reset_gpio)) in __sc132gs_power_off()
973 gpiod_set_value_cansleep(sc132gs->reset_gpio, 1); in __sc132gs_power_off()
975 if (!IS_ERR(sc132gs->pwdn_gpio)) in __sc132gs_power_off()
976 gpiod_set_value_cansleep(sc132gs->pwdn_gpio, 0); in __sc132gs_power_off()
977 clk_disable_unprepare(sc132gs->xvclk); in __sc132gs_power_off()
978 if (!IS_ERR_OR_NULL(sc132gs->pins_sleep)) { in __sc132gs_power_off()
979 ret = pinctrl_select_state(sc132gs->pinctrl, in __sc132gs_power_off()
980 sc132gs->pins_sleep); in __sc132gs_power_off()
982 dev_dbg(&sc132gs->client->dev, "could not set pins\n"); in __sc132gs_power_off()
984 regulator_bulk_disable(SC132GS_NUM_SUPPLIES, sc132gs->supplies); in __sc132gs_power_off()
991 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_runtime_resume() local
993 return __sc132gs_power_on(sc132gs); in sc132gs_runtime_resume()
1000 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_runtime_suspend() local
1002 __sc132gs_power_off(sc132gs); in sc132gs_runtime_suspend()
1010 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_open() local
1015 mutex_lock(&sc132gs->mutex); in sc132gs_open()
1022 mutex_unlock(&sc132gs->mutex); in sc132gs_open()
1047 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_g_mbus_config() local
1049 val = 1 << (sc132gs->cur_mode->lanes - 1) | in sc132gs_g_mbus_config()
1097 static void sc132gs_modify_fps_info(struct sc132gs *sc132gs) in sc132gs_modify_fps_info() argument
1099 const struct sc132gs_mode *mode = sc132gs->cur_mode; in sc132gs_modify_fps_info()
1101 sc132gs->cur_fps.denominator = mode->max_fps.denominator * mode->vts_def / in sc132gs_modify_fps_info()
1102 sc132gs->cur_vts; in sc132gs_modify_fps_info()
1107 struct sc132gs *sc132gs = container_of(ctrl->handler, in sc132gs_set_ctrl() local
1108 struct sc132gs, ctrl_handler); in sc132gs_set_ctrl()
1109 struct i2c_client *client = sc132gs->client; in sc132gs_set_ctrl()
1117 max = sc132gs->cur_mode->height + ctrl->val - 6; in sc132gs_set_ctrl()
1118 __v4l2_ctrl_modify_range(sc132gs->exposure, in sc132gs_set_ctrl()
1119 sc132gs->exposure->minimum, max, in sc132gs_set_ctrl()
1120 sc132gs->exposure->step, in sc132gs_set_ctrl()
1121 sc132gs->exposure->default_value); in sc132gs_set_ctrl()
1131 ret = sc132gs_write_reg(sc132gs->client, SC132GS_REG_EXPOSURE, in sc132gs_set_ctrl()
1135 ret = sc132gs_set_ctrl_gain(sc132gs, ctrl->val); in sc132gs_set_ctrl()
1138 ret = sc132gs_write_reg(sc132gs->client, SC132GS_REG_VTS, in sc132gs_set_ctrl()
1140 ctrl->val + sc132gs->cur_mode->height); in sc132gs_set_ctrl()
1142 sc132gs->cur_vts = ctrl->val + sc132gs->cur_mode->height; in sc132gs_set_ctrl()
1143 sc132gs_modify_fps_info(sc132gs); in sc132gs_set_ctrl()
1147 ret = sc132gs_enable_test_pattern(sc132gs, ctrl->val); in sc132gs_set_ctrl()
1164 static int sc132gs_initialize_controls(struct sc132gs *sc132gs) in sc132gs_initialize_controls() argument
1172 handler = &sc132gs->ctrl_handler; in sc132gs_initialize_controls()
1173 mode = sc132gs->cur_mode; in sc132gs_initialize_controls()
1177 handler->lock = &sc132gs->mutex; in sc132gs_initialize_controls()
1179 sc132gs->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, V4L2_CID_LINK_FREQ, in sc132gs_initialize_controls()
1183 sc132gs->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in sc132gs_initialize_controls()
1188 __v4l2_ctrl_s_ctrl(sc132gs->link_freq, mode->pixel_rate); in sc132gs_initialize_controls()
1191 sc132gs->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in sc132gs_initialize_controls()
1193 if (sc132gs->hblank) in sc132gs_initialize_controls()
1194 sc132gs->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in sc132gs_initialize_controls()
1197 sc132gs->vblank = v4l2_ctrl_new_std(handler, &sc132gs_ctrl_ops, in sc132gs_initialize_controls()
1203 sc132gs->exposure = v4l2_ctrl_new_std(handler, &sc132gs_ctrl_ops, in sc132gs_initialize_controls()
1208 sc132gs->anal_gain = v4l2_ctrl_new_std(handler, &sc132gs_ctrl_ops, in sc132gs_initialize_controls()
1213 sc132gs->test_pattern = v4l2_ctrl_new_std_menu_items(handler, in sc132gs_initialize_controls()
1220 dev_err(&sc132gs->client->dev, in sc132gs_initialize_controls()
1224 sc132gs->cur_fps = mode->max_fps; in sc132gs_initialize_controls()
1225 sc132gs->cur_vts = mode->vts_def; in sc132gs_initialize_controls()
1226 sc132gs->subdev.ctrl_handler = handler; in sc132gs_initialize_controls()
1236 static int sc132gs_check_sensor_id(struct sc132gs *sc132gs, in sc132gs_check_sensor_id() argument
1239 struct device *dev = &sc132gs->client->dev; in sc132gs_check_sensor_id()
1255 static int sc132gs_configure_regulators(struct sc132gs *sc132gs) in sc132gs_configure_regulators() argument
1260 sc132gs->supplies[i].supply = sc132gs_supply_names[i]; in sc132gs_configure_regulators()
1262 return devm_regulator_bulk_get(&sc132gs->client->dev, in sc132gs_configure_regulators()
1264 sc132gs->supplies); in sc132gs_configure_regulators()
1272 struct sc132gs *sc132gs; in sc132gs_probe() local
1282 sc132gs = devm_kzalloc(dev, sizeof(*sc132gs), GFP_KERNEL); in sc132gs_probe()
1283 if (!sc132gs) in sc132gs_probe()
1287 &sc132gs->module_index); in sc132gs_probe()
1289 &sc132gs->module_facing); in sc132gs_probe()
1291 &sc132gs->module_name); in sc132gs_probe()
1293 &sc132gs->len_name); in sc132gs_probe()
1298 sc132gs->client = client; in sc132gs_probe()
1299 sc132gs->cur_mode = &supported_modes[0]; in sc132gs_probe()
1301 sc132gs->xvclk = devm_clk_get(dev, "xvclk"); in sc132gs_probe()
1302 if (IS_ERR(sc132gs->xvclk)) { in sc132gs_probe()
1307 sc132gs->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in sc132gs_probe()
1308 if (IS_ERR(sc132gs->reset_gpio)) in sc132gs_probe()
1311 sc132gs->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in sc132gs_probe()
1312 if (IS_ERR(sc132gs->pwdn_gpio)) in sc132gs_probe()
1314 ret = sc132gs_configure_regulators(sc132gs); in sc132gs_probe()
1320 sc132gs->pinctrl = devm_pinctrl_get(dev); in sc132gs_probe()
1321 if (!IS_ERR(sc132gs->pinctrl)) { in sc132gs_probe()
1322 sc132gs->pins_default = in sc132gs_probe()
1323 pinctrl_lookup_state(sc132gs->pinctrl, in sc132gs_probe()
1325 if (IS_ERR(sc132gs->pins_default)) in sc132gs_probe()
1328 sc132gs->pins_sleep = in sc132gs_probe()
1329 pinctrl_lookup_state(sc132gs->pinctrl, in sc132gs_probe()
1331 if (IS_ERR(sc132gs->pins_sleep)) in sc132gs_probe()
1334 mutex_init(&sc132gs->mutex); in sc132gs_probe()
1336 sd = &sc132gs->subdev; in sc132gs_probe()
1338 ret = sc132gs_initialize_controls(sc132gs); in sc132gs_probe()
1342 ret = __sc132gs_power_on(sc132gs); in sc132gs_probe()
1346 ret = sc132gs_check_sensor_id(sc132gs, client); in sc132gs_probe()
1356 sc132gs->pad.flags = MEDIA_PAD_FL_SOURCE; in sc132gs_probe()
1358 ret = media_entity_pads_init(&sd->entity, 1, &sc132gs->pad); in sc132gs_probe()
1364 if (strcmp(sc132gs->module_facing, "back") == 0) in sc132gs_probe()
1370 sc132gs->module_index, facing, in sc132gs_probe()
1389 __sc132gs_power_off(sc132gs); in sc132gs_probe()
1391 v4l2_ctrl_handler_free(&sc132gs->ctrl_handler); in sc132gs_probe()
1393 mutex_destroy(&sc132gs->mutex); in sc132gs_probe()
1401 struct sc132gs *sc132gs = to_sc132gs(sd); in sc132gs_remove() local
1407 v4l2_ctrl_handler_free(&sc132gs->ctrl_handler); in sc132gs_remove()
1408 mutex_destroy(&sc132gs->mutex); in sc132gs_remove()
1412 __sc132gs_power_off(sc132gs); in sc132gs_remove()