Lines Matching full:it6505
305 #define DEBUGFS_DIR_NAME "it6505-debugfs"
429 struct it6505 { struct
483 /* it6505 driver hold option */ argument
529 .name = "it6505",
550 static int it6505_read(struct it6505 *it6505, unsigned int reg_addr) in it6505_read() argument
554 struct device *dev = it6505->dev; in it6505_read()
556 if (!it6505->powered) in it6505_read()
559 err = regmap_read(it6505->regmap, reg_addr, &value); in it6505_read()
568 static int it6505_write(struct it6505 *it6505, unsigned int reg_addr, in it6505_write() argument
572 struct device *dev = it6505->dev; in it6505_write()
574 if (!it6505->powered) in it6505_write()
577 err = regmap_write(it6505->regmap, reg_addr, reg_val); in it6505_write()
588 static int it6505_set_bits(struct it6505 *it6505, unsigned int reg, in it6505_set_bits() argument
592 struct device *dev = it6505->dev; in it6505_set_bits()
594 if (!it6505->powered) in it6505_set_bits()
597 err = regmap_update_bits(it6505->regmap, reg, mask, value); in it6505_set_bits()
607 static void it6505_debug_print(struct it6505 *it6505, unsigned int reg, in it6505_debug_print() argument
610 struct device *dev = it6505->dev; in it6505_debug_print()
616 val = it6505_read(it6505, reg); in it6505_debug_print()
625 static int it6505_dpcd_read(struct it6505 *it6505, unsigned long offset) in it6505_dpcd_read() argument
629 struct device *dev = it6505->dev; in it6505_dpcd_read()
631 ret = drm_dp_dpcd_readb(&it6505->aux, offset, &value); in it6505_dpcd_read()
639 static int it6505_dpcd_write(struct it6505 *it6505, unsigned long offset, in it6505_dpcd_write() argument
643 struct device *dev = it6505->dev; in it6505_dpcd_write()
645 ret = drm_dp_dpcd_writeb(&it6505->aux, offset, datain); in it6505_dpcd_write()
653 static int it6505_get_dpcd(struct it6505 *it6505, int offset, u8 *dpcd, int num) in it6505_get_dpcd() argument
656 struct device *dev = it6505->dev; in it6505_get_dpcd()
658 ret = drm_dp_dpcd_read(&it6505->aux, offset, dpcd, num); in it6505_get_dpcd()
669 static void it6505_dump(struct it6505 *it6505) in it6505_dump() argument
673 struct device *dev = it6505->dev; in it6505_dump()
677 regs[j] = it6505_read(it6505, i + j); in it6505_dump()
683 static bool it6505_get_sink_hpd_status(struct it6505 *it6505) in it6505_get_sink_hpd_status() argument
687 reg_0d = it6505_read(it6505, REG_SYSTEM_STS); in it6505_get_sink_hpd_status()
695 static int it6505_read_word(struct it6505 *it6505, unsigned int reg) in it6505_read_word() argument
699 val0 = it6505_read(it6505, reg); in it6505_read_word()
703 val1 = it6505_read(it6505, reg + 1); in it6505_read_word()
710 static void it6505_calc_video_info(struct it6505 *it6505) in it6505_calc_video_info() argument
712 struct device *dev = it6505->dev; in it6505_calc_video_info()
719 rddata = it6505_read(it6505, REG_INPUT_CTRL); in it6505_calc_video_info()
724 htotal = it6505_read_word(it6505, REG_INPUT_HTOTAL) & 0x1FFF; in it6505_calc_video_info()
725 hdes = it6505_read_word(it6505, REG_INPUT_HACTIVE_START) & 0x1FFF; in it6505_calc_video_info()
726 hdew = it6505_read_word(it6505, REG_INPUT_HACTIVE_WIDTH) & 0x1FFF; in it6505_calc_video_info()
727 hfph = it6505_read_word(it6505, REG_INPUT_HFRONT_PORCH) & 0x1FFF; in it6505_calc_video_info()
728 hsyncw = it6505_read_word(it6505, REG_INPUT_HSYNC_WIDTH) & 0x1FFF; in it6505_calc_video_info()
730 vtotal = it6505_read_word(it6505, REG_INPUT_VTOTAL) & 0xFFF; in it6505_calc_video_info()
731 vdes = it6505_read_word(it6505, REG_INPUT_VACTIVE_START) & 0xFFF; in it6505_calc_video_info()
732 vdew = it6505_read_word(it6505, REG_INPUT_VACTIVE_WIDTH) & 0xFFF; in it6505_calc_video_info()
733 vfph = it6505_read_word(it6505, REG_INPUT_VFRONT_PORCH) & 0xFFF; in it6505_calc_video_info()
734 vsyncw = it6505_read_word(it6505, REG_INPUT_VSYNC_WIDTH) & 0xFFF; in it6505_calc_video_info()
742 it6505_set_bits(it6505, REG_DATA_CTRL0, ENABLE_PCLK_COUNTER, in it6505_calc_video_info()
745 it6505_set_bits(it6505, REG_DATA_CTRL0, ENABLE_PCLK_COUNTER, in it6505_calc_video_info()
747 rddata = it6505_read_word(it6505, REG_PCLK_COUNTER_VALUE) & in it6505_calc_video_info()
760 it6505->video_info.clock = pclk; in it6505_calc_video_info()
761 it6505->video_info.hdisplay = hdew; in it6505_calc_video_info()
762 it6505->video_info.hsync_start = hdew + hfph; in it6505_calc_video_info()
763 it6505->video_info.hsync_end = hdew + hfph + hsyncw; in it6505_calc_video_info()
764 it6505->video_info.htotal = htotal; in it6505_calc_video_info()
765 it6505->video_info.vdisplay = vdew; in it6505_calc_video_info()
766 it6505->video_info.vsync_start = vdew + vfph; in it6505_calc_video_info()
767 it6505->video_info.vsync_end = vdew + vfph + vsyncw; in it6505_calc_video_info()
768 it6505->video_info.vtotal = vtotal; in it6505_calc_video_info()
771 DRM_MODE_ARG(&it6505->video_info)); in it6505_calc_video_info()
808 static void it6505_clear_int(struct it6505 *it6505) in it6505_clear_int() argument
810 it6505_write(it6505, INT_STATUS_01, 0xFF); in it6505_clear_int()
811 it6505_write(it6505, INT_STATUS_02, 0xFF); in it6505_clear_int()
812 it6505_write(it6505, INT_STATUS_03, 0xFF); in it6505_clear_int()
815 static void it6505_int_mask_enable(struct it6505 *it6505) in it6505_int_mask_enable() argument
817 it6505_write(it6505, INT_MASK_01, BIT(INT_HPD_CHANGE) | in it6505_int_mask_enable()
821 it6505_write(it6505, INT_MASK_02, BIT(INT_AUX_CMD_FAIL) | in it6505_int_mask_enable()
824 it6505_write(it6505, INT_MASK_03, BIT(INT_LINK_TRAIN_FAIL) | in it6505_int_mask_enable()
828 static void it6505_int_mask_disable(struct it6505 *it6505) in it6505_int_mask_disable() argument
830 it6505_write(it6505, INT_MASK_01, 0x00); in it6505_int_mask_disable()
831 it6505_write(it6505, INT_MASK_02, 0x00); in it6505_int_mask_disable()
832 it6505_write(it6505, INT_MASK_03, 0x00); in it6505_int_mask_disable()
835 static void it6505_lane_termination_on(struct it6505 *it6505) in it6505_lane_termination_on() argument
839 regcf = it6505_read(it6505, REG_USER_DRV_PRE); in it6505_lane_termination_on()
842 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x80, 0x00); in it6505_lane_termination_on()
845 if (it6505->lane_swap) { in it6505_lane_termination_on()
846 switch (it6505->lane_count) { in it6505_lane_termination_on()
849 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, in it6505_lane_termination_on()
853 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, in it6505_lane_termination_on()
858 switch (it6505->lane_count) { in it6505_lane_termination_on()
861 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, in it6505_lane_termination_on()
865 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, in it6505_lane_termination_on()
873 static void it6505_lane_termination_off(struct it6505 *it6505) in it6505_lane_termination_off() argument
877 regcf = it6505_read(it6505, REG_USER_DRV_PRE); in it6505_lane_termination_off()
880 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x80, 0x80); in it6505_lane_termination_off()
883 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x0C, 0x00); in it6505_lane_termination_off()
886 static void it6505_lane_power_on(struct it6505 *it6505) in it6505_lane_power_on() argument
888 it6505_set_bits(it6505, REG_LINK_DRV, 0xF1, in it6505_lane_power_on()
889 (it6505->lane_swap ? in it6505_lane_power_on()
890 GENMASK(7, 8 - it6505->lane_count) : in it6505_lane_power_on()
891 GENMASK(3 + it6505->lane_count, 4)) | in it6505_lane_power_on()
895 static void it6505_lane_power_off(struct it6505 *it6505) in it6505_lane_power_off() argument
897 it6505_set_bits(it6505, REG_LINK_DRV, 0xF0, 0x00); in it6505_lane_power_off()
900 static void it6505_lane_off(struct it6505 *it6505) in it6505_lane_off() argument
902 it6505_lane_power_off(it6505); in it6505_lane_off()
903 it6505_lane_termination_off(it6505); in it6505_lane_off()
906 static void it6505_aux_termination_on(struct it6505 *it6505) in it6505_aux_termination_on() argument
910 regcf = it6505_read(it6505, REG_USER_DRV_PRE); in it6505_aux_termination_on()
913 it6505_lane_termination_on(it6505); in it6505_aux_termination_on()
916 it6505_set_bits(it6505, REG_DRV_LN_DATA_SEL, 0x80, 0x80); in it6505_aux_termination_on()
919 static void it6505_aux_power_on(struct it6505 *it6505) in it6505_aux_power_on() argument
921 it6505_set_bits(it6505, REG_AUX, 0x02, 0x02); in it6505_aux_power_on()
924 static void it6505_aux_on(struct it6505 *it6505) in it6505_aux_on() argument
926 it6505_aux_power_on(it6505); in it6505_aux_on()
927 it6505_aux_termination_on(it6505); in it6505_aux_on()
930 static void it6505_aux_reset(struct it6505 *it6505) in it6505_aux_reset() argument
932 it6505_set_bits(it6505, REG_RESET_CTRL, AUX_RESET, AUX_RESET); in it6505_aux_reset()
933 it6505_set_bits(it6505, REG_RESET_CTRL, AUX_RESET, 0x00); in it6505_aux_reset()
936 static void it6505_reset_logic(struct it6505 *it6505) in it6505_reset_logic() argument
938 regmap_write(it6505->regmap, REG_RESET_CTRL, ALL_LOGIC_RESET); in it6505_reset_logic()
942 static bool it6505_aux_op_finished(struct it6505 *it6505) in it6505_aux_op_finished() argument
944 int reg2b = it6505_read(it6505, REG_AUX_CMD_REQ); in it6505_aux_op_finished()
952 static int it6505_aux_wait(struct it6505 *it6505) in it6505_aux_wait() argument
956 struct device *dev = it6505->dev; in it6505_aux_wait()
960 while (!it6505_aux_op_finished(it6505)) { in it6505_aux_wait()
968 status = it6505_read(it6505, REG_AUX_ERROR_STS); in it6505_aux_wait()
977 static ssize_t it6505_aux_operation(struct it6505 *it6505, in it6505_aux_operation() argument
985 if (!it6505_get_sink_hpd_status(it6505)) in it6505_aux_operation()
989 it6505_set_bits(it6505, REG_AUX_CTRL, AUX_USER_MODE, AUX_USER_MODE); in it6505_aux_operation()
997 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_operation()
1001 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_operation()
1007 it6505_set_bits(it6505, REG_AUX_CTRL, AUX_NO_SEGMENT_WR, in it6505_aux_operation()
1012 it6505_write(it6505, REG_AUX_ADR_0_7, (address >> 0) & 0xFF); in it6505_aux_operation()
1014 it6505_write(it6505, REG_AUX_ADR_8_15, (address >> 8) & 0xFF); in it6505_aux_operation()
1016 it6505_write(it6505, REG_AUX_ADR_16_19, in it6505_aux_operation()
1020 regmap_bulk_write(it6505->regmap, REG_AUX_OUT_DATA0, buffer, in it6505_aux_operation()
1024 it6505_write(it6505, REG_AUX_CMD_REQ, FIELD_GET(M_AUX_REQ_CMD, cmd)); in it6505_aux_operation()
1026 ret = it6505_aux_wait(it6505); in it6505_aux_operation()
1030 ret = it6505_read(it6505, REG_AUX_ERROR_STS); in it6505_aux_operation()
1060 ret = it6505_read(it6505, REG_AUX_DATA_FIFO); in it6505_aux_operation()
1067 ret = it6505_read(it6505, REG_AUX_DATA_0_7 + i); in it6505_aux_operation()
1085 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_operation()
1088 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_operation()
1093 it6505_set_bits(it6505, REG_AUX_CTRL, AUX_USER_MODE, 0); in it6505_aux_operation()
1098 static ssize_t it6505_aux_do_transfer(struct it6505 *it6505, in it6505_aux_do_transfer() argument
1107 mutex_lock(&it6505->aux_lock); in it6505_aux_do_transfer()
1112 ret_size = it6505_aux_operation(it6505, cmd, address + i, in it6505_aux_do_transfer()
1125 mutex_unlock(&it6505->aux_lock); in it6505_aux_do_transfer()
1143 static int it6505_aux_i2c_wait(struct it6505 *it6505, u8 *reply) in it6505_aux_i2c_wait() argument
1147 struct device *dev = it6505->dev; in it6505_aux_i2c_wait()
1152 if (it6505_read(it6505, REG_AUX_USER_CTRL) & AUX_EVENT) in it6505_aux_i2c_wait()
1156 it6505_aux_op_finished(it6505)); in it6505_aux_i2c_wait()
1161 } while (!it6505_aux_op_finished(it6505)); in it6505_aux_i2c_wait()
1163 *reply = it6505_read(it6505, REG_AUX_USER_REPLY) >> 4; in it6505_aux_i2c_wait()
1174 it6505_set_bits(it6505, REG_AUX_USER_CTRL, USER_AUX_DONE, USER_AUX_DONE); in it6505_aux_i2c_wait()
1178 static int it6505_aux_i2c_readb(struct it6505 *it6505, u8 *buf, size_t size, u8 *reply) in it6505_aux_i2c_readb() argument
1184 it6505_write(it6505, REG_AUX_CMD_REQ, CMD_AUX_GI2C_READ); in it6505_aux_i2c_readb()
1186 ret = it6505_aux_i2c_wait(it6505, reply); in it6505_aux_i2c_readb()
1194 buf[i] = it6505_read(it6505, REG_AUX_USER_RXB(0 + i)); in it6505_aux_i2c_readb()
1199 static int it6505_aux_i2c_writeb(struct it6505 *it6505, u8 *buf, size_t size, u8 *reply) in it6505_aux_i2c_writeb() argument
1205 it6505_write(it6505, REG_AUX_OUT_DATA0 + i, buf[i]); in it6505_aux_i2c_writeb()
1208 it6505_write(it6505, REG_AUX_CMD_REQ, CMD_AUX_GI2C_WRITE); in it6505_aux_i2c_writeb()
1210 ret = it6505_aux_i2c_wait(it6505, reply); in it6505_aux_i2c_writeb()
1219 static ssize_t it6505_aux_i2c_operation(struct it6505 *it6505, in it6505_aux_i2c_operation() argument
1227 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_i2c_operation()
1229 it6505_set_bits(it6505, REG_AUX_USER_CTRL, EN_USER_AUX, EN_USER_AUX); in it6505_aux_i2c_operation()
1231 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_i2c_operation()
1235 it6505_set_bits(it6505, REG_AUX_CTRL, in it6505_aux_i2c_operation()
1238 it6505_write(it6505, REG_AUX_ADR_0_7, 0x00); in it6505_aux_i2c_operation()
1239 it6505_write(it6505, REG_AUX_ADR_8_15, msg->address << 1); in it6505_aux_i2c_operation()
1243 it6505_write(it6505, REG_AUX_ADR_16_19, msg->request); in it6505_aux_i2c_operation()
1244 it6505_write(it6505, REG_AUX_CMD_REQ, CMD_AUX_GI2C_ADR); in it6505_aux_i2c_operation()
1245 ret = it6505_aux_i2c_wait(it6505, &msg->reply); in it6505_aux_i2c_operation()
1253 it6505_write(it6505, REG_AUX_ADR_16_19, in it6505_aux_i2c_operation()
1256 ret = it6505_aux_i2c_readb(it6505, &buffer[data_cnt], in it6505_aux_i2c_operation()
1259 ret = it6505_aux_i2c_writeb(it6505, &buffer[data_cnt], in it6505_aux_i2c_operation()
1270 it6505_set_bits(it6505, REG_AUX_USER_CTRL, EN_USER_AUX, 0); in it6505_aux_i2c_operation()
1271 it6505_set_bits(it6505, REG_AUX_CTRL, AUX_USER_MODE, 0); in it6505_aux_i2c_operation()
1278 struct it6505 *it6505 = container_of(aux, struct it6505, aux); in it6505_aux_i2c_transfer() local
1280 guard(mutex)(&it6505->aux_lock); in it6505_aux_i2c_transfer()
1281 return it6505_aux_i2c_operation(it6505, msg); in it6505_aux_i2c_transfer()
1287 struct it6505 *it6505 = container_of(aux, struct it6505, aux); in it6505_aux_transfer() local
1307 ret = it6505_aux_do_transfer(it6505, cmd, msg->address, msg->buffer, in it6505_aux_transfer()
1330 struct it6505 *it6505 = data; in it6505_get_edid_block() local
1331 struct device *dev = it6505->dev; in it6505_get_edid_block()
1335 it6505_aux_reset(it6505); in it6505_get_edid_block()
1339 ret = it6505_aux_do_transfer(it6505, CMD_AUX_I2C_EDID_READ, in it6505_get_edid_block()
1365 static int it6505_get_ksvlist(struct it6505 *it6505, u8 *buf, size_t len) in it6505_get_ksvlist() argument
1367 struct device *dev = it6505->dev; in it6505_get_ksvlist()
1375 ret = it6505_aux_do_transfer(it6505, CMD_AUX_GET_KSV_LIST, in it6505_get_ksvlist()
1396 static void it6505_variable_config(struct it6505 *it6505) in it6505_variable_config() argument
1398 it6505->link_rate_bw_code = HBR; in it6505_variable_config()
1399 it6505->lane_count = MAX_LANE_COUNT; in it6505_variable_config()
1400 it6505->link_state = LINK_IDLE; in it6505_variable_config()
1401 it6505->hdcp_desired = HDCP_DESIRED; in it6505_variable_config()
1402 it6505->auto_train_retry = AUTO_TRAIN_RETRY; in it6505_variable_config()
1403 it6505->audio.select = AUDIO_SELECT; in it6505_variable_config()
1404 it6505->audio.sample_rate = AUDIO_SAMPLE_RATE; in it6505_variable_config()
1405 it6505->audio.channel_count = AUDIO_CHANNEL_COUNT; in it6505_variable_config()
1406 it6505->audio.type = AUDIO_TYPE; in it6505_variable_config()
1407 it6505->audio.i2s_input_format = I2S_INPUT_FORMAT; in it6505_variable_config()
1408 it6505->audio.i2s_justified = I2S_JUSTIFIED; in it6505_variable_config()
1409 it6505->audio.i2s_data_delay = I2S_DATA_DELAY; in it6505_variable_config()
1410 it6505->audio.i2s_ws_channel = I2S_WS_CHANNEL; in it6505_variable_config()
1411 it6505->audio.i2s_data_sequence = I2S_DATA_SEQUENCE; in it6505_variable_config()
1412 it6505->audio.word_length = AUDIO_WORD_LENGTH; in it6505_variable_config()
1413 memset(it6505->sha1_input, 0, sizeof(it6505->sha1_input)); in it6505_variable_config()
1414 memset(it6505->bksvs, 0, sizeof(it6505->bksvs)); in it6505_variable_config()
1417 static int it6505_send_video_infoframe(struct it6505 *it6505, in it6505_send_video_infoframe() argument
1422 struct device *dev = it6505->dev; in it6505_send_video_infoframe()
1430 err = it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, 0x00); in it6505_send_video_infoframe()
1434 err = regmap_bulk_write(it6505->regmap, REG_AVI_INFO_DB1, in it6505_send_video_infoframe()
1440 err = it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, in it6505_send_video_infoframe()
1448 static void it6505_get_extcon_property(struct it6505 *it6505) in it6505_get_extcon_property() argument
1452 struct device *dev = it6505->dev; in it6505_get_extcon_property()
1454 if (it6505->extcon && !it6505->lane_swap_disabled) { in it6505_get_extcon_property()
1455 err = extcon_get_property(it6505->extcon, EXTCON_DISP_DP, in it6505_get_extcon_property()
1462 it6505->lane_swap = property.intval; in it6505_get_extcon_property()
1466 static void it6505_clk_phase_adjustment(struct it6505 *it6505, in it6505_clk_phase_adjustment() argument
1471 it6505_set_bits(it6505, REG_CLK_CTRL0, M_PCLK_DELAY, in it6505_clk_phase_adjustment()
1473 it6505_set_bits(it6505, REG_DATA_CTRL0, VIDEO_LATCH_EDGE, in it6505_clk_phase_adjustment()
1477 static void it6505_link_reset_step_train(struct it6505 *it6505) in it6505_link_reset_step_train() argument
1479 it6505_set_bits(it6505, REG_TRAIN_CTRL0, in it6505_link_reset_step_train()
1481 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_link_reset_step_train()
1485 static void it6505_init(struct it6505 *it6505) in it6505_init() argument
1487 it6505_write(it6505, REG_AUX_OPT, AUX_AUTO_RST | AUX_FIX_FREQ); in it6505_init()
1488 it6505_write(it6505, REG_AUX_CTRL, AUX_NO_SEGMENT_WR); in it6505_init()
1489 it6505_write(it6505, REG_HDCP_CTRL2, HDCP_AN_SEL | HDCP_HW_HPDIRQ_ACT); in it6505_init()
1490 it6505_write(it6505, REG_VID_BUS_CTRL0, IN_DDR | DDR_CD); in it6505_init()
1491 it6505_write(it6505, REG_VID_BUS_CTRL1, 0x01); in it6505_init()
1492 it6505_write(it6505, REG_AUDIO_CTRL0, AUDIO_16B_BOUND); in it6505_init()
1495 it6505_write(it6505, REG_HPD_IRQ_TIME, 0xF5); in it6505_init()
1496 it6505_write(it6505, REG_AUX_DEBUG_MODE, 0x4D); in it6505_init()
1497 it6505_write(it6505, REG_AUX_OPT2, 0x17); in it6505_init()
1498 it6505_write(it6505, REG_HDCP_OPT, 0x60); in it6505_init()
1499 it6505_write(it6505, REG_DATA_MUTE_CTRL, in it6505_init()
1501 it6505_write(it6505, REG_TIME_STMP_CTRL, in it6505_init()
1503 it6505_write(it6505, REG_INFOFRAME_CTRL, 0x00); in it6505_init()
1504 it6505_write(it6505, REG_DRV_0_DB_800_MV, in it6505_init()
1505 afe_setting_table[it6505->afe_setting][0]); in it6505_init()
1506 it6505_write(it6505, REG_PRE_0_DB_800_MV, in it6505_init()
1507 afe_setting_table[it6505->afe_setting][1]); in it6505_init()
1508 it6505_write(it6505, REG_PRE_3P5_DB_800_MV, in it6505_init()
1509 afe_setting_table[it6505->afe_setting][2]); in it6505_init()
1510 it6505_write(it6505, REG_SSC_CTRL0, 0x9E); in it6505_init()
1511 it6505_write(it6505, REG_SSC_CTRL1, 0x1C); in it6505_init()
1512 it6505_write(it6505, REG_SSC_CTRL2, 0x42); in it6505_init()
1515 static void it6505_video_disable(struct it6505 *it6505) in it6505_video_disable() argument
1517 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_VID_MUTE, EN_VID_MUTE); in it6505_video_disable()
1518 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_VID_CTRL_PKT, 0x00); in it6505_video_disable()
1519 it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, VIDEO_RESET); in it6505_video_disable()
1522 static void it6505_video_reset(struct it6505 *it6505) in it6505_video_reset() argument
1524 it6505_link_reset_step_train(it6505); in it6505_video_reset()
1525 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_VID_MUTE, EN_VID_MUTE); in it6505_video_reset()
1526 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_VID_CTRL_PKT, 0x00); in it6505_video_reset()
1528 it6505_set_bits(it6505, REG_VID_BUS_CTRL1, TX_FIFO_RESET, TX_FIFO_RESET); in it6505_video_reset()
1529 it6505_set_bits(it6505, REG_VID_BUS_CTRL1, TX_FIFO_RESET, 0x00); in it6505_video_reset()
1531 it6505_set_bits(it6505, REG_501_FIFO_CTRL, RST_501_FIFO, RST_501_FIFO); in it6505_video_reset()
1532 it6505_set_bits(it6505, REG_501_FIFO_CTRL, RST_501_FIFO, 0x00); in it6505_video_reset()
1534 it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, VIDEO_RESET); in it6505_video_reset()
1536 it6505_set_bits(it6505, REG_RESET_CTRL, VIDEO_RESET, 0x00); in it6505_video_reset()
1539 static void it6505_update_video_parameter(struct it6505 *it6505, in it6505_update_video_parameter() argument
1542 it6505_clk_phase_adjustment(it6505, mode); in it6505_update_video_parameter()
1543 it6505_video_disable(it6505); in it6505_update_video_parameter()
1546 static bool it6505_audio_input(struct it6505 *it6505) in it6505_audio_input() argument
1550 reg05 = it6505_read(it6505, REG_RESET_CTRL); in it6505_audio_input()
1551 it6505_set_bits(it6505, REG_RESET_CTRL, AUDIO_RESET, 0x00); in it6505_audio_input()
1553 regbe = it6505_read(it6505, REG_AUDIO_INPUT_FREQ); in it6505_audio_input()
1554 it6505_write(it6505, REG_RESET_CTRL, reg05); in it6505_audio_input()
1559 static void it6505_setup_audio_channel_status(struct it6505 *it6505) in it6505_setup_audio_channel_status() argument
1561 enum it6505_audio_sample_rate sample_rate = it6505->audio.sample_rate; in it6505_setup_audio_channel_status()
1565 it6505_write(it6505, REG_IEC958_STS0, it6505->audio.type << 1); in it6505_setup_audio_channel_status()
1566 it6505_write(it6505, REG_IEC958_STS1, 0x00); in it6505_setup_audio_channel_status()
1567 it6505_write(it6505, REG_IEC958_STS2, 0x00); in it6505_setup_audio_channel_status()
1568 it6505_write(it6505, REG_IEC958_STS3, sample_rate); in it6505_setup_audio_channel_status()
1569 it6505_write(it6505, REG_IEC958_STS4, (~sample_rate << 4) | in it6505_setup_audio_channel_status()
1570 audio_word_length_map[it6505->audio.word_length]); in it6505_setup_audio_channel_status()
1573 static void it6505_setup_audio_format(struct it6505 *it6505) in it6505_setup_audio_format() argument
1576 it6505_write(it6505, REG_AUDIO_FMT, in it6505_setup_audio_format()
1577 (it6505->audio.word_length << 5) | in it6505_setup_audio_format()
1578 (it6505->audio.i2s_data_sequence << 4) | in it6505_setup_audio_format()
1579 (it6505->audio.i2s_ws_channel << 3) | in it6505_setup_audio_format()
1580 (it6505->audio.i2s_data_delay << 2) | in it6505_setup_audio_format()
1581 (it6505->audio.i2s_justified << 1) | in it6505_setup_audio_format()
1582 it6505->audio.i2s_input_format); in it6505_setup_audio_format()
1583 if (it6505->audio.select == SPDIF) { in it6505_setup_audio_format()
1584 it6505_write(it6505, REG_AUDIO_FIFO_SEL, 0x00); in it6505_setup_audio_format()
1586 it6505_set_bits(it6505, REG_AUX_OPT, 0xF0, 0x30); in it6505_setup_audio_format()
1588 it6505_write(it6505, REG_AUDIO_FIFO_SEL, 0xE4); in it6505_setup_audio_format()
1591 it6505_write(it6505, REG_AUDIO_CTRL0, 0x20); in it6505_setup_audio_format()
1592 it6505_write(it6505, REG_AUDIO_CTRL1, 0x00); in it6505_setup_audio_format()
1595 static void it6505_enable_audio_source(struct it6505 *it6505) in it6505_enable_audio_source() argument
1599 audio_source_count = BIT(DIV_ROUND_UP(it6505->audio.channel_count, 2)) in it6505_enable_audio_source()
1602 audio_source_count |= it6505->audio.select << 4; in it6505_enable_audio_source()
1604 it6505_write(it6505, REG_AUDIO_SRC_CTRL, audio_source_count); in it6505_enable_audio_source()
1607 static void it6505_enable_audio_infoframe(struct it6505 *it6505) in it6505_enable_audio_infoframe() argument
1609 struct device *dev = it6505->dev; in it6505_enable_audio_infoframe()
1613 audio_info_ca[it6505->audio.channel_count - 1]); in it6505_enable_audio_infoframe()
1615 it6505_write(it6505, REG_AUD_INFOFRAM_DB1, it6505->audio.channel_count in it6505_enable_audio_infoframe()
1617 it6505_write(it6505, REG_AUD_INFOFRAM_DB2, 0x00); in it6505_enable_audio_infoframe()
1618 it6505_write(it6505, REG_AUD_INFOFRAM_DB3, in it6505_enable_audio_infoframe()
1619 audio_info_ca[it6505->audio.channel_count - 1]); in it6505_enable_audio_infoframe()
1620 it6505_write(it6505, REG_AUD_INFOFRAM_DB4, 0x00); in it6505_enable_audio_infoframe()
1621 it6505_write(it6505, REG_AUD_INFOFRAM_SUM, 0x00); in it6505_enable_audio_infoframe()
1624 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_CTRL_PKT, in it6505_enable_audio_infoframe()
1628 static void it6505_disable_audio(struct it6505 *it6505) in it6505_disable_audio() argument
1630 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_AUD_MUTE, EN_AUD_MUTE); in it6505_disable_audio()
1631 it6505_set_bits(it6505, REG_AUDIO_SRC_CTRL, M_AUDIO_I2S_EN, 0x00); in it6505_disable_audio()
1632 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_CTRL_PKT, 0x00); in it6505_disable_audio()
1633 it6505_set_bits(it6505, REG_RESET_CTRL, AUDIO_RESET, AUDIO_RESET); in it6505_disable_audio()
1636 static void it6505_enable_audio(struct it6505 *it6505) in it6505_enable_audio() argument
1638 struct device *dev = it6505->dev; in it6505_enable_audio()
1642 it6505_disable_audio(it6505); in it6505_enable_audio()
1644 it6505_setup_audio_channel_status(it6505); in it6505_enable_audio()
1645 it6505_setup_audio_format(it6505); in it6505_enable_audio()
1646 it6505_enable_audio_source(it6505); in it6505_enable_audio()
1647 it6505_enable_audio_infoframe(it6505); in it6505_enable_audio()
1649 it6505_write(it6505, REG_AUDIO_N_0_7, 0x00); in it6505_enable_audio()
1650 it6505_write(it6505, REG_AUDIO_N_8_15, 0x80); in it6505_enable_audio()
1651 it6505_write(it6505, REG_AUDIO_N_16_23, 0x00); in it6505_enable_audio()
1653 it6505_set_bits(it6505, REG_AUDIO_SRC_CTRL, AUDIO_FIFO_RESET, in it6505_enable_audio()
1655 it6505_set_bits(it6505, REG_AUDIO_SRC_CTRL, AUDIO_FIFO_RESET, 0x00); in it6505_enable_audio()
1656 it6505_set_bits(it6505, REG_RESET_CTRL, AUDIO_RESET, 0x00); in it6505_enable_audio()
1657 regbe = it6505_read(it6505, REG_AUDIO_INPUT_FREQ); in it6505_enable_audio()
1660 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_AUD_MUTE, 0x00); in it6505_enable_audio()
1663 static bool it6505_use_step_train_check(struct it6505 *it6505) in it6505_use_step_train_check() argument
1665 if (it6505->link.revision >= 0x12) in it6505_use_step_train_check()
1666 return it6505->dpcd[DP_TRAINING_AUX_RD_INTERVAL] >= 0x01; in it6505_use_step_train_check()
1671 static void it6505_parse_link_capabilities(struct it6505 *it6505) in it6505_parse_link_capabilities() argument
1673 struct device *dev = it6505->dev; in it6505_parse_link_capabilities()
1674 struct it6505_drm_dp_link *link = &it6505->link; in it6505_parse_link_capabilities()
1677 if (it6505->dpcd[0] == 0) { in it6505_parse_link_capabilities()
1684 link->revision = it6505->dpcd[0]; in it6505_parse_link_capabilities()
1685 link->rate = drm_dp_bw_code_to_link_rate(it6505->dpcd[1]); in it6505_parse_link_capabilities()
1686 link->num_lanes = it6505->dpcd[2] & DP_MAX_LANE_COUNT_MASK; in it6505_parse_link_capabilities()
1688 if (it6505->dpcd[2] & DP_ENHANCED_FRAME_CAP) in it6505_parse_link_capabilities()
1697 it6505->link_rate_bw_code = drm_dp_link_rate_to_bw_code(link->rate); in it6505_parse_link_capabilities()
1699 it6505->link_rate_bw_code); in it6505_parse_link_capabilities()
1700 it6505->link_rate_bw_code = min_t(int, it6505->link_rate_bw_code, in it6505_parse_link_capabilities()
1703 it6505->lane_count = link->num_lanes; in it6505_parse_link_capabilities()
1705 it6505->lane_count); in it6505_parse_link_capabilities()
1706 it6505->lane_count = min_t(int, it6505->lane_count, in it6505_parse_link_capabilities()
1707 it6505->max_lane_count); in it6505_parse_link_capabilities()
1709 it6505->branch_device = drm_dp_is_branch(it6505->dpcd); in it6505_parse_link_capabilities()
1711 it6505->branch_device ? "" : "Not "); in it6505_parse_link_capabilities()
1713 it6505->enable_enhanced_frame = link->capabilities; in it6505_parse_link_capabilities()
1715 it6505->enable_enhanced_frame ? "" : "Not "); in it6505_parse_link_capabilities()
1717 it6505->enable_ssc = (it6505->dpcd[DP_MAX_DOWNSPREAD] & in it6505_parse_link_capabilities()
1720 it6505->enable_ssc ? "0.5" : "0", in it6505_parse_link_capabilities()
1721 it6505->enable_ssc ? "" : "Not "); in it6505_parse_link_capabilities()
1723 it6505->step_train = it6505_use_step_train_check(it6505); in it6505_parse_link_capabilities()
1724 if (it6505->step_train) in it6505_parse_link_capabilities()
1727 bcaps = it6505_dpcd_read(it6505, DP_AUX_HDCP_BCAPS); in it6505_parse_link_capabilities()
1730 it6505->is_repeater = (bcaps & DP_BCAPS_REPEATER_PRESENT); in it6505_parse_link_capabilities()
1732 it6505->is_repeater ? "repeater" : in it6505_parse_link_capabilities()
1736 it6505->hdcp_desired = false; in it6505_parse_link_capabilities()
1739 it6505->hdcp_desired ? "desired" : "undesired"); in it6505_parse_link_capabilities()
1742 static void it6505_setup_ssc(struct it6505 *it6505) in it6505_setup_ssc() argument
1744 it6505_set_bits(it6505, REG_TRAIN_CTRL0, SPREAD_AMP_5, in it6505_setup_ssc()
1745 it6505->enable_ssc ? SPREAD_AMP_5 : 0x00); in it6505_setup_ssc()
1746 if (it6505->enable_ssc) { in it6505_setup_ssc()
1747 it6505_write(it6505, REG_SSC_CTRL0, 0x9E); in it6505_setup_ssc()
1748 it6505_write(it6505, REG_SSC_CTRL1, 0x1C); in it6505_setup_ssc()
1749 it6505_write(it6505, REG_SSC_CTRL2, 0x42); in it6505_setup_ssc()
1750 it6505_write(it6505, REG_SP_CTRL0, 0x07); in it6505_setup_ssc()
1751 it6505_write(it6505, REG_IP_CTRL1, 0x29); in it6505_setup_ssc()
1752 it6505_write(it6505, REG_IP_CTRL2, 0x03); in it6505_setup_ssc()
1754 it6505_set_bits(it6505, REG_TIME_STMP_CTRL, M_STAMP_STEP, in it6505_setup_ssc()
1756 it6505_dpcd_write(it6505, DP_DOWNSPREAD_CTRL, in it6505_setup_ssc()
1759 it6505_dpcd_write(it6505, DP_DOWNSPREAD_CTRL, 0x00); in it6505_setup_ssc()
1760 it6505_set_bits(it6505, REG_TIME_STMP_CTRL, M_STAMP_STEP, in it6505_setup_ssc()
1765 static inline void it6505_link_rate_setup(struct it6505 *it6505) in it6505_link_rate_setup() argument
1767 it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_LBR, in it6505_link_rate_setup()
1768 (it6505->link_rate_bw_code == RBR) ? FORCE_LBR : 0x00); in it6505_link_rate_setup()
1769 it6505_set_bits(it6505, REG_LINK_DRV, DRV_HS, in it6505_link_rate_setup()
1770 (it6505->link_rate_bw_code == RBR) ? 0x00 : DRV_HS); in it6505_link_rate_setup()
1773 static void it6505_lane_count_setup(struct it6505 *it6505) in it6505_lane_count_setup() argument
1775 it6505_get_extcon_property(it6505); in it6505_lane_count_setup()
1776 it6505_set_bits(it6505, REG_TRAIN_CTRL0, LANE_SWAP, in it6505_lane_count_setup()
1777 it6505->lane_swap ? LANE_SWAP : 0x00); in it6505_lane_count_setup()
1778 it6505_set_bits(it6505, REG_TRAIN_CTRL0, LANE_COUNT_MASK, in it6505_lane_count_setup()
1779 (it6505->lane_count - 1) << 1); in it6505_lane_count_setup()
1782 static void it6505_link_training_setup(struct it6505 *it6505) in it6505_link_training_setup() argument
1784 struct device *dev = it6505->dev; in it6505_link_training_setup()
1786 if (it6505->enable_enhanced_frame) in it6505_link_training_setup()
1787 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, in it6505_link_training_setup()
1790 it6505_link_rate_setup(it6505); in it6505_link_training_setup()
1791 it6505_lane_count_setup(it6505); in it6505_link_training_setup()
1792 it6505_setup_ssc(it6505); in it6505_link_training_setup()
1795 it6505->link_rate_bw_code != RBR ? "HBR" : "RBR", in it6505_link_training_setup()
1796 it6505->lane_count, in it6505_link_training_setup()
1797 it6505->enable_ssc ? "en" : "dis", in it6505_link_training_setup()
1798 it6505->enable_enhanced_frame ? "en" : "dis"); in it6505_link_training_setup()
1801 static bool it6505_link_start_auto_train(struct it6505 *it6505) in it6505_link_start_auto_train() argument
1806 mutex_lock(&it6505->aux_lock); in it6505_link_start_auto_train()
1807 it6505_set_bits(it6505, REG_TRAIN_CTRL0, in it6505_link_start_auto_train()
1809 it6505_write(it6505, REG_TRAIN_CTRL1, FORCE_RETRAIN); in it6505_link_start_auto_train()
1810 it6505_write(it6505, REG_TRAIN_CTRL1, AUTO_TRAIN); in it6505_link_start_auto_train()
1814 link_training_state = it6505_read(it6505, REG_LINK_TRAIN_STS); in it6505_link_start_auto_train()
1825 mutex_unlock(&it6505->aux_lock); in it6505_link_start_auto_train()
1830 static int it6505_drm_dp_link_configure(struct it6505 *it6505) in it6505_drm_dp_link_configure() argument
1834 struct drm_dp_aux *aux = &it6505->aux; in it6505_drm_dp_link_configure()
1836 values[0] = it6505->link_rate_bw_code; in it6505_drm_dp_link_configure()
1837 values[1] = it6505->lane_count; in it6505_drm_dp_link_configure()
1839 if (it6505->enable_enhanced_frame) in it6505_drm_dp_link_configure()
1873 step_train_lane_voltage_para_set(struct it6505 *it6505, in step_train_lane_voltage_para_set() argument
1882 for (i = 0; i < it6505->lane_count; i++) { in step_train_lane_voltage_para_set()
1895 it6505_dpcd_write(it6505, DP_TRAINING_LANE0_SET + i, in step_train_lane_voltage_para_set()
1899 it6505_dpcd_read(it6505, DP_TRAINING_LANE0_SET + i)) in step_train_lane_voltage_para_set()
1907 it6505_step_cr_train(struct it6505 *it6505, in it6505_step_cr_train() argument
1914 const struct drm_dp_aux *aux = &it6505->aux; in it6505_step_cr_train()
1916 it6505_dpcd_write(it6505, DP_DOWNSPREAD_CTRL, in it6505_step_cr_train()
1917 it6505->enable_ssc ? DP_SPREAD_AMP_0_5 : 0x00); in it6505_step_cr_train()
1918 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_step_cr_train()
1923 if (!step_train_lane_voltage_para_set(it6505, in it6505_step_cr_train()
1927 drm_dp_link_train_clock_recovery_delay(aux, it6505->dpcd); in it6505_step_cr_train()
1928 drm_dp_dpcd_read_link_status(&it6505->aux, link_status); in it6505_step_cr_train()
1930 if (drm_dp_clock_recovery_ok(link_status, it6505->lane_count)) { in it6505_step_cr_train()
1931 it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_CR_DONE, in it6505_step_cr_train()
1935 DRM_DEV_DEBUG_DRIVER(it6505->dev, "cr not done"); in it6505_step_cr_train()
1938 it6505->lane_count)) in it6505_step_cr_train()
1941 for (j = 0; j < it6505->lane_count; j++) { in it6505_step_cr_train()
1974 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_step_cr_train()
1981 it6505_step_eq_train(struct it6505 *it6505, in it6505_step_eq_train() argument
1986 const struct drm_dp_aux *aux = &it6505->aux; in it6505_step_eq_train()
1988 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_step_eq_train()
1994 if (!step_train_lane_voltage_para_set(it6505, in it6505_step_eq_train()
1999 drm_dp_link_train_channel_eq_delay(aux, it6505->dpcd); in it6505_step_eq_train()
2000 drm_dp_dpcd_read_link_status(&it6505->aux, link_status); in it6505_step_eq_train()
2002 if (!drm_dp_clock_recovery_ok(link_status, it6505->lane_count)) in it6505_step_eq_train()
2005 if (drm_dp_channel_eq_ok(link_status, it6505->lane_count)) { in it6505_step_eq_train()
2006 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_step_eq_train()
2008 it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_EQ_DONE, in it6505_step_eq_train()
2012 DRM_DEV_DEBUG_DRIVER(it6505->dev, "eq not done"); in it6505_step_eq_train()
2014 for (i = 0; i < it6505->lane_count; i++) { in it6505_step_eq_train()
2034 it6505_dpcd_write(it6505, DP_TRAINING_PATTERN_SET, in it6505_step_eq_train()
2039 static bool it6505_link_start_step_train(struct it6505 *it6505) in it6505_link_start_step_train() argument
2047 DRM_DEV_DEBUG_DRIVER(it6505->dev, "start"); in it6505_link_start_step_train()
2048 err = it6505_drm_dp_link_configure(it6505); in it6505_link_start_step_train()
2052 if (!it6505_step_cr_train(it6505, &lane_voltage_pre_emphasis)) in it6505_link_start_step_train()
2054 if (!it6505_step_eq_train(it6505, &lane_voltage_pre_emphasis)) in it6505_link_start_step_train()
2059 static bool it6505_get_video_status(struct it6505 *it6505) in it6505_get_video_status() argument
2063 reg_0d = it6505_read(it6505, REG_SYSTEM_STS); in it6505_get_video_status()
2071 static void it6505_reset_hdcp(struct it6505 *it6505) in it6505_reset_hdcp() argument
2073 it6505->hdcp_status = HDCP_AUTH_IDLE; in it6505_reset_hdcp()
2075 it6505_set_bits(it6505, REG_HDCP_CTRL1, HDCP_CP_ENABLE, 0x00); in it6505_reset_hdcp()
2076 it6505_set_bits(it6505, REG_RESET_CTRL, HDCP_RESET, HDCP_RESET); in it6505_reset_hdcp()
2079 static void it6505_start_hdcp(struct it6505 *it6505) in it6505_start_hdcp() argument
2081 struct device *dev = it6505->dev; in it6505_start_hdcp()
2084 it6505_reset_hdcp(it6505); in it6505_start_hdcp()
2085 queue_delayed_work(system_wq, &it6505->hdcp_work, in it6505_start_hdcp()
2089 static void it6505_stop_hdcp(struct it6505 *it6505) in it6505_stop_hdcp() argument
2091 it6505_reset_hdcp(it6505); in it6505_stop_hdcp()
2092 cancel_delayed_work(&it6505->hdcp_work); in it6505_stop_hdcp()
2107 static void it6505_hdcp_part1_auth(struct it6505 *it6505) in it6505_hdcp_part1_auth() argument
2109 struct device *dev = it6505->dev; in it6505_hdcp_part1_auth()
2112 it6505_set_bits(it6505, REG_RESET_CTRL, HDCP_RESET, 0x00); in it6505_hdcp_part1_auth()
2114 it6505_set_bits(it6505, REG_HDCP_CTRL1, HDCP_CP_ENABLE, 0x00); in it6505_hdcp_part1_auth()
2117 hdcp_bcaps = it6505_dpcd_read(it6505, DP_AUX_HDCP_BCAPS); in it6505_hdcp_part1_auth()
2125 it6505_set_bits(it6505, REG_HDCP_TRIGGER, in it6505_hdcp_part1_auth()
2130 it6505_set_bits(it6505, REG_HDCP_CTRL2, HDCP_AN_GEN, HDCP_AN_GEN); in it6505_hdcp_part1_auth()
2134 it6505_set_bits(it6505, REG_HDCP_CTRL2, HDCP_AN_GEN, 0x00); in it6505_hdcp_part1_auth()
2136 it6505_set_bits(it6505, REG_HDCP_CTRL1, HDCP_CP_ENABLE, HDCP_CP_ENABLE); in it6505_hdcp_part1_auth()
2138 it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_START, in it6505_hdcp_part1_auth()
2141 it6505->hdcp_status = HDCP_AUTH_GOING; in it6505_hdcp_part1_auth()
2144 static int it6505_sha1_digest(struct it6505 *it6505, u8 *sha1_input, in it6505_sha1_digest() argument
2150 struct device *dev = it6505->dev; in it6505_sha1_digest()
2173 static int it6505_setup_sha1_input(struct it6505 *it6505, u8 *sha1_input) in it6505_setup_sha1_input() argument
2175 struct device *dev = it6505->dev; in it6505_setup_sha1_input()
2179 err = it6505_get_dpcd(it6505, DP_AUX_HDCP_BINFO, binfo, in it6505_setup_sha1_input()
2202 err = it6505_get_ksvlist(it6505, sha1_input, down_stream_count * 5); in it6505_setup_sha1_input()
2208 it6505->hdcp_down_stream_count = down_stream_count; in it6505_setup_sha1_input()
2212 it6505_set_bits(it6505, REG_HDCP_CTRL2, HDCP_EN_M0_READ, in it6505_setup_sha1_input()
2215 err = regmap_bulk_read(it6505->regmap, REG_M0_0_7, in it6505_setup_sha1_input()
2218 it6505_set_bits(it6505, REG_HDCP_CTRL2, HDCP_EN_M0_READ, 0x00); in it6505_setup_sha1_input()
2230 static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505) in it6505_hdcp_part2_ksvlist_check() argument
2232 struct device *dev = it6505->dev; in it6505_hdcp_part2_ksvlist_check()
2236 i = it6505_setup_sha1_input(it6505, it6505->sha1_input); in it6505_hdcp_part2_ksvlist_check()
2242 it6505_sha1_digest(it6505, it6505->sha1_input, i, (u8 *)av); in it6505_hdcp_part2_ksvlist_check()
2245 err = it6505_get_dpcd(it6505, DP_AUX_HDCP_V_PRIME(0), (u8 *)bv, in it6505_hdcp_part2_ksvlist_check()
2270 struct it6505 *it6505 = container_of(work, struct it6505, in it6505_hdcp_wait_ksv_list() local
2272 struct device *dev = it6505->dev; in it6505_hdcp_wait_ksv_list()
2280 if (!it6505_get_sink_hpd_status(it6505)) in it6505_hdcp_wait_ksv_list()
2283 bstatus = it6505_dpcd_read(it6505, DP_AUX_HDCP_BSTATUS); in it6505_hdcp_wait_ksv_list()
2296 ksv_list_check = it6505_hdcp_part2_ksvlist_check(it6505); in it6505_hdcp_wait_ksv_list()
2304 it6505_start_hdcp(it6505); in it6505_hdcp_wait_ksv_list()
2309 struct it6505 *it6505 = container_of(work, struct it6505, in it6505_hdcp_work() local
2311 struct device *dev = it6505->dev; in it6505_hdcp_work()
2317 if (!it6505_get_sink_hpd_status(it6505)) in it6505_hdcp_work()
2320 ret = drm_dp_dpcd_read_link_status(&it6505->aux, link_status); in it6505_hdcp_work()
2324 if (ret < 0 || !drm_dp_channel_eq_ok(link_status, it6505->lane_count) || in it6505_hdcp_work()
2325 !it6505_get_video_status(it6505)) { in it6505_hdcp_work()
2330 ret = it6505_get_dpcd(it6505, DP_AUX_HDCP_BKSV, it6505->bksvs, in it6505_hdcp_work()
2331 ARRAY_SIZE(it6505->bksvs)); in it6505_hdcp_work()
2334 it6505_set_bits(it6505, REG_HDCP_TRIGGER, in it6505_hdcp_work()
2339 (int)ARRAY_SIZE(it6505->bksvs), it6505->bksvs); in it6505_hdcp_work()
2341 if (!it6505_hdcp_is_ksv_valid(it6505->bksvs)) { in it6505_hdcp_work()
2343 it6505_set_bits(it6505, REG_HDCP_TRIGGER, in it6505_hdcp_work()
2347 it6505_hdcp_part1_auth(it6505); in it6505_hdcp_work()
2350 static void it6505_show_hdcp_info(struct it6505 *it6505) in it6505_show_hdcp_info() argument
2352 struct device *dev = it6505->dev; in it6505_show_hdcp_info()
2354 u8 *sha1 = it6505->sha1_input; in it6505_show_hdcp_info()
2357 it6505->hdcp_status, it6505->is_repeater); in it6505_show_hdcp_info()
2359 (int)ARRAY_SIZE(it6505->bksvs), it6505->bksvs); in it6505_show_hdcp_info()
2361 if (it6505->is_repeater) { in it6505_show_hdcp_info()
2363 it6505->hdcp_down_stream_count); in it6505_show_hdcp_info()
2365 (int)ARRAY_SIZE(it6505->sha1_input), in it6505_show_hdcp_info()
2366 it6505->sha1_input); in it6505_show_hdcp_info()
2367 for (i = 0; i < it6505->hdcp_down_stream_count; i++) { in it6505_show_hdcp_info()
2377 static void it6505_stop_link_train(struct it6505 *it6505) in it6505_stop_link_train() argument
2379 it6505->link_state = LINK_IDLE; in it6505_stop_link_train()
2380 cancel_work_sync(&it6505->link_works); in it6505_stop_link_train()
2381 it6505_write(it6505, REG_TRAIN_CTRL1, FORCE_RETRAIN); in it6505_stop_link_train()
2384 static void it6505_link_train_ok(struct it6505 *it6505) in it6505_link_train_ok() argument
2386 struct device *dev = it6505->dev; in it6505_link_train_ok()
2388 it6505->link_state = LINK_OK; in it6505_link_train_ok()
2390 it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_VID_MUTE, 0x00); in it6505_link_train_ok()
2391 it6505_set_bits(it6505, REG_INFOFRAME_CTRL, in it6505_link_train_ok()
2394 if (it6505_audio_input(it6505)) { in it6505_link_train_ok()
2396 it6505_enable_audio(it6505); in it6505_link_train_ok()
2399 if (it6505->hdcp_desired) in it6505_link_train_ok()
2400 it6505_start_hdcp(it6505); in it6505_link_train_ok()
2403 static void it6505_link_step_train_process(struct it6505 *it6505) in it6505_link_step_train_process() argument
2405 struct device *dev = it6505->dev; in it6505_link_step_train_process()
2410 if (it6505->sink_count == 0) { in it6505_link_step_train_process()
2411 DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count:%d, force eq", in it6505_link_step_train_process()
2412 it6505->sink_count); in it6505_link_step_train_process()
2413 it6505_set_bits(it6505, REG_TRAIN_CTRL0, FORCE_EQ_DONE, in it6505_link_step_train_process()
2418 if (!it6505->step_train) { in it6505_link_step_train_process()
2425 it6505_link_reset_step_train(it6505); in it6505_link_step_train_process()
2426 ret = it6505_link_start_step_train(it6505); in it6505_link_step_train_process()
2430 it6505_link_train_ok(it6505); in it6505_link_step_train_process()
2436 it6505->link_state = LINK_IDLE; in it6505_link_step_train_process()
2437 it6505_video_reset(it6505); in it6505_link_step_train_process()
2442 struct it6505 *it6505 = container_of(work, struct it6505, link_works); in it6505_link_training_work() local
2443 struct device *dev = it6505->dev; in it6505_link_training_work()
2446 DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count: %d", in it6505_link_training_work()
2447 it6505->sink_count); in it6505_link_training_work()
2449 if (!it6505_get_sink_hpd_status(it6505)) in it6505_link_training_work()
2452 it6505_link_training_setup(it6505); in it6505_link_training_work()
2453 it6505_reset_hdcp(it6505); in it6505_link_training_work()
2454 it6505_aux_reset(it6505); in it6505_link_training_work()
2456 if (it6505->auto_train_retry < 1) { in it6505_link_training_work()
2457 it6505_link_step_train_process(it6505); in it6505_link_training_work()
2461 ret = it6505_link_start_auto_train(it6505); in it6505_link_training_work()
2463 ret ? "pass" : "failed", it6505->auto_train_retry); in it6505_link_training_work()
2466 it6505->auto_train_retry = AUTO_TRAIN_RETRY; in it6505_link_training_work()
2467 it6505_link_train_ok(it6505); in it6505_link_training_work()
2469 it6505->auto_train_retry--; in it6505_link_training_work()
2470 it6505_dump(it6505); in it6505_link_training_work()
2475 static void it6505_plugged_status_to_codec(struct it6505 *it6505) in it6505_plugged_status_to_codec() argument
2477 enum drm_connector_status status = it6505->connector_status; in it6505_plugged_status_to_codec()
2479 if (it6505->plugged_cb && it6505->codec_dev) in it6505_plugged_status_to_codec()
2480 it6505->plugged_cb(it6505->codec_dev, in it6505_plugged_status_to_codec()
2484 static void it6505_remove_edid(struct it6505 *it6505) in it6505_remove_edid() argument
2486 drm_edid_free(it6505->cached_edid); in it6505_remove_edid()
2487 it6505->cached_edid = NULL; in it6505_remove_edid()
2490 static int it6505_process_hpd_irq(struct it6505 *it6505) in it6505_process_hpd_irq() argument
2492 struct device *dev = it6505->dev; in it6505_process_hpd_irq()
2496 if (!it6505_get_sink_hpd_status(it6505)) { in it6505_process_hpd_irq()
2498 it6505->sink_count = 0; in it6505_process_hpd_irq()
2502 ret = it6505_dpcd_read(it6505, DP_SINK_COUNT); in it6505_process_hpd_irq()
2507 DRM_DEV_DEBUG_DRIVER(dev, "dpcd_sink_count: %d it6505->sink_count:%d", in it6505_process_hpd_irq()
2508 dpcd_sink_count, it6505->sink_count); in it6505_process_hpd_irq()
2510 if (it6505->branch_device && dpcd_sink_count != it6505->sink_count) { in it6505_process_hpd_irq()
2511 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_process_hpd_irq()
2512 it6505->sink_count = dpcd_sink_count; in it6505_process_hpd_irq()
2513 it6505_reset_logic(it6505); in it6505_process_hpd_irq()
2514 it6505_int_mask_enable(it6505); in it6505_process_hpd_irq()
2515 it6505_init(it6505); in it6505_process_hpd_irq()
2516 it6505_remove_edid(it6505); in it6505_process_hpd_irq()
2520 dp_irq_vector = it6505_dpcd_read(it6505, DP_DEVICE_SERVICE_IRQ_VECTOR); in it6505_process_hpd_irq()
2527 bstatus = it6505_dpcd_read(it6505, DP_AUX_HDCP_BSTATUS); in it6505_process_hpd_irq()
2535 it6505->hdcp_status == HDCP_AUTH_GOING) in it6505_process_hpd_irq()
2536 it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_CPIRQ, in it6505_process_hpd_irq()
2539 it6505->hdcp_status == HDCP_AUTH_DONE) in it6505_process_hpd_irq()
2540 it6505_start_hdcp(it6505); in it6505_process_hpd_irq()
2543 ret = drm_dp_dpcd_read_link_status(&it6505->aux, link_status); in it6505_process_hpd_irq()
2552 if (!drm_dp_channel_eq_ok(link_status, it6505->lane_count)) { in it6505_process_hpd_irq()
2553 it6505->auto_train_retry = AUTO_TRAIN_RETRY; in it6505_process_hpd_irq()
2554 it6505_video_reset(it6505); in it6505_process_hpd_irq()
2560 static void it6505_irq_hpd(struct it6505 *it6505) in it6505_irq_hpd() argument
2562 struct device *dev = it6505->dev; in it6505_irq_hpd()
2565 it6505->hpd_state = it6505_get_sink_hpd_status(it6505); in it6505_irq_hpd()
2567 it6505->hpd_state ? "high" : "low"); in it6505_irq_hpd()
2569 if (it6505->hpd_state) { in it6505_irq_hpd()
2570 wait_for_completion_timeout(&it6505->extcon_completion, in it6505_irq_hpd()
2572 it6505_aux_on(it6505); in it6505_irq_hpd()
2573 if (it6505->dpcd[0] == 0) { in it6505_irq_hpd()
2574 it6505_get_dpcd(it6505, DP_DPCD_REV, it6505->dpcd, in it6505_irq_hpd()
2575 ARRAY_SIZE(it6505->dpcd)); in it6505_irq_hpd()
2576 it6505_variable_config(it6505); in it6505_irq_hpd()
2577 it6505_parse_link_capabilities(it6505); in it6505_irq_hpd()
2579 it6505->auto_train_retry = AUTO_TRAIN_RETRY; in it6505_irq_hpd()
2581 it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link, in it6505_irq_hpd()
2583 dp_sink_count = it6505_dpcd_read(it6505, DP_SINK_COUNT); in it6505_irq_hpd()
2584 it6505->sink_count = DP_GET_SINK_COUNT(dp_sink_count); in it6505_irq_hpd()
2586 DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count: %d", in it6505_irq_hpd()
2587 it6505->sink_count); in it6505_irq_hpd()
2589 it6505_lane_termination_on(it6505); in it6505_irq_hpd()
2590 it6505_lane_power_on(it6505); in it6505_irq_hpd()
2595 * it6505 not able to receive HPD_IRQ in it6505_irq_hpd()
2599 if (it6505->branch_device && it6505->sink_count == 0) in it6505_irq_hpd()
2600 schedule_work(&it6505->link_works); in it6505_irq_hpd()
2602 if (!it6505_get_video_status(it6505)) in it6505_irq_hpd()
2603 it6505_video_reset(it6505); in it6505_irq_hpd()
2605 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_irq_hpd()
2606 it6505_remove_edid(it6505); in it6505_irq_hpd()
2608 if (it6505->hdcp_desired) in it6505_irq_hpd()
2609 it6505_stop_hdcp(it6505); in it6505_irq_hpd()
2611 it6505_video_disable(it6505); in it6505_irq_hpd()
2612 it6505_disable_audio(it6505); in it6505_irq_hpd()
2613 it6505_stop_link_train(it6505); in it6505_irq_hpd()
2614 it6505_lane_off(it6505); in it6505_irq_hpd()
2615 it6505_link_reset_step_train(it6505); in it6505_irq_hpd()
2618 if (it6505->bridge.dev) in it6505_irq_hpd()
2619 drm_helper_hpd_irq_event(it6505->bridge.dev); in it6505_irq_hpd()
2622 static void it6505_irq_hpd_irq(struct it6505 *it6505) in it6505_irq_hpd_irq() argument
2624 struct device *dev = it6505->dev; in it6505_irq_hpd_irq()
2628 if (it6505_process_hpd_irq(it6505) < 0) in it6505_irq_hpd_irq()
2632 static void it6505_irq_scdt(struct it6505 *it6505) in it6505_irq_scdt() argument
2634 struct device *dev = it6505->dev; in it6505_irq_scdt()
2637 data = it6505_get_video_status(it6505); in it6505_irq_scdt()
2640 it6505_calc_video_info(it6505); in it6505_irq_scdt()
2641 it6505_link_reset_step_train(it6505); in it6505_irq_scdt()
2644 schedule_work(&it6505->link_works); in it6505_irq_scdt()
2647 static void it6505_irq_hdcp_done(struct it6505 *it6505) in it6505_irq_hdcp_done() argument
2649 struct device *dev = it6505->dev; in it6505_irq_hdcp_done()
2652 it6505->hdcp_status = HDCP_AUTH_DONE; in it6505_irq_hdcp_done()
2653 it6505_show_hdcp_info(it6505); in it6505_irq_hdcp_done()
2656 static void it6505_irq_hdcp_fail(struct it6505 *it6505) in it6505_irq_hdcp_fail() argument
2658 struct device *dev = it6505->dev; in it6505_irq_hdcp_fail()
2661 it6505->hdcp_status = HDCP_AUTH_IDLE; in it6505_irq_hdcp_fail()
2662 it6505_show_hdcp_info(it6505); in it6505_irq_hdcp_fail()
2663 it6505_start_hdcp(it6505); in it6505_irq_hdcp_fail()
2666 static void it6505_irq_aux_cmd_fail(struct it6505 *it6505) in it6505_irq_aux_cmd_fail() argument
2668 struct device *dev = it6505->dev; in it6505_irq_aux_cmd_fail()
2673 static void it6505_irq_hdcp_ksv_check(struct it6505 *it6505) in it6505_irq_hdcp_ksv_check() argument
2675 struct device *dev = it6505->dev; in it6505_irq_hdcp_ksv_check()
2679 it6505_set_bits(it6505, REG_HDCP_TRIGGER, in it6505_irq_hdcp_ksv_check()
2682 schedule_work(&it6505->hdcp_wait_ksv_list); in it6505_irq_hdcp_ksv_check()
2685 static void it6505_irq_audio_fifo_error(struct it6505 *it6505) in it6505_irq_audio_fifo_error() argument
2687 struct device *dev = it6505->dev; in it6505_irq_audio_fifo_error()
2691 if (it6505_audio_input(it6505)) in it6505_irq_audio_fifo_error()
2692 it6505_enable_audio(it6505); in it6505_irq_audio_fifo_error()
2695 static void it6505_irq_link_train_fail(struct it6505 *it6505) in it6505_irq_link_train_fail() argument
2697 struct device *dev = it6505->dev; in it6505_irq_link_train_fail()
2700 schedule_work(&it6505->link_works); in it6505_irq_link_train_fail()
2708 static void it6505_irq_video_handler(struct it6505 *it6505, const int *int_status) in it6505_irq_video_handler() argument
2710 struct device *dev = it6505->dev; in it6505_irq_video_handler()
2718 if ((!it6505_get_video_status(it6505) && in it6505_irq_video_handler()
2724 it6505->auto_train_retry = AUTO_TRAIN_RETRY; in it6505_irq_video_handler()
2725 flush_work(&it6505->link_works); in it6505_irq_video_handler()
2726 it6505_stop_hdcp(it6505); in it6505_irq_video_handler()
2727 it6505_video_reset(it6505); in it6505_irq_video_handler()
2736 reg_int03 = it6505_read(it6505, INT_STATUS_03); in it6505_irq_video_handler()
2737 reg_0d = it6505_read(it6505, REG_SYSTEM_STS); in it6505_irq_video_handler()
2740 it6505_write(it6505, INT_STATUS_03, reg_int03); in it6505_irq_video_handler()
2749 it6505_irq_scdt(it6505); in it6505_irq_video_handler()
2754 struct it6505 *it6505 = data; in it6505_int_threaded_handler() local
2755 struct device *dev = it6505->dev; in it6505_int_threaded_handler()
2758 void (*handler)(struct it6505 *it6505); in it6505_int_threaded_handler()
2771 if (it6505->enable_drv_hold || !it6505->powered) in it6505_int_threaded_handler()
2776 int_status[0] = it6505_read(it6505, INT_STATUS_01); in it6505_int_threaded_handler()
2777 int_status[1] = it6505_read(it6505, INT_STATUS_02); in it6505_int_threaded_handler()
2778 int_status[2] = it6505_read(it6505, INT_STATUS_03); in it6505_int_threaded_handler()
2780 it6505_write(it6505, INT_STATUS_01, int_status[0]); in it6505_int_threaded_handler()
2781 it6505_write(it6505, INT_STATUS_02, int_status[1]); in it6505_int_threaded_handler()
2782 it6505_write(it6505, INT_STATUS_03, int_status[2]); in it6505_int_threaded_handler()
2787 it6505_debug_print(it6505, REG_SYSTEM_STS, ""); in it6505_int_threaded_handler()
2790 irq_vec[0].handler(it6505); in it6505_int_threaded_handler()
2792 if (it6505->hpd_state) { in it6505_int_threaded_handler()
2795 irq_vec[i].handler(it6505); in it6505_int_threaded_handler()
2797 it6505_irq_video_handler(it6505, (unsigned int *)int_status); in it6505_int_threaded_handler()
2805 static int it6505_poweron(struct it6505 *it6505) in it6505_poweron() argument
2807 struct device *dev = it6505->dev; in it6505_poweron()
2808 struct it6505_platform_data *pdata = &it6505->pdata; in it6505_poweron()
2811 DRM_DEV_DEBUG_DRIVER(dev, "it6505 start powered on"); in it6505_poweron()
2813 if (it6505->powered) { in it6505_poweron()
2814 DRM_DEV_DEBUG_DRIVER(dev, "it6505 already powered on"); in it6505_poweron()
2845 it6505->powered = true; in it6505_poweron()
2846 it6505_reset_logic(it6505); in it6505_poweron()
2847 it6505_int_mask_enable(it6505); in it6505_poweron()
2848 it6505_init(it6505); in it6505_poweron()
2849 it6505_lane_off(it6505); in it6505_poweron()
2851 enable_irq(it6505->irq); in it6505_poweron()
2856 static int it6505_poweroff(struct it6505 *it6505) in it6505_poweroff() argument
2858 struct device *dev = it6505->dev; in it6505_poweroff()
2859 struct it6505_platform_data *pdata = &it6505->pdata; in it6505_poweroff()
2862 DRM_DEV_DEBUG_DRIVER(dev, "it6505 start power off"); in it6505_poweroff()
2864 if (!it6505->powered) { in it6505_poweroff()
2869 disable_irq_nosync(it6505->irq); in it6505_poweroff()
2886 it6505->powered = false; in it6505_poweroff()
2887 it6505->sink_count = 0; in it6505_poweroff()
2892 static enum drm_connector_status it6505_detect(struct it6505 *it6505) in it6505_detect() argument
2894 struct device *dev = it6505->dev; in it6505_detect()
2898 DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count:%d powered:%d", in it6505_detect()
2899 it6505->sink_count, it6505->powered); in it6505_detect()
2901 mutex_lock(&it6505->mode_lock); in it6505_detect()
2903 if (!it6505->powered) in it6505_detect()
2906 if (it6505->enable_drv_hold) { in it6505_detect()
2907 status = it6505->hpd_state ? connector_status_connected : in it6505_detect()
2912 if (it6505->hpd_state) { in it6505_detect()
2913 it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link, in it6505_detect()
2915 dp_sink_count = it6505_dpcd_read(it6505, DP_SINK_COUNT); in it6505_detect()
2916 it6505->sink_count = DP_GET_SINK_COUNT(dp_sink_count); in it6505_detect()
2917 DRM_DEV_DEBUG_DRIVER(dev, "it6505->sink_count:%d branch:%d", in it6505_detect()
2918 it6505->sink_count, it6505->branch_device); in it6505_detect()
2920 if (it6505->branch_device) { in it6505_detect()
2921 status = (it6505->sink_count != 0) ? in it6505_detect()
2928 it6505->sink_count = 0; in it6505_detect()
2929 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_detect()
2933 if (it6505->connector_status != status) { in it6505_detect()
2934 it6505->connector_status = status; in it6505_detect()
2935 it6505_plugged_status_to_codec(it6505); in it6505_detect()
2938 mutex_unlock(&it6505->mode_lock); in it6505_detect()
2946 struct it6505 *it6505 = container_of(self, struct it6505, event_nb); in it6505_extcon_notifier() local
2948 schedule_work(&it6505->extcon_wq); in it6505_extcon_notifier()
2954 struct it6505 *it6505 = container_of(work, struct it6505, extcon_wq); in it6505_extcon_work() local
2955 struct device *dev = it6505->dev; in it6505_extcon_work()
2958 if (it6505->enable_drv_hold) in it6505_extcon_work()
2961 mutex_lock(&it6505->extcon_lock); in it6505_extcon_work()
2963 state = extcon_get_state(it6505->extcon, EXTCON_DISP_DP); in it6505_extcon_work()
2966 if (state == it6505->extcon_state || unlikely(state < 0)) in it6505_extcon_work()
2968 it6505->extcon_state = state; in it6505_extcon_work()
2980 it6505_poweron(it6505); in it6505_extcon_work()
2982 complete_all(&it6505->extcon_completion); in it6505_extcon_work()
2986 reinit_completion(&it6505->extcon_completion); in it6505_extcon_work()
2988 drm_helper_hpd_irq_event(it6505->bridge.dev); in it6505_extcon_work()
2989 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_extcon_work()
2990 DRM_DEV_DEBUG_DRIVER(dev, "power off it6505 success!"); in it6505_extcon_work()
2994 mutex_unlock(&it6505->extcon_lock); in it6505_extcon_work()
2997 static int it6505_use_notifier_module(struct it6505 *it6505) in it6505_use_notifier_module() argument
3000 struct device *dev = it6505->dev; in it6505_use_notifier_module()
3002 it6505->event_nb.notifier_call = it6505_extcon_notifier; in it6505_use_notifier_module()
3003 INIT_WORK(&it6505->extcon_wq, it6505_extcon_work); in it6505_use_notifier_module()
3004 ret = devm_extcon_register_notifier(it6505->dev, in it6505_use_notifier_module()
3005 it6505->extcon, EXTCON_DISP_DP, in it6505_use_notifier_module()
3006 &it6505->event_nb); in it6505_use_notifier_module()
3012 schedule_work(&it6505->extcon_wq); in it6505_use_notifier_module()
3017 static void it6505_remove_notifier_module(struct it6505 *it6505) in it6505_remove_notifier_module() argument
3019 if (it6505->extcon) { in it6505_remove_notifier_module()
3020 devm_extcon_unregister_notifier(it6505->dev, in it6505_remove_notifier_module()
3021 it6505->extcon, EXTCON_DISP_DP, in it6505_remove_notifier_module()
3022 &it6505->event_nb); in it6505_remove_notifier_module()
3024 flush_work(&it6505->extcon_wq); in it6505_remove_notifier_module()
3030 struct it6505 *it6505 = container_of(work, struct it6505, in it6505_delayed_audio() local
3033 DRM_DEV_DEBUG_DRIVER(it6505->dev, "start"); in it6505_delayed_audio()
3035 if (!it6505->powered) in it6505_delayed_audio()
3038 if (!it6505->enable_drv_hold) in it6505_delayed_audio()
3039 it6505_enable_audio(it6505); in it6505_delayed_audio()
3042 static int __maybe_unused it6505_audio_setup_hw_params(struct it6505 *it6505, in it6505_audio_setup_hw_params() argument
3046 struct device *dev = it6505->dev; in it6505_audio_setup_hw_params()
3053 if (!it6505->bridge.encoder) in it6505_audio_setup_hw_params()
3058 it6505->audio.channel_count); in it6505_audio_setup_hw_params()
3062 it6505->audio.channel_count = params->cea.channels; in it6505_audio_setup_hw_params()
3074 it6505->audio.sample_rate = audio_sample_rate_map[i].rate; in it6505_audio_setup_hw_params()
3078 it6505->audio.word_length = WORD_LENGTH_16BIT; in it6505_audio_setup_hw_params()
3081 it6505->audio.word_length = WORD_LENGTH_18BIT; in it6505_audio_setup_hw_params()
3084 it6505->audio.word_length = WORD_LENGTH_20BIT; in it6505_audio_setup_hw_params()
3088 it6505->audio.word_length = WORD_LENGTH_24BIT; in it6505_audio_setup_hw_params()
3101 struct it6505 *it6505 = dev_get_drvdata(dev); in it6505_audio_shutdown() local
3103 if (it6505->powered) in it6505_audio_shutdown()
3104 it6505_disable_audio(it6505); in it6505_audio_shutdown()
3112 struct it6505 *it6505 = data; in it6505_audio_hook_plugged_cb() local
3114 it6505->plugged_cb = fn; in it6505_audio_hook_plugged_cb()
3115 it6505->codec_dev = codec_dev; in it6505_audio_hook_plugged_cb()
3116 it6505_plugged_status_to_codec(it6505); in it6505_audio_hook_plugged_cb()
3121 static inline struct it6505 *bridge_to_it6505(struct drm_bridge *bridge) in bridge_to_it6505()
3123 return container_of(bridge, struct it6505, bridge); in bridge_to_it6505()
3129 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_attach() local
3130 struct device *dev = it6505->dev; in it6505_bridge_attach()
3139 it6505->aux.drm_dev = bridge->dev; in it6505_bridge_attach()
3141 ret = drm_dp_aux_register(&it6505->aux); in it6505_bridge_attach()
3148 if (it6505->extcon) { in it6505_bridge_attach()
3149 ret = it6505_use_notifier_module(it6505); in it6505_bridge_attach()
3161 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_detach() local
3163 flush_work(&it6505->link_works); in it6505_bridge_detach()
3164 it6505_remove_notifier_module(it6505); in it6505_bridge_detach()
3172 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_mode_valid() local
3177 if (mode->clock > it6505->max_dpi_pixel_clock) in it6505_bridge_mode_valid()
3180 it6505->video_info.clock = mode->clock; in it6505_bridge_mode_valid()
3188 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_atomic_enable() local
3189 struct device *dev = it6505->dev; in it6505_bridge_atomic_enable()
3227 it6505_update_video_parameter(it6505, mode); in it6505_bridge_atomic_enable()
3229 ret = it6505_send_video_infoframe(it6505, &frame); in it6505_bridge_atomic_enable()
3234 it6505_int_mask_enable(it6505); in it6505_bridge_atomic_enable()
3235 it6505_video_reset(it6505); in it6505_bridge_atomic_enable()
3237 it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link, in it6505_bridge_atomic_enable()
3244 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_atomic_disable() local
3245 struct device *dev = it6505->dev; in it6505_bridge_atomic_disable()
3249 if (it6505->powered) { in it6505_bridge_atomic_disable()
3250 it6505_drm_dp_link_set_power(&it6505->aux, &it6505->link, in it6505_bridge_atomic_disable()
3252 it6505_video_disable(it6505); in it6505_bridge_atomic_disable()
3259 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_atomic_pre_enable() local
3260 struct device *dev = it6505->dev; in it6505_bridge_atomic_pre_enable()
3270 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_atomic_post_disable() local
3271 struct device *dev = it6505->dev; in it6505_bridge_atomic_post_disable()
3281 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_detect() local
3283 return it6505_detect(it6505); in it6505_bridge_detect()
3289 struct it6505 *it6505 = bridge_to_it6505(bridge); in it6505_bridge_edid_read() local
3290 struct device *dev = it6505->dev; in it6505_bridge_edid_read()
3292 if (!it6505->cached_edid) { in it6505_bridge_edid_read()
3293 it6505->cached_edid = drm_edid_read_custom(connector, in it6505_bridge_edid_read()
3295 it6505); in it6505_bridge_edid_read()
3297 if (!it6505->cached_edid) { in it6505_bridge_edid_read()
3303 return drm_edid_dup(it6505->cached_edid); in it6505_bridge_edid_read()
3323 struct it6505 *it6505 = dev_get_drvdata(dev); in it6505_bridge_resume() local
3325 return it6505_poweron(it6505); in it6505_bridge_resume()
3330 struct it6505 *it6505 = dev_get_drvdata(dev); in it6505_bridge_suspend() local
3332 it6505_remove_edid(it6505); in it6505_bridge_suspend()
3334 return it6505_poweroff(it6505); in it6505_bridge_suspend()
3342 static int it6505_init_pdata(struct it6505 *it6505) in it6505_init_pdata() argument
3344 struct it6505_platform_data *pdata = &it6505->pdata; in it6505_init_pdata()
3345 struct device *dev = it6505->dev; in it6505_init_pdata()
3385 static void it6505_parse_dt(struct it6505 *it6505) in it6505_parse_dt() argument
3387 struct device *dev = it6505->dev; in it6505_parse_dt()
3392 u32 *afe_setting = &it6505->afe_setting; in it6505_parse_dt()
3393 u32 *max_lane_count = &it6505->max_lane_count; in it6505_parse_dt()
3394 u32 *max_dpi_pixel_clock = &it6505->max_dpi_pixel_clock; in it6505_parse_dt()
3396 it6505->lane_swap_disabled = in it6505_parse_dt()
3399 if (it6505->lane_swap_disabled) in it6505_parse_dt()
3400 it6505->lane_swap = false; in it6505_parse_dt()
3457 it6505->afe_setting, it6505->max_lane_count); in it6505_parse_dt()
3459 it6505->max_dpi_pixel_clock); in it6505_parse_dt()
3465 struct it6505 *it6505 = file->private_data; in receive_timing_debugfs_show() local
3471 if (!it6505) in receive_timing_debugfs_show()
3474 it6505_calc_video_info(it6505); in receive_timing_debugfs_show()
3475 vid = &it6505->video_info; in receive_timing_debugfs_show()
3504 struct it6505 *it6505 = data; in force_power_on_off_debugfs_write() local
3506 if (!it6505) in force_power_on_off_debugfs_write()
3510 it6505_poweron(it6505); in force_power_on_off_debugfs_write()
3512 it6505_poweroff(it6505); in force_power_on_off_debugfs_write()
3519 struct it6505 *it6505 = data; in enable_drv_hold_debugfs_show() local
3521 if (!it6505) in enable_drv_hold_debugfs_show()
3524 *buf = it6505->enable_drv_hold; in enable_drv_hold_debugfs_show()
3531 struct it6505 *it6505 = data; in enable_drv_hold_debugfs_write() local
3533 if (!it6505) in enable_drv_hold_debugfs_write()
3536 it6505->enable_drv_hold = drv_hold; in enable_drv_hold_debugfs_write()
3538 if (it6505->enable_drv_hold) { in enable_drv_hold_debugfs_write()
3539 it6505_int_mask_disable(it6505); in enable_drv_hold_debugfs_write()
3541 it6505_clear_int(it6505); in enable_drv_hold_debugfs_write()
3542 it6505_int_mask_enable(it6505); in enable_drv_hold_debugfs_write()
3544 if (it6505->powered) { in enable_drv_hold_debugfs_write()
3545 it6505->connector_status = in enable_drv_hold_debugfs_write()
3546 it6505_get_sink_hpd_status(it6505) ? in enable_drv_hold_debugfs_write()
3550 it6505->connector_status = in enable_drv_hold_debugfs_write()
3578 static void debugfs_create_files(struct it6505 *it6505) in debugfs_create_files() argument
3584 it6505->debugfs, it6505, in debugfs_create_files()
3590 static void debugfs_init(struct it6505 *it6505) in debugfs_init() argument
3592 struct device *dev = it6505->dev; in debugfs_init()
3594 it6505->debugfs = debugfs_create_dir(DEBUGFS_DIR_NAME, NULL); in debugfs_init()
3596 if (IS_ERR(it6505->debugfs)) { in debugfs_init()
3601 debugfs_create_files(it6505); in debugfs_init()
3604 static void it6505_debugfs_remove(struct it6505 *it6505) in it6505_debugfs_remove() argument
3606 debugfs_remove_recursive(it6505->debugfs); in it6505_debugfs_remove()
3611 struct it6505 *it6505 = dev_get_drvdata(&client->dev); in it6505_shutdown() local
3613 if (it6505->powered) in it6505_shutdown()
3614 it6505_lane_off(it6505); in it6505_shutdown()
3619 struct it6505 *it6505; in it6505_i2c_probe() local
3624 it6505 = devm_kzalloc(&client->dev, sizeof(*it6505), GFP_KERNEL); in it6505_i2c_probe()
3625 if (!it6505) in it6505_i2c_probe()
3628 mutex_init(&it6505->extcon_lock); in it6505_i2c_probe()
3629 mutex_init(&it6505->mode_lock); in it6505_i2c_probe()
3630 mutex_init(&it6505->aux_lock); in it6505_i2c_probe()
3632 it6505->bridge.of_node = client->dev.of_node; in it6505_i2c_probe()
3633 it6505->connector_status = connector_status_disconnected; in it6505_i2c_probe()
3634 it6505->dev = &client->dev; in it6505_i2c_probe()
3635 i2c_set_clientdata(client, it6505); in it6505_i2c_probe()
3646 it6505->extcon = extcon; in it6505_i2c_probe()
3648 it6505->regmap = devm_regmap_init_i2c(client, &it6505_regmap_config); in it6505_i2c_probe()
3649 if (IS_ERR(it6505->regmap)) { in it6505_i2c_probe()
3651 err = PTR_ERR(it6505->regmap); in it6505_i2c_probe()
3655 err = it6505_init_pdata(it6505); in it6505_i2c_probe()
3661 it6505_parse_dt(it6505); in it6505_i2c_probe()
3663 it6505->irq = client->irq; in it6505_i2c_probe()
3665 if (!it6505->irq) { in it6505_i2c_probe()
3671 err = devm_request_threaded_irq(&client->dev, it6505->irq, NULL, in it6505_i2c_probe()
3675 "it6505-intp", it6505); in it6505_i2c_probe()
3681 INIT_WORK(&it6505->link_works, it6505_link_training_work); in it6505_i2c_probe()
3682 INIT_WORK(&it6505->hdcp_wait_ksv_list, it6505_hdcp_wait_ksv_list); in it6505_i2c_probe()
3683 INIT_DELAYED_WORK(&it6505->hdcp_work, it6505_hdcp_work); in it6505_i2c_probe()
3684 init_completion(&it6505->extcon_completion); in it6505_i2c_probe()
3685 memset(it6505->dpcd, 0, sizeof(it6505->dpcd)); in it6505_i2c_probe()
3686 it6505->powered = false; in it6505_i2c_probe()
3687 it6505->enable_drv_hold = DEFAULT_DRV_HOLD; in it6505_i2c_probe()
3690 it6505_poweron(it6505); in it6505_i2c_probe()
3692 DRM_DEV_DEBUG_DRIVER(dev, "it6505 device name: %s", dev_name(dev)); in it6505_i2c_probe()
3693 debugfs_init(it6505); in it6505_i2c_probe()
3696 it6505->aux.name = "DP-AUX"; in it6505_i2c_probe()
3697 it6505->aux.dev = dev; in it6505_i2c_probe()
3698 it6505->aux.transfer = it6505_aux_transfer; in it6505_i2c_probe()
3699 drm_dp_aux_init(&it6505->aux); in it6505_i2c_probe()
3701 it6505->bridge.funcs = &it6505_bridge_funcs; in it6505_i2c_probe()
3702 it6505->bridge.type = DRM_MODE_CONNECTOR_DisplayPort; in it6505_i2c_probe()
3703 it6505->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | in it6505_i2c_probe()
3705 drm_bridge_add(&it6505->bridge); in it6505_i2c_probe()
3712 struct it6505 *it6505 = i2c_get_clientdata(client); in it6505_i2c_remove() local
3714 drm_bridge_remove(&it6505->bridge); in it6505_i2c_remove()
3715 drm_dp_aux_unregister(&it6505->aux); in it6505_i2c_remove()
3716 it6505_debugfs_remove(it6505); in it6505_i2c_remove()
3717 it6505_poweroff(it6505); in it6505_i2c_remove()
3718 it6505_remove_edid(it6505); in it6505_i2c_remove()
3722 { "it6505" },
3729 { .compatible = "ite,it6505" },
3736 .name = "it6505",
3749 MODULE_DESCRIPTION("IT6505 DisplayPort Transmitter driver");