Lines Matching +full:bridge +full:- +full:enable

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2018-2019, Artem Mygaiev
10 #include <linux/media-bus-format.h>
30 #include <sound/hdmi-codec.h>
299 struct drm_bridge bridge; member
341 gpiod_set_value(ctx->gpio_reset, 1); in it66121_hw_reset()
343 gpiod_set_value(ctx->gpio_reset, 0); in it66121_hw_reset()
348 return regmap_write(ctx->regmap, IT66121_MASTER_SEL_REG, IT66121_MASTER_SEL_HOST); in it66121_preamble_ddc()
353 return regmap_write(ctx->regmap, IT66121_AFE_DRV_REG, 0); in it66121_fire_afe()
362 if (ctx->bus_width == 12) in it66121_configure_input()
365 ret = regmap_write(ctx->regmap, IT66121_INPUT_MODE_REG, mode); in it66121_configure_input()
369 return regmap_write(ctx->regmap, IT66121_INPUT_CSC_REG, IT66121_INPUT_CSC_NO_CONV); in it66121_configure_input()
373 * it66121_configure_afe() - Configure the analog front end
385 ret = regmap_write(ctx->regmap, IT66121_AFE_DRV_REG, in it66121_configure_afe()
390 if (mode->clock > IT66121_AFE_CLK_HIGH) { in it66121_configure_afe()
391 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, in it66121_configure_afe()
398 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, in it66121_configure_afe()
405 if (ctx->info->id == ID_IT66121) { in it66121_configure_afe()
406 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, in it66121_configure_afe()
411 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_EC1_REG, in it66121_configure_afe()
417 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, in it66121_configure_afe()
424 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, in it66121_configure_afe()
431 if (ctx->info->id == ID_IT66121) { in it66121_configure_afe()
432 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, in it66121_configure_afe()
438 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_EC1_REG, in it66121_configure_afe()
447 ret = regmap_write_bits(ctx->regmap, IT66121_SW_RST_REG, in it66121_configure_afe()
452 if (ctx->info->id == ID_IT6610) { in it66121_configure_afe()
453 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, in it66121_configure_afe()
470 ret = regmap_read_poll_timeout(ctx->regmap, IT66121_DDC_STATUS_REG, val, in it66121_wait_ddc_ready()
477 return -EAGAIN; in it66121_wait_ddc_ready()
487 ret = regmap_read(ctx->regmap, IT66121_SW_RST_REG, &swreset); in it66121_abort_ddc_ops()
491 ret = regmap_read(ctx->regmap, IT66121_HDCP_REG, &cpdesire); in it66121_abort_ddc_ops()
495 ret = regmap_write(ctx->regmap, IT66121_HDCP_REG, in it66121_abort_ddc_ops()
500 ret = regmap_write(ctx->regmap, IT66121_SW_RST_REG, in it66121_abort_ddc_ops()
509 ret = regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, in it66121_abort_ddc_ops()
532 ret = regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, in it66121_get_edid_block()
541 ret = regmap_write(ctx->regmap, IT66121_DDC_OFFSET_REG, offset); in it66121_get_edid_block()
545 ret = regmap_write(ctx->regmap, IT66121_DDC_BYTE_REG, cnt); in it66121_get_edid_block()
549 ret = regmap_write(ctx->regmap, IT66121_DDC_SEGMENT_REG, block); in it66121_get_edid_block()
553 ret = regmap_write(ctx->regmap, IT66121_DDC_COMMAND_REG, in it66121_get_edid_block()
559 remain -= cnt; in it66121_get_edid_block()
567 ret = regmap_noinc_read(ctx->regmap, IT66121_DDC_RD_FIFO_REG, in it66121_get_edid_block()
582 if (regmap_read(ctx->regmap, IT66121_SYS_STATUS_REG, &val)) in it66121_is_hpd_detect()
588 static int it66121_bridge_attach(struct drm_bridge *bridge, in it66121_bridge_attach() argument
591 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_attach()
595 return -EINVAL; in it66121_bridge_attach()
597 ret = drm_bridge_attach(bridge->encoder, ctx->next_bridge, bridge, flags); in it66121_bridge_attach()
601 if (ctx->info->id == ID_IT66121) { in it66121_bridge_attach()
602 ret = regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG, in it66121_bridge_attach()
608 ret = regmap_write_bits(ctx->regmap, IT66121_INT_REG, in it66121_bridge_attach()
613 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_DRV_REG, in it66121_bridge_attach()
618 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, in it66121_bridge_attach()
623 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, in it66121_bridge_attach()
628 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_DRV_REG, in it66121_bridge_attach()
633 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_XP_REG, in it66121_bridge_attach()
638 ret = regmap_write_bits(ctx->regmap, IT66121_AFE_IP_REG, in it66121_bridge_attach()
643 ret = regmap_write_bits(ctx->regmap, IT66121_SW_RST_REG, in it66121_bridge_attach()
649 /* Per programming manual, sleep here for bridge to settle */ in it66121_bridge_attach()
663 ret = regmap_write_bits(ctx->regmap, IT66121_AV_MUTE_REG, IT66121_AV_MUTE_ON, val); in it66121_set_mute()
667 return regmap_write(ctx->regmap, IT66121_PKT_GEN_CTRL_REG, in it66121_set_mute()
673 static u32 *it66121_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge, in it66121_bridge_atomic_get_output_bus_fmts() argument
695 static u32 *it66121_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge, in it66121_bridge_atomic_get_input_bus_fmts() argument
702 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_atomic_get_input_bus_fmts()
712 if (ctx->bus_width == 12) in it66121_bridge_atomic_get_input_bus_fmts()
713 /* IT66121FN Datasheet specifies Little-Endian ordering */ in it66121_bridge_atomic_get_input_bus_fmts()
723 static void it66121_bridge_enable(struct drm_bridge *bridge, in it66121_bridge_enable() argument
726 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_enable()
728 ctx->connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder); in it66121_bridge_enable()
733 static void it66121_bridge_disable(struct drm_bridge *bridge, in it66121_bridge_disable() argument
736 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_disable()
740 ctx->connector = NULL; in it66121_bridge_disable()
743 static int it66121_bridge_check(struct drm_bridge *bridge, in it66121_bridge_check() argument
748 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_check()
750 if (ctx->info->id == ID_IT6610) { in it66121_bridge_check()
752 bridge_state->input_bus_cfg.flags |= DRM_BUS_FLAG_DE_HIGH | in it66121_bridge_check()
754 bridge_state->input_bus_cfg.flags &= in it66121_bridge_check()
762 void it66121_bridge_mode_set(struct drm_bridge *bridge, in it66121_bridge_mode_set() argument
767 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_mode_set()
770 mutex_lock(&ctx->lock); in it66121_bridge_mode_set()
772 ret = drm_hdmi_avi_infoframe_from_display_mode(&ctx->hdmi_avi_infoframe, ctx->connector, in it66121_bridge_mode_set()
779 ret = hdmi_avi_infoframe_pack(&ctx->hdmi_avi_infoframe, buf, sizeof(buf)); in it66121_bridge_mode_set()
786 ret = regmap_bulk_write(ctx->regmap, IT66121_AVIINFO_DB1_REG, in it66121_bridge_mode_set()
792 if (regmap_write(ctx->regmap, IT66121_AVIINFO_CSUM_REG, buf[3])) in it66121_bridge_mode_set()
795 /* Enable AVI infoframe */ in it66121_bridge_mode_set()
796 if (regmap_write(ctx->regmap, IT66121_AVI_INFO_PKT_REG, in it66121_bridge_mode_set()
801 if (regmap_write(ctx->regmap, IT66121_HDMI_MODE_REG, IT66121_HDMI_MODE_HDMI)) in it66121_bridge_mode_set()
804 if (ctx->info->id == ID_IT66121 && in it66121_bridge_mode_set()
805 regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG, in it66121_bridge_mode_set()
817 if (ctx->info->id == ID_IT66121 && in it66121_bridge_mode_set()
818 regmap_write_bits(ctx->regmap, IT66121_CLK_BANK_REG, in it66121_bridge_mode_set()
824 mutex_unlock(&ctx->lock); in it66121_bridge_mode_set()
827 static enum drm_mode_status it66121_bridge_mode_valid(struct drm_bridge *bridge, in it66121_bridge_mode_valid() argument
831 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_mode_valid()
834 max_clock = (ctx->bus_width == 12) ? 74250 : 148500; in it66121_bridge_mode_valid()
836 if (mode->clock > max_clock) in it66121_bridge_mode_valid()
839 if (mode->clock < 25000) in it66121_bridge_mode_valid()
845 static enum drm_connector_status it66121_bridge_detect(struct drm_bridge *bridge) in it66121_bridge_detect() argument
847 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_detect()
853 static void it66121_bridge_hpd_enable(struct drm_bridge *bridge) in it66121_bridge_hpd_enable() argument
855 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_hpd_enable()
858 ret = regmap_write_bits(ctx->regmap, IT66121_INT_MASK1_REG, IT66121_INT_MASK1_HPD, 0); in it66121_bridge_hpd_enable()
860 dev_err(ctx->dev, "failed to enable HPD IRQ\n"); in it66121_bridge_hpd_enable()
863 static void it66121_bridge_hpd_disable(struct drm_bridge *bridge) in it66121_bridge_hpd_disable() argument
865 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_hpd_disable()
868 ret = regmap_write_bits(ctx->regmap, IT66121_INT_MASK1_REG, in it66121_bridge_hpd_disable()
871 dev_err(ctx->dev, "failed to disable HPD IRQ\n"); in it66121_bridge_hpd_disable()
874 static const struct drm_edid *it66121_bridge_edid_read(struct drm_bridge *bridge, in it66121_bridge_edid_read() argument
877 struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); in it66121_bridge_edid_read()
881 mutex_lock(&ctx->lock); in it66121_bridge_edid_read()
888 ret = regmap_write(ctx->regmap, IT66121_DDC_HEADER_REG, in it66121_bridge_edid_read()
898 mutex_unlock(&ctx->lock); in it66121_bridge_edid_read()
926 struct device *dev = ctx->dev; in it66121_irq_threaded_handler()
930 mutex_lock(&ctx->lock); in it66121_irq_threaded_handler()
932 ret = regmap_read(ctx->regmap, IT66121_SYS_STATUS_REG, &val); in it66121_irq_threaded_handler()
939 ret = regmap_read(ctx->regmap, IT66121_INT_STATUS1_REG, &val); in it66121_irq_threaded_handler()
943 regmap_write_bits(ctx->regmap, IT66121_INT_CLR1_REG, in it66121_irq_threaded_handler()
952 regmap_write_bits(ctx->regmap, IT66121_SYS_STATUS_REG, in it66121_irq_threaded_handler()
957 mutex_unlock(&ctx->lock); in it66121_irq_threaded_handler()
960 drm_bridge_hpd_notify(&ctx->bridge, status); in it66121_irq_threaded_handler()
969 ret = regmap_write(ctx->regmap, IT66121_AUD_CHST_MODE_REG, iec60958_chstat[0] & 0x7C); in it661221_set_chstat()
973 ret = regmap_write(ctx->regmap, IT66121_AUD_CHST_CAT_REG, iec60958_chstat[1]); in it661221_set_chstat()
977 ret = regmap_write(ctx->regmap, IT66121_AUD_CHST_SRCNUM_REG, iec60958_chstat[2] & 0x0F); in it661221_set_chstat()
981 ret = regmap_write(ctx->regmap, IT66121_AUD_CHST_CHTNUM_REG, in it661221_set_chstat()
986 ret = regmap_write(ctx->regmap, IT66121_AUD_CHST_CA_FS_REG, iec60958_chstat[3]); in it661221_set_chstat()
990 return regmap_write(ctx->regmap, IT66121_AUD_CHST_OFS_WL_REG, iec60958_chstat[4]); in it661221_set_chstat()
1036 ctx->audio.ch_enable = audio_enable; in it661221_set_lpcm_audio()
1038 ret = regmap_write(ctx->regmap, IT66121_AUD_CTRL0_REG, audio_enable & 0xF0); in it661221_set_lpcm_audio()
1042 ret = regmap_write(ctx->regmap, IT66121_AUD_CTRL1_REG, audio_format); in it661221_set_lpcm_audio()
1046 ret = regmap_write(ctx->regmap, IT66121_AUD_FIFOMAP_REG, 0xE4); in it661221_set_lpcm_audio()
1050 ret = regmap_write(ctx->regmap, IT66121_AUD_CTRL3_REG, 0x00); in it661221_set_lpcm_audio()
1054 ret = regmap_write(ctx->regmap, IT66121_AUD_SRCVALID_FLAT_REG, 0x00); in it661221_set_lpcm_audio()
1058 return regmap_write(ctx->regmap, IT66121_AUD_HDAUDIO_REG, 0x00); in it661221_set_lpcm_audio()
1096 ret = regmap_write(ctx->regmap, IT66121_AUD_PKT_N0_REG, (u8)((n) & 0xFF)); in it661221_set_ncts()
1100 ret = regmap_write(ctx->regmap, IT66121_AUD_PKT_N1_REG, (u8)((n >> 8) & 0xFF)); in it661221_set_ncts()
1104 ret = regmap_write(ctx->regmap, IT66121_AUD_PKT_N2_REG, (u8)((n >> 16) & 0xF)); in it661221_set_ncts()
1108 if (ctx->audio.auto_cts) { in it661221_set_ncts()
1117 while (loop_cnt--) { in it661221_set_ncts()
1119 regmap_read(ctx->regmap, IT66121_AUD_PKT_CTS_CNT2_REG, &val); in it661221_set_ncts()
1121 regmap_read(ctx->regmap, IT66121_AUD_PKT_CTS_CNT1_REG, &val); in it661221_set_ncts()
1123 regmap_read(ctx->regmap, IT66121_AUD_PKT_CTS_CNT0_REG, &val); in it661221_set_ncts()
1129 diff = last_cts - cts; in it661221_set_ncts()
1131 diff = cts - last_cts; in it661221_set_ncts()
1149 regmap_write(ctx->regmap, IT66121_AUD_PKT_CTS0_REG, (u8)((last_cts) & 0xFF)); in it661221_set_ncts()
1150 regmap_write(ctx->regmap, IT66121_AUD_PKT_CTS1_REG, (u8)((last_cts >> 8) & 0xFF)); in it661221_set_ncts()
1151 regmap_write(ctx->regmap, IT66121_AUD_PKT_CTS2_REG, (u8)((last_cts >> 16) & 0x0F)); in it661221_set_ncts()
1154 ret = regmap_write(ctx->regmap, 0xF8, 0xC3); in it661221_set_ncts()
1158 ret = regmap_write(ctx->regmap, 0xF8, 0xA5); in it661221_set_ncts()
1162 if (ctx->audio.auto_cts) { in it661221_set_ncts()
1163 ret = regmap_write_bits(ctx->regmap, IT66121_PKT_CTS_CTRL_REG, in it661221_set_ncts()
1167 ret = regmap_write_bits(ctx->regmap, IT66121_PKT_CTS_CTRL_REG, in it661221_set_ncts()
1175 return regmap_write(ctx->regmap, 0xF8, 0xFF); in it661221_set_ncts()
1178 static int it661221_audio_output_enable(struct it66121_ctx *ctx, bool enable) in it661221_audio_output_enable() argument
1182 if (enable) { in it661221_audio_output_enable()
1183 ret = regmap_write_bits(ctx->regmap, IT66121_SW_RST_REG, in it661221_audio_output_enable()
1189 ret = regmap_write_bits(ctx->regmap, IT66121_AUD_CTRL0_REG, in it661221_audio_output_enable()
1192 ctx->audio.ch_enable); in it661221_audio_output_enable()
1194 ret = regmap_write_bits(ctx->regmap, IT66121_AUD_CTRL0_REG, in it661221_audio_output_enable()
1197 ctx->audio.ch_enable & 0xF0); in it661221_audio_output_enable()
1201 ret = regmap_write_bits(ctx->regmap, IT66121_SW_RST_REG, in it661221_audio_output_enable()
1209 static int it661221_audio_ch_enable(struct it66121_ctx *ctx, bool enable) in it661221_audio_ch_enable() argument
1213 if (enable) { in it661221_audio_ch_enable()
1214 ret = regmap_write(ctx->regmap, IT66121_AUD_SRCVALID_FLAT_REG, 0); in it661221_audio_ch_enable()
1218 ret = regmap_write(ctx->regmap, IT66121_AUD_CTRL0_REG, ctx->audio.ch_enable); in it661221_audio_ch_enable()
1220 ret = regmap_write(ctx->regmap, IT66121_AUD_CTRL0_REG, ctx->audio.ch_enable & 0xF0); in it661221_audio_ch_enable()
1235 unsigned int channels = params->channels; in it66121_audio_hw_params()
1236 unsigned int sample_rate = params->sample_rate; in it66121_audio_hw_params()
1237 unsigned int sample_width = params->sample_width; in it66121_audio_hw_params()
1239 mutex_lock(&ctx->lock); in it66121_audio_hw_params()
1241 daifmt->fmt, sample_rate, sample_width, channels); in it66121_audio_hw_params()
1243 switch (daifmt->fmt) { in it66121_audio_hw_params()
1248 dev_err(dev, "Invalid or unsupported DAI format %d\n", daifmt->fmt); in it66121_audio_hw_params()
1249 ret = -EINVAL; in it66121_audio_hw_params()
1254 ret = regmap_write(ctx->regmap, IT66121_CLK_CTRL0_REG, in it66121_audio_hw_params()
1261 ret = regmap_write_bits(ctx->regmap, IT66121_AUD_CTRL0_REG, in it66121_audio_hw_params()
1296 ctx->audio.fs = fs; in it66121_audio_hw_params()
1303 // Set audio format register (except audio channel enable) in it66121_audio_hw_params()
1360 // Enable audio channel enable while input clock stable (if SPDIF). in it66121_audio_hw_params()
1363 dev_err(dev, "Failed to enable audio channel: %d\n", ret); in it66121_audio_hw_params()
1367 ret = regmap_write_bits(ctx->regmap, IT66121_INT_MASK1_REG, in it66121_audio_hw_params()
1375 mutex_unlock(&ctx->lock); in it66121_audio_hw_params()
1387 mutex_lock(&ctx->lock); in it66121_audio_startup()
1390 dev_err(dev, "Failed to enable audio output: %d\n", ret); in it66121_audio_startup()
1392 mutex_unlock(&ctx->lock); in it66121_audio_startup()
1404 mutex_lock(&ctx->lock); in it66121_audio_shutdown()
1409 mutex_unlock(&ctx->lock); in it66121_audio_shutdown()
1413 bool enable, int direction) in it66121_audio_mute() argument
1418 dev_dbg(dev, "%s: enable=%s, direction=%d\n", in it66121_audio_mute()
1419 __func__, enable ? "true" : "false", direction); in it66121_audio_mute()
1421 mutex_lock(&ctx->lock); in it66121_audio_mute()
1423 if (enable) { in it66121_audio_mute()
1424 ret = regmap_write_bits(ctx->regmap, IT66121_AUD_SRCVALID_FLAT_REG, in it66121_audio_mute()
1430 ret = regmap_write_bits(ctx->regmap, IT66121_AUD_SRCVALID_FLAT_REG, in it66121_audio_mute()
1436 mutex_unlock(&ctx->lock); in it66121_audio_mute()
1446 mutex_lock(&ctx->lock); in it66121_audio_get_eld()
1447 if (!ctx->connector) { in it66121_audio_get_eld()
1452 mutex_lock(&ctx->connector->eld_mutex); in it66121_audio_get_eld()
1453 memcpy(buf, ctx->connector->eld, in it66121_audio_get_eld()
1454 min(sizeof(ctx->connector->eld), len)); in it66121_audio_get_eld()
1455 mutex_unlock(&ctx->connector->eld_mutex); in it66121_audio_get_eld()
1457 mutex_unlock(&ctx->lock); in it66121_audio_get_eld()
1482 if (!of_property_present(dev->of_node, "#sound-dai-cells")) { in it66121_audio_codec_init()
1483 dev_info(dev, "No \"#sound-dai-cells\", no audio\n"); in it66121_audio_codec_init()
1487 ctx->audio.pdev = platform_device_register_data(dev, in it66121_audio_codec_init()
1493 if (IS_ERR(ctx->audio.pdev)) { in it66121_audio_codec_init()
1495 PTR_ERR_OR_ZERO(ctx->audio.pdev)); in it66121_audio_codec_init()
1498 return PTR_ERR_OR_ZERO(ctx->audio.pdev); in it66121_audio_codec_init()
1511 struct device *dev = &client->dev; in it66121_probe()
1513 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in it66121_probe()
1515 return -ENXIO; in it66121_probe()
1520 return -ENOMEM; in it66121_probe()
1522 ep = of_graph_get_endpoint_by_regs(dev->of_node, 0, 0); in it66121_probe()
1524 return -EINVAL; in it66121_probe()
1526 ctx->dev = dev; in it66121_probe()
1527 ctx->client = client; in it66121_probe()
1528 ctx->info = i2c_get_match_data(client); in it66121_probe()
1530 of_property_read_u32(ep, "bus-width", &ctx->bus_width); in it66121_probe()
1533 if (ctx->bus_width != 12 && ctx->bus_width != 24) in it66121_probe()
1534 return -EINVAL; in it66121_probe()
1536 ep = of_graph_get_remote_node(dev->of_node, 1, -1); in it66121_probe()
1538 dev_err(ctx->dev, "The endpoint is unconnected\n"); in it66121_probe()
1539 return -EINVAL; in it66121_probe()
1542 ctx->next_bridge = of_drm_find_bridge(ep); in it66121_probe()
1544 if (!ctx->next_bridge) { in it66121_probe()
1545 dev_dbg(ctx->dev, "Next bridge not found, deferring probe\n"); in it66121_probe()
1546 return -EPROBE_DEFER; in it66121_probe()
1550 mutex_init(&ctx->lock); in it66121_probe()
1555 dev_err(dev, "Failed to enable power supplies\n"); in it66121_probe()
1561 ctx->regmap = devm_regmap_init_i2c(client, &it66121_regmap_config); in it66121_probe()
1562 if (IS_ERR(ctx->regmap)) in it66121_probe()
1563 return PTR_ERR(ctx->regmap); in it66121_probe()
1565 regmap_read(ctx->regmap, IT66121_VENDOR_ID0_REG, &vendor_ids[0]); in it66121_probe()
1566 regmap_read(ctx->regmap, IT66121_VENDOR_ID1_REG, &vendor_ids[1]); in it66121_probe()
1567 regmap_read(ctx->regmap, IT66121_DEVICE_ID0_REG, &device_ids[0]); in it66121_probe()
1568 regmap_read(ctx->regmap, IT66121_DEVICE_ID1_REG, &device_ids[1]); in it66121_probe()
1574 if ((vendor_ids[1] << 8 | vendor_ids[0]) != ctx->info->vid || in it66121_probe()
1575 (device_ids[1] << 8 | device_ids[0]) != ctx->info->pid) { in it66121_probe()
1576 return -ENODEV; in it66121_probe()
1579 ctx->bridge.funcs = &it66121_bridge_funcs; in it66121_probe()
1580 ctx->bridge.of_node = dev->of_node; in it66121_probe()
1581 ctx->bridge.type = DRM_MODE_CONNECTOR_HDMIA; in it66121_probe()
1582 ctx->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID; in it66121_probe()
1583 if (client->irq > 0) { in it66121_probe()
1584 ctx->bridge.ops |= DRM_BRIDGE_OP_HPD; in it66121_probe()
1586 ret = devm_request_threaded_irq(dev, client->irq, NULL, in it66121_probe()
1591 dev_err(dev, "Failed to request irq %d:%d\n", client->irq, ret); in it66121_probe()
1598 drm_bridge_add(&ctx->bridge); in it66121_probe()
1600 dev_info(ctx->dev, "IT66121 revision %d probed\n", revision_id); in it66121_probe()
1609 drm_bridge_remove(&ctx->bridge); in it66121_remove()
1610 mutex_destroy(&ctx->lock); in it66121_remove()