Lines Matching +full:self +full:- +full:powered
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
33 #include <sound/hdmi-codec.h>
51 #define BIT_OFFSET(x) (((x) - INT_STATUS_01) * BITS_PER_BYTE)
290 #define DEBUGFS_DIR_NAME "it6505-debugfs"
436 bool powered; member
527 struct device *dev = it6505->dev; in it6505_read()
529 if (!it6505->powered) in it6505_read()
530 return -ENODEV; in it6505_read()
532 err = regmap_read(it6505->regmap, reg_addr, &value); in it6505_read()
545 struct device *dev = it6505->dev; in it6505_write()
547 if (!it6505->powered) in it6505_write()
548 return -ENODEV; in it6505_write()
550 err = regmap_write(it6505->regmap, reg_addr, reg_val); in it6505_write()
565 struct device *dev = it6505->dev; in it6505_set_bits()
567 if (!it6505->powered) in it6505_set_bits()
568 return -ENODEV; in it6505_set_bits()
570 err = regmap_update_bits(it6505->regmap, reg, mask, value); in it6505_set_bits()
583 struct device *dev = it6505->dev; in it6505_debug_print()
602 struct device *dev = it6505->dev; in it6505_dpcd_read()
604 ret = drm_dp_dpcd_readb(&it6505->aux, offset, &value); in it6505_dpcd_read()
616 struct device *dev = it6505->dev; in it6505_dpcd_write()
618 ret = drm_dp_dpcd_writeb(&it6505->aux, offset, datain); in it6505_dpcd_write()
629 struct device *dev = it6505->dev; in it6505_get_dpcd()
631 ret = drm_dp_dpcd_read(&it6505->aux, offset, dpcd, num); in it6505_get_dpcd()
646 struct device *dev = it6505->dev; in it6505_dump()
685 struct device *dev = it6505->dev; in it6505_calc_video_info()
733 it6505->video_info.clock = pclk; in it6505_calc_video_info()
734 it6505->video_info.hdisplay = hdew; in it6505_calc_video_info()
735 it6505->video_info.hsync_start = hdew + hfph; in it6505_calc_video_info()
736 it6505->video_info.hsync_end = hdew + hfph + hsyncw; in it6505_calc_video_info()
737 it6505->video_info.htotal = htotal; in it6505_calc_video_info()
738 it6505->video_info.vdisplay = vdew; in it6505_calc_video_info()
739 it6505->video_info.vsync_start = vdew + vfph; in it6505_calc_video_info()
740 it6505->video_info.vsync_end = vdew + vfph + vsyncw; in it6505_calc_video_info()
741 it6505->video_info.vtotal = vtotal; in it6505_calc_video_info()
744 DRM_MODE_ARG(&it6505->video_info)); in it6505_calc_video_info()
755 if (link->revision < DPCD_V_1_1) in it6505_drm_dp_link_set_power()
773 * Table 5-52, "Sink Control Field" (register 0x600). in it6505_drm_dp_link_set_power()
818 if (it6505->lane_swap) { in it6505_lane_termination_on()
819 switch (it6505->lane_count) { in it6505_lane_termination_on()
831 switch (it6505->lane_count) { in it6505_lane_termination_on()
862 (it6505->lane_swap ? in it6505_lane_power_on()
863 GENMASK(7, 8 - it6505->lane_count) : in it6505_lane_power_on()
864 GENMASK(3 + it6505->lane_count, 4)) | in it6505_lane_power_on()
911 regmap_write(it6505->regmap, REG_RESET_CTRL, ALL_LOGIC_RESET); in it6505_reset_logic()
929 struct device *dev = it6505->dev; in it6505_aux_wait()
936 return -ETIMEDOUT; in it6505_aux_wait()
959 return -EIO; in it6505_aux_operation()
989 ((address >> 16) & 0x0F) | ((size - 1) << 4)); in it6505_aux_operation()
992 regmap_bulk_write(it6505->regmap, REG_AUX_OUT_DATA0, buffer, in it6505_aux_operation()
1012 ret = -EAGAIN; in it6505_aux_operation()
1016 ret = -EIO; in it6505_aux_operation()
1019 ret = -ETIMEDOUT; in it6505_aux_operation()
1043 if (aux_write_check && buffer[size - 1 - i] != ret) { in it6505_aux_operation()
1044 ret = -EINVAL; in it6505_aux_operation()
1048 buffer[size - 1 - i] = ret; in it6505_aux_operation()
1077 mutex_lock(&it6505->aux_lock); in it6505_aux_do_transfer()
1079 request_size = min((int)size - i, 4); in it6505_aux_do_transfer()
1092 mutex_unlock(&it6505->aux_lock); in it6505_aux_do_transfer()
1101 bool is_i2c = !(msg->request & DP_AUX_NATIVE_WRITE); in it6505_aux_transfer()
1107 return -EINVAL; in it6505_aux_transfer()
1109 switch (msg->request) { in it6505_aux_transfer()
1117 return -EINVAL; in it6505_aux_transfer()
1120 ret = it6505_aux_do_transfer(it6505, cmd, msg->address, msg->buffer, in it6505_aux_transfer()
1121 msg->size, &reply); in it6505_aux_transfer()
1127 msg->reply = DP_AUX_NATIVE_REPLY_ACK; in it6505_aux_transfer()
1130 msg->reply = DP_AUX_NATIVE_REPLY_NACK; in it6505_aux_transfer()
1133 msg->reply = DP_AUX_NATIVE_REPLY_DEFER; in it6505_aux_transfer()
1144 struct device *dev = it6505->dev; in it6505_get_edid_block()
1156 if (ret < 0 && ret != -EAGAIN) in it6505_get_edid_block()
1167 return -EIO; in it6505_get_edid_block()
1170 if (!(--aux_retry)) in it6505_get_edid_block()
1171 return -EIO; in it6505_get_edid_block()
1180 it6505->link_rate_bw_code = HBR; in it6505_variable_config()
1181 it6505->lane_count = MAX_LANE_COUNT; in it6505_variable_config()
1182 it6505->link_state = LINK_IDLE; in it6505_variable_config()
1183 it6505->hdcp_desired = HDCP_DESIRED; in it6505_variable_config()
1184 it6505->auto_train_retry = AUTO_TRAIN_RETRY; in it6505_variable_config()
1185 it6505->audio.select = AUDIO_SELECT; in it6505_variable_config()
1186 it6505->audio.sample_rate = AUDIO_SAMPLE_RATE; in it6505_variable_config()
1187 it6505->audio.channel_count = AUDIO_CHANNEL_COUNT; in it6505_variable_config()
1188 it6505->audio.type = AUDIO_TYPE; in it6505_variable_config()
1189 it6505->audio.i2s_input_format = I2S_INPUT_FORMAT; in it6505_variable_config()
1190 it6505->audio.i2s_justified = I2S_JUSTIFIED; in it6505_variable_config()
1191 it6505->audio.i2s_data_delay = I2S_DATA_DELAY; in it6505_variable_config()
1192 it6505->audio.i2s_ws_channel = I2S_WS_CHANNEL; in it6505_variable_config()
1193 it6505->audio.i2s_data_sequence = I2S_DATA_SEQUENCE; in it6505_variable_config()
1194 it6505->audio.word_length = AUDIO_WORD_LENGTH; in it6505_variable_config()
1195 memset(it6505->sha1_input, 0, sizeof(it6505->sha1_input)); in it6505_variable_config()
1196 memset(it6505->bksvs, 0, sizeof(it6505->bksvs)); in it6505_variable_config()
1204 struct device *dev = it6505->dev; in it6505_send_video_infoframe()
1216 err = regmap_bulk_write(it6505->regmap, REG_AVI_INFO_DB1, in it6505_send_video_infoframe()
1218 frame->length); in it6505_send_video_infoframe()
1234 struct device *dev = it6505->dev; in it6505_get_extcon_property()
1236 if (it6505->extcon && !it6505->lane_swap_disabled) { in it6505_get_extcon_property()
1237 err = extcon_get_property(it6505->extcon, EXTCON_DISP_DP, in it6505_get_extcon_property()
1244 it6505->lane_swap = property.intval; in it6505_get_extcon_property()
1251 int clock = mode->clock; in it6505_clk_phase_adjustment()
1287 afe_setting_table[it6505->afe_setting][0]); in it6505_init()
1289 afe_setting_table[it6505->afe_setting][1]); in it6505_init()
1291 afe_setting_table[it6505->afe_setting][2]); in it6505_init()
1337 enum it6505_audio_sample_rate sample_rate = it6505->audio.sample_rate; in it6505_setup_audio_channel_status()
1341 it6505_write(it6505, REG_IEC958_STS0, it6505->audio.type << 1); in it6505_setup_audio_channel_status()
1346 audio_word_length_map[it6505->audio.word_length]); in it6505_setup_audio_channel_status()
1353 (it6505->audio.word_length << 5) | in it6505_setup_audio_format()
1354 (it6505->audio.i2s_data_sequence << 4) | in it6505_setup_audio_format()
1355 (it6505->audio.i2s_ws_channel << 3) | in it6505_setup_audio_format()
1356 (it6505->audio.i2s_data_delay << 2) | in it6505_setup_audio_format()
1357 (it6505->audio.i2s_justified << 1) | in it6505_setup_audio_format()
1358 it6505->audio.i2s_input_format); in it6505_setup_audio_format()
1359 if (it6505->audio.select == SPDIF) { in it6505_setup_audio_format()
1375 audio_source_count = BIT(DIV_ROUND_UP(it6505->audio.channel_count, 2)) in it6505_enable_audio_source()
1376 - 1; in it6505_enable_audio_source()
1378 audio_source_count |= it6505->audio.select << 4; in it6505_enable_audio_source()
1385 struct device *dev = it6505->dev; in it6505_enable_audio_infoframe()
1389 audio_info_ca[it6505->audio.channel_count - 1]); in it6505_enable_audio_infoframe()
1391 it6505_write(it6505, REG_AUD_INFOFRAM_DB1, it6505->audio.channel_count in it6505_enable_audio_infoframe()
1392 - 1); in it6505_enable_audio_infoframe()
1395 audio_info_ca[it6505->audio.channel_count - 1]); in it6505_enable_audio_infoframe()
1414 struct device *dev = it6505->dev; in it6505_enable_audio()
1441 if (it6505->link.revision >= 0x12) in it6505_use_step_train_check()
1442 return it6505->dpcd[DP_TRAINING_AUX_RD_INTERVAL] >= 0x01; in it6505_use_step_train_check()
1449 struct device *dev = it6505->dev; in it6505_parse_link_capabilities()
1450 struct it6505_drm_dp_link *link = &it6505->link; in it6505_parse_link_capabilities()
1453 if (it6505->dpcd[0] == 0) { in it6505_parse_link_capabilities()
1460 link->revision = it6505->dpcd[0]; in it6505_parse_link_capabilities()
1461 link->rate = drm_dp_bw_code_to_link_rate(it6505->dpcd[1]); in it6505_parse_link_capabilities()
1462 link->num_lanes = it6505->dpcd[2] & DP_MAX_LANE_COUNT_MASK; in it6505_parse_link_capabilities()
1464 if (it6505->dpcd[2] & DP_ENHANCED_FRAME_CAP) in it6505_parse_link_capabilities()
1465 link->capabilities = DP_ENHANCED_FRAME_CAP; in it6505_parse_link_capabilities()
1468 link->revision >> 4, link->revision & 0x0F); in it6505_parse_link_capabilities()
1471 link->rate / 100000, link->rate / 1000 % 100); in it6505_parse_link_capabilities()
1473 it6505->link_rate_bw_code = drm_dp_link_rate_to_bw_code(link->rate); in it6505_parse_link_capabilities()
1475 it6505->link_rate_bw_code); in it6505_parse_link_capabilities()
1476 it6505->link_rate_bw_code = min_t(int, it6505->link_rate_bw_code, in it6505_parse_link_capabilities()
1479 it6505->lane_count = link->num_lanes; in it6505_parse_link_capabilities()
1481 it6505->lane_count); in it6505_parse_link_capabilities()
1482 it6505->lane_count = min_t(int, it6505->lane_count, in it6505_parse_link_capabilities()
1483 it6505->max_lane_count); in it6505_parse_link_capabilities()
1485 it6505->branch_device = drm_dp_is_branch(it6505->dpcd); in it6505_parse_link_capabilities()
1487 it6505->branch_device ? "" : "Not "); in it6505_parse_link_capabilities()
1489 it6505->enable_enhanced_frame = link->capabilities; in it6505_parse_link_capabilities()
1491 it6505->enable_enhanced_frame ? "" : "Not "); in it6505_parse_link_capabilities()
1493 it6505->enable_ssc = (it6505->dpcd[DP_MAX_DOWNSPREAD] & in it6505_parse_link_capabilities()
1495 DRM_DEV_DEBUG_DRIVER(dev, "Maximum Down-Spread: %s, %ssupport SSC!", in it6505_parse_link_capabilities()
1496 it6505->enable_ssc ? "0.5" : "0", in it6505_parse_link_capabilities()
1497 it6505->enable_ssc ? "" : "Not "); in it6505_parse_link_capabilities()
1499 it6505->step_train = it6505_use_step_train_check(it6505); in it6505_parse_link_capabilities()
1500 if (it6505->step_train) in it6505_parse_link_capabilities()
1506 it6505->is_repeater = (bcaps & DP_BCAPS_REPEATER_PRESENT); in it6505_parse_link_capabilities()
1508 it6505->is_repeater ? "repeater" : in it6505_parse_link_capabilities()
1512 it6505->hdcp_desired = false; in it6505_parse_link_capabilities()
1515 it6505->hdcp_desired ? "desired" : "undesired"); in it6505_parse_link_capabilities()
1521 it6505->enable_ssc ? SPREAD_AMP_5 : 0x00); in it6505_setup_ssc()
1522 if (it6505->enable_ssc) { in it6505_setup_ssc()
1544 (it6505->link_rate_bw_code == RBR) ? FORCE_LBR : 0x00); in it6505_link_rate_setup()
1546 (it6505->link_rate_bw_code == RBR) ? 0x00 : DRV_HS); in it6505_link_rate_setup()
1553 it6505->lane_swap ? LANE_SWAP : 0x00); in it6505_lane_count_setup()
1555 (it6505->lane_count - 1) << 1); in it6505_lane_count_setup()
1560 struct device *dev = it6505->dev; in it6505_link_training_setup()
1562 if (it6505->enable_enhanced_frame) in it6505_link_training_setup()
1571 it6505->link_rate_bw_code != RBR ? "HBR" : "RBR", in it6505_link_training_setup()
1572 it6505->lane_count, in it6505_link_training_setup()
1573 it6505->enable_ssc ? "en" : "dis", in it6505_link_training_setup()
1574 it6505->enable_enhanced_frame ? "en" : "dis"); in it6505_link_training_setup()
1582 mutex_lock(&it6505->aux_lock); in it6505_link_start_auto_train()
1598 timeout--; in it6505_link_start_auto_train()
1601 mutex_unlock(&it6505->aux_lock); in it6505_link_start_auto_train()
1610 struct drm_dp_aux *aux = &it6505->aux; in it6505_drm_dp_link_configure()
1612 values[0] = it6505->link_rate_bw_code; in it6505_drm_dp_link_configure()
1613 values[1] = it6505->lane_count; in it6505_drm_dp_link_configure()
1615 if (it6505->enable_enhanced_frame) in it6505_drm_dp_link_configure()
1654 u8 *voltage_swing = lane_voltage_pre_emphasis->voltage_swing; in step_train_lane_voltage_para_set()
1655 u8 *pre_emphasis = lane_voltage_pre_emphasis->pre_emphasis; in step_train_lane_voltage_para_set()
1658 for (i = 0; i < it6505->lane_count; i++) { in step_train_lane_voltage_para_set()
1689 int pre_emphasis_adjust = -1, voltage_swing_adjust = -1; in it6505_step_cr_train()
1690 const struct drm_dp_aux *aux = &it6505->aux; in it6505_step_cr_train()
1693 it6505->enable_ssc ? DP_SPREAD_AMP_0_5 : 0x00); in it6505_step_cr_train()
1703 drm_dp_link_train_clock_recovery_delay(aux, it6505->dpcd); in it6505_step_cr_train()
1704 drm_dp_dpcd_read_link_status(&it6505->aux, link_status); in it6505_step_cr_train()
1706 if (drm_dp_clock_recovery_ok(link_status, it6505->lane_count)) { in it6505_step_cr_train()
1711 DRM_DEV_DEBUG_DRIVER(it6505->dev, "cr not done"); in it6505_step_cr_train()
1714 it6505->lane_count)) in it6505_step_cr_train()
1717 for (j = 0; j < it6505->lane_count; j++) { in it6505_step_cr_train()
1718 lane_voltage_pre_emphasis->voltage_swing[j] = in it6505_step_cr_train()
1722 lane_voltage_pre_emphasis->pre_emphasis[j] = in it6505_step_cr_train()
1727 lane_voltage_pre_emphasis->voltage_swing[j] && in it6505_step_cr_train()
1729 lane_voltage_pre_emphasis->pre_emphasis[j]) { in it6505_step_cr_train()
1735 lane_voltage_pre_emphasis->voltage_swing[j]; in it6505_step_cr_train()
1737 lane_voltage_pre_emphasis->pre_emphasis[j]; in it6505_step_cr_train()
1742 lane_voltage_pre_emphasis->voltage_swing[j] = in it6505_step_cr_train()
1743 MAX_EQ_LEVEL - in it6505_step_cr_train()
1745 ->pre_emphasis[j]; in it6505_step_cr_train()
1762 const struct drm_dp_aux *aux = &it6505->aux; in it6505_step_eq_train()
1775 drm_dp_link_train_channel_eq_delay(aux, it6505->dpcd); in it6505_step_eq_train()
1776 drm_dp_dpcd_read_link_status(&it6505->aux, link_status); in it6505_step_eq_train()
1778 if (!drm_dp_clock_recovery_ok(link_status, it6505->lane_count)) in it6505_step_eq_train()
1781 if (drm_dp_channel_eq_ok(link_status, it6505->lane_count)) { in it6505_step_eq_train()
1788 DRM_DEV_DEBUG_DRIVER(it6505->dev, "eq not done"); in it6505_step_eq_train()
1790 for (i = 0; i < it6505->lane_count; i++) { in it6505_step_eq_train()
1791 lane_voltage_pre_emphasis->voltage_swing[i] = in it6505_step_eq_train()
1795 lane_voltage_pre_emphasis->pre_emphasis[i] = in it6505_step_eq_train()
1800 if (lane_voltage_pre_emphasis->voltage_swing[i] + in it6505_step_eq_train()
1801 lane_voltage_pre_emphasis->pre_emphasis[i] > in it6505_step_eq_train()
1803 lane_voltage_pre_emphasis->voltage_swing[i] = in it6505_step_eq_train()
1804 0x03 - lane_voltage_pre_emphasis in it6505_step_eq_train()
1805 ->pre_emphasis[i]; in it6505_step_eq_train()
1823 DRM_DEV_DEBUG_DRIVER(it6505->dev, "start"); in it6505_link_start_step_train()
1849 it6505->hdcp_status = HDCP_AUTH_IDLE; in it6505_reset_hdcp()
1857 struct device *dev = it6505->dev; in it6505_start_hdcp()
1861 queue_delayed_work(system_wq, &it6505->hdcp_work, in it6505_start_hdcp()
1868 cancel_delayed_work(&it6505->hdcp_work); in it6505_stop_hdcp()
1885 struct device *dev = it6505->dev; in it6505_hdcp_part1_auth()
1917 it6505->hdcp_status = HDCP_AUTH_GOING; in it6505_hdcp_part1_auth()
1926 struct device *dev = it6505->dev; in it6505_sha1_digest()
1936 return -ENOMEM; in it6505_sha1_digest()
1939 desc->tfm = tfm; in it6505_sha1_digest()
1951 struct device *dev = it6505->dev; in it6505_setup_sha1_input()
1991 it6505->hdcp_down_stream_count = down_stream_count; in it6505_setup_sha1_input()
1998 err = regmap_bulk_read(it6505->regmap, REG_M0_0_7, in it6505_setup_sha1_input()
2015 struct device *dev = it6505->dev; in it6505_hdcp_part2_ksvlist_check()
2019 i = it6505_setup_sha1_input(it6505, it6505->sha1_input); in it6505_hdcp_part2_ksvlist_check()
2021 dev_err(dev, "SHA-1 Input length error %d", i); in it6505_hdcp_part2_ksvlist_check()
2025 it6505_sha1_digest(it6505, it6505->sha1_input, i, (u8 *)av); in it6505_hdcp_part2_ksvlist_check()
2048 struct device *dev = it6505->dev; in it6505_hdcp_wait_ksv_list()
2064 timeout--; in it6505_hdcp_wait_ksv_list()
2090 struct device *dev = it6505->dev; in it6505_hdcp_work()
2099 ret = drm_dp_dpcd_read_link_status(&it6505->aux, link_status); in it6505_hdcp_work()
2103 if (ret < 0 || !drm_dp_channel_eq_ok(link_status, it6505->lane_count) || in it6505_hdcp_work()
2109 ret = it6505_get_dpcd(it6505, DP_AUX_HDCP_BKSV, it6505->bksvs, in it6505_hdcp_work()
2110 ARRAY_SIZE(it6505->bksvs)); in it6505_hdcp_work()
2118 (int)ARRAY_SIZE(it6505->bksvs), it6505->bksvs); in it6505_hdcp_work()
2120 if (!it6505_hdcp_is_ksv_valid(it6505->bksvs)) { in it6505_hdcp_work()
2131 struct device *dev = it6505->dev; in it6505_show_hdcp_info()
2133 u8 *sha1 = it6505->sha1_input; in it6505_show_hdcp_info()
2136 it6505->hdcp_status, it6505->is_repeater); in it6505_show_hdcp_info()
2138 (int)ARRAY_SIZE(it6505->bksvs), it6505->bksvs); in it6505_show_hdcp_info()
2140 if (it6505->is_repeater) { in it6505_show_hdcp_info()
2142 it6505->hdcp_down_stream_count); in it6505_show_hdcp_info()
2144 (int)ARRAY_SIZE(it6505->sha1_input), in it6505_show_hdcp_info()
2145 it6505->sha1_input); in it6505_show_hdcp_info()
2146 for (i = 0; i < it6505->hdcp_down_stream_count; i++) { in it6505_show_hdcp_info()
2158 it6505->link_state = LINK_IDLE; in it6505_stop_link_train()
2159 cancel_work_sync(&it6505->link_works); in it6505_stop_link_train()
2165 struct device *dev = it6505->dev; in it6505_link_train_ok()
2167 it6505->link_state = LINK_OK; in it6505_link_train_ok()
2178 if (it6505->hdcp_desired) in it6505_link_train_ok()
2184 struct device *dev = it6505->dev; in it6505_link_step_train_process()
2189 if (it6505->sink_count == 0) { in it6505_link_step_train_process()
2190 DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count:%d, force eq", in it6505_link_step_train_process()
2191 it6505->sink_count); in it6505_link_step_train_process()
2197 if (!it6505->step_train) { in it6505_link_step_train_process()
2215 it6505->link_state = LINK_IDLE; in it6505_link_step_train_process()
2222 struct device *dev = it6505->dev; in it6505_link_training_work()
2225 DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count: %d", in it6505_link_training_work()
2226 it6505->sink_count); in it6505_link_training_work()
2235 if (it6505->auto_train_retry < 1) { in it6505_link_training_work()
2242 ret ? "pass" : "failed", it6505->auto_train_retry); in it6505_link_training_work()
2243 it6505->auto_train_retry--; in it6505_link_training_work()
2255 enum drm_connector_status status = it6505->connector_status; in it6505_plugged_status_to_codec()
2257 if (it6505->plugged_cb && it6505->codec_dev) in it6505_plugged_status_to_codec()
2258 it6505->plugged_cb(it6505->codec_dev, in it6505_plugged_status_to_codec()
2264 kfree(it6505->cached_edid); in it6505_remove_edid()
2265 it6505->cached_edid = NULL; in it6505_remove_edid()
2270 struct device *dev = it6505->dev; in it6505_process_hpd_irq()
2276 it6505->sink_count = 0; in it6505_process_hpd_irq()
2285 DRM_DEV_DEBUG_DRIVER(dev, "dpcd_sink_count: %d it6505->sink_count:%d", in it6505_process_hpd_irq()
2286 dpcd_sink_count, it6505->sink_count); in it6505_process_hpd_irq()
2288 if (it6505->branch_device && dpcd_sink_count != it6505->sink_count) { in it6505_process_hpd_irq()
2289 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_process_hpd_irq()
2290 it6505->sink_count = dpcd_sink_count; in it6505_process_hpd_irq()
2315 ret = drm_dp_dpcd_read_link_status(&it6505->aux, link_status); in it6505_process_hpd_irq()
2324 if (!drm_dp_channel_eq_ok(link_status, it6505->lane_count)) { in it6505_process_hpd_irq()
2325 it6505->auto_train_retry = AUTO_TRAIN_RETRY; in it6505_process_hpd_irq()
2334 struct device *dev = it6505->dev; in it6505_irq_hpd()
2337 it6505->hpd_state = it6505_get_sink_hpd_status(it6505); in it6505_irq_hpd()
2339 it6505->hpd_state ? "high" : "low"); in it6505_irq_hpd()
2341 if (it6505->hpd_state) { in it6505_irq_hpd()
2342 wait_for_completion_timeout(&it6505->extcon_completion, in it6505_irq_hpd()
2345 if (it6505->dpcd[0] == 0) { in it6505_irq_hpd()
2346 it6505_get_dpcd(it6505, DP_DPCD_REV, it6505->dpcd, in it6505_irq_hpd()
2347 ARRAY_SIZE(it6505->dpcd)); in it6505_irq_hpd()
2351 it6505->auto_train_retry = AUTO_TRAIN_RETRY; in it6505_irq_hpd()
2353 it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link, in it6505_irq_hpd()
2356 it6505->sink_count = DP_GET_SINK_COUNT(dp_sink_count); in it6505_irq_hpd()
2358 DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count: %d", in it6505_irq_hpd()
2359 it6505->sink_count); in it6505_irq_hpd()
2366 * when sink count change from 0->1 in it6505_irq_hpd()
2371 if (it6505->branch_device && it6505->sink_count == 0) in it6505_irq_hpd()
2372 schedule_work(&it6505->link_works); in it6505_irq_hpd()
2377 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_irq_hpd()
2380 if (it6505->hdcp_desired) in it6505_irq_hpd()
2390 if (it6505->bridge.dev) in it6505_irq_hpd()
2391 drm_helper_hpd_irq_event(it6505->bridge.dev); in it6505_irq_hpd()
2396 struct device *dev = it6505->dev; in it6505_irq_hpd_irq()
2406 struct device *dev = it6505->dev; in it6505_irq_scdt()
2416 schedule_work(&it6505->link_works); in it6505_irq_scdt()
2421 struct device *dev = it6505->dev; in it6505_irq_hdcp_done()
2424 it6505->hdcp_status = HDCP_AUTH_DONE; in it6505_irq_hdcp_done()
2430 struct device *dev = it6505->dev; in it6505_irq_hdcp_fail()
2433 it6505->hdcp_status = HDCP_AUTH_IDLE; in it6505_irq_hdcp_fail()
2440 struct device *dev = it6505->dev; in it6505_irq_aux_cmd_fail()
2447 struct device *dev = it6505->dev; in it6505_irq_hdcp_ksv_check()
2450 schedule_work(&it6505->hdcp_wait_ksv_list); in it6505_irq_hdcp_ksv_check()
2455 struct device *dev = it6505->dev; in it6505_irq_audio_fifo_error()
2465 struct device *dev = it6505->dev; in it6505_irq_link_train_fail()
2468 schedule_work(&it6505->link_works); in it6505_irq_link_train_fail()
2473 struct device *dev = it6505->dev; in it6505_irq_video_fifo_error()
2476 it6505->auto_train_retry = AUTO_TRAIN_RETRY; in it6505_irq_video_fifo_error()
2477 flush_work(&it6505->link_works); in it6505_irq_video_fifo_error()
2484 struct device *dev = it6505->dev; in it6505_irq_io_latch_fifo_overflow()
2487 it6505->auto_train_retry = AUTO_TRAIN_RETRY; in it6505_irq_io_latch_fifo_overflow()
2488 flush_work(&it6505->link_works); in it6505_irq_io_latch_fifo_overflow()
2501 struct device *dev = it6505->dev; in it6505_int_threaded_handler()
2520 if (it6505->enable_drv_hold || !it6505->powered) in it6505_int_threaded_handler()
2541 if (it6505->hpd_state) { in it6505_int_threaded_handler()
2555 struct device *dev = it6505->dev; in it6505_poweron()
2556 struct it6505_platform_data *pdata = &it6505->pdata; in it6505_poweron()
2559 DRM_DEV_DEBUG_DRIVER(dev, "it6505 start powered on"); in it6505_poweron()
2561 if (it6505->powered) { in it6505_poweron()
2562 DRM_DEV_DEBUG_DRIVER(dev, "it6505 already powered on"); in it6505_poweron()
2566 if (pdata->pwr18) { in it6505_poweron()
2567 err = regulator_enable(pdata->pwr18); in it6505_poweron()
2575 if (pdata->ovdd) { in it6505_poweron()
2578 err = regulator_enable(pdata->ovdd); in it6505_poweron()
2580 regulator_disable(pdata->pwr18); in it6505_poweron()
2585 if (pdata->gpiod_reset) { in it6505_poweron()
2587 gpiod_set_value_cansleep(pdata->gpiod_reset, 0); in it6505_poweron()
2589 gpiod_set_value_cansleep(pdata->gpiod_reset, 1); in it6505_poweron()
2593 it6505->powered = true; in it6505_poweron()
2604 struct device *dev = it6505->dev; in it6505_poweroff()
2605 struct it6505_platform_data *pdata = &it6505->pdata; in it6505_poweroff()
2610 if (!it6505->powered) { in it6505_poweroff()
2615 if (pdata->gpiod_reset) in it6505_poweroff()
2616 gpiod_set_value_cansleep(pdata->gpiod_reset, 0); in it6505_poweroff()
2618 if (pdata->pwr18) { in it6505_poweroff()
2619 err = regulator_disable(pdata->pwr18); in it6505_poweroff()
2624 if (pdata->ovdd) { in it6505_poweroff()
2625 err = regulator_disable(pdata->ovdd); in it6505_poweroff()
2630 it6505->powered = false; in it6505_poweroff()
2631 it6505->sink_count = 0; in it6505_poweroff()
2638 struct device *dev = it6505->dev; in it6505_detect()
2642 DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count:%d powered:%d", in it6505_detect()
2643 it6505->sink_count, it6505->powered); in it6505_detect()
2645 mutex_lock(&it6505->mode_lock); in it6505_detect()
2647 if (!it6505->powered) in it6505_detect()
2650 if (it6505->enable_drv_hold) { in it6505_detect()
2651 status = it6505->hpd_state ? connector_status_connected : in it6505_detect()
2656 if (it6505->hpd_state) { in it6505_detect()
2657 it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link, in it6505_detect()
2660 it6505->sink_count = DP_GET_SINK_COUNT(dp_sink_count); in it6505_detect()
2661 DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count:%d branch:%d", in it6505_detect()
2662 it6505->sink_count, it6505->branch_device); in it6505_detect()
2664 if (it6505->branch_device) { in it6505_detect()
2665 status = (it6505->sink_count != 0) ? in it6505_detect()
2672 it6505->sink_count = 0; in it6505_detect()
2673 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_detect()
2677 if (it6505->connector_status != status) { in it6505_detect()
2678 it6505->connector_status = status; in it6505_detect()
2682 mutex_unlock(&it6505->mode_lock); in it6505_detect()
2687 static int it6505_extcon_notifier(struct notifier_block *self, in it6505_extcon_notifier() argument
2690 struct it6505 *it6505 = container_of(self, struct it6505, event_nb); in it6505_extcon_notifier()
2692 schedule_work(&it6505->extcon_wq); in it6505_extcon_notifier()
2699 struct device *dev = it6505->dev; in it6505_extcon_work()
2702 if (it6505->enable_drv_hold) in it6505_extcon_work()
2705 mutex_lock(&it6505->extcon_lock); in it6505_extcon_work()
2707 state = extcon_get_state(it6505->extcon, EXTCON_DISP_DP); in it6505_extcon_work()
2710 if (state == it6505->extcon_state || unlikely(state < 0)) in it6505_extcon_work()
2712 it6505->extcon_state = state; in it6505_extcon_work()
2720 * pm_runtime_force_resume re-enables runtime power management. in it6505_extcon_work()
2721 * Handling the error here to make sure the bridge is powered on. in it6505_extcon_work()
2726 complete_all(&it6505->extcon_completion); in it6505_extcon_work()
2730 reinit_completion(&it6505->extcon_completion); in it6505_extcon_work()
2732 drm_helper_hpd_irq_event(it6505->bridge.dev); in it6505_extcon_work()
2733 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_extcon_work()
2738 mutex_unlock(&it6505->extcon_lock); in it6505_extcon_work()
2744 struct device *dev = it6505->dev; in it6505_use_notifier_module()
2746 it6505->event_nb.notifier_call = it6505_extcon_notifier; in it6505_use_notifier_module()
2747 INIT_WORK(&it6505->extcon_wq, it6505_extcon_work); in it6505_use_notifier_module()
2748 ret = devm_extcon_register_notifier(it6505->dev, in it6505_use_notifier_module()
2749 it6505->extcon, EXTCON_DISP_DP, in it6505_use_notifier_module()
2750 &it6505->event_nb); in it6505_use_notifier_module()
2756 schedule_work(&it6505->extcon_wq); in it6505_use_notifier_module()
2763 if (it6505->extcon) { in it6505_remove_notifier_module()
2764 devm_extcon_unregister_notifier(it6505->dev, in it6505_remove_notifier_module()
2765 it6505->extcon, EXTCON_DISP_DP, in it6505_remove_notifier_module()
2766 &it6505->event_nb); in it6505_remove_notifier_module()
2768 flush_work(&it6505->extcon_wq); in it6505_remove_notifier_module()
2777 DRM_DEV_DEBUG_DRIVER(it6505->dev, "start"); in it6505_delayed_audio()
2779 if (!it6505->powered) in it6505_delayed_audio()
2782 if (!it6505->enable_drv_hold) in it6505_delayed_audio()
2790 struct device *dev = it6505->dev; in it6505_audio_setup_hw_params()
2794 params->sample_rate, params->sample_width, in it6505_audio_setup_hw_params()
2795 params->cea.channels); in it6505_audio_setup_hw_params()
2797 if (!it6505->bridge.encoder) in it6505_audio_setup_hw_params()
2798 return -ENODEV; in it6505_audio_setup_hw_params()
2800 if (params->cea.channels <= 1 || params->cea.channels > 8) { in it6505_audio_setup_hw_params()
2802 it6505->audio.channel_count); in it6505_audio_setup_hw_params()
2803 return -EINVAL; in it6505_audio_setup_hw_params()
2806 it6505->audio.channel_count = params->cea.channels; in it6505_audio_setup_hw_params()
2809 params->sample_rate != in it6505_audio_setup_hw_params()
2815 params->sample_rate); in it6505_audio_setup_hw_params()
2816 return -EINVAL; in it6505_audio_setup_hw_params()
2818 it6505->audio.sample_rate = audio_sample_rate_map[i].rate; in it6505_audio_setup_hw_params()
2820 switch (params->sample_width) { in it6505_audio_setup_hw_params()
2822 it6505->audio.word_length = WORD_LENGTH_16BIT; in it6505_audio_setup_hw_params()
2825 it6505->audio.word_length = WORD_LENGTH_18BIT; in it6505_audio_setup_hw_params()
2828 it6505->audio.word_length = WORD_LENGTH_20BIT; in it6505_audio_setup_hw_params()
2832 it6505->audio.word_length = WORD_LENGTH_24BIT; in it6505_audio_setup_hw_params()
2836 params->sample_width); in it6505_audio_setup_hw_params()
2837 return -EINVAL; in it6505_audio_setup_hw_params()
2847 if (it6505->powered) in it6505_audio_shutdown()
2858 it6505->plugged_cb = fn; in it6505_audio_hook_plugged_cb()
2859 it6505->codec_dev = codec_dev; in it6505_audio_hook_plugged_cb()
2874 struct device *dev = it6505->dev; in it6505_bridge_attach()
2879 return -EINVAL; in it6505_bridge_attach()
2882 if (!bridge->encoder) { in it6505_bridge_attach()
2884 return -ENODEV; in it6505_bridge_attach()
2888 it6505->aux.drm_dev = bridge->dev; in it6505_bridge_attach()
2890 ret = drm_dp_aux_register(&it6505->aux); in it6505_bridge_attach()
2897 if (it6505->extcon) { in it6505_bridge_attach()
2912 flush_work(&it6505->link_works); in it6505_bridge_detach()
2923 if (mode->flags & DRM_MODE_FLAG_INTERLACE) in it6505_bridge_mode_valid()
2926 if (mode->clock > it6505->max_dpi_pixel_clock) in it6505_bridge_mode_valid()
2929 it6505->video_info.clock = mode->clock; in it6505_bridge_mode_valid()
2938 struct device *dev = it6505->dev; in it6505_bridge_atomic_enable()
2939 struct drm_atomic_state *state = old_state->base.state; in it6505_bridge_atomic_enable()
2950 bridge->encoder); in it6505_bridge_atomic_enable()
2960 crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); in it6505_bridge_atomic_enable()
2965 mode = &crtc_state->adjusted_mode; in it6505_bridge_atomic_enable()
2986 it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link, in it6505_bridge_atomic_enable()
2994 struct device *dev = it6505->dev; in it6505_bridge_atomic_disable()
2998 if (it6505->powered) { in it6505_bridge_atomic_disable()
2999 it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link, in it6505_bridge_atomic_disable()
3009 struct device *dev = it6505->dev; in it6505_bridge_atomic_pre_enable()
3020 struct device *dev = it6505->dev; in it6505_bridge_atomic_post_disable()
3039 struct device *dev = it6505->dev; in it6505_bridge_get_edid()
3041 if (!it6505->cached_edid) { in it6505_bridge_get_edid()
3042 it6505->cached_edid = drm_do_get_edid(connector, it6505_get_edid_block, in it6505_bridge_get_edid()
3045 if (!it6505->cached_edid) { in it6505_bridge_get_edid()
3051 return drm_edid_duplicate(it6505->cached_edid); in it6505_bridge_get_edid()
3090 struct it6505_platform_data *pdata = &it6505->pdata; in it6505_init_pdata()
3091 struct device *dev = it6505->dev; in it6505_init_pdata()
3094 pdata->pwr18 = devm_regulator_get(dev, "pwr18"); in it6505_init_pdata()
3095 if (IS_ERR(pdata->pwr18)) { in it6505_init_pdata()
3097 return PTR_ERR(pdata->pwr18); in it6505_init_pdata()
3100 pdata->ovdd = devm_regulator_get(dev, "ovdd"); in it6505_init_pdata()
3101 if (IS_ERR(pdata->ovdd)) { in it6505_init_pdata()
3103 return PTR_ERR(pdata->ovdd); in it6505_init_pdata()
3106 pdata->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in it6505_init_pdata()
3107 if (IS_ERR(pdata->gpiod_reset)) { in it6505_init_pdata()
3109 return PTR_ERR(pdata->gpiod_reset); in it6505_init_pdata()
3121 ret = of_property_count_u32_elems(endpoint, "data-lanes"); in it6505_get_data_lanes_count()
3126 return -EINVAL; in it6505_get_data_lanes_count()
3133 struct device *dev = it6505->dev; in it6505_parse_dt()
3134 struct device_node *np = dev->of_node, *ep = NULL; in it6505_parse_dt()
3138 u32 *afe_setting = &it6505->afe_setting; in it6505_parse_dt()
3139 u32 *max_lane_count = &it6505->max_lane_count; in it6505_parse_dt()
3140 u32 *max_dpi_pixel_clock = &it6505->max_dpi_pixel_clock; in it6505_parse_dt()
3142 it6505->lane_swap_disabled = in it6505_parse_dt()
3143 device_property_read_bool(dev, "no-laneswap"); in it6505_parse_dt()
3145 if (it6505->lane_swap_disabled) in it6505_parse_dt()
3146 it6505->lane_swap = false; in it6505_parse_dt()
3148 if (device_property_read_u32(dev, "afe-setting", afe_setting) == 0) { in it6505_parse_dt()
3164 of_property_read_u32_array(ep, "data-lanes", in it6505_parse_dt()
3169 dev_err(dev, "error data-lanes, use default"); in it6505_parse_dt()
3181 "link-frequencies", in it6505_parse_dt()
3203 it6505->afe_setting, it6505->max_lane_count); in it6505_parse_dt()
3205 it6505->max_dpi_pixel_clock); in it6505_parse_dt()
3211 struct it6505 *it6505 = file->private_data; in receive_timing_debugfs_show()
3218 return -ENODEV; in receive_timing_debugfs_show()
3221 vid = &it6505->video_info; in receive_timing_debugfs_show()
3222 str += scnprintf(str, end - str, "---video timing---\n"); in receive_timing_debugfs_show()
3223 str += scnprintf(str, end - str, "PCLK:%d.%03dMHz\n", in receive_timing_debugfs_show()
3224 vid->clock / 1000, vid->clock % 1000); in receive_timing_debugfs_show()
3225 str += scnprintf(str, end - str, "HTotal:%d\n", vid->htotal); in receive_timing_debugfs_show()
3226 str += scnprintf(str, end - str, "HActive:%d\n", vid->hdisplay); in receive_timing_debugfs_show()
3227 str += scnprintf(str, end - str, "HFrontPorch:%d\n", in receive_timing_debugfs_show()
3228 vid->hsync_start - vid->hdisplay); in receive_timing_debugfs_show()
3229 str += scnprintf(str, end - str, "HSyncWidth:%d\n", in receive_timing_debugfs_show()
3230 vid->hsync_end - vid->hsync_start); in receive_timing_debugfs_show()
3231 str += scnprintf(str, end - str, "HBackPorch:%d\n", in receive_timing_debugfs_show()
3232 vid->htotal - vid->hsync_end); in receive_timing_debugfs_show()
3233 str += scnprintf(str, end - str, "VTotal:%d\n", vid->vtotal); in receive_timing_debugfs_show()
3234 str += scnprintf(str, end - str, "VActive:%d\n", vid->vdisplay); in receive_timing_debugfs_show()
3235 str += scnprintf(str, end - str, "VFrontPorch:%d\n", in receive_timing_debugfs_show()
3236 vid->vsync_start - vid->vdisplay); in receive_timing_debugfs_show()
3237 str += scnprintf(str, end - str, "VSyncWidth:%d\n", in receive_timing_debugfs_show()
3238 vid->vsync_end - vid->vsync_start); in receive_timing_debugfs_show()
3239 str += scnprintf(str, end - str, "VBackPorch:%d\n", in receive_timing_debugfs_show()
3240 vid->vtotal - vid->vsync_end); in receive_timing_debugfs_show()
3242 count = str - read_buf; in receive_timing_debugfs_show()
3253 return -ENODEV; in force_power_on_off_debugfs_write()
3268 return -ENODEV; in enable_drv_hold_debugfs_show()
3270 *buf = it6505->enable_drv_hold; in enable_drv_hold_debugfs_show()
3280 return -ENODEV; in enable_drv_hold_debugfs_write()
3282 it6505->enable_drv_hold = drv_hold; in enable_drv_hold_debugfs_write()
3284 if (it6505->enable_drv_hold) { in enable_drv_hold_debugfs_write()
3290 if (it6505->powered) { in enable_drv_hold_debugfs_write()
3291 it6505->connector_status = in enable_drv_hold_debugfs_write()
3296 it6505->connector_status = in enable_drv_hold_debugfs_write()
3330 it6505->debugfs, it6505, in debugfs_create_files()
3338 struct device *dev = it6505->dev; in debugfs_init()
3340 it6505->debugfs = debugfs_create_dir(DEBUGFS_DIR_NAME, NULL); in debugfs_init()
3342 if (IS_ERR(it6505->debugfs)) { in debugfs_init()
3352 debugfs_remove_recursive(it6505->debugfs); in it6505_debugfs_remove()
3357 struct it6505 *it6505 = dev_get_drvdata(&client->dev); in it6505_shutdown()
3359 if (it6505->powered) in it6505_shutdown()
3366 struct device *dev = &client->dev; in it6505_i2c_probe()
3370 it6505 = devm_kzalloc(&client->dev, sizeof(*it6505), GFP_KERNEL); in it6505_i2c_probe()
3372 return -ENOMEM; in it6505_i2c_probe()
3374 mutex_init(&it6505->extcon_lock); in it6505_i2c_probe()
3375 mutex_init(&it6505->mode_lock); in it6505_i2c_probe()
3376 mutex_init(&it6505->aux_lock); in it6505_i2c_probe()
3378 it6505->bridge.of_node = client->dev.of_node; in it6505_i2c_probe()
3379 it6505->connector_status = connector_status_disconnected; in it6505_i2c_probe()
3380 it6505->dev = &client->dev; in it6505_i2c_probe()
3385 if (PTR_ERR(extcon) == -EPROBE_DEFER) in it6505_i2c_probe()
3386 return -EPROBE_DEFER; in it6505_i2c_probe()
3392 it6505->extcon = extcon; in it6505_i2c_probe()
3394 it6505->regmap = devm_regmap_init_i2c(client, &it6505_regmap_config); in it6505_i2c_probe()
3395 if (IS_ERR(it6505->regmap)) { in it6505_i2c_probe()
3397 err = PTR_ERR(it6505->regmap); in it6505_i2c_probe()
3409 intp_irq = client->irq; in it6505_i2c_probe()
3413 err = -ENODEV; in it6505_i2c_probe()
3417 err = devm_request_threaded_irq(&client->dev, intp_irq, NULL, in it6505_i2c_probe()
3420 "it6505-intp", it6505); in it6505_i2c_probe()
3426 INIT_WORK(&it6505->link_works, it6505_link_training_work); in it6505_i2c_probe()
3427 INIT_WORK(&it6505->hdcp_wait_ksv_list, it6505_hdcp_wait_ksv_list); in it6505_i2c_probe()
3428 INIT_DELAYED_WORK(&it6505->hdcp_work, it6505_hdcp_work); in it6505_i2c_probe()
3429 init_completion(&it6505->extcon_completion); in it6505_i2c_probe()
3430 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_i2c_probe()
3431 it6505->powered = false; in it6505_i2c_probe()
3432 it6505->enable_drv_hold = DEFAULT_DRV_HOLD; in it6505_i2c_probe()
3441 it6505->aux.name = "DP-AUX"; in it6505_i2c_probe()
3442 it6505->aux.dev = dev; in it6505_i2c_probe()
3443 it6505->aux.transfer = it6505_aux_transfer; in it6505_i2c_probe()
3444 drm_dp_aux_init(&it6505->aux); in it6505_i2c_probe()
3446 it6505->bridge.funcs = &it6505_bridge_funcs; in it6505_i2c_probe()
3447 it6505->bridge.type = DRM_MODE_CONNECTOR_DisplayPort; in it6505_i2c_probe()
3448 it6505->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | in it6505_i2c_probe()
3450 drm_bridge_add(&it6505->bridge); in it6505_i2c_probe()
3459 drm_bridge_remove(&it6505->bridge); in it6505_i2c_remove()
3460 drm_dp_aux_unregister(&it6505->aux); in it6505_i2c_remove()