Lines Matching refs:gc2375h
168 struct gc2375h { struct
201 #define to_gc2375h(sd) container_of(sd, struct gc2375h, subdev) argument
535 gc2375h_find_best_fit(struct gc2375h *gc2375h, in gc2375h_find_best_fit() argument
544 for (i = 0; i < gc2375h->cfg_num; i++) { in gc2375h_find_best_fit()
559 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_set_fmt() local
563 mutex_lock(&gc2375h->mutex); in gc2375h_set_fmt()
565 mode = gc2375h_find_best_fit(gc2375h, fmt); in gc2375h_set_fmt()
574 mutex_unlock(&gc2375h->mutex); in gc2375h_set_fmt()
578 gc2375h->cur_mode = mode; in gc2375h_set_fmt()
580 __v4l2_ctrl_modify_range(gc2375h->hblank, h_blank, in gc2375h_set_fmt()
583 __v4l2_ctrl_modify_range(gc2375h->vblank, vblank_def, in gc2375h_set_fmt()
588 mutex_unlock(&gc2375h->mutex); in gc2375h_set_fmt()
597 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_get_fmt() local
598 const struct gc2375h_mode *mode = gc2375h->cur_mode; in gc2375h_get_fmt()
600 mutex_lock(&gc2375h->mutex); in gc2375h_get_fmt()
605 mutex_unlock(&gc2375h->mutex); in gc2375h_get_fmt()
614 mutex_unlock(&gc2375h->mutex); in gc2375h_get_fmt()
634 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_enum_frame_sizes() local
636 if (fse->index >= gc2375h->cfg_num) in gc2375h_enum_frame_sizes()
653 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_g_frame_interval() local
654 const struct gc2375h_mode *mode = gc2375h->cur_mode; in gc2375h_g_frame_interval()
661 static void gc2375h_get_module_inf(struct gc2375h *gc2375h, in gc2375h_get_module_inf() argument
666 strlcpy(inf->base.module, gc2375h->module_name, in gc2375h_get_module_inf()
668 strlcpy(inf->base.lens, gc2375h->len_name, sizeof(inf->base.lens)); in gc2375h_get_module_inf()
673 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_ioctl() local
679 gc2375h_get_module_inf(gc2375h, (struct rkmodule_inf *)arg); in gc2375h_ioctl()
686 ret = gc2375h_write_reg(gc2375h->client, GC2375H_PAGE_SELECT, 0x00); in gc2375h_ioctl()
687 ret |= gc2375h_write_reg(gc2375h->client, GC2375H_MODE_SELECT, in gc2375h_ioctl()
689 ret |= gc2375h_write_reg(gc2375h->client, GC2375H_PAGE_SELECT, 0x00); in gc2375h_ioctl()
691 ret = gc2375h_write_reg(gc2375h->client, GC2375H_PAGE_SELECT, 0x00); in gc2375h_ioctl()
692 ret |= gc2375h_write_reg(gc2375h->client, GC2375H_MODE_SELECT, in gc2375h_ioctl()
694 ret |= gc2375h_write_reg(gc2375h->client, GC2375H_PAGE_SELECT, 0x00); in gc2375h_ioctl()
761 static int __gc2375h_start_stream(struct gc2375h *gc2375h) in __gc2375h_start_stream() argument
765 ret = gc2375h_write_array(gc2375h->client, gc2375h->cur_mode->reg_list); in __gc2375h_start_stream()
770 mutex_unlock(&gc2375h->mutex); in __gc2375h_start_stream()
771 ret = v4l2_ctrl_handler_setup(&gc2375h->ctrl_handler); in __gc2375h_start_stream()
772 mutex_lock(&gc2375h->mutex); in __gc2375h_start_stream()
776 ret = gc2375h_write_reg(gc2375h->client, GC2375H_PAGE_SELECT, 0x00); in __gc2375h_start_stream()
777 ret |= gc2375h_write_reg(gc2375h->client, GC2375H_MODE_SELECT, in __gc2375h_start_stream()
779 ret |= gc2375h_write_reg(gc2375h->client, GC2375H_PAGE_SELECT, 0x00); in __gc2375h_start_stream()
784 static int __gc2375h_stop_stream(struct gc2375h *gc2375h) in __gc2375h_stop_stream() argument
788 ret = gc2375h_write_reg(gc2375h->client, GC2375H_PAGE_SELECT, 0x00); in __gc2375h_stop_stream()
789 ret |= gc2375h_write_reg(gc2375h->client, GC2375H_MODE_SELECT, in __gc2375h_stop_stream()
791 ret |= gc2375h_write_reg(gc2375h->client, GC2375H_PAGE_SELECT, 0x00); in __gc2375h_stop_stream()
799 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_s_stream() local
800 struct i2c_client *client = gc2375h->client; in gc2375h_s_stream()
803 mutex_lock(&gc2375h->mutex); in gc2375h_s_stream()
805 if (on == gc2375h->streaming) in gc2375h_s_stream()
815 ret = __gc2375h_start_stream(gc2375h); in gc2375h_s_stream()
822 __gc2375h_stop_stream(gc2375h); in gc2375h_s_stream()
826 gc2375h->streaming = on; in gc2375h_s_stream()
829 mutex_unlock(&gc2375h->mutex); in gc2375h_s_stream()
836 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_s_power() local
837 struct i2c_client *client = gc2375h->client; in gc2375h_s_power()
840 mutex_lock(&gc2375h->mutex); in gc2375h_s_power()
843 if (gc2375h->power_on == !!on) in gc2375h_s_power()
853 ret = gc2375h_write_array(gc2375h->client, gc2375h_global_regs); in gc2375h_s_power()
860 gc2375h->power_on = true; in gc2375h_s_power()
863 gc2375h->power_on = false; in gc2375h_s_power()
867 mutex_unlock(&gc2375h->mutex); in gc2375h_s_power()
878 static int __gc2375h_power_on(struct gc2375h *gc2375h) in __gc2375h_power_on() argument
882 struct device *dev = &gc2375h->client->dev; in __gc2375h_power_on()
884 if (!IS_ERR_OR_NULL(gc2375h->pins_default)) { in __gc2375h_power_on()
885 ret = pinctrl_select_state(gc2375h->pinctrl, in __gc2375h_power_on()
886 gc2375h->pins_default); in __gc2375h_power_on()
890 ret = clk_set_rate(gc2375h->xvclk, GC2375H_XVCLK_FREQ); in __gc2375h_power_on()
893 if (clk_get_rate(gc2375h->xvclk) != GC2375H_XVCLK_FREQ) in __gc2375h_power_on()
895 ret = clk_prepare_enable(gc2375h->xvclk); in __gc2375h_power_on()
901 if (!IS_ERR(gc2375h->pwdn_gpio)) in __gc2375h_power_on()
902 gpiod_set_value_cansleep(gc2375h->pwdn_gpio, 0); in __gc2375h_power_on()
904 if (!IS_ERR(gc2375h->reset_gpio)) in __gc2375h_power_on()
905 gpiod_set_value_cansleep(gc2375h->reset_gpio, 0); in __gc2375h_power_on()
909 ret = regulator_bulk_enable(GC2375H_NUM_SUPPLIES, gc2375h->supplies); in __gc2375h_power_on()
915 if (!IS_ERR(gc2375h->reset_gpio)) in __gc2375h_power_on()
916 gpiod_set_value_cansleep(gc2375h->reset_gpio, 1); in __gc2375h_power_on()
921 gc2375h->power_on = true; in __gc2375h_power_on()
925 clk_disable_unprepare(gc2375h->xvclk); in __gc2375h_power_on()
930 static void __gc2375h_power_off(struct gc2375h *gc2375h) in __gc2375h_power_off() argument
933 struct device *dev = &gc2375h->client->dev; in __gc2375h_power_off()
935 if (!IS_ERR(gc2375h->pwdn_gpio)) in __gc2375h_power_off()
936 gpiod_set_value_cansleep(gc2375h->pwdn_gpio, 1); in __gc2375h_power_off()
937 clk_disable_unprepare(gc2375h->xvclk); in __gc2375h_power_off()
938 if (!IS_ERR(gc2375h->reset_gpio)) in __gc2375h_power_off()
939 gpiod_set_value_cansleep(gc2375h->reset_gpio, 0); in __gc2375h_power_off()
940 if (!IS_ERR_OR_NULL(gc2375h->pins_sleep)) { in __gc2375h_power_off()
941 ret = pinctrl_select_state(gc2375h->pinctrl, in __gc2375h_power_off()
942 gc2375h->pins_sleep); in __gc2375h_power_off()
946 regulator_bulk_disable(GC2375H_NUM_SUPPLIES, gc2375h->supplies); in __gc2375h_power_off()
947 gc2375h->power_on = false; in __gc2375h_power_off()
954 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_runtime_resume() local
956 return __gc2375h_power_on(gc2375h); in gc2375h_runtime_resume()
963 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_runtime_suspend() local
965 __gc2375h_power_off(gc2375h); in gc2375h_runtime_suspend()
973 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_open() local
978 mutex_lock(&gc2375h->mutex); in gc2375h_open()
985 mutex_unlock(&gc2375h->mutex); in gc2375h_open()
996 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_enum_frame_interval() local
998 if (fie->index >= gc2375h->cfg_num) in gc2375h_enum_frame_interval()
1061 static int gc2375h_set_gain_reg(struct gc2375h *gc2375h, u32 a_gain) in gc2375h_set_gain_reg() argument
1066 ret = gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1071 ret |= gc2375h_write_reg(gc2375h->client, 0x20, 0x0b); in gc2375h_set_gain_reg()
1072 ret |= gc2375h_write_reg(gc2375h->client, 0x22, 0x0c); in gc2375h_set_gain_reg()
1073 ret |= gc2375h_write_reg(gc2375h->client, 0x26, 0x0e); in gc2375h_set_gain_reg()
1075 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1079 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1082 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1087 ret |= gc2375h_write_reg(gc2375h->client, 0x20, 0x0c); in gc2375h_set_gain_reg()
1088 ret |= gc2375h_write_reg(gc2375h->client, 0x22, 0x0e); in gc2375h_set_gain_reg()
1089 ret |= gc2375h_write_reg(gc2375h->client, 0x26, 0x0e); in gc2375h_set_gain_reg()
1091 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1095 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1098 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1103 ret |= gc2375h_write_reg(gc2375h->client, 0x20, 0x0c); in gc2375h_set_gain_reg()
1104 ret |= gc2375h_write_reg(gc2375h->client, 0x22, 0x0e); in gc2375h_set_gain_reg()
1105 ret |= gc2375h_write_reg(gc2375h->client, 0x26, 0x0e); in gc2375h_set_gain_reg()
1107 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1111 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1114 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1119 ret |= gc2375h_write_reg(gc2375h->client, 0x20, 0x0c); in gc2375h_set_gain_reg()
1120 ret |= gc2375h_write_reg(gc2375h->client, 0x22, 0x0e); in gc2375h_set_gain_reg()
1121 ret |= gc2375h_write_reg(gc2375h->client, 0x26, 0x0e); in gc2375h_set_gain_reg()
1122 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1126 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1129 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1134 ret |= gc2375h_write_reg(gc2375h->client, 0x20, 0x0c); in gc2375h_set_gain_reg()
1135 ret |= gc2375h_write_reg(gc2375h->client, 0x22, 0x0e); in gc2375h_set_gain_reg()
1136 ret |= gc2375h_write_reg(gc2375h->client, 0x26, 0x0e); in gc2375h_set_gain_reg()
1137 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1141 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1144 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1149 ret |= gc2375h_write_reg(gc2375h->client, 0x20, 0x0e); in gc2375h_set_gain_reg()
1150 ret |= gc2375h_write_reg(gc2375h->client, 0x22, 0x0e); in gc2375h_set_gain_reg()
1151 ret |= gc2375h_write_reg(gc2375h->client, 0x26, 0x0e); in gc2375h_set_gain_reg()
1152 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1156 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1159 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1164 ret |= gc2375h_write_reg(gc2375h->client, 0x20, 0x0c); in gc2375h_set_gain_reg()
1165 ret |= gc2375h_write_reg(gc2375h->client, 0x22, 0x0c); in gc2375h_set_gain_reg()
1166 ret |= gc2375h_write_reg(gc2375h->client, 0x26, 0x0e); in gc2375h_set_gain_reg()
1167 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1171 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1174 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1179 ret |= gc2375h_write_reg(gc2375h->client, 0x20, 0x0e); in gc2375h_set_gain_reg()
1180 ret |= gc2375h_write_reg(gc2375h->client, 0x22, 0x0e); in gc2375h_set_gain_reg()
1181 ret |= gc2375h_write_reg(gc2375h->client, 0x26, 0x0e); in gc2375h_set_gain_reg()
1182 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1186 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1189 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1193 ret |= gc2375h_write_reg(gc2375h->client, 0x20, 0x0c); in gc2375h_set_gain_reg()
1194 ret |= gc2375h_write_reg(gc2375h->client, 0x22, 0x0e); in gc2375h_set_gain_reg()
1195 ret |= gc2375h_write_reg(gc2375h->client, 0x26, 0x0e); in gc2375h_set_gain_reg()
1196 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1200 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1203 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_gain_reg()
1212 struct gc2375h *gc2375h = container_of(ctrl->handler, in gc2375h_set_ctrl() local
1213 struct gc2375h, ctrl_handler); in gc2375h_set_ctrl()
1214 struct i2c_client *client = gc2375h->client; in gc2375h_set_ctrl()
1222 max = gc2375h->cur_mode->height + ctrl->val - 4; in gc2375h_set_ctrl()
1223 __v4l2_ctrl_modify_range(gc2375h->exposure, in gc2375h_set_ctrl()
1224 gc2375h->exposure->minimum, max, in gc2375h_set_ctrl()
1225 gc2375h->exposure->step, in gc2375h_set_ctrl()
1226 gc2375h->exposure->default_value); in gc2375h_set_ctrl()
1236 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_ctrl()
1239 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_ctrl()
1242 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_ctrl()
1247 ret = gc2375h_set_gain_reg(gc2375h, ctrl->val); in gc2375h_set_ctrl()
1250 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_ctrl()
1253 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_ctrl()
1256 ret |= gc2375h_write_reg(gc2375h->client, in gc2375h_set_ctrl()
1276 static int gc2375h_initialize_controls(struct gc2375h *gc2375h) in gc2375h_initialize_controls() argument
1284 struct device *dev = &gc2375h->client->dev; in gc2375h_initialize_controls()
1287 handler = &gc2375h->ctrl_handler; in gc2375h_initialize_controls()
1288 mode = gc2375h->cur_mode; in gc2375h_initialize_controls()
1292 handler->lock = &gc2375h->mutex; in gc2375h_initialize_controls()
1303 gc2375h->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in gc2375h_initialize_controls()
1305 if (gc2375h->hblank) in gc2375h_initialize_controls()
1306 gc2375h->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in gc2375h_initialize_controls()
1309 gc2375h->vblank = v4l2_ctrl_new_std(handler, &gc2375h_ctrl_ops, in gc2375h_initialize_controls()
1315 gc2375h->exposure = v4l2_ctrl_new_std(handler, &gc2375h_ctrl_ops, in gc2375h_initialize_controls()
1320 gc2375h->anal_gain = v4l2_ctrl_new_std(handler, &gc2375h_ctrl_ops, in gc2375h_initialize_controls()
1327 dev_err(&gc2375h->client->dev, in gc2375h_initialize_controls()
1332 gc2375h->subdev.ctrl_handler = handler; in gc2375h_initialize_controls()
1342 static int gc2375h_check_sensor_id(struct gc2375h *gc2375h, in gc2375h_check_sensor_id() argument
1345 struct device *dev = &gc2375h->client->dev; in gc2375h_check_sensor_id()
1373 static int gc2375h_configure_regulators(struct gc2375h *gc2375h) in gc2375h_configure_regulators() argument
1378 gc2375h->supplies[i].supply = gc2375h_supply_names[i]; in gc2375h_configure_regulators()
1380 return devm_regulator_bulk_get(&gc2375h->client->dev, in gc2375h_configure_regulators()
1382 gc2375h->supplies); in gc2375h_configure_regulators()
1385 static int gc2375h_parse_of(struct gc2375h *gc2375h) in gc2375h_parse_of() argument
1387 struct device *dev = &gc2375h->client->dev; in gc2375h_parse_of()
1405 gc2375h->lane_num = rval; in gc2375h_parse_of()
1406 if (1 == gc2375h->lane_num) { in gc2375h_parse_of()
1407 gc2375h->cur_mode = &supported_modes_1lane[0]; in gc2375h_parse_of()
1409 gc2375h->cfg_num = ARRAY_SIZE(supported_modes_1lane); in gc2375h_parse_of()
1412 gc2375h->pixel_rate = MIPI_FREQ * 2U * gc2375h->lane_num / 10U; in gc2375h_parse_of()
1414 gc2375h->lane_num, gc2375h->pixel_rate); in gc2375h_parse_of()
1416 dev_err(dev, "unsupported lane_num(%d)\n", gc2375h->lane_num); in gc2375h_parse_of()
1427 struct gc2375h *gc2375h; in gc2375h_probe() local
1437 gc2375h = devm_kzalloc(dev, sizeof(*gc2375h), GFP_KERNEL); in gc2375h_probe()
1438 if (!gc2375h) in gc2375h_probe()
1442 &gc2375h->module_index); in gc2375h_probe()
1444 &gc2375h->module_facing); in gc2375h_probe()
1446 &gc2375h->module_name); in gc2375h_probe()
1448 &gc2375h->len_name); in gc2375h_probe()
1454 gc2375h->client = client; in gc2375h_probe()
1455 gc2375h->cur_mode = &supported_modes[0]; in gc2375h_probe()
1457 gc2375h->xvclk = devm_clk_get(dev, "xvclk"); in gc2375h_probe()
1458 if (IS_ERR(gc2375h->xvclk)) { in gc2375h_probe()
1463 gc2375h->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in gc2375h_probe()
1464 if (IS_ERR(gc2375h->reset_gpio)) in gc2375h_probe()
1467 gc2375h->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_HIGH); in gc2375h_probe()
1468 if (IS_ERR(gc2375h->pwdn_gpio)) in gc2375h_probe()
1471 ret = gc2375h_parse_of(gc2375h); in gc2375h_probe()
1475 gc2375h->pinctrl = devm_pinctrl_get(dev); in gc2375h_probe()
1476 if (!IS_ERR(gc2375h->pinctrl)) { in gc2375h_probe()
1477 gc2375h->pins_default = in gc2375h_probe()
1478 pinctrl_lookup_state(gc2375h->pinctrl, in gc2375h_probe()
1480 if (IS_ERR(gc2375h->pins_default)) in gc2375h_probe()
1483 gc2375h->pins_sleep = in gc2375h_probe()
1484 pinctrl_lookup_state(gc2375h->pinctrl, in gc2375h_probe()
1486 if (IS_ERR(gc2375h->pins_sleep)) in gc2375h_probe()
1492 ret = gc2375h_configure_regulators(gc2375h); in gc2375h_probe()
1498 mutex_init(&gc2375h->mutex); in gc2375h_probe()
1500 sd = &gc2375h->subdev; in gc2375h_probe()
1502 ret = gc2375h_initialize_controls(gc2375h); in gc2375h_probe()
1506 ret = __gc2375h_power_on(gc2375h); in gc2375h_probe()
1510 ret = gc2375h_check_sensor_id(gc2375h, client); in gc2375h_probe()
1519 gc2375h->pad.flags = MEDIA_PAD_FL_SOURCE; in gc2375h_probe()
1521 ret = media_entity_pads_init(&sd->entity, 1, &gc2375h->pad); in gc2375h_probe()
1527 if (strcmp(gc2375h->module_facing, "back") == 0) in gc2375h_probe()
1533 gc2375h->module_index, facing, in gc2375h_probe()
1552 __gc2375h_power_off(gc2375h); in gc2375h_probe()
1554 v4l2_ctrl_handler_free(&gc2375h->ctrl_handler); in gc2375h_probe()
1556 mutex_destroy(&gc2375h->mutex); in gc2375h_probe()
1564 struct gc2375h *gc2375h = to_gc2375h(sd); in gc2375h_remove() local
1570 v4l2_ctrl_handler_free(&gc2375h->ctrl_handler); in gc2375h_remove()
1571 mutex_destroy(&gc2375h->mutex); in gc2375h_remove()
1575 __gc2375h_power_off(gc2375h); in gc2375h_remove()