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
227 #define to_adv7180_sd(_ctrl) (&container_of(_ctrl->handler, \
229 ctrl_hdl)->sd)
233 if (state->register_page != page) { in adv7180_select_page()
234 i2c_smbus_write_byte_data(state->client, ADV7180_REG_CTRL, in adv7180_select_page()
236 state->register_page = page; in adv7180_select_page()
245 lockdep_assert_held(&state->mutex); in adv7180_write()
247 return i2c_smbus_write_byte_data(state->client, reg & 0xff, value); in adv7180_write()
252 lockdep_assert_held(&state->mutex); in adv7180_read()
254 return i2c_smbus_read_byte_data(state->client, reg & 0xff); in adv7180_read()
260 return i2c_smbus_write_byte_data(state->csi_client, reg, value); in adv7180_csi_write()
266 return state->chip_info->set_std(state, std); in adv7180_set_video_standard()
272 return i2c_smbus_write_byte_data(state->vpp_client, reg, value); in adv7180_vpp_write()
323 return -EINVAL; in v4l2_std_to_adv7180()
358 int err = mutex_lock_interruptible(&state->mutex); in adv7180_querystd()
362 if (state->streaming) { in adv7180_querystd()
363 err = -EBUSY; in adv7180_querystd()
375 err = v4l2_std_to_adv7180(state->curr_norm); in adv7180_querystd()
382 mutex_unlock(&state->mutex); in adv7180_querystd()
390 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_routing()
395 if (input > 31 || !(BIT(input) & state->chip_info->valid_input_mask)) { in adv7180_s_routing()
396 ret = -EINVAL; in adv7180_s_routing()
400 ret = state->chip_info->select_input(state, input); in adv7180_s_routing()
403 state->input = input; in adv7180_s_routing()
405 mutex_unlock(&state->mutex); in adv7180_s_routing()
412 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_g_input_status()
417 mutex_unlock(&state->mutex); in adv7180_g_input_status()
425 ret = v4l2_std_to_adv7180(state->curr_norm); in adv7180_program_std()
438 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_std()
448 state->curr_norm = std; in adv7180_s_std()
452 mutex_unlock(&state->mutex); in adv7180_s_std()
460 *norm = state->curr_norm; in adv7180_g_std()
470 if (state->curr_norm & V4L2_STD_525_60) { in adv7180_g_frame_interval()
471 fi->interval.numerator = 1001; in adv7180_g_frame_interval()
472 fi->interval.denominator = 30000; in adv7180_g_frame_interval()
474 fi->interval.numerator = 1; in adv7180_g_frame_interval()
475 fi->interval.denominator = 25; in adv7180_g_frame_interval()
483 if (!state->pwdn_gpio) in adv7180_set_power_pin()
487 gpiod_set_value_cansleep(state->pwdn_gpio, 0); in adv7180_set_power_pin()
490 gpiod_set_value_cansleep(state->pwdn_gpio, 1); in adv7180_set_power_pin()
496 if (!state->rst_gpio) in adv7180_set_reset_pin()
500 gpiod_set_value_cansleep(state->rst_gpio, 1); in adv7180_set_reset_pin()
502 gpiod_set_value_cansleep(state->rst_gpio, 0); in adv7180_set_reset_pin()
521 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_power()
528 if (state->field == V4L2_FIELD_NONE) in adv7180_set_power()
544 ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_power()
550 state->powered = on; in adv7180_s_power()
552 mutex_unlock(&state->mutex); in adv7180_s_power()
576 if (value == ARRAY_SIZE(test_pattern_menu) - 1) { in adv7180_test_pattern()
594 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_ctrl()
599 val = ctrl->val; in adv7180_s_ctrl()
600 switch (ctrl->id) { in adv7180_s_ctrl()
606 ret = adv7180_write(state, ADV7180_REG_HUE, -val); in adv7180_s_ctrl()
622 if (ctrl->val) { in adv7180_s_ctrl()
637 ret = -EINVAL; in adv7180_s_ctrl()
640 mutex_unlock(&state->mutex); in adv7180_s_ctrl()
660 v4l2_ctrl_handler_init(&state->ctrl_hdl, 4); in adv7180_init_controls()
662 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
665 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
668 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
671 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
674 v4l2_ctrl_new_custom(&state->ctrl_hdl, &adv7180_ctrl_fast_switch, NULL); in adv7180_init_controls()
676 v4l2_ctrl_new_std_menu_items(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
678 ARRAY_SIZE(test_pattern_menu) - 1, in adv7180_init_controls()
679 0, ARRAY_SIZE(test_pattern_menu) - 1, in adv7180_init_controls()
682 state->sd.ctrl_handler = &state->ctrl_hdl; in adv7180_init_controls()
683 if (state->ctrl_hdl.error) { in adv7180_init_controls()
684 int err = state->ctrl_hdl.error; in adv7180_init_controls()
686 v4l2_ctrl_handler_free(&state->ctrl_hdl); in adv7180_init_controls()
689 v4l2_ctrl_handler_setup(&state->ctrl_hdl); in adv7180_init_controls()
695 v4l2_ctrl_handler_free(&state->ctrl_hdl); in adv7180_exit_controls()
702 if (code->index != 0) in adv7180_enum_mbus_code()
703 return -EINVAL; in adv7180_enum_mbus_code()
705 code->code = MEDIA_BUS_FMT_UYVY8_2X8; in adv7180_enum_mbus_code()
715 fmt->code = MEDIA_BUS_FMT_UYVY8_2X8; in adv7180_mbus_fmt()
716 fmt->colorspace = V4L2_COLORSPACE_SMPTE170M; in adv7180_mbus_fmt()
717 fmt->width = 720; in adv7180_mbus_fmt()
718 fmt->height = state->curr_norm & V4L2_STD_525_60 ? 480 : 576; in adv7180_mbus_fmt()
720 if (state->field == V4L2_FIELD_ALTERNATE) in adv7180_mbus_fmt()
721 fmt->height /= 2; in adv7180_mbus_fmt()
728 if (!(state->chip_info->flags & ADV7180_FLAG_I2P)) in adv7180_set_field_mode()
731 if (state->field == V4L2_FIELD_NONE) { in adv7180_set_field_mode()
732 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_field_mode()
746 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_field_mode()
770 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { in adv7180_get_pad_format()
771 format->format = *v4l2_subdev_get_try_format(sd, sd_state, 0); in adv7180_get_pad_format()
773 adv7180_mbus_fmt(sd, &format->format); in adv7180_get_pad_format()
774 format->format.field = state->field; in adv7180_get_pad_format()
788 switch (format->format.field) { in adv7180_set_pad_format()
790 if (state->chip_info->flags & ADV7180_FLAG_I2P) in adv7180_set_pad_format()
794 format->format.field = V4L2_FIELD_ALTERNATE; in adv7180_set_pad_format()
798 ret = adv7180_mbus_fmt(sd, &format->format); in adv7180_set_pad_format()
800 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) { in adv7180_set_pad_format()
801 if (state->field != format->format.field) { in adv7180_set_pad_format()
802 state->field = format->format.field; in adv7180_set_pad_format()
809 *framefmt = format->format; in adv7180_set_pad_format()
832 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_get_mbus_config()
833 cfg->type = V4L2_MBUS_CSI2_DPHY; in adv7180_get_mbus_config()
834 cfg->bus.mipi_csi2.num_data_lanes = 1; in adv7180_get_mbus_config()
835 cfg->bus.mipi_csi2.flags = 0; in adv7180_get_mbus_config()
841 cfg->bus.parallel.flags = V4L2_MBUS_MASTER | in adv7180_get_mbus_config()
844 cfg->type = V4L2_MBUS_BT656; in adv7180_get_mbus_config()
861 if (state->curr_norm & V4L2_STD_525_60) { in adv7180_g_pixelaspect()
862 aspect->numerator = 11; in adv7180_g_pixelaspect()
863 aspect->denominator = 10; in adv7180_g_pixelaspect()
865 aspect->numerator = 54; in adv7180_g_pixelaspect()
866 aspect->denominator = 59; in adv7180_g_pixelaspect()
885 state->streaming = enable; in adv7180_s_stream()
890 ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_stream()
893 state->streaming = enable; in adv7180_s_stream()
894 mutex_unlock(&state->mutex); in adv7180_s_stream()
902 switch (sub->type) { in adv7180_subscribe_event()
908 return -EINVAL; in adv7180_subscribe_event()
954 mutex_lock(&state->mutex); in adv7180_irq()
965 v4l2_subdev_notify_event(&state->sd, &src_ch); in adv7180_irq()
967 mutex_unlock(&state->mutex); in adv7180_irq()
976 /* ITU-R BT.656-4 compatible */ in adv7180_init()
990 (std << 4) | state->input); in adv7180_set_std()
1008 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) in adv7182_init()
1012 if (state->chip_info->flags & ADV7180_FLAG_I2P) in adv7182_init()
1016 if (state->chip_info->flags & ADV7180_FLAG_V2) { in adv7182_init()
1024 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7182_init()
1029 if (state->chip_info->flags & ADV7180_FLAG_V2) { in adv7182_init()
1030 if (state->force_bt656_4) { in adv7182_init()
1031 /* ITU-R BT.656-4 compatible */ in adv7182_init()
1066 (std << 4) | ADV7182_REG_INPUT_RESERVED); in adv7182_set_std()
1132 /* Reset clamp circuitry - ADI recommended writes */ in adv7182_select_input()
1149 if (state->chip_info->flags & ADV7180_FLAG_V2) in adv7182_select_input()
1177 /* We cannot discriminate between LQFP and 40-pin LFCSP, so accept
1344 mutex_lock(&state->mutex); in init_device()
1352 ret = state->chip_info->init(state); in init_device()
1363 if (state->irq > 0) { in init_device()
1391 mutex_unlock(&state->mutex); in init_device()
1399 struct device_node *np = client->dev.of_node; in adv7180_probe()
1405 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) in adv7180_probe()
1406 return -EIO; in adv7180_probe()
1408 state = devm_kzalloc(&client->dev, sizeof(*state), GFP_KERNEL); in adv7180_probe()
1410 return -ENOMEM; in adv7180_probe()
1412 state->client = client; in adv7180_probe()
1413 state->field = V4L2_FIELD_ALTERNATE; in adv7180_probe()
1414 state->chip_info = (struct adv7180_chip_info *)id->driver_data; in adv7180_probe()
1416 state->pwdn_gpio = devm_gpiod_get_optional(&client->dev, "powerdown", in adv7180_probe()
1418 if (IS_ERR(state->pwdn_gpio)) { in adv7180_probe()
1419 ret = PTR_ERR(state->pwdn_gpio); in adv7180_probe()
1424 state->rst_gpio = devm_gpiod_get_optional(&client->dev, "reset", in adv7180_probe()
1426 if (IS_ERR(state->rst_gpio)) { in adv7180_probe()
1427 ret = PTR_ERR(state->rst_gpio); in adv7180_probe()
1432 if (of_property_read_bool(np, "adv,force-bt656-4")) in adv7180_probe()
1433 state->force_bt656_4 = true; in adv7180_probe()
1435 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_probe()
1436 state->csi_client = i2c_new_dummy_device(client->adapter, in adv7180_probe()
1438 if (IS_ERR(state->csi_client)) in adv7180_probe()
1439 return PTR_ERR(state->csi_client); in adv7180_probe()
1442 if (state->chip_info->flags & ADV7180_FLAG_I2P) { in adv7180_probe()
1443 state->vpp_client = i2c_new_dummy_device(client->adapter, in adv7180_probe()
1445 if (IS_ERR(state->vpp_client)) { in adv7180_probe()
1446 ret = PTR_ERR(state->vpp_client); in adv7180_probe()
1451 state->irq = client->irq; in adv7180_probe()
1452 mutex_init(&state->mutex); in adv7180_probe()
1453 state->curr_norm = V4L2_STD_NTSC; in adv7180_probe()
1454 if (state->chip_info->flags & ADV7180_FLAG_RESET_POWERED) in adv7180_probe()
1455 state->powered = true; in adv7180_probe()
1457 state->powered = false; in adv7180_probe()
1458 state->input = 0; in adv7180_probe()
1459 sd = &state->sd; in adv7180_probe()
1461 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; in adv7180_probe()
1467 state->pad.flags = MEDIA_PAD_FL_SOURCE; in adv7180_probe()
1468 sd->entity.function = MEDIA_ENT_F_ATV_DECODER; in adv7180_probe()
1469 ret = media_entity_pads_init(&sd->entity, 1, &state->pad); in adv7180_probe()
1477 if (state->irq) { in adv7180_probe()
1478 ret = request_threaded_irq(client->irq, NULL, adv7180_irq, in adv7180_probe()
1489 mutex_lock(&state->mutex); in adv7180_probe()
1491 mutex_unlock(&state->mutex); in adv7180_probe()
1496 ret, client->addr, client->adapter->name); in adv7180_probe()
1503 if (state->irq > 0) in adv7180_probe()
1504 free_irq(client->irq, state); in adv7180_probe()
1506 media_entity_cleanup(&sd->entity); in adv7180_probe()
1510 i2c_unregister_device(state->vpp_client); in adv7180_probe()
1512 i2c_unregister_device(state->csi_client); in adv7180_probe()
1513 mutex_destroy(&state->mutex); in adv7180_probe()
1524 if (state->irq > 0) in adv7180_remove()
1525 free_irq(client->irq, state); in adv7180_remove()
1527 media_entity_cleanup(&sd->entity); in adv7180_remove()
1530 i2c_unregister_device(state->vpp_client); in adv7180_remove()
1531 i2c_unregister_device(state->csi_client); in adv7180_remove()
1536 mutex_destroy(&state->mutex); in adv7180_remove()
1545 { "adv7280-m", (kernel_ulong_t)&adv7280_m_info },
1547 { "adv7281-m", (kernel_ulong_t)&adv7281_m_info },
1548 { "adv7281-ma", (kernel_ulong_t)&adv7281_ma_info },
1550 { "adv7282-m", (kernel_ulong_t)&adv7282_m_info },
1574 ret = adv7180_set_power(state, state->powered); in adv7180_resume()
1595 { .compatible = "adi,adv7280-m", },
1597 { .compatible = "adi,adv7281-m", },
1598 { .compatible = "adi,adv7281-ma", },
1600 { .compatible = "adi,adv7282-m", },