Lines Matching +full:force +full:- +full:bt656 +full:- +full:4
1 // SPDX-License-Identifier: GPL-2.0
18 #include <media/v4l2-ioctl.h>
19 #include <media/v4l2-event.h>
20 #include <media/v4l2-device.h>
21 #include <media/v4l2-ctrls.h>
61 #define ADV7180_BRI_MIN -128
66 #define ADV7180_HUE_MIN -127
197 #define ADV7180_FLAG_TEST_PATTERN BIT(4)
228 #define to_adv7180_sd(_ctrl) (&container_of(_ctrl->handler, \
230 ctrl_hdl)->sd)
234 if (state->register_page != page) { in adv7180_select_page()
235 i2c_smbus_write_byte_data(state->client, ADV7180_REG_CTRL, in adv7180_select_page()
237 state->register_page = page; in adv7180_select_page()
246 lockdep_assert_held(&state->mutex); in adv7180_write()
248 return i2c_smbus_write_byte_data(state->client, reg & 0xff, value); in adv7180_write()
253 lockdep_assert_held(&state->mutex); in adv7180_read()
255 return i2c_smbus_read_byte_data(state->client, reg & 0xff); in adv7180_read()
261 return i2c_smbus_write_byte_data(state->csi_client, reg, value); in adv7180_csi_write()
267 return state->chip_info->set_std(state, std); in adv7180_set_video_standard()
273 return i2c_smbus_write_byte_data(state->vpp_client, reg, value); in adv7180_vpp_write()
324 return -EINVAL; in v4l2_std_to_adv7180()
359 int err = mutex_lock_interruptible(&state->mutex); in adv7180_querystd()
363 if (state->streaming) { in adv7180_querystd()
364 err = -EBUSY; in adv7180_querystd()
376 err = v4l2_std_to_adv7180(state->curr_norm); in adv7180_querystd()
383 mutex_unlock(&state->mutex); in adv7180_querystd()
391 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_routing()
396 if (input > 31 || !(BIT(input) & state->chip_info->valid_input_mask)) { in adv7180_s_routing()
397 ret = -EINVAL; in adv7180_s_routing()
401 ret = state->chip_info->select_input(state, input); in adv7180_s_routing()
404 state->input = input; in adv7180_s_routing()
406 mutex_unlock(&state->mutex); in adv7180_s_routing()
413 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_g_input_status()
418 mutex_unlock(&state->mutex); in adv7180_g_input_status()
426 ret = v4l2_std_to_adv7180(state->curr_norm); in adv7180_program_std()
439 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_std()
449 state->curr_norm = std; in adv7180_s_std()
453 mutex_unlock(&state->mutex); in adv7180_s_std()
461 *norm = state->curr_norm; in adv7180_g_std()
471 if (state->curr_norm & V4L2_STD_525_60) { in adv7180_g_frame_interval()
472 fi->interval.numerator = 1001; in adv7180_g_frame_interval()
473 fi->interval.denominator = 30000; in adv7180_g_frame_interval()
475 fi->interval.numerator = 1; in adv7180_g_frame_interval()
476 fi->interval.denominator = 25; in adv7180_g_frame_interval()
484 if (!state->pwdn_gpio) in adv7180_set_power_pin()
488 gpiod_set_value_cansleep(state->pwdn_gpio, 0); in adv7180_set_power_pin()
491 gpiod_set_value_cansleep(state->pwdn_gpio, 1); in adv7180_set_power_pin()
497 if (!state->rst_gpio) in adv7180_set_reset_pin()
501 gpiod_set_value_cansleep(state->rst_gpio, 1); in adv7180_set_reset_pin()
503 gpiod_set_value_cansleep(state->rst_gpio, 0); in adv7180_set_reset_pin()
522 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_power()
529 if (state->field == V4L2_FIELD_NONE) in adv7180_set_power()
545 ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_power()
551 state->powered = on; in adv7180_s_power()
553 mutex_unlock(&state->mutex); in adv7180_s_power()
577 if (value == ARRAY_SIZE(test_pattern_menu) - 1) { in adv7180_test_pattern()
595 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_ctrl()
600 val = ctrl->val; in adv7180_s_ctrl()
601 switch (ctrl->id) { in adv7180_s_ctrl()
607 ret = adv7180_write(state, ADV7180_REG_HUE, -val); in adv7180_s_ctrl()
623 if (ctrl->val) { in adv7180_s_ctrl()
638 ret = -EINVAL; in adv7180_s_ctrl()
641 mutex_unlock(&state->mutex); in adv7180_s_ctrl()
661 v4l2_ctrl_handler_init(&state->ctrl_hdl, 4); in adv7180_init_controls()
663 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
666 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
669 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
672 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
675 v4l2_ctrl_new_custom(&state->ctrl_hdl, &adv7180_ctrl_fast_switch, NULL); in adv7180_init_controls()
677 if (state->chip_info->flags & ADV7180_FLAG_TEST_PATTERN) { in adv7180_init_controls()
678 v4l2_ctrl_new_std_menu_items(&state->ctrl_hdl, in adv7180_init_controls()
681 ARRAY_SIZE(test_pattern_menu) - 1, in adv7180_init_controls()
683 ARRAY_SIZE(test_pattern_menu) - 1, in adv7180_init_controls()
687 state->sd.ctrl_handler = &state->ctrl_hdl; in adv7180_init_controls()
688 if (state->ctrl_hdl.error) { in adv7180_init_controls()
689 int err = state->ctrl_hdl.error; in adv7180_init_controls()
691 v4l2_ctrl_handler_free(&state->ctrl_hdl); in adv7180_init_controls()
694 v4l2_ctrl_handler_setup(&state->ctrl_hdl); in adv7180_init_controls()
700 v4l2_ctrl_handler_free(&state->ctrl_hdl); in adv7180_exit_controls()
707 if (code->index != 0) in adv7180_enum_mbus_code()
708 return -EINVAL; in adv7180_enum_mbus_code()
710 code->code = MEDIA_BUS_FMT_UYVY8_2X8; in adv7180_enum_mbus_code()
720 fmt->code = MEDIA_BUS_FMT_UYVY8_2X8; in adv7180_mbus_fmt()
721 fmt->colorspace = V4L2_COLORSPACE_SMPTE170M; in adv7180_mbus_fmt()
722 fmt->width = 720; in adv7180_mbus_fmt()
723 fmt->height = state->curr_norm & V4L2_STD_525_60 ? 480 : 576; in adv7180_mbus_fmt()
725 if (state->field == V4L2_FIELD_ALTERNATE) in adv7180_mbus_fmt()
726 fmt->height /= 2; in adv7180_mbus_fmt()
733 if (!(state->chip_info->flags & ADV7180_FLAG_I2P)) in adv7180_set_field_mode()
736 if (state->field == V4L2_FIELD_NONE) { in adv7180_set_field_mode()
737 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_field_mode()
751 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_field_mode()
775 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { in adv7180_get_pad_format()
776 format->format = *v4l2_subdev_get_try_format(sd, sd_state, 0); in adv7180_get_pad_format()
778 adv7180_mbus_fmt(sd, &format->format); in adv7180_get_pad_format()
779 format->format.field = state->field; in adv7180_get_pad_format()
793 switch (format->format.field) { in adv7180_set_pad_format()
795 if (state->chip_info->flags & ADV7180_FLAG_I2P) in adv7180_set_pad_format()
799 format->format.field = V4L2_FIELD_ALTERNATE; in adv7180_set_pad_format()
803 ret = adv7180_mbus_fmt(sd, &format->format); in adv7180_set_pad_format()
805 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) { in adv7180_set_pad_format()
806 if (state->field != format->format.field) { in adv7180_set_pad_format()
807 state->field = format->format.field; in adv7180_set_pad_format()
814 *framefmt = format->format; in adv7180_set_pad_format()
837 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_get_mbus_config()
838 cfg->type = V4L2_MBUS_CSI2_DPHY; in adv7180_get_mbus_config()
839 cfg->bus.mipi_csi2.num_data_lanes = 1; in adv7180_get_mbus_config()
840 cfg->bus.mipi_csi2.flags = 0; in adv7180_get_mbus_config()
846 cfg->bus.parallel.flags = V4L2_MBUS_MASTER | in adv7180_get_mbus_config()
849 cfg->type = V4L2_MBUS_BT656; in adv7180_get_mbus_config()
866 if (state->curr_norm & V4L2_STD_525_60) { in adv7180_g_pixelaspect()
867 aspect->numerator = 11; in adv7180_g_pixelaspect()
868 aspect->denominator = 10; in adv7180_g_pixelaspect()
870 aspect->numerator = 54; in adv7180_g_pixelaspect()
871 aspect->denominator = 59; in adv7180_g_pixelaspect()
890 state->streaming = enable; in adv7180_s_stream()
895 ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_stream()
898 state->streaming = enable; in adv7180_s_stream()
899 mutex_unlock(&state->mutex); in adv7180_s_stream()
907 switch (sub->type) { in adv7180_subscribe_event()
913 return -EINVAL; in adv7180_subscribe_event()
959 mutex_lock(&state->mutex); in adv7180_irq()
970 v4l2_subdev_notify_event(&state->sd, &src_ch); in adv7180_irq()
972 mutex_unlock(&state->mutex); in adv7180_irq()
981 /* ITU-R BT.656-4 compatible */ in adv7180_init()
995 (std << 4) | state->input); in adv7180_set_std()
1013 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) in adv7182_init()
1017 if (state->chip_info->flags & ADV7180_FLAG_I2P) in adv7182_init()
1021 if (state->chip_info->flags & ADV7180_FLAG_V2) { in adv7182_init()
1029 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7182_init()
1034 if (state->chip_info->flags & ADV7180_FLAG_V2) { in adv7182_init()
1035 if (state->force_bt656_4) { in adv7182_init()
1036 /* ITU-R BT.656-4 compatible */ in adv7182_init()
1071 (std << 4) | ADV7182_REG_INPUT_RESERVED); in adv7182_set_std()
1137 /* Reset clamp circuitry - ADI recommended writes */ in adv7182_select_input()
1154 if (state->chip_info->flags & ADV7180_FLAG_V2) in adv7182_select_input()
1182 /* We cannot discriminate between LQFP and 40-pin LFCSP, so accept
1354 mutex_lock(&state->mutex); in init_device()
1362 ret = state->chip_info->init(state); in init_device()
1373 if (state->irq > 0) { in init_device()
1401 mutex_unlock(&state->mutex); in init_device()
1409 struct device_node *np = client->dev.of_node; in adv7180_probe()
1415 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) in adv7180_probe()
1416 return -EIO; in adv7180_probe()
1418 state = devm_kzalloc(&client->dev, sizeof(*state), GFP_KERNEL); in adv7180_probe()
1420 return -ENOMEM; in adv7180_probe()
1422 state->client = client; in adv7180_probe()
1423 state->field = V4L2_FIELD_ALTERNATE; in adv7180_probe()
1424 state->chip_info = (struct adv7180_chip_info *)id->driver_data; in adv7180_probe()
1426 state->pwdn_gpio = devm_gpiod_get_optional(&client->dev, "powerdown", in adv7180_probe()
1428 if (IS_ERR(state->pwdn_gpio)) { in adv7180_probe()
1429 ret = PTR_ERR(state->pwdn_gpio); in adv7180_probe()
1434 state->rst_gpio = devm_gpiod_get_optional(&client->dev, "reset", in adv7180_probe()
1436 if (IS_ERR(state->rst_gpio)) { in adv7180_probe()
1437 ret = PTR_ERR(state->rst_gpio); in adv7180_probe()
1442 if (of_property_read_bool(np, "adv,force-bt656-4")) in adv7180_probe()
1443 state->force_bt656_4 = true; in adv7180_probe()
1445 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_probe()
1446 state->csi_client = i2c_new_dummy_device(client->adapter, in adv7180_probe()
1448 if (IS_ERR(state->csi_client)) in adv7180_probe()
1449 return PTR_ERR(state->csi_client); in adv7180_probe()
1452 if (state->chip_info->flags & ADV7180_FLAG_I2P) { in adv7180_probe()
1453 state->vpp_client = i2c_new_dummy_device(client->adapter, in adv7180_probe()
1455 if (IS_ERR(state->vpp_client)) { in adv7180_probe()
1456 ret = PTR_ERR(state->vpp_client); in adv7180_probe()
1461 state->irq = client->irq; in adv7180_probe()
1462 mutex_init(&state->mutex); in adv7180_probe()
1463 state->curr_norm = V4L2_STD_NTSC; in adv7180_probe()
1464 if (state->chip_info->flags & ADV7180_FLAG_RESET_POWERED) in adv7180_probe()
1465 state->powered = true; in adv7180_probe()
1467 state->powered = false; in adv7180_probe()
1468 state->input = 0; in adv7180_probe()
1469 sd = &state->sd; in adv7180_probe()
1471 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; in adv7180_probe()
1477 state->pad.flags = MEDIA_PAD_FL_SOURCE; in adv7180_probe()
1478 sd->entity.function = MEDIA_ENT_F_ATV_DECODER; in adv7180_probe()
1479 ret = media_entity_pads_init(&sd->entity, 1, &state->pad); in adv7180_probe()
1487 if (state->irq) { in adv7180_probe()
1488 ret = request_threaded_irq(client->irq, NULL, adv7180_irq, in adv7180_probe()
1499 mutex_lock(&state->mutex); in adv7180_probe()
1501 mutex_unlock(&state->mutex); in adv7180_probe()
1506 ret, client->addr, client->adapter->name); in adv7180_probe()
1513 if (state->irq > 0) in adv7180_probe()
1514 free_irq(client->irq, state); in adv7180_probe()
1516 media_entity_cleanup(&sd->entity); in adv7180_probe()
1520 i2c_unregister_device(state->vpp_client); in adv7180_probe()
1522 i2c_unregister_device(state->csi_client); in adv7180_probe()
1523 mutex_destroy(&state->mutex); in adv7180_probe()
1534 if (state->irq > 0) in adv7180_remove()
1535 free_irq(client->irq, state); in adv7180_remove()
1537 media_entity_cleanup(&sd->entity); in adv7180_remove()
1540 i2c_unregister_device(state->vpp_client); in adv7180_remove()
1541 i2c_unregister_device(state->csi_client); in adv7180_remove()
1546 mutex_destroy(&state->mutex); in adv7180_remove()
1555 { "adv7280-m", (kernel_ulong_t)&adv7280_m_info },
1557 { "adv7281-m", (kernel_ulong_t)&adv7281_m_info },
1558 { "adv7281-ma", (kernel_ulong_t)&adv7281_ma_info },
1560 { "adv7282-m", (kernel_ulong_t)&adv7282_m_info },
1584 ret = adv7180_set_power(state, state->powered); in adv7180_resume()
1605 { .compatible = "adi,adv7280-m", },
1607 { .compatible = "adi,adv7281-m", },
1608 { .compatible = "adi,adv7281-ma", },
1610 { .compatible = "adi,adv7282-m", },