Lines Matching refs:gc5024
146 struct gc5024 { struct
179 #define to_gc5024(sd) container_of(sd, struct gc5024, subdev) argument
423 gc5024_find_best_fit(struct gc5024 *gc5024, in gc5024_find_best_fit() argument
432 for (i = 0; i < gc5024->cfg_num; i++) { in gc5024_find_best_fit()
447 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_set_fmt() local
451 mutex_lock(&gc5024->mutex); in gc5024_set_fmt()
453 mode = gc5024_find_best_fit(gc5024, fmt); in gc5024_set_fmt()
462 mutex_unlock(&gc5024->mutex); in gc5024_set_fmt()
466 gc5024->cur_mode = mode; in gc5024_set_fmt()
468 __v4l2_ctrl_modify_range(gc5024->hblank, h_blank, in gc5024_set_fmt()
471 __v4l2_ctrl_modify_range(gc5024->vblank, vblank_def, in gc5024_set_fmt()
476 mutex_unlock(&gc5024->mutex); in gc5024_set_fmt()
485 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_get_fmt() local
486 const struct gc5024_mode *mode = gc5024->cur_mode; in gc5024_get_fmt()
488 mutex_lock(&gc5024->mutex); in gc5024_get_fmt()
493 mutex_unlock(&gc5024->mutex); in gc5024_get_fmt()
502 mutex_unlock(&gc5024->mutex); in gc5024_get_fmt()
522 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_enum_frame_sizes() local
524 if (fse->index >= gc5024->cfg_num) in gc5024_enum_frame_sizes()
541 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_g_frame_interval() local
542 const struct gc5024_mode *mode = gc5024->cur_mode; in gc5024_g_frame_interval()
549 static void gc5024_get_module_inf(struct gc5024 *gc5024, in gc5024_get_module_inf() argument
556 gc5024->module_name, in gc5024_get_module_inf()
559 gc5024->len_name, in gc5024_get_module_inf()
565 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_ioctl() local
571 gc5024_get_module_inf(gc5024, (struct rkmodule_inf *)arg); in gc5024_ioctl()
578 ret = gc5024_write_reg(gc5024->client, GC5024_PAGE_SELECT, 0x03); in gc5024_ioctl()
579 ret |= gc5024_write_reg(gc5024->client, GC5024_MODE_SELECT, in gc5024_ioctl()
581 ret = gc5024_write_reg(gc5024->client, GC5024_PAGE_SELECT, 0x00); in gc5024_ioctl()
583 ret = gc5024_write_reg(gc5024->client, GC5024_PAGE_SELECT, 0x03); in gc5024_ioctl()
584 ret |= gc5024_write_reg(gc5024->client, GC5024_MODE_SELECT, in gc5024_ioctl()
586 ret |= gc5024_write_reg(gc5024->client, GC5024_PAGE_SELECT, 0x00); in gc5024_ioctl()
646 static int __gc5024_start_stream(struct gc5024 *gc5024) in __gc5024_start_stream() argument
650 ret = gc5024_write_array(gc5024->client, gc5024->cur_mode->reg_list); in __gc5024_start_stream()
655 mutex_unlock(&gc5024->mutex); in __gc5024_start_stream()
656 ret = v4l2_ctrl_handler_setup(&gc5024->ctrl_handler); in __gc5024_start_stream()
657 mutex_lock(&gc5024->mutex); in __gc5024_start_stream()
661 ret = gc5024_write_reg(gc5024->client, GC5024_PAGE_SELECT, 0x03); in __gc5024_start_stream()
662 ret |= gc5024_write_reg(gc5024->client, GC5024_MODE_SELECT, in __gc5024_start_stream()
664 ret = gc5024_write_reg(gc5024->client, GC5024_PAGE_SELECT, 0x00); in __gc5024_start_stream()
668 static int __gc5024_stop_stream(struct gc5024 *gc5024) in __gc5024_stop_stream() argument
672 ret = gc5024_write_reg(gc5024->client, GC5024_PAGE_SELECT, 0x03); in __gc5024_stop_stream()
673 ret |= gc5024_write_reg(gc5024->client, GC5024_MODE_SELECT, in __gc5024_stop_stream()
675 ret |= gc5024_write_reg(gc5024->client, GC5024_PAGE_SELECT, 0x00); in __gc5024_stop_stream()
681 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_s_stream() local
682 struct i2c_client *client = gc5024->client; in gc5024_s_stream()
685 mutex_lock(&gc5024->mutex); in gc5024_s_stream()
687 if (on == gc5024->streaming) in gc5024_s_stream()
697 ret = __gc5024_start_stream(gc5024); in gc5024_s_stream()
704 __gc5024_stop_stream(gc5024); in gc5024_s_stream()
708 gc5024->streaming = on; in gc5024_s_stream()
711 mutex_unlock(&gc5024->mutex); in gc5024_s_stream()
718 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_s_power() local
719 struct i2c_client *client = gc5024->client; in gc5024_s_power()
722 mutex_lock(&gc5024->mutex); in gc5024_s_power()
725 if (gc5024->power_on == !!on) in gc5024_s_power()
735 ret = gc5024_write_array(gc5024->client, gc5024_global_regs); in gc5024_s_power()
742 gc5024->power_on = true; in gc5024_s_power()
745 gc5024->power_on = false; in gc5024_s_power()
749 mutex_unlock(&gc5024->mutex); in gc5024_s_power()
760 static int __gc5024_power_on(struct gc5024 *gc5024) in __gc5024_power_on() argument
764 struct device *dev = &gc5024->client->dev; in __gc5024_power_on()
766 if (!IS_ERR_OR_NULL(gc5024->pins_default)) { in __gc5024_power_on()
767 ret = pinctrl_select_state(gc5024->pinctrl, in __gc5024_power_on()
768 gc5024->pins_default); in __gc5024_power_on()
772 ret = clk_set_rate(gc5024->xvclk, GC5024_XVCLK_FREQ); in __gc5024_power_on()
775 if (clk_get_rate(gc5024->xvclk) != GC5024_XVCLK_FREQ) in __gc5024_power_on()
777 ret = clk_prepare_enable(gc5024->xvclk); in __gc5024_power_on()
783 if (!IS_ERR(gc5024->pwdn_gpio)) in __gc5024_power_on()
784 gpiod_set_value_cansleep(gc5024->pwdn_gpio, 0); in __gc5024_power_on()
786 if (!IS_ERR(gc5024->reset_gpio)) in __gc5024_power_on()
787 gpiod_set_value_cansleep(gc5024->reset_gpio, 0); in __gc5024_power_on()
791 ret = regulator_bulk_enable(GC5024_NUM_SUPPLIES, gc5024->supplies); in __gc5024_power_on()
797 if (!IS_ERR(gc5024->reset_gpio)) in __gc5024_power_on()
798 gpiod_set_value_cansleep(gc5024->reset_gpio, 1); in __gc5024_power_on()
807 clk_disable_unprepare(gc5024->xvclk); in __gc5024_power_on()
812 static void __gc5024_power_off(struct gc5024 *gc5024) in __gc5024_power_off() argument
815 struct device *dev = &gc5024->client->dev; in __gc5024_power_off()
817 if (!IS_ERR(gc5024->pwdn_gpio)) in __gc5024_power_off()
818 gpiod_set_value_cansleep(gc5024->pwdn_gpio, 1); in __gc5024_power_off()
819 clk_disable_unprepare(gc5024->xvclk); in __gc5024_power_off()
820 if (!IS_ERR(gc5024->reset_gpio)) in __gc5024_power_off()
821 gpiod_set_value_cansleep(gc5024->reset_gpio, 0); in __gc5024_power_off()
822 if (!IS_ERR_OR_NULL(gc5024->pins_sleep)) { in __gc5024_power_off()
823 ret = pinctrl_select_state(gc5024->pinctrl, in __gc5024_power_off()
824 gc5024->pins_sleep); in __gc5024_power_off()
828 regulator_bulk_disable(GC5024_NUM_SUPPLIES, gc5024->supplies); in __gc5024_power_off()
835 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_runtime_resume() local
837 return __gc5024_power_on(gc5024); in gc5024_runtime_resume()
844 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_runtime_suspend() local
846 __gc5024_power_off(gc5024); in gc5024_runtime_suspend()
854 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_open() local
859 mutex_lock(&gc5024->mutex); in gc5024_open()
866 mutex_unlock(&gc5024->mutex); in gc5024_open()
876 struct gc5024 *sensor = to_gc5024(sd); in sensor_g_mbus_config()
897 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_enum_frame_interval() local
899 if (fie->index >= gc5024->cfg_num) in gc5024_enum_frame_interval()
948 static int gc5024_set_gain_reg(struct gc5024 *gc5024, u32 a_gain) in gc5024_set_gain_reg() argument
953 ret = gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
958 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
962 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
965 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
970 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
974 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
977 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
982 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
986 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
989 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
994 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
998 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1001 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1006 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1010 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1013 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1018 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1022 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1025 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1029 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1033 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1036 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_gain_reg()
1045 struct gc5024 *gc5024 = container_of(ctrl->handler, in gc5024_set_ctrl() local
1046 struct gc5024, ctrl_handler); in gc5024_set_ctrl()
1047 struct i2c_client *client = gc5024->client; in gc5024_set_ctrl()
1055 max = gc5024->cur_mode->height + ctrl->val - 4; in gc5024_set_ctrl()
1056 __v4l2_ctrl_modify_range(gc5024->exposure, in gc5024_set_ctrl()
1057 gc5024->exposure->minimum, max, in gc5024_set_ctrl()
1058 gc5024->exposure->step, in gc5024_set_ctrl()
1059 gc5024->exposure->default_value); in gc5024_set_ctrl()
1069 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_ctrl()
1072 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_ctrl()
1075 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_ctrl()
1080 ret = gc5024_set_gain_reg(gc5024, ctrl->val); in gc5024_set_ctrl()
1083 ret = gc5024_write_reg(gc5024->client, in gc5024_set_ctrl()
1086 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_ctrl()
1089 ret |= gc5024_write_reg(gc5024->client, in gc5024_set_ctrl()
1109 static int gc5024_initialize_controls(struct gc5024 *gc5024) in gc5024_initialize_controls() argument
1117 struct device *dev = &gc5024->client->dev; in gc5024_initialize_controls()
1120 handler = &gc5024->ctrl_handler; in gc5024_initialize_controls()
1121 mode = gc5024->cur_mode; in gc5024_initialize_controls()
1125 handler->lock = &gc5024->mutex; in gc5024_initialize_controls()
1136 gc5024->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in gc5024_initialize_controls()
1138 if (gc5024->hblank) in gc5024_initialize_controls()
1139 gc5024->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in gc5024_initialize_controls()
1142 gc5024->vblank = v4l2_ctrl_new_std(handler, &gc5024_ctrl_ops, in gc5024_initialize_controls()
1148 gc5024->exposure = v4l2_ctrl_new_std(handler, &gc5024_ctrl_ops, in gc5024_initialize_controls()
1153 gc5024->anal_gain = v4l2_ctrl_new_std(handler, &gc5024_ctrl_ops, in gc5024_initialize_controls()
1160 dev_err(&gc5024->client->dev, in gc5024_initialize_controls()
1165 gc5024->subdev.ctrl_handler = handler; in gc5024_initialize_controls()
1175 static int gc5024_check_sensor_id(struct gc5024 *gc5024, in gc5024_check_sensor_id() argument
1178 struct device *dev = &gc5024->client->dev; in gc5024_check_sensor_id()
1206 static int gc5024_configure_regulators(struct gc5024 *gc5024) in gc5024_configure_regulators() argument
1211 gc5024->supplies[i].supply = gc5024_supply_names[i]; in gc5024_configure_regulators()
1213 return devm_regulator_bulk_get(&gc5024->client->dev, in gc5024_configure_regulators()
1215 gc5024->supplies); in gc5024_configure_regulators()
1218 static int gc5024_parse_of(struct gc5024 *gc5024) in gc5024_parse_of() argument
1220 struct device *dev = &gc5024->client->dev; in gc5024_parse_of()
1237 gc5024->lane_num = rval; in gc5024_parse_of()
1238 if (2 == gc5024->lane_num) { in gc5024_parse_of()
1239 gc5024->cur_mode = &supported_modes_2lane[0]; in gc5024_parse_of()
1241 gc5024->cfg_num = ARRAY_SIZE(supported_modes_2lane); in gc5024_parse_of()
1244 gc5024->pixel_rate = MIPI_FREQ * 2U * gc5024->lane_num / 10U; in gc5024_parse_of()
1246 gc5024->lane_num, gc5024->pixel_rate); in gc5024_parse_of()
1248 dev_err(dev, "unsupported lane_num(%d)\n", gc5024->lane_num); in gc5024_parse_of()
1259 struct gc5024 *gc5024; in gc5024_probe() local
1269 gc5024 = devm_kzalloc(dev, sizeof(*gc5024), GFP_KERNEL); in gc5024_probe()
1270 if (!gc5024) in gc5024_probe()
1274 &gc5024->module_index); in gc5024_probe()
1276 &gc5024->module_facing); in gc5024_probe()
1278 &gc5024->module_name); in gc5024_probe()
1280 &gc5024->len_name); in gc5024_probe()
1286 gc5024->client = client; in gc5024_probe()
1288 gc5024->xvclk = devm_clk_get(dev, "xvclk"); in gc5024_probe()
1289 if (IS_ERR(gc5024->xvclk)) { in gc5024_probe()
1294 gc5024->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in gc5024_probe()
1295 if (IS_ERR(gc5024->reset_gpio)) in gc5024_probe()
1298 gc5024->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_HIGH); in gc5024_probe()
1299 if (IS_ERR(gc5024->pwdn_gpio)) in gc5024_probe()
1302 ret = gc5024_parse_of(gc5024); in gc5024_probe()
1305 gc5024->pinctrl = devm_pinctrl_get(dev); in gc5024_probe()
1306 if (!IS_ERR(gc5024->pinctrl)) { in gc5024_probe()
1307 gc5024->pins_default = in gc5024_probe()
1308 pinctrl_lookup_state(gc5024->pinctrl, in gc5024_probe()
1310 if (IS_ERR(gc5024->pins_default)) in gc5024_probe()
1313 gc5024->pins_sleep = in gc5024_probe()
1314 pinctrl_lookup_state(gc5024->pinctrl, in gc5024_probe()
1316 if (IS_ERR(gc5024->pins_sleep)) in gc5024_probe()
1322 ret = gc5024_configure_regulators(gc5024); in gc5024_probe()
1328 mutex_init(&gc5024->mutex); in gc5024_probe()
1330 sd = &gc5024->subdev; in gc5024_probe()
1332 ret = gc5024_initialize_controls(gc5024); in gc5024_probe()
1336 ret = __gc5024_power_on(gc5024); in gc5024_probe()
1340 ret = gc5024_check_sensor_id(gc5024, client); in gc5024_probe()
1349 gc5024->pad.flags = MEDIA_PAD_FL_SOURCE; in gc5024_probe()
1351 ret = media_entity_pads_init(&sd->entity, 1, &gc5024->pad); in gc5024_probe()
1358 if (strcmp(gc5024->module_facing, "back") == 0) in gc5024_probe()
1364 gc5024->module_index, facing, in gc5024_probe()
1383 __gc5024_power_off(gc5024); in gc5024_probe()
1385 v4l2_ctrl_handler_free(&gc5024->ctrl_handler); in gc5024_probe()
1387 mutex_destroy(&gc5024->mutex); in gc5024_probe()
1395 struct gc5024 *gc5024 = to_gc5024(sd); in gc5024_remove() local
1401 v4l2_ctrl_handler_free(&gc5024->ctrl_handler); in gc5024_remove()
1402 mutex_destroy(&gc5024->mutex); in gc5024_remove()
1406 __gc5024_power_off(gc5024); in gc5024_remove()