Lines Matching +full:force +full:- +full:bt656 +full:- +full:4
1 // SPDX-License-Identifier: GPL-2.0
19 #include <media/v4l2-ioctl.h>
20 #include <media/v4l2-event.h>
21 #include <media/v4l2-device.h>
22 #include <media/v4l2-ctrls.h>
62 #define ADV7180_BRI_MIN -128
67 #define ADV7180_HUE_MIN -127
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()
476 if (fi->which != V4L2_SUBDEV_FORMAT_ACTIVE) in adv7180_get_frame_interval()
477 return -EINVAL; in adv7180_get_frame_interval()
479 if (state->curr_norm & V4L2_STD_525_60) { in adv7180_get_frame_interval()
480 fi->interval.numerator = 1001; in adv7180_get_frame_interval()
481 fi->interval.denominator = 30000; in adv7180_get_frame_interval()
483 fi->interval.numerator = 1; in adv7180_get_frame_interval()
484 fi->interval.denominator = 25; in adv7180_get_frame_interval()
492 if (!state->pwdn_gpio) in adv7180_set_power_pin()
496 gpiod_set_value_cansleep(state->pwdn_gpio, 0); in adv7180_set_power_pin()
499 gpiod_set_value_cansleep(state->pwdn_gpio, 1); in adv7180_set_power_pin()
505 if (!state->rst_gpio) in adv7180_set_reset_pin()
509 gpiod_set_value_cansleep(state->rst_gpio, 1); in adv7180_set_reset_pin()
511 gpiod_set_value_cansleep(state->rst_gpio, 0); in adv7180_set_reset_pin()
530 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_power()
537 if (state->field == V4L2_FIELD_NONE) in adv7180_set_power()
553 ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_power()
559 state->powered = on; in adv7180_s_power()
561 mutex_unlock(&state->mutex); in adv7180_s_power()
585 if (value == ARRAY_SIZE(test_pattern_menu) - 1) { in adv7180_test_pattern()
603 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_ctrl()
608 val = ctrl->val; in adv7180_s_ctrl()
609 switch (ctrl->id) { in adv7180_s_ctrl()
615 ret = adv7180_write(state, ADV7180_REG_HUE, -val); in adv7180_s_ctrl()
631 if (ctrl->val) { in adv7180_s_ctrl()
646 ret = -EINVAL; in adv7180_s_ctrl()
649 mutex_unlock(&state->mutex); in adv7180_s_ctrl()
669 v4l2_ctrl_handler_init(&state->ctrl_hdl, 4); in adv7180_init_controls()
671 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
674 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
677 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
680 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
683 v4l2_ctrl_new_custom(&state->ctrl_hdl, &adv7180_ctrl_fast_switch, NULL); in adv7180_init_controls()
685 v4l2_ctrl_new_std_menu_items(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
687 ARRAY_SIZE(test_pattern_menu) - 1, in adv7180_init_controls()
688 0, ARRAY_SIZE(test_pattern_menu) - 1, in adv7180_init_controls()
691 state->sd.ctrl_handler = &state->ctrl_hdl; in adv7180_init_controls()
692 if (state->ctrl_hdl.error) { in adv7180_init_controls()
693 int err = state->ctrl_hdl.error; in adv7180_init_controls()
695 v4l2_ctrl_handler_free(&state->ctrl_hdl); in adv7180_init_controls()
698 v4l2_ctrl_handler_setup(&state->ctrl_hdl); in adv7180_init_controls()
704 v4l2_ctrl_handler_free(&state->ctrl_hdl); in adv7180_exit_controls()
711 if (code->index != 0) in adv7180_enum_mbus_code()
712 return -EINVAL; in adv7180_enum_mbus_code()
714 code->code = MEDIA_BUS_FMT_UYVY8_2X8; in adv7180_enum_mbus_code()
724 fmt->code = MEDIA_BUS_FMT_UYVY8_2X8; in adv7180_mbus_fmt()
725 fmt->colorspace = V4L2_COLORSPACE_SMPTE170M; in adv7180_mbus_fmt()
726 fmt->width = 720; in adv7180_mbus_fmt()
727 fmt->height = state->curr_norm & V4L2_STD_525_60 ? 480 : 576; in adv7180_mbus_fmt()
729 if (state->field == V4L2_FIELD_ALTERNATE) in adv7180_mbus_fmt()
730 fmt->height /= 2; in adv7180_mbus_fmt()
737 if (!(state->chip_info->flags & ADV7180_FLAG_I2P)) in adv7180_set_field_mode()
740 if (state->field == V4L2_FIELD_NONE) { in adv7180_set_field_mode()
741 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_field_mode()
755 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_field_mode()
779 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { in adv7180_get_pad_format()
780 format->format = *v4l2_subdev_state_get_format(sd_state, 0); in adv7180_get_pad_format()
782 adv7180_mbus_fmt(sd, &format->format); in adv7180_get_pad_format()
783 format->format.field = state->field; in adv7180_get_pad_format()
797 switch (format->format.field) { in adv7180_set_pad_format()
799 if (state->chip_info->flags & ADV7180_FLAG_I2P) in adv7180_set_pad_format()
803 format->format.field = V4L2_FIELD_ALTERNATE; in adv7180_set_pad_format()
807 ret = adv7180_mbus_fmt(sd, &format->format); in adv7180_set_pad_format()
809 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) { in adv7180_set_pad_format()
810 if (state->field != format->format.field) { in adv7180_set_pad_format()
811 state->field = format->format.field; in adv7180_set_pad_format()
818 *framefmt = format->format; in adv7180_set_pad_format()
841 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_get_mbus_config()
842 cfg->type = V4L2_MBUS_CSI2_DPHY; in adv7180_get_mbus_config()
843 cfg->bus.mipi_csi2.num_data_lanes = 1; in adv7180_get_mbus_config()
844 cfg->bus.mipi_csi2.flags = 0; in adv7180_get_mbus_config()
850 cfg->bus.parallel.flags = V4L2_MBUS_MASTER | in adv7180_get_mbus_config()
853 cfg->type = V4L2_MBUS_BT656; in adv7180_get_mbus_config()
870 if (state->curr_norm & V4L2_STD_525_60) { in adv7180_g_pixelaspect()
871 aspect->numerator = 11; in adv7180_g_pixelaspect()
872 aspect->denominator = 10; in adv7180_g_pixelaspect()
874 aspect->numerator = 54; in adv7180_g_pixelaspect()
875 aspect->denominator = 59; in adv7180_g_pixelaspect()
894 state->streaming = enable; in adv7180_s_stream()
899 ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_stream()
902 state->streaming = enable; in adv7180_s_stream()
903 mutex_unlock(&state->mutex); in adv7180_s_stream()
911 switch (sub->type) { in adv7180_subscribe_event()
917 return -EINVAL; in adv7180_subscribe_event()
966 mutex_lock(&state->mutex); in adv7180_irq()
977 v4l2_subdev_notify_event(&state->sd, &src_ch); in adv7180_irq()
979 mutex_unlock(&state->mutex); in adv7180_irq()
988 /* ITU-R BT.656-4 compatible */ in adv7180_init()
1002 (std << 4) | state->input); in adv7180_set_std()
1020 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) in adv7182_init()
1024 if (state->chip_info->flags & ADV7180_FLAG_I2P) in adv7182_init()
1028 if (state->chip_info->flags & ADV7180_FLAG_V2) { in adv7182_init()
1036 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7182_init()
1041 if (state->chip_info->flags & ADV7180_FLAG_V2) { in adv7182_init()
1042 if (state->force_bt656_4) { in adv7182_init()
1043 /* ITU-R BT.656-4 compatible */ in adv7182_init()
1078 (std << 4) | ADV7182_REG_INPUT_RESERVED); in adv7182_set_std()
1144 /* Reset clamp circuitry - ADI recommended writes */ in adv7182_select_input()
1161 if (state->chip_info->flags & ADV7180_FLAG_V2) in adv7182_select_input()
1189 /* We cannot discriminate between LQFP and 40-pin LFCSP, so accept
1356 mutex_lock(&state->mutex); in init_device()
1364 ret = state->chip_info->init(state); in init_device()
1375 if (state->irq > 0) { in init_device()
1403 mutex_unlock(&state->mutex); in init_device()
1410 struct device_node *np = client->dev.of_node; in adv7180_probe()
1416 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) in adv7180_probe()
1417 return -EIO; in adv7180_probe()
1419 state = devm_kzalloc(&client->dev, sizeof(*state), GFP_KERNEL); in adv7180_probe()
1421 return -ENOMEM; in adv7180_probe()
1423 state->client = client; in adv7180_probe()
1424 state->field = V4L2_FIELD_ALTERNATE; in adv7180_probe()
1425 state->chip_info = i2c_get_match_data(client); in adv7180_probe()
1427 state->pwdn_gpio = devm_gpiod_get_optional(&client->dev, "powerdown", in adv7180_probe()
1429 if (IS_ERR(state->pwdn_gpio)) { in adv7180_probe()
1430 ret = PTR_ERR(state->pwdn_gpio); in adv7180_probe()
1435 state->rst_gpio = devm_gpiod_get_optional(&client->dev, "reset", in adv7180_probe()
1437 if (IS_ERR(state->rst_gpio)) { in adv7180_probe()
1438 ret = PTR_ERR(state->rst_gpio); in adv7180_probe()
1443 if (of_property_read_bool(np, "adv,force-bt656-4") || in adv7180_probe()
1444 of_property_read_bool(np, "adi,force-bt656-4")) in adv7180_probe()
1445 state->force_bt656_4 = true; in adv7180_probe()
1447 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_probe()
1448 state->csi_client = i2c_new_dummy_device(client->adapter, in adv7180_probe()
1450 if (IS_ERR(state->csi_client)) in adv7180_probe()
1451 return PTR_ERR(state->csi_client); in adv7180_probe()
1454 if (state->chip_info->flags & ADV7180_FLAG_I2P) { in adv7180_probe()
1455 state->vpp_client = i2c_new_dummy_device(client->adapter, in adv7180_probe()
1457 if (IS_ERR(state->vpp_client)) { in adv7180_probe()
1458 ret = PTR_ERR(state->vpp_client); in adv7180_probe()
1463 state->irq = client->irq; in adv7180_probe()
1464 mutex_init(&state->mutex); in adv7180_probe()
1465 state->curr_norm = V4L2_STD_NTSC; in adv7180_probe()
1466 if (state->chip_info->flags & ADV7180_FLAG_RESET_POWERED) in adv7180_probe()
1467 state->powered = true; in adv7180_probe()
1469 state->powered = false; in adv7180_probe()
1470 state->input = 0; in adv7180_probe()
1471 sd = &state->sd; in adv7180_probe()
1473 sd->internal_ops = &adv7180_internal_ops; in adv7180_probe()
1474 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; in adv7180_probe()
1480 state->pad.flags = MEDIA_PAD_FL_SOURCE; in adv7180_probe()
1481 sd->entity.function = MEDIA_ENT_F_ATV_DECODER; in adv7180_probe()
1482 ret = media_entity_pads_init(&sd->entity, 1, &state->pad); in adv7180_probe()
1490 if (state->irq > 0) { in adv7180_probe()
1491 ret = request_threaded_irq(client->irq, NULL, adv7180_irq, in adv7180_probe()
1502 mutex_lock(&state->mutex); in adv7180_probe()
1504 mutex_unlock(&state->mutex); in adv7180_probe()
1509 ret, client->addr, client->adapter->name); in adv7180_probe()
1516 if (state->irq > 0) in adv7180_probe()
1517 free_irq(client->irq, state); in adv7180_probe()
1519 media_entity_cleanup(&sd->entity); in adv7180_probe()
1523 i2c_unregister_device(state->vpp_client); in adv7180_probe()
1525 i2c_unregister_device(state->csi_client); in adv7180_probe()
1526 mutex_destroy(&state->mutex); in adv7180_probe()
1537 if (state->irq > 0) in adv7180_remove()
1538 free_irq(client->irq, state); in adv7180_remove()
1540 media_entity_cleanup(&sd->entity); in adv7180_remove()
1543 i2c_unregister_device(state->vpp_client); in adv7180_remove()
1544 i2c_unregister_device(state->csi_client); in adv7180_remove()
1549 mutex_destroy(&state->mutex); in adv7180_remove()
1571 ret = adv7180_set_power(state, state->powered); in adv7180_resume()
1591 { "adv7280-m", (kernel_ulong_t)&adv7280_m_info },
1593 { "adv7281-m", (kernel_ulong_t)&adv7281_m_info },
1594 { "adv7281-ma", (kernel_ulong_t)&adv7281_ma_info },
1596 { "adv7282-m", (kernel_ulong_t)&adv7282_m_info },
1607 { .compatible = "adi,adv7280-m", &adv7280_m_info },
1609 { .compatible = "adi,adv7281-m", &adv7281_m_info },
1610 { .compatible = "adi,adv7281-ma", &adv7281_ma_info },
1612 { .compatible = "adi,adv7282-m", &adv7282_m_info },