Lines Matching +full:vd +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0
20 #include <media/media-entity.h>
21 #include <media/v4l2-async.h>
22 #include <media/v4l2-ctrls.h>
23 #include <media/v4l2-subdev.h>
24 #include <linux/rk-camera-module.h>
139 * VD=586
272 * VD=663
434 msg.addr = client->addr; in gc0403_write_reg()
435 msg.flags = client->flags; in gc0403_write_reg()
439 ret = i2c_transfer(client->adapter, &msg, 1); in gc0403_write_reg()
443 dev_err(&client->dev, in gc0403_write_reg()
458 dev_err(&client->dev, "%s failed !\n", __func__); in gc0403_write_array()
476 msg[0].addr = client->addr; in gc0403_read_reg()
477 msg[0].flags = client->flags; in gc0403_read_reg()
481 msg[1].addr = client->addr; in gc0403_read_reg()
482 msg[1].flags = client->flags | I2C_M_RD; in gc0403_read_reg()
486 ret = i2c_transfer(client->adapter, msg, 2); in gc0403_read_reg()
492 dev_err(&client->dev, in gc0403_read_reg()
501 return abs(mode->width - framefmt->width) + in gc0403_get_reso_dist()
502 abs(mode->height - framefmt->height); in gc0403_get_reso_dist()
508 struct v4l2_mbus_framefmt *framefmt = &fmt->format; in gc0403_find_best_fit()
511 int cur_best_fit_dist = -1; in gc0403_find_best_fit()
516 if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) { in gc0403_find_best_fit()
532 mutex_lock(&gc0403->mutex); in gc0403_set_fmt()
535 fmt->format.code = MEDIA_BUS_FMT_SRGGB10_1X10; in gc0403_set_fmt()
536 fmt->format.width = mode->width; in gc0403_set_fmt()
537 fmt->format.height = mode->height; in gc0403_set_fmt()
538 fmt->format.field = V4L2_FIELD_NONE; in gc0403_set_fmt()
539 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in gc0403_set_fmt()
541 *v4l2_subdev_get_try_format(sd, cfg, fmt->pad) = fmt->format; in gc0403_set_fmt()
543 mutex_unlock(&gc0403->mutex); in gc0403_set_fmt()
544 return -ENOTTY; in gc0403_set_fmt()
547 gc0403->cur_mode = mode; in gc0403_set_fmt()
550 mutex_unlock(&gc0403->mutex); in gc0403_set_fmt()
560 const struct gc0403_mode *mode = gc0403->cur_mode; in gc0403_get_fmt()
562 mutex_lock(&gc0403->mutex); in gc0403_get_fmt()
563 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in gc0403_get_fmt()
565 fmt->format = *v4l2_subdev_get_try_format(sd, cfg, fmt->pad); in gc0403_get_fmt()
567 mutex_unlock(&gc0403->mutex); in gc0403_get_fmt()
568 return -ENOTTY; in gc0403_get_fmt()
571 fmt->format.width = mode->width; in gc0403_get_fmt()
572 fmt->format.height = mode->height; in gc0403_get_fmt()
573 fmt->format.code = MEDIA_BUS_FMT_SRGGB10_1X10; in gc0403_get_fmt()
574 fmt->format.field = V4L2_FIELD_NONE; in gc0403_get_fmt()
576 mutex_unlock(&gc0403->mutex); in gc0403_get_fmt()
585 if (code->index != 0) in gc0403_enum_mbus_code()
586 return -EINVAL; in gc0403_enum_mbus_code()
588 code->code = MEDIA_BUS_FMT_SRGGB10_1X10; in gc0403_enum_mbus_code()
597 if (fse->index >= ARRAY_SIZE(supported_modes)) in gc0403_enum_frame_sizes()
598 return -EINVAL; in gc0403_enum_frame_sizes()
600 if (fse->code != MEDIA_BUS_FMT_SRGGB10_1X10) in gc0403_enum_frame_sizes()
601 return -EINVAL; in gc0403_enum_frame_sizes()
603 fse->min_width = supported_modes[fse->index].width; in gc0403_enum_frame_sizes()
604 fse->max_width = supported_modes[fse->index].width; in gc0403_enum_frame_sizes()
605 fse->max_height = supported_modes[fse->index].height; in gc0403_enum_frame_sizes()
606 fse->min_height = supported_modes[fse->index].height; in gc0403_enum_frame_sizes()
615 const struct gc0403_mode *mode = gc0403->cur_mode; in gc0403_g_frame_interval()
617 fi->interval = mode->max_fps; in gc0403_g_frame_interval()
626 strlcpy(inf->base.sensor, GC0403_NAME, sizeof(inf->base.sensor)); in gc0403_get_module_inf()
627 strlcpy(inf->base.module, gc0403->module_name, in gc0403_get_module_inf()
628 sizeof(inf->base.module)); in gc0403_get_module_inf()
629 strlcpy(inf->base.lens, gc0403->len_name, sizeof(inf->base.lens)); in gc0403_get_module_inf()
647 ret = gc0403_write_reg(gc0403->client, PAGE_SELECT_REG, 0x03); in gc0403_ioctl()
648 ret |= gc0403_write_reg(gc0403->client, GC0403_REG_MIPI_EN, 0x90); in gc0403_ioctl()
649 ret |= gc0403_write_reg(gc0403->client, PAGE_SELECT_REG, 0x00); in gc0403_ioctl()
651 ret = gc0403_write_reg(gc0403->client, PAGE_SELECT_REG, 0x03); in gc0403_ioctl()
652 ret |= gc0403_write_reg(gc0403->client, GC0403_REG_MIPI_EN, 0x80); in gc0403_ioctl()
653 ret |= gc0403_write_reg(gc0403->client, PAGE_SELECT_REG, 0x00); in gc0403_ioctl()
657 ret = -ENOIOCTLCMD; in gc0403_ioctl()
678 ret = -ENOMEM; in gc0403_compat_ioctl32()
686 ret = -EFAULT; in gc0403_compat_ioctl32()
695 ret = -ENOMEM; in gc0403_compat_ioctl32()
703 ret = -EFAULT; in gc0403_compat_ioctl32()
712 ret = -ENOIOCTLCMD; in gc0403_compat_ioctl32()
725 mutex_unlock(&gc0403->mutex); in __gc0403_start_stream()
726 ret = v4l2_ctrl_handler_setup(&gc0403->ctrl_handler); in __gc0403_start_stream()
727 mutex_lock(&gc0403->mutex); in __gc0403_start_stream()
730 ret = gc0403_write_reg(gc0403->client, PAGE_SELECT_REG, 0x03); in __gc0403_start_stream()
731 ret |= gc0403_write_reg(gc0403->client, GC0403_REG_MIPI_EN, 0x90); in __gc0403_start_stream()
732 ret |= gc0403_write_reg(gc0403->client, PAGE_SELECT_REG, 0x00); in __gc0403_start_stream()
741 ret = gc0403_write_reg(gc0403->client, PAGE_SELECT_REG, 0x03); in __gc0403_stop_stream()
742 ret |= gc0403_write_reg(gc0403->client, GC0403_REG_MIPI_EN, 0x80); in __gc0403_stop_stream()
743 ret |= gc0403_write_reg(gc0403->client, PAGE_SELECT_REG, 0x00); in __gc0403_stop_stream()
756 mutex_lock(&gc0403->mutex); in gc0403_s_power()
760 ret = pm_runtime_get_sync(&gc0403->client->dev); in gc0403_s_power()
762 ret = pm_runtime_put(&gc0403->client->dev); in gc0403_s_power()
764 mutex_unlock(&gc0403->mutex); in gc0403_s_power()
774 mutex_lock(&gc0403->mutex); in gc0403_s_stream()
776 if (on == gc0403->streaming) in gc0403_s_stream()
790 gc0403->streaming = on; in gc0403_s_stream()
793 mutex_unlock(&gc0403->mutex); in gc0403_s_stream()
802 struct device *dev = &gc0403->client->dev; in __gc0403_power_on()
804 ret = clk_set_rate(gc0403->xvclk, GC0403_XVCLK_FREQ); in __gc0403_power_on()
809 if (clk_get_rate(gc0403->xvclk) != GC0403_XVCLK_FREQ) in __gc0403_power_on()
811 ret = clk_prepare_enable(gc0403->xvclk); in __gc0403_power_on()
817 ret = regulator_bulk_enable(GC0403_NUM_SUPPLIES, gc0403->supplies); in __gc0403_power_on()
823 if (!IS_ERR(gc0403->pwdn_gpio)) in __gc0403_power_on()
824 gpiod_set_value_cansleep(gc0403->pwdn_gpio, 0); in __gc0403_power_on()
828 ret = gc0403_write_array(gc0403->client, gc0403->cur_mode->reg_list); in __gc0403_power_on()
836 clk_disable_unprepare(gc0403->xvclk); in __gc0403_power_on()
843 if (!IS_ERR(gc0403->pwdn_gpio)) in __gc0403_power_off()
844 gpiod_set_value_cansleep(gc0403->pwdn_gpio, 1); in __gc0403_power_off()
845 clk_disable_unprepare(gc0403->xvclk); in __gc0403_power_off()
846 regulator_bulk_disable(GC0403_NUM_SUPPLIES, gc0403->supplies); in __gc0403_power_off()
860 if (gc0403->streaming) { in gc0403_runtime_resume()
885 v4l2_subdev_get_try_format(sd, fh->pad, 0); in gc0403_open()
888 mutex_lock(&gc0403->mutex); in gc0403_open()
890 try_fmt->width = def_mode->width; in gc0403_open()
891 try_fmt->height = def_mode->height; in gc0403_open()
892 try_fmt->code = MEDIA_BUS_FMT_SRGGB10_1X10; in gc0403_open()
893 try_fmt->field = V4L2_FIELD_NONE; in gc0403_open()
895 mutex_unlock(&gc0403->mutex); in gc0403_open()
906 if (fie->index >= ARRAY_SIZE(supported_modes)) in gc0403_enum_frame_interval()
907 return -EINVAL; in gc0403_enum_frame_interval()
909 fie->code = MEDIA_BUS_FMT_SRGGB10_1X10; in gc0403_enum_frame_interval()
910 fie->width = supported_modes[fie->index].width; in gc0403_enum_frame_interval()
911 fie->height = supported_modes[fie->index].height; in gc0403_enum_frame_interval()
912 fie->interval = supported_modes[fie->index].max_fps; in gc0403_enum_frame_interval()
921 val = 1 << (GC0403_LANES - 1) | in gc0403_g_mbus_config()
924 config->type = V4L2_MBUS_CSI2; in gc0403_g_mbus_config()
925 config->flags = val; in gc0403_g_mbus_config()
971 struct gc0403 *gc0403 = container_of(ctrl->handler, in gc0403_set_ctrl()
973 struct i2c_client *client = gc0403->client; in gc0403_set_ctrl()
984 if (!pm_runtime_get_if_in_use(&client->dev)) in gc0403_set_ctrl()
987 switch (ctrl->id) { in gc0403_set_ctrl()
989 dev_dbg(&client->dev, in gc0403_set_ctrl()
991 ctrl->val); in gc0403_set_ctrl()
993 ret = gc0403_write_reg(gc0403->client, GC0403_REG_EXP_H, in gc0403_set_ctrl()
994 (ctrl->val >> 8) & 0x1f); in gc0403_set_ctrl()
995 ret |= gc0403_write_reg(gc0403->client, GC0403_REG_EXP_L, in gc0403_set_ctrl()
996 ctrl->val & 0xff); in gc0403_set_ctrl()
1000 total_gain = ctrl->val; in gc0403_set_ctrl()
1006 i = i - 1; in gc0403_set_ctrl()
1024 ret = gc0403_write_reg(gc0403->client, in gc0403_set_ctrl()
1028 ret |= gc0403_write_reg(gc0403->client, in gc0403_set_ctrl()
1032 ret |= gc0403_write_reg(gc0403->client, in gc0403_set_ctrl()
1037 dev_dbg(&client->dev, "gc0403: gain: %d,a: %d,d: %d\n", in gc0403_set_ctrl()
1042 ret = gc0403_write_reg(gc0403->client, GC0403_REG_VBLK_H, in gc0403_set_ctrl()
1043 (ctrl->val) >> 8); in gc0403_set_ctrl()
1044 ret |= gc0403_write_reg(gc0403->client, GC0403_REG_VBLK_L, in gc0403_set_ctrl()
1045 (ctrl->val) & 0xff); in gc0403_set_ctrl()
1048 dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n", in gc0403_set_ctrl()
1049 __func__, ctrl->id, ctrl->val); in gc0403_set_ctrl()
1053 pm_runtime_put(&client->dev); in gc0403_set_ctrl()
1071 handler = &gc0403->ctrl_handler; in gc0403_initialize_controls()
1072 mode = gc0403->cur_mode; in gc0403_initialize_controls()
1076 handler->lock = &gc0403->mutex; in gc0403_initialize_controls()
1081 ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; in gc0403_initialize_controls()
1086 h_blank = mode->hts_def - mode->width; in gc0403_initialize_controls()
1087 gc0403->hblank = v4l2_ctrl_new_std(handler, NULL, V4L2_CID_HBLANK, in gc0403_initialize_controls()
1089 if (gc0403->hblank) in gc0403_initialize_controls()
1090 gc0403->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in gc0403_initialize_controls()
1092 vblank_def = mode->vts_def - mode->height; in gc0403_initialize_controls()
1093 gc0403->vblank = v4l2_ctrl_new_std(handler, &gc0403_ctrl_ops, in gc0403_initialize_controls()
1097 gc0403->exposure = v4l2_ctrl_new_std(handler, &gc0403_ctrl_ops, in gc0403_initialize_controls()
1100 1, mode->exp_def); in gc0403_initialize_controls()
1103 gc0403->anal_gain = v4l2_ctrl_new_std(handler, &gc0403_ctrl_ops, in gc0403_initialize_controls()
1109 gc0403->digi_gain = v4l2_ctrl_new_std(handler, &gc0403_ctrl_ops, in gc0403_initialize_controls()
1114 if (handler->error) { in gc0403_initialize_controls()
1115 ret = handler->error; in gc0403_initialize_controls()
1116 dev_err(&gc0403->client->dev, in gc0403_initialize_controls()
1121 gc0403->subdev.ctrl_handler = handler; in gc0403_initialize_controls()
1134 struct device *dev = &gc0403->client->dev; in gc0403_check_sensor_id()
1143 dev_err(&client->dev, "gc0403_read_reg failed (%d)\n", ret); in gc0403_check_sensor_id()
1149 dev_err(&client->dev, in gc0403_check_sensor_id()
1152 return -ENODEV; in gc0403_check_sensor_id()
1165 gc0403->supplies[i].supply = gc0403_supply_names[i]; in gc0403_configure_regulators()
1167 return devm_regulator_bulk_get(&gc0403->client->dev, in gc0403_configure_regulators()
1169 gc0403->supplies); in gc0403_configure_regulators()
1175 struct device *dev = &client->dev; in gc0403_probe()
1177 struct device_node *node = dev->of_node; in gc0403_probe()
1191 return -ENOMEM; in gc0403_probe()
1194 &gc0403->module_index); in gc0403_probe()
1196 &gc0403->module_facing); in gc0403_probe()
1198 &gc0403->module_name); in gc0403_probe()
1200 &gc0403->len_name); in gc0403_probe()
1203 return -EINVAL; in gc0403_probe()
1206 gc0403->client = client; in gc0403_probe()
1207 gc0403->cur_mode = &supported_modes[1]; in gc0403_probe()
1209 gc0403->xvclk = devm_clk_get(dev, "xvclk"); in gc0403_probe()
1210 if (IS_ERR(gc0403->xvclk)) { in gc0403_probe()
1212 return -EINVAL; in gc0403_probe()
1215 gc0403->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in gc0403_probe()
1216 if (IS_ERR(gc0403->pwdn_gpio)) in gc0403_probe()
1217 dev_warn(dev, "Failed to get pwdn-gpios\n"); in gc0403_probe()
1225 mutex_init(&gc0403->mutex); in gc0403_probe()
1227 sd = &gc0403->subdev; in gc0403_probe()
1242 sd->internal_ops = &gc0403_internal_ops; in gc0403_probe()
1243 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in gc0403_probe()
1247 gc0403->pad.flags = MEDIA_PAD_FL_SOURCE; in gc0403_probe()
1248 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; in gc0403_probe()
1249 ret = media_entity_pads_init(&sd->entity, 1, &gc0403->pad); in gc0403_probe()
1255 if (strcmp(gc0403->module_facing, "back") == 0) in gc0403_probe()
1260 snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s", in gc0403_probe()
1261 gc0403->module_index, facing, in gc0403_probe()
1262 GC0403_NAME, dev_name(sd->dev)); in gc0403_probe()
1278 media_entity_cleanup(&sd->entity); in gc0403_probe()
1283 v4l2_ctrl_handler_free(&gc0403->ctrl_handler); in gc0403_probe()
1285 mutex_destroy(&gc0403->mutex); in gc0403_probe()
1297 media_entity_cleanup(&sd->entity); in gc0403_remove()
1299 v4l2_ctrl_handler_free(&gc0403->ctrl_handler); in gc0403_remove()
1300 mutex_destroy(&gc0403->mutex); in gc0403_remove()
1302 pm_runtime_disable(&client->dev); in gc0403_remove()
1303 if (!pm_runtime_status_suspended(&client->dev)) in gc0403_remove()
1305 pm_runtime_set_suspended(&client->dev); in gc0403_remove()