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>
60 #define ADV7180_BRI_MIN -128
65 #define ADV7180_HUE_MIN -127
223 #define to_adv7180_sd(_ctrl) (&container_of(_ctrl->handler, \
225 ctrl_hdl)->sd)
229 if (state->register_page != page) { in adv7180_select_page()
230 i2c_smbus_write_byte_data(state->client, ADV7180_REG_CTRL, in adv7180_select_page()
232 state->register_page = page; in adv7180_select_page()
241 lockdep_assert_held(&state->mutex); in adv7180_write()
243 return i2c_smbus_write_byte_data(state->client, reg & 0xff, value); in adv7180_write()
248 lockdep_assert_held(&state->mutex); in adv7180_read()
250 return i2c_smbus_read_byte_data(state->client, reg & 0xff); in adv7180_read()
256 return i2c_smbus_write_byte_data(state->csi_client, reg, value); in adv7180_csi_write()
262 return state->chip_info->set_std(state, std); in adv7180_set_video_standard()
268 return i2c_smbus_write_byte_data(state->vpp_client, reg, value); in adv7180_vpp_write()
319 return -EINVAL; in v4l2_std_to_adv7180()
354 int err = mutex_lock_interruptible(&state->mutex); in adv7180_querystd()
358 if (state->streaming) { in adv7180_querystd()
359 err = -EBUSY; in adv7180_querystd()
371 err = v4l2_std_to_adv7180(state->curr_norm); in adv7180_querystd()
378 mutex_unlock(&state->mutex); in adv7180_querystd()
386 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_routing()
391 if (input > 31 || !(BIT(input) & state->chip_info->valid_input_mask)) { in adv7180_s_routing()
392 ret = -EINVAL; in adv7180_s_routing()
396 ret = state->chip_info->select_input(state, input); in adv7180_s_routing()
399 state->input = input; in adv7180_s_routing()
401 mutex_unlock(&state->mutex); in adv7180_s_routing()
408 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_g_input_status()
413 mutex_unlock(&state->mutex); in adv7180_g_input_status()
421 ret = v4l2_std_to_adv7180(state->curr_norm); in adv7180_program_std()
434 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_std()
444 state->curr_norm = std; in adv7180_s_std()
448 mutex_unlock(&state->mutex); in adv7180_s_std()
456 *norm = state->curr_norm; in adv7180_g_std()
466 if (state->curr_norm & V4L2_STD_525_60) { in adv7180_g_frame_interval()
467 fi->interval.numerator = 1001; in adv7180_g_frame_interval()
468 fi->interval.denominator = 30000; in adv7180_g_frame_interval()
470 fi->interval.numerator = 1; in adv7180_g_frame_interval()
471 fi->interval.denominator = 25; in adv7180_g_frame_interval()
479 if (!state->pwdn_gpio) in adv7180_set_power_pin()
483 gpiod_set_value_cansleep(state->pwdn_gpio, 0); in adv7180_set_power_pin()
486 gpiod_set_value_cansleep(state->pwdn_gpio, 1); in adv7180_set_power_pin()
492 if (!state->rst_gpio) in adv7180_set_reset_pin()
496 gpiod_set_value_cansleep(state->rst_gpio, 1); in adv7180_set_reset_pin()
498 gpiod_set_value_cansleep(state->rst_gpio, 0); in adv7180_set_reset_pin()
517 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_power()
524 if (state->field == V4L2_FIELD_NONE) in adv7180_set_power()
540 ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_power()
546 state->powered = on; in adv7180_s_power()
548 mutex_unlock(&state->mutex); in adv7180_s_power()
556 int ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_ctrl()
561 val = ctrl->val; in adv7180_s_ctrl()
562 switch (ctrl->id) { in adv7180_s_ctrl()
568 ret = adv7180_write(state, ADV7180_REG_HUE, -val); in adv7180_s_ctrl()
584 if (ctrl->val) { in adv7180_s_ctrl()
596 ret = -EINVAL; in adv7180_s_ctrl()
599 mutex_unlock(&state->mutex); in adv7180_s_ctrl()
619 v4l2_ctrl_handler_init(&state->ctrl_hdl, 4); in adv7180_init_controls()
621 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
624 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
627 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
630 v4l2_ctrl_new_std(&state->ctrl_hdl, &adv7180_ctrl_ops, in adv7180_init_controls()
633 v4l2_ctrl_new_custom(&state->ctrl_hdl, &adv7180_ctrl_fast_switch, NULL); in adv7180_init_controls()
635 state->sd.ctrl_handler = &state->ctrl_hdl; in adv7180_init_controls()
636 if (state->ctrl_hdl.error) { in adv7180_init_controls()
637 int err = state->ctrl_hdl.error; in adv7180_init_controls()
639 v4l2_ctrl_handler_free(&state->ctrl_hdl); in adv7180_init_controls()
642 v4l2_ctrl_handler_setup(&state->ctrl_hdl); in adv7180_init_controls()
648 v4l2_ctrl_handler_free(&state->ctrl_hdl); in adv7180_exit_controls()
655 if (code->index != 0) in adv7180_enum_mbus_code()
656 return -EINVAL; in adv7180_enum_mbus_code()
658 code->code = MEDIA_BUS_FMT_UYVY8_2X8; in adv7180_enum_mbus_code()
668 fmt->code = MEDIA_BUS_FMT_UYVY8_2X8; in adv7180_mbus_fmt()
669 fmt->colorspace = V4L2_COLORSPACE_SMPTE170M; in adv7180_mbus_fmt()
670 fmt->width = 720; in adv7180_mbus_fmt()
671 fmt->height = state->curr_norm & V4L2_STD_525_60 ? 480 : 576; in adv7180_mbus_fmt()
673 if (state->field == V4L2_FIELD_ALTERNATE) in adv7180_mbus_fmt()
674 fmt->height /= 2; in adv7180_mbus_fmt()
681 if (!(state->chip_info->flags & ADV7180_FLAG_I2P)) in adv7180_set_field_mode()
684 if (state->field == V4L2_FIELD_NONE) { in adv7180_set_field_mode()
685 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_field_mode()
699 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_set_field_mode()
723 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { in adv7180_get_pad_format()
724 format->format = *v4l2_subdev_get_try_format(sd, sd_state, 0); in adv7180_get_pad_format()
726 adv7180_mbus_fmt(sd, &format->format); in adv7180_get_pad_format()
727 format->format.field = state->field; in adv7180_get_pad_format()
741 switch (format->format.field) { in adv7180_set_pad_format()
743 if (state->chip_info->flags & ADV7180_FLAG_I2P) in adv7180_set_pad_format()
747 format->format.field = V4L2_FIELD_ALTERNATE; in adv7180_set_pad_format()
751 ret = adv7180_mbus_fmt(sd, &format->format); in adv7180_set_pad_format()
753 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) { in adv7180_set_pad_format()
754 if (state->field != format->format.field) { in adv7180_set_pad_format()
755 state->field = format->format.field; in adv7180_set_pad_format()
762 *framefmt = format->format; in adv7180_set_pad_format()
785 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_get_mbus_config()
786 cfg->type = V4L2_MBUS_CSI2_DPHY; in adv7180_get_mbus_config()
787 cfg->flags = V4L2_MBUS_CSI2_1_LANE | in adv7180_get_mbus_config()
795 cfg->flags = V4L2_MBUS_MASTER | V4L2_MBUS_PCLK_SAMPLE_RISING | in adv7180_get_mbus_config()
797 cfg->type = V4L2_MBUS_BT656; in adv7180_get_mbus_config()
814 if (state->curr_norm & V4L2_STD_525_60) { in adv7180_g_pixelaspect()
815 aspect->numerator = 11; in adv7180_g_pixelaspect()
816 aspect->denominator = 10; in adv7180_g_pixelaspect()
818 aspect->numerator = 54; in adv7180_g_pixelaspect()
819 aspect->denominator = 59; in adv7180_g_pixelaspect()
838 state->streaming = enable; in adv7180_s_stream()
843 ret = mutex_lock_interruptible(&state->mutex); in adv7180_s_stream()
846 state->streaming = enable; in adv7180_s_stream()
847 mutex_unlock(&state->mutex); in adv7180_s_stream()
855 switch (sub->type) { in adv7180_subscribe_event()
861 return -EINVAL; in adv7180_subscribe_event()
907 mutex_lock(&state->mutex); in adv7180_irq()
918 v4l2_subdev_notify_event(&state->sd, &src_ch); in adv7180_irq()
920 mutex_unlock(&state->mutex); in adv7180_irq()
929 /* ITU-R BT.656-4 compatible */ in adv7180_init()
943 (std << 4) | state->input); in adv7180_set_std()
961 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) in adv7182_init()
965 if (state->chip_info->flags & ADV7180_FLAG_I2P) in adv7182_init()
969 if (state->chip_info->flags & ADV7180_FLAG_V2) { in adv7182_init()
977 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7182_init()
982 if (state->chip_info->flags & ADV7180_FLAG_V2) { in adv7182_init()
983 if (state->force_bt656_4) { in adv7182_init()
984 /* ITU-R BT.656-4 compatible */ in adv7182_init()
1017 return adv7180_write(state, ADV7182_REG_INPUT_VIDSEL, std << 4); in adv7182_set_std()
1083 /* Reset clamp circuitry - ADI recommended writes */ in adv7182_select_input()
1100 if (state->chip_info->flags & ADV7180_FLAG_V2) in adv7182_select_input()
1128 /* We cannot discriminate between LQFP and 40-pin LFCSP, so accept
1295 mutex_lock(&state->mutex); in init_device()
1303 ret = state->chip_info->init(state); in init_device()
1314 if (state->irq > 0) { in init_device()
1342 mutex_unlock(&state->mutex); in init_device()
1350 struct device_node *np = client->dev.of_node; in adv7180_probe()
1356 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) in adv7180_probe()
1357 return -EIO; in adv7180_probe()
1359 state = devm_kzalloc(&client->dev, sizeof(*state), GFP_KERNEL); in adv7180_probe()
1361 return -ENOMEM; in adv7180_probe()
1363 state->client = client; in adv7180_probe()
1364 state->field = V4L2_FIELD_ALTERNATE; in adv7180_probe()
1365 state->chip_info = (struct adv7180_chip_info *)id->driver_data; in adv7180_probe()
1367 state->pwdn_gpio = devm_gpiod_get_optional(&client->dev, "powerdown", in adv7180_probe()
1369 if (IS_ERR(state->pwdn_gpio)) { in adv7180_probe()
1370 ret = PTR_ERR(state->pwdn_gpio); in adv7180_probe()
1375 state->rst_gpio = devm_gpiod_get_optional(&client->dev, "reset", in adv7180_probe()
1377 if (IS_ERR(state->rst_gpio)) { in adv7180_probe()
1378 ret = PTR_ERR(state->rst_gpio); in adv7180_probe()
1383 if (of_property_read_bool(np, "adv,force-bt656-4")) in adv7180_probe()
1384 state->force_bt656_4 = true; in adv7180_probe()
1386 if (state->chip_info->flags & ADV7180_FLAG_MIPI_CSI2) { in adv7180_probe()
1387 state->csi_client = i2c_new_dummy_device(client->adapter, in adv7180_probe()
1389 if (IS_ERR(state->csi_client)) in adv7180_probe()
1390 return PTR_ERR(state->csi_client); in adv7180_probe()
1393 if (state->chip_info->flags & ADV7180_FLAG_I2P) { in adv7180_probe()
1394 state->vpp_client = i2c_new_dummy_device(client->adapter, in adv7180_probe()
1396 if (IS_ERR(state->vpp_client)) { in adv7180_probe()
1397 ret = PTR_ERR(state->vpp_client); in adv7180_probe()
1402 state->irq = client->irq; in adv7180_probe()
1403 mutex_init(&state->mutex); in adv7180_probe()
1404 state->curr_norm = V4L2_STD_NTSC; in adv7180_probe()
1405 if (state->chip_info->flags & ADV7180_FLAG_RESET_POWERED) in adv7180_probe()
1406 state->powered = true; in adv7180_probe()
1408 state->powered = false; in adv7180_probe()
1409 state->input = 0; in adv7180_probe()
1410 sd = &state->sd; in adv7180_probe()
1412 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; in adv7180_probe()
1418 state->pad.flags = MEDIA_PAD_FL_SOURCE; in adv7180_probe()
1419 sd->entity.function = MEDIA_ENT_F_ATV_DECODER; in adv7180_probe()
1420 ret = media_entity_pads_init(&sd->entity, 1, &state->pad); in adv7180_probe()
1428 if (state->irq) { in adv7180_probe()
1429 ret = request_threaded_irq(client->irq, NULL, adv7180_irq, in adv7180_probe()
1440 mutex_lock(&state->mutex); in adv7180_probe()
1442 mutex_unlock(&state->mutex); in adv7180_probe()
1447 ret, client->addr, client->adapter->name); in adv7180_probe()
1454 if (state->irq > 0) in adv7180_probe()
1455 free_irq(client->irq, state); in adv7180_probe()
1457 media_entity_cleanup(&sd->entity); in adv7180_probe()
1461 i2c_unregister_device(state->vpp_client); in adv7180_probe()
1463 i2c_unregister_device(state->csi_client); in adv7180_probe()
1464 mutex_destroy(&state->mutex); in adv7180_probe()
1475 if (state->irq > 0) in adv7180_remove()
1476 free_irq(client->irq, state); in adv7180_remove()
1478 media_entity_cleanup(&sd->entity); in adv7180_remove()
1481 i2c_unregister_device(state->vpp_client); in adv7180_remove()
1482 i2c_unregister_device(state->csi_client); in adv7180_remove()
1487 mutex_destroy(&state->mutex); in adv7180_remove()
1498 { "adv7280-m", (kernel_ulong_t)&adv7280_m_info },
1500 { "adv7281-m", (kernel_ulong_t)&adv7281_m_info },
1501 { "adv7281-ma", (kernel_ulong_t)&adv7281_ma_info },
1503 { "adv7282-m", (kernel_ulong_t)&adv7282_m_info },
1527 ret = adv7180_set_power(state, state->powered); in adv7180_resume()
1548 { .compatible = "adi,adv7280-m", },
1550 { .compatible = "adi,adv7281-m", },
1551 { .compatible = "adi,adv7281-ma", },
1553 { .compatible = "adi,adv7282-m", },