Lines Matching +full:colour +full:- +full:sensor

1 // SPDX-License-Identifier: GPL-2.0
10 #include <media/v4l2-ctrls.h>
11 #include <media/v4l2-device.h>
12 #include <media/v4l2-fwnode.h>
36 /* vertical-timings from sensor */
44 /* horizontal-timings from sensor */
47 /* Exposure controls from sensor */
53 /* Analog gain controls from sensor */
59 /* Digital gain controls from sensor */
74 /* Flip Mirror Controls from sensor */
118 /* Sensor register settings for this resolution */
2111 "Solid Colour",
2112 "100% Colour Bars",
2113 "Fade To Grey Colour Bars",
2200 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd); in hi847_read_reg()
2207 return -EINVAL; in hi847_read_reg()
2210 msgs[0].addr = client->addr; in hi847_read_reg()
2214 msgs[1].addr = client->addr; in hi847_read_reg()
2217 msgs[1].buf = &data_buf[4 - len]; in hi847_read_reg()
2219 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in hi847_read_reg()
2221 return -EIO; in hi847_read_reg()
2230 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd); in hi847_write_reg()
2234 return -EINVAL; in hi847_write_reg()
2237 put_unaligned_be32(val << 8 * (4 - len), buf + 2); in hi847_write_reg()
2239 return -EIO; in hi847_write_reg()
2247 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd); in hi847_write_reg_list()
2251 for (i = 0; i < r_list->num_of_regs; i++) { in hi847_write_reg_list()
2252 ret = hi847_write_reg(hi847, r_list->regs[i].address, in hi847_write_reg_list()
2254 r_list->regs[i].val); in hi847_write_reg_list()
2256 dev_err_ratelimited(&client->dev, in hi847_write_reg_list()
2258 r_list->regs[i].address, ret); in hi847_write_reg_list()
2343 hflip = hi847->hflip->val; in hi847_grbg_shift()
2344 vflip = hi847->vflip->val; in hi847_grbg_shift()
2346 if (hi847->cur_mode->width == 3264) { in hi847_grbg_shift()
2409 struct hi847 *hi847 = container_of(ctrl->handler, in hi847_set_ctrl()
2411 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd); in hi847_set_ctrl()
2416 if (ctrl->id == V4L2_CID_VBLANK) { in hi847_set_ctrl()
2418 exposure_max = hi847->cur_mode->height + ctrl->val - in hi847_set_ctrl()
2420 __v4l2_ctrl_modify_range(hi847->exposure, in hi847_set_ctrl()
2421 hi847->exposure->minimum, in hi847_set_ctrl()
2422 exposure_max, hi847->exposure->step, in hi847_set_ctrl()
2427 if (!pm_runtime_get_if_in_use(&client->dev)) in hi847_set_ctrl()
2430 switch (ctrl->id) { in hi847_set_ctrl()
2433 HI847_REG_VALUE_16BIT, ctrl->val); in hi847_set_ctrl()
2437 ret = hi847_update_digital_gain(hi847, ctrl->val); in hi847_set_ctrl()
2442 HI847_REG_VALUE_16BIT, ctrl->val); in hi847_set_ctrl()
2449 hi847->cur_mode->height + ctrl->val); in hi847_set_ctrl()
2453 ret = hi847_test_pattern(hi847, ctrl->val); in hi847_set_ctrl()
2457 hi847_set_ctrl_hflip(hi847, ctrl->val); in hi847_set_ctrl()
2461 hi847_set_ctrl_vflip(hi847, ctrl->val); in hi847_set_ctrl()
2465 ret = -EINVAL; in hi847_set_ctrl()
2469 pm_runtime_put(&client->dev); in hi847_set_ctrl()
2484 ctrl_hdlr = &hi847->ctrl_handler; in hi847_init_controls()
2489 ctrl_hdlr->lock = &hi847->mutex; in hi847_init_controls()
2490 hi847->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, &hi847_ctrl_ops, in hi847_init_controls()
2492 ARRAY_SIZE(link_freq_menu_items) - 1, in hi847_init_controls()
2494 if (hi847->link_freq) in hi847_init_controls()
2495 hi847->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in hi847_init_controls()
2497 hi847->pixel_rate = v4l2_ctrl_new_std in hi847_init_controls()
2503 hi847->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops, in hi847_init_controls()
2505 hi847->cur_mode->fll_min - in hi847_init_controls()
2506 hi847->cur_mode->height, in hi847_init_controls()
2507 HI847_FLL_MAX - in hi847_init_controls()
2508 hi847->cur_mode->height, 1, in hi847_init_controls()
2509 hi847->cur_mode->fll_def - in hi847_init_controls()
2510 hi847->cur_mode->height); in hi847_init_controls()
2512 h_blank = hi847->cur_mode->llp - hi847->cur_mode->width; in hi847_init_controls()
2514 hi847->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops, in hi847_init_controls()
2517 if (hi847->hblank) in hi847_init_controls()
2518 hi847->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; in hi847_init_controls()
2526 exposure_max = hi847->cur_mode->fll_def - HI847_EXPOSURE_MAX_MARGIN; in hi847_init_controls()
2527 hi847->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops, in hi847_init_controls()
2534 ARRAY_SIZE(hi847_test_pattern_menu) - 1, in hi847_init_controls()
2536 hi847->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops, in hi847_init_controls()
2538 hi847->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &hi847_ctrl_ops, in hi847_init_controls()
2541 if (ctrl_hdlr->error) in hi847_init_controls()
2542 return ctrl_hdlr->error; in hi847_init_controls()
2544 hi847->sd.ctrl_handler = ctrl_hdlr; in hi847_init_controls()
2552 fmt->width = mode->width; in hi847_assign_pad_format()
2553 fmt->height = mode->height; in hi847_assign_pad_format()
2554 fmt->code = MEDIA_BUS_FMT_SGRBG10_1X10; in hi847_assign_pad_format()
2555 fmt->field = V4L2_FIELD_NONE; in hi847_assign_pad_format()
2560 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd); in hi847_start_streaming()
2564 link_freq_index = hi847->cur_mode->link_freq_index; in hi847_start_streaming()
2568 dev_err(&client->dev, "failed to set plls"); in hi847_start_streaming()
2572 reg_list = &hi847->cur_mode->reg_list; in hi847_start_streaming()
2575 dev_err(&client->dev, "failed to set mode"); in hi847_start_streaming()
2579 ret = __v4l2_ctrl_handler_setup(hi847->sd.ctrl_handler); in hi847_start_streaming()
2590 dev_err(&client->dev, "failed to set stream"); in hi847_start_streaming()
2599 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd); in hi847_stop_streaming()
2603 dev_err(&client->dev, "failed to set stream 0x%x", in hi847_stop_streaming()
2608 dev_err(&client->dev, "failed to set stream 0x%x", in hi847_stop_streaming()
2618 mutex_lock(&hi847->mutex); in hi847_set_stream()
2620 ret = pm_runtime_resume_and_get(&client->dev); in hi847_set_stream()
2622 mutex_unlock(&hi847->mutex); in hi847_set_stream()
2630 pm_runtime_put(&client->dev); in hi847_set_stream()
2634 pm_runtime_put(&client->dev); in hi847_set_stream()
2637 mutex_unlock(&hi847->mutex); in hi847_set_stream()
2652 height, fmt->format.width, in hi847_set_format()
2653 fmt->format.height); in hi847_set_format()
2655 mutex_lock(&hi847->mutex); in hi847_set_format()
2656 hi847_assign_pad_format(mode, &fmt->format); in hi847_set_format()
2657 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in hi847_set_format()
2658 *v4l2_subdev_state_get_format(sd_state, fmt->pad) = in hi847_set_format()
2659 fmt->format; in hi847_set_format()
2661 hi847->cur_mode = mode; in hi847_set_format()
2662 __v4l2_ctrl_s_ctrl(hi847->link_freq, mode->link_freq_index); in hi847_set_format()
2663 __v4l2_ctrl_s_ctrl_int64(hi847->pixel_rate, in hi847_set_format()
2664 to_pixel_rate(mode->link_freq_index)); in hi847_set_format()
2667 vblank_def = mode->fll_def - mode->height; in hi847_set_format()
2668 __v4l2_ctrl_modify_range(hi847->vblank, in hi847_set_format()
2669 mode->fll_min - mode->height, in hi847_set_format()
2670 HI847_FLL_MAX - mode->height, 1, in hi847_set_format()
2672 __v4l2_ctrl_s_ctrl(hi847->vblank, vblank_def); in hi847_set_format()
2674 h_blank = hi847->cur_mode->llp - hi847->cur_mode->width; in hi847_set_format()
2676 __v4l2_ctrl_modify_range(hi847->hblank, h_blank, h_blank, 1, in hi847_set_format()
2680 mutex_unlock(&hi847->mutex); in hi847_set_format()
2691 mutex_lock(&hi847->mutex); in hi847_get_format()
2692 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) in hi847_get_format()
2693 fmt->format = *v4l2_subdev_state_get_format(sd_state, in hi847_get_format()
2694 fmt->pad); in hi847_get_format()
2696 hi847_assign_pad_format(hi847->cur_mode, &fmt->format); in hi847_get_format()
2698 mutex_unlock(&hi847->mutex); in hi847_get_format()
2707 if (code->index > 0) in hi847_enum_mbus_code()
2708 return -EINVAL; in hi847_enum_mbus_code()
2710 code->code = MEDIA_BUS_FMT_SGRBG10_1X10; in hi847_enum_mbus_code()
2719 if (fse->index >= ARRAY_SIZE(supported_modes)) in hi847_enum_frame_size()
2720 return -EINVAL; in hi847_enum_frame_size()
2722 if (fse->code != MEDIA_BUS_FMT_SGRBG10_1X10) in hi847_enum_frame_size()
2723 return -EINVAL; in hi847_enum_frame_size()
2725 fse->min_width = supported_modes[fse->index].width; in hi847_enum_frame_size()
2726 fse->max_width = fse->min_width; in hi847_enum_frame_size()
2727 fse->min_height = supported_modes[fse->index].height; in hi847_enum_frame_size()
2728 fse->max_height = fse->min_height; in hi847_enum_frame_size()
2737 mutex_lock(&hi847->mutex); in hi847_open()
2739 v4l2_subdev_state_get_format(fh->state, 0)); in hi847_open()
2740 mutex_unlock(&hi847->mutex); in hi847_open()
2771 struct i2c_client *client = v4l2_get_subdevdata(&hi847->sd); in hi847_identify_module()
2781 dev_err(&client->dev, "chip id mismatch: %x!=%x", in hi847_identify_module()
2783 return -ENXIO; in hi847_identify_module()
2801 return -ENXIO; in hi847_check_hwcfg()
2803 ret = fwnode_property_read_u32(fwnode, "clock-frequency", &mclk); in hi847_check_hwcfg()
2811 return -EINVAL; in hi847_check_hwcfg()
2816 return -ENXIO; in hi847_check_hwcfg()
2826 ret = -EINVAL; in hi847_check_hwcfg()
2832 ret = -EINVAL; in hi847_check_hwcfg()
2846 ret = -EINVAL; in hi847_check_hwcfg()
2863 media_entity_cleanup(&sd->entity); in hi847_remove()
2864 v4l2_ctrl_handler_free(sd->ctrl_handler); in hi847_remove()
2865 pm_runtime_disable(&client->dev); in hi847_remove()
2866 mutex_destroy(&hi847->mutex); in hi847_remove()
2874 hi847 = devm_kzalloc(&client->dev, sizeof(*hi847), GFP_KERNEL); in hi847_probe()
2876 return -ENOMEM; in hi847_probe()
2878 ret = hi847_check_hwcfg(&client->dev); in hi847_probe()
2880 dev_err(&client->dev, "failed to get HW configuration: %d", in hi847_probe()
2885 v4l2_i2c_subdev_init(&hi847->sd, client, &hi847_subdev_ops); in hi847_probe()
2888 dev_err(&client->dev, "failed to find sensor: %d", ret); in hi847_probe()
2892 mutex_init(&hi847->mutex); in hi847_probe()
2893 hi847->cur_mode = &supported_modes[0]; in hi847_probe()
2896 dev_err(&client->dev, "failed to init controls: %d", ret); in hi847_probe()
2900 hi847->sd.internal_ops = &hi847_internal_ops; in hi847_probe()
2901 hi847->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in hi847_probe()
2902 hi847->sd.entity.ops = &hi847_subdev_entity_ops; in hi847_probe()
2903 hi847->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; in hi847_probe()
2904 hi847->pad.flags = MEDIA_PAD_FL_SOURCE; in hi847_probe()
2905 ret = media_entity_pads_init(&hi847->sd.entity, 1, &hi847->pad); in hi847_probe()
2907 dev_err(&client->dev, "failed to init entity pads: %d", ret); in hi847_probe()
2911 ret = v4l2_async_register_subdev_sensor(&hi847->sd); in hi847_probe()
2913 dev_err(&client->dev, "failed to register V4L2 subdev: %d", in hi847_probe()
2918 pm_runtime_set_active(&client->dev); in hi847_probe()
2919 pm_runtime_enable(&client->dev); in hi847_probe()
2920 pm_runtime_idle(&client->dev); in hi847_probe()
2925 media_entity_cleanup(&hi847->sd.entity); in hi847_probe()
2928 v4l2_ctrl_handler_free(hi847->sd.ctrl_handler); in hi847_probe()
2929 mutex_destroy(&hi847->mutex); in hi847_probe()
2955 MODULE_DESCRIPTION("Hynix HI847 sensor driver");